nodebb-theme-persona 13.3.28 → 13.3.31

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 +270 -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
package/public/persona.js CHANGED
@@ -1,257 +1,257 @@
1
- 'use strict';
2
-
3
- $(document).ready(function () {
4
- setupNProgress();
5
- setupTaskbar();
6
- setupEditedByIcon();
7
- setupMobileMenu();
8
- configureNavbarHiding();
9
-
10
- $(window).on('resize', utils.debounce(configureNavbarHiding, 200));
11
- $(window).on('resize', updatePanelOffset);
12
-
13
- function updatePanelOffset() {
14
- const header = document.getElementById('header-menu');
15
-
16
- if (!header) {
17
- console.warn('[persona/updatePanelOffset] Could not find #header-menu, panel offset unchanged.');
18
- return;
19
- }
20
-
21
- const rect = header.getBoundingClientRect();
22
- const offset = Math.max(0, rect.bottom);
23
- document.documentElement.style.setProperty('--panel-offset', `${offset}px`);
24
- }
25
-
26
- var lastBSEnv = '';
27
- function configureNavbarHiding() {
28
- if (!$.fn.autoHidingNavbar) {
29
- return;
30
- }
31
-
32
- require(['hooks', 'storage'], (hooks, Storage) => {
33
- let preference = ['xs', 'sm'];
34
-
35
- try {
36
- preference = JSON.parse(Storage.getItem('persona:navbar:autohide')) || preference;
37
- } catch (e) {
38
- console.warn('[persona/settings] Unable to parse value for navbar autohiding');
39
- }
40
- var env = utils.findBootstrapEnvironment();
41
- // if env didn't change don't destroy and recreate
42
- if (env === lastBSEnv) {
43
- return;
44
- }
45
- lastBSEnv = env;
46
- var navbarEl = $('[component="navbar"]');
47
- navbarEl.autoHidingNavbar('destroy').removeData('plugin_autoHidingNavbar');
48
- navbarEl.css('top', '');
49
-
50
- hooks
51
- .on('filter:navigator.scroll', (data) => {
52
- navbarEl.autoHidingNavbar('setDisableAutohide', true);
53
- return data;
54
- })
55
- .on('action:navigator.scrolled', () => {
56
- navbarEl.autoHidingNavbar('setDisableAutohide', false);
57
- });
58
-
59
- hooks.fire('filter:persona.configureNavbarHiding', {
60
- resizeEnvs: preference,
61
- }).then(({ resizeEnvs }) => {
62
- if (resizeEnvs.includes(env)) {
63
- navbarEl.autoHidingNavbar({
64
- showOnBottom: false,
65
- });
66
- }
67
-
68
- function fixTopCss(topValue) {
69
- if (ajaxify.data.template.topic) {
70
- $('.topic .topic-header').css({ top: topValue });
71
- } else {
72
- var topicListHeader = $('.topic-list-header');
73
- if (topicListHeader.length) {
74
- topicListHeader.css({ top: topValue });
75
- }
76
- }
77
- }
78
-
79
- navbarEl.off('show.autoHidingNavbar')
80
- .on('show.autoHidingNavbar', function () {
81
- fixTopCss('');
82
- });
83
-
84
- navbarEl.off('hide.autoHidingNavbar')
85
- .on('hide.autoHidingNavbar', function () {
86
- fixTopCss('0px');
87
- });
88
- });
89
- });
90
- }
91
-
92
- function setupNProgress() {
93
- require(['nprogress'], function (NProgress) {
94
- if (typeof NProgress === 'undefined') {
95
- return;
96
- }
97
-
98
- $(window).on('action:ajaxify.start', function () {
99
- NProgress.set(0.7);
100
- });
101
-
102
- $(window).on('action:ajaxify.end', function (ev, data) {
103
- NProgress.done();
104
- setupHoverCards();
105
-
106
- if (data.url && data.url.match('user/')) {
107
- setupFavouriteButtonOnProfile();
108
- }
109
- });
110
- });
111
- }
112
-
113
- function setupTaskbar() {
114
- require(['persona/taskbar'], function (taskbar) {
115
- taskbar.init();
116
- });
117
- }
118
-
119
- function setupEditedByIcon() {
120
- function activateEditedTooltips() {
121
- $('[data-pid] [component="post/editor"]').each(function () {
122
- var el = $(this);
123
- var icon;
124
-
125
- if (!el.attr('data-editor')) {
126
- return;
127
- }
128
-
129
- icon = el.closest('[data-pid]').find('.edit-icon').first();
130
- icon.prop('title', el.text()).tooltip().removeClass('hidden');
131
- });
132
- }
133
-
134
- $(window).on('action:posts.edited', function (ev, data) {
135
- var parent = $('[data-pid="' + data.post.pid + '"]');
136
- var icon = parent.find('.edit-icon').filter(function (index, el) {
137
- return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10);
138
- });
139
- var el = parent.find('[component="post/editor"]').first();
140
- icon.prop('title', el.text()).tooltip().removeClass('hidden');
141
- });
142
-
143
- $(window).on('action:topic.loaded', activateEditedTooltips);
144
- $(window).on('action:posts.loaded', activateEditedTooltips);
145
- }
146
-
147
- function setupMobileMenu() {
148
- require(['persona/mobile-menu'], function (mobileMenu) {
149
- mobileMenu.init();
150
- });
151
- }
152
-
153
- function setupHoverCards() {
154
- require(['components'], function (components) {
155
- components.get('topic')
156
- .on('click', '[component="user/picture"],[component="user/status"]', generateUserCard);
157
- });
158
-
159
- $(window).on('action:posts.loading', function (ev, data) {
160
- for (var i = 0, ii = data.posts.length; i < ii; i++) {
161
- (ajaxify.data.topics || ajaxify.data.posts)[data.posts[i].index] = data.posts[i];
162
- }
163
- });
164
- }
165
-
166
- function generateUserCard(ev) {
167
- var avatar = $(this);
168
- var uid = avatar.parents('[data-uid]').attr('data-uid');
169
- var data = (ajaxify.data.topics || ajaxify.data.posts);
170
-
171
- for (var i = 0, ii = data.length; i < ii; i++) {
172
- if (parseInt(data[i].uid, 10) === parseInt(uid, 10)) {
173
- data = data[i].user;
174
- break;
175
- }
176
- }
177
-
178
- $('.persona-usercard').remove();
179
-
180
- if (parseInt(data.uid, 10) === 0) {
181
- return false;
182
- }
183
-
184
- socket.emit('user.isFollowing', { uid: data.uid }, function (err, isFollowing) {
185
- if (err) {
186
- return err;
187
- }
188
-
189
- app.parseAndTranslate('modules/usercard', data, function (html) {
190
- var card = $(html);
191
- avatar.parents('a').after(card.hide());
192
-
193
- if (parseInt(app.user.uid, 10) === parseInt(data.uid, 10) || !app.user.uid) {
194
- card.find('.btn-morph').hide();
195
- } else {
196
- setupFavouriteMorph(card, data.uid, data.username);
197
-
198
- if (isFollowing) {
199
- $('.btn-morph').addClass('heart');
200
- } else {
201
- $('.btn-morph').addClass('plus');
202
- }
203
- }
204
-
205
- setupCardRemoval(card);
206
- card.fadeIn();
207
- });
208
- });
209
-
210
- ev.preventDefault();
211
- return false;
212
- }
213
-
214
- function setupFavouriteButtonOnProfile() {
215
- setupFavouriteMorph($('[component="account/cover"]'), ajaxify.data.uid, ajaxify.data.username);
216
- }
217
-
218
- function setupCardRemoval(card) {
219
- function removeCard(ev) {
220
- if ($(ev.target).closest('.persona-usercard').length === 0) {
221
- card.fadeOut(function () {
222
- card.remove();
223
- });
224
-
225
- $(document).off('click', removeCard);
226
- }
227
- }
228
-
229
- $(document).on('click', removeCard);
230
- }
231
-
232
- function setupFavouriteMorph(parent, uid, username) {
233
- require(['api', 'alerts'], function (api, alerts) {
234
- parent.find('.btn-morph').click(function (ev) {
235
- var type = $(this).hasClass('plus') ? 'follow' : 'unfollow';
236
- var method = $(this).hasClass('plus') ? 'put' : 'del';
237
-
238
- api[method]('/users/' + uid + '/follow').then(() => {
239
- alerts.success('[[global:alert.' + type + ', ' + username + ']]');
240
- });
241
-
242
- $(this).toggleClass('plus').toggleClass('heart');
243
- $(this).translateAttr('title', type === 'follow' ? '[[global:unfollow]]' : '[[global:follow]]');
244
-
245
- if ($(this).find('b.drop').length === 0) {
246
- $(this).prepend('<b class="drop"></b>');
247
- }
248
-
249
- var drop = $(this).find('b.drop').removeClass('animate');
250
- var x = ev.pageX - (drop.width() / 2) - $(this).offset().left;
251
- var y = ev.pageY - (drop.height() / 2) - $(this).offset().top;
252
-
253
- drop.css({ top: y + 'px', left: x + 'px' }).addClass('animate');
254
- });
255
- });
256
- }
257
- });
1
+ 'use strict';
2
+
3
+ $(document).ready(function () {
4
+ setupNProgress();
5
+ setupTaskbar();
6
+ setupEditedByIcon();
7
+ setupMobileMenu();
8
+ configureNavbarHiding();
9
+
10
+ $(window).on('resize', utils.debounce(configureNavbarHiding, 200));
11
+ $(window).on('resize', updatePanelOffset);
12
+
13
+ function updatePanelOffset() {
14
+ const header = document.getElementById('header-menu');
15
+
16
+ if (!header) {
17
+ console.warn('[persona/updatePanelOffset] Could not find #header-menu, panel offset unchanged.');
18
+ return;
19
+ }
20
+
21
+ const rect = header.getBoundingClientRect();
22
+ const offset = Math.max(0, rect.bottom);
23
+ document.documentElement.style.setProperty('--panel-offset', `${offset}px`);
24
+ }
25
+
26
+ var lastBSEnv = '';
27
+ function configureNavbarHiding() {
28
+ if (!$.fn.autoHidingNavbar) {
29
+ return;
30
+ }
31
+
32
+ require(['hooks', 'storage'], (hooks, Storage) => {
33
+ let preference = ['xs', 'sm'];
34
+
35
+ try {
36
+ preference = JSON.parse(Storage.getItem('persona:navbar:autohide')) || preference;
37
+ } catch (e) {
38
+ console.warn('[persona/settings] Unable to parse value for navbar autohiding');
39
+ }
40
+ var env = utils.findBootstrapEnvironment();
41
+ // if env didn't change don't destroy and recreate
42
+ if (env === lastBSEnv) {
43
+ return;
44
+ }
45
+ lastBSEnv = env;
46
+ var navbarEl = $('[component="navbar"]');
47
+ navbarEl.autoHidingNavbar('destroy').removeData('plugin_autoHidingNavbar');
48
+ navbarEl.css('top', '');
49
+
50
+ hooks
51
+ .on('filter:navigator.scroll', (data) => {
52
+ navbarEl.autoHidingNavbar('setDisableAutohide', true);
53
+ return data;
54
+ })
55
+ .on('action:navigator.scrolled', () => {
56
+ navbarEl.autoHidingNavbar('setDisableAutohide', false);
57
+ });
58
+
59
+ hooks.fire('filter:persona.configureNavbarHiding', {
60
+ resizeEnvs: preference,
61
+ }).then(({ resizeEnvs }) => {
62
+ if (resizeEnvs.includes(env)) {
63
+ navbarEl.autoHidingNavbar({
64
+ showOnBottom: false,
65
+ });
66
+ }
67
+
68
+ function fixTopCss(topValue) {
69
+ if (ajaxify.data.template.topic) {
70
+ $('.topic .topic-header').css({ top: topValue });
71
+ } else {
72
+ var topicListHeader = $('.topic-list-header');
73
+ if (topicListHeader.length) {
74
+ topicListHeader.css({ top: topValue });
75
+ }
76
+ }
77
+ }
78
+
79
+ navbarEl.off('show.autoHidingNavbar')
80
+ .on('show.autoHidingNavbar', function () {
81
+ fixTopCss('');
82
+ });
83
+
84
+ navbarEl.off('hide.autoHidingNavbar')
85
+ .on('hide.autoHidingNavbar', function () {
86
+ fixTopCss('0px');
87
+ });
88
+ });
89
+ });
90
+ }
91
+
92
+ function setupNProgress() {
93
+ require(['nprogress'], function (NProgress) {
94
+ if (typeof NProgress === 'undefined') {
95
+ return;
96
+ }
97
+
98
+ $(window).on('action:ajaxify.start', function () {
99
+ NProgress.set(0.7);
100
+ });
101
+
102
+ $(window).on('action:ajaxify.end', function (ev, data) {
103
+ NProgress.done();
104
+ setupHoverCards();
105
+
106
+ if (data.url && data.url.match('user/')) {
107
+ setupFavouriteButtonOnProfile();
108
+ }
109
+ });
110
+ });
111
+ }
112
+
113
+ function setupTaskbar() {
114
+ require(['persona/taskbar'], function (taskbar) {
115
+ taskbar.init();
116
+ });
117
+ }
118
+
119
+ function setupEditedByIcon() {
120
+ function activateEditedTooltips() {
121
+ $('[data-pid] [component="post/editor"]').each(function () {
122
+ var el = $(this);
123
+ var icon;
124
+
125
+ if (!el.attr('data-editor')) {
126
+ return;
127
+ }
128
+
129
+ icon = el.closest('[data-pid]').find('.edit-icon').first();
130
+ icon.prop('title', el.text()).tooltip().removeClass('hidden');
131
+ });
132
+ }
133
+
134
+ $(window).on('action:posts.edited', function (ev, data) {
135
+ var parent = $('[data-pid="' + data.post.pid + '"]');
136
+ var icon = parent.find('.edit-icon').filter(function (index, el) {
137
+ return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10);
138
+ });
139
+ var el = parent.find('[component="post/editor"]').first();
140
+ icon.prop('title', el.text()).tooltip().removeClass('hidden');
141
+ });
142
+
143
+ $(window).on('action:topic.loaded', activateEditedTooltips);
144
+ $(window).on('action:posts.loaded', activateEditedTooltips);
145
+ }
146
+
147
+ function setupMobileMenu() {
148
+ require(['persona/mobile-menu'], function (mobileMenu) {
149
+ mobileMenu.init();
150
+ });
151
+ }
152
+
153
+ function setupHoverCards() {
154
+ require(['components'], function (components) {
155
+ components.get('topic')
156
+ .on('click', '[component="user/picture"],[component="user/status"]', generateUserCard);
157
+ });
158
+
159
+ $(window).on('action:posts.loading', function (ev, data) {
160
+ for (var i = 0, ii = data.posts.length; i < ii; i++) {
161
+ (ajaxify.data.topics || ajaxify.data.posts)[data.posts[i].index] = data.posts[i];
162
+ }
163
+ });
164
+ }
165
+
166
+ function generateUserCard(ev) {
167
+ var avatar = $(this);
168
+ var uid = avatar.parents('[data-uid]').attr('data-uid');
169
+ var data = (ajaxify.data.topics || ajaxify.data.posts);
170
+
171
+ for (var i = 0, ii = data.length; i < ii; i++) {
172
+ if (parseInt(data[i].uid, 10) === parseInt(uid, 10)) {
173
+ data = data[i].user;
174
+ break;
175
+ }
176
+ }
177
+
178
+ $('.persona-usercard').remove();
179
+
180
+ if (parseInt(data.uid, 10) === 0) {
181
+ return false;
182
+ }
183
+
184
+ socket.emit('user.isFollowing', { uid: data.uid }, function (err, isFollowing) {
185
+ if (err) {
186
+ return err;
187
+ }
188
+
189
+ app.parseAndTranslate('modules/usercard', data, function (html) {
190
+ var card = $(html);
191
+ avatar.parents('a').after(card.hide());
192
+
193
+ if (parseInt(app.user.uid, 10) === parseInt(data.uid, 10) || !app.user.uid) {
194
+ card.find('.btn-morph').hide();
195
+ } else {
196
+ setupFavouriteMorph(card, data.uid, data.username);
197
+
198
+ if (isFollowing) {
199
+ $('.btn-morph').addClass('heart');
200
+ } else {
201
+ $('.btn-morph').addClass('plus');
202
+ }
203
+ }
204
+
205
+ setupCardRemoval(card);
206
+ card.fadeIn();
207
+ });
208
+ });
209
+
210
+ ev.preventDefault();
211
+ return false;
212
+ }
213
+
214
+ function setupFavouriteButtonOnProfile() {
215
+ setupFavouriteMorph($('[component="account/cover"]'), ajaxify.data.uid, ajaxify.data.username);
216
+ }
217
+
218
+ function setupCardRemoval(card) {
219
+ function removeCard(ev) {
220
+ if ($(ev.target).closest('.persona-usercard').length === 0) {
221
+ card.fadeOut(function () {
222
+ card.remove();
223
+ });
224
+
225
+ $(document).off('click', removeCard);
226
+ }
227
+ }
228
+
229
+ $(document).on('click', removeCard);
230
+ }
231
+
232
+ function setupFavouriteMorph(parent, uid, username) {
233
+ require(['api', 'alerts'], function (api, alerts) {
234
+ parent.find('.btn-morph').click(function (ev) {
235
+ var type = $(this).hasClass('plus') ? 'follow' : 'unfollow';
236
+ var method = $(this).hasClass('plus') ? 'put' : 'del';
237
+
238
+ api[method]('/users/' + uid + '/follow').then(() => {
239
+ alerts.success('[[global:alert.' + type + ', ' + username + ']]');
240
+ });
241
+
242
+ $(this).toggleClass('plus').toggleClass('heart');
243
+ $(this).translateAttr('title', type === 'follow' ? '[[global:unfollow]]' : '[[global:follow]]');
244
+
245
+ if ($(this).find('b.drop').length === 0) {
246
+ $(this).prepend('<b class="drop"></b>');
247
+ }
248
+
249
+ var drop = $(this).find('b.drop').removeClass('animate');
250
+ var x = ev.pageX - (drop.width() / 2) - $(this).offset().left;
251
+ var y = ev.pageY - (drop.height() / 2) - $(this).offset().top;
252
+
253
+ drop.css({ top: y + 'px', left: x + 'px' }).addClass('animate');
254
+ });
255
+ });
256
+ }
257
+ });
@@ -1,53 +1,53 @@
1
- 'use strict';
2
-
3
- define('forum/account/theme', ['forum/account/header', 'storage', 'settings', 'alerts'], function (header, Storage, 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
- const formEl = document.getElementById('theme-settings');
14
- const [sidebarSwapped, autohideNavbarEnvs] = [
15
- !!Storage.getItem('persona:menus:legacy-layout'),
16
- Storage.getItem('persona:navbar:autohide'),
17
- ];
18
-
19
- document.getElementById('persona:menus:legacy-layout').checked = sidebarSwapped;
20
- try {
21
- const parsed = JSON.parse(autohideNavbarEnvs) || ['xs', 'sm'];
22
- parsed.forEach((env) => {
23
- const optionEl = document.getElementById('persona:navbar:autohide').querySelector(`option[value="${env}"]`);
24
- optionEl.selected = true;
25
- });
26
- } catch (e) {
27
- console.warn(e);
28
- }
29
-
30
- if (saveEl) {
31
- saveEl.addEventListener('click', () => {
32
- const themeSettings = settings.helper.serializeForm($(formEl));
33
- Object.keys(themeSettings).forEach((key) => {
34
- if (key === 'persona:menus:legacy-layout') {
35
- if (themeSettings[key] === 'on') {
36
- Storage.setItem('persona:menus:legacy-layout', 'true');
37
- } else {
38
- Storage.removeItem('persona:menus:legacy-layout');
39
- }
40
-
41
- return;
42
- }
43
-
44
- Storage.setItem(key, themeSettings[key]);
45
- });
46
-
47
- alerts.success('[[success:settings-saved]]');
48
- });
49
- }
50
- };
51
-
52
- return Theme;
53
- });
1
+ 'use strict';
2
+
3
+ define('forum/account/theme', ['forum/account/header', 'storage', 'settings', 'alerts'], function (header, Storage, 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
+ const formEl = document.getElementById('theme-settings');
14
+ const [sidebarSwapped, autohideNavbarEnvs] = [
15
+ !!Storage.getItem('persona:menus:legacy-layout'),
16
+ Storage.getItem('persona:navbar:autohide'),
17
+ ];
18
+
19
+ document.getElementById('persona:menus:legacy-layout').checked = sidebarSwapped;
20
+ try {
21
+ const parsed = JSON.parse(autohideNavbarEnvs) || ['xs', 'sm'];
22
+ parsed.forEach((env) => {
23
+ const optionEl = document.getElementById('persona:navbar:autohide').querySelector(`option[value="${env}"]`);
24
+ optionEl.selected = true;
25
+ });
26
+ } catch (e) {
27
+ console.warn(e);
28
+ }
29
+
30
+ if (saveEl) {
31
+ saveEl.addEventListener('click', () => {
32
+ const themeSettings = settings.helper.serializeForm($(formEl));
33
+ Object.keys(themeSettings).forEach((key) => {
34
+ if (key === 'persona:menus:legacy-layout') {
35
+ if (themeSettings[key] === 'on') {
36
+ Storage.setItem('persona:menus:legacy-layout', 'true');
37
+ } else {
38
+ Storage.removeItem('persona:menus:legacy-layout');
39
+ }
40
+
41
+ return;
42
+ }
43
+
44
+ Storage.setItem(key, themeSettings[key]);
45
+ });
46
+
47
+ alerts.success('[[success:settings-saved]]');
48
+ });
49
+ }
50
+ };
51
+
52
+ return Theme;
53
+ });