nodebb-theme-harmony 1.0.0 → 1.0.1

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 (155) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +6 -1
  3. package/library.js +56 -25
  4. package/package.json +1 -1
  5. package/plugin.json +0 -1
  6. package/public/harmony.js +165 -41
  7. package/public/settings.js +1 -0
  8. package/screenshots/categories.png +0 -0
  9. package/screenshots/recent.png +0 -0
  10. package/screenshots/topic.png +0 -0
  11. package/scss/account.scss +1 -1
  12. package/scss/chats.scss +81 -26
  13. package/scss/common.scss +84 -10
  14. package/scss/flags.scss +5 -0
  15. package/scss/groups.scss +2 -2
  16. package/scss/harmony.scss +3 -0
  17. package/scss/mixins.scss +7 -3
  18. package/scss/modals.scss +5 -3
  19. package/scss/modules/bottom-sheet.scss +1 -1
  20. package/scss/modules/composer.scss +0 -4
  21. package/scss/modules/cover.scss +1 -11
  22. package/scss/modules/filters.scss +8 -0
  23. package/scss/modules/paginator.scss +24 -0
  24. package/scss/modules/tags.scss +2 -2
  25. package/scss/modules/topic-navigator.scss +18 -42
  26. package/scss/modules/topics-list.scss +32 -17
  27. package/scss/modules/user-menu.scss +6 -0
  28. package/scss/overrides.scss +4 -1
  29. package/scss/sidebar.scss +61 -8
  30. package/scss/topic.scss +36 -13
  31. package/templates/account/blocks.tpl +35 -40
  32. package/templates/account/categories.tpl +47 -29
  33. package/templates/account/consent.tpl +66 -10
  34. package/templates/account/edit/password.tpl +25 -30
  35. package/templates/account/edit/username.tpl +21 -26
  36. package/templates/account/edit.tpl +105 -116
  37. package/templates/account/followers.tpl +12 -19
  38. package/templates/account/following.tpl +12 -18
  39. package/templates/account/groups.tpl +12 -17
  40. package/templates/account/info.tpl +178 -206
  41. package/templates/account/posts.tpl +31 -36
  42. package/templates/account/profile.tpl +82 -72
  43. package/templates/account/sessions.tpl +8 -30
  44. package/templates/account/settings.tpl +222 -203
  45. package/templates/account/theme.tpl +39 -25
  46. package/templates/account/topics.tpl +36 -38
  47. package/templates/account/uploads.tpl +33 -40
  48. package/templates/admin/plugins/harmony.tpl +21 -3
  49. package/templates/categories.tpl +3 -6
  50. package/templates/category.tpl +13 -14
  51. package/templates/chats.tpl +9 -10
  52. package/templates/flags/detail.tpl +160 -193
  53. package/templates/flags/list.tpl +3 -70
  54. package/templates/footer.tpl +2 -2
  55. package/templates/groups/details.tpl +22 -19
  56. package/templates/groups/list.tpl +1 -1
  57. package/templates/groups/members.tpl +0 -2
  58. package/templates/header.tpl +2 -2
  59. package/templates/login.tpl +4 -4
  60. package/templates/notifications.tpl +5 -5
  61. package/templates/partials/account/admin-menu.tpl +9 -9
  62. package/templates/partials/account/category-item.tpl +14 -17
  63. package/templates/partials/account/footer.tpl +3 -0
  64. package/templates/partials/account/header.tpl +78 -81
  65. package/templates/partials/account/session-list.tpl +18 -0
  66. package/templates/partials/account/sidebar-left.tpl +31 -25
  67. package/templates/partials/breadcrumbs.tpl +6 -6
  68. package/templates/partials/buttons/newTopic.tpl +1 -1
  69. package/templates/partials/categories/item.tpl +31 -27
  70. package/templates/partials/categories/lastpost.tpl +7 -7
  71. package/templates/partials/category/filter-dropdown-content.tpl +37 -0
  72. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +7 -7
  73. package/templates/partials/category/sort.tpl +22 -7
  74. package/templates/partials/category/subcategory.tpl +2 -3
  75. package/templates/partials/category/tags.tpl +0 -2
  76. package/templates/partials/category/tools.tpl +28 -25
  77. package/templates/partials/category/watch.tpl +39 -6
  78. package/templates/partials/chats/dropdown.tpl +4 -1
  79. package/templates/partials/chats/message-window.tpl +12 -8
  80. package/templates/partials/chats/message.tpl +8 -10
  81. package/templates/partials/chats/options.tpl +14 -6
  82. package/templates/partials/chats/recent_room.tpl +41 -32
  83. package/templates/partials/cookie-consent.tpl +5 -5
  84. package/templates/partials/flags/bulk-actions.tpl +9 -0
  85. package/templates/partials/flags/filters.tpl +165 -78
  86. package/templates/partials/flags/results.tpl +38 -0
  87. package/templates/partials/groups/admin.tpl +4 -4
  88. package/templates/partials/groups/badge.tpl +1 -1
  89. package/templates/partials/groups/invited.tpl +1 -1
  90. package/templates/partials/groups/list.tpl +2 -2
  91. package/templates/partials/groups/memberlist.tpl +2 -2
  92. package/templates/partials/groups/sidebar-left.tpl +10 -10
  93. package/templates/partials/header/brand.tpl +9 -2
  94. package/templates/partials/mobile-footer.tpl +69 -61
  95. package/templates/partials/notifications_list.tpl +11 -8
  96. package/templates/partials/paginator.tpl +11 -9
  97. package/templates/partials/post_bar.tpl +26 -24
  98. package/templates/partials/posts_list_item.tpl +5 -5
  99. package/templates/partials/quick-search-results.tpl +3 -3
  100. package/templates/partials/search-filters.tpl +184 -0
  101. package/templates/partials/search-results.tpl +28 -35
  102. package/templates/partials/sidebar/chats.tpl +26 -34
  103. package/templates/partials/sidebar/drafts.tpl +45 -34
  104. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  105. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  106. package/templates/partials/sidebar/notifications.tpl +30 -9
  107. package/templates/partials/sidebar/search-mobile.tpl +1 -1
  108. package/templates/partials/sidebar/search.tpl +1 -1
  109. package/templates/partials/sidebar/user-menu.tpl +38 -29
  110. package/templates/partials/sidebar-left.tpl +14 -11
  111. package/templates/partials/sidebar-right.tpl +1 -3
  112. package/templates/partials/skin-switcher.tpl +3 -3
  113. package/templates/partials/tags/filter-dropdown-content.tpl +34 -0
  114. package/templates/partials/tags_list.tpl +4 -4
  115. package/templates/partials/topic/browsing-users.tpl +0 -2
  116. package/templates/partials/topic/event.tpl +1 -1
  117. package/templates/partials/topic/navigation-post.tpl +5 -9
  118. package/templates/partials/topic/navigator-mobile.tpl +62 -0
  119. package/templates/partials/topic/navigator.tpl +23 -17
  120. package/templates/partials/topic/post-editor.tpl +0 -2
  121. package/templates/partials/topic/post-menu-list.tpl +60 -62
  122. package/templates/partials/topic/post-menu.tpl +16 -11
  123. package/templates/partials/topic/post.tpl +45 -27
  124. package/templates/partials/topic/quickreply.tpl +8 -8
  125. package/templates/partials/topic/reply-button.tpl +7 -7
  126. package/templates/partials/topic/sort.tpl +17 -5
  127. package/templates/partials/topic/tools.tpl +2 -2
  128. package/templates/partials/topic/topic-menu-list.tpl +22 -24
  129. package/templates/partials/topic/watch.tpl +42 -9
  130. package/templates/partials/topic-filters.tpl +6 -3
  131. package/templates/partials/topic-list-bar.tpl +50 -46
  132. package/templates/partials/topic-terms.tpl +6 -3
  133. package/templates/partials/topics_list.tpl +88 -93
  134. package/templates/partials/userFilter-placeholders.tpl +5 -0
  135. package/templates/partials/users/filter-dropdown-content.tpl +23 -0
  136. package/templates/partials/users/item.tpl +25 -27
  137. package/templates/partials/users_list.tpl +1 -1
  138. package/templates/popular.tpl +3 -1
  139. package/templates/post-queue.tpl +166 -0
  140. package/templates/recent.tpl +3 -2
  141. package/templates/register.tpl +4 -4
  142. package/templates/search.tpl +39 -177
  143. package/templates/tags.tpl +3 -3
  144. package/templates/top.tpl +3 -1
  145. package/templates/topic.tpl +74 -68
  146. package/templates/unread.tpl +3 -1
  147. package/templates/users.tpl +7 -3
  148. package/templates/modules/usercard.tpl +0 -39
  149. package/templates/partials/acceptTos.tpl +0 -11
  150. package/templates/partials/category-filter-content.tpl +0 -30
  151. package/templates/partials/category-filter-right.tpl +0 -5
  152. package/templates/partials/category-filter.tpl +0 -3
  153. package/templates/partials/category-selector-right.tpl +0 -5
  154. package/templates/partials/category-selector.tpl +0 -3
  155. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,45 +1,40 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
