From f9c26ec47ea87214d9c68fe6eefb81da98f0f7d9 Mon Sep 17 00:00:00 2001 From: labmecanicatec Date: Mon, 12 Oct 2026 09:42:25 -0500 Subject: [PATCH 1/2] refactor(decodeNames): make function globally available Move decodeNames to phpscheduleit.js to make it globally available for reuse across components that use jqTree. --- Web/scripts/phpscheduleit.js | 13 +++++++++++++ Web/scripts/schedule.js | 12 ------------ eslint.config.mjs | 1 + 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Web/scripts/phpscheduleit.js b/Web/scripts/phpscheduleit.js index c861fca888..f670f56c4b 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 fc94eccefa..b8dcba8ad7 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 3221e70f03..3d07a07722 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', From ba07c16f424115ad2e1c71a4438dc8aea51a8b2f Mon Sep 17 00:00:00 2001 From: labmecanicatec Date: Mon, 12 Oct 2026 09:51:24 -0500 Subject: [PATCH 2/2] refactor(jqtree): use decodeNames in calendar and resource groups Use the globally available decodeNames function to decode tree node names and labels in calendar.js and resource-groups.js. --- Web/scripts/admin/resource-groups.js | 4 ++-- Web/scripts/calendar.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Web/scripts/admin/resource-groups.js b/Web/scripts/admin/resource-groups.js index 64fc5cba38..7333b0eb89 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 36b2ca29de..bb8c686534 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) {