From eaa0044002aeaff0b5df11f8463a068a6ff2284d Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 6 Jun 2015 23:18:49 +1200 Subject: Add user management window --- web/app/Application.js | 3 +- web/app/Resources.js | 7 +++ web/app/store/Users.js | 38 ++++++++++++++++ web/app/view/device/Device.js | 5 +++ web/app/view/device/DeviceController.js | 17 ++++++- web/app/view/user/User.js | 56 ++++++++++++++++++++++++ web/app/view/user/UserController.js | 73 +++++++++++++++++++++++++++++++ web/app/view/user/UserDialogController.js | 16 ++++++- 8 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 web/app/store/Users.js create mode 100644 web/app/view/user/User.js create mode 100644 web/app/view/user/UserController.js (limited to 'web') 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(); }, -- cgit v1.2.3