Various tweaks, everything is usable except password settings for the moment.
authorCharles du Jeu <charles.dujeu@gmail.com>
Sun, 20 Sep 2009 10:01:57 +0000 (10:01 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Sun, 20 Sep 2009 10:01:57 +0000 (10:01 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@2987 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/RolesApplet.js
security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/SecurityAPI.js
security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js
security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UsersApplet.js
security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/components/CoworkerNatureImpl.js
security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/model/User.js

index 65b5427b30259fbe5dc1a968744151cbad0d73f1..353bedc2849e81e9b8685c03933b320f532e6480 100644 (file)
@@ -59,13 +59,18 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                                callback        : function(e){
                                        // Call service to delete
                                        var roles = this.getViewSelection().getNodes();
-                                       for(var i=0;i<roles.length;i++){
-                                               var service = org.argeo.security.ria.SecurityAPI.getDeleteRoleService(roles[i]);
-                                               service.addListener("completed", function(response){
-                                                       this.loadRolesList();
-                                               }, this);
-                                               service.send();
-                                       }
+                                       var modal = new org.argeo.ria.components.Modal("Delete");                                       
+                                       modal.addConfirm("Are you sure you want to delete the selected roles?");
+                                       modal.addListener("ok", function(e){
+                                               for(var i=0;i<roles.length;i++){
+                                                       var service = org.argeo.security.ria.SecurityAPI.getDeleteRoleService(roles[i]);
+                                                       service.addListener("completed", function(response){
+                                                               this.loadRolesList();
+                                                       }, this);
+                                                       service.send();
+                                               }
+                                       }, this);
+                                       modal.attachAndShow();                                  
                                },
                                selectionChange : function(viewName, data){
                                        if(viewName != "roles") return;
@@ -253,8 +258,6 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
        },
        
        saveRoleModifications : function(deltaPlus, deltaMinus){
-               //console.log(deltaPlus);
-               //console.log(deltaMinus);
                // LOAD CONCERNED USERS
                var selectionModel = this.table.getSelectionModel();
                if(!selectionModel.getSelectedCount()){
@@ -263,6 +266,8 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                var roleValue = this._selectionToValues(selectionModel)[0];
                
                var users = deltaPlus.concat(deltaMinus);
+               var modal = new org.argeo.ria.components.Modal("Batch Update", "", "Please wait, updating roles for selected users");
+               modal.attachAndShow();
                for(var i=0;i<users.length;i++){
                        var user = users[i];
                        var userDetailService = org.argeo.security.ria.SecurityAPI.getUserDetailsService(users[i]);
@@ -274,13 +279,15 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                                        qx.lang.Array.remove(userRoles, roleValue);
                                }
                                var userSaveService = org.argeo.security.ria.SecurityAPI.getUpdateUserService(response.getContent());
-                               userSaveService.addListener("completed", function(e){
-                                       this.fireDataEvent("changeRolesList", this.getRolesList());
-                               }, this);
+                               userSaveService.setAsynchronous(false);
                                userSaveService.send();
                        }, this);
+                       userDetailService.setAsynchronous(false);
                        userDetailService.send();
                }
+               this.fireDataEvent("changeRolesList", this.getRolesList());
+               modal.hide();
+               modal.destroy();
        },
        
        monitorChooserSelectionChanges : function(event){
index 962f402d25d24376d2a1967c9ba71971b12aed59..0d26d4776ab68f5f10d4fddb57e88ae23c047c4b 100644 (file)
@@ -46,8 +46,8 @@ qx.Class.define("org.argeo.security.ria.SecurityAPI", {
                                var jSonContent = response.getContent();  \r
                                if(typeof jSonContent == "object" && jSonContent.status && jSonContent.status == "ERROR"){\r
                                        org.argeo.ria.components.Logger.getInstance().error(jSonContent.message);\r
-                               }\r
-                               request.setState("failed");\r
+                                       response.getTarget().abort();\r
+                               }                               \r
                        });\r
 \r
                        // Attach ILoadStatusables & reloadEvents\r
