[Lada-commits] [PATCH 3 of 4] added buttons for datensatzerzeuger, pobenehmer, added controllers

Wald Commits scm-commit at wald.intevation.org
Thu Dec 10 09:29:17 CET 2015


# HG changeset patch
# User Dustin Demuth <dustin at intevation.de>
# Date 1449732614 -3600
# Branch stammdatengrids
# Node ID b21421ba69179415ff6472c5faa260a995a95159
# Parent  0a5fe163f1c8b7351124f4db7826389b34a14147
added buttons for datensatzerzeuger, pobenehmer, added controllers

diff -r 0a5fe163f1c8 -r b21421ba6917 app.js
--- a/app.js	Tue Dec 08 15:59:00 2015 +0100
+++ b/app.js	Thu Dec 10 08:30:14 2015 +0100
@@ -204,6 +204,8 @@
         'Lada.controller.ModeSwitcher',
         'Lada.controller.grid.ProbeList',
         'Lada.controller.grid.MessprogrammeList',
+        'Lada.controller.grid.Datensatzerzeuger',
+        'Lada.controller.grid.Probenehmer',
         'Lada.controller.form.Probe',
         'Lada.controller.form.Messung',
         'Lada.controller.form.Ort',
diff -r 0a5fe163f1c8 -r b21421ba6917 app/controller/grid/Datensatzerzeuger.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/controller/grid/Datensatzerzeuger.js	Thu Dec 10 08:30:14 2015 +0100
@@ -0,0 +1,160 @@
+/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
+ * Software engineering by Intevation GmbH
+ *
+ * This file is Free Software under the GNU GPL (v>=3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out
+ * the documentation coming with IMIS-Labordaten-Application for details.
+ */
+
+/**
+ * This is a controller for a grid of Datensatzerzeuger Stammdaten
+ */
+Ext.define('Lada.controller.grid.Datensatzerzeuger', {
+    extend: 'Ext.app.Controller',
+
+    /**
+     * Inhitialize the controller
+     * It has 3 listeners
+     */
+    init: function() {
+        this.control({
+            'datensatzerzeugergrid': {
+                edit: this.gridSave,
+                canceledit: this.cancelEdit,
+                select: this.activateButtons,
+                deselect: this.deactivateButtons
+            },
+            'datensatzerzeugergrid button[action=add]': {
+                click: this.add
+            },
+            'datensatzerzeugergrid button[action=delete]': {
+                click: this.remove
+            }
+        });
+    },
+
+    /**
+     * This function is called when the grids roweditor saves
+     * the record.
+     * On success it refreshes the windows which contains the grid
+     * On failure it displays a message
+     */
+    gridSave: function(editor, context) {
+        context.record.set('datum', new Date());
+        context.record.save({
+            success: function(record, response) {
+                //Do Nothing
+            },
+            failure: function(record, 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'));
+                   }
+              }
+            }
+        });
+    },
+
+    /**
+     * When the edit was canceled,
+     * the empty row might have been created by the roweditor is removed
+     */
+    cancelEdit: function(editor, context) {
+        if (!context.record.get('id') ||
+            context.record.get('id') === '') {
+            editor.getCmp().store.remove(context.record);
+        }
+        context.grid.getSelectionModel().deselect(context.record);
+    },
+
+    /**
+     * This function adds a new row to add a Datensatzerzeuger
+     */
+    add: function(button) {
+        var record = Ext.create('Lada.model.DatensatzErzeuger');
+        button.up('datensatzerzeugergrid').store.insert(0, record);
+        button.up('datensatzerzeugergrid').rowEditing.startEdit(0, 1);
+    },
+
+    /**
+     * A record can be removed from the grid 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.
+     */
+    remove: function(button) {
+        var grid = button.up('grid');
+        var selection = grid.getView().getSelectionModel().getSelection()[0];
+        //TODO: i18n
+        Ext.MessageBox.confirm('Löschen', 'Sind Sie sicher?', function(btn) {
+            if (btn === 'yes') {
+                selection.destroy({
+                    success: function() {
+                        //DO NOTHING
+                    },
+                    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.delete.title')
+                                    +' #'+json.message,
+                                    Lada.getApplication().bundle.getMsg(json.message));
+                            } else {
+                                Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.delete.title'),
+                                    Lada.getApplication().bundle.getMsg('err.msg.generic.body'));
+                            }
+                        } else {
+                            Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.delete.title'),
+                                Lada.getApplication().bundle.getMsg('err.msg.response.body'));
+                        }
+                    }
+                });
+            }
+        });
+        grid.down('button[action=delete]').disable();
+    },
+    /**
+     * Toggles the buttons in the toolbar
+     **/
+    activateButtons: function(rowModel, record) {
+        var grid = rowModel.view.up('grid');
+        this.buttonToggle(true, grid);
+    },
+
+    /**
+     * Toggles the buttons in the toolbar
+     **/
+    deactivateButtons: function(rowModel, record) {
+        var grid = rowModel.view.up('grid');
+        // Only disable buttons when nothing is selected
+        if (rowModel.selected.items == 0) {
+            this.buttonToggle(false, grid);
+        }
+    },
+
+    /**
+     * Enables/Disables a set of buttons
+     **/
+    buttonToggle: function(enabled, grid) {
+        if (!enabled) {
+            grid.down('button[action=delete]').disable();
+        }
+        else {
+            if (!grid.getPlugin('rowedit').editing) {
+            //only enable buttons, when grid is not beeing edited
+                grid.down('button[action=delete]').enable();
+            }
+            //else turn them off again!
+            else {
+                this.buttonToggle(false, grid);
+            }
+        }
+    }
+});
+
diff -r 0a5fe163f1c8 -r b21421ba6917 app/controller/grid/MessprogrammKategorie.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/controller/grid/MessprogrammKategorie.js	Thu Dec 10 08:30:14 2015 +0100
@@ -0,0 +1,160 @@
+/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
+ * Software engineering by Intevation GmbH
+ *
+ * This file is Free Software under the GNU GPL (v>=3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out
+ * the documentation coming with IMIS-Labordaten-Application for details.
+ */
+
+/**
+ * This is a controller for a grid of MessprogrammKategorie Stammdaten
+ */
+Ext.define('Lada.controller.grid.MessprogrammKategorie', {
+    extend: 'Ext.app.Controller',
+
+    /**
+     * Inhitialize the controller
+     * It has 3 listeners
+     */
+    init: function() {
+        this.control({
+            'messprogrammkategoriegrid': {
+                edit: this.gridSave,
+                canceledit: this.cancelEdit,
+                select: this.activateButtons,
+                deselect: this.deactivateButtons
+            },
+            'messprogrammkategoriegrid button[action=add]': {
+                click: this.add
+            },
+            'messprogrammkategoriegrid button[action=delete]': {
+                click: this.remove
+            }
+        });
+    },
+
+    /**
+     * This function is called when the grids roweditor saves
+     * the record.
+     * On success it refreshes the windows which contains the grid
+     * On failure it displays a message
+     */
+    gridSave: function(editor, context) {
+        context.record.save({
+            success: function(record, response) {
+                //Do Nothing
+            },
+            failure: function(record, 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'));
+                   }
+              }
+            }
+        });
+    },
+
+    /**
+     * When the edit was canceled,
+     * the empty row might have been created by the roweditor is removed
+     */
+    cancelEdit: function(editor, context) {
+        if (!context.record.get('id') ||
+            context.record.get('id') === '') {
+            editor.getCmp().store.remove(context.record);
+        }
+        context.grid.getSelectionModel().deselect(context.record);
+    },
+
+    /**
+     * This function adds a new row to add a probenehmer
+     */
+    add: function(button) {
+        var record = Ext.create('Lada.model.MessprogrammKategorie');
+        button.up('messprogrammkategoriegrid').store.insert(0, record);
+        button.up('probenehmergrid').rowEditing.startEdit(0, 1);
+    },
+
+    /**
+     * A record can be removed from the grid 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.
+     */
+    remove: function(button) {
+        var grid = button.up('grid');
+        var selection = grid.getView().getSelectionModel().getSelection()[0];
+        //TODO: i18n
+        Ext.MessageBox.confirm('Löschen', 'Sind Sie sicher?', function(btn) {
+            if (btn === 'yes') {
+                selection.destroy({
+                    success: function() {
+                        //DO NOTHING
+                    },
+                    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.delete.title')
+                                    +' #'+json.message,
+                                    Lada.getApplication().bundle.getMsg(json.message));
+                            } else {
+                                Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.delete.title'),
+                                    Lada.getApplication().bundle.getMsg('err.msg.generic.body'));
+                            }
+                        } else {
+                            Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.delete.title'),
+                                Lada.getApplication().bundle.getMsg('err.msg.response.body'));
+                        }
+                    }
+                });
+            }
+        });
+        grid.down('button[action=delete]').disable();
+    },
+    /**
+     * Toggles the buttons in the toolbar
+     **/
+    activateButtons: function(rowModel, record) {
+        var grid = rowModel.view.up('grid');
+        this.buttonToggle(true, grid);
+    },
+
+    /**
+     * Toggles the buttons in the toolbar
+     **/
+    deactivateButtons: function(rowModel, record) {
+        var grid = rowModel.view.up('grid');
+        // Only disable buttons when nothing is selected
+        if (rowModel.selected.items == 0) {
+            this.buttonToggle(false, grid);
+        }
+    },
+
+    /**
+     * Enables/Disables a set of buttons
+     **/
+    buttonToggle: function(enabled, grid) {
+        if (!enabled) {
+            grid.down('button[action=delete]').disable();
+        }
+        else {
+            if (!grid.getPlugin('rowedit').editing) {
+            //only enable buttons, when grid is not beeing edited
+                grid.down('button[action=delete]').enable();
+            }
+            //else turn them off again!
+            else {
+                this.buttonToggle(false, grid);
+            }
+        }
+    },
+});
+
+
diff -r 0a5fe163f1c8 -r b21421ba6917 app/controller/grid/Probenehmer.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/controller/grid/Probenehmer.js	Thu Dec 10 08:30:14 2015 +0100
@@ -0,0 +1,159 @@
+/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
+ * Software engineering by Intevation GmbH
+ *
+ * This file is Free Software under the GNU GPL (v>=3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out
+ * the documentation coming with IMIS-Labordaten-Application for details.
+ */
+
+/**
+ * This is a controller for a grid of Probenehmer Stammdaten
+ */
+Ext.define('Lada.controller.grid.Probenehmer', {
+    extend: 'Ext.app.Controller',
+
+    /**
+     * Inhitialize the controller
+     * It has 3 listeners
+     */
+    init: function() {
+        this.control({
+            'probenehmergrid': {
+                edit: this.gridSave,
+                canceledit: this.cancelEdit,
+                select: this.activateButtons,
+                deselect: this.deactivateButtons
+            },
+            'probenehmergrid button[action=add]': {
+                click: this.add
+            },
+            'probenehmergrid button[action=delete]': {
+                click: this.remove
+            }
+        });
+    },
+
+    /**
+     * This function is called when the grids roweditor saves
+     * the record.
+     * On success it refreshes the windows which contains the grid
+     * On failure it displays a message
+     */
+    gridSave: function(editor, context) {
+        context.record.save({
+            success: function(record, response) {
+                //Do Nothing
+            },
+            failure: function(record, 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'));
+                   }
+              }
+            }
+        });
+    },
+
+    /**
+     * When the edit was canceled,
+     * the empty row might have been created by the roweditor is removed
+     */
+    cancelEdit: function(editor, context) {
+        if (!context.record.get('id') ||
+            context.record.get('id') === '') {
+            editor.getCmp().store.remove(context.record);
+        }
+        context.grid.getSelectionModel().deselect(context.record);
+    },
+
+    /**
+     * This function adds a new row to add a probenehmer
+     */
+    add: function(button) {
+        var record = Ext.create('Lada.model.Probenehmer');
+        button.up('probenehmergrid').store.insert(0, record);
+        button.up('probenehmergrid').rowEditing.startEdit(0, 1);
+    },
+
+    /**
+     * A record can be removed from the grid 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.
+     */
+    remove: function(button) {
+        var grid = button.up('grid');
+        var selection = grid.getView().getSelectionModel().getSelection()[0];
+        //TODO: i18n
+        Ext.MessageBox.confirm('Löschen', 'Sind Sie sicher?', function(btn) {
+            if (btn === 'yes') {
+                selection.destroy({
+                    success: function() {
+                        //DO NOTHING
+                    },
+                    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.delete.title')
+                                    +' #'+json.message,
+                                    Lada.getApplication().bundle.getMsg(json.message));
+                            } else {
+                                Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.delete.title'),
+                                    Lada.getApplication().bundle.getMsg('err.msg.generic.body'));
+                            }
+                        } else {
+                            Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.delete.title'),
+                                Lada.getApplication().bundle.getMsg('err.msg.response.body'));
+                        }
+                    }
+                });
+            }
+        });
+        grid.down('button[action=delete]').disable();
+    },
+    /**
+     * Toggles the buttons in the toolbar
+     **/
+    activateButtons: function(rowModel, record) {
+        var grid = rowModel.view.up('grid');
+        this.buttonToggle(true, grid);
+    },
+
+    /**
+     * Toggles the buttons in the toolbar
+     **/
+    deactivateButtons: function(rowModel, record) {
+        var grid = rowModel.view.up('grid');
+        // Only disable buttons when nothing is selected
+        if (rowModel.selected.items == 0) {
+            this.buttonToggle(false, grid);
+        }
+    },
+
+    /**
+     * Enables/Disables a set of buttons
+     **/
+    buttonToggle: function(enabled, grid) {
+        if (!enabled) {
+            grid.down('button[action=delete]').disable();
+        }
+        else {
+            if (!grid.getPlugin('rowedit').editing) {
+            //only enable buttons, when grid is not beeing edited
+                grid.down('button[action=delete]').enable();
+            }
+            //else turn them off again!
+            else {
+                this.buttonToggle(false, grid);
+            }
+        }
+    },
+});
+
diff -r 0a5fe163f1c8 -r b21421ba6917 app/model/DatensatzErzeuger.js
--- a/app/model/DatensatzErzeuger.js	Tue Dec 08 15:59:00 2015 +0100
+++ b/app/model/DatensatzErzeuger.js	Thu Dec 10 08:30:14 2015 +0100
@@ -52,8 +52,8 @@
     idProperty: 'id',
 
     proxy: {
-        type: 'rest',
-        url: 'lada-server/datensatzerzeuger',
+        type: 'memory',
+        //url: 'lada-server/datensatzerzeuger',
         reader: {
             type: 'json',
             root: 'data'
diff -r 0a5fe163f1c8 -r b21421ba6917 app/store/DatensatzErzeuger.js
--- a/app/store/DatensatzErzeuger.js	Tue Dec 08 15:59:00 2015 +0100
+++ b/app/store/DatensatzErzeuger.js	Thu Dec 10 08:30:14 2015 +0100
@@ -11,5 +11,15 @@
  */
 Ext.define('Lada.store.DatensatzErzeuger', {
     extend: 'Ext.data.Store',
-    model: 'Lada.model.DatensatzErzeuger'
+    model: 'Lada.model.DatensatzErzeuger',
+    data: {
+        data: {
+            id: 1,
+            netzbetreiberId: 'F',
+            daErzeugerId: 5,
+            mstId: '12020',
+            bezeichnung: 'ABCDÄ',
+            letzteAenderung: new Date()
+        }
+    }
 });
diff -r 0a5fe163f1c8 -r b21421ba6917 app/view/grid/DatensatzErzeuger.js
--- a/app/view/grid/DatensatzErzeuger.js	Tue Dec 08 15:59:00 2015 +0100
+++ b/app/view/grid/DatensatzErzeuger.js	Thu Dec 10 08:30:14 2015 +0100
@@ -46,6 +46,18 @@
                 xtype: 'tbtext',
                 id: 'tbtitle',
                 text: i18n.getMsg('de.gridTitle')
+            },
+            '->',
+            {
+                text: i18n.getMsg('de.button.add'),
+                icon: 'resources/img/list-add.png',
+                action: 'add',
+                disabled: true // disabled on startup, will be enabled by setStore
+            }, {
+                text: i18n.getMsg('de.button.delete'),
+                icon: 'resources/img/list-remove.png',
+                action: 'delete',
+                disabled: true // disabled on startup, will be enabled by controller if necessary
             }]
         }];
 
