From 3a5e334b50bf35d11743d937c9fae2fb8c7829ec Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 19 Sep 2017 09:36:16 +0500 Subject: Implement Notifications per device --- web/app/view/DeviceMenu.js | 61 ++++++++++++++++ web/app/view/DeviceMenuController.js | 104 +++++++++++++++++++++++++++ web/app/view/Notifications.js | 72 ------------------- web/app/view/NotificationsController.js | 43 ----------- web/app/view/SettingsMenuController.js | 6 +- web/app/view/dialog/Notification.js | 66 +++++++++++++++++ web/app/view/dialog/SendCommand.js | 6 -- web/app/view/dialog/SendCommandController.js | 17 ----- web/app/view/edit/Devices.js | 23 ++---- web/app/view/edit/DevicesController.js | 59 ++------------- web/app/view/edit/Groups.js | 8 +++ web/app/view/edit/GroupsController.js | 17 +++++ web/app/view/edit/Notifications.js | 82 +++++++++++++++++++++ web/app/view/edit/NotificationsController.js | 32 +++++++++ web/app/view/edit/SavedCommands.js | 1 + web/app/view/edit/Users.js | 4 ++ web/app/view/edit/UsersController.js | 10 ++- web/app/view/permissions/Notifications.js | 73 +++++++++++++++++++ 18 files changed, 470 insertions(+), 214 deletions(-) create mode 100644 web/app/view/DeviceMenu.js create mode 100644 web/app/view/DeviceMenuController.js delete mode 100644 web/app/view/Notifications.js delete mode 100644 web/app/view/NotificationsController.js create mode 100644 web/app/view/dialog/Notification.js create mode 100644 web/app/view/edit/Notifications.js create mode 100644 web/app/view/edit/NotificationsController.js create mode 100644 web/app/view/permissions/Notifications.js (limited to 'web/app/view') diff --git a/web/app/view/DeviceMenu.js b/web/app/view/DeviceMenu.js new file mode 100644 index 00000000..236d5f4a --- /dev/null +++ b/web/app/view/DeviceMenu.js @@ -0,0 +1,61 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.DeviceMenu', { + extend: 'Ext.button.Button', + xtype: 'deviceMenu', + + requires: [ + 'Traccar.view.DeviceMenuController' + ], + + glyph: 'xf013@FontAwesome', + tooltip: Strings.settingsTitle, + tooltipType: 'title', + + menu: { + controller: 'deviceMenu', + + items: [{ + text: Strings.sharedDrivers, + glyph: 'xf2c2@FontAwesome', + handler: 'onDriversClick', + reference: 'menuDriversButton' + }, { + text: Strings.sharedGeofences, + glyph: 'xf21d@FontAwesome', + handler: 'onGeofencesClick', + reference: 'menuGeofencesButton' + }, { + text: Strings.sharedNotifications, + glyph: 'xf003@FontAwesome', + handler: 'onNotificationsClick', + reference: 'menuNotificationsButton' + }, { + text: Strings.sharedComputedAttributes, + glyph: 'xf0ae@FontAwesome', + handler: 'onComputedAttributesClick', + reference: 'menuComputedAttributesButton' + }, { + text: Strings.sharedSavedCommands, + glyph: 'xf093@FontAwesome', + handler: 'onCommandsClick', + reference: 'menuCommandsButton' + }] + } +}); diff --git a/web/app/view/DeviceMenuController.js b/web/app/view/DeviceMenuController.js new file mode 100644 index 00000000..58749a5e --- /dev/null +++ b/web/app/view/DeviceMenuController.js @@ -0,0 +1,104 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.DeviceMenuController', { + extend: 'Ext.app.ViewController', + alias: 'controller.deviceMenu', + + requires: [ + 'Traccar.view.permissions.Geofences', + 'Traccar.view.permissions.Drivers', + 'Traccar.view.permissions.Notifications', + 'Traccar.view.edit.ComputedAttributes', + 'Traccar.view.permissions.SavedCommands', + 'Traccar.view.BaseWindow' + ], + + init: function () { + this.lookupReference('menuDriversButton').setHidden( + Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers')); + this.lookupReference('menuComputedAttributesButton').setHidden( + Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes')); + this.lookupReference('menuCommandsButton').setHidden(Traccar.app.getPreference('limitCommands', false)); + }, + + onGeofencesClick: function () { + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedGeofences, + items: { + xtype: 'linkGeofencesView', + baseObjectName: 'deviceId', + linkObjectName: 'geofenceId', + storeName: 'Geofences', + baseObject: this.getView().ownerCmp.device.getId() + } + }).show(); + }, + + onNotificationsClick: function () { + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedNotifications, + items: { + xtype: 'linkNotificationsView', + baseObjectName: 'deviceId', + linkObjectName: 'notificationId', + storeName: 'Notifications', + baseObject: this.getView().ownerCmp.device.getId() + } + }).show(); + }, + + onComputedAttributesClick: function () { + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedComputedAttributes, + items: { + xtype: 'linkComputedAttributesView', + baseObjectName: 'deviceId', + linkObjectName: 'attributeId', + storeName: 'ComputedAttributes', + baseObject: this.getView().ownerCmp.device.getId() + } + }).show(); + }, + + onDriversClick: function () { + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedDrivers, + items: { + xtype: 'linkDriversView', + baseObjectName: 'deviceId', + linkObjectName: 'driverId', + storeName: 'Drivers', + baseObject: this.getView().ownerCmp.device.getId() + } + }).show(); + }, + + onCommandsClick: function () { + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedSavedCommands, + items: { + xtype: 'linkSavedCommandsView', + baseObjectName: 'deviceId', + linkObjectName: 'commandId', + storeName: 'Commands', + baseObject: this.getView().ownerCmp.device.getId() + } + }).show(); + } +}); diff --git a/web/app/view/Notifications.js b/web/app/view/Notifications.js deleted file mode 100644 index 8e022040..00000000 --- a/web/app/view/Notifications.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2016 Anton Tananaev (anton@traccar.org) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -Ext.define('Traccar.view.Notifications', { - extend: 'Ext.grid.Panel', - xtype: 'notificationsView', - - requires: [ - 'Traccar.view.NotificationsController' - ], - - controller: 'notificationsController', - store: 'Notifications', - - selModel: { - selType: 'cellmodel' - }, - - viewConfig: { - markDirty: false - }, - - columns: { - defaults: { - flex: 1, - minWidth: Traccar.Style.columnWidthNormal - }, - items: [{ - text: Strings.notificationType, - dataIndex: 'type', - flex: 2, - renderer: function (value) { - return Traccar.app.getEventString(value); - } - }, { - text: Strings.notificationWeb, - dataIndex: 'web', - xtype: 'checkcolumn', - listeners: { - checkChange: 'onCheckChange' - } - }, { - text: Strings.notificationMail, - dataIndex: 'mail', - xtype: 'checkcolumn', - listeners: { - checkChange: 'onCheckChange' - } - }, { - text: Strings.notificationSms, - dataIndex: 'sms', - xtype: 'checkcolumn', - listeners: { - checkChange: 'onCheckChange' - } - }] - } -}); diff --git a/web/app/view/NotificationsController.js b/web/app/view/NotificationsController.js deleted file mode 100644 index 651f57fc..00000000 --- a/web/app/view/NotificationsController.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2016 Anton Tananaev (anton@traccar.org) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -Ext.define('Traccar.view.NotificationsController', { - extend: 'Ext.app.ViewController', - alias: 'controller.notificationsController', - - init: function () { - this.getView().getStore().load({ - params: { - userId: this.getView().user.getId() - } - }); - }, - - onCheckChange: function (column, rowIndex) { - var record = this.getView().getStore().getAt(rowIndex); - Ext.Ajax.request({ - scope: this, - url: 'api/users/notifications', - jsonData: record.data, - callback: function (options, success, response) { - if (!success) { - Traccar.app.showError(response); - } - } - }); - } -}); diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index caa57a67..2ebb8589 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -27,7 +27,7 @@ Ext.define('Traccar.view.SettingsMenuController', { 'Traccar.view.edit.Groups', 'Traccar.view.edit.Geofences', 'Traccar.view.edit.Drivers', - 'Traccar.view.Notifications', + 'Traccar.view.edit.Notifications', 'Traccar.view.edit.ComputedAttributes', 'Traccar.view.Statistics', 'Traccar.view.dialog.DeviceDistance', @@ -110,12 +110,10 @@ Ext.define('Traccar.view.SettingsMenuController', { }, onNotificationsClick: function () { - var user = Traccar.app.getUser(); Ext.create('Traccar.view.BaseWindow', { title: Strings.sharedNotifications, items: { - xtype: 'notificationsView', - user: user + xtype: 'notificationsView' } }).show(); }, diff --git a/web/app/view/dialog/Notification.js b/web/app/view/dialog/Notification.js new file mode 100644 index 00000000..7e7fe452 --- /dev/null +++ b/web/app/view/dialog/Notification.js @@ -0,0 +1,66 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.dialog.Notification', { + extend: 'Traccar.view.dialog.BaseEdit', + + title: Strings.sharedNotification, + + items: { + xtype: 'form', + items: [{ + xtype: 'fieldset', + title: Strings.sharedRequired, + items: [{ + xtype: 'combobox', + name: 'type', + fieldLabel: Strings.sharedType, + store: 'AllNotificationTypes', + queryMode: 'local', + displayField: 'name', + valueField: 'type', + editable: false, + allowBlank: false + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'always', + fieldLabel: Strings.notificationAlways + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'web', + fieldLabel: Strings.notificationWeb + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'mail', + fieldLabel: Strings.notificationMail + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'sms', + fieldLabel: Strings.notificationSms + }] + }] + } +}); diff --git a/web/app/view/dialog/SendCommand.js b/web/app/view/dialog/SendCommand.js index f4224bec..9e07cbf3 100644 --- a/web/app/view/dialog/SendCommand.js +++ b/web/app/view/dialog/SendCommand.js @@ -79,12 +79,6 @@ Ext.define('Traccar.view.dialog.SendCommand', { }], buttons: [{ - glyph: 'xf093@FontAwesome', - text: Strings.sharedSavedCommands, - reference: 'linkButton', - handler: 'onLinkCommands', - hidden: true - }, { xtype: 'tbfill' }, { glyph: 'xf093@FontAwesome', diff --git a/web/app/view/dialog/SendCommandController.js b/web/app/view/dialog/SendCommandController.js index 0e9442ab..567be945 100644 --- a/web/app/view/dialog/SendCommandController.js +++ b/web/app/view/dialog/SendCommandController.js @@ -24,10 +24,6 @@ Ext.define('Traccar.view.dialog.SendCommandController', { 'Traccar.view.permissions.SavedCommands' ], - init: function () { - this.lookupReference('linkButton').setHidden(Traccar.app.getPreference('limitCommands', false)); - }, - onSendClick: function (button) { var record; this.fillAttributes(button); @@ -67,19 +63,6 @@ Ext.define('Traccar.view.dialog.SendCommandController', { this.lookupReference('sendButton').setDisabled(command.getId() === 0); }, - onLinkCommands: function () { - Ext.create('Traccar.view.BaseWindow', { - title: Strings.sharedSavedCommands, - items: { - xtype: 'linkSavedCommandsView', - baseObjectName: 'deviceId', - linkObjectName: 'commandId', - storeName: 'Commands', - baseObject: this.getView().deviceId - } - }).show(); - }, - onSendResult: function (options, success, response) { if (success) { this.closeView(); diff --git a/web/app/view/edit/Devices.js b/web/app/view/edit/Devices.js index 5ec452b8..d2ba0f3d 100644 --- a/web/app/view/edit/Devices.js +++ b/web/app/view/edit/Devices.js @@ -23,7 +23,8 @@ Ext.define('Traccar.view.edit.Devices', { 'Ext.grid.filters.Filters', 'Traccar.AttributeFormatter', 'Traccar.view.edit.DevicesController', - 'Traccar.view.ArrayListFilter' + 'Traccar.view.ArrayListFilter', + 'Traccar.view.DeviceMenu' ], controller: 'devices', @@ -64,27 +65,15 @@ Ext.define('Traccar.view.edit.Devices', { reference: 'toolbarRemoveButton', glyph: 'xf00d@FontAwesome', tooltip: Strings.sharedRemove - }, { - handler: 'onGeofencesClick', - reference: 'toolbarGeofencesButton', - glyph: 'xf21d@FontAwesome', - tooltip: Strings.sharedGeofences - }, { - handler: 'onAttributesClick', - reference: 'toolbarAttributesButton', - glyph: 'xf0ae@FontAwesome', - tooltip: Strings.sharedComputedAttributes - }, { - xtype: 'button', - handler: 'onDriversClick', - reference: 'toolbarDriversButton', - glyph: 'xf2c2@FontAwesome', - tooltip: Strings.sharedDrivers }, { handler: 'onCommandClick', reference: 'deviceCommandButton', glyph: 'xf093@FontAwesome', tooltip: Strings.deviceCommand + }, { + xtype: 'deviceMenu', + reference: 'toolbarDeviceMenu', + enableToggle: false }] }, diff --git a/web/app/view/edit/DevicesController.js b/web/app/view/edit/DevicesController.js index 915f724a..40202e75 100644 --- a/web/app/view/edit/DevicesController.js +++ b/web/app/view/edit/DevicesController.js @@ -62,58 +62,13 @@ 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')); + this.lookupReference('toolbarDeviceMenu').setHidden(readonly || deviceReadonly); setInterval(function () { self.getView().getView().refresh(); }, Traccar.Style.refreshPeriod); }, - onGeofencesClick: function () { - var device = this.getView().getSelectionModel().getSelection()[0]; - Ext.create('Traccar.view.BaseWindow', { - title: Strings.sharedGeofences, - items: { - xtype: 'linkGeofencesView', - baseObjectName: 'deviceId', - linkObjectName: 'geofenceId', - storeName: 'Geofences', - baseObject: device.getId() - } - }).show(); - }, - - onAttributesClick: function () { - var device = this.getView().getSelectionModel().getSelection()[0]; - Ext.create('Traccar.view.BaseWindow', { - title: Strings.sharedComputedAttributes, - items: { - xtype: 'linkComputedAttributesView', - baseObjectName: 'deviceId', - linkObjectName: 'attributeId', - storeName: 'ComputedAttributes', - baseObject: device.getId() - } - }).show(); - }, - - onDriversClick: function () { - var device = this.getView().getSelectionModel().getSelection()[0]; - Ext.create('Traccar.view.BaseWindow', { - title: Strings.sharedDrivers, - items: { - xtype: 'linkDriversView', - baseObjectName: 'deviceId', - linkObjectName: 'driverId', - storeName: 'Drivers', - baseObject: device.getId() - } - }).show(); - }, - onCommandClick: function () { var device, deviceId, dialog, typesStore, online, commandsStore; device = this.getView().getSelectionModel().getSelection()[0]; @@ -143,15 +98,15 @@ Ext.define('Traccar.view.edit.DevicesController', { }, updateButtons: function (selected) { - var readonly, deviceReadonly, empty; + var readonly, deviceReadonly, empty, deviceMenu; deviceReadonly = Traccar.app.getPreference('deviceReadonly', false) && !Traccar.app.getUser().get('admin'); readonly = Traccar.app.getPreference('readonly', false) && !Traccar.app.getUser().get('admin'); empty = selected.length === 0; this.lookupReference('toolbarEditButton').setDisabled(empty || readonly || deviceReadonly); 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); + deviceMenu = this.lookupReference('toolbarDeviceMenu'); + deviceMenu.device = empty ? null : selected[0]; + this.lookupReference('toolbarDeviceMenu').setDisabled(empty); this.lookupReference('deviceCommandButton').setDisabled(empty || readonly); }, @@ -166,7 +121,7 @@ Ext.define('Traccar.view.edit.DevicesController', { selectDevice: function (device) { this.getView().getSelectionModel().select([device], false, true); - this.updateButtons(this.getView().getSelectionModel()); + this.updateButtons(this.getView().getSelectionModel().getSelected().items); this.getView().getView().focusRow(device); }, @@ -177,7 +132,7 @@ Ext.define('Traccar.view.edit.DevicesController', { }, onUpdateDevice: function () { - this.updateButtons(this.getView().getSelectionModel()); + this.updateButtons(this.getView().getSelectionModel().getSelected().items); }, deselectFeature: function () { diff --git a/web/app/view/edit/Groups.js b/web/app/view/edit/Groups.js index 05c5723d..691df8ae 100644 --- a/web/app/view/edit/Groups.js +++ b/web/app/view/edit/Groups.js @@ -65,6 +65,14 @@ Ext.define('Traccar.view.edit.Groups', { glyph: 'xf093@FontAwesome', tooltip: Strings.sharedSavedCommands, tooltipType: 'title' + }, { + xtype: 'button', + disabled: true, + handler: 'onNotificationsClick', + reference: 'toolbarNotificationsButton', + glyph: 'xf003@FontAwesome', + tooltip: Strings.sharedNotifications, + tooltipType: 'title' }] }, diff --git a/web/app/view/edit/GroupsController.js b/web/app/view/edit/GroupsController.js index 872fea4a..a4ced617 100644 --- a/web/app/view/edit/GroupsController.js +++ b/web/app/view/edit/GroupsController.js @@ -105,12 +105,29 @@ Ext.define('Traccar.view.edit.GroupsController', { }).show(); }, + onNotificationsClick: function () { + var admin, group; + admin = Traccar.app.getUser().get('admin'); + group = this.getView().getSelectionModel().getSelection()[0]; + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedSavedCommands, + items: { + xtype: 'linkNotificationsView', + baseObjectName: 'groupId', + linkObjectName: 'notificationId', + storeName: admin ? 'AllNotifications' : 'Notifications', + baseObject: group.getId() + } + }).show(); + }, + onSelectionChange: function (selection, selected) { var disabled = selected.length === 0; this.lookupReference('toolbarGeofencesButton').setDisabled(disabled); this.lookupReference('toolbarAttributesButton').setDisabled(disabled); this.lookupReference('toolbarDriversButton').setDisabled(disabled); this.lookupReference('toolbarCommandsButton').setDisabled(disabled); + this.lookupReference('toolbarNotificationsButton').setDisabled(disabled); this.callParent(arguments); } }); diff --git a/web/app/view/edit/Notifications.js b/web/app/view/edit/Notifications.js new file mode 100644 index 00000000..8bbdb711 --- /dev/null +++ b/web/app/view/edit/Notifications.js @@ -0,0 +1,82 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.edit.Notifications', { + extend: 'Ext.grid.Panel', + xtype: 'notificationsView', + + requires: [ + 'Ext.grid.filters.Filters', + 'Traccar.view.edit.NotificationsController', + 'Traccar.view.edit.Toolbar' + ], + + plugins: 'gridfilters', + + controller: 'notifications', + store: 'Notifications', + + tbar: { + xtype: 'editToolbar' + }, + + listeners: { + selectionchange: 'onSelectionChange' + }, + + columns: { + defaults: { + flex: 1, + minWidth: Traccar.Style.columnWidthNormal + }, + items: [{ + text: Strings.notificationType, + dataIndex: 'type', + flex: 2, + renderer: function (value) { + return Traccar.app.getEventString(value); + }, + filter: { + type: 'list', + idField: 'type', + labelField: 'name', + store: 'AllNotificationTypes' + } + }, { + text: Strings.notificationAlways, + dataIndex: 'always', + renderer: Traccar.AttributeFormatter.getFormatter('always'), + filter: 'boolean' + }, { + text: Strings.notificationWeb, + dataIndex: 'web', + renderer: Traccar.AttributeFormatter.getFormatter('web'), + filter: 'boolean' + }, { + text: Strings.notificationMail, + dataIndex: 'mail', + renderer: Traccar.AttributeFormatter.getFormatter('mail'), + filter: 'boolean' + }, { + text: Strings.notificationSms, + dataIndex: 'sms', + renderer: Traccar.AttributeFormatter.getFormatter('sms'), + filter: 'boolean' + }] + } +}); diff --git a/web/app/view/edit/NotificationsController.js b/web/app/view/edit/NotificationsController.js new file mode 100644 index 00000000..bf6a6669 --- /dev/null +++ b/web/app/view/edit/NotificationsController.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 . + */ + +Ext.define('Traccar.view.edit.NotificationsController', { + extend: 'Traccar.view.edit.ToolbarController', + alias: 'controller.notifications', + + requires: [ + 'Traccar.view.dialog.Notification', + 'Traccar.model.Notification' + ], + + objectModel: 'Traccar.model.Notification', + objectDialog: 'Traccar.view.dialog.Notification', + removeTitle: Strings.sharedNotification + +}); diff --git a/web/app/view/edit/SavedCommands.js b/web/app/view/edit/SavedCommands.js index 869fbf9a..b0cf89d0 100644 --- a/web/app/view/edit/SavedCommands.js +++ b/web/app/view/edit/SavedCommands.js @@ -61,6 +61,7 @@ Ext.define('Traccar.view.edit.SavedCommands', { }, { text: Strings.notificationSms, dataIndex: 'textChannel', + renderer: Traccar.AttributeFormatter.getFormatter('textChannel'), filter: 'boolean' }] } diff --git a/web/app/view/edit/Users.js b/web/app/view/edit/Users.js index c77ba49b..d98d49ce 100644 --- a/web/app/view/edit/Users.js +++ b/web/app/view/edit/Users.js @@ -121,20 +121,24 @@ Ext.define('Traccar.view.edit.Users', { }, { text: Strings.userAdmin, dataIndex: 'admin', + renderer: Traccar.AttributeFormatter.getFormatter('admin'), filter: 'boolean' }, { text: Strings.serverReadonly, dataIndex: 'readonly', hidden: true, + renderer: Traccar.AttributeFormatter.getFormatter('readonly'), filter: 'boolean' }, { text: Strings.userDeviceReadonly, dataIndex: 'deviceReadonly', + renderer: Traccar.AttributeFormatter.getFormatter('deviceReadonly'), hidden: true, filter: 'boolean' }, { text: Strings.userDisabled, dataIndex: 'disabled', + renderer: Traccar.AttributeFormatter.getFormatter('disabled'), filter: 'boolean' }, { text: Strings.userExpirationTime, diff --git a/web/app/view/edit/UsersController.js b/web/app/view/edit/UsersController.js index f710ed24..db82b4f4 100644 --- a/web/app/view/edit/UsersController.js +++ b/web/app/view/edit/UsersController.js @@ -30,7 +30,7 @@ Ext.define('Traccar.view.edit.UsersController', { 'Traccar.view.permissions.ComputedAttributes', 'Traccar.view.permissions.Drivers', 'Traccar.view.permissions.SavedCommands', - 'Traccar.view.Notifications', + 'Traccar.view.permissions.Notifications', 'Traccar.view.BaseWindow', 'Traccar.model.User' ], @@ -125,8 +125,12 @@ Ext.define('Traccar.view.edit.UsersController', { Ext.create('Traccar.view.BaseWindow', { title: Strings.sharedNotifications, items: { - xtype: 'notificationsView', - user: user + xtype: 'linkNotificationsView', + baseObjectName: 'userId', + linkObjectName: 'notificationId', + storeName: 'AllNotifications', + linkStoreName: 'Notifications', + baseObject: user.getId() } }).show(); }, diff --git a/web/app/view/permissions/Notifications.js b/web/app/view/permissions/Notifications.js new file mode 100644 index 00000000..6538e67d --- /dev/null +++ b/web/app/view/permissions/Notifications.js @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +Ext.define('Traccar.view.permissions.Notifications', { + extend: 'Traccar.view.permissions.Base', + xtype: 'linkNotificationsView', + + requires: [ + 'Ext.grid.filters.Filters' + ], + + plugins: 'gridfilters', + + columns: { + items: [{ + text: Strings.notificationType, + dataIndex: 'type', + flex: 2, + renderer: function (value) { + return Traccar.app.getEventString(value); + }, + filter: { + type: 'list', + idField: 'type', + labelField: 'name', + store: 'AllNotificationTypes' + } + }, { + text: Strings.notificationAlways, + dataIndex: 'always', + flex: 1, + minWidth: Traccar.Style.columnWidthNormal, + renderer: Traccar.AttributeFormatter.getFormatter('always'), + filter: 'boolean' + }, { + text: Strings.notificationWeb, + dataIndex: 'web', + flex: 1, + minWidth: Traccar.Style.columnWidthNormal, + renderer: Traccar.AttributeFormatter.getFormatter('web'), + filter: 'boolean' + }, { + text: Strings.notificationMail, + dataIndex: 'mail', + flex: 1, + minWidth: Traccar.Style.columnWidthNormal, + renderer: Traccar.AttributeFormatter.getFormatter('mail'), + filter: 'boolean' + }, { + text: Strings.notificationSms, + dataIndex: 'sms', + flex: 1, + minWidth: Traccar.Style.columnWidthNormal, + renderer: Traccar.AttributeFormatter.getFormatter('sms'), + filter: 'boolean' + }] + } +}); -- cgit v1.2.3