@ukhomeoffice/formio-gds-template 2.0.2 → 3.0.0-bravo

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/.github/workflows/build-and-test.yml +3 -3
  2. package/LICENCE.md +21 -0
  3. package/README.md +8 -0
  4. package/eslint.config.mjs +59 -0
  5. package/lib/components/datamap/GDSDataMap.d.ts +5 -14
  6. package/lib/components/datamap/GDSDataMap.d.ts.map +1 -0
  7. package/lib/components/datamap/GDSDataMap.js +9 -29
  8. package/lib/components/datetime/GDSDatetimeComponent.d.ts +43 -22
  9. package/lib/components/datetime/GDSDatetimeComponent.d.ts.map +1 -0
  10. package/lib/components/datetime/GDSDatetimeComponent.js +167 -178
  11. package/lib/components/index.d.ts +3 -0
  12. package/lib/components/index.d.ts.map +1 -0
  13. package/lib/components/index.js +6 -4
  14. package/lib/components/select/GDSSelect.d.ts +143 -0
  15. package/lib/components/select/GDSSelect.d.ts.map +1 -0
  16. package/lib/components/select/GDSSelect.js +340 -0
  17. package/lib/components/selectboxes/GDSCheckBoxes.d.ts +5 -2
  18. package/lib/components/selectboxes/GDSCheckBoxes.d.ts.map +1 -0
  19. package/lib/components/selectboxes/GDSCheckBoxes.js +7 -33
  20. package/lib/components/time/GDSTimeComponent.d.ts +13 -10
  21. package/lib/components/time/GDSTimeComponent.d.ts.map +1 -0
  22. package/lib/components/time/GDSTimeComponent.js +59 -84
  23. package/lib/components/util/TimeHelper.d.ts +6 -4
  24. package/lib/components/util/TimeHelper.d.ts.map +1 -0
  25. package/lib/components/util/TimeHelper.js +13 -16
  26. package/lib/index.d.ts +4 -2
  27. package/lib/index.d.ts.map +1 -0
  28. package/lib/index.js +2 -2
  29. package/lib/templates/gds/button/index.d.ts +1 -0
  30. package/lib/templates/gds/button/index.d.ts.map +1 -0
  31. package/lib/templates/gds/button/index.js +1 -1
  32. package/lib/templates/gds/checkbox/index.d.ts +1 -0
  33. package/lib/templates/gds/checkbox/index.d.ts.map +1 -0
  34. package/lib/templates/gds/checkbox/index.js +1 -1
  35. package/lib/templates/gds/columns/index.d.ts +1 -0
  36. package/lib/templates/gds/columns/index.d.ts.map +1 -0
  37. package/lib/templates/gds/columns/index.js +1 -1
  38. package/lib/templates/gds/component/index.d.ts +1 -0
  39. package/lib/templates/gds/component/index.d.ts.map +1 -0
  40. package/lib/templates/gds/component/index.js +1 -1
  41. package/lib/templates/gds/container/index.d.ts +1 -0
  42. package/lib/templates/gds/container/index.d.ts.map +1 -0
  43. package/lib/templates/gds/container/index.js +1 -1
  44. package/lib/templates/gds/cssClasses.d.ts +1 -0
  45. package/lib/templates/gds/cssClasses.d.ts.map +1 -0
  46. package/lib/templates/gds/datagrid/form.ejs.js +2 -2
  47. package/lib/templates/gds/datagrid/index.d.ts +1 -0
  48. package/lib/templates/gds/datagrid/index.d.ts.map +1 -0
  49. package/lib/templates/gds/datagrid/index.js +1 -1
  50. package/lib/templates/gds/datamap/index.d.ts +1 -0
  51. package/lib/templates/gds/datamap/index.d.ts.map +1 -0
  52. package/lib/templates/gds/datamap/index.js +1 -1
  53. package/lib/templates/gds/datetime/index.d.ts +1 -0
  54. package/lib/templates/gds/datetime/index.d.ts.map +1 -0
  55. package/lib/templates/gds/datetime/index.js +1 -1
  56. package/lib/templates/gds/day/index.d.ts +1 -0
  57. package/lib/templates/gds/day/index.d.ts.map +1 -0
  58. package/lib/templates/gds/day/index.js +1 -1
  59. package/lib/templates/gds/editgrid/index.d.ts +1 -0
  60. package/lib/templates/gds/editgrid/index.d.ts.map +1 -0
  61. package/lib/templates/gds/editgrid/index.js +1 -1
  62. package/lib/templates/gds/field/index.d.ts +1 -0
  63. package/lib/templates/gds/field/index.d.ts.map +1 -0
  64. package/lib/templates/gds/field/index.js +1 -1
  65. package/lib/templates/gds/fieldset/index.d.ts +1 -0
  66. package/lib/templates/gds/fieldset/index.d.ts.map +1 -0
  67. package/lib/templates/gds/fieldset/index.js +1 -1
  68. package/lib/templates/gds/file/index.d.ts +1 -0
  69. package/lib/templates/gds/file/index.d.ts.map +1 -0
  70. package/lib/templates/gds/file/index.js +1 -1
  71. package/lib/templates/gds/iconClass.d.ts +2 -1
  72. package/lib/templates/gds/iconClass.d.ts.map +1 -0
  73. package/lib/templates/gds/iconClass.js +3 -3
  74. package/lib/templates/gds/index.d.ts +3 -2
  75. package/lib/templates/gds/index.d.ts.map +1 -0
  76. package/lib/templates/gds/index.js +72 -64
  77. package/lib/templates/gds/input/index.d.ts +1 -0
  78. package/lib/templates/gds/input/index.d.ts.map +1 -0
  79. package/lib/templates/gds/input/index.js +1 -1
  80. package/lib/templates/gds/label/index.d.ts +1 -0
  81. package/lib/templates/gds/label/index.d.ts.map +1 -0
  82. package/lib/templates/gds/label/index.js +1 -1
  83. package/lib/templates/gds/message/index.d.ts +1 -0
  84. package/lib/templates/gds/message/index.d.ts.map +1 -0
  85. package/lib/templates/gds/message/index.js +1 -1
  86. package/lib/templates/gds/panel/index.d.ts +1 -0
  87. package/lib/templates/gds/panel/index.d.ts.map +1 -0
  88. package/lib/templates/gds/panel/index.js +1 -1
  89. package/lib/templates/gds/radio/index.d.ts +1 -0
  90. package/lib/templates/gds/radio/index.d.ts.map +1 -0
  91. package/lib/templates/gds/radio/index.js +1 -1
  92. package/lib/templates/gds/select/index.d.ts +1 -0
  93. package/lib/templates/gds/select/index.d.ts.map +1 -0
  94. package/lib/templates/gds/select/index.js +1 -1
  95. package/lib/templates/gds/selectOption/index.d.ts +1 -0
  96. package/lib/templates/gds/selectOption/index.d.ts.map +1 -0
  97. package/lib/templates/gds/selectOption/index.js +1 -1
  98. package/lib/templates/gds/selectboxes/index.d.ts +1 -0
  99. package/lib/templates/gds/selectboxes/index.d.ts.map +1 -0
  100. package/lib/templates/gds/selectboxes/index.js +1 -1
  101. package/lib/templates/gds/survey/index.d.ts +1 -0
  102. package/lib/templates/gds/survey/index.d.ts.map +1 -0
  103. package/lib/templates/gds/survey/index.js +1 -1
  104. package/lib/templates/gds/tab/index.d.ts +1 -0
  105. package/lib/templates/gds/tab/index.d.ts.map +1 -0
  106. package/lib/templates/gds/tab/index.js +1 -1
  107. package/lib/templates/gds/table/index.d.ts +1 -0
  108. package/lib/templates/gds/table/index.d.ts.map +1 -0
  109. package/lib/templates/gds/table/index.js +1 -1
  110. package/lib/templates/gds/template.css +27 -0
  111. package/lib/templates/gds/template.css.map +1 -1
  112. package/lib/templates/gds/time/index.d.ts +1 -0
  113. package/lib/templates/gds/time/index.d.ts.map +1 -0
  114. package/lib/templates/gds/time/index.js +1 -1
  115. package/lib/templates/gds/warning/index.d.ts +1 -0
  116. package/lib/templates/gds/warning/index.d.ts.map +1 -0
  117. package/lib/templates/gds/warning/index.js +1 -1
  118. package/lib/templates/gds/wizard/index.d.ts +1 -0
  119. package/lib/templates/gds/wizard/index.d.ts.map +1 -0
  120. package/lib/templates/gds/wizard/index.js +1 -1
  121. package/lib/templates/gds/wizardHeader/index.d.ts +1 -0
  122. package/lib/templates/gds/wizardHeader/index.d.ts.map +1 -0
  123. package/lib/templates/gds/wizardHeader/index.js +1 -1
  124. package/lib/templates/gds/wizardNav/index.d.ts +1 -0
  125. package/lib/templates/gds/wizardNav/index.d.ts.map +1 -0
  126. package/lib/templates/gds/wizardNav/index.js +1 -1
  127. package/lib/templates/index.d.ts +3 -2
  128. package/lib/templates/index.d.ts.map +1 -0
  129. package/lib/templates/index.js +1 -1
  130. package/lib/types.d.ts +37 -0
  131. package/lib/types.d.ts.map +1 -0
  132. package/lib/types.js +2 -0
  133. package/package.json +14 -7
  134. package/src/components/datamap/GDSDataMap.ts +5 -14
  135. package/src/components/datetime/GDSDatetimeComponent.ts +128 -91
  136. package/src/components/index.ts +2 -0
  137. package/src/components/select/GDSSelect.spec.ts +538 -0
  138. package/src/components/select/GDSSelect.ts +418 -0
  139. package/src/components/selectboxes/GDSCheckBoxes.ts +7 -8
  140. package/src/components/time/GDSTimeComponent.ts +37 -27
  141. package/src/components/util/TimeHelper.ts +6 -5
  142. package/src/css.d.ts +4 -0
  143. package/src/templates/gds/datagrid/form.ejs +1 -2
  144. package/src/templates/gds/iconClass.ts +1 -1
  145. package/src/templates/gds/index.ts +43 -33
  146. package/src/templates/gds/template.scss +48 -1
  147. package/src/types.ts +56 -0
  148. package/tsconfig.json +21 -5
  149. package/webpack.config.js +1 -1
  150. package/tslint.json +0 -22