@@ -124,11 +124,12 @@ qx.Class.define("org.argeo.security.ria.SecurityAPI", {
                /**\r
                 * @return  {qx.io.remote.Request}\r
                 */\r
-               getCreateUserService : function(userName, password){\r
+               getCreateUserService : function(userObject){\r
                        var req = org.argeo.security.ria.SecurityAPI.getServiceRequest(org.argeo.security.ria.SecurityAPI.CREATE_USER_SERVICE);\r
-                       org.argeo.security.ria.SecurityAPI.parseOptionalArguments(req, arguments, 2);\r
-                       req.setParameter("username", userName);\r
-                       req.setParameter("password", password);\r
+                       req.setMethod("POST");\r
+                       org.argeo.security.ria.SecurityAPI.parseOptionalArguments(req, arguments, 1);\r
+                       var jsonString = qx.util.Json.stringify(userObject);\r
+                       req.setData(jsonString);\r
                        return req;\r
                },\r
                \r
index 55316d26e5f980ae371bdf0e19208cae1d7528a2..38ca9c85c5dce21b7841d7a691c4de40e922469a 100644 (file)
@@ -9,12 +9,16 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
 {
   extend : qx.ui.container.Composite,
   implement : [org.argeo.ria.components.IView], 
-
+  
   construct : function(){
        this.base(arguments);
        this.setLayout(new qx.ui.layout.VBox(5));
   },
-
+  
+  events : {
+       "savedUser" : "qx.event.type.Data"
+  },
+  
   properties : 
   {
        /**
@@ -22,7 +26,7 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
         */
        view : {
                init : null
-       },
+       },      
        /**
         * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions} 
         */
@@ -251,12 +255,31 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                user.setName(this.usernameField.getValue());
                user.setRoles((this.rolesField.getValue()||"").split(","));
                // GO TO AND RETURN FROM SERVER
+               if(user.isCreate()){
+                       var userExists = false;
+                       var req = org.argeo.security.ria.SecurityAPI.getUserExistsService(user.getName());
+                       req.addListener("completed", function(response){
+                               userExists = response.getContent().value;
+                       }, this);
+                       req.setAsynchronous(false);
+                       req.send();
+                       if(userExists){
+                               this.error("User already exists, choose another name!");
+                               return;
+                       }
+               }
                var userService = user.getSaveService();
                userService.send();
-               userService.addListener("completed", function(e){
+               userService.addListener("completed", function(response){
+                       if(response.getContent().status && response.getContent().status == "ERROR"){
+                               return;
+                       }
+                       this._setGuiInCreateMode(false);
+                       user.load(response.getContent(), "json");
                        this.partialRefreshUser(user, ["details","natures"]);
                        this.setModified(false);
                        this.getViewSelection().triggerEvent();
+                       this.fireDataEvent("savedUser", user);
                }, this);
        },
        
@@ -361,7 +384,19 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                        this._removeNatureTab(this.naturesTab.getSelected().getUserData("NATURE_CLASS"));
                }
        },
-               
+         
+       _setGuiInCreateMode : function(bool){
+               if(bool){
+                       if(!this.natureButtonGB.isVisible()) return;
+                       this.natureButtonGB.hide();
+                       this.fakePane.setVisibility("excluded");
+               }else{                          
+                       if(this.natureButtonGB.isVisible()) return;
+                       this.natureButtonGB.show();
+                       this.fakePane.setVisibility("visible");
+               }
+       },
+       
        _attachListeners : function(){
                this.usernameField.addListener("changeValue", function(){
                        this.setModified(true);
@@ -387,30 +422,40 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                if(value) this.getViewSelection().triggerEvent();
        },
        
-       loadUserData : function(user){
-               this.setCurrentUser(user);
-               this.usernameField.setValue(user.getName());
-               this.usernameField.setReadOnly(true);
-               this.rolesField.setValue(user.getRoles());
-               var userNatureTabs = this.naturesManager.detectNaturesInData(user.getNatures());
-               if(userNatureTabs.length){
-                       userNatureTabs.forEach(function(el){
-                               this._addNatureTab(el.NATURE_CLASS, el.NATURE_DATA);
-                       }, this);
-               }               
+       loadUserData : function(userName){
+               var userDataService = org.argeo.security.ria.SecurityAPI.getUserDetailsService(userName);
+               userDataService.addListener("completed", function(response){
+                       var user = new org.argeo.security.ria.model.User();
+                       user.load(response.getContent(), "json");                       
+                       this.setCurrentUser(user);
+                       this.usernameField.setValue(user.getName());
+                       this.usernameField.setReadOnly(true);
+                       this.rolesField.setValue(user.getRoles());
+                       var userNatureTabs = this.naturesManager.detectNaturesInData(user.getNatures());
+                       if(userNatureTabs.length){
+                               userNatureTabs.forEach(function(el){
+                                       this._addNatureTab(el.NATURE_CLASS, el.NATURE_DATA);
+                               }, this);
+                       }       
+                       this._attachListeners();                        
+               }, this);
+               userDataService.send();
        },
        
        partialRefreshUser : function(user, target){
                if(!qx.lang.Array.isArray(target)) target = [target];
                
                if(qx.lang.Array.contains(target,"natures")){
+                       if(this.getSelectedNatureTab()){
+                               var selectedTab = this.getSelectedNatureTab().getUserData("NATURE_CLASS");
+                       }
                        this.removeAllTabs();
                        var userNatureTabs = this.naturesManager.detectNaturesInData(user.getNatures());
                        if(userNatureTabs.length){
                                userNatureTabs.forEach(function(el){
-                                       this._addNatureTab(el.NATURE_CLASS, el.NATURE_DATA);
+                                       this._addNatureTab(el.NATURE_CLASS, el.NATURE_DATA, (selectedTab && selectedTab == el.NATURE_CLASS));
                                }, this);
-                       }                                       
+                       }                       
                }
                if(qx.lang.Array.contains(target,"details")){
                        this.setInstanceLabel("User "+user.getName());
@@ -424,7 +469,7 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
         * Load a given row : the data passed must be a simple data array.
         * @param data {Element} The text xml description. 
         */
-       load : function(user){
+       load : function(userName){
                if(this.getLoaded()){
                        return;
                }               
@@ -452,11 +497,12 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                this.natureButtonGB.add(natureButton);
                this.natureButtonGB.add(removeButton);
                
-               if(user){
-                       this.loadUserData(user);
-                       this._attachListeners();
+               if(userName){
+                       this.loadUserData(userName);
+                       this._setGuiInCreateMode(false);                        
                }else{
                        this.setCurrentUser(new org.argeo.security.ria.model.User());
+                       this._setGuiInCreateMode(true);
                        this._attachListeners();
                        this.setModified(true);
                }
index 206bf1436f564a40fa2d3e27dae4eaa741934679..b107a3ee4a6dc82b368cebd138bff9c1f24b45b0 100644 (file)
@@ -53,6 +53,9 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                                        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
                        },      
@@ -65,14 +68,44 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                                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
                        },                      
@@ -85,12 +118,14 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                                toolbar         : null,
                                callback        : function(e){
                                        // Call service to delete
-                                       var crtUser = this.getViewSelection().getNodes()[0];
-                                       var userObject = this.getUsersList()[crtUser];
+                                       var crtUser = this.getViewSelection().getNodes()[0];                                    
                                        var classObj = org.argeo.security.ria.UserEditorApplet;
                                        var initData = {USER:crtUser,ROLES_LIST:this.getRolesList()};
                                        var iView = org.argeo.ria.components.ViewsManager.getInstance().initIViewClass(classObj, "editor", initData);
-                                       iView.load(userObject);                                 
+                                       iView.load(crtUser);
+                                       iView.addListener("savedUser", function(e){
+                                               this.refreshUserEntry(e.getData());
+                                       }, this);
                                },
                                selectionChange : function(viewName, data){
                                        if(viewName != "users") return;
@@ -216,6 +251,8 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
        },
        
        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();
@@ -230,6 +267,29 @@ qx.Class.define("org.argeo.security.ria.UsersApplet",
                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){
index e63d37479946de67e28f2c6935d948a8715cfe96..41a4ca9ddcb8a4707d5752f1b3dc38a1856cf797 100644 (file)
@@ -20,8 +20,9 @@ qx.Class.define("org.argeo.security.ria.components.CoworkerNatureImpl", {
                        grid.setColumnFlex(0,1);\r
                        grid.setColumnAlign(0,"right", "middle");\r
                        grid.setColumnFlex(1,3);\r
-                                       \r
-                       this.descField = new qx.ui.form.TextField();\r
+                       \r
+                       grid.setRowAlign(0, "right", "top");\r
+                       this.descField = new qx.ui.form.TextArea();\r
                        this.mobileField = new qx.ui.form.TextField();\r
                        this.phoneField = new qx.ui.form.TextField();\r
                        \r
index 4595fbcb5b103829aa9487fff848afbe0253eb10..64ba63e4c898c95c3b13854e6b5b8dde06cfc807 100644 (file)
@@ -13,22 +13,32 @@ qx.Class.define("org.argeo.security.ria.model.User", {
                },\r
                rawData : {\r
                        \r
+               },\r
+               create : {\r
+                       check : "Boolean",\r
+                       init : true\r
                }\r
        },\r
        construct : function(){\r
                this.base(arguments);\r
                this.setRoles([]);\r
                this.setNatures([]);\r
+               this.setRawData({"password":"{SHA}ieSV55Qc+eQOaYDRSha/AjzNTJE="});\r
        },\r
        members : {\r
                load : function(data, format){\r
+                       this.setCreate(false);\r
                        this.setName(data.username);\r
                        this.setRoles(data.roles);\r
                        this.setNatures(data.userNatures);\r
                        this.setRawData(data);\r
                },\r
                getSaveService : function(){\r
-                       var userService = org.argeo.security.ria.SecurityAPI.getUpdateUserService(this.toJSON());\r
+                       if(this.isCreate()){\r
+                               var userService = org.argeo.security.ria.SecurityAPI.getCreateUserService(this.toJSON());                       \r
+                       }else{\r
+                               var userService = org.argeo.security.ria.SecurityAPI.getUpdateUserService(this.toJSON());                               \r
+                       }\r
                        userService.addListener("completed", function(response){\r
                                if(!response || !response.username) return;\r
                                this.load(response.getContent(), "json");\r