diff options
-rw-r--r-- | web/app/Application.js | 7 | ||||
-rw-r--r-- | web/app/model/Calendar.js | 34 | ||||
-rw-r--r-- | web/app/model/Geofence.js | 3 | ||||
-rw-r--r-- | web/app/store/AllCalendars.js | 30 | ||||
-rw-r--r-- | web/app/store/Calendars.js | 30 | ||||
-rw-r--r-- | web/app/view/CalendarDialog.js | 58 | ||||
-rw-r--r-- | web/app/view/CalendarDialogController.js | 37 | ||||
-rw-r--r-- | web/app/view/Calendars.js | 52 | ||||
-rw-r--r-- | web/app/view/CalendarsController.js | 74 | ||||
-rw-r--r-- | web/app/view/GeofenceDialog.js | 8 | ||||
-rw-r--r-- | web/app/view/GeofencesController.js | 1 | ||||
-rw-r--r-- | web/app/view/SettingsMenu.js | 6 | ||||
-rw-r--r-- | web/app/view/SettingsMenuController.js | 12 | ||||
-rw-r--r-- | web/app/view/UserCalendars.js | 49 | ||||
-rw-r--r-- | web/app/view/Users.js | 10 | ||||
-rw-r--r-- | web/app/view/UsersController.js | 21 | ||||
-rw-r--r-- | web/l10n/en.json | 4 |
17 files changed, 432 insertions, 4 deletions
diff --git a/web/app/Application.js b/web/app/Application.js index 8619ba96..daa25b85 100644 --- a/web/app/Application.js +++ b/web/app/Application.js @@ -37,7 +37,8 @@ Ext.define('Traccar.Application', { 'Notification', 'AttributeAlias', 'ReportSummary', - 'ReportTrip' + 'ReportTrip', + 'Calendar' ], stores: [ @@ -70,7 +71,9 @@ Ext.define('Traccar.Application', { 'ReportTypes', 'ReportEventTypes', 'Statistics', - 'DeviceImages' + 'DeviceImages', + 'Calendars', + 'AllCalendars' ], controllers: [ diff --git a/web/app/model/Calendar.js b/web/app/model/Calendar.js new file mode 100644 index 00000000..00b076b3 --- /dev/null +++ b/web/app/model/Calendar.js @@ -0,0 +1,34 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.Calendar', { + extend: 'Ext.data.Model', + identifier: 'negative', + + fields: [{ + name: 'id', + type: 'int' + }, { + name: 'name', + type: 'string' + }, { + name: 'calendarData' + }, { + name: 'attributes' + }] +}); diff --git a/web/app/model/Geofence.js b/web/app/model/Geofence.js index 63c8e8e2..12a9f878 100644 --- a/web/app/model/Geofence.js +++ b/web/app/model/Geofence.js @@ -32,6 +32,9 @@ Ext.define('Traccar.model.Geofence', { name: 'area', type: 'string' }, { + name: 'calendarId', + type: 'int' + }, { name: 'attributes' }] }); diff --git a/web/app/store/AllCalendars.js b/web/app/store/AllCalendars.js new file mode 100644 index 00000000..26557287 --- /dev/null +++ b/web/app/store/AllCalendars.js @@ -0,0 +1,30 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.AllCalendars', { + extend: 'Ext.data.Store', + model: 'Traccar.model.Calendar', + + proxy: { + type: 'rest', + url: 'api/calendars', + extraParams: { + all: true + } + } +}); diff --git a/web/app/store/Calendars.js b/web/app/store/Calendars.js new file mode 100644 index 00000000..fa8e5c66 --- /dev/null +++ b/web/app/store/Calendars.js @@ -0,0 +1,30 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.Calendars', { + extend: 'Ext.data.Store', + model: 'Traccar.model.Calendar', + + proxy: { + type: 'rest', + url: 'api/calendars', + writer: { + writeAllFields: true + } + } +}); diff --git a/web/app/view/CalendarDialog.js b/web/app/view/CalendarDialog.js new file mode 100644 index 00000000..2609a6da --- /dev/null +++ b/web/app/view/CalendarDialog.js @@ -0,0 +1,58 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.CalendarDialog', { + extend: 'Traccar.view.BaseEditDialog', + + requires: [ + 'Traccar.view.CalendarDialogController' + ], + + controller: 'calendarDialog', + title: Strings.sharedCalendar, + + items: { + xtype: 'form', + items: [{ + xtype: 'textfield', + name: 'name', + fieldLabel: Strings.sharedName, + allowBlank: false + }, { + xtype: 'filefield', + name: 'file', + fieldLabel: Strings.sharedFile, + allowBlank: false, + buttonConfig: { + glyph: 'xf093@FontAwesome', + text: '', + tooltip: Strings.sharedSelectFile, + tooltipType: 'title', + minWidth: 0 + }, + listeners: { + change: 'onFileChange' + } + }, { + xtype: 'hiddenfield', + name: 'calendarData', + allowBlank: false, + reference: 'calendarDataField' + }] + } +}); diff --git a/web/app/view/CalendarDialogController.js b/web/app/view/CalendarDialogController.js new file mode 100644 index 00000000..48400bc5 --- /dev/null +++ b/web/app/view/CalendarDialogController.js @@ -0,0 +1,37 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.CalendarDialogController', { + extend: 'Traccar.view.BaseEditDialogController', + alias: 'controller.calendarDialog', + + onFileChange: function (fileField) { + var reader; + if (fileField.fileInputEl.dom.files.length > 0) { + reader = new FileReader(); + reader.onload = function (event) { + fileField.up('window').lookupReference('calendarDataField').setValue( + btoa(String.fromCharCode.apply(null, new Uint8Array(event.target.result)))); + }; + reader.onerror = function (event) { + Traccar.app.showError(event.target.error); + }; + reader.readAsArrayBuffer(fileField.fileInputEl.dom.files[0]); + } + } +}); diff --git a/web/app/view/Calendars.js b/web/app/view/Calendars.js new file mode 100644 index 00000000..a905a5ba --- /dev/null +++ b/web/app/view/Calendars.js @@ -0,0 +1,52 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.Calendars', { + extend: 'Ext.grid.Panel', + xtype: 'calendarsView', + + requires: [ + 'Traccar.view.CalendarsController', + 'Traccar.view.EditToolbar' + ], + + controller: 'calendars', + store: 'Calendars', + + selType: 'rowmodel', + + tbar: { + xtype: 'editToolbar' + }, + + listeners: { + selectionchange: 'onSelectionChange' + }, + + forceFit: true, + + columns: { + defaults: { + minWidth: Traccar.Style.columnWidthNormal + }, + items: [{ + text: Strings.sharedName, + dataIndex: 'name' + }] + } +}); diff --git a/web/app/view/CalendarsController.js b/web/app/view/CalendarsController.js new file mode 100644 index 00000000..d5ab57a5 --- /dev/null +++ b/web/app/view/CalendarsController.js @@ -0,0 +1,74 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.CalendarsController', { + extend: 'Ext.app.ViewController', + alias: 'controller.calendars', + + requires: [ + 'Traccar.view.CalendarDialog', + 'Traccar.model.Calendar' + ], + + init: function () { + Ext.getStore('Calendars').load(); + }, + + onAddClick: function () { + var calendar, dialog; + calendar = Ext.create('Traccar.model.Calendar'); + calendar.store = this.getView().getStore(); + dialog = Ext.create('Traccar.view.CalendarDialog'); + dialog.down('form').loadRecord(calendar); + dialog.show(); + }, + + onEditClick: function () { + var calendar, dialog; + calendar = this.getView().getSelectionModel().getSelection()[0]; + dialog = Ext.create('Traccar.view.CalendarDialog'); + dialog.down('form').loadRecord(calendar); + dialog.show(); + }, + + onRemoveClick: function () { + var calendar = this.getView().getSelectionModel().getSelection()[0]; + Ext.Msg.show({ + title: Strings.sharedCalendar, + message: Strings.sharedRemoveConfirm, + buttons: Ext.Msg.YESNO, + buttonText: { + yes: Strings.sharedRemove, + no: Strings.sharedCancel + }, + fn: function (btn) { + var store = Ext.getStore('Calendars'); + if (btn === 'yes') { + store.remove(calendar); + store.sync(); + } + } + }); + }, + + onSelectionChange: function (selected) { + var disabled = selected.length > 0; + this.lookupReference('toolbarEditButton').setDisabled(disabled); + this.lookupReference('toolbarRemoveButton').setDisabled(disabled); + } +}); diff --git a/web/app/view/GeofenceDialog.js b/web/app/view/GeofenceDialog.js index 9f5bdbf7..7b2112b3 100644 --- a/web/app/view/GeofenceDialog.js +++ b/web/app/view/GeofenceDialog.js @@ -36,6 +36,14 @@ Ext.define('Traccar.view.GeofenceDialog', { name: 'description', fieldLabel: Strings.sharedDescription }, { + xtype: 'combobox', + name: 'calendarId', + store: 'Calendars', + queryMode: 'local', + displayField: 'name', + valueField: 'id', + fieldLabel: Strings.sharedCalendar + }, { xtype: 'hiddenfield', name: 'area', allowBlank: false, diff --git a/web/app/view/GeofencesController.js b/web/app/view/GeofencesController.js index 032ba7fa..78389066 100644 --- a/web/app/view/GeofencesController.js +++ b/web/app/view/GeofencesController.js @@ -26,6 +26,7 @@ Ext.define('Traccar.view.GeofencesController', { init: function () { Ext.getStore('Geofences').load(); + Ext.getStore('Calendars').load(); }, onAddClick: function () { diff --git a/web/app/view/SettingsMenu.js b/web/app/view/SettingsMenu.js index db436b33..c71c8372 100644 --- a/web/app/view/SettingsMenu.js +++ b/web/app/view/SettingsMenu.js @@ -82,6 +82,12 @@ Ext.define('Traccar.view.SettingsMenu', { handler: 'onStatisticsClick', reference: 'settingsStatisticsButton' }, { + hidden: true, + text: Strings.sharedCalendars, + glyph: 'xf073@FontAwesome', + handler: 'onCalendarsClick', + reference: 'settingsCalendarsButton' + }, { text: Strings.loginLogout, glyph: 'xf08b@FontAwesome', handler: 'onLogoutClick' diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 2b4b9209..2f1685f0 100644 --- a/web/app/view/SettingsMenuController.js +++ b/web/app/view/SettingsMenuController.js @@ -30,6 +30,7 @@ Ext.define('Traccar.view.SettingsMenuController', { 'Traccar.view.AttributeAliases', 'Traccar.view.Statistics', 'Traccar.view.DeviceDistanceDialog', + 'Traccar.view.Calendars', 'Traccar.view.BaseWindow' ], @@ -47,6 +48,7 @@ Ext.define('Traccar.view.SettingsMenuController', { this.lookupReference('settingsGroupsButton').setHidden(false); this.lookupReference('settingsGeofencesButton').setHidden(false); this.lookupReference('settingsAttributeAliasesButton').setHidden(false); + this.lookupReference('settingsCalendarsButton').setHidden(false); } }, @@ -130,6 +132,16 @@ Ext.define('Traccar.view.SettingsMenuController', { dialog.show(); }, + onCalendarsClick: function () { + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedCalendars, + modal: false, + items: { + xtype: 'calendarsView' + } + }).show(); + }, + onLogoutClick: function () { Ext.create('Traccar.view.LoginController').logout(); } diff --git a/web/app/view/UserCalendars.js b/web/app/view/UserCalendars.js new file mode 100644 index 00000000..29bb99cb --- /dev/null +++ b/web/app/view/UserCalendars.js @@ -0,0 +1,49 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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.UserCalendars', { + extend: 'Ext.grid.Panel', + xtype: 'userCalendarsView', + + requires: [ + 'Traccar.view.BasePermissionsController' + ], + + controller: 'basePermissionsController', + + selModel: { + selType: 'checkboxmodel', + checkOnly: true, + showHeaderCheckbox: false + }, + + listeners: { + beforedeselect: 'onBeforeDeselect', + beforeselect: 'onBeforeSelect' + }, + + forceFit: true, + + columns: { + items: [{ + text: Strings.sharedName, + minWidth: Traccar.Style.columnWidthNormal, + dataIndex: 'name' + }] + } +}); diff --git a/web/app/view/Users.js b/web/app/view/Users.js index 4259c4c1..09a03cc2 100644 --- a/web/app/view/Users.js +++ b/web/app/view/Users.js @@ -1,5 +1,6 @@ /* - * Copyright 2015 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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 @@ -59,6 +60,13 @@ Ext.define('Traccar.view.Users', { glyph: 'xf003@FontAwesome', tooltip: Strings.sharedNotifications, tooltipType: 'title' + }, { + disabled: true, + handler: 'onCalendarsClick', + reference: 'userCalendarsButton', + glyph: 'xf073@FontAwesome', + tooltip: Strings.sharedCalendars, + tooltipType: 'title' }] }, diff --git a/web/app/view/UsersController.js b/web/app/view/UsersController.js index 9b7076e6..af9d47b2 100644 --- a/web/app/view/UsersController.js +++ b/web/app/view/UsersController.js @@ -1,5 +1,6 @@ /* - * Copyright 2015 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 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 @@ -24,6 +25,7 @@ Ext.define('Traccar.view.UsersController', { 'Traccar.view.UserDevices', 'Traccar.view.UserGroups', 'Traccar.view.UserGeofences', + 'Traccar.view.UserCalendars', 'Traccar.view.Notifications', 'Traccar.view.BaseWindow', 'Traccar.model.User' @@ -129,6 +131,22 @@ Ext.define('Traccar.view.UsersController', { }).show(); }, + onCalendarsClick: function () { + var user = this.getView().getSelectionModel().getSelection()[0]; + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedCalendars, + items: { + xtype: 'userCalendarsView', + baseObjectName: 'userId', + linkObjectName: 'calendarId', + storeName: 'AllCalendars', + linkStoreName: 'Calendars', + urlApi: 'api/permissions/calendars', + baseObject: user.getId() + } + }).show(); + }, + onSelectionChange: function (selected) { var disabled = selected.length > 0; this.lookupReference('toolbarEditButton').setDisabled(disabled); @@ -137,5 +155,6 @@ Ext.define('Traccar.view.UsersController', { this.lookupReference('userGroupsButton').setDisabled(disabled); this.lookupReference('userGeofencesButton').setDisabled(disabled); this.lookupReference('userNotificationsButton').setDisabled(disabled); + this.lookupReference('userCalendarsButton').setDisabled(disabled); } }); diff --git a/web/l10n/en.json b/web/l10n/en.json index 3732c1c2..f969db40 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -41,6 +41,10 @@ "sharedDeviceDistance": "Device Distance", "sharedDevice": "Device", "sharedTestMail": "Send Test Email", + "sharedCalendar": "Calendar", + "sharedCalendars": "Calendars", + "sharedFile": "File", + "sharedSelectFile": "Select File", "errorTitle": "Error", "errorUnknown": "Unknown error", "errorConnection": "Connection error", |