split user management
authorAlan Knowles <alan@roojs.com>
Thu, 22 Jul 2021 03:42:04 +0000 (11:42 +0800)
committerAlan Knowles <alan@roojs.com>
Thu, 22 Jul 2021 03:42:04 +0000 (11:42 +0800)
Pman.Dialog.BAdminStaffGroups.bjs [new file with mode: 0644]
Pman.Dialog.BAdminStaffGroups.js [new file with mode: 0644]
Pman.Tab.BAdminStaff.bjs
Pman.Tab.BAdminStaff.js
templates/Pman.Tab.BAdmin.html [new file with mode: 0644]
templates/Pman.Tab.BAdminProject.html [new file with mode: 0644]
templates/Pman.Tab.BAdminStaff.html

diff --git a/Pman.Dialog.BAdminStaffGroups.bjs b/Pman.Dialog.BAdminStaffGroups.bjs
new file mode 100644 (file)
index 0000000..9a4506b
--- /dev/null
@@ -0,0 +1,155 @@
+{
+ "name" : "Pman.Dialog.BAdminStaffGroups",
+ "parent" : "",
+ "title" : "",
+ "path" : "/home/alan/gitlive/Pman.BAdmin/Pman.Dialog.BAdminStaffGroups.bjs",
+ "permname" : "",
+ "modOrder" : "001",
+ "strings" : {
+  "4910043d0b2c8c864a0e8672716fee94" : "Is a Member",
+  "566a352f95c879ff26e50bad767a28dc" : "Group Membership",
+  "6b79852e4370cae80ee551e0671616bb" : "Manage Users Group",
+  "28974c2c793e780427dfb571b26443e6" : "Group Name",
+  "ea4788705e6873b424c65e91c2846b19" : "Cancel",
+  "c9cc8cce247e49bae79f15173ce97354" : "Save"
+ },
+ "items" : [
+  {
+   "listeners" : {
+    "show" : "function (_self)\n{\n    this.setTitle(\"Manage Membership for \" + _this.data.name);\n}",
+    "render" : "function (_self)\n{\n    _this.dialog = this;\n}"
+   },
+   "String cls" : "add-user-dialog",
+   "string fit_content" : true,
+   "xtype" : "Modal",
+   "$ xns" : "Roo.bootstrap",
+   "String title" : "Manage Users Group",
+   "items" : [
+    {
+     "listeners" : {
+      "render" : "function (_self)\n{\n    _this.layout = _self;\n}"
+     },
+     "xtype" : "Border",
+     "$ xns" : "Roo.bootstrap.layout",
+     "items" : [
+      {
+       "alwaysShowTabs" : true,
+       "String tabPosition" : "top",
+       "xtype" : "Region",
+       "$ xns" : "Roo.bootstrap.layout",
+       "* prop" : "center"
+      },
+      {
+       "listeners" : {
+        "activate" : "function (_self)\n{\n    if(_this.option_grid){\n        _this.option_grid.store.load({});\n    }\n    \n}",
+        "render" : "function (_self)\n{\n    _this.option_panel = this;\n    \n    \n}"
+       },
+       "fitToFrame" : true,
+       "xtype" : "Grid",
+       "String region" : "center",
+       "$ xns" : "Roo.bootstrap.panel",
+       "fitContainer" : true,
+       "String title" : "Group Membership",
+       "Boolean background" : false,
+       "items" : [
+        {
+         "listeners" : {
+          "cellclick" : "function (_self, el, rowIndex, columnIndex, e)\n{\n    var di = _this.option_grid.colModel.getDataIndex(columnIndex);\n    \n    /*\n    if (di != 'is_in_group') {\n        return;\n    }\n     */\n    var rec = _this.option_grid.store.getAt(rowIndex);\n    \n    if(rec.data.name == 'Administrators' && _this.data.id == Pman.Login.authUser.id){\n        Roo.bootstrap.MessageBox.alert('Error', 'You can not remove yourself from Administrators group');\n        return;\n    }\n    \n    rec.set('is_in_group', rec.data.is_in_group * 1 == 1 ? 0 : 1);\n    rec.commit();\n\n}",
+          "render" : "function (_self)\n{\n    _this.option_grid = this;\n    \n    this.store.load({})\n}"
+         },
+         "Boolean footerShow" : false,
+         "String cls" : "table-fixed",
+         "xtype" : "Table",
+         "$ xns" : "Roo.bootstrap",
+         "cellSelection" : true,
+         "Boolean loadMask" : true,
+         "* prop" : "grid",
+         "boolean condensed" : true,
+         "rowSelection" : false,
+         "items" : [
+          {
+           "Boolean singleSelect" : true,
+           "xtype" : "RowSelectionModel",
+           "$ xns" : "Roo.bootstrap.Table",
+           "* prop" : "sm"
+          },
+          {
+           "listeners" : {
+            "update" : "function (_self, record, operation)\n{\n    if (operation != 'commit') {\n        return;\n    }\n    \n    var params = {\n        user_ids : _this.data.id,\n        _action : (record.data.is_in_group * 1 == 0) ? 'sub' : 'add',\n        group_id : record.data.id\n    };\n    \n    new Pman.Request({\n        url : baseURL + '/Roo/Core_group',\n        method : 'POST',\n        params : params,\n        success : function() { \n            //_this.option_grid.ds.load({});\n        }\n  });\n}",
+            "beforeload" : "function (_self, options)\n{ \n    options.params = options.params || {};\n    \n    if(_this.data.id * 1 < 1){\n        _this.option_grid.el.mask('Please save the member first');\n        this.removeAll();\n        return false;\n    }\n    options.params.limit = 200;\n    options.params._is_in_group = _this.data.id;\n\n}"
+           },
+           "$ Object sortInfo" : "{ direction : 'ASC', field: 'id' }",
+           "xtype" : "Store",
+           "boolean remoteSort" : true,
+           "$ xns" : "Roo.data",
+           "* prop" : "store",
+           "items" : [
+            {
+             "$ url" : "baseURL + '/Roo/core_group'",
+             "xtype" : "HttpProxy",
+             "$ xns" : "Roo.data",
+             "String method" : "GET",
+             "* prop" : "proxy"
+            },
+            {
+             "$ Array fields" : "[\n    {\n        'name': 'id',\n        'type': 'int'\n    },\n    {\n        'name': 'name',\n        'type': 'string'\n    },\n    {\n        'name': 'display_name',\n        'type': 'string'\n    },\n    {\n        'name': 'is_in_group',\n        'type': 'int'\n    }\n]",
+             "xtype" : "JsonReader",
+             "String root" : "data",
+             "$ xns" : "Roo.data",
+             "String id" : "id",
+             "* prop" : "reader"
+            }
+           ]
+          },
+          {
+           "String header" : "Is a Member",
+           "String cursor" : "pointer",
+           "String dataIndex" : "is_in_group",
+           "xtype" : "ColumnModel",
+           "Number xs" : 3,
+           "String align" : "center",
+           "$ xns" : "Roo.grid",
+           "$ renderer" : "function(v) {  \n\n    var state = v > 0 ?  'check-' : '';\n    var cls = v > 0 ? 'text-primary' : '';\n    \n    return '<i class=\\\"far fa-'+ state + 'square-o ' + cls + '\\\" aria-hidden=\\\"true\\\"></i>';\n         \n }",
+           "Boolean sortable" : false,
+           "* prop" : "cm[]"
+          },
+          {
+           "String header" : "Group Name",
+           "cursor" : "pointer",
+           "String dataIndex" : "display_name",
+           "xtype" : "ColumnModel",
+           "Number xs" : 9,
+           "$ xns" : "Roo.grid",
+           "$ renderer" : "function(v,x,r) \n{\n    var vv = v.length ? v : r.data.name;\n    \n    return String.format('{0}', vv);\n}",
+           "Boolean sortable" : true,
+           "* prop" : "cm[]"
+          }
+         ]
+        }
+       ]
+      }
+     ]
+    },
+    {
+     "listeners" : {
+      "click" : "function (_self, e)\n{\n    _this.dialog.hide(); \n}"
+     },
+     "xtype" : "Button",
+     "$ xns" : "Roo.bootstrap",
+     "String html" : "Cancel",
+     "* prop" : "buttons[]"
+    },
+    {
+     "listeners" : {
+      "click" : "function (_self, e)\n{\n    if(!_this.form.isValid()){\n        //Roo.bootstrap.MessageBox.alert('Error', 'Please Correct all the errors in red');\n        return;\n    }\n    \n    var myID = _this.form.findField('id').getValue() * 1;\n    var myName = _this.form.findField('name').getValue();\n\n    if (_this.form.findField('company_id') && !_this.form.findField('company_id').getValue()) {\n        Roo.bootstrap.MessageBox.alert(\"Error\", \"Select a Company\");\n        return;\n    }\n        \n       // validate password match (only needed if we are not using generated one..\n    if (_this.form.findField('passwd1') \n            && _this.form.findField('passwd1').getValue().length > 0 \n            && _this.form.findField('passwd1').inputEl().dom.type == \"password\") {\n            \n        var p1 = _this.form.findField('passwd1').getValue();\n        var p2 = _this.form.findField('passwd2').getValue();\n            \n            \n        if (Pman.Login.authUser.id < 0 && !p1.length) {\n            Roo.bootstrap.MessageBox.alert(\"Error\", \"You must create a password for the admin account\");\n            return;\n        }\n            \n            \n        if (p1.length || p2.length) {\n            if (p1 != p2) {\n                Roo.bootstrap.MessageBox.alert(\"Error\", \"Passwords do not match\");\n                return;\n            }\n        }\n            \n        \n    }\n    \n    // get the list of record with tick\n    \n    _this.form.doAction(\"submit\");\n    \n    return;\n\n}"
+     },
+     "String weight" : "primary",
+     "xtype" : "Button",
+     "$ xns" : "Roo.bootstrap",
+     "String html" : "Save",
+     "* prop" : "buttons[]"
+    }
+   ]
+  }
+ ]
+}
\ No newline at end of file
diff --git a/Pman.Dialog.BAdminStaffGroups.js b/Pman.Dialog.BAdminStaffGroups.js
new file mode 100644 (file)
index 0000000..109b6cf
--- /dev/null
@@ -0,0 +1,336 @@
+//<script type="text/javascript">
+
+// Auto generated file - created by app.Builder.js- do not edit directly (at present!)
+
+Roo.namespace('Pman.Dialog');
+
+Pman.Dialog.BAdminStaffGroups= function() {}
+Roo.apply(Pman.Dialog.BAdminStaffGroups.prototype, {
+
+ _strings : {
+  '4910043d0b2c8c864a0e8672716fee94' :"Is a Member",
+  '566a352f95c879ff26e50bad767a28dc' :"Group Membership",
+  '6b79852e4370cae80ee551e0671616bb' :"Manage Users Group",
+  '28974c2c793e780427dfb571b26443e6' :"Group Name",
+  'ea4788705e6873b424c65e91c2846b19' :"Cancel",
+  'c9cc8cce247e49bae79f15173ce97354' :"Save"
+ },
+
+ dialog : false,
+ callback:  false,
+
+ show : function(data, cb)
+ {
+  if (!this.dialog) {
+   this.create();
+  }
+
+  this.callback = cb;
+  this.data = data;
+  this.dialog.show.apply(this.dialog,  Array.prototype.slice.call(arguments).slice(2));
+  if (this.form) {
+   this.form.reset();
+   this.form.setValues(data);
+   this.form.fireEvent('actioncomplete', this.form,  { type: 'setdata', data: data });
+  }
+
+ },
+
+ create : function()
+ {
+  var _this = this;
+  this.dialog = Roo.factory({
+    xtype : 'Modal',
+    cls : 'add-user-dialog',
+    fit_content : true,
+    title : _this._strings['6b79852e4370cae80ee551e0671616bb'] /* Manage Users Group */,
+    listeners : {
+     render : function (_self)
+      {
+          _this.dialog = this;
+      },
+     show : function (_self)
+      {
+          this.setTitle("Manage Membership for " + _this.data.name);
+      }
+    },
+    xns : Roo.bootstrap,
+    '|xns' : 'Roo.bootstrap',
+    buttons : [
+     {
+      xtype : 'Button',
+      html : _this._strings['ea4788705e6873b424c65e91c2846b19'] /* Cancel */,
+      listeners : {
+       click : function (_self, e)
+        {
+            _this.dialog.hide(); 
+        }
+      },
+      xns : Roo.bootstrap,
+      '|xns' : 'Roo.bootstrap'
+     },
+     {
+      xtype : 'Button',
+      html : _this._strings['c9cc8cce247e49bae79f15173ce97354'] /* Save */,
+      weight : 'primary',
+      listeners : {
+       click : function (_self, e)
+        {
+            if(!_this.form.isValid()){
+                //Roo.bootstrap.MessageBox.alert('Error', 'Please Correct all the errors in red');
+                return;
+            }
+            
+            var myID = _this.form.findField('id').getValue() * 1;
+            var myName = _this.form.findField('name').getValue();
+        
+            if (_this.form.findField('company_id') && !_this.form.findField('company_id').getValue()) {
+                Roo.bootstrap.MessageBox.alert("Error", "Select a Company");
+                return;
+            }
+                
+               // validate password match (only needed if we are not using generated one..
+            if (_this.form.findField('passwd1') 
+                    && _this.form.findField('passwd1').getValue().length > 0 
+                    && _this.form.findField('passwd1').inputEl().dom.type == "password") {
+                    
+                var p1 = _this.form.findField('passwd1').getValue();
+                var p2 = _this.form.findField('passwd2').getValue();
+                    
+                    
+                if (Pman.Login.authUser.id < 0 && !p1.length) {
+                    Roo.bootstrap.MessageBox.alert("Error", "You must create a password for the admin account");
+                    return;
+                }
+                    
+                    
+                if (p1.length || p2.length) {
+                    if (p1 != p2) {
+                        Roo.bootstrap.MessageBox.alert("Error", "Passwords do not match");
+                        return;
+                    }
+                }
+                    
+                
+            }
+            
+            // get the list of record with tick
+            
+            _this.form.doAction("submit");
+            
+            return;
+        
+        }
+      },
+      xns : Roo.bootstrap,
+      '|xns' : 'Roo.bootstrap'
+     }
+    ],
+    items  : [
+     {
+      xtype : 'Border',
+      listeners : {
+       render : function (_self)
+        {
+            _this.layout = _self;
+        }
+      },
+      xns : Roo.bootstrap.layout,
+      '|xns' : 'Roo.bootstrap.layout',
+      center : {
+       xtype : 'Region',
+       alwaysShowTabs : true,
+       tabPosition : 'top',
+       xns : Roo.bootstrap.layout,
+       '|xns' : 'Roo.bootstrap.layout'
+      },
+      items  : [
+       {
+        xtype : 'Grid',
+        background : false,
+        fitContainer : true,
+        fitToFrame : true,
+        region : 'center',
+        title : _this._strings['566a352f95c879ff26e50bad767a28dc'] /* Group Membership */,
+        listeners : {
+         activate : function (_self)
+          {
+              if(_this.option_grid){
+                  _this.option_grid.store.load({});
+              }
+              
+          },
+         render : function (_self)
+          {
+              _this.option_panel = this;
+              
+              
+          }
+        },
+        xns : Roo.bootstrap.panel,
+        '|xns' : 'Roo.bootstrap.panel',
+        grid : {
+         xtype : 'Table',
+         cellSelection : true,
+         cls : 'table-fixed',
+         condensed : true,
+         footerShow : false,
+         loadMask : true,
+         rowSelection : false,
+         listeners : {
+          cellclick : function (_self, el, rowIndex, columnIndex, e)
+           {
+               var di = _this.option_grid.colModel.getDataIndex(columnIndex);
+               
+               /*
+               if (di != 'is_in_group') {
+                   return;
+               }
+                */
+               var rec = _this.option_grid.store.getAt(rowIndex);
+               
+               if(rec.data.name == 'Administrators' && _this.data.id == Pman.Login.authUser.id){
+                   Roo.bootstrap.MessageBox.alert('Error', 'You can not remove yourself from Administrators group');
+                   return;
+               }
+               
+               rec.set('is_in_group', rec.data.is_in_group * 1 == 1 ? 0 : 1);
+               rec.commit();
+           
+           },
+          render : function (_self)
+           {
+               _this.option_grid = this;
+               
+               this.store.load({})
+           }
+         },
+         xns : Roo.bootstrap,
+         '|xns' : 'Roo.bootstrap',
+         store : {
+          xtype : 'Store',
+          remoteSort : true,
+          sortInfo : { direction : 'ASC', field: 'id' },
+          listeners : {
+           beforeload : function (_self, options)
+            { 
+                options.params = options.params || {};
+                
+                if(_this.data.id * 1 < 1){
+                    _this.option_grid.el.mask('Please save the member first');
+                    this.removeAll();
+                    return false;
+                }
+                options.params.limit = 200;
+                options.params._is_in_group = _this.data.id;
+            
+            },
+           update : function (_self, record, operation)
+            {
+                if (operation != 'commit') {
+                    return;
+                }
+                
+                var params = {
+                    user_ids : _this.data.id,
+                    _action : (record.data.is_in_group * 1 == 0) ? 'sub' : 'add',
+                    group_id : record.data.id
+                };
+                
+                new Pman.Request({
+                    url : baseURL + '/Roo/Core_group',
+                    method : 'POST',
+                    params : params,
+                    success : function() { 
+                        //_this.option_grid.ds.load({});
+                    }
+              });
+            }
+          },
+          xns : Roo.data,
+          '|xns' : 'Roo.data',
+          proxy : {
+           xtype : 'HttpProxy',
+           method : 'GET',
+           url : baseURL + '/Roo/core_group',
+           xns : Roo.data,
+           '|xns' : 'Roo.data'
+          },
+          reader : {
+           xtype : 'JsonReader',
+           fields : [
+               {
+                   'name': 'id',
+                   'type': 'int'
+               },
+               {
+                   'name': 'name',
+                   'type': 'string'
+               },
+               {
+                   'name': 'display_name',
+                   'type': 'string'
+               },
+               {
+                   'name': 'is_in_group',
+                   'type': 'int'
+               }
+           ],
+           id : 'id',
+           root : 'data',
+           xns : Roo.data,
+           '|xns' : 'Roo.data'
+          }
+         },
+         sm : {
+          xtype : 'RowSelectionModel',
+          singleSelect : true,
+          xns : Roo.bootstrap.Table,
+          '|xns' : 'Roo.bootstrap.Table'
+         },
+         cm : [
+          {
+           xtype : 'ColumnModel',
+           align : 'center',
+           cursor : 'pointer',
+           dataIndex : 'is_in_group',
+           header : _this._strings['4910043d0b2c8c864a0e8672716fee94'] /* Is a Member */,
+           renderer : function(v) {  
+           
+               var state = v > 0 ?  'check-' : '';
+               var cls = v > 0 ? 'text-primary' : '';
+               
+               return '<i class=\"far fa-'+ state + 'square-o ' + cls + '\" aria-hidden=\"true\"></i>';
+                    
+            },
+           sortable : false,
+           xs : 3,
+           xns : Roo.grid,
+           '|xns' : 'Roo.grid'
+          },
+          {
+           xtype : 'ColumnModel',
+           cursor : 'pointer',
+           dataIndex : 'display_name',
+           header : _this._strings['28974c2c793e780427dfb571b26443e6'] /* Group Name */,
+           renderer : function(v,x,r) 
+           {
+               var vv = v.length ? v : r.data.name;
+               
+               return String.format('{0}', vv);
+           },
+           sortable : true,
+           xs : 9,
+           xns : Roo.grid,
+           '|xns' : 'Roo.grid'
+          }
+         ]
+        }
+       }
+      ]
+     }
+    ]
+   }  );
+ }
+});
+Roo.apply(Pman.Dialog.BAdminStaffGroups, Pman.Dialog.BAdminStaffGroups.prototype);
index b073ba9..c69c8b0 100644 (file)
@@ -17,7 +17,6 @@
   "05b763f7d24f32575493b3c23f299b0e" : "Add To Group",
   "9bac86fd9f499d47cea5f2fd70d701c1" : "search for account",
   "e0a7cc944485bdedafb92b0cf98632fa" : "Remove From Group",
