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