@@ -81,6 +93,7 @@
             header: i18n.getMsg('bezeichnung'),
             dataIndex: 'bezeichnung',
             editor: {
+                allowBlank: false,
                 xtype: 'textfield'
             }
         }, {
@@ -100,7 +113,7 @@
             },
             editor: {
                 xtype: 'combobox',
-                store: Ext.data.StoreManager.get('messstellenFiltered'),
+                store: Ext.data.StoreManager.get('messstellen'),
                 displayField: 'messStelle',
                 valueField: 'id',
                 allowBlank: false
@@ -128,14 +141,17 @@
     setStore: function(store){
         var i18n = Lada.getApplication().bundle;
 
-        this.removeDocked(Ext.getCmp('ptbar'), true);
-        this.reconfigure(store);
-        this.addDocked([{
-            xtype: 'pagingtoolbar',
-            id: 'ptbar',
-            dock: 'bottom',
-            store: store,
-            displayInfo: true
-        }]);
+        if (store) {
+            this.removeDocked(Ext.getCmp('ptbar'), true);
+            this.reconfigure(store);
+            this.down('button[action=add]').enable();
+            this.addDocked([{
+                xtype: 'pagingtoolbar',
+                id: 'ptbar',
+                dock: 'bottom',
+                store: store,
+                displayInfo: true
+            }]);
+        }
     }
 });
