@beinformed/ui 1.32.0 → 1.33.0-beta.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.
Files changed (30) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/esm/models/attributes/AttributeModel.js +1 -1
  3. package/esm/models/attributes/AttributeModel.js.map +1 -1
  4. package/esm/models/attributes/DatetimeAttributeModel.js +0 -6
  5. package/esm/models/attributes/DatetimeAttributeModel.js.map +1 -1
  6. package/esm/models/attributes/NumberAttributeModel.js +0 -6
  7. package/esm/models/attributes/NumberAttributeModel.js.map +1 -1
  8. package/esm/models/attributes/StringAttributeModel.js +46 -18
  9. package/esm/models/attributes/StringAttributeModel.js.map +1 -1
  10. package/lib/models/attributes/AttributeModel.js +1 -1
  11. package/lib/models/attributes/AttributeModel.js.flow +1 -1
  12. package/lib/models/attributes/AttributeModel.js.map +1 -1
  13. package/lib/models/attributes/DatetimeAttributeModel.js +0 -6
  14. package/lib/models/attributes/DatetimeAttributeModel.js.flow +0 -6
  15. package/lib/models/attributes/DatetimeAttributeModel.js.map +1 -1
  16. package/lib/models/attributes/NumberAttributeModel.js +0 -6
  17. package/lib/models/attributes/NumberAttributeModel.js.flow +0 -6
  18. package/lib/models/attributes/NumberAttributeModel.js.map +1 -1
  19. package/lib/models/attributes/StringAttributeModel.js +46 -18
  20. package/lib/models/attributes/StringAttributeModel.js.flow +67 -18
  21. package/lib/models/attributes/StringAttributeModel.js.map +1 -1
  22. package/lib/models/attributes/__tests__/StringAttributeModel.spec.js.flow +23 -0
  23. package/lib/models/filters/__tests__/ZipcodeFilter.spec.js.flow +111 -0
  24. package/package.json +1 -1
  25. package/src/models/attributes/AttributeModel.js +1 -1
  26. package/src/models/attributes/DatetimeAttributeModel.js +0 -6
  27. package/src/models/attributes/NumberAttributeModel.js +0 -6
  28. package/src/models/attributes/StringAttributeModel.js +67 -18
  29. package/src/models/attributes/__tests__/StringAttributeModel.spec.js +23 -0
  30. package/src/models/filters/__tests__/ZipcodeFilter.spec.js +111 -0
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
9
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
9
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
10
11
  var _AttributeModel = _interopRequireDefault(require("./AttributeModel"));
11
12
  var _ConstraintCollection = _interopRequireDefault(require("./input-constraints/ConstraintCollection"));
