]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/ha/Resources.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / ha / Resources.js
CommitLineData
b7ba8353
DM
1Ext.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});