From 9f666741b218d9032f7ea723ba50a02b66d38898 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 19 Oct 2023 23:42:13 +0200 Subject: [PATCH] luci-base: ui.js: sorting fixes for tables initialized from markup - Populate id option from table id attribute - Update column head sort indicator in UITable.update() - Don't store sort state for tables without id Ref: https://github.com/openwrt/luci/issues/6640 Signed-off-by: Jo-Philipp Wich (cherry picked from commit ee6a4da00b70949eccb5a0a7b69d2c5b98ef1f89) --- .../htdocs/luci-static/resources/ui.js | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js index 9ecadb0cf8..b35a51ce64 100644 --- a/modules/luci-base/htdocs/luci-static/resources/ui.js +++ b/modules/luci-base/htdocs/luci-static/resources/ui.js @@ -3232,6 +3232,17 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (!Array.isArray(data)) return; + this.data = data; + this.placeholder = placeholder; + + var n = 0, + rows = this.node.querySelectorAll('tr, .tr'), + trows = [], + headings = [].slice.call(this.node.firstElementChild.querySelectorAll('th, .th')), + captionClasses = this.options.captionClasses, + trTag = (rows[0] && rows[0].nodeName == 'DIV') ? 'div' : 'tr', + tdTag = (headings[0] && headings[0].nodeName == 'DIV') ? 'div' : 'td'; + if (sorting) { var list = data.map(L.bind(function(row) { return [ this.deriveSortKey(row[sorting[0]], sorting[0]), row ]; @@ -3248,18 +3259,14 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { list.forEach(function(item) { data.push(item[1]); }); - } - this.data = data; - this.placeholder = placeholder; - - var n = 0, - rows = this.node.querySelectorAll('tr, .tr'), - trows = [], - headings = [].slice.call(this.node.firstElementChild.querySelectorAll('th, .th')), - captionClasses = this.options.captionClasses, - trTag = (rows[0] && rows[0].nodeName == 'DIV') ? 'div' : 'tr', - tdTag = (headings[0] && headings[0].nodeName == 'DIV') ? 'div' : 'td'; + headings.forEach(function(th, i) { + if (i == sorting[0]) + th.setAttribute('data-sort-direction', sorting[1] ? 'desc' : 'asc'); + else + th.removeAttribute('data-sort-direction'); + }); + } data.forEach(function(row) { trows[n] = E(trTag, { 'class': 'tr' }); @@ -3323,6 +3330,7 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (!headrow) return; + options.id = node.id; options.classes = [].slice.call(node.classList).filter(function(c) { return c != 'table' }); options.sortable = []; options.captionClasses = []; @@ -3421,8 +3429,11 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (this.sortState) return this.sortState; + if (!this.options.id) + return null; + var page = document.body.getAttribute('data-page'), - key = page + '.' + this.id, + key = page + '.' + this.options.id, state = session.getLocalData('tablesort'); if (L.isObject(state) && Array.isArray(state[key])) @@ -3439,7 +3450,7 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { return; var page = document.body.getAttribute('data-page'), - key = page + '.' + this.id, + key = page + '.' + this.options.id, state = session.getLocalData('tablesort'); if (!L.isObject(state)) @@ -3455,19 +3466,15 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (!ev.target.matches('th[data-sortable-row]')) return; - var th = ev.target, - direction = (th.getAttribute('data-sort-direction') == 'asc'), - index = 0; + var index, direction; - this.node.firstElementChild.querySelectorAll('th').forEach(function(other_th, i) { - if (other_th !== th) - other_th.removeAttribute('data-sort-direction'); - else + this.node.firstElementChild.querySelectorAll('th, .th').forEach(function(th, i) { + if (th === ev.target) { index = i; + direction = th.getAttribute('data-sort-direction') == 'asc'; + } }); - th.setAttribute('data-sort-direction', direction ? 'desc' : 'asc'); - this.setActiveSortState(index, direction); this.update(this.data, this.placeholder); } -- 2.30.2