@beinformed/ui 1.18.8 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [1.19.1](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.19.0...v1.19.1) (2022-06-16)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **confirm-password:** confirm constraint only in specific situations ([bf39462](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/bf394622b39c51145411bf4176d055d57488c412))
10
+
11
+ ## [1.19.0](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.18.9...v1.19.0) (2022-06-15)
12
+
13
+ ### Features
14
+
15
+ - **hooks:** add error notification hook ([dc8f71a](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/dc8f71a849418d4b3022b8ab96a5cfae018cea7d))
16
+
17
+ ### [1.18.9](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.18.8...v1.18.9) (2022-06-14)
18
+
19
+ ### Bug Fixes
20
+
21
+ - **confirm-password:** only validate confirm-password with value ([9190faa](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/9190faa31e50e5a018003e478bcdad2a06b011ef))
22
+
5
23
  ### [1.18.8](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.18.7...v1.18.8) (2022-06-13)
6
24
 
7
25
  ### Bug Fixes
@@ -1,5 +1,6 @@
1
1
  import { useSelector, useDispatch } from "react-redux";
2
- import { dismissNotification } from "../redux/actions";
2
+ import { dismissNotification, showNotification } from "../redux/actions";
3
+ import { NOTIFICATION_TYPES } from "../constants";
3
4
 
4
5
  /**
5
6
  */
@@ -24,4 +25,13 @@ export var useNotification = function useNotification() {
24
25
  }
25
26
  };
26
27
  };
28
+ /**
29
+ */
30
+
31
+ export var useErrorNotification = function useErrorNotification() {
32
+ var dispatch = useDispatch();
33
+ return function (message, error) {
34
+ return dispatch(showNotification(NOTIFICATION_TYPES.ERROR, message, error));
35
+ };
36
+ };
27
37
  //# sourceMappingURL=useNotification.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useNotification.js","names":["useSelector","useDispatch","dismissNotification","useNotification","dispatch","state","notification","render","messageType","message","error","dismiss"],"sources":["../../src/hooks/useNotification.js"],"sourcesContent":["// @flow\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { dismissNotification } from \"../redux/actions\";\n\nimport type {\n DismissNotificationAction,\n NotificationState,\n} from \"../redux/types\";\ntype NotificationHook = {\n ...NotificationState,\n dismiss: () => DismissNotificationAction,\n};\n\n/**\n */\nexport const useNotification = (): NotificationHook => {\n const dispatch = useDispatch();\n const { render, messageType, message, error } = useSelector(\n (state) => state.notification\n );\n\n return {\n render,\n messageType,\n message,\n error,\n dismiss: () => dispatch(dismissNotification()),\n };\n};\n"],"mappings":"AACA,SAASA,WAAT,EAAsBC,WAAtB,QAAyC,aAAzC;AACA,SAASC,mBAAT,QAAoC,kBAApC;;AAWA;AACA;AACA,OAAO,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,GAAwB;EACrD,IAAMC,QAAQ,GAAGH,WAAW,EAA5B;;EACA,mBAAgDD,WAAW,CACzD,UAACK,KAAD;IAAA,OAAWA,KAAK,CAACC,YAAjB;EAAA,CADyD,CAA3D;EAAA,IAAQC,MAAR,gBAAQA,MAAR;EAAA,IAAgBC,WAAhB,gBAAgBA,WAAhB;EAAA,IAA6BC,OAA7B,gBAA6BA,OAA7B;EAAA,IAAsCC,KAAtC,gBAAsCA,KAAtC;;EAIA,OAAO;IACLH,MAAM,EAANA,MADK;IAELC,WAAW,EAAXA,WAFK;IAGLC,OAAO,EAAPA,OAHK;IAILC,KAAK,EAALA,KAJK;IAKLC,OAAO,EAAE;MAAA,OAAMP,QAAQ,CAACF,mBAAmB,EAApB,CAAd;IAAA;EALJ,CAAP;AAOD,CAbM"}
