From 647071c9483daa2046d7f75c335b2763672befc6 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 28 Jun 2016 22:49:08 +0500 Subject: Added attributes editor --- web/app/view/AttributeDialog.js | 39 +++++++++++++++ web/app/view/Attributes.js | 47 +++++++++++++++++ web/app/view/AttributesController.js | 97 ++++++++++++++++++++++++++++++++++++ web/app/view/UserDialog.js | 8 ++- web/app/view/UserDialogController.js | 18 +++++++ web/l10n/en.json | 1 + 6 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 web/app/view/AttributeDialog.js create mode 100644 web/app/view/Attributes.js create mode 100644 web/app/view/AttributesController.js diff --git a/web/app/view/AttributeDialog.js b/web/app/view/AttributeDialog.js new file mode 100644 index 000000000..6ba7aeedf --- /dev/null +++ b/web/app/view/AttributeDialog.js @@ -0,0 +1,39 @@ +/* + * 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.AttributeDialog', { + extend: 'Traccar.view.BaseEditDialog', + + requires: [ + 'Traccar.view.BaseEditDialogController' + ], + + controller: 'baseEditDialog', + title: Strings.stateName, + + items: { + xtype: 'form', + items: [{ + xtype: 'textfield', + name: 'name', + fieldLabel: Strings.sharedName + }, { + xtype: 'textfield', + name: 'value', + fieldLabel: Strings.stateValue + }] + } +}); diff --git a/web/app/view/Attributes.js b/web/app/view/Attributes.js new file mode 100644 index 000000000..4bc7d5509 --- /dev/null +++ b/web/app/view/Attributes.js @@ -0,0 +1,47 @@ +/* + * 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.Attributes', { + extend: 'Ext.grid.Panel', + xtype: 'attributesView', + + requires: [ + 'Traccar.view.AttributesController', + 'Traccar.view.EditToolbar' + ], + + controller: 'attributes', + + selType: 'rowmodel', + + tbar: { + xtype: 'editToolbar' + }, + + listeners: { + selectionchange: 'onSelectionChange' + }, + + columns: [{ + text: Strings.sharedName, + dataIndex: 'name', + flex: 1 + }, { + text: Strings.stateValue, + dataIndex: 'value', + flex: 1 + }] +}); diff --git a/web/app/view/AttributesController.js b/web/app/view/AttributesController.js new file mode 100644 index 000000000..cd202656f --- /dev/null +++ b/web/app/view/AttributesController.js @@ -0,0 +1,97 @@ +/* + * 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.AttributesController', { + extend: 'Ext.app.ViewController', + alias: 'controller.attributes', + + requires: [ + 'Traccar.view.AttributeDialog', + 'Traccar.store.Attributes' + ], + + init: function () { + var attribute, store, record, data = [], i = 0; + store = Ext.create('Traccar.store.Attributes'); + store.setProxy(Ext.create('Ext.data.proxy.Memory')); + for(var propertyName in this.getView().attributes) { + store.add(Ext.create('Traccar.model.Attribute', { + priority: i++, + name: propertyName, + value:this.getView().attributes[propertyName] + })); + } + store.addListener('add', function (store , records , index , eOpts) { + for (var i = 0; i < records.length; i++) { + this.getView().attributes[records[i].get('name')] = records[i].get('value'); + } + }, this); + store.addListener('update', function (store, record, operation , modifiedFieldNames , details , eOpts) { + if (operation === Ext.data.Model.EDIT) { + this.getView().attributes[record.get('name')] = record.get('value'); + } + }, this); + store.addListener('remove', function (store , records , index , isMove , eOpts) { + delete this.getView().attributes[records[index].get('name')]; + }, this); + + this.getView().setStore(store); + }, + + onAddClick: function () { + var attribute, dialog; + attribute = Ext.create('Traccar.model.Attribute'); + attribute.store = this.getView().getStore(); + dialog = Ext.create('Traccar.view.AttributeDialog'); + dialog.down('form').loadRecord(attribute); + dialog.show(); + }, + + onEditClick: function () { + var attribute, dialog; + attribute = this.getView().getSelectionModel().getSelection()[0]; + dialog = Ext.create('Traccar.view.AttributeDialog'); + dialog.down('form').loadRecord(attribute); + dialog.show(); + }, + + onRemoveClick: function () { + var attribute = this.getView().getSelectionModel().getSelection()[0]; + Ext.Msg.show({ + title: Strings.stateName, + message: Strings.sharedRemoveConfirm, + buttons: Ext.Msg.YESNO, + buttonText: { + yes: Strings.sharedRemove, + no: Strings.sharedCancel + }, + scope: this, + fn: function (btn) { + var store = this.getView().getStore(); + if (btn === 'yes') { + store.remove(attribute); + 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/UserDialog.js b/web/app/view/UserDialog.js index 6b768c887..02c1342ac 100644 --- a/web/app/view/UserDialog.js +++ b/web/app/view/UserDialog.js @@ -24,7 +24,7 @@ Ext.define('Traccar.view.UserDialog', { controller: 'userDialog', title: Strings.settingsUser, - items: { + items: [{ xtype: 'form', items: [{ xtype: 'textfield', @@ -89,5 +89,9 @@ Ext.define('Traccar.view.UserDialog', { fieldLabel: Strings.settingsTwelveHourFormat, allowBlank: false }] - } + }, { + xtype: 'button', + text : Strings.sharedAttributes, + handler: 'attributesView' + }] }); diff --git a/web/app/view/UserDialogController.js b/web/app/view/UserDialogController.js index 11f8c2f46..b3496fe6a 100644 --- a/web/app/view/UserDialogController.js +++ b/web/app/view/UserDialogController.js @@ -18,6 +18,10 @@ Ext.define('Traccar.view.UserDialogController', { extend: 'Ext.app.ViewController', alias: 'controller.userDialog', + requires: [ + 'Traccar.view.Attributes' + ], + init: function () { if (Traccar.app.getUser().get('admin')) { this.lookupReference('adminField').setDisabled(false); @@ -44,5 +48,19 @@ Ext.define('Traccar.view.UserDialogController', { }); } button.up('window').close(); + }, + + attributesView: function (button) { + var dialog, record; + dialog = button.up('window').down('form'); + record = dialog.getRecord(); + Ext.create('Traccar.view.BaseWindow', { + title: Strings.sharedAttributes, + modal: false, + items: { + xtype: 'attributesView', + attributes: record.get('attributes') + } + }).show(); } }); diff --git a/web/l10n/en.json b/web/l10n/en.json index 351ad462d..7ed2037ac 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -20,6 +20,7 @@ "sharedGeofence": "Geofence", "sharedGeofences": "Geofences", "sharedNotifications": "Notifications", + "sharedAttributes": "Attributes", "errorTitle": "Error", "errorUnknown": "Unknown error", "errorConnection": "Connection error", -- cgit v1.2.3