X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=security%2Fruntime%2Forg.argeo.security.ria%2Fsrc%2Fargeo-ria-lib%2Fsecurity%2Fclass%2Forg%2Fargeo%2Fsecurity%2Fria%2FUserEditorApplet.js;h=f7fad1df4f3ebc991cdc65837bcb2c8bb0dd0049;hb=06f80b7b50619d1c997e2660eddb32a584cfc8a8;hp=1960ff8dc65bd89b27e915db01660dbfc4bec9f2;hpb=92d921b154323c10abfe751d0b3df2bd3e7c97be;p=lgpl%2Fargeo-commons.git diff --git a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js index 1960ff8dc..f7fad1df4 100644 --- a/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js +++ b/security/runtime/org.argeo.security.ria/src/argeo-ria-lib/security/class/org/argeo/security/ria/UserEditorApplet.js @@ -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} */ @@ -36,14 +40,62 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", menu : "Users", toolbar : "user", callback : function(e){ - + // CALL SERVICE AND GET UP TO DATE USER + this.saveUser(); }, - selectionChange : function(viewName, data){ + selectionChange : function(viewName, data){ if(viewName != "editor") return; var iApplet = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("editor").getContent(); - if(iApplet == null) this.setEnabled(true); this.setEnabled(iApplet.getModified()); - //this.setEnabled(!(data == null || !data.length || data.length > 1)); + }, + command : null + }, + "add_nature" : { + label : "Add Nature ...", + icon : "org.argeo.security.ria/list-add.png", + shortcut : null, + enabled : true, + menu : "Natures", + toolbar : null, + callback : function(e){ + }, + submenuCallback : function(commandClass){ + this._addNatureTab(commandClass, null, true); + }, + submenu : [ + {"label" : "Totot", "icon":"","commandId" : "toto"}, + {"label" : "Totot", "icon":"","commandId" : "toto"} + ], + selectionChange : function(viewName, data){ + if(viewName != "editor") return; + var iApplet = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("editor").getContent(); + if(iApplet && iApplet.getCurrentNatureTabs() && iApplet.getAvailableNatures() + && iApplet.getCurrentNatureTabs().length < qx.lang.Object.getLength(iApplet.getAvailableNatures())){ + this.setEnabled(true); + }else{ + this.setEnabled(false); + } + }, + command : null + }, + "remove_nature" : { + label : "Remove Nature", + icon : "org.argeo.security.ria/list-remove.png", + shortcut : null, + enabled : true, + menu : "Natures", + toolbar : null, + callback : function(e){ + this.removeSelectedTab(); + }, + selectionChange : function(viewName, data){ + if(viewName != "editor") return; + var iApplet = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("editor").getContent(); + if(iApplet && iApplet.getSelectedNatureTab() && iApplet.getSelectedNatureTab().getUserData("NATURE_CLASS")){ + this.setEnabled(true); + }else{ + this.setEnabled(false); + } }, command : null }, @@ -57,7 +109,7 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", callback : function(e){ // Call service to delete var iApplet = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("editor").getContent(); - if(!iApplet.getModified()){ + if(!iApplet.getModified() && !iApplet.getNaturesModified()){ this.getView().closeCurrent(); return; } @@ -78,15 +130,35 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", }, modified : { init : false, - apply : "_applyModified" + apply : "_applyDetailsModified" + }, + naturesModified : { + init : false, + apply : "_applyNaturesModified" }, rolesList : { }, - instanceId : {init:""}, - instanceLabel : {init:"Editor"}, + instanceId : { + init:"", + event : "changeInstanceId" + }, + instanceLabel : { + init:"Editor", + event : "changeInstanceLabel" + }, loaded : { init : false + }, + currentNatureTabs : { + }, + availableNatures : { + }, + selectedNatureTab : { + nullable : true + }, + currentUser : { + } }, @@ -97,22 +169,37 @@ 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())); + this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); + + this.naturesManager = new org.argeo.security.ria.components.NaturesManager(); + var detectedNatures = this.naturesManager.getDetectedNatures(); + this.setAvailableNatures(detectedNatures); // TOOLBAR this.buttonGB = new qx.ui.container.Composite(new qx.ui.layout.HBox(5, "right")); this.add(this.buttonGB); + this.setCurrentNatureTabs([]); + this.naturesTab = new qx.ui.tabview.TabView("top"); + this.naturesTab.addListener("changeSelected", function(e){ + this.setSelectedNatureTab(e.getData()); + this.getViewSelection().triggerEvent(); + }, this); + + this.basicPage = new qx.ui.tabview.Page("Basic Information"); + this.basicPage.setLayout(new qx.ui.layout.VBox(5)); + // GROUPBOXES + this.basicGB = new qx.ui.groupbox.GroupBox("Base Informations"); var grid = new qx.ui.layout.Grid(5,5); this.basicGB.setLayout(grid); @@ -125,13 +212,8 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", this.passGB.setLayout(new qx.ui.layout.VBox()); this._initializeGroupBox(this.passGB); - this.naturesGB = new qx.ui.groupbox.GroupBox("User Natures"); - this.naturesGB.setLayout(new qx.ui.layout.Dock()); - this._initializeGroupBox(this.naturesGB); - this.add(this.basicGB); this.add(this.passGB); - this.add(this.naturesGB, {flex:1}); // FIELDS this.usernameField = new qx.ui.form.TextField(); @@ -139,24 +221,225 @@ 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}); this.passPane = new org.argeo.security.ria.components.PasswordCredentialImpl(); this.passGB.add(this.passPane.getContainer()); - this.naturesTab = new qx.ui.tabview.TabView("top"); - this.simpleNature = new org.argeo.security.ria.components.SimpleUserNatureImpl(); + //this.naturesTab.add(this.basicPage); + this.natureButtonGB = new qx.ui.container.Composite(new qx.ui.layout.HBox(5, "right")); + this.natureButtonGB.setMarginTop(15); + this.add(this.natureButtonGB); - var page1 = new qx.ui.tabview.Page(this.simpleNature.getNatureLabel()); - page1.setLayout(new qx.ui.layout.Dock()); - page1.add(this.simpleNature.getContainer(), {edge:"center"}); - this.naturesTab.add(page1); - this.naturesGB.add(this.naturesTab, {edge:"center"}); + + this.add(this.naturesTab, {flex:1}); + + this.naturesTab.setVisibility("excluded"); + this.fakePane = new qx.ui.container.Composite(new qx.ui.layout.Canvas()); + this.fakePane.setVisibility("visible"); + this.fakePane.setDecorator("tabview-pane"); + this.fakePane.setMarginTop(30); + this.add(this.fakePane, {flex:1}); + + title = new qx.ui.basic.Atom("User Details", "org.argeo.security.ria/preferences-users.png"); + title.setFont(qx.bom.Font.fromString("16px sans-serif bold")); + this.buttonGB.add(title); + this.buttonGB.add(new qx.ui.core.Spacer(), {flex:1}); + + var title2 = new qx.ui.basic.Atom("User Natures", "org.argeo.security.ria/identity.png"); + title2.setFont(qx.bom.Font.fromString("16px sans-serif bold")); + this.natureButtonGB.add(title2); + this.natureButtonGB.add(new qx.ui.core.Spacer(), {flex:1}); + }, - + + saveUser : function(){ + var user = this.getCurrentUser(); + user.setName(this.usernameField.getValue()); + 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){ + var crtTabs = this.getCurrentNatureTabs(); + if(qx.lang.Array.contains(crtTabs, natureClass.NATURE_TYPE)){ + this.error("There can only be one instance of a given nature type!"); + return null; + } + if(!this.naturesTab.isVisible()){ + if(this.fakePane) this.fakePane.setVisibility("excluded"); + this.naturesTab.setVisibility("visible"); + } + var page = new qx.ui.tabview.Page("Nature : " + natureClass.NATURE_LABEL); + page.setLayout(new qx.ui.layout.Dock()); + page.setUserData("NATURE_CLASS", natureClass); + var newClass = new natureClass(); + page.add(newClass.getContainer(), {edge:"center"}); + + buttons = new qx.ui.container.Composite(new qx.ui.layout.HBox(5, "center")); + var editB = new qx.ui.form.Button("Edit this Nature", "org.argeo.security.ria/document-properties-22.png"); + var saveB = new qx.ui.form.Button("Save", "org.argeo.security.ria/dialog-apply.png"); + var cancelB = new qx.ui.form.Button("Cancel", "org.argeo.security.ria/dialog-cancel.png"); + buttons.add(editB); + buttons.add(saveB); + buttons.add(cancelB); + page.add(buttons, {edge:"south"}); + editB.addListener("execute", function(){ + newClass.setEditMode(true); + editB.setVisibility("excluded"); + saveB.setVisibility("visible"); + 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"); + saveB.setVisibility("excluded"); + cancelB.setVisibility("excluded"); + }, this); + if(natureData){ + newClass.setData(natureData); + cancelB.execute(); + }else{ + newClass.setIsNew(true); + editB.execute(); + } + this.naturesTab.add(page); + crtTabs.push(natureClass.NATURE_TYPE); + this.getViewSelection().triggerEvent(); + newClass.addListener("modified", function(){ + this.setNaturesModified(true); + }, this); + if(select){ + this.naturesTab.setSelected(page); + } + return page; + }, + + _removeNatureTab : function(natureClass){ + this.naturesTab.getChildren().forEach(function(el){ + if(el.getUserData("NATURE_CLASS") == natureClass){ + this.naturesTab.remove(el); + qx.lang.Array.remove(this.getCurrentNatureTabs(), natureClass.NATURE_TYPE); + this.getViewSelection().triggerEvent(); + } + }, this); + if(this.naturesTab.getChildren().length == 0){ + this.naturesTab.setVisibility("excluded"); + this.fakePane.setVisibility("visible"); + } + }, + + removeSelectedTab : function(){ + var selected = this.naturesTab.getSelected(); + 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")); + } + }, + + _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); @@ -167,9 +450,6 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", this.passPane.addListener("modified", function(){ this.setModified(true); }, this); - this.simpleNature.addListener("modified", function(){ - this.setModified(true); - }, this); }, _initializeGroupBox: function(groupBox){ @@ -177,32 +457,100 @@ qx.Class.define("org.argeo.security.ria.UserEditorApplet", groupBox.getChildrenContainer().setPadding(8); }, - _applyModified : function(value){ + _applyDetailsModified : function(value){ + if(value) this.getViewSelection().triggerEvent(); + }, + + _applyNaturesModified : function(value){ if(value) this.getViewSelection().triggerEvent(); }, + 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, (selectedTab && selectedTab == el.NATURE_CLASS)); + }, this); + } + } + if(qx.lang.Array.contains(target,"details")){ + this.setInstanceLabel("User "+user.getName()); + this.usernameField.setValue(user.getName()); + this.rolesField.setValue(user.getRoles()); + this.usernameField.setReadOnly(true); + } + }, + /** * Load a given row : the data passed must be a simple data array. * @param data {Element} The text xml description. */ - load : function(userData){ + load : function(userName){ if(this.getLoaded()){ return; + } + // MUST BE DONE AFTER COMMANDS ARE INITIALIZED! + var commands = this.getCommands(); + var saveButton = commands["save_user"].command.getFormButton(); + var closeButton = commands["close"].command.getFormButton(); + var removeButton = commands["remove_nature"].command.getFormButton(); + var natureButton = commands["add_nature"].command.getFormButton(); + + var detectedNatures = this.getAvailableNatures(); + var newMenu = []; + for(var key in detectedNatures){ + newMenu.push({"label" : detectedNatures[key].NATURE_LABEL, "icon":"", "commandId" : detectedNatures[key]}); } - if(userData){ - this.usernameField.setValue(userData); + commands["add_nature"].command.setMenu(newMenu); + + natureButton.setShow("icon"); + removeButton.setShow("icon"); + saveButton.setShow("icon"); + closeButton.setShow("icon"); + + this.buttonGB.add(saveButton); + this.buttonGB.add(closeButton); + this.natureButtonGB.add(natureButton); + this.natureButtonGB.add(removeButton); + + 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); } - this.setRolesList(["ROLE_ADMIN", "ROLE_USER"]); - this._attachListeners(); - var title = new qx.ui.basic.Atom(this.getInstanceLabel(), "org.argeo.security.ria/preferences-user.png"); - title.setFont(qx.bom.Font.fromString("16px sans-serif bold")); - this.buttonGB.add(title); - this.buttonGB.add(new qx.ui.core.Spacer(), {flex:1}); - var commands = this.getCommands(); - var button = new qx.ui.form.Button("Save", "org.argeo.security.ria/document-save.png", commands["save_user"].command); - var button2 = new qx.ui.form.Button("Close", "org.argeo.security.ria/window-close.png", commands["close"].command); - this.buttonGB.add(button); - this.buttonGB.add(button2); + + this.setLoaded(true); },