diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2016-06-03 10:57:09 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2016-06-03 10:57:09 +1200 |
commit | 9ecabbef669cbd1a91490f4872d4c220b54e37a4 (patch) | |
tree | 7d2afe2b865dc5f9f10faa5ce7d213a219afa82a | |
parent | 06a746b44dae69b0c84a5302f92a1bcbe2dc827f (diff) | |
parent | 0271fa29703f24df24756c117209b9b04e127fc3 (diff) | |
download | traccar-server-9ecabbef669cbd1a91490f4872d4c220b54e37a4.tar.gz traccar-server-9ecabbef669cbd1a91490f4872d4c220b54e37a4.tar.bz2 traccar-server-9ecabbef669cbd1a91490f4872d4c220b54e37a4.zip |
Merge pull request #1992 from Abyss777/master
Show events in web interface with toasts
-rw-r--r-- | src/org/traccar/BaseEventHandler.java | 2 | ||||
-rw-r--r-- | src/org/traccar/api/AsyncSocket.java | 30 | ||||
-rw-r--r-- | src/org/traccar/database/ConnectionManager.java | 8 | ||||
-rw-r--r-- | web/app/Application.js | 6 | ||||
-rw-r--r-- | web/app/controller/Root.js | 31 | ||||
-rw-r--r-- | web/app/model/Event.js | 40 | ||||
-rw-r--r-- | web/app/store/Events.js | 25 | ||||
-rw-r--r-- | web/l10n/en.json | 10 |
8 files changed, 134 insertions, 18 deletions
diff --git a/src/org/traccar/BaseEventHandler.java b/src/org/traccar/BaseEventHandler.java index fde57748c..3e3317f0a 100644 --- a/src/org/traccar/BaseEventHandler.java +++ b/src/org/traccar/BaseEventHandler.java @@ -25,7 +25,7 @@ public abstract class BaseEventHandler extends BaseDataHandler { Event event = analizePosition(position); if (event != null) { - Context.getConnectionManager().updateEvent(event); + Context.getConnectionManager().updateEvent(event, position); } return position; } diff --git a/src/org/traccar/api/AsyncSocket.java b/src/org/traccar/api/AsyncSocket.java index 2259f840f..d1e5594f4 100644 --- a/src/org/traccar/api/AsyncSocket.java +++ b/src/org/traccar/api/AsyncSocket.java @@ -28,6 +28,8 @@ import javax.json.Json; import javax.json.JsonObjectBuilder; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; public class AsyncSocket extends WebSocketAdapter implements ConnectionManager.UpdateListener { @@ -45,7 +47,9 @@ public class AsyncSocket extends WebSocketAdapter implements ConnectionManager.U public void onWebSocketConnect(Session session) { super.onWebSocketConnect(session); - sendData(KEY_POSITIONS, Context.getConnectionManager().getInitialState(userId)); + Map<String, Collection<?>> data = new HashMap<>(); + data.put(KEY_POSITIONS, Context.getConnectionManager().getInitialState(userId)); + sendData(data); Context.getConnectionManager().addListener(userId, this); } @@ -59,25 +63,35 @@ public class AsyncSocket extends WebSocketAdapter implements ConnectionManager.U @Override public void onUpdateDevice(Device device) { - sendData(KEY_DEVICES, Collections.singletonList(device)); + Map<String, Collection<?>> data = new HashMap<>(); + data.put(KEY_DEVICES, Collections.singletonList(device)); + sendData(data); } @Override public void onUpdatePosition(Position position) { - sendData(KEY_POSITIONS, Collections.singletonList(position)); + Map<String, Collection<?>> data = new HashMap<>(); + data.put(KEY_POSITIONS, Collections.singletonList(position)); + sendData(data); } @Override - public void onUpdateEvent(Event event) { - sendData(KEY_EVENTS, Collections.singletonList(event)); + public void onUpdateEvent(Event event, Position position) { + Map<String, Collection<?>> data = new HashMap<>(); + data.put(KEY_EVENTS, Collections.singletonList(event)); + if (position != null) { + data.put(KEY_POSITIONS, Collections.singletonList(position)); + } + sendData(data); } - private void sendData(String key, Collection<?> data) { + private void sendData(Map<String, Collection<?>> data) { if (!data.isEmpty() && isConnected()) { JsonObjectBuilder json = Json.createObjectBuilder(); - json.add(key, JsonConverter.arrayToJson(data)); + for (Map.Entry<String, Collection<?>> entry : data.entrySet()) { + json.add(entry.getKey(), JsonConverter.arrayToJson(entry.getValue())); + } getRemote().sendString(json.build().toString(), null); } } - } diff --git a/src/org/traccar/database/ConnectionManager.java b/src/org/traccar/database/ConnectionManager.java index 9e0da8485..ec5903548 100644 --- a/src/org/traccar/database/ConnectionManager.java +++ b/src/org/traccar/database/ConnectionManager.java @@ -94,7 +94,7 @@ public class ConnectionManager { if (status.equals(Device.STATUS_ONLINE)) { event.setType(Event.TYPE_DEVICE_ONLINE); } - updateEvent(event); + updateEvent(event, null); } device.setStatus(status); @@ -147,7 +147,7 @@ public class ConnectionManager { } } - public synchronized void updateEvent(Event event) { + public synchronized void updateEvent(Event event, Position position) { long deviceId = event.getDeviceId(); try { Context.getDataManager().addEvent(event); @@ -157,7 +157,7 @@ public class ConnectionManager { for (long userId : Context.getPermissionsManager().getDeviceUsers(deviceId)) { if (listeners.containsKey(userId)) { for (UpdateListener listener : listeners.get(userId)) { - listener.onUpdateEvent(event); + listener.onUpdateEvent(event, position); } } } @@ -183,7 +183,7 @@ public class ConnectionManager { public interface UpdateListener { void onUpdateDevice(Device device); void onUpdatePosition(Position position); - void onUpdateEvent(Event event); + void onUpdateEvent(Event event, Position position); } public synchronized void addListener(long userId, UpdateListener listener) { diff --git a/web/app/Application.js b/web/app/Application.js index 69ce8f891..e798a73e2 100644 --- a/web/app/Application.js +++ b/web/app/Application.js @@ -30,7 +30,8 @@ Ext.define('Traccar.Application', { 'Device', 'Position', 'Attribute', - 'Command' + 'Command', + 'Event' ], stores: [ @@ -47,7 +48,8 @@ Ext.define('Traccar.Application', { 'SpeedUnits', 'CommandTypes', 'TimeUnits', - 'Languages' + 'Languages', + 'Events' ], controllers: [ diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js index bb65e0048..991a2572c 100644 --- a/web/app/controller/Root.js +++ b/web/app/controller/Root.js @@ -94,7 +94,7 @@ Ext.define('Traccar.controller.Root', { }; socket.onmessage = function (event) { - var i, store, data, array, entity; + var i, j, store, data, array, entity, device, typeKey, text; data = Ext.decode(event.data); @@ -114,7 +114,7 @@ Ext.define('Traccar.controller.Root', { } } - if (data.positions) { + if (data.positions && !data.events) { array = data.positions; store = Ext.getStore('LatestPositions'); for (i = 0; i < array.length; i++) { @@ -126,6 +126,33 @@ Ext.define('Traccar.controller.Root', { } } } + + if (data.events) { + array = data.events; + store = Ext.getStore('Events'); + for (i = 0; i < array.length; i++) { + store.add(array[i]); + if (array[i].type === 'commandResult' && data.positions) { + for (j = 0; j < data.positions.length; j++) { + if (data.positions[j].id == array[i].positionId) { + text = data.positions[j].attributes.result; + break; + } + } + text = Strings.eventCommandResult + text; + } else { + typeKey = 'event' + array[i].type.charAt(0).toUpperCase() + array[i].type.slice(1); + text = Strings[typeKey]; + if (typeof text == "undefined") { + text = typeKey; + } + } + device = Ext.getStore('Devices').getById(array[i].deviceId); + if (typeof device != "undefined") { + Ext.toast(text, device.getData().name); + } + } + } }; } }); diff --git a/web/app/model/Event.js b/web/app/model/Event.js new file mode 100644 index 000000000..4dd3ea7ff --- /dev/null +++ b/web/app/model/Event.js @@ -0,0 +1,40 @@ +/* + * Copyright 2015 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.model.Event', { + extend: 'Ext.data.Model', + identifier: 'negative', + + fields: [{ + name: 'id', + type: 'int' + }, { + name: 'type', + type: 'string' + }, { + name: 'serverTime', + type: 'date', + dateFormat: 'c' + }, { + name: 'deviceId', + type: 'int' + }, { + name: 'positionId', + type: 'int' + }, { + name: 'attributes' + }] +}); diff --git a/web/app/store/Events.js b/web/app/store/Events.js new file mode 100644 index 000000000..54b341d30 --- /dev/null +++ b/web/app/store/Events.js @@ -0,0 +1,25 @@ +/* + * Copyright 2015 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.Events', { + extend: 'Ext.data.Store', + model: 'Traccar.model.Event', + + proxy: { + type: 'rest', + url: '/api/events' + } +}); diff --git a/web/l10n/en.json b/web/l10n/en.json index 932cbfa78..f4bd253ea 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -97,5 +97,13 @@ "commandSosNumber": "Set SOS Number", "commandSilenceTime": "Set Silence Time", "commandSetPhonebook": "Set Phonebook", - "commandVoiceMessage": "Voice Message" + "commandVoiceMessage": "Voice Message", + "eventDeviceOnline": "Device is online", + "eventDeviceOffline": "Device is offline", + "eventDeviceMoving": "Device is moving", + "eventDeviceStopped": "Device is stopped", + "eventDeviceOverspeed": "Device exceeds the speed", + "eventCommandResult": "Command result: ", + "eventGeofenceEnter": "Device has entered geofence", + "eventGeofenceEnter": "Device has exited geofence" }
\ No newline at end of file |