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;
},
saveRoleModifications : function(deltaPlus, deltaMinus){
- //console.log(deltaPlus);
- //console.log(deltaMinus);
// LOAD CONCERNED USERS
var selectionModel = this.table.getSelectionModel();
if(!selectionModel.getSelectedCount()){
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]);
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){
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
/**\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
{
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 :
{
/**
*/
view : {
init : null
- },
+ },
/**
* Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions}
*/
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);
},
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);
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());
* 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.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);
}
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
},
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
},
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;
},
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();
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){
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
},\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