this provides a basic grid to edit a list of tag color overrides.
We'll use this for editing the datacenter.cfg overrides and the
browser storage overrides.

Signed-off-by: Dominik Csapak <d.csa...@proxmox.com>
---
 www/manager6/Makefile             |   1 +
 www/manager6/form/TagColorGrid.js | 218 ++++++++++++++++++++++++++++++
 2 files changed, 219 insertions(+)
 create mode 100644 www/manager6/form/TagColorGrid.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index e6e01bd1..225dffba 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -73,6 +73,7 @@ JSSRC=                                                        
\
        form/VNCKeyboardSelector.js                     \
        form/ViewSelector.js                            \
        form/iScsiProviderSelector.js                   \
+       form/TagColorGrid.js                            \
        grid/BackupView.js                              \
        grid/FirewallAliases.js                         \
        grid/FirewallOptions.js                         \
diff --git a/www/manager6/form/TagColorGrid.js 
b/www/manager6/form/TagColorGrid.js
new file mode 100644
index 00000000..bd8e539e
--- /dev/null
+++ b/www/manager6/form/TagColorGrid.js
@@ -0,0 +1,218 @@
+Ext.define('PVE.form.ColorPicker', {
+    extend: 'Ext.Component',
+    alias: 'widget.pveColorPicker',
+
+    defaultBindProperty: 'value',
+
+    config: {
+       value: null,
+    },
+
+    height: 15,
+    maxHeight: 15,
+
+    getValue: function() {
+       return this.realvalue.slice(1);
+    },
+
+    setValue: function(value = "000000") {
+       let me = this;
+       me.picker.value = value[0] !== '#' ? `#${value}` : value;
+       me.setColor(value);
+    },
+
+    setColor: function(value = "000000") {
+       let me = this;
+       let oldValue = me.realvalue;
+       me.realvalue = value;
+       me.setStyle('background-color', `#${value}`);
+       me.fireEvent('change', me, me.realvalue, oldValue);
+    },
+
+    initComponent: function() {
+       let me = this;
+       me.picker = document.createElement('input');
+       me.picker.type = 'color';
+       me.picker.style = `opacity: 0; border: 0px; width: 100%; height: 
${me.height}px`;
+       me.picker.value = `${me.value}`;
+       me.contentEl = me.picker;
+
+       me.callParent();
+       me.picker.oninput = function() {
+           me.setColor(me.picker.value);
+       };
+    },
+});
+
+Ext.define('PVE.form.TagColorGrid', {
+    extend: 'Ext.grid.Panel',
+    alias: 'widget.pveTagColorGrid',
+
+    mixins: [
+       'Ext.form.field.Field',
+    ],
+
+    allowBlank: true,
+    selectAll: false,
+    isFormField: true,
+    deleteEmpty: false,
+    selModel: 'checkboxmodel',
+
+    config: {
+       deleteEmpty: false,
+    },
+
+    emptyText: gettext('No Overrides'),
+    viewConfig: {
+       deferEmptyText: false,
+    },
+
+    setValue: function(value) {
+       let me = this;
+       if (!value) {
+           me.getStore().removeAll();
+           me.checkChange();
+           return me;
+       }
+       let entries = (value.split(/[;, ]/) || []).map((entry) => {
+           let [tag, color] = entry.split(/[=]/);
+           return {
+               tag,
+               color,
+           };
+       });
+       me.getStore().setData(entries);
+       me.checkChange();
+       return me;
+    },
+
+    getValue: function() {
+       let me = this;
+       let values = [];
+       me.getStore().each((rec) => {
+           if (rec.data.tag) {
+               values.push(`${rec.data.tag}=${rec.data.color}`);
+           }
+       });
+       return values.join(',');
+    },
+
+    getErrors: function(value) {
+       return [];
+    },
+
+    // override framework function to implement deleteEmpty behaviour
+    getSubmitData: function() {
+       let me = this,
+           data = null,
+           val;
+       if (!me.disabled && me.submitValue) {
+           val = me.getValue();
+           if (val !== null && val !== '') {
+               data = {};
+               data[me.getName()] = val;
+           } else if (me.getDeleteEmpty()) {
+               data = {};
+               data.delete = me.getName();
+           }
+       }
+       return data;
+    },
+
+
+    controller: {
+       xclass: 'Ext.app.ViewController',
+
+       addLine: function() {
+           let me = this;
+           me.getView().getStore().add({});
+       },
+
+       removeSelection: function() {
+           let me = this;
+           let view = me.getView();
+           let selection = view.getSelection();
+           if (selection === undefined) {
+               return;
+           }
+
+           selection.forEach((sel) => {
+               view.getStore().remove(sel);
+           });
+           view.checkChange();
+       },
+
+       fieldChange: function(field, newValue, oldValue) {
+           let me = this;
+           let view = me.getView();
+           let rec = field.getWidgetRecord();
+           let column = field.getWidgetColumn();
+           rec.set(column.dataIndex, newValue);
+           view.checkChange();
+       },
+    },
+
+    tbar: [
+       {
+           text: gettext('Add'),
+           handler: 'addLine',
+       },
+       {
+           xtype: 'proxmoxButton',
+           text: gettext('Remove'),
+           handler: 'removeSelection',
+           disabled: true,
+       },
+    ],
+
+    columns: [
+       {
+           header: 'Tag',
+           dataIndex: 'tag',
+           xtype: 'widgetcolumn',
+           onWidgetAttach: function(col, widget, rec) {
+               widget.getStore().setData(PVE.Utils.getTagList().map(v => ({ 
tag: v })));
+           },
+           widget: {
+               xtype: 'combobox',
+               isFormField: false,
+               maskRe: /[a-zA-Z0-9_.-]/,
+               queryMode: 'local',
+               displayField: 'tag',
+               valueField: 'tag',
+               store: {},
+               listeners: {
+                   change: 'fieldChange',
+               },
+           },
+           flex: 1,
+       },
+       {
+           header: "Color",
+           xtype: 'widgetcolumn',
+           flex: 1,
+           dataIndex: 'color',
+           widget: {
+               xtype: 'pveColorPicker',
+               isFormField: false,
+               listeners: {
+                   change: 'fieldChange',
+               },
+           },
+       },
+    ],
+
+    store: {
+       listeners: {
+           update: function() {
+               this.commitChanges();
+           },
+       },
+    },
+
+    initComponent: function() {
+       let me = this;
+       me.callParent();
+       me.initField();
+    },
+});
-- 
2.30.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to