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 9FBCD915D1 for ; Mon, 14 Nov 2022 10:44:22 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 65FE72129A for ; Mon, 14 Nov 2022 10:44:22 +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 ; Mon, 14 Nov 2022 10:44:13 +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 DB6C743E03 for ; Mon, 14 Nov 2022 10:44:08 +0100 (CET) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Mon, 14 Nov 2022 10:43:59 +0100 Message-Id: <20221114094404.1241050-16-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221114094404.1241050-1-d.csapak@proxmox.com> References: <20221114094404.1241050-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: =?UTF-8?Q?0=0A=09?=AWL 0.065 Adjusted score from AWL reputation of From: =?UTF-8?Q?address=0A=09?=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 =?UTF-8?Q?Alignment=0A=09?=SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF =?UTF-8?Q?Record=0A=09?=SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager v9 07/12] ui: dc/OptionView: add editors for tag settings 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: Mon, 14 Nov 2022 09:44:22 -0000 namely for 'tag-style' (shape & colors), 'user-tag-acces', and 'privileged tags'. display the tag overrides directly as they will appear as tags Signed-off-by: Dominik Csapak --- changes for v www/manager6/Utils.js | 20 ++++ www/manager6/dc/OptionView.js | 200 ++++++++++++++++++++++++++++++++++ 2 files changed, 220 insertions(+) diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js index 2f8cdec77..f0748762c 100644 --- a/www/manager6/Utils.js +++ b/www/manager6/Utils.js @@ -1923,6 +1923,26 @@ Ext.define('PVE.Utils', { Ext.ComponentQuery.query('pveResourceTree')[0].setUserCls(`proxmox-tags-${style}`); }, + tagTreeStyles: { + '__default__': Proxmox.Utils.defaultText, + 'full': gettext('Full'), + 'circle': gettext('Circle'), + 'dense': gettext('Dense'), + 'none': Proxmox.Utils.NoneText, + }, + + renderTags: function(tagstext, overrides) { + let text = ''; + if (tagstext) { + let tags = (tagstext.split(/[,; ]/) || []).filter(t => !!t); + text += ' '; + tags.forEach((tag) => { + text += Proxmox.Utils.getTagElement(tag, overrides); + }); + } + return text; + }, + tagCharRegex: /^[a-z0-9+_.-]$/i, }, diff --git a/www/manager6/dc/OptionView.js b/www/manager6/dc/OptionView.js index ff96351d5..4b158107d 100644 --- a/www/manager6/dc/OptionView.js +++ b/www/manager6/dc/OptionView.js @@ -5,6 +5,7 @@ Ext.define('PVE.dc.OptionView', { onlineHelp: 'datacenter_configuration_file', monStoreErrors: true, + userCls: 'proxmox-tags-full', add_inputpanel_row: function(name, text, opts) { var me = this; @@ -312,6 +313,202 @@ Ext.define('PVE.dc.OptionView', { submitValue: true, }], }); + me.rows['tag-style'] = { + required: true, + renderer: (value) => { + if (value === undefined) { + return gettext('No Overrides'); + } + let colors = PVE.Utils.parseTagOverrides(value?.['color-map']); + let shape = value.shape; + let shapeText = PVE.Utils.tagTreeStyles[shape] ?? Proxmox.Utils.defaultText; + let txt = Ext.String.format(gettext("Tree Shape: {0}"), shapeText); + if (Object.keys(colors).length > 0) { + txt += ', '; + } + for (const tag of Object.keys(colors)) { + txt += Proxmox.Utils.getTagElement(tag, colors); + } + return txt; + }, + header: gettext('Tag Style Override'), + editor: { + xtype: 'proxmoxWindowEdit', + width: 800, + subject: gettext('Tag Color Override'), + onlineHelp: 'datacenter_configuration_file', + fieldDefaults: { + labelWidth: 100, + }, + url: '/api2/extjs/cluster/options', + items: [ + { + xtype: 'inputpanel', + setValues: function(values) { + if (values === undefined) { + return undefined; + } + values = values?.['tag-style'] ?? {}; + values.shape = values.shape || '__default__'; + values.colors = values['color-map']; + return Proxmox.panel.InputPanel.prototype.setValues.call(this, values); + }, + onGetValues: function(values) { + let style = {}; + if (values.colors) { + style['color-map'] = values.colors; + } + if (values.shape) { + style.shape = values.shape; + } + let value = PVE.Parser.printPropertyString(style); + if (value === '') { + return { + 'delete': 'tag-style', + }; + } + return { + 'tag-style': value, + }; + }, + items: [ + { + name: 'shape', + xtype: 'proxmoxKVComboBox', + fieldLabel: gettext('Tree Shape'), + comboItems: Object.entries(PVE.Utils.tagTreeStyles), + defaultValue: '__default__', + deleteEmpty: true, + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Color Overrides'), + }, + { + name: 'colors', + xtype: 'pveTagColorGrid', + deleteEmpty: true, + height: 300, + }, + ], + }, + ], + }, + }; + + me.rows['user-tag-access'] = { + required: true, + renderer: (value) => { + if (value === undefined) { + return Ext.String.format(gettext('Mode: {0}'), 'free'); + } + let mode = value?.['user-allow'] ?? 'free'; + let list = value?.['user-allow-list'].join(','); + let modeTxt = Ext.String.format(gettext('Mode {0}'), mode); + let overrides = PVE.Utils.tagOverrides; + let tags = PVE.Utils.renderTags(list, overrides); + + return `${modeTxt}, ${gettext('Pre-defined:')} ${tags}`; + }, + header: gettext('User Tag Access'), + editor: { + xtype: 'proxmoxWindowEdit', + subject: gettext('User Tag Access'), + onlineHelp: 'datacenter_configuration_file', + url: '/api2/extjs/cluster/options', + items: [ + { + xtype: 'inputpanel', + setValues: function(values) { + let data = values?.['user-tag-access'] ?? {}; + console.log(data); + return Proxmox.panel.InputPanel.prototype.setValues.call(this, data); + }, + onGetValues: function(values) { + if (values === undefined || Object.keys(values).length === 0) { + return { 'delete': name }; + } + return { + 'user-tag-access': PVE.Parser.printPropertyString(values), + }; + }, + items: [ + { + name: 'user-allow', + fieldLabel: gettext('Mode'), + xtype: 'proxmoxKVComboBox', + deleteEmpty: false, + value: '__default__', + comboItems: [ + ['__default__', Proxmox.Utils.defaultText + ' (free)'], + ['free', 'free'], + ['existing', 'existing'], + ['list', 'list'], + ['none', 'none'], + ], + defaultValue: '__default__', + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Predefined Tags'), + }, + { + name: 'user-allow-list', + xtype: 'pveListField', + emptyText: gettext('No Tags defined'), + fieldTitle: gettext('Tag'), + maskRe: PVE.Utils.tagCharRegex, + height: 200, + scrollable: true, + }, + ], + }, + ], + }, + }; + + me.rows['privileged-tags'] = { + required: true, + renderer: (value) => { + if (value === undefined) { + return gettext('No Privilged Tags'); + } + let overrides = PVE.Utils.tagOverrides; + return PVE.Utils.renderTags(value.join(','), overrides); + }, + header: gettext('Privileged Tags'), + editor: { + xtype: 'proxmoxWindowEdit', + subject: gettext('Privileged Tags'), + onlineHelp: 'datacenter_configuration_file', + url: '/api2/extjs/cluster/options', + items: [ + { + xtype: 'inputpanel', + setValues: function(values) { + let tags = values?.['privileged-tags'] ?? ''; + return Proxmox.panel.InputPanel.prototype.setValues.call(this, { tags }); + }, + onGetValues: function(values) { + return { + 'privileged-tags': values, + }; + }, + items: [ + { + name: 'tags', + xtype: 'pveListField', + emptyText: gettext('No Tags defined'), + fieldTitle: gettext('Tag'), + maskRe: PVE.Utils.tagCharRegex, + height: 200, + scrollable: true, + }, + ], + }, + ], + }, + }; me.selModel = Ext.create('Ext.selection.RowModel', {}); @@ -347,6 +544,9 @@ Ext.define('PVE.dc.OptionView', { if (rec.data.value === '__default__') { delete PVE.UIOptions.console; } + + let tagStyle = store.getById('tag-style')?.data?.value; + PVE.Utils.updateTagSettings(tagStyle?.['color-map'], tagStyle?.shape); }); me.on('activate', me.rstore.startUpdate); -- 2.30.2