Prevent showing deleting own user button
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / acp / templates / userAdd.tpl
1 {include file='header' pageTitle='wcf.acp.user.'|concat:$action}
2
3 <header class="contentHeader">
4 <div class="contentHeaderTitle">
5 <h1 class="contentTitle">{lang}wcf.acp.user.{@$action}{/lang}</h1>
6 {if $action == 'edit'}<p class="contentHeaderDescription">{$user->username}</p>{/if}
7 </div>
8
9 <nav class="contentHeaderNavigation">
10 <ul>
11 {if $action === 'edit'}
12 <li>
13 <div class="dropdown"{*
14 *}id="userListDropdown{@$user->userID}" {*
15 *}data-object-id="{@$user->getObjectID()}" {*
16 *}data-banned="{if $user->banned}true{else}false{/if}" {*
17 *}data-enabled="{if !$user->activationCode}true{else}false{/if}" {*
18 *}data-email-confirmed="{if $user->isEmailConfirmed()}true{else}false{/if}" {*
19 *}>
20 <a href="#" class="dropdownToggle button">
21 <span class="icon icon16 fa-pencil"></span>
22 <span>{lang}wcf.global.button.edit{/lang}</span>
23 </a>
24
25 <ul class="dropdownMenu">
26 {event name='dropdownItems'}
27
28 {if $user->userID !== $__wcf->user->userID}
29 {if $__wcf->session->getPermission('admin.user.canEnableUser')}
30 <li>
31 <a href="#" {*
32 *}class="jsEnable" {*
33 *}data-enable-message="{lang}wcf.acp.user.enable{/lang}" {*
34 *}data-disable-message="{lang}wcf.acp.user.disable{/lang}"{*
35 *}>
36 {lang}wcf.acp.user.{if !$user->activationCode}disable{else}enable{/if}{/lang}
37 </a>
38 </li>
39 {/if}
40
41 {if $__wcf->session->getPermission('admin.user.canEnableUser')}
42 <li>
43 <a href="#" {*
44 *}class="jsConfirmEmailToggle" {*
45 *}data-confirm-email-message="{lang}wcf.acp.user.action.confirmEmail{/lang}" {*
46 *}data-unconfirm-email-message="{lang}wcf.acp.user.action.unconfirmEmail{/lang}"{*
47 *}>
48 {lang}wcf.acp.user.action.{if $user->isEmailConfirmed()}un{/if}confirmEmail{/lang}
49 </a>
50 </li>
51 {/if}
52
53 {if $__wcf->session->getPermission('admin.user.canMailUser')}
54 <li>
55 <a {*
56 *}href="{link controller='UserMail' id=$user->userID}{/link}"{*
57 *}>
58 {lang}wcf.acp.user.action.sendMail{/lang}
59 </a>
60 </li>
61 {/if}
62
63 {if $__wcf->session->getPermission('admin.user.canEditPassword')}
64 <li>
65 <a {*
66 *}href="#" {*
67 *}class="jsSendNewPassword"{*
68 *}>
69 {lang}wcf.acp.user.action.sendNewPassword{/lang}
70 </a>
71 </li>
72 {/if}
73 {/if}
74
75 {if $__wcf->session->getPermission('admin.user.canExportGdprData')}
76 <li>
77 <a {*
78 *}href="{link controller='UserExportGdpr' id=$user->userID}{/link}"{*
79 *}>
80 {lang}wcf.acp.user.exportGdpr{/lang}
81 </a>
82 </li>
83 {/if}
84
85 {if $__wcf->session->getPermission('admin.user.canDeleteUser') && $user->userID !== $__wcf->user->userID}
86 <li class="dropdownDivider"></li>
87 <li><a href="#" class="jsDelete">{lang}wcf.global.button.delete{/lang}</a></li>
88 <li><a href="#" class="jsDeleteContent">{lang}wcf.acp.content.removeContent{/lang}</a></li>
89 {/if}
90 </ul>
91 </div>
92 </li>
93 <script data-relocate="true">
94 require([
95 'WoltLabSuite/Core/Language',
96 'WoltLabSuite/Core/Acp/Ui/User/Editor',
97 'WoltLabSuite/Core/Acp/Ui/User/Content/Remove/Handler',
98 'WoltLabSuite/Core/Acp/Ui/User/Action/Handler/Delete',
99 'WoltLabSuite/Core/Acp/Ui/User/Action/DisableAction',
100 'WoltLabSuite/Core/Acp/Ui/User/Action/SendNewPasswordAction',
101 'WoltLabSuite/Core/Acp/Ui/User/Action/ToggleConfirmEmailAction',
102 'WoltLabSuite/Core/Controller/Clipboard',
103 ], (
104 Language,
105 AcpUiUserList,
106 AcpUserContentRemoveHandler,
107 { Delete },
108 { DisableAction },
109 { SendNewPasswordAction },
110 { ToggleConfirmEmailAction },
111 Clipboard
112 ) => {
113 Language.addObject({
114 'wcf.acp.user.sendNewPassword.workerTitle': '{jslang}wcf.acp.user.sendNewPassword.workerTitle{/jslang}',
115 'wcf.acp.user.action.sendNewPassword.confirmMessage': '{jslang}wcf.acp.user.action.sendNewPassword.confirmMessage{/jslang}',
116 'wcf.acp.worker.abort.confirmMessage': '{jslang}wcf.acp.worker.abort.confirmMessage{/jslang}',
117 'wcf.acp.content.removeContent': '{jslang}wcf.acp.content.removeContent{/jslang}',
118 });
119
120 const dropdownElement = document.querySelector("#userListDropdown{@$user->userID}");
121
122 const deleteContent = document.querySelector(".jsDeleteContent");
123 if (deleteContent !== null) {
124 new AcpUserContentRemoveHandler(deleteContent, {@$user->userID}, (data) => {
125 window.location.reload();
126 });
127 }
128
129 const sendNewPassword = document.querySelector(".jsSendNewPassword");
130 if (sendNewPassword !== null) {
131 new SendNewPasswordAction(sendNewPassword, {@$user->userID}, dropdownElement);
132 }
133
134 const toggleConfirmEmail = document.querySelector(".jsConfirmEmailToggle");
135 if (toggleConfirmEmail !== null) {
136 new ToggleConfirmEmailAction(toggleConfirmEmail, {@$user->userID}, dropdownElement);
137 }
138
139 const enableUser = document.querySelector(".jsEnable");
140 if (enableUser !== null) {
141 new DisableAction(enableUser, {@$user->userID}, dropdownElement);
142 }
143
144 const deleteUser = document.querySelector(".jsDelete");
145 if (deleteUser !== null) {
146 // We cannot use the DeleteAction, because the Delete Action is only usable for
147 // dropdown menues.
148 deleteUser.addEventListener("click", (event) => {
149 const deleteAction = new Delete([{@$user->userID}], () => {
150 window.location.href = "{link controller='UserList'}{/link}";
151 }, '{jslang objectTitle=$user->username}wcf.button.delete.confirmMessage{/jslang}');
152
153 deleteAction.delete();
154 });
155 }
156 });
157 </script>
158 {/if}
159
160 <li><a href="{link controller='UserList'}{/link}" class="button"><span class="icon icon16 fa-list"></span> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>
161
162 {event name='contentHeaderNavigation'}
163 </ul>
164 </nav>
165 </header>
166
167 {if $userID|isset && $__wcf->user->userID == $userID}
168 <p class="warning">{lang}wcf.acp.user.edit.warning.selfEdit{/lang}</p>
169 {/if}
170
171 {include file='formNotice'}
172
173 <form method="post" action="{if $action == 'add'}{link controller='UserAdd'}{/link}{else}{link controller='UserEdit' id=$userID}{/link}{/if}">
174 <div class="section tabMenuContainer">
175 <nav class="tabMenu">
176 <ul>
177 <li><a href="{@$__wcf->getAnchor('__essentials')}">{lang}wcf.global.form.data{/lang}</a></li>
178
179 {foreach from=$optionTree item=categoryLevel1}
180 <li><a href="{@$__wcf->getAnchor($categoryLevel1[object]->categoryName)}">{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</a></li>
181 {/foreach}
182
183 {if MODULE_USER_SIGNATURE}
184 <li><a href="{@$__wcf->getAnchor('signatureManagement')}">{lang}wcf.user.signature{/lang}</a></li>
185 {/if}
186
187 {if $action === 'edit'}
188 <li><a href="{@$__wcf->getAnchor('avatarForm')}">{lang}wcf.user.avatar{/lang}</a></li>
189 <li><a href="{@$__wcf->getAnchor('coverPhotoForm')}">{lang}wcf.user.coverPhoto{/lang}</a></li>
190 {/if}
191
192 {event name='tabMenuTabs'}
193 </ul>
194 </nav>
195
196 <div id="__essentials" class="tabMenuContent hidden">
197 <div class="section">
198 <dl{if $errorType.username|isset} class="formError"{/if}>
199 <dt><label for="username">{lang}wcf.user.username{/lang}</label></dt>
200 <dd>
201 <input type="text" id="username" name="username" value="{$username}" pattern="^[^,\n]+$" autofocus class="medium">
202 {if $errorType.username|isset}
203 <small class="innerError">
204 {if $errorType.username == 'empty'}
205 {lang}wcf.global.form.error.empty{/lang}
206 {else}
207 {lang}wcf.user.username.error.{@$errorType.username}{/lang}
208 {/if}
209 </small>
210 {/if}
211 </dd>
212 </dl>
213
214 {if $availableGroups|count}
215 <dl>
216 <dt>
217 <label>{lang}wcf.acp.user.groups{/lang}</label>
218 </dt>
219 <dd class="checkboxList">
220 {htmlCheckboxes options=$availableGroups name=groupIDs selected=$groupIDs}
221 </dd>
222 </dl>
223 {/if}
224
225 {event name='generalFields'}
226 </div>
227
228 {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditMailAddress')}
229 <section class="section">
230 <h2 class="sectionTitle">{lang}wcf.user.email{/lang}</h2>
231
232 <dl{if $errorType.email|isset} class="formError"{/if}>
233 <dt><label for="email">{lang}wcf.user.email{/lang}</label></dt>
234 <dd>
235 <input type="email" id="email" name="email" value="{$email}" class="medium">
236 {if $errorType.email|isset}
237 <small class="innerError">
238 {if $errorType.email == 'empty'}
239 {lang}wcf.global.form.error.empty{/lang}
240 {else}
241 {lang}wcf.user.email.error.{@$errorType.email}{/lang}
242 {/if}
243 </small>
244 {/if}
245 </dd>
246 </dl>
247
248 <dl{if $errorType.confirmEmail|isset} class="formError"{/if}>
249 <dt><label for="confirmEmail">{lang}wcf.user.confirmEmail{/lang}</label></dt>
250 <dd>
251 <input type="email" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" class="medium">
252 {if $errorType.confirmEmail|isset}
253 <small class="innerError">
254 {lang}wcf.user.confirmEmail.error.{@$errorType.confirmEmail}{/lang}
255 </small>
256 {/if}
257 </dd>
258 </dl>
259
260 {event name='emailFields'}
261 </section>
262 {/if}
263
264 {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditPassword')}
265 {if $action == 'edit' && !$user->authData|empty}
266 <section class="section">
267 <h2 class="sectionTitle">{lang}wcf.user.3rdparty{/lang}</h2>
268
269 <div class="info">{lang}wcf.user.3rdparty.connect.info{/lang}</div>
270
271 <dl>
272 <dt></dt>
273 <dd>
274 <label><input type="checkbox" name="disconnect3rdParty" value="1"> {lang}wcf.user.3rdparty.{$user->getAuthProvider()}.disconnect{/lang}</label>
275 </dd>
276 </dl>
277 </section>
278 {else}
279 <section class="section">
280 <h2 class="sectionTitle">{lang}wcf.user.password{/lang}</h2>
281
282 <dl{if $errorType.password|isset} class="formError"{/if}>
283 <dt><label for="password">{lang}wcf.user.password{/lang}</label></dt>
284 <dd>
285 <input type="password" id="password" name="password" value="{$password}" class="medium" autocomplete="new-password">
286 {if $errorType.password|isset}
287 <small class="innerError">
288 {if $errorType.password == 'empty'}
289 {lang}wcf.global.form.error.empty{/lang}
290 {else}
291 {lang}wcf.user.password.error.{@$errorType.password}{/lang}
292 {/if}
293 </small>
294 {/if}
295 </dd>
296 </dl>
297
298 <dl{if $errorType.confirmPassword|isset} class="formError"{/if}>
299 <dt><label for="confirmPassword">{lang}wcf.user.confirmPassword{/lang}</label></dt>
300 <dd>
301 <input type="password" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" class="medium" autocomplete="new-password">
302 {if $errorType.confirmPassword|isset}
303 <small class="innerError">
304 {lang}wcf.user.confirmPassword.error.{@$errorType.confirmPassword}{/lang}
305 </small>
306 {/if}
307 </dd>
308 </dl>
309
310 <script data-relocate="true">
311 require(['WoltLabSuite/Core/Ui/User/PasswordStrength', 'Language'], function (PasswordStrength, Language) {
312 {include file='passwordStrengthLanguage'}
313
314 var relatedInputs = [];
315 if (elById('username')) relatedInputs.push(elById('username'));
316 if (elById('email')) relatedInputs.push(elById('email'));
317
318 new PasswordStrength(elById('password'), {
319 relatedInputs: relatedInputs,
320 staticDictionary: [
321 '{$__wcf->user->username|encodeJS}',
322 '{$__wcf->user->email|encodeJS}',
323 {if $user|isset}
324 '{$user->username|encodeJS}',
325 '{$user->email|encodeJS}',
326 {/if}
327 ]
328 });
329 })
330 </script>
331
332 {event name='passwordFields'}
333 </section>
334 {/if}
335
336 {if $action == 'edit' && $user->multifactorActive}
337 <section class="section">
338 <h2 class="sectionTitle">{lang}wcf.acp.user.security.multifactor{/lang}</h2>
339
340 <dl>
341 <dt>{lang}wcf.acp.user.security.multifactor{/lang}</dt>
342 <dd>
343 <span class="icon icon16 fa-check green"></span> {lang}wcf.acp.user.security.multifactor.active{/lang}
344 <small>{lang}wcf.acp.user.security.multifactor.active.description{/lang}</small>
345 </dd>
346 </dl>
347
348 <dl>
349 <dt></dt>
350 <dd>
351 <label>
352 <input type="checkbox" id="multifactorDisable" name="multifactorDisable" value="1"> {lang}wcf.acp.user.security.multifactor.disable{/lang}
353 </label>
354 <small>
355 {lang}wcf.acp.user.security.multifactor.disable.description{/lang}
356 </small>
357 </dd>
358 </dl>
359 </section>
360 {/if}
361 {/if}
362
363 {if $action == 'edit' && $__wcf->session->getPermission('admin.user.canBanUser') && $__wcf->user->userID != $userID}
364 <section class="section">
365 <h2 class="sectionTitle">{lang}wcf.acp.user.banUser{/lang}</h2>
366
367 <dl>
368 <dt></dt>
369 <dd>
370 <label><input type="checkbox" id="banned" name="banned" value="1"{if $banned == 1} checked{/if}> {lang}wcf.acp.user.banUser{/lang}</label>
371 <small>{lang}wcf.acp.user.banUser.description{/lang}</small>
372 </dd>
373 </dl>
374
375 <dl>
376 <dt><label for="banReason">{lang}wcf.acp.user.banReason{/lang}</label></dt>
377 <dd>
378 <textarea name="banReason" id="banReason" cols="40" rows="10">{$banReason}</textarea>
379 <small>{lang}wcf.acp.user.banReason.description{/lang}</small>
380 </dd>
381 </dl>
382
383 <dl>
384 <dt></dt>
385 <dd><label><input type="checkbox" id="banNeverExpires" name="banNeverExpires" value="1"{if !$banExpires} checked{/if}> {lang}wcf.acp.user.ban.neverExpires{/lang}</label></dd>
386 </dl>
387
388 <dl id="banExpiresSetting">
389 <dt><label for="banExpires">{lang}wcf.acp.user.ban.expires{/lang}</label></dt>
390 <dd>
391 <input type="date" name="banExpires" id="banExpires" min="{TIME_NOW|date:'Y-m-d'}" {if $banExpires} value="{$banExpires|date:'Y-m-d'}"{/if} class="medium" data-ignore-timezone="true">
392 <small>{lang}wcf.acp.user.ban.expires.description{/lang}</small>
393 </dd>
394 </dl>
395
396 {event name='banFields'}
397 </section>
398
399 <script data-relocate="true">
400 $('#banned').change(function() {
401 if ($('#banned').is(':checked')) {
402 $('#banReason').attr('readonly', false);
403 $('#banNeverExpires, #banExpires').enable();
404 $('#banReason, #banNeverExpires, #banExpires').parents('dl').removeClass('disabled');
405 }
406 else {
407 $('#banReason').attr('readonly', true);
408 $('#banNeverExpires, #banExpires').disable();
409 $('#banReason, #banNeverExpires, #banExpires').parents('dl').addClass('disabled');
410 }
411 });
412
413 $('#banned').change();
414
415 $('#banNeverExpires').change(function() {
416 if ($('#banNeverExpires').is(':checked')) {
417 $('#banExpiresSetting').hide();
418 }
419 else {
420 $('#banExpiresSetting').show();
421 }
422 });
423
424 $('#banNeverExpires').change();
425 </script>
426 {/if}
427
428 {event name='sections'}
429 </div>
430
431 {foreach from=$optionTree item=categoryLevel1}
432 <div id="{@$categoryLevel1[object]->categoryName}" class="tabMenuContent hidden">
433 {foreach from=$categoryLevel1[categories] item=categoryLevel2}
434 <section class="section">
435 <h2 class="sectionTitle">{lang}wcf.user.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</h2>
436
437 {if $categoryLevel2[object]->categoryName == 'settings.general'}
438 {if $availableLanguages|count > 1}
439 <dl>
440 <dt><label for="languageID">{lang}wcf.user.language{/lang}</label></dt>
441 <dd>
442 {htmlOptions options=$availableLanguages selected=$languageID name=languageID id=languageID disableEncoding=true}
443 </dd>
444 </dl>
445
446 {if $availableContentLanguages|count > 1}
447 <dl>
448 <dt>
449 <label>{lang}wcf.user.visibleLanguages{/lang}</label>
450 </dt>
451 <dd>
452 {foreach from=$availableContentLanguages key=availableLanguageID item=availableLanguage}
453 <label><input type="checkbox" name="visibleLanguages[]" value="{@$availableLanguageID}"{if $availableLanguageID|in_array:$visibleLanguages} checked{/if}> {@$availableLanguage}</label>
454 {/foreach}
455 </dd>
456 </dl>
457 {/if}
458 {/if}
459
460 {if $action === 'edit' && $availableStyles|count > 1}
461 <dl>
462 <dt><label for="styleID">{lang}wcf.user.style{/lang}</label></dt>
463 <dd>
464 <select id="styleID" name="styleID">
465 <option value="0">{lang}wcf.global.defaultValue{/lang}</option>
466 {foreach from=$availableStyles item=style}
467 <option value="{@$style->styleID}"{if $style->styleID == $styleID} selected{/if}>{$style->styleName}</option>
468 {/foreach}
469 </select>
470 {if $errorField === 'styleID'}
471 <small class="innerError">
472 {if $errorType === 'empty' || $errorType === 'noValidSelection'}
473 {lang}wcf.global.form.error.{@$errorType}{/lang}
474 {else}
475 {lang}wcf.user.style.error.{@$errorType.password}{/lang}
476 {/if}
477 </small>
478 {/if}
479 <small>{lang}wcf.user.style.description{/lang}</small>
480 </dd>
481 </dl>
482 {/if}
483 {/if}
484
485 {if $categoryLevel2[object]->categoryName == 'profile.personal' && MODULE_USER_RANK}
486 <dl>
487 <dt><label for="userTitle">{lang}wcf.user.userTitle{/lang}</label></dt>
488 <dd>
489 <input type="text" id="userTitle" name="userTitle" value="{$userTitle}" class="long" maxlength="{@USER_TITLE_MAX_LENGTH}">
490 {if $errorType[userTitle]|isset}
491 <small class="innerError">
492 {lang}wcf.user.userTitle.error.{@$errorType[userTitle]}{/lang}
493 </small>
494 {/if}
495 <small>{lang}wcf.user.userTitle.description{/lang}</small>
496 </dd>
497 </dl>
498 {/if}
499
500 {event name='categoryFields'}
501
502 {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.user.option.'}
503
504 {if $categoryLevel2[categories]|count}
505 {foreach from=$categoryLevel2[categories] item=categoryLevel3}
506 {include file='optionFieldList' options=$categoryLevel3[options] langPrefix='wcf.user.option.'}
507 {/foreach}
508 {/if}
509 </section>
510 {/foreach}
511 </div>
512 {/foreach}
513
514 {if MODULE_USER_SIGNATURE}
515 <div id="signatureManagement" class="tabMenuContent hidden">
516 <section class="section">
517 <h2 class="sectionTitle">{lang}wcf.user.signature{/lang}</h2>
518
519 <dl>
520 <dt><label for="signature">{lang}wcf.user.signature{/lang}</label></dt>
521 <dd>
522 <textarea name="signature" id="signature" cols="40" rows="10" class="wysiwygTextarea" data-disable-attachments="true">{$signature}</textarea>
523 {if $errorField == 'signature'}
524 <small class="innerError">
525 {if $errorType == 'empty'}
526 {lang}wcf.global.form.error.empty{/lang}
527 {elseif $errorType == 'tooLong'}
528 {lang}wcf.message.error.tooLong{/lang}
529 {elseif $errorType == 'censoredWordsFound'}
530 {lang}wcf.message.error.censoredWordsFound{/lang}
531 {elseif $errorType == 'disallowedBBCodes'}
532 {lang}wcf.message.error.disallowedBBCodes{/lang}
533 {else}
534 {lang}wcf.user.signature.error.{@$errorType}{/lang}
535 {/if}
536 </small>
537 {/if}
538
539 {include file='wysiwyg' wysiwygSelector='signature'}
540 </dd>
541 </dl>
542
543 {event name='signatureFields'}
544 </section>
545
546 {if $__wcf->session->getPermission('admin.user.canDisableSignature')}
547 <section class="section">
548 <h2 class="sectionTitle">{lang}wcf.acp.user.disableSignature{/lang}</h2>
549
550 <dl>
551 <dt></dt>
552 <dd>
553 <label><input type="checkbox" id="disableSignature" name="disableSignature" value="1"{if $disableSignature == 1} checked{/if}> {lang}wcf.acp.user.disableSignature{/lang}</label>
554 </dd>
555 </dl>
556
557 <dl>
558 <dt><label for="disableSignatureReason">{lang}wcf.acp.user.disableSignatureReason{/lang}</label></dt>
559 <dd>
560 <textarea name="disableSignatureReason" id="disableSignatureReason" cols="40" rows="10">{$disableSignatureReason}</textarea>
561 </dd>
562 </dl>
563
564 <dl>
565 <dt></dt>
566 <dd><label><input type="checkbox" id="disableSignatureNeverExpires" name="disableSignatureNeverExpires" value="1"{if !$disableSignatureExpires} checked{/if}> {lang}wcf.acp.user.disableSignature.neverExpires{/lang}</label></dd>
567 </dl>
568
569 <dl id="disableSignatureExpiresSetting">
570 <dt><label for="disableSignatureExpiresExpires">{lang}wcf.acp.user.disableSignature.expires{/lang}</label></dt>
571 <dd>
572 <input type="date" name="disableSignatureExpires" id="disableSignatureExpires" min="{TIME_NOW|date:'Y-m-d'}" {if $disableSignatureExpires} value="{$disableSignatureExpires|date:'Y-m-d'}"{/if} class="medium" data-ignore-timezone="true">
573 <small>{lang}wcf.acp.user.disableSignature.expires.description{/lang}</small>
574 </dd>
575 </dl>
576
577 {event name='disableSignatureFields'}
578 </section>
579
580 <script data-relocate="true">
581 $('#disableSignature').change(function() {
582 if ($('#disableSignature').is(':checked')) {
583 $('#disableSignatureReason').attr('readonly', false);
584 $('#disableSignatureNeverExpires, #disableSignatureExpires').enable();
585 $('#disableSignatureReason, #disableSignatureNeverExpires, #disableSignatureExpires').parents('dl').removeClass('disabled');
586 }
587 else {
588 $('#disableSignatureReason').attr('readonly', true);
589 $('#disableSignatureNeverExpires, #disableSignatureExpires').disable();
590 $('#disableSignatureReason, #disableSignatureNeverExpires, #disableSignatureExpires').parents('dl').addClass('disabled');
591 }
592 });
593
594 $('#disableSignature').change();
595
596 $('#disableSignatureNeverExpires').change(function() {
597 if ($('#disableSignatureNeverExpires').is(':checked')) {
598 $('#disableSignatureExpiresSetting').hide();
599 }
600 else {
601 $('#disableSignatureExpiresSetting').show();
602 }
603 });
604
605 $('#disableSignatureNeverExpires').change();
606 </script>
607 {/if}
608
609 {event name='signatureFieldsets'}
610 </div>
611 {/if}
612
613 {if $action == 'edit'}
614 <div id="avatarForm" class="tabMenuContent hidden">
615 <section class="section avatarEdit">
616 <h2 class="sectionTitle">{lang}wcf.user.avatar{/lang}</h2>
617
618 <dl class="avatarType">
619 <dt></dt>
620 <dd>
621 <label><input type="radio" name="avatarType" value="none"{if $avatarType == 'none'} checked{/if}> {lang}wcf.user.avatar.type.none{/lang}</label>
622 </dd>
623 </dl>
624
625 <dl class="avatarType jsOnly{if $errorType[customAvatar]|isset} formError{/if}" id="avatarUpload">
626 <dt>
627 {if $avatarType == 'custom'}
628 {@$userAvatar->getImageTag(96)}
629 {else}
630 <img src="{@$__wcf->getPath()}images/avatars/avatar-default.svg" alt="" class="userAvatarImage icon96">
631 {/if}
632 </dt>
633 <dd>
634 <label><input type="radio" name="avatarType" value="custom"{if $avatarType == 'custom'} checked{/if}> {lang}wcf.user.avatar.type.custom{/lang}</label>
635
636 {* placeholder for upload button: *}
637 <div class="avatarUploadButtonContainer"></div>
638
639 {if $errorType[customAvatar]|isset}
640 <small class="innerError">
641 {if $errorType[customAvatar] == 'empty'}{lang}wcf.global.form.error.empty{/lang}{/if}
642 </small>
643 {/if}
644 </dd>
645 </dl>
646
647 {if MODULE_GRAVATAR}
648 <dl class="avatarType{if $errorType[gravatar]|isset} formError{/if}">
649 <dt><img src="https://secure.gravatar.com/avatar/{@$user->email|strtolower|md5}?s=96{if GRAVATAR_DEFAULT_TYPE != '404'}&amp;d={@GRAVATAR_DEFAULT_TYPE}{/if}" alt="" class="userAvatarImage icon96"></dt>
650 <dd>
651 <label><input type="radio" name="avatarType" value="gravatar"{if $avatarType == 'gravatar'} checked{/if}> {lang}wcf.user.avatar.type.gravatar{/lang}</label>
652
653 {if $errorType[gravatar]|isset}
654 <small class="innerError">
655 {if $errorType[gravatar] == 'notFound'}{lang}wcf.user.avatar.type.gravatar.error.notFound{/lang}{/if}
656 </small>
657 {/if}
658 </dd>
659 </dl>
660 {/if}
661
662 {event name='avatarFields'}
663 </section>
664
665 {if $__wcf->session->getPermission('admin.user.canDisableAvatar')}
666 <section class="section">
667 <h2 class="sectionTitle">{lang}wcf.acp.user.disableAvatar{/lang}</h2>
668
669 <dl>
670 <dt></dt>
671 <dd>
672 <label><input type="checkbox" id="disableAvatar" name="disableAvatar" value="1"{if $disableAvatar == 1} checked{/if}> {lang}wcf.acp.user.disableAvatar{/lang}</label>
673 </dd>
674 </dl>
675
676 <dl>
677 <dt><label for="disableAvatarReason">{lang}wcf.acp.user.disableAvatarReason{/lang}</label></dt>
678 <dd>
679 <textarea name="disableAvatarReason" id="disableAvatarReason" cols="40" rows="10">{$disableAvatarReason}</textarea>
680 </dd>
681 </dl>
682
683 <dl>
684 <dt></dt>
685 <dd><label><input type="checkbox" id="disableAvatarNeverExpires" name="disableAvatarNeverExpires" value="1"{if !$disableAvatarExpires} checked{/if}> {lang}wcf.acp.user.disableAvatar.neverExpires{/lang}</label></dd>
686 </dl>
687
688 <dl id="disableAvatarExpiresSetting">
689 <dt><label for="disableAvatarExpiresExpires">{lang}wcf.acp.user.disableAvatar.expires{/lang}</label></dt>
690 <dd>
691 <input type="date" name="disableAvatarExpires" id="disableAvatarExpires" min="{TIME_NOW|date:'Y-m-d'}" {if $disableAvatarExpires} value="{$disableAvatarExpires|date:'Y-m-d'}"{/if} class="medium">
692 <small>{lang}wcf.acp.user.disableAvatar.expires.description{/lang}</small>
693 </dd>
694 </dl>
695
696 {event name='disableAvatarFields'}
697 </section>
698
699 <script data-relocate="true">
700 $('#disableAvatar').change(function() {
701 if ($('#disableAvatar').is(':checked')) {
702 $('#disableAvatarReason').attr('readonly', false);
703 $('#disableAvatarNeverExpires, #disableAvatarExpires').enable();
704 $('#disableAvatarReason, #disableAvatarNeverExpires, #disableAvatarExpires').parents('dl').removeClass('disabled');
705 }
706 else {
707 $('#disableAvatarReason').attr('readonly', true);
708 $('#disableAvatarNeverExpires, #disableAvatarExpires').disable();
709 $('#disableAvatarReason, #disableAvatarNeverExpires, #disableAvatarExpires').parents('dl').addClass('disabled');
710 }
711 });
712
713 $('#disableAvatar').change();
714
715 $('#disableAvatarNeverExpires').change(function() {
716 if ($('#disableAvatarNeverExpires').is(':checked')) {
717 $('#disableAvatarExpiresSetting').hide();
718 }
719 else {
720 $('#disableAvatarExpiresSetting').show();
721 }
722 });
723
724 $('#disableAvatarNeverExpires').change();
725 </script>
726 {/if}
727
728 <script data-relocate="true" src="{@$__wcf->getPath()}js/WCF.Message.js?v={@LAST_UPDATE_TIME}"></script>
729 <script data-relocate="true" src="{@$__wcf->getPath()}js/WCF.User.js?v={@LAST_UPDATE_TIME}"></script>
730 <script data-relocate="true">
731 $(function() {
732 WCF.Language.addObject({
733 'wcf.user.avatar.upload.error.invalidExtension': '{jslang}wcf.user.avatar.upload.error.invalidExtension{/jslang}',
734 'wcf.user.avatar.upload.error.tooSmall': '{jslang}wcf.user.avatar.upload.error.tooSmall{/jslang}',
735 'wcf.user.avatar.upload.error.tooLarge': '{jslang}wcf.user.avatar.upload.error.tooLarge{/jslang}',
736 'wcf.user.avatar.upload.error.uploadFailed': '{jslang}wcf.user.avatar.upload.error.uploadFailed{/jslang}',
737 'wcf.user.avatar.upload.error.badImage': '{jslang}wcf.user.avatar.upload.error.badImage{/jslang}',
738 'wcf.user.avatar.upload.success': '{jslang}wcf.user.avatar.upload.success{/jslang}'
739 });
740
741 new WCF.User.Avatar.Upload({@$user->userID});
742 });
743 </script>
744
745 {event name='avatarFieldsets'}
746 </div>
747
748 <div id="coverPhotoForm" class="tabMenuContent hidden">
749 <section class="section">
750 <header class="sectionHeader">
751 <h2 class="sectionTitle">{lang}wcf.user.coverPhoto{/lang}</h2>
752 <p class="sectionDescription">{lang}wcf.acp.user.coverPhoto.description{/lang}</p>
753 </header>
754
755 {if $userCoverPhoto}
756 <dl>
757 <dt></dt>
758 <dd>
759 <div id="coverPhotoPreview" style="background-image: url({$userCoverPhoto->getURL()})"></div>
760 </dd>
761 </dl>
762
763 {if $__wcf->session->getPermission('admin.user.canDisableCoverPhoto')}
764 <dl>
765 <dt></dt>
766 <dd>
767 <label><input type="checkbox" id="deleteCoverPhoto" name="deleteCoverPhoto" value="1"{if $deleteCoverPhoto == 1} checked{/if}> {lang}wcf.acp.user.deleteCoverPhoto{/lang}</label>
768 </dd>
769 </dl>
770 {/if}
771 {else}
772 <p class="info">{lang}wcf.user.coverPhoto.noImage{/lang}</p>
773 {/if}
774
775 {event name='coverPhotoFields'}
776 </section>
777
778 {if $__wcf->session->getPermission('admin.user.canDisableCoverPhoto')}
779 <section class="section">
780 <h2 class="sectionTitle">{lang}wcf.acp.user.disableCoverPhoto{/lang}</h2>
781
782 <dl>
783 <dt></dt>
784 <dd>
785 <label><input type="checkbox" id="disableCoverPhoto" name="disableCoverPhoto" value="1"{if $disableCoverPhoto == 1} checked{/if}> {lang}wcf.acp.user.disableCoverPhoto{/lang}</label>
786 </dd>
787 </dl>
788
789 <dl>
790 <dt><label for="disableCoverPhotoReason">{lang}wcf.acp.user.disableCoverPhoto.reason{/lang}</label></dt>
791 <dd>
792 <textarea name="disableCoverPhotoReason" id="disableCoverPhotoReason" cols="40" rows="10">{$disableCoverPhotoReason}</textarea>
793 </dd>
794 </dl>
795
796 <dl>
797 <dt></dt>
798 <dd><label><input type="checkbox" id="disableCoverPhotoNeverExpires" name="disableCoverPhotoNeverExpires" value="1"{if !$disableCoverPhotoExpires} checked{/if}> {lang}wcf.acp.user.disableCoverPhoto.neverExpires{/lang}</label></dd>
799 </dl>
800
801 <dl id="disableCoverPhotoExpiresSetting">
802 <dt><label for="disableCoverPhotoExpires">{lang}wcf.acp.user.disableCoverPhoto.expires{/lang}</label></dt>
803 <dd>
804 <input type="date" name="disableCoverPhotoExpires" id="disableCoverPhotoExpires" min="{TIME_NOW|date:'Y-m-d'}" {if $disableCoverPhotoExpires} value="{$disableCoverPhotoExpires|date:'Y-m-d'}"{/if} class="medium">
805 <small>{lang}wcf.acp.user.disableCoverPhoto.expires.description{/lang}</small>
806 </dd>
807 </dl>
808
809 {event name='disableAvatarFields'}
810 </section>
811
812 <script data-relocate="true">
813 $('#disableCoverPhoto').change(function() {
814 if ($('#disableCoverPhoto').is(':checked')) {
815 $('#disableCoverPhotoReason').attr('readonly', false);
816 $('#disableCoverPhotoNeverExpires, #disableCoverPhotoExpires').enable();
817 $('#disableCoverPhotoReason, #disableCoverPhotoNeverExpires, #disableCoverPhotoExpires').parents('dl').removeClass('disabled');
818 }
819 else {
820 $('#disableCoverPhotoReason').attr('readonly', true);
821 $('#disableCoverPhotoNeverExpires, #disableCoverPhotoExpires').disable();
822 $('#disableCoverPhotoReason, #disableCoverPhotoNeverExpires, #disableCoverPhotoExpires').parents('dl').addClass('disabled');
823 }
824 });
825
826 $('#disableCoverPhoto').change();
827
828 $('#disableCoverPhotoNeverExpires').change(function() {
829 if ($('#disableCoverPhotoNeverExpires').is(':checked')) {
830 $('#disableCoverPhotoExpiresSetting').hide();
831 }
832 else {
833 $('#disableCoverPhotoExpiresSetting').show();
834 }
835 });
836
837 $('#disableCoverPhotoNeverExpires').change();
838 </script>
839 {/if}
840
841 {event name='coverPhotoFieldsets'}
842 </div>
843 {/if}
844
845 {event name='tabMenuContent'} {* deprecated event *}
846 {event name='tabMenuContents'}
847 </div>
848
849 <div class="formSubmit">
850 <input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
851 {csrfToken}
852 </div>
853 </form>
854
855 {if $action === 'edit' && $ownerGroupID}
856 <script data-relocate="true">
857 (function() {
858 var input = elBySel('input[name="groupIDs[]"][value="{@$ownerGroupID}"]');
859 if (input) {
860 var icon = elCreate('span');
861 icon.className = 'icon icon16 fa-shield jsTooltip';
862 icon.title = '{jslang}wcf.acp.group.type.owner{/jslang}';
863 input.parentNode.appendChild(icon);
864
865 {if $user->userID == $__wcf->user->userID}
866 var shadow = elCreate('input');
867 shadow.name = input.name;
868 shadow.type = 'hidden';
869 shadow.value = input.value;
870
871 input.parentNode.appendChild(shadow);
872 input.disabled = true;
873 {/if}
874 }
875 })();
876 </script>
877 {/if}
878
879 {include file='footer'}