1 {capture assign='pageTitle'}{$user->username} - {lang}wcf.user.members{/lang}{/capture}
3 {capture assign='headContent'}
4 {event name='javascriptInclude'}
5 <script data-relocate="true">
6 {if $__wcf->getUser()->userID && $__wcf->getUser()->userID != $user->userID}
7 require(['Language', 'WoltLabSuite/Core/Ui/User/Editor', 'WoltLabSuite/Core/Ui/User/Profile/Menu/Item/Ignore', 'WoltLabSuite/Core/Ui/User/Profile/Menu/Item/Follow'], function(Language, UiUserEditor, UiUserProfileMenuItemIgnore, UiUserProfileMenuItemFollow) {
9 'wcf.acp.user.disable': '{jslang}wcf.acp.user.disable{/jslang}',
10 'wcf.acp.user.enable': '{jslang}wcf.acp.user.enable{/jslang}',
11 'wcf.user.ban': '{jslang}wcf.user.ban{/jslang}',
12 'wcf.user.banned': '{jslang}wcf.user.banned{/jslang}',
13 'wcf.user.ban.confirmMessage': '{jslang}wcf.user.ban.confirmMessage{/jslang}',
14 'wcf.user.ban.expires': '{jslang}wcf.user.ban.expires{/jslang}',
15 'wcf.user.ban.expires.description': '{jslang}wcf.user.ban.expires.description{/jslang}',
16 'wcf.user.ban.neverExpires': '{jslang}wcf.user.ban.neverExpires{/jslang}',
17 'wcf.user.ban.reason.description': '{jslang}wcf.user.ban.reason.description{/jslang}',
18 'wcf.user.button.follow': '{jslang}wcf.user.button.follow{/jslang}',
19 'wcf.user.button.unfollow': '{jslang}wcf.user.button.unfollow{/jslang}',
20 'wcf.user.button.ignore': '{jslang}wcf.user.button.ignore{/jslang}',
21 'wcf.user.button.unignore': '{jslang}wcf.user.button.unignore{/jslang}',
22 'wcf.user.disableAvatar': '{jslang}wcf.user.disableAvatar{/jslang}',
23 'wcf.user.disableAvatar.confirmMessage': '{jslang}wcf.user.disableAvatar.confirmMessage{/jslang}',
24 'wcf.user.disableAvatar.expires': '{jslang}wcf.user.disableAvatar.expires{/jslang}',
25 'wcf.user.disableAvatar.expires.description': '{jslang}wcf.user.disableAvatar.expires.description{/jslang}',
26 'wcf.user.disableAvatar.neverExpires': '{jslang}wcf.user.disableAvatar.neverExpires{/jslang}',
27 'wcf.user.disableCoverPhoto': '{jslang}wcf.user.disableCoverPhoto{/jslang}',
28 'wcf.user.disableCoverPhoto.confirmMessage': '{jslang}wcf.user.disableCoverPhoto.confirmMessage{/jslang}',
29 'wcf.user.disableCoverPhoto.expires': '{jslang}wcf.user.disableCoverPhoto.expires{/jslang}',
30 'wcf.user.disableCoverPhoto.expires.description': '{jslang}wcf.user.disableCoverPhoto.expires.description{/jslang}',
31 'wcf.user.disableCoverPhoto.neverExpires': '{jslang}wcf.user.disableCoverPhoto.neverExpires{/jslang}',
32 'wcf.user.disableSignature': '{jslang}wcf.user.disableSignature{/jslang}',
33 'wcf.user.disableSignature.confirmMessage': '{jslang}wcf.user.disableSignature.confirmMessage{/jslang}',
34 'wcf.user.disableSignature.expires': '{jslang}wcf.user.disableSignature.expires{/jslang}',
35 'wcf.user.disableSignature.expires.description': '{jslang}wcf.user.disableSignature.expires.description{/jslang}',
36 'wcf.user.disableSignature.neverExpires': '{jslang}wcf.user.disableSignature.neverExpires{/jslang}',
37 'wcf.user.edit': '{jslang}wcf.user.edit{/jslang}',
38 'wcf.user.enableAvatar': '{jslang}wcf.user.enableAvatar{/jslang}',
39 'wcf.user.enableCoverPhoto': '{jslang}wcf.user.enableCoverPhoto{/jslang}',
40 'wcf.user.enableSignature': '{jslang}wcf.user.enableSignature{/jslang}',
41 'wcf.user.unban': '{jslang}wcf.user.unban{/jslang}'
48 {if !$user->getPermission('user.profile.cannotBeIgnored') || $__wcf->getUserProfileHandler()->isIgnoredUser($user->userID)}
49 new UiUserProfileMenuItemIgnore({@$user->userID}, {if $__wcf->getUserProfileHandler()->isIgnoredUser($user->userID)}true{else}false{/if});
52 {if !$user->isIgnoredUser($__wcf->user->userID)}
53 new UiUserProfileMenuItemFollow({@$user->userID}, {if $__wcf->getUserProfileHandler()->isFollowing($user->userID)}true{else}false{/if});
59 {if $__wcf->getUser()->userID && $__wcf->getUser()->userID != $user->userID}
60 WCF.Language.addObject({
61 'wcf.user.activityPoint': '{jslang}wcf.user.activityPoint{/jslang}'
65 new WCF.User.Profile.TabMenu({@$user->userID});
67 {if $user->canEdit() || ($__wcf->getUser()->userID == $user->userID && $user->canEditOwnProfile())}
68 WCF.Language.addObject({
69 'wcf.user.editProfile': '{jslang}wcf.user.editProfile{/jslang}'
72 new WCF.User.Profile.Editor({@$user->userID}, {if $editOnInit}true{else}false{/if});
75 {event name='javascriptInit'}
78 require(['WoltLabSuite/Core/Controller/User/Profile'], ({ setup }) => {
79 setup({$user->userID});
84 <style type="text/css">
85 #profileContent > .tabMenu > ul > li:not(:first-child) {
86 display: none !important;
89 #profileContent > .tabMenuContent:not(:first-of-type) {
90 display: none !important;
96 {capture assign='contentHeader'}
97 <header class="contentHeader userProfileUser userProfileUserWithCoverPhoto" data-object-id="{@$user->userID}"{if $isAccessible}
98 {if $__wcf->session->getPermission('admin.user.canBanUser')}
99 data-banned="{@$user->banned}"
101 {if $__wcf->session->getPermission('admin.user.canDisableAvatar')}
102 data-disable-avatar="{@$user->disableAvatar}"
104 {if $__wcf->session->getPermission('admin.user.canDisableSignature')}
105 data-disable-signature="{@$user->disableSignature}"
107 {if $__wcf->session->getPermission('admin.user.canDisableCoverPhoto')}
108 data-disable-cover-photo="{@$user->disableCoverPhoto}"
110 {if $__wcf->session->getPermission('admin.user.canEnableUser')}
111 data-is-disabled="{if $user->activationCode}true{else}false{/if}"
114 <div class="userProfileCoverPhoto" style="background-image: url({$user->getCoverPhoto()->getURL()})">
115 {if ($user->userID == $__wcf->user->userID || $user->canEdit()) && ($__wcf->getSession()->getPermission('user.profile.coverPhoto.canUploadCoverPhoto') || $user->coverPhotoHash)}
116 <div class="userProfileManageCoverPhoto dropdown jsOnly">
117 <a href="#" class="button small dropdownToggle">{icon name='pencil'} {lang}wcf.user.coverPhoto.edit{/lang}</a>
118 <ul class="dropdownMenu">
119 {if $__wcf->getSession()->getPermission('user.profile.coverPhoto.canUploadCoverPhoto')}
120 <li><a href="#" class="jsButtonUploadCoverPhoto jsStaticDialog" data-dialog-id="userProfileCoverPhotoUpload">{lang}wcf.user.coverPhoto.upload{/lang}</a></li>
122 <li{if !$user->coverPhotoHash} style="display:none;"{/if}><a href="#" class="jsButtonDeleteCoverPhoto">{lang}wcf.user.coverPhoto.delete{/lang}</a></li>
127 <div class="contentHeaderIcon">
128 {if $user->userID == $__wcf->user->userID}
129 <a href="{link controller='AvatarEdit'}{/link}" class="jsTooltip" title="{lang}wcf.user.avatar.edit{/lang}">{@$user->getAvatar()->getImageTag(128)}</a>
131 <span>{@$user->getAvatar()->getImageTag(128)}</span>
133 {if $user->isOnline()}<span class="badge green badgeOnline">{lang}wcf.user.online{/lang}</span>{/if}
136 <div class="contentHeaderTitle">
137 <h1 class="contentTitle">
138 <span class="userProfileUsername">{$user->username}</span>
140 <span class="jsTooltip jsUserBanned" title="{lang}wcf.user.banned{/lang}">
141 {icon size=24 name='lock'}
144 {if MODULE_USER_RANK}
145 {if $user->getUserTitle()}
146 <span class="badge userTitleBadge{if $user->getRank() && $user->getRank()->cssClassName} {@$user->getRank()->cssClassName}{/if}">{$user->getUserTitle()}</span>
148 {if $user->getRank() && $user->getRank()->rankImage}
149 <span class="userRankImage">{@$user->getRank()->getImage()}</span>
153 {event name='afterContentTitle'}
156 <div class="contentHeaderDescription">
157 {if MODULE_TROPHY && $__wcf->session->getPermission('user.profile.trophy.canSeeTrophies') && ($user->isAccessible('canViewTrophies') || $user->userID == $__wcf->session->userID) && $specialTrophyCount}
158 <div class="specialTrophyUserContainer">
160 {foreach from=$user->getSpecialTrophies() item=trophy}
161 <li><a href="{@$trophy->getLink()}">{@$trophy->renderTrophy(32, true)}</a></li>
163 {if $user->trophyPoints > $specialTrophyCount}
164 <li><a href="#" class="jsTooltip userTrophyOverlayList" data-user-id="{$user->userID}" title="{lang}wcf.user.trophy.showTrophies{/lang}" role="button">{lang trophyCount=$user->trophyPoints-$specialTrophyCount}wcf.user.trophy.showMoreTrophies{/lang}</a></li>
169 <ul class="inlineList commaSeparated">
170 {if !$user->isProtected()}
171 {if $user->isVisibleOption('gender') && $user->gender}<li>{$user->getFormattedUserOption('gender')}</li>{/if}
172 {if $user->isVisibleOption('birthday') && $user->getAge()}<li>{@$user->getAge()}</li>{/if}
173 {if $user->isVisibleOption('location') && $user->location}<li>{lang}wcf.user.membersList.location{/lang}</li>{/if}
175 {if $user->getOldUsername()}<li>{lang}wcf.user.profile.oldUsername{/lang}</li>{/if}
176 <li>{lang}wcf.user.membersList.registrationDate{/lang}</li>
177 {event name='userDataRow1'}
181 <ul class="inlineList commaSeparated">
183 {if $user->canViewOnlineStatus() && $user->getLastActivityTime()}
184 <li>{lang}wcf.user.usersOnline.lastActivity{/lang}: {@$user->getLastActivityTime()|time}</li>
185 {if $user->getCurrentLocation()}<li>{@$user->getCurrentLocation()}</li>{/if}
187 {if $__wcf->session->getPermission('admin.user.canViewIpAddress') && $user->registrationIpAddress}
188 <li>{lang}wcf.user.registrationIpAddress{/lang}: <span class="userRegistrationIpAddress">{@$user->getRegistrationIpAddress()|ipSearch}</span></li>
194 <dl class="plain inlineDataList">
195 {include file='userInformationStatistics'}
197 {if $user->profileHits}
198 <dt{if $user->getProfileAge() > 1} title="{lang}wcf.user.profileHits.hitsPerDay{/lang}"{/if}>{lang}wcf.user.profileHits{/lang}</dt>
199 <dd>{#$user->profileHits}</dd>
206 <nav class="contentHeaderNavigation">
207 <ul class="userProfileButtonContainer">
209 {if $user->canEdit() || ($__wcf->getUser()->userID == $user->userID && $user->canEditOwnProfile())}
210 <li><a href="#" class="jsButtonEditProfile button buttonPrimary">{icon name='pencil'} <span>{lang}wcf.user.editProfile{/lang}</span></a></li>
213 {event name='contentHeaderNavigation'}
221 {include file='userSidebar' assign='sidebarRight'}
223 {capture assign='__menuSearch'}
224 {event name='menuSearch'}
225 {* DEPRECATED *}{event name='quickSearchItems'}
227 {assign var='__menuSearch' value=$__menuSearch|trim}
229 {capture assign='__menuManagement'}
230 {event name='menuManagement'}
231 {if $isAccessible && $__wcf->user->userID != $user->userID && ($__wcf->session->getPermission('admin.user.canBanUser') || $__wcf->session->getPermission('admin.user.canDisableAvatar') || $__wcf->session->getPermission('admin.user.canDisableSignature') || $__wcf->session->getPermission('admin.user.canEnableUser') || ($__wcf->session->getPermission('admin.general.canUseAcp') && $__wcf->session->getPermission('admin.user.canEditUser')){event name='moderationDropdownPermissions'})}
232 {if $__wcf->session->getPermission('admin.user.canBanUser')}<li><a href="#" class="jsButtonUserBan">{lang}wcf.user.{if $user->banned}un{/if}ban{/lang}</a></li>{/if}
233 {if $__wcf->session->getPermission('admin.user.canDisableAvatar')}<li><a href="#" class="jsButtonUserDisableAvatar">{lang}wcf.user.{if $user->disableAvatar}enable{else}disable{/if}Avatar{/lang}</a></li>{/if}
234 {if $__wcf->session->getPermission('admin.user.canDisableSignature')}<li><a href="#" class="jsButtonUserDisableSignature">{lang}wcf.user.{if $user->disableSignature}enable{else}disable{/if}Signature{/lang}</a></li>{/if}
235 {if $__wcf->session->getPermission('admin.user.canDisableCoverPhoto')}<li><a href="#" class="jsButtonUserDisableCoverPhoto">{lang}wcf.user.{if $user->disableCoverPhoto}enable{else}disable{/if}CoverPhoto{/lang}</a></li>{/if}
236 {if $__wcf->session->getPermission('admin.user.canEnableUser')}<li><a href="#" class="jsButtonUserEnable">{lang}wcf.acp.user.{if $user->pendingActivation()}enable{else}disable{/if}{/lang}</a></li>{/if}
238 {if $__wcf->session->getPermission('admin.general.canUseAcp') && $__wcf->session->getPermission('admin.user.canEditUser')}<li><a href="{link controller='UserEdit' object=$user isACP=true}{/link}" class="jsUserInlineEditor">{lang}wcf.user.edit{/lang}</a></li>{/if}
241 {assign var='__menuManagement' value=$__menuManagement|trim}
243 {capture assign='contentInteractionButtons'}
245 <div class="contentInteractionButton dropdown jsOnly">
246 <button type="button" class="button small dropdownToggle">{icon name='magnifying-glass'} <span>{lang}wcf.user.searchUserContent{/lang}</span></button>
247 <ul class="dropdownMenu userProfileButtonMenu" data-menu="search">
252 {if $__menuManagement}
253 <div class="contentInteractionButton dropdown jsOnly">
254 <button type="button" class="button small dropdownToggle">{icon name='gear'} <span>{lang}wcf.user.profile.management{/lang}</span></button>
255 <ul class="dropdownMenu userProfileButtonMenu" data-menu="management">
262 {capture assign='contentInteractionDropdownItems'}
263 {* DEPRECATED *}{event name='menuCustomization'}
264 {event name='menuInteraction'}
266 {if $user->userID != $__wcf->user->userID}
267 {if $user->isAccessible('canViewEmailAddress') || $__wcf->session->getPermission('admin.user.canEditMailAddress')}
268 <li><a href="mailto:{@$user->getEncodedEmail()}">{lang}wcf.user.button.mail{/lang}</a></li>
272 {if $user->userID != $__wcf->user->userID && $__wcf->session->getPermission('user.profile.canReportContent')}
277 data-report-content="com.woltlab.wcf.user"
278 data-object-id="{$user->userID}"
280 {lang}wcf.user.profile.report{/lang}
286 {include file='header'}
288 {if !$user->isProtected()}
289 <div id="profileContent" class="section tabMenuContainer userProfileContent" data-active="{$__wcf->getUserProfileMenu()->getActiveMenuItem($userID)->getIdentifier()}">
290 <nav class="tabMenu">
292 {foreach from=$__wcf->getUserProfileMenu()->getMenuItems() item=menuItem}
293 {if $menuItem->getContentManager()->isVisible($userID)}
294 <li><a href="#{$menuItem->getIdentifier()|rawurlencode}">{$menuItem}</a></li>
300 {foreach from=$__wcf->getUserProfileMenu()->getMenuItems() item=menuItem}
301 {if $menuItem->getContentManager()->isVisible($userID)}
302 <div id="{$menuItem->getIdentifier()}" class="tabMenuContent" data-menu-item="{$menuItem->menuItem}">
303 {if $menuItem === $__wcf->getUserProfileMenu()->getActiveMenuItem($userID)}
311 <woltlab-core-notice type="info">{lang}wcf.user.profile.protected{/lang}</woltlab-core-notice>
314 {if $user->userID == $__wcf->user->userID || $user->canEdit()}
315 {if $__wcf->getSession()->getPermission('user.profile.coverPhoto.canUploadCoverPhoto')}
316 <div id="userProfileCoverPhotoUpload" class="jsStaticDialogContent" data-title="{lang}wcf.user.coverPhoto.upload{/lang}">
317 {if $__wcf->user->disableCoverPhoto}
318 <woltlab-core-notice type="error">{lang}wcf.user.coverPhoto.error.disabled{/lang}</woltlab-core-notice>
320 <div id="coverPhotoUploadPreview"></div>
322 {* placeholder for the upload button *}
323 <div id="coverPhotoUploadButtonContainer"></div>
324 <small>{lang}wcf.user.coverPhoto.upload.description{/lang}</small>
327 <script data-relocate="true">
328 require(['Language', 'WoltLabSuite/Core/Ui/User/CoverPhoto/Upload'], function (Language, UiUserCoverPhotoUpload) {
330 'wcf.user.coverPhoto.delete.confirmMessage': '{jslang}wcf.user.coverPhoto.delete.confirmMessage{/jslang}',
331 'wcf.user.coverPhoto.upload.error.fileExtension': '{jslang}wcf.user.coverPhoto.upload.error.fileExtension{/jslang}',
332 'wcf.user.coverPhoto.upload.error.tooLarge': '{jslang}wcf.user.coverPhoto.upload.error.tooLarge{/jslang}',
333 'wcf.user.coverPhoto.upload.error.uploadFailed': '{jslang}wcf.user.coverPhoto.upload.error.uploadFailed{/jslang}',
334 'wcf.user.coverPhoto.upload.error.badImage': '{jslang}wcf.user.coverPhoto.upload.error.badImage{/jslang}'
337 {if !$__wcf->user->disableCoverPhoto}
338 new UiUserCoverPhotoUpload({@$user->userID});
343 <script data-relocate="true">
344 require(['Language', 'WoltLabSuite/Core/Ui/User/CoverPhoto/Delete'], function (Language, UiUserCoverPhotoDelete) {
346 'wcf.user.coverPhoto.delete.confirmMessage': '{jslang}wcf.user.coverPhoto.delete.confirmMessage{/jslang}'
349 UiUserCoverPhotoDelete.init({@$user->userID});
354 {include file='footer'}