3
- <div class="d-flex flex-column flex-md-row">
4
- <!-- IMPORT partials/account/sidebar-left.tpl -->
5
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
6
- <div class="d-flex justify-content-between mb-3">
7
- <h3 class="fw-semibold fs-5">[[pages:account/blocks, {username}]]</h3>
8
- <div class="justify-content-end">
9
- <div class="dropdown">
10
- <div class="input-group">
11
- <input class="form-control form-control-sm" type="text" id="user-search" placeholder="[[users:enter_username]]" data-bs-toggle="dropdown" autocomplete="off"/>
12
- <button class="btn btn-primary btn-sm" type="button">
13
- <i class="fa fa-search"></i>
14
- </button>
15
- </div>
1
+ <!-- IMPORT partials/account/header.tpl -->
2
+ <div class="d-flex justify-content-between mb-3">
3
+ <h3 class="fw-semibold fs-5">[[pages:account/blocks, {username}]]</h3>
4
+ <div class="justify-content-end">
5
+ <div class="dropdown">
6
+ <div class="input-group">
7
+ <input class="form-control form-control-sm" type="text" id="user-search" placeholder="[[users:enter_username]]" data-bs-toggle="dropdown" autocomplete="off"/>
16
8
 
17
- <ul component="blocks/search/list" class="dropdown-menu dropdown-menu-end block-edit overflow-auto" style="max-height:300px;">
18
- <li><a href="#" class="dropdown-item">[[admin/menu:search.start-typing]]</a></li>
19
- {{{ each edit }}}
20
- <li class="">
21
- <div class="dropdown-item d-flex flex-nowrap gap-2 justify-content-between">
22
- <div class="text-truncate">
23
- <a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{buildAvatar(edit, "24px", true)} {./username}</a>
24
- </div>
25
- <button class="btn btn-sm btn-primary text-nowrap" data-uid="{./uid}" data-action="toggle">[[user:block_toggle]]</button>
26
- </div>
27
- </li>
28
- {{{ end }}}
29
- </ul>
30
- </div>
31
- </div>
32
- </div>
33
- <div class="users">
34
- <div id="users-container" class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-2">
35
- {{{ each users }}}
36
- <!-- IMPORT partials/users/item.tpl -->
9
+ <ul component="blocks/search/list" class="dropdown-menu dropdown-menu-end p-1 text-sm block-edit overflow-auto" style="max-height:300px;">
10
+ <li><a href="#" class="dropdown-item">[[admin/menu:search.start-typing]]</a></li>
11
+ {{{ each edit }}}
12
+ <li class="">
13
+ <div class="dropdown-item d-flex flex-nowrap gap-2 justify-content-between">
14
+ <div class="text-truncate">
15
+ <a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{buildAvatar(edit, "24px", true)} {./username}</a>
16
+ </div>
17
+ <button class="btn btn-sm btn-primary text-nowrap" data-uid="{./uid}" data-action="toggle">[[user:block_toggle]]</button>
18
+ </div>
19
+ </li>
37
20
  {{{ end }}}
