From a2b7e07df1cc4548e27c51e1545cf210b0ef0ab7 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 11 Aug 2017 15:03:39 +0500 Subject: Implement attribute to disable vehicle related UI features --- web/app/Application.js | 8 ++++++++ web/app/store/ServerAttributes.js | 4 ++++ web/app/store/UserAttributes.js | 4 ++++ web/app/view/MainController.js | 3 +-- web/app/view/ReportController.js | 17 +++++++++++++++++ web/app/view/SettingsMenuController.js | 4 ++-- web/app/view/edit/DevicesController.js | 1 + web/app/view/edit/GroupsController.js | 4 ++++ web/app/view/map/MapController.js | 2 +- web/l10n/en.json | 1 + 10 files changed, 43 insertions(+), 5 deletions(-) diff --git a/web/app/Application.js b/web/app/Application.js index c14dd4d..3cee7b7 100644 --- a/web/app/Application.js +++ b/web/app/Application.js @@ -104,6 +104,10 @@ Ext.define('Traccar.Application', { return window.matchMedia && window.matchMedia('(max-width: 768px)').matches; }, + isVehicleFeaturesDisabled: function () { + return this.getBooleanAttributePreference('ui.disableVehicleFetures'); + }, + getEventString: function (eventType) { var key = 'event' + eventType.charAt(0).toUpperCase() + eventType.slice(1); return Strings[key] || key; @@ -161,6 +165,10 @@ Ext.define('Traccar.Application', { } }, + getBooleanAttributePreference: function (key) { + return this.getAttributePreference(key, false).toString() === 'true'; + }, + getReportColor: function (deviceId) { var index, reportColor, device = Ext.getStore('Devices').getById(deviceId); if (device) { diff --git a/web/app/store/ServerAttributes.js b/web/app/store/ServerAttributes.js index 89a0137..438ca3e 100644 --- a/web/app/store/ServerAttributes.js +++ b/web/app/store/ServerAttributes.js @@ -51,5 +51,9 @@ Ext.define('Traccar.store.ServerAttributes', { key: 'ui.disableReport', name: Strings.attributeUiDisableReport, valueType: 'boolean' + }, { + key: 'ui.disableVehicleFetures', + name: Strings.attributeUiDisableVehicleFetures, + valueType: 'boolean' }] }); diff --git a/web/app/store/UserAttributes.js b/web/app/store/UserAttributes.js index 6cf06fb..8e1acfb 100644 --- a/web/app/store/UserAttributes.js +++ b/web/app/store/UserAttributes.js @@ -83,5 +83,9 @@ Ext.define('Traccar.store.UserAttributes', { key: 'ui.disableReport', name: Strings.attributeUiDisableReport, valueType: 'boolean' + }, { + key: 'ui.disableVehicleFetures', + name: Strings.attributeUiDisableVehicleFetures, + valueType: 'boolean' }] }); diff --git a/web/app/view/MainController.js b/web/app/view/MainController.js index 76645e4..126d9af 100644 --- a/web/app/view/MainController.js +++ b/web/app/view/MainController.js @@ -20,7 +20,6 @@ Ext.define('Traccar.view.MainController', { alias: 'controller.mainController', init: function () { - this.lookupReference('reportView').setHidden( - Traccar.app.getAttributePreference('ui.disableReport', false).toString() === 'true'); + this.lookupReference('reportView').setHidden(Traccar.app.getBooleanAttributePreference('ui.disableReport')); } }); diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js index 5850086..85af559 100644 --- a/web/app/view/ReportController.js +++ b/web/app/view/ReportController.js @@ -79,6 +79,23 @@ Ext.define('Traccar.view.ReportController', { hidden: true }); } + if (Traccar.app.isVehicleFeaturesDisabled()) { + for (i = 0; i < this.summaryColumns.length; i++) { + if (this.summaryColumns[i].dataIndex.match('engineHours|spentFuel')) { + this.summaryColumns[i].hidden = true; + } + } + for (i = 0; i < this.tripsColumns.length; i++) { + if (this.tripsColumns[i].dataIndex.match('spentFuel|driverUniqueId')) { + this.tripsColumns[i].hidden = true; + } + } + for (i = 0; i < this.stopsColumns.length; i++) { + if (this.stopsColumns[i].dataIndex.match('engineHours|spentFuel')) { + this.stopsColumns[i].hidden = true; + } + } + } }, onConfigureClick: function () { diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 102120d..11bfb53 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -45,7 +45,7 @@ Ext.define('Traccar.view.SettingsMenuController', { if (admin) { this.lookupReference('settingsServerButton').setHidden(false); this.lookupReference('settingsStatisticsButton').setHidden(false); - this.lookupReference('settingsDeviceDistanceButton').setHidden(false); + this.lookupReference('settingsDeviceDistanceButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); } if (admin || manager) { this.lookupReference('settingsUsersButton').setHidden(false); @@ -56,7 +56,7 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsGeofencesButton').setHidden(false); this.lookupReference('settingsNotificationsButton').setHidden(false); this.lookupReference('settingsCalendarsButton').setHidden(false); - this.lookupReference('settingsDriversButton').setHidden(false); + this.lookupReference('settingsDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); } if (admin || (!deviceReadonly && !readonly)) { this.lookupReference('settingsAttributeAliasesButton').setHidden(false); diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js index ae65fbb..b98a8d4 100644 --- a/web/app/view/edit/DevicesController.js +++ b/web/app/view/edit/DevicesController.js @@ -61,6 +61,7 @@ Ext.define('Traccar.view.edit.DevicesController', { deviceReadonly = Traccar.app.getPreference('deviceReadonly', false) && !Traccar.app.getUser().get('admin'); readonly = Traccar.app.getPreference('readonly', false) && !Traccar.app.getUser().get('admin'); this.lookupReference('toolbarAddButton').setDisabled(readonly || deviceReadonly); + this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); setInterval(function () { self.getView().getView().refresh(); diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js index 21f17ff..941f5f1 100644 --- a/web/app/view/edit/GroupsController.js +++ b/web/app/view/edit/GroupsController.js @@ -32,6 +32,10 @@ Ext.define('Traccar.view.edit.GroupsController', { objectDialog: 'Traccar.view.dialog.Group', removeTitle: Strings.groupDialog, + init: function () { + this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); + }, + onGeofencesClick: function () { var admin, group; admin = Traccar.app.getUser().get('admin'); diff --git a/web/app/view/map/MapController.js b/web/app/view/map/MapController.js index f2a561a..651bd9f 100644 --- a/web/app/view/map/MapController.js +++ b/web/app/view/map/MapController.js @@ -45,7 +45,7 @@ Ext.define('Traccar.view.map.MapController', { init: function () { this.callParent(); this.lookupReference('showReportsButton').setVisible(Traccar.app.isMobile() && - !Traccar.app.getAttributePreference('ui.disableReport', false)); + !Traccar.app.getBooleanAttributePreference('ui.disableReport')); this.lookupReference('showEventsButton').setVisible(Traccar.app.isMobile()); }, diff --git a/web/l10n/en.json b/web/l10n/en.json index 6476b0d..6ea5410 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -89,6 +89,7 @@ "attributeMailSmtpUsername": "Mail: SMTP Username", "attributeMailSmtpPassword": "Mail: SMTP Password", "attributeUiDisableReport": "UI: Disable Report", + "attributeUiDisableVehicleFetures": "UI: Disable Vehicle Fetures", "errorTitle": "Error", "errorGeneral": "Invalid parameters or constraints violation", "errorConnection": "Connection error", -- cgit v1.2.3 From c52d923d60815fcc6c1e9592edbcd578caf1147c Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 11 Aug 2017 17:41:42 +0500 Subject: Implement disable Drivers and Computed Attributes separately --- web/app/store/ServerAttributes.js | 8 ++++++++ web/app/store/UserAttributes.js | 8 ++++++++ web/app/view/SettingsMenuController.js | 6 ++++-- web/app/view/edit/DevicesController.js | 5 ++++- web/app/view/edit/GroupsController.js | 5 ++++- web/app/view/edit/UsersController.js | 4 ++++ web/l10n/en.json | 2 ++ 7 files changed, 34 insertions(+), 4 deletions(-) diff --git a/web/app/store/ServerAttributes.js b/web/app/store/ServerAttributes.js index 438ca3e..f4e2a84 100644 --- a/web/app/store/ServerAttributes.js +++ b/web/app/store/ServerAttributes.js @@ -55,5 +55,13 @@ Ext.define('Traccar.store.ServerAttributes', { key: 'ui.disableVehicleFetures', name: Strings.attributeUiDisableVehicleFetures, valueType: 'boolean' + }, { + key: 'ui.disableDrivers', + name: Strings.attributeUiDisableDrivers, + valueType: 'boolean' + }, { + key: 'ui.disableComputedAttributes', + name: Strings.attributeUiDisableComputedAttributes, + valueType: 'boolean' }] }); diff --git a/web/app/store/UserAttributes.js b/web/app/store/UserAttributes.js index 8e1acfb..dbee1ed 100644 --- a/web/app/store/UserAttributes.js +++ b/web/app/store/UserAttributes.js @@ -87,5 +87,13 @@ Ext.define('Traccar.store.UserAttributes', { key: 'ui.disableVehicleFetures', name: Strings.attributeUiDisableVehicleFetures, valueType: 'boolean' + }, { + key: 'ui.disableDrivers', + name: Strings.attributeUiDisableDrivers, + valueType: 'boolean' + }, { + key: 'ui.disableComputedAttributes', + name: Strings.attributeUiDisableComputedAttributes, + valueType: 'boolean' }] }); diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 11bfb53..cc17ca3 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -56,11 +56,13 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsGeofencesButton').setHidden(false); this.lookupReference('settingsNotificationsButton').setHidden(false); this.lookupReference('settingsCalendarsButton').setHidden(false); - this.lookupReference('settingsDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); + this.lookupReference('settingsDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || + Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); } if (admin || (!deviceReadonly && !readonly)) { this.lookupReference('settingsAttributeAliasesButton').setHidden(false); - this.lookupReference('settingsComputedAttributesButton').setHidden(false); + this.lookupReference('settingsComputedAttributesButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); } }, diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js index b98a8d4..59a10bb 100644 --- a/web/app/view/edit/DevicesController.js +++ b/web/app/view/edit/DevicesController.js @@ -61,7 +61,10 @@ Ext.define('Traccar.view.edit.DevicesController', { deviceReadonly = Traccar.app.getPreference('deviceReadonly', false) && !Traccar.app.getUser().get('admin'); readonly = Traccar.app.getPreference('readonly', false) && !Traccar.app.getUser().get('admin'); this.lookupReference('toolbarAddButton').setDisabled(readonly || deviceReadonly); - this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); + this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || + Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('toolbarAttributesButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); setInterval(function () { self.getView().getView().refresh(); diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js index 941f5f1..f1da19c 100644 --- a/web/app/view/edit/GroupsController.js +++ b/web/app/view/edit/GroupsController.js @@ -33,7 +33,10 @@ Ext.define('Traccar.view.edit.GroupsController', { removeTitle: Strings.groupDialog, init: function () { - this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); + this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || + Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('toolbarAttributesButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); }, onGeofencesClick: function () { diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js index fb7a36e..1e7238a 100644 --- a/web/app/view/edit/UsersController.js +++ b/web/app/view/edit/UsersController.js @@ -41,6 +41,10 @@ Ext.define('Traccar.view.edit.UsersController', { init: function () { Ext.getStore('Users').load(); this.lookupReference('userUsersButton').setHidden(!Traccar.app.getUser().get('admin')); + this.lookupReference('userDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || + Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('userAttributesButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); }, onEditClick: function () { diff --git a/web/l10n/en.json b/web/l10n/en.json index 6ea5410..8eba834 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -90,6 +90,8 @@ "attributeMailSmtpPassword": "Mail: SMTP Password", "attributeUiDisableReport": "UI: Disable Report", "attributeUiDisableVehicleFetures": "UI: Disable Vehicle Fetures", + "attributeUiDisableDrivers": "UI: Disable Drivers", + "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes", "errorTitle": "Error", "errorGeneral": "Invalid parameters or constraints violation", "errorConnection": "Connection error", -- cgit v1.2.3 From 01af5f520e24a33d7e22523d8ed11e9f14a19516 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Mon, 14 Aug 2017 12:26:02 +0500 Subject: Implement disable Calendars --- web/app/store/ServerAttributes.js | 4 ++++ web/app/store/UserAttributes.js | 4 ++++ web/app/view/SettingsMenuController.js | 3 ++- web/app/view/dialog/Geofence.js | 1 + web/app/view/dialog/GeofenceController.js | 5 +++++ web/app/view/edit/UsersController.js | 2 ++ web/l10n/en.json | 1 + 7 files changed, 19 insertions(+), 1 deletion(-) diff --git a/web/app/store/ServerAttributes.js b/web/app/store/ServerAttributes.js index f4e2a84..109b09e 100644 --- a/web/app/store/ServerAttributes.js +++ b/web/app/store/ServerAttributes.js @@ -63,5 +63,9 @@ Ext.define('Traccar.store.ServerAttributes', { key: 'ui.disableComputedAttributes', name: Strings.attributeUiDisableComputedAttributes, valueType: 'boolean' + }, { + key: 'ui.disableCalendars', + name: Strings.attributeUiDisableCalendars, + valueType: 'boolean' }] }); diff --git a/web/app/store/UserAttributes.js b/web/app/store/UserAttributes.js index dbee1ed..a004a54 100644 --- a/web/app/store/UserAttributes.js +++ b/web/app/store/UserAttributes.js @@ -95,5 +95,9 @@ Ext.define('Traccar.store.UserAttributes', { key: 'ui.disableComputedAttributes', name: Strings.attributeUiDisableComputedAttributes, valueType: 'boolean' + }, { + key: 'ui.disableCalendars', + name: Strings.attributeUiDisableCalendars, + valueType: 'boolean' }] }); diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index cc17ca3..f459da7 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -55,7 +55,8 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsGroupsButton').setHidden(false); this.lookupReference('settingsGeofencesButton').setHidden(false); this.lookupReference('settingsNotificationsButton').setHidden(false); - this.lookupReference('settingsCalendarsButton').setHidden(false); + this.lookupReference('settingsCalendarsButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); this.lookupReference('settingsDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); } diff --git a/web/app/view/dialog/Geofence.js b/web/app/view/dialog/Geofence.js index 93f17de..bed20d3 100644 --- a/web/app/view/dialog/Geofence.js +++ b/web/app/view/dialog/Geofence.js @@ -46,6 +46,7 @@ Ext.define('Traccar.view.dialog.Geofence', { fieldLabel: Strings.sharedDescription }, { xtype: 'combobox', + reference: 'calendarCombo', name: 'calendarId', store: 'Calendars', queryMode: 'local', diff --git a/web/app/view/dialog/GeofenceController.js b/web/app/view/dialog/GeofenceController.js index 9fdad61..2f96987 100644 --- a/web/app/view/dialog/GeofenceController.js +++ b/web/app/view/dialog/GeofenceController.js @@ -34,6 +34,11 @@ Ext.define('Traccar.view.dialog.GeofenceController', { } }, + init: function () { + this.lookupReference('calendarCombo').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); + }, + saveArea: function (value) { this.lookupReference('areaField').setValue(value); }, diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js index 1e7238a..42fc0cd 100644 --- a/web/app/view/edit/UsersController.js +++ b/web/app/view/edit/UsersController.js @@ -45,6 +45,8 @@ Ext.define('Traccar.view.edit.UsersController', { Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('userAttributesButton').setHidden( Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); + this.lookupReference('userCalendarsButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); }, onEditClick: function () { diff --git a/web/l10n/en.json b/web/l10n/en.json index 8eba834..69df156 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -92,6 +92,7 @@ "attributeUiDisableVehicleFetures": "UI: Disable Vehicle Fetures", "attributeUiDisableDrivers": "UI: Disable Drivers", "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes", + "attributeUiDisableCalendars": "UI: Disable Calendars", "errorTitle": "Error", "errorGeneral": "Invalid parameters or constraints violation", "errorConnection": "Connection error", -- cgit v1.2.3 From 3c2a5c249d2a0cec1d5c371efcd1dfcf7e8c7f2e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 18 Aug 2017 11:22:48 +1200 Subject: Fix various style issues --- web/.eslintignore | 3 +- web/app/AttributeFormatter.js | 62 ++++++++++++------------- web/app/DeviceImages.js | 4 +- web/app/GeofenceConverter.js | 14 +++--- web/app/controller/Root.js | 8 +++- web/app/model/Event.js | 6 +-- web/app/store/AllNotifications.js | 5 +- web/app/store/AllTimezones.js | 2 +- web/app/store/CommandTypes.js | 2 +- web/app/store/Notifications.js | 5 +- web/app/store/PositionAttributes.js | 12 ++--- web/app/view/ArrayListFilter.js | 6 +-- web/app/view/CustomNumberField.js | 2 +- web/app/view/EventsController.js | 6 +-- web/app/view/MainController.js | 2 +- web/app/view/NotificationsController.js | 2 +- web/app/view/ReportController.js | 10 ++-- web/app/view/SettingsMenuController.js | 2 +- web/app/view/StateController.js | 17 ++++--- web/app/view/dialog/CalendarController.js | 2 +- web/app/view/dialog/CommandController.js | 2 + web/app/view/dialog/LoginController.js | 10 ++-- web/app/view/dialog/MapPickerController.js | 2 +- web/app/view/edit/AttributeAliasesController.js | 8 ++-- web/app/view/edit/Attributes.js | 2 +- web/app/view/edit/Devices.js | 4 +- web/app/view/edit/DevicesController.js | 4 +- web/app/view/map/BaseMap.js | 10 ++-- web/app/view/map/MapController.js | 8 ++-- web/app/view/map/MapMarkerController.js | 28 +++++------ web/app/view/permissions/BaseController.js | 8 ++-- 31 files changed, 129 insertions(+), 129 deletions(-) diff --git a/web/.eslintignore b/web/.eslintignore index 3e0fc5c..d40ab12 100644 --- a/web/.eslintignore +++ b/web/.eslintignore @@ -1 +1,2 @@ -simple/app.js \ No newline at end of file +simple/app.js +load.js diff --git a/web/app/AttributeFormatter.js b/web/app/AttributeFormatter.js index 2d394f5..87689a2 100644 --- a/web/app/AttributeFormatter.js +++ b/web/app/AttributeFormatter.js @@ -23,6 +23,7 @@ Ext.define('Traccar.AttributeFormatter', { if (value !== undefined) { return Number(value.toFixed(precision)) + ' ' + suffix; } + return null; }; }, @@ -54,8 +55,8 @@ Ext.define('Traccar.AttributeFormatter', { durationFormatter: function (value) { var hours, minutes; hours = Math.floor(value / 3600000); - minutes = Math.round((value % 3600000) / 60000); - return (hours + ' ' + Strings.sharedHourAbbreviation + ' ' + minutes + ' ' + Strings.sharedMinuteAbbreviation); + minutes = Math.round(value % 3600000 / 60000); + return hours + ' ' + Strings.sharedHourAbbreviation + ' ' + minutes + ' ' + Strings.sharedMinuteAbbreviation; }, deviceIdFormatter: function (value) { @@ -72,6 +73,7 @@ Ext.define('Traccar.AttributeFormatter', { group = store.getById(value); return group ? group.get('name') : value; } + return null; }, geofenceIdFormatter: function (value) { @@ -84,6 +86,7 @@ Ext.define('Traccar.AttributeFormatter', { geofence = store.getById(value); return geofence ? geofence.get('name') : ''; } + return null; }, driverUniqueIdFormatter: function (value) { @@ -96,11 +99,11 @@ Ext.define('Traccar.AttributeFormatter', { driver = store.findRecord('uniqueId', value, 0, false, true, true); return driver ? value + ' (' + driver.get('name') + ')' : value; } + return null; }, lastUpdateFormatter: function (value) { var seconds, interval; - if (value) { seconds = Math.floor((new Date() - value) / 1000); if (seconds < 0) { @@ -116,6 +119,7 @@ Ext.define('Traccar.AttributeFormatter', { } return Math.floor(seconds / 60) + ' ' + Strings.sharedMinutes; } + return null; }, defaultFormatter: function (value) { @@ -180,26 +184,24 @@ Ext.define('Traccar.AttributeFormatter', { var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key); if (!dataType) { return this.defaultFormatter; + } else if (dataType === 'distance') { + return this.distanceFormatter; + } else if (dataType === 'speed') { + return this.speedFormatter; + } else if (dataType === 'driverUniqueId') { + return this.driverUniqueIdFormatter; + } else if (dataType === 'voltage') { + return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedVoltAbbreviation); + } else if (dataType === 'percentage') { + return this.numberFormatterFactory(Traccar.Style.numberPrecision, '%'); + } else if (dataType === 'temperature') { + return this.numberFormatterFactory(Traccar.Style.numberPrecision, '°C'); + } else if (dataType === 'volume') { + return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterAbbreviation); + } else if (dataType === 'consumption') { + return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterPerHourAbbreviation); } else { - if (dataType === 'distance') { - return this.distanceFormatter; - } else if (dataType === 'speed') { - return this.speedFormatter; - } else if (dataType === 'driverUniqueId') { - return this.driverUniqueIdFormatter; - } else if (dataType === 'voltage') { - return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedVoltAbbreviation); - } else if (dataType === 'percentage') { - return this.numberFormatterFactory(Traccar.Style.numberPrecision, '%'); - } else if (dataType === 'temperature') { - return this.numberFormatterFactory(Traccar.Style.numberPrecision, '°C'); - } else if (dataType === 'volume') { - return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterAbbreviation); - } else if (dataType === 'consumption') { - return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterPerHourAbbreviation); - } else { - return this.defaultFormatter; - } + return this.defaultFormatter; } }, @@ -209,16 +211,14 @@ Ext.define('Traccar.AttributeFormatter', { return function (value) { return value; }; + } else if (dataType === 'distance') { + return this.distanceConverter; + } else if (dataType === 'speed') { + return this.speedConverter; } else { - if (dataType === 'distance') { - return this.distanceConverter; - } else if (dataType === 'speed') { - return this.speedConverter; - } else { - return function (value) { - return value; - }; - } + return function (value) { + return value; + }; } } }); diff --git a/web/app/DeviceImages.js b/web/app/DeviceImages.js index e58c4f6..af45ce9 100644 --- a/web/app/DeviceImages.js +++ b/web/app/DeviceImages.js @@ -39,7 +39,7 @@ Ext.define('Traccar.DeviceImages', { svg.getElementById(fill[i]).style.fill = color; } - rotateTransform = 'rotate(' + angle + ' ' + (width / 2) + ' ' + (height / 2) + ')'; + rotateTransform = 'rotate(' + angle + ' ' + width / 2 + ' ' + height / 2 + ')'; svg.getElementById(info.get('rotateId')).setAttribute('transform', rotateTransform); if (zoom) { @@ -85,7 +85,7 @@ Ext.define('Traccar.DeviceImages', { width = parseFloat(svg.documentElement.getAttribute('width')); height = parseFloat(svg.documentElement.getAttribute('height')); - image = new ol.style.Icon({ + image = new ol.style.Icon({ imgSize: [width, height], src: this.formatSrc(svg) }); diff --git a/web/app/GeofenceConverter.js b/web/app/GeofenceConverter.js index 0abefbc..4891e7b 100644 --- a/web/app/GeofenceConverter.js +++ b/web/app/GeofenceConverter.js @@ -19,10 +19,10 @@ Ext.define('Traccar.GeofenceConverter', { singleton: true, wktToGeometry: function (mapView, wkt) { - var geometry, projection, resolutionAtEquator, pointResolution, resolutionFactor, points = [], center, radius, - content, i, lat, lon, coordinates; + var geometry, projection, resolutionAtEquator, pointResolution, resolutionFactor, + points = [], center, radius, content, i, lat, lon, coordinates; if (wkt.lastIndexOf('POLYGON', 0) === 0) { - content = wkt.match(/\([^\(\)]+\)/); + content = wkt.match(/\([^()]+\)/); if (content !== null) { coordinates = content[0].match(/-?\d+\.?\d*/g); if (coordinates !== null) { @@ -36,7 +36,7 @@ Ext.define('Traccar.GeofenceConverter', { } } } else if (wkt.lastIndexOf('CIRCLE', 0) === 0) { - content = wkt.match(/\([^\(\)]+\)/); + content = wkt.match(/\([^()]+\)/); if (content !== null) { coordinates = content[0].match(/-?\d+\.?\d*/g); if (coordinates !== null) { @@ -45,12 +45,12 @@ Ext.define('Traccar.GeofenceConverter', { resolutionAtEquator = mapView.getResolution(); pointResolution = ol.proj.getPointResolution(projection, resolutionAtEquator, center); resolutionFactor = resolutionAtEquator / pointResolution; - radius = (Number(coordinates[2]) / ol.proj.METERS_PER_UNIT.m) * resolutionFactor; + radius = Number(coordinates[2]) / ol.proj.METERS_PER_UNIT.m * resolutionFactor; geometry = new ol.geom.Circle(center, radius); } } } else if (wkt.lastIndexOf('LINESTRING', 0) === 0) { - content = wkt.match(/\([^\(\)]+\)/); + content = wkt.match(/\([^()]+\)/); if (content !== null) { coordinates = content[0].match(/-?\d+\.?\d*/g); if (coordinates !== null) { @@ -79,7 +79,7 @@ Ext.define('Traccar.GeofenceConverter', { ol.proj.transform(edgeCoordinate, projection, 'EPSG:4326')); result = 'CIRCLE ('; result += center[1] + ' ' + center[0] + ', '; - result += Number((groundRadius).toFixed(1)) + ')'; + result += groundRadius.toFixed(1) + ')'; } else if (geometry instanceof ol.geom.Polygon) { geometry.transform(projection, 'EPSG:4326'); points = geometry.getCoordinates(); diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js index baba68a..9262011 100644 --- a/web/app/controller/Root.js +++ b/web/app/controller/Root.js @@ -52,6 +52,7 @@ Ext.define('Traccar.controller.Root', { if (value !== undefined) { return Traccar.AttributeFormatter.getAttributeConverter(this.attributeKey)(value); } + return null; }, onLaunch: function () { @@ -162,7 +163,7 @@ Ext.define('Traccar.controller.Root', { pathname = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1); socket = new WebSocket(protocol + '//' + window.location.host + pathname + 'api/socket'); - socket.onclose = function (event) { + socket.onclose = function () { Traccar.app.showToast(Strings.errorSocket, Strings.errorTitle); Ext.Ajax.request({ @@ -291,7 +292,10 @@ Ext.define('Traccar.controller.Root', { if (success) { for (i = 0; i < records.length; i++) { value = records[i].get('type'); - store.add({type: value, name: Traccar.app.getEventString(value)}); + store.add({ + type: value, + name: Traccar.app.getEventString(value) + }); } } } diff --git a/web/app/model/Event.js b/web/app/model/Event.js index 9455b0d..966cd60 100644 --- a/web/app/model/Event.js +++ b/web/app/model/Event.js @@ -52,15 +52,15 @@ Ext.define('Traccar.model.Event', { } else if (rec.get('type') === 'textMessage') { text = Strings.eventTextMessage + ': ' + rec.get('attributes')['message']; } else if (rec.get('type') === 'driverChanged') { - text = Strings.eventDriverChanged + ': ' + Traccar.AttributeFormatter.driverUniqueIdFormatter( - rec.get('attributes')['driverUniqueId']); + text = Strings.eventDriverChanged + ': ' + + Traccar.AttributeFormatter.driverUniqueIdFormatter(rec.get('attributes')['driverUniqueId']); } else { text = Traccar.app.getEventString(rec.get('type')); } if (rec.get('geofenceId')) { geofence = Ext.getStore('Geofences').getById(rec.get('geofenceId')); if (geofence) { - text += ' \"' + geofence.get('name') + '"'; + text += ' "' + geofence.get('name') + '"'; } } return text; diff --git a/web/app/store/AllNotifications.js b/web/app/store/AllNotifications.js index f25aebc..61aa75a 100644 --- a/web/app/store/AllNotifications.js +++ b/web/app/store/AllNotifications.js @@ -27,5 +27,8 @@ Ext.define('Traccar.store.AllNotifications', { } }, sortOnLoad: true, - sorters: { property: 'type', direction : 'ASC' } + sorters: { + property: 'type', + direction: 'ASC' + } }); diff --git a/web/app/store/AllTimezones.js b/web/app/store/AllTimezones.js index e5a861b..2a7fa37 100644 --- a/web/app/store/AllTimezones.js +++ b/web/app/store/AllTimezones.js @@ -21,7 +21,7 @@ Ext.define('Traccar.store.AllTimezones', { sorters: { property: 'key', - direction : 'ASC' + direction: 'ASC' }, data: [{ diff --git a/web/app/store/CommandTypes.js b/web/app/store/CommandTypes.js index 445f937..a14dd58 100644 --- a/web/app/store/CommandTypes.js +++ b/web/app/store/CommandTypes.js @@ -41,7 +41,7 @@ Ext.define('Traccar.store.CommandTypes', { } }, listeners: { - 'exception' : function (proxy, response) { + 'exception': function (proxy, response) { Traccar.app.showError(response); } } diff --git a/web/app/store/Notifications.js b/web/app/store/Notifications.js index d79702f..a672fd4 100644 --- a/web/app/store/Notifications.js +++ b/web/app/store/Notifications.js @@ -24,5 +24,8 @@ Ext.define('Traccar.store.Notifications', { url: 'api/users/notifications' }, sortOnLoad: true, - sorters: { property: 'type', direction : 'ASC' } + sorters: { + property: 'type', + direction: 'ASC' + } }); diff --git a/web/app/store/PositionAttributes.js b/web/app/store/PositionAttributes.js index c3d6d18..e457daf 100644 --- a/web/app/store/PositionAttributes.js +++ b/web/app/store/PositionAttributes.js @@ -240,14 +240,12 @@ Ext.define('Traccar.store.PositionAttributes', { var model = this.getById(key); if (model) { return model.get('name'); + } else if (capitalize) { + return key.replace(/^./, function (match) { + return match.toUpperCase(); + }); } else { - if (capitalize) { - return key.replace(/^./, function (match) { - return match.toUpperCase(); - }); - } else { - return key; - } + return key; } }, diff --git a/web/app/view/ArrayListFilter.js b/web/app/view/ArrayListFilter.js index cea748a..b6c1512 100644 --- a/web/app/view/ArrayListFilter.js +++ b/web/app/view/ArrayListFilter.js @@ -34,10 +34,8 @@ Ext.define('Traccar.view.ArrayListFilter', { return true; } } - } else { - if (value.indexOf(property) !== -1) { - return true; - } + } else if (value.indexOf(property) !== -1) { + return true; } return false; }); diff --git a/web/app/view/CustomNumberField.js b/web/app/view/CustomNumberField.js index e116e93..887e5c9 100644 --- a/web/app/view/CustomNumberField.js +++ b/web/app/view/CustomNumberField.js @@ -37,7 +37,7 @@ Ext.define('Traccar.view.CustomNumberField', { } else if (config.dataType === 'distance') { config.beforeSubTpl = this.beforeEl; unit = Traccar.app.getPreference('distanceUnit', 'km'); - config.afterSubTpl = this.unitEl + Ext.getStore('DistanceUnits').findRecord('key', unit).get('name') + ''; + config.afterSubTpl = this.unitEl + Ext.getStore('DistanceUnits').findRecord('key', unit).get('name') + ''; config.rawToValue = function (rawValue) { return Ext.getStore('DistanceUnits').convertValue(rawValue, Traccar.app.getPreference('distanceUnit', 'km'), true); }; diff --git a/web/app/view/EventsController.js b/web/app/view/EventsController.js index 62af967..8eb4363 100644 --- a/web/app/view/EventsController.js +++ b/web/app/view/EventsController.js @@ -46,7 +46,7 @@ Ext.define('Traccar.view.EventsController', { } }, - onRemoveClick: function (button) { + onRemoveClick: function () { var event, positionId; event = this.getView().getSelectionModel().getSelection()[0]; if (event) { @@ -58,12 +58,12 @@ Ext.define('Traccar.view.EventsController', { } }, - onClearClick: function (button) { + onClearClick: function () { Ext.getStore('Events').removeAll(); Ext.getStore('EventPositions').removeAll(); }, - onAddEvent: function (store, data) { + onAddEvent: function () { if (this.lookupReference('scrollToLastButton').pressed) { this.getView().scrollBy(0, Number.POSITIVE_INFINITY, true); } diff --git a/web/app/view/MainController.js b/web/app/view/MainController.js index 76645e4..1a2fe91 100644 --- a/web/app/view/MainController.js +++ b/web/app/view/MainController.js @@ -21,6 +21,6 @@ Ext.define('Traccar.view.MainController', { init: function () { this.lookupReference('reportView').setHidden( - Traccar.app.getAttributePreference('ui.disableReport', false).toString() === 'true'); + Traccar.app.getAttributePreference('ui.disableReport', false).toString() === 'true'); } }); diff --git a/web/app/view/NotificationsController.js b/web/app/view/NotificationsController.js index f50e8d8..651f57f 100644 --- a/web/app/view/NotificationsController.js +++ b/web/app/view/NotificationsController.js @@ -27,7 +27,7 @@ Ext.define('Traccar.view.NotificationsController', { }); }, - onCheckChange: function (column, rowIndex, checked, eOpts) { + onCheckChange: function (column, rowIndex) { var record = this.getView().getStore().getAt(rowIndex); Ext.Ajax.request({ scope: this, diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js index 5850086..4d2c9b3 100644 --- a/web/app/view/ReportController.js +++ b/web/app/view/ReportController.js @@ -117,7 +117,7 @@ Ext.define('Traccar.view.ReportController', { updateButtons: function () { var reportType, disabled, devices, time; reportType = this.lookupReference('reportTypeField').getValue(); - devices = (this.deviceId && this.deviceId.length !== 0) || (this.groupId && this.groupId.length !== 0); + devices = this.deviceId && this.deviceId.length !== 0 || this.groupId && this.groupId.length !== 0; time = this.fromDate && this.fromTime && this.toDate && this.toTime; disabled = !reportType || !devices || !time; this.lookupReference('showButton').setDisabled(disabled); @@ -204,7 +204,7 @@ Ext.define('Traccar.view.ReportController', { } }, - selectReport: function (object, center) { + selectReport: function (object) { var positionRelated, reportType = this.lookupReference('reportTypeField').getValue(); if (object instanceof Traccar.model.Position) { if (reportType === 'route') { @@ -281,15 +281,15 @@ Ext.define('Traccar.view.ReportController', { var i, deviceIds, chartSeries, deviceStore; if (this.lookupReference('reportTypeField').getValue() === 'chart') { this.getChart().getAxes()[0].setTitle( - Ext.getStore('ReportChartTypes').findRecord('key', this.chartType).get('name')); + Ext.getStore('ReportChartTypes').findRecord('key', this.chartType).get('name')); chartSeries = []; deviceIds = store.collect('deviceId'); for (i = 0; i < deviceIds.length; i++) { - deviceStore = new Ext.create('Ext.data.ChainedStore', { + deviceStore = Ext.create('Ext.data.ChainedStore', { source: 'ReportRoute', filters: [{ property: 'deviceId', - value : deviceIds[i] + value: deviceIds[i] }] }); chartSeries.push({ diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 102120d..d435e35 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -58,7 +58,7 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsCalendarsButton').setHidden(false); this.lookupReference('settingsDriversButton').setHidden(false); } - if (admin || (!deviceReadonly && !readonly)) { + if (admin || !deviceReadonly && !readonly) { this.lookupReference('settingsAttributeAliasesButton').setHidden(false); this.lookupReference('settingsComputedAttributesButton').setHidden(false); } diff --git a/web/app/view/StateController.js b/web/app/view/StateController.js index 23369b8..95f5f55 100644 --- a/web/app/view/StateController.js +++ b/web/app/view/StateController.js @@ -20,12 +20,11 @@ Ext.define('Traccar.view.StateController', { alias: 'controller.state', requires: [ - 'Traccar.AttributeFormatter', - 'Traccar.model.Attribute', - 'Traccar.model.AttributeAlias', - 'Traccar.model.Position', - 'Traccar.view.dialog.AttributeAlias' - + 'Traccar.AttributeFormatter', + 'Traccar.model.Attribute', + 'Traccar.model.AttributeAlias', + 'Traccar.model.Position', + 'Traccar.view.dialog.AttributeAlias' ], config: { @@ -73,7 +72,7 @@ Ext.define('Traccar.view.StateController', { }; } return result; - }()), + })(), updateLatest: function (store, data) { var i; @@ -89,7 +88,7 @@ Ext.define('Traccar.view.StateController', { }, formatValue: function (value) { - if (typeof (id) === 'number') { + if (typeof id === 'number') { return Number(value.toFixed(2)); } else { return value; @@ -169,7 +168,7 @@ Ext.define('Traccar.view.StateController', { Ext.getStore('Attributes').removeAll(); }, - clearReport: function (store) { + clearReport: function () { if (!this.deviceId) { this.position = null; Ext.getStore('Attributes').removeAll(); diff --git a/web/app/view/dialog/CalendarController.js b/web/app/view/dialog/CalendarController.js index 14d8294..54dc7a3 100644 --- a/web/app/view/dialog/CalendarController.js +++ b/web/app/view/dialog/CalendarController.js @@ -26,7 +26,7 @@ Ext.define('Traccar.view.dialog.CalendarController', { reader = new FileReader(); reader.onload = function (event) { fileField.up('window').lookupReference('dataField').setValue( - btoa(String.fromCharCode.apply(null, new Uint8Array(event.target.result)))); + btoa(String.fromCharCode.apply(null, new Uint8Array(event.target.result)))); }; reader.onerror = function (event) { Traccar.app.showError(event.target.error); diff --git a/web/app/view/dialog/CommandController.js b/web/app/view/dialog/CommandController.js index 485d994..3fdc7b0 100644 --- a/web/app/view/dialog/CommandController.js +++ b/web/app/view/dialog/CommandController.js @@ -97,6 +97,8 @@ Ext.define('Traccar.view.dialog.CommandController', { data: value }); break; + default: + break; } Ext.Ajax.request({ diff --git a/web/app/view/dialog/LoginController.js b/web/app/view/dialog/LoginController.js index 1b5cd07..c25d9a8 100644 --- a/web/app/view/dialog/LoginController.js +++ b/web/app/view/dialog/LoginController.js @@ -86,14 +86,12 @@ Ext.define('Traccar.view.dialog.LoginController', { prefix = url.substring(0, url.indexOf(paramName)); suffix = url.substring(url.indexOf(paramName)); suffix = suffix.substring(suffix.indexOf('=') + 1); - suffix = (suffix.indexOf('&') >= 0) ? suffix.substring(suffix.indexOf('&')) : ''; + suffix = suffix.indexOf('&') >= 0 ? suffix.substring(suffix.indexOf('&')) : ''; url = prefix + paramName + '=' + paramValue + suffix; + } else if (url.indexOf('?') < 0) { + url += '?' + paramName + '=' + paramValue; } else { - if (url.indexOf('?') < 0) { - url += '?' + paramName + '=' + paramValue; - } else { - url += '&' + paramName + '=' + paramValue; - } + url += '&' + paramName + '=' + paramValue; } window.location.href = url; }, diff --git a/web/app/view/dialog/MapPickerController.js b/web/app/view/dialog/MapPickerController.js index 23f60ec..8641e37 100644 --- a/web/app/view/dialog/MapPickerController.js +++ b/web/app/view/dialog/MapPickerController.js @@ -30,7 +30,7 @@ Ext.define('Traccar.view.dialog.MapPickerController', { } }, - getMapState: function (button) { + getMapState: function () { this.fireEvent('mapstaterequest'); }, diff --git a/web/app/view/edit/AttributeAliasesController.js b/web/app/view/edit/AttributeAliasesController.js index d1beb13..8ac68bc 100644 --- a/web/app/view/edit/AttributeAliasesController.js +++ b/web/app/view/edit/AttributeAliasesController.js @@ -61,13 +61,13 @@ Ext.define('Traccar.view.edit.AttributeAliasesController', { this.lookupReference('toolbarRemoveButton').setDisabled(disabled); }, - onDeviceChange: function (combobox, newValue, oldValue) { + onDeviceChange: function (combobox, value) { var manager = Traccar.app.getUser().get('admin') || Traccar.app.getUser().get('userLimit') > 0; this.onSelectionChange(); - if (newValue !== null) { - this.getView().getStore().filter('deviceId', newValue); + if (value !== null) { + this.getView().getStore().filter('deviceId', value); if (manager && this.getView().getStore().getCount() === 0) { - Ext.getStore('AttributeAliases').getProxy().setExtraParam('deviceId', newValue); + Ext.getStore('AttributeAliases').getProxy().setExtraParam('deviceId', value); Ext.getStore('AttributeAliases').load({ addRecords: true }); diff --git a/web/app/view/edit/Attributes.js b/web/app/view/edit/Attributes.js index 84cadea..a76223b 100644 --- a/web/app/view/edit/Attributes.js +++ b/web/app/view/edit/Attributes.js @@ -46,7 +46,7 @@ Ext.define('Traccar.view.edit.Attributes', { text: Strings.sharedName, dataIndex: 'name', filter: 'string', - renderer: function (value, metaData) { + renderer: function (value) { var attribute; if (this.attributesStore) { attribute = Ext.getStore(this.attributesStore).getById(value); diff --git a/web/app/view/edit/Devices.js b/web/app/view/edit/Devices.js index c9538c8..4fdcab0 100644 --- a/web/app/view/edit/Devices.js +++ b/web/app/view/edit/Devices.js @@ -111,6 +111,7 @@ Ext.define('Traccar.view.edit.Devices', { if (status) { return Ext.getStore('DeviceStatuses').getById(status).get('color'); } + return null; } }, @@ -165,7 +166,7 @@ Ext.define('Traccar.view.edit.Devices', { for (i = 0; i < value.length; i++) { name = Traccar.AttributeFormatter.geofenceIdFormatter(value[i]); if (name) { - result += name + ((i < value.length - 1) ? ', ' : ''); + result += name + (i < value.length - 1 ? ', ' : ''); } } } @@ -187,6 +188,7 @@ Ext.define('Traccar.view.edit.Devices', { return status.get('name'); } } + return null; } }, { text: Strings.deviceLastUpdate, diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js index ae65fbb..6de2498 100644 --- a/web/app/view/edit/DevicesController.js +++ b/web/app/view/edit/DevicesController.js @@ -151,7 +151,7 @@ Ext.define('Traccar.view.edit.DevicesController', { } }, - selectDevice: function (device, center) { + selectDevice: function (device) { this.getView().getSelectionModel().select([device], false, true); this.updateButtons(this.getView().getSelectionModel()); this.getView().getView().focusRow(device); @@ -163,7 +163,7 @@ Ext.define('Traccar.view.edit.DevicesController', { } }, - onUpdateDevice: function (store, data) { + onUpdateDevice: function () { this.updateButtons(this.getView().getSelectionModel()); }, diff --git a/web/app/view/map/BaseMap.js b/web/app/view/map/BaseMap.js index c4297f6..5829cac 100644 --- a/web/app/view/map/BaseMap.js +++ b/web/app/view/map/BaseMap.js @@ -95,10 +95,10 @@ Ext.define('Traccar.view.map.BaseMap', { index = index < 0 ? index + urlsLength : index; if (x < 0) { - x = 'M' + (-x); + x = 'M' + -x; } if (y < 0) { - y = 'M' + (-y); + y = 'M' + -y; } return 'http://online{}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl' .replace('{}', index).replace('{x}', x).replace('{y}', y).replace('{z}', z); @@ -171,7 +171,7 @@ Ext.define('Traccar.view.map.BaseMap', { } this.map.on('pointermove', function (e) { - var hit = this.forEachFeatureAtPixel(e.pixel, function (feature, layer) { + var hit = this.forEachFeatureAtPixel(e.pixel, function () { return true; }); if (hit) { @@ -187,7 +187,7 @@ Ext.define('Traccar.view.map.BaseMap', { return !layer.get('name'); } })) { - this.map.forEachFeatureAtPixel(e.pixel, function (feature, layer) { + this.map.forEachFeatureAtPixel(e.pixel, function (feature) { this.fireEvent('selectfeature', feature); }.bind(this)); } else { @@ -206,9 +206,7 @@ Ext.define('Traccar.view.map.BaseMap', { } } }, function () { - proj4.defs('BD-MC', '+proj=merc +lon_0=0 +units=m +ellps=clrk66 +no_defs'); proj4.defs('EPSG:3395', '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs'); ol.proj.get('EPSG:3395').setExtent([-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]); - }); diff --git a/web/app/view/map/MapController.js b/web/app/view/map/MapController.js index f2a561a..d8d2f04 100644 --- a/web/app/view/map/MapController.js +++ b/web/app/view/map/MapController.js @@ -79,10 +79,10 @@ Ext.define('Traccar.view.map.MapController', { this.getView().getGeofencesSource().clear(); if (this.lookupReference('showGeofencesButton').pressed) { Ext.getStore('Geofences').each(function (geofence) { - var feature = new ol.Feature(Traccar.GeofenceConverter - .wktToGeometry(this.getView().getMapView(), geofence.get('area'))); - feature.setStyle(this.getAreaStyle(geofence.get('name'), - geofence.get('attributes') ? geofence.get('attributes').color : null)); + var feature = new ol.Feature( + Traccar.GeofenceConverter.wktToGeometry(this.getView().getMapView(), geofence.get('area'))); + feature.setStyle(this.getAreaStyle( + geofence.get('name'), geofence.get('attributes') ? geofence.get('attributes').color : null)); this.getView().getGeofencesSource().addFeature(feature); return true; }, this); diff --git a/web/app/view/map/MapMarkerController.js b/web/app/view/map/MapMarkerController.js index 24742ff..d3b813b 100644 --- a/web/app/view/map/MapMarkerController.js +++ b/web/app/view/map/MapMarkerController.js @@ -211,7 +211,7 @@ Ext.define('Traccar.view.map.MapMarkerController', { projection = mapView.getProjection(); center = ol.proj.fromLonLat([position.get('longitude'), position.get('latitude')]); pointResolution = ol.proj.getPointResolution(projection, mapView.getResolution(), center); - radius = (position.get('accuracy') / ol.proj.METERS_PER_UNIT.m) * mapView.getResolution() / pointResolution; + radius = position.get('accuracy') / ol.proj.METERS_PER_UNIT.m * mapView.getResolution() / pointResolution; if (feature) { feature.getGeometry().setCenter(center); @@ -252,8 +252,8 @@ Ext.define('Traccar.view.map.MapMarkerController', { marker.set('record', device); style = this.getLatestMarker(this.getDeviceColor(device), - position.get('course'), - device.get('category')); + position.get('course'), + device.get('category')); style.getText().setText(device.get('name')); marker.setStyle(style); marker.setId(device.get('id')); @@ -405,7 +405,7 @@ Ext.define('Traccar.view.map.MapMarkerController', { width: Traccar.Style.mapTextStrokeWidth }), offsetY: -image.getSize()[1] / 2 - Traccar.Style.mapTextOffset, - font : Traccar.Style.mapTextFont + font: Traccar.Style.mapTextFont }) }); }, @@ -420,10 +420,8 @@ Ext.define('Traccar.view.map.MapMarkerController', { resizeMarker: function (style, zoom) { var image, text; - image = Traccar.DeviceImages.getImageIcon(style.getImage().fill, - zoom, - style.getImage().angle, - style.getImage().category); + image = Traccar.DeviceImages.getImageIcon( + style.getImage().fill, zoom, style.getImage().angle, style.getImage().category); text = style.getText(); text.setOffsetY(-image.getSize()[1] / 2 - Traccar.Style.mapTextOffset); style.setText(text); @@ -431,18 +429,14 @@ Ext.define('Traccar.view.map.MapMarkerController', { }, rotateMarker: function (style, angle) { - style.setImage(Traccar.DeviceImages.getImageIcon(style.getImage().fill, - style.getImage().zoom, - angle, - style.getImage().category)); + style.setImage(Traccar.DeviceImages.getImageIcon( + style.getImage().fill, style.getImage().zoom, angle, style.getImage().category)); }, updateDeviceMarker: function (style, color, category) { var image, text; - image = Traccar.DeviceImages.getImageIcon(color, - style.getImage().zoom, - style.getImage().angle, - category); + image = Traccar.DeviceImages.getImageIcon( + color, style.getImage().zoom, style.getImage().angle, category); text = style.getText(); text.setOffsetY(-image.getSize()[1] / 2 - Traccar.Style.mapTextOffset); style.setText(text); @@ -599,7 +593,7 @@ Ext.define('Traccar.view.map.MapMarkerController', { } }, - filterDevices: function (store) { + filterDevices: function () { Ext.getStore('Devices').each(this.updateDeviceVisibility, this, false); } }); diff --git a/web/app/view/permissions/BaseController.js b/web/app/view/permissions/BaseController.js index 860a29b..5cb9c30 100644 --- a/web/app/view/permissions/BaseController.js +++ b/web/app/view/permissions/BaseController.js @@ -24,11 +24,11 @@ Ext.define('Traccar.view.permissions.BaseController', { params[this.getView().baseObjectName] = this.getView().baseObject; linkStoreName = this.getView().linkStoreName; storeName = this.getView().storeName; - linkStoreName = (typeof linkStoreName === 'undefined') ? storeName : linkStoreName; + linkStoreName = typeof linkStoreName === 'undefined' ? storeName : linkStoreName; this.getView().setStore(Ext.getStore(storeName)); this.getView().getStore().load({ scope: this, - callback: function (records, operation, success) { + callback: function () { var linkStore = Ext.create('Traccar.store.' + linkStoreName); linkStore.load({ params: params, @@ -47,7 +47,7 @@ Ext.define('Traccar.view.permissions.BaseController', { }); }, - onBeforeSelect: function (selection, record, index) { + onBeforeSelect: function (selection, record) { var data = {}; data[this.getView().baseObjectName] = this.getView().baseObject; data[this.getView().linkObjectName] = record.getId(); @@ -64,7 +64,7 @@ Ext.define('Traccar.view.permissions.BaseController', { }); }, - onBeforeDeselect: function (selection, record, index) { + onBeforeDeselect: function (selection, record) { var data = {}; data[this.getView().baseObjectName] = this.getView().baseObject; data[this.getView().linkObjectName] = record.getId(); -- cgit v1.2.3 From adacb40ad63c462e93c8a175c6da56c823446ec3 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 18 Aug 2017 11:46:57 +1200 Subject: Implement eslint configuration --- .eslintignore | 2 ++ .gitignore | 2 ++ .travis.yml | 4 +++ package.json | 70 ++++++++++++++++++++++++++++++++++++++++++ web/.eslintignore | 2 -- web/.eslintrc.json | 89 ------------------------------------------------------ web/.jscsrc | 7 ----- web/.jshintignore | 2 -- web/.jshintrc | 76 ---------------------------------------------- 9 files changed, 78 insertions(+), 176 deletions(-) create mode 100644 .eslintignore create mode 100644 .travis.yml create mode 100644 package.json delete mode 100644 web/.eslintignore delete mode 100644 web/.eslintrc.json delete mode 100644 web/.jscsrc delete mode 100644 web/.jshintignore delete mode 100644 web/.jshintrc diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..c3577ef --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +web/simple/app.js +web/load.js diff --git a/.gitignore b/.gitignore index c0913c4..d395d2e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ nbproject/ web/app.min.js sencha-error-* +node_modules +package-lock.json diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..354951d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: node_js + +script: + - npm run lint diff --git a/package.json b/package.json new file mode 100644 index 0000000..d313631 --- /dev/null +++ b/package.json @@ -0,0 +1,70 @@ +{ + "name": "traccar-web", + "devDependencies": { + "eslint": "^4.4.1" + }, + "scripts": { + "lint": "./node_modules/.bin/eslint web/." + }, + "eslintConfig": { + "extends": "eslint:all", + "env": { + "browser": true + }, + "globals": { + "Ext": false, + "ol": false, + "Traccar": false, + "Strings": false, + "Locale": false, + "proj4": false, + "Uint8Array": false + }, + "rules": { + "strict": "off", + "max-lines": ["error", 1000], + "max-len": ["error", 180], + "max-statements": ["error", 35], + "max-params": ["error", 5], + "indent": ["error", 4, { + "SwitchCase": 1 + }], + "quotes": ["error", "single"], + "padded-blocks": ["error", "never"], + "dot-location": ["error", "property"], + "wrap-iife": ["error", "inside"], + "dot-notation": "off", + "array-bracket-newline": "off", + "array-element-newline": "off", + "sort-keys": "off", + "sort-vars": "off", + "no-magic-numbers": "off", + "no-mixed-operators": "off", + "prefer-template": "off", + "newline-per-chained-call": "off", + "object-shorthand": "off", + "func-names": "off", + "init-declarations": "off", + "no-var": "off", + "id-length": "off", + "no-undefined": "off", + "object-curly-newline": "off", + "prefer-destructuring": "off", + "no-plusplus": "off", + "no-param-reassign": "off", + "no-ternary": "off", + "multiline-ternary": "off", + "one-var-declaration-per-line": "off", + "no-shadow": "off", + "no-else-return": "off", + "consistent-this": "off", + "quote-props": "off", + "no-negated-condition": "off", + "prefer-arrow-callback": "off", + "no-prototype-builtins": "off", + "no-multi-assign": "off", + "no-bitwise": "off", + "prefer-rest-params": "off" + } + } +} diff --git a/web/.eslintignore b/web/.eslintignore deleted file mode 100644 index d40ab12..0000000 --- a/web/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -simple/app.js -load.js diff --git a/web/.eslintrc.json b/web/.eslintrc.json deleted file mode 100644 index 03de808..0000000 --- a/web/.eslintrc.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "extends": "crockford", - "env": { - "browser": true, - "node": true - }, - - // Custom Globals - "globals" : { - "Ext" : false, - "ol" : false, - "Traccar" : false, - "Strings" : false, - "Locale" : false, - "proj4" : false - }, - - "rules": { - "indent": ["error", 4, - { - "SwitchCase":1 - } - ], - "comma-spacing": [2, - { - "after": true - } - ], - "no-bitwise": 0, - "camelcase": 2, - "curly": 2, - "eqeqeq": 2, - "guard-for-in": 2, - "no-extend-native": 2, - "wrap-iife": [ - 2, - "any" - ], - "no-use-before-define": [ - 2, - { - "functions": false - } - ], - "new-cap": 2, - "no-caller": 2, - "no-empty": 2, - "no-irregular-whitespace": 2, - "no-new": 2, - "no-plusplus": 0, - "quotes": [ - 2, - "single" - ], - "no-undef": 2, - "no-unused-vars": 2, - "strict": 0, - "max-params": 0, - "max-depth": 0, - "max-statements": 0, - "complexity": 0, - "max-len": 0, - "no-var": 0, - "semi": 0, - "no-cond-assign": 0, - "no-debugger": 0, - "no-eq-null": 0, - "no-eval": 0, - "no-unused-expressions": 0, - "block-scoped-var": 0, - "no-iterator": 0, - "linebreak-style": 0, - "comma-style": [ - 2, - "last" - ], - "no-loop-func": 0, - "no-multi-str": 0, - "require-yield": 0, - "valid-typeof": 0, - "no-proto": 0, - "no-script-url": 0, - "no-shadow": 2, - "dot-notation": 0, - "no-new-func": 0, - "no-new-wrappers": 0, - "no-invalid-this": 0 - } -} \ No newline at end of file diff --git a/web/.jscsrc b/web/.jscsrc deleted file mode 100644 index c20bcf0..0000000 --- a/web/.jscsrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "preset": "crockford", - "maxErrors": 100, - "excludeFiles": ["simple/app.js"], - "requireDotNotation": false, - "requireSpaceAfterComma": true -} diff --git a/web/.jshintignore b/web/.jshintignore deleted file mode 100644 index 0a20d51..0000000 --- a/web/.jshintignore +++ /dev/null @@ -1,2 +0,0 @@ -locale.js -simple/app.js diff --git a/web/.jshintrc b/web/.jshintrc deleted file mode 100644 index 67329cd..0000000 --- a/web/.jshintrc +++ /dev/null @@ -1,76 +0,0 @@ -{ - // Enforcing - "bitwise" : false, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : true, // true: Identifiers must be in camelCase - "curly" : true, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. - "immed" : true, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 4, // {int} Number of spaces to use for indentation - "latedef" : true, // true: Require variables/functions to be defined before being used - "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. - "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` and `--` - "quotmark" : "single", // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : "vars", // Unused variables: - // true : all variables, last function parameter - // "vars" : all variables only - // "strict" : all variables, all function parameters - "strict" : false, // true: Requires all functions run in ES5 Strict Mode - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : false, // {int} Max number of characters per line - "varstmt" : false, // true: Disallow any var statements. Only `let` and `const` are allowed. - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements - "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "noyield" : false, // true: Tolerate generator functions with no yield statement in them. - "notypeof" : false, // true: Tolerate invalid typeof operator values - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : true, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "devel" : true, // Development/debugging (alert, confirm, etc) - "node" : true, // Node.js - - // Custom Globals - "globals" : { - "Ext" : false, - "ol" : false, - "Traccar" : false, - "Strings" : false, - "Locale" : false, - "proj4" : false - } -} -- cgit v1.2.3 From 431cfd99d31e665e023f395b3faac09ea08cf7e5 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 18 Aug 2017 11:49:49 +1200 Subject: Update travis config file --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 354951d..11a29eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: node_js +node_js: + - node script: - npm run lint -- cgit v1.2.3 From d2f7d47dfad47edd5bf604c76a20a130aa1cfee3 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 18 Aug 2017 11:52:01 +1200 Subject: Update readme file to show status --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 374dead..16e10ab 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # [Traccar Web Interface](https://www.traccar.org) +[![Build Status](https://travis-ci.org/tananaev/traccar-web.svg?branch=master)](https://travis-ci.org/tananaev/traccar-web) ## Overview -- cgit v1.2.3 From 7f290bf996e6a91b1c5d2b5d74318f9c7a246d75 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 18 Aug 2017 09:08:25 +0500 Subject: Optimize calendar load --- web/app/view/dialog/CalendarController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/app/view/dialog/CalendarController.js b/web/app/view/dialog/CalendarController.js index 54dc7a3..fb8cbff 100644 --- a/web/app/view/dialog/CalendarController.js +++ b/web/app/view/dialog/CalendarController.js @@ -26,12 +26,12 @@ Ext.define('Traccar.view.dialog.CalendarController', { reader = new FileReader(); reader.onload = function (event) { fileField.up('window').lookupReference('dataField').setValue( - btoa(String.fromCharCode.apply(null, new Uint8Array(event.target.result)))); + event.target.result.substr(event.target.result.indexOf(',') + 1)); }; reader.onerror = function (event) { Traccar.app.showError(event.target.error); }; - reader.readAsArrayBuffer(fileField.fileInputEl.dom.files[0]); + reader.readAsDataURL(fileField.fileInputEl.dom.files[0]); } } }); -- cgit v1.2.3 From 0ba681d5b99ec0145d621f2e2d24553f3ae3439b Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 18 Aug 2017 09:55:43 +0500 Subject: Remove Uint8Array exception --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index d313631..4862acf 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,7 @@ "Traccar": false, "Strings": false, "Locale": false, - "proj4": false, - "Uint8Array": false + "proj4": false }, "rules": { "strict": "off", -- cgit v1.2.3 From a2f24e445ef4c4c06a754b4538d51aec38e1dcbf Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 18 Aug 2017 13:53:13 +0500 Subject: Update openlayers to 4.3.1 --- web/app/view/map/BaseMap.js | 11 ++++++----- web/load.js | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/web/app/view/map/BaseMap.js b/web/app/view/map/BaseMap.js index 5829cac..91f3784 100644 --- a/web/app/view/map/BaseMap.js +++ b/web/app/view/map/BaseMap.js @@ -182,14 +182,15 @@ Ext.define('Traccar.view.map.BaseMap', { }); this.map.on('click', function (e) { - if (this.map.hasFeatureAtPixel(e.pixel, { + var i, features = this.map.getFeaturesAtPixel(e.pixel, { layerFilter: function (layer) { return !layer.get('name'); } - })) { - this.map.forEachFeatureAtPixel(e.pixel, function (feature) { - this.fireEvent('selectfeature', feature); - }.bind(this)); + }); + if (features) { + for (i = 0; i < features.length; i++) { + this.fireEvent('selectfeature', features[i]); + } } else { this.fireEvent('deselectfeature'); } diff --git a/web/load.js b/web/load.js index 1845cd1..8577280 100644 --- a/web/load.js +++ b/web/load.js @@ -136,7 +136,7 @@ extjsVersion = '6.2.0'; fontAwesomeVersion = '4.7.0'; - olVersion = '4.2.0'; + olVersion = '4.3.1'; proj4jsVersion = '2.4.3'; if (debugMode) { -- cgit v1.2.3 From d1d7d230a0262d9f6ae05f1c4c6718699edb8de3 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 18 Aug 2017 13:56:46 +0500 Subject: Fix style --- web/app/view/SettingsMenuController.js | 4 ++-- web/app/view/dialog/GeofenceController.js | 2 +- web/app/view/edit/DevicesController.js | 2 +- web/app/view/edit/GroupsController.js | 2 +- web/app/view/edit/UsersController.js | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 5454335..7985700 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -56,14 +56,14 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsGeofencesButton').setHidden(false); this.lookupReference('settingsNotificationsButton').setHidden(false); this.lookupReference('settingsCalendarsButton').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); + Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); this.lookupReference('settingsDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); } if (admin || !deviceReadonly && !readonly) { this.lookupReference('settingsAttributeAliasesButton').setHidden(false); this.lookupReference('settingsComputedAttributesButton').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); } }, diff --git a/web/app/view/dialog/GeofenceController.js b/web/app/view/dialog/GeofenceController.js index 2f96987..e4ac5a2 100644 --- a/web/app/view/dialog/GeofenceController.js +++ b/web/app/view/dialog/GeofenceController.js @@ -36,7 +36,7 @@ Ext.define('Traccar.view.dialog.GeofenceController', { init: function () { this.lookupReference('calendarCombo').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); + Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); }, saveArea: function (value) { diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js index ffe9c9a..9616dbd 100644 --- a/web/app/view/edit/DevicesController.js +++ b/web/app/view/edit/DevicesController.js @@ -64,7 +64,7 @@ Ext.define('Traccar.view.edit.DevicesController', { this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('toolbarAttributesButton').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); setInterval(function () { self.getView().getView().refresh(); diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js index f1da19c..d40c1e6 100644 --- a/web/app/view/edit/GroupsController.js +++ b/web/app/view/edit/GroupsController.js @@ -36,7 +36,7 @@ Ext.define('Traccar.view.edit.GroupsController', { this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('toolbarAttributesButton').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); }, onGeofencesClick: function () { diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js index 42fc0cd..8da5caa 100644 --- a/web/app/view/edit/UsersController.js +++ b/web/app/view/edit/UsersController.js @@ -44,9 +44,9 @@ Ext.define('Traccar.view.edit.UsersController', { this.lookupReference('userDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('userAttributesButton').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); this.lookupReference('userCalendarsButton').setHidden( - Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); + Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); }, onEditClick: function () { -- cgit v1.2.3 From f26159a40b3b23fbd63de312f121b1fe1bf64bd1 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 18 Aug 2017 15:40:39 +0500 Subject: - Detach common known attributes - Rename function --- web/app/Application.js | 4 ++- web/app/controller/Root.js | 7 ++++ web/app/store/CommonDeviceAttributes.js | 42 +++++++++++++++++++++++ web/app/store/CommonUserAttributes.js | 55 +++++++++++++++++++++++++++++++ web/app/store/DeviceAttributes.js | 20 ----------- web/app/store/GroupAttributes.js | 20 ----------- web/app/store/ServerAttributes.js | 50 +--------------------------- web/app/store/UserAttributes.js | 33 ------------------- web/app/view/ReportController.js | 2 +- web/app/view/SettingsMenuController.js | 6 ++-- web/app/view/edit/AttributesController.js | 1 + web/app/view/edit/DevicesController.js | 4 +-- web/app/view/edit/GroupsController.js | 4 +-- web/app/view/edit/UsersController.js | 4 +-- web/app/view/map/MapController.js | 4 +-- 15 files changed, 121 insertions(+), 135 deletions(-) create mode 100644 web/app/store/CommonDeviceAttributes.js create mode 100644 web/app/store/CommonUserAttributes.js diff --git a/web/app/Application.js b/web/app/Application.js index 3cee7b7..e0f0aa4 100644 --- a/web/app/Application.js +++ b/web/app/Application.js @@ -83,10 +83,12 @@ Ext.define('Traccar.Application', { 'AllTimezones', 'VisibleDevices', 'DeviceStatuses', + 'CommonDeviceAttributes', 'DeviceAttributes', 'GeofenceAttributes', 'GroupAttributes', 'ServerAttributes', + 'CommonUserAttributes', 'UserAttributes', 'ComputedAttributes', 'AllComputedAttributes', @@ -104,7 +106,7 @@ Ext.define('Traccar.Application', { return window.matchMedia && window.matchMedia('(max-width: 768px)').matches; }, - isVehicleFeaturesDisabled: function () { + getVehicleFeaturesDisabled: function () { return this.getBooleanAttributePreference('ui.disableVehicleFetures'); }, diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js index 9262011..1c70dd0 100644 --- a/web/app/controller/Root.js +++ b/web/app/controller/Root.js @@ -113,6 +113,13 @@ Ext.define('Traccar.controller.Root', { Ext.getStore('AttributeAliases').load(); Ext.getStore('ComputedAttributes').load(); this.initReportEventTypesStore(); + + Ext.getStore('ServerAttributes').loadData(Ext.getStore('CommonDeviceAttributes').getData().items, true); + Ext.getStore('ServerAttributes').loadData(Ext.getStore('CommonUserAttributes').getData().items, true); + Ext.getStore('UserAttributes').loadData(Ext.getStore('CommonUserAttributes').getData().items, true); + Ext.getStore('DeviceAttributes').loadData(Ext.getStore('CommonDeviceAttributes').getData().items, true); + Ext.getStore('GroupAttributes').loadData(Ext.getStore('CommonDeviceAttributes').getData().items, true); + Ext.getStore('Devices').load({ scope: this, callback: function () { diff --git a/web/app/store/CommonDeviceAttributes.js b/web/app/store/CommonDeviceAttributes.js new file mode 100644 index 0000000..83dd411 --- /dev/null +++ b/web/app/store/CommonDeviceAttributes.js @@ -0,0 +1,42 @@ +/* + * 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.store.CommonDeviceAttributes', { + extend: 'Ext.data.Store', + model: 'Traccar.model.KnownAttribute', + + data: [{ + key: 'speedLimit', + name: Strings.attributeSpeedLimit, + valueType: 'number', + dataType: 'speed' + }, { + key: 'report.ignoreOdometer', + name: Strings.attributeReportIgnoreOdometer, + valueType: 'boolean' + }, { + key: 'maintenance.start', + name: Strings.attributeMaintenanceStart, + valueType: 'number', + dataType: 'distance' + }, { + key: 'maintenance.interval', + name: Strings.attributeMaintenanceInterval, + valueType: 'number', + dataType: 'distance' + }] +}); diff --git a/web/app/store/CommonUserAttributes.js b/web/app/store/CommonUserAttributes.js new file mode 100644 index 0000000..85d652d --- /dev/null +++ b/web/app/store/CommonUserAttributes.js @@ -0,0 +1,55 @@ +/* + * 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.store.CommonUserAttributes', { + extend: 'Ext.data.Store', + model: 'Traccar.model.KnownAttribute', + + data: [{ + key: 'web.liveRouteLength', + name: Strings.attributeWebLiveRouteLength, + valueType: 'number', + allowDecimals: false + }, { + key: 'web.selectZoom', + name: Strings.attributeWebSelectZoom, + valueType: 'number', + allowDecimals: false, + minValue: Traccar.Style.mapDefaultZoom, + maxValue: Traccar.Style.mapMaxZoom + }, { + key: 'ui.disableReport', + name: Strings.attributeUiDisableReport, + valueType: 'boolean' + }, { + key: 'ui.disableVehicleFetures', + name: Strings.attributeUiDisableVehicleFetures, + valueType: 'boolean' + }, { + key: 'ui.disableDrivers', + name: Strings.attributeUiDisableDrivers, + valueType: 'boolean' + }, { + key: 'ui.disableComputedAttributes', + name: Strings.attributeUiDisableComputedAttributes, + valueType: 'boolean' + }, { + key: 'ui.disableCalendars', + name: Strings.attributeUiDisableCalendars, + valueType: 'boolean' + }] +}); diff --git a/web/app/store/DeviceAttributes.js b/web/app/store/DeviceAttributes.js index 220f9a5..4b1d920 100644 --- a/web/app/store/DeviceAttributes.js +++ b/web/app/store/DeviceAttributes.js @@ -18,28 +18,8 @@ Ext.define('Traccar.store.DeviceAttributes', { extend: 'Ext.data.Store', model: 'Traccar.model.KnownAttribute', - proxy: 'memory', data: [{ - key: 'speedLimit', - name: Strings.attributeSpeedLimit, - valueType: 'number', - dataType: 'speed' - }, { - key: 'report.ignoreOdometer', - name: Strings.attributeReportIgnoreOdometer, - valueType: 'boolean' - }, { - key: 'maintenance.start', - name: Strings.attributeMaintenanceStart, - valueType: 'number', - dataType: 'distance' - }, { - key: 'maintenance.interval', - name: Strings.attributeMaintenanceInterval, - valueType: 'number', - dataType: 'distance' - }, { key: 'web.reportColor', name: Strings.attributeWebReportColor, valueType: 'color' diff --git a/web/app/store/GroupAttributes.js b/web/app/store/GroupAttributes.js index 2a2765f..9389db1 100644 --- a/web/app/store/GroupAttributes.js +++ b/web/app/store/GroupAttributes.js @@ -18,28 +18,8 @@ Ext.define('Traccar.store.GroupAttributes', { extend: 'Ext.data.Store', model: 'Traccar.model.KnownAttribute', - proxy: 'memory', data: [{ - key: 'speedLimit', - name: Strings.attributeSpeedLimit, - valueType: 'number', - dataType: 'speed' - }, { - key: 'report.ignoreOdometer', - name: Strings.attributeReportIgnoreOdometer, - valueType: 'boolean' - }, { - key: 'maintenance.start', - name: Strings.attributeMaintenanceStart, - valueType: 'number', - dataType: 'distance' - }, { - key: 'maintenance.interval', - name: Strings.attributeMaintenanceInterval, - valueType: 'number', - dataType: 'distance' - }, { key: 'processing.copyAttributes', name: Strings.attributeProcessingCopyAttributes, valueType: 'string' diff --git a/web/app/store/ServerAttributes.js b/web/app/store/ServerAttributes.js index 109b09e..204f885 100644 --- a/web/app/store/ServerAttributes.js +++ b/web/app/store/ServerAttributes.js @@ -18,54 +18,6 @@ Ext.define('Traccar.store.ServerAttributes', { extend: 'Ext.data.Store', model: 'Traccar.model.KnownAttribute', - proxy: 'memory', - data: [{ - key: 'speedLimit', - name: Strings.attributeSpeedLimit, - valueType: 'number', - dataType: 'speed' - }, { - key: 'maintenance.start', - name: Strings.attributeMaintenanceStart, - valueType: 'number', - dataType: 'distance' - }, { - key: 'maintenance.interval', - name: Strings.attributeMaintenanceInterval, - valueType: 'number', - dataType: 'distance' - }, { - key: 'web.liveRouteLength', - name: Strings.attributeWebLiveRouteLength, - valueType: 'number', - allowDecimals: false - }, { - key: 'web.selectZoom', - name: Strings.attributeWebSelectZoom, - valueType: 'number', - allowDecimals: false, - minValue: Traccar.Style.mapDefaultZoom, - maxValue: Traccar.Style.mapMaxZoom - }, { - key: 'ui.disableReport', - name: Strings.attributeUiDisableReport, - valueType: 'boolean' - }, { - key: 'ui.disableVehicleFetures', - name: Strings.attributeUiDisableVehicleFetures, - valueType: 'boolean' - }, { - key: 'ui.disableDrivers', - name: Strings.attributeUiDisableDrivers, - valueType: 'boolean' - }, { - key: 'ui.disableComputedAttributes', - name: Strings.attributeUiDisableComputedAttributes, - valueType: 'boolean' - }, { - key: 'ui.disableCalendars', - name: Strings.attributeUiDisableCalendars, - valueType: 'boolean' - }] + data: [] }); diff --git a/web/app/store/UserAttributes.js b/web/app/store/UserAttributes.js index a004a54..dfe6942 100644 --- a/web/app/store/UserAttributes.js +++ b/web/app/store/UserAttributes.js @@ -18,7 +18,6 @@ Ext.define('Traccar.store.UserAttributes', { extend: 'Ext.data.Store', model: 'Traccar.model.KnownAttribute', - proxy: 'memory', data: [{ key: 'mail.smtp.host', @@ -67,37 +66,5 @@ Ext.define('Traccar.store.UserAttributes', { key: 'mail.smtp.password', name: Strings.attributeMailSmtpPassword, valueType: 'string' - }, { - key: 'web.liveRouteLength', - name: Strings.attributeWebLiveRouteLength, - valueType: 'number', - allowDecimals: false - }, { - key: 'web.selectZoom', - name: Strings.attributeWebSelectZoom, - valueType: 'number', - allowDecimals: false, - minValue: Traccar.Style.mapDefaultZoom, - maxValue: Traccar.Style.mapMaxZoom - }, { - key: 'ui.disableReport', - name: Strings.attributeUiDisableReport, - valueType: 'boolean' - }, { - key: 'ui.disableVehicleFetures', - name: Strings.attributeUiDisableVehicleFetures, - valueType: 'boolean' - }, { - key: 'ui.disableDrivers', - name: Strings.attributeUiDisableDrivers, - valueType: 'boolean' - }, { - key: 'ui.disableComputedAttributes', - name: Strings.attributeUiDisableComputedAttributes, - valueType: 'boolean' - }, { - key: 'ui.disableCalendars', - name: Strings.attributeUiDisableCalendars, - valueType: 'boolean' }] }); diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js index 5c052b5..f9dbc03 100644 --- a/web/app/view/ReportController.js +++ b/web/app/view/ReportController.js @@ -79,7 +79,7 @@ Ext.define('Traccar.view.ReportController', { hidden: true }); } - if (Traccar.app.isVehicleFeaturesDisabled()) { + if (Traccar.app.getVehicleFeaturesDisabled()) { for (i = 0; i < this.summaryColumns.length; i++) { if (this.summaryColumns[i].dataIndex.match('engineHours|spentFuel')) { this.summaryColumns[i].hidden = true; diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 7985700..7175260 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -45,7 +45,7 @@ Ext.define('Traccar.view.SettingsMenuController', { if (admin) { this.lookupReference('settingsServerButton').setHidden(false); this.lookupReference('settingsStatisticsButton').setHidden(false); - this.lookupReference('settingsDeviceDistanceButton').setHidden(Traccar.app.isVehicleFeaturesDisabled()); + this.lookupReference('settingsDeviceDistanceButton').setHidden(Traccar.app.getVehicleFeaturesDisabled()); } if (admin || manager) { this.lookupReference('settingsUsersButton').setHidden(false); @@ -57,8 +57,8 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsNotificationsButton').setHidden(false); this.lookupReference('settingsCalendarsButton').setHidden( Traccar.app.getBooleanAttributePreference('ui.disableCalendars')); - this.lookupReference('settingsDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || - Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('settingsDriversButton').setHidden( + Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); } if (admin || !deviceReadonly && !readonly) { this.lookupReference('settingsAttributeAliasesButton').setHidden(false); diff --git a/web/app/view/edit/AttributesController.js b/web/app/view/edit/AttributesController.js index 235f2c5..c12c196 100644 --- a/web/app/view/edit/AttributesController.js +++ b/web/app/view/edit/AttributesController.js @@ -90,6 +90,7 @@ Ext.define('Traccar.view.edit.AttributesController', { displayField: 'name', valueField: 'key', allowBlank: false, + queryMode: 'local', listeners: { change: 'onNameChange' } diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js index 9616dbd..df75b1d 100644 --- a/web/app/view/edit/DevicesController.js +++ b/web/app/view/edit/DevicesController.js @@ -61,8 +61,8 @@ Ext.define('Traccar.view.edit.DevicesController', { deviceReadonly = Traccar.app.getPreference('deviceReadonly', false) && !Traccar.app.getUser().get('admin'); readonly = Traccar.app.getPreference('readonly', false) && !Traccar.app.getUser().get('admin'); this.lookupReference('toolbarAddButton').setDisabled(readonly || deviceReadonly); - this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || - Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('toolbarDriversButton').setHidden( + Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('toolbarAttributesButton').setHidden( Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js index d40c1e6..be26cc9 100644 --- a/web/app/view/edit/GroupsController.js +++ b/web/app/view/edit/GroupsController.js @@ -33,8 +33,8 @@ Ext.define('Traccar.view.edit.GroupsController', { removeTitle: Strings.groupDialog, init: function () { - this.lookupReference('toolbarDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || - Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('toolbarDriversButton').setHidden( + Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('toolbarAttributesButton').setHidden( Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); }, diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js index 8da5caa..d67f5a7 100644 --- a/web/app/view/edit/UsersController.js +++ b/web/app/view/edit/UsersController.js @@ -41,8 +41,8 @@ Ext.define('Traccar.view.edit.UsersController', { init: function () { Ext.getStore('Users').load(); this.lookupReference('userUsersButton').setHidden(!Traccar.app.getUser().get('admin')); - this.lookupReference('userDriversButton').setHidden(Traccar.app.isVehicleFeaturesDisabled() || - Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('userDriversButton').setHidden( + Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('userAttributesButton').setHidden( Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); this.lookupReference('userCalendarsButton').setHidden( diff --git a/web/app/view/map/MapController.js b/web/app/view/map/MapController.js index d8d2249..75796f9 100644 --- a/web/app/view/map/MapController.js +++ b/web/app/view/map/MapController.js @@ -44,8 +44,8 @@ Ext.define('Traccar.view.map.MapController', { init: function () { this.callParent(); - this.lookupReference('showReportsButton').setVisible(Traccar.app.isMobile() && - !Traccar.app.getBooleanAttributePreference('ui.disableReport')); + this.lookupReference('showReportsButton').setVisible( + Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableReport')); this.lookupReference('showEventsButton').setVisible(Traccar.app.isMobile()); }, -- cgit v1.2.3 From 4aa9f57e9103848ce44d557ae8e946da3916dd56 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 18 Aug 2017 23:56:38 +1200 Subject: Add link to BrowserStack --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 16e10ab..ddfc4e8 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Traccar is open source server for various GPS tracking devices. This repository Icons are generously provided by [Font Awesome](http://fontawesome.io/) and [Icons8](https://icons8.com/). +We are using ![](https://cdn.worldvectorlogo.com/logos/browserstack.svg =20x20) [BrowserStack](https://www.browserstack.com/) to test compatibility with various browser versions and platforms. + ## Team - Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org)) -- cgit v1.2.3 From cfe245c49a1ba6e59d13dba718c323aca5af53f7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 19 Aug 2017 00:01:38 +1200 Subject: Update image link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddfc4e8..89139be 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Traccar is open source server for various GPS tracking devices. This repository Icons are generously provided by [Font Awesome](http://fontawesome.io/) and [Icons8](https://icons8.com/). -We are using ![](https://cdn.worldvectorlogo.com/logos/browserstack.svg =20x20) [BrowserStack](https://www.browserstack.com/) to test compatibility with various browser versions and platforms. +We are using ![BrowserStack](http://www.tananaev.com/badges/browserstack.svg) [BrowserStack](https://www.browserstack.com/) to test compatibility with various browser versions and platforms. ## Team -- cgit v1.2.3 From b1b6a17880044109acad8d61d20bd6c15a991732 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 19 Aug 2017 15:43:12 +1200 Subject: Another readme update --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 89139be..5c655fb 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,7 @@ Traccar is open source server for various GPS tracking devices. This repository contains web interface for the Traccar platform. For back-end checkout [main Traccar repository](https://github.com/tananaev/traccar). -Icons are generously provided by [Font Awesome](http://fontawesome.io/) and [Icons8](https://icons8.com/). - -We are using ![BrowserStack](http://www.tananaev.com/badges/browserstack.svg) [BrowserStack](https://www.browserstack.com/) to test compatibility with various browser versions and platforms. +Icons are generously provided by [Font Awesome](http://fontawesome.io/) and [Icons8](https://icons8.com/). We are also using [BrowserStack](https://www.browserstack.com/) to test compatibility with various platforms and browser versions. ## Team -- cgit v1.2.3 From a0bd864d667bdc655a3d01e2ab9f4ec076346319 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 20 Aug 2017 10:28:48 +1200 Subject: Fix method typo --- web/app/view/edit/UsersController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js index d67f5a7..3bc7d1c 100644 --- a/web/app/view/edit/UsersController.js +++ b/web/app/view/edit/UsersController.js @@ -42,7 +42,7 @@ Ext.define('Traccar.view.edit.UsersController', { Ext.getStore('Users').load(); this.lookupReference('userUsersButton').setHidden(!Traccar.app.getUser().get('admin')); this.lookupReference('userDriversButton').setHidden( - Traccar.app.isVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); this.lookupReference('userAttributesButton').setHidden( Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); this.lookupReference('userCalendarsButton').setHidden( -- cgit v1.2.3 From e0bb9b92d07176677b3043530660af3bc30774d7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 21 Aug 2017 22:42:21 +1200 Subject: Add github templates --- .github/CONTRIBUTING.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 7 +++++++ 2 files changed, 54 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..03a3831 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,47 @@ +# Contributing to Traccar + +Please make sure you read this guide before commenting on any issue or creating a new issue or pull request. + +Before asking anything, please search for an answer in: + +- [Traccar documentation](https://www.traccar.org/documentation/) +- [Traccar forums](https://www.traccar.org/forums/) +- Relevant repositories (see below) +- [Google Search](https://www.google.com/) + +GitHub issues should be used ONLY for feature requests, code discussions and bug reports. For general discussions please use [Traccar forums](https://www.traccar.org/forums/). + +There are multiple Traccar projects. If you create a new issue you MUST do it in the relevant repository: + +- [Traccar Server](https://github.com/tananaev/traccar/issues) +- [Traccar Web Interface](https://github.com/tananaev/traccar-web/issues) +- [Traccar Client for Android](https://github.com/tananaev/traccar-client-android/issues) +- [Traccar Client for iOS](https://github.com/tananaev/traccar-client-ios/issues) +- [Traccar Manager for Android](https://github.com/tananaev/traccar-manager-android/issues) +- [Traccar Manager for iOS](https://github.com/tananaev/traccar-manager-ios/issues) + +If you are not sure where your issue belongs to, please use Traccar Server main repository. + +If you want to discuss something that applies to both Android and iOS apps, please use Android repository. + +## Bug Reports + +Before creating a bug report make sure that you have tested latest official release with default configuration. + +Only create a bug report issue if you are confident that there is a problem in Traccar software. + +Provide as much details as possible, including log fragments, operating system and hardware information. + +## Feature Requests + +Before creating a feature request make sure that the feature or modification that you are requesting is not yet implemented. + +Search reposiroty to ensure that there is no existing issues for your request. If there is, add a new comment on that issue. + +Provide as much details as possible, including use case for your feature and any benefits that you can think of. + +## Pull Requests + +If you want to contribute some code to Traccar, it is recommended to discuss your solution with maintainers before starting any work. + +Any code that you want to contribute must be of high quality and follow existing code patterns and styles. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..abac4ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,7 @@ + -- cgit v1.2.3