aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--web/app/view/AttributeDialog.js39
-rw-r--r--web/app/view/Attributes.js47
-rw-r--r--web/app/view/AttributesController.js97
-rw-r--r--web/app/view/UserDialog.js8
-rw-r--r--web/app/view/UserDialogController.js18
-rw-r--r--web/l10n/en.json1
6 files changed, 208 insertions, 2 deletions
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",