From: Dominik Csapak <d.csapak@proxmox.com>
To: Thomas Lamprecht <t.lamprecht@proxmox.com>,
Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Subject: Re: [pve-devel] [PATCH manager 2/3] ui: add TreeSortingEdit window
Date: Thu, 2 Feb 2023 13:16:01 +0100 [thread overview]
Message-ID: <fab3b5d5-cb38-8f4e-80b2-5c40abe66a2e@proxmox.com> (raw)
In-Reply-To: <9cc78b17-4b9d-7710-2948-446b5d95d784@proxmox.com>
On 2/2/23 11:56, Thomas Lamprecht wrote:
> looks like going in the right direction and feasible, some comments inline
>
> high level: subject is using module name 1:1, as mentioned a few times please
> avoid that, for ~ 99.9% cases it's not useful, for sure not for d/changelog but
> not really for other devs in `git log` (sorting trees can mean widely different
> things), maybe:
>
> ui: add edit window for changing resource tree sort behavior
yes, sorry, for adding new widgets i still default in my head to just
adding the class name...
>
> And for the module/file name I maybe wouldn't imply that this is for sorting
> only, I could immagine that we expose other knobs for the tree behavior or
> visuals in the future (e.g., add more font-weight to names, or
yeah sure, does 'TreeSettingsEdit' (or 'TreeOptionsEdit') make sense?
>
> Am 01/02/2023 um 16:49 schrieb Dominik Csapak:
>> in cluster options (for datacenter.cfg) and besides the view selector
>> (for the browser local storage)
>
> I'd rather do it browser-local storage only, that way we can play a bit
> around possbly adding or changing knob (names) and once stable for a time
> and users are happy we can commit to adding this to datacenter config w
>
yeah sure
>>
>> 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 <d.csapak@proxmox.com>
>> ---
>> 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...
any commend on this?
>>
>> 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];
>
> a thought: why doesn't "PVE.UIOptions" real, i.e., a full fledged module that
> hosts the respective functions and state that now is (mostly?) in Utils?
there wasn't that much in there, but i agree it's own module does make more sense,
i'll do a refactor in a v2
>
>> }
>>
>> 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,
>
> is above a preparation of exposing this additonally in the Datacenter Options
> panel for configuring the backend config values, not the browser local ones?
>
> I'd probably favor doing that via two widgets, one deriving from the other - but
> if we only allow brwoser local storage as starter we'd need the differentation
> at all for now.
yeah i'm using that in the next patch to also expose it in the datacenter options
but i'll drop it for browser local storage only
>
>> +
>> + items: [
>> + {
>> + xtype: 'inputpanel',
>> + cbind: {},
>> + onSetValues: (values) => values?.['tree-sorting'] ?? {},
>> + onGetValues: function(values) {
>> + if (this.up('window').browserSettings) {
>> + let sp = Ext.state.Manager.getProvider();
>
> nit: would like to avoid very short abbreviations which could get confusing if
> this ever expands or gets used as template and copied.
>
> s/sp/stateProvider/ or maybe even s/sp/localStorage/
>
>> + let state = values ? values : null;
>> + sp.set('pve-tree-sorting', state);
>
> could drop intermediate variable
>
> sp.set('pve-tree-sorting', values || null);
>
>> + 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',
>
> please put xtype first
>
>> + fieldLabel: gettext('Sort Field'),
>> + labelWidth: 120,
>
> might want to but that in a defaults: {} config at inputpanel level
>
>> + comboItems: [
>> + ['__default__', Proxmox.Utils.defaultText],
>> + ['vmid', gettext('VMID')],
>
> do we really translate VMID, as in, is there a (updated in the last 12 months)
> translation that sets this to something different and sensible?
only arabic seems to translate VMID, and not even consistent
(it's VMID in some other arabic strings) so i think we would be fine to
drop that. we're not consitently using gettext for it anyway
>
>> + ['name', gettext('Name')],
>> + ],
>> + defaultValue: '__default__',
>> + value: '__default__',
>> + deleteEmpty: false,
>> + },
>> + {
>> + name: 'group-templates',
>> + xtype: 'booleanfield',
>
> please put xtype first
>
> besides that and unrelated to your series, this widget is a bit odd and as it
> has no pve/proxmox prefix (I initially thought it's a ExtJS one that I just
> never stumbled uppon) and should get renamed to something more telling like
> pmxBooleanComboBox, probably should move to widget toolkit too
sure
>
>> + fieldLabel: gettext('Group Templates'),
>> + defaultValue: '__default__',
>> + value: '__default__',
>> + deleteEmpty: false,
>> + labelWidth: 120,
>> + },
>> + {
>> + name: 'group-guest-types',
>> + xtype: 'booleanfield',
>
> please put xtype first
>
>> + 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 });
>> + },
>> + });
>> + },
>> +
>> +});
>
next prev parent reply other threads:[~2023-02-02 12:16 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-01 15:49 [pve-devel] [PATCH cluster/manager] fix #1408: ui: make tree sorting configurable Dominik Csapak
2023-02-01 15:49 ` [pve-devel] [PATCH cluster 1/1] datacenter config: add options for sorting the gui tree Dominik Csapak
2023-02-01 15:49 ` [pve-devel] [PATCH manager 1/3] ui: Utils: refactor refreshing the the resource store/tree Dominik Csapak
2023-02-02 10:22 ` Thomas Lamprecht
2023-02-01 15:49 ` [pve-devel] [PATCH manager 2/3] ui: add TreeSortingEdit window Dominik Csapak
2023-02-02 10:56 ` Thomas Lamprecht
2023-02-02 12:16 ` Dominik Csapak [this message]
2023-02-01 15:49 ` [pve-devel] [PATCH manager 3/3] fix #1408: ui: ResourceTree: sort the tree according to tree-sorting options Dominik Csapak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fab3b5d5-cb38-8f4e-80b2-5c40abe66a2e@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
--cc=t.lamprecht@proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox