From fb4f89f391c27d335ca073307e946cace7cfab56 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 22 Feb 2022 10:28:23 -0500 Subject: [PATCH 1/5] fix(sorted-list): only call `.stripHTMLTags()` on string values --- public/src/modules/settings/sorted-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/settings/sorted-list.js b/public/src/modules/settings/sorted-list.js index c03e2ea6ed..48b3bee79b 100644 --- a/public/src/modules/settings/sorted-list.js +++ b/public/src/modules/settings/sorted-list.js @@ -148,7 +148,7 @@ define('settings/sorted-list', [ function stripTags(data) { return Object.entries(data || {}).forEach(([field, value]) => { - data[field] = utils.stripHTMLTags(value, utils.stripTags); + data[field] = typeof value === 'string' ? utils.stripHTMLTags(value, utils.stripTags) : value; }); } From 92d613e42096fdb3b45e29c00c30e65922c0b8ee Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 22 Feb 2022 10:39:54 -0500 Subject: [PATCH 2/5] feat(sorted-list): add new client-side hook `filter:settings.sorted-list.loadItem` --- public/src/modules/settings/sorted-list.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/modules/settings/sorted-list.js b/public/src/modules/settings/sorted-list.js index 48b3bee79b..e5fb9d7b31 100644 --- a/public/src/modules/settings/sorted-list.js +++ b/public/src/modules/settings/sorted-list.js @@ -50,7 +50,9 @@ define('settings/sorted-list', [ const list = ajaxify.data[call ? hash : 'settings'][key]; if (Array.isArray(list) && typeof list[0] !== 'string') { - list.forEach(function (item) { + await Promise.all(list.map(async (item) => { + ({ item } = await hooks.fire('filter:settings.sorted-list.loadItem', { item })); + const itemUUID = utils.generateUUID(); const form = $(formHtml).deserialize(item); form.attr('data-sorted-list-uuid', itemUUID); @@ -60,7 +62,7 @@ define('settings/sorted-list', [ parse($container, itemUUID, item).then(() => { hooks.fire('action:settings.sorted-list.loaded', { element: listEl.get(0) }); }); - }); + })); } listEl.sortable().addClass('pointer'); From 914733e44bc0956e9f704b5a55c5ed817f0d5a20 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 22 Feb 2022 11:41:33 -0500 Subject: [PATCH 3/5] fix: allow calls to api module without a defined payload --- public/src/modules/api.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/src/modules/api.js b/public/src/modules/api.js index 614b799f04..e3468190af 100644 --- a/public/src/modules/api.js +++ b/public/src/modules/api.js @@ -47,18 +47,18 @@ define('api', ['hooks'], (hooks) => { } api.get = (route, payload, onSuccess) => call({ - url: route + (Object.keys(payload).length ? ('?' + $.param(payload)) : ''), + url: route + (payload && Object.keys(payload).length ? ('?' + $.param(payload)) : ''), }, onSuccess); api.head = (route, payload, onSuccess) => call({ - url: route + (Object.keys(payload).length ? ('?' + $.param(payload)) : ''), + url: route + (payload && Object.keys(payload).length ? ('?' + $.param(payload)) : ''), method: 'head', }, onSuccess); api.post = (route, payload, onSuccess) => call({ url: route, method: 'post', - data: JSON.stringify(payload), + data: JSON.stringify(payload || {}), contentType: 'application/json; charset=utf-8', headers: { 'x-csrf-token': config.csrf_token, @@ -68,7 +68,7 @@ define('api', ['hooks'], (hooks) => { api.put = (route, payload, onSuccess) => call({ url: route, method: 'put', - data: JSON.stringify(payload), + data: JSON.stringify(payload || {}), contentType: 'application/json; charset=utf-8', headers: { 'x-csrf-token': config.csrf_token, From 1c8d1d231e43c5d4338948757775d78260b90b14 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 22 Feb 2022 13:26:30 -0500 Subject: [PATCH 4/5] fix(sorted-list): call loadItem hook on add/edit items as well as on item retrieval, refactor edit to call parse() --- public/src/modules/settings/sorted-list.js | 32 ++++++++++------------ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/public/src/modules/settings/sorted-list.js b/public/src/modules/settings/sorted-list.js index e5fb9d7b31..42b5c72085 100644 --- a/public/src/modules/settings/sorted-list.js +++ b/public/src/modules/settings/sorted-list.js @@ -67,7 +67,7 @@ define('settings/sorted-list', [ listEl.sortable().addClass('pointer'); }, - addItem: function ($formElements, $target) { + addItem: async ($formElements, $target) => { const key = $target.attr('data-sorted-list'); const itemUUID = utils.generateUUID(); const form = $('
'); @@ -75,7 +75,8 @@ define('settings/sorted-list', [ $('#content').append(form.hide()); - const data = Settings.helper.serializeForm(form); + let data = Settings.helper.serializeForm(form); + ({ item: data } = await hooks.fire('filter:settings.sorted-list.loadItem', { item: data })); parse($target, itemUUID, data); }, }; @@ -90,7 +91,6 @@ define('settings/sorted-list', [ function setupEditButton($container, itemUUID) { const $list = $container.find('[data-type="list"]'); const key = $container.attr('data-sorted-list'); - const itemTpl = $container.attr('data-item-template'); const editBtn = $('[data-sorted-list-uuid="' + itemUUID + '"] [data-type="edit"]'); editBtn.on('click', function () { @@ -102,7 +102,7 @@ define('settings/sorted-list', [ el.value = form.find(`select#${el.id}`).val(); }); - const modal = bootbox.confirm(clone, function (save) { + const modal = bootbox.confirm(clone, async (save) => { if (save) { const form = $('
'); form.append(modal.find('form').children()); @@ -111,25 +111,19 @@ define('settings/sorted-list', [ $('#content').append(form.hide()); - const data = Settings.helper.serializeForm(form); + let data = Settings.helper.serializeForm(form); + ({ item: data } = await hooks.fire('filter:settings.sorted-list.loadItem', { item: data })); stripTags(data); - app.parseAndTranslate(itemTpl, data, function (itemHtml) { - itemHtml = $(itemHtml); - const oldItem = $list.find('[data-sorted-list-uuid="' + itemUUID + '"]'); - oldItem.after(itemHtml); - oldItem.remove(); - itemHtml.attr('data-sorted-list-uuid', itemUUID); - - setupRemoveButton($container, itemUUID); - setupEditButton($container, itemUUID); - }); + const oldItem = $list.find('[data-sorted-list-uuid="' + itemUUID + '"]'); + parse($container, itemUUID, data, oldItem); } }); }); } - function parse($container, itemUUID, data) { + function parse($container, itemUUID, data, replaceEl) { + // replaceEl is optional const $list = $container.find('[data-type="list"]'); const itemTpl = $container.attr('data-item-template'); @@ -138,7 +132,11 @@ define('settings/sorted-list', [ return new Promise((resolve) => { app.parseAndTranslate(itemTpl, data, function (itemHtml) { itemHtml = $(itemHtml); - $list.append(itemHtml); + if (replaceEl) { + replaceEl.replaceWith(itemHtml); + } else { + $list.append(itemHtml); + } itemHtml.attr('data-sorted-list-uuid', itemUUID); setupRemoveButton($container, itemUUID); From b84e61d568d05c95f9d8c222b5dfa016fdbe7cf1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Feb 2022 16:05:03 -0500 Subject: [PATCH 5/5] fix(deps): update dependency nodebb-theme-persona to v11.4.1 (#10337) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 73b4b837f8..730070f785 100644 --- a/install/package.json +++ b/install/package.json @@ -95,7 +95,7 @@ "nodebb-plugin-spam-be-gone": "0.7.13", "nodebb-rewards-essentials": "0.2.1", "nodebb-theme-lavender": "5.3.2", - "nodebb-theme-persona": "11.4.0", + "nodebb-theme-persona": "11.4.1", "nodebb-theme-slick": "1.4.23", "nodebb-theme-vanilla": "12.1.17", "nodebb-widget-essentials": "5.0.9",