38
- </div>
39
- <div class="alert alert-warning text-center"{{{ if users.length }}} style="display: none;"{{{ end }}}>[[user:has_no_blocks]]</div>
40
- <!-- IMPORT partials/paginator.tpl -->
21
+ </ul>
22
+
23
+ <button class="btn btn-primary btn-sm" type="button">
24
+ <i class="fa fa-search"></i>
25
+ </button>
41
26
  </div>
42
27
  </div>
43
-
44
28
  </div>
45
- </div>
29
+ </div>
30
+ <div class="users">
31
+ <div id="users-container" class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-2">
32
+ {{{ each users }}}
33
+ <!-- IMPORT partials/users/item.tpl -->
34
+ {{{ end }}}
35
+ </div>
36
+ <div class="alert alert-warning text-center"{{{ if users.length }}} style="display: none;"{{{ end }}}>[[user:has_no_blocks]]</div>
37
+ <!-- IMPORT partials/paginator.tpl -->
38
+ </div>
39
+
40
+ <!-- IMPORT partials/account/footer.tpl -->
@@ -1,34 +1,52 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
1
+ <!-- IMPORT partials/account/header.tpl -->
3
2
 
4
- <div class="d-flex flex-column flex-md-row">
5
- <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
- <h3 class="fw-semibold fs-5">{title}</h3>
3
+ <div class="d-flex justify-content-between align-items-center mb-3">
4
+ <div class="d-flex gap-1">
5
+ <h3 class="fw-semibold fs-5 mb-0">{title}</h3>
6
+ </div>
8
7
 
9
- <div class="row">
10
- <div class="col-lg-12 mb-2">
11
- <div class="btn-group bottom-sheet" component="category/watch/all">
12
- <button class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
13
- <span>[[user:change_all]]</span>
14
- <span class="caret"></span>
15
- </button>
16
- <ul class="dropdown-menu">
17
- <li><a class="dropdown-item" href="#" component="category/watching" data-state="watching"><i class="fa fa-fw fa-inbox"></i> [[category:watching]]<p class="help-text"><small>[[category:watching.description]]</small></p></a></li>
18
- <li><a class="dropdown-item" href="#" component="category/notwatching" data-state="notwatching"><i class="fa fa-fw fa-clock-o"></i> [[category:not-watching]]<p class="help-text"><small>[[category:not-watching.description]]</small></p></a></li>
19
- <li><a class="dropdown-item" href="#" component="category/ignoring" data-state="ignoring"><i class="fa fa-fw fa-eye-slash"></i> [[category:ignoring]]<p class="help-text"><small>[[category:ignoring.description]]</small></p></a></li>
20
- </ul>
21
- </div>
22
- </div>
23
- <div class="col-lg-12">
24
- <ul class="categories list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
25
- {{{each categories}}}
26
- <!-- IMPORT partials/account/category-item.tpl -->
27
- {{{end}}}
28
- </ul>
29
- <!-- IMPORT partials/paginator.tpl -->
30
- </div>
31
- </div>
8
+ <div class="d-flex gap-1">
9
+ <div class="btn-group bottom-sheet" component="category/watch/all">
10
+ <button class="btn-ghost-sm fw-semibold dropdown-toggle" data-bs-toggle="dropdown" type="button">
11
+ <span>[[user:change_all]]</span>
12
+ </button>
13
+ <ul class="dropdown-menu p-1 text-sm dropdown-menu-end">
14
+ <li><a class="dropdown-item rounded-1 d-flex flex-column p-2" href="#" component="category/watching" data-state="watching">
15
+ <div class="d-flex align-items-center gap-2">
16
+ <i class="flex-shrink-0 fa fa-fw fa-inbox"></i>
17
+ <span class="flex-grow-1 fw-semibold">[[category:watching]]</span>
18
+ </div>
19
+ <div class="help-text text-muted text-xs">[[category:watching.description]]</div>
20
+ </a>
21
+ </li>
22
+ <li><a class="dropdown-item rounded-1 d-flex flex-column p-2" href="#" component="category/notwatching" data-state="notwatching">
23
+ <div class="d-flex align-items-center gap-2">
24
+ <i class="flex-shrink-0 fa fa-fw fa-clock-o"></i>
25
+ <span class="flex-grow-1 fw-semibold">[[category:not-watching]]</span>
26
+ </div>
27
+ <div class="help-text text-muted text-xs">[[category:not-watching.description]]</div>
28
+ </a>
29
+ </li>
30
+ <li><a class="dropdown-item rounded-1 d-flex flex-column p-2" href="#" component="category/ignoring" data-state="ignoring">
31
+ <div class="d-flex align-items-center gap-2">
32
+ <i class="flex-shrink-0 fa fa-fw fa-eye-slash"></i>
33
+ <span class="flex-grow-1 fw-semibold">[[category:ignoring]]</span>
34
+ </div>
35
+ <div class="help-text text-muted text-xs">[[category:ignoring.description]]</div>
36
+ </a>
37
+ </li>
38
+ </ul>
32
39
  </div>
