xref: /webtrees/resources/views/admin/users-edit.phtml (revision 72cf66d48ef1f917238d9b0939a8aa33f257e274)
1dd6b2bfcSGreg Roach<?php use Fisharebest\Webtrees\Auth; ?>
2dd6b2bfcSGreg Roach<?php use Fisharebest\Webtrees\Bootstrap4; ?>
3dd6b2bfcSGreg Roach<?php use Fisharebest\Webtrees\Functions\FunctionsEdit; ?>
4dd6b2bfcSGreg Roach<?php use Fisharebest\Webtrees\I18N; ?>
5dd6b2bfcSGreg Roach<?php use Fisharebest\Webtrees\Individual; ?>
6dd6b2bfcSGreg Roach<?php use Fisharebest\Webtrees\View; ?>
7dd6b2bfcSGreg Roach
8dd6b2bfcSGreg Roach<?= view('components/breadcrumbs', ['links' => [route('admin-control-panel') => I18N::translate('Control panel'), route('admin-users') => I18N::translate('User administration'), $title]]) ?>
9dd6b2bfcSGreg Roach
10dd6b2bfcSGreg Roach<h1><?= $title ?></h1>
11dd6b2bfcSGreg Roach
12dd6b2bfcSGreg Roach<form class="form-horizontal" name="newform" method="post" autocomplete="off" action="<?= e(route('admin-users-edit')) ?>">
13dd6b2bfcSGreg Roach    <?= csrf_field() ?>
14dd6b2bfcSGreg Roach    <input type="hidden" name="user_id" value="<?= $user->getUserId() ?>">
15dd6b2bfcSGreg Roach
16dd6b2bfcSGreg Roach    <!-- REAL NAME -->
17dd6b2bfcSGreg Roach    <div class="row form-group">
18dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="real_name">
19dd6b2bfcSGreg Roach            <?= I18N::translate('Real name') ?>
20dd6b2bfcSGreg Roach        </label>
21dd6b2bfcSGreg Roach        <div class="col-sm-9">
22dd6b2bfcSGreg Roach            <input class="form-control" type="text" id="real_name" name="real_name" required maxlength="64" value="<?= e($user->getRealName()) ?>" dir="auto">
23dd6b2bfcSGreg Roach            <p class="small text-muted">
24dd6b2bfcSGreg Roach                <?= I18N::translate('This is your real name, as you would like it displayed on screen.') ?>
25dd6b2bfcSGreg Roach            </p>
26dd6b2bfcSGreg Roach        </div>
27dd6b2bfcSGreg Roach    </div>
28dd6b2bfcSGreg Roach
29dd6b2bfcSGreg Roach    <!-- USER NAME -->
30dd6b2bfcSGreg Roach    <div class="row form-group">
31dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="username">
32dd6b2bfcSGreg Roach            <?= I18N::translate('Username') ?>
33dd6b2bfcSGreg Roach        </label>
34dd6b2bfcSGreg Roach        <div class="col-sm-9">
35dd6b2bfcSGreg Roach            <input class="form-control" type="text" id="username" name="username" required maxlength="32" value="<?= e($user->getUserName()) ?>" dir="auto">
36dd6b2bfcSGreg Roach            <p class="small text-muted">
37dd6b2bfcSGreg Roach                <?= I18N::translate('Usernames are case-insensitive and ignore accented letters, so that “chloe”, “chloë”, and “Chloe” are considered to be the same.') ?>
38dd6b2bfcSGreg Roach            </p>
39dd6b2bfcSGreg Roach        </div>
40dd6b2bfcSGreg Roach    </div>
41dd6b2bfcSGreg Roach
42dd6b2bfcSGreg Roach    <!-- PASSWORD -->
43dd6b2bfcSGreg Roach    <div class="row form-group">
44dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="pass1">
45dd6b2bfcSGreg Roach            <?= I18N::translate('Password') ?>
46dd6b2bfcSGreg Roach        </label>
47dd6b2bfcSGreg Roach        <div class="col-sm-9">
48dd6b2bfcSGreg Roach            <input class="form-control" type="password" id="pass1" name="pass1" pattern = "<?= WT_REGEX_PASSWORD ?>" placeholder="<?= I18N::plural('Use at least %s character.', 'Use at least %s characters.', WT_MINIMUM_PASSWORD_LENGTH, I18N::number(WT_MINIMUM_PASSWORD_LENGTH)) ?>" <?= $user->getUserId() ? '' : 'required' ?> onchange="form.pass2.pattern = regex_quote(this.value);" autocomplete="new-password">
49dd6b2bfcSGreg Roach            <p class="small text-muted">
50dd6b2bfcSGreg Roach                <?= I18N::translate('Passwords must be at least 6 characters long and are case-sensitive, so that “secret” is different from “SECRET”.') ?>
51dd6b2bfcSGreg Roach            </p>
52dd6b2bfcSGreg Roach        </div>
53dd6b2bfcSGreg Roach    </div>
54dd6b2bfcSGreg Roach
55dd6b2bfcSGreg Roach    <!-- CONFIRM PASSWORD -->
56dd6b2bfcSGreg Roach    <div class="row form-group">
57dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="pass2">
58dd6b2bfcSGreg Roach            <?= I18N::translate('Confirm password') ?>
59dd6b2bfcSGreg Roach        </label>
60dd6b2bfcSGreg Roach        <div class="col-sm-9">
61dd6b2bfcSGreg Roach            <input class="form-control" type="password" id="pass2" name="pass2" pattern = "<?= WT_REGEX_PASSWORD ?>" placeholder="<?= I18N::translate('Type the password again.') ?>" <?= $user->getUserId() ? '' : 'required' ?> autocomplete="new-password">
62dd6b2bfcSGreg Roach        </div>
63dd6b2bfcSGreg Roach    </div>
64dd6b2bfcSGreg Roach
65dd6b2bfcSGreg Roach    <!-- EMAIL ADDRESS -->
66dd6b2bfcSGreg Roach    <div class="row form-group">
67dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="email">
68dd6b2bfcSGreg Roach            <?= I18N::translate('Email address') ?>
69dd6b2bfcSGreg Roach        </label>
70dd6b2bfcSGreg Roach        <div class="col-sm-9">
71dd6b2bfcSGreg Roach            <input class="form-control" type="email" id="email" name="email" required maxlength="64" value="<?= e($user->getEmail()) ?>">
72dd6b2bfcSGreg Roach            <p class="small text-muted">
73dd6b2bfcSGreg Roach                <?= I18N::translate('This email address will be used to send password reminders, website notifications, and messages from other family members who are registered on the website.') ?>
74dd6b2bfcSGreg Roach            </p>
75dd6b2bfcSGreg Roach        </div>
76dd6b2bfcSGreg Roach    </div>
77dd6b2bfcSGreg Roach
78dd6b2bfcSGreg Roach    <!-- EMAIL VERIFIED -->
79dd6b2bfcSGreg Roach    <!-- ACCOUNT APPROVED -->
80dd6b2bfcSGreg Roach    <div class="row form-group">
81dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="verified">
82dd6b2bfcSGreg Roach            <?= I18N::translate('Account approval and email verification') ?>
83dd6b2bfcSGreg Roach        </label>
84dd6b2bfcSGreg Roach        <div class="col-sm-9">
85dd6b2bfcSGreg Roach            <div class="form-check">
86dd6b2bfcSGreg Roach                <label>
87dd6b2bfcSGreg Roach                    <input type="checkbox" name="verified" value="1" <?= $user->getPreference('verified') ? 'checked' : '' ?>>
88dd6b2bfcSGreg Roach                    <?= I18N::translate('Email verified') ?>
89dd6b2bfcSGreg Roach                </label>
90dd6b2bfcSGreg Roach                <label>
91dd6b2bfcSGreg Roach                    <input type="checkbox" name="approved" value="1" <?= $user->getPreference('verified_by_admin') ? 'checked' : '' ?>>
92dd6b2bfcSGreg Roach                    <?= I18N::translate('Approved by administrator') ?>
93dd6b2bfcSGreg Roach                </label>
94dd6b2bfcSGreg Roach                <p class="small text-muted">
95dd6b2bfcSGreg Roach                    <?= I18N::translate('When a user registers for an account, an email is sent to their email address with a verification link. When they follow this link, we know the email address is correct, and the “email verified” option is selected automatically.') ?>
96dd6b2bfcSGreg Roach                </p>
97dd6b2bfcSGreg Roach                <p class="small text-muted">
98dd6b2bfcSGreg Roach                    <?= I18N::translate('If an administrator creates a user account, the verification email is not sent, and the email must be verified manually.') ?>
99dd6b2bfcSGreg Roach                </p>
100dd6b2bfcSGreg Roach                <p class="small text-muted">
101dd6b2bfcSGreg Roach                    <?= I18N::translate('You should not approve an account unless you know that the email address is correct.') ?>
102dd6b2bfcSGreg Roach                </p>
103dd6b2bfcSGreg Roach                <p class="small text-muted">
104dd6b2bfcSGreg Roach                    <?= I18N::translate('A user will not be able to sign in until both “email verified” and “approved by administrator” are selected.') ?>
105dd6b2bfcSGreg Roach                </p>
106dd6b2bfcSGreg Roach            </div>
107dd6b2bfcSGreg Roach        </div>
108dd6b2bfcSGreg Roach    </div>
109dd6b2bfcSGreg Roach
110dd6b2bfcSGreg Roach    <!-- LANGUAGE -->
111dd6b2bfcSGreg Roach    <div class="row form-group">
112dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="language">
113dd6b2bfcSGreg Roach            <?= /* I18N: A configuration setting */ I18N::translate('Language') ?>
114dd6b2bfcSGreg Roach        </label>
115dd6b2bfcSGreg Roach        <div class="col-sm-9">
116dd6b2bfcSGreg Roach            <select id="language" name="language" class="form-control">
117dd6b2bfcSGreg Roach                <?php foreach ($locales as $locale) : ?>
118dd6b2bfcSGreg Roach                    <option value="<?= $locale->languageTag() ?>" <?= $user->getPreference('language', $default_locale) === $locale->languageTag() ? 'selected' : '' ?>>
119dd6b2bfcSGreg Roach                        <?= $locale->endonym() ?>
120dd6b2bfcSGreg Roach                    </option>
121dd6b2bfcSGreg Roach                <?php endforeach ?>
122dd6b2bfcSGreg Roach            </select>
123dd6b2bfcSGreg Roach        </div>
124dd6b2bfcSGreg Roach    </div>
125dd6b2bfcSGreg Roach
126dd6b2bfcSGreg Roach    <!-- TIMEZONE -->
127dd6b2bfcSGreg Roach    <div class="row form-group">
128dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="timezone">
129dd6b2bfcSGreg Roach            <?= /* I18N: A configuration setting */ I18N::translate('Time zone') ?>
130dd6b2bfcSGreg Roach        </label>
131dd6b2bfcSGreg Roach        <div class="col-sm-9">
132dd6b2bfcSGreg Roach            <?= Bootstrap4::select(array_combine(\DateTimeZone::listIdentifiers(), \DateTimeZone::listIdentifiers()), $user->getPreference('TIMEZONE', 'UTC'), ['id' => 'timezone', 'name' => 'timezone']) ?>
133dd6b2bfcSGreg Roach            <p class="small text-muted">
134dd6b2bfcSGreg Roach                <?= I18N::translate('The time zone is required for date calculations, such as knowing today’s date.') ?>
135dd6b2bfcSGreg Roach            </p>
136dd6b2bfcSGreg Roach        </div>
137dd6b2bfcSGreg Roach    </div>
138dd6b2bfcSGreg Roach
139dd6b2bfcSGreg Roach    <!-- AUTO ACCEPT -->
140dd6b2bfcSGreg Roach    <div class="row form-group">
141dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="auto_accept">
142dd6b2bfcSGreg Roach            <?= I18N::translate('Changes') ?>
143dd6b2bfcSGreg Roach        </label>
144dd6b2bfcSGreg Roach        <div class="col-sm-9">
145dd6b2bfcSGreg Roach            <div class="form-check">
146dd6b2bfcSGreg Roach                <label>
147dd6b2bfcSGreg Roach                    <input type="checkbox" name="auto_accept" value="1" <?= $user->getPreference('auto_accept') ? 'checked' : '' ?>>
148dd6b2bfcSGreg Roach                    <?= I18N::translate('Automatically accept changes made by this user') ?>
149dd6b2bfcSGreg Roach                </label>
150dd6b2bfcSGreg Roach                <p class="small text-muted">
151dd6b2bfcSGreg Roach                    <?= I18N::translate('Normally, any changes made to a family tree need to be reviewed by a moderator. This option allows a user to make changes without needing a moderator.') ?>
152dd6b2bfcSGreg Roach                </p>
153dd6b2bfcSGreg Roach            </div>
154dd6b2bfcSGreg Roach        </div>
155dd6b2bfcSGreg Roach    </div>
156dd6b2bfcSGreg Roach
157dd6b2bfcSGreg Roach    <!-- VISIBLE ONLINE -->
158dd6b2bfcSGreg Roach    <div class="row form-group">
159dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="visible_online">
160dd6b2bfcSGreg Roach            <?= /* I18N: A configuration setting */ I18N::translate('Visible online') ?>
161dd6b2bfcSGreg Roach        </label>
162dd6b2bfcSGreg Roach        <div class="col-sm-9">
163dd6b2bfcSGreg Roach            <div class="form-check">
164dd6b2bfcSGreg Roach                <label>
165dd6b2bfcSGreg Roach                    <input type="checkbox" id="visible_online" name="visible_online" value="1" <?= $user->getPreference('visibleonline') ? 'checked' : '' ?>>
166dd6b2bfcSGreg Roach                    <?= /* I18N: A configuration setting */ I18N::translate('Visible to other users when online') ?>
167dd6b2bfcSGreg Roach                </label>
168dd6b2bfcSGreg Roach                <p class="small text-muted">
169dd6b2bfcSGreg Roach                    <?= I18N::translate('You can choose whether to appear in the list of users who are currently signed-in.') ?>
170dd6b2bfcSGreg Roach                </p>
171dd6b2bfcSGreg Roach            </div>
172dd6b2bfcSGreg Roach        </div>
173dd6b2bfcSGreg Roach    </div>
174dd6b2bfcSGreg Roach
175dd6b2bfcSGreg Roach    <!-- CONTACT METHOD -->
176dd6b2bfcSGreg Roach    <div class="row form-group">
177dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="contactmethod">
178dd6b2bfcSGreg Roach            <?= /* I18N: A configuration setting */ I18N::translate('Preferred contact method') ?>
179dd6b2bfcSGreg Roach        </label>
180dd6b2bfcSGreg Roach        <div class="col-sm-9">
181dd6b2bfcSGreg Roach            <?= Bootstrap4::select($contact_methods, $user->getPreference('contactmethod'), ['id' => 'contact_method', 'name' => 'contact_method']) ?>
182dd6b2bfcSGreg Roach            <p class="small text-muted">
183dd6b2bfcSGreg Roach                <?= /* I18N: Help text for the “Preferred contact method” configuration setting */
184dd6b2bfcSGreg Roach                I18N::translate('Site members can send each other messages. You can choose to how these messages are sent to you, or choose not receive them at all.') ?>
185dd6b2bfcSGreg Roach            </p>
186dd6b2bfcSGreg Roach        </div>
187dd6b2bfcSGreg Roach    </div>
188dd6b2bfcSGreg Roach
189dd6b2bfcSGreg Roach    <!-- THEME -->
190dd6b2bfcSGreg Roach    <div class="row form-group">
191dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="theme">
192dd6b2bfcSGreg Roach            <?= I18N::translate('Theme') ?>
193dd6b2bfcSGreg Roach        </label>
194dd6b2bfcSGreg Roach        <div class="col-sm-9">
195dd6b2bfcSGreg Roach            <?= Bootstrap4::select($theme_options, $user->getPreference('theme'), ['id' => 'theme', 'name' => 'theme']) ?>
196dd6b2bfcSGreg Roach        </div>
197dd6b2bfcSGreg Roach    </div>
198dd6b2bfcSGreg Roach
199dd6b2bfcSGreg Roach    <!-- COMMENTS -->
200dd6b2bfcSGreg Roach    <div class="row form-group">
201dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="comment">
202dd6b2bfcSGreg Roach            <?= I18N::translate('Administrator comments on user') ?>
203dd6b2bfcSGreg Roach        </label>
204dd6b2bfcSGreg Roach        <div class="col-sm-9">
205dd6b2bfcSGreg Roach            <textarea class="form-control" id="comment" name="comment" rows="5" maxlength="255"><?= e($user->getPreference('comment')) ?></textarea>
206dd6b2bfcSGreg Roach        </div>
207dd6b2bfcSGreg Roach    </div>
208dd6b2bfcSGreg Roach
209dd6b2bfcSGreg Roach    <!-- ADMINISTRATOR -->
210dd6b2bfcSGreg Roach    <div class="row form-group">
211dd6b2bfcSGreg Roach        <label class="col-sm-3 col-form-label" for="admin">
212dd6b2bfcSGreg Roach        </label>
213dd6b2bfcSGreg Roach        <div class="col-sm-9">
214dd6b2bfcSGreg Roach            <div class="form-check">
215dd6b2bfcSGreg Roach                <label>
216dd6b2bfcSGreg Roach                    <input type="checkbox" id="admin" name="canadmin" value="1" <?= $user->getPreference('canadmin') ? 'checked' : '' ?>  <?= $user->getUserId() === Auth::id() ? 'disabled' : '' ?>>
217dd6b2bfcSGreg Roach                    <?= I18N::translate('Administrator') ?>
218dd6b2bfcSGreg Roach                </label>
219dd6b2bfcSGreg Roach            </div>
220dd6b2bfcSGreg Roach        </div>
221dd6b2bfcSGreg Roach    </div>
222dd6b2bfcSGreg Roach
223dd6b2bfcSGreg Roach    <h3><?= I18N::translate('Access to family trees') ?></h3>
224dd6b2bfcSGreg Roach
225dd6b2bfcSGreg Roach    <p>
226dd6b2bfcSGreg Roach        <?= I18N::translate('A role is a set of access rights, which give permission to view data, change preferences, etc. Access rights are assigned to roles, and roles are granted to users. Each family tree can assign different access to each role, and users can have a different role in each family tree.') ?>
227dd6b2bfcSGreg Roach    </p>
228dd6b2bfcSGreg Roach
229dd6b2bfcSGreg Roach    <div class="row">
230dd6b2bfcSGreg Roach        <div class="col-xs-4">
231dd6b2bfcSGreg Roach            <h4>
232dd6b2bfcSGreg Roach                <?= I18N::translate('Visitor') ?>
233dd6b2bfcSGreg Roach            </h4>
234dd6b2bfcSGreg Roach            <p class="small text-muted">
235dd6b2bfcSGreg Roach                <?= I18N::translate('Everybody has this role, including visitors to the website and search engines.') ?>
236dd6b2bfcSGreg Roach            </p>
237dd6b2bfcSGreg Roach            <h4>
238dd6b2bfcSGreg Roach                <?= I18N::translate('Member') ?>
239dd6b2bfcSGreg Roach            </h4>
240dd6b2bfcSGreg Roach            <p class="small text-muted">
241dd6b2bfcSGreg Roach                <?= I18N::translate('This role has all the permissions of the visitor role, plus any additional access granted by the family tree configuration.') ?>
242dd6b2bfcSGreg Roach            </p>
243dd6b2bfcSGreg Roach        </div>
244dd6b2bfcSGreg Roach        <div class="col-xs-4">
245dd6b2bfcSGreg Roach            <h4>
246dd6b2bfcSGreg Roach                <?= I18N::translate('Editor') ?>
247dd6b2bfcSGreg Roach            </h4>
248dd6b2bfcSGreg Roach            <p class="small text-muted">
249dd6b2bfcSGreg Roach                <?= I18N::translate('This role has all the permissions of the member role, plus permission to add/change/delete data. Any changes will need to be reviewed by a moderator, unless the user has the “automatically accept changes” option enabled.') ?>
250dd6b2bfcSGreg Roach            </p>
251dd6b2bfcSGreg Roach            <h4>
252dd6b2bfcSGreg Roach                <?= I18N::translate('Moderator') ?>
253dd6b2bfcSGreg Roach            </h4>
254dd6b2bfcSGreg Roach            <p class="small text-muted">
255dd6b2bfcSGreg Roach                <?= I18N::translate('This role has all the permissions of the editor role, plus permission to accept/reject changes made by other users.') ?>
256dd6b2bfcSGreg Roach            </p>
257dd6b2bfcSGreg Roach        </div>
258dd6b2bfcSGreg Roach        <div class="col-xs-4">
259dd6b2bfcSGreg Roach            <h4>
260dd6b2bfcSGreg Roach                <?= I18N::translate('Manager') ?>
261dd6b2bfcSGreg Roach            </h4>
262dd6b2bfcSGreg Roach            <p class="small text-muted">
263dd6b2bfcSGreg Roach                <?= I18N::translate('This role has all the permissions of the moderator role, plus any additional access granted by the family tree configuration, plus permission to change the settings/configuration of a family tree.') ?>
264dd6b2bfcSGreg Roach            </p>
265dd6b2bfcSGreg Roach            <h4>
266dd6b2bfcSGreg Roach                <?= I18N::translate('Administrator') ?>
267dd6b2bfcSGreg Roach            </h4>
268dd6b2bfcSGreg Roach            <p class="small text-muted">
269dd6b2bfcSGreg Roach                <?= I18N::translate('This role has all the permissions of the manager role in all family trees, plus permission to change the settings/configuration of the website, users, and modules.') ?>
270dd6b2bfcSGreg Roach            </p>
271dd6b2bfcSGreg Roach        </div>
272dd6b2bfcSGreg Roach    </div>
273dd6b2bfcSGreg Roach
274dd6b2bfcSGreg Roach    <table class="table table-bordered table-sm">
275dd6b2bfcSGreg Roach        <thead>
276dd6b2bfcSGreg Roach            <tr>
277dd6b2bfcSGreg Roach                <th>
278dd6b2bfcSGreg Roach                    <?= I18N::translate('Family tree') ?>
279dd6b2bfcSGreg Roach                </th>
280dd6b2bfcSGreg Roach                <th>
281dd6b2bfcSGreg Roach                    <?= I18N::translate('Role') ?>
282dd6b2bfcSGreg Roach                </th>
283dd6b2bfcSGreg Roach                <th>
284dd6b2bfcSGreg Roach                    <?= I18N::translate('Individual record') ?>
285dd6b2bfcSGreg Roach                </th>
286dd6b2bfcSGreg Roach                <th>
287dd6b2bfcSGreg Roach                    <?= I18N::translate('Restrict to immediate family') ?>
288dd6b2bfcSGreg Roach                </th>
289dd6b2bfcSGreg Roach            </tr>
290dd6b2bfcSGreg Roach            <tr>
291dd6b2bfcSGreg Roach                <td>
292dd6b2bfcSGreg Roach                </td>
293dd6b2bfcSGreg Roach                <td>
294dd6b2bfcSGreg Roach                </td>
295dd6b2bfcSGreg Roach                <td>
296dd6b2bfcSGreg Roach                    <p class="small text-muted">
297dd6b2bfcSGreg Roach                        <?= I18N::translate('Link this user to an individual in the family tree.') ?>
298dd6b2bfcSGreg Roach                    </p>
299dd6b2bfcSGreg Roach                </td>
300dd6b2bfcSGreg Roach                <td>
301dd6b2bfcSGreg Roach                    <p class="small text-muted">
302dd6b2bfcSGreg Roach                        <?= I18N::translate('Where a user is associated to an individual record in a family tree and has a role of member, editor, or moderator, you can prevent them from accessing the details of distant, living relations. You specify the number of relationship steps that the user is allowed to see.') ?>
303dd6b2bfcSGreg Roach                        <?= I18N::translate('For example, if you specify a path length of 2, the individual will be able to see their grandson (child, child), their aunt (parent, sibling), their step-daughter (spouse, child), but not their first cousin (parent, sibling, child).') ?>
304dd6b2bfcSGreg Roach                        <?= I18N::translate('Note: longer path lengths require a lot of calculation, which can make your website run slowly for these users.') ?>
305dd6b2bfcSGreg Roach                    </p>
306dd6b2bfcSGreg Roach                </td>
307dd6b2bfcSGreg Roach            </tr>
308dd6b2bfcSGreg Roach        </thead>
309dd6b2bfcSGreg Roach        <tbody>
310dd6b2bfcSGreg Roach            <?php foreach ($trees as $tree) : ?>
311dd6b2bfcSGreg Roach                <tr>
312dd6b2bfcSGreg Roach                    <td>
313dd6b2bfcSGreg Roach                        <?= e($tree->getTitle()) ?>
314dd6b2bfcSGreg Roach                    </td>
315dd6b2bfcSGreg Roach                    <td>
316*72cf66d4SGreg Roach                        <select class="form-control" name="canedit<?= $tree->id() ?>">
317dd6b2bfcSGreg Roach                            <?php foreach ($roles as $role => $description) : ?>
318dd6b2bfcSGreg Roach                                <option value="<?= $role ?>"
319dd6b2bfcSGreg Roach                                    <?= $role === $tree->getUserPreference($user, 'canedit') ? 'selected' : '' ?>>
320dd6b2bfcSGreg Roach                                    <?= $description ?>
321dd6b2bfcSGreg Roach                                </option>
322dd6b2bfcSGreg Roach                            <?php endforeach ?>
323dd6b2bfcSGreg Roach                        </select>
324dd6b2bfcSGreg Roach                    </td>
325dd6b2bfcSGreg Roach                    <td>
326*72cf66d4SGreg Roach                        <?= FunctionsEdit::formControlIndividual($tree, Individual::getInstance($tree->getUserPreference($user, 'gedcomid'), $tree), ['id' => 'gedcomid' . $tree->id(), 'name' => 'gedcomid' . $tree->id()]) ?>
327dd6b2bfcSGreg Roach                    </td>
328dd6b2bfcSGreg Roach                    <td>
329*72cf66d4SGreg Roach                        <select class="form-control" name="RELATIONSHIP_PATH_LENGTH<?= $tree->id() ?>" id="RELATIONSHIP_PATH_LENGTH<?= $tree->id() ?>" class="relpath">
330dd6b2bfcSGreg Roach                            <?php for ($n = 0; $n <= 10; ++$n) : ?>
331dd6b2bfcSGreg Roach                                <option value="<?= $n ?>" <?= $tree->getUserPreference($user, 'RELATIONSHIP_PATH_LENGTH') == $n ? 'selected' : '' ?>>
332dd6b2bfcSGreg Roach                                    <?= $n ?: I18N::translate('No') ?>
333dd6b2bfcSGreg Roach                                </option>
334dd6b2bfcSGreg Roach                            <?php endfor ?>
335dd6b2bfcSGreg Roach                        </select>
336dd6b2bfcSGreg Roach                    </td>
337dd6b2bfcSGreg Roach                </tr>
338dd6b2bfcSGreg Roach            <?php endforeach ?>
339dd6b2bfcSGreg Roach        </tbody>
340dd6b2bfcSGreg Roach    </table>
341dd6b2bfcSGreg Roach
342dd6b2bfcSGreg Roach    <div class="row form-group">
343dd6b2bfcSGreg Roach        <div class="offset-sm-3 col-sm-9">
344dd6b2bfcSGreg Roach            <button type="submit" class="btn btn-primary">
345dd6b2bfcSGreg Roach                <?= I18N::translate('save') ?>
346dd6b2bfcSGreg Roach            </button>
347dd6b2bfcSGreg Roach        </div>
348dd6b2bfcSGreg Roach    </div>
349dd6b2bfcSGreg Roach</form>
350dd6b2bfcSGreg Roach
351dd6b2bfcSGreg Roach<?php View::push('javascript') ?>
352dd6b2bfcSGreg Roach<script>
353dd6b2bfcSGreg Roach  $(".relpath").change(function() {
354dd6b2bfcSGreg Roach    var fieldIDx = $(this).attr("id");
355dd6b2bfcSGreg Roach    var idNum = fieldIDx.replace("RELATIONSHIP_PATH_LENGTH","");
356dd6b2bfcSGreg Roach    var newIDx = "gedcomid"+idNum;
357dd6b2bfcSGreg Roach    if ($("#"+newIDx).val() === "" && $("#".fieldIDx).val() !== "0") {
358dd6b2bfcSGreg Roach      alert("<?= I18N::translate('You must specify an individual record before you can restrict the user to their immediate family.') ?>");
359dd6b2bfcSGreg Roach      $(this).val("0");
360dd6b2bfcSGreg Roach    }
361dd6b2bfcSGreg Roach  });
362dd6b2bfcSGreg Roach  function regex_quote(str) {
363dd6b2bfcSGreg Roach    return str.replace(/[\\.?+*()[\](){}|]/g, "\\$&");
364dd6b2bfcSGreg Roach  }
365dd6b2bfcSGreg Roach</script>
366dd6b2bfcSGreg Roach<?php View::endpush() ?>
367