nodebb-theme-persona 13.3.29 → 13.3.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.eslintrc +2 -2
  2. package/README.md +20 -20
  3. package/lib/controllers.js +24 -24
  4. package/library.js +97 -97
  5. package/package.json +52 -52
  6. package/plugin.json +20 -20
  7. package/public/.eslintrc +2 -2
  8. package/public/admin.js +15 -15
  9. package/public/modules/autohidingnavbar.js +220 -220
  10. package/public/modules/mobile-menu.js +190 -190
  11. package/public/modules/taskbar.js +65 -65
  12. package/public/persona.js +257 -257
  13. package/public/settings.js +53 -53
  14. package/scss/account.scss +336 -336
  15. package/scss/categories.scss +205 -205
  16. package/scss/category.scss +161 -161
  17. package/scss/chats.scss +14 -14
  18. package/scss/flags.scss +42 -42
  19. package/scss/footer.scss +16 -16
  20. package/scss/groups.scss +166 -166
  21. package/scss/header.scss +361 -361
  22. package/scss/keyframes.scss +152 -152
  23. package/scss/mixins.scss +129 -129
  24. package/scss/mobile.scss +331 -331
  25. package/scss/modules/composer.scss +20 -20
  26. package/scss/modules/cookie-consent.scss +12 -12
  27. package/scss/modules/fab.scss +32 -32
  28. package/scss/modules/morph.scss +268 -268
  29. package/scss/modules/necro-post.scss +8 -8
  30. package/scss/modules/nprogress.scss +80 -80
  31. package/scss/modules/taskbar.scss +160 -160
  32. package/scss/modules/user-menu.scss +7 -7
  33. package/scss/modules/usercard.scss +64 -64
  34. package/scss/noscript.scss +80 -80
  35. package/scss/overrides.scss +39 -39
  36. package/scss/persona.scss +34 -35
  37. package/scss/posts_list.scss +127 -127
  38. package/scss/search.scss +48 -48
  39. package/scss/style.scss +256 -270
  40. package/scss/tags.scss +10 -10
  41. package/scss/topic.scss +571 -571
  42. package/scss/topics_list.scss +16 -16
  43. package/scss/variables.scss +6 -6
  44. package/templates/account/blocks.tpl +46 -46
  45. package/templates/account/categories.tpl +28 -28
  46. package/templates/account/consent.tpl +68 -68
  47. package/templates/account/edit/password.tpl +29 -29
  48. package/templates/account/edit/username.tpl +25 -25
  49. package/templates/account/edit.tpl +136 -136
  50. package/templates/account/followers.tpl +17 -17
  51. package/templates/account/following.tpl +17 -17
  52. package/templates/account/groups.tpl +16 -16
  53. package/templates/account/info.tpl +291 -291
  54. package/templates/account/posts.tpl +18 -18
  55. package/templates/account/profile.tpl +166 -166
  56. package/templates/account/sessions.tpl +31 -31
  57. package/templates/account/settings.tpl +251 -251
  58. package/templates/account/tags.tpl +9 -9
  59. package/templates/account/theme.tpl +25 -25
  60. package/templates/account/topics.tpl +29 -29
  61. package/templates/account/uploads.tpl +42 -42
  62. package/templates/admin/plugins/persona.tpl +24 -24
  63. package/templates/categories.tpl +31 -31
  64. package/templates/category.tpl +63 -63
  65. package/templates/flags/detail.tpl +208 -208
  66. package/templates/flags/list.tpl +71 -71
  67. package/templates/footer.tpl +11 -11
  68. package/templates/groups/details.tpl +77 -77
  69. package/templates/groups/list.tpl +48 -48
  70. package/templates/groups/members.tpl +5 -5
  71. package/templates/header.tpl +47 -47
  72. package/templates/modules/taskbar.tpl +2 -2
  73. package/templates/modules/usercard.tpl +36 -36
  74. package/templates/notifications.tpl +66 -66
  75. package/templates/partials/account/category-item.tpl +23 -23
  76. package/templates/partials/account/header.tpl +47 -47
  77. package/templates/partials/account/menu.tpl +108 -108
  78. package/templates/partials/breadcrumbs.tpl +18 -18
  79. package/templates/partials/buttons/newTopic.tpl +22 -22
  80. package/templates/partials/categories/item.tpl +60 -60
  81. package/templates/partials/categories/lastpost.tpl +26 -26
  82. package/templates/partials/category/filter-dropdown-content.tpl +31 -31
  83. package/templates/partials/category/selector-dropdown-content.tpl +32 -32
  84. package/templates/partials/category/sort.tpl +14 -14
  85. package/templates/partials/category/subcategory.tpl +17 -17
  86. package/templates/partials/category/tags.tpl +3 -3
  87. package/templates/partials/category/tools.tpl +86 -86
  88. package/templates/partials/category/watch.tpl +55 -55
  89. package/templates/partials/chats-menu.tpl +40 -40
  90. package/templates/partials/cookie-consent.tpl +4 -4
  91. package/templates/partials/flags/filters.tpl +173 -173
  92. package/templates/partials/groups/admin.tpl +200 -200
  93. package/templates/partials/groups/filter-dropdown-content.tpl +24 -24
  94. package/templates/partials/groups/list.tpl +20 -20
  95. package/templates/partials/groups/memberlist.tpl +42 -42
  96. package/templates/partials/header/chats.tpl +18 -18
  97. package/templates/partials/header/notifications.tpl +18 -18
  98. package/templates/partials/header/search.tpl +24 -24
  99. package/templates/partials/header/user-menu.tpl +96 -96
  100. package/templates/partials/menu.tpl +128 -128
  101. package/templates/partials/notifications_list.tpl +30 -30
  102. package/templates/partials/paginator.tpl +44 -44
  103. package/templates/partials/post_bar.tpl +20 -20
  104. package/templates/partials/posts_list.tpl +7 -7
  105. package/templates/partials/posts_list_item.tpl +31 -31
  106. package/templates/partials/quick-search-results.tpl +33 -33
  107. package/templates/partials/search-filters.tpl +183 -183
  108. package/templates/partials/search-results.tpl +54 -54
  109. package/templates/partials/slideout-menu.tpl +4 -4
  110. package/templates/partials/tags/filter-dropdown-content.tpl +33 -33
  111. package/templates/partials/tags/watch.tpl +35 -35
  112. package/templates/partials/tags_list.tpl +4 -4
  113. package/templates/partials/toast.tpl +19 -19
  114. package/templates/partials/topic/event.tpl +12 -12
  115. package/templates/partials/topic/navigation-post.tpl +11 -11
  116. package/templates/partials/topic/navigator.tpl +39 -39
  117. package/templates/partials/topic/necro-post.tpl +2 -2
  118. package/templates/partials/topic/post-menu-list.tpl +132 -132
  119. package/templates/partials/topic/post-menu.tpl +4 -4
  120. package/templates/partials/topic/post.tpl +128 -128
  121. package/templates/partials/topic/quickreply.tpl +28 -28
  122. package/templates/partials/topic/reply-button.tpl +26 -26
  123. package/templates/partials/topic/selection-tooltip.tpl +2 -2
  124. package/templates/partials/topic/sort.tpl +9 -9
  125. package/templates/partials/topic/stats.tpl +11 -11
  126. package/templates/partials/topic/tags.tpl +2 -2
  127. package/templates/partials/topic/tools.tpl +7 -7
  128. package/templates/partials/topic/topic-menu-list.tpl +74 -74
  129. package/templates/partials/topic/watch.tpl +47 -47
  130. package/templates/partials/topic-filters.tpl +11 -11
  131. package/templates/partials/topic-terms.tpl +11 -11
  132. package/templates/partials/topics_list.tpl +117 -117
  133. package/templates/partials/users/filter-dropdown-content.tpl +20 -20
  134. package/templates/partials/users/item.tpl +43 -43
  135. package/templates/partials/users_list.tpl +14 -14
  136. package/templates/partials/users_list_menu.tpl +20 -20
  137. package/templates/popular.tpl +35 -35
  138. package/templates/recent.tpl +37 -37
  139. package/templates/search.tpl +47 -47
  140. package/templates/tag.tpl +34 -34
  141. package/templates/tags.tpl +32 -32
  142. package/templates/top.tpl +35 -35
  143. package/templates/topic.tpl +129 -129
  144. package/templates/unread.tpl +37 -37
  145. package/templates/users.tpl +34 -34
  146. package/scss/register.scss +0 -71
