@beinformed/ui 1.33.0-beta.0 → 1.33.0-beta.3

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,22 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [1.33.0-beta.3](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.33.0-beta.2...v1.33.0-beta.3) (2023-08-28)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **sanitize-html:** improve encoding of html entities to numerical entities ([45c3c56](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/45c3c56c8e04ca36b898efb5651fd87cbc9eea9f))
11
+
12
+ ## [1.33.0-beta.2](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.33.0-beta.1...v1.33.0-beta.2) (2023-08-24)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **string-attribute:** set spaces only on readonlyvalue ([1956e39](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/1956e39d27019a2dd5893f6c691b992ac4ddf6f3))
18
+
19
+ ## [1.33.0-beta.1](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.33.0-beta.0...v1.33.0-beta.1) (2023-08-24)
20
+
5
21
  ## [1.33.0-beta.0](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.32.0...v1.33.0-beta.0) (2023-08-24)
6
22
 
7
23
 
@@ -193,9 +193,7 @@ export default class StringAttributeModel extends AttributeModel {
193
193
  if (this.isBSN()) {
194
194
  return this.formatBSN(val);
195
195
  }
196
-
197
- // adds nbsp to values with multiple spaces
198
- return val.replace(/ {2}/gi, " \u00A0");
196
+ return val;
199
197
  }).join(",");
200
198
  }
201
199
 
