@beinformed/ui 1.23.0 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/esm/models/attributes/input-constraints/NumberGroupingConstraint.js +9 -5
- package/esm/models/attributes/input-constraints/NumberGroupingConstraint.js.map +1 -1
- package/esm/models/attributes/layouthint-rules/DependentAttribute.js +29 -29
- package/esm/models/attributes/layouthint-rules/DependentAttribute.js.map +1 -1
- package/lib/models/attributes/input-constraints/NumberGroupingConstraint.js +9 -5
- package/lib/models/attributes/input-constraints/NumberGroupingConstraint.js.flow +17 -7
- package/lib/models/attributes/input-constraints/NumberGroupingConstraint.js.map +1 -1
- package/lib/models/attributes/layouthint-rules/DependentAttribute.js +32 -32
- package/lib/models/attributes/layouthint-rules/DependentAttribute.js.flow +16 -20
- package/lib/models/attributes/layouthint-rules/DependentAttribute.js.map +1 -1
- package/package.json +1 -1
- package/src/models/attributes/input-constraints/NumberGroupingConstraint.js +17 -7
- package/src/models/attributes/layouthint-rules/DependentAttribute.js +16 -20
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [1.23.2](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.23.1...v1.23.2) (2022-11-16)
|
|
6
|
+
|
|
7
|
+
### [1.23.1](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.23.0...v1.23.1) (2022-09-26)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* **DependentAttribute:** DependentAttribute extended to work with empty and not empty attribute value ([9cf3864](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/9cf38644e032b0cfea0e8a8561baa2ca7aa9eb49))
|
|
13
|
+
|
|
5
14
|
## [1.23.0](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.22.1...v1.23.0) (2022-09-22)
|
|
6
15
|
|
|
7
16
|
|
|
@@ -92,22 +92,26 @@ class NumberGroupingConstraint {
|
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
94
|
*/
|
|
95
|
+
// $FlowFixMe
|
|
95
96
|
|
|
96
97
|
|
|
97
98
|
hasCorrectGrouping(value) {
|
|
98
|
-
|
|
99
|
+
// A negative or a negative value may cause an incorrect group length compared to groupSize. To avoid this, the negative or positive sign must be removed from the value.
|
|
100
|
+
const absStringValue = value.replace("-", "").replace("+", "");
|
|
101
|
+
|
|
102
|
+
if (!_includesInstanceProperty(absStringValue).call(absStringValue, this.groupingSeparator)) {
|
|
99
103
|
return true;
|
|
100
104
|
}
|
|
101
105
|
|
|
102
|
-
let integer =
|
|
106
|
+
let integer = absStringValue;
|
|
103
107
|
|
|
104
|
-
if (this.decimalSeparator !== "" && _includesInstanceProperty(
|
|
108
|
+
if (this.decimalSeparator !== "" && _includesInstanceProperty(absStringValue).call(absStringValue, this.decimalSeparator)) {
|
|
105
109
|
// decimal before grouping
|
|
106
|
-
if (
|
|
110
|
+
if (absStringValue.indexOf(this.decimalSeparator) < absStringValue.indexOf(this.groupingSeparator)) {
|
|
107
111
|
return false;
|
|
108
112
|
}
|
|
109
113
|
|
|
110
|
-
integer =
|
|
114
|
+
integer = absStringValue.substring(0, absStringValue.indexOf(this.decimalSeparator));
|
|
111
115
|
}
|
|
112
116
|
|
|
113
117
|
let groups = integer.split(this.groupingSeparator); // when the first item is smaller than group size, remove it from check
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberGroupingConstraint.js","names":["DecimalFormat","DEFAULT_GROUPING_SIZE","NumberGroupingConstraint","constructor","groupingSeparator","decimalSeparator","format","_decimalSeparator","_groupingSeparator","_format","id","groupSize","fromFormat","comma","hasValidation","defaultMessage","parameters","hasCorrectGrouping","value","integer","indexOf","
|
|
1
|
+
{"version":3,"file":"NumberGroupingConstraint.js","names":["DecimalFormat","DEFAULT_GROUPING_SIZE","NumberGroupingConstraint","constructor","groupingSeparator","decimalSeparator","format","_decimalSeparator","_groupingSeparator","_format","id","groupSize","fromFormat","comma","hasValidation","defaultMessage","parameters","hasCorrectGrouping","value","absStringValue","replace","integer","indexOf","substring","groups","split","length","every","group","validate","isMandatoryConstraint"],"sources":["../../../../src/models/attributes/input-constraints/NumberGroupingConstraint.js"],"sourcesContent":["// @flow\nimport DecimalFormat from \"../../../utils/number/DecimalFormat\";\n\nimport type { IConstraintModel } from \"../../types\";\n\nconst DEFAULT_GROUPING_SIZE = 3;\n\n/**\n */\nclass NumberGroupingConstraint implements IConstraintModel {\n _decimalSeparator: string;\n _groupingSeparator: string;\n _format: string;\n\n /**\n */\n constructor(\n groupingSeparator: string = \",\",\n decimalSeparator: string = \".\",\n format: ?string = \"0\"\n ) {\n this._decimalSeparator = decimalSeparator;\n this._groupingSeparator = groupingSeparator;\n this._format = format ?? \"0\";\n }\n\n /**\n */\n get id(): string {\n return \"Constraint.Number.GroupingSeparator\";\n }\n\n /**\n */\n get decimalSeparator(): string {\n return this._decimalSeparator;\n }\n\n /**\n */\n get groupingSeparator(): string {\n return this._groupingSeparator;\n }\n\n /**\n */\n get format(): string {\n return this._format;\n }\n\n /**\n */\n get groupSize(): number {\n if (this.format) {\n const fromFormat = new DecimalFormat(this.format).comma;\n if (fromFormat > 0) {\n return fromFormat;\n }\n }\n\n return DEFAULT_GROUPING_SIZE;\n }\n\n /**\n */\n hasValidation(): boolean {\n return true;\n }\n\n /**\n */\n get defaultMessage(): string {\n return \"Group divider '${group-divider}' must be correctly placed\"; // NOSONAR\n }\n\n /**\n */\n get parameters(): { \"group-divider\": string } {\n return { \"group-divider\": this.groupingSeparator };\n }\n\n /**\n */\n // $FlowFixMe\n hasCorrectGrouping(value: string) {\n // A negative or a negative value may cause an incorrect group length compared to groupSize. To avoid this, the negative or positive sign must be removed from the value.\n const absStringValue = value.replace(\"-\", \"\").replace(\"+\", \"\");\n\n if (!absStringValue.includes(this.groupingSeparator)) {\n return true;\n }\n\n let integer = absStringValue;\n if (\n this.decimalSeparator !== \"\" &&\n absStringValue.includes(this.decimalSeparator)\n ) {\n // decimal before grouping\n if (\n absStringValue.indexOf(this.decimalSeparator) <\n absStringValue.indexOf(this.groupingSeparator)\n ) {\n return false;\n }\n\n integer = absStringValue.substring(\n 0,\n absStringValue.indexOf(this.decimalSeparator)\n );\n }\n\n let groups = integer.split(this.groupingSeparator);\n\n // when the first item is smaller than group size, remove it from check\n if (groups[0].length < this.groupSize) {\n groups = groups.slice(1);\n }\n\n return groups.every((group) => group.length === this.groupSize);\n }\n\n /**\n */\n validate(value: string | number): boolean {\n return (\n this.groupingSeparator === \"\" ||\n typeof value !== \"string\" ||\n !value.includes(this.groupingSeparator) ||\n this.hasCorrectGrouping(value)\n );\n }\n\n /**\n */\n get isMandatoryConstraint(): boolean {\n return false;\n }\n}\n\nexport default NumberGroupingConstraint;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
|
|
2
|
-
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
|
|
3
2
|
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
|
4
3
|
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
|
5
4
|
import _trimInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/trim";
|
|
5
|
+
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
|
|
6
6
|
import BaseLayoutHintRule from "./BaseLayoutHintRule";
|
|
7
7
|
import { DEPENDENT_ATTRIBUTE_CONTROL, DEPENDENT_ATTRIBUTE } from "../../../constants";
|
|
8
8
|
import ChoiceAttributeModel from "../ChoiceAttributeModel";
|
|
@@ -16,25 +16,10 @@ const NOT_IS_EMPTY = "notIsEmpty";
|
|
|
16
16
|
const IS_EMPTY = "isEmpty";
|
|
17
17
|
const SHOW = "show";
|
|
18
18
|
const HIDE = "hide";
|
|
19
|
-
/**
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
const compareSelectedAttribute = (option, selectedAttribute) => {
|
|
23
|
-
if (option === NOT_IS_EMPTY && (selectedAttribute === null || selectedAttribute === void 0 ? void 0 : selectedAttribute.length) !== 0) {
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (option === IS_EMPTY && (selectedAttribute === null || selectedAttribute === void 0 ? void 0 : selectedAttribute.length) === 0) {
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return selectedAttribute === null || selectedAttribute === void 0 ? void 0 : _includesInstanceProperty(selectedAttribute).call(selectedAttribute, option);
|
|
32
|
-
};
|
|
33
19
|
/**
|
|
34
20
|
* Depending attributes hint logic
|
|
35
21
|
*/
|
|
36
22
|
|
|
37
|
-
|
|
38
23
|
class DependentAttribute extends BaseLayoutHintRule {
|
|
39
24
|
constructor() {
|
|
40
25
|
super(...arguments);
|
|
@@ -69,20 +54,21 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
69
54
|
|
|
70
55
|
|
|
71
56
|
static initHint(hint) {
|
|
72
|
-
var _context3, _context4, _context5, _context6;
|
|
57
|
+
var _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10;
|
|
73
58
|
|
|
74
59
|
const rule = this.getRuleInstance();
|
|
75
60
|
|
|
76
|
-
const OPERATORS = _concatInstanceProperty(_context3 = _concatInstanceProperty(_context4 = "".concat(EQUALS, "|").concat(INCLUDES, "|")).call(
|
|
61
|
+
const OPERATORS = _concatInstanceProperty(_context3 = _concatInstanceProperty(_context4 = _concatInstanceProperty(_context5 = _concatInstanceProperty(_context6 = "".concat(EQUALS, "|").concat(INCLUDES, "|")).call(_context6, NOT_EQUALS, "|")).call(_context5, NOT_INCLUDES, "|")).call(_context4, NOT_IS_EMPTY, "|")).call(_context3, IS_EMPTY);
|
|
77
62
|
|
|
78
|
-
const regex = new RegExp(_concatInstanceProperty(
|
|
79
|
-
const
|
|
63
|
+
const regex = new RegExp(_concatInstanceProperty(_context7 = _concatInstanceProperty(_context8 = "".concat(DEPENDENT_ATTRIBUTE, "\\s?(\\S*)\\swhen ")).call(_context8, DEPENDENT_ATTRIBUTE_CONTROL, ":\\s?(.*?)\\s*(")).call(_context7, OPERATORS, ")\\s(.*)"), "i");
|
|
64
|
+
const isEmpyNotIsEmptRegex = new RegExp(_concatInstanceProperty(_context9 = _concatInstanceProperty(_context10 = "".concat(DEPENDENT_ATTRIBUTE, "\\s?(\\S*)\\swhen ")).call(_context10, DEPENDENT_ATTRIBUTE_CONTROL, ":\\s?(.*?)\\s*(")).call(_context9, OPERATORS, ")"), "i");
|
|
65
|
+
const result = hint.match(regex) ? hint.match(regex) : hint.match(isEmpyNotIsEmptRegex);
|
|
80
66
|
|
|
81
67
|
if (result) {
|
|
82
68
|
rule.action = result[1];
|
|
83
69
|
rule.control = result[2];
|
|
84
70
|
rule.operator = result[3];
|
|
85
|
-
rule.options = result[4];
|
|
71
|
+
rule.options = !result[4] ? "" : result[4];
|
|
86
72
|
} else {
|
|
87
73
|
throw new ConfigurationException("No dependent information found on layout hint: ".concat(hint));
|
|
88
74
|
}
|
|
@@ -143,9 +129,9 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
143
129
|
|
|
144
130
|
|
|
145
131
|
set options(options) {
|
|
146
|
-
var
|
|
132
|
+
var _context11;
|
|
147
133
|
|
|
148
|
-
this._options = _mapInstanceProperty(
|
|
134
|
+
this._options = _mapInstanceProperty(_context11 = options.split("|")).call(_context11, option => _trimInstanceProperty(option).call(option));
|
|
149
135
|
}
|
|
150
136
|
/**
|
|
151
137
|
*/
|
|
@@ -153,7 +139,11 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
153
139
|
|
|
154
140
|
processEqualsOptions(controlAttribute) {
|
|
155
141
|
if (controlAttribute instanceof ChoiceAttributeModel || controlAttribute instanceof BooleanAttributeModel) {
|
|
156
|
-
return this.options.every(option =>
|
|
142
|
+
return this.options.every(option => {
|
|
143
|
+
var _context12;
|
|
144
|
+
|
|
145
|
+
return _includesInstanceProperty(_context12 = controlAttribute.selected).call(_context12, option);
|
|
146
|
+
});
|
|
157
147
|
}
|
|
158
148
|
|
|
159
149
|
throw new ConfigurationException("Dependent control in combination with equals operator must be a choice, string or number attribute");
|
|
@@ -164,7 +154,11 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
164
154
|
|
|
165
155
|
processIncludesOptions(controlAttribute) {
|
|
166
156
|
if (controlAttribute instanceof ChoiceAttributeModel) {
|
|
167
|
-
return this.options.some(option =>
|
|
157
|
+
return this.options.some(option => {
|
|
158
|
+
var _context13;
|
|
159
|
+
|
|
160
|
+
return _includesInstanceProperty(_context13 = controlAttribute.selected).call(_context13, option);
|
|
161
|
+
});
|
|
168
162
|
}
|
|
169
163
|
|
|
170
164
|
throw new ConfigurationException("Dependent control in combination with includes operator must be a choice attribute");
|
|
@@ -187,6 +181,12 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
187
181
|
case NOT_INCLUDES:
|
|
188
182
|
return !this.processIncludesOptions(controlAttribute);
|
|
189
183
|
|
|
184
|
+
case NOT_IS_EMPTY:
|
|
185
|
+
return (controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected.length) !== 0;
|
|
186
|
+
|
|
187
|
+
case IS_EMPTY:
|
|
188
|
+
return (controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected.length) === 0;
|
|
189
|
+
|
|
190
190
|
default:
|
|
191
191
|
throw new ConfigurationException("Unsupported operator for dependent question: ".concat(this.operator));
|
|
192
192
|
}
|
|
@@ -196,9 +196,9 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
196
196
|
|
|
197
197
|
|
|
198
198
|
getControlAttribute(attributes) {
|
|
199
|
-
var
|
|
199
|
+
var _context14, _context15;
|
|
200
200
|
|
|
201
|
-
const attribute = attributes.getAttributeByLayoutHint(_concatInstanceProperty(
|
|
201
|
+
const attribute = attributes.getAttributeByLayoutHint(_concatInstanceProperty(_context14 = "".concat(DEPENDENT_ATTRIBUTE_CONTROL, ":")).call(_context14, this.control), _concatInstanceProperty(_context15 = "".concat(DEPENDENT_ATTRIBUTE_CONTROL, ": ")).call(_context15, this.control));
|
|
202
202
|
|
|
203
203
|
if (attribute instanceof ChoiceAttributeModel || attribute instanceof BooleanAttributeModel) {
|
|
204
204
|
return attribute;
|
|
@@ -231,9 +231,9 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
231
231
|
} else if (this.action === HIDE) {
|
|
232
232
|
attribute.isHidden = result;
|
|
233
233
|
} else {
|
|
234
|
-
var
|
|
234
|
+
var _context16;
|
|
235
235
|
|
|
236
|
-
throw new ConfigurationException(_concatInstanceProperty(
|
|
236
|
+
throw new ConfigurationException(_concatInstanceProperty(_context16 = "Unsupported action ".concat(this.action, " for dependent question on attribute: ")).call(_context16, attribute.label));
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DependentAttribute.js","names":["BaseLayoutHintRule","DEPENDENT_ATTRIBUTE_CONTROL","DEPENDENT_ATTRIBUTE","ChoiceAttributeModel","BooleanAttributeModel","ConfigurationException","EQUALS","INCLUDES","NOT_EQUALS","NOT_INCLUDES","NOT_IS_EMPTY","IS_EMPTY","SHOW","HIDE","compareSelectedAttribute","option","selectedAttribute","length","DependentAttribute","isApplicableForHint","hint","regex","RegExp","test","getRuleInstance","initHint","rule","OPERATORS","result","match","action","control","operator","options","_action","_control","_operator","_options","split","processEqualsOptions","controlAttribute","every","selected","processIncludesOptions","some","handleOperator","getControlAttribute","attributes","attribute","getAttributeByLayoutHint","process","processLayoutHintRules","isHidden","hide","label"],"sources":["../../../../src/models/attributes/layouthint-rules/DependentAttribute.js"],"sourcesContent":["// @flow\nimport BaseLayoutHintRule from \"./BaseLayoutHintRule\";\n\nimport {\n DEPENDENT_ATTRIBUTE_CONTROL,\n DEPENDENT_ATTRIBUTE,\n} from \"../../../constants\";\n\nimport ChoiceAttributeModel from \"../ChoiceAttributeModel\";\nimport BooleanAttributeModel from \"../BooleanAttributeModel\";\n\nimport { ConfigurationException } from \"../../../exceptions\";\n\nimport type AttributeCollection from \"../AttributeCollection\";\nimport type AttributeModel from \"../AttributeModel\";\n\nconst EQUALS = \"equals\";\nconst INCLUDES = \"includes\";\nconst NOT_EQUALS = \"notEquals\";\nconst NOT_INCLUDES = \"notIncludes\";\nconst NOT_IS_EMPTY = \"notIsEmpty\";\nconst IS_EMPTY = \"isEmpty\";\n\nconst SHOW = \"show\";\nconst HIDE = \"hide\";\n\n/**\n */\nconst compareSelectedAttribute = (\n option: string,\n selectedAttribute: Array<string>\n) => {\n if (option === NOT_IS_EMPTY && selectedAttribute?.length !== 0) {\n return true;\n }\n if (option === IS_EMPTY && selectedAttribute?.length === 0) {\n return true;\n }\n return selectedAttribute?.includes(option);\n};\n\n/**\n * Depending attributes hint logic\n */\nclass DependentAttribute extends BaseLayoutHintRule {\n _action: string;\n _control: string;\n _operator: string;\n _options: Array<string>;\n\n /**\n */\n static checkHintApplicability: boolean = true;\n\n /**\n */\n static isApplicableForHint(hint: string): boolean {\n const regex = new RegExp(\n `^${DEPENDENT_ATTRIBUTE}\\\\s?(${SHOW}|${HIDE})`,\n \"i\"\n );\n\n return regex.test(hint);\n }\n\n /**\n * Used on initHint to create an instance of this rule\n */\n static getRuleInstance(): DependentAttribute {\n return new DependentAttribute();\n }\n\n /**\n */\n static initHint(hint: string): any {\n const rule = this.getRuleInstance();\n\n const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}`;\n const regex = new RegExp(\n `${DEPENDENT_ATTRIBUTE}\\\\s?(\\\\S*)\\\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\\\s?(.*?)\\\\s*(${OPERATORS})\\\\s(.*)`,\n \"i\"\n );\n\n const result = hint.match(regex);\n if (result) {\n rule.action = result[1];\n rule.control = result[2];\n rule.operator = result[3];\n rule.options = result[4];\n } else {\n throw new ConfigurationException(\n `No dependent information found on layout hint: ${hint}`\n );\n }\n\n return rule;\n }\n\n /**\n */\n get action(): string {\n return this._action;\n }\n\n /**\n */\n set action(action: string) {\n this._action = action;\n }\n\n /**\n */\n get control(): string {\n return this._control;\n }\n\n /**\n */\n set control(control: string) {\n this._control = control;\n }\n\n /**\n */\n get operator(): string {\n return this._operator;\n }\n\n /**\n */\n set operator(operator: string) {\n this._operator = operator;\n }\n\n /**\n */\n get options(): Array<string> {\n return this._options;\n }\n\n /**\n */\n set options(options: string): void {\n this._options = options.split(\"|\").map((option) => option.trim());\n }\n\n /**\n */\n processEqualsOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (\n controlAttribute instanceof ChoiceAttributeModel ||\n controlAttribute instanceof BooleanAttributeModel\n ) {\n return this.options.every((option) =>\n compareSelectedAttribute(option, controlAttribute?.selected)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with equals operator must be a choice, string or number attribute\"\n );\n }\n\n /**\n */\n processIncludesOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (controlAttribute instanceof ChoiceAttributeModel) {\n return this.options.some((option) =>\n compareSelectedAttribute(option, controlAttribute?.selected)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with includes operator must be a choice attribute\"\n );\n }\n\n /**\n */\n handleOperator(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n switch (this.operator) {\n case EQUALS:\n return this.processEqualsOptions(controlAttribute);\n case INCLUDES:\n return this.processIncludesOptions(controlAttribute);\n case NOT_EQUALS:\n return !this.processEqualsOptions(controlAttribute);\n case NOT_INCLUDES:\n return !this.processIncludesOptions(controlAttribute);\n default:\n throw new ConfigurationException(\n `Unsupported operator for dependent question: ${this.operator}`\n );\n }\n }\n\n /**\n */\n getControlAttribute(\n attributes: AttributeCollection\n ): ChoiceAttributeModel | BooleanAttributeModel | null {\n const attribute = attributes.getAttributeByLayoutHint(\n `${DEPENDENT_ATTRIBUTE_CONTROL}:${this.control}`,\n `${DEPENDENT_ATTRIBUTE_CONTROL}: ${this.control}`\n );\n\n if (\n attribute instanceof ChoiceAttributeModel ||\n attribute instanceof BooleanAttributeModel\n ) {\n return attribute;\n }\n\n return null;\n }\n\n /**\n */\n process(attribute: AttributeModel, attributes: AttributeCollection) {\n const controlAttribute = this.getControlAttribute(attributes);\n if (!controlAttribute) {\n return;\n }\n\n controlAttribute.processLayoutHintRules(attributes);\n if (controlAttribute.isHidden) {\n attribute.hide();\n return;\n }\n\n const result = this.handleOperator(controlAttribute);\n if (this.action === SHOW) {\n attribute.isHidden = !result;\n } else if (this.action === HIDE) {\n attribute.isHidden = result;\n } else {\n throw new ConfigurationException(\n `Unsupported action ${this.action} for dependent question on attribute: ${attribute.label}`\n );\n }\n }\n}\n\nexport default DependentAttribute;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DependentAttribute.js","names":["BaseLayoutHintRule","DEPENDENT_ATTRIBUTE_CONTROL","DEPENDENT_ATTRIBUTE","ChoiceAttributeModel","BooleanAttributeModel","ConfigurationException","EQUALS","INCLUDES","NOT_EQUALS","NOT_INCLUDES","NOT_IS_EMPTY","IS_EMPTY","SHOW","HIDE","DependentAttribute","isApplicableForHint","hint","regex","RegExp","test","getRuleInstance","initHint","rule","OPERATORS","isEmpyNotIsEmptRegex","result","match","action","control","operator","options","_action","_control","_operator","_options","split","option","processEqualsOptions","controlAttribute","every","selected","processIncludesOptions","some","handleOperator","length","getControlAttribute","attributes","attribute","getAttributeByLayoutHint","process","processLayoutHintRules","isHidden","hide","label"],"sources":["../../../../src/models/attributes/layouthint-rules/DependentAttribute.js"],"sourcesContent":["// @flow\nimport BaseLayoutHintRule from \"./BaseLayoutHintRule\";\n\nimport {\n DEPENDENT_ATTRIBUTE_CONTROL,\n DEPENDENT_ATTRIBUTE,\n} from \"../../../constants\";\n\nimport ChoiceAttributeModel from \"../ChoiceAttributeModel\";\nimport BooleanAttributeModel from \"../BooleanAttributeModel\";\n\nimport { ConfigurationException } from \"../../../exceptions\";\n\nimport type AttributeCollection from \"../AttributeCollection\";\nimport type AttributeModel from \"../AttributeModel\";\n\nconst EQUALS = \"equals\";\nconst INCLUDES = \"includes\";\nconst NOT_EQUALS = \"notEquals\";\nconst NOT_INCLUDES = \"notIncludes\";\nconst NOT_IS_EMPTY = \"notIsEmpty\";\nconst IS_EMPTY = \"isEmpty\";\n\nconst SHOW = \"show\";\nconst HIDE = \"hide\";\n\n/**\n * Depending attributes hint logic\n */\nclass DependentAttribute extends BaseLayoutHintRule {\n _action: string;\n _control: string;\n _operator: string;\n _options: Array<string>;\n\n /**\n */\n static checkHintApplicability: boolean = true;\n\n /**\n */\n static isApplicableForHint(hint: string): boolean {\n const regex = new RegExp(\n `^${DEPENDENT_ATTRIBUTE}\\\\s?(${SHOW}|${HIDE})`,\n \"i\"\n );\n\n return regex.test(hint);\n }\n\n /**\n * Used on initHint to create an instance of this rule\n */\n static getRuleInstance(): DependentAttribute {\n return new DependentAttribute();\n }\n\n /**\n */\n static initHint(hint: string): any {\n const rule = this.getRuleInstance();\n\n const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}|${NOT_IS_EMPTY}|${IS_EMPTY}`;\n const regex = new RegExp(\n `${DEPENDENT_ATTRIBUTE}\\\\s?(\\\\S*)\\\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\\\s?(.*?)\\\\s*(${OPERATORS})\\\\s(.*)`,\n \"i\"\n );\n const isEmpyNotIsEmptRegex = new RegExp(\n `${DEPENDENT_ATTRIBUTE}\\\\s?(\\\\S*)\\\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\\\s?(.*?)\\\\s*(${OPERATORS})`,\n \"i\"\n );\n\n const result = hint.match(regex)\n ? hint.match(regex)\n : hint.match(isEmpyNotIsEmptRegex);\n\n if (result) {\n rule.action = result[1];\n rule.control = result[2];\n rule.operator = result[3];\n rule.options = !result[4] ? \"\" : result[4];\n } else {\n throw new ConfigurationException(\n `No dependent information found on layout hint: ${hint}`\n );\n }\n\n return rule;\n }\n\n /**\n */\n get action(): string {\n return this._action;\n }\n\n /**\n */\n set action(action: string) {\n this._action = action;\n }\n\n /**\n */\n get control(): string {\n return this._control;\n }\n\n /**\n */\n set control(control: string) {\n this._control = control;\n }\n\n /**\n */\n get operator(): string {\n return this._operator;\n }\n\n /**\n */\n set operator(operator: string) {\n this._operator = operator;\n }\n\n /**\n */\n get options(): Array<string> {\n return this._options;\n }\n\n /**\n */\n set options(options: string): void {\n this._options = options.split(\"|\").map((option) => option.trim());\n }\n\n /**\n */\n processEqualsOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (\n controlAttribute instanceof ChoiceAttributeModel ||\n controlAttribute instanceof BooleanAttributeModel\n ) {\n return this.options.every((option) =>\n controlAttribute.selected.includes(option)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with equals operator must be a choice, string or number attribute\"\n );\n }\n\n /**\n */\n processIncludesOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (controlAttribute instanceof ChoiceAttributeModel) {\n return this.options.some((option) =>\n controlAttribute.selected.includes(option)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with includes operator must be a choice attribute\"\n );\n }\n\n /**\n */\n handleOperator(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n switch (this.operator) {\n case EQUALS:\n return this.processEqualsOptions(controlAttribute);\n case INCLUDES:\n return this.processIncludesOptions(controlAttribute);\n case NOT_EQUALS:\n return !this.processEqualsOptions(controlAttribute);\n case NOT_INCLUDES:\n return !this.processIncludesOptions(controlAttribute);\n case NOT_IS_EMPTY:\n return controlAttribute?.selected.length !== 0;\n case IS_EMPTY:\n return controlAttribute?.selected.length === 0;\n default:\n throw new ConfigurationException(\n `Unsupported operator for dependent question: ${this.operator}`\n );\n }\n }\n\n /**\n */\n getControlAttribute(\n attributes: AttributeCollection\n ): ChoiceAttributeModel | BooleanAttributeModel | null {\n const attribute = attributes.getAttributeByLayoutHint(\n `${DEPENDENT_ATTRIBUTE_CONTROL}:${this.control}`,\n `${DEPENDENT_ATTRIBUTE_CONTROL}: ${this.control}`\n );\n\n if (\n attribute instanceof ChoiceAttributeModel ||\n attribute instanceof BooleanAttributeModel\n ) {\n return attribute;\n }\n\n return null;\n }\n\n /**\n */\n process(attribute: AttributeModel, attributes: AttributeCollection) {\n const controlAttribute = this.getControlAttribute(attributes);\n if (!controlAttribute) {\n return;\n }\n\n controlAttribute.processLayoutHintRules(attributes);\n if (controlAttribute.isHidden) {\n attribute.hide();\n return;\n }\n\n const result = this.handleOperator(controlAttribute);\n if (this.action === SHOW) {\n attribute.isHidden = !result;\n } else if (this.action === HIDE) {\n attribute.isHidden = result;\n } else {\n throw new ConfigurationException(\n `Unsupported action ${this.action} for dependent question on attribute: ${attribute.label}`\n );\n }\n }\n}\n\nexport default DependentAttribute;\n"],"mappings":"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"}
|
|
@@ -101,22 +101,26 @@ class NumberGroupingConstraint {
|
|
|
101
101
|
}
|
|
102
102
|
/**
|
|
103
103
|
*/
|
|
104
|
+
// $FlowFixMe
|
|
104
105
|
|
|
105
106
|
|
|
106
107
|
hasCorrectGrouping(value) {
|
|
107
|
-
|
|
108
|
+
// A negative or a negative value may cause an incorrect group length compared to groupSize. To avoid this, the negative or positive sign must be removed from the value.
|
|
109
|
+
const absStringValue = value.replace("-", "").replace("+", "");
|
|
110
|
+
|
|
111
|
+
if (!(0, _includes.default)(absStringValue).call(absStringValue, this.groupingSeparator)) {
|
|
108
112
|
return true;
|
|
109
113
|
}
|
|
110
114
|
|
|
111
|
-
let integer =
|
|
115
|
+
let integer = absStringValue;
|
|
112
116
|
|
|
113
|
-
if (this.decimalSeparator !== "" && (0, _includes.default)(
|
|
117
|
+
if (this.decimalSeparator !== "" && (0, _includes.default)(absStringValue).call(absStringValue, this.decimalSeparator)) {
|
|
114
118
|
// decimal before grouping
|
|
115
|
-
if (
|
|
119
|
+
if (absStringValue.indexOf(this.decimalSeparator) < absStringValue.indexOf(this.groupingSeparator)) {
|
|
116
120
|
return false;
|
|
117
121
|
}
|
|
118
122
|
|
|
119
|
-
integer =
|
|
123
|
+
integer = absStringValue.substring(0, absStringValue.indexOf(this.decimalSeparator));
|
|
120
124
|
}
|
|
121
125
|
|
|
122
126
|
let groups = integer.split(this.groupingSeparator); // when the first item is smaller than group size, remove it from check
|
|
@@ -81,22 +81,32 @@ class NumberGroupingConstraint implements IConstraintModel {
|
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
*/
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
// $FlowFixMe
|
|
85
|
+
hasCorrectGrouping(value: string) {
|
|
86
|
+
// A negative or a negative value may cause an incorrect group length compared to groupSize. To avoid this, the negative or positive sign must be removed from the value.
|
|
87
|
+
const absStringValue = value.replace("-", "").replace("+", "");
|
|
88
|
+
|
|
89
|
+
if (!absStringValue.includes(this.groupingSeparator)) {
|
|
86
90
|
return true;
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
let integer =
|
|
90
|
-
if (
|
|
93
|
+
let integer = absStringValue;
|
|
94
|
+
if (
|
|
95
|
+
this.decimalSeparator !== "" &&
|
|
96
|
+
absStringValue.includes(this.decimalSeparator)
|
|
97
|
+
) {
|
|
91
98
|
// decimal before grouping
|
|
92
99
|
if (
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
absStringValue.indexOf(this.decimalSeparator) <
|
|
101
|
+
absStringValue.indexOf(this.groupingSeparator)
|
|
95
102
|
) {
|
|
96
103
|
return false;
|
|
97
104
|
}
|
|
98
105
|
|
|
99
|
-
integer =
|
|
106
|
+
integer = absStringValue.substring(
|
|
107
|
+
0,
|
|
108
|
+
absStringValue.indexOf(this.decimalSeparator)
|
|
109
|
+
);
|
|
100
110
|
}
|
|
101
111
|
|
|
102
112
|
let groups = integer.split(this.groupingSeparator);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberGroupingConstraint.js","names":["DEFAULT_GROUPING_SIZE","NumberGroupingConstraint","constructor","groupingSeparator","decimalSeparator","format","_decimalSeparator","_groupingSeparator","_format","id","groupSize","fromFormat","DecimalFormat","comma","hasValidation","defaultMessage","parameters","hasCorrectGrouping","value","integer","indexOf","
|
|
1
|
+
{"version":3,"file":"NumberGroupingConstraint.js","names":["DEFAULT_GROUPING_SIZE","NumberGroupingConstraint","constructor","groupingSeparator","decimalSeparator","format","_decimalSeparator","_groupingSeparator","_format","id","groupSize","fromFormat","DecimalFormat","comma","hasValidation","defaultMessage","parameters","hasCorrectGrouping","value","absStringValue","replace","integer","indexOf","substring","groups","split","length","every","group","validate","isMandatoryConstraint"],"sources":["../../../../src/models/attributes/input-constraints/NumberGroupingConstraint.js"],"sourcesContent":["// @flow\nimport DecimalFormat from \"../../../utils/number/DecimalFormat\";\n\nimport type { IConstraintModel } from \"../../types\";\n\nconst DEFAULT_GROUPING_SIZE = 3;\n\n/**\n */\nclass NumberGroupingConstraint implements IConstraintModel {\n _decimalSeparator: string;\n _groupingSeparator: string;\n _format: string;\n\n /**\n */\n constructor(\n groupingSeparator: string = \",\",\n decimalSeparator: string = \".\",\n format: ?string = \"0\"\n ) {\n this._decimalSeparator = decimalSeparator;\n this._groupingSeparator = groupingSeparator;\n this._format = format ?? \"0\";\n }\n\n /**\n */\n get id(): string {\n return \"Constraint.Number.GroupingSeparator\";\n }\n\n /**\n */\n get decimalSeparator(): string {\n return this._decimalSeparator;\n }\n\n /**\n */\n get groupingSeparator(): string {\n return this._groupingSeparator;\n }\n\n /**\n */\n get format(): string {\n return this._format;\n }\n\n /**\n */\n get groupSize(): number {\n if (this.format) {\n const fromFormat = new DecimalFormat(this.format).comma;\n if (fromFormat > 0) {\n return fromFormat;\n }\n }\n\n return DEFAULT_GROUPING_SIZE;\n }\n\n /**\n */\n hasValidation(): boolean {\n return true;\n }\n\n /**\n */\n get defaultMessage(): string {\n return \"Group divider '${group-divider}' must be correctly placed\"; // NOSONAR\n }\n\n /**\n */\n get parameters(): { \"group-divider\": string } {\n return { \"group-divider\": this.groupingSeparator };\n }\n\n /**\n */\n // $FlowFixMe\n hasCorrectGrouping(value: string) {\n // A negative or a negative value may cause an incorrect group length compared to groupSize. To avoid this, the negative or positive sign must be removed from the value.\n const absStringValue = value.replace(\"-\", \"\").replace(\"+\", \"\");\n\n if (!absStringValue.includes(this.groupingSeparator)) {\n return true;\n }\n\n let integer = absStringValue;\n if (\n this.decimalSeparator !== \"\" &&\n absStringValue.includes(this.decimalSeparator)\n ) {\n // decimal before grouping\n if (\n absStringValue.indexOf(this.decimalSeparator) <\n absStringValue.indexOf(this.groupingSeparator)\n ) {\n return false;\n }\n\n integer = absStringValue.substring(\n 0,\n absStringValue.indexOf(this.decimalSeparator)\n );\n }\n\n let groups = integer.split(this.groupingSeparator);\n\n // when the first item is smaller than group size, remove it from check\n if (groups[0].length < this.groupSize) {\n groups = groups.slice(1);\n }\n\n return groups.every((group) => group.length === this.groupSize);\n }\n\n /**\n */\n validate(value: string | number): boolean {\n return (\n this.groupingSeparator === \"\" ||\n typeof value !== \"string\" ||\n !value.includes(this.groupingSeparator) ||\n this.hasCorrectGrouping(value)\n );\n }\n\n /**\n */\n get isMandatoryConstraint(): boolean {\n return false;\n }\n}\n\nexport default NumberGroupingConstraint;\n"],"mappings":"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"}
|
|
@@ -7,16 +7,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.default = void 0;
|
|
9
9
|
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
|
11
|
-
|
|
12
|
-
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
|
|
13
|
-
|
|
14
10
|
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
|
15
11
|
|
|
16
12
|
var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
|
|
17
13
|
|
|
18
14
|
var _trim = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/trim"));
|
|
19
15
|
|
|
16
|
+
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
|
|
17
|
+
|
|
18
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
|
19
|
+
|
|
20
20
|
var _BaseLayoutHintRule = _interopRequireDefault(require("./BaseLayoutHintRule"));
|
|
21
21
|
|
|
22
22
|
var _constants = require("../../../constants");
|
|
@@ -35,25 +35,10 @@ const NOT_IS_EMPTY = "notIsEmpty";
|
|
|
35
35
|
const IS_EMPTY = "isEmpty";
|
|
36
36
|
const SHOW = "show";
|
|
37
37
|
const HIDE = "hide";
|
|
38
|
-
/**
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
const compareSelectedAttribute = (option, selectedAttribute) => {
|
|
42
|
-
if (option === NOT_IS_EMPTY && (selectedAttribute === null || selectedAttribute === void 0 ? void 0 : selectedAttribute.length) !== 0) {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (option === IS_EMPTY && (selectedAttribute === null || selectedAttribute === void 0 ? void 0 : selectedAttribute.length) === 0) {
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return selectedAttribute === null || selectedAttribute === void 0 ? void 0 : (0, _includes.default)(selectedAttribute).call(selectedAttribute, option);
|
|
51
|
-
};
|
|
52
38
|
/**
|
|
53
39
|
* Depending attributes hint logic
|
|
54
40
|
*/
|
|
55
41
|
|
|
56
|
-
|
|
57
42
|
class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
58
43
|
constructor() {
|
|
59
44
|
super(...arguments);
|
|
@@ -84,18 +69,19 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
84
69
|
|
|
85
70
|
|
|
86
71
|
static initHint(hint) {
|
|
87
|
-
var _context3, _context4, _context5, _context6;
|
|
72
|
+
var _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10;
|
|
88
73
|
|
|
89
74
|
const rule = this.getRuleInstance();
|
|
90
|
-
const OPERATORS = (0, _concat.default)(_context3 = (0, _concat.default)(_context4 = "".concat(EQUALS, "|").concat(INCLUDES, "|")).call(
|
|
91
|
-
const regex = new RegExp((0, _concat.default)(
|
|
92
|
-
const
|
|
75
|
+
const OPERATORS = (0, _concat.default)(_context3 = (0, _concat.default)(_context4 = (0, _concat.default)(_context5 = (0, _concat.default)(_context6 = "".concat(EQUALS, "|").concat(INCLUDES, "|")).call(_context6, NOT_EQUALS, "|")).call(_context5, NOT_INCLUDES, "|")).call(_context4, NOT_IS_EMPTY, "|")).call(_context3, IS_EMPTY);
|
|
76
|
+
const regex = new RegExp((0, _concat.default)(_context7 = (0, _concat.default)(_context8 = "".concat(_constants.DEPENDENT_ATTRIBUTE, "\\s?(\\S*)\\swhen ")).call(_context8, _constants.DEPENDENT_ATTRIBUTE_CONTROL, ":\\s?(.*?)\\s*(")).call(_context7, OPERATORS, ")\\s(.*)"), "i");
|
|
77
|
+
const isEmpyNotIsEmptRegex = new RegExp((0, _concat.default)(_context9 = (0, _concat.default)(_context10 = "".concat(_constants.DEPENDENT_ATTRIBUTE, "\\s?(\\S*)\\swhen ")).call(_context10, _constants.DEPENDENT_ATTRIBUTE_CONTROL, ":\\s?(.*?)\\s*(")).call(_context9, OPERATORS, ")"), "i");
|
|
78
|
+
const result = hint.match(regex) ? hint.match(regex) : hint.match(isEmpyNotIsEmptRegex);
|
|
93
79
|
|
|
94
80
|
if (result) {
|
|
95
81
|
rule.action = result[1];
|
|
96
82
|
rule.control = result[2];
|
|
97
83
|
rule.operator = result[3];
|
|
98
|
-
rule.options = result[4];
|
|
84
|
+
rule.options = !result[4] ? "" : result[4];
|
|
99
85
|
} else {
|
|
100
86
|
throw new _exceptions.ConfigurationException("No dependent information found on layout hint: ".concat(hint));
|
|
101
87
|
}
|
|
@@ -156,9 +142,9 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
156
142
|
|
|
157
143
|
|
|
158
144
|
set options(options) {
|
|
159
|
-
var
|
|
145
|
+
var _context11;
|
|
160
146
|
|
|
161
|
-
this._options = (0, _map.default)(
|
|
147
|
+
this._options = (0, _map.default)(_context11 = options.split("|")).call(_context11, option => (0, _trim.default)(option).call(option));
|
|
162
148
|
}
|
|
163
149
|
/**
|
|
164
150
|
*/
|
|
@@ -166,7 +152,11 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
166
152
|
|
|
167
153
|
processEqualsOptions(controlAttribute) {
|
|
168
154
|
if (controlAttribute instanceof _ChoiceAttributeModel.default || controlAttribute instanceof _BooleanAttributeModel.default) {
|
|
169
|
-
return this.options.every(option =>
|
|
155
|
+
return this.options.every(option => {
|
|
156
|
+
var _context12;
|
|
157
|
+
|
|
158
|
+
return (0, _includes.default)(_context12 = controlAttribute.selected).call(_context12, option);
|
|
159
|
+
});
|
|
170
160
|
}
|
|
171
161
|
|
|
172
162
|
throw new _exceptions.ConfigurationException("Dependent control in combination with equals operator must be a choice, string or number attribute");
|
|
@@ -177,7 +167,11 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
177
167
|
|
|
178
168
|
processIncludesOptions(controlAttribute) {
|
|
179
169
|
if (controlAttribute instanceof _ChoiceAttributeModel.default) {
|
|
180
|
-
return this.options.some(option =>
|
|
170
|
+
return this.options.some(option => {
|
|
171
|
+
var _context13;
|
|
172
|
+
|
|
173
|
+
return (0, _includes.default)(_context13 = controlAttribute.selected).call(_context13, option);
|
|
174
|
+
});
|
|
181
175
|
}
|
|
182
176
|
|
|
183
177
|
throw new _exceptions.ConfigurationException("Dependent control in combination with includes operator must be a choice attribute");
|
|
@@ -200,6 +194,12 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
200
194
|
case NOT_INCLUDES:
|
|
201
195
|
return !this.processIncludesOptions(controlAttribute);
|
|
202
196
|
|
|
197
|
+
case NOT_IS_EMPTY:
|
|
198
|
+
return (controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected.length) !== 0;
|
|
199
|
+
|
|
200
|
+
case IS_EMPTY:
|
|
201
|
+
return (controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected.length) === 0;
|
|
202
|
+
|
|
203
203
|
default:
|
|
204
204
|
throw new _exceptions.ConfigurationException("Unsupported operator for dependent question: ".concat(this.operator));
|
|
205
205
|
}
|
|
@@ -209,9 +209,9 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
209
209
|
|
|
210
210
|
|
|
211
211
|
getControlAttribute(attributes) {
|
|
212
|
-
var
|
|
212
|
+
var _context14, _context15;
|
|
213
213
|
|
|
214
|
-
const attribute = attributes.getAttributeByLayoutHint((0, _concat.default)(
|
|
214
|
+
const attribute = attributes.getAttributeByLayoutHint((0, _concat.default)(_context14 = "".concat(_constants.DEPENDENT_ATTRIBUTE_CONTROL, ":")).call(_context14, this.control), (0, _concat.default)(_context15 = "".concat(_constants.DEPENDENT_ATTRIBUTE_CONTROL, ": ")).call(_context15, this.control));
|
|
215
215
|
|
|
216
216
|
if (attribute instanceof _ChoiceAttributeModel.default || attribute instanceof _BooleanAttributeModel.default) {
|
|
217
217
|
return attribute;
|
|
@@ -244,9 +244,9 @@ class DependentAttribute extends _BaseLayoutHintRule.default {
|
|
|
244
244
|
} else if (this.action === HIDE) {
|
|
245
245
|
attribute.isHidden = result;
|
|
246
246
|
} else {
|
|
247
|
-
var
|
|
247
|
+
var _context16;
|
|
248
248
|
|
|
249
|
-
throw new _exceptions.ConfigurationException((0, _concat.default)(
|
|
249
|
+
throw new _exceptions.ConfigurationException((0, _concat.default)(_context16 = "Unsupported action ".concat(this.action, " for dependent question on attribute: ")).call(_context16, attribute.label));
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
252
|
|
|
@@ -24,21 +24,6 @@ const IS_EMPTY = "isEmpty";
|
|
|
24
24
|
const SHOW = "show";
|
|
25
25
|
const HIDE = "hide";
|
|
26
26
|
|
|
27
|
-
/**
|
|
28
|
-
*/
|
|
29
|
-
const compareSelectedAttribute = (
|
|
30
|
-
option: string,
|
|
31
|
-
selectedAttribute: Array<string>
|
|
32
|
-
) => {
|
|
33
|
-
if (option === NOT_IS_EMPTY && selectedAttribute?.length !== 0) {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
if (option === IS_EMPTY && selectedAttribute?.length === 0) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
return selectedAttribute?.includes(option);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
27
|
/**
|
|
43
28
|
* Depending attributes hint logic
|
|
44
29
|
*/
|
|
@@ -75,18 +60,25 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
75
60
|
static initHint(hint: string): any {
|
|
76
61
|
const rule = this.getRuleInstance();
|
|
77
62
|
|
|
78
|
-
const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}`;
|
|
63
|
+
const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}|${NOT_IS_EMPTY}|${IS_EMPTY}`;
|
|
79
64
|
const regex = new RegExp(
|
|
80
65
|
`${DEPENDENT_ATTRIBUTE}\\s?(\\S*)\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\s?(.*?)\\s*(${OPERATORS})\\s(.*)`,
|
|
81
66
|
"i"
|
|
82
67
|
);
|
|
68
|
+
const isEmpyNotIsEmptRegex = new RegExp(
|
|
69
|
+
`${DEPENDENT_ATTRIBUTE}\\s?(\\S*)\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\s?(.*?)\\s*(${OPERATORS})`,
|
|
70
|
+
"i"
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const result = hint.match(regex)
|
|
74
|
+
? hint.match(regex)
|
|
75
|
+
: hint.match(isEmpyNotIsEmptRegex);
|
|
83
76
|
|
|
84
|
-
const result = hint.match(regex);
|
|
85
77
|
if (result) {
|
|
86
78
|
rule.action = result[1];
|
|
87
79
|
rule.control = result[2];
|
|
88
80
|
rule.operator = result[3];
|
|
89
|
-
rule.options = result[4];
|
|
81
|
+
rule.options = !result[4] ? "" : result[4];
|
|
90
82
|
} else {
|
|
91
83
|
throw new ConfigurationException(
|
|
92
84
|
`No dependent information found on layout hint: ${hint}`
|
|
@@ -154,7 +146,7 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
154
146
|
controlAttribute instanceof BooleanAttributeModel
|
|
155
147
|
) {
|
|
156
148
|
return this.options.every((option) =>
|
|
157
|
-
|
|
149
|
+
controlAttribute.selected.includes(option)
|
|
158
150
|
);
|
|
159
151
|
}
|
|
160
152
|
|
|
@@ -170,7 +162,7 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
170
162
|
): boolean {
|
|
171
163
|
if (controlAttribute instanceof ChoiceAttributeModel) {
|
|
172
164
|
return this.options.some((option) =>
|
|
173
|
-
|
|
165
|
+
controlAttribute.selected.includes(option)
|
|
174
166
|
);
|
|
175
167
|
}
|
|
176
168
|
|
|
@@ -193,6 +185,10 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
193
185
|
return !this.processEqualsOptions(controlAttribute);
|
|
194
186
|
case NOT_INCLUDES:
|
|
195
187
|
return !this.processIncludesOptions(controlAttribute);
|
|
188
|
+
case NOT_IS_EMPTY:
|
|
189
|
+
return controlAttribute?.selected.length !== 0;
|
|
190
|
+
case IS_EMPTY:
|
|
191
|
+
return controlAttribute?.selected.length === 0;
|
|
196
192
|
default:
|
|
197
193
|
throw new ConfigurationException(
|
|
198
194
|
`Unsupported operator for dependent question: ${this.operator}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DependentAttribute.js","names":["EQUALS","INCLUDES","NOT_EQUALS","NOT_INCLUDES","NOT_IS_EMPTY","IS_EMPTY","SHOW","HIDE","compareSelectedAttribute","option","selectedAttribute","length","DependentAttribute","BaseLayoutHintRule","isApplicableForHint","hint","regex","RegExp","DEPENDENT_ATTRIBUTE","test","getRuleInstance","initHint","rule","OPERATORS","DEPENDENT_ATTRIBUTE_CONTROL","result","match","action","control","operator","options","ConfigurationException","_action","_control","_operator","_options","split","processEqualsOptions","controlAttribute","ChoiceAttributeModel","BooleanAttributeModel","every","selected","processIncludesOptions","some","handleOperator","getControlAttribute","attributes","attribute","getAttributeByLayoutHint","process","processLayoutHintRules","isHidden","hide","label"],"sources":["../../../../src/models/attributes/layouthint-rules/DependentAttribute.js"],"sourcesContent":["// @flow\nimport BaseLayoutHintRule from \"./BaseLayoutHintRule\";\n\nimport {\n DEPENDENT_ATTRIBUTE_CONTROL,\n DEPENDENT_ATTRIBUTE,\n} from \"../../../constants\";\n\nimport ChoiceAttributeModel from \"../ChoiceAttributeModel\";\nimport BooleanAttributeModel from \"../BooleanAttributeModel\";\n\nimport { ConfigurationException } from \"../../../exceptions\";\n\nimport type AttributeCollection from \"../AttributeCollection\";\nimport type AttributeModel from \"../AttributeModel\";\n\nconst EQUALS = \"equals\";\nconst INCLUDES = \"includes\";\nconst NOT_EQUALS = \"notEquals\";\nconst NOT_INCLUDES = \"notIncludes\";\nconst NOT_IS_EMPTY = \"notIsEmpty\";\nconst IS_EMPTY = \"isEmpty\";\n\nconst SHOW = \"show\";\nconst HIDE = \"hide\";\n\n/**\n */\nconst compareSelectedAttribute = (\n option: string,\n selectedAttribute: Array<string>\n) => {\n if (option === NOT_IS_EMPTY && selectedAttribute?.length !== 0) {\n return true;\n }\n if (option === IS_EMPTY && selectedAttribute?.length === 0) {\n return true;\n }\n return selectedAttribute?.includes(option);\n};\n\n/**\n * Depending attributes hint logic\n */\nclass DependentAttribute extends BaseLayoutHintRule {\n _action: string;\n _control: string;\n _operator: string;\n _options: Array<string>;\n\n /**\n */\n static checkHintApplicability: boolean = true;\n\n /**\n */\n static isApplicableForHint(hint: string): boolean {\n const regex = new RegExp(\n `^${DEPENDENT_ATTRIBUTE}\\\\s?(${SHOW}|${HIDE})`,\n \"i\"\n );\n\n return regex.test(hint);\n }\n\n /**\n * Used on initHint to create an instance of this rule\n */\n static getRuleInstance(): DependentAttribute {\n return new DependentAttribute();\n }\n\n /**\n */\n static initHint(hint: string): any {\n const rule = this.getRuleInstance();\n\n const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}`;\n const regex = new RegExp(\n `${DEPENDENT_ATTRIBUTE}\\\\s?(\\\\S*)\\\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\\\s?(.*?)\\\\s*(${OPERATORS})\\\\s(.*)`,\n \"i\"\n );\n\n const result = hint.match(regex);\n if (result) {\n rule.action = result[1];\n rule.control = result[2];\n rule.operator = result[3];\n rule.options = result[4];\n } else {\n throw new ConfigurationException(\n `No dependent information found on layout hint: ${hint}`\n );\n }\n\n return rule;\n }\n\n /**\n */\n get action(): string {\n return this._action;\n }\n\n /**\n */\n set action(action: string) {\n this._action = action;\n }\n\n /**\n */\n get control(): string {\n return this._control;\n }\n\n /**\n */\n set control(control: string) {\n this._control = control;\n }\n\n /**\n */\n get operator(): string {\n return this._operator;\n }\n\n /**\n */\n set operator(operator: string) {\n this._operator = operator;\n }\n\n /**\n */\n get options(): Array<string> {\n return this._options;\n }\n\n /**\n */\n set options(options: string): void {\n this._options = options.split(\"|\").map((option) => option.trim());\n }\n\n /**\n */\n processEqualsOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (\n controlAttribute instanceof ChoiceAttributeModel ||\n controlAttribute instanceof BooleanAttributeModel\n ) {\n return this.options.every((option) =>\n compareSelectedAttribute(option, controlAttribute?.selected)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with equals operator must be a choice, string or number attribute\"\n );\n }\n\n /**\n */\n processIncludesOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (controlAttribute instanceof ChoiceAttributeModel) {\n return this.options.some((option) =>\n compareSelectedAttribute(option, controlAttribute?.selected)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with includes operator must be a choice attribute\"\n );\n }\n\n /**\n */\n handleOperator(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n switch (this.operator) {\n case EQUALS:\n return this.processEqualsOptions(controlAttribute);\n case INCLUDES:\n return this.processIncludesOptions(controlAttribute);\n case NOT_EQUALS:\n return !this.processEqualsOptions(controlAttribute);\n case NOT_INCLUDES:\n return !this.processIncludesOptions(controlAttribute);\n default:\n throw new ConfigurationException(\n `Unsupported operator for dependent question: ${this.operator}`\n );\n }\n }\n\n /**\n */\n getControlAttribute(\n attributes: AttributeCollection\n ): ChoiceAttributeModel | BooleanAttributeModel | null {\n const attribute = attributes.getAttributeByLayoutHint(\n `${DEPENDENT_ATTRIBUTE_CONTROL}:${this.control}`,\n `${DEPENDENT_ATTRIBUTE_CONTROL}: ${this.control}`\n );\n\n if (\n attribute instanceof ChoiceAttributeModel ||\n attribute instanceof BooleanAttributeModel\n ) {\n return attribute;\n }\n\n return null;\n }\n\n /**\n */\n process(attribute: AttributeModel, attributes: AttributeCollection) {\n const controlAttribute = this.getControlAttribute(attributes);\n if (!controlAttribute) {\n return;\n }\n\n controlAttribute.processLayoutHintRules(attributes);\n if (controlAttribute.isHidden) {\n attribute.hide();\n return;\n }\n\n const result = this.handleOperator(controlAttribute);\n if (this.action === SHOW) {\n attribute.isHidden = !result;\n } else if (this.action === HIDE) {\n attribute.isHidden = result;\n } else {\n throw new ConfigurationException(\n `Unsupported action ${this.action} for dependent question on attribute: ${attribute.label}`\n );\n }\n }\n}\n\nexport default DependentAttribute;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DependentAttribute.js","names":["EQUALS","INCLUDES","NOT_EQUALS","NOT_INCLUDES","NOT_IS_EMPTY","IS_EMPTY","SHOW","HIDE","DependentAttribute","BaseLayoutHintRule","isApplicableForHint","hint","regex","RegExp","DEPENDENT_ATTRIBUTE","test","getRuleInstance","initHint","rule","OPERATORS","DEPENDENT_ATTRIBUTE_CONTROL","isEmpyNotIsEmptRegex","result","match","action","control","operator","options","ConfigurationException","_action","_control","_operator","_options","split","option","processEqualsOptions","controlAttribute","ChoiceAttributeModel","BooleanAttributeModel","every","selected","processIncludesOptions","some","handleOperator","length","getControlAttribute","attributes","attribute","getAttributeByLayoutHint","process","processLayoutHintRules","isHidden","hide","label"],"sources":["../../../../src/models/attributes/layouthint-rules/DependentAttribute.js"],"sourcesContent":["// @flow\nimport BaseLayoutHintRule from \"./BaseLayoutHintRule\";\n\nimport {\n DEPENDENT_ATTRIBUTE_CONTROL,\n DEPENDENT_ATTRIBUTE,\n} from \"../../../constants\";\n\nimport ChoiceAttributeModel from \"../ChoiceAttributeModel\";\nimport BooleanAttributeModel from \"../BooleanAttributeModel\";\n\nimport { ConfigurationException } from \"../../../exceptions\";\n\nimport type AttributeCollection from \"../AttributeCollection\";\nimport type AttributeModel from \"../AttributeModel\";\n\nconst EQUALS = \"equals\";\nconst INCLUDES = \"includes\";\nconst NOT_EQUALS = \"notEquals\";\nconst NOT_INCLUDES = \"notIncludes\";\nconst NOT_IS_EMPTY = \"notIsEmpty\";\nconst IS_EMPTY = \"isEmpty\";\n\nconst SHOW = \"show\";\nconst HIDE = \"hide\";\n\n/**\n * Depending attributes hint logic\n */\nclass DependentAttribute extends BaseLayoutHintRule {\n _action: string;\n _control: string;\n _operator: string;\n _options: Array<string>;\n\n /**\n */\n static checkHintApplicability: boolean = true;\n\n /**\n */\n static isApplicableForHint(hint: string): boolean {\n const regex = new RegExp(\n `^${DEPENDENT_ATTRIBUTE}\\\\s?(${SHOW}|${HIDE})`,\n \"i\"\n );\n\n return regex.test(hint);\n }\n\n /**\n * Used on initHint to create an instance of this rule\n */\n static getRuleInstance(): DependentAttribute {\n return new DependentAttribute();\n }\n\n /**\n */\n static initHint(hint: string): any {\n const rule = this.getRuleInstance();\n\n const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}|${NOT_IS_EMPTY}|${IS_EMPTY}`;\n const regex = new RegExp(\n `${DEPENDENT_ATTRIBUTE}\\\\s?(\\\\S*)\\\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\\\s?(.*?)\\\\s*(${OPERATORS})\\\\s(.*)`,\n \"i\"\n );\n const isEmpyNotIsEmptRegex = new RegExp(\n `${DEPENDENT_ATTRIBUTE}\\\\s?(\\\\S*)\\\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\\\s?(.*?)\\\\s*(${OPERATORS})`,\n \"i\"\n );\n\n const result = hint.match(regex)\n ? hint.match(regex)\n : hint.match(isEmpyNotIsEmptRegex);\n\n if (result) {\n rule.action = result[1];\n rule.control = result[2];\n rule.operator = result[3];\n rule.options = !result[4] ? \"\" : result[4];\n } else {\n throw new ConfigurationException(\n `No dependent information found on layout hint: ${hint}`\n );\n }\n\n return rule;\n }\n\n /**\n */\n get action(): string {\n return this._action;\n }\n\n /**\n */\n set action(action: string) {\n this._action = action;\n }\n\n /**\n */\n get control(): string {\n return this._control;\n }\n\n /**\n */\n set control(control: string) {\n this._control = control;\n }\n\n /**\n */\n get operator(): string {\n return this._operator;\n }\n\n /**\n */\n set operator(operator: string) {\n this._operator = operator;\n }\n\n /**\n */\n get options(): Array<string> {\n return this._options;\n }\n\n /**\n */\n set options(options: string): void {\n this._options = options.split(\"|\").map((option) => option.trim());\n }\n\n /**\n */\n processEqualsOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (\n controlAttribute instanceof ChoiceAttributeModel ||\n controlAttribute instanceof BooleanAttributeModel\n ) {\n return this.options.every((option) =>\n controlAttribute.selected.includes(option)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with equals operator must be a choice, string or number attribute\"\n );\n }\n\n /**\n */\n processIncludesOptions(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n if (controlAttribute instanceof ChoiceAttributeModel) {\n return this.options.some((option) =>\n controlAttribute.selected.includes(option)\n );\n }\n\n throw new ConfigurationException(\n \"Dependent control in combination with includes operator must be a choice attribute\"\n );\n }\n\n /**\n */\n handleOperator(\n controlAttribute: ChoiceAttributeModel | BooleanAttributeModel\n ): boolean {\n switch (this.operator) {\n case EQUALS:\n return this.processEqualsOptions(controlAttribute);\n case INCLUDES:\n return this.processIncludesOptions(controlAttribute);\n case NOT_EQUALS:\n return !this.processEqualsOptions(controlAttribute);\n case NOT_INCLUDES:\n return !this.processIncludesOptions(controlAttribute);\n case NOT_IS_EMPTY:\n return controlAttribute?.selected.length !== 0;\n case IS_EMPTY:\n return controlAttribute?.selected.length === 0;\n default:\n throw new ConfigurationException(\n `Unsupported operator for dependent question: ${this.operator}`\n );\n }\n }\n\n /**\n */\n getControlAttribute(\n attributes: AttributeCollection\n ): ChoiceAttributeModel | BooleanAttributeModel | null {\n const attribute = attributes.getAttributeByLayoutHint(\n `${DEPENDENT_ATTRIBUTE_CONTROL}:${this.control}`,\n `${DEPENDENT_ATTRIBUTE_CONTROL}: ${this.control}`\n );\n\n if (\n attribute instanceof ChoiceAttributeModel ||\n attribute instanceof BooleanAttributeModel\n ) {\n return attribute;\n }\n\n return null;\n }\n\n /**\n */\n process(attribute: AttributeModel, attributes: AttributeCollection) {\n const controlAttribute = this.getControlAttribute(attributes);\n if (!controlAttribute) {\n return;\n }\n\n controlAttribute.processLayoutHintRules(attributes);\n if (controlAttribute.isHidden) {\n attribute.hide();\n return;\n }\n\n const result = this.handleOperator(controlAttribute);\n if (this.action === SHOW) {\n attribute.isHidden = !result;\n } else if (this.action === HIDE) {\n attribute.isHidden = result;\n } else {\n throw new ConfigurationException(\n `Unsupported action ${this.action} for dependent question on attribute: ${attribute.label}`\n );\n }\n }\n}\n\nexport default DependentAttribute;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -81,22 +81,32 @@ class NumberGroupingConstraint implements IConstraintModel {
|
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
*/
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
// $FlowFixMe
|
|
85
|
+
hasCorrectGrouping(value: string) {
|
|
86
|
+
// A negative or a negative value may cause an incorrect group length compared to groupSize. To avoid this, the negative or positive sign must be removed from the value.
|
|
87
|
+
const absStringValue = value.replace("-", "").replace("+", "");
|
|
88
|
+
|
|
89
|
+
if (!absStringValue.includes(this.groupingSeparator)) {
|
|
86
90
|
return true;
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
let integer =
|
|
90
|
-
if (
|
|
93
|
+
let integer = absStringValue;
|
|
94
|
+
if (
|
|
95
|
+
this.decimalSeparator !== "" &&
|
|
96
|
+
absStringValue.includes(this.decimalSeparator)
|
|
97
|
+
) {
|
|
91
98
|
// decimal before grouping
|
|
92
99
|
if (
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
absStringValue.indexOf(this.decimalSeparator) <
|
|
101
|
+
absStringValue.indexOf(this.groupingSeparator)
|
|
95
102
|
) {
|
|
96
103
|
return false;
|
|
97
104
|
}
|
|
98
105
|
|
|
99
|
-
integer =
|
|
106
|
+
integer = absStringValue.substring(
|
|
107
|
+
0,
|
|
108
|
+
absStringValue.indexOf(this.decimalSeparator)
|
|
109
|
+
);
|
|
100
110
|
}
|
|
101
111
|
|
|
102
112
|
let groups = integer.split(this.groupingSeparator);
|
|
@@ -24,21 +24,6 @@ const IS_EMPTY = "isEmpty";
|
|
|
24
24
|
const SHOW = "show";
|
|
25
25
|
const HIDE = "hide";
|
|
26
26
|
|
|
27
|
-
/**
|
|
28
|
-
*/
|
|
29
|
-
const compareSelectedAttribute = (
|
|
30
|
-
option: string,
|
|
31
|
-
selectedAttribute: Array<string>
|
|
32
|
-
) => {
|
|
33
|
-
if (option === NOT_IS_EMPTY && selectedAttribute?.length !== 0) {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
if (option === IS_EMPTY && selectedAttribute?.length === 0) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
return selectedAttribute?.includes(option);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
27
|
/**
|
|
43
28
|
* Depending attributes hint logic
|
|
44
29
|
*/
|
|
@@ -75,18 +60,25 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
75
60
|
static initHint(hint: string): any {
|
|
76
61
|
const rule = this.getRuleInstance();
|
|
77
62
|
|
|
78
|
-
const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}`;
|
|
63
|
+
const OPERATORS = `${EQUALS}|${INCLUDES}|${NOT_EQUALS}|${NOT_INCLUDES}|${NOT_IS_EMPTY}|${IS_EMPTY}`;
|
|
79
64
|
const regex = new RegExp(
|
|
80
65
|
`${DEPENDENT_ATTRIBUTE}\\s?(\\S*)\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\s?(.*?)\\s*(${OPERATORS})\\s(.*)`,
|
|
81
66
|
"i"
|
|
82
67
|
);
|
|
68
|
+
const isEmpyNotIsEmptRegex = new RegExp(
|
|
69
|
+
`${DEPENDENT_ATTRIBUTE}\\s?(\\S*)\\swhen ${DEPENDENT_ATTRIBUTE_CONTROL}:\\s?(.*?)\\s*(${OPERATORS})`,
|
|
70
|
+
"i"
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const result = hint.match(regex)
|
|
74
|
+
? hint.match(regex)
|
|
75
|
+
: hint.match(isEmpyNotIsEmptRegex);
|
|
83
76
|
|
|
84
|
-
const result = hint.match(regex);
|
|
85
77
|
if (result) {
|
|
86
78
|
rule.action = result[1];
|
|
87
79
|
rule.control = result[2];
|
|
88
80
|
rule.operator = result[3];
|
|
89
|
-
rule.options = result[4];
|
|
81
|
+
rule.options = !result[4] ? "" : result[4];
|
|
90
82
|
} else {
|
|
91
83
|
throw new ConfigurationException(
|
|
92
84
|
`No dependent information found on layout hint: ${hint}`
|
|
@@ -154,7 +146,7 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
154
146
|
controlAttribute instanceof BooleanAttributeModel
|
|
155
147
|
) {
|
|
156
148
|
return this.options.every((option) =>
|
|
157
|
-
|
|
149
|
+
controlAttribute.selected.includes(option)
|
|
158
150
|
);
|
|
159
151
|
}
|
|
160
152
|
|
|
@@ -170,7 +162,7 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
170
162
|
): boolean {
|
|
171
163
|
if (controlAttribute instanceof ChoiceAttributeModel) {
|
|
172
164
|
return this.options.some((option) =>
|
|
173
|
-
|
|
165
|
+
controlAttribute.selected.includes(option)
|
|
174
166
|
);
|
|
175
167
|
}
|
|
176
168
|
|
|
@@ -193,6 +185,10 @@ class DependentAttribute extends BaseLayoutHintRule {
|
|
|
193
185
|
return !this.processEqualsOptions(controlAttribute);
|
|
194
186
|
case NOT_INCLUDES:
|
|
195
187
|
return !this.processIncludesOptions(controlAttribute);
|
|
188
|
+
case NOT_IS_EMPTY:
|
|
189
|
+
return controlAttribute?.selected.length !== 0;
|
|
190
|
+
case IS_EMPTY:
|
|
191
|
+
return controlAttribute?.selected.length === 0;
|
|
196
192
|
default:
|
|
197
193
|
throw new ConfigurationException(
|
|
198
194
|
`Unsupported operator for dependent question: ${this.operator}`
|