33
40
  </div>
34
41
  </div>
42
+
43
+ <div>
44
+ <ul class="categories list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
45
+ {{{each categories}}}
46
+ <!-- IMPORT partials/account/category-item.tpl -->
47
+ {{{end}}}
48
+ </ul>
49
+ <!-- IMPORT partials/paginator.tpl -->
50
+ </div>
51
+
52
+ <!-- IMPORT partials/account/footer.tpl -->
@@ -1,17 +1,73 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
1
+ <!-- IMPORT partials/account/header.tpl -->
2
+ <h3 class="fw-semibold fs-5">[[user:consent.title]]</h3>
3
3
 
4
- <div class="d-flex flex-column flex-md-row">
5
- <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
- <h3 class="fw-semibold fs-5">[[user:consent.title]]</h3>
4
+ <p class="lead">[[user:consent.lead]]</p>
5
+ <p>[[user:consent.intro]]</p>
8
6
 
9
- <p class="lead">[[user:consent.lead]]</p>
10
- <p>[[user:consent.intro]]</p>
7
+ <hr />
11
8
 
12
- <hr />
9
+ <div class="row">
10
+ <div class="col-sm-6">
11
+ {{{ if gdpr_consent }}}
12
+ <div class="alert alert-success">
13
+ <i class="fa fa-check float-end fa-3x"></i>
14
+ [[user:consent.received]]
15
+ </div>
16
+ {{{ else }}}
17
+ <div class="alert alert-warning">
18
+ [[user:consent.not_received]]
19
+ <br /><br />
20
+ <div class="text-center">
21
+ <button class="btn btn-warning" data-action="consent">[[user:consent.give]]</button>
22
+ </div>
23
+ </div>
24
+ {{{ end }}}
25
+ <div class="card">
26
+ <div class="card-body">
27
+ <p>[[user:consent.email_intro]]</p>
28
+ {{{ if digest.enabled }}}
29
+ <p>[[user:consent.digest_frequency, {digest.frequency}]]</p>
30
+ {{{ else }}}
31
+ <p>[[user:consent.digest_off]]</p>
32
+ {{{ end }}}
13
33
 
14
- <div class="row">
34
+ <div class="d-grid">
35
+ <a class="btn btn-outline-secondary" href="./settings">
36
+ <i class="fa fa-cog"></i>
37
+ [[pages:account/settings]]
38
+ </a>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ <div class="col-sm-6">
44
+ <div class="card">
45
+ <div class="card-body">
46
+ <p><strong>[[user:consent.right_of_access]]</strong></p>
47
+ <p>[[user:consent.right_of_access_description]]</p>
48
+ <p><strong>[[user:consent.right_to_rectification]]</strong></p>
49
+ <p>[[user:consent.right_to_rectification_description]]</p>
50
+ <p><strong>[[user:consent.right_to_erasure]]</strong></p>
51
+ <p>[[user:consent.right_to_erasure_description]]</p>
52
+ <p><strong>[[user:consent.right_to_data_portability]]</strong></p>
53
+ <p>[[user:consent.right_to_data_portability_description]]</p>
54
+
55
+ <hr />
56
+
57
+ <div class="btn-group-vertical d-grid">
58
+ <a data-action="export-profile" class="btn btn-outline-secondary">
59
+ <i class="fa fa-download"></i> [[user:consent.export_profile]]
60
+ </a>
61
+ <a data-action="export-posts" class="btn btn-outline-secondary">
62
+ <i class="fa fa-download"></i> [[user:consent.export_posts]]
63
+ </a>
64
+ <a data-action="export-uploads" class="btn btn-outline-secondary">
65
+ <i class="fa fa-download"></i> [[user:consent.export_uploads]]
66
+ </a>
67
+ </div>
68
+ </div>
15
69
  </div>
