aboutsummaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/.eslintignore1
-rw-r--r--web/.eslintrc.json94
-rw-r--r--web/.jscsrc7
-rw-r--r--web/.jshintignore2
-rw-r--r--web/.jshintrc76
-rw-r--r--web/app/Application.js10
-rw-r--r--web/app/AttributeFormatter.js48
-rw-r--r--web/app/DeviceImages.js4
-rw-r--r--web/app/GeofenceConverter.js15
-rw-r--r--web/app/controller/Root.js15
-rw-r--r--web/app/model/Event.js6
-rw-r--r--web/app/store/AllNotifications.js5
-rw-r--r--web/app/store/AllTimezones.js2
-rw-r--r--web/app/store/CommandTypes.js2
-rw-r--r--web/app/store/CommonDeviceAttributes.js42
-rw-r--r--web/app/store/CommonUserAttributes.js55
-rw-r--r--web/app/store/DeviceAttributes.js20
-rw-r--r--web/app/store/GroupAttributes.js20
-rw-r--r--web/app/store/Notifications.js5
-rw-r--r--web/app/store/PositionAttributes.js12
-rw-r--r--web/app/store/ServerAttributes.js34
-rw-r--r--web/app/store/UserAttributes.js17
-rw-r--r--web/app/view/ArrayListFilter.js6
-rw-r--r--web/app/view/CustomNumberField.js2
-rw-r--r--web/app/view/EventsController.js6
-rw-r--r--web/app/view/MainController.js3
-rw-r--r--web/app/view/NotificationsController.js2
-rw-r--r--web/app/view/ReportController.js27
-rw-r--r--web/app/view/SettingsMenuController.js13
-rw-r--r--web/app/view/StateController.js17
-rw-r--r--web/app/view/dialog/CalendarController.js4
-rw-r--r--web/app/view/dialog/CommandController.js2
-rw-r--r--web/app/view/dialog/Geofence.js1
-rw-r--r--web/app/view/dialog/GeofenceController.js5
-rw-r--r--web/app/view/dialog/LoginController.js10
-rw-r--r--web/app/view/dialog/MapPickerController.js2
-rw-r--r--web/app/view/edit/AttributeAliasesController.js8
-rw-r--r--web/app/view/edit/Attributes.js2
-rw-r--r--web/app/view/edit/AttributesController.js1
-rw-r--r--web/app/view/edit/Devices.js4
-rw-r--r--web/app/view/edit/DevicesController.js8
-rw-r--r--web/app/view/edit/GroupsController.js7
-rw-r--r--web/app/view/edit/UsersController.js6
-rw-r--r--web/app/view/map/BaseMap.js49
-rw-r--r--web/app/view/map/MapController.js12
-rw-r--r--web/app/view/map/MapMarkerController.js26
-rw-r--r--web/app/view/permissions/BaseController.js8
-rw-r--r--web/l10n/en.json4
-rw-r--r--web/load.js2
49 files changed, 351 insertions, 378 deletions
diff --git a/web/.eslintignore b/web/.eslintignore
deleted file mode 100644
index 3e0fc5c5..00000000
--- a/web/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-simple/app.js \ No newline at end of file
diff --git a/web/.eslintrc.json b/web/.eslintrc.json
deleted file mode 100644
index 84512e89..00000000
--- a/web/.eslintrc.json
+++ /dev/null
@@ -1,94 +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,
- "VariableDeclarator":2,
- "CallExpression":{
- "arguments": 2
- },
- "MemberExpression": 2
- }
- ],
- "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 c20bcf08..00000000
--- 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 0a20d51b..00000000
--- 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 67329cd0..00000000
--- 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
- }
-}
diff --git a/web/app/Application.js b/web/app/Application.js
index c14dd4d3..e0f0aa45 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,6 +106,10 @@ Ext.define('Traccar.Application', {
return window.matchMedia && window.matchMedia('(max-width: 768px)').matches;
},
+ getVehicleFeaturesDisabled: 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 +167,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/AttributeFormatter.js b/web/app/AttributeFormatter.js
index 4147edec..7ccf84b4 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) {
@@ -184,6 +188,7 @@ Ext.define('Traccar.AttributeFormatter', {
getAttributeFormatter: function (key) {
var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key);
+<<<<<<< HEAD
switch (dataType) {
case 'distance':
@@ -204,11 +209,34 @@ Ext.define('Traccar.AttributeFormatter', {
return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterPerHourAbbreviation);
default:
return this.defaultFormatter;
+=======
+ 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, '&#37;');
+ } else if (dataType === 'temperature') {
+ return this.numberFormatterFactory(Traccar.Style.numberPrecision, '&deg;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;
+>>>>>>> e0bb9b92d07176677b3043530660af3bc30774d7
}
},
getAttributeConverter: function (key) {
var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key);
+<<<<<<< HEAD
switch (dataType){
case 'distance':
@@ -219,6 +247,20 @@ Ext.define('Traccar.AttributeFormatter', {
return function (value) {
return value;
};
+=======
+ if (!dataType) {
+ return function (value) {
+ return value;
+ };
+ } else if (dataType === 'distance') {
+ return this.distanceConverter;
+ } else if (dataType === 'speed') {
+ return this.speedConverter;
+ } else {
+ return function (value) {
+ return value;
+ };
+>>>>>>> e0bb9b92d07176677b3043530660af3bc30774d7
}
}
});
diff --git a/web/app/DeviceImages.js b/web/app/DeviceImages.js
index e58c4f60..af45ce90 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 ce529b1f..d3d562e7 100644
--- a/web/app/GeofenceConverter.js
+++ b/web/app/GeofenceConverter.js
@@ -19,10 +19,15 @@ Ext.define('Traccar.GeofenceConverter', {
singleton: true,
wktToGeometry: function (mapView, wkt) {
+<<<<<<< HEAD
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;
+>>>>>>> e0bb9b92d07176677b3043530660af3bc30774d7
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 +41,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 +50,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 +84,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 baba68a1..1c70dd03 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 () {
@@ -112,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 () {
@@ -162,7 +170,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 +299,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 9455b0dd..966cd607 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 f25aebc4..61aa75ab 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 e5a861b6..2a7fa371 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 445f937d..a14dd58e 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/CommonDeviceAttributes.js b/web/app/store/CommonDeviceAttributes.js
new file mode 100644
index 00000000..83dd4114
--- /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 <http://www.gnu.org/licenses/>.
+ */
+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 00000000..85d652df
--- /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 <http://www.gnu.org/licenses/>.
+ */
+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 220f9a5b..4b1d9204 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 2a2765f5..9389db1c 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/Notifications.js b/web/app/store/Notifications.js
index d79702fc..a672fd43 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 c3d6d180..e457dafc 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/store/ServerAttributes.js b/web/app/store/ServerAttributes.js
index 89a0137b..204f885b 100644
--- a/web/app/store/ServerAttributes.js
+++ b/web/app/store/ServerAttributes.js
@@ -18,38 +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'
- }]
+ data: []
});
diff --git a/web/app/store/UserAttributes.js b/web/app/store/UserAttributes.js
index 6cf06fbb..dfe69421 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,21 +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'
}]
});
diff --git a/web/app/view/ArrayListFilter.js b/web/app/view/ArrayListFilter.js
index cea748af..b6c1512f 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 e116e934..887e5c9c 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') + '</div></div>';
+ config.afterSubTpl = this.unitEl + Ext.getStore('DistanceUnits').findRecord('key', unit).get('name') + '</div></div>';
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 62af967b..8eb4363f 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 76645e43..126d9af5 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/NotificationsController.js b/web/app/view/NotificationsController.js
index f50e8d82..651f57fc 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 58500860..f9dbc03c 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.getVehicleFeaturesDisabled()) {
+ 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 () {
@@ -117,7 +134,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 +221,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 +298,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 102120d8..7175260c 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.getVehicleFeaturesDisabled());
}
if (admin || manager) {
this.lookupReference('settingsUsersButton').setHidden(false);
@@ -55,12 +55,15 @@ 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('settingsDriversButton').setHidden(false);
+ this.lookupReference('settingsCalendarsButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableCalendars'));
+ this.lookupReference('settingsDriversButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
}
- if (admin || (!deviceReadonly && !readonly)) {
+ 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/StateController.js b/web/app/view/StateController.js
index 23369b87..95f5f555 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 14d8294a..fb8cbff6 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]);
}
}
});
diff --git a/web/app/view/dialog/CommandController.js b/web/app/view/dialog/CommandController.js
index 485d994d..3fdc7b0c 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/Geofence.js b/web/app/view/dialog/Geofence.js
index 93f17de5..bed20d38 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 9fdad61b..e4ac5a2e 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/dialog/LoginController.js b/web/app/view/dialog/LoginController.js
index 1b5cd072..c25d9a83 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 23f60ece..8641e377 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 d1beb135..8ac68bcb 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 84cadea5..a76223b9 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/AttributesController.js b/web/app/view/edit/AttributesController.js
index 8d159569..84ff6adf 100644
--- a/web/app/view/edit/AttributesController.js
+++ b/web/app/view/edit/AttributesController.js
@@ -94,6 +94,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/Devices.js b/web/app/view/edit/Devices.js
index c9538c8b..4fdcab00 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 ae65fbb1..df75b1d4 100644
--- a/web/app/view/edit/DevicesController.js
+++ b/web/app/view/edit/DevicesController.js
@@ -61,6 +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.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
+ this.lookupReference('toolbarAttributesButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
setInterval(function () {
self.getView().getView().refresh();
@@ -151,7 +155,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 +167,7 @@ Ext.define('Traccar.view.edit.DevicesController', {
}
},
- onUpdateDevice: function (store, data) {
+ onUpdateDevice: function () {
this.updateButtons(this.getView().getSelectionModel());
},
diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js
index 21f17ffa..be26cc93 100644
--- a/web/app/view/edit/GroupsController.js
+++ b/web/app/view/edit/GroupsController.js
@@ -32,6 +32,13 @@ Ext.define('Traccar.view.edit.GroupsController', {
objectDialog: 'Traccar.view.dialog.Group',
removeTitle: Strings.groupDialog,
+ init: function () {
+ this.lookupReference('toolbarDriversButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
+ this.lookupReference('toolbarAttributesButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
+ },
+
onGeofencesClick: function () {
var admin, group;
admin = Traccar.app.getUser().get('admin');
diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js
index fb7a36e2..3bc7d1c4 100644
--- a/web/app/view/edit/UsersController.js
+++ b/web/app/view/edit/UsersController.js
@@ -41,6 +41,12 @@ 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.getVehicleFeaturesDisabled() || 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/app/view/map/BaseMap.js b/web/app/view/map/BaseMap.js
index c1873161..cac5a596 100644
--- a/web/app/view/map/BaseMap.js
+++ b/web/app/view/map/BaseMap.js
@@ -117,11 +117,45 @@ Ext.define('Traccar.view.map.BaseMap', {
262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048,
1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 0.5
]
+<<<<<<< HEAD
}),
attributions: [
new ol.Attribution({
html: '&copy; <a href="http://map.baidu.com/">Baidu</a>'
})
+=======
+ })
+ ]
+ })
+ });
+ } else if (type === 'baidu') {
+ layer = new ol.layer.Tile({
+ source: new ol.source.XYZ({
+ projection: 'BD-MC',
+ tileUrlFunction: function (tileCoord) {
+ var urlsLength = 5, z = tileCoord[0], x = tileCoord[1], y = tileCoord[2], hash, index;
+
+ hash = (x << z) + y;
+ index = hash % urlsLength;
+ index = index < 0 ? index + urlsLength : index;
+
+ if (x < 0) {
+ x = 'M' + -x;
+ }
+ if (y < 0) {
+ 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);
+ },
+ tileGrid: new ol.tilegrid.TileGrid({
+ extent: ol.proj.transformExtent([-180, -74, 180, 74], 'EPSG:4326', 'BD-MC'),
+ origin: [0, 0],
+ minZoom: 3,
+ resolutions: [
+ 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048,
+ 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 0.5
+>>>>>>> e0bb9b92d07176677b3043530660af3bc30774d7
]
})
});
@@ -180,7 +214,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) {
@@ -191,14 +225,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, layer) {
- this.fireEvent('selectfeature', feature);
- }.bind(this));
+ });
+ if (features) {
+ for (i = 0; i < features.length; i++) {
+ this.fireEvent('selectfeature', features[i]);
+ }
} else {
this.fireEvent('deselectfeature');
}
@@ -215,9 +250,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 f2a561a3..75796f9b 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.getAttributePreference('ui.disableReport', false));
+ this.lookupReference('showReportsButton').setVisible(
+ Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableReport'));
this.lookupReference('showEventsButton').setVisible(Traccar.app.isMobile());
},
@@ -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 09dd83dc..c46faac2 100644
--- a/web/app/view/map/MapMarkerController.js
+++ b/web/app/view/map/MapMarkerController.js
@@ -216,7 +216,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);
@@ -257,8 +257,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'));
@@ -429,10 +429,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);
@@ -440,18 +438,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);
@@ -608,7 +602,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 860a29b3..5cb9c302 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();
diff --git a/web/l10n/en.json b/web/l10n/en.json
index 6476b0d8..69df1563 100644
--- a/web/l10n/en.json
+++ b/web/l10n/en.json
@@ -89,6 +89,10 @@
"attributeMailSmtpUsername": "Mail: SMTP Username",
"attributeMailSmtpPassword": "Mail: SMTP Password",
"attributeUiDisableReport": "UI: Disable Report",
+ "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",
diff --git a/web/load.js b/web/load.js
index 1845cd13..85772805 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) {