changeset 766:31eaed998531

enabled removal and creation of messgroessen for a messmethode
author Dustin Demuth <dustin@intevation.de>
date Tue, 12 May 2015 14:24:41 +0200
parents 62721a75d31d
children 5ee59111b188
files app/controller/grid/Messmethode.js app/model/Messgroesse.js app/store/Messgroessen.js app/view/grid/Messmethoden.js app/view/grid/Nuklide.js
diffstat 5 files changed, 192 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/app/controller/grid/Messmethode.js	Fri May 08 16:12:01 2015 +0200
+++ b/app/controller/grid/Messmethode.js	Tue May 12 14:24:41 2015 +0200
@@ -11,6 +11,7 @@
  */
 Ext.define('Lada.controller.grid.Messmethode', {
     extend: 'Ext.app.Controller',
+    record: null,
 
     /**
      * Inhitialize the controller
@@ -28,6 +29,17 @@
             },
             'messmethodengrid button[action=delete]': {
                 click: this.remove
+            },
+            //Nuklidegrid
+            'nuklidegrid': {
+                edit: this.gridSaveNuklid,
+                canceledit: this.cancelEdit
+            },
+            'nuklidegrid button[action=add]': {
+                click: this.addNuklid
+            },
+            'nuklidegrid button[action=remove]': {
+                click: this.removeNuklid
             }
         });
     },
@@ -39,7 +51,6 @@
      * On failure it displays a message
      */
      gridSave: function(editor, context) {
-        console.log(context);
         context.record.save({
             success: function() {
                 context.grid.initData();
@@ -65,10 +76,23 @@
     },
 
     /**
+     * This function is called when the Nuklide-grids roweditor saves
+     * the record.
+     * It adds the nuklid to the messgroessen-array of the messmethode
+     * record.
+     * On success it refreshes the windows which contains the grid
+     * On failure it displays a message
+     */
+    gridSaveNuklid: function(editor, context) {
+        console.log(context);
+        this.syncArray(context.store);
+    },
+
+    /**
      * When the edit was canceled,
      * the empty row might have been created by the roweditor is removed
      */
-     cancelEdit: function(editor, context) {
+    cancelEdit: function(editor, context) {
         if (!context.record.get('id') ||
             context.record.get('id') === '') {
             editor.getCmp().store.remove(context.record);
@@ -82,25 +106,109 @@
      * Messmethod
      */
     selectRow: function(row, record, index) {
+        //save the record to this object. which makes it accessible
+        //for nuklideGrid releated functions.
+        this.record = record;
+        var nuklide = record.get('messgroessen');
+
         var ngrid = row.view.up('window').down('nuklidegrid');
-        var nuklide = record.get('messgroessen');
+
+        var mmtmessgroessenstore = this.buildNuklideStore(nuklide);
+        //Set Store
+        ngrid.setData(mmtmessgroessenstore);
+
+        //Enable Editing
+        ngrid.setReadOnly(false);
+    },
+
+    /**
+     * This function syncs the Messmethoden-Messgroessen Array
+     * With the Nuklide Store.
+     * It simply overwrites the Array
+     */
+    syncArray: function(store) {
+        var mg = new Array();
+        console.log('syncarray');
+        console.log(store);
+        var item;
+        for (item in store.data.items){
+            mg.push(store.data.items[item].get('id'));
+        }
+
+        // Ext.Array.contains(mg, id[i])
+        this.record.set('messgroessen', mg);
+        var me = this;
+        this.record.save({
+            success: function() {
+                console.log('Success');
+                console.log(me.record.get('messgroessen'));
+                console.log(mg);
+            },
+            failure: function(request, response) {
+                var json = response.request.scope.reader.jsonData;
+                if (json) {
+                    if (json.message){
+                        Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.save.title')
+                            +' #'+json.message,
+                            Lada.getApplication().bundle.getMsg(json.message));
+                    } else {
+                        Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.save.title'),
+                            Lada.getApplication().bundle.getMsg('err.msg.generic.body'));
+                    }
+                } else {
+                    Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.save.title'),
+                        Lada.getApplication().bundle.getMsg('err.msg.response.body'));
+                }
+            }
+        });
+
+    },
+
+    /**
+     * Return a MessgroessenStore created from nuklide array
+     */
+    buildNuklideStore: function(nuklide) {
+        // Create a fully populated Messgroessen Store
         var store = Ext.data.StoreManager.get('messgroessen');
         if (!store) {
             store = Ext.create('Lada.store.Messgroessen');
         }
-        //get selection model
-        var selectedRecords = [];
-        //iterate store and slecet all records which are in nuklide array
-        store.each(function(record){
-            //TODO if(record.get('id') in nuklide){
-                selectedRecords.push(record);
-            //TODO}
+
+        //Create an empty Messgroessen Store which will be populated with the
+        //Messgroessen defined in the Messmethoden record.
+        var mmtmessgroessenstore = Ext.create('Ext.data.Store', {
+            model: 'Lada.model.Messgroesse',
         });
-        ngrid.setData(store);
 
-        var selModel = ngrid.getSelectionModel();
-        console.log(selModel);
-        selModel.select(selectedRecords, false, false);
+        // Copy every Record from Messgroessenstore to the empty Store
+        // which was defined in the messmethode record
+        for (n in nuklide) {
+            mmtmessgroessenstore.add(store.getById(nuklide[n]));
+        }
+        return mmtmessgroessenstore;
+    },
+
+    /**
+     * This function adds a new row in the NuklidGrid
+     */
+    addNuklid: function(button) {
+        var record = Ext.create('Lada.model.Messgroesse');
+        button.up('nuklidegrid').store.insert(0, record);
+        button.up('nuklidegrid').rowEditing.startEdit(0, 0);
+    },
+
+    /**
+     * A row can be removed from the Nuklidgrid with the remove
+     * function. It asks the user for confirmation
+     * If the removal was confirmed, it reloads the parent window on success,
+     * on failure, an error message is shown.
+     */
+    removeNuklid: function(button) {
+        var grid = button.up('grid');
+        var selection = grid.getView().getSelectionModel().getSelection()[0];
+        grid.getStore().remove(selection);
+        var store = grid.getStore();
+        this.syncArray(store);
     },
 
     /**
--- a/app/model/Messgroesse.js	Fri May 08 16:12:01 2015 +0200
+++ b/app/model/Messgroesse.js	Tue May 12 14:24:41 2015 +0200
@@ -40,14 +40,7 @@
         name: 'kennungBvl'
     }],
 
-    idProperty: 'id',
-
-    proxy: {
-        type: 'rest',
-        url: 'lada-server/messgroesse',
-        reader: {
-            type: 'json',
-            root: 'data'
-        }
-    }
+    idProperty: 'id'
+    // other models contain the proxy-configuration at this point.
+    // we don't. You can find the Proxy in in the Store: Lada.store.Messgroessen
 });
--- a/app/store/Messgroessen.js	Fri May 08 16:12:01 2015 +0200
+++ b/app/store/Messgroessen.js	Tue May 12 14:24:41 2015 +0200
@@ -22,5 +22,15 @@
             return '';
         }
     }],
-    autoLoad: true
+    autoLoad: true,
+
+    proxy: {
+        type: 'rest',
+        url: 'lada-server/messgroesse',
+        reader: {
+            type: 'json',
+            root: 'data'
+        }
+    }
+
 });
--- a/app/view/grid/Messmethoden.js	Fri May 08 16:12:01 2015 +0200
+++ b/app/view/grid/Messmethoden.js	Tue May 12 14:24:41 2015 +0200
@@ -34,7 +34,7 @@
             clicksToMoveEditor: 1,
             autoCancel: false,
             disabled: false,
-            pluginId: 'rowedit',
+            pluginId: 'mmtrowedit',
             listeners:{
                 // Make row ineditable when readonly is set to true
                 // Normally this would belong into a controller an not the view.
--- a/app/view/grid/Nuklide.js	Fri May 08 16:12:01 2015 +0200
+++ b/app/view/grid/Nuklide.js	Tue May 12 14:24:41 2015 +0200
@@ -13,11 +13,6 @@
     extend: 'Ext.grid.Panel',
     alias: 'widget.nuklidegrid',
 
-    selType: 'checkboxmodel',
-    selModel: {
-        checkOnly: false,
-        injectCheckbox: 0
-    },
     requires: [
         'Lada.view.widget.Messgroesse'
     ],
@@ -39,16 +34,16 @@
             xtype: 'toolbar',
             dock: 'bottom',
             items: ['->', {
-                text: i18n.getMsg('save'),
-                qtip: i18n.getMsg('save.qtip'),
-                icon: 'resources/img/dialog-ok-apply.png',
-                action: 'save',
+                text: i18n.getMsg('add'),
+                qtip: i18n.getMsg('add.qtip'),
+                icon: 'resources/img/list-add.png',
+                action: 'add',
                 disabled: true
             }, {
-                text: i18n.getMsg('discard'),
-                qtip: i18n.getMsg('discard.qtip'),
-                icon: 'resources/img/dialog-cancel.png',
-                action: 'discard',
+                text: i18n.getMsg('delete'),
+                qtip: i18n.getMsg('delete.qtip'),
+                icon: 'resources/img/list-remove.png',
+                action: 'remove',
                 disabled: true
             }]
         }];
@@ -65,14 +60,56 @@
                     store = Ext.create('Lada.store.Messgroessen');
                 }
                 return store.findRecord('id', value, 0, false, false, true).get('messgroesse');
+            },
+            editor: {
+                xtype: 'combobox',
+                store: Ext.data.StoreManager.get('messgroessen'),
+                valueField: 'id',
+                allowBlank: false,
+                editable: true,
+                forceSelection: true,
+                autoSelect: true,
+                //multiSelect: true, // TODO
+                queryMode: 'local',
+                minChars: 0,
+                typeAhead: false,
+                triggerAction: 'all',
+                tpl: Ext.create("Ext.XTemplate",
+                    '<tpl for="."><div class="x-combo-list-item  x-boundlist-item" >' +
+                    '{messgroesse}</div></tpl>'),
+                displayTpl: Ext.create('Ext.XTemplate',
+                    '<tpl for=".">{messgroesse}</tpl>'),
             }
         }];
+
+        this.rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
+            clicksToMoveEditor: 1,
+            autoCancel: false,
+            disabled: false,
+            pluginId: 'nuklidrowedit',
+            listeners:{
+                // Make row ineditable when readonly is set to true
+                // Normally this would belong into a controller an not the view.
+                // But the RowEditPlugin is not handled there.
+                beforeedit: function(e, o) {
+                    var readonlywin = o.grid.up('window').record.get('readonly');
+                    var readonlygrid = o.record.get('readonly');
+                    if (readonlywin == true || readonlygrid == true || this.disabled)  {
+                        return false;
+                    }
+                    return true;
+                }
+            }
+        });
+
+        this.plugins = [this.rowEditing];
+
         this.initData();
         this.callParent(arguments);
     },
     initData: function() {
         if (this.store) {
-            this.store.removeAll();
+            this.store.reload();
         }
     },
     setData: function(store) {
@@ -86,15 +123,15 @@
             if (this.getPlugin('rowedit')){
                 this.getPlugin('rowedit').disable();
             }
-            this.down('button[action=discard]').disable();
-            this.down('button[action=save]').disable();
+            this.down('button[action=add]').disable();
+            this.down('button[action=remove]').disable();
         }else{
             //Writable
             if (this.getPlugin('rowedit')){
                 this.getPlugin('rowedit').enable();
             }
-            this.down('button[action=discard]').enable();
-            this.down('button[action=save]').enable();
+            this.down('button[action=add]').enable();
+            this.down('button[action=remove]').enable();
          }
     }
 });

http://lada.wald.intevation.org