16
70
  </div>
17
71
  </div>
72
+
73
+ <!-- IMPORT partials/account/footer.tpl -->
@@ -1,37 +1,32 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
1
+ <!-- IMPORT partials/account/header.tpl -->
3
2
 
4
- <div class="d-flex flex-column flex-md-row">
5
- <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
- <h3 class="fw-semibold fs-5">{{{ if isSelf }}}[[user:change_password]]{{{ else }}}[[pages:{template.name}, {username}]]{{{ end }}}</h3>
3
+ <h3 class="fw-semibold fs-5">{{{ if isSelf }}}[[user:change_password]]{{{ else }}}[[pages:{template.name}, {username}]]{{{ end }}}</h3>
8
4
 
9
- <form class="edit-form">
10
- <!-- disables autocomplete on FF --><input type="password" style="display:none">
5
+ <form class="edit-form">
6
+ <!-- disables autocomplete on FF --><input type="password" style="display:none">
11
7
 
12
- {{{ if isSelf }}}
13
- <div class="mb-2">
14
- <label class="form-label fw-semibold text-xm" for="inputCurrentPassword">[[user:current_password]]</label>
15
- <input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value=""<!-- IF !hasPassword --> disabled<!-- ENDIF !hasPassword -->>
16
- </div>
17
- {{{ end }}}
8
+ {{{ if isSelf }}}
9
+ <div class="mb-2">
10
+ <label class="form-label fw-semibold text-xm" for="inputCurrentPassword">[[user:current_password]]</label>
11
+ <input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value="" {{{ if !hasPassword }}} disabled{{{ end }}}>
12
+ </div>
13
+ {{{ end }}}
18
14
 
19
- <div class="mb-2">
20
- <label class="form-label fw-semibold text-xm" for="inputNewPassword">[[user:new_password]]</label>
21
- <input class="form-control" type="password" id="inputNewPassword" placeholder="[[user:password]]" value="">
22
- <span class="form-feedback" id="password-notify"></span>
23
- </div>
15
+ <div class="mb-2">
16
+ <label class="form-label fw-semibold text-xm" for="inputNewPassword">[[user:new_password]]</label>
17
+ <input class="form-control" type="password" id="inputNewPassword" placeholder="[[user:password]]" value="">
18
+ <span class="form-feedback" id="password-notify"></span>
19
+ </div>
24
20
 
25
- <div class="mb-2">
26
- <label class="form-label fw-semibold text-xm" for="inputNewPasswordAgain">[[user:confirm_password]]</label>
27
- <input class="form-control" type="password" id="inputNewPasswordAgain" placeholder="[[user:confirm_password]]" value="">
28
- <span class="form-feedback" id="password-confirm-notify"></span>
29
- </div>
21
+ <div class="mb-2">
22
+ <label class="form-label fw-semibold text-xm" for="inputNewPasswordAgain">[[user:confirm_password]]</label>
23
+ <input class="form-control" type="password" id="inputNewPasswordAgain" placeholder="[[user:confirm_password]]" value="">
24
+ <span class="form-feedback" id="password-confirm-notify"></span>
25
+ </div>
30
26
 
31
- <div class="form-actions">
32
- <button id="changePasswordBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_password]]</button>
33
- </div>
34
- </form>
35
- </div>
27
+ <div class="form-actions">
28
+ <button id="changePasswordBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_password]]</button>
36
29
  </div>
37
- </div>
30
+ </form>
31
+
32
+ <!-- IMPORT partials/account/footer.tpl -->
@@ -1,33 +1,28 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
1
+ <!-- IMPORT partials/account/header.tpl -->
3
2
 
4
- <div class="d-flex flex-column flex-md-row">
5
- <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
- <h3 class="fw-semibold fs-5">{{{ if isSelf }}}[[user:change_username]]{{{ else }}}[[pages:{template.name}, {username}]]{{{ end }}}</h3>
3
+ <h3 class="fw-semibold fs-5">{{{ if isSelf }}}[[user:change_username]]{{{ else }}}[[pages:{template.name}, {username}]]{{{ end }}}</h3>
8
4
 
9
- <form class="form-horizontal edit-form">
10
- <div class="mb-2">
11
- <label class="form-label fw-semibold text-sm" for="inputNewUsername">[[user:username]]</label>
12
- <input class="form-control" type="text" id="inputNewUsername" placeholder="[[user:username]]" value="{username}">
13
- </div>
5
+ <form class="form-horizontal edit-form">
6
+ <div class="mb-2">
7
+ <label class="form-label fw-semibold text-sm" for="inputNewUsername">[[user:username]]</label>
8
+ <input class="form-control" type="text" id="inputNewUsername" placeholder="[[user:username]]" value="{username}">
9
+ </div>
14
10
 
15
- <!-- disables autocomplete on FF --><input type="password" style="display:none">
11
+ <!-- disables autocomplete on FF --><input type="password" style="display:none">
16
12
 
