Commit 9e9b0d7595c6731c1ebd785cafd73481c038c5c1

Authored by Chantsova Ekaterina
Committed by Andrew Shvayka
1 parent e253b644

Update widget settings

@@ -320,7 +320,7 @@ @@ -320,7 +320,7 @@
320 "templateHtml": "<tb-multiple-input-widget \n form-id=\"formId\"\n ctx=\"ctx\">\n</tb-multiple-input-widget>", 320 "templateHtml": "<tb-multiple-input-widget \n form-id=\"formId\"\n ctx=\"ctx\">\n</tb-multiple-input-widget>",
321 "templateCss": "", 321 "templateCss": "",
322 "controllerScript": "let $scope;\r\nlet settings;\r\nlet attributeService;\r\nlet toast;\r\nlet utils;\r\nlet types;\r\n\r\nself.onInit = function() {\r\n var scope = self.ctx.$scope;\r\n var id = self.ctx.$scope.$injector.get('utils').guid();\r\n scope.formId = \"form-\"+id;\r\n scope.ctx = self.ctx;\r\n}\r\n\r\nself.onDataUpdated = function() {\r\n self.ctx.$scope.$broadcast('multiple-input-data-updated', self.ctx.$scope.formId);\r\n}\r\n\r\nself.onResize = function() {\r\n self.ctx.$scope.$broadcast('multiple-input-resize', self.ctx.$scope.formId);\r\n}\r\n", 322 "controllerScript": "let $scope;\r\nlet settings;\r\nlet attributeService;\r\nlet toast;\r\nlet utils;\r\nlet types;\r\n\r\nself.onInit = function() {\r\n var scope = self.ctx.$scope;\r\n var id = self.ctx.$scope.$injector.get('utils').guid();\r\n scope.formId = \"form-\"+id;\r\n scope.ctx = self.ctx;\r\n}\r\n\r\nself.onDataUpdated = function() {\r\n self.ctx.$scope.$broadcast('multiple-input-data-updated', self.ctx.$scope.formId);\r\n}\r\n\r\nself.onResize = function() {\r\n self.ctx.$scope.$broadcast('multiple-input-resize', self.ctx.$scope.formId);\r\n}\r\n",
323 - "settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"MultipleInput\",\n \"properties\": {\n \"widgetTitle\": {\n \"title\": \"Widget title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"showActionButtons\":{\n \"title\":\"Show action buttons\",\n \"type\":\"boolean\",\n \"default\": true\n },\n \"showResultMessage\":{\n \"title\":\"Show result message\",\n \"type\":\"boolean\",\n \"default\": true\n },\n \"fieldsAlignment\": {\n \"title\": \"Fields alignment\",\n \"type\": \"string\",\n \"default\": \"row\"\n },\n \"fieldsInRow\": {\n \"title\": \"Number of fields in the row\",\n \"type\": \"number\",\n \"default\": \"2\"\n }\n },\n \"required\": []\n },\n \"form\": [\n \"widgetTitle\",\n \"showActionButtons\",\n \"showResultMessage\",\n {\n \"key\": \"fieldsAlignment\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"row\",\n \"label\": \"Row (default)\"\n },\n {\n \"value\": \"column\",\n \"label\": \"Column\"\n }\n ]\n },\n \"fieldsInRow\"\n ]\n}", 323 + "settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"MultipleInput\",\n \"properties\": {\n \"widgetTitle\": {\n \"title\": \"Widget title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"showActionButtons\":{\n \"title\":\"Show action buttons\",\n \"type\":\"boolean\",\n \"default\": true\n },\n \"updateAllValues\": {\n \"title\":\"Update all values, not only modified (only if action buttons are visible)\",\n \"type\":\"boolean\",\n \"default\": false\n },\n \"showResultMessage\":{\n \"title\":\"Show result message\",\n \"type\":\"boolean\",\n \"default\": true\n },\n \"showGroupTitle\": {\n \"title\":\"Show title for group of fields, related to different entities\",\n \"type\":\"boolean\",\n \"default\": false\n },\n \"groupTitle\": {\n \"title\": \"Group title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"fieldsAlignment\": {\n \"title\": \"Fields alignment\",\n \"type\": \"string\",\n \"default\": \"row\"\n },\n \"fieldsInRow\": {\n \"title\": \"Number of fields in the row\",\n \"type\": \"number\",\n \"default\": \"2\"\n }\n },\n \"required\": []\n },\n \"form\": [\n \"widgetTitle\",\n \"showActionButtons\",\n \"updateAllValues\",\n \"showResultMessage\",\n \"showGroupTitle\",\n \"groupTitle\",\n {\n \"key\": \"fieldsAlignment\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"row\",\n \"label\": \"Row (default)\"\n },\n {\n \"value\": \"column\",\n \"label\": \"Column\"\n }\n ]\n },\n \"fieldsInRow\"\n ]\n}",
324 "dataKeySettingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"DataKeySettings\",\n \"properties\": {\n \"dataKeyType\": {\n \"title\": \"Datakey type\",\n \"type\": \"string\",\n \"default\": \"server\"\n },\n \"dataKeyValueType\": {\n \"title\": \"Datakey value type\",\n \"type\": \"string\",\n \"default\": \"string\"\n },\n \"required\": {\n \"title\": \"Value is required\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"isEditable\": {\n \"title\": \"Ability to edit attribute\",\n \"type\": \"string\",\n \"default\": \"editable\"\n },\n \"disabledOnDataKey\": {\n \"title\": \"Disable on false value of another datakey (specify datakey name)\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"dataKeyHidden\": {\n \"title\": \"Hide input field\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"step\": {\n \"title\": \"Step interval between values (only for numbers)\",\n \"type\": \"number\",\n \"default\": \"1\"\n },\n \"requiredErrorMessage\": {\n \"title\": \"'Required' error message\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"icon\": {\n \"title\": \"Icon to show before input cell\",\n \"type\": \"string\",\n \"default\": \"\"\n }\n },\n \"required\": []\n },\n \"form\": [\n {\n \"key\": \"dataKeyType\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"server\",\n \"label\": \"Server attribute (default)\"\n },\n {\n \"value\": \"shared\",\n \"label\": \"Shared attribute\"\n },\n {\n \"value\": \"timeseries\",\n \"label\": \"Timeseries\"\n }\n ]\n },\n {\n \"key\": \"dataKeyValueType\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"string\",\n \"label\": \"String\"\n },\n {\n \"value\": \"double\",\n \"label\": \"Double\"\n },\n {\n \"value\": \"integer\",\n \"label\": \"Integer\"\n },\n {\n \"value\": \"booleanCheckbox\",\n \"label\": \"Boolean (Checkbox)\"\n },\n {\n \"value\": \"booleanSwitch\",\n \"label\": \"Boolean (Switch)\"\n },\n {\n \"value\": \"dateTime\",\n \"label\": \"Date & Time\"\n },\n {\n \"value\": \"date\",\n \"label\": \"Date\"\n },\n {\n \"value\": \"time\",\n \"label\": \"Time\"\n }\n ]\n },\n \"required\",\n {\n \"key\": \"isEditable\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"editable\",\n \"label\": \"Editable (default)\"\n },\n {\n \"value\": \"disabled\",\n \"label\": \"Disabled\"\n },\n {\n \"value\": \"readonly\",\n \"label\": \"Read-only\"\n }\n ]\n },\n \"disabledOnDataKey\",\n \"dataKeyHidden\",\n \"step\",\n \"requiredErrorMessage\",\n\t\t{\n \t\t\"key\": \"icon\",\n\t\t\t\"type\": \"icon\"\n\t\t}\n ]\n}\n", 324 "dataKeySettingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"DataKeySettings\",\n \"properties\": {\n \"dataKeyType\": {\n \"title\": \"Datakey type\",\n \"type\": \"string\",\n \"default\": \"server\"\n },\n \"dataKeyValueType\": {\n \"title\": \"Datakey value type\",\n \"type\": \"string\",\n \"default\": \"string\"\n },\n \"required\": {\n \"title\": \"Value is required\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"isEditable\": {\n \"title\": \"Ability to edit attribute\",\n \"type\": \"string\",\n \"default\": \"editable\"\n },\n \"disabledOnDataKey\": {\n \"title\": \"Disable on false value of another datakey (specify datakey name)\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"dataKeyHidden\": {\n \"title\": \"Hide input field\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"step\": {\n \"title\": \"Step interval between values (only for numbers)\",\n \"type\": \"number\",\n \"default\": \"1\"\n },\n \"requiredErrorMessage\": {\n \"title\": \"'Required' error message\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"icon\": {\n \"title\": \"Icon to show before input cell\",\n \"type\": \"string\",\n \"default\": \"\"\n }\n },\n \"required\": []\n },\n \"form\": [\n {\n \"key\": \"dataKeyType\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"server\",\n \"label\": \"Server attribute (default)\"\n },\n {\n \"value\": \"shared\",\n \"label\": \"Shared attribute\"\n },\n {\n \"value\": \"timeseries\",\n \"label\": \"Timeseries\"\n }\n ]\n },\n {\n \"key\": \"dataKeyValueType\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"string\",\n \"label\": \"String\"\n },\n {\n \"value\": \"double\",\n \"label\": \"Double\"\n },\n {\n \"value\": \"integer\",\n \"label\": \"Integer\"\n },\n {\n \"value\": \"booleanCheckbox\",\n \"label\": \"Boolean (Checkbox)\"\n },\n {\n \"value\": \"booleanSwitch\",\n \"label\": \"Boolean (Switch)\"\n },\n {\n \"value\": \"dateTime\",\n \"label\": \"Date & Time\"\n },\n {\n \"value\": \"date\",\n \"label\": \"Date\"\n },\n {\n \"value\": \"time\",\n \"label\": \"Time\"\n }\n ]\n },\n \"required\",\n {\n \"key\": \"isEditable\",\n \"type\": \"rc-select\",\n \"multiple\": false,\n \"items\": [\n {\n \"value\": \"editable\",\n \"label\": \"Editable (default)\"\n },\n {\n \"value\": \"disabled\",\n \"label\": \"Disabled\"\n },\n {\n \"value\": \"readonly\",\n \"label\": \"Read-only\"\n }\n ]\n },\n \"disabledOnDataKey\",\n \"dataKeyHidden\",\n \"step\",\n \"requiredErrorMessage\",\n\t\t{\n \t\t\"key\": \"icon\",\n\t\t\t\"type\": \"icon\"\n\t\t}\n ]\n}\n",
325 "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.23592248334107624,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Update Multiple Attributes\",\"dropShadow\":true,\"enableFullscreen\":false,\"enableDataExport\":false,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" 325 "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.23592248334107624,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Update Multiple Attributes\",\"dropShadow\":true,\"enableFullscreen\":false,\"enableDataExport\":false,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}"
326 } 326 }
@@ -53,6 +53,7 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService, @@ -53,6 +53,7 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService,
53 vm.discardAll = discardAll; 53 vm.discardAll = discardAll;
54 vm.inputChanged = inputChanged; 54 vm.inputChanged = inputChanged;
55 vm.save = save; 55 vm.save = save;
  56 + vm.getGroupTitle = getGroupTitle;
