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/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 ++++++++- 11 files changed, 326 insertions(+), 2 deletions(-) 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/app/view') diff --git a/web/app/view/CalendarDialog.js b/web/app/view/CalendarDialog.js new file mode 100644 index 00000000..31d898ef --- /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 00000000..f90c811c --- /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 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 . + */ + +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 . + */ + +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 @@ -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 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 @@ -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 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 . + */ + +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); } }); -- cgit v1.2.3 From 917b1064c735486e37439d6d0e6d6d3642521297 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 15 Dec 2016 10:05:37 +0500 Subject: Remove variable and use single quotes. --- web/app/view/CalendarDialog.js | 2 +- web/app/view/CalendarDialogController.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'web/app/view') diff --git a/web/app/view/CalendarDialog.js b/web/app/view/CalendarDialog.js index 31d898ef..793f6ab2 100644 --- a/web/app/view/CalendarDialog.js +++ b/web/app/view/CalendarDialog.js @@ -40,7 +40,7 @@ Ext.define('Traccar.view.CalendarDialog', { allowBlank: false, buttonConfig: { glyph: 'xf093@FontAwesome', - text: "", + text: '', tooltip: Strings.calendarSelect, tooltipType: 'title', minWidth: 0 diff --git a/web/app/view/CalendarDialogController.js b/web/app/view/CalendarDialogController.js index f90c811c..48400bc5 100644 --- a/web/app/view/CalendarDialogController.js +++ b/web/app/view/CalendarDialogController.js @@ -25,8 +25,8 @@ Ext.define('Traccar.view.CalendarDialogController', { 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); + 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); -- cgit v1.2.3 From 0ef6dfe719c7d6e491f0f05e9c7838ff7c8dbef2 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 15 Dec 2016 16:39:59 +0500 Subject: Make strings more common --- web/app/view/CalendarDialog.js | 4 ++-- web/l10n/en.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'web/app/view') diff --git a/web/app/view/CalendarDialog.js b/web/app/view/CalendarDialog.js index 793f6ab2..2609a6da 100644 --- a/web/app/view/CalendarDialog.js +++ b/web/app/view/CalendarDialog.js @@ -36,12 +36,12 @@ Ext.define('Traccar.view.CalendarDialog', { }, { xtype: 'filefield', name: 'file', - fieldLabel: Strings.calendarFile, + fieldLabel: Strings.sharedFile, allowBlank: false, buttonConfig: { glyph: 'xf093@FontAwesome', text: '', - tooltip: Strings.calendarSelect, + tooltip: Strings.sharedSelectFile, tooltipType: 'title', minWidth: 0 }, diff --git a/web/l10n/en.json b/web/l10n/en.json index 174ff886..f969db40 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -43,6 +43,8 @@ "sharedTestMail": "Send Test Email", "sharedCalendar": "Calendar", "sharedCalendars": "Calendars", + "sharedFile": "File", + "sharedSelectFile": "Select File", "errorTitle": "Error", "errorUnknown": "Unknown error", "errorConnection": "Connection error", @@ -207,7 +209,5 @@ "categoryPlane": "Plane", "categoryMotorcycle": "Motorcycle", "categoryBicycle": "Bicycle", - "categoryPerson": "Person", - "calendarFile": "Calendar File", - "calendarSelect": "Select Calendar File" + "categoryPerson": "Person" } \ No newline at end of file -- cgit v1.2.3