From: Thomas Lamprecht Date: Sat, 25 Jul 2020 18:10:06 +0000 (+0200) Subject: ui: acl: add improved permission selector X-Git-Tag: v0.8.10~88 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=d757021f4c83326b1af2281149f44b4ce7a9fa1f;p=proxmox-backup.git ui: acl: add improved permission selector taken mostly from PVE, with adaption to how PBS does things. Main difference is that we do not have a resource store singleton here which we can use, but for datastores we can already use the always present datastore-list store. Register it to the store manager with a "storeId" property (vs. our internal storeid one). Signed-off-by: Thomas Lamprecht --- diff --git a/www/Makefile b/www/Makefile index 073f0383..d8c91a18 100644 --- a/www/Makefile +++ b/www/Makefile @@ -9,6 +9,7 @@ JSSRC= \ form/RemoteSelector.js \ form/DataStoreSelector.js \ form/CalendarEvent.js \ + form/PermissionPathSelector.js \ data/RunningTasksStore.js \ button/TaskButton.js \ config/UserView.js \ diff --git a/www/NavigationTree.js b/www/NavigationTree.js index d36e25e8..0fd9458d 100644 --- a/www/NavigationTree.js +++ b/www/NavigationTree.js @@ -102,6 +102,7 @@ Ext.define('PBS.view.main.NavigationTree', { view.rstore = Ext.create('Proxmox.data.UpdateStore', { autoStart: true, interval: 15 * 1000, + storeId: 'pbs-datastore-list', storeid: 'pbs-datastore-list', model: 'pbs-datastore-list' }); diff --git a/www/form/PermissionPathSelector.js b/www/form/PermissionPathSelector.js new file mode 100644 index 00000000..0138fedf --- /dev/null +++ b/www/form/PermissionPathSelector.js @@ -0,0 +1,73 @@ +Ext.define('PBS.data.PermissionPathsStore', { + extend: 'Ext.data.Store', + alias: 'store.pbsPermissionPaths', + fields: ['value'], + autoLoad: false, + data: [ + { 'value': '/' }, + { 'value': '/access' }, + { 'value': '/access/acl' }, + { 'value': '/access/users' }, + { 'value': '/datastore' }, + { 'value': '/remote' }, + { 'value': '/system' }, + { 'value': '/system/disks' }, + { 'value': '/system/log' }, + { 'value': '/system/network' }, + { 'value': '/system/network/dns' }, + { 'value': '/system/network/interfaces' }, + { 'value': '/system/services' }, + { 'value': '/system/status' }, + { 'value': '/system/tasks' }, + { 'value': '/system/time' }, + ], + + constructor: function(config) { + let me = this; + + config = config || {}; + me.callParent([config]); + + // TODO: this is but a HACK until we have some sort of resource + // storage like PVE + let datastores = Ext.data.StoreManager.lookup('pbs-datastore-list'); + + if (datastores) { + let donePaths = {}; + me.suspendEvents(); + datastores.each(function(record) { + let path = `/datastore/${record.data.store}`; + if (path !== undefined && !donePaths[path]) { + me.add({ value: path }); + donePaths[path] = 1; + } + }); + me.resumeEvents(); + + me.fireEvent('refresh', me); + me.fireEvent('datachanged', me); + } + + me.sort({ + property: 'value', + direction: 'ASC', + }); + }, +}); + +Ext.define('PBS.form.PermissionPathSelector', { + extend: 'Ext.form.field.ComboBox', + xtype: 'pbsPermissionPathSelector', + + valueField: 'value', + displayField: 'value', + typeAhead: true, + anyMatch: true, + queryMode: 'local', + + store: { + type: 'pbsPermissionPaths', + }, + regexText: gettext('Invalid permission path.'), + regex: /\/((access|datastore|remote|system)\/.*)?/, +}); diff --git a/www/window/ACLEdit.js b/www/window/ACLEdit.js index ba7a7f86..17879a3c 100644 --- a/www/window/ACLEdit.js +++ b/www/window/ACLEdit.js @@ -7,6 +7,7 @@ Ext.define('PBS.window.ACLEdit', { method: 'PUT', isAdd: true, isCreate: true, + width: 450, // caller can give a static path path: undefined, @@ -25,7 +26,7 @@ Ext.define('PBS.window.ACLEdit', { items: [ { - xtype: 'pmxDisplayEditField', + xtype: 'pbsPermissionPathSelector', fieldLabel: gettext('Path'), cbind: { editable: '{!path}',