From eec9ffbf8213f1df69162131245cb3282c68ca0a Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 14 Dec 2016 17:00:25 +0500 Subject: Calendars implementation --- web/app/Application.js | 7 ++- web/app/model/Calendar.js | 34 +++++++++++++++ web/app/model/Geofence.js | 3 ++ web/app/store/AllCalendars.js | 30 +++++++++++++ web/app/store/Calendars.js | 30 +++++++++++++ web/app/view/CalendarDialog.js | 58 +++++++++++++++++++++++++ web/app/view/CalendarDialogController.js | 37 ++++++++++++++++ web/app/view/Calendars.js | 52 ++++++++++++++++++++++ web/app/view/CalendarsController.js | 74 ++++++++++++++++++++++++++++++++ web/app/view/GeofenceDialog.js | 8 ++++ web/app/view/GeofencesController.js | 1 + web/app/view/SettingsMenu.js | 6 +++ web/app/view/SettingsMenuController.js | 12 ++++++ web/app/view/UserCalendars.js | 49 +++++++++++++++++++++ web/app/view/Users.js | 10 ++++- web/app/view/UsersController.js | 21 ++++++++- web/l10n/en.json | 6 ++- 17 files changed, 433 insertions(+), 5 deletions(-) create mode 100644 web/app/model/Calendar.js create mode 100644 web/app/store/AllCalendars.js create mode 100644 web/app/store/Calendars.js create mode 100644 web/app/view/CalendarDialog.js create mode 100644 web/app/view/CalendarDialogController.js create mode 100644 web/app/view/Calendars.js create mode 100644 web/app/view/CalendarsController.js create mode 100644 web/app/view/UserCalendars.js (limited to 'web') diff --git a/web/app/Application.js b/web/app/Application.js index 8619ba9..daa25b8 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 0000000..00b076b --- /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 . + */ + +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 63c8e8e..12a9f87 100644 --- a/web/app/model/Geofence.js +++ b/web/app/model/Geofence.js @@ -31,6 +31,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 0000000..2655728 --- /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 . + */ + +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 0000000..fa8e5c6 --- /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 . + */ + +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 0000000..31d898e --- /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 . + */ + +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.calendarFile, + allowBlank: false, + buttonConfig: { + glyph: 'xf093@FontAwesome', + text: "", + tooltip: Strings.calendarSelect, + 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 0000000..f90c811 --- /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 . + */ + +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) { + var b64String = btoa(String.fromCharCode.apply(null, new Uint8Array(event.target.result))); + fileField.up('window').lookupReference('calendarDataField').setValue(b64String); + }; + 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 0000000..a905a5b --- /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 . + */ + +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 0000000..d5ab57a --- /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 . + */ + +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 9f5bdbf..7b2112b 100644 --- a/web/app/view/GeofenceDialog.js +++ b/web/app/view/GeofenceDialog.js @@ -35,6 +35,14 @@ Ext.define('Traccar.view.GeofenceDialog', { xtype: 'textfield', name: 'description', fieldLabel: Strings.sharedDescription + }, { + xtype: 'combobox', + name: 'calendarId', + store: 'Calendars', + queryMode: 'local', + displayField: 'name', + valueField: 'id', + fieldLabel: Strings.sharedCalendar }, { xtype: 'hiddenfield', name: 'area', diff --git a/web/app/view/GeofencesController.js b/web/app/view/GeofencesController.js index 032ba7f..7838906 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 db436b3..c71c837 100644 --- a/web/app/view/SettingsMenu.js +++ b/web/app/view/SettingsMenu.js @@ -81,6 +81,12 @@ Ext.define('Traccar.view.SettingsMenu', { glyph: 'xf080@FontAwesome', handler: 'onStatisticsClick', reference: 'settingsStatisticsButton' + }, { + hidden: true, + text: Strings.sharedCalendars, + glyph: 'xf073@FontAwesome', + handler: 'onCalendarsClick', + reference: 'settingsCalendarsButton' }, { text: Strings.loginLogout, glyph: 'xf08b@FontAwesome', diff --git a/web/app/view/SettingsMenuController.js b/web/app/view/SettingsMenuController.js index 2b4b920..2f1685f 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 0000000..29bb99c --- /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 . + */ + +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 4259c4c..09a03cc 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 9b7076e..af9d47b 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 3732c1c..174ff88 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -41,6 +41,8 @@ "sharedDeviceDistance": "Device Distance", "sharedDevice": "Device", "sharedTestMail": "Send Test Email", + "sharedCalendar": "Calendar", + "sharedCalendars": "Calendars", "errorTitle": "Error", "errorUnknown": "Unknown error", "errorConnection": "Connection error", @@ -205,5 +207,7 @@ "categoryPlane": "Plane", "categoryMotorcycle": "Motorcycle", "categoryBicycle": "Bicycle", - "categoryPerson": "Person" + "categoryPerson": "Person", + "calendarFile": "Calendar File", + "calendarSelect": "Select Calendar File" } \ No newline at end of file -- cgit v1.2.3