aboutsummaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/app/Application.js7
-rw-r--r--web/app/model/Calendar.js34
-rw-r--r--web/app/model/Geofence.js3
-rw-r--r--web/app/store/AllCalendars.js30
-rw-r--r--web/app/store/Calendars.js30
-rw-r--r--web/app/view/CalendarDialog.js58
-rw-r--r--web/app/view/CalendarDialogController.js37
-rw-r--r--web/app/view/Calendars.js52
-rw-r--r--web/app/view/CalendarsController.js74
-rw-r--r--web/app/view/GeofenceDialog.js8
-rw-r--r--web/app/view/GeofencesController.js1
-rw-r--r--web/app/view/SettingsMenu.js6
-rw-r--r--web/app/view/SettingsMenuController.js12
-rw-r--r--web/app/view/UserCalendars.js49
-rw-r--r--web/app/view/Users.js10
-rw-r--r--web/app/view/UsersController.js21
-rw-r--r--web/l10n/en.json4
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",