diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2017-06-07 08:21:06 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-07 08:21:06 -0700 |
commit | a330ae09293c62aae381cb2c7f36cfa76b86e813 (patch) | |
tree | 26478c08fc6f7136ec8355d13af2a1bbf97207dc | |
parent | b6f2faab0d35d54189fefd7567b6310023c3ad7b (diff) | |
parent | e04a02921ea015d4f4fe69c1c3f1813a07be9cf4 (diff) | |
download | trackermap-web-a330ae09293c62aae381cb2c7f36cfa76b86e813.tar.gz trackermap-web-a330ae09293c62aae381cb2c7f36cfa76b86e813.tar.bz2 trackermap-web-a330ae09293c62aae381cb2c7f36cfa76b86e813.zip |
Merge pull request #501 from Abyss777/position_attributes_reports
Known position attributes for reports and charts
-rw-r--r-- | web/app/AttributeFormatter.js | 73 | ||||
-rw-r--r-- | web/app/controller/Root.js | 24 | ||||
-rw-r--r-- | web/app/model/Position.js | 32 | ||||
-rw-r--r-- | web/app/model/ReportSummary.js | 9 | ||||
-rw-r--r-- | web/app/model/ReportTrip.js | 9 | ||||
-rw-r--r-- | web/app/store/DistanceUnits.js | 4 | ||||
-rw-r--r-- | web/app/store/PositionAttributes.js | 2 | ||||
-rw-r--r-- | web/app/store/ReportChartTypes.js | 12 | ||||
-rw-r--r-- | web/app/store/SpeedUnits.js | 4 | ||||
-rw-r--r-- | web/app/view/ReportController.js | 14 | ||||
-rw-r--r-- | web/app/view/StateController.js | 9 | ||||
-rw-r--r-- | web/app/view/dialog/ReportConfig.js | 2 | ||||
-rw-r--r-- | web/app/view/edit/Attributes.js | 4 | ||||
-rw-r--r-- | web/l10n/en.json | 2 |
14 files changed, 124 insertions, 76 deletions
diff --git a/web/app/AttributeFormatter.js b/web/app/AttributeFormatter.js index 302a8941..3f7c1276 100644 --- a/web/app/AttributeFormatter.js +++ b/web/app/AttributeFormatter.js @@ -18,6 +18,14 @@ Ext.define('Traccar.AttributeFormatter', { singleton: true, + numberFormatterFactory: function (precision, suffix) { + return function (value) { + if (value !== undefined) { + return Number(value.toFixed(precision)) + ' ' + suffix; + } + }; + }, + coordinateFormatter: function (key, value) { return Ext.getStore('CoordinateFormats').formatValue(key, value, Traccar.app.getPreference('coordinateFormat')); }, @@ -26,6 +34,10 @@ Ext.define('Traccar.AttributeFormatter', { return Ext.getStore('SpeedUnits').formatValue(value, Traccar.app.getPreference('speedUnit')); }, + speedConverter: function (value) { + return Ext.getStore('SpeedUnits').convertValue(value, Traccar.app.getPreference('speedUnit')); + }, + courseFormatter: function (value) { var courseValues = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']; return courseValues[Math.floor(value / 45)]; @@ -35,24 +47,8 @@ Ext.define('Traccar.AttributeFormatter', { return Ext.getStore('DistanceUnits').formatValue(value, Traccar.app.getPreference('distanceUnit')); }, - voltageFormatter: function (value) { - return Number(value.toFixed(Traccar.Style.numberPrecision)) + ' ' + Strings.sharedVoltAbbreviation; - }, - - percentageFormatter: function (value) { - return Number(value.toFixed(Traccar.Style.numberPrecision)) + ' %'; - }, - - temperatureFormatter: function (value) { - return Number(value.toFixed(Traccar.Style.numberPrecision)) + ' °C'; - }, - - volumeFormatter: function (value) { - return Number(value.toFixed(Traccar.Style.numberPrecision)) + ' ' + Strings.sharedLiterAbbreviation; - }, - - consumptionFormatter: function (value) { - return Number(value.toFixed(Traccar.Style.numberPrecision)) + ' ' + Strings.sharedLiterPerHourAbbreviation; + distanceConverter: function (value) { + return Ext.getStore('DistanceUnits').convertValue(value, Traccar.app.getPreference('distanceUnit')); }, hoursFormatter: function (value) { @@ -131,6 +127,18 @@ Ext.define('Traccar.AttributeFormatter', { } }, + getConverter: function (key) { + if (key === 'speed') { + return this.speedConverter; + } else if (key === 'distance' || key === 'accuracy') { + return this.distanceConverter; + } else { + return function (value) { + return value; + }; + } + }, + getAttributeFormatter: function (key) { var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key); if (!dataType) { @@ -141,18 +149,37 @@ Ext.define('Traccar.AttributeFormatter', { } else if (dataType === 'speed') { return this.speedFormatter; } else if (dataType === 'voltage') { - return this.voltageFormatter; + return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedVoltAbbreviation); } else if (dataType === 'percentage') { - return this.percentageFormatter; + return this.numberFormatterFactory(Traccar.Style.numberPrecision, '%'); } else if (dataType === 'temperature') { - return this.temperatureFormatter; + return this.numberFormatterFactory(Traccar.Style.numberPrecision, '°C'); } else if (dataType === 'volume') { - return this.volumeFormatter; + return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterAbbreviation); } else if (dataType === 'consumption') { - return this.consumptionFormatter; + return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterPerHourAbbreviation); } else { return this.defaultFormatter; } } + }, + + getAttributeConverter: function (key) { + var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key); + 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; + }; + } + } } }); diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js index 8d604b62..5d22a74a 100644 --- a/web/app/controller/Root.js +++ b/web/app/controller/Root.js @@ -26,7 +26,31 @@ Ext.define('Traccar.controller.Root', { ], init: function () { + var i, data, attribute, chartTypesStore = Ext.getStore('ReportChartTypes'); Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); + data = Ext.getStore('PositionAttributes').getData().items; + for (i = 0; i < data.length; i++) { + attribute = data[i]; + Traccar.model.Position.addFields([{ + name: 'attribute.' + attribute.get('key'), + attributeKey: attribute.get('key'), + calculate: this.calculateAttribute, + persist: false + }]); + if (attribute.get('valueType') === 'number') { + chartTypesStore.add({ + key: 'attribute.' + attribute.get('key'), + name: attribute.get('name') + }); + } + } + }, + + calculateAttribute: function (data) { + var value = data.attributes[this.attributeKey]; + if (value !== undefined) { + return Traccar.AttributeFormatter.getAttributeConverter(this.attributeKey)(value); + } }, onLaunch: function () { diff --git a/web/app/model/Position.js b/web/app/model/Position.js index 4b1a429f..6db54653 100644 --- a/web/app/model/Position.js +++ b/web/app/model/Position.js @@ -45,7 +45,8 @@ Ext.define('Traccar.model.Position', { type: 'boolean' }, { name: 'accuracy', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('accuracy') }, { name: 'latitude', type: 'float' @@ -57,7 +58,8 @@ Ext.define('Traccar.model.Position', { type: 'float' }, { name: 'speed', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('speed') }, { name: 'course', type: 'float' @@ -66,31 +68,5 @@ Ext.define('Traccar.model.Position', { type: 'string' }, { name: 'attributes' - }, { - name: 'speedConverted', - type: 'float', - calculate: function (data) { - return Ext.getStore('SpeedUnits').convertValue( - data.speed, Traccar.app.getPreference('speedUnit')); - } - }, { - name: 'distanceConverted', - type: 'float', - calculate: function (data) { - return Ext.getStore('DistanceUnits').convertValue( - data.attributes.distance, Traccar.app.getPreference('distanceUnit')); - } - }, { - name: 'rpm', - type: 'float', - calculate: function (data) { - return data.attributes.rpm; - } - }, { - name: 'fuel', - type: 'float', - calculate: function (data) { - return data.attributes.fuel; - } }] }); diff --git a/web/app/model/ReportSummary.js b/web/app/model/ReportSummary.js index d236ecd0..5cfbdcd7 100644 --- a/web/app/model/ReportSummary.js +++ b/web/app/model/ReportSummary.js @@ -28,13 +28,16 @@ Ext.define('Traccar.model.ReportSummary', { type: 'string' }, { name: 'maxSpeed', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('speed') }, { name: 'averageSpeed', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('speed') }, { name: 'distance', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('distance') }, { name: 'engineHours', type: 'int' diff --git a/web/app/model/ReportTrip.js b/web/app/model/ReportTrip.js index 51f98078..d243a8ae 100644 --- a/web/app/model/ReportTrip.js +++ b/web/app/model/ReportTrip.js @@ -28,13 +28,16 @@ Ext.define('Traccar.model.ReportTrip', { type: 'string' }, { name: 'maxSpeed', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('speed') }, { name: 'averageSpeed', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('speed') }, { name: 'distance', - type: 'float' + type: 'float', + convert: Traccar.AttributeFormatter.getConverter('distance') }, { name: 'duration', type: 'int' diff --git a/web/app/store/DistanceUnits.js b/web/app/store/DistanceUnits.js index 514a051e..e64ce234 100644 --- a/web/app/store/DistanceUnits.js +++ b/web/app/store/DistanceUnits.js @@ -42,12 +42,12 @@ Ext.define('Traccar.store.DistanceUnits', { return back ? value / model.get('factor') : value * model.get('factor'); }, - formatValue: function (value, unit) { + formatValue: function (value, unit, convert) { var model; if (!unit) { unit = 'km'; } model = this.findRecord('key', unit); - return this.convertValue(value, unit).toFixed(2) + ' ' + model.get('name'); + return (convert ? this.convertValue(value, unit) : value).toFixed(2) + ' ' + model.get('name'); } }); diff --git a/web/app/store/PositionAttributes.js b/web/app/store/PositionAttributes.js index 985c558e..72154297 100644 --- a/web/app/store/PositionAttributes.js +++ b/web/app/store/PositionAttributes.js @@ -62,7 +62,7 @@ Ext.define('Traccar.store.PositionAttributes', { valueType: 'string' }, { key: 'alarm', - name: Strings.alarm, + name: Strings.positionAlarm, valueType: 'string' }, { key: 'status', diff --git a/web/app/store/ReportChartTypes.js b/web/app/store/ReportChartTypes.js index 889db50d..8ca074f3 100644 --- a/web/app/store/ReportChartTypes.js +++ b/web/app/store/ReportChartTypes.js @@ -21,16 +21,10 @@ Ext.define('Traccar.store.ReportChartTypes', { fields: ['key', 'name'], data: [{ - key: 'speedConverted', + key: 'speed', name: Strings.positionSpeed }, { - key: 'distanceConverted', - name: Strings.positionDistance - }, { - key: 'rpm', - name: Strings.positionRpm - }, { - key: 'fuel', - name: Strings.positionFuel + key: 'accuracy', + name: Strings.positionAccuracy }] }); diff --git a/web/app/store/SpeedUnits.js b/web/app/store/SpeedUnits.js index ce976952..a36be928 100644 --- a/web/app/store/SpeedUnits.js +++ b/web/app/store/SpeedUnits.js @@ -42,12 +42,12 @@ Ext.define('Traccar.store.SpeedUnits', { return back ? value / model.get('factor') : value * model.get('factor'); }, - formatValue: function (value, unit) { + formatValue: function (value, unit, convert) { var model; if (!unit) { unit = 'kn'; } model = this.findRecord('key', unit); - return this.convertValue(value, unit).toFixed(1) + ' ' + model.get('name'); + return (convert ? this.convertValue(value, unit) : value).toFixed(1) + ' ' + model.get('name'); } }); diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js index d83d9986..3daa2957 100644 --- a/web/app/view/ReportController.js +++ b/web/app/view/ReportController.js @@ -64,6 +64,20 @@ Ext.define('Traccar.view.ReportController', { return this.getView().getComponent('chart'); }, + init: function () { + var i, data, attribute; + data = Ext.getStore('PositionAttributes').getData().items; + for (i = 0; i < data.length; i++) { + attribute = data[i]; + this.routeColumns.push({ + text: attribute.get('name'), + dataIndex: 'attribute.' + attribute.get('key'), + renderer: Traccar.AttributeFormatter.getAttributeFormatter(attribute.get('key')), + hidden: true + }); + } + }, + onConfigureClick: function () { var dialog = Ext.create('Traccar.view.dialog.ReportConfig'); dialog.lookupReference('eventTypeField').setHidden(this.lookupReference('reportTypeField').getValue() !== 'events'); diff --git a/web/app/view/StateController.js b/web/app/view/StateController.js index 0723dc13..4c99a8be 100644 --- a/web/app/view/StateController.js +++ b/web/app/view/StateController.js @@ -101,7 +101,7 @@ Ext.define('Traccar.view.StateController', { }, updatePosition: function () { - var attributes, store, key, aliasIndex, name; + var attributes, store, key, aliasIndex, name, value; store = Ext.getStore('Attributes'); store.removeAll(); @@ -126,11 +126,16 @@ Ext.define('Traccar.view.StateController', { } else { name = Ext.getStore('PositionAttributes').getAttributeName(key, true); } + if (this.position.get('attribute.' + key) !== undefined) { + value = Traccar.AttributeFormatter.getAttributeFormatter(key)(this.position.get('attribute.' + key)); + } else { + value = Traccar.AttributeFormatter.defaultFormatter(attributes[key]); + } store.add(Ext.create('Traccar.model.Attribute', { priority: 1024, name: name, attribute: key, - value: Traccar.AttributeFormatter.getAttributeFormatter(key)(attributes[key]) + value: value })); } } diff --git a/web/app/view/dialog/ReportConfig.js b/web/app/view/dialog/ReportConfig.js index b8493cbb..836b6050 100644 --- a/web/app/view/dialog/ReportConfig.js +++ b/web/app/view/dialog/ReportConfig.js @@ -61,7 +61,7 @@ Ext.define('Traccar.view.dialog.ReportConfig', { reference: 'chartTypeField', store: 'ReportChartTypes', hidden: true, - value: 'speedConverted', + value: 'speed', valueField: 'key', displayField: 'name', queryMode: 'local' diff --git a/web/app/view/edit/Attributes.js b/web/app/view/edit/Attributes.js index b080e569..66d8bb12 100644 --- a/web/app/view/edit/Attributes.js +++ b/web/app/view/edit/Attributes.js @@ -58,9 +58,9 @@ Ext.define('Traccar.view.edit.Attributes', { attribute = Ext.getStore(this.attributesStore).getById(record.get('name')); } if (attribute && attribute.get('dataType') === 'speed') { - return Ext.getStore('SpeedUnits').formatValue(value, Traccar.app.getPreference('speedUnit', 'kn')); + return Ext.getStore('SpeedUnits').formatValue(value, Traccar.app.getPreference('speedUnit', 'kn'), true); } else if (attribute && attribute.get('dataType') === 'distance') { - return Ext.getStore('DistanceUnits').formatValue(value, Traccar.app.getPreference('distanceUnit', 'km')); + return Ext.getStore('DistanceUnits').formatValue(value, Traccar.app.getPreference('distanceUnit', 'km'), true); } else { return value; } diff --git a/web/l10n/en.json b/web/l10n/en.json index 22a9cfd7..30f66ba9 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -164,6 +164,7 @@ "positionRssi": "RSSI", "positionGps": "GPS", "positionEvent": "Event", + "positionAlarm": "Alarm", "positionStatus": "Status", "positionOdometer": "Odometer", "positionServiceOdometer": "Service Odometer", @@ -186,6 +187,7 @@ "positionThrottle": "Throttle", "positionMotion": "Motion", "positionArmed": "Armed", + "positionAcceleration": "Acceleration", "positionDeviceTemp": "Device Temperature", "positionOperator": "Operator", "positionCommand": "Acceleration", |