From 682bc9db991ef5d550b6b0b780371f19359511ad Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 6 Sep 2021 11:59:42 -0700 Subject: # This is a combination of 30 commits. # This is the 1st commit message: Close socket on logout (fix #896) # This is the commit message #2: Fix lint # This is the commit message #3: Add calendar menu # This is the commit message #4: Add calendar file upload # This is the commit message #5: Disable icon tinting in Firefox # This is the commit message #6: Move ignition icon # This is the commit message #7: Specify icon sizes # This is the commit message #8: Fix lint issues # This is the commit message #9: Add accuracy button # This is the commit message #10: Merge shock and vibration alarms # This is the commit message #11: Add events alarm column # This is the commit message #12: Enable LocationIQ by default # This is the commit message #13: Update LocationIQ keys # This is the commit message #14: Fix selector style # This is the commit message #15: Support server change # This is the commit message #16: Update localization script # This is the commit message #17: Update localization # This is the commit message #18: Command to install dependency # This is the commit message #19: Update JavaScript libraries # This is the commit message #20: Fix modern app issues # This is the commit message #21: Fix image URL # This is the commit message #22: Fix user list (fix #898) # This is the commit message #23: Fix formatting issue # This is the commit message #24: Add option to disable reports # This is the commit message #25: Fix add button position # This is the commit message #26: Select device based on uniqueId # This is the commit message #27: Update devices list search # This is the commit message #28: Fix lint problems # This is the commit message #29: Changed devices list search # This is the commit message #30: Changed device list search --- web/app/controller/Root.js | 10 ++++----- web/app/model/Server.js | 3 +++ web/app/model/User.js | 3 +++ web/app/store/CommonUserAttributes.js | 6 +---- web/app/store/MapTypes.js | 9 ++++++++ web/app/view/MainController.js | 4 ++-- web/app/view/ReportController.js | 6 +++++ web/app/view/State.js | 15 +++++++------ web/app/view/StateController.js | 3 ++- web/app/view/dialog/Login.js | 41 +++++++++++++++++++++++++++++++++++ web/app/view/dialog/Server.js | 6 +++++ web/app/view/dialog/User.js | 8 +++++++ web/app/view/dialog/UserController.js | 1 + web/app/view/map/BaseMap.js | 32 +++++++++++++++++++++++++-- web/app/view/map/Map.js | 16 ++++++++++++-- web/app/view/map/MapController.js | 8 +++++-- 16 files changed, 145 insertions(+), 26 deletions(-) (limited to 'web/app') diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js index 65b56fa6..a37bc06f 100644 --- a/web/app/controller/Root.js +++ b/web/app/controller/Root.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@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 @@ -308,7 +308,7 @@ Ext.define('Traccar.controller.Root', { }, updatePositions: function (array, first) { - var i, store, entity, deviceId, device; + var i, store, entity, uniqueId, device; store = Ext.getStore('LatestPositions'); for (i = 0; i < array.length; i++) { entity = store.findRecord('deviceId', array[i].deviceId, 0, false, false, true); @@ -322,9 +322,9 @@ Ext.define('Traccar.controller.Root', { } } if (first) { - deviceId = Ext.Object.fromQueryString(window.location.search).deviceId; - if (deviceId) { - device = Ext.getStore('VisibleDevices').findRecord('id', deviceId, 0, false, true, true); + uniqueId = Ext.Object.fromQueryString(window.location.search).deviceId; + if (uniqueId) { + device = Ext.getStore('VisibleDevices').findRecord('uniqueId', uniqueId, 0, false, true, true); if (device) { this.fireEvent('selectdevice', device, true); } diff --git a/web/app/model/Server.js b/web/app/model/Server.js index afafe908..177b4fc4 100644 --- a/web/app/model/Server.js +++ b/web/app/model/Server.js @@ -34,6 +34,9 @@ Ext.define('Traccar.model.Server', { }, { name: 'limitCommands', type: 'boolean' + }, { + name: 'disableReports', + type: 'boolean' }, { name: 'map', type: 'string' diff --git a/web/app/model/User.js b/web/app/model/User.js index 76f2a366..fcaff007 100644 --- a/web/app/model/User.js +++ b/web/app/model/User.js @@ -80,6 +80,9 @@ Ext.define('Traccar.model.User', { }, { name: 'limitCommands', type: 'boolean' + }, { + name: 'disableReports', + type: 'boolean' }, { name: 'poiLayer', type: 'string' diff --git a/web/app/store/CommonUserAttributes.js b/web/app/store/CommonUserAttributes.js index a8e92825..7d0ea969 100644 --- a/web/app/store/CommonUserAttributes.js +++ b/web/app/store/CommonUserAttributes.js @@ -1,5 +1,5 @@ /* - * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 - 2022 Anton Tananaev (anton@traccar.org) * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) * * This program is free software: you can redistribute it and/or modify @@ -38,10 +38,6 @@ Ext.define('Traccar.store.CommonUserAttributes', { allowDecimals: false, minValue: Traccar.Style.mapDefaultZoom, maxValue: Traccar.Style.mapMaxZoom - }, { - key: 'ui.disableReport', - name: Strings.attributeUiDisableReport, - valueType: 'boolean' }, { key: 'ui.disableEvents', name: Strings.attributeUiDisableEvents, diff --git a/web/app/store/MapTypes.js b/web/app/store/MapTypes.js index 9cca525e..01657565 100644 --- a/web/app/store/MapTypes.js +++ b/web/app/store/MapTypes.js @@ -20,6 +20,15 @@ Ext.define('Traccar.store.MapTypes', { fields: ['key', 'name'], data: [{ + key: 'locationIqStreets', + name: Strings.mapLocationIqStreets + }, { + key: 'locationIqEarth', + name: Strings.mapLocationIqEarth + }, { + key: 'locationIqHybrid', + name: Strings.mapLocationIqHybrid + }, { key: 'osm', name: Strings.mapOsm }, { diff --git a/web/app/view/MainController.js b/web/app/view/MainController.js index 7cd03050..8ed986af 100644 --- a/web/app/view/MainController.js +++ b/web/app/view/MainController.js @@ -1,5 +1,5 @@ /* - * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 - 2022 Anton Tananaev (anton@traccar.org) * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) * * This program is free software: you can redistribute it and/or modify @@ -20,7 +20,7 @@ Ext.define('Traccar.view.MainController', { alias: 'controller.mainController', init: function () { - this.lookupReference('reportView').setHidden(Traccar.app.getBooleanAttributePreference('ui.disableReport')); + this.lookupReference('reportView').setHidden(Traccar.app.getPreference('disableReports', false)); this.lookupReference('eventsView').setHidden(Traccar.app.getBooleanAttributePreference('ui.disableEvents')); } }); diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js index cc0fd4ac..4241df35 100644 --- a/web/app/view/ReportController.js +++ b/web/app/view/ReportController.js @@ -527,6 +527,12 @@ Ext.define('Traccar.view.ReportController', { renderer: function (value) { return Traccar.app.getEventString(value); } + }, { + text: Strings.positionAlarm, + dataIndex: 'attributes', + renderer: function (value) { + return value['alarm']; + } }, { text: Strings.sharedGeofence, dataIndex: 'geofenceId', diff --git a/web/app/view/State.js b/web/app/view/State.js index ed9951b5..c0a430d9 100644 --- a/web/app/view/State.js +++ b/web/app/view/State.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@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 @@ -61,19 +61,20 @@ Ext.define('Traccar.view.State', { dataIndex: 'value', cellWrap: true, renderer: function (value, metaData, record) { - var position, device; - if (record.get('attribute') === 'alarm') { + var position, device, attribute; + attribute = record.get('attribute'); + if (attribute === 'alarm') { metaData.tdCls = 'view-color-red'; - } else if (record.get('name') === Strings.positionAddress && !value) { + } else if (attribute === 'address' && !value) { return '' + Strings.sharedShowAddress + ''; - } else if (record.get('name') === Strings.positionImage || record.get('name') === Strings.positionAudio) { + } else if (attribute === 'image' || attribute === 'video' || attribute === 'audio') { position = this.getController().position; if (position) { device = Ext.getStore('Devices').getById(position.get('deviceId')); if (device) { - return '' + - value + ''; + return '' + value + ''; } } } diff --git a/web/app/view/StateController.js b/web/app/view/StateController.js index 1ab1aa2f..f04d7185 100644 --- a/web/app/view/StateController.js +++ b/web/app/view/StateController.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@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 @@ -128,6 +128,7 @@ Ext.define('Traccar.view.StateController', { store.add(Ext.create('Traccar.model.Attribute', { priority: this.keys[key].priority, name: this.keys[key].name, + attribute: key, value: Traccar.AttributeFormatter.getFormatter(key)(this.position.get(key)) })); } diff --git a/web/app/view/dialog/Login.js b/web/app/view/dialog/Login.js index 86917b94..d5658914 100644 --- a/web/app/view/dialog/Login.js +++ b/web/app/view/dialog/Login.js @@ -49,6 +49,47 @@ Ext.define('Traccar.view.dialog.Login', { display: 'block', margin: '10px auto 25px' } + }, { + xtype: 'pickerfield', + fieldLabel: Strings.settingsServer, + editable: false, + value: window.location.host, + hidden: !window.appInterface && !(window.webkit && window.webkit.messageHandlers.appInterface), + createPicker: function () { + var self = this, popup = Ext.create({ + xtype: 'window', + closeAction: 'hide', + referenceHolder: true, + minWidth: 204, + layout: 'form', + header: false, + resizable: true, + items: [{ + xtype: 'textfield', + anchor: '100%', + reference: 'serverAddress', + value: window.location.href + }], + fbar: [{ + text: Strings.sharedSet, + handler: function () { + var message = 'server|' + popup.lookupReference('serverAddress').getValue(); + if (window.webkit && window.webkit.messageHandlers.appInterface) { + window.webkit.messageHandlers.appInterface.postMessage(message); + } + if (window.appInterface) { + window.appInterface.postMessage(message); + } + } + }, { + text: Strings.sharedCancel, + handler: function () { + self.collapse(); + } + }] + }); + return popup; + } }, { xtype: 'combobox', name: 'language', diff --git a/web/app/view/dialog/Server.js b/web/app/view/dialog/Server.js index d9e225ec..6ee250b6 100644 --- a/web/app/view/dialog/Server.js +++ b/web/app/view/dialog/Server.js @@ -122,6 +122,12 @@ Ext.define('Traccar.view.dialog.Server', { uncheckedValue: false, name: 'limitCommands', fieldLabel: Strings.userLimitCommands + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'disableReports', + fieldLabel: Strings.userDisableReports }] }] }, diff --git a/web/app/view/dialog/User.js b/web/app/view/dialog/User.js index 917f110c..7335ee79 100644 --- a/web/app/view/dialog/User.js +++ b/web/app/view/dialog/User.js @@ -144,6 +144,14 @@ Ext.define('Traccar.view.dialog.User', { fieldLabel: Strings.userLimitCommands, disabled: true, reference: 'limitCommandsField' + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'disableReports', + fieldLabel: Strings.userDisableReports, + disabled: true, + reference: 'disableReportsField' }, { xtype: 'datefield', name: 'expirationTime', diff --git a/web/app/view/dialog/UserController.js b/web/app/view/dialog/UserController.js index 7383f9ee..4ba48563 100644 --- a/web/app/view/dialog/UserController.js +++ b/web/app/view/dialog/UserController.js @@ -31,6 +31,7 @@ Ext.define('Traccar.view.dialog.UserController', { this.lookupReference('expirationTimeField').setDisabled(false); this.lookupReference('deviceReadonlyField').setDisabled(false); this.lookupReference('limitCommandsField').setDisabled(false); + this.lookupReference('disableReportsField').setDisabled(false); } }, diff --git a/web/app/view/map/BaseMap.js b/web/app/view/map/BaseMap.js index efd05021..c27a8d79 100644 --- a/web/app/view/map/BaseMap.js +++ b/web/app/view/map/BaseMap.js @@ -30,12 +30,13 @@ Ext.define('Traccar.view.map.BaseMap', { }, initMap: function () { - var server, layer, type, bingKey, lat, lon, zoom, maxZoom, target, poiLayer, self = this; + var server, layer, type, bingKey, locationIqKey, lat, lon, zoom, maxZoom, target, poiLayer, self = this; server = Traccar.app.getServer(); type = Traccar.app.getPreference('map', null); bingKey = server.get('bingKey'); + locationIqKey = Traccar.app.getAttributePreference('locationIqKey', 'pk.0f147952a41c555a5b70614039fd148b'); layer = new ol.layer.Group({ title: Strings.mapLayer, @@ -125,8 +126,35 @@ Ext.define('Traccar.view.map.BaseMap', { new ol.layer.Tile({ title: Strings.mapOsm, type: 'base', - visible: type === 'osm' || type === 'wikimedia' || !type, + visible: type === 'osm', source: new ol.source.OSM({}) + }), + new ol.layer.Tile({ + title: Strings.mapLocationIqHybrid, + type: 'base', + visible: type === 'locationIqHybrid', + source: new ol.source.XYZ({ + url: 'https://{a-c}-tiles.locationiq.com/v3/hybrid/r/{z}/{x}/{y}.jpg?key=' + locationIqKey, + attributions: '© LocationIQ' + }) + }), + new ol.layer.Tile({ + title: Strings.mapLocationIqEarth, + type: 'base', + visible: type === 'locationIqEarth', + source: new ol.source.XYZ({ + url: 'https://{a-c}-tiles.locationiq.com/v3/earth/r/{z}/{x}/{y}.jpg?key=' + locationIqKey, + attributions: '© LocationIQ' + }) + }), + new ol.layer.Tile({ + title: Strings.mapLocationIqStreets, + type: 'base', + visible: type === 'locationIqStreets' || type === 'wikimedia' || !type, + source: new ol.source.XYZ({ + url: 'https://{a-c}-tiles.locationiq.com/v3/streets/r/{z}/{x}/{y}.png?key=' + locationIqKey, + attributions: '© LocationIQ' + }) }) ] }); diff --git a/web/app/view/map/Map.js b/web/app/view/map/Map.js index fbaa7587..36e81de7 100644 --- a/web/app/view/map/Map.js +++ b/web/app/view/map/Map.js @@ -65,6 +65,13 @@ Ext.define('Traccar.view.map.Map', { pressed: true, stateId: 'show-geofences-button', tooltip: Strings.sharedGeofences + }, { + handler: 'showAccuracy', + reference: 'showAccuracyButton', + glyph: 'xf140@FontAwesome', + pressed: true, + stateId: 'show-accuracy-button', + tooltip: Strings.positionAccuracy }, { handler: 'showCurrentLocation', glyph: 'xf124@FontAwesome', @@ -95,6 +102,10 @@ Ext.define('Traccar.view.map.Map', { return this.accuracySource; }, + getAccuracyLayer: function () { + return this.accuracyLayer; + }, + getRouteSource: function () { return this.routeSource; }, @@ -133,10 +144,11 @@ Ext.define('Traccar.view.map.Map', { })); this.accuracySource = new ol.source.Vector({}); - this.map.addLayer(new ol.layer.Vector({ + this.accuracyLayer = new ol.layer.Vector({ name: 'accuracyLayer', source: this.accuracySource - })); + }); + this.map.addLayer(this.accuracyLayer); this.markersSource = new ol.source.Vector({}); this.map.addLayer(new ol.layer.Vector({ diff --git a/web/app/view/map/MapController.js b/web/app/view/map/MapController.js index 7ba0ee3b..f6d88eed 100644 --- a/web/app/view/map/MapController.js +++ b/web/app/view/map/MapController.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@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 @@ -45,7 +45,7 @@ Ext.define('Traccar.view.map.MapController', { init: function () { this.callParent(); this.lookupReference('showReportsButton').setVisible( - Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableReport')); + Traccar.app.isMobile() && !Traccar.app.getPreference('disableReports', false)); this.lookupReference('showEventsButton').setVisible( Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableEvents')); }, @@ -68,6 +68,10 @@ Ext.define('Traccar.view.map.MapController', { this.getView().getLiveRouteLayer().setVisible(button.pressed); }, + showAccuracy: function (button) { + this.getView().getAccuracyLayer().setVisible(button.pressed); + }, + getMapState: function () { var zoom, center, projection; projection = this.getView().getMapView().getProjection(); -- cgit v1.2.3