nodebb-theme-harmony 0.0.9 → 0.0.11

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 (72) hide show
  1. package/languages/en-GB/harmony.json +5 -1
  2. package/lib/controllers.js +15 -0
  3. package/library.js +63 -6
  4. package/package.json +1 -1
  5. package/plugin.json +5 -1
  6. package/public/settings.js +28 -0
  7. package/scss/account.scss +0 -3
  8. package/scss/common.scss +6 -0
  9. package/scss/modules/bottom-sheet.scss +1 -1
  10. package/scss/modules/topic-navigator.scss +0 -6
  11. package/scss/sidebar.scss +18 -16
  12. package/templates/account/blocks.tpl +2 -2
  13. package/templates/account/categories.tpl +27 -21
  14. package/templates/account/consent.tpl +10 -64
  15. package/templates/account/edit/password.tpl +29 -24
  16. package/templates/account/edit/username.tpl +25 -20
  17. package/templates/account/edit.tpl +110 -115
  18. package/templates/account/followers.tpl +2 -3
  19. package/templates/account/following.tpl +2 -3
  20. package/templates/account/groups.tpl +2 -3
  21. package/templates/account/info.tpl +206 -204
  22. package/templates/account/posts.tpl +4 -4
  23. package/templates/account/profile.tpl +9 -9
  24. package/templates/account/sessions.tpl +3 -6
  25. package/templates/account/settings.tpl +193 -206
  26. package/templates/account/theme.tpl +25 -21
  27. package/templates/account/topics.tpl +17 -16
  28. package/templates/account/uploads.tpl +4 -8
  29. package/templates/admin/plugins/harmony.tpl +4 -0
  30. package/templates/groups/details.tpl +3 -20
  31. package/templates/groups/list.tpl +10 -9
  32. package/templates/header.tpl +3 -21
  33. package/templates/login.tpl +1 -1
  34. package/templates/notifications.tpl +4 -4
  35. package/templates/partials/account/header.tpl +58 -47
  36. package/templates/partials/account/sidebar-left.tpl +19 -12
  37. package/templates/partials/buttons/newTopic.tpl +1 -3
  38. package/templates/partials/categories/item.tpl +1 -8
  39. package/templates/partials/category/sort.tpl +3 -3
  40. package/templates/partials/category/subcategory.tpl +1 -1
  41. package/templates/partials/category/tools.tpl +3 -3
  42. package/templates/partials/category/watch.tpl +7 -7
  43. package/templates/partials/category-filter-content.tpl +4 -4
  44. package/templates/partials/category-selector-content.tpl +10 -9
  45. package/templates/partials/chats/message-window.tpl +9 -7
  46. package/templates/partials/groups/admin.tpl +3 -5
  47. package/templates/partials/groups/sidebar-left.tpl +1 -1
  48. package/templates/partials/header/brand.tpl +19 -0
  49. package/templates/partials/notifications_list.tpl +5 -5
  50. package/templates/partials/post_bar.tpl +5 -5
  51. package/templates/partials/sidebar/logged-in-menu.tpl +23 -0
  52. package/templates/partials/sidebar/user-menu.tpl +1 -1
  53. package/templates/partials/sidebar-left.tpl +1 -1
  54. package/templates/partials/sidebar-right.tpl +1 -23
  55. package/templates/partials/tags_list.tpl +3 -2
  56. package/templates/partials/topic/navigator.tpl +2 -2
  57. package/templates/partials/topic/post-menu.tpl +2 -4
  58. package/templates/partials/topic/post.tpl +13 -13
  59. package/templates/partials/topic/reply-button.tpl +3 -3
  60. package/templates/partials/topic/sort.tpl +3 -3
  61. package/templates/partials/topic/tools.tpl +3 -3
  62. package/templates/partials/topic/watch.tpl +17 -16
  63. package/templates/partials/topic-filters.tpl +3 -3
  64. package/templates/partials/topic-list-bar.tpl +8 -12
  65. package/templates/partials/topic-terms.tpl +3 -3
  66. package/templates/partials/topics_list.tpl +4 -4
  67. package/templates/partials/users/item.tpl +27 -25
  68. package/templates/partials/users_list_menu.tpl +1 -1
  69. package/templates/search.tpl +0 -2
  70. package/templates/tags.tpl +12 -8
  71. package/templates/topic.tpl +1 -3
  72. package/templates/users.tpl +4 -5
