Various tweaks, everything is usable except password settings for the moment.
[lgpl/argeo-commons.git] / security / runtime / org.argeo.security.ria / src / argeo-ria-lib / security / class / org / argeo / security / ria / UsersApplet.js
index 5eb44f42ed1b0feee5ebb76d97d51a8f3d74ebfb..b107a3ee4a6dc82b368cebd138bff9c1f24b45b0 100644 (file)
@@ -28,18 +28,34 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
         */
        commands : {
                init : {
+                       "load_users" : {
+                               label           : "Reload Users",
+                               icon            : "org.argeo.security.ria/view-refresh.png",
+                               shortcut        : "Control+h",
+                               enabled         : true,
+                               menu            : "Users",
+                               toolbar         : "users",
+                               callback        : function(e){
+                                       this.loadUsersList();
+                               },
+                               command         : null
+                       },
                        "new_user" : {
                                label           : "New User", 
                                icon            : "org.argeo.security.ria/list-add.png",
                                shortcut        : "Control+n",
                                enabled         : true,
                                menu            : "Users",
-                               toolbar         : "userslist",
+                               toolbar         : null,
                                callback        : function(e){
                                        // Call service to delete
                                        var classObj = org.argeo.security.ria.UserEditorApplet;
-                                       var iView = org.argeo.ria.components.ViewsManager.getInstance().initIViewClass(classObj, "editor");
+                                       var initData = {USER:null,ROLES_LIST:this.getRolesList()};
+                                       var iView = org.argeo.ria.components.ViewsManager.getInstance().initIViewClass(classObj, "editor", initData);
                                        iView.load();
+                                       iView.addListener("savedUser", function(e){
+                                               this.refreshUserEntry(e.getData());
+                                       }, this);                                       
                                },
                                command         : null
                        },      
@@ -49,17 +65,47 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                                shortcut        : "Control+s",
                                enabled         : true,
                                menu            : "Users",
-                               toolbar         : "userslist",
+                               toolbar         : null,
                                callback        : function(e){
                                        // Call service to delete
-                                       var crtUsers = this.getViewSelection().getNodes();
-                                       for(var i=0;i<crtUsers.length;i++){
-                                               alert("Delete " + crtUsers[i]);
+                                       var username = this.getViewSelection().getNodes()[0];                                   
+                                       var deleteService = org.argeo.security.ria.SecurityAPI.getDeleteUserService(username);
+                                       deleteService.addListener("completed", function(response){
+                                               if(response.getContent().status && response.getContent().status == "OK"){
+                                                       this.loadUsersList();
+                                               }
+                                       }, this);
+                                       // Check if tab is opened before closing!
+                                       var editorTabPane = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("editor");
+                                       var iApplet = editorTabPane.contentExists(username);
+                                       var modal = new org.argeo.ria.components.Modal("Delete");
+                                       if(iApplet){
+                                               if(iApplet.getModified()){
+                                                       modal.addConfirm("There are unsaved changes, are you sure you want to delete this user?");
+                                                       modal.addListener("ok", function(e){
+                                                               editorTabPane.closeCurrent();
+                                                               deleteService.send();
+                                                       }, this);
+                                                       modal.attachAndShow();
+                                               }else{
+                                                       modal.addConfirm("Are you sure you want to delete user " + username + "?");
+                                                       modal.addListener("ok", function(e){
+                                                               editorTabPane.closeCurrent();
+                                                               deleteService.send();
+                                                       }, this);
+                                                       modal.attachAndShow();
+                                               }
+                                       }else{
+                                               modal.addConfirm("Are you sure you want to delete user " + username + "?");
+                                               modal.addListener("ok", function(e){
+                                                       deleteService.send();
+                                               }, this);
+                                               modal.attachAndShow();
                                        }
                                },
                                selectionChange : function(viewName, data){
                                        if(viewName != "users") return;
-                                       this.setEnabled(!(data == null || !data.length));                                       
+                                       this.setEnabled(!(data == null || !data.length || data.length>1));                                      
                                },
                                command         : null
                        },                      
@@ -69,13 +115,17 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                                shortcut        : "Control+u",
                                enabled         : true,
                                menu            : "Users",
-                               toolbar         : "userslist",
+                               toolbar         : null,
                                callback        : function(e){
                                        // Call service to delete
-                                       var crtUser = this.getViewSelection().getNodes()[0];
+                                       var crtUser = this.getViewSelection().getNodes()[0];                                    
                                        var classObj = org.argeo.security.ria.UserEditorApplet;
-                                       var iView = org.argeo.ria.components.ViewsManager.getInstance().initIViewClass(classObj, "editor", crtUser);
-                                       iView.load(crtUser);                                    
+                                       var initData = {USER:crtUser,ROLES_LIST:this.getRolesList()};
+                                       var iView = org.argeo.ria.components.ViewsManager.getInstance().initIViewClass(classObj, "editor", initData);
+                                       iView.load(crtUser);
+                                       iView.addListener("savedUser", function(e){
+                                               this.refreshUserEntry(e.getData());
+                                       }, this);
                                },
                                selectionChange : function(viewName, data){
                                        if(viewName != "users") return;
@@ -95,6 +145,14 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                nullable:false, 
                check:"org.argeo.ria.components.ViewSelection"
        },
+       usersList : {
+               check : "Map",
+               apply : "_applyUsersList",
+               event : "changeUsersList"
+       },
+       rolesList : {
+               check : "Array"
+       },
        instanceId : {init:""},
        instanceLabel : {init:""}
   },
@@ -107,7 +165,13 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
         */
        init : function(viewPane){
                this.setView(viewPane);
-               this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));                
+               this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
+               
+               this.toolBar = new qx.ui.toolbar.ToolBar();
+               this.toolBarPart = new qx.ui.toolbar.Part();
+               this.toolBar.add(this.toolBarPart);             
+               viewPane.add(this.toolBar);
+                               
                this.tableModel = new qx.ui.table.model.Filtered();
                this.tableModel.setColumns(["username", "roles"]);
                this.table = new qx.ui.table.Table(this.tableModel, {
@@ -123,19 +187,24 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                this.table.getSelectionModel().addListener("changeSelection", function(){
                        this._selectionToValues(this.table.getSelectionModel(), this.getViewSelection());
                }, this);
-               
-               this.setGuiMode("chooser");
+               this.table.addListener("cellDblclick", function(cellEvent){
+                       this.getCommands()["edit_user"].command.execute();
+               }, this);
+               
+               this.setRolesList([]);
+               this.setUsersList({});          
+               this.setGuiMode("clear");
        },
        
        _applyGuiMode : function(newMode, oldMode){
                this.table.getSelectionModel().clearSelection();
                this.resetHiddenRows();
                if(newMode == "filter"){
-                       this.table.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_INTERVAL_SELECTION);
+                       this.table.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION);
                }else if(newMode == "chooser"){
                        this.table.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.MULTIPLE_INTERVAL_SELECTION_TOGGLE);
                }else if(newMode == "clear"){
-                       this.table.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_INTERVAL_SELECTION);
+                       this.table.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION);
                }
        },
        
