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/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 ++++++- 5 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 web/app/view/user/User.js create mode 100644 web/app/view/user/UserController.js (limited to 'web/app/view') 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