]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - window/Edit.js
1 // fixme: how can we avoid those lint errors?
2 Ext
.define('Proxmox.window.Edit', {
3 extend
: 'Ext.window.Window',
4 alias
: 'widget.proxmoxWindowEdit',
6 // autoLoad trigger a load() after component creation
11 // use this tio atimatically generate a title like
15 // set isCreate to true if you want a Create button (instead
19 // set to true if you want an Add button (instead of Create)
22 // set to true if you want an Remove button (instead of Create)
26 submitText
: undefined,
30 // needed for finding the reference to submitbutton
31 // because we do not have a controller
32 referenceHolder
: true,
33 defaultButton
: 'submitbutton',
35 // finds the first form field
36 defaultFocus
: 'field[disabled=false][hidden=false]',
40 showTaskViewer
: false,
42 // gets called if we have a progress bar or taskview and it detected that
43 // the task finished. function(success)
44 taskDone
: Ext
.emptyFn
,
46 // gets called when the api call is finished, right at the beginning
47 // function(success, response, options)
48 apiCallDone
: Ext
.emptyFn
,
50 // assign a reference from docs, to add a help button docked to the
51 // bottom of the window. If undefined we magically fall back to the
52 // onlineHelp of our first item, if set.
53 onlineHelp
: undefined,
58 let form
= me
.formPanel
.getForm();
59 return form
.isValid();
62 getValues: function(dirtyOnly
) {
67 let form
= me
.formPanel
.getForm();
69 form
.getFields().each(function(field
) {
70 if (!field
.up('inputpanel') && (!dirtyOnly
|| field
.isDirty())) {
71 Proxmox
.Utils
.assemble_field_data(values
, field
.getSubmitData());
75 Ext
.Array
.each(me
.query('inputpanel'), function(panel
) {
76 Proxmox
.Utils
.assemble_field_data(values
, panel
.getValues(dirtyOnly
));
82 setValues: function(values
) {
85 let form
= me
.formPanel
.getForm();
86 let formfields
= form
.getFields();
88 Ext
.iterate(values
, function(id
, val
) {
89 let fields
= formfields
.filterBy((f
) =>
90 (f
.id
=== id
|| f
.name
=== id
|| f
.dataIndex
=== id
) && !f
.up('inputpanel'),
92 fields
.each((field
) => {
94 if (form
.trackResetOnLoad
) {
95 field
.resetOriginalValue();
100 Ext
.Array
.each(me
.query('inputpanel'), function(panel
) {
101 panel
.setValues(values
);
105 setSubmitText: function(text
) {
106 this.lookup('submitbutton').setText(text
);
112 let form
= me
.formPanel
.getForm();
114 let values
= me
.getValues();
115 Ext
.Object
.each(values
, function(name
, val
) {
116 if (Object
.prototype.hasOwnProperty
.call(values
, name
)) {
117 if (Ext
.isArray(val
) && !val
.length
) {
124 values
.digest
= me
.digest
;
127 if (me
.backgroundDelay
) {
128 values
.background_delay
= me
.backgroundDelay
;
132 if (me
.method
=== 'DELETE') {
133 url
= url
+ "?" + Ext
.Object
.toQueryString(values
);
137 Proxmox
.Utils
.API2Request({
140 method
: me
.method
|| (me
.backgroundDelay
? 'POST' : 'PUT'),
142 failure: function(response
, options
) {
143 me
.apiCallDone(false, response
, options
);
145 if (response
.result
&& response
.result
.errors
) {
146 form
.markInvalid(response
.result
.errors
);
148 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
150 success: function(response
, options
) {
152 (me
.backgroundDelay
|| me
.showProgress
|| me
.showTaskViewer
) &&
153 response
.result
.data
;
155 me
.apiCallDone(true, response
, options
);
157 if (hasProgressBar
) {
158 // stay around so we can trigger our close events
159 // when background action is completed
162 let upid
= response
.result
.data
;
163 let viewerClass
= me
.showTaskViewer
? 'Viewer' : 'Progress';
164 Ext
.create('Proxmox.window.Task' + viewerClass
, {
167 taskDone
: me
.taskDone
,
169 destroy: function() {
181 load: function(options
) {
184 let form
= me
.formPanel
.getForm();
186 options
= options
|| {};
188 let newopts
= Ext
.apply({
192 let createWrapper = function(successFn
) {
196 success: function(response
, opts
) {
198 me
.digest
= response
.result
.digest
|| response
.result
.data
.digest
;
200 successFn(response
, opts
);
202 me
.setValues(response
.result
.data
);
204 // hack: fix ExtJS bug
205 Ext
.Array
.each(me
.query('radiofield'), function(f
) {
206 f
.resetOriginalValue();
209 failure: function(response
, opts
) {
210 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
, function() {
217 createWrapper(options
.success
);
219 Proxmox
.Utils
.API2Request(newopts
);
222 initComponent: function() {
226 throw "no url specified";
229 if (me
.create
) {throw "deprecated parameter, use isCreate";}
231 let items
= Ext
.isArray(me
.items
) ? me
.items
: [me
.items
];
233 me
.items
= undefined;
235 me
.formPanel
= Ext
.create('Ext.form.Panel', {
237 method
: me
.method
|| 'PUT',
238 trackResetOnLoad
: true,
239 bodyPadding
: me
.bodyPadding
!== undefined ? me
.bodyPadding
: 10,
241 defaults
: Ext
.apply({}, me
.defaults
, {
244 fieldDefaults
: Ext
.apply({}, me
.fieldDefaults
, {
251 let inputPanel
= me
.formPanel
.down('inputpanel');
253 let form
= me
.formPanel
.getForm();
258 submitText
= me
.submitText
;
259 } else if (me
.isAdd
) {
260 submitText
= gettext('Add');
261 } else if (me
.isRemove
) {
262 submitText
= gettext('Remove');
264 submitText
= gettext('Create');
267 submitText
= me
.submitText
|| gettext('OK');
270 let submitBtn
= Ext
.create('Ext.Button', {
271 reference
: 'submitbutton',
273 disabled
: !me
.isCreate
,
274 handler: function() {
279 let resetBtn
= Ext
.create('Ext.Button', {
282 handler: function() {
287 let set_button_status = function() {
288 let valid
= form
.isValid();
289 let dirty
= form
.isDirty();
290 submitBtn
.setDisabled(!valid
|| !(dirty
|| me
.isCreate
));
291 resetBtn
.setDisabled(!dirty
);
293 if (inputPanel
&& inputPanel
.hasAdvanced
) {
294 // we want to show the advanced options
295 // as soon as some of it is not valid
296 let advancedItems
= me
.down('#advancedContainer').query('field');
297 let allAdvancedValid
= true;
298 advancedItems
.forEach(function(field
) {
299 if (!field
.isValid()) {
300 allAdvancedValid
= false;
304 if (!allAdvancedValid
) {
305 inputPanel
.setAdvancedVisible(true);
306 me
.down('#advancedcb').setValue(true);
311 form
.on('dirtychange', set_button_status
);
312 form
.on('validitychange', set_button_status
);
315 if (me
.fieldDefaults
&& me
.fieldDefaults
.labelWidth
) {
316 colwidth
+= me
.fieldDefaults
.labelWidth
- 100;
319 let twoColumn
= inputPanel
&& (inputPanel
.column1
|| inputPanel
.column2
);
321 if (me
.subject
&& !me
.title
) {
322 me
.title
= Proxmox
.Utils
.dialog_title(me
.subject
, me
.isCreate
, me
.isAdd
);
326 me
.buttons
= [submitBtn
];
328 me
.buttons
= [submitBtn
, resetBtn
];
331 if (inputPanel
&& inputPanel
.hasAdvanced
) {
332 let sp
= Ext
.state
.Manager
.getProvider();
333 let advchecked
= sp
.get('proxmox-advanced-cb');
334 inputPanel
.setAdvancedVisible(advchecked
);
337 xtype
: 'proxmoxcheckbox',
338 itemId
: 'advancedcb',
339 boxLabelAlign
: 'before',
340 boxLabel
: gettext('Advanced'),
341 stateId
: 'proxmox-advanced-cb',
344 change: function(cb
, val
) {
345 inputPanel
.setAdvancedVisible(val
);
346 sp
.set('proxmox-advanced-cb', val
);
353 let onlineHelp
= me
.onlineHelp
;
354 if (!onlineHelp
&& inputPanel
&& inputPanel
.onlineHelp
) {
355 onlineHelp
= inputPanel
.onlineHelp
;
359 let helpButton
= Ext
.create('Proxmox.button.Help');
360 me
.buttons
.unshift(helpButton
, '->');
361 Ext
.GlobalEvents
.fireEvent('proxmoxShowHelp', onlineHelp
);
366 width
: twoColumn
? colwidth
*2 : colwidth
,
368 items
: [me
.formPanel
],
373 // always mark invalid fields
374 me
.on('afterlayout', function() {
375 // on touch devices, the isValid function
376 // triggers a layout, which triggers an isValid
378 // to prevent this we disable the layouting here
379 // and enable it afterwards
380 me
.suspendLayout
= true;
382 me
.suspendLayout
= false;