]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/SpecEditor.js
git-svn-id: https://svn.argeo.org/slc/trunk@2380 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-lib / slc / class / org / argeo / slc / ria / execution / SpecEditor.js
index f302c3da54735ca8fd1c9ee8e948587acb24a5ef..6d8683989e76c9b4ecba346b5ce748c773d5959f 100644 (file)
@@ -7,44 +7,95 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
 {\r
        extend : qx.ui.window.Window,\r
   \r
+       properties : {\r
+               /**\r
+                * The Spec to edit\r
+                */\r
+               batchEntrySpec : {\r
+                       check : "org.argeo.slc.ria.execution.BatchEntrySpec"\r
+               }\r
+       },\r
+       \r
        events : {\r
                /**\r
-                * Triggered when the user clicks the "ok" button. \r
+                * Triggered when the user clicks the "save" button. \r
+                */\r
+               "save" : "qx.event.type.Event",\r
+               /**\r
+                * Triggered when any data is modified\r
                 */\r
-               "ok" : "qx.event.type.Event"\r
+               "modified" : "qx.event.type.Event"\r
+\r
        },\r
        /**\r
-        * \r
-        * @param caption {String} Title of the window\r
-        * @param icon {String} Icon of the window\r
-        * @param text {String} Default content of the window.\r
+        * Opens an editor with the given values. \r
+        * @param batchEntrySpec {org.argeo.slc.ria.execution.BatchEntrySpec} The initial spec to edit\r
         */\r
-       construct : function(executionFlow){\r
-               this.base(arguments, "Spec Editor");\r
+       construct : function(batchEntrySpec){\r
+               var editorLabel = "Edit Specs for "+batchEntrySpec.getLabel();\r
+               this.base(arguments, editorLabel);\r
                this.set({\r
+                       batchEntrySpec : batchEntrySpec,\r
                        showMaximize : false,\r
                        showMinimize : false,\r
-                       width: parseInt(qx.bom.Viewport.getWidth()*80/100),\r
-                       height: parseInt(qx.bom.Viewport.getHeight()*80/100)\r
+                       width: Math.min(parseInt(qx.bom.Viewport.getWidth()*90/100), 400),\r
+                       height: parseInt(qx.bom.Viewport.getHeight()*60/100)\r
                });\r
                this.setLayout(new qx.ui.layout.Dock());\r
                this.setModal(true);\r
                this.center();\r
-               if(executionFlow){\r
-                       this.addContent(new qx.ui.basic.Label("Editing specs for flow : "+executionFlow.getName()));\r
-               }else{\r
-                       this.addCloseButton();\r
-               }\r
+               this._initFormObject(this.getBatchEntrySpec().getLabel());\r
+               this._addFormHeader(this.formObject, editorLabel);\r
+               this.createFormFromSpec();\r
+               this.addContent(this.formObject.pane);\r
+               this.addOkCancel();\r
+               this.addListener("save", function(e){\r
+                       this.saveFormToSpec();\r
+               }, this);\r
        },\r
        \r
        members : {\r
+               /**\r
+                * Builds the form from the BatchEntrySpec\r
+                */\r
+               createFormFromSpec : function(){\r
+                       var values = this.getBatchEntrySpec().getValues();\r
+                       for(var key in values){\r
+                               var valueObj = values[key];\r
+                               var label = key;\r
+                               var hidden = valueObj.getHidden();\r
+                               var disabled = valueObj.getFrozen();\r
+                               var value = valueObj.getValue();\r
+                               var type = valueObj.getSpecType();\r
+                               var subType = valueObj.getSpecSubType();\r
+                               if(type == "primitive" && !hidden){\r
+                                       this._addFormInputText(this.formObject, key, key, value, disabled, subType);\r
+                               }\r
+                       }\r
+               },\r
+               /**\r
+                * Gather data from the form\r
+                */\r
+               saveFormToSpec : function(){\r
+                       var values = this.getBatchEntrySpec().getValues();\r
+                       for(var key in values){\r
+                               var valueObj = values[key];\r
+                               var hidden = valueObj.getHidden();\r
+                               var disabled = valueObj.getFrozen();\r
+                               if(valueObj.getSpecType() == "primitive"){\r
+                                       if(!hidden && !disabled){\r
+                                               valueObj.setValue(this.formObject.fields[key].getValue());\r
+                                       }\r
+                               }\r
+                       }                       \r
+               },\r
+               \r
                /**\r
                 * Display a component (panel) in the center of the popup\r
                 * @param panel {qx.ui.core.Widget} A gui component (will be set at width 100%).\r
                 */\r
                addContent: function(panel){\r
-                       this.add(panel, {edge:'center', width:'100%'});\r
-                       this.addCloseButton();\r
+                       this.add(new qx.ui.container.Scroll(panel), {edge:'center', width:'100%'});\r
                },\r
                /**\r
                 * Automatically attach to the application root, then show.\r
@@ -53,6 +104,107 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
                        org.argeo.ria.components.ViewsManager.getInstance().getApplicationRoot().add(this);                     \r
                        this.show();\r
                },\r
+               /**\r
+                * Init a form part : creates a pane, a set of fields, etc.\r
+                * @param label {String} A label\r
+                * @return {Map} The form part.\r
+                */\r
+               _initFormObject : function(label){\r
+                       this.formObject = {};\r
+                       this.formObject.hiddenFields = {};\r
+                       this.formObject.freeFields = [];\r
+                       this.formObject.fields = {};\r
+                       this.formObject.label = label;\r
+                       this.formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));\r
+                       return this.formObject;\r
+               },\r
+                               \r
+               /**\r
+                * Creates a simple label/input form entry.\r
+                * @param formObject {Map} The form part\r
+                * @param fieldName {String} Name\r
+                * @param fieldLabel {String} Label of the field\r
+                * @param defaultValue {String} The default value\r
+                * @param choiceValues {Map} An map of values\r
+                * @param disabled {Boolean} The field is not writable\r
+                * @param subType {String} The type expected (string, integer, etc).\r
+                */\r
+               _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, disabled, subType, choiceValues){\r
+                       var labelElement;\r
+                       if(choiceValues){\r
+                               var fieldElement = new qx.ui.form.SelectBox();\r
+                               for(var key in choiceValues){\r
+                                       fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));\r
+                               }\r
+                               fieldElement.addListener("changeSelected", function(e){this.fireEvent("modified")}, this);\r
+                       }else{\r
+                               var fieldElement = new qx.ui.form.TextField();\r
+                               if(subType == "integer"){\r
+                                       fieldElement.addListener("changeValue", function(e){\r
+                                               var isNum = !isNaN(e.getData() * 1);\r
+                                               if(!isNum){\r
+                                                       alert("Warning, this field only accepts Integers!");\r
+                                               }\r
+                                       }, this);                                       \r
+                               }\r
+                               fieldElement.addListener("input", function(e){this.fireEvent("modified")}, this);                       \r
+                       }\r
+                       if(defaultValue){\r
+                               fieldElement.setValue(defaultValue);\r
+                       }\r
+                       if(fieldName && fieldLabel){\r
+                               labelElement = new qx.ui.basic.Label(fieldLabel);\r
+                               formObject.fields[fieldName] = fieldElement;\r
+                       }else{\r
+                               labelElement = new qx.ui.form.TextField();\r
+                               formObject.freeFields.push({\r
+                                       labelEl:labelElement, \r
+                                       valueEl:fieldElement\r
+                               });\r
+                       }\r
+                       if(disabled) fieldElement.setEnabled(false);\r
+                       this._addFormEntry(formObject, labelElement, fieldElement);\r
+               },\r
+               \r
+               /**\r
+                * Add an header\r
+                * @param formObject {Map} The form part\r
+                * @param content {Mixed} Content to add.\r
+                * @param additionnalButton {Mixed} Any widget to add on the east.\r
+                */\r
+               _addFormHeader : function(formObject, content, additionnalButton){\r
+                       var header = new qx.ui.basic.Label('<big><b>'+content+'</b></big>');\r
+                       header.setRich(true);           \r
+                       if(!additionnalButton){\r
+                               header.setPaddingBottom(10);\r
+                               formObject.pane.add(header);\r
+                       }else{\r
+                               var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());\r
+                               pane.setPaddingBottom(10);\r
+                               pane.setPaddingRight(10);\r
+                               pane.add(header, {edge:'center'});\r
+                               pane.add(additionnalButton, {edge:'east'});\r
+                               formObject.pane.add(pane);\r
+                       }\r
+               },\r
+               \r
+               /**\r
+                * Adds a label/input like entry in the form.\r
+                * @param formObject {Map} The form part\r
+                * @param labelElement {Object} Either a label or an input \r
+                * @param fieldElement {Object} Any form input.\r
+                */\r
+               _addFormEntry : function(formObject, labelElement, fieldElement){\r
+                       var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));\r
+                       labelElement.setWidth(150);\r
+                       labelElement.setTextAlign("right");             \r
+                       entryPane.add(labelElement);\r
+                       entryPane.add(new qx.ui.basic.Label(':'));\r
+                       fieldElement.setWidth(150);\r
+                       entryPane.add(fieldElement);\r
+                       formObject.pane.add(entryPane);\r
+               },\r
+                       \r
                /**\r
                 * Adds a close button bottom-center aligned to the popup\r
                 */\r