@@ -31,46 +31,56 @@ import wizard from './wizard';
31
31
  import wizardHeader from './wizardHeader';
32
32
  import wizardNav from './wizardNav';
33
33
 
34
+ // Unwrap CJS default exports to handle ESM/CJS interop in Vite.
35
+ // Uses a generic so the return type matches the input type — no `any` needed.
36
+ const unwrap = <T>(mod: T | { default: T }): T =>
37
+ (mod !== null && typeof mod === 'object' && 'default' in (mod as object))
38
+ ? (mod as { default: T }).default
39
+ : (mod as T);
40
+
34
41
  export default {
35
- transform(type, text) {
42
+ transform(type: string, text: string): string {
36
43
  if (!text) {
37
44
  return text;
38
45
  }
39
46
  if (type === 'class') {
40
- return this.cssClasses.hasOwnProperty(text.toString()) ? this.cssClasses[text.toString()] : text;
47
+ const key = text.toString();
48
+ return Object.prototype.hasOwnProperty.call(this.cssClasses, key)
49
+ ? this.cssClasses[key as keyof typeof this.cssClasses]
50
+ : text;
41
51
  }
42
52
  return text;
43
53
  },
44
54
  defaultIconset: 'fa',
45
- iconClass,
46
- cssClasses,
47
- button,
48
- checkbox,
49
- columns,
50
- component,
51
- container,
52
- datetime,
53
- day,
54
- datagrid,
55
- datamap,
56
- input,
57
- editgrid,
58
- field,
59
- file,
60
- fieldset,
61
- label,
62
- message,
63
- panel,
64
- radio,
65
- select,
66
- selectboxes,
67
- selectOption,
68
- survey,
69
- table,
70
- tab,
71
- time,
72
- warning,
73
- wizard,
74
- wizardHeader,
75
- wizardNav,
55
+ iconClass: unwrap(iconClass),
56
+ cssClasses: unwrap(cssClasses),
57
+ button: unwrap(button),
58
+ checkbox: unwrap(checkbox),
59
+ columns: unwrap(columns),
60
+ component: unwrap(component),
61
+ container: unwrap(container),
62
+ datetime: unwrap(datetime),
63
+ day: unwrap(day),
64
+ datagrid: unwrap(datagrid),
65
+ datamap: unwrap(datamap),
66
+ input: unwrap(input),
67
+ editgrid: unwrap(editgrid),
68
+ field: unwrap(field),
69
+ file: unwrap(file),
70
+ fieldset: unwrap(fieldset),
71
+ label: unwrap(label),
72
+ message: unwrap(message),
73
+ panel: unwrap(panel),
74
+ radio: unwrap(radio),
75
+ select: unwrap(select),
76
+ selectboxes: unwrap(selectboxes),
77
+ selectOption: unwrap(selectOption),
78
+ survey: unwrap(survey),
79
+ table: unwrap(table),
80
+ tab: unwrap(tab),
81
+ time: unwrap(time),
82
+ warning: unwrap(warning),
83
+ wizard: unwrap(wizard),
84
+ wizardHeader: unwrap(wizardHeader),
85
+ wizardNav: unwrap(wizardNav),
76
86
  };
@@ -82,6 +82,36 @@
82
82
 
83
83
  .govuk-details {
84
84
  margin-bottom: 0 !important;
85
+
86
+ // govuk-frontend@5.x sets font-weight:bold on the summary — reset to normal
87
+ &__summary {
88
+ font-weight: 400 !important;
89
+ }
90
+
91
+ &__summary-text,
92
+ &__summary:hover &__summary-text {
93
+ text-decoration: none;
94
+ }
95
+ }
96
+
97
+ // @formio/js@5.x injects error messages into messageContainer on container components
98
+ // (datagrid, editgrid, datamap, panel) which causes double error messages since child
99
+ // components already show their own errors. Hide the outer messageContainer for these types.
100
+ .formio-component-datagrid,
101
+ .formio-component-editgrid,
102
+ .formio-component-datamap,
103
+ .formio-component-panel,
104
+ .formio-component-container,
105
+ .formio-component-fieldset {
106
+ > [ref="messageContainer"] {
107
+ display: none;
108
+ }
109
+ }
110
+
111
+ // Form.io keeps conditionally hidden components in the DOM. Remove their
112
+ // layout contribution as well as their contents.
113
+ .formio-hidden {
114
+ display: none !important;
85
115
  }
86
116
 
87
117
  .small-button {
@@ -108,6 +138,13 @@
108
138
  border-top: none
109
139
  }
110
140
 
141
+ // GOV.UK grid rows use negative side margins to offset column padding. In a
142
+ // Form.io datagrid those margins can otherwise create a horizontal scroll area
143
+ // on the tbody at fractional browser zoom levels.
144
+ .datagrid-tbody {
145
+ overflow-x: hidden;
146
+ }
147
+
111
148
  .gov-accordion-no-bottom {
112
149
  border-bottom: none !important;
113
150
  }
@@ -144,4 +181,14 @@
144
181
 
145
182
  .govuk-select.auto-height {
146
183
  height: auto;
147
- }
184
+ }
185
+
186
+ // govuk-frontend@5.4+ sets overflow:clip (with auto visible fallback) on
187
+ // .govuk-form-group--error to contain the error border. This clips the focus
188
+ // rings and left borders of nested formio child components. Reset it so
189
+ // nested form groups are never clipped.
190
+ .govuk-form-group--error {
191
+ .govuk-form-group {
192
+ overflow: visible;
193
+ }
194
+ }
package/src/types.ts ADDED
@@ -0,0 +1,56 @@
1
+ import type {
2
+ DayComponent,
3
+ DateTimeComponent,
4
+ TimeComponent as CoreTimeComponent,
5
+ SelectBoxesComponent,
6
+ DataMapComponent,
7
+ SelectComponent,
8
+ } from '@formio/core';
9
+
10
+ /**
11
+ * Minimal interface for DOM input-like elements.
12
+ * Used as the typed parameter in TimeHelper methods so callers can pass any
13
+ * object that has a writable `.value: string` (e.g. HTMLInputElement).
14
+ */
15
+ export interface InputElementLike {
16
+ value: string;
17
+ }
18
+
19
+ /**
20
+ * The shape of a single GDS date/time field definition.
21
+ * Extends the base formio field definition with an optional placeholder.
22
+ */
23
+ export type GDSFieldDefinition = {
24
+ type?: string;
25
+ placeholder?: string;
26
+ required?: boolean;
27
+ };
28
+
29
+ /**
30
+ * Component schema for GDSDatetimeComponent.
31
+ *
32
+ * GDSDatetimeComponent extends the formio Day component but adds hour/minute
33
+ * fields (from a datetime hybrid) and uses datePicker / defaultDate from
34
+ * DateTimeComponent. This type captures the full shape of `this.component`
35
+ * as used in GDSDatetimeComponent.
36
+ */
37
+ export type GDSDatetimeComponentSchema =
38
+ // Omit `suffix` from the base so our wider `string | null` declaration wins
39
+ // the intersection (BaseComponent declares `suffix?: string`, which would
40
+ // collapse `string | null` back to `string` in a plain &-intersection).
41
+ // Also omit `fields` so we can extend it with hour/minute below.
42
+ Omit<DayComponent, 'suffix' | 'fields'> &
43
+ Pick<DateTimeComponent, 'datePicker' | 'defaultDate'> & {
44
+ /** suffix is set to null in init() — null must be allowed */
45
+ suffix?: string | null;
46
+ /** fields extended with GDS hour/minute additions */
47
+ fields: DayComponent['fields'] & {
48
+ hour?: GDSFieldDefinition;
49
+ minute?: GDSFieldDefinition;
50
+ };
51
+ };
52
+
53
+ // Re-export @formio/core schema types used as `declare component` overrides
54
+ // in each GDS component class. Aliased to avoid colliding with the @formio/js
55
+ // runtime class variables (e.g. `const Time = Components.components.time`).
56
+ export type { CoreTimeComponent, SelectBoxesComponent, DataMapComponent, SelectComponent };
package/tsconfig.json CHANGED
@@ -1,14 +1,30 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "es5",
4
- "module": "commonjs",
3
+ "target": "es2018",
4
+ "lib": ["es2018", "dom"],
5
+ "module": "nodenext",
6
+ "moduleResolution": "nodenext",
5
7
  "preserveConstEnums": true,
