[pbs-devel] [PATCH proxmox-backup v7 8/8] ui: add MetricServerView and use it

Thomas Lamprecht t.lamprecht at proxmox.com
Tue Jun 7 14:55:28 CEST 2022


Am 02/06/2022 um 14:18 schrieb Dominik Csapak:
> simple CRUD interface to show/add/edit/delete metric servers
> 
> it's a bit different from PVE's so that it's harder to reuse that to
> copy it. If we need it again, we can still refactor and combine them.
> 

looks OK, just some code style nits inline.

> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  www/Makefile                   |   1 +
>  www/NavigationTree.js          |   6 ++
>  www/config/MetricServerView.js | 145 +++++++++++++++++++++++++++++++++
>  3 files changed, 152 insertions(+)
>  create mode 100644 www/config/MetricServerView.js
> 
> diff --git a/www/Makefile b/www/Makefile
> index 3a36daba..757c1fd5 100644
> --- a/www/Makefile
> +++ b/www/Makefile
> @@ -62,6 +62,7 @@ JSSRC=							\
>  	config/WebauthnView.js				\
>  	config/CertificateView.js			\
>  	config/NodeOptionView.js			\
> +	config/MetricServerView.js			\
>  	window/ACLEdit.js				\
>  	window/BackupFileDownloader.js			\
>  	window/BackupGroupChangeOwner.js		\
> diff --git a/www/NavigationTree.js b/www/NavigationTree.js
> index 5f44aace..dc69f312 100644
> --- a/www/NavigationTree.js
> +++ b/www/NavigationTree.js
> @@ -68,6 +68,12 @@ Ext.define('PBS.store.NavigationStore', {
>  			path: 'pbsCertificateConfiguration',
>  			leaf: true,
>  		    },
> +		    {
> +			text: gettext('Metric Server'),
> +			iconCls: 'fa fa-bar-chart',
> +			path: 'pbsMetricServerView',
> +			leaf: true,
> +		    },

I'd rather put this as tab in the general "Configuration" panel, this is slightly too
niche to take up space in the main navigation tree directly.

>  		    {
>  			text: gettext('Subscription'),
>  			iconCls: 'fa fa-support',
> diff --git a/www/config/MetricServerView.js b/www/config/MetricServerView.js
> new file mode 100644
> index 00000000..b904a427
> --- /dev/null
> +++ b/www/config/MetricServerView.js
> @@ -0,0 +1,145 @@
> +Ext.define('PBS.config.MetricServerView', {
> +    extend: 'Ext.grid.Panel',
> +    alias: ['widget.pbsMetricServerView'],
> +
> +    stateful: true,
> +    stateId: 'grid-metricserver',
> +
> +    controller: {
> +	xclass: 'Ext.app.ViewController',
> +
> +	render_type: function(value) {

I'd prefer camelCase for new functions where sensible, like ExtJS uses everywhere and part of
our code base also does.

> +	    switch (value) {
> +		case 'influxdb-http': return "InfluxDB (HTTP)";
> +		case 'influxdb-udp': return "InfluxDB (UDP)";
> +		default: return Proxmox.Utils.unknownText;
> +	    }

I'd like to avoid switch case in JS, at least most of the time, there seldom nice and either
use more space while still being more noisy/harder to read than objects or require having
multiple statements on a single line, both not to nice. If JS would have a match statement
allowing to return a expression like we got in rust I'd be sold though.

Rather just use a object. with multiple such similar metric type derived info one could also
use a nested, schema like one

{
    indlufxdb: {
        xtype: '...',
        name: '...',
    },
}

While this is also using quite some vertical space it's at least easy to read due to being
like a static schema definition.

The renderer could then be also just inline, e.g.:
v => PBS.Schema.metricServer[v]?.name ?? Proxmox.Utils.unknownText,

but not to hard feelings for that.

> +	},
> +
> +	get_xtype: function(value) {
> +	    switch (value) {

same here (and thus the schema proposal)

> +		case 'influxdb-http': return "InfluxDbHttp";
> +		case 'influxdb-udp': return "InfluxDbUdp";
> +		default: throw "invalid type";
> +	    }
> +	},
> +
> +	editWindow: function(xtype, id) {
> +	    let me = this;
> +	    Ext.create(`PBS.window.${xtype}Edit`, {
> +		serverid: id,
> +		autoShow: true,
> +		autoLoad: true,
> +		listeners: {
> +		    destroy: () => me.reload(),
> +		},
> +	    });
> +	},
> +
> +	addServer: function(button) {
> +	    this.editWindow(this.get_xtype(button.type));
> +	},
> +
> +	editServer: function() {
> +	    let me = this;
> +	    let view = me.getView();
> +	    let selection = view.getSelection();
> +	    if (!selection || selection.length < 1) {
> +		return;
> +	    }
> +
> +	    let cfg = selection[0].data;
> +
> +	    let xtype = me.get_xtype(cfg.type);
> +	    me.editWindow(xtype, cfg.name);
> +	},
> +
> +	reload: function() {
> +	    this.getView().getStore().load();
> +	},
> +    },
> +
> +    store: {
> +	autoLoad: true,
> +	id: 'metricservers',
> +	proxy: {
> +	    type: 'proxmox',
> +	    url: '/api2/json/admin/metricserver',
> +	},
> +    },
> +
> +    columns: [
> +	{
> +	    text: gettext('Name'),
> +	    flex: 2,
> +	    dataIndex: 'name',
> +	},
> +	{
> +	    text: gettext('Type'),
> +	    width: 150,
> +	    dataIndex: 'type',
> +	    renderer: 'render_type',
> +	},
> +	{
> +	    text: gettext('Enabled'),
> +	    dataIndex: 'disable',
> +	    width: 100,
> +	    renderer: Proxmox.Utils.format_neg_boolean,
> +	},
> +	{
> +	    text: gettext('Target Server'),
> +	    width: 200,
> +	    dataIndex: 'server',
> +	},
> +	{
> +	    text: gettext('Comment'),
> +	    flex: 3,
> +	    dataIndex: 'comment',
> +	    renderer: Ext.htmlEncode,
> +	},
> +    ],
> +
> +    tbar: [
> +	{
> +	    text: gettext('Add'),
> +	    menu: [
> +		{
> +		    text: 'InfluxDB (HTTP)',
> +		    type: 'influxdb-http',
> +		    iconCls: 'fa fa-fw fa-bar-chart',
> +		    handler: 'addServer',
> +		},
> +		{
> +		    text: 'InfluxDB (UDP)',
> +		    type: 'influxdb-udp',
> +		    iconCls: 'fa fa-fw fa-bar-chart',
> +		    handler: 'addServer',
> +		},
> +	    ],
> +	},
> +	{
> +	    text: gettext('Edit'),
> +	    xtype: 'proxmoxButton',
> +	    handler: 'editServer',
> +	    disabled: true,
> +	},
> +	{
> +	    xtype: 'proxmoxStdRemoveButton',
> +	    getUrl: (rec) => `/api2/extjs/config/metricserver/${rec.data.type}/${rec.data.name}`,
> +	    getRecordName: (rec) => rec.data.name,
> +	    callback: 'reload',
> +	},
> +    ],
> +
> +    listeners: {
> +	itemdblclick: 'editServer',
> +    },
> +
> +    initComponent: function() {
> +	var me = this;
> +
> +	me.callParent();
> +
> +	Proxmox.Utils.monStoreErrors(me, me.getStore());
> +    },
> +});






More information about the pbs-devel mailing list