[pve-devel] [PATCH v3 manager 6/9] www: add permissions button to userview
Fabian Grünbichler
f.gruenbichler at proxmox.com
Tue Jan 21 13:54:26 CET 2020
Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---
www/manager6/Makefile | 1 +
www/manager6/dc/PermissionView.js | 167 ++++++++++++++++++++++++++++++
www/manager6/dc/UserView.js | 14 ++-
3 files changed, 181 insertions(+), 1 deletion(-)
create mode 100644 www/manager6/dc/PermissionView.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index a6926b5b..d232e635 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -224,6 +224,7 @@ JSSRC= \
dc/NodeView.js \
dc/Cluster.js \
dc/ClusterEdit.js \
+ dc/PermissionView.js \
Workspace.js
lint: ${JSSRC}
diff --git a/www/manager6/dc/PermissionView.js b/www/manager6/dc/PermissionView.js
new file mode 100644
index 00000000..12bf8e20
--- /dev/null
+++ b/www/manager6/dc/PermissionView.js
@@ -0,0 +1,167 @@
+/*jslint confusion: true */
+
+Ext.define('pve-permissions', {
+ extend: 'Ext.data.TreeModel',
+ fields: [
+ 'text', 'type',
+ { type: 'boolean', name: 'propagate' }
+ ]
+});
+
+Ext.define('PVE.dc.PermissionGridPanel', {
+ extend: 'Ext.tree.Panel',
+ onlineHelp: 'chapter_user_management',
+
+ scrollable: true,
+
+ sorterFn: function(rec1, rec2) {
+ var v1, v2;
+
+ if (rec1.data.type != rec2.data.type) {
+ v2 = rec1.data.type;
+ v1 = rec2.data.type;
+ } else {
+ v1 = rec1.data.text;
+ v2 = rec2.data.text;
+ }
+
+ return (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0));
+ },
+
+ initComponent: function() {
+ var me = this;
+
+ Proxmox.Utils.API2Request({
+ url: '/access/permissions?userid=' + me.userid,
+ method: 'GET',
+ failure: function(response, opts) {
+ Proxmox.Utils.setErrorMask(me, response.htmlStatus);
+ me.load_task.delay(me.load_delay);
+ },
+ success: function(response, opts) {
+ Proxmox.Utils.setErrorMask(me, false);
+ var result = Ext.decode(response.responseText);
+ var data = result.data || {};
+ var records = [];
+
+ var root = { name: '__root', expanded: true, children: [] };
+ var idhash = {};
+ Ext.Object.each(data, function(path, perms) {
+ var path_item = {};
+ path_item.text = path;
+ path_item.type = 'path';
+ path_item.children = [];
+ Ext.Object.each(perms, function(perm, propagate) {
+ var perm_item = {};
+ perm_item.text = perm;
+ perm_item.type = 'perm';
+ perm_item.propagate = propagate == 1 ? true : false;
+ perm_item.iconCls = 'fa fa-fw fa-unlock';
+ perm_item.leaf = true;
+ path_item.children.push(perm_item);
+ path_item.expandable = true;
+ });
+ idhash[path] = path_item;
+ });
+
+ if (!idhash['/']) {
+ idhash['/'] = {
+ children: [],
+ text: '/',
+ type: 'path',
+ };
+ }
+
+ Ext.Object.each(idhash, function(path, item) {
+ var parent_item;
+ if (path == '/') {
+ parent_item = root;
+ item.expand = true;
+ } else {
+ let split_path = path.split('/');
+ while (split_path.pop()) {
+ let parent_path = split_path.join('/');
+ if (parent_item = idhash[parent_path]) {
+ break;
+ }
+ }
+ }
+ if (!parent_item) {
+ parent_item = idhash['/'];
+ }
+ parent_item.children.push(item);
+ });
+
+ me.setRootNode(root);
+ }
+ });
+
+ var sm = Ext.create('Ext.selection.RowModel', {});
+
+ Ext.apply(me, {
+ layout: 'fit',
+ rootVisible: false,
+ animate: false,
+ sortableColumns: false,
+ selModel: sm,
+ columns: [
+ {
+ xtype: 'treecolumn',
+ header: gettext('Path') + '/' + gettext('Permission'),
+ flex: 1,
+ sortable: true,
+ dataIndex: 'text'
+ },
+ {
+ header: gettext('Propagate'),
+ width: 80,
+ sortable: true,
+ renderer: function(value) {
+ if (Ext.isDefined(value)) {
+ return Proxmox.Utils.format_boolean(value);
+ } else {
+ return '';
+ }
+ },
+ dataIndex: 'propagate'
+ },
+ ],
+ listeners: {
+ }
+ });
+
+ me.callParent();
+
+ me.store.sorters.add(new Ext.util.Sorter({
+ sorterFn: me.sorterFn
+ }));
+ }
+});
+
+Ext.define('PVE.dc.PermissionView', {
+ extend: 'Ext.window.Window',
+ scrollable: true,
+ width: 800,
+ height: 600,
+ layout: 'fit',
+
+ initComponent: function() {
+ var me = this;
+
+ if (!me.userid) {
+ throw "no userid specified";
+ }
+
+ var grid = Ext.create('PVE.dc.PermissionGridPanel', {
+ userid: me.userid
+ });
+
+ Ext.apply(me, {
+ title: me.userid + ' - ' + gettext('Permissions'),
+ items: [ grid ]
+ });
+
+ me.callParent();
+ }
+});
+
diff --git a/www/manager6/dc/UserView.js b/www/manager6/dc/UserView.js
index 922d072b..b9ff206b 100644
--- a/www/manager6/dc/UserView.js
+++ b/www/manager6/dc/UserView.js
@@ -95,6 +95,18 @@ Ext.define('PVE.dc.UserView', {
}
});
+ var perm_btn = new Proxmox.button.Button({
+ text: gettext('Permissions'),
+ disabled: false,
+ selModel: sm,
+ handler: function(btn, event, rec) {
+ var win = Ext.create('PVE.dc.PermissionView', {
+ userid: rec.data.userid
+ });
+ win.show();
+ }
+ });
+
var tbar = [
{
text: gettext('Add'),
@@ -106,7 +118,7 @@ Ext.define('PVE.dc.UserView', {
win.show();
}
},
- edit_btn, remove_btn, pwchange_btn, tfachange_btn
+ edit_btn, remove_btn, pwchange_btn, tfachange_btn, perm_btn
];
var render_username = function(userid) {
--
2.20.1
More information about the pve-devel
mailing list