@@ -1,5 +1,9 @@
1
1
  {
2
2
  "skins": "Skins",
3
3
  "collapse": "Collapse",
4
- "login-register-to-search": "Login or register to search."
4
+ "login-register-to-search": "Login or register to search.",
5
+ "settings.title": "Theme settings",
6
+ "settings.enableQuickReply": "Enable quick reply",
7
+ "settings.centerHeaderElements": "Center header elements",
8
+ "settings.stickyToolbar": "Sticky toolbar"
5
9
  }
@@ -2,6 +2,21 @@
2
2
 
3
3
  const Controllers = module.exports;
4
4
 
5
+ const accountHelpers = require.main.require('./src/controllers/accounts/helpers');
6
+ const helpers = require.main.require('./src/controllers/helpers');
7
+
5
8
  Controllers.renderAdminPage = (req, res) => {
6
9
  res.render('admin/plugins/harmony', {});
7
10
  };
11
+
12
+ Controllers.renderThemeSettings = async (req, res, next) => {
13
+ const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query);
14
+ if (!userData) {
15
+ return next();
16
+ }
17
+
18
+ userData.title = '[[harmony:settings.title]]';
19
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[harmony:settings.title]]' }]);
20
+
21
+ res.render('account/theme', userData);
22
+ };
package/library.js CHANGED
@@ -8,11 +8,24 @@ const controllers = require('./lib/controllers');
8
8
 
9
9
  const library = module.exports;
10
10
 
11
+ const defaults = {
12
+ enableQuickReply: 'on',
13
+ centerHeaderElements: 'off',
14
+ stickyToolbar: 'on',
15
+ };
16
+
11
17
  library.init = async function (params) {
12
- const { router } = params;
18
+ const { router, middleware } = params;
13
19
  const routeHelpers = require.main.require('./src/routes/helpers');
14
20
 
15
21
  routeHelpers.setupAdminPageRoute(router, '/admin/plugins/harmony', [], controllers.renderAdminPage);
22
+
23
+ routeHelpers.setupPageRoute(router, '/user/:userslug/theme', [
24
+ middleware.exposeUid,
25
+ middleware.ensureLoggedIn,
26
+ middleware.canViewUsers,
27
+ middleware.checkAccountPermissions,
28
+ ], controllers.renderThemeSettings);
16
29
  };
17
30
 
