@abgov/jsonforms-components 0.0.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.
Files changed (75) hide show
  1. package/.babelrc +12 -0
  2. package/.eslintrc.json +36 -0
  3. package/.releaserc.json +25 -0
  4. package/README.md +251 -0
  5. package/jest.config.ts +11 -0
  6. package/package.json +17 -0
  7. package/project.json +55 -0
  8. package/rollup.config.js +14 -0
  9. package/src/index.ts +166 -0
  10. package/src/lib/Additional/HelpContent.tsx +95 -0
  11. package/src/lib/Additional/index.ts +1 -0
  12. package/src/lib/Additional/styled-components.ts +27 -0
  13. package/src/lib/Cells/DateCell.tsx +10 -0
  14. package/src/lib/Cells/IntegerCell.tsx +10 -0
  15. package/src/lib/Cells/NumberCell.tsx +10 -0
  16. package/src/lib/Cells/TextCell.tsx +10 -0
  17. package/src/lib/Cells/TimeCell.tsx +10 -0
  18. package/src/lib/Cells/index.tsx +14 -0
  19. package/src/lib/Context/index.tsx +172 -0
  20. package/src/lib/Controls/FileUploader/ContextMenu.tsx +50 -0
  21. package/src/lib/Controls/FileUploader/FileUploaderControl.tsx +131 -0
  22. package/src/lib/Controls/FileUploader/FileUploaderTester.tsx +3 -0
  23. package/src/lib/Controls/FileUploader/index.tsx +2 -0
  24. package/src/lib/Controls/FileUploader/styled-components.tsx +10 -0
  25. package/src/lib/Controls/FormStepper/FormStepperControl.tsx +269 -0
  26. package/src/lib/Controls/FormStepper/FormStepperTester.tsx +22 -0
  27. package/src/lib/Controls/FormStepper/index.tsx +2 -0
  28. package/src/lib/Controls/FormStepper/styled-components.tsx +17 -0
  29. package/src/lib/Controls/Inputs/InputBaseControl.tsx +52 -0
  30. package/src/lib/Controls/Inputs/InputBooleanControl.tsx +67 -0
  31. package/src/lib/Controls/Inputs/InputBooleanRadioControl.tsx +74 -0
  32. package/src/lib/Controls/Inputs/InputDateControl.tsx +90 -0
  33. package/src/lib/Controls/Inputs/InputDateTimeControl.tsx +46 -0
  34. package/src/lib/Controls/Inputs/InputEnum.tsx +74 -0
  35. package/src/lib/Controls/Inputs/InputEnumAutoComplete.tsx +73 -0
  36. package/src/lib/Controls/Inputs/InputEnumRadios.tsx +43 -0
  37. package/src/lib/Controls/Inputs/InputIntegerControl.tsx +63 -0
  38. package/src/lib/Controls/Inputs/InputMultiLineTextControl.tsx +63 -0
  39. package/src/lib/Controls/Inputs/InputNumberControl.tsx +63 -0
  40. package/src/lib/Controls/Inputs/InputTextControl.tsx +62 -0
  41. package/src/lib/Controls/Inputs/InputTimeControl.tsx +46 -0
  42. package/src/lib/Controls/Inputs/index.tsx +13 -0
  43. package/src/lib/Controls/Inputs/inputControl.spec.ts +84 -0
  44. package/src/lib/Controls/Inputs/type.ts +3 -0
  45. package/src/lib/Controls/ObjectArray/DeleteDialog.tsx +49 -0
  46. package/src/lib/Controls/ObjectArray/ObjectArray.tsx +59 -0
  47. package/src/lib/Controls/ObjectArray/ObjectArrayToolBar.tsx +51 -0
  48. package/src/lib/Controls/ObjectArray/ObjectListControl.tsx +368 -0
  49. package/src/lib/Controls/ObjectArray/index.tsx +1 -0
  50. package/src/lib/Controls/ObjectArray/styled-components.tsx +13 -0
  51. package/src/lib/Controls/index.tsx +4 -0
  52. package/src/lib/ErrorHandling/GoAErrorControl.tsx +53 -0
  53. package/src/lib/ErrorHandling/MessageControl.tsx +19 -0
  54. package/src/lib/ErrorHandling/categorizationValidation.spec.ts +98 -0
  55. package/src/lib/ErrorHandling/controlValildation.spec.ts +57 -0
  56. package/src/lib/ErrorHandling/errorCheck.spec.ts +185 -0
  57. package/src/lib/ErrorHandling/errorCheck.tsx +86 -0
  58. package/src/lib/ErrorHandling/layoutValildation.spec.ts +47 -0
  59. package/src/lib/ErrorHandling/otherValildation.spec.ts +74 -0
  60. package/src/lib/ErrorHandling/schemaValidation.ts +115 -0
  61. package/src/lib/common/Grid.tsx +55 -0
  62. package/src/lib/jsonforms-components.module.scss +7 -0
  63. package/src/lib/jsonforms-components.spec.tsx +10 -0
  64. package/src/lib/jsonforms-components.tsx +14 -0
  65. package/src/lib/layouts/GroupControl.tsx +25 -0
  66. package/src/lib/layouts/HorizontalLayoutControl.tsx +30 -0
  67. package/src/lib/layouts/VerticalLayoutControl.tsx +28 -0
  68. package/src/lib/layouts/index.ts +3 -0
  69. package/src/lib/util/layout.tsx +68 -0
  70. package/src/lib/util/schemaUtils.ts +9 -0
  71. package/src/lib/util/stringUtils.ts +98 -0
  72. package/src/lib/util/style-component.ts +8 -0
  73. package/tsconfig.json +20 -0
  74. package/tsconfig.lib.json +19 -0
  75. package/tsconfig.spec.json +20 -0