-  "bcc254b55c4a1babdf1dcb82c207506b" : "Phone",
   "25f57527ae8a27c94fb5230b5486c743" : "Permission List",
   "09f0c5159c5e34504e453eff3fc70324" : "Account Management",
   "054176c3a541fb2d4b63e29360c749aa" : "Members List",
         },
         {
          "listeners" : {
-          "rowdblclick" : "function (_self, el, rowIndex, e)\n{\n    var s = _this.member_grid.store.getAt(rowIndex);\n    \n    if(s.data.id * 1 < 1){\n        return;\n    }\n    \n    Pman.Dialog.BAdminStaff.show( { id : s.data.id }, function() {\n        _this.member_grid.footer.onClick('first');\n    });\n}",
+          "celldblclick" : "function (_self, el, rowIndex, columnIndex, e)\n{\n    var di = _this.member_grid.colModel.getDataIndex(columnIndex);\n\n    if (di == 'active') {\n        return;\n    }\n    var s = _this.member_grid.store.getAt(rowIndex);\n    \n    if(s.data.id * 1 < 1){\n        return;\n    }\n    \n    if (di == 'member_of') {\n        Pman.Dialog.BAdminStaffGroups.show(   s.data , function() {\n            _this.member_grid.footer.onClick('first');\n        });\n        return;\n    }\n    // show edit user dialog..\n     \n    Pman.Dialog.BAdminStaff.show( s.data , function() {\n        _this.member_grid.footer.onClick('first');\n    });\n     \n}",
           "cellclick" : "function (_self, el, rowIndex, columnIndex, e)\n{\n    var di = _this.member_grid.colModel.getDataIndex(columnIndex);\n    \n    if (di != 'active') {\n        return;\n    }\n     \n    var rec = _this.member_grid.store.getAt(rowIndex);\n    \n    rec.set('active', rec.data.active ? 0 : 1);\n    rec.commit();\n\n    \n    // get the row number to make class x-row-0, x-row-1\n    \n    if(rec.data.active * 1 != 1){\n        var el = _this.member_grid.getRowDom(rowIndex);\n        \n        el.addClass('x-grid-row-fadeout');\n        \n        el.on('transitionend',function(){\n            _this.member_grid.ds.remove(rec);\n            el.remove();\n        },this,{single:true});\n    }\n}",
           "render" : "function (_self)\n{\n    _this.member_grid = _self;\n   \n}"
          },
           {
            "listeners" : {
             "update" : "function (_self, record, operation)\n{\n    if (operation != 'commit') {\n        return;\n    }\n    // only used to change active status.\n     \n    new Pman.Request({\n        url : baseURL + '/Roo/core_person',\n        method :'POST',\n        params : {\n            id : record.data.id,\n            active: record.data.active\n            \n        },\n        success : function() {\n            // do nothing\n            \n        },\n        failure : function() \n        {\n            /*Roo.bootstrap.MessageBox.alert(\"Error\", \"saving failed\", function() {\n                _this.grid.footer.onClick('first');\n            });*/\n        }\n    });\n}",
-            "beforeload" : "function (_self, options)\n{\n    if (!Pman.buildCompleted) {\n        return false;\n    }\n    options.params = options.params || {};\n    \n    //options.params['query[type]'] = 0;\n    //options.params.active = 1;\n    \n    if(!_this.group_grid){\n        this.removeAll();\n        return false;\n    }\n    \n    var group = _this.group_grid.getSelectionModel().getSelected();\n    \n    if(!group){\n        this.removeAll();\n        return false;\n    }\n    \n    if(_this.footerActiveBtn && !_this.footerActiveBtn.pressed){\n        options.params.active = 1;\n    }\n    \n    \n    options.params['query[name]'] =    _this.searchBox.getValue();\n    \n    options.params['query[in_group]'] = group.data.id;\n  \n}",
+            "beforeload" : "function (_self, options)\n{\n    if (!Pman.buildCompleted) {\n        return false;\n    }\n    options.params = options.params || {};\n    \n    //options.params['query[type]'] = 0;\n    //options.params.active = 1;\n    \n    if(!_this.group_grid){\n        this.removeAll();\n        return false;\n    }\n    \n    var group = _this.group_grid.getSelectionModel().getSelected();\n    \n    if(!group){\n        this.removeAll();\n        return false;\n    }\n    \n    if(_this.footerActiveBtn && !_this.footerActiveBtn.pressed){\n        options.params.active = 1;\n    }\n    \n    options.params._with_group_membership = 1;\n    options.params['query[name]'] =    _this.searchBox.getValue();\n    \n    options.params['query[in_group]'] = group.data.id;\n  \n}",
             "load" : "function (_self, records, options)\n{\n    _this.edit_btn.el.hide();\n    _this.delete_btn.el.hide();\n    _this.addToGroupBtn.el.hide();\n    _this.removeFromGroupBtn.el.hide();\n    _this.switch_btn.el.hide();\n    \n    options.params.active = 1;\n    \n\n    \n}"
            },
            "xtype" : "Store",
            "Number sm" : 2
           },
           {
-           "String header" : "Phone",
+           "String header" : "Groups",
            "String cursor" : "pointer",
            "Number md" : 2,
-           "String dataIndex" : "phone",
+           "String dataIndex" : "member_of",
            "xtype" : "ColumnModel",
            "Number xs" : 2,
            "$ xns" : "Roo.grid",
-           "$ renderer" : "function(v) { return String.format('{0}', v); }",
+           "$ renderer" : "function(v) {\n     return String.format('{0}', v).split(\"\\n\").join(\"<br/>\"); \n }",
            "* prop" : "cm[]",
            "Number sm" : 2
           },
           "cellclick" : "function (_self, el, rowIndex, columnIndex, e)\n{\n    var di = _this.permission_grid.colModel.getDataIndex(columnIndex);\n    \n    var r = _this.permission_grid.store.getAt(rowIndex);\n    \n    if(di == 'rightname' || di == 'descript' || r.data.id * 1 < 1) {\n        return;\n    }\n    \n    if(di == 'id'){\n        \n        var accessmask = r.data.accessmask.split('').sort().join('');\n        var fullmask = r.data.FullMask.split('').sort().join('');\n        \n        r.set('accessmask', (accessmask == fullmask) ? '' : r.data.FullMask);\n        \n        r.commit();\n        \n        return;\n    }\n    \n    var mapping = {\n        'add' : 'A',\n        'edit' : 'E',\n        'delete' : 'D',\n        'view' : 'S',\n        'print' : 'P'\n    };\n    \n    var target = mapping[di];\n    \n    if(r.data.FullMask.indexOf(target) === -1){\n        return;\n    }\n    \n    var accessmask = r.data.accessmask.split('');\n    \n    if(accessmask.indexOf(target) !== -1){\n        accessmask.splice(accessmask.indexOf(target), 1);\n    } else {\n        accessmask.push(target);\n    }\n    \n    r.set('accessmask', accessmask.sort().join(''));\n    \n    r.commit();\n    \n}",
           "render" : "function (_self)\n{\n    _this.permission_grid = this;\n    \n    if(_this.permission_panel.active) {\n        (function(){\n            _this.permission_grid.store.load({});\n        }).defer(50);\n    }\n}"
          },