17
- {{{ if isSelf }}}
18
- <div class="mb-2">
19
- <label class="form-label fw-semibold text-sm" for="inputCurrentPassword">[[user:current_password]]</label>
20
- <input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value=""{{{ if !hasPassword }}} disabled{{{ end }}}>
21
- </div>
22
- {{{ end }}}
13
+ {{{ if isSelf }}}
14
+ <div class="mb-2">
15
+ <label class="form-label fw-semibold text-sm" for="inputCurrentPassword">[[user:current_password]]</label>
16
+ <input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value=""{{{ if !hasPassword }}} disabled{{{ end }}}>
17
+ </div>
18
+ {{{ end }}}
23
19
 
24
- <input type="hidden" name="uid" id="inputUID" value="{uid}" />
20
+ <input type="hidden" name="uid" id="inputUID" value="{uid}" />
25
21
 
26
- <br/>
27
- <div class="form-actions">
28
- <button id="submitBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_username]]</button>
29
- </div>
30
- </form>
31
- </div>
22
+ <br/>
23
+ <div class="form-actions">
24
+ <button id="submitBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_username]]</button>
32
25
  </div>
33
- </div>
26
+ </form>
27
+
28
+ <!-- IMPORT partials/account/footer.tpl -->
@@ -1,132 +1,121 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
1
+ <!-- IMPORT partials/account/header.tpl -->
3
2
 
4
- <div class="d-flex flex-column flex-md-row">
5
- <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
- <div class="d-flex justify-content-between mb-3">
8
- <h3 class="fw-semibold fs-5">{{{ if isSelf }}}[[user:edit-profile]]{{{ else }}}[[pages:account/edit, {username}]]{{{ end }}}</h3>
9
- <button id="submitBtn" class="btn btn-primary">[[global:save_changes]]</button>
3
+ <div class="d-flex justify-content-between mb-3 align-items-center">
4
+ <h3 class="fw-semibold fs-5 mb-0">{{{ if isSelf }}}[[user:edit-profile]]{{{ else }}}[[pages:account/edit, {username}]]{{{ end }}}</h3>
5
+ <button id="submitBtn" class="btn btn-primary">[[global:save_changes]]</button>
6
+ </div>
7
+ <div class="row">
8
+ <div class="col-xl-6 col-12">
9
+ <form role="form" component="profile/edit/form">
10
+ <div class="mb-2">
11
+ <label class="form-label fw-bold" for="fullname">[[user:fullname]]</label>
12
+ <input class="form-control" type="text" id="fullname" name="fullname" placeholder="[[user:fullname]]" value="{fullname}">
10
13
  </div>
11
- <div class="row">
12
- <div class="col-xl-6 col-12">
13
- <form role="form" component="profile/edit/form">
14
- <div class="mb-2">
15
- <label class="form-label fw-bold" for="fullname">[[user:fullname]]</label>
16
- <input class="form-control" type="text" id="fullname" name="fullname" placeholder="[[user:fullname]]" value="{fullname}">
17
- </div>
18
- <!-- IF allowWebsite -->
19
- <div class="mb-2">
20
- <label class="form-label fw-bold" for="website">[[user:website]]</label>
21
- <input class="form-control" type="text" id="website" name="website" placeholder="http://..." value="{website}">
22
- </div>
23
- <!-- ENDIF allowWebsite -->
24
-
25
- <div class="mb-2">
26
- <label class="form-label fw-bold" for="location">[[user:location]]</label>
27
- <input class="form-control" type="text" id="location" name="location" placeholder="[[user:location]]" value="{location}">
28
- </div>
29
-
30
- <div class="mb-2">
31
- <label class="form-label fw-bold" for="birthday">[[user:birthday]]</label>
32
- <input class="form-control" type="date" id="birthday" name="birthday" value="{birthday}" placeholder="mm/dd/yyyy">
33
- </div>
14
+ {{{ if allowWebsite }}}
15
+ <div class="mb-2">
16
+ <label class="form-label fw-bold" for="website">[[user:website]]</label>
17
+ <input class="form-control" type="text" id="website" name="website" placeholder="http://..." value="{website}">
18
+ </div>
19
+ {{{ end }}}
34
20
 
35
- <div class="mb-2">
36
- <label class="form-label fw-bold" for="groupTitle">[[user:grouptitle]]</label>
21
+ <div class="mb-2">
22
+ <label class="form-label fw-bold" for="location">[[user:location]]</label>
23
+ <input class="form-control" type="text" id="location" name="location" placeholder="[[user:location]]" value="{location}">
24
+ </div>
37
25
 