@@ -243,7 +241,9 @@ export default class StringAttributeModel extends AttributeModel {
243
241
  */
244
242
  get readonlyvalue() {
245
243
  if (typeof this.value === "string") {
246
- return this.formatValue(this.value);
244
+ const formattedValue = this.formatValue(this.value);
245
+ // fix for rendering of multiple spaces
246
+ return formattedValue.replace(/ {2}/gi, " \u00A0");
247
247
  }
248
248
  return this.value == null ? "" : this.value;
249
249
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StringAttributeModel.js","names":["AttributeModel","ConstraintCollection","RegexConstraint","BSNConstraint","IBANConstraint","ATTRIBUTE_WIDTH","StringAttributeModel","constructor","attribute","attributeContributions","_defineProperty","_placeholder","getContribution","getInitialInputValue","value","formatValue","isApplicableModel","contributions","layouthint","type","Array","isArray","_includesInstanceProperty","call","regexp","regexpvalidationmessage","postfix","prefix","placeholder","isBSN","has","isIBAN","isZipcode","isEmail","addConstraints","constraints","add","operator","messageKey","defaultMessage","regex","RegExp","reset","inputvalue","formatIBAN","noFormat","removeFormat","groups","replace","match","join","formatZipcode","length","substring","toUpperCase","formatBSN","toString","values","isMultiple","split","_mapInstanceProperty","val","validateValue","getInputValue","_inputvalue","_context","validate","readonlyvalue","update","updateLastModification","readonlyWidth","SMALL","LARGE","MEDIUM"],"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 // adds nbsp to values with multiple spaces\n return val.replace(/ {2}/gi, \" \\u00A0\");\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 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 /**\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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"}
1
+ {"version":3,"file":"StringAttributeModel.js","names":["AttributeModel","ConstraintCollection","RegexConstraint","BSNConstraint","IBANConstraint","ATTRIBUTE_WIDTH","StringAttributeModel","constructor","attribute","attributeContributions","_defineProperty","_placeholder","getContribution","getInitialInputValue","value","formatValue","isApplicableModel","contributions","layouthint","type","Array","isArray","_includesInstanceProperty","call","regexp","regexpvalidationmessage","postfix","prefix","placeholder","isBSN","has","isIBAN","isZipcode","isEmail","addConstraints","constraints","add","operator","messageKey","defaultMessage","regex","RegExp","reset","inputvalue","formatIBAN","noFormat","removeFormat","groups","replace","match","join","formatZipcode","length","substring","toUpperCase","formatBSN","toString","values","isMultiple","split","_mapInstanceProperty","val","validateValue","getInputValue","_inputvalue","_context","validate","readonlyvalue","formattedValue","update","updateLastModification","readonlyWidth","SMALL","LARGE","MEDIUM"],"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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"}
@@ -5,13 +5,15 @@ import { IllegalArgumentException } from "../../exceptions";
5
5
  * When path is only one deep better use optional chaining
6
6
  */
7
7
  const properEntityEncoding = html => {
8
- const escapedGt = html.replace(/</g, "[");
9
- const escapedLt = escapedGt.replace(/>/g, "]");
10
- const properEntities = he.encode(he.decode(escapedLt), {
11
- decimal: true
8
+ const htmlDecoded = he.decode(html, {
9
+ decimal: true,
10
+ allowUnsafeSymbols: true
12
11
  });
13
- const unescapedGt = properEntities.replace(/\[/g, "<");
14
- return unescapedGt.replace(/]/g, ">");
12
+ const htmlEncoded = he.encode(htmlDecoded, {
13
+ decimal: true,
14
+ allowUnsafeSymbols: true
15
+ });
16
+ return htmlEncoded;
15
17
  };
16
18
 
17
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeHtml.js","names":["he","IllegalArgumentException","properEntityEncoding","html","escapedGt","replace","escapedLt","properEntities","encode","decode","decimal","unescapedGt","removeUnwantedHtml","options","arguments","length","undefined","allowedTags","correctEntityHtml","htmlWithoutAttributes","htmlWithCorrectBR","Array","isArray","join","pattern","regex","RegExp"],"sources":["../../../src/utils/helpers/sanitizeHtml.js"],"sourcesContent":["// @flow\nimport he from \"he\";\n\nimport { IllegalArgumentException } from \"../../exceptions\";\n\ntype removeUnwantedHtmlOptions = {\n allowedTags?: Array<string>,\n};\n\n/**\n * Translates html entities to their correct decimal equivalent\n * When path is only one deep better use optional chaining\n */\nconst properEntityEncoding = (html: string) => {\n const escapedGt = html.replace(/</g, \"[\");\n const escapedLt = escapedGt.replace(/>/g, \"]\");\n\n const properEntities = he.encode(he.decode(escapedLt), {\n decimal: true,\n });\n\n const unescapedGt = properEntities.replace(/\\[/g, \"<\");\n\n return unescapedGt.replace(/]/g, \">\");\n};\n\n/**\n * removes unwanted html, this might result in incorrect html, as it removes all html that we don't except,\n * like <b style=\"font-weight: 400\">bold</b> will result in bold</b>\n */\nconst removeUnwantedHtml = (\n html: string,\n options: removeUnwantedHtmlOptions = {\n allowedTags: [\"p\", \"br\", \"b\", \"i\", \"u\", \"strike\"],\n },\n): string => {\n if (typeof html !== \"string\") {\n throw new IllegalArgumentException(\"sanitizeHTML method expects a string\");\n }\n\n const correctEntityHtml = properEntityEncoding(html);\n\n // remove attributes from html elements\n const htmlWithoutAttributes = correctEntityHtml.replace(\n /<(\\w+)(.|[\\r\\n])*?>/gi,\n \"<$1>\",\n );\n\n const htmlWithCorrectBR = htmlWithoutAttributes.replace(\n /<br\\s*>/gi,\n \"<br />\",\n );\n\n // remove not allowed tags\n const allowedTags = Array.isArray(options.allowedTags)\n ? options.allowedTags.join(\"|\")\n : \"\";\n const pattern = `<(?!\\\\/?(${allowedTags})(>|\\\\s\\\\/))[^<]+?>`;\n const regex = new RegExp(pattern, \"gi\");\n\n return htmlWithCorrectBR.replace(regex, \"\");\n};\n\nexport { removeUnwantedHtml };\n"],"mappings":"AACA,OAAOA,EAAE,MAAM,IAAI;AAEnB,SAASC,wBAAwB,QAAQ,kBAAkB;AAM3D;AACA;AACA;AACA;AACA,MAAMC,oBAAoB,GAAIC,IAAY,IAAK;EAC7C,MAAMC,SAAS,GAAGD,IAAI,CAACE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;EACzC,MAAMC,SAAS,GAAGF,SAAS,CAACC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;EAE9C,MAAME,cAAc,GAAGP,EAAE,CAACQ,MAAM,CAACR,EAAE,CAACS,MAAM,CAACH,SAAS,CAAC,EAAE;IACrDI,OAAO,EAAE;EACX,CAAC,CAAC;EAEF,MAAMC,WAAW,GAAGJ,cAAc,CAACF,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAEtD,OAAOM,WAAW,CAACN,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AACvC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAMO,kBAAkB,GAAG,SAAAA,CACzBT,IAAY,EAID;EAAA,IAHXU,OAAkC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IACnCG,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ;EAClD,CAAC;EAED,IAAI,OAAOd,IAAI,KAAK,QAAQ,EAAE;IAC5B,MAAM,IAAIF,wBAAwB,CAAC,sCAAsC,CAAC;EAC5E;EAEA,MAAMiB,iBAAiB,GAAGhB,oBAAoB,CAACC,IAAI,CAAC;;EAEpD;EACA,MAAMgB,qBAAqB,GAAGD,iBAAiB,CAACb,OAAO,CACrD,uBAAuB,EACvB,MACF,CAAC;EAED,MAAMe,iBAAiB,GAAGD,qBAAqB,CAACd,OAAO,CACrD,WAAW,EACX,QACF,CAAC;;EAED;EACA,MAAMY,WAAW,GAAGI,KAAK,CAACC,OAAO,CAACT,OAAO,CAACI,WAAW,CAAC,GAClDJ,OAAO,CAACI,WAAW,CAACM,IAAI,CAAC,GAAG,CAAC,GAC7B,EAAE;EACN,MAAMC,OAAO,GAAI,YAAWP,WAAY,qBAAoB;EAC5D,MAAMQ,KAAK,GAAG,IAAIC,MAAM,CAACF,OAAO,EAAE,IAAI,CAAC;EAEvC,OAAOJ,iBAAiB,CAACf,OAAO,CAACoB,KAAK,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,SAASb,kBAAkB"}
1
+ {"version":3,"file":"sanitizeHtml.js","names":["he","IllegalArgumentException","properEntityEncoding","html","htmlDecoded","decode","decimal","allowUnsafeSymbols","htmlEncoded","encode","removeUnwantedHtml","options","arguments","length","undefined","allowedTags","correctEntityHtml","htmlWithoutAttributes","replace","htmlWithCorrectBR","Array","isArray","join","pattern","regex","RegExp"],"sources":["../../../src/utils/helpers/sanitizeHtml.js"],"sourcesContent":["// @flow\nimport he from \"he\";\n\nimport { IllegalArgumentException } from \"../../exceptions\";\n\ntype removeUnwantedHtmlOptions = {\n allowedTags?: Array<string>,\n};\n\n/**\n * Translates html entities to their correct decimal equivalent\n * When path is only one deep better use optional chaining\n */\nconst properEntityEncoding = (html: string) => {\n const htmlDecoded = he.decode(html, {\n decimal: true,\n allowUnsafeSymbols: true,\n });\n\n const htmlEncoded = he.encode(htmlDecoded, {\n decimal: true,\n allowUnsafeSymbols: true,\n });\n\n return htmlEncoded;\n};\n\n/**\n * removes unwanted html, this might result in incorrect html, as it removes all html that we don't except,\n * like <b style=\"font-weight: 400\">bold</b> will result in bold</b>\n */\nconst removeUnwantedHtml = (\n html: string,\n options: removeUnwantedHtmlOptions = {\n allowedTags: [\"p\", \"br\", \"b\", \"i\", \"u\", \"strike\"],\n },\n): string => {\n if (typeof html !== \"string\") {\n throw new IllegalArgumentException(\"sanitizeHTML method expects a string\");\n }\n\n const correctEntityHtml = properEntityEncoding(html);\n\n // remove attributes from html elements\n const htmlWithoutAttributes = correctEntityHtml.replace(\n /<(\\w+)(.|[\\r\\n])*?>/gi,\n \"<$1>\",\n );\n\n const htmlWithCorrectBR = htmlWithoutAttributes.replace(\n /<br\\s*>/gi,\n \"<br />\",\n );\n\n // remove not allowed tags\n const allowedTags = Array.isArray(options.allowedTags)\n ? options.allowedTags.join(\"|\")\n : \"\";\n const pattern = `<(?!\\\\/?(${allowedTags})(>|\\\\s\\\\/))[^<]+?>`;\n const regex = new RegExp(pattern, \"gi\");\n\n return htmlWithCorrectBR.replace(regex, \"\");\n};\n\nexport { removeUnwantedHtml };\n"],"mappings":"AACA,OAAOA,EAAE,MAAM,IAAI;AAEnB,SAASC,wBAAwB,QAAQ,kBAAkB;AAM3D;AACA;AACA;AACA;AACA,MAAMC,oBAAoB,GAAIC,IAAY,IAAK;EAC7C,MAAMC,WAAW,GAAGJ,EAAE,CAACK,MAAM,CAACF,IAAI,EAAE;IAClCG,OAAO,EAAE,IAAI;IACbC,kBAAkB,EAAE;EACtB,CAAC,CAAC;EAEF,MAAMC,WAAW,GAAGR,EAAE,CAACS,MAAM,CAACL,WAAW,EAAE;IACzCE,OAAO,EAAE,IAAI;IACbC,kBAAkB,EAAE;EACtB,CAAC,CAAC;EAEF,OAAOC,WAAW;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAME,kBAAkB,GAAG,SAAAA,CACzBP,IAAY,EAID;EAAA,IAHXQ,OAAkC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IACnCG,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ;EAClD,CAAC;EAED,IAAI,OAAOZ,IAAI,KAAK,QAAQ,EAAE;IAC5B,MAAM,IAAIF,wBAAwB,CAAC,sCAAsC,CAAC;EAC5E;EAEA,MAAMe,iBAAiB,GAAGd,oBAAoB,CAACC,IAAI,CAAC;;EAEpD;EACA,MAAMc,qBAAqB,GAAGD,iBAAiB,CAACE,OAAO,CACrD,uBAAuB,EACvB,MACF,CAAC;EAED,MAAMC,iBAAiB,GAAGF,qBAAqB,CAACC,OAAO,CACrD,WAAW,EACX,QACF,CAAC;;EAED;EACA,MAAMH,WAAW,GAAGK,KAAK,CAACC,OAAO,CAACV,OAAO,CAACI,WAAW,CAAC,GAClDJ,OAAO,CAACI,WAAW,CAACO,IAAI,CAAC,GAAG,CAAC,GAC7B,EAAE;EACN,MAAMC,OAAO,GAAI,YAAWR,WAAY,qBAAoB;EAC5D,MAAMS,KAAK,GAAG,IAAIC,MAAM,CAACF,OAAO,EAAE,IAAI,CAAC;EAEvC,OAAOJ,iBAAiB,CAACD,OAAO,CAACM,KAAK,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,SAASd,kBAAkB"}
@@ -199,9 +199,7 @@ class StringAttributeModel extends _AttributeModel.default {
199
199
  if (this.isBSN()) {
200
200
  return this.formatBSN(val);
201
201
  }
202
-
203
- // adds nbsp to values with multiple spaces
204
- return val.replace(/ {2}/gi, " \u00A0");
202
+ return val;
205
203
  }).join(",");
206
204
  }
207
205
 
@@ -249,7 +247,9 @@ class StringAttributeModel extends _AttributeModel.default {
249
247
  */
250
248
  get readonlyvalue() {
251
249
  if (typeof this.value === "string") {
252
- 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");
253
253
  }
254
254
  return this.value == null ? "" : this.value;
255
255
  }
@@ -231,8 +231,7 @@ export default class StringAttributeModel extends AttributeModel {
231
231
  return this.formatBSN(val);
232
232
  }
233
233
 
234
- // adds nbsp to values with multiple spaces
235
- return val.replace(/ {2}/gi, " \u00A0");
234
+ return val;
236
235
  })
237
236
  .join(",");
238
237
  }
