]> git.proxmox.com Git - pve-manager.git/commitdiff
www: add permissions button to userview
authorFabian Grünbichler <f.gruenbichler@proxmox.com>
Tue, 21 Jan 2020 12:54:26 +0000 (13:54 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 29 Jan 2020 09:41:08 +0000 (10:41 +0100)
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
www/manager6/Makefile
www/manager6/dc/PermissionView.js [new file with mode: 0644]
www/manager6/dc/UserView.js

index a6926b5bbece63019e22ae9ac763c86a5b936eb2..d232e635fd799b7c5a1b455f9fde64124315fdd4 100644 (file)
@@ -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 (file)
index 0000000..12bf8e2
--- /dev/null
@@ -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();
+    }
+});
+
index 922d072ba4439a62e6036e4e93e87b944a741b98..b9ff206bb3e01cb406ce18d39bdf274e0acc9d96 100644 (file)
@@ -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) {