]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ha/ResourceEdit.js
disable submit button in migrate window when not valid
[pve-manager.git] / www / manager6 / ha / ResourceEdit.js
1 Ext.define('PVE.ha.VMResourceInputPanel', {
2 extend: 'PVE.panel.InputPanel',
3 onlineHelp: 'ha_manager_resource_config',
4 vmid: undefined,
5
6 onGetValues: function(values) {
7 var me = this;
8
9 if (me.create) {
10 values.sid = values.vmid;
11 }
12
13
14 delete values.vmid;
15
16 PVE.Utils.delete_if_default(values, 'group', '', me.create);
17 PVE.Utils.delete_if_default(values, 'max_restart', '1', me.create);
18 PVE.Utils.delete_if_default(values, 'max_relocate', '1', me.create);
19
20 return values;
21 },
22
23 initComponent : function() {
24 var me = this;
25 var MIN_QUORUM_VOTES = 3;
26
27 var disabledHint = Ext.createWidget({
28 xtype: 'displayfield', //submitValue is false, so we don't get submitted
29 userCls: 'pve-hint',
30 value: gettext('Disabling the resource will stop the guest system. ' +
31 'See the online help for details.'),
32 hidden: true
33 });
34
35 var fewVotesHint = Ext.createWidget({
36 itemId: 'fewVotesHint',
37 xtype: 'displayfield',
38 userCls: 'pve-hint',
39 updateValue: function(votes) {
40 var me = this;
41 me.setValue(gettext('You need at least three quorum votes for a reliable HA cluster. ' +
42 'See the online help for details. Current votes: ') + votes);
43 },
44 hidden: true
45 });
46
47 PVE.Utils.API2Request({
48 url: '/cluster/config/nodes',
49 method: 'GET',
50 failure: function(response) {
51 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
52 },
53 success: function(response) {
54 var nodes = response.result.data;
55 var votes = 0;
56 Ext.Array.forEach(nodes, function(node) {
57 var vote = parseInt(node.quorum_votes, 10); // parse as base 10
58 votes += vote || 0; // parseInt might return NaN, which is false
59 });
60
61 if (votes < MIN_QUORUM_VOTES) {
62 fewVotesHint.updateValue(votes);
63 fewVotesHint.setVisible(true);
64 }
65 }
66 });
67
68 me.column1 = [
69 {
70 xtype: me.vmid ? 'displayfield' : 'pveGuestIDSelector',
71 name: 'vmid',
72 fieldLabel: (me.vmid && me.guestType === 'ct') ? 'CT' : 'VM',
73 value: me.vmid,
74 loadNextGuestID: false,
75 validateExists: true
76 },
77 {
78 xtype: 'pveIntegerField',
79 name: 'max_restart',
80 fieldLabel: gettext('Max. Restart'),
81 value: 1,
82 minValue: 0,
83 maxValue: 10,
84 allowBlank: false
85 },
86 {
87 xtype: 'pveIntegerField',
88 name: 'max_relocate',
89 fieldLabel: gettext('Max. Relocate'),
90 value: 1,
91 minValue: 0,
92 maxValue: 10,
93 allowBlank: false
94 }
95 ];
96
97 // value is expected to be integer as it's above, ignore that
98 /*jslint confusion: true */
99 me.column2 = [
100 {
101 xtype: 'pveHAGroupSelector',
102 name: 'group',
103 fieldLabel: gettext('Group')
104 },
105 {
106 xtype: 'pveKVComboBox',
107 name: 'state',
108 value: 'started',
109 fieldLabel: gettext('Request State'),
110 comboItems: [
111 ['started', gettext('Started')],
112 ['stopped', gettext('Stopped')],
113 ['disabled', gettext('Disabled')]
114 ],
115 listeners: {
116 'change': function(field, newValue) {
117 if (newValue === 'disabled') {
118 disabledHint.setVisible(true);
119 }
120 else {
121 if (disabledHint.isVisible()) {
122 disabledHint.setVisible(false);
123 }
124 }
125 }
126 }
127 },
128 disabledHint
129 ];
130 /*jslint confusion: false */
131
132 me.columnB = [
133 {
134 xtype: 'textfield',
135 name: 'comment',
136 fieldLabel: gettext('Comment')
137 },
138 fewVotesHint
139 ];
140
141 me.callParent();
142 }
143 });
144
145 Ext.define('PVE.ha.VMResourceEdit', {
146 extend: 'PVE.window.Edit',
147
148 vmid: undefined,
149 guestType: undefined,
150
151 initComponent : function() {
152 var me = this;
153
154 me.create = !me.vmid;
155
156 if (me.create) {
157 me.url = '/api2/extjs/cluster/ha/resources';
158 me.method = 'POST';
159 } else {
160 me.url = '/api2/extjs/cluster/ha/resources/' + me.vmid;
161 me.method = 'PUT';
162 }
163
164 var ipanel = Ext.create('PVE.ha.VMResourceInputPanel', {
165 create: me.create,
166 vmid: me.vmid,
167 guestType: me.guestType
168 });
169
170 Ext.apply(me, {
171 subject: gettext('CT/VM Resource'),
172 isAdd: true,
173 items: [ ipanel ]
174 });
175
176 me.callParent();
177
178 if (!me.create) {
179 me.load({
180 success: function(response, options) {
181 var values = response.result.data;
182
183 var regex = /^(\S+):(\S+)$/;
184 var res = regex.exec(values.sid);
185
186 if (res[1] !== 'vm' && res[1] !== 'ct') {
187 throw "got unexpected resource type";
188 }
189
190 values.vmid = res[2];
191
192 ipanel.setValues(values);
193 }
194 });
195 }
196 }
197 });