[pve-devel] [PATCH pve-manager v2] fixes #1503 Add role CRUD to the GUI.
René Jochum
r.jochum at proxmox.com
Tue May 8 10:58:57 CEST 2018
As given in the subject this implements role create/update/delete over
the manager.
There's currently no coler highlightning for "special" roles.
Signed-off-by: René Jochum <r.jochum at proxmox.com>
---
www/manager6/Makefile | 2 +
www/manager6/dc/RoleEdit.js | 63 ++++++++++++++++++++++++++++
www/manager6/dc/RoleView.js | 74 +++++++++++++++++++++++++++++++--
www/manager6/form/PrivilegesSelector.js | 35 ++++++++++++++++
4 files changed, 170 insertions(+), 4 deletions(-)
create mode 100644 www/manager6/dc/RoleEdit.js
create mode 100644 www/manager6/form/PrivilegesSelector.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 81ddcc8d..7e9877b2 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -21,6 +21,7 @@ JSSRC= \
form/Boolean.js \
form/CompressionSelector.js \
form/PoolSelector.js \
+ form/PrivilegesSelector.js \
form/GroupSelector.js \
form/UserSelector.js \
form/RoleSelector.js \
@@ -185,6 +186,7 @@ JSSRC= \
dc/GroupView.js \
dc/GroupEdit.js \
dc/RoleView.js \
+ dc/RoleEdit.js \
dc/ACLView.js \
dc/AuthView.js \
dc/AuthEdit.js \
diff --git a/www/manager6/dc/RoleEdit.js b/www/manager6/dc/RoleEdit.js
new file mode 100644
index 00000000..2ab8752a
--- /dev/null
+++ b/www/manager6/dc/RoleEdit.js
@@ -0,0 +1,63 @@
+Ext.define('PVE.dc.RoleEdit', {
+ extend: 'Proxmox.window.Edit',
+ xtype: 'pveDcRoleEdit',
+
+ initComponent : function() {
+ var me = this;
+
+ me.isCreate = !me.roleid;
+
+ var url;
+ var method;
+
+ if (me.isCreate) {
+ url = '/api2/extjs/access/roles';
+ method = 'POST';
+ } else {
+ url = '/api2/extjs/access/roles/' + me.roleid;
+ method = 'PUT';
+ }
+
+ Ext.applyIf(me, {
+ subject: gettext('Role'),
+ url: url,
+ method: method,
+ items: [
+ {
+ xtype: me.isCreate ? 'proxmoxtextfield' : 'displayfield',
+ name: 'roleid',
+ value: me.roleid,
+ allowBlank: false,
+ fieldLabel: gettext('Name')
+ },
+ {
+ xtype: 'PrivilegesSelector',
+ name: 'privs',
+ value: me.privs,
+ allowBlank: false,
+ fieldLabel: gettext('Privileges')
+ }
+ ]
+ });
+
+ me.callParent();
+
+ Ext.apply(me, {
+ width: 400
+ });
+
+ if (!me.isCreate) {
+ me.load({
+ success: function(response) {
+ var data = response.result.data;
+ var keys = Ext.Object.getKeys(data);
+
+ me.setValues({
+ privs: keys,
+ roleid: me.roleid
+ });
+ }
+ });
+ }
+ }
+});
diff --git a/www/manager6/dc/RoleView.js b/www/manager6/dc/RoleView.js
index 611dfbb6..de54ab87 100644
--- a/www/manager6/dc/RoleView.js
+++ b/www/manager6/dc/RoleView.js
@@ -13,9 +13,9 @@ Ext.define('PVE.dc.RoleView', {
var store = new Ext.data.Store({
model: 'pve-roles',
- sorters: {
- property: 'roleid',
- order: 'DESC'
+ sorters: {
+ property: 'roleid',
+ order: 'DESC'
}
});
@@ -33,14 +33,46 @@ Ext.define('PVE.dc.RoleView', {
Proxmox.Utils.monStoreErrors(me, store);
+ var sm = Ext.create('Ext.selection.RowModel', {});
+
+ var reload = function() {
+ store.load();
+ };
+
+ var run_editor = function() {
+ var rec = sm.getSelection()[0];
+ if (!rec) {
+ return;
+ }
+
+ if (rec.data.special === "1") {
+ return;
+ }
+
+ var win = Ext.create('PVE.dc.RoleEdit',{
+ roleid: rec.data.roleid,
+ privs: rec.data.privs,
+ });
+ win.on('destroy', reload);
+ win.show();
+ };
+
Ext.apply(me, {
store: store,
+ selModel: sm,
viewConfig: {
trackOver: false
},
columns: [
{
+ header: gettext('Built-In'),
+ width: 65,
+ sortable: true,
+ dataIndex: 'special',
+ renderer: Proxmox.Utils.format_boolean
+ },
+ {
header: gettext('Name'),
width: 150,
sortable: true,
@@ -58,8 +90,42 @@ Ext.define('PVE.dc.RoleView', {
listeners: {
activate: function() {
store.load();
+ },
+ itemdblclick: run_editor,
+ },
+ tbar: [
+ {
+ text: gettext('Create'),
+ handler: function() {
+ var win = Ext.create('PVE.dc.RoleEdit', {});
+ win.on('destroy', reload);
+ win.show();
+ }
+ },
+ {
+ xtype: 'proxmoxButton',
+ text: gettext('Edit'),
+ disabled: true,
+ selModel: sm,
+ handler: run_editor,
+
+ enableFn: function(record) {
+ return record.data.special !== '1';
+ }
+ },
+ {
+ xtype: 'proxmoxStdRemoveButton',
+ selModel: sm,
+ callback: function() {
+ reload();
+ },
+ baseurl: '/access/roles/',
+
+ enableFn: function(record) {
+ return record.data.special !== '1';
+ }
}
- }
+ ]
});
me.callParent();
diff --git a/www/manager6/form/PrivilegesSelector.js b/www/manager6/form/PrivilegesSelector.js
new file mode 100644
index 00000000..516fca8d
--- /dev/null
+++ b/www/manager6/form/PrivilegesSelector.js
@@ -0,0 +1,35 @@
+Ext.define('PVE.form.PrivilegesSelector', {
+ extend: 'Proxmox.form.KVComboBox',
+ xtype: 'PrivilegesSelector',
+
+ multiSelect: true,
+
+ initComponent: function() {
+ var me = this;
+
+ // So me.store is available.
+ me.callParent();
+
+ Proxmox.Utils.API2Request({
+ url: '/access/roles/Administrator',
+ method: 'GET',
+ success: function(response, options) {
+ var data = [];
+ for (var key in response.result.data) {
+ data.push([key, key]);
+ }
+
+ me.store.setData(data);
+
+ me.store.sort({
+ property: 'key',
+ direction: 'ASC'
+ });
+ },
+
+ failure: function (response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ }
+ });
+ }
+});
--
2.11.0
More information about the pve-devel
mailing list