@@ -287,7 +286,9 @@ export default class StringAttributeModel extends AttributeModel {
287
286
  */
288
287
  get readonlyvalue(): string {
289
288
  if (typeof this.value === "string") {
290
- 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");
291
292
  }
292
293
 
293
294
  return this.value == null ? "" : this.value;
@@ -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","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","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 // adds nbsp to values with multiple spaces\n return val.replace(/ {2}/gi, \" \\u00A0\");\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 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 /**\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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"}
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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"}
@@ -12,7 +12,7 @@ describe("sanitizeHTML", () => {
12
12
 
13
13
  expect(
14
14
  removeUnwantedHtml(
15
- "<p>String with <b>allowed <i>html</i></b><br /> and <strong>NOT</strong> allowed html</p>",
15
+ "<p>String with <b>allowed <i>html</i></b><br /> and <blink>NOT</blink> allowed html</p>",
16
16
  ),
17
17
  ).toBe(
18
18
  "<p>String with <b>allowed <i>html</i></b><br /> and NOT allowed html</p>",
@@ -28,4 +28,38 @@ describe("sanitizeHTML", () => {
28
28
  ),
29
29
  ).toBe("<p>String <b>not allowed attribute</b> string</p>");
30
30
  });
31
+
32
+ it("Can convert html entities to numerical entities", () => {
33
+ expect(
34
+ removeUnwantedHtml("f&ouml;o &hearts; b&aring;r &#x1D306; baz"),
35
+ ).toBe("f&#246;o &#9829; b&#229;r &#119558; baz");
36
+ });
37
+
38
+ it("Can encode special charcaters to numerical characters", () => {
39
+ expect(removeUnwantedHtml("<p>foo © bar ≠ baz 𝌆 qux bla</p>")).toBe(
40
+ "<p>foo &#169; bar &#8800; baz &#119558; qux bla</p>",
41
+ );
42
+
43
+ expect(
44
+ removeUnwantedHtml(
45
+ "<p>foo &#169; bar &#8800; baz &#119558; qux &#160; bla</p>",
46
+ ),
47
+ ).toBe("<p>foo &#169; bar &#8800; baz &#119558; qux &#160; bla</p>");
48
+ });
49
+
50
+ it("Keeps brackets", () => {
51
+ expect(
52
+ removeUnwantedHtml(
53
+ "The list of children [ Peter, Steven, Susan ] is up to date.",
54
+ ),
55
+ ).toBe("The list of children [ Peter, Steven, Susan ] is up to date.");
56
+ });
57
+
58
+ it("Keeps curly brackets", () => {
59
+ expect(
60
+ removeUnwantedHtml(
61
+ "The list of children { Peter, Steven, Susan } is up to date.",
62
+ ),
63
+ ).toBe("The list of children { Peter, Steven, Susan } is up to date.");
64
+ });
31
65
  });
@@ -12,13 +12,15 @@ var _exceptions = require("../../exceptions");
12
12
  * When path is only one deep better use optional chaining
13
13
  */
14
14
  const properEntityEncoding = html => {
15
- const escapedGt = html.replace(/</g, "[");
16
- const escapedLt = escapedGt.replace(/>/g, "]");
17
- const properEntities = _he.default.encode(_he.default.decode(escapedLt), {
18
- decimal: true
15
+ const htmlDecoded = _he.default.decode(html, {
16
+ decimal: true,
17
+ allowUnsafeSymbols: true
19
18
  });
20
- const unescapedGt = properEntities.replace(/\[/g, "<");
21
- return unescapedGt.replace(/]/g, ">");
19
+ const htmlEncoded = _he.default.encode(htmlDecoded, {
20
+ decimal: true,
21
+ allowUnsafeSymbols: true
22
+ });
23
+ return htmlEncoded;
22
24
  };
23
25
 
24
26
  /**
@@ -12,16 +12,17 @@ type removeUnwantedHtmlOptions = {
12
12
  * When path is only one deep better use optional chaining
13
13
  */
14
14
  const properEntityEncoding = (html: string) => {
15
- const escapedGt = html.replace(/</g, "[");
16
- const escapedLt = escapedGt.replace(/>/g, "]");
17
-
18
- const properEntities = he.encode(he.decode(escapedLt), {
15
+ const htmlDecoded = he.decode(html, {
19
16
  decimal: true,
17
+ allowUnsafeSymbols: true,
20
18
  });
21
19
 
22
- const unescapedGt = properEntities.replace(/\[/g, "<");
20
+ const htmlEncoded = he.encode(htmlDecoded, {
21
+ decimal: true,
22
+ allowUnsafeSymbols: true,
23
+ });
23
24
 
24
- return unescapedGt.replace(/]/g, ">");
25
+ return htmlEncoded;
25
26
  };
26
27
 
27
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeHtml.js","names":["_he","_interopRequireDefault","require","_exceptions","properEntityEncoding","html","escapedGt","replace","escapedLt","properEntities","he","encode","decode","decimal","unescapedGt","removeUnwantedHtml","options","arguments","length","undefined","allowedTags","IllegalArgumentException","correctEntityHtml","htmlWithoutAttributes","htmlWithCorrectBR","Array","isArray","join","pattern","regex","RegExp","exports"],"sources":["../../../src/utils/helpers/sanitizeHtml.js"],"sourcesContent":["// @flow\nimport he from \"he\";\n\nimport { IllegalArgumentException } from \"../../exceptions\";\n\ntype removeUnwantedHtmlOptions = {\n allowedTags?: Array<string>,\n};\n\n/**\n * Translates html entities to their correct decimal equivalent\n * When path is only one deep better use optional chaining\n */\nconst properEntityEncoding = (html: string) => {\n const escapedGt = html.replace(/</g, \"[\");\n const escapedLt = escapedGt.replace(/>/g, \"]\");\n\n const properEntities = he.encode(he.decode(escapedLt), {\n decimal: true,\n });\n\n const unescapedGt = properEntities.replace(/\\[/g, \"<\");\n\n return unescapedGt.replace(/]/g, \">\");\n};\n\n/**\n * removes unwanted html, this might result in incorrect html, as it removes all html that we don't except,\n * like <b style=\"font-weight: 400\">bold</b> will result in bold</b>\n */\nconst removeUnwantedHtml = (\n html: string,\n options: removeUnwantedHtmlOptions = {\n allowedTags: [\"p\", \"br\", \"b\", \"i\", \"u\", \"strike\"],\n },\n): string => {\n if (typeof html !== \"string\") {\n throw new IllegalArgumentException(\"sanitizeHTML method expects a string\");\n }\n\n const correctEntityHtml = properEntityEncoding(html);\n\n // remove attributes from html elements\n const htmlWithoutAttributes = correctEntityHtml.replace(\n /<(\\w+)(.|[\\r\\n])*?>/gi,\n \"<$1>\",\n );\n\n const htmlWithCorrectBR = htmlWithoutAttributes.replace(\n /<br\\s*>/gi,\n \"<br />\",\n );\n\n // remove not allowed tags\n const allowedTags = Array.isArray(options.allowedTags)\n ? options.allowedTags.join(\"|\")\n : \"\";\n const pattern = `<(?!\\\\/?(${allowedTags})(>|\\\\s\\\\/))[^<]+?>`;\n const regex = new RegExp(pattern, \"gi\");\n\n return htmlWithCorrectBR.replace(regex, \"\");\n};\n\nexport { removeUnwantedHtml };\n"],"mappings":";;;;;;;AACA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAD,OAAA;AAMA;AACA;AACA;AACA;AACA,MAAME,oBAAoB,GAAIC,IAAY,IAAK;EAC7C,MAAMC,SAAS,GAAGD,IAAI,CAACE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;EACzC,MAAMC,SAAS,GAAGF,SAAS,CAACC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;EAE9C,MAAME,cAAc,GAAGC,WAAE,CAACC,MAAM,CAACD,WAAE,CAACE,MAAM,CAACJ,SAAS,CAAC,EAAE;IACrDK,OAAO,EAAE;EACX,CAAC,CAAC;EAEF,MAAMC,WAAW,GAAGL,cAAc,CAACF,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAEtD,OAAOO,WAAW,CAACP,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AACvC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAMQ,kBAAkB,GAAG,SAAAA,CACzBV,IAAY,EAID;EAAA,IAHXW,OAAkC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IACnCG,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ;EAClD,CAAC;EAED,IAAI,OAAOf,IAAI,KAAK,QAAQ,EAAE;IAC5B,MAAM,IAAIgB,oCAAwB,CAAC,sCAAsC,CAAC;EAC5E;EAEA,MAAMC,iBAAiB,GAAGlB,oBAAoB,CAACC,IAAI,CAAC;;EAEpD;EACA,MAAMkB,qBAAqB,GAAGD,iBAAiB,CAACf,OAAO,CACrD,uBAAuB,EACvB,MACF,CAAC;EAED,MAAMiB,iBAAiB,GAAGD,qBAAqB,CAAChB,OAAO,CACrD,WAAW,EACX,QACF,CAAC;;EAED;EACA,MAAMa,WAAW,GAAGK,KAAK,CAACC,OAAO,CAACV,OAAO,CAACI,WAAW,CAAC,GAClDJ,OAAO,CAACI,WAAW,CAACO,IAAI,CAAC,GAAG,CAAC,GAC7B,EAAE;EACN,MAAMC,OAAO,GAAI,YAAWR,WAAY,qBAAoB;EAC5D,MAAMS,KAAK,GAAG,IAAIC,MAAM,CAACF,OAAO,EAAE,IAAI,CAAC;EAEvC,OAAOJ,iBAAiB,CAACjB,OAAO,CAACsB,KAAK,EAAE,EAAE,CAAC;AAC7C,CAAC;AAACE,OAAA,CAAAhB,kBAAA,GAAAA,kBAAA"}
1
+ {"version":3,"file":"sanitizeHtml.js","names":["_he","_interopRequireDefault","require","_exceptions","properEntityEncoding","html","htmlDecoded","he","decode","decimal","allowUnsafeSymbols","htmlEncoded","encode","removeUnwantedHtml","options","arguments","length","undefined","allowedTags","IllegalArgumentException","correctEntityHtml","htmlWithoutAttributes","replace","htmlWithCorrectBR","Array","isArray","join","pattern","regex","RegExp","exports"],"sources":["../../../src/utils/helpers/sanitizeHtml.js"],"sourcesContent":["// @flow\nimport he from \"he\";\n\nimport { IllegalArgumentException } from \"../../exceptions\";\n\ntype removeUnwantedHtmlOptions = {\n allowedTags?: Array<string>,\n};\n\n/**\n * Translates html entities to their correct decimal equivalent\n * When path is only one deep better use optional chaining\n */\nconst properEntityEncoding = (html: string) => {\n const htmlDecoded = he.decode(html, {\n decimal: true,\n allowUnsafeSymbols: true,\n });\n\n const htmlEncoded = he.encode(htmlDecoded, {\n decimal: true,\n allowUnsafeSymbols: true,\n });\n\n return htmlEncoded;\n};\n\n/**\n * removes unwanted html, this might result in incorrect html, as it removes all html that we don't except,\n * like <b style=\"font-weight: 400\">bold</b> will result in bold</b>\n */\nconst removeUnwantedHtml = (\n html: string,\n options: removeUnwantedHtmlOptions = {\n allowedTags: [\"p\", \"br\", \"b\", \"i\", \"u\", \"strike\"],\n },\n): string => {\n if (typeof html !== \"string\") {\n throw new IllegalArgumentException(\"sanitizeHTML method expects a string\");\n }\n\n const correctEntityHtml = properEntityEncoding(html);\n\n // remove attributes from html elements\n const htmlWithoutAttributes = correctEntityHtml.replace(\n /<(\\w+)(.|[\\r\\n])*?>/gi,\n \"<$1>\",\n );\n\n const htmlWithCorrectBR = htmlWithoutAttributes.replace(\n /<br\\s*>/gi,\n \"<br />\",\n );\n\n // remove not allowed tags\n const allowedTags = Array.isArray(options.allowedTags)\n ? options.allowedTags.join(\"|\")\n : \"\";\n const pattern = `<(?!\\\\/?(${allowedTags})(>|\\\\s\\\\/))[^<]+?>`;\n const regex = new RegExp(pattern, \"gi\");\n\n return htmlWithCorrectBR.replace(regex, \"\");\n};\n\nexport { removeUnwantedHtml };\n"],"mappings":";;;;;;;AACA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAD,OAAA;AAMA;AACA;AACA;AACA;AACA,MAAME,oBAAoB,GAAIC,IAAY,IAAK;EAC7C,MAAMC,WAAW,GAAGC,WAAE,CAACC,MAAM,CAACH,IAAI,EAAE;IAClCI,OAAO,EAAE,IAAI;IACbC,kBAAkB,EAAE;EACtB,CAAC,CAAC;EAEF,MAAMC,WAAW,GAAGJ,WAAE,CAACK,MAAM,CAACN,WAAW,EAAE;IACzCG,OAAO,EAAE,IAAI;IACbC,kBAAkB,EAAE;EACtB,CAAC,CAAC;EAEF,OAAOC,WAAW;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAME,kBAAkB,GAAG,SAAAA,CACzBR,IAAY,EAID;EAAA,IAHXS,OAAkC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IACnCG,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ;EAClD,CAAC;EAED,IAAI,OAAOb,IAAI,KAAK,QAAQ,EAAE;IAC5B,MAAM,IAAIc,oCAAwB,CAAC,sCAAsC,CAAC;EAC5E;EAEA,MAAMC,iBAAiB,GAAGhB,oBAAoB,CAACC,IAAI,CAAC;;EAEpD;EACA,MAAMgB,qBAAqB,GAAGD,iBAAiB,CAACE,OAAO,CACrD,uBAAuB,EACvB,MACF,CAAC;EAED,MAAMC,iBAAiB,GAAGF,qBAAqB,CAACC,OAAO,CACrD,WAAW,EACX,QACF,CAAC;;EAED;EACA,MAAMJ,WAAW,GAAGM,KAAK,CAACC,OAAO,CAACX,OAAO,CAACI,WAAW,CAAC,GAClDJ,OAAO,CAACI,WAAW,CAACQ,IAAI,CAAC,GAAG,CAAC,GAC7B,EAAE;EACN,MAAMC,OAAO,GAAI,YAAWT,WAAY,qBAAoB;EAC5D,MAAMU,KAAK,GAAG,IAAIC,MAAM,CAACF,OAAO,EAAE,IAAI,CAAC;EAEvC,OAAOJ,iBAAiB,CAACD,OAAO,CAACM,KAAK,EAAE,EAAE,CAAC;AAC7C,CAAC;AAACE,OAAA,CAAAjB,kBAAA,GAAAA,kBAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beinformed/ui",
3
- "version": "1.33.0-beta.0",
3
+ "version": "1.33.0-beta.3",
4
4
  "description": "Toolbox for be informed javascript layouts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "bugs": "http://support.beinformed.com",
@@ -231,8 +231,7 @@ export default class StringAttributeModel extends AttributeModel {
231
231
  return this.formatBSN(val);
232
232
  }
233
233
 
234
- // adds nbsp to values with multiple spaces
235
- return val.replace(/ {2}/gi, " \u00A0");
234
+ return val;
236
235
  })
237
236
  .join(",");
238
237
  }
@@ -287,7 +286,9 @@ export default class StringAttributeModel extends AttributeModel {
287
286
  */
288
287
  get readonlyvalue(): string {
289
288
  if (typeof this.value === "string") {
290
- 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");
291
292
  }
292
293
 
293
294
  return this.value == null ? "" : this.value;
@@ -12,7 +12,7 @@ describe("sanitizeHTML", () => {
12
12
 
13
13
  expect(
14
14
  removeUnwantedHtml(
15
- "<p>String with <b>allowed <i>html</i></b><br /> and <strong>NOT</strong> allowed html</p>",
15
+ "<p>String with <b>allowed <i>html</i></b><br /> and <blink>NOT</blink> allowed html</p>",
16
16
  ),
17
17
  ).toBe(
18
18
  "<p>String with <b>allowed <i>html</i></b><br /> and NOT allowed html</p>",
@@ -28,4 +28,38 @@ describe("sanitizeHTML", () => {
28
28
  ),
29
29
  ).toBe("<p>String <b>not allowed attribute</b> string</p>");
30
30
  });
31
+
32
+ it("Can convert html entities to numerical entities", () => {
33
+ expect(
34
+ removeUnwantedHtml("f&ouml;o &hearts; b&aring;r &#x1D306; baz"),
35
+ ).toBe("f&#246;o &#9829; b&#229;r &#119558; baz");
36
+ });
37
+
38
+ it("Can encode special charcaters to numerical characters", () => {
39
+ expect(removeUnwantedHtml("<p>foo © bar ≠ baz 𝌆 qux bla</p>")).toBe(
40
+ "<p>foo &#169; bar &#8800; baz &#119558; qux bla</p>",
41
+ );
42
+
43
+ expect(
44
+ removeUnwantedHtml(
45
+ "<p>foo &#169; bar &#8800; baz &#119558; qux &#160; bla</p>",
46
+ ),
47
+ ).toBe("<p>foo &#169; bar &#8800; baz &#119558; qux &#160; bla</p>");
48
+ });
49
+
50
+ it("Keeps brackets", () => {
51
+ expect(
52
+ removeUnwantedHtml(
53
+ "The list of children [ Peter, Steven, Susan ] is up to date.",
54
+ ),
55
+ ).toBe("The list of children [ Peter, Steven, Susan ] is up to date.");
56
+ });
57
+
58
+ it("Keeps curly brackets", () => {
59
+ expect(
60
+ removeUnwantedHtml(
61
+ "The list of children { Peter, Steven, Susan } is up to date.",
62
+ ),
63
+ ).toBe("The list of children { Peter, Steven, Susan } is up to date.");
64
+ });
31
65
  });
@@ -12,16 +12,17 @@ type removeUnwantedHtmlOptions = {
12
12
  * When path is only one deep better use optional chaining
13
13
  */
14
14
  const properEntityEncoding = (html: string) => {
15
- const escapedGt = html.replace(/</g, "[");
16
- const escapedLt = escapedGt.replace(/>/g, "]");
17
-
18
- const properEntities = he.encode(he.decode(escapedLt), {
15
+ const htmlDecoded = he.decode(html, {
19
16
  decimal: true,
17
+ allowUnsafeSymbols: true,
20
18
  });
21
19
 
22
- const unescapedGt = properEntities.replace(/\[/g, "<");
20
+ const htmlEncoded = he.encode(htmlDecoded, {
21
+ decimal: true,
22
+ allowUnsafeSymbols: true,
23
+ });
23
24
 
24
- return unescapedGt.replace(/]/g, ">");
25
+ return htmlEncoded;
25
26
  };
26
27
 
27
28
  /**