aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--web/.jscsrc3
-rw-r--r--web/.jshintrc2
-rw-r--r--web/app/Application.js7
-rw-r--r--web/app/AttributeFormatter.js16
-rw-r--r--web/app/controller/Root.js1
-rw-r--r--web/app/model/Driver.js35
-rw-r--r--web/app/model/Event.js3
-rw-r--r--web/app/model/ReportTrip.js6
-rw-r--r--web/app/store/AllDrivers.js30
-rw-r--r--web/app/store/Drivers.js30
-rw-r--r--web/app/store/PositionAttributes.js9
-rw-r--r--web/app/view/ReportController.js4
-rw-r--r--web/app/view/SettingsMenu.js6
-rw-r--r--web/app/view/SettingsMenuController.js11
-rw-r--r--web/app/view/dialog/Driver.js42
-rw-r--r--web/app/view/edit/Devices.js8
-rw-r--r--web/app/view/edit/DevicesController.js17
-rw-r--r--web/app/view/edit/Drivers.js57
-rw-r--r--web/app/view/edit/DriversController.js32
-rw-r--r--web/app/view/edit/Groups.js8
-rw-r--r--web/app/view/edit/GroupsController.js19
-rw-r--r--web/app/view/edit/Users.js7
-rw-r--r--web/app/view/edit/UsersController.js18
-rw-r--r--web/app/view/permissions/DeviceDrivers.js44
-rw-r--r--web/app/view/permissions/GroupDrivers.js44
-rw-r--r--web/app/view/permissions/UserDrivers.js44
-rw-r--r--web/l10n/en.json4
27 files changed, 499 insertions, 8 deletions
diff --git a/web/.jscsrc b/web/.jscsrc
index 70c9dc48..546e6a58 100644
--- a/web/.jscsrc
+++ b/web/.jscsrc
@@ -1,5 +1,6 @@
{
"preset": "crockford",
"maxErrors": 100,
- "excludeFiles": ["simple/app.js"]
+ "excludeFiles": ["simple/app.js"],
+ "requireDotNotation": false
}
diff --git a/web/.jshintrc b/web/.jshintrc
index b0c5d10e..67329cd0 100644
--- a/web/.jshintrc
+++ b/web/.jshintrc
@@ -55,7 +55,7 @@
"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" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
+ "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
diff --git a/web/app/Application.js b/web/app/Application.js
index c0a69457..b4ce10ad 100644
--- a/web/app/Application.js
+++ b/web/app/Application.js
@@ -40,7 +40,8 @@ Ext.define('Traccar.Application', {
'ReportTrip',
'ReportStop',
'Calendar',
- 'KnownAttribute'
+ 'KnownAttribute',
+ 'Driver'
],
stores: [
@@ -89,7 +90,9 @@ Ext.define('Traccar.Application', {
'ComputedAttributes',
'AllComputedAttributes',
'PositionAttributes',
- 'AttributeValueTypes'
+ 'AttributeValueTypes',
+ 'Drivers',
+ 'AllDrivers'
],
controllers: [
diff --git a/web/app/AttributeFormatter.js b/web/app/AttributeFormatter.js
index e63cf890..3e6758ac 100644
--- a/web/app/AttributeFormatter.js
+++ b/web/app/AttributeFormatter.js
@@ -74,6 +74,18 @@ Ext.define('Traccar.AttributeFormatter', {
}
},
+ driverUniqueIdFormatter: function (value) {
+ var driver, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllDrivers');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Drivers');
+ }
+ driver = store.findRecord('uniqueId', value, 0, false, true, true);
+ return driver ? value + ' (' + driver.get('name') + ')' : value;
+ }
+ },
+
lastUpdateFormatter: function (value) {
var seconds, interval;
@@ -131,6 +143,8 @@ Ext.define('Traccar.AttributeFormatter', {
return this.lastUpdateFormatter;
} else if (key === 'spentFuel') {
return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterAbbreviation);
+ } else if (key === 'driverUniqueId') {
+ return this.driverUniqueIdFormatter;
} else {
return this.defaultFormatter;
}
@@ -157,6 +171,8 @@ Ext.define('Traccar.AttributeFormatter', {
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') {
diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js
index e389266e..337ec4c5 100644
--- a/web/app/controller/Root.js
+++ b/web/app/controller/Root.js
@@ -105,6 +105,7 @@ Ext.define('Traccar.controller.Root', {
loadApp: function () {
var attribution, eventId;
Ext.getStore('Groups').load();
+ Ext.getStore('Drivers').load();
Ext.getStore('Geofences').load();
Ext.getStore('Calendars').load();
Ext.getStore('AttributeAliases').load();
diff --git a/web/app/model/Driver.js b/web/app/model/Driver.js
new file mode 100644
index 00000000..3c3b30e5
--- /dev/null
+++ b/web/app/model/Driver.js
@@ -0,0 +1,35 @@
+/*
+ * 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.model.Driver', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'uniqueId',
+ type: 'string'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/web/app/model/Event.js b/web/app/model/Event.js
index 70fab178..9455b0dd 100644
--- a/web/app/model/Event.js
+++ b/web/app/model/Event.js
@@ -51,6 +51,9 @@ Ext.define('Traccar.model.Event', {
text = Strings[alarmKey] || alarmKey;
} 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']);
} else {
text = Traccar.app.getEventString(rec.get('type'));
}
diff --git a/web/app/model/ReportTrip.js b/web/app/model/ReportTrip.js
index d243a8ae..edff02b5 100644
--- a/web/app/model/ReportTrip.js
+++ b/web/app/model/ReportTrip.js
@@ -55,5 +55,11 @@ Ext.define('Traccar.model.ReportTrip', {
}, {
name: 'endAddress',
type: 'string'
+ }, {
+ name: 'driverUniqueId',
+ type: 'string'
+ }, {
+ name: 'driverName',
+ type: 'string'
}]
});
diff --git a/web/app/store/AllDrivers.js b/web/app/store/AllDrivers.js
new file mode 100644
index 00000000..9d723885
--- /dev/null
+++ b/web/app/store/AllDrivers.js
@@ -0,0 +1,30 @@
+/*
+ * 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.AllDrivers', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Driver',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/drivers',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/web/app/store/Drivers.js b/web/app/store/Drivers.js
new file mode 100644
index 00000000..fd4ca203
--- /dev/null
+++ b/web/app/store/Drivers.js
@@ -0,0 +1,30 @@
+/*
+ * 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.Drivers', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Driver',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/drivers',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/web/app/store/PositionAttributes.js b/web/app/store/PositionAttributes.js
index 0a6572dd..c3d6d180 100644
--- a/web/app/store/PositionAttributes.js
+++ b/web/app/store/PositionAttributes.js
@@ -121,10 +121,6 @@ Ext.define('Traccar.store.PositionAttributes', {
valueType: 'number',
dataType: 'consumption'
}, {
- key: 'rfid',
- name: Strings.positionRfid,
- valueType: 'string'
- }, {
key: 'versionFw',
name: Strings.positionVersionFw,
valueType: 'string'
@@ -233,6 +229,11 @@ Ext.define('Traccar.store.PositionAttributes', {
key: 'result',
name: Strings.eventCommandResult,
valueType: 'string'
+ }, {
+ key: 'driverUniqueId',
+ name: Strings.positionDriverUniqueId,
+ valueType: 'string',
+ dataType: 'driverUniqueId'
}],
getAttributeName: function (key, capitalize) {
diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js
index e048c063..7dfeaf3f 100644
--- a/web/app/view/ReportController.js
+++ b/web/app/view/ReportController.js
@@ -531,6 +531,10 @@ Ext.define('Traccar.view.ReportController', {
text: Strings.reportSpentFuel,
dataIndex: 'spentFuel',
renderer: Traccar.AttributeFormatter.getFormatter('spentFuel')
+ }, {
+ text: Strings.sharedDriver,
+ dataIndex: 'driverUniqueId',
+ renderer: Traccar.AttributeFormatter.getFormatter('driverUniqueId')
}],
stopsColumns: [{
diff --git a/web/app/view/SettingsMenu.js b/web/app/view/SettingsMenu.js
index db426bbe..f893a157 100644
--- a/web/app/view/SettingsMenu.js
+++ b/web/app/view/SettingsMenu.js
@@ -44,6 +44,12 @@ Ext.define('Traccar.view.SettingsMenu', {
reference: 'settingsGroupsButton'
}, {
hidden: true,
+ text: Strings.sharedDrivers,
+ glyph: 'xf2c2@FontAwesome',
+ handler: 'onDriversClick',
+ reference: 'settingsDriversButton'
+ }, {
+ hidden: true,
text: Strings.sharedGeofences,
glyph: 'xf21d@FontAwesome',
handler: 'onGeofencesClick',
diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js
index a1883a61..102120d8 100644
--- a/web/app/view/SettingsMenuController.js
+++ b/web/app/view/SettingsMenuController.js
@@ -26,6 +26,7 @@ Ext.define('Traccar.view.SettingsMenuController', {
'Traccar.view.edit.Users',
'Traccar.view.edit.Groups',
'Traccar.view.edit.Geofences',
+ 'Traccar.view.edit.Drivers',
'Traccar.view.Notifications',
'Traccar.view.edit.AttributeAliases',
'Traccar.view.edit.ComputedAttributes',
@@ -55,6 +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);
}
if (admin || (!deviceReadonly && !readonly)) {
this.lookupReference('settingsAttributeAliasesButton').setHidden(false);
@@ -156,6 +158,15 @@ Ext.define('Traccar.view.SettingsMenuController', {
}).show();
},
+ onDriversClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'driversView'
+ }
+ }).show();
+ },
+
onLogoutClick: function () {
Ext.create('Traccar.view.dialog.LoginController').logout();
}
diff --git a/web/app/view/dialog/Driver.js b/web/app/view/dialog/Driver.js
new file mode 100644
index 00000000..437ef666
--- /dev/null
+++ b/web/app/view/dialog/Driver.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.view.dialog.Driver', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ title: Strings.sharedDevice,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'textfield',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }, {
+ xtype: 'textfield',
+ name: 'uniqueId',
+ fieldLabel: Strings.deviceIdentifier,
+ allowBlank: false
+ }]
+ }]
+ }
+});
diff --git a/web/app/view/edit/Devices.js b/web/app/view/edit/Devices.js
index 267a38be..97cbba2b 100644
--- a/web/app/view/edit/Devices.js
+++ b/web/app/view/edit/Devices.js
@@ -83,6 +83,14 @@ Ext.define('Traccar.view.edit.Devices', {
tooltip: Strings.sharedComputedAttributes,
tooltipType: 'title'
}, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onDriversClick',
+ reference: 'toolbarDriversButton',
+ glyph: 'xf2c2@FontAwesome',
+ tooltip: Strings.sharedDrivers,
+ tooltipType: 'title'
+ }, {
disabled: true,
handler: 'onCommandClick',
reference: 'deviceCommandButton',
diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js
index 2457d5cb..0cdf18ac 100644
--- a/web/app/view/edit/DevicesController.js
+++ b/web/app/view/edit/DevicesController.js
@@ -24,6 +24,7 @@ Ext.define('Traccar.view.edit.DevicesController', {
'Traccar.view.dialog.Device',
'Traccar.view.permissions.DeviceGeofences',
'Traccar.view.permissions.DeviceAttributes',
+ 'Traccar.view.permissions.DeviceDrivers',
'Traccar.view.BaseWindow',
'Traccar.model.Device',
'Traccar.model.Command'
@@ -93,6 +94,21 @@ Ext.define('Traccar.view.edit.DevicesController', {
}).show();
},
+ onDriversClick: function () {
+ var device = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'deviceDriversView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'driverId',
+ storeName: 'Drivers',
+ urlApi: 'api/devices/drivers',
+ baseObject: device.getId()
+ }
+ }).show();
+ },
+
onCommandClick: function () {
var device, deviceId, command, dialog, typesStore, online;
device = this.getView().getSelectionModel().getSelection()[0];
@@ -122,6 +138,7 @@ Ext.define('Traccar.view.edit.DevicesController', {
this.lookupReference('toolbarRemoveButton').setDisabled(empty || readonly || deviceReadonly);
this.lookupReference('toolbarGeofencesButton').setDisabled(empty || readonly);
this.lookupReference('toolbarAttributesButton').setDisabled(empty || readonly);
+ this.lookupReference('toolbarDriversButton').setDisabled(empty || readonly);
this.lookupReference('deviceCommandButton').setDisabled(empty || readonly);
},
diff --git a/web/app/view/edit/Drivers.js b/web/app/view/edit/Drivers.js
new file mode 100644
index 00000000..59d8d2c4
--- /dev/null
+++ b/web/app/view/edit/Drivers.js
@@ -0,0 +1,57 @@
+/*
+ * 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.view.edit.Drivers', {
+ extend: 'Ext.grid.Panel',
+ xtype: 'driversView',
+
+ requires: [
+ 'Ext.grid.filters.Filters',
+ 'Traccar.view.edit.DriversController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ plugins: 'gridfilters',
+
+ controller: 'drivers',
+ store: 'Drivers',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.sharedDescription,
+ dataIndex: 'uniqueId',
+ filter: 'string'
+ }]
+ }
+});
diff --git a/web/app/view/edit/DriversController.js b/web/app/view/edit/DriversController.js
new file mode 100644
index 00000000..2840c2a7
--- /dev/null
+++ b/web/app/view/edit/DriversController.js
@@ -0,0 +1,32 @@
+/*
+ * 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.view.edit.DriversController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.drivers',
+
+ requires: [
+ 'Traccar.view.dialog.Driver',
+ 'Traccar.model.Driver'
+ ],
+
+ objectModel: 'Traccar.model.Driver',
+ objectDialog: 'Traccar.view.dialog.Driver',
+ removeTitle: Strings.sharedDriver
+
+});
diff --git a/web/app/view/edit/Groups.js b/web/app/view/edit/Groups.js
index d4d08305..deb797f1 100644
--- a/web/app/view/edit/Groups.js
+++ b/web/app/view/edit/Groups.js
@@ -49,6 +49,14 @@ Ext.define('Traccar.view.edit.Groups', {
glyph: 'xf0ae@FontAwesome',
tooltip: Strings.sharedComputedAttributes,
tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onDriversClick',
+ reference: 'toolbarDriversButton',
+ glyph: 'xf2c2@FontAwesome',
+ tooltip: Strings.sharedDrivers,
+ tooltipType: 'title'
}]
},
diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js
index 602bb095..a170b3e9 100644
--- a/web/app/view/edit/GroupsController.js
+++ b/web/app/view/edit/GroupsController.js
@@ -23,6 +23,7 @@ Ext.define('Traccar.view.edit.GroupsController', {
'Traccar.view.dialog.Group',
'Traccar.view.permissions.GroupGeofences',
'Traccar.view.permissions.GroupAttributes',
+ 'Traccar.view.permissions.GroupDrivers',
'Traccar.view.BaseWindow',
'Traccar.model.Group'
],
@@ -65,10 +66,28 @@ Ext.define('Traccar.view.edit.GroupsController', {
}).show();
},
+ onDriversClick: function () {
+ var admin, group;
+ admin = Traccar.app.getUser().get('admin');
+ group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'groupDriversView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'driverId',
+ storeName: admin ? 'AllDrivers' : 'Drivers',
+ urlApi: 'api/groups/drivers',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
onSelectionChange: function (selected) {
var disabled = selected.length > 0;
this.lookupReference('toolbarGeofencesButton').setDisabled(disabled);
this.lookupReference('toolbarAttributesButton').setDisabled(disabled);
+ this.lookupReference('toolbarDriversButton').setDisabled(disabled);
this.callParent(arguments);
}
});
diff --git a/web/app/view/edit/Users.js b/web/app/view/edit/Users.js
index 0aafb3dd..5c1c8efe 100644
--- a/web/app/view/edit/Users.js
+++ b/web/app/view/edit/Users.js
@@ -82,6 +82,13 @@ Ext.define('Traccar.view.edit.Users', {
glyph: 'xf0ae@FontAwesome',
tooltip: Strings.sharedComputedAttributes,
tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onDriversClick',
+ reference: 'userDriversButton',
+ glyph: 'xf2c2@FontAwesome',
+ tooltip: Strings.sharedDrivers,
+ tooltipType: 'title'
}]
},
diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js
index a6f150be..1fa17dfe 100644
--- a/web/app/view/edit/UsersController.js
+++ b/web/app/view/edit/UsersController.js
@@ -28,6 +28,7 @@ Ext.define('Traccar.view.edit.UsersController', {
'Traccar.view.permissions.UserCalendars',
'Traccar.view.permissions.UserUsers',
'Traccar.view.permissions.UserAttributes',
+ 'Traccar.view.permissions.UserDrivers',
'Traccar.view.Notifications',
'Traccar.view.BaseWindow',
'Traccar.model.User'
@@ -172,6 +173,22 @@ Ext.define('Traccar.view.edit.UsersController', {
}).show();
},
+ onDriversClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'userDriversView',
+ baseObjectName: 'userId',
+ linkObjectName: 'driverId',
+ storeName: 'AllDrivers',
+ linkStoreName: 'Drivers',
+ urlApi: 'api/permissions/drivers',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
onSelectionChange: function (selection, selected) {
var disabled = selected.length === 0;
@@ -181,6 +198,7 @@ Ext.define('Traccar.view.edit.UsersController', {
this.lookupReference('userNotificationsButton').setDisabled(disabled);
this.lookupReference('userCalendarsButton').setDisabled(disabled);
this.lookupReference('userAttributesButton').setDisabled(disabled);
+ this.lookupReference('userDriversButton').setDisabled(disabled);
this.lookupReference('userUsersButton').setDisabled(disabled || selected[0].get('userLimit') === 0);
this.callParent(arguments);
}
diff --git a/web/app/view/permissions/DeviceDrivers.js b/web/app/view/permissions/DeviceDrivers.js
new file mode 100644
index 00000000..d3aa20b6
--- /dev/null
+++ b/web/app/view/permissions/DeviceDrivers.js
@@ -0,0 +1,44 @@
+/*
+ * 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.view.permissions.DeviceDrivers', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'deviceDriversView',
+
+ requires: [
+ 'Ext.grid.filters.Filters'
+ ],
+
+ plugins: 'gridfilters',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }]
+ }
+});
diff --git a/web/app/view/permissions/GroupDrivers.js b/web/app/view/permissions/GroupDrivers.js
new file mode 100644
index 00000000..61aa10ad
--- /dev/null
+++ b/web/app/view/permissions/GroupDrivers.js
@@ -0,0 +1,44 @@
+/*
+ * 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.view.permissions.GroupDrivers', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'groupDriversView',
+
+ requires: [
+ 'Ext.grid.filters.Filters'
+ ],
+
+ plugins: 'gridfilters',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }]
+ }
+});
diff --git a/web/app/view/permissions/UserDrivers.js b/web/app/view/permissions/UserDrivers.js
new file mode 100644
index 00000000..8f88ddd8
--- /dev/null
+++ b/web/app/view/permissions/UserDrivers.js
@@ -0,0 +1,44 @@
+/*
+ * 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.view.permissions.UserDrivers', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'userDriversView',
+
+ requires: [
+ 'Ext.grid.filters.Filters'
+ ],
+
+ plugins: 'gridfilters',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }]
+ }
+});
diff --git a/web/l10n/en.json b/web/l10n/en.json
index 655b801f..ba34d066 100644
--- a/web/l10n/en.json
+++ b/web/l10n/en.json
@@ -31,6 +31,8 @@
"sharedNotifications": "Notifications",
"sharedAttributes": "Attributes",
"sharedAttribute": "Attribute",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
"sharedArea": "Area",
"sharedSound": "Notification Sound",
"sharedType": "Type",
@@ -196,6 +198,7 @@
"positionDtcs": "DTCs",
"positionObdSpeed": "OBD Speed",
"positionObdOdometer": "OBD Odometer",
+ "positionDriverUniqueId": "Driver Unique Id",
"serverTitle": "Server Settings",
"serverZoom": "Zoom",
"serverRegistration": "Registration",
@@ -269,6 +272,7 @@
"eventIgnitionOff": "Ignition is OFF",
"eventMaintenance": "Maintenance required",
"eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver has changed",
"eventsScrollToLast": "Scroll To Last",
"alarmSos": "SOS Alarm",
"alarmVibration": "Vibration Alarm",