There is indeed a getRoleList service
[lgpl/argeo-commons.git] / security / runtime / org.argeo.security.ria / src / argeo-ria-lib / security / class / org / argeo / security / ria / RolesApplet.js
index 3803968a9a9a797f33d730eb131dd3f1a4d0dbfb..3533221af41a90ee4aed32c0b57b47721005acb8 100644 (file)
@@ -28,13 +28,45 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
         */
        commands : {
                init : {
+                       "new_role" : {
+                               label           : "Create Role", 
+                               icon            : "org.argeo.security.ria/list-add.png",
+                               shortcut        : "Control+n",
+                               enabled         : true,
+                               menu            : "Roles",
+                               toolbar         : null,
+                               callback        : function(e){
+                                       // Prompt for new name
+                               },
+                               command         : null
+                       },      
+                       "delete_role" : {
+                               label           : "Delete Role", 
+                               icon            : "org.argeo.security.ria/list-remove.png",
+                               shortcut        : "Control+s",
+                               enabled         : true,
+                               menu            : "Roles",
+                               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]);
+                                       }
+                               },
+                               selectionChange : function(viewName, data){
+                                       if(viewName != "roles") return;
+                                       this.setEnabled(!(data == null || !data.length));                                       
+                               },
+                               command         : null
+                       },                                              
                        "edit_role" : {
                                label           : "Edit Role", 
-                               icon            : "ria/window-close.png",
+                               icon            : "org.argeo.security.ria/document-properties.png",
                                shortcut        : "Control+r",
                                enabled         : true,
                                menu            : "Roles",
-                               toolbar         : "role",
+                               toolbar         : null,
                                callback        : function(e){
                                        // Call service to delete
                                        this.setGuiMode("edit");
@@ -71,7 +103,13 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
         */
        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.Simple();
                this.tableModel.setColumns(["Role Name"]);
                this.table = new qx.ui.table.Table(this.tableModel, {
@@ -88,50 +126,58 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                        this._selectionToValues(this.table.getSelectionModel(), this.getViewSelection());
                }, this);
                
-               
-               this.rolesUsersStub = {"ROLE_ADMIN":["root","mbaudier"],"ROLE_USER":["mbaudier","cdujeu"]};
-                               
-               var buttonPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(2, "right"));
-               this.getView().header.setPadding(0);
-               if(this.getView().headerLabel) this.getView().headerLabel.setMargin(8);
-               this.getView().header.add(buttonPane, {edge:"east"});
-       
-               this.toggleButton = new qx.ui.form.ToggleButton("Filter", "ria/go-right.png");
+               this.rolesUsersStub = {"ROLE_ADMIN":["gandalf"],"ROLE_USER":["demo","frodo","gandalf"]};
+                                       
+               this.toggleButton = new qx.ui.form.ToggleButton("Filter", "org.argeo.security.ria/go-next.png");
                this.toggleButton.set({
                        show:"icon",
                        margin:2,
                        toolTip :new qx.ui.tooltip.ToolTip("Apply automatic filtering on Users list")                   
                });
-               buttonPane.add(this.toggleButton);
                                
                // TOGGLE THE GUI MODES                 
                this.toggleButton.addListener("changeChecked", function(event){
                        this.setGuiMode(event.getData()?"filter":"clear");
                }, this);
                
-               this.saveButton = new qx.ui.form.Button("Save");
+               this.saveButton = new qx.ui.form.Button("Save", "org.argeo.security.ria/document-save.png");
                this.saveButton.set({
-                       show:"label",
+                       show:"icon",
                        margin:2,
                        toolTip :new qx.ui.tooltip.ToolTip("Save changes"),
                        visibility : "excluded"
                });
-               buttonPane.add(this.saveButton);                
                
-               this.cancelButton = new qx.ui.form.Button("Cancel");
+               this.cancelButton = new qx.ui.form.Button("Cancel", "org.argeo.security.ria/window-close.png");
                this.cancelButton.set({
-                       show:"label",
+                       show:"icon",
                        margin:2,
                        toolTip :new qx.ui.tooltip.ToolTip("Cancel changes"),
                        visibility : "excluded"                         
                });
-               buttonPane.add(this.cancelButton);              
                
-               var listener = function(){
-                       this.setGuiMode(this.initialState);
-               };
-               this.saveButton.addListener("execute", listener, this);
-               this.cancelButton.addListener("execute", listener, this);
+               this.saveButton.addListener("execute", function(){
+                       if(!this.usersAppletReference){
+                               this.setGuiMode(this.initialState);
+                               return;
+                       }
+                       var newSelection = this.usersAppletReference.getViewSelection().getNodes();
+                       var diff = this._selectionDiff(this.getChooserOriginalSelection(), newSelection);
+                       this.saveRoleModifications(diff.deltaPlus, diff.deltaMinus);
+                       this.setGuiMode(this.initialState);
+               }, this);
+               this.cancelButton.addListener("execute", function(){
+                       if(!this.getChooserSelectionModified()){
+                               this.setGuiMode(this.initialState);
+                               return;
+                       }
+                       var modal = new org.argeo.ria.components.Modal("Warning");
+                       modal.addConfirm("There are unsaved changes!\n Are you sure you want to close?");
+                       modal.addListener("ok", function(){
+                               this.setGuiMode(this.initialState);
+                       }, this);
+                       modal.attachAndShow();                  
+               }, this);
                
                this.table.addListener("cellDblclick", function(cellEvent){
                        this.setGuiMode("edit");
@@ -184,13 +230,17 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                }
        },
        
+       saveRoleModifications : function(deltaPlus, deltaMinus){
+               console.log(deltaPlus);
+               console.log(deltaMinus);
+       },
+       
        monitorChooserSelectionChanges : function(event){
                if(!this.usersAppletReference || this.getChooserSelectionModified()) return;
                var initialSelection = this.getChooserOriginalSelection();
                var crtSelection = event.getTarget().getNodes();
                if(!qx.lang.Array.equals(initialSelection.sort(), crtSelection.sort())){
-                       this.setChooserSelectionModified(true);
-                       console.log("Changed!");
+                       this.setChooserSelectionModified(true);                         
                        this.saveButton.setEnabled(true);
                }
        },
@@ -213,10 +263,11 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                        return;
                }
                var uniqueValue = this._selectionToValues(selectionModel)[0];
