opens a window with the parameters for the sync and two buttons:
'preview' and 'sync'

both open the taskviewer, but the 'preview' one sets the 'dry-run'
parameter so that it does not get written out to the user.cfg

loads the realm config and prefills the selection with values from
the config, and shows a hint about where to set the defaults
if none are set

Signed-off-by: Dominik Csapak <d.csa...@proxmox.com>
---
changes from v2:
* drop the '(from Config)' and '(Default)' options
* show a hint about where to set default options
* show window after closing the task of a preview

 www/manager6/Makefile         |   1 +
 www/manager6/dc/AuthView.js   |  21 ++++
 www/manager6/dc/SyncWindow.js | 186 ++++++++++++++++++++++++++++++++++
 3 files changed, 208 insertions(+)
 create mode 100644 www/manager6/dc/SyncWindow.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 057a4211..ff93b224 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -232,6 +232,7 @@ JSSRC=                                                      
\
        dc/RoleView.js                                  \
        dc/RoleEdit.js                                  \
        dc/ACLView.js                                   \
+       dc/SyncWindow.js                                \
        dc/AuthView.js                                  \
        dc/AuthEditBase.js                              \
        dc/AuthEditAD.js                                \
diff --git a/www/manager6/dc/AuthView.js b/www/manager6/dc/AuthView.js
index a2486fef..3e5a8517 100644
--- a/www/manager6/dc/AuthView.js
+++ b/www/manager6/dc/AuthView.js
@@ -73,6 +73,19 @@ Ext.define('PVE.dc.AuthView', {
        me.openEditWindow(rec.data.type, rec.data.realm);
     },
 
+    open_sync_window: function() {
+       let me = this;
+       let rec = me.getSelection()[0];
+       if (!rec) {
+           return;
+       }
+       Ext.create('PVE.dc.SyncWindow', {
+           realm: rec.data.realm,
+           listeners: {
+               destroy: () => me.reload(),
+           },
+       }).show();
+    },
 
     initComponent: function() {
        var me = this;
@@ -107,6 +120,14 @@ Ext.define('PVE.dc.AuthView', {
                    enableFn: (rec) => PVE.Utils.authSchema[rec.data.type].add,
                    callback: () => me.reload(),
                },
+               '-',
+               {
+                   xtype: 'proxmoxButton',
+                   text: gettext('Sync'),
+                   disabled: true,
+                   enableFn: (rec) => 
Boolean(PVE.Utils.authSchema[rec.data.type].syncipanel),
+                   handler: () => me.open_sync_window(),
+               },
            ],
            listeners: {
                activate: () => me.reload(),
diff --git a/www/manager6/dc/SyncWindow.js b/www/manager6/dc/SyncWindow.js
new file mode 100644
index 00000000..351a3f0f
--- /dev/null
+++ b/www/manager6/dc/SyncWindow.js
@@ -0,0 +1,186 @@
+Ext.define('PVE.dc.SyncWindow', {
+    extend: 'Ext.window.Window',
+
+    title: gettext('Realm Sync'),
+
+    width: 600,
+    bodyPadding: 10,
+    modal: true,
+    resizable: false,
+
+    controller: {
+       xclass: 'Ext.app.ViewController',
+
+       control: {
+           'form': {
+               validitychange: function(field, valid) {
+                   let me = this;
+                   me.lookup('preview_btn').setDisabled(!valid);
+                   me.lookup('sync_btn').setDisabled(!valid);
+               },
+           },
+           'button': {
+               click: function(btn) {
+                   this.sync_realm(btn.reference === 'preview_btn');
+               },
+           },
+       },
+
+       sync_realm: function(is_preview) {
+           let me = this;
+           let view = me.getView();
+           let ipanel = me.lookup('ipanel');
+           let params = ipanel.getValues();
+           params['dry-run'] = is_preview ? 1 : 0;
+           Proxmox.Utils.API2Request({
+               url: `/access/domains/${view.realm}/sync`,
+               waitMsgTarget: view,
+               method: 'POST',
+               params,
+               failure: function(response) {
+                   view.show();
+                   Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+               },
+               success: function(response) {
+                   view.hide();
+                   Ext.create('Proxmox.window.TaskViewer', {
+                       upid: response.result.data,
+                       listeners: {
+                           destroy: function() {
+                               if (is_preview) {
+                                   view.show();
+                               } else {
+                                   view.close();
+                               }
+                           },
+                       },
+                   }).show();
+               },
+           });
+       },
+    },
+
+    items: [
+       {
+           xtype: 'form',
+           reference: 'form',
+           border: false,
+           fieldDefaults: {
+               labelWidth: 100,
+               anchor: '100%',
+           },
+           items: [{
+               xtype: 'inputpanel',
+               reference: 'ipanel',
+               column1: [
+                   {
+                       xtype: 'proxmoxKVComboBox',
+                       name: 'scope',
+                       fieldLabel: gettext('Scope'),
+                       value: '',
+                       deleteEmpty: false,
+                       allowBlank: false,
+                       comboItems: [
+                           ['users', gettext('Users')],
+                           ['groups', gettext('Groups')],
+                           ['both', gettext('Users and Groups')],
+                       ],
+                   },
+                   {
+                       xtype: 'proxmoxKVComboBox',
+                       value: '',
+                       deleteEmpty: false,
+                       allowBlank: false,
+                       comboItems: [
+                           ['1', Proxmox.Utils.yesText],
+                           ['0', Proxmox.Utils.noText],
+                       ],
+                       name: 'full',
+                       fieldLabel: gettext('Full'),
+                   },
+               ],
+
+               column2: [
+                   {
+                       xtype: 'proxmoxKVComboBox',
+                       value: '1',
+                       deleteEmpty: false,
+                       allowBlank: false,
+                       comboItems: [
+                           ['1', Proxmox.Utils.yesText],
+                           ['0', Proxmox.Utils.noText],
+                       ],
+                       name: 'enable-new',
+                       fieldLabel: gettext('Enable new'),
+                   },
+                   {
+                       xtype: 'proxmoxKVComboBox',
+                       value: '',
+                       deleteEmpty: false,
+                       allowBlank: false,
+                       comboItems: [
+                           ['1', Proxmox.Utils.yesText],
+                           ['0', Proxmox.Utils.noText],
+                       ],
+                       name: 'purge',
+                       fieldLabel: gettext('Purge'),
+                   },
+               ],
+
+               columnB: [
+                   {
+                       xtype: 'displayfield',
+                       reference: 'defaulthint',
+                       value: gettext('Default sync options can be set by 
editing the realm.'),
+                       userCls: 'pmx-hint',
+                       hidden: true
+                   },
+               ],
+           }],
+       },
+    ],
+
+    buttons: [
+       {
+           text: gettext('Preview'),
+           reference: 'preview_btn',
+       },
+       {
+           text: gettext('Sync'),
+           reference: 'sync_btn',
+       },
+    ],
+
+    initComponent: function() {
+       let me = this;
+
+       if (!me.realm) {
+           throw "no realm defined";
+       }
+
+       me.callParent();
+
+       Proxmox.Utils.API2Request({
+           url: `/access/domains/${me.realm}`,
+           waitMsgTarget: me,
+           method: 'GET',
+           failure: function(response) {
+               Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+               me.close();
+           },
+           success: function(response) {
+               let default_options = 
response.result.data['sync-defaults-options'];
+               if (default_options) {
+                   let options = 
PVE.Parser.parsePropertyString(default_options);
+                   let ipanel = me.lookup('ipanel');
+                   ipanel.setValues(options);
+               } else {
+                   me.lookup('defaulthint').setVisible(true);
+               }
+
+               // check validity for button state
+               me.lookup('form').isValid();
+           },
+       });
+    },
+});
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to