56 57
57 $scope.$watch('vm.ctx', function () { 58 $scope.$watch('vm.ctx', function () {
58 if (vm.ctx && vm.ctx.defaultSubscription) { 59 if (vm.ctx && vm.ctx.defaultSubscription) {
@@ -114,7 +115,7 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService, @@ -114,7 +115,7 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService,
114 var serverAttributes = [], sharedAttributes = [], telemetry = []; 115 var serverAttributes = [], sharedAttributes = [], telemetry = [];
115 for (let j = 0; j < data[i].keys.length; j++) { 116 for (let j = 0; j < data[i].keys.length; j++) {
116 var key = data[i].keys[j]; 117 var key = data[i].keys[j];
117 - if (key.data.currentValue !== key.data.originalValue) { 118 + if ((key.data.currentValue !== key.data.originalValue) || vm.settings.updateAllValues) {
118 var attribute = { 119 var attribute = {
119 key: key.name 120 key: key.name
120 }; 121 };
@@ -131,7 +132,11 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService, @@ -131,7 +132,11 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService,
131 attribute.value = key.data.currentValue; 132 attribute.value = key.data.currentValue;
132 } 133 }
133 } else { 134 } else {
134 - attribute.value = key.data.currentValue; 135 + if (key.data.currentValue === '') {
  136 + attribute.value = null;
  137 + } else {
  138 + attribute.value = key.data.currentValue;
  139 + }
135 } 140 }
136 141
137 switch (key.settings.dataKeyType) { 142 switch (key.settings.dataKeyType) {
@@ -201,6 +206,8 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService, @@ -201,6 +206,8 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService,
201 206
202 vm.ctx.widgetTitle = vm.widgetTitle; 207 vm.ctx.widgetTitle = vm.widgetTitle;
203 208
  209 + vm.settings.groupTitle = vm.settings.groupTitle || "${entityName}";
  210 +
204 //For backward compatibility 211 //For backward compatibility
205 if (angular.isUndefined(vm.settings.showActionButtons)) { 212 if (angular.isUndefined(vm.settings.showActionButtons)) {
206 vm.settings.showActionButtons = true; 213 vm.settings.showActionButtons = true;
@@ -329,4 +336,8 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService, @@ -329,4 +336,8 @@ function MultipleInputWidgetController($q, $scope, $translate, attributeService,
329 vm.changeAlignment = (vm.ctx.$container[0].offsetWidth < 620); 336 vm.changeAlignment = (vm.ctx.$container[0].offsetWidth < 620);
330 vm.smallWidthContainer = (vm.ctx.$container[0].offsetWidth < 420); 337 vm.smallWidthContainer = (vm.ctx.$container[0].offsetWidth < 420);
331 } 338 }
  339 +
  340 + function getGroupTitle(datasource) {
  341 + return utils.createLabelFromDatasource(datasource, vm.settings.groupTitle);
  342 + }
332 } 343 }
@@ -18,6 +18,16 @@ @@ -18,6 +18,16 @@
18 overflow-x: hidden; 18 overflow-x: hidden;
19 overflow-y: auto; 19 overflow-y: auto;
20 20
  21 + .fields-group {
  22 + padding: 0 8px;
  23 + margin: 10px 0;
  24 + border: 1px groove rgba(0, 0, 0, .25);
  25 +
  26 + legend {
  27 + color: rgba(0, 0, 0, .7);
  28 + }
  29 + }
  30 +
21 .input-field { 31 .input-field {
22 padding-right: 10px; 32 padding-right: 10px;
23 33
@@ -17,118 +17,121 @@ @@ -17,118 +17,121 @@
17 --> 17 -->
18 <form class="tb-multiple-input" name="multipleInputForm" ng-submit="vm.save()" novalidate autocomplete="off"> 18 <form class="tb-multiple-input" name="multipleInputForm" ng-submit="vm.save()" novalidate autocomplete="off">
19 <div style="padding: 0 8px;" ng-if="vm.entityDetected && vm.isAllParametersValid"> 19 <div style="padding: 0 8px;" ng-if="vm.entityDetected && vm.isAllParametersValid">
20 - <div layout="row" ng-repeat="source in vm.sources" layout-wrap ng-class="{'vertical-alignment': vm.isVerticalAlignment || vm.changeAlignment}">  
21 - <div ng-repeat="key in source.keys" ng-if="!key.settings.dataKeyHidden" ng-style="{'width': (vm.isVerticalAlignment || vm.changeAlignment) ? '100%' : vm.inputWidthSettings}">  
22 - <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'string')">  
23 - <md-input-container class="md-block">  
24 - <label>{{key.label}}</label>  
25 - <md-icon class="material-icons" ng-if="key.settings.icon">  
26 - {{key.settings.icon}}  
27 - </md-icon>  
28 - <input name="{{key.name}}"  
29 - ng-disabled="(key.settings.isEditable === 'disabled') || key.settings.disabledOnCondition"  
30 - ng-readonly="key.settings.isEditable === 'readonly'"  
31 - ng-model="key.data.currentValue"  
32 - ng-required="key.settings.required"  
33 - type="text"  
34 - md-select-on-focus  
35 - ng-blur="vm.inputChanged(source,key)">  
36 - <div ng-messages="multipleInputForm[key.name].$error">  
37 - <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>  
38 - </div>  
39 - </md-input-container>  
40 - </div>  
41 - <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'double')">  
42 - <md-input-container class="md-block">  
43 - <label>{{key.label}}</label>  
44 - <md-icon class="material-icons" ng-if="key.settings.icon">  
45 - {{key.settings.icon}}  
46 - </md-icon>  
47 - <input name="{{key.name}}"  
48 - ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"  
49 - ng-readonly="key.settings.isEditable === 'readonly'"  
50 - ng-model="key.data.currentValue"  
51 - ng-required="key.settings.required"  
52 - type="number"  
53 - step="key.settings.step"  
54 - md-select-on-focus  
55 - ng-blur="vm.inputChanged(source,key)">  
56 - <div ng-messages="multipleInputForm[key.name].$error">  
57 - <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>  
58 - </div>  
59 - </md-input-container>  
60 - </div>  
61 - <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'integer')">  
62 - <md-input-container class="md-block">  
63 - <label>{{key.label}}</label>  
64 - <md-icon class="material-icons" ng-if="key.settings.icon">  
65 - {{key.settings.icon}}  
66 - </md-icon>  
67 - <input name="{{key.name}}"  
68 - ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"  
69 - ng-readonly="key.settings.isEditable === 'readonly'"  
70 - ng-model="key.data.currentValue"  
71 - ng-required="key.settings.required"  
72 - type="number"  
73 - step="key.settings.step"  
74 - md-select-on-focus  
75 - ng-pattern="/^-?[0-9]+$/"  
76 - ng-blur="vm.inputChanged(source,key)">  
77 - <div ng-messages="multipleInputForm[key.name].$error">  
78 - <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>  
79 - <div translate ng-message="pattern">value.invalid-integer-value</div>  
80 - </div>  
81 - </md-input-container>  
82 - </div>  
83 - <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'booleanCheckbox')" class="md-block"> 20 + <fieldset ng-repeat="source in vm.sources" ng-class="{'fields-group': vm.settings.showGroupTitle}">
  21 + <legend class="group-title" ng-if="vm.settings.showGroupTitle">{{ vm.getGroupTitle(source.datasource) }}</legend>
  22 + <div layout="row" layout-wrap ng-class="{'vertical-alignment': vm.isVerticalAlignment || vm.changeAlignment}">
  23 + <div ng-repeat="key in source.keys" ng-if="!key.settings.dataKeyHidden" ng-style="{'width': (vm.isVerticalAlignment || vm.changeAlignment) ? '100%' : vm.inputWidthSettings}">
  24 + <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'string')">
  25 + <md-input-container class="md-block">
  26 + <label>{{key.label}}</label>
  27 + <md-icon class="material-icons" ng-if="key.settings.icon">
  28 + {{key.settings.icon}}
  29 + </md-icon>
  30 + <input name="{{key.name}}"
  31 + ng-disabled="(key.settings.isEditable === 'disabled') || key.settings.disabledOnCondition"
  32 + ng-readonly="key.settings.isEditable === 'readonly'"
  33 + ng-model="key.data.currentValue"
  34 + ng-required="key.settings.required"
  35 + type="text"
  36 + md-select-on-focus
  37 + ng-blur="vm.inputChanged(source,key)">
  38 + <div ng-messages="multipleInputForm[key.name].$error">
  39 + <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>
  40 + </div>
  41 + </md-input-container>
  42 + </div>
  43 + <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'double')">
  44 + <md-input-container class="md-block">
  45 + <label>{{key.label}}</label>
  46 + <md-icon class="material-icons" ng-if="key.settings.icon">
  47 + {{key.settings.icon}}
  48 + </md-icon>
  49 + <input name="{{key.name}}"
  50 + ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"
  51 + ng-readonly="key.settings.isEditable === 'readonly'"
  52 + ng-model="key.data.currentValue"
  53 + ng-required="key.settings.required"
  54 + type="number"
  55 + step="key.settings.step"
  56 + md-select-on-focus
  57 + ng-blur="vm.inputChanged(source,key)">
  58 + <div ng-messages="multipleInputForm[key.name].$error">
  59 + <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>
  60 + </div>
  61 + </md-input-container>
  62 + </div>
  63 + <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'integer')">
  64 + <md-input-container class="md-block">
  65 + <label>{{key.label}}</label>
  66 + <md-icon class="material-icons" ng-if="key.settings.icon">
  67 + {{key.settings.icon}}
  68 + </md-icon>
  69 + <input name="{{key.name}}"
  70 + ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"
  71 + ng-readonly="key.settings.isEditable === 'readonly'"
  72 + ng-model="key.data.currentValue"
  73 + ng-required="key.settings.required"
  74 + type="number"
  75 + step="key.settings.step"
  76 + md-select-on-focus
  77 + ng-pattern="/^-?[0-9]+$/"
  78 + ng-blur="vm.inputChanged(source,key)">
  79 + <div ng-messages="multipleInputForm[key.name].$error">
  80 + <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>
  81 + <div translate ng-message="pattern">value.invalid-integer-value</div>
  82 + </div>
  83 + </md-input-container>
  84 + </div>
  85 + <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'booleanCheckbox')" class="md-block">
84 <md-checkbox name="{{key.name}}" 86 <md-checkbox name="{{key.name}}"
85 ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition" 87 ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"
86 ng-model="key.data.currentValue" 88 ng-model="key.data.currentValue"
87 ng-change="vm.inputChanged(source,key)"> 89 ng-change="vm.inputChanged(source,key)">
88 {{key.label}} 90 {{key.label}}
89 </md-checkbox> 91 </md-checkbox>
90 - </div>  
91 - <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'booleanSwitch')" class="md-block"> 92 + </div>
  93 + <div class="input-field" ng-if="(key.settings.dataKeyValueType === 'booleanSwitch')" class="md-block">