-               var initSelection = this.rolesUsersStub[uniqueValue];
+               //var initSelection = this.rolesUsersStub[uniqueValue];
+               this.usersAppletReference.applySelection(uniqueValue, "roles");
+               var initSelection = this.usersAppletReference.getViewSelection().getNodes(); 
                this.setChooserOriginalSelection(initSelection);
                this.setChooserSelectionModified(false);
-               this.usersAppletReference.applySelection(initSelection, "username");
                this.saveButton.setEnabled(false);
        },
        
@@ -242,13 +293,38 @@ qx.Class.define("org.argeo.security.ria.RolesApplet",
                return values;
        },
        
+       _selectionDiff : function(initialSelection, modifiedSelection){
+               var deltaMinus = qx.lang.Array.clone(initialSelection);
+               var deltaPlus = qx.lang.Array.clone(modifiedSelection);
+               qx.lang.Array.exclude(deltaPlus, initialSelection);
+               qx.lang.Array.exclude(deltaMinus, modifiedSelection);
+               return {deltaPlus : deltaPlus, deltaMinus : deltaMinus};
+       },
+       
        /**
         * Load a given row : the data passed must be a simple data array.
         * @param data {Element} The text xml description. 
         */
-       load : function(){              
-               var data = [["ROLE_ADMIN"],["ROLE_USER"]];
-               this.tableModel.setData(data);
+       load : function(){
+               
+               var service = org.argeo.security.ria.SecurityAPI.getListRolesService();
+               service.addListener("completed", function(response){
+                       var data = [];
+                       response.getContent().forEach(function(el){data.push([el]);});
+                       this.tableModel.setData(data);                          
+               }, this);
+               service.send();
+               
+               var commands = this.getCommands();
+               this.toolBarPart.add(commands["new_role"].command.getToolbarButton());
+               this.toolBarPart.add(commands["delete_role"].command.getToolbarButton());
+               this.toolBarPart.add(commands["edit_role"].command.getToolbarButton());                 
+               this.toolBar.addSpacer();
+               this.toolBar.add(this.toggleButton);
+               this.toolBar.add(this.saveButton);              
+               this.toolBar.add(this.cancelButton);                            
+               this.toolBar.setShow("icon");
+               
        },
                 
        addScroll : function(){