From: Dietmar Maurer Date: Tue, 31 Jan 2017 14:21:37 +0000 (+0100) Subject: add ServiceView widget X-Git-Url: https://git.proxmox.com/?p=proxmox-widget-toolkit.git;a=commitdiff_plain;h=d71391402cc4558bd3f659e160a2ce4c6c121238 add ServiceView widget --- diff --git a/Makefile b/Makefile index 0527479..8d1c7f5 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ JSSRC= \ window/Edit.js \ window/TaskViewer.js \ node/Tasks.js \ + node/ServiceView.js \ node/TimeEdit.js \ node/TimeView.js diff --git a/node/ServiceView.js b/node/ServiceView.js new file mode 100644 index 0000000..0b4acda --- /dev/null +++ b/node/ServiceView.js @@ -0,0 +1,160 @@ +Ext.define('proxmox-services', { + extend: 'Ext.data.Model', + fields: [ 'service', 'name', 'desc', 'state' ], + idProperty: 'service' +}); + +Ext.define('Proxmox.node.ServiceView', { + extend: 'Ext.grid.GridPanel', + + alias: ['widget.proxmoxNodeServiceView'], + + startOnlyServices: {}, + + initComponent : function() { + var me = this; + + if (!me.nodename) { + throw "no node name specified"; + } + + var rstore = Ext.create('Proxmox.data.UpdateStore', { + interval: 1000, + storeid: 'proxmox-services' + me.nodename, + model: 'proxmox-services', + proxy: { + type: 'proxmox', + url: "/api2/json/nodes/" + me.nodename + "/services" + } + }); + + var store = Ext.create('Proxmox.data.DiffStore', { + rstore: rstore, + sortAfterUpdate: true, + sorters: [ + { + property : 'name', + direction: 'ASC' + } + ] + }); + + var service_cmd = function(cmd) { + var sm = me.getSelectionModel(); + var rec = sm.getSelection()[0]; + Proxmox.Utils.API2Request({ + url: "/nodes/" + me.nodename + "/services/" + rec.data.service + "/" + cmd, + method: 'POST', + failure: function(response, opts) { + Ext.Msg.alert(gettext('Error'), response.htmlStatus); + me.loading = true; + }, + success: function(response, opts) { + rstore.startUpdate(); + var upid = response.result.data; + + var win = Ext.create('Proxmox.window.TaskProgress', { + upid: upid + }); + win.show(); + } + }); + }; + + var start_btn = new Ext.Button({ + text: gettext('Start'), + disabled: true, + handler: function(){ + service_cmd("start"); + } + }); + + var stop_btn = new Ext.Button({ + text: gettext('Stop'), + disabled: true, + handler: function(){ + service_cmd("stop"); + } + }); + + var restart_btn = new Ext.Button({ + text: gettext('Restart'), + disabled: true, + handler: function(){ + service_cmd("restart"); + } + }); + + var set_button_status = function() { + var sm = me.getSelectionModel(); + var rec = sm.getSelection()[0]; + + if (!rec) { + start_btn.disable(); + stop_btn.disable(); + restart_btn.disable(); + return; + } + var service = rec.data.service; + var state = rec.data.state; + + if (me.startOnlyServices[service]) { + if (state == 'running') { + start_btn.disable(); + restart_btn.enable(); + } else { + start_btn.enable(); + restart_btn.disable(); + } + stop_btn.disable(); + } else { + if (state == 'running') { + start_btn.disable(); + restart_btn.enable(); + stop_btn.enable(); + } else { + start_btn.enable(); + restart_btn.disable(); + stop_btn.disable(); + } + } + }; + + me.mon(store, 'refresh', set_button_status); + + Proxmox.Utils.monStoreErrors(me, rstore); + + Ext.apply(me, { + store: store, + stateful: false, + tbar: [ start_btn, stop_btn, restart_btn ], + columns: [ + { + header: gettext('Name'), + width: 100, + sortable: true, + dataIndex: 'name' + }, + { + header: gettext('Status'), + width: 100, + sortable: true, + dataIndex: 'state' + }, + { + header: gettext('Description'), + renderer: Ext.String.htmlEncode, + dataIndex: 'desc', + flex: 1 + } + ], + listeners: { + selectionchange: set_button_status, + activate: rstore.startUpdate, + destroy: rstore.stopUpdate + } + }); + + me.callParent(); + } +}); diff --git a/window/TaskViewer.js b/window/TaskViewer.js index 7a2ada4..189268b 100644 --- a/window/TaskViewer.js +++ b/window/TaskViewer.js @@ -50,7 +50,7 @@ Ext.define('Proxmox.window.TaskProgress', { var descr = Proxmox.Utils.format_task_description(task.type, task.id); Ext.apply(me, { - title: gettetx('Task') + ': ' + descr, + title: gettext('Task') + ': ' + descr, width: 300, layout: 'auto', modal: true,