@planning-inspectorate/dynamic-forms 3.12.0 → 3.13.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planning-inspectorate/dynamic-forms",
3
- "version": "3.12.0",
3
+ "version": "3.13.1",
4
4
  "description": "This package is for building GDS forms using a configuration-based approach.",
5
5
  "main": "./src/index.js",
6
6
  "type": "module",
@@ -1,7 +1,5 @@
1
1
  import escape from 'escape-html';
2
- import RequiredValidator from '../validator/required-validator.js';
3
2
  import { capitalize, nl2br, trimTrailingSlash } from '../lib/utils.js';
4
- import AddressValidator from '../validator/address-validator.js';
5
3
  import MultiFieldInputValidator from '../validator/multi-field-input-validator.js';
6
4
  import { answerObjectForManageList } from '#src/components/manage-list/utils.js';
7
5
 
@@ -454,12 +452,7 @@ export class Question {
454
452
  * @returns {boolean}
455
453
  */
456
454
  isRequired() {
457
- return this.validators?.some(
458
- (item) =>
459
- item instanceof RequiredValidator ||
460
- (item instanceof AddressValidator && item.isRequired()) ||
461
- (item instanceof MultiFieldInputValidator && item.isRequired())
462
- );
455
+ return this.validators?.some((validator) => validator.isRequired());
463
456
  }
464
457
  /**
465
458
  * @param {string} inputField
@@ -437,4 +437,17 @@ describe('./src/dynamic-forms/question.js', () => {
437
437
  });
438
438
  });
439
439
  });
440
+
441
+ describe('isRequired', () => {
442
+ it('should not be required if no validators', () => {
443
+ const q = getTestQuestion({ validators: [] });
444
+ assert.strictEqual(q.isRequired(), false);
445
+ });
446
+ it('should be required if any validator is required', () => {
447
+ const q = getTestQuestion({
448
+ validators: [{ isRequired: () => false }, { isRequired: () => true }]
449
+ });
450
+ assert.strictEqual(q.isRequired(), true);
451
+ });
452
+ });
440
453
  });
@@ -13,6 +13,29 @@ export class BaseValidator {
13
13
  throw new Error("Abstract classes can't be instantiated.");
14
14
  }
15
15
  }
16
+
17
+ /**
18
+ * Validates response body against field validators.
19
+ * Subclasses must override this method.
20
+ * @abstract
21
+ * @param {import('../questions/question-props.js').QuestionProps} questionObj - The question object containing the fieldName to validate.
22
+ * @param {import('../journey/journey-response.js').JourneyResponse} [journeyResponse] - The current journey response (optional).
23
+ * @returns {import('express-validator').ValidationChain | import('express-validator').ValidationChain[]}
24
+ */
25
+ // eslint-disable-next-line no-unused-vars
26
+ validate(questionObj, journeyResponse) {
27
+ throw new Error('validate method must be implemented by subclass');
28
+ }
29
+
30
+ /**
31
+ * Should the question that this validator is configured with be treated as a required question?
32
+ *
33
+ * Validators should override this method as appropriate, implementing any custom required logic.
34
+ * For example, the AddressValidator is configurable and is required if any one field is required.
35
+ */
36
+ isRequired() {
37
+ return false;
38
+ }
16
39
  }
17
40
 
18
41
  export default BaseValidator;
@@ -62,6 +62,10 @@ export class DateValidator extends BaseValidator {
62
62
  this.dateValidationSettings = dateValidationSettings;
63
63
  }
64
64
 
