]> git.proxmox.com Git - proxmox-widget-toolkit.git/blobdiff - window/Edit.js
add apiCallDone callback for window.edit
[proxmox-widget-toolkit.git] / window / Edit.js
index 8c699059e2946a69dbd4fff7858e4ebe6637d1e6..aeb8019c7a4cb6d89daeb4dfe19061b47ad29975 100644 (file)
@@ -13,9 +13,9 @@ Ext.define('Proxmox.window.Edit', {
     // Create: <subject>
     subject: undefined,
 
-    // set create to true if you want a Create button (instead
+    // set isCreate to true if you want a Create button (instead
     // OK and RESET)
-    create: false,
+    isCreate: false,
 
     // set to true if you want an Add button (instead of Create)
     isAdd: false,
@@ -23,10 +23,36 @@ Ext.define('Proxmox.window.Edit', {
     // set to true if you want an Remove button (instead of Create)
     isRemove: false,
 
+    // custom submitText
+    submitText: undefined,
+
     backgroundDelay: 0,
 
+    // needed for finding the reference to submitbutton
+    // because we do not have a controller
+    referenceHolder: true,
+    defaultButton: 'submitbutton',
+
+    // finds the first form field
+    defaultFocus: 'field[disabled=false][hidden=false]',
+
     showProgress: false,
 
+    showTaskViewer: false,
+
+    // gets called if we have a progress bar or taskview and it detected that
+    // the task finished. function(success)
+    taskDone: Ext.emptyFn,
+
+    // gets called when the api call is finished, right at the beginning
+    // function(success, response, options)
+    apiCallDone: Ext.emptyFn,
+
+    // assign a reference from docs, to add a help button docked to the
+    // bottom of the window. If undefined we magically fall back to the
+    // onlineHelp of our first item, if set.
+    onlineHelp: undefined,
+
     isValid: function() {
        var me = this;
 
@@ -108,23 +134,29 @@ Ext.define('Proxmox.window.Edit', {
            method: me.method || (me.backgroundDelay ? 'POST' : 'PUT'),
            params: values,
            failure: function(response, options) {
+               me.apiCallDone(false, response, options);
+
                if (response.result && response.result.errors) {
                    form.markInvalid(response.result.errors);
                }
                Ext.Msg.alert(gettext('Error'), response.htmlStatus);
            },
            success: function(response, options) {
-               var hasProgressBar = (me.backgroundDelay || me.showProgress) &&
+               var hasProgressBar = (me.backgroundDelay || me.showProgress || me.showTaskViewer) &&
                    response.result.data ? true : false;
 
+               me.apiCallDone(true, response, options);
+
                if (hasProgressBar) {
                    // stay around so we can trigger our close events
                    // when background action is completed
                    me.hide();
 
                    var upid = response.result.data;
-                   var win = Ext.create('PVE.window.TaskProgress', {
+                   var viewerClass = me.showTaskViewer ? 'Viewer' : 'Progress';
+                   var win = Ext.create('Proxmox.window.Task' + viewerClass, {
                        upid: upid,
+                       taskDone: me.taskDone,
                        listeners: {
                            destroy: function () {
                                me.close();
@@ -187,6 +219,8 @@ Ext.define('Proxmox.window.Edit', {
            throw "no url specified";
        }
 
+       if (me.create) {throw "deprecated parameter, use isCreate";}
+
        var items = Ext.isArray(me.items) ? me.items : [ me.items ];
 
        me.items = undefined;
@@ -197,9 +231,9 @@ Ext.define('Proxmox.window.Edit', {
            trackResetOnLoad: true,
            bodyPadding: 10,
            border: false,
-           defaults: {
+           defaults: Ext.apply({}, me.defaults, {
                border: false
-           },
+           }),
            fieldDefaults: Ext.apply({}, me.fieldDefaults, {
                labelWidth: 100,
                anchor: '100%'
@@ -212,8 +246,10 @@ Ext.define('Proxmox.window.Edit', {
        var form = me.formPanel.getForm();
 
        var submitText;
-       if (me.create) {
-           if (me.isAdd) {
+       if (me.isCreate) {
+           if (me.submitText) {
+               submitText = me.submitText;
+           } else if (me.isAdd) {
                submitText = gettext('Add');
            } else if (me.isRemove) {
                submitText = gettext('Remove');
@@ -221,12 +257,13 @@ Ext.define('Proxmox.window.Edit', {
                submitText = gettext('Create');
            }
        } else {
-           submitText = gettext('OK');
+           submitText = me.submitText || gettext('OK');
        }
 
        var submitBtn = Ext.create('Ext.Button', {
+           reference: 'submitbutton',
            text: submitText,
-           disabled: !me.create,
+           disabled: !me.isCreate,
            handler: function() {
                me.submit();
            }
@@ -243,8 +280,25 @@ Ext.define('Proxmox.window.Edit', {
        var set_button_status = function() {
            var valid = form.isValid();
            var dirty = form.isDirty();
-           submitBtn.setDisabled(!valid || !(dirty || me.create));
+           submitBtn.setDisabled(!valid || !(dirty || me.isCreate));
            resetBtn.setDisabled(!dirty);
+
+           if (inputPanel && inputPanel.hasAdvanced) {
+               // we want to show the advanced options
+               // as soon as some of it is not valid
+               var advancedItems = me.down('#advancedContainer').query('field');
+               var valid = true;
+               advancedItems.forEach(function(field) {
+                   if (!field.isValid()) {
+                       valid = false;
+                   }
+               });
+
+               if (!valid) {
+                   inputPanel.setAdvancedVisible(true);
+                   me.down('#advancedcb').setValue(true);
+               }
+           }
        };
 
        form.on('dirtychange', set_button_status);
@@ -259,19 +313,46 @@ Ext.define('Proxmox.window.Edit', {
            (inputPanel.column1 || inputPanel.column2);
 
        if (me.subject && !me.title) {
-           me.title = Proxmox.Utils.dialog_title(me.subject, me.create, me.isAdd);
+           me.title = Proxmox.Utils.dialog_title(me.subject, me.isCreate, me.isAdd);
        }
 
-       if (me.create) {
+       if (me.isCreate) {
                me.buttons = [ submitBtn ] ;
        } else {
                me.buttons = [ submitBtn, resetBtn ];
        }
 
-       if (inputPanel && inputPanel.onlineHelp) {
-           var helpButton = Ext.create('PVE.button.Help');
+       if (inputPanel && inputPanel.hasAdvanced) {
+           var sp = Ext.state.Manager.getProvider();
+           var advchecked = sp.get('proxmox-advanced-cb');
+           inputPanel.setAdvancedVisible(advchecked);
+           me.buttons.unshift(
+              {
+                  xtype: 'proxmoxcheckbox',
+                  itemId: 'advancedcb',
+                  boxLabelAlign: 'before',
+                  boxLabel: gettext('Advanced'),
+                  stateId: 'proxmox-advanced-cb',
+                  value: advchecked,
+                  listeners: {
+                      change: function(cb, val) {
+                          inputPanel.setAdvancedVisible(val);
+                          sp.set('proxmox-advanced-cb', val);
+                      }
+                  }
+              }
+           );
+       }
+
+       var onlineHelp = me.onlineHelp;
+       if (!onlineHelp && inputPanel && inputPanel.onlineHelp) {
+           onlineHelp = inputPanel.onlineHelp;
+       }
+
+       if (onlineHelp) {
+           var helpButton = Ext.create('Proxmox.button.Help');
            me.buttons.unshift(helpButton, '->');
-           Ext.GlobalEvents.fireEvent('pveShowHelp', items[0].onlineHelp);
+           Ext.GlobalEvents.fireEvent('proxmoxShowHelp', onlineHelp);
        }
 
        Ext.applyIf(me, {