92 <md-switch name="{{key.name}}" 94 <md-switch name="{{key.name}}"
93 - ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"  
94 - ng-model="key.data.currentValue"  
95 - ng-change="vm.inputChanged(source,key)"  
96 - aria-label="{{key.label}}"  
97 - md-invert> 95 + ng-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"
  96 + ng-model="key.data.currentValue"
  97 + ng-change="vm.inputChanged(source,key)"
  98 + aria-label="{{key.label}}"
  99 + md-invert>
98 {{key.label}} 100 {{key.label}}
99 </md-switch> 101 </md-switch>
100 - </div>  
101 - <div ng-if="(key.settings.dataKeyValueType === 'dateTime') ||  
102 - (key.settings.dataKeyValueType === 'date') ||  
103 - (key.settings.dataKeyValueType === 'time')"  
104 - class="md-block input-field date-time-input" layout="column">  
105 - <label class="date-time-input__label">{{key.label}}</label>  
106 - <div layout="row" ng-class="{'vertically-aligned': vm.smallWidthContainer}">  
107 - <mdp-date-picker name="{{key.name + 'Date'}}"  
108 - ng-if="key.settings.dataKeyValueType !== 'time'"  
109 - mdp-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"  
110 - ng-model="key.data.currentValue"  
111 - ng-change="vm.inputChanged(source,key)"  
112 - mdp-placeholder="{{ 'widgets.input-widgets.date' | translate }}">  
113 - <div ng-messages="multipleInputForm[key.name].$error">  
114 - <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>  
115 - </div>  
116 - </mdp-date-picker>  
117 - <mdp-time-picker name="{{key.name + 'Time'}}"  
118 - ng-if="key.settings.dataKeyValueType !== 'date'"  
119 - mdp-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"  
120 - ng-model="key.data.currentValue"  
121 - ng-change="vm.inputChanged(source,key)"  
122 - mdp-placeholder="{{ 'widgets.input-widgets.time' | translate }}"  
123 - mdp-auto-switch="true">  
124 - <div ng-messages="multipleInputForm[key.name].$error">  
125 - <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>  
126 - </div>  
127 - </mdp-time-picker> 102 + </div>
  103 + <div ng-if="(key.settings.dataKeyValueType === 'dateTime') ||
  104 + (key.settings.dataKeyValueType === 'date') ||
  105 + (key.settings.dataKeyValueType === 'time')"
  106 + class="md-block input-field date-time-input" layout="column">
  107 + <label class="date-time-input__label">{{key.label}}</label>
  108 + <div layout="row" ng-class="{'vertically-aligned': vm.smallWidthContainer}">
  109 + <mdp-date-picker name="{{key.name + 'Date'}}"
  110 + ng-if="key.settings.dataKeyValueType !== 'time'"
  111 + mdp-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"
  112 + ng-model="key.data.currentValue"
  113 + ng-change="vm.inputChanged(source,key)"
  114 + mdp-placeholder="{{ 'widgets.input-widgets.date' | translate }}">
  115 + <div ng-messages="multipleInputForm[key.name].$error">
  116 + <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>
  117 + </div>
  118 + </mdp-date-picker>
  119 + <mdp-time-picker name="{{key.name + 'Time'}}"
  120 + ng-if="key.settings.dataKeyValueType !== 'date'"
  121 + mdp-disabled="key.settings.isEditable === 'disabled' || key.settings.disabledOnCondition"
  122 + ng-model="key.data.currentValue"
  123 + ng-change="vm.inputChanged(source,key)"
  124 + mdp-placeholder="{{ 'widgets.input-widgets.time' | translate }}"
  125 + mdp-auto-switch="true">
  126 + <div ng-messages="multipleInputForm[key.name].$error">
  127 + <div ng-message="required">{{ key.settings.requiredErrorMessage }}</div>
  128 + </div>
  129 + </mdp-time-picker>
  130 + </div>
128 </div> 131 </div>
129 </div> 132 </div>
130 </div> 133 </div>
131 - </div> 134 + </fieldset>
132 <div class="md-padding" layout="row" layout-align="end center" ng-if="vm.entityDetected && vm.settings.showActionButtons"> 135 <div class="md-padding" layout="row" layout-align="end center" ng-if="vm.entityDetected && vm.settings.showActionButtons">
133 <md-button class="md-primary" ng-click="vm.discardAll()" style="max-height: 50px; margin-right:20px;" ng-disabled="!multipleInputForm.$dirty"> 136 <md-button class="md-primary" ng-click="vm.discardAll()" style="max-height: 50px; margin-right:20px;" ng-disabled="!multipleInputForm.$dirty">
134 {{ 'action.undo' | translate }} 137 {{ 'action.undo' | translate }}