1
+ {"version":3,"file":"useNotification.js","names":["useSelector","useDispatch","dismissNotification","showNotification","NOTIFICATION_TYPES","useNotification","dispatch","state","notification","render","messageType","message","error","dismiss","useErrorNotification","ERROR"],"sources":["../../src/hooks/useNotification.js"],"sourcesContent":["// @flow\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { dismissNotification, showNotification } from \"../redux/actions\";\n\nimport type {\n DismissNotificationAction,\n NotificationState,\n ShowNotificationAction,\n} from \"../redux/types\";\n\nimport { NOTIFICATION_TYPES } from \"../constants\";\n\nimport type { MessageObject } from \"../i18n\";\nimport type ErrorResponse from \"../models/error/ErrorResponse\";\ntype NotificationHook = {\n ...NotificationState,\n dismiss: () => DismissNotificationAction,\n};\ntype ErrorNotificationHook = (\n message: MessageObject,\n error?: ?ErrorResponse\n) => ShowNotificationAction;\n\n/**\n */\nexport const useNotification = (): NotificationHook => {\n const dispatch = useDispatch();\n const { render, messageType, message, error } = useSelector(\n (state) => state.notification\n );\n\n return {\n render,\n messageType,\n message,\n error,\n dismiss: () => dispatch(dismissNotification()),\n };\n};\n\n/**\n */\nexport const useErrorNotification = (): ErrorNotificationHook => {\n const dispatch = useDispatch();\n return (message: MessageObject, error?: ?ErrorResponse) => {\n return dispatch(showNotification(NOTIFICATION_TYPES.ERROR, message, error));\n };\n};\n"],"mappings":"AACA,SAASA,WAAT,EAAsBC,WAAtB,QAAyC,aAAzC;AACA,SAASC,mBAAT,EAA8BC,gBAA9B,QAAsD,kBAAtD;AAQA,SAASC,kBAAT,QAAmC,cAAnC;;AAaA;AACA;AACA,OAAO,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,GAAwB;EACrD,IAAMC,QAAQ,GAAGL,WAAW,EAA5B;;EACA,mBAAgDD,WAAW,CACzD,UAACO,KAAD;IAAA,OAAWA,KAAK,CAACC,YAAjB;EAAA,CADyD,CAA3D;EAAA,IAAQC,MAAR,gBAAQA,MAAR;EAAA,IAAgBC,WAAhB,gBAAgBA,WAAhB;EAAA,IAA6BC,OAA7B,gBAA6BA,OAA7B;EAAA,IAAsCC,KAAtC,gBAAsCA,KAAtC;;EAIA,OAAO;IACLH,MAAM,EAANA,MADK;IAELC,WAAW,EAAXA,WAFK;IAGLC,OAAO,EAAPA,OAHK;IAILC,KAAK,EAALA,KAJK;IAKLC,OAAO,EAAE;MAAA,OAAMP,QAAQ,CAACJ,mBAAmB,EAApB,CAAd;IAAA;EALJ,CAAP;AAOD,CAbM;AAeP;AACA;;AACA,OAAO,IAAMY,oBAAoB,GAAG,SAAvBA,oBAAuB,GAA6B;EAC/D,IAAMR,QAAQ,GAAGL,WAAW,EAA5B;EACA,OAAO,UAACU,OAAD,EAAyBC,KAAzB,EAAoD;IACzD,OAAON,QAAQ,CAACH,gBAAgB,CAACC,kBAAkB,CAACW,KAApB,EAA2BJ,OAA3B,EAAoCC,KAApC,CAAjB,CAAf;EACD,CAFD;AAGD,CALM"}
@@ -136,36 +136,56 @@ var PasswordAttributeModel = /*#__PURE__*/function (_StringAttributeModel) {
136
136
  }, {
137
137
  key: "addConstraints",
138
138
  value: function addConstraints() {
139
+ if (this.isConfirmPassword) {
140
+ return this.getConfirmPasswordConstraints();
141
+ }
142
+
143
+ return this.getStandardPasswordConstraints();
144
+ }
145
+ /**
146
+ * Constraints for a confirmation password
147
+ */
148
+
149
+ }, {
150
+ key: "getConfirmPasswordConstraints",
151
+ value: function getConfirmPasswordConstraints() {
139
152
  var constraints = new ConstraintCollection();
153
+ constraints.add(new PasswordConfirmConstraint(this.confirmValue, this.otherLabel));
154
+ return constraints;
155
+ }
156
+ /**
157
+ * Constrains for a standard password
158
+ */
140
159
 
141
- if (this.isConfirmPassword) {
160
+ }, {
161
+ key: "getStandardPasswordConstraints",
162
+ value: function getStandardPasswordConstraints() {
163
+ var constraints = new ConstraintCollection();
164
+
165
+ if (this.upperAndLowerCaseMandatory) {
166
+ constraints.add(new PasswordLowerAndUpperCaseConstraint());
167
+ }
168
+
169
+ if (this.maxSequenceOfIdenticalCharacters) {
170
+ constraints.add(new PasswordThreeConsecutiveCharactersNotAllowedConstraint(this.maxSequenceOfIdenticalCharacters));
171
+ }
172
+
173
+ if (this.minNumberOfNumericCharacters) {
174
+ constraints.add(new PasswordMinNumericCharactersConstraint(this.minNumberOfNumericCharacters));
175
+ }
176
+
177
+ if (this.minNumberOfSpecialCharacters) {
178
+ constraints.add(new PasswordMinSpecialCharactersConstraint(this.minNumberOfSpecialCharacters));
179
+ }
180
+
181
+ if (this.regexConstraints && this.regexConstraints.length > 0) {
182
+ this.regexConstraints.forEach(function (regexConstraint) {
183
+ constraints.add(new RegexConstraint(regexConstraint));
184
+ });
185
+ }
186
+
187
+ if (this.layouthint.has(CONFIRM_PASSWORD) && this.isConfirmPassword == null) {
142
188
  constraints.add(new PasswordConfirmConstraint(this.confirmValue, this.otherLabel));
143
- } else {
144
- if (this.upperAndLowerCaseMandatory) {
145
- constraints.add(new PasswordLowerAndUpperCaseConstraint());
146
- }
147
-
148
- if (this.maxSequenceOfIdenticalCharacters) {
149
- constraints.add(new PasswordThreeConsecutiveCharactersNotAllowedConstraint(this.maxSequenceOfIdenticalCharacters));
150
- }
151
-
152
- if (this.minNumberOfNumericCharacters) {
153
- constraints.add(new PasswordMinNumericCharactersConstraint(this.minNumberOfNumericCharacters));
154
- }
155
-
156
- if (this.minNumberOfSpecialCharacters) {
157
- constraints.add(new PasswordMinSpecialCharactersConstraint(this.minNumberOfSpecialCharacters));
158
- }
159
-
160
- if (this.regexConstraints && this.regexConstraints.length > 0) {
161
- this.regexConstraints.forEach(function (regexConstraint) {
162
- constraints.add(new RegexConstraint(regexConstraint));
163
- });
164
- }
165
-
166
- if (this.layouthint.has(CONFIRM_PASSWORD)) {
167
- constraints.add(new PasswordConfirmConstraint(this.confirmValue, this.otherLabel));
168
- }
169
189
  }
170
190
 
171
191
  return constraints;
@@ -178,9 +198,8 @@ var PasswordAttributeModel = /*#__PURE__*/function (_StringAttributeModel) {
178
198
  key: "constraintCollection",
179
199
  get: function get() {
180
200
  if (this.isConfirmPassword) {
181
- var constraints = new ConstraintCollection();
182
- constraints.add(this.addConstraints());
183
- return constraints;
201
+ // confirm password only needs local constraints, no server constraints
202
+ return this.getConfirmPasswordConstraints();
184
203
  }
185
204
 
186
205
  return _get(_getPrototypeOf(PasswordAttributeModel.prototype), "constraintCollection", this);
@@ -191,7 +210,7 @@ var PasswordAttributeModel = /*#__PURE__*/function (_StringAttributeModel) {
191
210
  }, {
192
211
  key: "isConfirmPassword",
193
212
  get: function get() {
194
- return this._isConfirmPassword || false;
213
+ return this._isConfirmPassword;
195
214
  }
196
215
  /**
197
216
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordAttributeModel.js","names":["StringAttributeModel","ConstraintCollection","PasswordLowerAndUpperCaseConstraint","PasswordThreeConsecutiveCharactersNotAllowedConstraint","PasswordMinNumericCharactersConstraint","PasswordMinSpecialCharactersConstraint","RegexConstraint","PasswordConfirmConstraint","CONFIRM_PASSWORD","PasswordAttributeModel","value","updateLastModification","inputvalue","getContribution","constraints","upperAndLowerCaseMandatory","maxSequenceOfIdenticalCharacters","maxSequenceOfUsernameCharacters","minNumberOfNumericCharacters","minNumberOfSpecialCharacters","regexConstraint","isConfirmPassword","add","confirmValue","otherLabel","regexConstraints","length","forEach","layouthint","has","addConstraints","_isConfirmPassword","_confirmValue","validate","_otherLabel","useClientsideValidation","isOptionalAndEmpty","_isValid","_validatedValue","constraintCollection","inError","name","contributions","type","Array","isArray"],"sources":["../../../src/models/attributes/PasswordAttributeModel.js"],"sourcesContent":["// @flow\nimport StringAttributeModel from \"./StringAttributeModel\";\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\n\nimport PasswordLowerAndUpperCaseConstraint from \"./input-constraints/PasswordLowerAndUpperCaseConstraint\";\nimport PasswordThreeConsecutiveCharactersNotAllowedConstraint from \"./input-constraints/PasswordThreeConsecutiveCharactersNotAllowedConstraint\";\nimport PasswordMinNumericCharactersConstraint from \"./input-constraints/PasswordMinNumericCharactersConstraint\";\nimport PasswordMinSpecialCharactersConstraint from \"./input-constraints/PasswordMinSpecialCharactersConstraint\";\nimport RegexConstraint from \"./input-constraints/RegexConstraint\";\nimport PasswordConfirmConstraint from \"./input-constraints/PasswordConfirmConstraint\";\n\nimport { CONFIRM_PASSWORD } from \"../../constants/LayoutHints\";\n\nimport type { RegexObject } from \"./input-constraints/RegexConstraint\";\n\n/**\n * Password attribute\n */\nexport default class PasswordAttributeModel extends StringAttributeModel {\n _confirmValue: string;\n _isConfirmPassword: boolean;\n _otherLabel: string;\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n const layouthint = contributions?.layouthint;\n return (\n contributions.type === \"password\" ||\n (Array.isArray(layouthint) && layouthint.includes(\"password\"))\n );\n }\n\n /**\n */\n get type(): string {\n return \"password\";\n }\n\n /**\n * Update the attribute by name and value\n */\n update(value: string): PasswordAttributeModel {\n this.updateLastModification();\n this.inputvalue = value;\n\n return this;\n }\n\n /**\n */\n get constraints(): Object {\n return this.getContribution(\"constraints\", {});\n }\n\n /**\n */\n get upperAndLowerCaseMandatory(): ?boolean {\n return this.constraints.upperAndLowerCaseMandatory;\n }\n\n /**\n */\n get maxSequenceOfIdenticalCharacters(): ?number {\n return this.constraints.maxSequenceOfIdenticalCharacters;\n }\n\n /**\n */\n get maxSequenceOfUsernameCharacters(): ?number {\n return this.constraints.maxSequenceOfUsernameCharacters;\n }\n\n /**\n */\n get minNumberOfNumericCharacters(): ?number {\n return this.constraints.minNumberOfNumericCharacters;\n }\n\n /**\n */\n get minNumberOfSpecialCharacters(): ?number {\n return this.constraints.minNumberOfSpecialCharacters;\n }\n\n /**\n */\n get regexConstraints(): ?Array<RegexObject> {\n return this.constraints.regexConstraint;\n }\n\n /**\n * Add password constraints\n */\n addConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n if (this.isConfirmPassword) {\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n } else {\n if (this.upperAndLowerCaseMandatory) {\n constraints.add(new PasswordLowerAndUpperCaseConstraint());\n }\n\n if (this.maxSequenceOfIdenticalCharacters) {\n constraints.add(\n new PasswordThreeConsecutiveCharactersNotAllowedConstraint(\n this.maxSequenceOfIdenticalCharacters\n )\n );\n }\n\n if (this.minNumberOfNumericCharacters) {\n constraints.add(\n new PasswordMinNumericCharactersConstraint(\n this.minNumberOfNumericCharacters\n )\n );\n }\n\n if (this.minNumberOfSpecialCharacters) {\n constraints.add(\n new PasswordMinSpecialCharactersConstraint(\n this.minNumberOfSpecialCharacters\n )\n );\n }\n\n if (this.regexConstraints && this.regexConstraints.length > 0) {\n this.regexConstraints.forEach((regexConstraint) => {\n constraints.add(new RegexConstraint(regexConstraint));\n });\n }\n\n if (this.layouthint.has(CONFIRM_PASSWORD)) {\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n }\n }\n\n return constraints;\n }\n\n /**\n * Retrieve applicable constraint for this attribute\n */\n get constraintCollection(): ConstraintCollection {\n if (this.isConfirmPassword) {\n const constraints = new ConstraintCollection();\n constraints.add(this.addConstraints());\n return constraints;\n }\n\n return super.constraintCollection;\n }\n\n /**\n */\n get isConfirmPassword(): boolean {\n return this._isConfirmPassword || false;\n }\n\n /**\n */\n set isConfirmPassword(isConfirmPassword: boolean) {\n this._isConfirmPassword = isConfirmPassword;\n }\n\n /**\n */\n get confirmValue(): string {\n return this._confirmValue || \"\";\n }\n\n /**\n */\n set confirmValue(confirmValue: string) {\n this._confirmValue = confirmValue;\n\n this.validate(this.inputvalue);\n }\n\n /**\n */\n get otherLabel(): string {\n return this._otherLabel;\n }\n\n /**\n */\n set otherLabel(otherLabel: string) {\n this._otherLabel = otherLabel;\n }\n\n /**\n * Validate input\n */\n validate(value: string): boolean {\n // when client side validation is disabled, this attribute is always valid\n if (!this.useClientsideValidation()) {\n return true;\n }\n\n if (this.isOptionalAndEmpty(value)) {\n this._isValid = true;\n } else if (this._validatedValue !== `${this.confirmValue}-${value}`) {\n this._isValid = this.constraintCollection.validate(value);\n }\n this._validatedValue = `${this.confirmValue}-${value}`;\n\n return this._isValid;\n }\n\n /**\n */\n getFormData(): { [string]: any } | null {\n if (this.isConfirmPassword || this.inError()) {\n return null;\n }\n\n return {\n [this.name]: this.value,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AACA,OAAOA,oBAAP,MAAiC,wBAAjC;AACA,OAAOC,oBAAP,MAAiC,0CAAjC;AAEA,OAAOC,mCAAP,MAAgD,yDAAhD;AACA,OAAOC,sDAAP,MAAmE,4EAAnE;AACA,OAAOC,sCAAP,MAAmD,4DAAnD;AACA,OAAOC,sCAAP,MAAmD,4DAAnD;AACA,OAAOC,eAAP,MAA4B,qCAA5B;AACA,OAAOC,yBAAP,MAAsC,+CAAtC;AAEA,SAASC,gBAAT,QAAiC,6BAAjC;;AAIA;AACA;AACA;IACqBC,sB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAenB;AACF;IACE,eAAmB;MACjB,OAAO,UAAP;IACD;IAED;AACF;AACA;;;;WACE,gBAAOC,KAAP,EAA8C;MAC5C,KAAKC,sBAAL;MACA,KAAKC,UAAL,GAAkBF,KAAlB;MAEA,OAAO,IAAP;IACD;IAED;AACF;;;;SACE,eAA0B;MACxB,OAAO,KAAKG,eAAL,CAAqB,aAArB,EAAoC,EAApC,CAAP;IACD;IAED;AACF;;;;SACE,eAA2C;MACzC,OAAO,KAAKC,WAAL,CAAiBC,0BAAxB;IACD;IAED;AACF;;;;SACE,eAAgD;MAC9C,OAAO,KAAKD,WAAL,CAAiBE,gCAAxB;IACD;IAED;AACF;;;;SACE,eAA+C;MAC7C,OAAO,KAAKF,WAAL,CAAiBG,+BAAxB;IACD;IAED;AACF;;;;SACE,eAA4C;MAC1C,OAAO,KAAKH,WAAL,CAAiBI,4BAAxB;IACD;IAED;AACF;;;;SACE,eAA4C;MAC1C,OAAO,KAAKJ,WAAL,CAAiBK,4BAAxB;IACD;IAED;AACF;;;;SACE,eAA4C;MAC1C,OAAO,KAAKL,WAAL,CAAiBM,eAAxB;IACD;IAED;AACF;AACA;;;;WACE,0BAAuC;MACrC,IAAMN,WAAW,GAAG,IAAIb,oBAAJ,EAApB;;MAEA,IAAI,KAAKoB,iBAAT,EAA4B;QAC1BP,WAAW,CAACQ,GAAZ,CACE,IAAIf,yBAAJ,CAA8B,KAAKgB,YAAnC,EAAiD,KAAKC,UAAtD,CADF;MAGD,CAJD,MAIO;QACL,IAAI,KAAKT,0BAAT,EAAqC;UACnCD,WAAW,CAACQ,GAAZ,CAAgB,IAAIpB,mCAAJ,EAAhB;QACD;;QAED,IAAI,KAAKc,gCAAT,EAA2C;UACzCF,WAAW,CAACQ,GAAZ,CACE,IAAInB,sDAAJ,CACE,KAAKa,gCADP,CADF;QAKD;;QAED,IAAI,KAAKE,4BAAT,EAAuC;UACrCJ,WAAW,CAACQ,GAAZ,CACE,IAAIlB,sCAAJ,CACE,KAAKc,4BADP,CADF;QAKD;;QAED,IAAI,KAAKC,4BAAT,EAAuC;UACrCL,WAAW,CAACQ,GAAZ,CACE,IAAIjB,sCAAJ,CACE,KAAKc,4BADP,CADF;QAKD;;QAED,IAAI,KAAKM,gBAAL,IAAyB,KAAKA,gBAAL,CAAsBC,MAAtB,GAA+B,CAA5D,EAA+D;UAC7D,KAAKD,gBAAL,CAAsBE,OAAtB,CAA8B,UAACP,eAAD,EAAqB;YACjDN,WAAW,CAACQ,GAAZ,CAAgB,IAAIhB,eAAJ,CAAoBc,eAApB,CAAhB;UACD,CAFD;QAGD;;QAED,IAAI,KAAKQ,UAAL,CAAgBC,GAAhB,CAAoBrB,gBAApB,CAAJ,EAA2C;UACzCM,WAAW,CAACQ,GAAZ,CACE,IAAIf,yBAAJ,CAA8B,KAAKgB,YAAnC,EAAiD,KAAKC,UAAtD,CADF;QAGD;MACF;;MAED,OAAOV,WAAP;IACD;IAED;AACF;AACA;;;;SACE,eAAiD;MAC/C,IAAI,KAAKO,iBAAT,EAA4B;QAC1B,IAAMP,WAAW,GAAG,IAAIb,oBAAJ,EAApB;QACAa,WAAW,CAACQ,GAAZ,CAAgB,KAAKQ,cAAL,EAAhB;QACA,OAAOhB,WAAP;MACD;;MAED;IACD;IAED;AACF;;;;SACE,eAAiC;MAC/B,OAAO,KAAKiB,kBAAL,IAA2B,KAAlC;IACD;IAED;AACF;;SACE,aAAsBV,iBAAtB,EAAkD;MAChD,KAAKU,kBAAL,GAA0BV,iBAA1B;IACD;IAED;AACF;;;;SACE,eAA2B;MACzB,OAAO,KAAKW,aAAL,IAAsB,EAA7B;IACD;IAED;AACF;;SACE,aAAiBT,YAAjB,EAAuC;MACrC,KAAKS,aAAL,GAAqBT,YAArB;MAEA,KAAKU,QAAL,CAAc,KAAKrB,UAAnB;IACD;IAED;AACF;;;;SACE,eAAyB;MACvB,OAAO,KAAKsB,WAAZ;IACD;IAED;AACF;;SACE,aAAeV,UAAf,EAAmC;MACjC,KAAKU,WAAL,GAAmBV,UAAnB;IACD;IAED;AACF;AACA;;;;WACE,kBAASd,KAAT,EAAiC;MAAA;;MAC/B;MACA,IAAI,CAAC,KAAKyB,uBAAL,EAAL,EAAqC;QACnC,OAAO,IAAP;MACD;;MAED,IAAI,KAAKC,kBAAL,CAAwB1B,KAAxB,CAAJ,EAAoC;QAClC,KAAK2B,QAAL,GAAgB,IAAhB;MACD,CAFD,MAEO,IAAI,KAAKC,eAAL,mDAA4B,KAAKf,YAAjC,wBAAiDb,KAAjD,CAAJ,EAA8D;QACnE,KAAK2B,QAAL,GAAgB,KAAKE,oBAAL,CAA0BN,QAA1B,CAAmCvB,KAAnC,CAAhB;MACD;;MACD,KAAK4B,eAAL,iDAA0B,KAAKf,YAA/B,wBAA+Cb,KAA/C;MAEA,OAAO,KAAK2B,QAAZ;IACD;IAED;AACF;;;;WACE,uBAAwC;MACtC,IAAI,KAAKhB,iBAAL,IAA0B,KAAKmB,OAAL,EAA9B,EAA8C;QAC5C,OAAO,IAAP;MACD;;MAED,2BACG,KAAKC,IADR,EACe,KAAK/B,KADpB;IAGD;;;;IA3MD;AACF;IACE,2BAAyBgC,aAAzB,EAAyD;MACvD,IAAMd,UAAU,GAAGc,aAAH,aAAGA,aAAH,uBAAGA,aAAa,CAAEd,UAAlC;MACA,OACEc,aAAa,CAACC,IAAd,KAAuB,UAAvB,IACCC,KAAK,CAACC,OAAN,CAAcjB,UAAd,KAA6B,0BAAAA,UAAU,MAAV,CAAAA,UAAU,EAAU,UAAV,CAF1C;IAID;;;;EAbiD5B,oB;;SAA/BS,sB"}
1
+ {"version":3,"file":"PasswordAttributeModel.js","names":["StringAttributeModel","ConstraintCollection","PasswordLowerAndUpperCaseConstraint","PasswordThreeConsecutiveCharactersNotAllowedConstraint","PasswordMinNumericCharactersConstraint","PasswordMinSpecialCharactersConstraint","RegexConstraint","PasswordConfirmConstraint","CONFIRM_PASSWORD","PasswordAttributeModel","value","updateLastModification","inputvalue","getContribution","constraints","upperAndLowerCaseMandatory","maxSequenceOfIdenticalCharacters","maxSequenceOfUsernameCharacters","minNumberOfNumericCharacters","minNumberOfSpecialCharacters","regexConstraint","isConfirmPassword","getConfirmPasswordConstraints","getStandardPasswordConstraints","add","confirmValue","otherLabel","regexConstraints","length","forEach","layouthint","has","_isConfirmPassword","_confirmValue","validate","_otherLabel","useClientsideValidation","isOptionalAndEmpty","_isValid","_validatedValue","constraintCollection","inError","name","contributions","type","Array","isArray"],"sources":["../../../src/models/attributes/PasswordAttributeModel.js"],"sourcesContent":["// @flow\nimport StringAttributeModel from \"./StringAttributeModel\";\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\n\nimport PasswordLowerAndUpperCaseConstraint from \"./input-constraints/PasswordLowerAndUpperCaseConstraint\";\nimport PasswordThreeConsecutiveCharactersNotAllowedConstraint from \"./input-constraints/PasswordThreeConsecutiveCharactersNotAllowedConstraint\";\nimport PasswordMinNumericCharactersConstraint from \"./input-constraints/PasswordMinNumericCharactersConstraint\";\nimport PasswordMinSpecialCharactersConstraint from \"./input-constraints/PasswordMinSpecialCharactersConstraint\";\nimport RegexConstraint from \"./input-constraints/RegexConstraint\";\nimport PasswordConfirmConstraint from \"./input-constraints/PasswordConfirmConstraint\";\n\nimport { CONFIRM_PASSWORD } from \"../../constants/LayoutHints\";\n\nimport type { RegexObject } from \"./input-constraints/RegexConstraint\";\n\n/**\n * Password attribute\n */\nexport default class PasswordAttributeModel extends StringAttributeModel {\n _confirmValue: string;\n _isConfirmPassword: boolean;\n _otherLabel: string;\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n const layouthint = contributions?.layouthint;\n return (\n contributions.type === \"password\" ||\n (Array.isArray(layouthint) && layouthint.includes(\"password\"))\n );\n }\n\n /**\n */\n get type(): string {\n return \"password\";\n }\n\n /**\n * Update the attribute by name and value\n */\n update(value: string): PasswordAttributeModel {\n this.updateLastModification();\n this.inputvalue = value;\n\n return this;\n }\n\n /**\n */\n get constraints(): Object {\n return this.getContribution(\"constraints\", {});\n }\n\n /**\n */\n get upperAndLowerCaseMandatory(): ?boolean {\n return this.constraints.upperAndLowerCaseMandatory;\n }\n\n /**\n */\n get maxSequenceOfIdenticalCharacters(): ?number {\n return this.constraints.maxSequenceOfIdenticalCharacters;\n }\n\n /**\n */\n get maxSequenceOfUsernameCharacters(): ?number {\n return this.constraints.maxSequenceOfUsernameCharacters;\n }\n\n /**\n */\n get minNumberOfNumericCharacters(): ?number {\n return this.constraints.minNumberOfNumericCharacters;\n }\n\n /**\n */\n get minNumberOfSpecialCharacters(): ?number {\n return this.constraints.minNumberOfSpecialCharacters;\n }\n\n /**\n */\n get regexConstraints(): ?Array<RegexObject> {\n return this.constraints.regexConstraint;\n }\n\n /**\n * Add password constraints\n */\n addConstraints(): ConstraintCollection {\n if (this.isConfirmPassword) {\n return this.getConfirmPasswordConstraints();\n }\n return this.getStandardPasswordConstraints();\n }\n\n /**\n * Constraints for a confirmation password\n */\n getConfirmPasswordConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n return constraints;\n }\n\n /**\n * Constrains for a standard password\n */\n getStandardPasswordConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n if (this.upperAndLowerCaseMandatory) {\n constraints.add(new PasswordLowerAndUpperCaseConstraint());\n }\n\n if (this.maxSequenceOfIdenticalCharacters) {\n constraints.add(\n new PasswordThreeConsecutiveCharactersNotAllowedConstraint(\n this.maxSequenceOfIdenticalCharacters\n )\n );\n }\n\n if (this.minNumberOfNumericCharacters) {\n constraints.add(\n new PasswordMinNumericCharactersConstraint(\n this.minNumberOfNumericCharacters\n )\n );\n }\n\n if (this.minNumberOfSpecialCharacters) {\n constraints.add(\n new PasswordMinSpecialCharactersConstraint(\n this.minNumberOfSpecialCharacters\n )\n );\n }\n\n if (this.regexConstraints && this.regexConstraints.length > 0) {\n this.regexConstraints.forEach((regexConstraint) => {\n constraints.add(new RegexConstraint(regexConstraint));\n });\n }\n\n if (\n this.layouthint.has(CONFIRM_PASSWORD) &&\n this.isConfirmPassword == null\n ) {\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n }\n\n return constraints;\n }\n\n /**\n * Retrieve applicable constraint for this attribute\n */\n get constraintCollection(): ConstraintCollection {\n if (this.isConfirmPassword) {\n // confirm password only needs local constraints, no server constraints\n return this.getConfirmPasswordConstraints();\n }\n\n return super.constraintCollection;\n }\n\n /**\n */\n get isConfirmPassword(): boolean | null {\n return this._isConfirmPassword;\n }\n\n /**\n */\n set isConfirmPassword(isConfirmPassword: boolean) {\n this._isConfirmPassword = isConfirmPassword;\n }\n\n /**\n */\n get confirmValue(): string {\n return this._confirmValue || \"\";\n }\n\n /**\n */\n set confirmValue(confirmValue: string) {\n this._confirmValue = confirmValue;\n\n this.validate(this.inputvalue);\n }\n\n /**\n */\n get otherLabel(): string {\n return this._otherLabel;\n }\n\n /**\n */\n set otherLabel(otherLabel: string) {\n this._otherLabel = otherLabel;\n }\n\n /**\n * Validate input\n */\n validate(value: string): boolean {\n // when client side validation is disabled, this attribute is always valid\n if (!this.useClientsideValidation()) {\n return true;\n }\n\n if (this.isOptionalAndEmpty(value)) {\n this._isValid = true;\n } else if (this._validatedValue !== `${this.confirmValue}-${value}`) {\n this._isValid = this.constraintCollection.validate(value);\n }\n this._validatedValue = `${this.confirmValue}-${value}`;\n\n return this._isValid;\n }\n\n /**\n */\n getFormData(): { [string]: any } | null {\n if (this.isConfirmPassword || this.inError()) {\n return null;\n }\n\n return {\n [this.name]: this.value,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AACA,OAAOA,oBAAP,MAAiC,wBAAjC;AACA,OAAOC,oBAAP,MAAiC,0CAAjC;AAEA,OAAOC,mCAAP,MAAgD,yDAAhD;AACA,OAAOC,sDAAP,MAAmE,4EAAnE;AACA,OAAOC,sCAAP,MAAmD,4DAAnD;AACA,OAAOC,sCAAP,MAAmD,4DAAnD;AACA,OAAOC,eAAP,MAA4B,qCAA5B;AACA,OAAOC,yBAAP,MAAsC,+CAAtC;AAEA,SAASC,gBAAT,QAAiC,6BAAjC;;AAIA;AACA;AACA;IACqBC,sB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAenB;AACF;IACE,eAAmB;MACjB,OAAO,UAAP;IACD;IAED;AACF;AACA;;;;WACE,gBAAOC,KAAP,EAA8C;MAC5C,KAAKC,sBAAL;MACA,KAAKC,UAAL,GAAkBF,KAAlB;MAEA,OAAO,IAAP;IACD;IAED;AACF;;;;SACE,eAA0B;MACxB,OAAO,KAAKG,eAAL,CAAqB,aAArB,EAAoC,EAApC,CAAP;IACD;IAED;AACF;;;;SACE,eAA2C;MACzC,OAAO,KAAKC,WAAL,CAAiBC,0BAAxB;IACD;IAED;AACF;;;;SACE,eAAgD;MAC9C,OAAO,KAAKD,WAAL,CAAiBE,gCAAxB;IACD;IAED;AACF;;;;SACE,eAA+C;MAC7C,OAAO,KAAKF,WAAL,CAAiBG,+BAAxB;IACD;IAED;AACF;;;;SACE,eAA4C;MAC1C,OAAO,KAAKH,WAAL,CAAiBI,4BAAxB;IACD;IAED;AACF;;;;SACE,eAA4C;MAC1C,OAAO,KAAKJ,WAAL,CAAiBK,4BAAxB;IACD;IAED;AACF;;;;SACE,eAA4C;MAC1C,OAAO,KAAKL,WAAL,CAAiBM,eAAxB;IACD;IAED;AACF;AACA;;;;WACE,0BAAuC;MACrC,IAAI,KAAKC,iBAAT,EAA4B;QAC1B,OAAO,KAAKC,6BAAL,EAAP;MACD;;MACD,OAAO,KAAKC,8BAAL,EAAP;IACD;IAED;AACF;AACA;;;;WACE,yCAAsD;MACpD,IAAMT,WAAW,GAAG,IAAIb,oBAAJ,EAApB;MACAa,WAAW,CAACU,GAAZ,CACE,IAAIjB,yBAAJ,CAA8B,KAAKkB,YAAnC,EAAiD,KAAKC,UAAtD,CADF;MAGA,OAAOZ,WAAP;IACD;IAED;AACF;AACA;;;;WACE,0CAAuD;MACrD,IAAMA,WAAW,GAAG,IAAIb,oBAAJ,EAApB;;MAEA,IAAI,KAAKc,0BAAT,EAAqC;QACnCD,WAAW,CAACU,GAAZ,CAAgB,IAAItB,mCAAJ,EAAhB;MACD;;MAED,IAAI,KAAKc,gCAAT,EAA2C;QACzCF,WAAW,CAACU,GAAZ,CACE,IAAIrB,sDAAJ,CACE,KAAKa,gCADP,CADF;MAKD;;MAED,IAAI,KAAKE,4BAAT,EAAuC;QACrCJ,WAAW,CAACU,GAAZ,CACE,IAAIpB,sCAAJ,CACE,KAAKc,4BADP,CADF;MAKD;;MAED,IAAI,KAAKC,4BAAT,EAAuC;QACrCL,WAAW,CAACU,GAAZ,CACE,IAAInB,sCAAJ,CACE,KAAKc,4BADP,CADF;MAKD;;MAED,IAAI,KAAKQ,gBAAL,IAAyB,KAAKA,gBAAL,CAAsBC,MAAtB,GAA+B,CAA5D,EAA+D;QAC7D,KAAKD,gBAAL,CAAsBE,OAAtB,CAA8B,UAACT,eAAD,EAAqB;UACjDN,WAAW,CAACU,GAAZ,CAAgB,IAAIlB,eAAJ,CAAoBc,eAApB,CAAhB;QACD,CAFD;MAGD;;MAED,IACE,KAAKU,UAAL,CAAgBC,GAAhB,CAAoBvB,gBAApB,KACA,KAAKa,iBAAL,IAA0B,IAF5B,EAGE;QACAP,WAAW,CAACU,GAAZ,CACE,IAAIjB,yBAAJ,CAA8B,KAAKkB,YAAnC,EAAiD,KAAKC,UAAtD,CADF;MAGD;;MAED,OAAOZ,WAAP;IACD;IAED;AACF;AACA;;;;SACE,eAAiD;MAC/C,IAAI,KAAKO,iBAAT,EAA4B;QAC1B;QACA,OAAO,KAAKC,6BAAL,EAAP;MACD;;MAED;IACD;IAED;AACF;;;;SACE,eAAwC;MACtC,OAAO,KAAKU,kBAAZ;IACD;IAED;AACF;;SACE,aAAsBX,iBAAtB,EAAkD;MAChD,KAAKW,kBAAL,GAA0BX,iBAA1B;IACD;IAED;AACF;;;;SACE,eAA2B;MACzB,OAAO,KAAKY,aAAL,IAAsB,EAA7B;IACD;IAED;AACF;;SACE,aAAiBR,YAAjB,EAAuC;MACrC,KAAKQ,aAAL,GAAqBR,YAArB;MAEA,KAAKS,QAAL,CAAc,KAAKtB,UAAnB;IACD;IAED;AACF;;;;SACE,eAAyB;MACvB,OAAO,KAAKuB,WAAZ;IACD;IAED;AACF;;SACE,aAAeT,UAAf,EAAmC;MACjC,KAAKS,WAAL,GAAmBT,UAAnB;IACD;IAED;AACF;AACA;;;;WACE,kBAAShB,KAAT,EAAiC;MAAA;;MAC/B;MACA,IAAI,CAAC,KAAK0B,uBAAL,EAAL,EAAqC;QACnC,OAAO,IAAP;MACD;;MAED,IAAI,KAAKC,kBAAL,CAAwB3B,KAAxB,CAAJ,EAAoC;QAClC,KAAK4B,QAAL,GAAgB,IAAhB;MACD,CAFD,MAEO,IAAI,KAAKC,eAAL,mDAA4B,KAAKd,YAAjC,wBAAiDf,KAAjD,CAAJ,EAA8D;QACnE,KAAK4B,QAAL,GAAgB,KAAKE,oBAAL,CAA0BN,QAA1B,CAAmCxB,KAAnC,CAAhB;MACD;;MACD,KAAK6B,eAAL,iDAA0B,KAAKd,YAA/B,wBAA+Cf,KAA/C;MAEA,OAAO,KAAK4B,QAAZ;IACD;IAED;AACF;;;;WACE,uBAAwC;MACtC,IAAI,KAAKjB,iBAAL,IAA0B,KAAKoB,OAAL,EAA9B,EAA8C;QAC5C,OAAO,IAAP;MACD;;MAED,2BACG,KAAKC,IADR,EACe,KAAKhC,KADpB;IAGD;;;;IA5ND;AACF;IACE,2BAAyBiC,aAAzB,EAAyD;MACvD,IAAMb,UAAU,GAAGa,aAAH,aAAGA,aAAH,uBAAGA,aAAa,CAAEb,UAAlC;MACA,OACEa,aAAa,CAACC,IAAd,KAAuB,UAAvB,IACCC,KAAK,CAACC,OAAN,CAAchB,UAAd,KAA6B,0BAAAA,UAAU,MAAV,CAAAA,UAAU,EAAU,UAAV,CAF1C;IAID;;;;EAbiD9B,oB;;SAA/BS,sB"}
@@ -3,12 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useNotification = void 0;
6
+ exports.useNotification = exports.useErrorNotification = void 0;
7
7
 
8
8
  var _reactRedux = require("react-redux");
9
9
 
10
10
  var _actions = require("../redux/actions");
11
11
 
12
+ var _constants = require("../constants");
13
+
12
14
  /**
13
15
  */
14
16
  var useNotification = function useNotification() {
@@ -32,6 +34,18 @@ var useNotification = function useNotification() {
32
34
  }
33
35
  };
34
36
  };
37
+ /**
38
+ */
39
+
35
40
 
36
41
  exports.useNotification = useNotification;
42
+
43
+ var useErrorNotification = function useErrorNotification() {
44
+ var dispatch = (0, _reactRedux.useDispatch)();
45
+ return function (message, error) {
46
+ return dispatch((0, _actions.showNotification)(_constants.NOTIFICATION_TYPES.ERROR, message, error));
47
+ };
48
+ };
49
+
50
+ exports.useErrorNotification = useErrorNotification;
37
51
  //# sourceMappingURL=useNotification.js.map
@@ -1,15 +1,25 @@
1
1
  // @flow
2
2
  import { useSelector, useDispatch } from "react-redux";
3
- import { dismissNotification } from "../redux/actions";
3
+ import { dismissNotification, showNotification } from "../redux/actions";
4
4
 
5
5
  import type {
6
6
  DismissNotificationAction,
7
7
  NotificationState,
8
+ ShowNotificationAction,
8
9
  } from "../redux/types";
10
+
11
+ import { NOTIFICATION_TYPES } from "../constants";
12
+
13
+ import type { MessageObject } from "../i18n";
14
+ import type ErrorResponse from "../models/error/ErrorResponse";
9
15
  type NotificationHook = {
10
16
  ...NotificationState,
11
17
  dismiss: () => DismissNotificationAction,
12
18
  };
19
+ type ErrorNotificationHook = (
20
+ message: MessageObject,
21
+ error?: ?ErrorResponse
22
+ ) => ShowNotificationAction;
13
23
 
14
24
  /**
15
25
  */
@@ -27,3 +37,12 @@ export const useNotification = (): NotificationHook => {
27
37
  dismiss: () => dispatch(dismissNotification()),
28
38
  };
29
39
  };
40
+
41
+ /**
42
+ */
43
+ export const useErrorNotification = (): ErrorNotificationHook => {
44
+ const dispatch = useDispatch();
45
+ return (message: MessageObject, error?: ?ErrorResponse) => {
46
+ return dispatch(showNotification(NOTIFICATION_TYPES.ERROR, message, error));
47
+ };
48
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"useNotification.js","names":["useNotification","dispatch","useDispatch","useSelector","state","notification","render","messageType","message","error","dismiss","dismissNotification"],"sources":["../../src/hooks/useNotification.js"],"sourcesContent":["// @flow\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { dismissNotification } from \"../redux/actions\";\n\nimport type {\n DismissNotificationAction,\n NotificationState,\n} from \"../redux/types\";\ntype NotificationHook = {\n ...NotificationState,\n dismiss: () => DismissNotificationAction,\n};\n\n/**\n */\nexport const useNotification = (): NotificationHook => {\n const dispatch = useDispatch();\n const { render, messageType, message, error } = useSelector(\n (state) => state.notification\n );\n\n return {\n render,\n messageType,\n message,\n error,\n dismiss: () => dispatch(dismissNotification()),\n };\n};\n"],"mappings":";;;;;;;AACA;;AACA;;AAWA;AACA;AACO,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,GAAwB;EACrD,IAAMC,QAAQ,GAAG,IAAAC,uBAAA,GAAjB;;EACA,mBAAgD,IAAAC,uBAAA,EAC9C,UAACC,KAAD;IAAA,OAAWA,KAAK,CAACC,YAAjB;EAAA,CAD8C,CAAhD;EAAA,IAAQC,MAAR,gBAAQA,MAAR;EAAA,IAAgBC,WAAhB,gBAAgBA,WAAhB;EAAA,IAA6BC,OAA7B,gBAA6BA,OAA7B;EAAA,IAAsCC,KAAtC,gBAAsCA,KAAtC;;EAIA,OAAO;IACLH,MAAM,EAANA,MADK;IAELC,WAAW,EAAXA,WAFK;IAGLC,OAAO,EAAPA,OAHK;IAILC,KAAK,EAALA,KAJK;IAKLC,OAAO,EAAE;MAAA,OAAMT,QAAQ,CAAC,IAAAU,4BAAA,GAAD,CAAd;IAAA;EALJ,CAAP;AAOD,CAbM"}
1
+ {"version":3,"file":"useNotification.js","names":["useNotification","dispatch","useDispatch","useSelector","state","notification","render","messageType","message","error","dismiss","dismissNotification","useErrorNotification","showNotification","NOTIFICATION_TYPES","ERROR"],"sources":["../../src/hooks/useNotification.js"],"sourcesContent":["// @flow\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { dismissNotification, showNotification } from \"../redux/actions\";\n\nimport type {\n DismissNotificationAction,\n NotificationState,\n ShowNotificationAction,\n} from \"../redux/types\";\n\nimport { NOTIFICATION_TYPES } from \"../constants\";\n\nimport type { MessageObject } from \"../i18n\";\nimport type ErrorResponse from \"../models/error/ErrorResponse\";\ntype NotificationHook = {\n ...NotificationState,\n dismiss: () => DismissNotificationAction,\n};\ntype ErrorNotificationHook = (\n message: MessageObject,\n error?: ?ErrorResponse\n) => ShowNotificationAction;\n\n/**\n */\nexport const useNotification = (): NotificationHook => {\n const dispatch = useDispatch();\n const { render, messageType, message, error } = useSelector(\n (state) => state.notification\n );\n\n return {\n render,\n messageType,\n message,\n error,\n dismiss: () => dispatch(dismissNotification()),\n };\n};\n\n/**\n */\nexport const useErrorNotification = (): ErrorNotificationHook => {\n const dispatch = useDispatch();\n return (message: MessageObject, error?: ?ErrorResponse) => {\n return dispatch(showNotification(NOTIFICATION_TYPES.ERROR, message, error));\n };\n};\n"],"mappings":";;;;;;;AACA;;AACA;;AAQA;;AAaA;AACA;AACO,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,GAAwB;EACrD,IAAMC,QAAQ,GAAG,IAAAC,uBAAA,GAAjB;;EACA,mBAAgD,IAAAC,uBAAA,EAC9C,UAACC,KAAD;IAAA,OAAWA,KAAK,CAACC,YAAjB;EAAA,CAD8C,CAAhD;EAAA,IAAQC,MAAR,gBAAQA,MAAR;EAAA,IAAgBC,WAAhB,gBAAgBA,WAAhB;EAAA,IAA6BC,OAA7B,gBAA6BA,OAA7B;EAAA,IAAsCC,KAAtC,gBAAsCA,KAAtC;;EAIA,OAAO;IACLH,MAAM,EAANA,MADK;IAELC,WAAW,EAAXA,WAFK;IAGLC,OAAO,EAAPA,OAHK;IAILC,KAAK,EAALA,KAJK;IAKLC,OAAO,EAAE;MAAA,OAAMT,QAAQ,CAAC,IAAAU,4BAAA,GAAD,CAAd;IAAA;EALJ,CAAP;AAOD,CAbM;AAeP;AACA;;;;;AACO,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,GAA6B;EAC/D,IAAMX,QAAQ,GAAG,IAAAC,uBAAA,GAAjB;EACA,OAAO,UAACM,OAAD,EAAyBC,KAAzB,EAAoD;IACzD,OAAOR,QAAQ,CAAC,IAAAY,yBAAA,EAAiBC,6BAAA,CAAmBC,KAApC,EAA2CP,OAA3C,EAAoDC,KAApD,CAAD,CAAf;EACD,CAFD;AAGD,CALM"}
@@ -159,36 +159,56 @@ var PasswordAttributeModel = /*#__PURE__*/function (_StringAttributeModel) {
159
159
  }, {
160
160
  key: "addConstraints",
161
161
  value: function addConstraints() {
162
+ if (this.isConfirmPassword) {
163
+ return this.getConfirmPasswordConstraints();
164
+ }
165
+
166
+ return this.getStandardPasswordConstraints();
167
+ }
168
+ /**
169
+ * Constraints for a confirmation password
170
+ */
171
+
172
+ }, {
173
+ key: "getConfirmPasswordConstraints",
174
+ value: function getConfirmPasswordConstraints() {
162
175
  var constraints = new _ConstraintCollection.default();
176
+ constraints.add(new _PasswordConfirmConstraint.default(this.confirmValue, this.otherLabel));
177
+ return constraints;
178
+ }
179
+ /**
180
+ * Constrains for a standard password
181
+ */
163
182
 
164
- if (this.isConfirmPassword) {
183
+ }, {
184
+ key: "getStandardPasswordConstraints",
185
+ value: function getStandardPasswordConstraints() {
186
+ var constraints = new _ConstraintCollection.default();
187
+
188
+ if (this.upperAndLowerCaseMandatory) {
189
+ constraints.add(new _PasswordLowerAndUpperCaseConstraint.default());
190
+ }
191
+
192
+ if (this.maxSequenceOfIdenticalCharacters) {
193
+ constraints.add(new _PasswordThreeConsecutiveCharactersNotAllowedConstraint.default(this.maxSequenceOfIdenticalCharacters));
194
+ }
195
+
196
+ if (this.minNumberOfNumericCharacters) {
197
+ constraints.add(new _PasswordMinNumericCharactersConstraint.default(this.minNumberOfNumericCharacters));
198
+ }
199
+
200
+ if (this.minNumberOfSpecialCharacters) {
201
+ constraints.add(new _PasswordMinSpecialCharactersConstraint.default(this.minNumberOfSpecialCharacters));
202
+ }
203
+
204
+ if (this.regexConstraints && this.regexConstraints.length > 0) {
205
+ this.regexConstraints.forEach(function (regexConstraint) {
206
+ constraints.add(new _RegexConstraint.default(regexConstraint));
207
+ });
208
+ }
209
+
210
+ if (this.layouthint.has(_LayoutHints.CONFIRM_PASSWORD) && this.isConfirmPassword == null) {
165
211
  constraints.add(new _PasswordConfirmConstraint.default(this.confirmValue, this.otherLabel));
166
- } else {
167
- if (this.upperAndLowerCaseMandatory) {
168
- constraints.add(new _PasswordLowerAndUpperCaseConstraint.default());
169
- }
170
-
171
- if (this.maxSequenceOfIdenticalCharacters) {
172
- constraints.add(new _PasswordThreeConsecutiveCharactersNotAllowedConstraint.default(this.maxSequenceOfIdenticalCharacters));
173
- }
174
-
175
- if (this.minNumberOfNumericCharacters) {
176
- constraints.add(new _PasswordMinNumericCharactersConstraint.default(this.minNumberOfNumericCharacters));
177
- }
178
-
179
- if (this.minNumberOfSpecialCharacters) {
180
- constraints.add(new _PasswordMinSpecialCharactersConstraint.default(this.minNumberOfSpecialCharacters));
181
- }
182
-
183
- if (this.regexConstraints && this.regexConstraints.length > 0) {
184
- this.regexConstraints.forEach(function (regexConstraint) {
185
- constraints.add(new _RegexConstraint.default(regexConstraint));
186
- });
187
- }
188
-
189
- if (this.layouthint.has(_LayoutHints.CONFIRM_PASSWORD)) {
190
- constraints.add(new _PasswordConfirmConstraint.default(this.confirmValue, this.otherLabel));
191
- }
192
212
  }
193
213
 
194
214
  return constraints;
@@ -201,9 +221,8 @@ var PasswordAttributeModel = /*#__PURE__*/function (_StringAttributeModel) {
201
221
  key: "constraintCollection",
202
222
  get: function get() {
203
223
  if (this.isConfirmPassword) {
204
- var constraints = new _ConstraintCollection.default();
205
- constraints.add(this.addConstraints());
206
- return constraints;
224
+ // confirm password only needs local constraints, no server constraints
225
+ return this.getConfirmPasswordConstraints();
207
226
  }
208
227
 
209
228
  return (0, _get2.default)((0, _getPrototypeOf2.default)(PasswordAttributeModel.prototype), "constraintCollection", this);
@@ -214,7 +233,7 @@ var PasswordAttributeModel = /*#__PURE__*/function (_StringAttributeModel) {
214
233
  }, {
215
234
  key: "isConfirmPassword",
216
235
  get: function get() {
217
- return this._isConfirmPassword || false;
236
+ return this._isConfirmPassword;
218
237
  }
219
238
  /**
220
239
  */
@@ -93,52 +93,70 @@ export default class PasswordAttributeModel extends StringAttributeModel {
93
93
  * Add password constraints
94
94
  */
95
95
  addConstraints(): ConstraintCollection {
96
+ if (this.isConfirmPassword) {
97
+ return this.getConfirmPasswordConstraints();
98
+ }
99
+ return this.getStandardPasswordConstraints();
100
+ }
101
+
102
+ /**
103
+ * Constraints for a confirmation password
104
+ */
105
+ getConfirmPasswordConstraints(): ConstraintCollection {
96
106
  const constraints = new ConstraintCollection();
107
+ constraints.add(
108
+ new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)
109
+ );
110
+ return constraints;
111
+ }
97
112
 
98
- if (this.isConfirmPassword) {
113
+ /**
114
+ * Constrains for a standard password
115
+ */
116
+ getStandardPasswordConstraints(): ConstraintCollection {
117
+ const constraints = new ConstraintCollection();
118
+
119
+ if (this.upperAndLowerCaseMandatory) {
120
+ constraints.add(new PasswordLowerAndUpperCaseConstraint());
121
+ }
122
+
123
+ if (this.maxSequenceOfIdenticalCharacters) {
124
+ constraints.add(
125
+ new PasswordThreeConsecutiveCharactersNotAllowedConstraint(
126
+ this.maxSequenceOfIdenticalCharacters
127
+ )
128
+ );
129
+ }
130
+
131
+ if (this.minNumberOfNumericCharacters) {
132
+ constraints.add(
133
+ new PasswordMinNumericCharactersConstraint(
134
+ this.minNumberOfNumericCharacters
135
+ )
136
+ );
137
+ }
138
+
139
+ if (this.minNumberOfSpecialCharacters) {
140
+ constraints.add(
141
+ new PasswordMinSpecialCharactersConstraint(
142
+ this.minNumberOfSpecialCharacters
143
+ )
144
+ );
145
+ }
146
+
147
+ if (this.regexConstraints && this.regexConstraints.length > 0) {
148
+ this.regexConstraints.forEach((regexConstraint) => {
149
+ constraints.add(new RegexConstraint(regexConstraint));
150
+ });
151
+ }
152
+
153
+ if (
154
+ this.layouthint.has(CONFIRM_PASSWORD) &&
155
+ this.isConfirmPassword == null
156
+ ) {
99
157
  constraints.add(
100
158
  new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)
101
159
  );
102
- } else {
103
- if (this.upperAndLowerCaseMandatory) {
104
- constraints.add(new PasswordLowerAndUpperCaseConstraint());
105
- }
106
-
107
- if (this.maxSequenceOfIdenticalCharacters) {
108
- constraints.add(
109
- new PasswordThreeConsecutiveCharactersNotAllowedConstraint(
110
- this.maxSequenceOfIdenticalCharacters
111
- )
112
- );
113
- }
114
-
115
- if (this.minNumberOfNumericCharacters) {
116
- constraints.add(
117
- new PasswordMinNumericCharactersConstraint(
118
- this.minNumberOfNumericCharacters
119
- )
120
- );
121
- }
122
-
123
- if (this.minNumberOfSpecialCharacters) {
124
- constraints.add(
125
- new PasswordMinSpecialCharactersConstraint(
126
- this.minNumberOfSpecialCharacters
127
- )
128
- );
129
- }
130
-
131
- if (this.regexConstraints && this.regexConstraints.length > 0) {
132
- this.regexConstraints.forEach((regexConstraint) => {
133
- constraints.add(new RegexConstraint(regexConstraint));
134
- });
135
- }
136
-
137
- if (this.layouthint.has(CONFIRM_PASSWORD)) {
138
- constraints.add(
139
- new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)
140
- );
141
- }
142
160
  }
143
161
 
144
162
  return constraints;
@@ -149,9 +167,8 @@ export default class PasswordAttributeModel extends StringAttributeModel {
149
167
  */
150
168
  get constraintCollection(): ConstraintCollection {
151
169
  if (this.isConfirmPassword) {
152
- const constraints = new ConstraintCollection();
153
- constraints.add(this.addConstraints());
154
- return constraints;
170
+ // confirm password only needs local constraints, no server constraints
171
+ return this.getConfirmPasswordConstraints();
155
172
  }
156
173
 
157
174
  return super.constraintCollection;
@@ -159,8 +176,8 @@ export default class PasswordAttributeModel extends StringAttributeModel {
159
176
 
160
177
  /**
161
178
  */
162
- get isConfirmPassword(): boolean {
163
- return this._isConfirmPassword || false;
179
+ get isConfirmPassword(): boolean | null {
180
+ return this._isConfirmPassword;
164
181
  }
165
182
 
166
183
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordAttributeModel.js","names":["PasswordAttributeModel","value","updateLastModification","inputvalue","getContribution","constraints","upperAndLowerCaseMandatory","maxSequenceOfIdenticalCharacters","maxSequenceOfUsernameCharacters","minNumberOfNumericCharacters","minNumberOfSpecialCharacters","regexConstraint","ConstraintCollection","isConfirmPassword","add","PasswordConfirmConstraint","confirmValue","otherLabel","PasswordLowerAndUpperCaseConstraint","PasswordThreeConsecutiveCharactersNotAllowedConstraint","PasswordMinNumericCharactersConstraint","PasswordMinSpecialCharactersConstraint","regexConstraints","length","forEach","RegexConstraint","layouthint","has","CONFIRM_PASSWORD","addConstraints","_isConfirmPassword","_confirmValue","validate","_otherLabel","useClientsideValidation","isOptionalAndEmpty","_isValid","_validatedValue","constraintCollection","inError","name","contributions","type","Array","isArray","StringAttributeModel"],"sources":["../../../src/models/attributes/PasswordAttributeModel.js"],"sourcesContent":["// @flow\nimport StringAttributeModel from \"./StringAttributeModel\";\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\n\nimport PasswordLowerAndUpperCaseConstraint from \"./input-constraints/PasswordLowerAndUpperCaseConstraint\";\nimport PasswordThreeConsecutiveCharactersNotAllowedConstraint from \"./input-constraints/PasswordThreeConsecutiveCharactersNotAllowedConstraint\";\nimport PasswordMinNumericCharactersConstraint from \"./input-constraints/PasswordMinNumericCharactersConstraint\";\nimport PasswordMinSpecialCharactersConstraint from \"./input-constraints/PasswordMinSpecialCharactersConstraint\";\nimport RegexConstraint from \"./input-constraints/RegexConstraint\";\nimport PasswordConfirmConstraint from \"./input-constraints/PasswordConfirmConstraint\";\n\nimport { CONFIRM_PASSWORD } from \"../../constants/LayoutHints\";\n\nimport type { RegexObject } from \"./input-constraints/RegexConstraint\";\n\n/**\n * Password attribute\n */\nexport default class PasswordAttributeModel extends StringAttributeModel {\n _confirmValue: string;\n _isConfirmPassword: boolean;\n _otherLabel: string;\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n const layouthint = contributions?.layouthint;\n return (\n contributions.type === \"password\" ||\n (Array.isArray(layouthint) && layouthint.includes(\"password\"))\n );\n }\n\n /**\n */\n get type(): string {\n return \"password\";\n }\n\n /**\n * Update the attribute by name and value\n */\n update(value: string): PasswordAttributeModel {\n this.updateLastModification();\n this.inputvalue = value;\n\n return this;\n }\n\n /**\n */\n get constraints(): Object {\n return this.getContribution(\"constraints\", {});\n }\n\n /**\n */\n get upperAndLowerCaseMandatory(): ?boolean {\n return this.constraints.upperAndLowerCaseMandatory;\n }\n\n /**\n */\n get maxSequenceOfIdenticalCharacters(): ?number {\n return this.constraints.maxSequenceOfIdenticalCharacters;\n }\n\n /**\n */\n get maxSequenceOfUsernameCharacters(): ?number {\n return this.constraints.maxSequenceOfUsernameCharacters;\n }\n\n /**\n */\n get minNumberOfNumericCharacters(): ?number {\n return this.constraints.minNumberOfNumericCharacters;\n }\n\n /**\n */\n get minNumberOfSpecialCharacters(): ?number {\n return this.constraints.minNumberOfSpecialCharacters;\n }\n\n /**\n */\n get regexConstraints(): ?Array<RegexObject> {\n return this.constraints.regexConstraint;\n }\n\n /**\n * Add password constraints\n */\n addConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n if (this.isConfirmPassword) {\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n } else {\n if (this.upperAndLowerCaseMandatory) {\n constraints.add(new PasswordLowerAndUpperCaseConstraint());\n }\n\n if (this.maxSequenceOfIdenticalCharacters) {\n constraints.add(\n new PasswordThreeConsecutiveCharactersNotAllowedConstraint(\n this.maxSequenceOfIdenticalCharacters\n )\n );\n }\n\n if (this.minNumberOfNumericCharacters) {\n constraints.add(\n new PasswordMinNumericCharactersConstraint(\n this.minNumberOfNumericCharacters\n )\n );\n }\n\n if (this.minNumberOfSpecialCharacters) {\n constraints.add(\n new PasswordMinSpecialCharactersConstraint(\n this.minNumberOfSpecialCharacters\n )\n );\n }\n\n if (this.regexConstraints && this.regexConstraints.length > 0) {\n this.regexConstraints.forEach((regexConstraint) => {\n constraints.add(new RegexConstraint(regexConstraint));\n });\n }\n\n if (this.layouthint.has(CONFIRM_PASSWORD)) {\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n }\n }\n\n return constraints;\n }\n\n /**\n * Retrieve applicable constraint for this attribute\n */\n get constraintCollection(): ConstraintCollection {\n if (this.isConfirmPassword) {\n const constraints = new ConstraintCollection();\n constraints.add(this.addConstraints());\n return constraints;\n }\n\n return super.constraintCollection;\n }\n\n /**\n */\n get isConfirmPassword(): boolean {\n return this._isConfirmPassword || false;\n }\n\n /**\n */\n set isConfirmPassword(isConfirmPassword: boolean) {\n this._isConfirmPassword = isConfirmPassword;\n }\n\n /**\n */\n get confirmValue(): string {\n return this._confirmValue || \"\";\n }\n\n /**\n */\n set confirmValue(confirmValue: string) {\n this._confirmValue = confirmValue;\n\n this.validate(this.inputvalue);\n }\n\n /**\n */\n get otherLabel(): string {\n return this._otherLabel;\n }\n\n /**\n */\n set otherLabel(otherLabel: string) {\n this._otherLabel = otherLabel;\n }\n\n /**\n * Validate input\n */\n validate(value: string): boolean {\n // when client side validation is disabled, this attribute is always valid\n if (!this.useClientsideValidation()) {\n return true;\n }\n\n if (this.isOptionalAndEmpty(value)) {\n this._isValid = true;\n } else if (this._validatedValue !== `${this.confirmValue}-${value}`) {\n this._isValid = this.constraintCollection.validate(value);\n }\n this._validatedValue = `${this.confirmValue}-${value}`;\n\n return this._isValid;\n }\n\n /**\n */\n getFormData(): { [string]: any } | null {\n if (this.isConfirmPassword || this.inError()) {\n return null;\n }\n\n return {\n [this.name]: this.value,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordAttributeModel.js","names":["PasswordAttributeModel","value","updateLastModification","inputvalue","getContribution","constraints","upperAndLowerCaseMandatory","maxSequenceOfIdenticalCharacters","maxSequenceOfUsernameCharacters","minNumberOfNumericCharacters","minNumberOfSpecialCharacters","regexConstraint","isConfirmPassword","getConfirmPasswordConstraints","getStandardPasswordConstraints","ConstraintCollection","add","PasswordConfirmConstraint","confirmValue","otherLabel","PasswordLowerAndUpperCaseConstraint","PasswordThreeConsecutiveCharactersNotAllowedConstraint","PasswordMinNumericCharactersConstraint","PasswordMinSpecialCharactersConstraint","regexConstraints","length","forEach","RegexConstraint","layouthint","has","CONFIRM_PASSWORD","_isConfirmPassword","_confirmValue","validate","_otherLabel","useClientsideValidation","isOptionalAndEmpty","_isValid","_validatedValue","constraintCollection","inError","name","contributions","type","Array","isArray","StringAttributeModel"],"sources":["../../../src/models/attributes/PasswordAttributeModel.js"],"sourcesContent":["// @flow\nimport StringAttributeModel from \"./StringAttributeModel\";\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\n\nimport PasswordLowerAndUpperCaseConstraint from \"./input-constraints/PasswordLowerAndUpperCaseConstraint\";\nimport PasswordThreeConsecutiveCharactersNotAllowedConstraint from \"./input-constraints/PasswordThreeConsecutiveCharactersNotAllowedConstraint\";\nimport PasswordMinNumericCharactersConstraint from \"./input-constraints/PasswordMinNumericCharactersConstraint\";\nimport PasswordMinSpecialCharactersConstraint from \"./input-constraints/PasswordMinSpecialCharactersConstraint\";\nimport RegexConstraint from \"./input-constraints/RegexConstraint\";\nimport PasswordConfirmConstraint from \"./input-constraints/PasswordConfirmConstraint\";\n\nimport { CONFIRM_PASSWORD } from \"../../constants/LayoutHints\";\n\nimport type { RegexObject } from \"./input-constraints/RegexConstraint\";\n\n/**\n * Password attribute\n */\nexport default class PasswordAttributeModel extends StringAttributeModel {\n _confirmValue: string;\n _isConfirmPassword: boolean;\n _otherLabel: string;\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n const layouthint = contributions?.layouthint;\n return (\n contributions.type === \"password\" ||\n (Array.isArray(layouthint) && layouthint.includes(\"password\"))\n );\n }\n\n /**\n */\n get type(): string {\n return \"password\";\n }\n\n /**\n * Update the attribute by name and value\n */\n update(value: string): PasswordAttributeModel {\n this.updateLastModification();\n this.inputvalue = value;\n\n return this;\n }\n\n /**\n */\n get constraints(): Object {\n return this.getContribution(\"constraints\", {});\n }\n\n /**\n */\n get upperAndLowerCaseMandatory(): ?boolean {\n return this.constraints.upperAndLowerCaseMandatory;\n }\n\n /**\n */\n get maxSequenceOfIdenticalCharacters(): ?number {\n return this.constraints.maxSequenceOfIdenticalCharacters;\n }\n\n /**\n */\n get maxSequenceOfUsernameCharacters(): ?number {\n return this.constraints.maxSequenceOfUsernameCharacters;\n }\n\n /**\n */\n get minNumberOfNumericCharacters(): ?number {\n return this.constraints.minNumberOfNumericCharacters;\n }\n\n /**\n */\n get minNumberOfSpecialCharacters(): ?number {\n return this.constraints.minNumberOfSpecialCharacters;\n }\n\n /**\n */\n get regexConstraints(): ?Array<RegexObject> {\n return this.constraints.regexConstraint;\n }\n\n /**\n * Add password constraints\n */\n addConstraints(): ConstraintCollection {\n if (this.isConfirmPassword) {\n return this.getConfirmPasswordConstraints();\n }\n return this.getStandardPasswordConstraints();\n }\n\n /**\n * Constraints for a confirmation password\n */\n getConfirmPasswordConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n return constraints;\n }\n\n /**\n * Constrains for a standard password\n */\n getStandardPasswordConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n if (this.upperAndLowerCaseMandatory) {\n constraints.add(new PasswordLowerAndUpperCaseConstraint());\n }\n\n if (this.maxSequenceOfIdenticalCharacters) {\n constraints.add(\n new PasswordThreeConsecutiveCharactersNotAllowedConstraint(\n this.maxSequenceOfIdenticalCharacters\n )\n );\n }\n\n if (this.minNumberOfNumericCharacters) {\n constraints.add(\n new PasswordMinNumericCharactersConstraint(\n this.minNumberOfNumericCharacters\n )\n );\n }\n\n if (this.minNumberOfSpecialCharacters) {\n constraints.add(\n new PasswordMinSpecialCharactersConstraint(\n this.minNumberOfSpecialCharacters\n )\n );\n }\n\n if (this.regexConstraints && this.regexConstraints.length > 0) {\n this.regexConstraints.forEach((regexConstraint) => {\n constraints.add(new RegexConstraint(regexConstraint));\n });\n }\n\n if (\n this.layouthint.has(CONFIRM_PASSWORD) &&\n this.isConfirmPassword == null\n ) {\n constraints.add(\n new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)\n );\n }\n\n return constraints;\n }\n\n /**\n * Retrieve applicable constraint for this attribute\n */\n get constraintCollection(): ConstraintCollection {\n if (this.isConfirmPassword) {\n // confirm password only needs local constraints, no server constraints\n return this.getConfirmPasswordConstraints();\n }\n\n return super.constraintCollection;\n }\n\n /**\n */\n get isConfirmPassword(): boolean | null {\n return this._isConfirmPassword;\n }\n\n /**\n */\n set isConfirmPassword(isConfirmPassword: boolean) {\n this._isConfirmPassword = isConfirmPassword;\n }\n\n /**\n */\n get confirmValue(): string {\n return this._confirmValue || \"\";\n }\n\n /**\n */\n set confirmValue(confirmValue: string) {\n this._confirmValue = confirmValue;\n\n this.validate(this.inputvalue);\n }\n\n /**\n */\n get otherLabel(): string {\n return this._otherLabel;\n }\n\n /**\n */\n set otherLabel(otherLabel: string) {\n this._otherLabel = otherLabel;\n }\n\n /**\n * Validate input\n */\n validate(value: string): boolean {\n // when client side validation is disabled, this attribute is always valid\n if (!this.useClientsideValidation()) {\n return true;\n }\n\n if (this.isOptionalAndEmpty(value)) {\n this._isValid = true;\n } else if (this._validatedValue !== `${this.confirmValue}-${value}`) {\n this._isValid = this.constraintCollection.validate(value);\n }\n this._validatedValue = `${this.confirmValue}-${value}`;\n\n return this._isValid;\n }\n\n /**\n */\n getFormData(): { [string]: any } | null {\n if (this.isConfirmPassword || this.inError()) {\n return null;\n }\n\n return {\n [this.name]: this.value,\n };\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beinformed/ui",
3
- "version": "1.18.8",
3
+ "version": "1.19.1",
4
4
  "description": "Toolbox for be informed javascript layouts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "bugs": "http://support.beinformed.com",
@@ -72,10 +72,10 @@
72
72
  "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0",
73
73
  "react-helmet-async": "^1.0.0",
74
74
  "react-redux": "^7.0.0 || ^8.0.0",
75
- "react-router": "^5.2.0",
75
+ "react-router": "^5.0.0",
76
76
  "redux": "^4.0.0",
77
- "redux-thunk": "^2.3.0",
78
- "styled-components": "^5.2.0"
77
+ "redux-thunk": "^2.0.0",
78
+ "styled-components": "^5.0.0"
79
79
  },
80
80
  "dependencies": {
81
81
  "@babel/runtime-corejs3": "^7.18.3",
@@ -135,20 +135,20 @@
135
135
  "jest-sonar-reporter": "^2.0.0",
136
136
  "jscodeshift": "^0.13.1",
137
137
  "lint-staged": "^13.0.1",
138
- "polished": "^4.2.2",
139
- "prettier": "^2.6.2",
140
- "react": "^18.1.0",
141
- "react-dom": "^18.1.0",
142
- "react-helmet-async": "^1.3.0",
143
- "react-redux": "^8.0.2",
144
- "react-router": "^5.2.0",
138
+ "polished": "^4.0.0",
139
+ "prettier": "^2.7.1",
140
+ "react": "^18.0.0",
141
+ "react-dom": "^18.0.0",
142
+ "react-helmet-async": "^1.0.0",
143
+ "react-redux": "^8.0.0",
144
+ "react-router": "^5.0.0",
145
145
  "react-test-renderer": "^18.1.0",
146
- "redux": "^4.2.0",
146
+ "redux": "^4.0.0",
147
147
  "redux-mock-store": "^1.5.4",
148
- "redux-thunk": "^2.4.1",
148
+ "redux-thunk": "^2.0.0",
149
149
  "rimraf": "^3.0.2",
150
150
  "standard-version": "^9.5.0",
151
- "styled-components": "^5.3.5",
151
+ "styled-components": "^5.0.0",
152
152
  "xhr-mock": "^2.5.1"
153
153
  },
154
154
  "scarfSettings": {
@@ -1,15 +1,25 @@
1
1
  // @flow
2
2
  import { useSelector, useDispatch } from "react-redux";
3
- import { dismissNotification } from "../redux/actions";
3
+ import { dismissNotification, showNotification } from "../redux/actions";
4
4
 
5
5
  import type {
6
6
  DismissNotificationAction,
7
7
  NotificationState,
8
+ ShowNotificationAction,
8
9
  } from "../redux/types";
10
+
11
+ import { NOTIFICATION_TYPES } from "../constants";
12
+
13
+ import type { MessageObject } from "../i18n";
14
+ import type ErrorResponse from "../models/error/ErrorResponse";
9
15
  type NotificationHook = {
10
16
  ...NotificationState,
11
17
  dismiss: () => DismissNotificationAction,
12
18
  };
19
+ type ErrorNotificationHook = (
20
+ message: MessageObject,
21
+ error?: ?ErrorResponse
22
+ ) => ShowNotificationAction;
13
23
 
14
24
  /**
15
25
  */
@@ -27,3 +37,12 @@ export const useNotification = (): NotificationHook => {
27
37
  dismiss: () => dispatch(dismissNotification()),
28
38
  };
29
39
  };
40
+
41
+ /**
42
+ */
43
+ export const useErrorNotification = (): ErrorNotificationHook => {
44
+ const dispatch = useDispatch();
45
+ return (message: MessageObject, error?: ?ErrorResponse) => {
46
+ return dispatch(showNotification(NOTIFICATION_TYPES.ERROR, message, error));
47
+ };
48
+ };
@@ -93,52 +93,70 @@ export default class PasswordAttributeModel extends StringAttributeModel {
93
93
  * Add password constraints
94
94
  */
95
95
  addConstraints(): ConstraintCollection {
96
+ if (this.isConfirmPassword) {
97
+ return this.getConfirmPasswordConstraints();
98
+ }
99
+ return this.getStandardPasswordConstraints();
100
+ }
101
+
102
+ /**
103
+ * Constraints for a confirmation password
104
+ */
105
+ getConfirmPasswordConstraints(): ConstraintCollection {
96
106
  const constraints = new ConstraintCollection();
107
+ constraints.add(
108
+ new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)
109
+ );
110
+ return constraints;
111
+ }
97
112
 
98
- if (this.isConfirmPassword) {
113
+ /**
114
+ * Constrains for a standard password
115
+ */
116
+ getStandardPasswordConstraints(): ConstraintCollection {
117
+ const constraints = new ConstraintCollection();
118
+
119
+ if (this.upperAndLowerCaseMandatory) {
120
+ constraints.add(new PasswordLowerAndUpperCaseConstraint());
121
+ }
122
+
123
+ if (this.maxSequenceOfIdenticalCharacters) {
124
+ constraints.add(
125
+ new PasswordThreeConsecutiveCharactersNotAllowedConstraint(
126
+ this.maxSequenceOfIdenticalCharacters
127
+ )
128
+ );
129
+ }
130
+
131
+ if (this.minNumberOfNumericCharacters) {
132
+ constraints.add(
133
+ new PasswordMinNumericCharactersConstraint(
134
+ this.minNumberOfNumericCharacters
135
+ )
136
+ );
137
+ }
138
+
139
+ if (this.minNumberOfSpecialCharacters) {
140
+ constraints.add(
141
+ new PasswordMinSpecialCharactersConstraint(
142
+ this.minNumberOfSpecialCharacters
143
+ )
144
+ );
145
+ }
146
+
147
+ if (this.regexConstraints && this.regexConstraints.length > 0) {
148
+ this.regexConstraints.forEach((regexConstraint) => {
149
+ constraints.add(new RegexConstraint(regexConstraint));
150
+ });
151
+ }
152
+
153
+ if (
154
+ this.layouthint.has(CONFIRM_PASSWORD) &&
155
+ this.isConfirmPassword == null
156
+ ) {
99
157
  constraints.add(
100
158
  new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)
101
159
  );
102
- } else {
103
- if (this.upperAndLowerCaseMandatory) {
104
- constraints.add(new PasswordLowerAndUpperCaseConstraint());
105
- }
106
-
107
- if (this.maxSequenceOfIdenticalCharacters) {
108
- constraints.add(
109
- new PasswordThreeConsecutiveCharactersNotAllowedConstraint(
110
- this.maxSequenceOfIdenticalCharacters
111
- )
112
- );
113
- }
114
-
115
- if (this.minNumberOfNumericCharacters) {
116
- constraints.add(
117
- new PasswordMinNumericCharactersConstraint(
118
- this.minNumberOfNumericCharacters
119
- )
120
- );
121
- }
122
-
123
- if (this.minNumberOfSpecialCharacters) {
124
- constraints.add(
125
- new PasswordMinSpecialCharactersConstraint(
126
- this.minNumberOfSpecialCharacters
127
- )
128
- );
129
- }
130
-
131
- if (this.regexConstraints && this.regexConstraints.length > 0) {
132
- this.regexConstraints.forEach((regexConstraint) => {
133
- constraints.add(new RegexConstraint(regexConstraint));
134
- });
135
- }
136
-
137
- if (this.layouthint.has(CONFIRM_PASSWORD)) {
138
- constraints.add(
139
- new PasswordConfirmConstraint(this.confirmValue, this.otherLabel)
140
- );
141
- }
142
160
  }
143
161
 
144
162
  return constraints;
@@ -149,9 +167,8 @@ export default class PasswordAttributeModel extends StringAttributeModel {
149
167
  */
150
168
  get constraintCollection(): ConstraintCollection {
151
169
  if (this.isConfirmPassword) {
152
- const constraints = new ConstraintCollection();
153
- constraints.add(this.addConstraints());
154
- return constraints;
170
+ // confirm password only needs local constraints, no server constraints
171
+ return this.getConfirmPasswordConstraints();
155
172
  }
156
173
 
157
174
  return super.constraintCollection;
@@ -159,8 +176,8 @@ export default class PasswordAttributeModel extends StringAttributeModel {
159
176
 
160
177
  /**
161
178
  */
162
- get isConfirmPassword(): boolean {
163
- return this._isConfirmPassword || false;
179
+ get isConfirmPassword(): boolean | null {
180
+ return this._isConfirmPassword;
164
181
  }
165
182
 
166
183
  /**