From 7e8e5b8b22f2bf2221508020bb0c22341ba04bd9 Mon Sep 17 00:00:00 2001 From: Christopher Cortes Date: Sun, 23 Aug 2020 11:15:02 +0200 Subject: [PATCH] feat(showcase): add the ngx-form-errors demo to the showcase ISSUES CLOSED: #1195 --- showcase/package-lock.json | 730 ++++++++++-------- showcase/package.json | 11 +- showcase/src/app/app-menu.config.ts | 7 + showcase/src/app/welcome/pages/index.ts | 1 + .../components/card/card.component.html | 3 + .../components/card/card.component.scss | 5 + .../components/card/card.component.ts | 44 ++ .../components/card/card.theme.scss | 20 + .../components/card/index.ts | 1 + .../reactive-form-errors/components/index.ts | 2 + .../components/translated-form-error/index.ts | 1 + .../translated-form-error.component.html | 1 + .../translated-form-error.component.ts | 47 ++ .../pages/reactive-form-errors/index.ts | 1 + .../password-validator.ts | 31 + .../reactive-form-errors-page.component.html | 230 ++++++ .../reactive-form-errors-page.component.scss | 68 ++ ...tive-form-errors-page.component.theme.scss | 19 + .../reactive-form-errors-page.component.ts | 74 ++ showcase/src/app/welcome/routes.ts | 17 +- showcase/src/app/welcome/welcome.module.ts | 56 +- .../reactive-form-errors.html | 139 ++++ .../reactive-form-errors.scss | 68 ++ .../reactive-form-errors.ts | 66 ++ showcase/src/assets/translations/en.json | 43 ++ showcase/src/assets/translations/fr.json | 43 ++ showcase/src/assets/translations/nl.json | 43 ++ showcase/src/styles/_theme.scss | 2 + 28 files changed, 1450 insertions(+), 323 deletions(-) create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.html create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.scss create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.theme.scss create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/card/index.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/index.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/index.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.html create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/index.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/password-validator.ts create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.html create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.scss create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.theme.scss create mode 100644 showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.ts create mode 100644 showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.html create mode 100644 showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.scss create mode 100644 showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.ts diff --git a/showcase/package-lock.json b/showcase/package-lock.json index 860e360129..3a9d85a301 100644 --- a/showcase/package-lock.json +++ b/showcase/package-lock.json @@ -522,9 +522,9 @@ } }, "@babel/compat-data": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.5.tgz", - "integrity": "sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", "dev": true, "requires": { "browserslist": "^4.12.0", @@ -533,19 +533,19 @@ } }, "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz", + "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/generator": "^7.11.4", + "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", + "@babel/parser": "^7.11.4", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -580,12 +580,12 @@ } }, "@babel/generator": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "dev": true, "requires": { - "@babel/types": "^7.10.5", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -673,12 +673,11 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", "dev": true, "requires": { - "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, @@ -712,12 +711,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", - "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "dev": true, "requires": { - "@babel/types": "^7.10.5" + "@babel/types": "^7.11.0" } }, "@babel/helper-module-imports": { @@ -730,17 +729,17 @@ } }, "@babel/helper-module-transforms": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", - "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@babel/helper-replace-supers": "^7.10.4", "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", "@babel/template": "^7.10.4", - "@babel/types": "^7.10.5", + "@babel/types": "^7.11.0", "lodash": "^4.17.19" } }, @@ -769,15 +768,14 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, @@ -803,13 +801,22 @@ "@babel/types": "^7.10.4" } }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -861,9 +868,9 @@ } }, "@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -897,6 +904,16 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", @@ -907,6 +924,16 @@ "@babel/plugin-syntax-json-strings": "^7.8.0" } }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", @@ -928,9 +955,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -949,12 +976,13 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", - "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, @@ -1005,6 +1033,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1014,6 +1051,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", @@ -1098,9 +1144,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz", - "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1334,12 +1380,13 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", - "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" } }, "@babel/plugin-transform-sticky-regex": { @@ -1391,30 +1438,34 @@ } }, "@babel/preset-env": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", - "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", + "@babel/compat-data": "^7.11.0", "@babel/helper-compilation-targets": "^7.10.4", "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-proposal-async-generator-functions": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", "@babel/plugin-proposal-private-methods": "^7.10.4", "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", @@ -1447,14 +1498,14 @@ "@babel/plugin-transform-regenerator": "^7.10.4", "@babel/plugin-transform-reserved-words": "^7.10.4", "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", "@babel/plugin-transform-sticky-regex": "^7.10.4", "@babel/plugin-transform-template-literals": "^7.10.4", "@babel/plugin-transform-typeof-symbol": "^7.10.4", "@babel/plugin-transform-unicode-escapes": "^7.10.4", "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.4", + "@babel/types": "^7.11.0", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -1476,9 +1527,9 @@ } }, "@babel/runtime": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", - "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1496,17 +1547,17 @@ } }, "@babel/traverse": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", + "@babel/generator": "^7.11.0", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" @@ -1536,9 +1587,9 @@ } }, "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1619,9 +1670,9 @@ } }, "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", - "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -1786,9 +1837,24 @@ "resolved": "https://registry.npmjs.org/@nationalbankbelgium/code-style/-/code-style-1.2.0.tgz", "integrity": "sha512-UEDvF59Um5Llm9U/x67zDRpYwzeFxKwVUdhB3ycYRTzRqzvQwEinwwadXDxzMxOMsOqksmtY6jrJMhUZOG17FA==" }, + "@nationalbankbelgium/ngx-form-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nationalbankbelgium/ngx-form-errors/-/ngx-form-errors-1.0.0.tgz", + "integrity": "sha512-14eiHMfRlr6fQk/D6Azb59EDMWR/4qHHPApfKih/U9MmTScRCWNzpN54A8jRbMYQX0MvxCHOhMkk31jM3y095g==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, "@nationalbankbelgium/stark-build": { - "version": "file:../dist/packages-dist/stark-build/nationalbankbelgium-stark-build-10.0.0-e7b2cbb9.tgz", - "integrity": "sha512-uTKUysyC9Av0y6uiFWLFGJw5J4QILlUCgk7wOYjQgrkGNil+FWtxGfnQ962D+znSpfGnTqyQnMTaikQvdWNHRA==", + "version": "file:../dist/packages-dist/stark-build/nationalbankbelgium-stark-build-10.1.0-3442e87b.tgz", + "integrity": "sha512-xEpDW9zSZRAaYtz3knETMoME/lCozc+7uPEA6bJdjTeGGAKDw01vK58pYlmnrIhiO3r2bIULkNxLPMR1sop9+g==", "dev": true, "requires": { "@angular-builders/custom-webpack": "^7.3.1", @@ -1817,8 +1883,8 @@ } }, "@nationalbankbelgium/stark-core": { - "version": "file:../dist/packages-dist/stark-core/nationalbankbelgium-stark-core-10.0.0-e7b2cbb9.tgz", - "integrity": "sha512-C2FRW9E+CX7tNy5G/7iyVHnj6WcI+H//f6mS4z+xNx0wIKH0ffARc1bZZ2j0lnJZEwikot2OWMvrRS1Sn0pcng==", + "version": "file:../dist/packages-dist/stark-core/nationalbankbelgium-stark-core-10.1.0-3442e87b.tgz", + "integrity": "sha512-cmCPZm8tsXjYAXGXNMk5VfZ6RbOHZPiWWc4KhNIBnKft2p38KnPNRdh7vDR2k/kKQ3qZtKSUTMOL5DkHWl1SPg==", "requires": { "@angularclass/hmr": "^2.1.3", "@ng-idle/core": "^6.0.0-beta.3", @@ -1848,8 +1914,8 @@ } }, "@nationalbankbelgium/stark-rbac": { - "version": "file:../dist/packages-dist/stark-rbac/nationalbankbelgium-stark-rbac-10.0.0-e7b2cbb9.tgz", - "integrity": "sha512-ZjRQ1TkmT1p8Og6OXiSNQCJwWW5rFGHB9+GA4RB+RRja+I7xEl8Q2aldnI4yrylhpepmhTwkmhqvLBmdPcKA2g==", + "version": "file:../dist/packages-dist/stark-rbac/nationalbankbelgium-stark-rbac-10.1.0-3442e87b.tgz", + "integrity": "sha512-fEih6jrJvloZ5lGusAHt1V/JAnJQzyf0/3t7QOFCviUHzA+UM7evHldLzvJSA9ELksvZ4C7F3NyrKD/zlMlZeg==", "requires": { "@types/lodash-es": "^4.17.1", "tslib": "^1.9.0" @@ -1863,8 +1929,8 @@ } }, "@nationalbankbelgium/stark-testing": { - "version": "file:../dist/packages-dist/stark-testing/nationalbankbelgium-stark-testing-10.0.0-e7b2cbb9.tgz", - "integrity": "sha512-1Vn4mcCqoofZVrNFhxvNqk8JY55NFRUn5wxboc9a5gEEYFBmBRczQObVlwkCKf1jEo+SBlpfIEPBXCogMS7eiw==", + "version": "file:../dist/packages-dist/stark-testing/nationalbankbelgium-stark-testing-10.1.0-3442e87b.tgz", + "integrity": "sha512-gdnyIZ91JKUAe2cU+C4VpnRZEtat3V1hkpc6YVYggtePXvkc8mTscFPgj+YVa6A+JTC3iw4tf5Aa067fD99ARg==", "dev": true, "requires": { "@types/jasmine": "~3.5.0", @@ -1887,8 +1953,8 @@ } }, "@nationalbankbelgium/stark-ui": { - "version": "file:../dist/packages-dist/stark-ui/nationalbankbelgium-stark-ui-10.0.0-e7b2cbb9.tgz", - "integrity": "sha512-mab4odkqp01HMYSdnFCxA0WUlhl7n155oVabWBSQE4rPg6F/OjwmAoEuiwEDi5Q1B+N1tBppBJudpdET9FjzVQ==", + "version": "file:../dist/packages-dist/stark-ui/nationalbankbelgium-stark-ui-10.1.0-3442e87b.tgz", + "integrity": "sha512-PI2rSjZBgydVm+2JXVY/eczlETWnCj1EDPKbko0zmWQGUQHcnFE9nvUZRkD8H4EWcSfVSE/+OGirINJHrGqeTQ==", "requires": { "@angular/material-moment-adapter": "^7.0.0", "@mdi/angular-material": "^4.0.96", @@ -2095,9 +2161,9 @@ "dev": true }, "@types/jasmine": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.11.tgz", - "integrity": "sha512-fg1rOd/DehQTIJTifGqGVY6q92lDgnLfs7C6t1ccSwQrMyoTGSoH6wWzhJDZb6ezhsdwAX4EIBLe8w5fXWmEng==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.13.tgz", + "integrity": "sha512-bVSrTEWdCNH2RHN+E0QlEr4pGPMRA6puKOmL/X13ZeZmUS0q12ZR1rkB9PVvJSX0zi/OXrMDNvUai+PC380+rQ==", "dev": true }, "@types/json-schema": { @@ -2107,9 +2173,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.158", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.158.tgz", - "integrity": "sha512-InCEXJNTv/59yO4VSfuvNrZHt7eeNtWQEgnieIA+mIC+MOWM9arOWG2eQ8Vhk6NbOre6/BidiXhkZYeDY9U35w==" + "version": "4.14.159", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.159.tgz", + "integrity": "sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg==" }, "@types/lodash-es": { "version": "4.17.3", @@ -2515,9 +2581,9 @@ } }, "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, "acorn-dynamic-import": { @@ -2589,9 +2655,9 @@ "dev": true }, "ajv-keywords": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz", - "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, "amdefine": { @@ -2835,14 +2901,15 @@ } }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { @@ -3029,9 +3096,9 @@ "dev": true }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, "axobject-query": { @@ -3185,9 +3252,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3677,9 +3744,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", "dev": true }, "body-parser": { @@ -3923,16 +3990,16 @@ } }, "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", + "elliptic": "^6.5.3", "inherits": "^2.0.4", "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", @@ -3976,15 +4043,15 @@ } }, "browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", - "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" } }, "browserstack": { @@ -4243,9 +4310,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001105", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz", - "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==", + "version": "1.0.30001117", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", + "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==", "dev": true }, "canonical-path": { @@ -4939,13 +5006,13 @@ } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { @@ -5611,9 +5678,9 @@ "dev": true }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexer2": { @@ -5712,9 +5779,9 @@ } }, "electron-to-chromium": { - "version": "1.3.506", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.506.tgz", - "integrity": "sha512-k0PHtv4gD6KJu1k6lp8pvQOe12uZriOwS2x66Vnxkq0NOBucsNrItOj/ehomvcZ3S4K1ueqUCv+fsLhXBs6Zyw==", + "version": "1.3.543", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.543.tgz", + "integrity": "sha512-PFbVI7G3e2fXSCFa+tgYAlyWNnUJZo4JtpJHYJ/DuB32opR6lzNJoH2LuR392Zr+nmw9jK5LZd+kvdcJDoj/fA==", "dev": true }, "eligrey-classlist-js-polyfill": { @@ -6151,9 +6218,9 @@ } }, "event-source-polyfill": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.15.tgz", - "integrity": "sha512-IVmd8jWwX6ag5rXIdVCPBjBChiHBceLb1/7aKPIK7CUeJ5Br7alx029+ZpQlK4jW4Hk2qncy3ClJP97S8ltvmg==" + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.17.tgz", + "integrity": "sha512-eLZQQpKZahOH5sFaqfrbLNXJKz+JawiDQVrl6lZmQHHSamIn5PlNV3HXAY9+ZRaQC5YTIBRDd8jeTxjuEveJnQ==" }, "event-stream": { "version": "3.3.4", @@ -6171,9 +6238,9 @@ } }, "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.5.tgz", + "integrity": "sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g==" }, "events": { "version": "3.2.0", @@ -6329,9 +6396,9 @@ }, "dependencies": { "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", "dev": true } } @@ -6462,9 +6529,9 @@ } }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -6735,9 +6802,9 @@ } }, "follow-redirects": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", - "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" }, "fontkit": { "version": "1.8.1", @@ -7258,9 +7325,9 @@ } }, "google-libphonenumber": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.10.tgz", - "integrity": "sha512-TsckE9O8QgqaIeaOXPjcJa4/kX3BzFdO1oCbMfmUpRZckml4xJhjJVxaT9Mdt/VrZZkT9lX44eHAEWfJK1tHtw==" + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.12.tgz", + "integrity": "sha512-vuDYnYNlCDQpIo5j7QDJTz2FNVAAuJZtbQ/khZgT6UBuRJV5GVQIQbOAdjTgu2uH4OFVChKAHQl8a2rgMnezOQ==" }, "graceful-fs": { "version": "4.2.4", @@ -7324,13 +7391,33 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } } }, "hard-rejection": { @@ -8223,9 +8310,9 @@ "dev": true }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true }, "is-extendable": { @@ -8341,9 +8428,9 @@ } }, "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { "has-symbols": "^1.0.1" @@ -8669,9 +8756,9 @@ "dev": true }, "js-base64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz", - "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true, "optional": true }, @@ -8708,6 +8795,12 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, + "json-parse-even-better-errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", + "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -8846,9 +8939,9 @@ } }, "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", - "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -9036,25 +9129,25 @@ } }, "karma-sourcemap-loader": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", - "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz", + "integrity": "sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g==", "dev": true, "requires": { "graceful-fs": "^4.1.2" } }, "karma-typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.0.3.tgz", - "integrity": "sha512-Irs767Oc5BCMPLbZ+VdJmIxLL+1fB3L9dye8oQHDfHXFuYBx+uir5FDLzNNXFgDRUMYxEFT1T1eucAcb56v+0A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.1.0.tgz", + "integrity": "sha512-Olm9FwrxN5Dq3Bq+QGhcYT3ei4jR834dKO1WeSfy9DcyPGHmsrZA6+xIyxUFoDonwZyWQyhRZiN64xgzQQAXEg==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-walk": "^7.0.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.2.0", "assert": "^2.0.0", "async": "^3.0.1", - "browser-resolve": "^1.11.3", + "browser-resolve": "^2.0.0", "browserify-zlib": "^0.2.0", "buffer": "^5.4.3", "combine-source-map": "^0.8.0", @@ -9063,8 +9156,8 @@ "convert-source-map": "^1.7.0", "crypto-browserify": "^3.12.0", "diff": "^4.0.1", - "domain-browser": "^4.0.0", - "events": "^3.0.0", + "domain-browser": "^4.16.0", + "events": "^3.2.0", "glob": "^7.1.6", "https-browserify": "^1.0.0", "istanbul-lib-coverage": "^3.0.0", @@ -9073,8 +9166,8 @@ "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.0", "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "log4js": "^6.1.0", + "lodash": "^4.17.19", + "log4js": "^6.3.0", "minimatch": "^3.0.4", "os-browserify": "^0.3.0", "pad": "^3.2.0", @@ -9084,11 +9177,11 @@ "querystring-es3": "^0.2.1", "readable-stream": "^3.1.1", "source-map": "^0.7.3", - "stream-browserify": "^2.0.2", + "stream-browserify": "^3.0.0", "stream-http": "^3.1.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.11", - "tmp": "^0.1.0", + "tmp": "^0.2.1", "tty-browserify": "^0.0.1", "url": "^0.11.0", "util": "^0.12.1", @@ -9119,6 +9212,15 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, "buffer": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", @@ -9145,9 +9247,9 @@ } }, "domain-browser": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.15.0.tgz", - "integrity": "sha512-jg1GWiXhBZI+8Qn9jAcaNhY9yIlOX52TpZYCsQR6XyXBKU1GU3EfDTwVUdwgscdVx6/eTSmi84yw7wCDZrIhHg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.17.0.tgz", + "integrity": "sha512-Hj9LbFLqt4MBK/rq24/Bk3nhcPlaKfTCFs8XENVqNQray7WtKbo/GYMGDAVW62O83lgRjxvD5UCmtQsN9B/YxA==", "dev": true }, "istanbul-lib-coverage": { @@ -9204,12 +9306,31 @@ "util-deprecate": "^1.0.1" } }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, "stream-http": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", @@ -9259,12 +9380,12 @@ } }, "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "rimraf": "^2.6.3" + "rimraf": "^3.0.0" } }, "tty-browserify": { @@ -9290,13 +9411,13 @@ } }, "karma-typescript-angular2-transform": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/karma-typescript-angular2-transform/-/karma-typescript-angular2-transform-5.0.3.tgz", - "integrity": "sha512-sVKnn6QRuMy5NpvLnNcCWatveuqv95z0Onid/zLOrgKu2Lfl727dsO1py8jNialx5BzV6OqUNrNBtOFfuEKfUw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-typescript-angular2-transform/-/karma-typescript-angular2-transform-5.1.0.tgz", + "integrity": "sha512-lVhXybKfBOFECdpkBY+83mVDom4w+M/+79Rw5E9HuWADW9rL+/pdnfm2zdz9kPJaIQK+RCkJDMQX6kgT520b4g==", "dev": true, "requires": { - "acorn": "^7.1.1", - "log4js": "^6.1.2", + "acorn": "^7.4.0", + "log4js": "^6.3.0", "magic-string": "^0.25.7" }, "dependencies": { @@ -9356,15 +9477,15 @@ } }, "karma-typescript-es6-transform": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/karma-typescript-es6-transform/-/karma-typescript-es6-transform-5.0.3.tgz", - "integrity": "sha512-eKufH2S7wqxVqWzZnMqqdtIieRv3NvrCHt8sFe+c+mZtGFmCkYffhWVXlXE4ezAUXkOa0e6vot/oVHTM2dd6Tw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-typescript-es6-transform/-/karma-typescript-es6-transform-5.1.0.tgz", + "integrity": "sha512-ReniuuReJ6J+ul4ewndMjB3CKOET1a+b8ta7XI4yvGLFjyo2wLJZ+eM/cWrQqnO7aKenLchYJ1B71XM5pF1a8g==", "dev": true, "requires": { - "@babel/core": "^7.9.0", - "@babel/preset-env": "^7.9.0", - "acorn-walk": "^7.1.1", - "log4js": "^6.1.2", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "acorn-walk": "^7.2.0", + "log4js": "^6.3.0", "magic-string": "^0.25.7" }, "dependencies": { @@ -9666,9 +9787,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash-es": { "version": "4.17.15", @@ -9848,9 +9969,9 @@ } }, "lunr": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.8.tgz", - "integrity": "sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==", + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, "macos-release": { @@ -10704,9 +10825,9 @@ "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" }, "nouislider": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-14.6.0.tgz", - "integrity": "sha512-KY0jH2pU4G/55wpoS5Ynyrc5xpOMZ10/Xr51sMYG/JxmYoPJGy3fG8mOMio0MJXerKp5Go3elwcODk3lX6mFMQ==" + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-14.6.1.tgz", + "integrity": "sha512-S6KvYTqhGVJQfLhbyTFATzRGNzGdDZMkWdi0To8ouAtHbgXaDHLzZZlPD8o7yb7cMiZ8+PTojEXYDc8ysLwXXQ==" }, "npm-bundled": { "version": "1.1.1", @@ -11245,14 +11366,13 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -11410,15 +11530,16 @@ } }, "pdfmake": { - "version": "0.1.66", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.66.tgz", - "integrity": "sha512-NFR1hn5d4NDPOGFY2/jCt6eRLO2x2BFtr/vdl321DjlPYX9DxGwDAgCnNfTfh96lhewHDuAD8YU4X2l0kjnB2Q==", + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.68.tgz", + "integrity": "sha512-oE1VEjkluro3+QqvLbFgFU/rRgyKdbPy/Fh8SS/nsUxnsiUcm85ChpmD6YD0hQW1E0d3hppAo4Yh+xdXucenIA==", "dev": true, "requires": { - "iconv-lite": "^0.6.0", + "iconv-lite": "^0.6.2", "linebreak": "^1.0.2", "pdfkit": "^0.11.0", - "svg-to-pdfkit": "^0.1.8" + "svg-to-pdfkit": "^0.1.8", + "xmldoc": "^1.1.2" } }, "pend": { @@ -11482,13 +11603,13 @@ "dev": true }, "portfinder": { - "version": "1.0.27", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.27.tgz", - "integrity": "sha512-bJ3U3MThKnyJ9Dx1Idtm5pQmxXqw08+XOHhi/Lie8OF1OlhVaBFhsntAIhkZYjfDcCzszSr0w1yCbccThhzgxQ==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "mkdirp": "^0.5.5" }, "dependencies": { "debug": { @@ -12533,9 +12654,9 @@ "dev": true }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "quick-lru": { @@ -13165,6 +13286,13 @@ "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "requires": { "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "safe-buffer": { @@ -13370,9 +13498,9 @@ } }, "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "schema-utils": { @@ -14657,21 +14785,15 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, "autoprefixer": { - "version": "9.8.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.5.tgz", - "integrity": "sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001097", - "colorette": "^1.2.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.32", @@ -14687,12 +14809,6 @@ "fill-range": "^7.0.1" } }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, "camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -14702,14 +14818,6 @@ "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } } }, "chalk": { @@ -14921,18 +15029,16 @@ "dev": true }, "meow": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", - "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.0.tgz", + "integrity": "sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog==", "dev": true, "requires": { "@types/minimist": "^1.2.0", - "arrify": "^2.0.1", - "camelcase": "^6.0.0", "camelcase-keys": "^6.2.2", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", + "minimist-options": "4.1.0", "normalize-package-data": "^2.5.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", @@ -14967,14 +15073,14 @@ } }, "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -15159,14 +15265,6 @@ "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } } } } @@ -15189,9 +15287,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15296,6 +15394,12 @@ "path-is-absolute": "^1.0.0" } }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, "source-map": { "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", @@ -15368,9 +15472,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15851,7 +15955,8 @@ "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true }, "tslint": { "version": "5.20.1", @@ -15991,9 +16096,9 @@ "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==" }, "uglify-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", - "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz", + "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==", "dev": true }, "ultron": { @@ -16113,9 +16218,9 @@ } }, "unified": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz", - "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", "dev": true, "requires": { "bail": "^1.0.0", @@ -16468,9 +16573,9 @@ } }, "vfile": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.1.tgz", - "integrity": "sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz", + "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -16489,9 +16594,9 @@ } }, "vfile-location": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", - "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz", + "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==", "dev": true }, "vfile-message": { @@ -16523,12 +16628,12 @@ "dev": true }, "watchpack": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", - "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "dev": true, "requires": { - "chokidar": "^3.4.0", + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", "watchpack-chokidar2": "^2.0.0" @@ -16563,9 +16668,9 @@ } }, "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", - "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "optional": true, "requires": { @@ -17127,9 +17232,9 @@ } }, "windows-release": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.1.tgz", - "integrity": "sha512-Pngk/RDCaI/DkuHPlGTdIkDiTAnAkyMjoQMZqRsxydNl1qGXNIoZrB7RK8g53F2tEgQBMqQJHQdYZuQEEAu54A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", "dev": true, "requires": { "execa": "^1.0.0" @@ -17246,14 +17351,6 @@ "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } } }, "xmlbuilder": { @@ -17262,6 +17359,15 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "dev": true, + "requires": { + "sax": "^1.2.1" + } + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", diff --git a/showcase/package.json b/showcase/package.json index 000897dc73..234dd7c01b 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -120,9 +120,10 @@ "@angular/platform-server": "~7.2.2", "@angular/router": "~7.2.2", "@nationalbankbelgium/code-style": "^1.2.0", - "@nationalbankbelgium/stark-core": "file:../dist/packages-dist/stark-core/nationalbankbelgium-stark-core-10.0.0-e7b2cbb9.tgz", - "@nationalbankbelgium/stark-rbac": "file:../dist/packages-dist/stark-rbac/nationalbankbelgium-stark-rbac-10.0.0-e7b2cbb9.tgz", - "@nationalbankbelgium/stark-ui": "file:../dist/packages-dist/stark-ui/nationalbankbelgium-stark-ui-10.0.0-e7b2cbb9.tgz", + "@nationalbankbelgium/ngx-form-errors": "^1.0.0", + "@nationalbankbelgium/stark-core": "file:../dist/packages-dist/stark-core/nationalbankbelgium-stark-core-10.1.0-3442e87b.tgz", + "@nationalbankbelgium/stark-rbac": "file:../dist/packages-dist/stark-rbac/nationalbankbelgium-stark-rbac-10.1.0-3442e87b.tgz", + "@nationalbankbelgium/stark-ui": "file:../dist/packages-dist/stark-ui/nationalbankbelgium-stark-ui-10.1.0-3442e87b.tgz", "@uirouter/visualizer": "~7.0.0", "angular-in-memory-web-api": "~0.8.0", "basscss": "~8.1.0", @@ -139,8 +140,8 @@ }, "devDependencies": { "@compodoc/compodoc": "~1.1.11", - "@nationalbankbelgium/stark-build": "file:../dist/packages-dist/stark-build/nationalbankbelgium-stark-build-10.0.0-e7b2cbb9.tgz", - "@nationalbankbelgium/stark-testing": "file:../dist/packages-dist/stark-testing/nationalbankbelgium-stark-testing-10.0.0-e7b2cbb9.tgz", + "@nationalbankbelgium/stark-build": "file:../dist/packages-dist/stark-build/nationalbankbelgium-stark-build-10.1.0-3442e87b.tgz", + "@nationalbankbelgium/stark-testing": "file:../dist/packages-dist/stark-testing/nationalbankbelgium-stark-testing-10.1.0-3442e87b.tgz", "@types/core-js": "~2.5.3", "@types/hammerjs": "~2.0.36", "@types/node": "~10.17.27", diff --git a/showcase/src/app/app-menu.config.ts b/showcase/src/app/app-menu.config.ts index d827e2ec4c..0506d70ee6 100644 --- a/showcase/src/app/app-menu.config.ts +++ b/showcase/src/app/app-menu.config.ts @@ -26,6 +26,13 @@ export const APP_MENU_CONFIG: StarkMenuConfig = { isVisible: true, isEnabled: true, targetState: "news" + }, + { + id: "reactive-form-errors", + label: "SHOWCASE.NGX_FORM_ERRORS.TITLE", + isVisible: true, + isEnabled: true, + targetState: "reactive-form-errors" } ] }, diff --git a/showcase/src/app/welcome/pages/index.ts b/showcase/src/app/welcome/pages/index.ts index 92141ec039..5d600592cf 100644 --- a/showcase/src/app/welcome/pages/index.ts +++ b/showcase/src/app/welcome/pages/index.ts @@ -2,3 +2,4 @@ export * from "./getting-started"; export * from "./home"; export * from "./news"; export * from "./no-content"; +export * from "./reactive-form-errors"; diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.html b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.html new file mode 100644 index 0000000000..42620e9a7a --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.html @@ -0,0 +1,3 @@ + + + diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.scss b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.scss new file mode 100644 index 0000000000..e61ec8f140 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.scss @@ -0,0 +1,5 @@ +:host mat-card { + box-sizing: border-box; + width: 100%; + min-height: 100%; +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.ts b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.ts new file mode 100644 index 0000000000..526670067e --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.component.ts @@ -0,0 +1,44 @@ +import { Component, HostBinding, Input } from "@angular/core"; + +type Colors = "primary" | "accent" | "warning" | "success"; + +@Component({ + selector: "app-card", + templateUrl: "./card.component.html", + styleUrls: ["./card.component.scss"] +}) +export class CardComponent { + @HostBinding("class.app-color-primary") + public primaryColor!: boolean; + @HostBinding("class.app-color-accent") + public accentColor!: boolean; + @HostBinding("class.app-color-warning") + public warningColor!: boolean; + @HostBinding("class.app-color-success") + public successColor!: boolean; + + @Input() + public set color(color: Colors) { + this.primaryColor = false; + this.accentColor = false; + this.warningColor = false; + this.successColor = false; + + switch (color) { + case "primary": + this.primaryColor = true; + break; + case "accent": + this.accentColor = true; + break; + case "warning": + this.warningColor = true; + break; + case "success": + this.successColor = true; + break; + default: + break; + } + } +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.theme.scss b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.theme.scss new file mode 100644 index 0000000000..d914a9cd91 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/card.theme.scss @@ -0,0 +1,20 @@ +app-card.app-color-primary mat-card { + background-color: mat-color($primary-palette, 500); + color: mat-contrast($primary-palette, 500); +} + +app-card.app-color-accent mat-card { + background-color: mat-color($primary-palette, 500); + color: mat-contrast($primary-palette, 500); +} + +app-card.app-color-warning mat-card { + background-color: mat-color($warning-palette, 500); + color: mat-contrast($warning-palette, 500); +} + +app-card.app-color-success mat-card { + /*Themes do not have a success map by default*/ + background-color: mat-color($success-palette, 500); + color: mat-contrast($success-palette, 500); +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/card/index.ts b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/index.ts new file mode 100644 index 0000000000..8151bac4c8 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/card/index.ts @@ -0,0 +1 @@ +export * from "./card.component"; diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/index.ts b/showcase/src/app/welcome/pages/reactive-form-errors/components/index.ts new file mode 100644 index 0000000000..a81d5c6e8a --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/index.ts @@ -0,0 +1,2 @@ +export * from "./card"; +export * from "./translated-form-error"; diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/index.ts b/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/index.ts new file mode 100644 index 0000000000..4fad8db434 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/index.ts @@ -0,0 +1 @@ +export * from "./translated-form-error.component"; diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.html b/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.html new file mode 100644 index 0000000000..22e7aaf61f --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.html @@ -0,0 +1 @@ +
{{ error.message | translate: error.params }}
diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.ts b/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.ts new file mode 100644 index 0000000000..c441df4199 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/components/translated-form-error/translated-form-error.component.ts @@ -0,0 +1,47 @@ +import { Component, HostBinding, OnInit } from "@angular/core"; +import { LangChangeEvent, TranslateService } from "@ngx-translate/core"; +import { Observable } from "rxjs"; +import { NgxFormErrorComponent, NgxFormFieldError } from "@nationalbankbelgium/ngx-form-errors"; + +@Component({ + selector: "app-translated-form-error", + templateUrl: "./translated-form-error.component.html" +}) +export class TranslatedFormErrorComponent implements NgxFormErrorComponent, OnInit { + @HostBinding("class") + public cssClass = "translated-form-error"; + + public errors: NgxFormFieldError[] = []; + public errors$!: Observable; + public fieldName!: string; + + public constructor(public translateService: TranslateService) {} + + public ngOnInit(): void { + this.translateService.onLangChange.subscribe((_ev: LangChangeEvent) => { + this.updateTranslateFieldName(this.translateService.instant(this.fieldName)); + }); + } + + public subscribeToErrors(): void { + this.errors$.subscribe((errors: NgxFormFieldError[]) => { + this.errors = errors; + + if (errors.length) { + // the formField can be retrieved from the "fieldName" param of any of the errors + this.fieldName = errors[0].params.fieldName; + this.updateTranslateFieldName(this.translateService.instant(this.fieldName)); + } + }); + } + + public updateTranslateFieldName(translatedFieldName: string): void { + for (const error of this.errors) { + error.params = { ...error.params, fieldName: translatedFieldName }; + } + } + + public trackError(index: number): number { + return index; + } +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/index.ts b/showcase/src/app/welcome/pages/reactive-form-errors/index.ts new file mode 100644 index 0000000000..e2c99e3f05 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/index.ts @@ -0,0 +1 @@ +export * from "./reactive-form-errors-page.component"; diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/password-validator.ts b/showcase/src/app/welcome/pages/reactive-form-errors/password-validator.ts new file mode 100644 index 0000000000..a87ca4f312 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/password-validator.ts @@ -0,0 +1,31 @@ +import { FormControl, FormGroup, ValidationErrors, ValidatorFn } from "@angular/forms"; + +export class PasswordValidator { + // Inspired on: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview + public static areEqual(formGroup: FormGroup): ValidationErrors | null { + let value: string | undefined; + let valid = true; + + for (const key in formGroup.controls) { + if (formGroup.controls.hasOwnProperty(key)) { + const control: FormControl = formGroup.controls[key]; + + if (value === undefined) { + value = control.value; + } else if (value !== control.value) { + valid = false; + break; + } + } + } + + /* tslint:disable-next-line:no-null-keyword */ + return valid ? null : { areEqual: true }; + } +} + +export function getConfirmPasswordValidator(formGroup: FormGroup): ValidatorFn { + return (): ValidationErrors | null => { + return PasswordValidator.areEqual(formGroup); + }; +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.html b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.html new file mode 100644 index 0000000000..dfc04fc54b --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.html @@ -0,0 +1,230 @@ +
+

+ SHOWCASE.NGX_FORM_ERRORS.TITLE +

+

SHOWCASE.DEMO.SHARED.EXAMPLE_VIEWER_LIST

+
+ +
+
+ + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+ + SHOWCASE.NGX_FORM_ERRORS.FIELDS.USER_NAME + +
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.HAS_ERRORS" + | translate: { hasErrors: usernameField.hasErrors } + }} +
+
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.HAS_SPECIFIC_ERROR" + | translate: { error: "required", hasError: usernameField.hasError("required") } + }} +
+
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.IS_TOUCHED" + | translate: { isTouched: usernameField.hasState("touched") } + }} +
+
+ {{ "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.ERROR" | translate: { error: "required" } }} +
{{ usernameField.getError("required") | json }}
+
+
+ {{ "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.ERRORS" | translate }} +
{{ usernameField.errors | json }}
+
+
+
+ + + SHOWCASE.NGX_FORM_ERRORS.FIELDS.PASSWORD + +
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.HAS_ERRORS" + | translate: { hasErrors: passwordField.hasErrors } + }} +
+
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.HAS_SPECIFIC_ERROR" + | translate: { error: "pattern", hasError: passwordField.hasError("pattern") } + }} +
+
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.IS_TOUCHED" + | translate: { isTouched: passwordField.hasState("touched") } + }} +
+
+ {{ "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.ERROR" | translate: { error: "pattern" } }} +
{{ passwordField.getError("pattern") | json }}
+
+
+ {{ "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.ERRORS" | translate }} +
{{ passwordField.errors | json }}
+
+
+
+ + + SHOWCASE.NGX_FORM_ERRORS.FIELDS.CONFIRM_PASSWORD + +
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.HAS_ERRORS" + | translate: { hasErrors: confirmPasswordField.hasErrors } + }} +
+
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.HAS_SPECIFIC_ERROR" + | translate: { error: "required", hasError: confirmPasswordField.hasError("required") } + }} +
+
+ {{ + "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.IS_TOUCHED" + | translate: { isTouched: confirmPasswordField.hasState("touched") } + }} +
+
+ {{ "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.ERROR" | translate: { error: "required" } }} +
{{ confirmPasswordField.getError("required") | json }}
+
+
+ {{ "SHOWCASE.NGX_FORM_ERRORS.FIELDS.INFO.ERRORS" | translate }} +
{{ confirmPasswordField.errors | json }}
+
+
+
+
+ + + + No validation errors + + +
+ + + + + + + + + + + +
+
+
+
+
+
+ +
diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.scss b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.scss new file mode 100644 index 0000000000..f2c59487b0 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.scss @@ -0,0 +1,68 @@ +@import "~@nationalbankbelgium/stark-ui/assets/styles/media-queries"; + +button { + margin: 8px; +} + +.form-card { + mat-form-field { + box-sizing: border-box; + width: 100%; + @media #{$desktop-screen-query} { + width: 45%; + &:last-child { + margin-left: 10%; + } + } + } + + mat-card-actions { + display: flex; + align-items: flex-start; + flex-wrap: wrap; + margin: -10px; + + button { + margin: 10px; + @media #{$mobile-only-query} { + width: 100%; + } + } + } +} + +.form-field-info { + @media #{$desktop-query} { + max-width: 33%; + } + + max-width: 100%; + + mat-card-content { + margin: 0; + padding: 5px 0; + + pre { + overflow: auto; + box-sizing: border-box; + display: block; + max-height: 200px; + + margin: inherit; + padding: 15px 5px; + border-radius: 4px; + + background-color: rgba(0, 0, 0, 0.2); + + word-break: break-all; + white-space: pre-wrap; + + /* Non standard for webkit */ + + hyphens: auto; + &:empty { + display: none; + } + } + } +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.theme.scss b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.theme.scss new file mode 100644 index 0000000000..08ca4d0623 --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.theme.scss @@ -0,0 +1,19 @@ +app-card mat-form-field.maximum-height { + .mat-form-field-wrapper { + padding-bottom: 40px; + + .mat-form-field-underline { + bottom: 40px; + } + + .mat-form-field-subscript-wrapper { + top: calc(100% - 40px); + } + } +} + +.validation-summary { + .translated-form-error div::before { + content: "• "; + } +} diff --git a/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.ts b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.ts new file mode 100644 index 0000000000..89b1b64c6b --- /dev/null +++ b/showcase/src/app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.ts @@ -0,0 +1,74 @@ +import { Component, Inject } from "@angular/core"; +import { AbstractControl, FormBuilder, FormGroup, Validators } from "@angular/forms"; +import { STARK_LOGGING_SERVICE, StarkLoggingService } from "@nationalbankbelgium/stark-core"; +import { getConfirmPasswordValidator } from "./password-validator"; +import { ReferenceLink } from "../../../shared/components/reference-block"; + +@Component({ + selector: "reactive-forms", + templateUrl: "./reactive-form-errors-page.component.html", + styleUrls: ["./reactive-form-errors-page.component.scss"] +}) +export class ReactiveFormErrorsPageComponent { + public collapsed: boolean[] = [false, false, true]; + + public referenceList: ReferenceLink[] = [ + { + label: "NGX Form errors library", + url: "https://github.com/NationalBankBelgium/ngx-form-errors" + } + ]; + + public formGroup: FormGroup; + public passwordPattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]+$"; + public showValidationDetails = false; + public showValidationSummary = true; + + public constructor(private formBuilder: FormBuilder, @Inject(STARK_LOGGING_SERVICE) public logger: StarkLoggingService) { + this.formGroup = this.formBuilder.group({ + username: [undefined, Validators.required], + matchingPasswords: this.formBuilder.group({ + password: [ + "", + Validators.compose([ + Validators.minLength(3), + Validators.maxLength(10), + Validators.required, + // this is for the letters (both uppercase and lowercase) and numbers validation + Validators.pattern(this.passwordPattern) + ]) + ], + confirmPassword: [""] // validators for this field to be set afterwards (see below) + }) + }); + + // setting the validator for confirmPassword field once we have created the form group + const confirmPasswordControl = this.formGroup.get("matchingPasswords.confirmPassword"); + // we need to set the confirmPasswordValidator passing the "matchingPasswords" form group so that the errors of the form group are actually + // linked to the "confirmPassword" control because the NgxFormErrors directive is linked to the control and not to the form group! + confirmPasswordControl.setValidators([ + Validators.required, + getConfirmPasswordValidator(this.formGroup.get("matchingPasswords")) + ]); + } + + public getErrorClass(formControlName: string): string { + const formCtrl = this.formGroup.get(formControlName) as AbstractControl; + return formCtrl.errors && Object.keys(formCtrl.errors).length > 1 ? "maximum-height" : "small-height"; + } + + public toggleCollapsible(nb: number): void { + this.collapsed[nb] = !this.collapsed[nb]; + } + public toggleValidationDetails(): void { + this.showValidationDetails = !this.showValidationDetails; + } + + public toggleValidationSummary(): void { + this.showValidationSummary = !this.showValidationSummary; + } + + public onSubmitUserDetails(formGroup: FormGroup): void { + this.logger.info("Submitted form:", formGroup.value); + } +} diff --git a/showcase/src/app/welcome/routes.ts b/showcase/src/app/welcome/routes.ts index 6ea7383b2a..a27c90de0b 100644 --- a/showcase/src/app/welcome/routes.ts +++ b/showcase/src/app/welcome/routes.ts @@ -1,5 +1,11 @@ import { Ng2StateDeclaration } from "@uirouter/angular"; -import { GettingStartedPageComponent, HomePageComponent, NewsPageComponent, NoContentPageComponent } from "./pages"; +import { + GettingStartedPageComponent, + HomePageComponent, + NewsPageComponent, + NoContentPageComponent, + ReactiveFormErrorsPageComponent +} from "./pages"; export const NEWS_STATES: Ng2StateDeclaration[] = [ { @@ -29,6 +35,15 @@ export const NEWS_STATES: Ng2StateDeclaration[] = [ views: { "@": { component: NewsPageComponent } }, parent: "app" }, + { + name: "reactive-form-errors", + url: "^/reactive-form-errors", // use ^ to avoid double slash "//" in the URL after the domain (https://github.com/angular-ui/ui-router/wiki/URL-Routing#absolute-routes-) + data: { + translationKey: "SHOWCASE.NGX_FORM_ERRORS.TITLE" + }, + views: { "@": { component: ReactiveFormErrorsPageComponent } }, + parent: "app" + }, { name: "otherwise", url: "^/otherwise", // use ^ to avoid double slash "//" in the URL after the domain (https://github.com/angular-ui/ui-router/wiki/URL-Routing#absolute-routes-) diff --git a/showcase/src/app/welcome/welcome.module.ts b/showcase/src/app/welcome/welcome.module.ts index b7774496ec..de097e1b0b 100644 --- a/showcase/src/app/welcome/welcome.module.ts +++ b/showcase/src/app/welcome/welcome.module.ts @@ -1,18 +1,64 @@ import { NgModule } from "@angular/core"; import { UIRouterModule } from "@uirouter/angular"; +import { MatDividerModule } from "@angular/material/divider"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatInputModule } from "@angular/material/input"; +import { NgxFormErrorsModule, NgxFormErrorsMessageService } from "@nationalbankbelgium/ngx-form-errors"; +import { SharedModule } from "../shared"; import { GettingStartedPageComponent, HomePageComponent, NewsPageComponent, NoContentPageComponent } from "./pages"; import { NewsItemComponent } from "./components"; -import { SharedModule } from "../shared"; import { NEWS_STATES } from "./routes"; +import { ReactiveFormErrorsPageComponent } from "./pages/reactive-form-errors"; +import { TranslatedFormErrorComponent } from "./pages/reactive-form-errors/components/translated-form-error"; +import { CardComponent } from "./pages/reactive-form-errors/components/card"; @NgModule({ imports: [ UIRouterModule.forChild({ states: NEWS_STATES }), - SharedModule + SharedModule, + MatDividerModule, + MatInputModule, + MatFormFieldModule, + NgxFormErrorsModule.forRoot({ formErrorComponent: TranslatedFormErrorComponent }) + ], + declarations: [ + GettingStartedPageComponent, + HomePageComponent, + NoContentPageComponent, + NewsPageComponent, + NewsItemComponent, + ReactiveFormErrorsPageComponent, + TranslatedFormErrorComponent, + CardComponent ], - declarations: [GettingStartedPageComponent, HomePageComponent, NoContentPageComponent, NewsPageComponent, NewsItemComponent], - exports: [GettingStartedPageComponent, HomePageComponent, NoContentPageComponent, NewsPageComponent, NewsItemComponent] + exports: [ + GettingStartedPageComponent, + HomePageComponent, + NoContentPageComponent, + NewsPageComponent, + NewsItemComponent, + ReactiveFormErrorsPageComponent + ], + entryComponents: [TranslatedFormErrorComponent] }) -export class WelcomeModule {} +export class WelcomeModule { + /* tslint:disable:no-hardcoded-credentials */ + public constructor(private errorMessageService: NgxFormErrorsMessageService) { + this.errorMessageService.addErrorMessages({ + required: "SHOWCASE.NGX_FORM_ERRORS.FORM.VALIDATION.REQUIRED", + "matchingPasswords.password.required": "SHOWCASE.NGX_FORM_ERRORS.FORM.VALIDATION.PASSWORD_REQUIRED", + minlength: "SHOWCASE.NGX_FORM_ERRORS.FORM.VALIDATION.PASSWORD.MIN_LENGTH", + maxlength: "SHOWCASE.NGX_FORM_ERRORS.FORM.VALIDATION.PASSWORD.MAX_LENGTH", + pattern: "SHOWCASE.NGX_FORM_ERRORS.FORM.VALIDATION.PASSWORD.PATTERN", + areEqual: "SHOWCASE.NGX_FORM_ERRORS.FORM.VALIDATION.CONFIRM_PASSWORD.ARE_EQUAL" + }); + + this.errorMessageService.addFieldNames({ + username: "SHOWCASE.NGX_FORM_ERRORS.FIELDS.ALIAS.USER_NAME", + "matchingPasswords.password": "not used, the alias defined via the directive takes precedence over this", + "matchingPasswords.confirmPassword": "SHOWCASE.NGX_FORM_ERRORS.FIELDS.ALIAS.CONFIRM_PASSWORD" + }); + } +} diff --git a/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.html b/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.html new file mode 100644 index 0000000000..29ac3de932 --- /dev/null +++ b/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.html @@ -0,0 +1,139 @@ +
+
+ + + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+ + User Name + +
Has errors: {{ usernameField.hasErrors }}
+
Has 'required' error: {{ usernameField.hasError("required") }}
+
Is touched: {{ usernameField.hasState("touched") }}
+
+ 'required' error: +
{{ usernameField.getError("required") | json }}
+
+
+ Errors: +
{{ usernameField.errors | json }}
+
+
+
+ + + Password + +
Has errors: {{ passwordField.hasErrors }}
+
Has 'pattern' error: {{ passwordField.hasError("pattern") }}
+
Is touched: {{ passwordField.hasState("touched") }}
+
+ 'pattern' error: +
{{ passwordField.getError("pattern") | json }}
+
+
+ Errors: +
{{ passwordField.errors | json }}
+
+
+
+ + + Confirm password + +
Has errors: {{ confirmPasswordField.hasErrors }}
+
Has 'required' error: {{ confirmPasswordField.hasError("required") }}
+
Is touched: {{ confirmPasswordField.hasState("touched") }}
+
+ 'required' error: +
{{ confirmPasswordField.getError("required") | json }}
+
+
+ Errors: +
{{ confirmPasswordField.errors | json }}
+
+
+
+
+ + + + No validation errors + + +
+ + + + + + + + + + + +
+
+
+
diff --git a/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.scss b/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.scss new file mode 100644 index 0000000000..f2c59487b0 --- /dev/null +++ b/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.scss @@ -0,0 +1,68 @@ +@import "~@nationalbankbelgium/stark-ui/assets/styles/media-queries"; + +button { + margin: 8px; +} + +.form-card { + mat-form-field { + box-sizing: border-box; + width: 100%; + @media #{$desktop-screen-query} { + width: 45%; + &:last-child { + margin-left: 10%; + } + } + } + + mat-card-actions { + display: flex; + align-items: flex-start; + flex-wrap: wrap; + margin: -10px; + + button { + margin: 10px; + @media #{$mobile-only-query} { + width: 100%; + } + } + } +} + +.form-field-info { + @media #{$desktop-query} { + max-width: 33%; + } + + max-width: 100%; + + mat-card-content { + margin: 0; + padding: 5px 0; + + pre { + overflow: auto; + box-sizing: border-box; + display: block; + max-height: 200px; + + margin: inherit; + padding: 15px 5px; + border-radius: 4px; + + background-color: rgba(0, 0, 0, 0.2); + + word-break: break-all; + white-space: pre-wrap; + + /* Non standard for webkit */ + + hyphens: auto; + &:empty { + display: none; + } + } + } +} diff --git a/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.ts b/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.ts new file mode 100644 index 0000000000..a89fabed04 --- /dev/null +++ b/showcase/src/assets/examples/reactive-form-errors/reactive-form-errors.ts @@ -0,0 +1,66 @@ +import { Component, Inject } from "@angular/core"; +import { AbstractControl, FormBuilder, FormGroup, Validators } from "@angular/forms"; +import { STARK_LOGGING_SERVICE, StarkLoggingService } from "@nationalbankbelgium/stark-core"; +import { getConfirmPasswordValidator } from "./password-validator"; + +@Component({ + selector: "reactive-form-errors", + templateUrl: "./reactive-form-errors.html", + styleUrls: ["./reactive-form-errors.scss"] +}) +export class ReactiveFormErrors { + public collapsed: boolean[] = [false, false, true]; + + public formGroup: FormGroup; + public passwordPattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]+$"; + public showValidationDetails = false; + public showValidationSummary = true; + + public constructor(private formBuilder: FormBuilder, @Inject(STARK_LOGGING_SERVICE) public logger: StarkLoggingService) { + this.formGroup = this.formBuilder.group({ + username: [undefined, Validators.required], + matchingPasswords: this.formBuilder.group({ + password: [ + "", + Validators.compose([ + Validators.minLength(3), + Validators.maxLength(10), + Validators.required, + // this is for the letters (both uppercase and lowercase) and numbers validation + Validators.pattern(this.passwordPattern) + ]) + ], + confirmPassword: [""] // validators for this field to be set afterwards (see below) + }) + }); + + // setting the validator for confirmPassword field once we have created the form group + const confirmPasswordControl = this.formGroup.get("matchingPasswords.confirmPassword"); + // we need to set the confirmPasswordValidator passing the "matchingPasswords" form group so that the errors of the form group are actually + // linked to the "confirmPassword" control because the NgxFormErrors directive is linked to the control and not to the form group! + confirmPasswordControl.setValidators([ + Validators.required, + getConfirmPasswordValidator(this.formGroup.get("matchingPasswords")) + ]); + } + + public getErrorClass(formControlName: string): string { + const formCtrl = this.formGroup.get(formControlName) as AbstractControl; + return formCtrl.errors && Object.keys(formCtrl.errors).length > 1 ? "maximum-height" : "small-height"; + } + + public toggleCollapsible(nb: number): void { + this.collapsed[nb] = !this.collapsed[nb]; + } + public toggleValidationDetails(): void { + this.showValidationDetails = !this.showValidationDetails; + } + + public toggleValidationSummary(): void { + this.showValidationSummary = !this.showValidationSummary; + } + + public onSubmitUserDetails(formGroup: FormGroup): void { + this.logger.info("Submitted form:", formGroup.value); + } +} diff --git a/showcase/src/assets/translations/en.json b/showcase/src/assets/translations/en.json index f79504ad46..f5435d3132 100644 --- a/showcase/src/assets/translations/en.json +++ b/showcase/src/assets/translations/en.json @@ -432,6 +432,49 @@ "NEWS": { "TITLE": "News" }, + "NGX_FORM_ERRORS": { + "TITLE": "Reactive Forms errors", + "EXAMPLE": "Example", + "FORM": { + "VALIDATION": { + "REQUIRED": "{{fieldName}} is required", + "PASSWORD_REQUIRED": "{{fieldName}} must be provided", + "USER_NAME": { + "UNIQUE": "This username has already been taken" + }, + "PASSWORD": { + "MAX_LENGTH": "Password cannot be more than {{requiredLength}} characters long", + "MIN_LENGTH": "Password must be at least {{requiredLength}} characters long", + "PATTERN": "The password must contain at least one uppercase, one lowercase, and one number" + }, + "CONFIRM_PASSWORD": { + "ARE_EQUAL": "Password mismatch" + } + }, + "HIDE_DETAILS": "Hide validation details", + "SHOW_DETAILS": "Show validation details", + "HIDE_SUMMARY": "Hide validation summary", + "SHOW_SUMMARY": "Show validation summary", + "SUBMIT": "Submit" + }, + "FIELDS": { + "USER_NAME": "User Name", + "PASSWORD": "Password", + "CONFIRM_PASSWORD": "Confirm password", + "ALIAS": { + "USER_NAME": "Your username", + "PASSWORD_ALIAS": "A valid password", + "CONFIRM_PASSWORD": "Password confirmation" + }, + "INFO": { + "HAS_ERRORS": "Has errors: {{hasErrors}}", + "HAS_SPECIFIC_ERROR": "Has '{{error}}' error: {{hasError}}", + "ERROR": "'{{error}}' error:", + "ERRORS": "Errors:", + "IS_TOUCHED": "Is touched: {{isTouched}}" + } + } + }, "OTHERWISE": { "TITLE": "Otherwise" }, diff --git a/showcase/src/assets/translations/fr.json b/showcase/src/assets/translations/fr.json index 4e384d6688..0641ba36f6 100644 --- a/showcase/src/assets/translations/fr.json +++ b/showcase/src/assets/translations/fr.json @@ -432,6 +432,49 @@ "NEWS": { "TITLE": "Nouvelles" }, + "NGX_FORM_ERRORS": { + "TITLE": "Reactive Forms errors", + "EXAMPLE": "Exemple", + "FORM": { + "VALIDATION": { + "REQUIRED": "Le champ \"{{fieldName}}\" est requis", + "PASSWORD_REQUIRED": "Le champ \"{{fieldName}}\" est requis", + "USER_NAME": { + "UNIQUE": "Ce nom d'utilisateur est déjà pris" + }, + "PASSWORD": { + "MAX_LENGTH": "Le mot de passe ne peut pas contenir plus de {{requiredLength}} caractères", + "MIN_LENGTH": "Le mot de passe doit contenir au moins {{requiredLength}} caractères", + "PATTERN": "Le mot de passe doit contenir au moins une majuscule, une minuscule et un chiffre." + }, + "CONFIRM_PASSWORD": { + "ARE_EQUAL": "Les mots de passe ne correspondent pas" + } + }, + "HIDE_DETAILS": "Masquer les détails de validation", + "SHOW_DETAILS": "Afficher les détails de validation", + "HIDE_SUMMARY": "Masquer le résumé de validation", + "SHOW_SUMMARY": "Afficher le résumé de validation", + "SUBMIT": "Soumettre" + }, + "FIELDS": { + "USER_NAME": "Nom d'utilisateur", + "PASSWORD": "Mot de passe", + "CONFIRM_PASSWORD": "Confirmez le mot de passe", + "ALIAS": { + "USER_NAME": "Votre nom d'utilisateur", + "PASSWORD_ALIAS": "Un mot de passe valide", + "CONFIRM_PASSWORD": "Confirmation du mot de passe" + }, + "INFO": { + "HAS_ERRORS": "Contient des erreurs: {{hasErrors}}", + "HAS_SPECIFIC_ERROR": "Contient l'erreur '{{error}}': {{hasError}}", + "ERROR": "Erreur '{{error}}':", + "ERRORS": "Erreurs:", + "IS_TOUCHED": "Est touché: {{isTouched}}" + } + } + }, "OTHERWISE": { "TITLE": "Autre" }, diff --git a/showcase/src/assets/translations/nl.json b/showcase/src/assets/translations/nl.json index 5bcee9df46..4c62c7bd2f 100644 --- a/showcase/src/assets/translations/nl.json +++ b/showcase/src/assets/translations/nl.json @@ -432,6 +432,49 @@ "NEWS": { "TITLE": "Nieuws" }, + "NGX_FORM_ERRORS": { + "TITLE": "Reactive Forms errors", + "EXAMPLE": "Voorbeeld", + "FORM": { + "VALIDATION": { + "REQUIRED": "{{fieldName}} is verplicht", + "PASSWORD_REQUIRED": "{{fieldName}} moet worden gegeven", + "USER_NAME": { + "UNIQUE": "Dit gebruikersnaam is al in gebruik" + }, + "PASSWORD": { + "MAX_LENGTH": "Wachtwoord mag niet meer dan {{requiredLength}} tekens lang zijn", + "MIN_LENGTH": "Wachtwoord moet minimaal {{requiredLength}} tekens lang zijn", + "PATTERN": "Het wachtwoord moet minimaal één hoofdletter, één kleine letter en één cijfer bevatten" + }, + "CONFIRM_PASSWORD": { + "ARE_EQUAL": "Wachtwoord komt niet overeen" + } + }, + "HIDE_DETAILS": "Validatiedetails verbergen", + "SHOW_DETAILS": "Validatiedetails weergeven", + "HIDE_SUMMARY": "Validatieoverzicht verbergen", + "SHOW_SUMMARY": "Validatieoverzicht tonen", + "SUBMIT": "Indienen" + }, + "FIELDS": { + "USER_NAME": "Gebruikersnaam", + "PASSWORD": "Wachtwoord", + "CONFIRM_PASSWORD": "Bevestig wachtwoord", + "ALIAS": { + "USER_NAME": "Uw gebruikersnaam", + "PASSWORD_ALIAS": "Een geldig wachtwoord", + "CONFIRM_PASSWORD": "Wachtwoordbevestiging" + }, + "INFO": { + "HAS_ERRORS": "Veld heeft fouten: {{hasErrors}}", + "HAS_SPECIFIC_ERROR": "Veld heeft de '{{error}}' fout: {{hasError}}", + "ERROR": "'{{error}}' fout:", + "ERRORS": "Fouten:", + "IS_TOUCHED": "Veld is aangeraakt: {{isTouched}}" + } + } + }, "OTHERWISE": { "TITLE": "Andersom" }, diff --git a/showcase/src/styles/_theme.scss b/showcase/src/styles/_theme.scss index 34ac649730..a700eff430 100644 --- a/showcase/src/styles/_theme.scss +++ b/showcase/src/styles/_theme.scss @@ -16,3 +16,5 @@ Import the local variables file first to set the correct variables, see: @import "../app/demo-ui/pages/route-search/demo-route-search-page.component-theme"; @import "../app/demo-ui/components/table-regular/table-regular-theme"; @import "../app/styleguide/pages/layout/styleguide-layout-page.theme"; +@import "../app/welcome/pages/reactive-form-errors/components/card/card.theme"; +@import "../app/welcome/pages/reactive-form-errors/reactive-form-errors-page.component.theme";