65
+ isRequired() {
66
+ return true;
67
+ }
68
+
65
69
  /**
66
70
  * validates the response body, checking the values sent for the date are valid
67
71
  * @param {DateQuestion} questionObj
@@ -35,6 +35,10 @@ export class RequiredValidator extends BaseValidator {
35
35
  validate(questionObj) {
36
36
  return body(questionObj.fieldName).notEmpty().withMessage(this.errorMessage);
37
37
  }
38
+
39
+ isRequired() {
40
+ return true;
41
+ }
38
42
  }
39
43
 
40
44
  export default RequiredValidator;
@@ -0,0 +1,130 @@
1
+ import { describe, it } from 'node:test';
2
+ import { COMPONENT_TYPES } from '#src/components/utils/component-types.js';
3
+ import { createQuestions } from '#src/questions/create-questions.js';
4
+ import { questionClasses } from '#src/questions/questions.js';
5
+ import { Section, SECTION_STATUS } from '#section';
6
+ import assert from 'node:assert';
7
+ import { JourneyResponse } from '#journey-response';
8
+ import RequiredValidator from '#src/validator/required-validator.js';
9
+ import DateValidator from '#src/validator/date-validator.js';
10
+ import AddressValidator from '#src/validator/address-validator.js';
11
+
12
+ /**
13
+ * @typedef {import('../src/questions/question-props.js').QuestionProps} Props
14
+ */
15
+
16
+ /**
17
+ * Check logic related to the question.isRequired method, which in turn drives the section status logic
18
+ */
19
+ describe('is-required', () => {
20
+ /** @type {() => Record<string, Props>} */
21
+ const getQuestionProps = () => ({
22
+ holidayActivities: {
23
+ type: COMPONENT_TYPES.CHECKBOX,
24
+ title: 'Holiday Activities',
25
+ question: 'Which activities do you want to do on holiday?',
26
+ fieldName: 'holidayActivities',
27
+ url: 'holiday-activities',
28
+ label: 'Select all that apply',
29
+ options: [
30
+ { value: 'swimming', text: 'Swimming' },
31
+ { value: 'hiking', text: 'Hiking' },
32
+ { value: 'sightseeing', text: 'Sightseeing' }
33
+ ]
34
+ },
35
+ addInsurance: {
36
+ type: COMPONENT_TYPES.BOOLEAN,
37
+ title: 'Travel Insurance',
38
+ question: 'Do you want to add travel insurance to your holiday?',
39
+ fieldName: 'addInsurance',
40
+ url: 'add-insurance',
41
+ label: 'Add insurance?'
42
+ },
43
+ travelInsuranceType: {
44
+ type: COMPONENT_TYPES.RADIO,
45
+ title: 'Travel Insurance Type',
46
+ question: 'Which type of travel insurance would you like?',
47
+ fieldName: 'travelInsuranceType',
48
+ url: 'travel-insurance-type',
49
+ label: 'Select an insurance type',
50
+ options: [
51
+ { value: 'basic', text: 'Basic' },
52
+ { value: 'comprehensive', text: 'Comprehensive' },
53
+ { value: 'premium', text: 'Premium' }
54
+ ]
55
+ },
56
+ holidayArrival: {
57
+ type: COMPONENT_TYPES.DATE_TIME,
58
+ title: 'Holiday Arrival',
59
+ question: 'When would you like to arrive at your destination?',
60
+ fieldName: 'holidayArrival',
61
+ url: 'holiday-arrival',
62
+ label: 'Enter your arrival time'
63
+ },
64
+ hotelAddress: {
65
+ type: COMPONENT_TYPES.ADDRESS,
66
+ title: 'Hotel Address',
67
+ question: 'What is the address of your hotel?',
68
+ fieldName: 'hotelAddress',
69
+ url: 'hotel-address',
70
+ label: 'Hotel address'
71
+ }
72
+ });
73
+
74
+ const newSection = (questionProps) => {
75
+ const questions = createQuestions(questionProps, questionClasses, {});
76
+
77
+ return new Section('test', 'test')
78
+ .addQuestion(questions.holidayActivities)
79
+ .addQuestion(questions.addInsurance)
80
+ .addQuestion(questions.travelInsuranceType)
81
+ .addQuestion(questions.holidayArrival)
82
+ .addQuestion(questions.hotelAddress);
83
+ };
84
+ const sectionStatus = (questionProps, answers = {}) => {
85
+ const section = newSection(questionProps);
86
+
87
+ const jr = new JourneyResponse('id-1', '', answers);
88
+ return section.getStatus(jr);
89
+ };
90
+
91
+ it('should be section=complete if no questions are required', () => {
92
+ const props = getQuestionProps();
93
+ assert.strictEqual(sectionStatus(props), SECTION_STATUS.COMPLETE);
94
+ });
95
+ it('should be section=not started if any question is required', () => {
96
+ const props = getQuestionProps();
97
+
98
+ // for each question, mark each one required one at a time
99
+ for (const key of Object.keys(props)) {
100
+ const copy = getQuestionProps();
101
+ copy[key].validators = [new RequiredValidator()];
102
+ assert.strictEqual(sectionStatus(copy), SECTION_STATUS.NOT_STARTED);
103
+ }
104
+ });
105
+ it('should treat date validator as required', () => {
106
+ const props = getQuestionProps();
107
+ props.holidayArrival.validators = [new DateValidator('My Date')];
108
+ assert.strictEqual(sectionStatus(props, {}), SECTION_STATUS.NOT_STARTED);
109
+ });
110
+ it('should treat address validator as required if there are required fields', () => {
111
+ const props = getQuestionProps();
112
+ props.hotelAddress.validators = [
113
+ new AddressValidator({
114
+ requiredFields: {
115
+ addressLine1: true,
116
+ addressLine2: false,
117
+ county: false,
118
+ townCity: false,
119
+ postcode: true
120
+ }
121
+ })
122
+ ];
123
+ assert.strictEqual(sectionStatus(props, {}), SECTION_STATUS.NOT_STARTED);
124
+ });
125
+ it('should not treat address validator as required if there are no required fields', () => {
126
+ const props = getQuestionProps();
127
+ props.hotelAddress.validators = [new AddressValidator()];
128
+ assert.strictEqual(sectionStatus(props, {}), SECTION_STATUS.COMPLETE);
129
+ });
130
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../../src/questions/question.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../../src/questions/question.js"],"names":[],"mappings":"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"}
@@ -40,7 +40,6 @@ export class AddressValidator extends BaseValidator {
40
40
  * @param {Question} questionObj
41
41
  */
42
42
  validate(questionObj: Question): import("express-validator").ValidationChain[];
43
- isRequired(): boolean;
44
43
  #private;
45
44
  }
46
45
  export default AddressValidator;
@@ -1 +1 @@
1
- {"version":3,"file":"address-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/address-validator.js"],"names":[],"mappings":"AAIO,4EAQN;AAGD,oCAAqC,GAAG,CAAC;AACzC,oCAAqC,CAAC,CAAC;AACvC,oCAAqC,GAAG,CAAC;AACzC,oCAAqC,CAAC,CAAC;AACvC,gCAAiC,GAAG,CAAC;AACrC,gCAAiC,CAAC,CAAC;AACnC,8BAA+B,GAAG,CAAC;AACnC,8BAA+B,CAAC,CAAC;AACjC,gCAAiC,CAAC,CAAC;AACnC,gCAAiC,CAAC,CAAC;AAEnC;;;GAGG;AACH;IACC;;;;OAIG;IACH,mBAFG;QAAqH,cAAc;0BAA5G,OAAO;0BAAgB,OAAO;sBAAY,OAAO;oBAAU,OAAO;sBAAY,OAAO;;KAAwB,EAKtI;IADA;sBAJyB,OAAO;sBAAgB,OAAO;kBAAY,OAAO;gBAAU,OAAO;kBAAY,OAAO;kBAIpE;IAG3C;;;OAGG;IACH,sBAFW,QAAQ,iDAYlB;IA+FD,sBAKC;;CACD;;0BA1JyB,qBAAqB"}
1
+ {"version":3,"file":"address-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/address-validator.js"],"names":[],"mappings":"AAIO,4EAQN;AAGD,oCAAqC,GAAG,CAAC;AACzC,oCAAqC,CAAC,CAAC;AACvC,oCAAqC,GAAG,CAAC;AACzC,oCAAqC,CAAC,CAAC;AACvC,gCAAiC,GAAG,CAAC;AACrC,gCAAiC,CAAC,CAAC;AACnC,8BAA+B,GAAG,CAAC;AACnC,8BAA+B,CAAC,CAAC;AACjC,gCAAiC,CAAC,CAAC;AACnC,gCAAiC,CAAC,CAAC;AAEnC;;;GAGG;AACH;IACC;;;;OAIG;IACH,mBAFG;QAAqH,cAAc;0BAA5G,OAAO;0BAAgB,OAAO;sBAAY,OAAO;oBAAU,OAAO;sBAAY,OAAO;;KAAwB,EAKtI;IADA;sBAJyB,OAAO;sBAAgB,OAAO;kBAAY,OAAO;gBAAU,OAAO;kBAAY,OAAO;kBAIpE;IAG3C;;;OAGG;IACH,sBAFW,QAAQ,iDAYlB;;CAqGD;;0BA1JyB,qBAAqB"}
@@ -7,6 +7,22 @@ export class BaseValidator {
7
7
  * @type {string} error message to display to user
8
8
  */
9
9
  errorMessage: string;
10
+ /**
11
+ * Validates response body against field validators.
12
+ * Subclasses must override this method.
13
+ * @abstract
14
+ * @param {import('../questions/question-props.js').QuestionProps} questionObj - The question object containing the fieldName to validate.
15
+ * @param {import('../journey/journey-response.js').JourneyResponse} [journeyResponse] - The current journey response (optional).
16
+ * @returns {import('express-validator').ValidationChain | import('express-validator').ValidationChain[]}
17
+ */
18
+ validate(questionObj: import("../questions/question-props.js").QuestionProps, journeyResponse?: import("../journey/journey-response.js").JourneyResponse): import("express-validator").ValidationChain | import("express-validator").ValidationChain[];
19
+ /**
20
+ * Should the question that this validator is configured with be treated as a required question?
21
+ *
22
+ * Validators should override this method as appropriate, implementing any custom required logic.
23
+ * For example, the AddressValidator is configurable and is required if any one field is required.
24
+ */
25
+ isRequired(): boolean;
10
26
  }
