QX 0.8.3
[lgpl/argeo-commons.git] / security / runtime / org.argeo.security.ria / src / argeo-ria-lib / security / class / org / argeo / security / ria / UserEditorApplet.js
index 2d51a172e3e7a17f39e7827cea1b58c25218ca43..c7921dcc8ffc7af6be67d9dae0de9e4aa2a5aed0 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} 
         */
@@ -135,8 +139,14 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
        rolesList : {
                
        },
-       instanceId : {init:""},
-       instanceLabel : {init:"Editor"},
+       instanceId : {
+               init:"",
+               event : "changeInstanceId"
+       },
+       instanceLabel : {
+               init:"Editor",
+               event : "changeInstanceLabel"
+       },
        loaded : {
                init : false
        },
@@ -159,13 +169,13 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
         * @param viewPane {org.argeo.ria.components.ViewPane} The viewPane.
         */
        init : function(viewPane, data){
-               if(!data){
+               if(!data.USER){
                        var now = new Date();
                        this.setInstanceId(now.getTime());
                        this.setInstanceLabel("New User");                      
                }else{
-                       this.setInstanceId(data);
-                       this.setInstanceLabel("User " + data);
+                       this.setInstanceId(data.USER);
+                       this.setInstanceLabel("User " + data.USER);
                }
                this.setView(viewPane);
                this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
@@ -180,8 +190,8 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                
                this.setCurrentNatureTabs([]);
                this.naturesTab = new qx.ui.tabview.TabView("top");
-               this.naturesTab.addListener("changeSelected", function(e){
-                       this.setSelectedNatureTab(e.getData());
+               this.naturesTab.addListener("changeSelection", function(e){
+                       this.setSelectedNatureTab(e.getData()[0] || null);
                        this.getViewSelection().triggerEvent();
                }, this);
                
@@ -211,7 +221,7 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                this.basicGB.add(this.usernameField, {row:0,column:1});
                
                this.rolesField = new org.argeo.ria.components.ui.MultipleComboBox();
-               this.rolesField.setChoiceValues(["ROLE_ADMIN", "ROLE_USER", "ROLE_USER1"]);
+               this.rolesField.setChoiceValues(data.ROLES_LIST);
                this.basicGB.add(new qx.ui.basic.Label("Roles"), {row:1,column:0});             
                this.basicGB.add(this.rolesField, {row:1,column:1});
                
@@ -249,18 +259,71 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
        saveUser : function(){
                var user = this.getCurrentUser();
                user.setName(this.usernameField.getValue());
-               user.setRoles((this.rolesField.getValue()||"").split(","));
-               // GO TO AND RETURN FROM SERVER                 
-               user.setNatures([
-                       {
-                           "email" : "",
-                           "firstName" : "",
-                           "lastName" : "",
-                           "type" : "org.argeo.security.nature.SimpleUserNature"
-                       }]
-               );
-               this.partialRefreshUser(user, ["details","natures"]);
-               this.setModified(false);                
+               var roles = this.rolesField.getValue();
+               if(roles && roles != ""){
+                       user.setRoles(roles.split(","));
+               }else{
+                       user.setRoles([]);
+               }
+               
+               // GO TO AND RETURN FROM SERVER
+               if(user.isCreate()){
+                       if(!this.passPane.validate()){
+                               this.error("Warning, passwords differ!");
+                               return;
+                       }
+                       user.setPassword(this.passPane.getData());
+                       var create = true;
+                       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;
+                       }
+               }else{
+                       var pass = this.passPane.getData();
+                       if(pass != null && !this.passPane.validate()){
+                               this.error("Warning, passwords differ!");
+                               return;                                 
+                       }
+               }
+               this.passPane.clear();
+               var saveCompletedCallback = qx.lang.Function.bind(function(){
+                       if(create){
+                               this.setInstanceLabel("User " + user.getName());
+                               this.setInstanceId(user.getName());
+                       }
+                       this._setGuiInCreateMode(false);
+                       this.partialRefreshUser(user, ["details","natures"]);
+                       this.setModified(false);
+                       this.getViewSelection().triggerEvent();
+                       this.fireDataEvent("savedUser", user);                          
+               }, this);
+               var userService = user.getSaveService();
+               userService.addListener("completed", function(response){
+                       if(response.getContent().status && response.getContent().status == "ERROR"){
+                               return;
+                       }
+                       user.load(response.getContent(), "json");
+                       if(pass!=null){
+                               var passService = org.argeo.security.ria.SecurityAPI.getUpdateUserPassService(user.getName(), pass);
+                               passService.addListener("completed", function(response){
+                                       if(response.getContent().status){
+                                               this.info(response.getContent().message);
+                                       }
+                                       saveCompletedCallback();
+                               }, this);
+                               passService.send();
+                       }else{
+                               saveCompletedCallback();
+                       }
+               }, this);               
+               userService.send();
        },
        
        _addNatureTab : function(natureClass, natureData, select){
@@ -294,13 +357,23 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                        cancelB.setVisibility("visible");
                });
                cancelB.addListener("execute", function(){
+                       if(newClass.getIsNew()){
+                               this._removeNatureTab(natureClass);
+                       }
                        newClass.setEditMode(false);
                        editB.setVisibility("visible");
                        saveB.setVisibility("excluded");
                        cancelB.setVisibility("excluded");
-               });
+               }, this);
                saveB.addListener("execute", function(){
                        // SAVE CURRENT NATURE
+                       var data = newClass.getData();
+                       if(newClass.getIsNew()){
+                               this.getCurrentUser().addNature(data);
+                       }else{
+                               this.getCurrentUser().updateNature(data);
+                       }
+                       this.saveUser();
                        this.setNaturesModified(false);
                        newClass.setEditMode(false);
                        editB.setVisibility("visible");
@@ -308,9 +381,10 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                        cancelB.setVisibility("excluded");
                }, this);
                if(natureData){
-                       newClass.setData(natureData);
+                       newClass.setData(natureData);                   
                        cancelB.execute();
                }else{
+                       newClass.setIsNew(true);
                        editB.execute();
                }
                this.naturesTab.add(page);
