From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 7F59891566 for ; Wed, 1 Feb 2023 16:49:20 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 585082CAD for ; Wed, 1 Feb 2023 16:49:20 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Wed, 1 Feb 2023 16:49:19 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 174E945A7A for ; Wed, 1 Feb 2023 16:49:19 +0100 (CET) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Wed, 1 Feb 2023 16:49:16 +0100 Message-Id: <20230201154917.1632212-4-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230201154917.1632212-1-d.csapak@proxmox.com> References: <20230201154917.1632212-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.062 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager 2/3] ui: add TreeSortingEdit window X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Feb 2023 15:49:20 -0000 in cluster options (for datacenter.cfg) and besides the view selector (for the browser local storage) the edit window is the same for bot but either makes an api call or saves the resulting values into the browser local storage. Signed-off-by: Dominik Csapak --- not sure about just showing 'Default' for the options in both cases. I could make the text different for the datacenter options (there it's fixed) and make the text dynamic for the browser local storage, but it does not seem worth it really... could also always show the inherent defaults, but that would be wrong for the local storage when something is set in the datacenter config... www/manager6/Makefile | 1 + www/manager6/Utils.js | 2 +- www/manager6/Workspace.js | 27 +++++- www/manager6/dc/OptionView.js | 10 +++ www/manager6/window/TreeSortingEdit.js | 113 +++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 www/manager6/window/TreeSortingEdit.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index 05afeda40..157d4da52 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -119,6 +119,7 @@ JSSRC= \ window/ScheduleSimulator.js \ window/Wizard.js \ window/GuestDiskReassign.js \ + window/TreeSortingEdit.js \ ha/Fencing.js \ ha/GroupEdit.js \ ha/GroupSelector.js \ diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js index ee9e4bd5d..0c57e0844 100644 --- a/www/manager6/Utils.js +++ b/www/manager6/Utils.js @@ -1865,7 +1865,7 @@ Ext.define('PVE.Utils', { PVE.UIOptions = { 'allowed-tags': [], }; - for (const option of ['allowed-tags', 'console', 'tag-style']) { + for (const option of ['allowed-tags', 'console', 'tag-style', 'tree-sorting']) { PVE.UIOptions[option] = response?.result?.data?.[option]; } diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js index d0f7ff760..1963dc3f2 100644 --- a/www/manager6/Workspace.js +++ b/www/manager6/Workspace.js @@ -223,7 +223,9 @@ Ext.define('PVE.StdWorkspace', { let appState = Ext.create('PVE.StateProvider'); Ext.state.Manager.setProvider(appState); - let selview = Ext.create('PVE.form.ViewSelector'); + let selview = Ext.create('PVE.form.ViewSelector', { + flex: 1, + }); let rtree = Ext.createWidget('pveResourceTree', { viewFilter: selview.getViewFilter(), @@ -449,7 +451,28 @@ Ext.define('PVE.StdWorkspace', { margin: '0 0 0 5', split: true, width: 300, - items: [selview, rtree], + items: [ + { + xtype: 'container', + layout: 'hbox', + padding: '0 0 5 0', + items: [ + selview, + { + xtype: 'button', + iconCls: 'fa fa-fw fa-gear', + handler: () => { + Ext.create('PVE.window.TreeSortingEdit', { + autoShow: true, + browserSettings: true, + apiCallDone: () => PVE.Utils.fireUIUpdate(), + }); + }, + }, + ], + }, + rtree, + ], listeners: { resize: function(panel, width, height) { var viewWidth = me.getSize().width; diff --git a/www/manager6/dc/OptionView.js b/www/manager6/dc/OptionView.js index 2e4f76263..0f5eaa680 100644 --- a/www/manager6/dc/OptionView.js +++ b/www/manager6/dc/OptionView.js @@ -529,6 +529,15 @@ Ext.define('PVE.dc.OptionView', { }, }; + me.rows['tree-sorting'] = { + required: true, + renderer: (value) => value ? PVE.Parser.printPropertyString(value) : gettext('No sorting overrides'), + header: gettext('Tree Sorting'), + editor: { + xtype: 'pveTreeSortingEdit', + }, + }; + me.selModel = Ext.create('Ext.selection.RowModel', {}); Ext.apply(me, { @@ -565,6 +574,7 @@ Ext.define('PVE.dc.OptionView', { } PVE.UIOptions['tag-style'] = store.getById('tag-style')?.data?.value; + PVE.UIOptions['tree-sorting'] = store.getById('tree-sorting')?.data?.value; PVE.Utils.updateTagSettings(PVE.UIOptions['tag-style']); PVE.Utils.fireUIUpdate(); }); diff --git a/www/manager6/window/TreeSortingEdit.js b/www/manager6/window/TreeSortingEdit.js new file mode 100644 index 000000000..eff7f3f21 --- /dev/null +++ b/www/manager6/window/TreeSortingEdit.js @@ -0,0 +1,113 @@ +Ext.define('PVE.window.TreeSortingEdit', { + extend: 'Proxmox.window.Edit', + alias: 'widget.pveTreeSortingEdit', + mixins: ['Proxmox.Mixin.CBind'], + + title: gettext('Tree Sorting'), + + isCreate: false, + + url: '/cluster/options', + + browserSettings: false, + + items: [ + { + xtype: 'inputpanel', + cbind: {}, + onSetValues: (values) => values?.['tree-sorting'] ?? {}, + onGetValues: function(values) { + if (this.up('window').browserSettings) { + let sp = Ext.state.Manager.getProvider(); + let state = values ? values : null; + sp.set('pve-tree-sorting', state); + return {}; + } + PVE.Utils.delete_if_default(values, 'group-templates', "1"); + PVE.Utils.delete_if_default(values, 'group-guest-types', "1"); + // no delete in property strings + delete values.delete; + + let value = PVE.Parser.printPropertyString(values); + + if (value === '') { + return { 'delete': 'tree-sorting' }; + } + return { 'tree-sorting': value }; + }, + items: [ + { + name: 'sort-field', + xtype: 'proxmoxKVComboBox', + fieldLabel: gettext('Sort Field'), + labelWidth: 120, + comboItems: [ + ['__default__', Proxmox.Utils.defaultText], + ['vmid', gettext('VMID')], + ['name', gettext('Name')], + ], + defaultValue: '__default__', + value: '__default__', + deleteEmpty: false, + }, + { + name: 'group-templates', + xtype: 'booleanfield', + fieldLabel: gettext('Group Templates'), + defaultValue: '__default__', + value: '__default__', + deleteEmpty: false, + labelWidth: 120, + }, + { + name: 'group-guest-types', + xtype: 'booleanfield', + fieldLabel: gettext('Group Types'), + defaultValue: '__default__', + value: '__default__', + deleteEmpty: false, + labelWidth: 120, + }, + { + xtype: 'displayfield', + userCls: 'pmx-hint', + value: gettext('Settings are saved in the browser local storage'), + hidden: true, + cbind: { + hidden: '{!browserSettings}', + }, + } + ], + }, + ], + + submit: function() { + let me = this; + + if (me.browserSettings) { + me.down('inputpanel').getValues(); + me.apiCallDone(); + me.close(); + } else { + me.callParent(); + } + }, + + initComponent: function() { + let me = this; + + me.callParent(); + + me.load({ + success: function(response) { + let values = response?.result?.data?.['tree-sorting'] ?? {}; + if (me.browserSettings) { + let sp = Ext.state.Manager.getProvider(); + values = sp.get('pve-tree-sorting'); + } + me.down('inputpanel').setValues({ 'tree-sorting': values }); + }, + }); + }, + +}); -- 2.30.2