From 35e8f4b4974515733737c5cc1dd439ca47860007 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 31 May 2017 16:55:00 +0500 Subject: Implement Events panel --- web/app/view/Events.js | 105 ++++++++++++++++++++++++++++++++++++++ web/app/view/EventsController.js | 63 +++++++++++++++++++++++ web/app/view/Main.js | 8 +++ web/app/view/MainMobile.js | 3 ++ web/app/view/edit/Devices.js | 20 +------- web/app/view/map/Map.js | 12 +++-- web/app/view/map/MapController.js | 5 ++ 7 files changed, 192 insertions(+), 24 deletions(-) create mode 100644 web/app/view/Events.js create mode 100644 web/app/view/EventsController.js (limited to 'web/app/view') diff --git a/web/app/view/Events.js b/web/app/view/Events.js new file mode 100644 index 00000000..19656903 --- /dev/null +++ b/web/app/view/Events.js @@ -0,0 +1,105 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.Events', { + extend: 'Ext.grid.Panel', + xtype: 'eventsView', + + requires: [ + 'Traccar.view.EventsController' + ], + + controller: 'events', + + store: 'Events', + + stateful: true, + stateId: 'events-grid', + + title: Strings.reportEvents, + + sortableColumns: false, + + header: false, + + tbar: { + componentCls: 'toolbar-header-style', + defaults: { + xtype: 'button', + tooltipType: 'title', + stateEvents: ['toggle'], + enableToggle: true, + stateful: { + pressed: true + } + }, + items: [{ + xtype: 'tbtext', + html: Strings.reportEvents, + baseCls: 'x-panel-header-title-default' + }, { + xtype: 'tbfill' + }, { + glyph: 'xf063@FontAwesome', + pressed: true, + toggleHandler: 'onScrollToLastClick', + stateId: 'events-scroll-to-last-button', + tooltip: Strings.eventsScrollToLast, + reference: 'scrollToLast' + }, { + id: 'soundButton', + glyph: 'xf0a2@FontAwesome', + tooltip: Strings.sharedSound, + stateId: 'sound-button' + }, { + glyph: 'xf014@FontAwesome', + tooltip: Strings.reportClear, + handler: 'onClearClick', + stateful: false, + enableToggle: false + }, { + glyph: 'xf00d@FontAwesome', + tooltip: Strings.sharedHide, + handler: 'onHideEvents', + reference: 'hideEvents', + hidden: true, + stateful: false, + enableToggle: false + }] + }, + + columns: { + defaults: { + flex: 1, + minWidth: Traccar.Style.columnWidthNormal + }, + items: [{ + text: Strings.reportDeviceName, + dataIndex: 'deviceId', + renderer: Traccar.AttributeFormatter.getFormatter('deviceId') + }, { + flex: 2, + text: Strings.positionEvent, + dataIndex: 'text' + }, { + text: Strings.positionFixTime, + dataIndex: 'serverTime', + renderer: Traccar.AttributeFormatter.getFormatter('lastUpdate') + }] + } +}); diff --git a/web/app/view/EventsController.js b/web/app/view/EventsController.js new file mode 100644 index 00000000..5cd9fb8e --- /dev/null +++ b/web/app/view/EventsController.js @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.EventsController', { + extend: 'Ext.app.ViewController', + alias: 'controller.events', + + config: { + listen: { + store: { + '#Events': { + add: 'onAddEvent' + } + } + } + }, + + init: function () { + var self = this; + setInterval(function () { + self.getView().getView().refresh(); + }, Traccar.Style.refreshPeriod); + + if (Traccar.app.isMobile()) { + this.lookupReference('hideEvents').setHidden(false); + } + }, + + onClearClick: function (button) { + Ext.getStore('Events').removeAll(); + }, + + onAddEvent: function (store, data) { + if (this.lookupReference('scrollToLast').pressed) { + this.getView().scrollBy(0, Number.POSITIVE_INFINITY, true); + } + }, + + onScrollToLastClick: function (button, pressed) { + if (pressed) { + this.onAddEvent(); + } + }, + + onHideEvents: function () { + Traccar.app.showEvents(false); + } +}); diff --git a/web/app/view/Main.js b/web/app/view/Main.js index 333928a5..3f7cf7c1 100644 --- a/web/app/view/Main.js +++ b/web/app/view/Main.js @@ -23,6 +23,7 @@ Ext.define('Traccar.view.Main', { 'Traccar.view.edit.Devices', 'Traccar.view.State', 'Traccar.view.Report', + 'Traccar.view.Events', 'Traccar.view.map.Map' ], @@ -67,5 +68,12 @@ Ext.define('Traccar.view.Main', { region: 'center', xtype: 'mapView', collapsible: false + }, { + region: 'east', + xtype: 'eventsView', + width: Traccar.Style.deviceWidth, + collapsed: true, + titleCollapse: true, + floatable: false }] }); diff --git a/web/app/view/MainMobile.js b/web/app/view/MainMobile.js index 1f262ccb..8aab7710 100644 --- a/web/app/view/MainMobile.js +++ b/web/app/view/MainMobile.js @@ -25,6 +25,7 @@ Ext.define('Traccar.view.MainMobile', { 'Traccar.view.edit.Devices', 'Traccar.view.State', 'Traccar.view.Report', + 'Traccar.view.Events', 'Traccar.view.map.Map' ], @@ -66,5 +67,7 @@ Ext.define('Traccar.view.MainMobile', { }] }, { xtype: 'reportView' + }, { + xtype: 'eventsView' }] }); diff --git a/web/app/view/edit/Devices.js b/web/app/view/edit/Devices.js index fe3de42c..196df733 100644 --- a/web/app/view/edit/Devices.js +++ b/web/app/view/edit/Devices.js @@ -166,25 +166,7 @@ Ext.define('Traccar.view.edit.Devices', { }, { text: Strings.deviceLastUpdate, dataIndex: 'lastUpdate', - renderer: function (value, metaData, record) { - var seconds, interval; - - if (value) { - seconds = Math.floor((new Date() - value) / 1000); - if (seconds < 0) { - seconds = 0; - } - interval = Math.floor(seconds / 86400); - if (interval > 1) { - return interval + ' ' + Strings.sharedDays; - } - interval = Math.floor(seconds / 3600); - if (interval > 1) { - return interval + ' ' + Strings.sharedHours; - } - return Math.floor(seconds / 60) + ' ' + Strings.sharedMinutes; - } - } + renderer: Traccar.AttributeFormatter.getFormatter('lastUpdate') }] } }); diff --git a/web/app/view/map/Map.js b/web/app/view/map/Map.js index d4e654eb..82b76ee5 100644 --- a/web/app/view/map/Map.js +++ b/web/app/view/map/Map.js @@ -51,6 +51,13 @@ Ext.define('Traccar.view.map.Map', { stateful: false, enableToggle: false, tooltip: Strings.reportTitle + }, { + handler: 'showEvents', + reference: 'showEventsButton', + glyph: 'xf27b@FontAwesome', + stateful: false, + enableToggle: false, + tooltip: Strings.reportEvents }, { handler: 'updateGeofences', reference: 'showGeofencesButton', @@ -70,11 +77,6 @@ Ext.define('Traccar.view.map.Map', { tooltip: Strings.deviceFollow, stateId: 'device-follow-button', toggleHandler: 'onFollowClick' - }, { - id: 'soundButton', - glyph: 'xf0a2@FontAwesome', - tooltip: Strings.sharedSound, - stateId: 'sound-button' }, { xtype: 'settingsMenu', enableToggle: false diff --git a/web/app/view/map/MapController.js b/web/app/view/map/MapController.js index 8a5e81c6..02d4e382 100644 --- a/web/app/view/map/MapController.js +++ b/web/app/view/map/MapController.js @@ -45,12 +45,17 @@ Ext.define('Traccar.view.map.MapController', { init: function () { this.callParent(); this.lookupReference('showReportsButton').setVisible(Traccar.app.isMobile()); + this.lookupReference('showEventsButton').setVisible(Traccar.app.isMobile()); }, showReports: function () { Traccar.app.showReports(true); }, + showEvents: function () { + Traccar.app.showEvents(true); + }, + onFollowClick: function (button, pressed) { if (pressed && this.selectedMarker) { this.getView().getMapView().setCenter(this.selectedMarker.getGeometry().getCoordinates()); -- cgit v1.2.3