@jsonforms/core 2.5.2-alpha.0 → 3.0.0-alpha.2

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 (273) hide show
  1. package/README.md +1 -1
  2. package/docs/assets/js/search.json +1 -1
  3. package/docs/enums/ruleeffect.html +4 -4
  4. package/docs/globals.html +1061 -1120
  5. package/docs/index.html +64 -91
  6. package/docs/interfaces/addcellrendereraction.html +3 -3
  7. package/docs/interfaces/addrendereraction.html +3 -3
  8. package/docs/interfaces/adduischemaaction.html +3 -3
  9. package/docs/interfaces/andcondition.html +2 -2
  10. package/docs/interfaces/arraycontrolprops.html +22 -22
  11. package/docs/interfaces/arraylayoutprops.html +22 -22
  12. package/docs/interfaces/categorization.html +5 -5
  13. package/docs/interfaces/category.html +5 -5
  14. package/docs/interfaces/cellprops.html +14 -14
  15. package/docs/interfaces/combinatorrendererprops.html +13 -13
  16. package/docs/interfaces/combinatorsubschemarenderinfo.html +3 -3
  17. package/docs/interfaces/composablecondition.html +2 -2
  18. package/docs/interfaces/condition.html +1 -1
  19. package/docs/interfaces/controlelement.html +5 -5
  20. package/docs/interfaces/controlprops.html +17 -17
  21. package/docs/interfaces/controlstate.html +2 -2
  22. package/docs/interfaces/controlwithdetailprops.html +18 -18
  23. package/docs/interfaces/dispatchcellprops.html +13 -13
  24. package/docs/interfaces/dispatchcellstateprops.html +13 -13
  25. package/docs/interfaces/dispatchpropsofarraycontrol.html +4 -4
  26. package/docs/interfaces/dispatchpropsofcontrol.html +1 -1
  27. package/docs/interfaces/dispatchpropsofmultienumcontrol.html +2 -2
  28. package/docs/interfaces/enumcellprops.html +15 -15
  29. package/docs/interfaces/enumoption.html +2 -2
  30. package/docs/interfaces/formatted.html +2 -2
  31. package/docs/interfaces/grouplayout.html +5 -5
  32. package/docs/interfaces/horizontallayout.html +4 -4
  33. package/docs/interfaces/initaction.html +6 -6
  34. package/docs/interfaces/initactionoptions.html +3 -17
  35. package/docs/interfaces/jsonformscellrendererregistryentry.html +2 -2
  36. package/docs/interfaces/jsonformscore.html +7 -21
  37. package/docs/interfaces/jsonformsdefaultdataregistryentry.html +2 -2
  38. package/docs/interfaces/jsonformsextendedstate.html +1 -1
  39. package/docs/interfaces/{jsonformslocalestate.html → jsonformsi18nstate.html} +20 -20
  40. package/docs/interfaces/jsonformsprops.html +9 -24
  41. package/docs/interfaces/jsonformsrendererregistryentry.html +2 -2
  42. package/docs/interfaces/jsonformsstate.html +1 -1
  43. package/docs/interfaces/jsonformsstore.html +5 -5
  44. package/docs/interfaces/jsonformssubstates.html +18 -8
  45. package/docs/interfaces/jsonformsuischemaregistryentry.html +2 -2
  46. package/docs/interfaces/labeldescription.html +2 -2
  47. package/docs/interfaces/labelelement.html +4 -4
  48. package/docs/interfaces/layout.html +4 -4
  49. package/docs/interfaces/layoutprops.html +10 -10
  50. package/docs/interfaces/leafcondition.html +3 -3
  51. package/docs/interfaces/orcondition.html +2 -2
  52. package/docs/interfaces/ownpropsofcell.html +10 -10
  53. package/docs/interfaces/ownpropsofcontrol.html +9 -9
  54. package/docs/interfaces/ownpropsofenum.html +1 -1
  55. package/docs/interfaces/ownpropsofenumcell.html +11 -11
  56. package/docs/interfaces/ownpropsofjsonformsrenderer.html +8 -8
  57. package/docs/interfaces/ownpropsoflayout.html +9 -9
  58. package/docs/interfaces/ownpropsofmasterlistitem.html +6 -6
  59. package/docs/interfaces/ownpropsofrenderer.html +8 -8
  60. package/docs/interfaces/registerdefaultdataaction.html +3 -3
  61. package/docs/interfaces/removecellrendereraction.html +3 -3
  62. package/docs/interfaces/removerendereraction.html +3 -3
  63. package/docs/interfaces/removeuischemaaction.html +2 -2
  64. package/docs/interfaces/rendererprops.html +9 -9
  65. package/docs/interfaces/rule.html +2 -2
  66. package/docs/interfaces/schemabasedcondition.html +3 -3
  67. package/docs/interfaces/scopable.html +1 -1
  68. package/docs/interfaces/setajvaction.html +3 -3
  69. package/docs/interfaces/setconfigaction.html +2 -2
  70. package/docs/interfaces/setlocaleaction.html +3 -3
  71. package/docs/interfaces/setschemaaction.html +2 -2
  72. package/docs/interfaces/{setlocalizeduischemasaction.html → settranslatoraction.html} +29 -15
  73. package/docs/interfaces/setuischemaaction.html +2 -2
  74. package/docs/interfaces/setvalidationmodeaction.html +2 -2
  75. package/docs/interfaces/statepropsofarraycontrol.html +18 -18
  76. package/docs/interfaces/statepropsofarraylayout.html +18 -18
  77. package/docs/interfaces/statepropsofcell.html +13 -13
  78. package/docs/interfaces/statepropsofcombinator.html +12 -12
  79. package/docs/interfaces/statepropsofcontrol.html +16 -16
  80. package/docs/interfaces/statepropsofcontrolwithdetail.html +17 -17
  81. package/docs/interfaces/statepropsofenumcell.html +14 -14
  82. package/docs/interfaces/statepropsofjsonformsrenderer.html +9 -23
  83. package/docs/interfaces/statepropsoflayout.html +10 -10
  84. package/docs/interfaces/statepropsofmasteritem.html +7 -7
  85. package/docs/interfaces/statepropsofrenderer.html +9 -9
  86. package/docs/interfaces/statepropsofscopedrenderer.html +12 -12
  87. package/docs/interfaces/uischemaelement.html +3 -3
  88. package/docs/interfaces/unregisterdefaultdataaction.html +2 -2
  89. package/docs/interfaces/updateaction.html +3 -3
  90. package/docs/interfaces/updatecoreaction.html +6 -6
  91. package/docs/interfaces/updateerrorsaction.html +2 -2
  92. package/docs/interfaces/{setlocalizedschemasaction.html → updatei18naction.html} +43 -15
  93. package/docs/interfaces/verticallayout.html +4 -4
  94. package/docs/interfaces/withclassname.html +1 -1
  95. package/lib/Helpers.d.ts +5 -0
  96. package/lib/Helpers.js +33 -0
  97. package/lib/Helpers.js.map +1 -0
  98. package/lib/actions/actions.d.ts +181 -0
  99. package/lib/actions/actions.js +173 -0
  100. package/lib/actions/actions.js.map +1 -0
  101. package/lib/actions/index.d.ts +1 -180
  102. package/lib/actions/index.js +26 -122
  103. package/lib/actions/index.js.map +1 -1
  104. package/lib/configDefault.js +2 -1
  105. package/lib/configDefault.js.map +1 -1
  106. package/lib/generators/Generate.d.ts +6 -0
  107. package/lib/generators/Generate.js +35 -0
  108. package/lib/generators/Generate.js.map +1 -0
  109. package/lib/generators/index.d.ts +3 -10
  110. package/lib/generators/index.js +28 -9
  111. package/lib/generators/index.js.map +1 -1
  112. package/lib/generators/schema.d.ts +1 -1
  113. package/lib/generators/schema.js +3 -1
  114. package/lib/generators/schema.js.map +1 -1
  115. package/lib/generators/uischema.d.ts +1 -2
  116. package/lib/generators/uischema.js +12 -10
  117. package/lib/generators/uischema.js.map +1 -1
  118. package/lib/i18n/i18nTypes.d.ts +15 -0
  119. package/lib/i18n/i18nTypes.js +3 -0
  120. package/lib/i18n/i18nTypes.js.map +1 -0
  121. package/lib/i18n/i18nUtil.d.ts +11 -0
  122. package/lib/i18n/i18nUtil.js +58 -0
  123. package/lib/i18n/i18nUtil.js.map +1 -0
  124. package/lib/i18n/index.d.ts +2 -0
  125. package/lib/i18n/index.js +6 -0
  126. package/lib/i18n/index.js.map +1 -0
  127. package/lib/index.d.ts +6 -18
  128. package/lib/index.js +10 -15
  129. package/lib/index.js.map +1 -1
  130. package/lib/jsonforms-core.js +9 -12
  131. package/lib/jsonforms-core.js.map +1 -1
  132. package/lib/models/draft4.js +2 -1
  133. package/lib/models/draft4.js.map +1 -1
  134. package/lib/models/index.d.ts +5 -0
  135. package/lib/models/index.js +33 -0
  136. package/lib/models/index.js.map +1 -0
  137. package/lib/models/jsonSchema.js +24 -0
  138. package/lib/models/jsonSchema.js.map +1 -1
  139. package/lib/models/uischema.js +29 -2
  140. package/lib/models/uischema.js.map +1 -1
  141. package/lib/reducers/cells.d.ts +1 -1
  142. package/lib/reducers/cells.js +27 -1
  143. package/lib/reducers/cells.js.map +1 -1
  144. package/lib/reducers/config.d.ts +1 -1
  145. package/lib/reducers/config.js +5 -3
  146. package/lib/reducers/config.js.map +1 -1
  147. package/lib/reducers/core.d.ts +5 -7
  148. package/lib/reducers/core.js +78 -63
  149. package/lib/reducers/core.js.map +1 -1
  150. package/lib/reducers/default-data.d.ts +1 -1
  151. package/lib/reducers/default-data.js +6 -3
  152. package/lib/reducers/default-data.js.map +1 -1
  153. package/lib/reducers/i18n.d.ts +8 -11
  154. package/lib/reducers/i18n.js +40 -23
  155. package/lib/reducers/i18n.js.map +1 -1
  156. package/lib/reducers/index.d.ts +9 -49
  157. package/lib/reducers/index.js +33 -91
  158. package/lib/reducers/index.js.map +1 -1
  159. package/lib/reducers/reducers.d.ts +37 -0
  160. package/lib/reducers/reducers.js +107 -0
  161. package/lib/reducers/reducers.js.map +1 -0
  162. package/lib/reducers/renderers.d.ts +1 -1
  163. package/lib/reducers/renderers.js +27 -1
  164. package/lib/reducers/renderers.js.map +1 -1
  165. package/lib/reducers/selectors.d.ts +15 -0
  166. package/lib/reducers/selectors.js +56 -0
  167. package/lib/reducers/selectors.js.map +1 -0
  168. package/lib/reducers/uischemas.d.ts +2 -2
  169. package/lib/reducers/uischemas.js +9 -6
  170. package/lib/reducers/uischemas.js.map +1 -1
  171. package/lib/store.d.ts +5 -8
  172. package/lib/store.js +24 -0
  173. package/lib/store.js.map +1 -1
  174. package/lib/testers/index.d.ts +1 -204
  175. package/lib/testers/index.js +3 -376
  176. package/lib/testers/index.js.map +1 -1
  177. package/lib/testers/testers.d.ts +203 -0
  178. package/lib/testers/testers.js +421 -0
  179. package/lib/testers/testers.js.map +1 -0
  180. package/lib/util/Formatted.js +24 -0
  181. package/lib/util/Formatted.js.map +1 -1
  182. package/lib/util/array.js +25 -0
  183. package/lib/util/array.js.map +1 -1
  184. package/lib/util/cell.d.ts +11 -4
  185. package/lib/util/cell.js +61 -17
  186. package/lib/util/cell.js.map +1 -1
  187. package/lib/util/combinators.d.ts +2 -3
  188. package/lib/util/combinators.js +5 -2
  189. package/lib/util/combinators.js.map +1 -1
  190. package/lib/util/ids.js +8 -4
  191. package/lib/util/ids.js.map +1 -1
  192. package/lib/util/index.d.ts +11 -45
  193. package/lib/util/index.js +14 -104
  194. package/lib/util/index.js.map +1 -1
  195. package/lib/util/label.d.ts +1 -2
  196. package/lib/util/label.js +7 -4
  197. package/lib/util/label.js.map +1 -1
  198. package/lib/util/path.d.ts +2 -1
  199. package/lib/util/path.js +12 -6
  200. package/lib/util/path.js.map +1 -1
  201. package/lib/util/renderer.d.ts +17 -17
  202. package/lib/util/renderer.js +163 -76
  203. package/lib/util/renderer.js.map +1 -1
  204. package/lib/util/resolvers.d.ts +1 -14
  205. package/lib/util/resolvers.js +9 -215
  206. package/lib/util/resolvers.js.map +1 -1
  207. package/lib/util/runtime.d.ts +12 -2
  208. package/lib/util/runtime.js +59 -17
  209. package/lib/util/runtime.js.map +1 -1
  210. package/lib/util/schema.js +27 -1
  211. package/lib/util/schema.js.map +1 -1
  212. package/lib/util/uischema.d.ts +1 -1
  213. package/lib/util/uischema.js +11 -7
  214. package/lib/util/uischema.js.map +1 -1
  215. package/lib/util/util.d.ts +31 -0
  216. package/lib/util/util.js +112 -0
  217. package/lib/util/util.js.map +1 -0
  218. package/lib/util/validator.d.ts +3 -2
  219. package/lib/util/validator.js +6 -5
  220. package/lib/util/validator.js.map +1 -1
  221. package/package.json +7 -9
  222. package/src/Helpers.ts +38 -0
  223. package/src/actions/actions.ts +345 -0
  224. package/src/actions/index.ts +1 -312
  225. package/src/configDefault.ts +1 -0
  226. package/src/generators/Generate.ts +43 -0
  227. package/src/generators/index.ts +3 -21
  228. package/src/generators/schema.ts +1 -1
  229. package/src/generators/uischema.ts +4 -4
  230. package/src/i18n/i18nTypes.ts +17 -0
  231. package/src/i18n/i18nUtil.ts +76 -0
  232. package/src/i18n/index.ts +2 -0
  233. package/src/index.ts +7 -31
  234. package/src/models/draft4.ts +1 -0
  235. package/src/models/index.ts +30 -0
  236. package/src/models/jsonSchema.ts +1 -0
  237. package/src/models/uischema.ts +1 -0
  238. package/src/reducers/cells.ts +2 -1
  239. package/src/reducers/config.ts +2 -1
  240. package/src/reducers/core.ts +74 -81
  241. package/src/reducers/default-data.ts +2 -1
  242. package/src/reducers/i18n.ts +42 -35
  243. package/src/reducers/index.ts +9 -158
  244. package/src/reducers/reducers.ts +148 -0
  245. package/src/reducers/renderers.ts +2 -1
  246. package/src/reducers/selectors.ts +65 -0
  247. package/src/reducers/uischemas.ts +4 -2
  248. package/src/store.ts +11 -8
  249. package/src/testers/index.ts +1 -516
  250. package/src/testers/testers.ts +547 -0
  251. package/src/util/Formatted.ts +1 -0
  252. package/src/util/array.ts +25 -0
  253. package/src/util/cell.ts +91 -19
  254. package/src/util/combinators.ts +2 -4
  255. package/src/util/ids.ts +1 -0
  256. package/src/util/index.ts +11 -126
  257. package/src/util/label.ts +2 -2
  258. package/src/util/path.ts +4 -1
  259. package/src/util/renderer.ts +168 -85
  260. package/src/util/resolvers.ts +2 -261
  261. package/src/util/runtime.ts +46 -2
  262. package/src/util/schema.ts +26 -1
  263. package/src/util/uischema.ts +2 -1
  264. package/src/util/util.ts +127 -0
  265. package/src/util/validator.ts +5 -8
  266. package/test/reducers/core.test.ts +31 -223
  267. package/test/util/cell.test.ts +33 -2
  268. package/test/util/renderer.test.ts +483 -3
  269. package/test/util/resolvers.test.ts +1 -59
  270. package/test/util/runtime.test.ts +264 -4
  271. package/docs/interfaces/labels.html +0 -157
  272. package/docs/interfaces/schemaref.html +0 -160
  273. package/docs/interfaces/schemarefs.html +0 -138
