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, diff --git a/public/src/modules/settings/sorted-list.js b/public/src/modules/settings/sorted-list.js index c03e2ea6ed..42b5c72085 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,12 +62,12 @@ define('settings/sorted-list', [ parse($container, itemUUID, item).then(() => { hooks.fire('action:settings.sorted-list.loaded', { element: listEl.get(0) }); }); - }); + })); } 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 = $('
'); @@ -73,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); }, }; @@ -88,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 () { @@ -100,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()); @@ -109,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'); @@ -136,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); @@ -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; }); }