6
8
  "outDir": "lib",
7
- "noImplicitAny": false,
8
- "sourceMap": false,
9
9
  "declaration": true,
10
+ "declarationMap": true,
11
+ "sourceMap": false,
10
12
  "rootDir": "src",
11
- "esModuleInterop": true
13
+ "esModuleInterop": true,
14
+ "skipLibCheck": true,
15
+ "strict": true,
16
+ "noImplicitAny": true,
17
+ "strictNullChecks": true,
18
+ "strictFunctionTypes": true,
19
+ "strictBindCallApply": true,
20
+ "strictPropertyInitialization": true,
21
+ "noImplicitThis": true,
22
+ "alwaysStrict": true,
23
+ "useUnknownInCatchVariables": true,
24
+ "noUnusedLocals": true,
25
+ "noUnusedParameters": true,
26
+ "noImplicitReturns": true,
27
+ "noFallthroughCasesInSwitch": true
12
28
  },
13
29
  "include": [
14
30
  "src/*.ts",
package/webpack.config.js CHANGED
@@ -10,7 +10,7 @@ module.exports = {
10
10
  filename: 'gds.js',
11
11
  },
12
12
  externals: {
13
- formiojs: 'Formio'
13
+ '@formio/js': 'Formio'
14
14
  },
15
15
  module: {
16
16
  rules: [
package/tslint.json DELETED
@@ -1,22 +0,0 @@
1
- {
2
- "defaultSeverity": "error",
3
- "extends": [
4
- "tslint:recommended"
5
- ],
6
- "jsRules": {},
7
- "rules": {
8
- "quotemark": [true, "single", "avoid-escape", "avoid-template"],
9
- "one-line": [false, "check-catch", "check-finally", "check-else"],
10
- "object-literal-sort-keys": false,
11
- "no-shadowed-variable": false,
12
- "variable-name": {
13
- "options": [
14
- "allow-leading-underscore",
15
- "allow-pascal-case",
16
- "ban-keywords"
17
- ]
18
- },
19
- "max-classes-per-file": [false]
20
- },
21
- "rulesDirectory": []
22
- }