@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 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
- if (!_includesInstanceProperty(value).call(value, this.groupingSeparator)) {
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 = value;
106
+ let integer = absStringValue;
103
107
 
104
- if (this.decimalSeparator !== "" && _includesInstanceProperty(value).call(value, this.decimalSeparator)) {
108
+ if (this.decimalSeparator !== "" && _includesInstanceProperty(absStringValue).call(absStringValue, this.decimalSeparator)) {
105
109
  // decimal before grouping
106
- if (value.indexOf(this.decimalSeparator) < value.indexOf(this.groupingSeparator)) {
110
+ if (absStringValue.indexOf(this.decimalSeparator) < absStringValue.indexOf(this.groupingSeparator)) {
107
111
  return false;
108
112
  }
109
113
 
110
- integer = value.substr(0, value.indexOf(this.decimalSeparator));
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","substr","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 hasCorrectGrouping(value: string): boolean {\n if (!value.includes(this.groupingSeparator)) {\n return true;\n }\n\n let integer = value;\n if (this.decimalSeparator !== \"\" && value.includes(this.decimalSeparator)) {\n // decimal before grouping\n if (\n value.indexOf(this.decimalSeparator) <\n value.indexOf(this.groupingSeparator)\n ) {\n return false;\n }\n\n integer = value.substr(0, value.indexOf(this.decimalSeparator));\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
+ {"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(_context4, NOT_EQUALS, "|")).call(_context3, NOT_INCLUDES);
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(_context5 = _concatInstanceProperty(_context6 = "".concat(DEPENDENT_ATTRIBUTE, "\\s?(\\S*)\\swhen ")).call(_context6, DEPENDENT_ATTRIBUTE_CONTROL, ":\\s?(.*?)\\s*(")).call(_context5, OPERATORS, ")\\s(.*)"), "i");
79
- const result = hint.match(regex);
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 _context7;
132
+ var _context11;
147
133
 
148
- this._options = _mapInstanceProperty(_context7 = options.split("|")).call(_context7, option => _trimInstanceProperty(option).call(option));
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 => compareSelectedAttribute(option, controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected));
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 => compareSelectedAttribute(option, controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected));
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 _context8, _context9;
199
+ var _context14, _context15;
200
200
 
201
- const attribute = attributes.getAttributeByLayoutHint(_concatInstanceProperty(_context8 = "".concat(DEPENDENT_ATTRIBUTE_CONTROL, ":")).call(_context8, this.control), _concatInstanceProperty(_context9 = "".concat(DEPENDENT_ATTRIBUTE_CONTROL, ": ")).call(_context9, this.control));
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 _context10;
234
+ var _context16;
235
235
 
236
- throw new ConfigurationException(_concatInstanceProperty(_context10 = "Unsupported action ".concat(this.action, " for dependent question on attribute: ")).call(_context10, attribute.label));
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
- if (!(0, _includes.default)(value).call(value, this.groupingSeparator)) {
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 = value;
115
+ let integer = absStringValue;
112
116
 
113
- if (this.decimalSeparator !== "" && (0, _includes.default)(value).call(value, this.decimalSeparator)) {
117
+ if (this.decimalSeparator !== "" && (0, _includes.default)(absStringValue).call(absStringValue, this.decimalSeparator)) {
114
118
  // decimal before grouping
115
- if (value.indexOf(this.decimalSeparator) < value.indexOf(this.groupingSeparator)) {
119
+ if (absStringValue.indexOf(this.decimalSeparator) < absStringValue.indexOf(this.groupingSeparator)) {
116
120
  return false;
117
121
  }
118
122
 
119
- integer = value.substr(0, value.indexOf(this.decimalSeparator));
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
- hasCorrectGrouping(value: string): boolean {
85
- if (!value.includes(this.groupingSeparator)) {
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 = value;
90
- if (this.decimalSeparator !== "" && value.includes(this.decimalSeparator)) {
93
+ let integer = absStringValue;
94
+ if (
95
+ this.decimalSeparator !== "" &&
96
+ absStringValue.includes(this.decimalSeparator)
97
+ ) {
91
98
  // decimal before grouping
92
99
  if (
93
- value.indexOf(this.decimalSeparator) <
94
- value.indexOf(this.groupingSeparator)
100
+ absStringValue.indexOf(this.decimalSeparator) <
101
+ absStringValue.indexOf(this.groupingSeparator)
95
102
  ) {
96
103
  return false;
97
104
  }
98
105
 
99
- integer = value.substr(0, value.indexOf(this.decimalSeparator));
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","substr","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 hasCorrectGrouping(value: string): boolean {\n if (!value.includes(this.groupingSeparator)) {\n return true;\n }\n\n let integer = value;\n if (this.decimalSeparator !== \"\" && value.includes(this.decimalSeparator)) {\n // decimal before grouping\n if (\n value.indexOf(this.decimalSeparator) <\n value.indexOf(this.groupingSeparator)\n ) {\n return false;\n }\n\n integer = value.substr(0, value.indexOf(this.decimalSeparator));\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
+ {"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(_context4, NOT_EQUALS, "|")).call(_context3, NOT_INCLUDES);
91
- const regex = new RegExp((0, _concat.default)(_context5 = (0, _concat.default)(_context6 = "".concat(_constants.DEPENDENT_ATTRIBUTE, "\\s?(\\S*)\\swhen ")).call(_context6, _constants.DEPENDENT_ATTRIBUTE_CONTROL, ":\\s?(.*?)\\s*(")).call(_context5, OPERATORS, ")\\s(.*)"), "i");
92
- const result = hint.match(regex);
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 _context7;
145
+ var _context11;
160
146
 
161
- this._options = (0, _map.default)(_context7 = options.split("|")).call(_context7, option => (0, _trim.default)(option).call(option));
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 => compareSelectedAttribute(option, controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected));
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 => compareSelectedAttribute(option, controlAttribute === null || controlAttribute === void 0 ? void 0 : controlAttribute.selected));
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 _context8, _context9;
212
+ var _context14, _context15;
213
213
 
214
- const attribute = attributes.getAttributeByLayoutHint((0, _concat.default)(_context8 = "".concat(_constants.DEPENDENT_ATTRIBUTE_CONTROL, ":")).call(_context8, this.control), (0, _concat.default)(_context9 = "".concat(_constants.DEPENDENT_ATTRIBUTE_CONTROL, ": ")).call(_context9, this.control));
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 _context10;
247
+ var _context16;
248
248
 
249
- throw new _exceptions.ConfigurationException((0, _concat.default)(_context10 = "Unsupported action ".concat(this.action, " for dependent question on attribute: ")).call(_context10, attribute.label));
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
- compareSelectedAttribute(option, controlAttribute?.selected)
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
- compareSelectedAttribute(option, controlAttribute?.selected)
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":";;;;;;;;;;;;;;;;;;;AACA;;AAEA;;AAKA;;AACA;;AAEA;;AAKA,MAAMA,MAAM,GAAG,QAAf;AACA,MAAMC,QAAQ,GAAG,UAAjB;AACA,MAAMC,UAAU,GAAG,WAAnB;AACA,MAAMC,YAAY,GAAG,aAArB;AACA,MAAMC,YAAY,GAAG,YAArB;AACA,MAAMC,QAAQ,GAAG,SAAjB;AAEA,MAAMC,IAAI,GAAG,MAAb;AACA,MAAMC,IAAI,GAAG,MAAb;AAEA;AACA;AACA;;AACA,MAAMC,kBAAN,SAAiCC,2BAAjC,CAAoD;EAAA;IAAA;IAAA;IAAA;IAAA;IAAA;EAAA;;EAUlD;AACF;EAC4B,OAAnBC,mBAAmB,CAACC,IAAD,EAAwB;IAAA;;IAChD,MAAMC,KAAK,GAAG,IAAIC,MAAJ,6EACRC,8BADQ,4BACmBR,IADnB,uBAC2BC,IAD3B,QAEZ,GAFY,CAAd;IAKA,OAAOK,KAAK,CAACG,IAAN,CAAWJ,IAAX,CAAP;EACD;EAED;AACF;AACA;;;EACwB,OAAfK,eAAe,GAAuB;IAC3C,OAAO,IAAIR,kBAAJ,EAAP;EACD;EAED;AACF;;;EACiB,OAARS,QAAQ,CAACN,IAAD,EAAoB;IAAA;;IACjC,MAAMO,IAAI,GAAG,KAAKF,eAAL,EAAb;IAEA,MAAMG,SAAS,iJAAMnB,MAAN,cAAgBC,QAAhB,wBAA4BC,UAA5B,wBAA0CC,YAA1C,wBAA0DC,YAA1D,wBAA0EC,QAA1E,CAAf;IACA,MAAMO,KAAK,GAAG,IAAIC,MAAJ,6EACTC,8BADS,yCAC+BM,sCAD/B,sCAC4ED,SAD5E,eAEZ,GAFY,CAAd;IAIA,MAAME,oBAAoB,GAAG,IAAIR,MAAJ,8EACxBC,8BADwB,0CACgBM,sCADhB,sCAC6DD,SAD7D,QAE3B,GAF2B,CAA7B;IAKA,MAAMG,MAAM,GAAGX,IAAI,CAACY,KAAL,CAAWX,KAAX,IACXD,IAAI,CAACY,KAAL,CAAWX,KAAX,CADW,GAEXD,IAAI,CAACY,KAAL,CAAWF,oBAAX,CAFJ;;IAIA,IAAIC,MAAJ,EAAY;MACVJ,IAAI,CAACM,MAAL,GAAcF,MAAM,CAAC,CAAD,CAApB;MACAJ,IAAI,CAACO,OAAL,GAAeH,MAAM,CAAC,CAAD,CAArB;MACAJ,IAAI,CAACQ,QAAL,GAAgBJ,MAAM,CAAC,CAAD,CAAtB;MACAJ,IAAI,CAACS,OAAL,GAAe,CAACL,MAAM,CAAC,CAAD,CAAP,GAAa,EAAb,GAAkBA,MAAM,CAAC,CAAD,CAAvC;IACD,CALD,MAKO;MACL,MAAM,IAAIM,kCAAJ,0DAC8CjB,IAD9C,EAAN;IAGD;;IAED,OAAOO,IAAP;EACD;EAED;AACF;;;EACY,IAANM,MAAM,GAAW;IACnB,OAAO,KAAKK,OAAZ;EACD;EAED;AACF;;;EACY,IAANL,MAAM,CAACA,MAAD,EAAiB;IACzB,KAAKK,OAAL,GAAeL,MAAf;EACD;EAED;AACF;;;EACa,IAAPC,OAAO,GAAW;IACpB,OAAO,KAAKK,QAAZ;EACD;EAED;AACF;;;EACa,IAAPL,OAAO,CAACA,OAAD,EAAkB;IAC3B,KAAKK,QAAL,GAAgBL,OAAhB;EACD;EAED;AACF;;;EACc,IAARC,QAAQ,GAAW;IACrB,OAAO,KAAKK,SAAZ;EACD;EAED;AACF;;;EACc,IAARL,QAAQ,CAACA,QAAD,EAAmB;IAC7B,KAAKK,SAAL,GAAiBL,QAAjB;EACD;EAED;AACF;;;EACa,IAAPC,OAAO,GAAkB;IAC3B,OAAO,KAAKK,QAAZ;EACD;EAED;AACF;;;EACa,IAAPL,OAAO,CAACA,OAAD,EAAwB;IAAA;;IACjC,KAAKK,QAAL,GAAgB,+BAAAL,OAAO,CAACM,KAAR,CAAc,GAAd,oBAAwBC,MAAD,IAAY,mBAAAA,MAAM,MAAN,CAAAA,MAAM,CAAzC,CAAhB;EACD;EAED;AACF;;;EACEC,oBAAoB,CAClBC,gBADkB,EAET;IACT,IACEA,gBAAgB,YAAYC,6BAA5B,IACAD,gBAAgB,YAAYE,8BAF9B,EAGE;MACA,OAAO,KAAKX,OAAL,CAAaY,KAAb,CAAoBL,MAAD;QAAA;;QAAA,OACxB,oCAAAE,gBAAgB,CAACI,QAAjB,mBAAmCN,MAAnC,CADwB;MAAA,CAAnB,CAAP;IAGD;;IAED,MAAM,IAAIN,kCAAJ,CACJ,oGADI,CAAN;EAGD;EAED;AACF;;;EACEa,sBAAsB,CACpBL,gBADoB,EAEX;IACT,IAAIA,gBAAgB,YAAYC,6BAAhC,EAAsD;MACpD,OAAO,KAAKV,OAAL,CAAae,IAAb,CAAmBR,MAAD;QAAA;;QAAA,OACvB,oCAAAE,gBAAgB,CAACI,QAAjB,mBAAmCN,MAAnC,CADuB;MAAA,CAAlB,CAAP;IAGD;;IAED,MAAM,IAAIN,kCAAJ,CACJ,oFADI,CAAN;EAGD;EAED;AACF;;;EACEe,cAAc,CACZP,gBADY,EAEH;IACT,QAAQ,KAAKV,QAAb;MACE,KAAK1B,MAAL;QACE,OAAO,KAAKmC,oBAAL,CAA0BC,gBAA1B,CAAP;;MACF,KAAKnC,QAAL;QACE,OAAO,KAAKwC,sBAAL,CAA4BL,gBAA5B,CAAP;;MACF,KAAKlC,UAAL;QACE,OAAO,CAAC,KAAKiC,oBAAL,CAA0BC,gBAA1B,CAAR;;MACF,KAAKjC,YAAL;QACE,OAAO,CAAC,KAAKsC,sBAAL,CAA4BL,gBAA5B,CAAR;;MACF,KAAKhC,YAAL;QACE,OAAO,CAAAgC,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,YAAAA,gBAAgB,CAAEI,QAAlB,CAA2BI,MAA3B,MAAsC,CAA7C;;MACF,KAAKvC,QAAL;QACE,OAAO,CAAA+B,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,YAAAA,gBAAgB,CAAEI,QAAlB,CAA2BI,MAA3B,MAAsC,CAA7C;;MACF;QACE,MAAM,IAAIhB,kCAAJ,wDAC4C,KAAKF,QADjD,EAAN;IAdJ;EAkBD;EAED;AACF;;;EACEmB,mBAAmB,CACjBC,UADiB,EAEoC;IAAA;;IACrD,MAAMC,SAAS,GAAGD,UAAU,CAACE,wBAAX,6CACb5B,sCADa,yBACkB,KAAKK,OADvB,+CAEbL,sCAFa,0BAEmB,KAAKK,OAFxB,EAAlB;;IAKA,IACEsB,SAAS,YAAYV,6BAArB,IACAU,SAAS,YAAYT,8BAFvB,EAGE;MACA,OAAOS,SAAP;IACD;;IAED,OAAO,IAAP;EACD;EAED;AACF;;;EACEE,OAAO,CAACF,SAAD,EAA4BD,UAA5B,EAA6D;IAClE,MAAMV,gBAAgB,GAAG,KAAKS,mBAAL,CAAyBC,UAAzB,CAAzB;;IACA,IAAI,CAACV,gBAAL,EAAuB;MACrB;IACD;;IAEDA,gBAAgB,CAACc,sBAAjB,CAAwCJ,UAAxC;;IACA,IAAIV,gBAAgB,CAACe,QAArB,EAA+B;MAC7BJ,SAAS,CAACK,IAAV;MACA;IACD;;IAED,MAAM9B,MAAM,GAAG,KAAKqB,cAAL,CAAoBP,gBAApB,CAAf;;IACA,IAAI,KAAKZ,MAAL,KAAgBlB,IAApB,EAA0B;MACxByC,SAAS,CAACI,QAAV,GAAqB,CAAC7B,MAAtB;IACD,CAFD,MAEO,IAAI,KAAKE,MAAL,KAAgBjB,IAApB,EAA0B;MAC/BwC,SAAS,CAACI,QAAV,GAAqB7B,MAArB;IACD,CAFM,MAEA;MAAA;;MACL,MAAM,IAAIM,kCAAJ,gEACkB,KAAKJ,MADvB,8DACsEuB,SAAS,CAACM,KADhF,EAAN;IAGD;EACF;;AArNiD;;8BAA9C7C,kB,4BAQqC,I;eAgN5BA,kB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beinformed/ui",
3
- "version": "1.23.0",
3
+ "version": "1.23.2",
4
4
  "description": "Toolbox for be informed javascript layouts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "bugs": "http://support.beinformed.com",
@@ -81,22 +81,32 @@ class NumberGroupingConstraint implements IConstraintModel {
81
81
 
82
82
  /**
83
83
  */
84
- hasCorrectGrouping(value: string): boolean {
85
- if (!value.includes(this.groupingSeparator)) {
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 = value;
90
- if (this.decimalSeparator !== "" && value.includes(this.decimalSeparator)) {
93
+ let integer = absStringValue;
94
+ if (
95
+ this.decimalSeparator !== "" &&
96
+ absStringValue.includes(this.decimalSeparator)
97
+ ) {
91
98
  // decimal before grouping
92
99
  if (
93
- value.indexOf(this.decimalSeparator) <
94
- value.indexOf(this.groupingSeparator)
100
+ absStringValue.indexOf(this.decimalSeparator) <
101
+ absStringValue.indexOf(this.groupingSeparator)
95
102
  ) {
96
103
  return false;
97
104
  }
98
105
 
99
- integer = value.substr(0, value.indexOf(this.decimalSeparator));
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
- compareSelectedAttribute(option, controlAttribute?.selected)
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
- compareSelectedAttribute(option, controlAttribute?.selected)
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}`