ui: grid/Resources: eslint fixes and code cleanup/refactoring

this is a major cleanup, using the current ExtJS and ES2018 features
allows to do a lot more concise and nicer.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2021-05-18 18:00:42 +02:00
parent c1802413d9
commit f79de80378

View File

@ -8,61 +8,45 @@ Ext.define('PVE.grid.ResourceGrid', {
direction: 'ASC', direction: 'ASC',
}, },
initComponent: function() { initComponent: function() {
var me = this; let me = this;
var rstore = PVE.data.ResourceStore; let rstore = PVE.data.ResourceStore;
var sp = Ext.state.Manager.getProvider();
var coldef = rstore.defaultColumns(); let store = Ext.create('Ext.data.Store', {
var store = Ext.create('Ext.data.Store', {
model: 'PVEResources', model: 'PVEResources',
sorters: me.defaultSorter, sorters: me.defaultSorter,
proxy: { type: 'memory' }, proxy: {
type: 'memory',
},
}); });
var textfilter = ''; let textfilter = '';
let textfilterMatch = function(item) {
var textfilter_match = function(item) { for (const field of ['name', 'storage', 'node', 'type', 'text']) {
var match = false; let v = item.data[field];
Ext.each(['name', 'storage', 'node', 'type', 'text'], function(field) { if (v && v.toLowerCase().indexOf(textfilter) >= 0) {
var v = item.data[field]; return true;
if (v !== undefined) { }
v = v.toLowerCase(); }
if (v.indexOf(textfilter) >= 0) {
match = true;
return false; return false;
}
}
});
return match;
}; };
var updateGrid = function() { let updateGrid = function() {
var filterfn = me.viewFilter ? me.viewFilter.filterfn : null; var filterfn = me.viewFilter ? me.viewFilter.filterfn : null;
//console.log("START GRID UPDATE " + me.viewFilter);
store.suspendEvents(); store.suspendEvents();
var nodeidx = {}; let nodeidx = {};
var gather_child_nodes = function(cn) { let gather_child_nodes;
if (!cn) { gather_child_nodes = function(node) {
if (!node || !node.childNodes) {
return; return;
} }
var cs = cn.childNodes; for (let child of node.childNodes) {
if (!cs) { let orgNode = rstore.data.get(child.data.id);
return; if (orgNode) {
} if ((!filterfn || filterfn(child)) && (!textfilter || textfilterMatch(child))) {
var len = cs.length, i = 0, n, res; nodeidx[child.data.id] = orgNode;
for (; i < len; i++) {
var child = cs[i];
var orgnode = rstore.data.get(child.data.id);
if (orgnode) {
if ((!filterfn || filterfn(child)) &&
(!textfilter || textfilter_match(child))) {
nodeidx[child.data.id] = orgnode;
} }
} }
gather_child_nodes(child); gather_child_nodes(child);
@ -71,47 +55,29 @@ Ext.define('PVE.grid.ResourceGrid', {
gather_child_nodes(me.pveSelNode); gather_child_nodes(me.pveSelNode);
// remove vanished items // remove vanished items
var rmlist = []; let rmlist = [];
store.each(function(olditem) { store.each(olditem => {
var item = nodeidx[olditem.data.id]; if (!nodeidx[olditem.data.id]) {
if (!item) {
//console.log("GRID REM UID: " + olditem.data.id);
rmlist.push(olditem); rmlist.push(olditem);
} }
}); });
if (rmlist.length) { if (rmlist.length) {
store.remove(rmlist); store.remove(rmlist);
} }
// add new items // add new items
var addlist = []; let addlist = [];
var key; for (const [_key, item] of Object.entries(nodeidx)) {
for (key in nodeidx) {
if (nodeidx.hasOwnProperty(key)) {
var item = nodeidx[key];
// getById() use find(), which is slow (ExtJS4 DP5) // getById() use find(), which is slow (ExtJS4 DP5)
//var olditem = store.getById(item.data.id); let olditem = store.data.get(item.data.id);
var olditem = store.data.get(item.data.id);
if (!olditem) { if (!olditem) {
//console.log("GRID ADD UID: " + item.data.id);
var info = Ext.apply({}, item.data);
var child = Ext.create(store.model, info);
addlist.push(item); addlist.push(item);
continue; continue;
} }
// try to detect changes let changes = false;
var changes = false; for (let field of PVE.data.ResourceStore.fieldNames) {
var fieldkeys = PVE.data.ResourceStore.fieldNames; if (field !== 'id' && item.data[field] !== olditem.data[field]) {
var fieldcount = fieldkeys.length;
var fieldind;
for (fieldind = 0; fieldind < fieldcount; fieldind++) {
var field = fieldkeys[fieldind];
if (field != 'id' && item.data[field] != olditem.data[field]) {
changes = true; changes = true;
//console.log("changed item " + item.id + " " + field + " " + item.data[field] + " != " + olditem.data[field]);
olditem.beginEdit(); olditem.beginEdit();
olditem.set(field, item.data[field]); olditem.set(field, item.data[field]);
} }
@ -121,27 +87,12 @@ Ext.define('PVE.grid.ResourceGrid', {
olditem.commit(true); olditem.commit(true);
} }
} }
}
if (addlist.length) { if (addlist.length) {
store.add(addlist); store.add(addlist);
} }
store.sort(); store.sort();
store.resumeEvents(); store.resumeEvents();
store.fireEvent('refresh', store); store.fireEvent('refresh', store);
//console.log("END GRID UPDATE");
};
var filter_task = new Ext.util.DelayedTask(function() {
updateGrid();
});
var load_cb = function() {
updateGrid();
}; };
Ext.apply(me, { Ext.apply(me, {
@ -157,10 +108,10 @@ Ext.define('PVE.grid.ResourceGrid', {
value: textfilter, value: textfilter,
enableKeyEvents: true, enableKeyEvents: true,
listeners: { listeners: {
buffer: 500,
keyup: function(field, e) { keyup: function(field, e) {
var v = field.getValue(); textfilter = field.getValue().toLowerCase();
textfilter = v.toLowerCase(); updateGrid();
filter_task.delay(500);
}, },
}, },
}, },
@ -175,13 +126,13 @@ Ext.define('PVE.grid.ResourceGrid', {
ws.selectById(record.data.id); ws.selectById(record.data.id);
}, },
destroy: function() { destroy: function() {
rstore.un("load", load_cb); rstore.un("load", () => updateGrid());
}, },
}, },
columns: coldef, columns: rstore.defaultColumns(),
}); });
me.callParent(); me.callParent();
updateGrid(); updateGrid();
rstore.on("load", load_cb); rstore.on("load", () => updateGrid());
}, },
}); });