]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ha/Resources.js
ha resource edit: adapt to new service state
[pve-manager.git] / www / manager6 / ha / Resources.js
1 Ext.define('PVE.ha.ResourcesView', {
2 extend: 'Ext.grid.GridPanel',
3 alias: ['widget.pveHAResourcesView'],
4
5 onlineHelp: 'ha_manager_resources',
6
7 stateful: true,
8 stateId: 'grid-ha-resources',
9
10 initComponent : function() {
11 var me = this;
12
13 var caps = Ext.state.Manager.get('GuiCap');
14
15 var store = new Ext.data.Store({
16 model: 'pve-ha-resources',
17 proxy: {
18 type: 'pve',
19 url: "/api2/json/cluster/ha/resources"
20 },
21 sorters: {
22 property: 'sid',
23 order: 'DESC'
24 }
25 });
26
27 var reload = function() {
28 store.load();
29 };
30
31 var render_error = function(dataIndex, value, metaData, record) {
32 var errors = record.data.errors;
33 if (errors) {
34 var msg = errors[dataIndex];
35 if (msg) {
36 metaData.tdCls = 'x-form-invalid-field';
37 var html = '<p>' + Ext.htmlEncode(msg) + '</p>';
38 metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
39 html.replace(/\"/g,'&quot;') + '"';
40 }
41 }
42 return value;
43 };
44
45 var sm = Ext.create('Ext.selection.RowModel', {});
46
47 var run_editor = function() {
48 var rec = sm.getSelection()[0];
49 var sid = rec.data.sid;
50
51 var regex = /^(\S+):(\S+)$/;
52 var res = regex.exec(sid);
53
54 if (res[1] !== 'vm' && res[1] !== 'ct') {
55 return;
56 }
57
58 var vmid = res[2];
59
60 var win = Ext.create('PVE.ha.VMResourceEdit',{
61 vmid: vmid
62 });
63 win.on('destroy', reload);
64 win.show();
65 };
66
67 var remove_btn = new PVE.button.Button({
68 text: gettext('Remove'),
69 disabled: true,
70 selModel: sm,
71 handler: function(btn, event, rec) {
72 var sid = rec.data.sid;
73
74 PVE.Utils.API2Request({
75 url: '/cluster/ha/resources/' + sid,
76 method: 'DELETE',
77 waitMsgTarget: me,
78 callback: function() {
79 reload();
80 },
81 failure: function (response, opts) {
82 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
83 }
84 });
85 }
86 });
87
88 var edit_btn = new PVE.button.Button({
89 text: gettext('Edit'),
90 disabled: true,
91 selModel: sm,
92 handler: run_editor
93 });
94
95 Ext.apply(me, {
96 store: store,
97 selModel: sm,
98 viewConfig: {
99 trackOver: false
100 },
101 tbar: [
102 {
103 text: gettext('Add'),
104 disabled: !caps.nodes['Sys.Console'],
105 handler: function() {
106 var win = Ext.create('PVE.ha.VMResourceEdit',{});
107 win.on('destroy', reload);
108 win.show();
109 }
110 },
111 edit_btn, remove_btn
112 ],
113
114 columns: [
115 {
116 header: 'ID',
117 width: 100,
118 sortable: true,
119 dataIndex: 'sid'
120 },
121 {
122 header: gettext('Request State'),
123 width: 100,
124 sortable: true,
125 renderer: function(v) {
126 return v || 'enabled';
127 },
128 dataIndex: 'state'
129 },
130 {
131 header: gettext('Max. Restart'),
132 width: 100,
133 sortable: true,
134 renderer: function(v) {
135 return v || '1';
136 },
137 dataIndex: 'max_restart'
138 },
139 {
140 header: gettext('Max. Relocate'),
141 width: 100,
142 sortable: true,
143 renderer: function(v) {
144 return v || '1';
145 },
146 dataIndex: 'max_relocate'
147 },
148 {
149 header: gettext('Group'),
150 width: 200,
151 sortable: true,
152 renderer: function(value, metaData, record) {
153 return render_error('group', value, metaData, record);
154 },
155 dataIndex: 'group'
156 },
157 {
158 header: gettext('Description'),
159 flex: 1,
160 renderer: Ext.String.htmlEncode,
161 dataIndex: 'comment'
162 }
163 ],
164 listeners: {
165 activate: reload,
166 beforeselect: function(grid, record, index, eOpts) {
167 if (!caps.nodes['Sys.Console']) {
168 return false;
169 }
170 },
171 itemdblclick: run_editor
172 }
173 });
174
175 me.callParent();
176 }
177 }, function() {
178
179 Ext.define('pve-ha-resources', {
180 extend: 'Ext.data.Model',
181 fields: [
182 'sid', 'state', 'digest', 'errors', 'group', 'comment',
183 'max_restart', 'max_relocate'
184 ],
185 idProperty: 'sid'
186 });
187
188 });