]>
Commit | Line | Data |
---|---|---|
b7ba8353 DM |
1 | Ext.define('PVE.ha.ResourcesView', { |
2 | extend: 'Ext.grid.GridPanel', | |
3 | alias: ['widget.pveHAResourcesView'], | |
4 | ||
ba93a9c6 DC |
5 | onlineHelp: 'ha_manager_resources', |
6 | ||
c4bb9405 DC |
7 | stateful: true, |
8 | stateId: 'grid-ha-resources', | |
9 | ||
8058410f | 10 | initComponent: function() { |
d11524c6 | 11 | let me = this; |
b7ba8353 | 12 | |
8a58f554 DC |
13 | if (!me.rstore) { |
14 | throw "no store given"; | |
15 | } | |
16 | ||
e7ade592 | 17 | Proxmox.Utils.monStoreErrors(me, me.rstore); |
d11524c6 | 18 | let store = Ext.create('Proxmox.data.DiffStore', { |
8a58f554 DC |
19 | rstore: me.rstore, |
20 | filters: { | |
21 | property: 'type', | |
f6710aac TL |
22 | value: 'service', |
23 | }, | |
b7ba8353 | 24 | }); |
8a58f554 | 25 | |
d11524c6 | 26 | let sm = Ext.create('Ext.selection.RowModel', {}); |
b7ba8353 | 27 | |
d11524c6 TL |
28 | let run_editor = function() { |
29 | let rec = sm.getSelection()[0]; | |
30 | let sid = rec.data.sid; | |
2a4971d8 | 31 | |
d11524c6 TL |
32 | let res = sid.match(/^(\S+):(\S+)$/); |
33 | if (!res || (res[1] !== 'vm' && res[1] !== 'ct')) { | |
34 | console.warn(`unknown HA service ID type ${sid}`); | |
a764c5f7 DC |
35 | return; |
36 | } | |
d11524c6 TL |
37 | let [, guestType, vmid] = res; |
38 | Ext.create('PVE.ha.VMResourceEdit', { | |
39 | guestType: guestType, | |
40 | vmid: vmid, | |
41 | listeners: { | |
42 | destroy: () => me.rstore.load(), | |
43 | }, | |
44 | autoShow: true, | |
b7ba8353 | 45 | }); |
b7ba8353 DM |
46 | }; |
47 | ||
d11524c6 | 48 | let caps = Ext.state.Manager.get('GuiCap'); |
b7ba8353 DM |
49 | |
50 | Ext.apply(me, { | |
51 | store: store, | |
52 | selModel: sm, | |
b7ba8353 | 53 | viewConfig: { |
f6710aac | 54 | trackOver: false, |
b7ba8353 DM |
55 | }, |
56 | tbar: [ | |
57 | { | |
58 | text: gettext('Add'), | |
59 | disabled: !caps.nodes['Sys.Console'], | |
60 | handler: function() { | |
d11524c6 TL |
61 | Ext.create('PVE.ha.VMResourceEdit', { |
62 | listeners: { | |
63 | destroy: () => me.rstore.load(), | |
64 | }, | |
65 | autoShow: true, | |
66 | }); | |
67 | }, | |
68 | }, | |
69 | { | |
5dbb7406 | 70 | xtype: 'proxmoxButton', |
d11524c6 TL |
71 | text: gettext('Edit'), |
72 | disabled: true, | |
73 | selModel: sm, | |
74 | handler: run_editor, | |
75 | }, | |
76 | { | |
77 | xtype: 'proxmoxStdRemoveButton', | |
78 | selModel: sm, | |
79 | getUrl: function(rec) { | |
80 | return `/cluster/ha/resources/${rec.get('sid')}`; | |
f6710aac | 81 | }, |
d11524c6 | 82 | callback: () => me.rstore.load(), |
b7ba8353 | 83 | }, |
b7ba8353 | 84 | ], |
b7ba8353 DM |
85 | columns: [ |
86 | { | |
87 | header: 'ID', | |
88 | width: 100, | |
89 | sortable: true, | |
f6710aac | 90 | dataIndex: 'sid', |
b7ba8353 | 91 | }, |
9cd33000 DC |
92 | { |
93 | header: gettext('State'), | |
94 | width: 100, | |
95 | sortable: true, | |
f6710aac | 96 | dataIndex: 'state', |
9cd33000 | 97 | }, |
3e52f2ed TL |
98 | { |
99 | header: gettext('Node'), | |
100 | width: 100, | |
101 | sortable: true, | |
f6710aac | 102 | dataIndex: 'node', |
3e52f2ed | 103 | }, |
b7ba8353 | 104 | { |
ecd45352 | 105 | header: gettext('Request State'), |
b7ba8353 | 106 | width: 100, |
9cd33000 | 107 | hidden: true, |
b7ba8353 | 108 | sortable: true, |
d11524c6 | 109 | renderer: v => v || 'started', |
f6710aac | 110 | dataIndex: 'request_state', |
9cd33000 DC |
111 | }, |
112 | { | |
113 | header: gettext('CRM State'), | |
114 | width: 100, | |
115 | hidden: true, | |
116 | sortable: true, | |
f6710aac | 117 | dataIndex: 'crm_state', |
b7ba8353 | 118 | }, |
2ae20617 TL |
119 | { |
120 | header: gettext('Name'), | |
121 | width: 100, | |
122 | sortable: true, | |
105e5756 | 123 | dataIndex: 'vname', |
2ae20617 | 124 | }, |
b2f9a9e4 TL |
125 | { |
126 | header: gettext('Max. Restart'), | |
127 | width: 100, | |
128 | sortable: true, | |
77a8d952 | 129 | renderer: (v) => v === undefined ? '1' : v, |
f6710aac | 130 | dataIndex: 'max_restart', |
b2f9a9e4 TL |
131 | }, |
132 | { | |
133 | header: gettext('Max. Relocate'), | |
134 | width: 100, | |
135 | sortable: true, | |
77a8d952 | 136 | renderer: (v) => v === undefined ? '1' : v, |
f6710aac | 137 | dataIndex: 'max_relocate', |
b2f9a9e4 | 138 | }, |
b7ba8353 DM |
139 | { |
140 | header: gettext('Group'), | |
141 | width: 200, | |
142 | sortable: true, | |
d11524c6 TL |
143 | renderer: function(value, metaData, { data }) { |
144 | if (data.errors && data.errors.group) { | |
145 | metaData.tdCls = 'proxmox-invalid-row'; | |
146 | let html = `<p>${Ext.htmlEncode(data.errors.group)}</p>`; | |
147 | metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' + html + '"'; | |
148 | } | |
149 | return value; | |
b7ba8353 | 150 | }, |
f6710aac | 151 | dataIndex: 'group', |
b7ba8353 DM |
152 | }, |
153 | { | |
154 | header: gettext('Description'), | |
155 | flex: 1, | |
2eb0767b | 156 | renderer: Ext.String.htmlEncode, |
f6710aac TL |
157 | dataIndex: 'comment', |
158 | }, | |
b7ba8353 DM |
159 | ], |
160 | listeners: { | |
d11524c6 | 161 | beforeselect: (grid, record, index, eOpts) => caps.nodes['Sys.Console'], |
f6710aac TL |
162 | itemdblclick: run_editor, |
163 | }, | |
b7ba8353 DM |
164 | }); |
165 | ||
166 | me.callParent(); | |
f6710aac | 167 | }, |
b7ba8353 | 168 | }); |