[pve-devel] [PATCH manager] fix #7191: ui: correctly sort TFA column in DC/Permission/Users

Dominik Csapak d.csapak at proxmox.com
Fri Jan 9 10:35:07 CET 2026


ExtJS does not sort this column correctly since the field is not defined
in our 'pmx-users' model, so it ignores it when sorting.

Add the keys field to the model definition. This enables sorting, but
does not take into account the additional info we use when rendering the
column.

To do that, use the rendered values as strings to sort them.

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 www/manager6/Utils.js             | 25 +++++++++++++++++++++++++
 www/manager6/dc/UserView.js       | 28 +++++-----------------------
 www/manager6/form/UserSelector.js |  1 +
 3 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index 0e0751e7..fee252e6 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -1363,6 +1363,31 @@ Ext.define('PVE.Utils', {
             return retVal.length < 1 ? value : retVal;
         },
 
+        render_tfa: function (v, _mD, record) {
+            let tfa_type = PVE.Parser.parseTfaType(v);
+            if (tfa_type === undefined) {
+                return Proxmox.Utils.noText;
+            }
+
+            if (tfa_type !== 1) {
+                return tfa_type;
+            }
+
+            let locked_until = record.data['tfa-locked-until'];
+            if (locked_until !== undefined) {
+                let now = new Date().getTime() / 1000;
+                if (locked_until > now) {
+                    return gettext('Locked');
+                }
+            }
+
+            if (record.data['totp-locked']) {
+                return gettext('TOTP Locked');
+            }
+
+            return Proxmox.Utils.yesText;
+        },
+
         windowHostname: function () {
             return window.location.hostname.replace(
                 Proxmox.Utils.IP6_bracket_match,
diff --git a/www/manager6/dc/UserView.js b/www/manager6/dc/UserView.js
index 9d33a5bf..279ed5fb 100644
--- a/www/manager6/dc/UserView.js
+++ b/www/manager6/dc/UserView.js
@@ -209,29 +209,11 @@ Ext.define('PVE.dc.UserView', {
                     header: 'TFA',
                     width: 120,
                     sortable: true,
-                    renderer: function (v, metaData, record) {
-                        let tfa_type = PVE.Parser.parseTfaType(v);
-                        if (tfa_type === undefined) {
-                            return Proxmox.Utils.noText;
-                        }
-
-                        if (tfa_type !== 1) {
-                            return tfa_type;
-                        }
-
-                        let locked_until = record.data['tfa-locked-until'];
-                        if (locked_until !== undefined) {
-                            let now = new Date().getTime() / 1000;
-                            if (locked_until > now) {
-                                return gettext('Locked');
-                            }
-                        }
-
-                        if (record.data['totp-locked']) {
-                            return gettext('TOTP Locked');
-                        }
-
-                        return Proxmox.Utils.yesText;
+                    renderer: PVE.Utils.render_tfa,
+                    sorter: function (a, b) {
+                        let a_text = PVE.Utils.render_tfa(a.data.keys, undefined, a);
+                        let b_text = PVE.Utils.render_tfa(b.data.keys, undefined, b);
+                        return a_text.toString().localeCompare(b_text.toString());
                     },
                     dataIndex: 'keys',
                 },
diff --git a/www/manager6/form/UserSelector.js b/www/manager6/form/UserSelector.js
index f0bf6579..d49cce03 100644
--- a/www/manager6/form/UserSelector.js
+++ b/www/manager6/form/UserSelector.js
@@ -8,6 +8,7 @@ Ext.define('pmx-users', {
         'comment',
         { type: 'boolean', name: 'enable' },
         { type: 'date', dateFormat: 'timestamp', name: 'expire' },
+        { type: 'string', name: 'keys' },
     ],
     proxy: {
         type: 'proxmox',
-- 
2.47.3





More information about the pve-devel mailing list