@@ -69,15 +221,27 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
                        var buttonPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5, 'right'));\r
                        buttonPane.setAlignX("center");\r
                        this.add(buttonPane, {edge:"south"});\r
-                       this.okButton = new qx.ui.form.Button("Ok");\r
+                       this.okButton = new qx.ui.form.Button("Save");\r
+                       this.okButton.setEnabled(false);\r
+                       this.addListener("modified", function(e){\r
+                               this.okButton.setEnabled(true);\r
+                       }, this);\r
                        this.okButton.addListener("execute", function(e){\r
-                               this.fireEvent("ok");\r
-                               this._closeAndDestroy();\r
+                               this.fireEvent("save");\r
+                               this.okButton.setEnabled(false);\r
                        }, this);\r
-                       this.cancelButton = new qx.ui.form.Button("Cancel");\r
+                       this.cancelButton = new qx.ui.form.Button("Close");\r
                        this.cancelButton.addListener("execute", this._closeAndDestroy, this);\r
+\r
+                       this.saveCloseButton = new qx.ui.form.Button("Save & Close");\r
+                       this.saveCloseButton.addListener("execute", function(e){\r
+                               this.fireEvent("save");\r
+                               this._closeAndDestroy();\r
+                       }, this);\r
+                       \r
                        buttonPane.add(this.okButton);\r
                        buttonPane.add(this.cancelButton);\r
+                       buttonPane.add(this.saveCloseButton);\r
                },\r
                /**\r
                 * Close this modal window and destroy it.\r