Hm, the buttons might be a little ambiguous that these are only for LRM
entries... But I think it's a good start as there isn't a dedicated list
for the LRMs which gives more room for action buttons that can be done
on all items. But let's wait for other feedback.

On Mon Aug 25, 2025 at 6:11 AM CEST, Thomas Skinner wrote:
> Signed-off-by: Thomas Skinner <tho...@atskinner.net>
> ---
>  www/manager6/ha/StatusView.js | 85 +++++++++++++++++++++++++++++++++++
>  1 file changed, 85 insertions(+)
>
> diff --git a/www/manager6/ha/StatusView.js b/www/manager6/ha/StatusView.js
> index 50ad8e84..79e12df5 100644
> --- a/www/manager6/ha/StatusView.js
> +++ b/www/manager6/ha/StatusView.js
> @@ -41,12 +41,58 @@ Ext.define(
>                  },
>              });
>  
> +            let sm = Ext.create('Ext.selection.RowModel', {});
> +
> +            let caps = Ext.state.Manager.get('GuiCap');
> +
> +            var node_maintenance_disable = function (disable) {

var mustn't be used for new code anymore [0], and new variable names
should be in camelCase [1].

[0] https://pve.proxmox.com/wiki/Javascript_Style_Guide#Variables
[1] https://pve.proxmox.com/wiki/Javascript_Style_Guide#Casing

this could be an arrow function and the function's variable name is
rather fragile as 'disable' can be set and then does a rather different
action to the node maintenance.. Maybe just "setNodeMaintenance"?

> +                let rec = sm.getSelection()[0];
> +                if (!rec || rec.data.type !== "lrm") {
> +                    return;
> +                }
> +                let nodename = rec.get('node');
> +                let enableText = disable ? 'Disable' : 'Enable';
> +                let msg = Ext.String.format(gettext("{0} maintenance mode on 
> node '{1}'?"), enableText, nodename);
> +                Ext.Msg.confirm(gettext('Confirm'), msg, (btn) => {
> +                    if (btn === 'yes') {
> +                        Proxmox.Utils.API2Request({
> +                            params: { disable: disable ? 1 : 0 },
> +                            url: '/cluster/ha/nodes/' + nodename + 
> '/maintenance',
> +                            method: 'POST',
> +                            waitMsgTarget: me,
> +                            failure: function (response, opts) {
> +                                Ext.Msg.alert(gettext('Error'), 
> response.htmlStatus);
> +                            },
> +                        });
> +                    }
> +                });
> +            };
> +
>              Ext.apply(me, {
>                  store: store,
> +                selModel: sm,
>                  stateful: false,
>                  viewConfig: {
>                      trackOver: false,
>                  },
> +                tbar: [
> +                    {
> +                        text: gettext('Enable Maintenance Mode'),
> +                        itemId: 'enableMaintBtn',
> +                        disabled: true,
> +                        handler: function () {
> +                            node_maintenance_disable(false);
> +                        },

nit: use an arrow function instead

    handler: () => node_maintenance_disable(false),

> +                    },
> +                    {
> +                        text: gettext('Disable Maintenance Mode'),
> +                        itemId: 'disableMaintBtn',
> +                        disabled: true,
> +                        handler: function () {
> +                            node_maintenance_disable(true);

nit: same here

> +                        },
> +                    },
> +                ],
>                  columns: [
>                      {
>                          header: gettext('Type'),
> @@ -60,12 +106,50 @@ Ext.define(
>                          dataIndex: 'status',
>                      },
>                  ],
> +                listeners: {
> +                    beforeselect: function (tree, record, index, eopts) {
> +                        if (!caps.nodes['Sys.Console']) {
> +                            return;
> +                        }
> +                        let enableMaintBtnDisable = true;
> +                        let disableMaintBtnDisable = true;
> +                        if (record && record.data.type === "lrm") {
> +                            if (record.data.lrm_mode && record.data.lrm_mode 
> === 'maintenance') {
> +                                disableMaintBtnDisable = false;
> +                            } else {
> +                                enableMaintBtnDisable = false;
> +                            }
> +                        }
> +                        
> me.down('#enableMaintBtn').setDisabled(enableMaintBtnDisable);
> +                        
> me.down('#disableMaintBtn').setDisabled(disableMaintBtnDisable);
> +                    },
> +                }
>              });
>  
>              me.callParent();
>  
>              me.on('activate', me.rstore.startUpdate);
>              me.on('destroy', me.rstore.stopUpdate);
> +
> +            me.mon(me.rstore, 'load', function (curstore, results) {
> +                let rec = sm.getSelection()[0];
> +                if (!rec || rec.data.type !== "lrm") {
> +                    return;
> +                }
> +                for (const { data } of results) {
> +                    switch (data.type) {
> +                        case 'lrm':
> +                            if (rec.data.node === data.node) {
> +                                let inMaint = rec.data.lrm_mode === 
> 'maintenance';
> +                                
> me.down('#enableMaintBtn').setDisabled(inMaint);
> +                                
> me.down('#disableMaintBtn').setDisabled(!inMaint);
> +                            }
> +                            break;
> +                        default:
> +                            break;
> +                    }
> +                }
> +            });
>          },
>      },
>      function () {
> @@ -88,6 +172,7 @@ Ext.define(
>                  'type',
>                  'crm_state',
>                  'request_state',
> +                'lrm_mode',
>                  {
>                      name: 'vname',
>                      convert: function (value, record) {



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

Reply via email to