]> git.proxmox.com Git - pve-manager.git/blob - www/manager5/window/Edit.js
e150cf1d9f082a2db7c3c71af609f95bd579391f
[pve-manager.git] / www / manager5 / window / Edit.js
1 // fixme: how can we avoid those lint errors?
2 /*jslint confusion: true */
3 Ext.define('PVE.window.Edit', {
4 extend: 'Ext.window.Window',
5 alias: 'widget.pveWindowEdit',
6
7 resizable: false,
8
9 // use this tio atimatically generate a title like
10 // Create: <subject>
11 subject: undefined,
12
13 // set create to true if you want a Create button (instead
14 // OK and RESET)
15 create: false,
16
17 // set to true if you want an Add button (instead of Create)
18 isAdd: false,
19
20 // set to true if you want an Remove button (instead of Create)
21 isRemove: false,
22
23 backgroundDelay: 0,
24
25 showProgress: false,
26
27 isValid: function() {
28 var me = this;
29
30 var form = me.formPanel.getForm();
31 return form.isValid();
32 },
33
34 getValues: function(dirtyOnly) {
35 var me = this;
36
37 var values = {};
38
39 var form = me.formPanel.getForm();
40
41 form.getFields().each(function(field) {
42 if (!field.up('inputpanel') && (!dirtyOnly || field.isDirty())) {
43 PVE.Utils.assemble_field_data(values, field.getSubmitData());
44 }
45 });
46
47 Ext.Array.each(me.query('inputpanel'), function(panel) {
48 PVE.Utils.assemble_field_data(values, panel.getValues(dirtyOnly));
49 });
50
51 return values;
52 },
53
54 setValues: function(values) {
55 var me = this;
56
57 var form = me.formPanel.getForm();
58
59 Ext.iterate(values, function(fieldId, val) {
60 var field = form.findField(fieldId);
61 if (field && !field.up('inputpanel')) {
62 field.setValue(val);
63 if (form.trackResetOnLoad) {
64 field.resetOriginalValue();
65 }
66 }
67 });
68
69 Ext.Array.each(me.query('inputpanel'), function(panel) {
70 panel.setValues(values);
71 });
72 },
73
74 submit: function() {
75 var me = this;
76
77 var form = me.formPanel.getForm();
78
79 var values = me.getValues();
80 Ext.Object.each(values, function(name, val) {
81 if (values.hasOwnProperty(name)) {
82 if (Ext.isArray(val) && !val.length) {
83 values[name] = '';
84 }
85 }
86 });
87
88 if (me.digest) {
89 values.digest = me.digest;
90 }
91
92 if (me.backgroundDelay) {
93 values.background_delay = me.backgroundDelay;
94 }
95
96 var url = me.url;
97 if (me.method === 'DELETE') {
98 url = url + "?" + Ext.Object.toQueryString(values);
99 values = undefined;
100 }
101
102 PVE.Utils.API2Request({
103 url: url,
104 waitMsgTarget: me,
105 method: me.method || (me.backgroundDelay ? 'POST' : 'PUT'),
106 params: values,
107 failure: function(response, options) {
108 if (response.result && response.result.errors) {
109 form.markInvalid(response.result.errors);
110 }
111 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
112 },
113 success: function(response, options) {
114 me.close();
115 if ((me.backgroundDelay || me.showProgress) &&
116 response.result.data) {
117 var upid = response.result.data;
118 var win = Ext.create('PVE.window.TaskProgress', {
119 upid: upid
120 });
121 win.show();
122 }
123 }
124 });
125 },
126
127 load: function(options) {
128 var me = this;
129
130 var form = me.formPanel.getForm();
131
132 options = options || {};
133
134 var newopts = Ext.apply({
135 waitMsgTarget: me
136 }, options);
137
138 var createWrapper = function(successFn) {
139 Ext.apply(newopts, {
140 url: me.url,
141 method: 'GET',
142 success: function(response, opts) {
143 form.clearInvalid();
144 me.digest = response.result.data.digest;
145 if (successFn) {
146 successFn(response, opts);
147 } else {
148 me.setValues(response.result.data);
149 }
150 // hack: fix ExtJS bug
151 Ext.Array.each(me.query('radiofield'), function(f) {
152 f.resetOriginalValue();
153 });
154 },
155 failure: function(response, opts) {
156 Ext.Msg.alert(gettext('Error'), response.htmlStatus, function() {
157 me.close();
158 });
159 }
160 });
161 };
162
163 createWrapper(options.success);
164
165 PVE.Utils.API2Request(newopts);
166 },
167
168 initComponent : function() {
169 var me = this;
170
171 if (!me.url) {
172 throw "no url specified";
173 }
174
175 var items = Ext.isArray(me.items) ? me.items : [ me.items ];
176
177 me.items = undefined;
178
179 me.formPanel = Ext.create('Ext.form.Panel', {
180 url: me.url,
181 method: me.method || 'PUT',
182 trackResetOnLoad: true,
183 bodyPadding: 10,
184 border: false,
185 defaults: {
186 border: false
187 },
188 fieldDefaults: Ext.apply({}, me.fieldDefaults, {
189 labelWidth: 100,
190 anchor: '100%'
191 }),
192 items: items
193 });
194
195 var form = me.formPanel.getForm();
196
197 var submitBtn = Ext.create('Ext.Button', {
198 text: me.create ? (me.isAdd ? gettext('Add') : ( me.isRemove ? gettext('Remove') : gettext('Create'))) : gettext('OK'),
199 disabled: !me.create,
200 handler: function() {
201 me.submit();
202 }
203 });
204
205 var resetBtn = Ext.create('Ext.Button', {
206 text: 'Reset',
207 disabled: true,
208 handler: function(){
209 form.reset();
210 }
211 });
212
213 var set_button_status = function() {
214 var valid = form.isValid();
215 var dirty = form.isDirty();
216 submitBtn.setDisabled(!valid || !(dirty || me.create));
217 resetBtn.setDisabled(!dirty);
218 };
219
220 form.on('dirtychange', set_button_status);
221 form.on('validitychange', set_button_status);
222
223 var colwidth = 300;
224 if (me.fieldDefaults && me.fieldDefaults.labelWidth) {
225 colwidth += me.fieldDefaults.labelWidth - 100;
226 }
227
228
229 var twoColumn = items[0].column1 || items[0].column2;
230
231 if (me.subject && !me.title) {
232 me.title = PVE.Utils.dialog_title(me.subject, me.create, me.isAdd);
233 }
234
235 if (me.create) {
236 me.buttons = [ submitBtn ] ;
237 } else {
238 me.buttons = [ submitBtn, resetBtn ];
239 }
240
241 Ext.applyIf(me, {
242 modal: true,
243 width: twoColumn ? colwidth*2 : colwidth,
244 border: false,
245 items: [ me.formPanel ],
246 });
247
248 me.callParent();
249
250 // always mark invalid fields
251 me.on('afterlayout', function() {
252 me.isValid();
253 });
254 }
255 });