From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 41CFF1FF0A7 for ; Tue, 18 Aug 2026 11:16:14 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 108E321567; Tue, 18 Aug 2026 11:16:13 +0200 (CEST) Message-ID: <09d0dd28-926b-40fd-accc-89ce9e8bdca3@proxmox.com> Date: Tue, 18 Aug 2026 11:15:52 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Beta Subject: Re: [PATCH manager 2/2] ui: tree: reduce reduce usage of `let` keyword To: Elias Huhsovitz , pve-devel@lists.proxmox.com References: <20260818083110.15786-1-e.huhsovitz@proxmox.com> <20260818083110.15786-3-e.huhsovitz@proxmox.com> Content-Language: en-US From: Dominik Csapak In-Reply-To: <20260818083110.15786-3-e.huhsovitz@proxmox.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1787044531268 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.950 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: SIHNERKIQ3LHF6EEYGOBYVT3GGFD6ACZ X-Message-ID-Hash: SIHNERKIQ3LHF6EEYGOBYVT3GGFD6ACZ X-MailFrom: d.csapak@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: typo in the subject: 'reduce reduce' also, not sure if this gains us anything. yes, our style guide says if sensible, use const, but we don't have to go out of our way to replace existing lets with consts. Or is there some improvement to gain from this? In general, I would prefer to leave such code as is, and only introduce these with new code, except if there is a clear gain (like fixing a bug or exposing some uninteded behavior). On 8/18/26 10:31 AM, Elias Huhsovitz wrote: > Replace `let` with `const` the for varaibles that are not re-assigned. > > Signed-off-by: Elias Huhsovitz > --- > www/manager6/tree/ResourceTree.js | 134 +++++++++++++++--------------- > 1 file changed, 67 insertions(+), 67 deletions(-) > > diff --git a/www/manager6/tree/ResourceTree.js b/www/manager6/tree/ResourceTree.js > index a7723095..93d2a85b 100644 > --- a/www/manager6/tree/ResourceTree.js > +++ b/www/manager6/tree/ResourceTree.js > @@ -52,15 +52,15 @@ Ext.define('PVE.tree.ResourceTree', { > flex: 1, > dataIndex: 'text', > renderer: function (val, meta, rec) { > - let info = rec.data; > + const info = rec.data; > > let text = info.text; > let status = ''; > if (info.type === 'storage') { > - let usage = info.disk / info.maxdisk; > + const usage = info.disk / info.maxdisk; > if (usage >= 0.0 && usage <= 1.0) { > - let barHeight = (usage * 100).toFixed(0); > - let remainingHeight = (100 - barHeight).toFixed(0); > + const barHeight = (usage * 100).toFixed(0); > + const remainingHeight = (100 - barHeight).toFixed(0); > status = '
'; > status += `
`; > status += `
`; > @@ -112,16 +112,16 @@ Ext.define('PVE.tree.ResourceTree', { > > // private > nodeSortFn: function (node1, node2) { > - let me = this; > - let n1 = node1.data, > + const me = this; > + const n1 = node1.data, > n2 = node2.data; > > if (!n1.groupbyid === !n2.groupbyid) { > - let n1IsGuest = n1.type === 'qemu' || n1.type === 'lxc'; > - let n2IsGuest = n2.type === 'qemu' || n2.type === 'lxc'; > + const n1IsGuest = n1.type === 'qemu' || n1.type === 'lxc'; > + const n2IsGuest = n2.type === 'qemu' || n2.type === 'lxc'; > if (me['group-guest-types'] || !n1IsGuest || !n2IsGuest) { > // first sort (group) by type > - let res = me.getTypeOrder(n1.type) - me.getTypeOrder(n2.type); > + const res = me.getTypeOrder(n1.type) - me.getTypeOrder(n2.type); > if (res !== 0) { > return res; > } > @@ -155,15 +155,15 @@ Ext.define('PVE.tree.ResourceTree', { > > // private: fast binary search > findInsertIndex: function (node, child, start, end) { > - let me = this; > + const me = this; > > - let diff = end - start; > + const diff = end - start; > if (diff <= 0) { > return start; > } > - let mid = start + (diff >> 1); > + const mid = start + (diff >> 1); > > - let res = me.nodeSortFn(child, node.childNodes[mid]); > + const res = me.nodeSortFn(child, node.childNodes[mid]); > if (res <= 0) { > return me.findInsertIndex(node, child, start, mid); > } else { > @@ -172,14 +172,14 @@ Ext.define('PVE.tree.ResourceTree', { > }, > > setIconCls: function (info) { > - let cls = PVE.Utils.get_object_icon_class(info.type, info); > + const cls = PVE.Utils.get_object_icon_class(info.type, info); > if (cls !== '') { > info.iconCls = cls; > } > }, > > getToolTip: function (info) { > - let qtips = []; > + const qtips = []; > if (info.qmpstatus || info.status) { > qtips.push(Ext.String.format(gettext('Status: {0}'), info.qmpstatus || info.status)); > } > @@ -190,7 +190,7 @@ Ext.define('PVE.tree.ResourceTree', { > qtips.push(Ext.String.format(gettext('HA State: {0}'), info.hastate)); > } > if (info.type === 'storage') { > - let usage = info.disk / info.maxdisk; > + const usage = info.disk / info.maxdisk; > if (usage >= 0.0 && usage <= 1.0) { > qtips.push(Ext.String.format(gettext('Usage: {0}%'), (usage * 100).toFixed(2))); > } > @@ -200,20 +200,20 @@ Ext.define('PVE.tree.ResourceTree', { > return undefined; > } > > - let tip = qtips.join(', '); > + const tip = qtips.join(', '); > info.tip = tip; > return tip; > }, > > // private > addChildSorted: function (node, info, insertPool = false) { > - let me = this; > + const me = this; > > me.setIconCls(info); > > - let nestPools = PVE.UIOptions.getTreeSortingValue('nest-pools'); > + const nestPools = PVE.UIOptions.getTreeSortingValue('nest-pools'); > if (info.type === 'pool' && info.pool && !insertPool && nestPools) { > - let parentPool = info.pool.split('/').slice(0, -1).join('/'); > + const parentPool = info.pool.split('/').slice(0, -1).join('/'); > if (parentPool.length > 0) { > let parent = node.findChild('id', `/pool/${parentPool}`, true); > if (parent !== node) { > @@ -233,7 +233,7 @@ Ext.define('PVE.tree.ResourceTree', { > if (me.viewFilter.groupRenderer) { > info.text = me.viewFilter.groupRenderer(info); > } else { > - let defaults = PVE.tree.ResourceTree.typeDefaults[info.groupbyid]; > + const defaults = PVE.tree.ResourceTree.typeDefaults[info.groupbyid]; > if (defaults && defaults.text) { > info.text = defaults.text; > } else { > @@ -241,10 +241,10 @@ Ext.define('PVE.tree.ResourceTree', { > } > } > } > - let child = Ext.create('PVETree', info); > + const child = Ext.create('PVETree', info); > > if (node.childNodes) { > - let pos = me.findInsertIndex(node, child, 0, node.childNodes.length); > + const pos = me.findInsertIndex(node, child, 0, node.childNodes.length); > node.insertBefore(child, node.childNodes[pos]); > } else { > node.insertBefore(child); > @@ -255,10 +255,10 @@ Ext.define('PVE.tree.ResourceTree', { > > // private > groupChild: function (node, info, groups, level) { > - let me = this; > + const me = this; > > - let groupBy = groups[level]; > - let v = info[groupBy]; > + const groupBy = groups[level]; > + const v = info[groupBy]; > > if (v) { > let group = node.findChild('groupbyid', v, true); > @@ -273,7 +273,7 @@ Ext.define('PVE.tree.ResourceTree', { > id: groupBy + '/' + v, > }; > if (groupBy === 'type') { > - let defaults = PVE.tree.ResourceTree.typeDefaults[v]; > + const defaults = PVE.tree.ResourceTree.typeDefaults[v]; > if (defaults && defaults.iconCls) { > groupinfo.iconCls = defaults.iconCls; > } > @@ -296,10 +296,10 @@ Ext.define('PVE.tree.ResourceTree', { > }, > > saveSortingOptions: function () { > - let me = this; > + const me = this; > let changed = false; > for (const key of ['sort-field', 'group-templates', 'group-guest-types', 'nest-pools']) { > - let newValue = PVE.UIOptions.getTreeSortingValue(key); > + const newValue = PVE.UIOptions.getTreeSortingValue(key); > if (me[key] !== newValue) { > me[key] = newValue; > changed = true; > @@ -309,22 +309,22 @@ Ext.define('PVE.tree.ResourceTree', { > }, > > initComponent: function () { > - let me = this; > + const me = this; > me.saveSortingOptions(); > > - let rstore = PVE.data.ResourceStore; > - let sp = Ext.state.Manager.getProvider(); > + const rstore = PVE.data.ResourceStore; > + const sp = Ext.state.Manager.getProvider(); > > if (!me.viewFilter) { > me.viewFilter = {}; > } > > - let pdata = { > + const pdata = { > dataIndex: {}, > updateCount: 0, > }; > > - let store = Ext.create('Ext.data.TreeStore', { > + const store = Ext.create('Ext.data.TreeStore', { > model: 'PVETree', > root: { > expanded: true, > @@ -334,7 +334,7 @@ Ext.define('PVE.tree.ResourceTree', { > }, > }); > > - let stateid = 'rid'; > + const stateid = 'rid'; > > const changedFields = [ > 'disk', > @@ -352,18 +352,18 @@ Ext.define('PVE.tree.ResourceTree', { > ]; > > // special case ids from the tag view, since they change the id in the state > - let idMapFn = function (id) { > + const idMapFn = function (id) { > if (!id) { > return undefined; > } > if (id.startsWith('qemu') || id.startsWith('lxc')) { > - let [realId, _tag] = id.split('-'); > + const [realId, _tag] = id.split('-'); > return realId; > } > return id; > }; > > - let findNode = function (rootNode, id) { > + const findNode = function (rootNode, id) { > if (!id) { > return undefined; > } > @@ -380,7 +380,7 @@ Ext.define('PVE.tree.ResourceTree', { > > let firstUpdate = true; > > - let updateTree = function () { > + const updateTree = function () { > store.suspendEvents(); > > let rootnode; > @@ -395,30 +395,30 @@ Ext.define('PVE.tree.ResourceTree', { > rootnode = me.store.getRootNode(); > } > // remember selected node (and all parents) > - let sm = me.getSelectionModel(); > + const sm = me.getSelectionModel(); > let lastsel = sm.getSelection()[0]; > - let parents = []; > - let sorting_changed = me.saveSortingOptions(); > + const parents = []; > + const sorting_changed = me.saveSortingOptions(); > for (let node = lastsel; node; node = node.parentNode) { > parents.push(node); > } > > - let groups = me.viewFilter.groups || []; > + const groups = me.viewFilter.groups || []; > // explicitly check for node/template, as those are not always grouping attributes > - let attrMoveChecks = me.viewFilter.attrMoveChecks ?? {}; > + const attrMoveChecks = me.viewFilter.attrMoveChecks ?? {}; > > // also check for name for when the tree is sorted by name > - let moveCheckAttrs = groups.concat(['node', 'template', 'name']); > - let filterFn = me.viewFilter.getFilterFn ? me.viewFilter.getFilterFn() : Ext.identityFn; > + const moveCheckAttrs = groups.concat(['node', 'template', 'name']); > + const filterFn = me.viewFilter.getFilterFn ? me.viewFilter.getFilterFn() : Ext.identityFn; > > let reselect = false; // for disappeared nodes > - let index = pdata.dataIndex; > + const index = pdata.dataIndex; > // remove vanished or moved items and update changed items in-place > for (const [key, olditem] of Object.entries(index)) { > // getById() use find(), which is slow (ExtJS4 DP5) > - let oldid = olditem.data.id; > - let id = idMapFn(olditem.data.id); > - let item = rstore.data.get(id); > + const oldid = olditem.data.id; > + const id = idMapFn(olditem.data.id); > + const item = rstore.data.get(id); > > let changed = sorting_changed, > moved = sorting_changed; > @@ -448,7 +448,7 @@ Ext.define('PVE.tree.ResourceTree', { > > if (changed) { > olditem.beginEdit(); > - let info = olditem.data; > + const info = olditem.data; > Ext.apply(info, item.data); > if (info.id !== oldid) { > info.id = oldid; > @@ -458,7 +458,7 @@ Ext.define('PVE.tree.ResourceTree', { > } > if ((!item || moved) && olditem.isLeaf()) { > delete index[key]; > - let parentNode = olditem.parentNode; > + const parentNode = olditem.parentNode; > // a selected item moved (migration) or disappeared (destroyed), so deselect that > // node now and try to reselect the moved (or its parent) node later > if (lastsel && olditem.data.id === lastsel.data.id) { > @@ -469,25 +469,25 @@ Ext.define('PVE.tree.ResourceTree', { > store.remove(olditem); > parentNode.removeChild(olditem, true); > if (parentNode.childNodes.length < 1 && parentNode.parentNode) { > - let grandParent = parentNode.parentNode; > + const grandParent = parentNode.parentNode; > grandParent.removeChild(parentNode, true); > } > } > } > > - let items = rstore.getData().items.flatMap(me.viewFilter.itemMap ?? Ext.identityFn); > + const items = rstore.getData().items.flatMap(me.viewFilter.itemMap ?? Ext.identityFn); > items.forEach(function (item) { > // add new items > - let olditem = index[item.data.id]; > + const olditem = index[item.data.id]; > if (olditem) { > return; > } > if (filterFn && !filterFn(item)) { > return; > } > - let info = Ext.apply({ leaf: true }, item.data); > + const info = Ext.apply({ leaf: true }, item.data); > > - let child = me.groupChild(rootnode, info, groups, 0); > + const child = me.groupChild(rootnode, info, groups, 0); > if (child) { > index[item.data.id] = child; > } > @@ -496,7 +496,7 @@ Ext.define('PVE.tree.ResourceTree', { > store.resumeEvents(); > store.fireEvent('refresh', store); > > - let foundChild = findNode(rootnode, lastsel?.data.id); > + const foundChild = findNode(rootnode, lastsel?.data.id); > > // select parent node if original selected node vanished > if (lastsel && !foundChild) { > @@ -544,12 +544,12 @@ Ext.define('PVE.tree.ResourceTree', { > rstore.un('load', updateTree); > }, > beforecellmousedown: function (tree, td, cellIndex, record, tr, rowIndex, ev) { > - let sm = me.getSelectionModel(); > + const sm = me.getSelectionModel(); > // disable selection when right clicking except if the record is already selected > me.allowSelection = ev.button !== 2 || sm.isSelected(record); > }, > beforeselect: function (tree, record, index, eopts) { > - let allow = me.allowSelection; > + const allow = me.allowSelection; > me.allowSelection = true; > return allow; > }, > @@ -558,7 +558,7 @@ Ext.define('PVE.tree.ResourceTree', { > if (me.tip) { > return; > } > - let selectors = [ > + const selectors = [ > '.x-tree-node-text > span:not(.proxmox-tag-dark):not(.proxmox-tag-light)', > '.x-tree-icon', > ]; > @@ -569,8 +569,8 @@ Ext.define('PVE.tree.ResourceTree', { > renderTo: Ext.getBody(), > listeners: { > beforeshow: function (tip) { > - let rec = me.getView().getRecord(tip.triggerElement); > - let tipText = me.getToolTip(rec.data); > + const rec = me.getView().getRecord(tip.triggerElement); > + const tipText = me.getToolTip(rec.data); > if (tipText) { > tip.update(tipText); > return true; > @@ -587,7 +587,7 @@ Ext.define('PVE.tree.ResourceTree', { > }, > clearTree: function () { > pdata.updateCount = 0; > - let rootnode = me.store.getRootNode(); > + const rootnode = me.store.getRootNode(); > rootnode.collapse(); > rootnode.removeAll(); > pdata.dataIndex = {}; > @@ -598,7 +598,7 @@ Ext.define('PVE.tree.ResourceTree', { > updateTree(); > }, > selectExpand: function (node) { > - let sm = me.getSelectionModel(); > + const sm = me.getSelectionModel(); > if (!sm.isSelected(node)) { > sm.select(node); > for (let iter = node; iter; iter = iter.parentNode) { > @@ -610,7 +610,7 @@ Ext.define('PVE.tree.ResourceTree', { > } > }, > selectById: function (nodeid) { > - let rootnode = me.store.getRootNode(); > + const rootnode = me.store.getRootNode(); > let node; > if (nodeid === 'root') { > node = rootnode; > @@ -643,7 +643,7 @@ Ext.define('PVE.tree.ResourceTree', { > before: function (node) { > if (node.data.groupbyid) { > node.beginEdit(); > - let info = node.data; > + const info = node.data; > me.setIconCls(info); > if (me.viewFilter.groupRenderer) { > info.text = me.viewFilter.groupRenderer(info);