package/.babelrc ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "presets": [
3
+ [
4
+ "@nx/react/babel",
5
+ {
6
+ "runtime": "automatic",
7
+ "useBuiltIns": "usage"
8
+ }
9
+ ]
10
+ ],
11
+ "plugins": []
12
+ }
package/.eslintrc.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "extends": ["plugin:@nx/react", "../../.eslintrc.json"],
3
+ "ignorePatterns": ["!**/*"],
4
+ "overrides": [
5
+ {
6
+ "files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
7
+ "rules": {}
8
+ },
9
+ {
10
+ "files": ["*.ts", "*.tsx"],
11
+ "rules": {}
12
+ },
13
+ {
14
+ "files": ["*.js", "*.jsx"],
15
+ "rules": {}
16
+ },
17
+ {
18
+ "files": ["*.json"],
19
+ "parser": "jsonc-eslint-parser",
20
+ "rules": {
21
+ "@nx/dependency-checks": [
22
+ "error",
23
+ {
24
+ "ignoredDependencies": [
25
+ "@abgov/react-components",
26
+ "@abgov/react-components-new"
27
+ ],
28
+ "ignoredFiles": [
29
+ "libs/jsonforms-components/rollup.config.js"
30
+ ]
31
+ }
32
+ ]
33
+ }
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "extends": "../../.releaserc.json",
3
+ "tagFormat": "jsonforms-components-v${version}",
4
+ "plugins": [
5
+ [
6
+ "@abgov/nx-release",
7
+ {
8
+ "project": "jsonforms-components"
9
+ }
10
+ ],
11
+ [
12
+ "@semantic-release/npm",
13
+ {
14
+ "pkgRoot": "dist/libs/jsonforms-components"
15
+ }
16
+ ],
17
+ [
18
+ "@semantic-release/github",
19
+ {
20
+ "releasedLabels": false,
21
+ "successComment": false
22
+ }
23
+ ]
24
+ ]
25
+ }
package/README.md ADDED
@@ -0,0 +1,251 @@
1
+ # jsonforms-components
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test jsonforms-components` to execute the unit tests via [Jest](https://jestjs.io).
8
+
9
+ # Folder hierarchy
10
+
11
+ ```
12
+ - src
13
+ - lib
14
+ - GoARenders
15
+ - <GoAComponent A Reducer>
16
+ ...
17
+ - <GoAComponent B Reducer>
18
+ ...
19
+ ```
20
+
21
+ # GoA UI component JSON Forms UI Schema
22
+
23
+ [UI Schema](https://jsonforms.io/docs/uischema) in the JSON Forms defines the general layout of the forms generated. @abgov/jsonforms-components lib integrates the [GoA UI components](https://github.com/GovAlta/ui-components) form components by extending the "options" attribute in the UI Schema. Take GoAInput UI Schema as example:
24
+
25
+ ```
26
+ {
27
+ "type": "Control",
28
+ "scope": "#/properties/name",
29
+ "options": {
30
+ "GoAInput": {
31
+ "name": "Name",
32
+ "label": "Name",
33
+ "testId": ""
34
+ ...
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ The presence of the "GoAInput" indicates we are going to use the GoAInput to render the input. The attributes in the "GoAInput" will be passed to the GoAInput as component properties.
41
+
42
+ # JsonFormContextInstance
43
+
44
+ To use the package, and the context surrounding it, it's best to import JsonFormContextInstance attach data to it
45
+
46
+ Here are some sample api endpoints that work currently.
47
+
48
+ ```
49
+
50
+ import { JsonFormContextInstance } from '@abgov/jsonforms-components';
51
+
52
+
53
+ useEffect(() => {
54
+ JsonFormContextInstance.addDataByUrl('dog-list', 'https://dog.ceo/api/breeds/list/all', processDogs);
55
+ JsonFormContextInstance.addDataByUrl(
56
+ 'basketball-players',
57
+ 'https://www.balldontlie.io/api/v1/players',
58
+ processPlayers
59
+ );
60
+ JsonFormContextInstance.addDataByUrl(
61
+ 'car-brands',
62
+ 'https://parallelum.com.br/fipe/api/v1/carros/marcas',
63
+ processCarBrands
64
+ );
65
+
66
+ JsonFormContextInstance.addData(
67
+ 'countries',
68
+ Countries.map((country) => country.country)
69
+ );
70
+
71
+ }, []);
72
+
73
+ function processDogs(rawData): string[] {
74
+ return Object.keys(rawData.message);
75
+ }
76
+ function processPlayers(rawData): string[] {
77
+ return rawData.data.map((player) => `${player.first_name} ${player.last_name}`);
78
+ }
79
+ function processCarBrands(rawData): string[] {
80
+ return rawData.map((brand) => brand.nome);
81
+ }
82
+
83
+ ```
84
+
85
+ Once you add them, you can add the following to any UI Schema control to create a dropdown that displays them
86
+
87
+ ```
88
+ "type": "Control",
89
+ "scope": "#/properties/carBrands",
90
+ "options": {
91
+ "enumContext": {
92
+ "key": "car-brands",
93
+ ```
94
+
95
+ You also need to add the following to the data schema
96
+
97
+ ```
98
+ "carBrands": {
99
+ "type": "string",
100
+ "enum": [
101
+ ""
102
+ ]
103
+ }
104
+ ```
105
+
106
+ # Schemas only with no code changes
107
+
108
+ To access the apis without making any code changes to add an api,
109
+
110
+ ```
111
+ import { JsonFormContextInstance } from '@abgov/jsonforms-components';
112
+
113
+ const { jsonFormContext, baseEnumerator } = JsonFormContextInstance;
114
+
115
+ return(
116
+ <jsonFormContext.Provider value={baseEnumerator}>
117
+ <JsonForms
118
+ schema={...}
119
+ uischema={...}
120
+ ...
121
+ />
122
+ />
123
+ )
124
+ ```
125
+
126
+ Data Schema
127
+
128
+ ```
129
+ "carBrands": {
130
+ "type": "string",
131
+ "enum": [
132
+ ""
133
+ ]
134
+ },
135
+ "countries": {
136
+ "type": "string",
137
+ "enum": [
138
+ ""
139
+ ]
140
+ },
141
+ "dogBreeds": {
142
+ "type": "string",
143
+ "enum": [
144
+ ""
145
+ ]
146
+ },
147
+ "basketballPlayers": {
148
+ "type": "string",
149
+ "enum": [
150
+ ""
151
+ ]
152
+ }
153
+ ```
154
+
155
+ Ui Schema
156
+
157
+ ```
158
+ {
159
+ "type": "HorizontalLayout",
160
+ "elements": [
161
+ {
162
+ "type": "Control",
163
+ "scope": "#/properties/carBrands",
164
+ "options": {
165
+ "enumContext": {
166
+ "key": "car-brands",
167
+ "url": "https://parallelum.com.br/fipe/api/v1/carros/marcas",
168
+ "values": "nome"
169
+ }
170
+ }
171
+ },
172
+ {
173
+ "type": "Control",
174
+ "scope": "#/properties/dogBreeds",
175
+ "options": {
176
+ "enumContext": {
177
+ "key": "dog-list",
178
+ "url": "https://dog.ceo/api/breeds/list/all",
179
+ "location": "message",
180
+ "type": "keys"
181
+ }
182
+ }
183
+ },
184
+ {
185
+ "type": "Control",
186
+ "scope": "#/properties/basketballPlayers",
187
+ "options": {
188
+ "enumContext": {
189
+ "key": "basketball-players",
190
+ "location": "data",
191
+ "url": "https://www.balldontlie.io/api/v1/players",
192
+ "values": [
193
+ "first_name",
194
+ "last_name"
195
+ ]
196
+ }
197
+ }
198
+ },
199
+ {
200
+ "type": "Control",
201
+ "scope": "#/properties/countries",
202
+ "options": {
203
+ "enumContext": {
204
+ "key": "countries"
205
+ }
206
+ }
207
+ }
208
+ ]
209
+ }
210
+ ```
211
+
212
+ Countries in this example comes locally.
213
+
214
+ ```
215
+ import Countries from './countries';
216
+
217
+ --------
218
+
219
+ export default [
220
+ { country: 'Russia', land_mass_km2: 17098242 },
221
+ { country: 'Canada', land_mass_km2: 9976140 },
222
+ ...
223
+ ]
224
+ ```
225
+
226
+ Another way to add data to ContextProvider (optional)
227
+
228
+ ```
229
+ const animals = {
230
+ animals: [
231
+ { name: 'Elephant', type: 'Mammal', habitat: 'Land' },
232
+ { name: 'Penguin', type: 'Bird', habitat: 'Ice' },
233
+ { name: 'Kangaroo', type: 'Mammal', habitat: 'Grasslands' },
234
+ { name: 'Giraffe', type: 'Mammal', habitat: 'Savanna' },
235
+ { name: 'Octopus', type: 'Invertebrate', habitat: 'Ocean' },
236
+ { name: 'Cheetah', type: 'Mammal', habitat: 'Grasslands' },
237
+ { name: 'Koala', type: 'Mammal', habitat: 'Eucalyptus Forest' },
238
+ { name: 'Toucan', type: 'Bird', habitat: 'Rainforest' },
239
+ { name: 'Dolphin', type: 'Mammal', habitat: 'Ocean' },
240
+ { name: 'Arctic Fox', type: 'Mammal', habitat: 'Arctic Tundra' },
241
+ ],
242
+ };
243
+
244
+
245
+ <ContextProvider data={[{ animals }]}
246
+ <JsonForms
247
+ ...
248
+ </>
249
+ </ContextProvider>
250
+
251
+ ```
package/jest.config.ts ADDED
@@ -0,0 +1,11 @@
1
+ /* eslint-disable */
2
+ export default {
3
+ displayName: 'jsonforms-components',
4
+ preset: '../../jest.preset.js',
5
+ transform: {
6
+ '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nx/react/plugins/jest',
7
+ '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nx/react/babel'] }],
8
+ },
9
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
10
+ coverageDirectory: '../../coverage/libs/jsonforms-components',
11
+ };
package/package.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@abgov/jsonforms-components",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@abgov/react-components": "^4.18.1",
6
+ "@jsonforms/core": "^3.1.0",
7
+ "@jsonforms/material-renderers": "^3.1.0",
8
+ "@jsonforms/react": "^3.1.0",
9
+ "@mui/material": "^5.15.10",
10
+ "react": "^18.0.0"
11
+ },
12
+ "dependencies": {
13
+ "axios": "^1.6.7",
14
+ "lodash": "^4.17.20",
15
+ "styled-components": "^5.3.6"
16
+ }
17
+ }
package/project.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "jsonforms-components",
3
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
+ "sourceRoot": "libs/jsonforms-components/src",
5
+ "projectType": "library",
6
+ "tags": [],
7
+ "targets": {
8
+ "lint": {
9
+ "executor": "@nx/eslint:lint",
10
+ "outputs": ["{options.outputFile}"]
11
+ },
12
+ "build": {
13
+ "executor": "@nx/rollup:rollup",
14
+ "outputs": ["{options.outputPath}"],
15
+ "options": {
16
+ "outputPath": "dist/libs/jsonforms-components",
17
+ "tsConfig": "libs/jsonforms-components/tsconfig.lib.json",
18
+ "project": "libs/jsonforms-components/package.json",
19
+ "entryFile": "libs/jsonforms-components/src/index.ts",
20
+ "external": [
21
+ "@abgov/react-components-new",
22
+ "@jsonforms/core",
23
+ "@jsonforms/material-renderers",
24
+ "@jsonforms/react",
25
+ "@mui/material",
26
+ "react",
27
+ "react-dom",
28
+ "react/jsx-runtime"
29
+ ],
30
+ "rollupConfig": "libs/jsonforms-components/rollup.config.js",
31
+ "compiler": "babel",
32
+ "assets": [
33
+ {
34
+ "glob": "libs/jsonforms-components/README.md",
35
+ "input": ".",
36
+ "output": "."
37
+ }
38
+ ]
39
+ }
40
+ },
41
+ "test": {
42
+ "executor": "@nx/jest:jest",
43
+ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
44
+ "options": {
45
+ "jestConfig": "libs/jsonforms-components/jest.config.ts"
46
+ }
47
+ },
48
+ "release": {
49
+ "executor": "nx:run-commands",
50
+ "options": {
51
+ "command": "npx semantic-release -e ./libs/jsonforms-components/.releaserc.json"
52
+ }
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,14 @@
1
+ const nrwlConfig = require('@nx/react/plugins/bundle-rollup');
2
+
3
+ module.exports = (config) => {
4
+ const { output, ...nxConfig } = nrwlConfig(config);
5
+ return {
6
+ ...nxConfig,
7
+ output: {
8
+ ...output,
9
+ paths: {
10
+ '@abgov/react-components-new': '@abgov/react-components',
11
+ },
12
+ },
13
+ };
14
+ };
package/src/index.ts ADDED
@@ -0,0 +1,166 @@
1
+ import { JsonFormsCellRendererRegistryEntry, JsonFormsRendererRegistryEntry } from '@jsonforms/core';
2
+ import {
3
+ materialAllOfControlTester,
4
+ MaterialAllOfRenderer,
5
+ materialAnyOfControlTester,
6
+ MaterialAnyOfRenderer,
7
+ materialObjectControlTester,
8
+ MaterialObjectRenderer,
9
+ materialOneOfControlTester,
10
+ MaterialOneOfRenderer,
11
+ MaterialEnumArrayRenderer,
12
+ materialEnumArrayRendererTester,
13
+ } from '@jsonforms/material-renderers';
14
+ import {
15
+ MaterialAnyOfStringOrEnumControl,
16
+ materialAnyOfStringOrEnumControlTester,
17
+ MaterialOneOfEnumControl,
18
+ MaterialSliderControl,
19
+ materialSliderControlTester,
20
+ MaterialOneOfRadioGroupControl,
21
+ materialOneOfRadioGroupControlTester,
22
+ materialOneOfEnumControlTester,
23
+ } from '@jsonforms/material-renderers';
24
+ import {
25
+ MaterialArrayLayout,
26
+ materialArrayLayoutTester,
27
+ materialHorizontalLayoutTester,
28
+ materialVerticalLayoutTester,
29
+ } from '@jsonforms/material-renderers';
30
+ import {
31
+ MaterialBooleanCell,
32
+ materialBooleanCellTester,
33
+ MaterialBooleanToggleCell,
34
+ materialBooleanToggleCellTester,
35
+ MaterialEnumCell,
36
+ materialEnumCellTester,
37
+ MaterialOneOfEnumCell,
38
+ materialOneOfEnumCellTester,
39
+ } from '@jsonforms/material-renderers';
40
+ import {
41
+ GoATextControlTester,
42
+ GoAInputTextControl,
43
+ GoADateControlTester,
44
+ GoAInputDateControl,
45
+ GoADateTimeControlTester,
46
+ GoAInputDateTimeControl,
47
+ GoATimeControlTester,
48
+ GoAInputTimeControl,
49
+ GoANumberControlTester,
50
+ GoAInputNumberControl,
51
+ GoAIntegerControlTester,
52
+ GoAInputIntegerControl,
53
+ CategorizationRendererTester,
54
+ FormStepperControl,
55
+ FileUploaderTester,
56
+ FileUploader,
57
+ MultiLineTextControl,
58
+ MultiLineTextControlTester,
59
+ GoAEnumControl,
60
+ GoAEnumAutoCompleteControl,
61
+ GoAEnumControlTester,
62
+ GoAEnumControlAutoCompleteTester,
63
+ GoAEnumRadioGroupControl,
64
+ GoARadioGroupControlTester,
65
+ GoAArrayControlTester,
66
+ GoAArrayControlRenderer,
67
+ GoAListWithDetailsTester,
68
+ GoABooleanControlTester,
69
+ GoABooleanControl,
70
+ GoABooleanRadioControlTester,
71
+ GoABooleanRadioControl,
72
+ } from './lib/Controls';
73
+ import { InputCells } from './lib/Cells';
74
+ import { GoAVerticalLayout, GoAHorizontalLayout, GoAGroupLayoutTester, GoAGroupControl } from './lib/layouts';
75
+ import { withJsonFormsControlProps } from '@jsonforms/react';
76
+ import { addData } from './lib/Context';
77
+
78
+ import { HelpContent, HelpContentTester } from './lib/Additional';
79
+ import GoAErrorControl, { GoAErrorControlTester } from './lib/ErrorHandling/GoAErrorControl';
80
+
81
+ export * from './lib/Context';
82
+ const countries = ['Argentina', 'Brazil', 'Canada', 'Denmark', 'Egypt', 'France', 'Greece', 'India', 'Japan', 'Kenya'];
83
+ addData('countries', countries);
84
+ export const GoABaseRenderers: JsonFormsRendererRegistryEntry[] = [
85
+ // controls
86
+ { tester: GoAEnumControlTester, renderer: GoAEnumControl },
87
+ { tester: GoAEnumControlAutoCompleteTester, renderer: GoAEnumAutoCompleteControl },
88
+ { tester: GoAIntegerControlTester, renderer: GoAInputIntegerControl },
89
+ { tester: GoANumberControlTester, renderer: GoAInputNumberControl },
90
+ { tester: GoATextControlTester, renderer: GoAInputTextControl },
91
+ { tester: GoADateControlTester, renderer: GoAInputDateControl },
92
+ { tester: GoADateTimeControlTester, renderer: GoAInputDateTimeControl },
93
+ { tester: GoATimeControlTester, renderer: GoAInputTimeControl },
94
+ { tester: materialSliderControlTester, renderer: MaterialSliderControl },
95
+ { tester: materialObjectControlTester, renderer: MaterialObjectRenderer },
96
+ { tester: materialAllOfControlTester, renderer: MaterialAllOfRenderer },
97
+ { tester: materialAnyOfControlTester, renderer: MaterialAnyOfRenderer },
98
+ { tester: materialOneOfControlTester, renderer: MaterialOneOfRenderer },
99
+ {
100
+ tester: GoARadioGroupControlTester,
101
+ renderer: GoAEnumRadioGroupControl,
102
+ },
103
+ { tester: GoABooleanControlTester, renderer: GoABooleanControl },
104
+
105
+ { tester: GoABooleanRadioControlTester, renderer: GoABooleanRadioControl },
106
+ {
107
+ tester: GoAArrayControlTester,
108
+ renderer: GoAArrayControlRenderer,
109
+ },
110
+ {
111
+ tester: GoAListWithDetailsTester,
112
+ renderer: GoAArrayControlRenderer,
113
+ },
114
+ {
115
+ tester: materialOneOfRadioGroupControlTester,
116
+ renderer: MaterialOneOfRadioGroupControl,
117
+ },
118
+ {
119
+ tester: materialOneOfEnumControlTester,
120
+ renderer: MaterialOneOfEnumControl,
121
+ },
122
+ // layouts
123
+ { tester: GoAGroupLayoutTester, renderer: GoAGroupControl },
124
+ {
125
+ tester: materialHorizontalLayoutTester,
126
+ renderer: GoAHorizontalLayout,
127
+ },
128
+ { tester: materialVerticalLayoutTester, renderer: GoAVerticalLayout },
129
+ { tester: materialArrayLayoutTester, renderer: MaterialArrayLayout },
130
+ // additional
131
+ { tester: GoAErrorControlTester, renderer: GoAErrorControl },
132
+ {
133
+ tester: materialAnyOfStringOrEnumControlTester,
134
+ renderer: MaterialAnyOfStringOrEnumControl,
135
+ },
136
+ {
137
+ tester: materialEnumArrayRendererTester,
138
+ renderer: MaterialEnumArrayRenderer,
139
+ },
140
+ {
141
+ tester: materialEnumArrayRendererTester,
142
+ renderer: MaterialEnumArrayRenderer,
143
+ },
144
+ {
145
+ tester: MultiLineTextControlTester,
146
+ renderer: MultiLineTextControl,
147
+ },
148
+ {
149
+ tester: HelpContentTester,
150
+ renderer: HelpContent,
151
+ },
152
+ ];
153
+
154
+ export const GoARenderers: JsonFormsRendererRegistryEntry[] = [
155
+ ...GoABaseRenderers,
156
+ { tester: CategorizationRendererTester, renderer: FormStepperControl },
157
+ { tester: FileUploaderTester, renderer: withJsonFormsControlProps(FileUploader) },
158
+ ];
159
+
160
+ export const GoACells: JsonFormsCellRendererRegistryEntry[] = [
161
+ { tester: materialBooleanCellTester, cell: MaterialBooleanCell },
162
+ { tester: materialBooleanToggleCellTester, cell: MaterialBooleanToggleCell },
163
+ { tester: materialEnumCellTester, cell: MaterialEnumCell },
164
+ { tester: materialOneOfEnumCellTester, cell: MaterialOneOfEnumCell },
165
+ ...InputCells,
166
+ ];
@@ -0,0 +1,95 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React from 'react';
3
+ import { RankedTester, rankWith, uiTypeIs } from '@jsonforms/core';
4
+ import { Hidden } from '@mui/material';
5
+ import { GoADetails } from '@abgov/react-components-new';
6
+ import { HelpContentDiv } from './styled-components';
7
+ import { ControlProps, ControlElement } from '@jsonforms/core';
8
+ import { withJsonFormsControlProps } from '@jsonforms/react';
9
+ interface OptionProps {
10
+ ariaLabel?: string;
11
+ help?: string | string[];
12
+ variant?: string;
13
+ }
14
+
15
+ interface CustomControlElement extends ControlElement {
16
+ options?: OptionProps;
17
+ elements?: CustomControlElement[]; // Assuming elements is an array of similar objects
18
+ }
19
+
20
+ interface CustomControlProps extends ControlProps {
21
+ uischema: CustomControlElement;
22
+ }
23
+
24
+ export const HelpContentComponent = ({
25
+ isParent = true,
26
+ ...props
27
+ }: CustomControlProps & { isParent?: boolean }): JSX.Element => {
28
+ const labelClass = isParent ? 'parent-label' : 'child-label';
29
+ const marginClass = isParent ? 'parent-margin' : 'child-margin';
30
+ // eslint-disable-next-line
31
+ const { uischema, visible, label } = props;
32
+ const renderHelp = () =>
33
+ Array.isArray(uischema?.options?.help) ? (
34
+ <ul>
35
+ {uischema?.options?.help.map((line: string, index: number) => (
36
+ <li key={index}>{`${line}`}</li>
37
+ ))}
38
+ </ul>
39
+ ) : (
40
+ <p className="single-line">{uischema?.options?.help}</p>
41
+ );
42
+
43
+ return (
44
+ <Hidden xsUp={!visible}>
45
+ <HelpContentDiv aria-label={uischema.options?.ariaLabel}>
46
+ <div className={marginClass}>
47
+ {label && !uischema.options?.variant && uischema.options?.variant !== 'details' && (
48
+ <div className={labelClass}>
49
+ {label}
50
+ <br />
51
+ </div>
52
+ )}
53
+ {(!uischema.options?.variant || uischema.options?.variant !== 'details') && renderHelp()}
54
+ {uischema.options?.variant && uischema.options?.variant === 'details' && (
55
+ <GoADetails heading={label ? label : ''} mt="3xs" mb="none">
56
+ {renderHelp()}
57
+ {uischema?.elements && uischema?.elements?.length > 0 && <HelpContents elements={uischema?.elements} />}
58
+ </GoADetails>
59
+ )}
60
+ {uischema?.elements && uischema?.elements.length > 0 && uischema.options?.variant !== 'details' && (
61
+ <HelpContents elements={uischema.elements} isParent={false} />
62
+ )}
63
+ </div>
64
+ </HelpContentDiv>
65
+ </Hidden>
66
+ );
67
+ };
68
+ const HelpContents = ({ elements, isParent = false }: { elements: CustomControlElement[]; isParent?: boolean }) => (
69
+ <div>
70
+ {elements?.map((element: any) => {
71
+ return (
72
+ <HelpContentComponent
73
+ uischema={element}
74
+ label={element.label}
75
+ errors={''}
76
+ data={undefined}
77
+ enabled={false}
78
+ visible={true}
79
+ path={''}
80
+ handleChange={function (path: string, value: any): void {
81
+ throw new Error('Function not implemented.');
82
+ }}
83
+ rootSchema={{}}
84
+ id={''}
85
+ schema={{}}
86
+ isParent={isParent}
87
+ />
88
+ );
89
+ })}
90
+ </div>
91
+ );
92
+
93
+ export const HelpContentTester: RankedTester = rankWith(1, uiTypeIs('HelpContent'));
94
+
95
+ export const HelpContent = withJsonFormsControlProps(HelpContentComponent);
@@ -0,0 +1 @@
1
+ export * from './HelpContent';