diff --git a/Web/scripts/admin/resource-groups.js b/Web/scripts/admin/resource-groups.js index 64fc5cba3..7333b0eb8 100644 --- a/Web/scripts/admin/resource-groups.js +++ b/Web/scripts/admin/resource-groups.js @@ -49,7 +49,7 @@ function ResourceGroupManagement(opts) { function wireUpTree(groups) { elements.groupDiv.tree({ - data: groups, + data: decodeNames(groups), saveState: false, dragAndDrop: true, selectable: false, @@ -234,7 +234,7 @@ function ResourceGroupManagement(opts) { function onGroupAdded(data) { var parentNode = null; - data = JSON.parse(data); + data = decodeNames([JSON.parse(data)])[0]; if (data.parent_id && data.parent_id != null && data.parent_id != '') { parentNode = elements.groupDiv.tree('getNodeById', data.parent_id); } diff --git a/Web/scripts/calendar.js b/Web/scripts/calendar.js index 36b2ca29d..bb8c68653 100644 --- a/Web/scripts/calendar.js +++ b/Web/scripts/calendar.js @@ -394,7 +394,7 @@ function Calendar(opts) { var groupDiv = $('#resourceGroups'); groupDiv.tree({ - data: resourceGroups, + data: decodeNames(resourceGroups), saveState: 'resourceCalendar', onCreateLi: function (node, $li) { diff --git a/Web/scripts/phpscheduleit.js b/Web/scripts/phpscheduleit.js index c861fca88..f670f56c4 100644 --- a/Web/scripts/phpscheduleit.js +++ b/Web/scripts/phpscheduleit.js @@ -271,3 +271,16 @@ function fallbackCopyToClipboard(url) { } return succeeded; } + +// Names are stored entity-encoded (e.g. '); jqTree escapes again, so decode once to plain text. +// eslint-disable-next-line no-unused-vars -- Used by page scripts loaded separately. +function decodeNames(nodes) { + return _.map(nodes, function (n) { + const copy = _.extend({}, n); + _.each(['name', 'label'], function (k) { + if (typeof copy[k] === 'string') copy[k] = HtmlDecode(copy[k]); + }); + if (n.children) copy.children = decodeNames(n.children); + return copy; + }); +} diff --git a/Web/scripts/schedule.js b/Web/scripts/schedule.js index fc94eccef..b8dcba8ad 100644 --- a/Web/scripts/schedule.js +++ b/Web/scripts/schedule.js @@ -1232,18 +1232,6 @@ function RemoveGroupId(url) { return url.replace(/&*gid=\d+/i, ''); } -// Names are stored entity-encoded (e.g. '); jqTree escapes again, so decode once to plain text. -function decodeNames(nodes) { - return _.map(nodes, function (n) { - const copy = _.extend({}, n); - _.each(['name', 'label'], function (k) { - if (typeof copy[k] === 'string') copy[k] = HtmlDecode(copy[k]); - }); - if (n.children) copy.children = decodeNames(n.children); - return copy; - }); -} - function ChangeGroup(node) { var groupId = node.id; var $resourceGroups = $('#resourceGroups'); diff --git a/eslint.config.mjs b/eslint.config.mjs index 3221e70f0..3d07a0772 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -34,6 +34,7 @@ export default [ validateEmail: 'readonly', initializeAccordions: 'readonly', cookies: 'readonly', + decodeNames: 'readonly', // AJAX helpers (ajax-helpers.js) ajaxPost: 'readonly',