]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ha/Resources.js
update shipped appliance info index
[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 let me = this;
12
13 if (!me.rstore) {
14 throw "no store given";
15 }
16
17 Proxmox.Utils.monStoreErrors(me, me.rstore);
18 let store = Ext.create('Proxmox.data.DiffStore', {
19 rstore: me.rstore,
20 filters: {
21 property: 'type',
22 value: 'service',
23 },
24 });
25
26 let sm = Ext.create('Ext.selection.RowModel', {});
27
28 let run_editor = function() {
29 let rec = sm.getSelection()[0];
30 let sid = rec.data.sid;
31
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}`);
35 return;
36 }
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,
45 });
46 };
47
48 let caps = Ext.state.Manager.get('GuiCap');
49
50 Ext.apply(me, {
51 store: store,
52 selModel: sm,
53 viewConfig: {
54 trackOver: false,
55 },
56 tbar: [
57 {
58 text: gettext('Add'),
59 disabled: !caps.nodes['Sys.Console'],
60 handler: function() {
61 Ext.create('PVE.ha.VMResourceEdit', {
62 listeners: {
63 destroy: () => me.rstore.load(),
64 },
65 autoShow: true,
66 });
67 },
68 },
69 {
70 xtype: 'proxmoxButton',
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')}`;
81 },
82 callback: () => me.rstore.load(),
83 },
84 ],
85 columns: [
86 {
87 header: 'ID',
88 width: 100,
89 sortable: true,
90 dataIndex: 'sid',
91 },
92 {
93 header: gettext('State'),
94 width: 100,
95 sortable: true,
96 dataIndex: 'state',
97 },
98 {
99 header: gettext('Node'),
100 width: 100,
101 sortable: true,
102 dataIndex: 'node',
103 },
104 {
105 header: gettext('Request State'),
106 width: 100,
107 hidden: true,
108 sortable: true,
109 renderer: v => v || 'started',
110 dataIndex: 'request_state',
111 },
112 {
113 header: gettext('CRM State'),
114 width: 100,
115 hidden: true,
116 sortable: true,
117 dataIndex: 'crm_state',
118 },
119 {
120 header: gettext('Name'),
121 width: 100,
122 sortable: true,
123 dataIndex: 'vname',
124 },
125 {
126 header: gettext('Max. Restart'),
127 width: 100,
128 sortable: true,
129 renderer: (v) => v === undefined ? '1' : v,
130 dataIndex: 'max_restart',
131 },
132 {
133 header: gettext('Max. Relocate'),
134 width: 100,
135 sortable: true,
136 renderer: (v) => v === undefined ? '1' : v,
137 dataIndex: 'max_relocate',
138 },
139 {
140 header: gettext('Group'),
141 width: 200,
142 sortable: true,
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;
150 },
151 dataIndex: 'group',
152 },
153 {
154 header: gettext('Description'),
155 flex: 1,
156 renderer: Ext.String.htmlEncode,
157 dataIndex: 'comment',
158 },
159 ],
160 listeners: {
161 beforeselect: (grid, record, index, eOpts) => caps.nodes['Sys.Console'],
162 itemdblclick: run_editor,
163 },
164 });
165
166 me.callParent();
167 },
168 });