@@ -320,7 +394,7 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
                        this.setNaturesModified(true);
                }, this);  
                if(select){
-                       this.naturesTab.setSelected(page);
+                       this.naturesTab.setSelection([page]);
                }
                return page;
        },
@@ -340,16 +414,33 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet",
        },
        
        removeSelectedTab : function(){
-               var selected = this.naturesTab.getSelected();
-               this._removeNatureTab(selected.getUserData("NATURE_CLASS"));
+               if(this.naturesTab.isSelectionEmpty()) return;
+               var selected = this.naturesTab.getSelection()[0];
+               var tabClass = selected.getUserData("NATURE_CLASS");
+               var user = this.getCurrentUser();
+               user.removeNature(tabClass.NATURE_TYPE);
+               this.saveUser();
+               this._removeNatureTab(tabClass);
        },
        
        removeAllTabs : function(){
-               while(this.naturesTab.getSelected()){
-                       this._removeNatureTab(this.naturesTab.getSelected().getUserData("NATURE_CLASS"));
+               while(!this.naturesTab.isSelectionEmpty()){
+                       this._removeNatureTab(this.naturesTab.getSelection()[0].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);
@@ -375,30 +466,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.Type.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());
@@ -412,12 +513,10 @@ 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;
-               }
-               this.setRolesList(["ROLE_ADMIN", "ROLE_USER"]);
-               
+               }               
                // MUST BE DONE AFTER COMMANDS ARE INITIALIZED! 
                var commands = this.getCommands();
                var saveButton = commands["save_user"].command.getFormButton(); 
@@ -442,11 +541,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);
                }