aboutsummaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/app/Application.js3
-rw-r--r--web/app/Resources.js7
-rw-r--r--web/app/store/Users.js38
-rw-r--r--web/app/view/device/Device.js5
-rw-r--r--web/app/view/device/DeviceController.js17
-rw-r--r--web/app/view/user/User.js56
-rw-r--r--web/app/view/user/UserController.js73
-rw-r--r--web/app/view/user/UserDialogController.js16
8 files changed, 212 insertions, 3 deletions
diff --git a/web/app/Application.js b/web/app/Application.js
index a024a1bf2..dbd5b1f96 100644
--- a/web/app/Application.js
+++ b/web/app/Application.js
@@ -33,7 +33,8 @@ Ext.define('Traccar.Application', {
stores: [
'Devices',
'Positions',
- 'LiveData'
+ 'LiveData',
+ 'Users'
],
controllers: [
diff --git a/web/app/Resources.js b/web/app/Resources.js
index 28bf31489..fa74a1e77 100644
--- a/web/app/Resources.js
+++ b/web/app/Resources.js
@@ -22,6 +22,7 @@ var strings = {
login_title: 'Login',
login_user_title: 'User',
+ login_users_title: 'Users',
login_name: 'Name',
login_email: 'Email',
login_password: 'Password',
@@ -31,6 +32,8 @@ var strings = {
login_failed: 'Incorrect email address or password',
login_created: 'New user has been registered',
+ user_remove_confirm: 'Remove user?',
+
device_dialog: 'Device',
device_title: 'Devices',
device_name: 'Name',
@@ -43,6 +46,7 @@ var strings = {
device_settings: 'Settings',
device_settings_user: 'Account',
device_settings_server: 'Server',
+ device_settings_users: 'Users',
report_title: 'Reports',
report_device: 'Device',
@@ -75,6 +79,9 @@ var strings = {
var styles = {
panel_padding: 10,
+ window_width: 640,
+ window_height: 480,
+
device_width: 350,
report_height: 250,
diff --git a/web/app/store/Users.js b/web/app/store/Users.js
new file mode 100644
index 000000000..004dc727e
--- /dev/null
+++ b/web/app/store/Users.js
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Ext.define('Traccar.store.Users', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.User',
+
+ proxy: {
+ type: 'ajax',
+ api: {
+ create: '/api/user/add',
+ read: '/api/user/get',
+ update: '/api/user/update',
+ destroy: '/api/user/remove'
+ },
+ reader: {
+ type: 'json',
+ rootProperty: 'data'
+ },
+ writer: {
+ type: 'json',
+ writeAllFields: true
+ }
+ }
+});
diff --git a/web/app/view/device/Device.js b/web/app/view/device/Device.js
index a166cb573..25c067242 100644
--- a/web/app/view/device/Device.js
+++ b/web/app/view/device/Device.js
@@ -54,6 +54,11 @@ Ext.define('Traccar.view.device.Device', {
disabled: true,
handler: 'onServerClick',
reference: 'settingsServerButton'
+ }, {
+ text: strings.device_settings_users,
+ disabled: true,
+ handler: 'onUsersClick',
+ reference: 'settingsUsersButton'
}]
}, {
text: strings.device_logout,
diff --git a/web/app/view/device/DeviceController.js b/web/app/view/device/DeviceController.js
index 451b6bbf3..f45f348b6 100644
--- a/web/app/view/device/DeviceController.js
+++ b/web/app/view/device/DeviceController.js
@@ -21,12 +21,14 @@ Ext.define('Traccar.view.device.DeviceController', {
requires: [
'Traccar.view.device.DeviceDialog',
'Traccar.view.user.UserDialog',
- 'Traccar.view.admin.ServerDialog'
+ 'Traccar.view.admin.ServerDialog',
+ 'Traccar.view.user.User'
],
init: function() {
if (Traccar.getApplication().getUser().get('admin')) {
this.lookupReference('settingsServerButton').setDisabled(false);
+ this.lookupReference('settingsUsersButton').setDisabled(false);
}
},
@@ -86,6 +88,19 @@ Ext.define('Traccar.view.device.DeviceController', {
var dialog = Ext.create('Traccar.view.admin.ServerDialog');
dialog.down('form').loadRecord(server);
dialog.show();
+ },
+
+ onUsersClick: function() {
+ Ext.create('Ext.window.Window', {
+ title: strings.login_users_title,
+ width: styles.window_width,
+ height: styles.window_height,
+ layout: 'fit',
+ modal: true,
+ items: {
+ xtype: 'user-view'
+ }
+ }).show();
}
});
diff --git a/web/app/view/user/User.js b/web/app/view/user/User.js
new file mode 100644
index 000000000..fa9c9201a
--- /dev/null
+++ b/web/app/view/user/User.js
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Ext.define('Traccar.view.user.User', {
+ extend: 'Ext.grid.Panel',
+ xtype: 'user-view',
+
+ requires: [
+ 'Traccar.view.user.UserController'
+ ],
+
+ controller: 'user',
+ store: 'Users',
+
+ selType: 'rowmodel',
+
+ tbar: [{
+ text: strings.device_add,
+ handler: 'onAddClick',
+ reference: 'deviceAddButton'
+ }, {
+ text: strings.device_edit,
+ disabled: true,
+ handler: 'onEditClick',
+ reference: 'userEditButton'
+ }, {
+ text: strings.device_remove,
+ disabled: true,
+ handler: 'onRemoveClick',
+ reference: 'userRemoveButton'
+ }],
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: [
+ { text: strings.login_name, dataIndex: 'name', flex: 1 },
+ { text: strings.login_email, dataIndex: 'email', flex: 1 },
+ { text: strings.login_admin, dataIndex: 'admin', flex: 1 }
+ ]
+
+});
diff --git a/web/app/view/user/UserController.js b/web/app/view/user/UserController.js
new file mode 100644
index 000000000..2b587b3d3
--- /dev/null
+++ b/web/app/view/user/UserController.js
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Ext.define('Traccar.view.user.UserController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.user',
+
+ requires: [
+ 'Traccar.view.user.UserDialog'
+ ],
+
+ init: function() {
+ Ext.getStore('Users').load();
+ },
+
+ onLogoutClick: function() {
+ Traccar.LoginManager.logout();
+ },
+
+ onAddClick: function() {
+ var user = Ext.create('Traccar.model.User');
+ var dialog = Ext.create('Traccar.view.user.UserDialog');
+ dialog.down('form').loadRecord(user);
+ dialog.show();
+ },
+
+ onEditClick: function() {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ var dialog = Ext.create('Traccar.view.user.UserDialog');
+ dialog.down('form').loadRecord(user);
+ dialog.show();
+ },
+
+ onRemoveClick: function() {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.Msg.show({
+ title: strings.login_user_title,
+ message: strings.user_remove_confirm,
+ buttons: Ext.Msg.YESNO,
+ buttonText: {
+ yes: strings.dialog_delete,
+ no: strings.dialog_cancel
+ },
+ fn: function(btn) {
+ if (btn === 'yes') {
+ var store = Ext.getStore('Users');
+ store.remove(user);
+ store.sync();
+ }
+ }
+ });
+ },
+
+ onSelectionChange: function(selected) {
+ var disabled = selected.length > 0;
+ this.lookupReference('userEditButton').setDisabled(disabled);
+ this.lookupReference('userRemoveButton').setDisabled(disabled);
+ }
+
+});
diff --git a/web/app/view/user/UserDialogController.js b/web/app/view/user/UserDialogController.js
index 4c6b6c42f..1ec14c5e8 100644
--- a/web/app/view/user/UserDialogController.js
+++ b/web/app/view/user/UserDialogController.js
@@ -21,7 +21,21 @@ Ext.define('Traccar.view.user.UserDialogController', {
onSaveClick: function(button) {
var dialog = button.up('window').down('form');
dialog.updateRecord();
- dialog.getRecord().save();
+ var record = dialog.getRecord();
+ if (record === Traccar.getApplication().getUser()) {
+ record.save();
+ } else {
+ var store = Ext.getStore('Users');
+ if (record.phantom) {
+ store.add(record);
+ }
+ store.sync({
+ failure: function(batch) {
+ store.rejectChanges(); // TODO
+ Traccar.ErrorManager.check(true, batch.exceptions[0].getResponse());
+ }
+ });
+ }
button.up('window').close();
},