@@ -1,292 +1,292 @@
1
- <!-- IMPORT partials/account/header.tpl -->
2
-
3
- <!-- IF sessions.length -->
4
- <div class="row mb-3">
5
- <div class="col-12 col-md-12">
6
- <h4>[[global:sessions]]</h4>
7
- <ul class="list-group" component="user/sessions">
8
- {{{each sessions}}}
9
- <li class="list-group-item" data-uuid="{../uuid}">
10
- <div class="float-end">
11
- <!-- IF isSelfOrAdminOrGlobalModerator -->
12
- <!-- IF !../current -->
13
- <button class="btn btn-sm btn-outline-secondary" type="button" data-action="revokeSession">Revoke Session</button>
14
- <!-- ENDIF !../current -->
15
- <!-- ENDIF isSelfOrAdminOrGlobalModerator -->
16
- {function.userAgentIcons}
17
- <i class="fa fa-circle text-<!-- IF ../current -->success<!-- ELSE -->muted<!-- ENDIF ../current -->"></i>
18
- </div>
19
- {../browser} {../version} on {../platform}<br />
20
- <small class="timeago text-muted" title="{../datetimeISO}"></small>
21
- <ul>
22
- <li><strong>[[global:ip-address]]</strong>: {../ip}</li>
23
- </ul>
24
- </li>
25
- {{{end}}}
26
- </ul>
27
- </div>
28
- </div>
29
- <!-- ENDIF sessions.length -->
30
-
31
- <div class="row">
32
- <div class="col-sm-6">
33
- <div class="card mb-3">
34
- <h5 class="card-header">
35
- [[global:recentips]]
36
- </h5>
37
- <div class="card-body">
38
- <ul>
39
- {{{each ips}}}
40
- <li>{@value}</li>
41
- {{{end}}}
42
- </ul>
43
- </div>
44
- </div>
45
-
46
- <div class="card mb-3">
47
- <h5 class="card-header">
48
- [[user:info.username-history]]
49
- </h5>
50
- <div class="card-body">
51
- <ul class="list-unstyled mb-0">
52
- {{{ each usernames }}}
53
- <li class="d-flex justify-content-between mb-1">
54
- <span class="text-sm">{./value}</span>
55
-
56
- <div>
57
- {{{ if ./byUid }}}
58
- <a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
59
- {buildAvatar(./byUser, "18px", true)}</a>
60
- {{{ end }}}
61
- <span class="timeago text-sm lh-1" title="{./timestampISO}"></span>
62
- </div>
63
- </li>
64
- {{{ end }}}
65
- </ul>
66
- </div>
67
- </div>
68
-
69
- <div class="card mb-3">
70
- <h5 class="card-header">
71
- [[user:info.email-history]]
72
- </h5>
73
- <div class="card-body">
74
- <ul class="list-unstyled mb-0">
75
- {{{ each emails }}}
76
- <li class="d-flex justify-content-between mb-1">
77
- <span class="text-sm">{./value}</span>
78
- <div>
79
- {{{ if ./byUid }}}
80
- <a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
81
- {buildAvatar(./byUser, "18px", true)}</a>
82
- {{{ end }}}
83
- <span class="timeago text-sm lh-1" title="{./timestampISO}"></span>
84
- </div>
85
- </li>
86
- {{{ end }}}
87
- </ul>
88
- </div>
89
- </div>
90
- <!-- IF isAdminOrGlobalModerator -->
91
- <div class="card">
92
- <h5 class="card-header">
93
- [[user:info.moderation-note]]
94
- </h5>
95
- <div class="card-body">
96
- <textarea component="account/moderation-note" class="form-control"></textarea>
97
- <br/>
98
- <button class="btn btn-sm float-end btn-success" component="account/save-moderation-note">[[user:info.moderation-note.add]]</button>
99
- <br/>
100
- <div component="account/moderation-note/list">
101
- {{{ each moderationNotes }}}
102
- <hr/>
103
-
104
- <div data-id="{./id}">
105
- <div class="mb-1">
106
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{buildAvatar(./user, "24px", true)}</a>
107
-
108
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" class="fw-bold" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
109
-
110
- <span class="timeago" title="{./timestampISO}"></span>
111
- </div>
112
-
113
- <div component="account/moderation-note/content-area" class="d-flex flex-column">
114
- <div class="content">
115
- {./note}
116
- </div>
117
- <button component="account/moderation-note/edit" class="btn btn-sm btn-link align-self-end">[[topic:edit]]</button>
118
- </div>
119
-
120
- <div component="account/moderation-note/edit-area" class="d-flex flex-column gap-2">
121
- <textarea class="form-control w-100 overflow-hidden">{./rawNote}</textarea>
122
- <div class="align-self-end">
123
- <button component="account/moderation-note/cancel-edit" class="btn btn-sm btn-link text-danger align-self-end">[[global:cancel]]</button>
124
- <button component="account/moderation-note/save-edit" class="btn btn-sm btn-primary align-self-end">[[global:save]]</button>
125
- </div>
126
- </div>
127
- </div>
128
- {{{ end }}}
129
- </div>
130
- <!-- IMPORT partials/paginator.tpl -->
131
- </div>
132
- </div>
133
- <!-- ENDIF isAdminOrGlobalModerator -->
134
- </div>
135
- <div class="col-sm-6">
136
- <div class="card mb-3">
137
- <h5 class="card-header">
138
- [[user:info.latest-flags]]
139
- </h5>
140
- <div class="card-body">
141
- <!-- IF history.flags.length -->
142
- <ul class="recent-flags list-unstyled">
143
- {{{ each history.flags }}}
144
- <li class="mb-4 border-bottom">
145
- <div class="mb-1 d-flex align-items-center justify-content-between">
146
- <div>
147
- {{{ if (./type == "user")}}}
148
- <span class="badge text-bg-info">[[user:info.profile]]</span>
149
- {{{ else }}}
150
- <span class="badge text-bg-info">[[user:info.post]]</span>
151
- {{{ end }}}
152
- <span class="timestamp timeago" title="{./timestampISO}"></span>
153
- </div>
154
-
155
- <a href="{config.relative_path}/flags/{./flagId}" class="badge badge border border-gray-300 text-body">[[user:info.view-flag]]</a>
156
- </div>
157
-
158
- {{{ if (./type == "post") }}}
159
- <p class="mb-1">
160
- {{{ if history.flags.targetPurged }}}
161
- <div>[[flags:target-purged]]</div>
162
- {{{ else }}}
163
- <a class="title" href="{config.relative_path}/post/{./pid}">{./title}</a>
164
- {{{ end }}}
165
- </p>
166
- {{{ end }}}
167
-
168
- <div class="d-flex gap-2 align-items-center mb-3">
169
- <span class="text-sm">[[user:info.reported-by]]</span>
170
- <div class="d-flex text-nowrap">
171
- {{{ each ./reports }}}
172
- <a style="width: 18px; z-index: 3;" class="text-decoration-none" href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "24px", true)}</a>
173
- {{{ end }}}
174
- </div>
175
- </div>
176
- </li>
177
- {{{ end }}}
178
- </ul>
179
- <!-- ELSE -->
180
- <div class="alert alert-success">[[user:info.no-flags]]</div>
181
- <!-- ENDIF history.flags.length -->
182
- </div>
183
- </div>
184
-
185
- <div class="card mb-3">
186
- <h5 class="card-header">
187
- [[user:info.ban-history]]
188
-
189
- <!-- IF !banned -->
190
- <!-- IF !isSelf -->
191
- <button class="btn btn-sm float-end btn-danger" component="account/ban">[[user:ban-account]]</button>
192
- <!-- ENDIF !isSelf -->
193
- <!-- ELSE -->
194
- <!-- IF !isSelf -->
195
- <button class="btn btn-sm float-end btn-success" component="account/unban">[[user:unban-account]]</button>
196
- <!-- ENDIF !isSelf -->
197
- <!-- ENDIF !banned -->
198
- </h5>
199
- <div class="card-body">
200
- <!-- IF history.bans.length -->
201
- <ul class="ban-history list-unstyled">
202
- {{{ each history.bans }}}
203
- <li class="mb-4 border-bottom">
204
- <div class="mb-1 d-flex align-items-center justify-content-between">
205
- <div>
206
- <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
207
- <strong>
208
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
209
- </strong>
210
- <span class="timestamp timeago" title="{./timestampISO}"></span>
211
- </div>
212
- {{{ if (./type != "unban") }}}
213
- <span class="badge text-bg-danger">[[user:banned]]</span>
214
- {{{ else }}}
215
- <span class="badge text-bg-success">[[user:unbanned]]</span>
216
- {{{ end }}}
217
- </div>
218
- <p class="mb-1">
219
- <span class="reason">[[user:info.banned-reason-label]]: <strong>{./reason}</strong></span>
220
- </p>
221
- <p class="">
222
- {{{ if ./until }}}
223
- <span class="expiry">[[user:info.banned-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
224
- {{{ else }}}
225
- {{{ if (./type != "unban") }}}
226
- <span class="expiry">[[user:info.banned-permanently]]</span>
227
- {{{ end }}}
228
- {{{ end }}}
229
- </p>
230
- </li>
231
- {{{ end }}}
232
- </ul>
233
- <!-- ELSE -->
234
- <div class="alert alert-success">[[user:info.no-ban-history]]</div>
235
- <!-- ENDIF history.bans.length -->
236
- </div>
237
- </div>
238
-
239
- <div class="card mb-3">
240
- <h5 class="card-header">
241
- [[user:info.mute-history]]
242
-
243
- {{{ if !muted }}}
244
- {{{ if !isSelf }}}
245
- <button class="btn btn-sm float-end btn-danger" component="account/mute">[[user:mute-account]]</button>
246
- {{{ end }}}
247
- {{{ else }}}
248
- {{{ if !isSelf }}}
249
- <button class="btn btn-sm float-end btn-success" component="account/unmute">[[user:unmute-account]]</button>
250
- {{{ end }}}
251
- {{{ end }}}
252
- </h5>
253
- <div class="card-body">
254
- {{{ if history.mutes.length }}}
255
- <ul class="ban-history list-unstyled">
256
- {{{ each history.mutes }}}
257
- <li class="mb-4 border-bottom">
258
- <div class="mb-1 d-flex align-items-center justify-content-between">
259
- <div>
260
- <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
261
- <strong>
262
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
263
- </strong>
264
- <span class="timestamp timeago" title="{./timestampISO}"></span>
265
- </div>
266
- {{{ if (./type != "unmute") }}}
267
- <span class="badge text-bg-danger">[[user:muted]]</span>
268
- {{{ else }}}
269
- <span class="badge text-bg-success">[[user:unmuted]]</span>
270
- {{{ end }}}
271
- </div>
272
- <p class="mb-1">
273
- <span class="reason">[[user:info.banned-reason-label]]: <strong>{./reason}</strong></span>
274
- </p>
275
- <p class="">
276
- {{{ if ./until }}}
277
- <span class="expiry">[[user:info.muted-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
278
- {{{ end }}}
279
- </p>
280
- </li>
281
- {{{ end }}}
282
- </ul>
283
- {{{ else }}}
284
- <div class="alert alert-success">[[user:info.no-mute-history]]</div>
285
- {{{ end }}}
286
- </div>
287
- </div>
288
-
289
- </div>
290
- </div>
291
-
1
+ <!-- IMPORT partials/account/header.tpl -->
2
+
3
+ <!-- IF sessions.length -->
4
+ <div class="row mb-3">
5
+ <div class="col-12 col-md-12">
6
+ <h4>[[global:sessions]]</h4>
7
+ <ul class="list-group" component="user/sessions">
8
+ {{{each sessions}}}
9
+ <li class="list-group-item" data-uuid="{../uuid}">
10
+ <div class="float-end">
11
+ <!-- IF isSelfOrAdminOrGlobalModerator -->
12
+ <!-- IF !../current -->
13
+ <button class="btn btn-sm btn-outline-secondary" type="button" data-action="revokeSession">Revoke Session</button>
14
+ <!-- ENDIF !../current -->
15
+ <!-- ENDIF isSelfOrAdminOrGlobalModerator -->
16
+ {function.userAgentIcons}
17
+ <i class="fa fa-circle text-<!-- IF ../current -->success<!-- ELSE -->muted<!-- ENDIF ../current -->"></i>
18
+ </div>
19
+ {../browser} {../version} on {../platform}<br />
20
+ <small class="timeago text-muted" title="{../datetimeISO}"></small>
21
+ <ul>
22
+ <li><strong>[[global:ip-address]]</strong>: {../ip}</li>
23
+ </ul>
24
+ </li>
25
+ {{{end}}}
26
+ </ul>
27
+ </div>
28
+ </div>
29
+ <!-- ENDIF sessions.length -->
30
+
31
+ <div class="row">
32
+ <div class="col-sm-6">
33
+ <div class="card mb-3">
34
+ <h5 class="card-header">
35
+ [[global:recentips]]
36
+ </h5>
37
+ <div class="card-body">
38
+ <ul>
39
+ {{{each ips}}}
40
+ <li>{@value}</li>
41
+ {{{end}}}
42
+ </ul>
43
+ </div>
44
+ </div>
45
+
46
+ <div class="card mb-3">
47
+ <h5 class="card-header">
48
+ [[user:info.username-history]]
49
+ </h5>
50
+ <div class="card-body">
51
+ <ul class="list-unstyled mb-0">
52
+ {{{ each usernames }}}
53
+ <li class="d-flex justify-content-between mb-1">
54
+ <span class="text-sm">{./value}</span>
55
+
56
+ <div>
57
+ {{{ if ./byUid }}}
58
+ <a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
59
+ {buildAvatar(./byUser, "18px", true)}</a>
60
+ {{{ end }}}
61
+ <span class="timeago text-sm lh-1" title="{./timestampISO}"></span>
62
+ </div>
63
+ </li>
64
+ {{{ end }}}
65
+ </ul>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="card mb-3">
70
+ <h5 class="card-header">
71
+ [[user:info.email-history]]
72
+ </h5>
73
+ <div class="card-body">
74
+ <ul class="list-unstyled mb-0">
75
+ {{{ each emails }}}
76
+ <li class="d-flex justify-content-between mb-1">
77
+ <span class="text-sm">{./value}</span>
78
+ <div>
79
+ {{{ if ./byUid }}}
80
+ <a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
81
+ {buildAvatar(./byUser, "18px", true)}</a>
82
+ {{{ end }}}
83
+ <span class="timeago text-sm lh-1" title="{./timestampISO}"></span>
84
+ </div>
85
+ </li>
86
+ {{{ end }}}
87
+ </ul>
88
+ </div>
89
+ </div>
90
+ <!-- IF isAdminOrGlobalModerator -->
91
+ <div class="card">
92
+ <h5 class="card-header">
93
+ [[user:info.moderation-note]]
94
+ </h5>
95
+ <div class="card-body">
96
+ <textarea component="account/moderation-note" class="form-control"></textarea>
97
+ <br/>
98
+ <button class="btn btn-sm float-end btn-success" component="account/save-moderation-note">[[user:info.moderation-note.add]]</button>
99
+ <br/>
100
+ <div component="account/moderation-note/list">
101
+ {{{ each moderationNotes }}}
102
+ <hr/>
103
+
104
+ <div data-id="{./id}">
105
+ <div class="mb-1">
106
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{buildAvatar(./user, "24px", true)}</a>
107
+
108
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" class="fw-bold" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
109
+
110
+ <span class="timeago" title="{./timestampISO}"></span>
111
+ </div>
112
+
113
+ <div component="account/moderation-note/content-area" class="d-flex flex-column">
114
+ <div class="content">
115
+ {./note}
116
+ </div>
117
+ <button component="account/moderation-note/edit" class="btn btn-sm btn-link align-self-end">[[topic:edit]]</button>
118
+ </div>
119
+
120
+ <div component="account/moderation-note/edit-area" class="d-flex flex-column gap-2">
121
+ <textarea class="form-control w-100 overflow-hidden">{./rawNote}</textarea>
122
+ <div class="align-self-end">
123
+ <button component="account/moderation-note/cancel-edit" class="btn btn-sm btn-link text-danger align-self-end">[[global:cancel]]</button>
124
+ <button component="account/moderation-note/save-edit" class="btn btn-sm btn-primary align-self-end">[[global:save]]</button>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ {{{ end }}}
129
+ </div>
130
+ <!-- IMPORT partials/paginator.tpl -->
131
+ </div>
132
+ </div>
133
+ <!-- ENDIF isAdminOrGlobalModerator -->
134
+ </div>
135
+ <div class="col-sm-6">
136
+ <div class="card mb-3">
137
+ <h5 class="card-header">
138
+ [[user:info.latest-flags]]
139
+ </h5>
140
+ <div class="card-body">
141
+ <!-- IF history.flags.length -->
142
+ <ul class="recent-flags list-unstyled">
143
+ {{{ each history.flags }}}
144
+ <li class="mb-4 border-bottom">
145
+ <div class="mb-1 d-flex align-items-center justify-content-between">
146
+ <div>
147
+ {{{ if (./type == "user")}}}
148
+ <span class="badge text-bg-info">[[user:info.profile]]</span>
149
+ {{{ else }}}
150
+ <span class="badge text-bg-info">[[user:info.post]]</span>
151
+ {{{ end }}}
152
+ <span class="timestamp timeago" title="{./timestampISO}"></span>
153
+ </div>
154
+
155
+ <a href="{config.relative_path}/flags/{./flagId}" class="badge badge border border-gray-300 text-body">[[user:info.view-flag]]</a>
156
+ </div>
157
+
158
+ {{{ if (./type == "post") }}}
159
+ <p class="mb-1">
160
+ {{{ if history.flags.targetPurged }}}
161
+ <div>[[flags:target-purged]]</div>
162
+ {{{ else }}}
163
+ <a class="title" href="{config.relative_path}/post/{./pid}">{./title}</a>
164
+ {{{ end }}}
165
+ </p>
166
+ {{{ end }}}
167
+
168
+ <div class="d-flex gap-2 align-items-center mb-3">
169
+ <span class="text-sm">[[user:info.reported-by]]</span>
170
+ <div class="d-flex text-nowrap">
171
+ {{{ each ./reports }}}
172
+ <a style="width: 18px; z-index: 3;" class="text-decoration-none" href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "24px", true)}</a>
173
+ {{{ end }}}
174
+ </div>
175
+ </div>
176
+ </li>
177
+ {{{ end }}}
178
+ </ul>
179
+ <!-- ELSE -->
180
+ <div class="alert alert-success">[[user:info.no-flags]]</div>
181
+ <!-- ENDIF history.flags.length -->
182
+ </div>
183
+ </div>
184
+
185
+ <div class="card mb-3">
186
+ <h5 class="card-header">
187
+ [[user:info.ban-history]]
188
+
189
+ <!-- IF !banned -->
190
+ <!-- IF !isSelf -->
191
+ <button class="btn btn-sm float-end btn-danger" component="account/ban">[[user:ban-account]]</button>
192
+ <!-- ENDIF !isSelf -->
193
+ <!-- ELSE -->
194
+ <!-- IF !isSelf -->
195
+ <button class="btn btn-sm float-end btn-success" component="account/unban">[[user:unban-account]]</button>
196
+ <!-- ENDIF !isSelf -->
197
+ <!-- ENDIF !banned -->
198
+ </h5>
199
+ <div class="card-body">
200
+ <!-- IF history.bans.length -->
201
+ <ul class="ban-history list-unstyled">
202
+ {{{ each history.bans }}}
203
+ <li class="mb-4 border-bottom">
204
+ <div class="mb-1 d-flex align-items-center justify-content-between">
205
+ <div>
206
+ <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
207
+ <strong>
208
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
209
+ </strong>
210
+ <span class="timestamp timeago" title="{./timestampISO}"></span>
211
+ </div>
212
+ {{{ if (./type != "unban") }}}
213
+ <span class="badge text-bg-danger">[[user:banned]]</span>
214
+ {{{ else }}}
215
+ <span class="badge text-bg-success">[[user:unbanned]]</span>
216
+ {{{ end }}}
217
+ </div>
218
+ <p class="mb-1">
219
+ <span class="reason">[[user:info.banned-reason-label]]: <strong>{./reason}</strong></span>
220
+ </p>
221
+ <p class="">
222
+ {{{ if ./until }}}
223
+ <span class="expiry">[[user:info.banned-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
224
+ {{{ else }}}
225
+ {{{ if (./type != "unban") }}}
226
+ <span class="expiry">[[user:info.banned-permanently]]</span>
227
+ {{{ end }}}
228
+ {{{ end }}}
229
+ </p>
230
+ </li>
231
+ {{{ end }}}
232
+ </ul>
233
+ <!-- ELSE -->
234
+ <div class="alert alert-success">[[user:info.no-ban-history]]</div>
235
+ <!-- ENDIF history.bans.length -->
236
+ </div>
237
+ </div>
238
+
239
+ <div class="card mb-3">
240
+ <h5 class="card-header">
241
+ [[user:info.mute-history]]
242
+
243
+ {{{ if !muted }}}
244
+ {{{ if !isSelf }}}
245
+ <button class="btn btn-sm float-end btn-danger" component="account/mute">[[user:mute-account]]</button>
246
+ {{{ end }}}
247
+ {{{ else }}}
248
+ {{{ if !isSelf }}}
249
+ <button class="btn btn-sm float-end btn-success" component="account/unmute">[[user:unmute-account]]</button>
250
+ {{{ end }}}
251
+ {{{ end }}}
252
+ </h5>
253
+ <div class="card-body">
254
+ {{{ if history.mutes.length }}}
255
+ <ul class="ban-history list-unstyled">
256
+ {{{ each history.mutes }}}
257
+ <li class="mb-4 border-bottom">
258
+ <div class="mb-1 d-flex align-items-center justify-content-between">
259
+ <div>
260
+ <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
261
+ <strong>
262
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
263
+ </strong>
264
+ <span class="timestamp timeago" title="{./timestampISO}"></span>
265
+ </div>
266
+ {{{ if (./type != "unmute") }}}
267
+ <span class="badge text-bg-danger">[[user:muted]]</span>
268
+ {{{ else }}}
269
+ <span class="badge text-bg-success">[[user:unmuted]]</span>
270
+ {{{ end }}}
271
+ </div>
272
+ <p class="mb-1">
273
+ <span class="reason">[[user:info.banned-reason-label]]: <strong>{./reason}</strong></span>
274
+ </p>
275
+ <p class="">
276
+ {{{ if ./until }}}
277
+ <span class="expiry">[[user:info.muted-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
278
+ {{{ end }}}
279
+ </p>
280
+ </li>
281
+ {{{ end }}}
282
+ </ul>
283
+ {{{ else }}}
284
+ <div class="alert alert-success">[[user:info.no-mute-history]]</div>
285
+ {{{ end }}}
286
+ </div>
287
+ </div>
288
+
289
+ </div>
290
+ </div>
291
+
292
292
  <!-- IMPORT partials/account/footer.tpl -->
@@ -1,19 +1,19 @@
1
- <!-- IMPORT partials/account/header.tpl -->
2
-
3
- <div class="row">
4
- <h1 class="fs-2">{title}</h1>
5
-
6
- <!-- IF !posts.length -->
7
- <div class="alert alert-warning text-center">{noItemsFoundKey}</div>
8
- <!-- ENDIF !posts.length -->
9
-
10
- <div class="col-12">
11
- <!-- IMPORT partials/posts_list.tpl -->
12
-
13
- <!-- IF config.usePagination -->
14
- <!-- IMPORT partials/paginator.tpl -->
15
- <!-- ENDIF config.usePagination -->
16
- </div>
17
- </div>
18
-
1
+ <!-- IMPORT partials/account/header.tpl -->
2
+
3
+ <div class="row">
4
+ <h1 class="fs-2">{title}</h1>
5
+
6
+ <!-- IF !posts.length -->
7
+ <div class="alert alert-warning text-center">{noItemsFoundKey}</div>
8
+ <!-- ENDIF !posts.length -->
9
+
10
+ <div class="col-12">
11
+ <!-- IMPORT partials/posts_list.tpl -->
12
+
13
+ <!-- IF config.usePagination -->
14
+ <!-- IMPORT partials/paginator.tpl -->
15
+ <!-- ENDIF config.usePagination -->
16
+ </div>
17
+ </div>
18
+
19
19
  <!-- IMPORT partials/account/footer.tpl -->