From ebb43a1d910595462b384e3d1bd6375672da5b84 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 3 Jul 2016 20:03:23 +1200 Subject: Implement geofence saving --- web/app/Application.js | 2 +- web/app/store/GeofenceTypes.js | 28 ++++++++++++++++++++++++++++ web/app/store/GeozoneTypes.js | 28 ---------------------------- web/app/view/GeofenceDialog.js | 5 +++++ web/app/view/GeofenceDialogController.js | 14 ++++++++++++++ web/app/view/GeofenceMap.js | 25 +++++++++++++++++++------ web/app/view/GeofenceMapController.js | 13 ++++++++++++- web/app/view/SettingsMenu.js | 2 +- 8 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 web/app/store/GeofenceTypes.js delete mode 100644 web/app/store/GeozoneTypes.js (limited to 'web/app') diff --git a/web/app/Application.js b/web/app/Application.js index 392a9907f..ec942d21e 100644 --- a/web/app/Application.js +++ b/web/app/Application.js @@ -56,7 +56,7 @@ Ext.define('Traccar.Application', { 'AllGeofences', 'Notifications', 'AllNotifications', - 'GeozoneTypes' + 'GeofenceTypes' ], controllers: [ diff --git a/web/app/store/GeofenceTypes.js b/web/app/store/GeofenceTypes.js new file mode 100644 index 000000000..cf378341b --- /dev/null +++ b/web/app/store/GeofenceTypes.js @@ -0,0 +1,28 @@ +/* + * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Ext.define('Traccar.store.GeofenceTypes', { + extend: 'Ext.data.Store', + fields: ['key', 'name'], + + data: [{ + key: 'Polygon', + name: Strings.mapShapePolygon + }/*, { + key: 'Circle', + name: Strings.mapShapeCircle + }*/] +}); diff --git a/web/app/store/GeozoneTypes.js b/web/app/store/GeozoneTypes.js deleted file mode 100644 index a41bf1501..000000000 --- a/web/app/store/GeozoneTypes.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -Ext.define('Traccar.store.GeozoneTypes', { - extend: 'Ext.data.Store', - fields: ['key', 'name'], - - data: [{ - key: 'Polygon', - name: Strings.mapShapePolygon - }, { - key: 'Circle', - name: Strings.mapShapeCircle - }] -}); diff --git a/web/app/view/GeofenceDialog.js b/web/app/view/GeofenceDialog.js index fa3bbe87f..febef235e 100644 --- a/web/app/view/GeofenceDialog.js +++ b/web/app/view/GeofenceDialog.js @@ -34,6 +34,11 @@ Ext.define('Traccar.view.GeofenceDialog', { xtype: 'textfield', name: 'description', fieldLabel: Strings.sharedDescription + }, { + xtype: 'hiddenfield', + name: 'area', + allowBlank: false, + reference: 'areaField' }] }, diff --git a/web/app/view/GeofenceDialogController.js b/web/app/view/GeofenceDialogController.js index d8597457f..c8d518514 100644 --- a/web/app/view/GeofenceDialogController.js +++ b/web/app/view/GeofenceDialogController.js @@ -22,6 +22,20 @@ Ext.define('Traccar.view.GeofenceDialogController', { 'Traccar.view.GeofenceMap' ], + config: { + listen: { + controller: { + '*': { + saveArea: 'saveArea' + } + } + } + }, + + saveArea: function (value) { + this.lookupReference('areaField').setValue(value); + }, + onAreaClick: function (button) { Ext.create('Traccar.view.BaseWindow', { title: Strings.sharedArea, diff --git a/web/app/view/GeofenceMap.js b/web/app/view/GeofenceMap.js index 2538a8b16..e8a4dc5de 100644 --- a/web/app/view/GeofenceMap.js +++ b/web/app/view/GeofenceMap.js @@ -28,9 +28,12 @@ Ext.define('Traccar.view.GeofenceMap', { tbar: { items: [{ xtype: 'combobox', - store: 'GeozoneTypes', - valueField: 'id', - displayField: 'name' + store: 'GeofenceTypes', + valueField: 'key', + displayField: 'name', + listeners: { + select: 'onTypeSelect' + } }, { xtype: 'tbfill' }, { @@ -42,6 +45,10 @@ Ext.define('Traccar.view.GeofenceMap', { }] }, + getFeatures: function () { + return this.features; + }, + initMap: function () { var map, featureOverlay; this.callParent(); @@ -79,15 +86,21 @@ Ext.define('Traccar.view.GeofenceMap', { })); }, - addInteraction: function () { + addInteraction: function (type) { this.draw = new ol.interaction.Draw({ features: this.features, - type: 'Polygon' // (typeSelect.value) + type: type }); + this.draw.on('drawstart', function () { + this.features.clear(); + }, this); this.map.addInteraction(this.draw); }, removeInteraction: function () { - this.map.removeInteraction(this.draw); + if (this.draw) { + this.map.removeInteraction(this.draw); + this.draw = null; + } } }); diff --git a/web/app/view/GeofenceMapController.js b/web/app/view/GeofenceMapController.js index d3915fd46..1d20ba966 100644 --- a/web/app/view/GeofenceMapController.js +++ b/web/app/view/GeofenceMapController.js @@ -19,10 +19,21 @@ Ext.define('Traccar.view.GeofenceMapController', { alias: 'controller.geofenceMap', onSaveClick: function (button) { - button.up('window').close(); + var feature, formatter; + if (this.getView().getFeatures().getLength() > 0) { + feature = this.getView().getFeatures().pop(); + formatter = new ol.format.WKT(); + this.fireEvent('saveArea', formatter.writeFeature(feature)); + button.up('window').close(); + } }, onCancelClick: function (button) { button.up('window').close(); + }, + + onTypeSelect: function (combo) { + this.getView().removeInteraction(); + this.getView().addInteraction(combo.getValue()); } }); diff --git a/web/app/view/SettingsMenu.js b/web/app/view/SettingsMenu.js index 70041bd63..8c230f36f 100644 --- a/web/app/view/SettingsMenu.js +++ b/web/app/view/SettingsMenu.js @@ -49,7 +49,7 @@ Ext.define('Traccar.view.SettingsMenu', { reference: 'settingsUsersButton' }, { text: Strings.sharedNotifications, - handler: 'onNotificationsClick', + handler: 'onNotificationsClick' }, { text: Strings.loginLogout, handler: 'onLogoutClick' -- cgit v1.2.3