38
- <select class="form-select mb-1" id="groupTitle" name="groupTitle" <!-- IF allowMultipleBadges --> size="{groupSelectSize}" multiple<!-- ENDIF allowMultipleBadges -->>
39
- <option value="">[[user:no-group-title]]</option>
40
- {{{each groups}}}
41
- <!-- IF groups.userTitleEnabled -->
42
- <option value="{groups.displayName}" <!-- IF groups.selected -->selected<!-- ENDIF groups.selected -->>{groups.userTitle}</option>
43
- <!-- ENDIF groups.userTitleEnabled -->
44
- {{{end}}}
45
- </select>
46
- <!-- IF allowMultipleBadges -->
47
- <div class="d-none d-md-block">
48
- <span class="form-text">[[user:group-order-help]]</span>
49
- <i role="button" component="group/order/up" class="fa fa-chevron-up"></i> <i role="button" component="group/order/down" class="fa fa-chevron-down"></i>
50
- </div>
51
- <!-- ENDIF -->
52
- </div>
26
+ <div class="mb-2">
27
+ <label class="form-label fw-bold" for="birthday">[[user:birthday]]</label>
28
+ <input class="form-control" type="date" id="birthday" name="birthday" value="{birthday}" placeholder="mm/dd/yyyy">
29
+ </div>
53
30
 
54
- <!-- IF allowAboutMe -->
55
- <div class="mb-2">
56
- <label class="form-label fw-bold" for="aboutme">[[user:aboutme]]</label> <small><label id="aboutMeCharCountLeft"></label></small>
57
- <textarea class="form-control" id="aboutme" name="aboutme" rows="5">{aboutme}</textarea>
58
- </div>
59
- <!-- ENDIF allowAboutMe -->
31
+ <div class="mb-2">
32
+ <label class="form-label fw-bold" for="groupTitle">[[user:grouptitle]]</label>
60
33
 
61
- <!-- IF allowSignature -->
62
- <!-- IF !disableSignatures -->
63
- <div class="mb-2">
64
- <label class="form-label fw-bold" for="signature">[[user:signature]]</label> <small><label id="signatureCharCountLeft"></label></small>
65
- <textarea class="form-control" id="signature" name="signature" rows="5">{signature}</textarea>
66
- </div>
67
- <!-- ENDIF !disableSignatures -->
68
- <!-- ENDIF allowSignature -->
69
- </form>
70
- <hr class="visible-xs visible-sm"/>
34
+ <select class="form-select mb-1" id="groupTitle" name="groupTitle" {{{ if allowMultipleBadges }}} size="{groupSelectSize}" multiple{{{ end }}}>
35
+ <option value="">[[user:no-group-title]]</option>
36
+ {{{ each groups }}}
37
+ {{{ if ./userTitleEnabled }}}
38
+ <option value="{groups.displayName}" {{{ if ./selected }}}selected{{{ end }}}>{./userTitle}</option>
39
+ {{{ end }}}
40
+ {{{ end }}}
41
+ </select>
42
+ {{{ if allowMultipleBadges }}}
43
+ <div class="d-none d-md-block">
44
+ <span class="form-text">[[user:group-order-help]]</span>
45
+ <i role="button" component="group/order/up" class="fa fa-chevron-up"></i> <i role="button" component="group/order/down" class="fa fa-chevron-down"></i>
71
46
  </div>
47
+ {{{ end }}}
48
+ </div>
49
+
50
+ {{{ if allowAboutMe }}}
51
+ <div class="mb-2">
52
+ <label class="form-label fw-bold" for="aboutme">[[user:aboutme]]</label> <small><label id="aboutMeCharCountLeft"></label></small>
53
+ <textarea class="form-control" id="aboutme" name="aboutme" rows="5">{aboutme}</textarea>
54
+ </div>
55
+ {{{ end }}}
72
56
 
73
- <div class="col-xl-6 col-12">
74
- <div class="text-center">
75
- <ul class="list-group mb-3 text-sm text-nowrap">
76
- <!-- IF allowProfilePicture -->
77
- <a id="changePictureBtn" href="#" class="list-group-item px-1 text-decoration-none">[[user:change_picture]]</a>
78
- <!-- ENDIF allowProfilePicture -->
79
- <!-- IF !username:disableEdit -->
80
- <a href="{config.relative_path}/user/{userslug}/edit/username" class="list-group-item px-1 text-decoration-none">[[user:change_username]]</a>
81
- <!-- ENDIF !username:disableEdit -->
82
- <!-- IF !email:disableEdit -->
83
- <a href="{config.relative_path}/user/{userslug}/edit/email" class="list-group-item px-1 text-decoration-none">[[user:change_email]]</a>
84
- <!-- ENDIF !email:disableEdit -->
85
- <!-- IF canChangePassword -->
86
- <a href="{config.relative_path}/user/{userslug}/edit/password" class="list-group-item px-1 text-decoration-none">[[user:change_password]]</a>
87
- <!-- ENDIF canChangePassword -->
88
- {{{each editButtons}}}
89
- <a href="{config.relative_path}{editButtons.link}" class="list-group-item px-1 text-decoration-none">{editButtons.text}</a>
90
- {{{end}}}
91
- </ul>
57
+ {{{ if (allowSignature && !disableSignatures) }}}
58
+ <div class="mb-2">
59
+ <label class="form-label fw-bold" for="signature">[[user:signature]]</label> <small><label id="signatureCharCountLeft"></label></small>
60
+ <textarea class="form-control" id="signature" name="signature" rows="5">{signature}</textarea>
61
+ </div>
62
+ {{{ end }}}
63
+ </form>
64
+ <hr class="visible-xs visible-sm"/>
65
+ </div>
92
66
 