@@ -117,14 +118,16 @@ class StringAttributeModel extends _AttributeModel.default {
117
118
  const constraints = new _ConstraintCollection.default();
118
119
  if (this.isBSN()) {
119
120
  constraints.add(new _BSNConstraint.default());
120
- } else if (this.isIBAN()) {
121
+ } else if (this.isIBAN() && (this.operator === "" || this.operator === "exactly" || this.operator === "isNot")) {
122
+ // validate iban when no operator is set or exact or isNot
121
123
  constraints.add(new _IBANConstraint.default());
122
124
  }
123
- if (this.isZipcode() && this.regexp) {
125
+ if (this.isZipcode() && (this.operator === "" || this.operator === "exactly" || this.operator === "isNot")) {
126
+ // validate zip when regex is set is set or exact or isNot
124
127
  constraints.add(new _RegexConstraint.default({
125
128
  messageKey: "Constraint.ZipCode.InvalidFormat",
126
129
  defaultMessage: "Must be a valid Dutch ZIP code, e.g. 1234 AB",
127
- regex: this.regexp
130
+ regex: new RegExp("^[1-9][0-9]{3} ?[a-zA-Z]{2}$", "gi")
128
131
  }));
129
132
  } else if (this.isEmail() && this.regexp) {
130
133
  constraints.add(new _RegexConstraint.default({
@@ -153,15 +156,18 @@ class StringAttributeModel extends _AttributeModel.default {
153
156
  */
154
157
  formatIBAN(value) {
155
158
  const noFormat = this.removeFormat(value);
156
- const groups = noFormat.replace(/\s/g, "").match(/.{1,4}/g);
157
- return groups == null ? "" : groups.join(" ");
159
+ if (this.operator === "" || this.operator === "exactly" || this.operator === "isNot") {
160
+ const groups = noFormat.replace(/\s/g, "").match(/.{1,4}/g);
161
+ return groups == null ? "" : groups.join(" ");
162
+ }
163
+ return noFormat;
158
164
  }
159
165
 
160
166
  /**
161
167
  */
162
168
  formatZipcode(value) {
163
169
  const noFormat = this.removeFormat(value);
164
- if (noFormat.length > 4) {
170
+ if (noFormat.length === 6) {
165
171
  return noFormat.substring(0, 4) + " " + noFormat.substring(4).toUpperCase();
166
172
  }
167
173
  return noFormat;
@@ -179,16 +185,22 @@ class StringAttributeModel extends _AttributeModel.default {
179
185
  if (value == null || value.toString() === "") {
180
186
  return "";
181
187
  }
182
- if (this.isIBAN()) {
183
- return this.formatIBAN(value);
184
- }
185
- if (this.isZipcode()) {
186
- return this.formatZipcode(value);
187
- }
188
- if (this.isBSN()) {
189
- return this.formatBSN(value);
188
+ if (typeof value !== "string") {
189
+ return value;
190
190
  }
191
- return value;
191
+ const values = this.isMultiple ? value.split(",") : [value];
192
+ return (0, _map.default)(values).call(values, val => {
193
+ if (this.isIBAN()) {
194
+ return this.formatIBAN(val);
195
+ }
196
+ if (this.isZipcode()) {
197
+ return this.formatZipcode(val);
198
+ }
199
+ if (this.isBSN()) {
200
+ return this.formatBSN(val);
201
+ }
202
+ return val;
203
+ }).join(",");
192
204
  }
193
205
 
194
206
  /**
@@ -198,7 +210,7 @@ class StringAttributeModel extends _AttributeModel.default {
198
210
  return "";
199
211
  }
200
212
  if (this.isIBAN() || this.isZipcode() || this.isBSN()) {
201
- return value.replace(/\.|\s/g, "");
213
+ return value.replace(/[^a-z0-9,]/gi, "");
202
214
  }
203
215
  return value;
204
216
  }
@@ -220,7 +232,14 @@ class StringAttributeModel extends _AttributeModel.default {
220
232
  */
221
233
  set inputvalue(value) {
222
234
  this._inputvalue = value;
223
- this.value = value == null ? value : this.removeFormat(value);
235
+ if (value == null) {
236
+ this.value = value;
237
+ } else if (this.isMultiple) {
238
+ var _context;
239
+ this.value = (0, _map.default)(_context = value.split(",")).call(_context, val => this.removeFormat(val)).join(",");
240
+ } else {
241
+ this.value = this.removeFormat(value);
242
+ }
224
243
  this.validate(this.validateValue);
225
244
  }
226
245
 
@@ -228,7 +247,9 @@ class StringAttributeModel extends _AttributeModel.default {
228
247
  */
229
248
  get readonlyvalue() {
230
249
  if (typeof this.value === "string") {
231
- return this.formatValue(this.value);
250
+ const formattedValue = this.formatValue(this.value);
251
+ // fix for rendering of multiple spaces
252
+ return formattedValue.replace(/ {2}/gi, " \u00A0");
232
253
  }
233
254
  return this.value == null ? "" : this.value;
234
255
  }
@@ -258,6 +279,13 @@ class StringAttributeModel extends _AttributeModel.default {
258
279
  // default value (also applied for email address + download attribute)
259
280
  return _constants.ATTRIBUTE_WIDTH.MEDIUM;
260
281
  }
282
+
283
+ /**
284
+ * Indicates if a value is multiple choice, used for filters
285
+ */
286
+ get isMultiple() {
287
+ return this.getContribution("multiplechoice", false);
288
+ }
261
289
  }
262
290
  exports.default = StringAttributeModel;
263
291
  //# sourceMappingURL=StringAttributeModel.js.map
@@ -117,16 +117,28 @@ export default class StringAttributeModel extends AttributeModel {
117
117
 
118
118
  if (this.isBSN()) {
119
119
  constraints.add(new BSNConstraint());
120
- } else if (this.isIBAN()) {
120
+ } else if (
121
+ this.isIBAN() &&
122
+ (this.operator === "" ||
123
+ this.operator === "exactly" ||
124
+ this.operator === "isNot")
125
+ ) {
126
+ // validate iban when no operator is set or exact or isNot
121
127
  constraints.add(new IBANConstraint());
122
128
  }
123
129
 
124
- if (this.isZipcode() && this.regexp) {
130
+ if (
131
+ this.isZipcode() &&
132
+ (this.operator === "" ||
133
+ this.operator === "exactly" ||
134
+ this.operator === "isNot")
135
+ ) {
136
+ // validate zip when regex is set is set or exact or isNot
125
137
  constraints.add(
126
138
  new RegexConstraint({
127
139
  messageKey: "Constraint.ZipCode.InvalidFormat",
128
140
  defaultMessage: "Must be a valid Dutch ZIP code, e.g. 1234 AB",
129
- regex: this.regexp,
141
+ regex: new RegExp("^[1-9][0-9]{3} ?[a-zA-Z]{2}$", "gi"),
130
142
  }),
131
143
  );
132
144
  } else if (this.isEmail() && this.regexp) {
@@ -162,15 +174,23 @@ export default class StringAttributeModel extends AttributeModel {
162
174
  formatIBAN(value: string): string {
163
175
  const noFormat = this.removeFormat(value);
164
176
 
165
- const groups = noFormat.replace(/\s/g, "").match(/.{1,4}/g);
166
- return groups == null ? "" : groups.join(" ");
177
+ if (
178
+ this.operator === "" ||
179
+ this.operator === "exactly" ||
180
+ this.operator === "isNot"
181
+ ) {
182
+ const groups = noFormat.replace(/\s/g, "").match(/.{1,4}/g);
183
+ return groups == null ? "" : groups.join(" ");
184
+ }
185
+
186
+ return noFormat;
167
187
  }
168
188
 
169
189
  /**
170
190
  */
171
191
  formatZipcode(value: string): string {
172
192
  const noFormat = this.removeFormat(value);
173
- if (noFormat.length > 4) {
193
+ if (noFormat.length === 6) {
174
194
  return (
175
195
  noFormat.substring(0, 4) + " " + noFormat.substring(4).toUpperCase()
176
196
  );
@@ -191,19 +211,29 @@ export default class StringAttributeModel extends AttributeModel {
191
211
  return "";
192
212
  }
193
213
 
194
- if (this.isIBAN()) {
195
- return this.formatIBAN(value);
214
+ if (typeof value !== "string") {
215
+ return value;
196
216
  }
197
217
 
198
- if (this.isZipcode()) {
199
- return this.formatZipcode(value);
200
- }
218
+ const values = this.isMultiple ? value.split(",") : [value];
201
219
 
202
- if (this.isBSN()) {
203
- return this.formatBSN(value);
204
- }
220
+ return values
221
+ .map((val) => {
222
+ if (this.isIBAN()) {
223
+ return this.formatIBAN(val);
224
+ }
205
225
 
206
- return value;
226
+ if (this.isZipcode()) {
227
+ return this.formatZipcode(val);
228
+ }
229
+
230
+ if (this.isBSN()) {
231
+ return this.formatBSN(val);
232
+ }
233
+
234
+ return val;
235
+ })
236
+ .join(",");
207
237
  }
208
238
 
209
239
  /**
@@ -214,7 +244,7 @@ export default class StringAttributeModel extends AttributeModel {
214
244
  }
215
245
 
216
246
  if (this.isIBAN() || this.isZipcode() || this.isBSN()) {
217
- return value.replace(/\.|\s/g, "");
247
+ return value.replace(/[^a-z0-9,]/gi, "");
218
248
  }
219
249
 
220
250
  return value;
@@ -238,7 +268,17 @@ export default class StringAttributeModel extends AttributeModel {
238
268
  set inputvalue(value: string) {
239
269
  this._inputvalue = value;
240
270
 
241
- this.value = value == null ? value : this.removeFormat(value);
271
+ if (value == null) {
272
+ this.value = value;
273
+ } else if (this.isMultiple) {
274
+ this.value = value
275
+ .split(",")
276
+ .map((val) => this.removeFormat(val))
277
+ .join(",");
278
+ } else {
279
+ this.value = this.removeFormat(value);
280
+ }
281
+
242
282
  this.validate(this.validateValue);
243
283
  }
244
284
 
@@ -246,7 +286,9 @@ export default class StringAttributeModel extends AttributeModel {
246
286
  */
247
287
  get readonlyvalue(): string {
248
288
  if (typeof this.value === "string") {
249
- return this.formatValue(this.value);
289
+ const formattedValue = this.formatValue(this.value);
290
+ // fix for rendering of multiple spaces
291
+ return formattedValue.replace(/ {2}/gi, " \u00A0");
250
292
  }
251
293
 
252
294
  return this.value == null ? "" : this.value;
@@ -280,4 +322,11 @@ export default class StringAttributeModel extends AttributeModel {
280
322
  // default value (also applied for email address + download attribute)
281
323
  return ATTRIBUTE_WIDTH.MEDIUM;
282
324
  }
325
+
326
+ /**
327
+ * Indicates if a value is multiple choice, used for filters
328
+ */
329
+ get isMultiple(): boolean {
330
+ return this.getContribution("multiplechoice", false);
331
+ }
283
332
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StringAttributeModel.js","names":["_AttributeModel","_interopRequireDefault","require","_ConstraintCollection","_RegexConstraint","_BSNConstraint","_IBANConstraint","_constants","StringAttributeModel","AttributeModel","constructor","attribute","attributeContributions","_defineProperty2","default","_placeholder","getContribution","getInitialInputValue","value","formatValue","isApplicableModel","contributions","layouthint","type","Array","isArray","_includes","call","regexp","regexpvalidationmessage","postfix","prefix","placeholder","isBSN","has","isIBAN","isZipcode","isEmail","addConstraints","constraints","ConstraintCollection","add","BSNConstraint","IBANConstraint","RegexConstraint","messageKey","defaultMessage","regex","RegExp","reset","inputvalue","formatIBAN","noFormat","removeFormat","groups","replace","match","join","formatZipcode","length","substring","toUpperCase","formatBSN","toString","validateValue","getInputValue","_inputvalue","validate","readonlyvalue","update","updateLastModification","readonlyWidth","ATTRIBUTE_WIDTH","SMALL","LARGE","MEDIUM","exports"],"sources":["../../../src/models/attributes/StringAttributeModel.js"],"sourcesContent":["// @flow\nimport AttributeModel from \"./AttributeModel\";\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\nimport RegexConstraint from \"./input-constraints/RegexConstraint\";\nimport BSNConstraint from \"./input-constraints/BSNConstraint\";\nimport IBANConstraint from \"./input-constraints/IBANConstraint\";\n\nimport { ATTRIBUTE_WIDTH } from \"../../constants\";\n\n/**\n * String attribute\n */\nexport default class StringAttributeModel extends AttributeModel {\n _placeholder: string;\n\n /**\n */\n constructor(attribute: Object, attributeContributions: Object) {\n super(attribute, attributeContributions);\n\n this._placeholder = this.getContribution(\"placeholder\", \"\");\n }\n\n /**\n * Retrieve initial input value\n */\n getInitialInputValue(value: any): string {\n return this.formatValue(value);\n }\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n const layouthint = contributions?.layouthint;\n return (\n contributions.type === \"string\" ||\n (Array.isArray(layouthint) && layouthint.includes(\"string\"))\n );\n }\n\n /**\n */\n get type(): string {\n return \"string\";\n }\n\n /**\n * Get Regexp pattern\n */\n get regexp(): string | null {\n return this.getContribution(\"regexp\");\n }\n\n /**\n */\n get regexpvalidationmessage(): string | null {\n return this.getContribution(\"regexpValidationMessage\");\n }\n\n /**\n * Get postfix text\n */\n get postfix(): string {\n return this.getContribution(\"postfix\", \"\");\n }\n\n /**\n * Get prefix text\n */\n get prefix(): string {\n return this.getContribution(\"prefix\", \"\");\n }\n\n /**\n * Get placeholder text\n */\n get placeholder(): string {\n return this._placeholder;\n }\n\n /**\n * Set placeholder text\n */\n set placeholder(placeholder: string) {\n this._placeholder = placeholder;\n }\n\n /**\n */\n isBSN(): boolean {\n return this.layouthint.has(\"bsn\");\n }\n\n /**\n */\n isIBAN(): boolean {\n return this.layouthint.has(\"iban\");\n }\n\n /**\n */\n isZipcode(): boolean {\n return this.layouthint.has(\"zipcode\");\n }\n\n /**\n */\n isEmail(): boolean {\n return this.layouthint.has(\"email\");\n }\n\n /**\n * Add regex constraints\n */\n addConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n if (this.isBSN()) {\n constraints.add(new BSNConstraint());\n } else if (this.isIBAN()) {\n constraints.add(new IBANConstraint());\n }\n\n if (this.isZipcode() && this.regexp) {\n constraints.add(\n new RegexConstraint({\n messageKey: \"Constraint.ZipCode.InvalidFormat\",\n defaultMessage: \"Must be a valid Dutch ZIP code, e.g. 1234 AB\",\n regex: this.regexp,\n }),\n );\n } else if (this.isEmail() && this.regexp) {\n constraints.add(\n new RegexConstraint({\n messageKey: \"Constraint.Email.InvalidFormat\",\n defaultMessage: \"Must be a valid e-mail address\",\n regex: new RegExp(this.regexp, \"gi\"),\n }),\n );\n } else if (this.regexp) {\n constraints.add(\n new RegexConstraint({\n messageKey: \"Constraint.String.InvalidRegex\",\n defaultMessage: this.regexpvalidationmessage,\n regex: this.regexp,\n }),\n );\n }\n\n return constraints;\n }\n\n /**\n * Reset attribute to empty string\n */\n reset() {\n this.inputvalue = \"\";\n }\n\n /**\n */\n formatIBAN(value: string): string {\n const noFormat = this.removeFormat(value);\n\n const groups = noFormat.replace(/\\s/g, \"\").match(/.{1,4}/g);\n return groups == null ? \"\" : groups.join(\" \");\n }\n\n /**\n */\n formatZipcode(value: string): string {\n const noFormat = this.removeFormat(value);\n if (noFormat.length > 4) {\n return (\n noFormat.substring(0, 4) + \" \" + noFormat.substring(4).toUpperCase()\n );\n }\n return noFormat;\n }\n\n /**\n */\n formatBSN(value: string): string {\n return this.removeFormat(value);\n }\n\n /**\n */\n formatValue(value: ?string): string {\n if (value == null || value.toString() === \"\") {\n return \"\";\n }\n\n if (this.isIBAN()) {\n return this.formatIBAN(value);\n }\n\n if (this.isZipcode()) {\n return this.formatZipcode(value);\n }\n\n if (this.isBSN()) {\n return this.formatBSN(value);\n }\n\n return value;\n }\n\n /**\n */\n removeFormat(value: ?string): string {\n if (value == null || value.toString() === \"\") {\n return \"\";\n }\n\n if (this.isIBAN() || this.isZipcode() || this.isBSN()) {\n return value.replace(/\\.|\\s/g, \"\");\n }\n\n return value;\n }\n\n /**\n */\n get validateValue(): string {\n return this.removeFormat(this.inputvalue);\n }\n\n /**\n */\n get inputvalue(): string {\n return this.getInputValue();\n }\n\n /**\n * Sets the input value to the value entered by the user\n */\n set inputvalue(value: string) {\n this._inputvalue = value;\n\n this.value = value == null ? value : this.removeFormat(value);\n this.validate(this.validateValue);\n }\n\n /**\n */\n get readonlyvalue(): string {\n if (typeof this.value === \"string\") {\n return this.formatValue(this.value);\n }\n\n return this.value == null ? \"\" : this.value;\n }\n\n /**\n * Update the attribute by name and value\n */\n update(value: string): StringAttributeModel {\n if (this.inputvalue === value) {\n return this;\n }\n\n this.updateLastModification();\n this.inputvalue = value;\n\n return this;\n }\n\n /**\n */\n get readonlyWidth(): $Keys<typeof ATTRIBUTE_WIDTH> {\n if (this.isZipcode() || this.isBSN()) {\n return ATTRIBUTE_WIDTH.SMALL;\n }\n\n if (this.isIBAN()) {\n return ATTRIBUTE_WIDTH.LARGE;\n }\n\n // default value (also applied for email address + download attribute)\n return ATTRIBUTE_WIDTH.MEDIUM;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"StringAttributeModel.js","names":["_AttributeModel","_interopRequireDefault","require","_ConstraintCollection","_RegexConstraint","_BSNConstraint","_IBANConstraint","_constants","StringAttributeModel","AttributeModel","constructor","attribute","attributeContributions","_defineProperty2","default","_placeholder","getContribution","getInitialInputValue","value","formatValue","isApplicableModel","contributions","layouthint","type","Array","isArray","_includes","call","regexp","regexpvalidationmessage","postfix","prefix","placeholder","isBSN","has","isIBAN","isZipcode","isEmail","addConstraints","constraints","ConstraintCollection","add","BSNConstraint","operator","IBANConstraint","RegexConstraint","messageKey","defaultMessage","regex","RegExp","reset","inputvalue","formatIBAN","noFormat","removeFormat","groups","replace","match","join","formatZipcode","length","substring","toUpperCase","formatBSN","toString","values","isMultiple","split","_map","val","validateValue","getInputValue","_inputvalue","_context","validate","readonlyvalue","formattedValue","update","updateLastModification","readonlyWidth","ATTRIBUTE_WIDTH","SMALL","LARGE","MEDIUM","exports"],"sources":["../../../src/models/attributes/StringAttributeModel.js"],"sourcesContent":["// @flow\nimport AttributeModel from \"./AttributeModel\";\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\nimport RegexConstraint from \"./input-constraints/RegexConstraint\";\nimport BSNConstraint from \"./input-constraints/BSNConstraint\";\nimport IBANConstraint from \"./input-constraints/IBANConstraint\";\n\nimport { ATTRIBUTE_WIDTH } from \"../../constants\";\n\n/**\n * String attribute\n */\nexport default class StringAttributeModel extends AttributeModel {\n _placeholder: string;\n\n /**\n */\n constructor(attribute: Object, attributeContributions: Object) {\n super(attribute, attributeContributions);\n\n this._placeholder = this.getContribution(\"placeholder\", \"\");\n }\n\n /**\n * Retrieve initial input value\n */\n getInitialInputValue(value: any): string {\n return this.formatValue(value);\n }\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n const layouthint = contributions?.layouthint;\n return (\n contributions.type === \"string\" ||\n (Array.isArray(layouthint) && layouthint.includes(\"string\"))\n );\n }\n\n /**\n */\n get type(): string {\n return \"string\";\n }\n\n /**\n * Get Regexp pattern\n */\n get regexp(): string | null {\n return this.getContribution(\"regexp\");\n }\n\n /**\n */\n get regexpvalidationmessage(): string | null {\n return this.getContribution(\"regexpValidationMessage\");\n }\n\n /**\n * Get postfix text\n */\n get postfix(): string {\n return this.getContribution(\"postfix\", \"\");\n }\n\n /**\n * Get prefix text\n */\n get prefix(): string {\n return this.getContribution(\"prefix\", \"\");\n }\n\n /**\n * Get placeholder text\n */\n get placeholder(): string {\n return this._placeholder;\n }\n\n /**\n * Set placeholder text\n */\n set placeholder(placeholder: string) {\n this._placeholder = placeholder;\n }\n\n /**\n */\n isBSN(): boolean {\n return this.layouthint.has(\"bsn\");\n }\n\n /**\n */\n isIBAN(): boolean {\n return this.layouthint.has(\"iban\");\n }\n\n /**\n */\n isZipcode(): boolean {\n return this.layouthint.has(\"zipcode\");\n }\n\n /**\n */\n isEmail(): boolean {\n return this.layouthint.has(\"email\");\n }\n\n /**\n * Add regex constraints\n */\n addConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n if (this.isBSN()) {\n constraints.add(new BSNConstraint());\n } else if (\n this.isIBAN() &&\n (this.operator === \"\" ||\n this.operator === \"exactly\" ||\n this.operator === \"isNot\")\n ) {\n // validate iban when no operator is set or exact or isNot\n constraints.add(new IBANConstraint());\n }\n\n if (\n this.isZipcode() &&\n (this.operator === \"\" ||\n this.operator === \"exactly\" ||\n this.operator === \"isNot\")\n ) {\n // validate zip when regex is set is set or exact or isNot\n constraints.add(\n new RegexConstraint({\n messageKey: \"Constraint.ZipCode.InvalidFormat\",\n defaultMessage: \"Must be a valid Dutch ZIP code, e.g. 1234 AB\",\n regex: new RegExp(\"^[1-9][0-9]{3} ?[a-zA-Z]{2}$\", \"gi\"),\n }),\n );\n } else if (this.isEmail() && this.regexp) {\n constraints.add(\n new RegexConstraint({\n messageKey: \"Constraint.Email.InvalidFormat\",\n defaultMessage: \"Must be a valid e-mail address\",\n regex: new RegExp(this.regexp, \"gi\"),\n }),\n );\n } else if (this.regexp) {\n constraints.add(\n new RegexConstraint({\n messageKey: \"Constraint.String.InvalidRegex\",\n defaultMessage: this.regexpvalidationmessage,\n regex: this.regexp,\n }),\n );\n }\n\n return constraints;\n }\n\n /**\n * Reset attribute to empty string\n */\n reset() {\n this.inputvalue = \"\";\n }\n\n /**\n */\n formatIBAN(value: string): string {\n const noFormat = this.removeFormat(value);\n\n if (\n this.operator === \"\" ||\n this.operator === \"exactly\" ||\n this.operator === \"isNot\"\n ) {\n const groups = noFormat.replace(/\\s/g, \"\").match(/.{1,4}/g);\n return groups == null ? \"\" : groups.join(\" \");\n }\n\n return noFormat;\n }\n\n /**\n */\n formatZipcode(value: string): string {\n const noFormat = this.removeFormat(value);\n if (noFormat.length === 6) {\n return (\n noFormat.substring(0, 4) + \" \" + noFormat.substring(4).toUpperCase()\n );\n }\n return noFormat;\n }\n\n /**\n */\n formatBSN(value: string): string {\n return this.removeFormat(value);\n }\n\n /**\n */\n formatValue(value: ?string): string {\n if (value == null || value.toString() === \"\") {\n return \"\";\n }\n\n if (typeof value !== \"string\") {\n return value;\n }\n\n const values = this.isMultiple ? value.split(\",\") : [value];\n\n return values\n .map((val) => {\n if (this.isIBAN()) {\n return this.formatIBAN(val);\n }\n\n if (this.isZipcode()) {\n return this.formatZipcode(val);\n }\n\n if (this.isBSN()) {\n return this.formatBSN(val);\n }\n\n return val;\n })\n .join(\",\");\n }\n\n /**\n */\n removeFormat(value: ?string): string {\n if (value == null || value.toString() === \"\") {\n return \"\";\n }\n\n if (this.isIBAN() || this.isZipcode() || this.isBSN()) {\n return value.replace(/[^a-z0-9,]/gi, \"\");\n }\n\n return value;\n }\n\n /**\n */\n get validateValue(): string {\n return this.removeFormat(this.inputvalue);\n }\n\n /**\n */\n get inputvalue(): string {\n return this.getInputValue();\n }\n\n /**\n * Sets the input value to the value entered by the user\n */\n set inputvalue(value: string) {\n this._inputvalue = value;\n\n if (value == null) {\n this.value = value;\n } else if (this.isMultiple) {\n this.value = value\n .split(\",\")\n .map((val) => this.removeFormat(val))\n .join(\",\");\n } else {\n this.value = this.removeFormat(value);\n }\n\n this.validate(this.validateValue);\n }\n\n /**\n */\n get readonlyvalue(): string {\n if (typeof this.value === \"string\") {\n const formattedValue = this.formatValue(this.value);\n // fix for rendering of multiple spaces\n return formattedValue.replace(/ {2}/gi, \" \\u00A0\");\n }\n\n return this.value == null ? \"\" : this.value;\n }\n\n /**\n * Update the attribute by name and value\n */\n update(value: string): StringAttributeModel {\n if (this.inputvalue === value) {\n return this;\n }\n\n this.updateLastModification();\n this.inputvalue = value;\n\n return this;\n }\n\n /**\n */\n get readonlyWidth(): $Keys<typeof ATTRIBUTE_WIDTH> {\n if (this.isZipcode() || this.isBSN()) {\n return ATTRIBUTE_WIDTH.SMALL;\n }\n\n if (this.isIBAN()) {\n return ATTRIBUTE_WIDTH.LARGE;\n }\n\n // default value (also applied for email address + download attribute)\n return ATTRIBUTE_WIDTH.MEDIUM;\n }\n\n /**\n * Indicates if a value is multiple choice, used for filters\n */\n get isMultiple(): boolean {\n return this.getContribution(\"multiplechoice\", false);\n }\n}\n"],"mappings":"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"}
@@ -112,4 +112,27 @@ describe("stringAttributeModel", () => {
112
112
 
113
113
  expect(attribute).not.toBe(clonedAttribute);
114
114
  });
115
+
116
+ it("handles multiple spaces in the readonlyvalue", () => {
117
+ const attribute = new StringAttributeModel({}, { type: "string" });
118
+
119
+ attribute.update("test test");
120
+
121
+ expect(attribute.value).toBe("test test");
122
+ expect(attribute.inputvalue).toBe("test test");
123
+ expect(attribute.readonlyvalue).toBe("test \u00A0 \u00A0 test");
124
+ });
125
+
126
+ it("format isMultiple with escaped comma", () => {
127
+ const attribute = new StringAttributeModel(
128
+ {},
129
+ { type: "string", multiplechoice: true },
130
+ );
131
+
132
+ attribute.update("test test");
133
+
134
+ expect(attribute.value).toBe("test test");
135
+ expect(attribute.inputvalue).toBe("test test");
136
+ expect(attribute.readonlyvalue).toBe("test \u00A0 \u00A0 test");
137
+ });
115
138
  });
@@ -0,0 +1,111 @@
1
+ import FilterModel from "../FilterModel";
2
+
3
+ describe("filterModel", () => {
4
+ let data;
5
+ let contributions;
6
+
7
+ beforeEach(() => {
8
+ data = {
9
+ name: "zipfilter",
10
+ param: "zipfilter",
11
+ };
12
+
13
+ contributions = {
14
+ label: "zipfilter",
15
+ layouthint: ["zipcode"],
16
+ multiplechoice: false,
17
+ operator: "exactly",
18
+ type: "string",
19
+ };
20
+ });
21
+
22
+ it("should be able to create a filter from a typical modular UI json filter structure without value", () => {
23
+ const filter = new FilterModel(data, contributions);
24
+
25
+ expect(filter).toBeInstanceOf(FilterModel);
26
+ expect(filter.label).toBe("zipfilter");
27
+ expect(filter.name).toBe("zipfilter");
28
+ expect(filter.value).toBeNull();
29
+ expect(filter.inputvalue).toBeUndefined();
30
+ expect(filter.type).toBe("string");
31
+ });
32
+
33
+ it("modular ui input, zipcode no space", () => {
34
+ const stringFilterWithValue = { ...data };
35
+
36
+ stringFilterWithValue.value = "1234AB";
37
+
38
+ const filter = new FilterModel(stringFilterWithValue, contributions);
39
+
40
+ expect(filter).toBeInstanceOf(FilterModel);
41
+ expect(filter.attribute.value).toBe("1234AB");
42
+ expect(filter.attribute.inputvalue).toBe("1234 AB");
43
+ expect(filter.params).toStrictEqual([
44
+ {
45
+ name: "zipfilter",
46
+ value: "1234AB",
47
+ },
48
+ ]);
49
+
50
+ filter.reset();
51
+ expect(filter.attribute.inputvalue).toBe("");
52
+ expect(filter.attribute.value).toBeNull();
53
+ });
54
+
55
+ it("modular ui input, zipcode space", () => {
56
+ const filter = new FilterModel(data, contributions);
57
+
58
+ filter.update(filter.attribute, "1234 AB");
59
+
60
+ expect(filter).toBeInstanceOf(FilterModel);
61
+ expect(filter.attribute.value).toBe("1234AB");
62
+ expect(filter.attribute.inputvalue).toBe("1234 AB");
63
+ expect(filter.params).toStrictEqual([
64
+ {
65
+ name: "zipfilter",
66
+ value: "1234AB",
67
+ },
68
+ ]);
69
+
70
+ expect(filter.isValid).toBe(true);
71
+ });
72
+
73
+ it("modular ui input, wrong zipcode", () => {
74
+ const filter = new FilterModel(data, contributions);
75
+
76
+ filter.update(filter.attribute, "123");
77
+
78
+ expect(filter).toBeInstanceOf(FilterModel);
79
+ expect(filter.attribute.value).toBe("123");
80
+ expect(filter.attribute.inputvalue).toBe("123");
81
+ expect(filter.params).toStrictEqual([
82
+ {
83
+ name: "zipfilter",
84
+ value: "123",
85
+ },
86
+ ]);
87
+
88
+ expect(filter.isValid).toBe(false);
89
+ });
90
+
91
+ it("modular ui input - starts with, zipcode part", () => {
92
+ const filter = new FilterModel(data, {
93
+ operator: "startsWith",
94
+ contributions,
95
+ });
96
+
97
+ filter.update(filter.attribute, "123");
98
+
99
+ expect(filter).toBeInstanceOf(FilterModel);
100
+ expect(filter.attribute.value).toBe("123");
101
+ expect(filter.attribute.inputvalue).toBe("123");
102
+ expect(filter.params).toStrictEqual([
103
+ {
104
+ name: "zipfilter",
105
+ value: "123",
106
+ },
107
+ ]);
108
+
109
+ expect(filter.isValid).toBe(true);
110
+ });
111
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beinformed/ui",
3
- "version": "1.32.0",
3
+ "version": "1.33.0-beta.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",
@@ -584,7 +584,7 @@ export default class AttributeModel
584
584
  /**
585
585
  */
586
586
  get operator(): string {
587
- return "";
587
+ return this.getContribution("operator", "");
588
588
  }
589
589
 
590
590
  /**
@@ -170,12 +170,6 @@ class DatetimeAttributeModel extends StringAttributeModel {
170
170
  return this.formatUtil.convertFormat(format);
171
171
  }
172
172
 
173
- /**
174
- */
175
- get operator(): string {
176
- return this.getContribution("operator", "");
177
- }
178
-
179
173
  /**
180
174
  */
181
175
  get hasDate(): boolean {
@@ -102,12 +102,6 @@ export default class NumberAttributeModel extends AttributeModel {
102
102
  return this.getContribution("placeholder", "");
103
103
  }
104
104
 
105
- /**
106
- */
107
- get operator(): string {
108
- return this.getContribution("operator", "");
109
- }
110
-
111
105
  /**
112
106
  * Add number constraints
113
107
  */