18
31
  library.addAdminNavigation = async function (header) {
@@ -24,6 +37,24 @@ library.addAdminNavigation = async function (header) {
24
37
  return header;
25
38
  };
26
39
 
40
+ library.addProfileItem = async (data) => {
41
+ data.links.push({
42
+ id: 'theme',
43
+ route: 'theme',
44
+ icon: 'fa-paint-brush',
45
+ name: '[[harmony:settings.title]]',
46
+ visibility: {
47
+ self: true,
48
+ other: false,
49
+ moderator: false,
50
+ globalMod: false,
51
+ admin: false,
52
+ },
53
+ });
54
+
55
+ return data;
56
+ };
57
+
27
58
  library.defineWidgetAreas = async function (areas) {
28
59
  const locations = ['header', 'sidebar', 'footer'];
29
60
  const templates = [
@@ -55,18 +86,44 @@ library.defineWidgetAreas = async function (areas) {
55
86
  return areas;
56
87
  };
57
88
 
89
+ async function loadThemeConfig(uid) {
90
+ const [themeConfig, userConfig] = await Promise.all([
91
+ meta.settings.get('harmony'),
92
+ user.getSettings(uid),
93
+ ]);
94
+ return { ...defaults, ...themeConfig, ...userConfig };
95
+ }
96
+
58
97
  library.getThemeConfig = async function (config) {
59
- const { enableQuickReply, centerHeaderElements } = await meta.settings.get('harmony');
60
- config.enableQuickReply = enableQuickReply === 'on';
61
- config.centerHeaderElements = centerHeaderElements === 'on';
98
+ const themeConfig = await loadThemeConfig(config.uid);
99
+ config.enableQuickReply = themeConfig.enableQuickReply === 'on';
100
+ config.centerHeaderElements = themeConfig.centerHeaderElements === 'on';
101
+ config.stickyToolbar = themeConfig.stickyToolbar === 'on';
62
102
  return config;
63
103
  };
64
104
 
105
+ library.getAdminSettings = async function (hookData) {
106
+ if (hookData.plugin === 'harmony') {
107
+ hookData.values = {
108
+ ...defaults,
109
+ ...hookData.values,
110
+ };
111
+ }
112
+ return hookData;
113
+ };
114
+
115
+ library.saveUserSettings = async function (hookData) {
116
+ Object.keys(defaults).forEach((key) => {
117
+ hookData.settings[key] = hookData.data[key] || undefined;
118
+ });
119
+ return hookData;
120
+ };
121
+
65
122
  library.addUserToTopic = async function (hookData) {
66
- const { enableQuickReply } = await meta.settings.get('harmony');
123
+ const { enableQuickReply } = await loadThemeConfig(hookData.req.uid);
67
124
  if (enableQuickReply === 'on') {
68
125
  if (hookData.req.user) {
69
- const userData = await user.getUserData(hookData.req.user.uid);
126
+ const userData = await user.getUserData(hookData.req.uid);
70
127
  hookData.templateData.loggedInUser = userData;
71
128
  } else {
72
129
  hookData.templateData.loggedInUser = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-theme-harmony",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "nbbpm": {
5
5
  "compatibility": "^3.0.0"
6
6
  },
package/plugin.json CHANGED
@@ -5,6 +5,9 @@
5
5
  { "hook": "filter:admin.header.build", "method": "addAdminNavigation" },
6
6
  { "hook": "filter:widgets.getAreas", "method": "defineWidgetAreas" },
7
7
  { "hook": "filter:config.get", "method": "getThemeConfig" },
8
+ { "hook": "filter:settings.get", "method": "getAdminSettings"},
9
+ { "hook": "filter:user.saveSettings", "method": "saveUserSettings" },
10
+ { "hook": "filter:user.profileMenu", "method": "addProfileItem" },
8
11
  { "hook": "filter:topic.build", "method": "addUserToTopic" },
9
12
  { "hook": "filter:middleware.renderHeader", "method": "filterMiddlewareRenderHeader" },
10
13
  { "hook": "filter:middleware.render", "method": "removeFinalBreadcrumb" }
@@ -13,7 +16,8 @@
13
16
  "public/harmony.js"
14
17
  ],
15
18
  "modules": {
16
- "../admin/plugins/harmony.js": "public/admin.js"
19
+ "../admin/plugins/harmony.js": "public/admin.js",
20
+ "../client/account/theme.js": "public/settings.js"
17
21
  },
18
22
  "staticDirs": {
19
23
  "inter": "node_modules/@fontsource/inter/files",
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ define('forum/account/theme', ['forum/account/header', 'api', 'settings', 'alerts'], function (header, api, settings, alerts) {
4
+ const Theme = {};
5
+
6
+ Theme.init = () => {
7
+ header.init();
8
+ Theme.setupForm();
9
+ };
10
+
11
+ Theme.setupForm = () => {
12
+ const saveEl = document.getElementById('save');
13
+ if (saveEl) {
14
+ const formEl = document.getElementById('theme-settings');
15
+ saveEl.addEventListener('click', async () => {
16
+ const themeSettings = settings.helper.serializeForm($(formEl));
17
+ await api.put(`/users/${app.user.uid}/settings`, {
18
+ settings: {
19
+ ...themeSettings,
20
+ },
21
+ });
22
+ alerts.success('[[success:settings-saved]]');
23
+ });
24
+ }
25
+ };
26
+
27
+ return Theme;
28
+ });
package/scss/account.scss CHANGED
@@ -6,9 +6,6 @@
6
6
  width: 100%;
7
7
  margin-left: auto;
8
8
  margin-right: auto;
9
- .breadcrumb {
10
- justify-content: start!important;
11
- }
12
9
 
13
10
  .avatar-wrapper {
14
11
  border: 4px solid white;
package/scss/common.scss CHANGED
@@ -75,3 +75,9 @@ body {
75
75
  font-size: 0.875rem;
76
76
  line-height: 1.25rem;
77
77
  }
78
+
79
+ .flex-basis-md-200 {
80
+ @include media-breakpoint-up(md) {
81
+ flex-basis: 200px!important;
82
+ }
83
+ }
@@ -8,7 +8,7 @@
8
8
  inset: auto 0 0 0!important;
9
9
 
10
10
  margin: 0 -1px -1px -1px;
11
- padding: 0 5px;
11
+ padding: 0 5px 4rem 5px!important;
12
12
  max-height: 60%;
13
13
 
14
14
  box-shadow: 0 2px 6px rgba(0,0,0,0.35);
@@ -16,7 +16,6 @@
16
16
  }
17
17
 
18
18
  .meta {
19
- display: none;
20
19
  top: -8px;
21
20
  left: calc($spacer + 8px);
22
21
  font-size: 13px;
@@ -38,7 +37,6 @@
38
37
  transition: $transition-base;
39
38
 
40
39
  .meta {
41
- display: none;
42
40
  left: calc($spacer + 8px);
43
41
  font-size: 13px;
44
42
  }
@@ -54,8 +52,4 @@
54
52
  [component="topic/navigator"].d-sm-flex.mt-auto + .mt-auto {
55
53
  margin-top: 0 !important;
56
54
  }
57
-
58
- .handle .meta, .unread .meta {
59
- display: block;
60
- }
61
55
  }
package/scss/sidebar.scss CHANGED
@@ -1,6 +1,6 @@
1
1
  .skin-noskin {
2
2
  // only using colors when there is no bootswatch skin applied
3
- .sidebar, .bottombar {
3
+ nav.sidebar, .bottombar {
4
4
  color: $secondary !important;
5
5
  background-color: $light !important;
6
6
  }
@@ -15,22 +15,24 @@
15
15
  .sidebar {
16
16
  $hover-color: mix($light, $dark, 90);
17
17
 
18
- &.open {
19
- min-width: 200px;
20
- max-width: 200px;
21
- width: 200px;
18
+ @include media-breakpoint-up(lg) {
19
+ &.open {
20
+ min-width: 200px;
21
+ max-width: 200px;
22
+ width: 200px;
22
23
 
23
- .sidebar-toggle {
24
- .fa-angles-right { display: none; }
25
- .fa-angles-left { display: inline-block; }
26
- }
27
- .visible-open { display: initial; }
28
- .visible-closed { display: none; }
29
- hr.visible-open { display: block; }
30
- .truncate-open {
31
- overflow: hidden;
32
- text-overflow: ellipsis;
33
- white-space: nowrap;
24
+ .sidebar-toggle {
25
+ .fa-angles-right { display: none; }
26
+ .fa-angles-left { display: inline-block; }
27
+ }
28
+ .visible-open { display: initial; }
29
+ .visible-closed { display: none; }
30
+ hr.visible-open { display: block; }
31
+ .truncate-open {
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ white-space: nowrap;
35
+ }
34
36
  }
35
37
  }
36
38
  .visible-open { display: none; }
@@ -1,8 +1,8 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
- <div class="row gx-5">
3
+ <div class="d-flex flex-column flex-md-row">
4
4
  <!-- IMPORT partials/account/sidebar-left.tpl -->
5
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
5
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
6
6
  <div class="d-flex justify-content-between mb-3">
7
7
  <h3 class="fw-semibold fs-5">[[pages:account/blocks, {username}]]</h3>
8
8
  <div class="justify-content-end">
@@ -1,28 +1,34 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row">
5
- <h3 class="fw-semibold fs-4">{title}</h3>
6
- <div class="col-lg-12 mb-2">
7
- <div class="btn-group bottom-sheet" component="category/watch/all">
8
- <button class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
9
- <span>[[user:change_all]]</span>
10
- <span class="caret"></span>
11
- </button>
12
- <ul class="dropdown-menu">
13
- <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>
14
- <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>
15
- <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>
16
- </ul>
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>
8
+
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>
17
31
  </div>
18
32
  </div>
19
- <div class="col-lg-12">
20
- <ul class="categories list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
21
- {{{each categories}}}
22
- <!-- IMPORT partials/account/category-item.tpl -->
23
- {{{end}}}
24
- </ul>
25
- <!-- IMPORT partials/paginator.tpl -->
26
- </div>
27
33
  </div>
28
34
  </div>
@@ -1,71 +1,17 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="account">
4
2
  <!-- IMPORT partials/account/header.tpl -->
5
- <h2>[[user:consent.title]]</h2>
6
- <p class="lead">[[user:consent.lead]]</p>
7
- <p>[[user:consent.intro]]</p>
8
3
 
9
- <hr />
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>
10
8
 
11
- <div class="row">
12
- <div class="col-sm-6">
13
- <!-- IF gdpr_consent -->
14
- <div class="alert alert-success">
15
- <i class="fa fa-check float-end fa-3x"></i>
16
- [[user:consent.received]]
17
- </div>
18
- <!-- ELSE -->
19
- <div class="alert alert-warning">
20
- [[user:consent.not_received]]
21
- <br /><br />
22
- <div class="text-center">
23
- <button class="btn btn-warning" data-action="consent">[[user:consent.give]]</button>
24
- </div>
25
- </div>
26
- <!-- END -->
27
- <div class="card">
28
- <div class="card-body">
29
- <p>[[user:consent.email_intro]]</p>
30
- <!-- IF digest.enabled -->
31
- <p>[[user:consent.digest_frequency, {digest.frequency}]]</p>
32
- <!-- ELSE -->
33
- [[user:consent.digest_off]]
34
- <!-- END -->
9
+ <p class="lead">[[user:consent.lead]]</p>
10
+ <p>[[user:consent.intro]]</p>
35
11
 
36
- <div class="text-center">
37
- <a class="btn btn-outline-secondary" href="./settings">
38
- <i class="fa fa-cog"></i>
39
- [[pages:account/settings]]
40
- </a>
41
- </div>
42
- </div>
43
- </div>
44
- </div>
45
- <div class="col-sm-6">
46
- <div class="card">
47
- <div class="card-body">
48
- <p><strong>[[user:consent.right_of_access]]</strong></p>
49
- <p>[[user:consent.right_of_access_description]]</p>
50
- <p><strong>[[user:consent.right_to_rectification]]</strong></p>
51
- <p>[[user:consent.right_to_rectification_description]]</p>
52
- <p><strong>[[user:consent.right_to_erasure]]</strong></p>
53
- <p>[[user:consent.right_to_erasure_description]]</p>
54
- <p><strong>[[user:consent.right_to_data_portability]]</strong></p>
55
- <p>[[user:consent.right_to_data_portability_description]]</p>
12
+ <hr />
56
13
 
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>
69
- </div>
14
+ <div class="row">
15
+ </div>
70
16
  </div>
71
- </div>
17
+ </div>
@@ -1,32 +1,37 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="account">
4
2
  <!-- IMPORT partials/account/header.tpl -->
5
3
 
6
- <form class="edit-form">
7
- <!-- disables autocomplete on FF --><input type="password" style="display:none">
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>
8
8
 
9
- <!-- IF isSelf -->
10
- <div class="mb-2">
11
- <label class="form-label fw-bold" for="inputCurrentPassword">[[user:current_password]]</label>
12
- <input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value=""<!-- IF !hasPassword --> disabled<!-- ENDIF !hasPassword -->>
13
- </div>
14
- <!-- ENDIF isSelf -->
9
+ <form class="edit-form">
10
+ <!-- disables autocomplete on FF --><input type="password" style="display:none">
15
11
 
16
- <div class="mb-2">
17
- <label class="form-label fw-bold" for="inputNewPassword">[[user:new_password]]</label>
18
- <input class="form-control" type="password" id="inputNewPassword" placeholder="[[user:password]]" value="">
19
- <span class="form-feedback" id="password-notify"></span>
20
- </div>
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 }}}
21
18
 
22
- <div class="mb-2">
23
- <label class="form-label fw-bold" for="inputNewPasswordAgain">[[user:confirm_password]]</label>
24
- <input class="form-control" type="password" id="inputNewPasswordAgain" placeholder="[[user:confirm_password]]" value="">
25
- <span class="form-feedback" id="password-confirm-notify"></span>
26
- </div>
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>
24
+
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>
27
30
 
28
- <div class="form-actions">
29
- <button id="changePasswordBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_password]]</button>
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>
30
35
  </div>
31
- </form>
32
- </div>
36
+ </div>
37
+ </div>
@@ -1,28 +1,33 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="account">
4
2
  <!-- IMPORT partials/account/header.tpl -->
5
3
 
6
- <form class="form-horizontal edit-form">
7
- <div class="mb-2">
8
- <label class="form-label fw-bold" for="inputNewUsername">[[user:username]]</label>
9
- <input class="form-control" type="text" id="inputNewUsername" placeholder="[[user:username]]" value="{username}">
10
- </div>
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>
11
8
 
12
- <!-- disables autocomplete on FF --><input type="password" style="display:none">
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>
13
14
 
14
- <!-- IF isSelf -->
15
- <div class="mb-2">
16
- <label class="form-label fw-bold" for="inputCurrentPassword">[[user:current_password]]</label>
17
- <input autocomplete="off" class="form-control" type="password" id="inputCurrentPassword" placeholder="[[user:current_password]]" value=""<!-- IF !hasPassword --> disabled<!-- ENDIF !hasPassword -->>
18
- </div>
19
- <!-- ENDIF isSelf -->
15
+ <!-- disables autocomplete on FF --><input type="password" style="display:none">
16
+
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 }}}
20
23
 
21
- <input type="hidden" name="uid" id="inputUID" value="{uid}" />
24
+ <input type="hidden" name="uid" id="inputUID" value="{uid}" />
22
25
 
23
- <br/>
24
- <div class="form-actions">
25
- <button id="submitBtn" class="btn btn-primary btn-block"><i class="hide fa fa-spinner fa-spin"></i> [[user:change_username]]</button>
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>
26
31
  </div>
27
- </form>
28
- </div>
32
+ </div>
33
+ </div>