From 71c5871dc0221d7a82851f2c3ca3cd2b594982f2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 9 Mar 2016 22:03:30 +1300 Subject: Add window to link users and groups --- web/app/Application.js | 1 + web/app/store/AllGroups.js | 28 +++++++++++++ web/app/view/UserDevices.js | 6 ++- web/app/view/UserGroups.js | 44 ++++++++++++++++++++ web/app/view/UserGroupsController.js | 79 ++++++++++++++++++++++++++++++++++++ web/app/view/Users.js | 5 +++ web/app/view/UsersController.js | 12 ++++++ 7 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 web/app/store/AllGroups.js create mode 100644 web/app/view/UserGroups.js create mode 100644 web/app/view/UserGroupsController.js diff --git a/web/app/Application.js b/web/app/Application.js index f81e87d5f..69ce8f891 100644 --- a/web/app/Application.js +++ b/web/app/Application.js @@ -36,6 +36,7 @@ Ext.define('Traccar.Application', { stores: [ 'Groups', 'Devices', + 'AllGroups', 'AllDevices', 'Positions', 'LatestPositions', diff --git a/web/app/store/AllGroups.js b/web/app/store/AllGroups.js new file mode 100644 index 000000000..880ccc8f5 --- /dev/null +++ b/web/app/store/AllGroups.js @@ -0,0 +1,28 @@ +/* + * Copyright 2016 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.AllGroups', { + extend: 'Ext.data.Store', + model: 'Traccar.model.Group', + + proxy: { + type: 'rest', + url: '/api/groups', + extraParams: { + all: true + } + } +}); diff --git a/web/app/view/UserDevices.js b/web/app/view/UserDevices.js index f42f7c1bb..fe16dd93a 100644 --- a/web/app/view/UserDevices.js +++ b/web/app/view/UserDevices.js @@ -38,9 +38,11 @@ Ext.define('Traccar.view.UserDevices', { columns: [{ text: Strings.sharedName, - dataIndex: 'name', flex: 1 + dataIndex: 'name', + flex: 1 }, { text: Strings.deviceIdentifier, - dataIndex: 'uniqueId', flex: 1 + dataIndex: 'uniqueId', + flex: 1 }] }); diff --git a/web/app/view/UserGroups.js b/web/app/view/UserGroups.js new file mode 100644 index 000000000..cb0f0bd5d --- /dev/null +++ b/web/app/view/UserGroups.js @@ -0,0 +1,44 @@ +/* + * Copyright 2016 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.UserGroups', { + extend: 'Ext.grid.Panel', + xtype: 'userGroupsView', + + requires: [ + 'Traccar.view.UserGroupsController' + ], + + controller: 'userGroups', + store: 'AllGroups', + + selModel: { + selType: 'checkboxmodel', + checkOnly: true, + showHeaderCheckbox: false + }, + + listeners: { + beforedeselect: 'onBeforeDeselect', + beforeselect: 'onBeforeSelect' + }, + + columns: [{ + text: Strings.sharedName, + dataIndex: 'name', + flex: 1 + }] +}); diff --git a/web/app/view/UserGroupsController.js b/web/app/view/UserGroupsController.js new file mode 100644 index 000000000..662508f0a --- /dev/null +++ b/web/app/view/UserGroupsController.js @@ -0,0 +1,79 @@ +/* + * Copyright 2016 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.UserGroupsController', { + extend: 'Ext.app.ViewController', + alias: 'controller.userGroups', + + init: function () { + this.userId = this.getView().user.getData().id; + this.getView().getStore().load({ + scope: this, + callback: function (records, operation, success) { + var userStore = Ext.create('Traccar.store.Groups'); + + userStore.load({ + params: { + userId: this.userId + }, + scope: this, + callback: function (records, operation, success) { + var i, index; + if (success) { + for (i = 0; i < records.length; i++) { + index = this.getView().getStore().find('id', records[i].getData().id); + this.getView().getSelectionModel().select(index, true, true); + } + } + } + }); + } + }); + }, + + onBeforeSelect: function (object, record, index) { + Ext.Ajax.request({ + scope: this, + url: '/api/permissions/groups', + jsonData: { + userId: this.userId, + groupId: record.getData().id + }, + callback: function (options, success, response) { + if (!success) { + Traccar.app.showError(response); + } + } + }); + }, + + onBeforeDeselect: function (object, record, index) { + Ext.Ajax.request({ + scope: this, + method: 'DELETE', + url: '/api/permissions/groups', + jsonData: { + userId: this.userId, + groupId: record.getData().id + }, + callback: function (options, success, response) { + if (!success) { + Traccar.app.showError(response); + } + } + }); + } +}); diff --git a/web/app/view/Users.js b/web/app/view/Users.js index 684931559..408a70885 100644 --- a/web/app/view/Users.js +++ b/web/app/view/Users.js @@ -35,6 +35,11 @@ Ext.define('Traccar.view.Users', { disabled: true, handler: 'onDevicesClick', reference: 'userDevicesButton' + }, { + text: Strings.settingsGroups, + disabled: true, + handler: 'onGroupsClick', + reference: 'userGroupsButton' }] }, diff --git a/web/app/view/UsersController.js b/web/app/view/UsersController.js index 3d0e813e8..6e8921026 100644 --- a/web/app/view/UsersController.js +++ b/web/app/view/UsersController.js @@ -75,10 +75,22 @@ Ext.define('Traccar.view.UsersController', { }).show(); }, + onGroupsClick: function () { + var user = this.getView().getSelectionModel().getSelection()[0]; + Ext.create('Traccar.view.BaseWindow', { + title: Strings.settingsGroups, + items: { + xtype: 'userDevicesView', + user: user + } + }).show(); + }, + onSelectionChange: function (selected) { var disabled = selected.length > 0; this.lookupReference('toolbarEditButton').setDisabled(disabled); this.lookupReference('toolbarRemoveButton').setDisabled(disabled); this.lookupReference('userDevicesButton').setDisabled(disabled); + this.lookupReference('userGroupsButton').setDisabled(disabled); } }); -- cgit v1.2.3