changeset 638:d21048cbdbb3

Added controllers for map and location form and handle new locations.
author Raimund Renkert <raimund.renkert@intevation.de>
date Tue, 17 Mar 2015 14:33:13 +0100
parents 8acb3123b46c
children fdaabab6f4cc
files app.js app/controller/Map.js app/controller/form/Location.js app/view/panel/Map.js
diffstat 4 files changed, 176 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/app.js	Tue Mar 17 10:21:29 2015 +0100
+++ b/app.js	Tue Mar 17 14:33:13 2015 +0100
@@ -112,6 +112,8 @@
         'Lada.controller.grid.MKommentar',
         'Lada.controller.grid.Messung',
         'Lada.controller.grid.Messwert',
-        'Lada.controller.grid.Status'
+        'Lada.controller.grid.Status',
+        'Lada.controller.Map',
+        'Lada.controller.form.Location'
     ]
 });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/controller/Map.js	Tue Mar 17 14:33:13 2015 +0100
@@ -0,0 +1,35 @@
+/* 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.
+ */
+
+/**
+ */
+Ext.define('Lada.controller.Map', {
+    extend: 'Ext.app.Controller',
+
+    requires: [
+    ],
+
+    init: function() {
+        this.control({
+            'maptoolbar button[action=add]': {
+                click: this.addLocation
+            }
+        });
+        this.callParent(arguments);
+    },
+
+    addLocation: function(button) {
+        var mapPanel = button.up('map');
+        var details = button.up('window').down('locationform');
+        var newLocation = Ext.create('Lada.model.Location');
+        details.setRecord(newLocation);
+        details.setReadOnly(false);
+
+        mapPanel.activateDraw(newLocation);
+    }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/controller/form/Location.js	Tue Mar 17 14:33:13 2015 +0100
@@ -0,0 +1,106 @@
+/* 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.
+ */
+
+Ext.define('Lada.controller.form.Location', {
+    extend: 'Ext.app.Controller',
+
+    init: function() {
+        this.control({
+            'locationform button[action=save]': {
+                click: this.save
+            },
+            'locationform button[action=discard]': {
+                click: this.discard
+            },
+            'locationform': {
+                dirtychange: this.dirtyForm
+            },
+            'locationform numberfield[name=latitude]': {
+                change: this.updateFeatureLatitude
+            },
+            'locationform numberfield[name=longitude]': {
+                change: this.updateFeatureLongitude,
+            }
+        });
+    },
+
+    save: function(button) {
+        var formPanel = button.up('form');
+        var data = formPanel.getForm().getFieldValues(true);
+        for (var key in data) {
+            formPanel.getForm().getRecord().set(key, data[key]);
+        }
+        formPanel.getForm().getRecord().save({
+            success: function(record, response) {
+                var json = Ext.decode(response.response.responseText);
+                if (json) {
+                    button.setDisabled(true);
+                    button.up('toolbar').down('button[action=discard]')
+                        .setDisabled(true);
+                    formPanel.clearMessages();
+                    formPanel.setRecord(record);
+                    formPanel.setMessages(json.errors, json.warnings);
+                    button.up('window').down('map').locationRecord = null;
+                    var orte = button.up('window').down('ortform combobox');
+                    orte.store.reload({
+                        callback: function() {
+                            orte.setValue(record.data.id);
+                        }
+                    });
+                }
+            },
+            failure: function(record, response) {
+                button.setDisabled(true);
+                button.up('toolbar').down('button[action=discard]')
+                    .setDisabled(true);
+                formPanel.getForm().loadRecord(formPanel.getForm().getRecord());
+                var json = response.request.scope.reader.jsonData;
+                if (json) {
+                    formPanel.setMessages(json.errors, json.warnings);
+                }
+            }
+        });
+    },
+
+    discard: function(button) {
+        var formPanel = button.up('form');
+        formPanel.getForm().loadRecord(formPanel.getForm().getRecord());
+        button.up('window').down('map').locationRecord = null;
+    },
+
+    dirtyForm: function(form, dirty) {
+        if (dirty) {
+            form.owner.down('button[action=save]').setDisabled(false);
+            form.owner.down('button[action=discard]').setDisabled(false);
+        }
+        else {
+            form.owner.down('button[action=save]').setDisabled(true);
+            form.owner.down('button[action=discard]').setDisabled(true);
+        }
+    },
+
+    updateFeatureLatitude: function(field, nValue) {
+        var layer = field.up('window').down('map').selectControl.layer;
+        var newLocation = field.up('window').down('map').locationRecord;
+        if (layer && layer.selectedFeatures[0] && newLocation) {
+            var feature = layer.getFeatureById(layer.selectedFeatures[0].id);
+            feature.move(new OpenLayers.LonLat(feature.geometry.x, nValue));
+            layer.refresh();
+        }
+    },
+
+    updateFeatureLongitude: function(field, nValue) {
+        var layer = field.up('window').down('map').selectControl.layer;
+        var newLocation = field.up('window').down('map').locationRecord;
+        if (layer && layer.selectedFeatures[0] && newLocation) {
+            var feature = layer.getFeatureById(layer.selectedFeatures[0].id);
+            feature.move(new OpenLayers.LonLat(nValue, feature.geometry.y));
+            layer.refresh();
+        }
+    }
+});
--- a/app/view/panel/Map.js	Tue Mar 17 10:21:29 2015 +0100
+++ b/app/view/panel/Map.js	Tue Mar 17 14:33:13 2015 +0100
@@ -10,6 +10,7 @@
     alias: 'widget.map',
 
     record: null,
+    locationRecord: null,
 
     /**
      * @cfg
@@ -103,9 +104,17 @@
     },
 
     selectedFeature: function(feature) {
-        var record = Ext.data.StoreManager.get('locations').getById(feature.attributes.id);
-        this.up('window').down('locationform').setRecord(record);
-        this.up('window').down('ortform').down('combobox').setValue(record.id);
+        if (feature.attributes.id &&
+            feature.attributes.id !== '') {
+            var record = Ext.data.StoreManager.get('locations').getById(feature.attributes.id);
+            this.up('window').down('locationform').setRecord(record);
+            this.up('window').down('locationform').setReadOnly(true);
+            this.up('window').down('ortform').down('combobox').setValue(record.id);
+        }
+        else {
+            this.up('window').down('locationform').setRecord(this.locationRecord);
+            this.up('window').down('locationform').setReadOnly(false);
+        }
     },
 
     selectFeature: function(id) {
@@ -117,6 +126,26 @@
         this.selectControl.select(feature[0]);
     },
 
+    activateDraw: function(record) {
+        this.locationRecord = record;
+        if (!this.drawPoint) {
+            this.drawPoint = new OpenLayers.Control.DrawFeature(this.featureLayer,
+                OpenLayers.Handler.Point);
+            this.map.addControl(this.drawPoint);
+        }
+        this.drawPoint.activate();
+        this.drawPoint.events.register('featureadded', this, this.featureAdded);
+    },
+
+    featureAdded: function(features) {
+        this.locationRecord.set('latitude', features.feature.geometry.y);
+        this.locationRecord.set('longitude', features.feature.geometry.x);
+        this.drawPoint.deactivate();
+        this.selectControl.unselectAll();
+        this.selectControl.select(features.feature);
+        console.log(arguments);
+    },
+
     /**
      * @private
      * Override to display and update the map view in the panel.

http://lada.wald.intevation.org