@@ -22,11 +22,10 @@
22
22
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
23
  THE SOFTWARE.
24
24
  */
25
+
25
26
  import get from 'lodash/get';
26
- import { ControlElement, UISchemaElement } from '../models/uischema';
27
- import union from 'lodash/union';
27
+ import { ControlElement, JsonSchema, UISchemaElement } from '../models';
28
28
  import find from 'lodash/find';
29
- import RefParser from 'json-schema-ref-parser';
30
29
  import {
31
30
  findUISchema,
32
31
  getAjv,
@@ -34,49 +33,32 @@ import {
34
33
  getConfig,
35
34
  getData,
36
35
  getErrorAt,
37
- getRefParserOptions,
36
+ getErrorTranslator,
38
37
  getRenderers,
39
38
  getSchema,
40
39
  getSubErrorsAt,
41
- getUiSchema
40
+ getTranslator,
41
+ getUiSchema,
42
+ JsonFormsCellRendererRegistryEntry,
43
+ JsonFormsRendererRegistryEntry,
44
+ JsonFormsUISchemaRegistryEntry,
42
45
  } from '../reducers';
43
46
  import { RankedTester } from '../testers';
44
- import { JsonSchema } from '../models/jsonSchema';
45
- import {
46
- AnyAction,
47
- CombinatorKeyword,
48
- composePaths,
49
- composeWithUi,
50
- createLabelDescriptionFrom,
51
- Dispatch,
52
- formatErrorMessage,
53
- hasEnableRule,
54
- hasShowRule,
55
- isEnabled,
56
- isVisible,
57
- moveDown,
58
- moveUp,
59
- Resolve,
60
- resolveSubSchemas
61
- } from '../util';
47
+ import { isInherentlyEnabled, hasShowRule } from './runtime';
48
+ import { createLabelDescriptionFrom } from './label';
49
+ import { CombinatorKeyword, resolveSubSchemas } from './combinators';
50
+ import { moveDown, moveUp } from './array';
51
+ import { AnyAction, Dispatch } from './type';
52
+ import { Resolve } from './util';
53
+ import { composePaths, composeWithUi } from './path';
54
+ import { isVisible } from './runtime';
62
55
  import { CoreActions, update } from '../actions';
63
56
  import { ErrorObject } from 'ajv';
64
57
  import { JsonFormsState } from '../store';
65
- import { JsonFormsRendererRegistryEntry } from '../reducers/renderers';
66
- import { JsonFormsCellRendererRegistryEntry } from '../reducers/cells';
67
- import { JsonFormsUISchemaRegistryEntry } from '../reducers/uischemas';
58
+ import { getCombinedErrorMessage, getI18nKey, i18nJsonSchema, Translator } from '../i18n';
68
59
 
69
60
  export { JsonFormsRendererRegistryEntry, JsonFormsCellRendererRegistryEntry };
70
61
 
71
- export interface Labels {
72
- default: string;
73
- [additionalLabels: string]: string;
74
- }
75
-
76
- export const isPlainLabel = (label: string | Labels): label is string => {
77
- return typeof label === 'string';
78
- };
79
-
80
62
  const isRequired = (
81
63
  schema: JsonSchema,
82
64
  schemaPath: string,
@@ -108,6 +90,7 @@ const isRequired = (
108
90
  *
109
91
  * @param {string} label the label string
110
92
  * @param {boolean} required whether the label belongs to a control which is required
93
+ * @param {boolean} hideRequiredAsterisk applied UI Schema option
111
94
  * @returns {string} the label string
112
95
  */
113
96
  export const computeLabel = (
@@ -118,6 +101,20 @@ export const computeLabel = (
118
101
  return required && !hideRequiredAsterisk ? label + '*' : label;
119
102
  };
120
103
 
104
+ /**
105
+ * Indicates whether to mark a field as required.
106
+ *
107
+ * @param {boolean} required whether the label belongs to a control which is required
108
+ * @param {boolean} hideRequiredAsterisk applied UI Schema option
109
+ * @returns {boolean} should the field be marked as required
110
+ */
111
+ export const showAsRequired = (
112
+ required: boolean,
113
+ hideRequiredAsterisk: boolean
114
+ ): boolean => {
115
+ return required && !hideRequiredAsterisk;
116
+ };
117
+
121
118
  /**
122
119
  * Create a default value based on the given scheam.
123
120
  * @param schema the schema for which to create a default value.
@@ -179,16 +176,45 @@ export interface EnumOption {
179
176
  value: any;
180
177
  }
181
178
 
182
- export const enumToEnumOptionMapper = (e: any): EnumOption => {
183
- const stringifiedEnum = typeof e === 'string' ? e : JSON.stringify(e);
184
- return { label: stringifiedEnum, value: e };
179
+ export const enumToEnumOptionMapper = (
180
+ e: any,
181
+ t?: Translator,
182
+ i18nKey?: string
183
+ ): EnumOption => {
184
+ let label = typeof e === 'string' ? e : JSON.stringify(e);
185
+ if (t) {
186
+ if (i18nKey) {
187
+ label = t(`${i18nKey}.${label}`, label);
188
+ } else {
189
+ label = t(label, label);
190
+ }
191
+ }
192
+ return { label, value: e };
185
193
  };
186
194
 
187
- export const oneOfToEnumOptionMapper = (e: any): EnumOption => ({
188
- value: e.const,
189
- label:
190
- e.title ?? (typeof e.const === 'string' ? e.const : JSON.stringify(e.const))
191
- });
195
+ export const oneOfToEnumOptionMapper = (
196
+ e: any,
197
+ t?: Translator,
198
+ uiSchemaI18nKey?: string
199
+ ): EnumOption => {
200
+ let label =
201
+ e.title ??
202
+ (typeof e.const === 'string' ? e.const : JSON.stringify(e.const));
203
+ if (t) {
204
+ // prefer schema keys as they can be more specialized
205
+ if (e.i18n) {
206
+ label = t(e.i18n, label);
207
+ } else if (uiSchemaI18nKey) {
208
+ label = t(`${uiSchemaI18nKey}.${label}`, label);
209
+ } else {
210
+ label = t(label, label);
211
+ }
212
+ }
213
+ return {
214
+ label,
215
+ value: e.const,
216
+ };
217
+ };
192
218
 
193
219
  export interface OwnPropsOfRenderer {
194
220
  /**
@@ -328,7 +354,7 @@ export interface StatePropsOfControl extends StatePropsOfScopedRenderer {
328
354
  /**
329
355
  * The label for the rendered element.
330
356
  */
331
- label: string | Labels;
357
+ label: string;
332
358
 
333
359
  /**
334
360
  * Description of input cell
@@ -407,11 +433,6 @@ export const mapStateToControlProps = (
407
433
  ownProps.visible === undefined || hasShowRule(uischema)
408
434
  ? isVisible(uischema, rootData, ownProps.path, getAjv(state))
409
435
  : ownProps.visible;
410
- const readonly = state.jsonforms.readonly;
411
- const enabled: boolean =
412
- !readonly && (ownProps.enabled === undefined || hasEnableRule(uischema)
413
- ? isEnabled(uischema, rootData, ownProps.path, getAjv(state) )
414
- : ownProps.enabled);
415
436
  const controlElement = uischema as ControlElement;
416
437
  const id = ownProps.id;
417
438
  const rootSchema = getSchema(state);
@@ -423,26 +444,42 @@ export const mapStateToControlProps = (
423
444
  controlElement.scope,
424
445
  rootSchema
425
446
  );
426
- const errors = formatErrorMessage(
427
- union(getErrorAt(path, resolvedSchema)(state).map(error => error.message))
428
- );
447
+ const errors = getErrorAt(path, resolvedSchema)(state);
448
+
429
449
  const description =
430
450
  resolvedSchema !== undefined ? resolvedSchema.description : '';
431
451
  const data = Resolve.data(rootData, path);
432
452
  const labelDesc = createLabelDescriptionFrom(uischema, resolvedSchema);
433
453
  const label = labelDesc.show ? labelDesc.text : '';
454
+ const config = getConfig(state);
455
+ const enabled: boolean = isInherentlyEnabled(
456
+ state,
457
+ ownProps,
458
+ uischema,
459
+ resolvedSchema || rootSchema,
460
+ rootData,
461
+ config
462
+ );
463
+
464
+ const schema = resolvedSchema ?? rootSchema;
465
+ const t = getTranslator()(state);
466
+ const te = getErrorTranslator()(state);
467
+ const i18nLabel = t(getI18nKey(schema, uischema, 'label') ?? label, label);
468
+ const i18nDescription = t(getI18nKey(schema, uischema, 'description') ?? description, description);
469
+ const i18nErrorMessage = getCombinedErrorMessage(errors, te, t, schema, uischema);
470
+
434
471
  return {
435
472
  data,
436
- description,
437
- errors,
438
- label,
473
+ description: i18nDescription,
474
+ errors: i18nErrorMessage,
475
+ label: i18nLabel,
439
476
  visible,
440
477
  enabled,
441
478
  id,
442
479
  path,
443
480
  required,
444
- uischema: ownProps.uischema,
445
- schema: resolvedSchema || rootSchema,
481
+ uischema,
482
+ schema,
446
483
  config: getConfig(state),
447
484
  cells: ownProps.cells || state.jsonforms.cells,
448
485
  rootSchema
@@ -476,9 +513,21 @@ export const mapStateToEnumControlProps = (
476
513
  ): StatePropsOfControl & OwnPropsOfEnum => {
477
514
  const props: StatePropsOfControl = mapStateToControlProps(state, ownProps);
478
515
  const options: EnumOption[] =
479
- ownProps.options ||
480
- props.schema.enum?.map(enumToEnumOptionMapper) ||
481
- props.schema.const && [enumToEnumOptionMapper(props.schema.const)];
516
+ ownProps.options ||
517
+ props.schema.enum?.map(e =>
518
+ enumToEnumOptionMapper(
519
+ e,
520
+ getTranslator()(state),
521
+ props.uischema?.options?.i18n ?? (props.schema as i18nJsonSchema).i18n
522
+ )
523
+ ) ||
524
+ (props.schema.const && [
525
+ enumToEnumOptionMapper(
526
+ props.schema.const,
527
+ getTranslator()(state),
528
+ props.uischema?.options?.i18n ?? (props.schema as i18nJsonSchema).i18n
529
+ )
530
+ ]);
482
531
  return {
483
532
  ...props,
484
533
  options
@@ -498,7 +547,13 @@ export const mapStateToOneOfEnumControlProps = (
498
547
  const props: StatePropsOfControl = mapStateToControlProps(state, ownProps);
499
548
  const options: EnumOption[] =
500
549
  ownProps.options ||
501
- (props.schema.oneOf as JsonSchema[])?.map(oneOfToEnumOptionMapper);
550
+ (props.schema.oneOf as JsonSchema[])?.map(oneOfSubSchema =>
551
+ oneOfToEnumOptionMapper(
552
+ oneOfSubSchema,
553
+ getTranslator()(state),
554
+ props.uischema?.options?.i18n
555
+ )
556
+ );
502
557
  return {
503
558
  ...props,
504
559
  options
@@ -519,8 +574,21 @@ export const mapStateToMultiEnumControlProps = (
519
574
  const items = props.schema.items as JsonSchema;
520
575
  const options: EnumOption[] =
521
576
  ownProps.options ||
522
- (items?.oneOf && (items.oneOf as JsonSchema[]).map(oneOfToEnumOptionMapper)) ||
523
- items?.enum?.map(enumToEnumOptionMapper);
577
+ (items?.oneOf &&
578
+ (items.oneOf as JsonSchema[]).map(oneOfSubSchema =>
579
+ oneOfToEnumOptionMapper(
580
+ oneOfSubSchema,
581
+ state.jsonforms.i18n?.translate,
582
+ props.uischema?.options?.i18n
583
+ )
584
+ )) ||
585
+ items?.enum?.map(e =>
586
+ enumToEnumOptionMapper(
587
+ e,
588
+ state.jsonforms.i18n?.translate,
589
+ props.uischema?.options?.i18n ?? (props.schema as i18nJsonSchema).i18n
590
+ )
591
+ );
524
592
  return {
525
593
  ...props,
526
594
  options
@@ -702,14 +770,14 @@ export const mapDispatchToArrayControlProps = (
702
770
  });
703
771
 
704
772
  export interface DispatchPropsOfMultiEnumControl {
705
- addItem: (path:string, value: any) => void;
706
- removeItem? :(path:string, toDelete: any) => void;
773
+ addItem: (path: string, value: any) => void;
774
+ removeItem?: (path: string, toDelete: any) => void;
707
775
  }
708
776
 
709
777
  export const mapDispatchToMultiEnumProps = (
710
778
  dispatch: Dispatch<CoreActions>
711
779
  ): DispatchPropsOfMultiEnumControl => ({
712
- addItem: (path:string, value: any) => {
780
+ addItem: (path: string, value: any) => {
713
781
  dispatch(
714
782
  update(path, data => {
715
783
  if (data === undefined || data === null) {
@@ -720,7 +788,7 @@ export const mapDispatchToMultiEnumProps = (
720
788
  })
721
789
  );
722
790
  },
723
- removeItem: (path:string, toDelete: any) => {
791
+ removeItem: (path: string, toDelete: any) => {
724
792
  dispatch(
725
793
  update(path, data => {
726
794
  const indexInData = data.indexOf(toDelete);
@@ -776,13 +844,17 @@ export const mapStateToLayoutProps = (
776
844
  ownProps.visible === undefined || hasShowRule(uischema)
777
845
  ? isVisible(ownProps.uischema, rootData, ownProps.path, getAjv(state))
778
846
  : ownProps.visible;
779
- const readonly = state.jsonforms.readonly;
780
- const enabled: boolean =
781
- !readonly && (ownProps.enabled === undefined || hasEnableRule(uischema)
782
- ? isEnabled(ownProps.uischema, rootData, ownProps.path, getAjv(state))
783
- : ownProps.enabled);
784
847
 
785
848
  const data = Resolve.data(rootData, ownProps.path);
849
+ const config = getConfig(state);
850
+ const enabled: boolean = isInherentlyEnabled(
851
+ state,
852
+ ownProps,
853
+ uischema,
854
+ undefined, // layouts have no associated schema
855
+ rootData,
856
+ config
857
+ );
786
858
 
787
859
  return {
788
860
  ...layoutDefaultProps,
@@ -805,7 +877,6 @@ export interface OwnPropsOfJsonFormsRenderer extends OwnPropsOfRenderer {}
805
877
  export interface StatePropsOfJsonFormsRenderer
806
878
  extends OwnPropsOfJsonFormsRenderer {
807
879
  rootSchema: JsonSchema;
808
- refResolver: any;
809
880
  }
810
881
 
811
882
  export interface JsonFormsProps extends StatePropsOfJsonFormsRenderer {}
@@ -834,8 +905,6 @@ export const mapStateToJsonFormsRendererProps = (
834
905
  schema: ownProps.schema || getSchema(state),
835
906
  rootSchema: getSchema(state),
836
907
  uischema: uischema,
837
- refResolver: (schema: any) =>
838
- RefParser.dereference(schema, getRefParserOptions(state)),
839
908
  path: ownProps.path
840
909
  };
841
910
  };
@@ -882,7 +951,8 @@ const mapStateToCombinatorRendererProps = (
882
951
  'required',
883
952
  'additionalProperties',
884
953
  'type',
885
- 'enum'
954
+ 'enum',
955
+ 'const'
886
956
  ];
887
957
  const dataIsValid = (errors: ErrorObject[]): boolean => {
888
958
  return (
@@ -892,12 +962,19 @@ const mapStateToCombinatorRendererProps = (
892
962
  );
893
963
  };
894
964
  let indexOfFittingSchema: number;
965
+ // TODO instead of compiling the combinator subschemas we can compile the original schema
966
+ // without the combinator alternatives and then revalidate and check the errors for the
967
+ // element
895
968
  for (let i = 0; i < _schema[keyword].length; i++) {
896
- const valFn = ajv.compile(_schema[keyword][i]);
897
- valFn(data);
898
- if (dataIsValid(valFn.errors)) {
899
- indexOfFittingSchema = i;
900
- break;
969
+ try {
970
+ const valFn = ajv.compile(_schema[keyword][i]);
971
+ valFn(data);
972
+ if (dataIsValid(valFn.errors)) {
973
+ indexOfFittingSchema = i;
974
+ break;
975
+ }
976
+ } catch (error) {
977
+ console.debug("Combinator subschema is not self contained, can't hand it over to AJV");
901
978
  }
902
979
  }
903
980
 
@@ -967,9 +1044,17 @@ export const mapStateToArrayLayoutProps = (
967
1044
  } = mapStateToControlWithDetailProps(state, ownProps);
968
1045
 
969
1046
  const resolvedSchema = Resolve.schema(schema, 'items', props.rootSchema);
970
- const childErrors = formatErrorMessage(
971
- getSubErrorsAt(path, resolvedSchema)(state).map(error => error.message)
1047
+
1048
+ // TODO Does not consider a specialized '.custom' error message overriding all other error messages
1049
+ // TODO Does not consider 'i18n' keys which are specified in the ui schemas of the sub errors
1050
+ const childErrors = getCombinedErrorMessage(
1051
+ getSubErrorsAt(path, resolvedSchema)(state),
1052
+ getErrorTranslator()(state),
1053
+ getTranslator()(state),
1054
+ undefined,
1055
+ undefined
972
1056
  );
1057
+
973
1058
  const allErrors =
974
1059
  errors +
975
1060
  (errors.length > 0 && childErrors.length > 0 ? '\n' : '') +
@@ -985,8 +1070,6 @@ export const mapStateToArrayLayoutProps = (
985
1070
  };
986
1071
  };
987
1072
 
988
- export type CombinatorProps = StatePropsOfCombinator & DispatchPropsOfControl;
989
-
990
1073
  /**
991
1074
  * Props of an array control.
992
1075
  */
@@ -22,17 +22,10 @@
22
22
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
23
  THE SOFTWARE.
24
24
  */
25
+
25
26
  import isEmpty from 'lodash/isEmpty';
26
27
  import get from 'lodash/get';
27
- import isArray from 'lodash/isArray';
28
- import isObject from 'lodash/isObject';
29
- import isFunction from 'lodash/isFunction';
30
- import isUndefined from 'lodash/isUndefined';
31
- import forOwn from 'lodash/forOwn';
32
- import isString from 'lodash/isString';
33
- import isPlainObject from 'lodash/isPlainObject';
34
- import { parse } from 'uri-js';
35
- import { JsonSchema } from '..';
28
+ import { JsonSchema } from '../models';
36
29
 
37
30
  /**
38
31
  * Map for storing refs and the respective schemas they are pointing to.
@@ -194,255 +187,3 @@ function retrieveResolvableSchema(
194
187
 
195
188
  return child;
196
189
  }
197
-
198
- // copied and adapted from JsonRefs
199
-
200
- /**
201
- * Interface for describing result of an extracted schema ref
202
- */
203
- export interface SchemaRef {
204
- uri: string;
205
- }
206
-
207
- /**
208
- * Interface wraps SchemaRef
209
- */
210
- export interface SchemaRefs {
211
- [id: string]: SchemaRef;
212
- }
213
-
214
- export const findRefs = (obj: JsonSchema): SchemaRefs => {
215
- const refs: SchemaRefs = {};
216
-
217
- // Walk the document (or sub document) and find all JSON References
218
- walk([], obj, [], ({}, node: any, path: any) => {
219
- let processChildren = true;
220
- let refDetails;
221
- let refPtr;
222
-
223
- if (isRefLike(node, false)) {
224
- refDetails = getRefDetails(node);
225
-
226
- if (refDetails.type !== 'invalid') {
227
- refPtr = pathToPtr(path, undefined);
228
-
229
- refs[refPtr] = refDetails;
230
- }
231
-
232
- // Whenever a JSON Reference has extra children, its children should not be processed.
233
- // See: http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3
234
- if (getExtraRefKeys(node).length > 0) {
235
- processChildren = false;
236
- }
237
- }
238
-
239
- return processChildren;
240
- });
241
-
242
- return refs;
243
- };
244
-
245
- // pure copy of JsonRefs (added types)
246
-
247
- const walk = (ancestors: any, node: any, path: any, fn: any) => {
248
- let processChildren = true;
249
-
250
- const walkItem = (item: any, segment: any) => {
251
- path.push(segment);
252
- walk(ancestors, item, path, fn);
253
- path.pop();
254
- };
255
-
256
- // Call the iteratee
257
- if (isFunction(fn)) {
258
- processChildren = fn(ancestors, node, path);
259
- }
260
-
261
- // We do not process circular objects again
262
- if (ancestors.indexOf(node) === -1) {
263
- ancestors.push(node);
264
-
265
- if (processChildren !== false) {
266
- if (isArray(node)) {
267
- node.forEach((member, index) => {
268
- walkItem(member, index.toString());
269
- });
270
- } else if (isObject(node)) {
271
- forOwn(node, (cNode, key) => {
272
- walkItem(cNode, key);
273
- });
274
- }
275
- }
276
-
277
- ancestors.pop();
278
- }
279
- };
280
-
281
- const pathToPtr = (path: any, hashPrefix: any) => {
282
- if (!isArray(path)) {
283
- throw new Error('path must be an Array');
284
- }
285
-
286
- // Encode each segment and return
287
- return (
288
- (hashPrefix !== false ? '#' : '') +
289
- (path.length > 0 ? '/' : '') +
290
- encodePath(path).join('/')
291
- );
292
- };
293
-
294
- const encodePath = (path: any) => {
295
- if (!isArray(path)) {
296
- throw new TypeError('path must be an array');
297
- }
298
-
299
- return path.map(seg => {
300
- if (!isString(seg)) {
301
- seg = JSON.stringify(seg);
302
- }
303
-
304
- return seg.replace(/~/g, '~0').replace(/\//g, '~1');
305
- });
306
- };
307
-
308
- const uriDetailsCache = {} as any;
309
- const badPtrTokenRegex = /~(?:[^01]|$)/g;
310
-
311
- const getRefDetails = (obj: any) => {
312
- const details = {
313
- def: obj
314
- } as any;
315
- let cacheKey;
316
- let extraKeys;
317
- let uriDetails;
318
-
319
- try {
320
- if (isRefLike(obj, true)) {
321
- cacheKey = obj.$ref;
322
- uriDetails = uriDetailsCache[cacheKey];
323
-
324
- if (isUndefined(uriDetails)) {
325
- uriDetails = uriDetailsCache[cacheKey] = parseURI(cacheKey);
326
- }
327
-
328
- details.uri = cacheKey;
329
- details.uriDetails = uriDetails;
330
-
331
- if (isUndefined(uriDetails.error)) {
332
- details.type = getRefType(details);
333
-
334
- // Validate the JSON Pointer
335
- try {
336
- if (['#', '/'].indexOf(cacheKey[0]) > -1) {
337
- isPtr(cacheKey, true);
338
- } else if (cacheKey.indexOf('#') > -1) {
339
- isPtr(uriDetails.fragment, true);
340
- }
341
- } catch (err) {
342
- details.error = err.message;
343
- details.type = 'invalid';
344
- }
345
- } else {
346
- details.error = details.uriDetails.error;
347
- details.type = 'invalid';
348
- }
349
-
350
- // Identify warning
351
- extraKeys = getExtraRefKeys(obj);
352
-
353
- if (extraKeys.length > 0) {
354
- details.warning =
355
- 'Extra JSON Reference properties will be ignored: ' +
356
- extraKeys.join(', ');
357
- }
358
- } else {
359
- details.type = 'invalid';
360
- }
361
- } catch (err) {
362
- details.error = err.message;
363
- details.type = 'invalid';
364
- }
365
-
366
- return details;
367
- };
368
-
369
- const getRefType = (refDetails: any) => {
370
- let type;
371
-
372
- // Convert the URI reference to one of our types
373
- switch (refDetails.uriDetails.reference) {
374
- case 'absolute':
375
- case 'uri':
376
- type = 'remote';
377
- break;
378
- case 'same-document':
379
- type = 'local';
380
- break;
381
- default:
382
- type = refDetails.uriDetails.reference;
383
- }
384
-
385
- return type;
386
- };
387
-
388
- const getExtraRefKeys = (ref: any) => {
389
- return Object.keys(ref).filter(key => {
390
- return key !== '$ref';
391
- });
392
- };
393
-
394
- const parseURI = (uri: string) => {
395
- // We decode first to avoid doubly encoding
396
- return parse(uri);
397
- };
398
-
399
- const isPtr = (ptr: any, throwWithDetails: boolean) => {
400
- let valid = true;
401
- let firstChar;
402
-
403
- try {
404
- if (isString(ptr)) {
405
- if (ptr !== '') {
406
- firstChar = ptr.charAt(0);
407
-
408
- if (['#', '/'].indexOf(firstChar) === -1) {
409
- throw new Error('ptr must start with a / or #/');
410
- } else if (firstChar === '#' && ptr !== '#' && ptr.charAt(1) !== '/') {
411
- throw new Error('ptr must start with a / or #/');
412
- } else if (ptr.match(badPtrTokenRegex)) {
413
- throw new Error('ptr has invalid token(s)');
414
- }
415
- }
416
- } else {
417
- throw new Error('ptr is not a String');
418
- }
419
- } catch (err) {
420
- if (throwWithDetails === true) {
421
- throw err;
422
- }
423
-
424
- valid = false;
425
- }
426
-
427
- return valid;
428
- };
429
-
430
- const isRefLike = (obj: any, throwWithDetails: boolean) => {
431
- let refLike = true;
432
-
433
- try {
434
- if (!isPlainObject(obj)) {
435
- throw new Error('obj is not an Object');
436
- } else if (!isString(obj.$ref)) {
437
- throw new Error('obj.$ref is not a String');
438
- }
439
- } catch (err) {
440
- if (throwWithDetails) {
441
- throw err;
442
- }
443
-
444
- refLike = false;
445
- }
446
-
447
- return refLike;
448
- };