11
27
  export default BaseValidator;
12
28
  //# sourceMappingURL=base-validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/base-validator.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH;IACC;;OAEG;IACH,cAFU,MAAM,CAEH;CAOb"}
1
+ {"version":3,"file":"base-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/base-validator.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH;IACC;;OAEG;IACH,cAFU,MAAM,CAEH;IAQb;;;;;;;OAOG;IAEH,sBALW,OAAO,gCAAgC,EAAE,aAAa,oBACtD,OAAO,gCAAgC,EAAE,eAAe,GACtD,OAAO,mBAAmB,EAAE,eAAe,GAAG,OAAO,mBAAmB,EAAE,eAAe,EAAE,CAKvG;IAED;;;;;OAKG;IACH,sBAEC;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"date-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/date-validator.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;;;;GAIG;AAEH;;;GAGG;AACH;IAIC;;;;;OAKG;IACH,wBAJW,MAAM,2BACN,sBAAsB,kBACtB,MAAM,EAgChB;IAvCD,qCAAqC;IACrC,wBADW,sBAAsB,CACV;IAoBtB,uBAAmG;IACnG,uBAAmG;IACnG,yBAAyG;IACzG,wBAAsG;IACtG,4BAAkH;IAClH,2BAA+G;IAC/G,6BACuF;IACvF,6BACuF;IACvF,8BACyF;IACzF,6BACuF;IACvF,4BAAkH;IAClH,0BAA4G;IAK7G;;;OAGG;IACH,sBAFW,YAAY,iDAuGtB;;CA6BD;;;;;;;0BAjMyB,qBAAqB"}
1
+ {"version":3,"file":"date-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/date-validator.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;;;;GAIG;AAEH;;;GAGG;AACH;IAIC;;;;;OAKG;IACH,wBAJW,MAAM,2BACN,sBAAsB,kBACtB,MAAM,EAgChB;IAvCD,qCAAqC;IACrC,wBADW,sBAAsB,CACV;IAoBtB,uBAAmG;IACnG,uBAAmG;IACnG,yBAAyG;IACzG,wBAAsG;IACtG,4BAAkH;IAClH,2BAA+G;IAC/G,6BACuF;IACvF,6BACuF;IACvF,8BACyF;IACzF,6BACuF;IACvF,4BAAkH;IAClH,0BAA4G;IAS7G;;;OAGG;IACH,sBAFW,YAAY,iDAuGtB;;CA6BD;;;;;;;0BArMyB,qBAAqB"}
@@ -51,7 +51,6 @@ export class MultiFieldInputValidator extends BaseValidator {
51
51
  * validates response body against question's required fields
52
52
  */
53
53
  validate(): import("express-validator").ValidationChain[];
54
- isRequired(): boolean;
55
54
  /**
56
55
  * checks if a field is required
57
56
  * @param {string} fieldName
@@ -1 +1 @@
1
- {"version":3,"file":"multi-field-input-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/multi-field-input-validator.js"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;GAEG;AAEH;IACC;;;;OAIG;IACH,0CAHG;QAAyB,MAAM;QACP,eAAe;KAAC,EAQ1C;IAFA,gBAAoB;IACpB,wBAAwE;IAGzE;;OAEG;IAEH,0DA8BC;IAED,sBAEC;IACD;;;;OAIG;IACH,gCAHW,MAAM,GACJ,OAAO,CAQnB;CACD;;;WA3Ga,SAAS,MAAM;;;;;;;;;;;;eAkBf,MAAM;;;;;4BAOP,SAAS,GAAG;IACpB,QAAQ,EAAE,IAAI,CAAC;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;4BAIS,SAAS,GAAG;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;oBAIS,aAAa,GAAG,aAAa;0BA1ChB,qBAAqB"}
1
+ {"version":3,"file":"multi-field-input-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/multi-field-input-validator.js"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;GAEG;AAEH;IACC;;;;OAIG;IACH,0CAHG;QAAyB,MAAM;QACP,eAAe;KAAC,EAQ1C;IAFA,gBAAoB;IACpB,wBAAwE;IAGzE;;OAEG;IAEH,0DA8BC;IAKD;;;;OAIG;IACH,gCAHW,MAAM,GACJ,OAAO,CAQnB;CACD;;;WA3Ga,SAAS,MAAM;;;;;;;;;;;;eAkBf,MAAM;;;;;4BAOP,SAAS,GAAG;IACpB,QAAQ,EAAE,IAAI,CAAC;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;4BAIS,SAAS,GAAG;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;oBAIS,aAAa,GAAG,aAAa;0BA1ChB,qBAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"required-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/required-validator.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;GAGG;AACH;IAMC;;;OAGG;IACH,2BAFW,MAAM,EAQhB;IAED;;;OAGG;IACH,sBAFW,QAAQ,+CAIlB;CACD;;;0BAnCyB,qBAAqB"}
1
+ {"version":3,"file":"required-validator.d.ts","sourceRoot":"","sources":["../../../src/validator/required-validator.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;GAGG;AACH;IAMC;;;OAGG;IACH,2BAFW,MAAM,EAQhB;IAED;;;OAGG;IACH,sBAFW,QAAQ,+CAIlB;CAKD;;;0BAvCyB,qBAAqB"}