@@ -166,21 +235,81 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
         * @param data {Element} The text xml description. 
         */
        load : function(){              
-               var data = [["root", "ROLE_ADMIN"], ["mbaudier", "ROLE_ADMIN,ROLE_USER"], ["cdujeu","ROLE_USER"], ["anonymous", ""]];
-               this.tableModel.setData(data);                  
+               var commands = this.getCommands();
+               this.toolBarPart.add(commands["new_user"].command.getToolbarButton());
+               this.toolBarPart.add(commands["delete_user"].command.getToolbarButton());
+               this.toolBarPart.add(commands["edit_user"].command.getToolbarButton());                 
+               this.toolBar.setShow("icon");
+               this.loadUsersList();
+               
+               var rolesApplet = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("roles").getContent();
+               rolesApplet.addListener("changeRolesList", function(e){
+                       this.setRolesList(e.getData());
+                       this.loadUsersList();
+               }, this);
+               
        },
        
-       applySelection : function(selectionValues, target){
+       loadUsersList : function(){
+               var selectionModel = this.table.getSelectionModel();            
+               selectionModel.clearSelection();                
+               var request = org.argeo.security.ria.SecurityAPI.getListUsersService();
+               request.addListener("completed", function(response){
+                       var jSon = response.getContent();
+                       var usMap = {};
+                       for(var i=0;i<jSon.length;i++){
+                               var user = new org.argeo.security.ria.model.User();
+                               user.load(jSon[i], "json");
+                               usMap[user.getName()] = user;
+                       }
+                       this.setUsersList(usMap);                       
+               }, this);
+               request.send();                 
+       },
+       
+       /**
+        * 
+        * @param {org.argeo.security.ria.model.User} userObject
+        */
+       refreshUserEntry : function(userObject){
+               var userName = userObject.getName();
+               var data = this.tableModel.getDataAsMapArray();
+               var index = 0;
+               var found = false;
+               for(index=0;index<data.length;index++){
+                       if(data[index].username == userName){
+                               found =true;
+                               break;
+                       }
+               }
+               var newRows = [{username:userName,roles:userObject.getRoles().join(",")}];
+               if(found){
+                       this.tableModel.setRowsAsMapArray(newRows, index);
+               }else{
+                       this.tableModel.setRowsAsMapArray(newRows, index);
+               }
+       },
+       
+       _applyUsersList : function(usList){
+               var data = [];
+               qx.lang.Object.getValues(usList).forEach(function(usObject){
+                       data.push([usObject.getName(), usObject.getRoles().join(",")]);
+               });
+               this.tableModel.setData(data);                                  
+       },
+               
+       applySelection : function(selectionValue, target, ignoreCase){
                var selectionModel = this.table.getSelectionModel();            
                selectionModel.clearSelection();
-               if(!selectionValues){
+               if(!selectionValue){
                        return;
                }
                selectionModel.setBatchMode(true);
                var data = this.tableModel.getData();
                for(var i=0;i<this.tableModel.getRowCount();i++){
                        var value = this.tableModel.getRowDataAsMap(i)[target];
-                       if(qx.lang.Array.contains(selectionValues, value)){
+                       var pattern = new RegExp(selectionValue, "g"+(ignoreCase?"i":""));
+                       if(pattern.test(value)){
                                selectionModel.addSelectionInterval(i, i);
                        }
                }