[pve-devel] [PATCH v2 manager] Split CPU Model Selector into visual sections
Stefan Reiter
s.reiter at proxmox.com
Wed Sep 4 16:17:41 CEST 2019
Most of the code is adapted from KVComboBox, from which it inherited
before, with some generic code removed.
The templating code adds a header for every group transition it
encounters, thus providing support for arbitrary groups (e.g. custom
models in the future).
Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
---
v2: Give licensing rights of the Athlon series back to it's rightful owner AMD
(v1 had 'athlon' as Intel by mistake)
www/css/ext6-pve.css | 11 ++
www/manager6/form/CPUModelSelector.js | 151 ++++++++++++++++++++------
2 files changed, 128 insertions(+), 34 deletions(-)
diff --git a/www/css/ext6-pve.css b/www/css/ext6-pve.css
index 535f8e60..70582f53 100644
--- a/www/css/ext6-pve.css
+++ b/www/css/ext6-pve.css
@@ -631,3 +631,14 @@ table.osds td:first-of-type {
background-color: rgb(245, 245, 245);
color: #000;
}
+
+/* CPUModelSelector header & item style */
+.cpumodel-group-header {
+ padding: 4px 4px 4px 7px;
+ font-weight: bold;
+ border-bottom: 1px solid #ddd;
+}
+
+.cpumodel-item:not(:first-child) {
+ padding: 0 0 0 10px;
+}
diff --git a/www/manager6/form/CPUModelSelector.js b/www/manager6/form/CPUModelSelector.js
index 9eb5b0e9..6c620d0c 100644
--- a/www/manager6/form/CPUModelSelector.js
+++ b/www/manager6/form/CPUModelSelector.js
@@ -1,38 +1,121 @@
Ext.define('PVE.form.CPUModelSelector', {
- extend: 'Proxmox.form.KVComboBox',
+ extend: 'Ext.form.field.ComboBox',
alias: ['widget.CPUModelSelector'],
comboItems: [
- ['__default__', Proxmox.Utils.defaultText + ' (kvm64)'],
- ['486', '486'],
- ['athlon', 'athlon'],
- ['core2duo', 'core2duo'],
- ['coreduo', 'coreduo'],
- ['kvm32', 'kvm32'],
- ['kvm64', 'kvm64'],
- ['pentium', 'pentium'],
- ['pentium2', 'pentium2'],
- ['pentium3', 'pentium3'],
- ['phenom', 'phenom'],
- ['qemu32', 'qemu32'],
- ['qemu64', 'qemu64'],
- ['Conroe', 'Conroe'],
- ['Penryn', 'Penryn'],
- ['Nehalem', 'Nehalem'],
- ['Westmere', 'Westmere'],
- ['SandyBridge', 'SandyBridge'],
- ['IvyBridge', 'IvyBridge'],
- ['Haswell', 'Haswell'],
- ['Haswell-noTSX','Haswell-noTSX'],
- ['Broadwell', 'Broadwell'],
- ['Broadwell-noTSX','Broadwell-noTSX'],
- ['Skylake-Client','Skylake-Client'],
- ['Opteron_G1', 'Opteron_G1'],
- ['Opteron_G2', 'Opteron_G2'],
- ['Opteron_G3', 'Opteron_G3'],
- ['Opteron_G4', 'Opteron_G4'],
- ['Opteron_G5', 'Opteron_G5'],
- ['EPYC', 'EPYC'],
- ['host', 'host']
-
- ]
+ // default value has to be first!
+ [Proxmox.Utils.defaultText + ' (kvm64)', ''],
+
+ ['486', 'Intel'],
+ ['core2duo', 'Intel'],
+ ['coreduo', 'Intel'],
+ ['pentium', 'Intel'],
+ ['pentium2', 'Intel'],
+ ['pentium3', 'Intel'],
+ ['Conroe', 'Intel'],
+ ['Penryn', 'Intel'],
+ ['Nehalem', 'Intel'],
+ ['Westmere', 'Intel'],
+ ['SandyBridge', 'Intel'],
+ ['IvyBridge', 'Intel'],
+ ['Haswell', 'Intel'],
+ ['Haswell-noTSX', 'Intel'],
+ ['Broadwell', 'Intel'],
+ ['Broadwell-noTSX', 'Intel'],
+ ['Skylake-Client', 'Intel'],
+
+ ['athlon', 'AMD'],
+ ['phenom', 'AMD'],
+ ['Opteron_G1', 'AMD'],
+ ['Opteron_G2', 'AMD'],
+ ['Opteron_G3', 'AMD'],
+ ['Opteron_G4', 'AMD'],
+ ['Opteron_G5', 'AMD'],
+ ['EPYC', 'AMD'],
+
+ ['kvm32', 'Other'],
+ ['kvm64', 'Other'],
+ ['qemu32', 'Other'],
+ ['qemu64', 'Other'],
+ ['host', 'Other']
+ ],
+
+ queryMode: 'local',
+ displayField: 'key',
+ valueField: 'key',
+ editable: false,
+ tpl: Ext.create('Ext.XTemplate',
+ '{[this.currentKey = ""]}' +
+ '<tpl for=".">' +
+ '<tpl if="this.showHeader(value)">' +
+ '<div class="cpumodel-group-header">{value}</div>' +
+ '</tpl>' +
+ '<div class="x-boundlist-item cpumodel-item">{key}</div>' +
+ '</tpl>',
+ {
+ showHeader: function(key){
+ if (this.currentKey != key) {
+ this.currentKey = key;
+ return true;
+ }
+ return false;
+ }
+ }
+ ),
+
+ // overide framework function to allow "Default" value
+ getSubmitData: function() {
+ var me = this,
+ data = null,
+ val;
+
+ if (!me.disabled && me.submitValue) {
+ val = me.getSubmitValue();
+ data = {};
+ if (val !== null && val !== me.comboItems[0][0]) {
+ data[me.getName()] = val;
+ } else {
+ data['delete'] = me.getName();
+ }
+ }
+
+ return data;
+ },
+
+ validator: function(val) {
+ var me = this;
+
+ if (val === null || val === '') {
+ return false;
+ }
+
+ if (me.store.getCount() > 0) {
+ var items = me.store.getData().collect('key', 'data');
+ return Ext.Array.contains(items, val);
+ }
+
+ // should not happen
+ /*jslint confusion: true */
+ return "no valid values found";
+ },
+
+ initComponent: function() {
+ var me = this;
+
+ me.store = Ext.create('Ext.data.ArrayStore', {
+ model: 'KeyValue',
+ data: me.comboItems
+ });
+
+ me.callParent();
+ },
+
+ setValue: function(value) {
+ var me = this;
+
+ if (value === '__default__') {
+ value = me.comboItems[0][0];
+ }
+
+ me.callParent([value]);
+ }
});
--
2.20.1
More information about the pve-devel
mailing list