+         "Boolean footerShow" : false,
          "Boolean cellSelection" : true,
          "String cls" : "table-fixed",
-         "Boolean footerShow" : false,
          "boolean striped" : true,
          "boolean hover" : true,
          "xtype" : "Table",
index 92f11f8..3708326 100644 (file)
@@ -18,7 +18,6 @@ Pman.Tab.BAdminStaff = new Roo.XComponent({
   '05b763f7d24f32575493b3c23f299b0e' :"Add To Group",
   '9bac86fd9f499d47cea5f2fd70d701c1' :"search for account",
   'e0a7cc944485bdedafb92b0cf98632fa' :"Remove From Group",
-  'bcc254b55c4a1babdf1dcb82c207506b' :"Phone",
   '25f57527ae8a27c94fb5230b5486c743' :"Permission List",
   '09f0c5159c5e34504e453eff3fc70324' :"Account Management",
   '054176c3a541fb2d4b63e29360c749aa' :"Members List",
@@ -505,22 +504,36 @@ Pman.Tab.BAdminStaff = new Roo.XComponent({
                  },this,{single:true});
              }
          },
-        render : function (_self)
-         {
-             _this.member_grid = _self;
-            
-         },
-        rowdblclick : function (_self, el, rowIndex, e)
+        celldblclick : function (_self, el, rowIndex, columnIndex, e)
          {
+             var di = _this.member_grid.colModel.getDataIndex(columnIndex);
+         
+             if (di == 'active') {
+                 return;
+             }
              var s = _this.member_grid.store.getAt(rowIndex);
              
              if(s.data.id * 1 < 1){
                  return;
              }
              
-             Pman.Dialog.BAdminStaff.show( { id : s.data.id }, function() {
+             if (di == 'member_of') {
+                 Pman.Dialog.BAdminStaffGroups.show(   s.data , function() {
+                     _this.member_grid.footer.onClick('first');
+                 });
+                 return;
+             }
+             // show edit user dialog..
+              
+             Pman.Dialog.BAdminStaff.show( s.data , function() {
                  _this.member_grid.footer.onClick('first');
              });
+              
+         },
+        render : function (_self)
+         {
+             _this.member_grid = _self;
+            
          }
        },
        xns : Roo.bootstrap,
@@ -593,7 +606,7 @@ Pman.Tab.BAdminStaff = new Roo.XComponent({
                   options.params.active = 1;
               }
               
-              
+              options.params._with_group_membership = 1;
               options.params['query[name]'] =    _this.searchBox.getValue();
               
               options.params['query[in_group]'] = group.data.id;
@@ -747,10 +760,12 @@ Pman.Tab.BAdminStaff = new Roo.XComponent({
         {
          xtype : 'ColumnModel',
          cursor : 'pointer',
-         dataIndex : 'phone',
-         header : _this._strings['bcc254b55c4a1babdf1dcb82c207506b'] /* Phone */,
+         dataIndex : 'member_of',
+         header : _this._strings['a37ede293936e29279ed543129451ec3'] /* Groups */,
          md : 2,
-         renderer : function(v) { return String.format('{0}', v); },
+         renderer : function(v) {
+              return String.format('{0}', v).split("\n").join("<br/>"); 
+          },
          sm : 2,
          xs : 2,
          xns : Roo.grid,
diff --git a/templates/Pman.Tab.BAdmin.html b/templates/Pman.Tab.BAdmin.html
new file mode 100644 (file)
index 0000000..7c798fd
--- /dev/null
@@ -0,0 +1,32 @@
+  
+       
+         
+    
+
+        
+  <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen6" style="left: 0px; top: 0px; width: 771px; height: 409px;">
+    <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-center" xbuilderid="roo-gen7" style="display: none;">
+      <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on"> </SPAN>
+      <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen8"></DIV>
+    </DIV>
+    <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen9" style="overflow: hidden; height: 409px;">
+      <NAV class="navbar-light bg-light" xbuilderid="roo-gen17">
+        <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen18" style="display: none;">
+          <LI class="nav-item" xbuilderid="roo-gen21">
+            <A class="nav-link" href="#" unselectable="on" title="" xbuilderid="roo-gen20">System Admin</A>
+          </LI>
+        </UL>
+      </NAV>
+      <DIV id="tab-body19" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 409px;">
+        <DIV xbuilderid="roo-gen10" class=" roo-layout-container roo-layout-nested-layout roo-layout-inactive-content tab-pane" xtype="Roo.bootstrap.panel.Nest" style="position: absolute; display: block; zoom: 1;">
+          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen13">
+            <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-center" xbuilderid="roo-gen14" style="display: none;">
+              <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on"> </SPAN>
+              <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen15"></DIV>
+            </DIV>
+            <DIV class="roo-layout-panel-body tab-content" xbuilderid="roo-gen16" style="overflow: hidden;"></DIV>
+          </DIV>
+        </DIV>
+      </DIV>
+    </DIV>
+  </DIV>
diff --git a/templates/Pman.Tab.BAdminProject.html b/templates/Pman.Tab.BAdminProject.html
new file mode 100644 (file)
index 0000000..236e938
--- /dev/null
@@ -0,0 +1,141 @@
+  
+       
+         
+    
+
+        
+  <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen6" style="left: 0px; top: 0px; width: 746px; height: 384px;">
+    <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-center" xbuilderid="roo-gen7" style="display: none;">
+      <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on">Projects</SPAN>
+      <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen8"></DIV>
+    </DIV>
+    <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen9" style="overflow: hidden; height: 384px;">
+      <NAV class="navbar-light bg-light" xbuilderid="roo-gen21">
+        <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen22" style="display: none;">
+          <LI class="nav-item" xbuilderid="roo-gen25">
+            <A class="nav-link active" href="#" unselectable="on" title="" xbuilderid="roo-gen24">Projects</A>
+          </LI>
+        </UL>
+      </NAV>
+      <DIV id="tab-body23" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 384px;">
+        <DIV xbuilderid="roo-gen10" class=" roo-layout-container roo-layout-nested-layout roo-layout-active-content tab-pane " xtype="Roo.bootstrap.panel.Nest" style="position: relative; display: block; zoom: 1; visibility: visible; width: 746px; height: 384px;">
+          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen13" style="left: 0px; top: 50px; width: 746px; height: 334px;">
+            <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-center" xbuilderid="roo-gen14" style="display: none;">
+              <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on"> </SPAN>
+              <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen15"></DIV>
+            </DIV>
+            <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen16" style="overflow: hidden; height: 334px;">
+              <NAV class="navbar-light bg-light" xbuilderid="roo-gen75">
+                <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen76" style="display: none;">
+                  <LI class="nav-item" xbuilderid="roo-gen79">
+                    <A class="nav-link active" href="#" unselectable="on" title="" xbuilderid="roo-gen78"></A>
+                  </LI>
+                </UL>
+              </NAV>
+              <DIV id="tab-body77" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 334px;">
+                <DIV class="roo-layout-grid-wrapper  roo-layout-active-content tab-pane" xbuilderid="roo-gen59" style="position: relative; display: block; zoom: 1; visibility: visible;">
+                  <DIV xbuilderid="roo-comp-1021" class=" roo-layout-component-panel" style="width: 746px; height: 334px;">
+                    <TABLE class="table table-body-fixed table-striped">
+                      <THEAD xbuilderid="roo-gen68">
+                        <TR>
+                          <TH class="x-hcol-0 col-sm-1" style="" sort="fname">Job No.</TH>
+                          <TH class="x-hcol-1 col-sm-5" style="" sort="fname">Name</TH>
+                          <TH class="x-hcol-2 col-sm-2" style="" sort="fname">Office / Team</TH>
+                          <TH class="x-hcol-3 col-sm-2" style="" sort="fname">Opened</TH>
+                          <TH class="x-hcol-4 col-sm-2" style="" sort="fname">Permission Group</TH>
+                        </TR>
+                      </THEAD>
+                      <TBODY xbuilderid="roo-gen67" style="width: 746px; height: 260px;">
+                        <TR class="x-row-0" cellobjects="" xbuilderid="roo-gen81" style="width: 746px;">
+                          <TD class=" x-col-0 col-sm-1" style="" xbuilderid="roo-gen85">undefined</TD>
+                          <TD class=" x-col-1 col-sm-5" style="" xbuilderid="roo-gen86">undefined</TD>
+                          <TD class=" x-col-2 col-sm-2" style="" xbuilderid="roo-gen87">undefined</TD>
+                          <TD class=" x-col-3 col-sm-2" style="" xbuilderid="roo-gen88">undefined</TD>
+                          <TD class=" x-col-4 col-sm-2" style="" xbuilderid="roo-gen89">undefined</TD>
+                        </TR>
+                        <TR class="x-row-1" cellobjects="" xbuilderid="roo-gen82" style="width: 746px;">
+                          <TD class=" x-col-0 col-sm-1" style="" xbuilderid="roo-gen90">undefined</TD>
+                          <TD class=" x-col-1 col-sm-5" style="" xbuilderid="roo-gen91">undefined</TD>
+                          <TD class=" x-col-2 col-sm-2" style="" xbuilderid="roo-gen92">undefined</TD>
+                          <TD class=" x-col-3 col-sm-2" style="" xbuilderid="roo-gen93">undefined</TD>
+                          <TD class=" x-col-4 col-sm-2" style="" xbuilderid="roo-gen94">undefined</TD>
+                        </TR>
+                        <TR class="x-row-2" cellobjects="" xbuilderid="roo-gen83" style="width: 746px;">
+                          <TD class=" x-col-0 col-sm-1" style="" xbuilderid="roo-gen95">undefined</TD>
+                          <TD class=" x-col-1 col-sm-5" style="" xbuilderid="roo-gen96">undefined</TD>
+                          <TD class=" x-col-2 col-sm-2" style="" xbuilderid="roo-gen97">undefined</TD>
+                          <TD class=" x-col-3 col-sm-2" style="" xbuilderid="roo-gen98">undefined</TD>
+                          <TD class=" x-col-4 col-sm-2" style="" xbuilderid="roo-gen99">undefined</TD>
+                        </TR>
+                        <TR class="x-row-3" cellobjects="" xbuilderid="roo-gen84" style="width: 746px;">
+                          <TD class=" x-col-0 col-sm-1" style="" xbuilderid="roo-gen100">undefined</TD>
+                          <TD class=" x-col-1 col-sm-5" style="" xbuilderid="roo-gen101">undefined</TD>
+                          <TD class=" x-col-2 col-sm-2" style="" xbuilderid="roo-gen102">undefined</TD>
+                          <TD class=" x-col-3 col-sm-2" style="" xbuilderid="roo-gen103">undefined</TD>
+                          <TD class=" x-col-4 col-sm-2" style="" xbuilderid="roo-gen104">undefined</TD>
+                        </TR>
+                      </TBODY>
+                      <TFOOT xbuilderid="roo-gen69">
+                        <TR xbuilderid="roo-gen145" style="width: 746px;">
+                          <TD colspan="5" xbuilderid="roo-gen146" style="width: 746px;"></TD>
+                        </TR>
+                      </TFOOT>
+                    </TABLE>
+                  </DIV>
+                </DIV>
+              </DIV>
+            </DIV>
+          </DIV>
+          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-north" xbuilderid="roo-gen17" style="height: 50px; left: 0px; top: 0px; width: 746px;">
+            <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-north" xbuilderid="roo-gen18" style="display: none;">
+              <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on"> </SPAN>
+              <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen19"></DIV>
+            </DIV>
+            <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen20" style="overflow: hidden; height: 50px;">
+              <NAV class="navbar-light bg-light" xbuilderid="roo-gen28">
+                <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen29" style="display: none;">
+                  <LI class="nav-item" xbuilderid="roo-gen32">
+                    <A class="nav-link active" href="#" unselectable="on" title="" xbuilderid="roo-gen31"></A>
+                  </LI>
+                </UL>
+              </NAV>
+              <DIV id="tab-body30" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 50px;">
+                <DIV class="  roo-layout-active-content tab-pane" xbuilderid="roo-gen27" style="position: relative; display: block; zoom: 1; visibility: visible;">
+                  <DIV class="navbar roo-navbar-simple navbar-light bg-light" xbuilderid="roo-comp-1006">
+                    <DIV class="x-dlg-mask" xbuilderid="roo-gen34" style="width: 746px; height: 16px; display: none;"></DIV>
+                    <FORM method="POST" xbuilderid="roo-comp-1009" class="navbar-form form-inline navbar-right mr-md-auto">
+                      <DIV class="form-group" xbuilderid="roo-comp-1011">
+                        <INPUT xbuilderid="roo-gen45" type="text" value="" class="form-control" placeholder="" autocomplete="new-password"></INPUT>
+                      </DIV>
+                      <BUTTON class="btn roo-button btn-primary" xbuilderid="roo-comp-1013">
+                        <I class="fa fas fa-search"></I> 
+                        <SPAN class="roo-button-text"></SPAN>
+                      </BUTTON>
+                    </FORM>
+                    <UL class="nav nav-pills navbar-right ml-md-auto" xbuilderid="roo-comp-1015">
+                      <BUTTON class="nav-item btn btn-danger ml-3 mr-0" xbuilderid="roo-comp-1017">
+                        <I class="fa fas fa-trash"></I> 
+                        <SPAN>Delete</SPAN>
+                      </BUTTON>
+                      <BUTTON class="nav-item btn btn-warning ml-3 mr-0" xbuilderid="roo-comp-1019">
+                        <I class="fa fas fa-plus"></I> 
+                        <SPAN>Add</SPAN>
+                      </BUTTON>
+                    </UL>
+                  </DIV>
+                </DIV>
+              </DIV>
+            </DIV>
+          </DIV>
+        </DIV>
+      </DIV>
+    </DIV>
+  </DIV>
+  <DIV class="x-dlg-mask roo-form-top-mask" xbuilderid="roo-gen35"></DIV>
+  <DIV class="x-dlg-mask roo-form-left-mask" xbuilderid="roo-gen36"></DIV>
+  <DIV class="x-dlg-mask roo-form-bottom-mask" xbuilderid="roo-gen37"></DIV>
+  <DIV class="x-dlg-mask roo-form-right-mask" xbuilderid="roo-gen38"></DIV>
+  <DIV class="tooltip roo-form-error-popover" role="tooltip" xbuilderid="roo-comp-1008">
+    <DIV class="tooltip-arrow arrow" xbuilderid="roo-gen39"></DIV>
+    <DIV class="tooltip-inner" xbuilderid="roo-gen40"></DIV>
+  </DIV>
index f537539..119f279 100644 (file)
@@ -4,12 +4,12 @@
     
 
         
-  <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen6" style="left: 0px; top: 0px; width: 995px; height: 529px;">
+  <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen6" style="left: 0px; top: 0px; width: 1102px; height: 507px;">
     <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-center" xbuilderid="roo-gen7" style="display: none;">
       <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on">Account Management</SPAN>
       <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen8"></DIV>
     </DIV>
-    <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen9" style="overflow: hidden; height: 529px;">
+    <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen9" style="overflow: hidden; height: 507px;">
       <NAV class="navbar-light bg-light" xbuilderid="roo-gen24">
         <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen25" style="display: none;">
           <LI class="nav-item" xbuilderid="roo-gen28">
           </LI>
         </UL>
       </NAV>
-      <DIV id="tab-body26" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 529px;">
-        <DIV xbuilderid="roo-gen10" class=" roo-layout-container roo-layout-nested-layout tab-pane roo-layout-active-content" xtype="Roo.bootstrap.panel.Nest" style="position: relative; display: block; zoom: 1; visibility: visible; width: 995px; height: 529px;">
-          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen13" style="left: 255px; top: 0px; width: 740px; height: 529px;">
+      <DIV id="tab-body26" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 507px;">
+        <DIV xbuilderid="roo-gen10" class=" roo-layout-container roo-layout-nested-layout tab-pane roo-layout-active-content" xtype="Roo.bootstrap.panel.Nest" style="position: relative; display: block; zoom: 1; visibility: visible; width: 1102px; height: 507px;">
+          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-center" xbuilderid="roo-gen13" style="left: 255px; top: 0px; width: 847px; height: 507px;">
             <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-center" xbuilderid="roo-gen14" style="display: none;">
               <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on">Members List</SPAN>
               <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen15"></DIV>
             </DIV>
-            <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen16" style="overflow: hidden; height: 529px;">
+            <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen16" style="overflow: hidden; height: 507px;">
               <NAV class="navbar-light bg-light" xbuilderid="roo-gen114">
                 <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen115" style="">
                   <LI class="nav-item" xbuilderid="roo-gen118">
                   </LI>
                 </UL>
               </NAV>
-              <DIV id="tab-body116" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 487px;">
+              <DIV id="tab-body116" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 465px;">
                 <DIV class="roo-layout-grid-wrapper roo-layout-inactive-content tab-pane" xbuilderid="roo-gen123" style="position: absolute; display: block; zoom: 1;"></DIV>
                 <DIV class="roo-layout-grid-wrapper  roo-layout-active-content tab-pane" xbuilderid="roo-gen30" style="position: relative; display: block; zoom: 1; visibility: visible;">
                   <DIV xbuilderid="roo-gen31">
-                    <DIV class="navbar roo-navbar-simple navbar-light bg-light" xbuilderid="roo-comp-1004" style="width: 708px;">
+                    <DIV class="navbar roo-navbar-simple navbar-light bg-light" xbuilderid="roo-comp-1004" style="width: 815px;">
                       <DIV class="x-dlg-mask" xbuilderid="roo-gen32" style="width: 32px; height: 16px; display: none;"></DIV>
-                      <UL class="nav navbar-nav mr-auto" xbuilderid="roo-comp-1006" style="width: 100%;">
-                        <DIV class="nav-item" xbuilderid="roo-comp-1008" style="width: 100%;">
-                          <DIV xbuilderid="roo-comp-1010" style="width: 100%;">
+                      <UL class="nav navbar-nav mr-auto" xbuilderid="roo-comp-1006" style="width: 100%;; width: 100%;">
+                        <DIV class="nav-item" xbuilderid="roo-comp-1008" style="width: 100%;; width: 100%;">
+                          <DIV xbuilderid="roo-comp-1010" style="width: 100%;; width: 100%;">
                             <DIV class="row clearfix roo-toolbar" xbuilderid="roo-comp-1012">
                               <DIV class="column col-md-3" xbuilderid="roo-comp-1014">
                                 <DIV class="form-group" xbuilderid="roo-comp-1016">
                       </UL>
                     </DIV>
                   </DIV>
-                  <DIV xbuilderid="roo-comp-1033" class="table-fixed roo-layout-component-panel" style="width: 740px; height: 413px;">
+                  <DIV xbuilderid="roo-comp-1033" class="table-fixed table-fixed roo-layout-component-panel" style="width: 847px; height: 391px;">
                     <TABLE class="table table-body-fixed table-hover table-responsive table-fixed">
                       <THEAD xbuilderid="roo-gen73">
                         <TR>
                           <TH class="sortable col-xs-1 col-1 col-sm-1 col-md-1" style=" text-align:center;" sort="active" xbuilderid="roo-gen75">
-                            <I class="glyphicon"></I>Active
+                            <I class="fa"></I>Active
                           </TH>
                           <TH class="sortable col-xs-3 col-3 col-sm-3 col-md-3" style="" sort="name" xbuilderid="roo-gen76">
-                            <I class="glyphicon"></I>Name
+                            <I class="fa"></I>Name
                           </TH>
                           <TH class="sortable col-xs-2 col-2 col-sm-2 col-md-2" style="" sort="role" xbuilderid="roo-gen77">
-                            <I class="glyphicon"></I>Role / Position
+                            <I class="fa"></I>Role / Position
                           </TH>
-                          <TH class="x-hcol-3 col-xs-2 col-2 col-sm-2 col-md-2" style="" sort="phone">Phone</TH>
+                          <TH class="x-hcol-3 col-xs-2 col-2 col-sm-2 col-md-2" style="" sort="member_of">Groups</TH>
                           <TH class="sortable col-xs-4 col-4 col-sm-2 col-md-4" style="" sort="email" xbuilderid="roo-gen78">
-                            <I class="glyphicon"></I>Email
+                            <I class="fa"></I>Email
                           </TH>
                         </TR>
                       </THEAD>
-                      <TBODY xbuilderid="roo-gen72" style="width: 740px; height: 243px;">
-                        <TR xbuilderid="roo-gen122" style="width: 740px;">
+                      <TBODY xbuilderid="roo-gen72" style="width: 847px; height: 245px;">
+                        <TR xbuilderid="roo-gen122" style="width: 847px;">
                           <TD colspan="5"></TD>
                         </TR>
                       </TBODY>
                       <TFOOT xbuilderid="roo-gen74">
-                        <TR xbuilderid="roo-gen120" style="width: 740px;">
-                          <TD colspan="5" xbuilderid="roo-gen121" style="width: 740px;">
+                        <TR xbuilderid="roo-gen120" style="width: 847px;">
+                          <TD colspan="5" xbuilderid="roo-gen121" style="width: 847px;">
                             <DIV class="navbar roo-navbar-simple navbar-light bg-light" xbuilderid="roo-comp-1034" name="footer">
                               <UL class="nav nav-PagingToolbar navbar-nav"></UL>
                               <DIV class="x-dlg-mask" xbuilderid="roo-gen86" style="width: 32px; height: 16px; display: none;"></DIV>
               </DIV>
             </DIV>
           </DIV>
-          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-west" xbuilderid="roo-gen17" style="width: 250px; left: 0px; top: 0px; height: 529px;">
+          <DIV class=" roo-layout-region roo-layout-panel roo-layout-panel-west" xbuilderid="roo-gen17" style="width: 250px; left: 0px; top: 0px; height: 507px;">
             <DIV unselectable="on" class="roo-unselectable roo-layout-panel-hd breadcrumb roo-layout-title-west" xbuilderid="roo-gen18" style="display: none;">
               <SPAN class="roo-unselectable roo-layout-panel-hd-text" unselectable="on">Groups</SPAN>
               <DIV class="roo-unselectable roo-layout-panel-hd-tools" unselectable="on" xbuilderid="roo-gen19"></DIV>
             </DIV>
-            <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen20" style="overflow: hidden; height: 529px;">
+            <DIV class="roo-layout-panel-body tab-content roo-tabs-top" xbuilderid="roo-gen20" style="overflow: hidden; height: 507px;">
               <NAV class="navbar-light bg-light" xbuilderid="roo-gen159">
                 <UL class="nav nav-tabs" role="tablist" xbuilderid="roo-gen160" style="display: none;">
                   <LI class="nav-item" xbuilderid="roo-gen163">
                   </LI>
                 </UL>
               </NAV>
-              <DIV id="tab-body161" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 529px;">
+              <DIV id="tab-body161" class=" tab-content roo-layout-tabs-body" style="position: relative; height: 507px;">
                 <DIV class="roo-layout-grid-wrapper  roo-layout-active-content tab-pane" xbuilderid="roo-gen135" style="position: relative; display: block; zoom: 1; visibility: visible;">
                   <DIV xbuilderid="roo-gen136">
                     <DIV class="navbar roo-navbar-simple navbar-light bg-light" xbuilderid="roo-comp-1045" style="width: 218px;">
                       </UL>
                     </DIV>
                   </DIV>
-                  <DIV xbuilderid="roo-comp-1063" class="table-fixed roo-layout-component-panel" style="width: 250px; height: 475px;">
+                  <DIV xbuilderid="roo-comp-1063" class="table-fixed table-fixed roo-layout-component-panel" style="width: 250px; height: 453px;">
                     <TABLE class="table table-body-fixed table-striped table-hover table-responsive table-fixed">
                       <THEAD xbuilderid="roo-gen153">
                         <TR>
                           <TH class="x-hcol-0 col-xs-12 col-12 col-sm-12 col-md-12" style="" sort="name">Name</TH>
                         </TR>
                       </THEAD>
-                      <TBODY xbuilderid="roo-gen152" style="width: 250px; height: 426px;">
+                      <TBODY xbuilderid="roo-gen152" style="width: 250px; height: 404px;">
                         <TR xbuilderid="roo-gen165" style="width: 250px;">
                           <TD colspan="1"></TD>
                         </TR>
               </DIV>
             </DIV>
           </DIV>
-          <DIV xbuilderid="roo-gen17-split" class="roo-layout-split roo-layout-split-west roo-splitbar-h roo-layout-split-h" style="left: 250px; top: 0px; height: 529px;"> </DIV>
+          <DIV xbuilderid="roo-gen17-split" class="roo-layout-split roo-layout-split-west roo-splitbar-h roo-layout-split-h" style="left: 250px; top: 0px; height: 507px;"> </DIV>
         </DIV>
       </DIV>
     </DIV>