93
- <!-- IF config.requireEmailConfirmation -->
94
- <!-- IF email -->
95
- <!-- IF isSelf -->
96
- <a id="confirm-email" href="#" class="btn btn-warning <!-- IF email:confirmed -->hide<!-- ENDIF email:confirmed -->">[[user:confirm_email]]</a><br/><br/>
97
- <!-- ENDIF isSelf -->
98
- <!-- ENDIF email -->
99
- <!-- ENDIF config.requireEmailConfirmation -->
100
- </div>
67
+ <div class="col-xl-6 col-12">
68
+ <div class="text-center">
69
+ <ul class="list-group mb-3 text-sm text-nowrap">
70
+ {{{ if allowProfilePicture }}}
71
+ <a component="profile/change/picture" href="#" class="list-group-item px-1 text-decoration-none">[[user:change_picture]]</a>
72
+ {{{ end }}}
73
+ {{{ if !username:disableEdit }}}
74
+ <a href="{config.relative_path}/user/{userslug}/edit/username" class="list-group-item px-1 text-decoration-none">[[user:change_username]]</a>
75
+ {{{ end }}}
76
+ {{{ if !email:disableEdit }}}
77
+ <a href="{config.relative_path}/user/{userslug}/edit/email" class="list-group-item px-1 text-decoration-none">[[user:change_email]]</a>
78
+ {{{ end }}}
79
+ {{{ if canChangePassword }}}
80
+ <a href="{config.relative_path}/user/{userslug}/edit/password" class="list-group-item px-1 text-decoration-none">[[user:change_password]]</a>
81
+ {{{ end }}}
82
+ {{{ each editButtons }}}
83
+ <a href="{config.relative_path}{./link}" class="list-group-item px-1 text-decoration-none">{./text}</a>
84
+ {{{ end }}}
85
+ </ul>
101
86
 
102
- {{{ if sso.length }}}
103
- <label class="form-label text-sm fw-semibold">[[user:sso.title]]</label>
104
- <div class="list-group">
105
- {{{each sso}}}
106
- <div class="list-group-item d-flex justify-content-between">
107
- <a class="text-sm text-reset text-decoration-none" data-component="{../component}" href="{../url}" target="<!-- IF ../associated -->_blank<!-- ELSE -->_top<!-- ENDIF ../associated -->">
108
- <!-- IF ../icon --><i class="fa {../icon}"></i><!-- ENDIF ../icon -->
109
- <!-- IF ../associated -->[[user:sso.associated]]<!-- ELSE -->[[user:sso.not-associated]]<!-- ENDIF ../associated -->
110
- {../name}
111
- </a>
112
- <!-- IF ../deauthUrl -->
113
- <a data-component="{../component}" class="btn btn-outline-secondary btn-sm" href="{../deauthUrl}">[[user:sso.dissociate]]</a>
114
- <!-- END -->
115
- </div>
116
- {{{end}}}
117
- </div>
118
- {{{ end }}}
87
+ {{{ if config.requireEmailConfirmation }}}
88
+ {{{ if (email && isSelf) }}}
89
+ <a id="confirm-email" href="#" class="btn btn-warning {{{ if email:confirmed }}}hide{{{ end }}}">[[user:confirm_email]]</a><br/><br/>
90
+ {{{ end }}}
91
+ {{{ end }}}
92
+ </div>
119
93
 
120
- <hr/>
121
- {{{ if (allowAccountDelete && isSelf) }}}
122
- <div class="d-flex justify-content-end">
123
- <button id="deleteAccountBtn" class="btn btn-danger">[[user:delete_account]]</button>
124
- </div>
125
- {{{ end }}}
126
- </div>
94
+ {{{ if sso.length }}}
95
+ <label class="form-label text-sm fw-semibold">[[user:sso.title]]</label>
96
+ <div class="list-group">
97
+ {{{ each sso }}}
98
+ <div class="list-group-item d-flex justify-content-between">
99
+ <a class="text-sm text-reset text-decoration-none" data-component="{./component}" href="{./url}" target="{{{ if ./associated }}}_blank{{{ else }}}_top{{{ end }}}">
100
+ {{{ if ./icon }}}<i class="fa {./icon}"></i>{{{ end }}}
101
+ {{{ if ./associated }}}[[user:sso.associated]]{{{ else }}}[[user:sso.not-associated]]{{{ end }}}
102
+ {./name}
103
+ </a>
104
+ {{{ if ./deauthUrl }}}
105
+ <a data-component="{./component}" class="btn btn-outline-secondary btn-sm" href="{./deauthUrl}">[[user:sso.dissociate]]</a>
106
+ {{{ end }}}
127
107
  </div>
108
+ {{{ end }}}
128
109
  </div>
110
+ {{{ end }}}
111
+
112
+ <hr/>
113
+ {{{ if (allowAccountDelete && isSelf) }}}
114
+ <div class="d-flex justify-content-end">
115
+ <button id="deleteAccountBtn" class="btn btn-danger">[[user:delete_account]]</button>
116
+ </div>
117
+ {{{ end }}}
129
118
  </div>
130
119
  </div>
131
120
 
132
-
121
+ <!-- IMPORT partials/account/footer.tpl -->