diff -r 0a5fe163f1c8 -r b21421ba6917 app/view/grid/Probenehmer.js
--- a/app/view/grid/Probenehmer.js	Tue Dec 08 15:59:00 2015 +0100
+++ b/app/view/grid/Probenehmer.js	Thu Dec 10 08:30:14 2015 +0100
@@ -46,6 +46,18 @@
                 xtype: 'tbtext',
                 id: 'tbtitle',
                 text: i18n.getMsg('pn.gridTitle')
+            },
+            '->',
+            {
+                text: i18n.getMsg('pn.button.add'),
+                icon: 'resources/img/list-add.png',
+                action: 'add',
+                disabled: true // disabled on startup, will be enabled by setStore
+            }, {
+                text: i18n.getMsg('pn.button.delete'),
+                icon: 'resources/img/list-remove.png',
+                action: 'delete',
+                disabled: true // disabled on startup, will be enabled by controller if necessary
             }]
         }];
         this.columns = [{
@@ -86,31 +98,36 @@
             header: i18n.getMsg('bemerkung'),
             dataIndex: 'bemerkung',
             editor: {
-                allowBlank: false
+                allowBlank: false,
+                xtype: 'textfield'
             }
         }, {
             header: i18n.getMsg('kurzBezeichnung'),
             dataIndex: 'kurzBezeichnung',
             editor: {
-                allowBlank: false
+                allowBlank: false,
+                xtype: 'textfield'
             }
         }, {
             header: i18n.getMsg('ort'),
             dataIndex: 'ort',
             editor: {
-                allowBlank: false
+                allowBlank: false,
+                xtype: 'textfield'
             }
         }, {
             header: i18n.getMsg('plz'),
             dataIndex: 'plz',
             editor: {
-                allowBlank: false
+                allowBlank: false,
+                xtype: 'numberfield'
             }
         }, {
             header: i18n.getMsg('strasse'),
             dataIndex: 'strasse',
             editor: {
-                allowBlank: false
+                allowBlank: false,
+                xtype: 'textfield'
             }
         }, {
             header: i18n.getMsg('telefon'),
@@ -153,15 +170,18 @@
     setStore: function(store){
         var i18n = Lada.getApplication().bundle;
 
-        this.removeDocked(Ext.getCmp('ptbar'), true);
-        this.reconfigure(store);
-        this.addDocked([{
-            xtype: 'pagingtoolbar',
-            id: 'ptbar',
-            dock: 'bottom',
-            store: store,
-            displayInfo: true
-        }]);
+        if (store) {
+            this.removeDocked(Ext.getCmp('ptbar'), true);
+            this.reconfigure(store);
+            this.down('button[action=add]').enable();
+            this.addDocked([{
+                xtype: 'pagingtoolbar',
+                id: 'ptbar',
+                dock: 'bottom',
+                store: store,
+                displayInfo: true
+            }]);
+        }
     }
 });
 
diff -r 0a5fe163f1c8 -r b21421ba6917 resources/i18n/Lada_de-DE.properties
--- a/resources/i18n/Lada_de-DE.properties	Tue Dec 08 15:59:00 2015 +0100
+++ b/resources/i18n/Lada_de-DE.properties	Thu Dec 10 08:30:14 2015 +0100
@@ -202,15 +202,21 @@
 ##
 de.emptyGrid:Keine DatensatzErzeuger gefunden.
 de.gridTitle:Datensatzerzeuger
+de.button.add:Datensatzerzeuger hinzufügen
+de.button.delete:Datensatzerzeuger löschen
 
 ##
 # MessprogrammKategorie Grid:
 ##
 mk.emptyGrid:Keine Messprogrammkategorie gefunden.
 mk.gridTitle:Messprogramm Kategorien
+mk.button.add:Kategorie hinzufügen
+mk.button.delete:Kategorie löschen
 
 ##
 # Probenehmer Grid:
 ##
 pn.emptyGrid:Keine Probenehmer gefunden.
 pn.gridTitle:Probenehmer
+pn.button.add:Probenehmer hinzufügen
+pn.button.delete:Probenehmer löschen


More information about the Lada-commits mailing list