@genesislcap/foundation-forms 14.429.1 → 14.429.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 (85) hide show
  1. package/dist/custom-elements.json +126 -35
  2. package/dist/dts/filters/filters.template.d.ts.map +1 -1
  3. package/dist/dts/form.d.ts +4 -10
  4. package/dist/dts/form.d.ts.map +1 -1
  5. package/dist/dts/form.styles.d.ts.map +1 -1
  6. package/dist/dts/form.template.d.ts.map +1 -1
  7. package/dist/dts/index.d.ts +8 -0
  8. package/dist/dts/index.d.ts.map +1 -1
  9. package/dist/dts/jsonforms/json-forms.d.ts.map +1 -1
  10. package/dist/dts/jsonforms/renderers/ArrayListWrapperRenderer.d.ts.map +1 -1
  11. package/dist/dts/jsonforms/renderers/BooleanControlRenderer.d.ts.map +1 -1
  12. package/dist/dts/jsonforms/renderers/CategorizationWrapperRenderer.d.ts.map +1 -1
  13. package/dist/dts/jsonforms/renderers/ConnectedMultiselectControlRenderer.d.ts.map +1 -1
  14. package/dist/dts/jsonforms/renderers/ConnectedSelectControlRenderer.d.ts.map +1 -1
  15. package/dist/dts/jsonforms/renderers/ControlWrapperRenderer.d.ts +42 -3
  16. package/dist/dts/jsonforms/renderers/ControlWrapperRenderer.d.ts.map +1 -1
  17. package/dist/dts/jsonforms/renderers/DateControlRenderer.d.ts +2 -1
  18. package/dist/dts/jsonforms/renderers/DateControlRenderer.d.ts.map +1 -1
  19. package/dist/dts/jsonforms/renderers/EnumControlRenderer.d.ts +2 -1
  20. package/dist/dts/jsonforms/renderers/EnumControlRenderer.d.ts.map +1 -1
  21. package/dist/dts/jsonforms/renderers/EnumRadioGroupControlRenderer.d.ts.map +1 -1
  22. package/dist/dts/jsonforms/renderers/FilterDateControlRenderer.d.ts +2 -1
  23. package/dist/dts/jsonforms/renderers/FilterDateControlRenderer.d.ts.map +1 -1
  24. package/dist/dts/jsonforms/renderers/FilterNumberControlRenderer.d.ts +2 -1
  25. package/dist/dts/jsonforms/renderers/FilterNumberControlRenderer.d.ts.map +1 -1
  26. package/dist/dts/jsonforms/renderers/FilterTimeControlRenderer.d.ts +2 -1
  27. package/dist/dts/jsonforms/renderers/FilterTimeControlRenderer.d.ts.map +1 -1
  28. package/dist/dts/jsonforms/renderers/LayoutArrayRenderer.d.ts +2 -1
  29. package/dist/dts/jsonforms/renderers/LayoutArrayRenderer.d.ts.map +1 -1
  30. package/dist/dts/jsonforms/renderers/LayoutFormGridRenderer.d.ts +2 -1
  31. package/dist/dts/jsonforms/renderers/LayoutFormGridRenderer.d.ts.map +1 -1
  32. package/dist/dts/jsonforms/renderers/LayoutGroupRenderer.d.ts +2 -1
  33. package/dist/dts/jsonforms/renderers/LayoutGroupRenderer.d.ts.map +1 -1
  34. package/dist/dts/jsonforms/renderers/LayoutHorizontalRenderer.d.ts +2 -1
  35. package/dist/dts/jsonforms/renderers/LayoutHorizontalRenderer.d.ts.map +1 -1
  36. package/dist/dts/jsonforms/renderers/LayoutRenderer.d.ts +29 -3
  37. package/dist/dts/jsonforms/renderers/LayoutRenderer.d.ts.map +1 -1
  38. package/dist/dts/jsonforms/renderers/LayoutVertical2ColumnsRenderer.d.ts +2 -1
  39. package/dist/dts/jsonforms/renderers/LayoutVertical2ColumnsRenderer.d.ts.map +1 -1
  40. package/dist/dts/jsonforms/renderers/MulticolumnDropdownControlRenderer.d.ts.map +1 -1
  41. package/dist/dts/jsonforms/renderers/NumberControlRenderer.d.ts +2 -1
  42. package/dist/dts/jsonforms/renderers/NumberControlRenderer.d.ts.map +1 -1
  43. package/dist/dts/jsonforms/renderers/SegmentedControlRenderer.d.ts.map +1 -1
  44. package/dist/dts/jsonforms/renderers/StepperWrapperRenderer.d.ts.map +1 -1
  45. package/dist/dts/jsonforms/renderers/StringArrayControlRenderer.d.ts.map +1 -1
  46. package/dist/dts/jsonforms/renderers/StringControlRenderer.d.ts.map +1 -1
  47. package/dist/dts/jsonforms/renderers/VerticalCategorizationWrapperRenderer.d.ts.map +1 -1
  48. package/dist/dts/jsonforms/renderers/dispatch-renderer.d.ts.map +1 -1
  49. package/dist/dts/types.d.ts +12 -0
  50. package/dist/dts/types.d.ts.map +1 -1
  51. package/dist/esm/filters/filters.template.js +1 -2
  52. package/dist/esm/form.js +2 -1
  53. package/dist/esm/form.styles.js +14 -40
  54. package/dist/esm/form.template.js +1 -2
  55. package/dist/esm/index.js +8 -0
  56. package/dist/esm/jsonforms/json-forms.js +27 -1
  57. package/dist/esm/jsonforms/renderers/ArrayListWrapperRenderer.js +48 -46
  58. package/dist/esm/jsonforms/renderers/BooleanControlRenderer.js +19 -20
  59. package/dist/esm/jsonforms/renderers/CategorizationWrapperRenderer.js +9 -4
  60. package/dist/esm/jsonforms/renderers/ConnectedMultiselectControlRenderer.js +38 -40
  61. package/dist/esm/jsonforms/renderers/ConnectedSelectControlRenderer.js +39 -39
  62. package/dist/esm/jsonforms/renderers/ControlWrapperRenderer.js +160 -7
  63. package/dist/esm/jsonforms/renderers/DateControlRenderer.js +41 -43
  64. package/dist/esm/jsonforms/renderers/EnumControlRenderer.js +27 -27
  65. package/dist/esm/jsonforms/renderers/EnumRadioGroupControlRenderer.js +30 -32
  66. package/dist/esm/jsonforms/renderers/FilterDateControlRenderer.js +81 -77
  67. package/dist/esm/jsonforms/renderers/FilterNumberControlRenderer.js +54 -51
  68. package/dist/esm/jsonforms/renderers/FilterTimeControlRenderer.js +69 -69
  69. package/dist/esm/jsonforms/renderers/LayoutArrayRenderer.js +7 -8
  70. package/dist/esm/jsonforms/renderers/LayoutFormGridRenderer.js +27 -26
  71. package/dist/esm/jsonforms/renderers/LayoutGroupRenderer.js +36 -32
  72. package/dist/esm/jsonforms/renderers/LayoutHorizontalRenderer.js +27 -26
  73. package/dist/esm/jsonforms/renderers/LayoutRenderer.js +62 -29
  74. package/dist/esm/jsonforms/renderers/LayoutVertical2ColumnsRenderer.js +18 -17
  75. package/dist/esm/jsonforms/renderers/MulticolumnDropdownControlRenderer.js +39 -41
  76. package/dist/esm/jsonforms/renderers/NumberControlRenderer.js +30 -30
  77. package/dist/esm/jsonforms/renderers/SegmentedControlRenderer.js +25 -27
  78. package/dist/esm/jsonforms/renderers/StepperWrapperRenderer.js +2 -1
  79. package/dist/esm/jsonforms/renderers/StringArrayControlRenderer.js +18 -20
  80. package/dist/esm/jsonforms/renderers/StringControlRenderer.js +41 -42
  81. package/dist/esm/jsonforms/renderers/VerticalCategorizationWrapperRenderer.js +13 -9
  82. package/dist/esm/jsonforms/renderers/dispatch-renderer.js +1 -0
  83. package/dist/foundation-forms.api.json +575 -2
  84. package/dist/foundation-forms.d.ts +101 -10
  85. package/package.json +15 -15
@@ -1,8 +1,151 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { computeLabel, isDescriptionHidden } from '@jsonforms/core';
3
- import { html, css, when, observable, customElement, FASTElement, volatile, attr, } from '@microsoft/fast-element';
3
+ import { FASTElement, attr, css, customElement, html, observable, volatile, when, } from '@microsoft/fast-element';
4
4
  import { classNames } from '@microsoft/fast-web-utilities';
5
+ import { logger } from '../../utils/logger';
5
6
  import { getAnyOfErrorMessage } from '../../utils/validation';
7
+ /**
8
+ * Styles formerly scoped to the <control-wrapper> element. After the light-DOM
9
+ * refactor these are composed into `foundationFormStyles` so they reach every
10
+ * rendered control. Exported for consumers that render controls outside of
11
+ * `foundation-form` and need the same wrapper styling.
12
+ *
13
+ * @internal
14
+ */
15
+ export const controlWrapperStyles = css `
16
+ foundation-form .foundation-control-wrapper-root {
17
+ margin-bottom: var(--wrapper-root-margin-bottom, calc(var(--design-unit) * 4px));
18
+ }
19
+ foundation-form .foundation-control-wrapper-root.labelLeft {
20
+ display: flex;
21
+ flex-wrap: wrap;
22
+ }
23
+ foundation-form .foundation-control-wrapper-label {
24
+ color: var(--neutral-foreground-hint);
25
+ margin-bottom: var(--control-label-margin, calc(var(--design-unit) * 2px));
26
+ display: flex;
27
+ justify-content: space-between;
28
+ font-weight: 700;
29
+ cursor: default;
30
+ }
31
+ foundation-form .foundation-control-wrapper-label.visually-hidden {
32
+ position: absolute;
33
+ width: 1px;
34
+ height: 1px;
35
+ padding: 0;
36
+ margin: -1px;
37
+ overflow: hidden;
38
+ clip: rect(0, 0, 0, 0);
39
+ clip-path: inset(50%);
40
+ white-space: nowrap;
41
+ border: 0;
42
+ }
43
+ foundation-form .labelLeft .foundation-control-wrapper {
44
+ flex: 1 1 auto;
45
+ width: auto;
46
+ align-items: flex-start;
47
+ flex-wrap: wrap;
48
+ }
49
+ foundation-form .labelLeft .foundation-control-wrapper-label {
50
+ flex: 0 1 auto;
51
+ width: calc(var(--design-unit) * 30px);
52
+ margin-right: calc(var(--design-unit) * 2px);
53
+ align-items: center;
54
+ margin-bottom: 0;
55
+ }
56
+ foundation-form .labelLeft .foundation-control-wrapper-error {
57
+ margin-left: 0;
58
+ flex: 1 1 100%;
59
+ text-align: right;
60
+ }
61
+ foundation-form .foundation-control-wrapper-error {
62
+ font-size: 12px;
63
+ color: #f9644d;
64
+ margin-left: 10px;
65
+ }
66
+ foundation-form .foundation-control-wrapper {
67
+ display: flex;
68
+ width: 100%;
69
+ align-items: center;
70
+ }
71
+ `;
72
+ /**
73
+ * Light-DOM-friendly control wrapper that replaces the former `<control-wrapper>`
74
+ * custom element. Renders label, error/description slots, and composes a provided
75
+ * inner control template inline within the renderer's template so that bindings
76
+ * stay on the `DispatchRenderer` source.
77
+ *
78
+ * @public
79
+ */
80
+ export const controlWrapperTemplate = (options) => {
81
+ const { innerTemplate, prefix, hideLabel = false } = options;
82
+ return html `
83
+ ${when((x) => { var _a; return (_a = x.control) === null || _a === void 0 ? void 0 : _a.visible; }, html `
84
+ <div
85
+ class=${(x) => {
86
+ var _a, _b, _c, _d;
87
+ return classNames(['foundation-control-wrapper-root', true], ['labelLeft', ((_d = (_c = (_b = (_a = x.jsonforms) === null || _a === void 0 ? void 0 : _a.core) === null || _b === void 0 ? void 0 : _b.uischema) === null || _c === void 0 ? void 0 : _c.options) === null || _d === void 0 ? void 0 : _d.labelPlacement) === 'left']);
88
+ }}
89
+ id=${(x) => x.control.path + '-wrapper'}
90
+ data-test-id=${(x) => x.control.path + '-wrapper'}
91
+ role="group"
92
+ aria-labelledby=${(x) => (computeControlLabel(x) ? x.control.path + '-label' : null)}
93
+ >
94
+ ${when((x) => computeControlLabel(x), html `
95
+ <label
96
+ id="${(x) => x.control.path + '-label'}"
97
+ for="${(x) => x.control.path}"
98
+ class="${() => classNames('foundation-control-wrapper-label', ['visually-hidden', hideLabel])}"
99
+ >
100
+ <span>
101
+ ${(x) => computeControlLabel(x)}${when((x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tooltip; }, html `
102
+ <${prefix}-icon
103
+ tooltip="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tooltip; }}"
104
+ tooltip-id="${(x) => x.control.path + '-tooltip'}"
105
+ ></${prefix}-icon>
106
+ `)}
107
+ </span>
108
+ </label>
109
+ `)}
110
+
111
+ <div class="foundation-control-wrapper" part="wrapper">${innerTemplate}</div>
112
+ <div
113
+ class="${(x) => (x.control.errors || computeAnyOfError(x)) && x.touched
114
+ ? 'foundation-control-wrapper-error'
115
+ : 'foundation-control-wrapper-description'}"
116
+ >
117
+ ${(x) => x.touched && (x.control.errors || computeAnyOfError(x))
118
+ ? [x.control.errors, computeAnyOfError(x)].filter(Boolean).join(' ')
119
+ : computeShowDescription(x)
120
+ ? x.control.description
121
+ : ''}
122
+ </div>
123
+ </div>
124
+ `)}
125
+ `;
126
+ };
127
+ function computeShowDescription(x) {
128
+ var _a;
129
+ if (!(x === null || x === void 0 ? void 0 : x.control))
130
+ return false;
131
+ return !isDescriptionHidden(x.control.visible, x.control.description, x.control.isFocused, !!((_a = x.control.config) === null || _a === void 0 ? void 0 : _a.showUnfocusedDescription));
132
+ }
133
+ function computeControlLabel(x) {
134
+ var _a, _b, _c;
135
+ if (!(x === null || x === void 0 ? void 0 : x.control))
136
+ return '';
137
+ if ((_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.hideLabel)
138
+ return '';
139
+ return computeLabel(x.control.label, x.control.required, !!((_c = x.control.config) === null || _c === void 0 ? void 0 : _c.hideRequiredAsterisk));
140
+ }
141
+ function computeAnyOfError(x) {
142
+ var _a, _b, _c, _d, _e, _f, _g, _h;
143
+ return getAnyOfErrorMessage((_b = (_a = x.jsonforms) === null || _a === void 0 ? void 0 : _a.core) === null || _b === void 0 ? void 0 : _b.errors, (_d = (_c = x.jsonforms) === null || _c === void 0 ? void 0 : _c.core) === null || _d === void 0 ? void 0 : _d.schema, (_e = x.control) === null || _e === void 0 ? void 0 : _e.path, (_h = (_g = (_f = x.control) === null || _f === void 0 ? void 0 : _f.uischema) === null || _g === void 0 ? void 0 : _g.options) === null || _h === void 0 ? void 0 : _h.anyOfErrorMessage);
144
+ }
145
+ // ---------------------------------------------------------------------------
146
+ // Deprecated: <control-wrapper> custom element
147
+ // ---------------------------------------------------------------------------
148
+ /** @internal @deprecated */
6
149
  export const ControlWrapperRendererTemplate = html `
7
150
  <template>
8
151
  ${when((x) => { var _a; return (_a = x.control) === null || _a === void 0 ? void 0 : _a.visible; }, html `
@@ -44,7 +187,7 @@ export const ControlWrapperRendererTemplate = html `
44
187
  `)}
45
188
  </template>
46
189
  `;
47
- const styles = css `
190
+ const deprecatedControlWrapperStyles = css `
48
191
  .visually-hidden {
49
192
  position: absolute;
50
193
  width: 1px;
@@ -73,7 +216,6 @@ const styles = css `
73
216
  display: flex;
74
217
  justify-content: space-between;
75
218
  font-weight: 700;
76
- /* Reset label defaults to match former div appearance */
77
219
  cursor: default;
78
220
  }
79
221
 
@@ -110,19 +252,30 @@ const styles = css `
110
252
  align-items: center;
111
253
  }
112
254
  `;
255
+ /**
256
+ * @deprecated Use `controlWrapperTemplate` instead. The `<control-wrapper>` custom element
257
+ * will be removed in a future major version. Migrate to the light-DOM `controlWrapperTemplate`
258
+ * function which renders inline within the parent renderer's template.
259
+ */
113
260
  let ControlWrapper = class ControlWrapper extends FASTElement {
114
261
  constructor() {
115
262
  super(...arguments);
116
263
  this.hideLabel = false;
117
264
  }
265
+ connectedCallback() {
266
+ super.connectedCallback();
267
+ logger.warn('<control-wrapper> is deprecated and will be removed in a future major version. ' +
268
+ 'Migrate to the `controlWrapperTemplate` function for light-DOM rendering.');
269
+ }
118
270
  get showDescription() {
119
- return !isDescriptionHidden(this.control.visible, this.control.description, this.control.isFocused, !!this.control.config.showUnfocusedDescription);
271
+ var _a;
272
+ return !isDescriptionHidden(this.control.visible, this.control.description, this.control.isFocused, !!((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.showUnfocusedDescription));
120
273
  }
121
274
  get computedLabel() {
122
- var _a, _b, _c;
275
+ var _a, _b, _c, _d;
123
276
  if ((_c = (_b = (_a = this.control) === null || _a === void 0 ? void 0 : _a.uischema) === null || _b === void 0 ? void 0 : _b.options) === null || _c === void 0 ? void 0 : _c.hideLabel)
124
277
  return '';
125
- return computeLabel(this.control.label, this.control.required, !!this.control.config.hideRequiredAsterisk);
278
+ return computeLabel(this.control.label, this.control.required, !!((_d = this.control.config) === null || _d === void 0 ? void 0 : _d.hideRequiredAsterisk));
126
279
  }
127
280
  get getPrefixedTooltip() {
128
281
  var _a, _b;
@@ -164,7 +317,7 @@ __decorate([
164
317
  ControlWrapper = __decorate([
165
318
  customElement({
166
319
  name: 'control-wrapper',
167
- styles,
320
+ styles: deprecatedControlWrapperStyles,
168
321
  template: ControlWrapperRendererTemplate,
169
322
  })
170
323
  ], ControlWrapper);
@@ -2,6 +2,7 @@ import { mapStateToControlProps, rankWith } from '@jsonforms/core';
2
2
  import { html } from '@microsoft/fast-element';
3
3
  import { GenesisType } from '../../utils';
4
4
  import { isOneOfDate } from '../testers/isDate';
5
+ import { controlWrapperTemplate } from './ControlWrapperRenderer';
5
6
  import { DATE_CONTROL_RANK } from './RenderersRanks';
6
7
  /**
7
8
  * @internal
@@ -18,48 +19,45 @@ const typeSwitch = (control) => {
18
19
  };
19
20
  export const DateControlRendererTemplate = (prefix = 'zero') => html `
20
21
  <template>
21
- <control-wrapper
22
- :control=${(x) => x.control}
23
- :jsonForms=${(x) => x.jsonforms}
24
- :touched=${(x) => x.touched}
25
- ?submitted=${(x) => x.submitted}
26
- prefix="${prefix}"
27
- >
28
- <${prefix}-text-field
29
- :value=${(x) => {
30
- if (!x.control.data)
31
- return '';
32
- const type = typeSwitch(x.control);
33
- const date = new Date(x.control.data);
34
- const padded = (dateComponent) => dateComponent.toString().padStart(2, '0');
35
- const year = date.getFullYear();
36
- const month = padded(date.getMonth() + 1);
37
- const day = padded(date.getDate());
38
- const hour = padded(date.getHours());
39
- const minute = padded(date.getMinutes());
40
- return (`${year}-${month}-${day}` + (type === 'datetime-local' ? `T${hour}:${minute}` : ''));
41
- }}
42
- id=${(x) => x.control.path}
43
- type="${(x) => typeSwitch(x.control)}"
44
- data-test-id=${(x) => x.control.path}
45
- ?required=${(x) => x.control.required}
46
- ?disabled=${(x) => !x.control.enabled}
47
- tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
48
- @blur=${(x, c) => {
49
- const target = c.event.target;
50
- const inputValue = target.value;
51
- x.onBlur();
52
- if (inputValue) {
53
- const timestamp = new Date(inputValue).getTime();
54
- x.control.handleChange(x.control.path, timestamp);
55
- }
56
- else {
57
- x.control.handleChange(x.control.path, undefined);
58
- }
59
- }}"
60
- style="width: 100%"
61
- ></${prefix}-text-field>
62
- </control-wrapper>
22
+ ${controlWrapperTemplate({
23
+ prefix,
24
+ innerTemplate: html `
25
+ <${prefix}-text-field
26
+ :value=${(x) => {
27
+ if (!x.control.data)
28
+ return '';
29
+ const type = typeSwitch(x.control);
30
+ const date = new Date(x.control.data);
31
+ const padded = (dateComponent) => dateComponent.toString().padStart(2, '0');
32
+ const year = date.getFullYear();
33
+ const month = padded(date.getMonth() + 1);
34
+ const day = padded(date.getDate());
35
+ const hour = padded(date.getHours());
36
+ const minute = padded(date.getMinutes());
37
+ return (`${year}-${month}-${day}` + (type === 'datetime-local' ? `T${hour}:${minute}` : ''));
38
+ }}
39
+ id=${(x) => x.control.path}
40
+ type="${(x) => typeSwitch(x.control)}"
41
+ data-test-id=${(x) => x.control.path}
42
+ ?required=${(x) => x.control.required}
43
+ ?disabled=${(x) => !x.control.enabled}
44
+ tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
45
+ @blur=${(x, c) => {
46
+ const target = c.event.target;
47
+ const inputValue = target.value;
48
+ x.onBlur();
49
+ if (inputValue) {
50
+ const timestamp = new Date(inputValue).getTime();
51
+ x.control.handleChange(x.control.path, timestamp);
52
+ }
53
+ else {
54
+ x.control.handleChange(x.control.path, undefined);
55
+ }
56
+ }}"
57
+ style="width: 100%"
58
+ ></${prefix}-text-field>
59
+ `,
60
+ })}
63
61
  </template>
64
62
  `;
65
63
  export const DateControlRendererEntry = {
@@ -67,5 +65,5 @@ export const DateControlRendererEntry = {
67
65
  ${(x) => DateControlRendererTemplate(x.prefix)}
68
66
  `,
69
67
  tester: rankWith(DATE_CONTROL_RANK, isOneOfDate),
70
- mapper: mapStateToControlProps, // TODO: change mapper to handle dates instead of doing it in the template
68
+ mapper: mapStateToControlProps,
71
69
  };
@@ -3,6 +3,7 @@ import { html, repeat } from '@microsoft/fast-element';
3
3
  import { capitalCase } from 'change-case';
4
4
  import { comboboxRendererStyles } from '../../form.styles';
5
5
  import { isOneOfEnum } from '../testers/isOneOfEnum';
6
+ import { controlWrapperTemplate } from './ControlWrapperRenderer';
6
7
  import { ENUM_CONTROL_RANK } from './RenderersRanks';
7
8
  const getOptionLabel = (option, labelRowFormatter) => labelRowFormatter ? labelRowFormatter(option.label) : capitalCase(option.label);
8
9
  // overrides https://github.com/eclipsesource/jsonforms/blob/69441cdfc48f359850d87fa4b842856f1f139eb2/packages/core/src/util/renderer.ts#L515
@@ -40,33 +41,32 @@ const displaySetOrDefaultData = (dispatchRenderer) => {
40
41
  };
41
42
  export const EnumControlRendererTemplate = (prefix = 'zero') => html `
42
43
  <template>
43
- <style>${comboboxRendererStyles(prefix)}</style>
44
- <control-wrapper
45
- :control=${(x) => x.control}
46
- :jsonForms=${(x) => x.jsonforms}
47
- :touched=${(x) => x.touched}
48
- ?submitted=${(x) => x.submitted}
49
- prefix="${prefix}"
50
- >
51
- <${prefix}-combobox
52
- style="width: 100%; min-width: 200px;"
53
- autocomplete=${(x) => { var _a; return (((_a = x.control.uischema.options) === null || _a === void 0 ? void 0 : _a.filterMode) === 'startsWith' ? 'both' : 'list'); }}
54
- filter-mode=${(x) => { var _a; return ((_a = x.control.uischema.options) === null || _a === void 0 ? void 0 : _a.filterMode) || 'contains'; }}
55
- ?disabled=${(x) => !x.control.enabled}
56
- :value=${(x) => displaySetOrDefaultData(x)}
57
- tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
58
- @change=${(x, c) => updateEnumData(x, c.event.target.value)}
59
- id=${(x) => x.control.path}
60
- data-test-id=${(x) => x.control.path}
61
- >
62
- ${repeat((x) => x.control.options, html `
63
- <${prefix}-option>${(x, ctx) => {
64
- var _a, _b, _c, _d;
65
- return getOptionLabel(x, (_d = (_c = (_b = (_a = ctx.parent) === null || _a === void 0 ? void 0 : _a.control) === null || _b === void 0 ? void 0 : _b.uischema) === null || _c === void 0 ? void 0 : _c.options) === null || _d === void 0 ? void 0 : _d.labelRowFormatter);
66
- }}</${prefix}-option>
67
- `)}
68
- </${prefix}-combobox>
69
- </control-wrapper>
44
+ <style>
45
+ ${comboboxRendererStyles(prefix)}
46
+ </style>
47
+ ${controlWrapperTemplate({
48
+ prefix,
49
+ innerTemplate: html `
50
+ <${prefix}-combobox
51
+ style="width: 100%; min-width: 200px;"
52
+ autocomplete=${(x) => { var _a; return (((_a = x.control.uischema.options) === null || _a === void 0 ? void 0 : _a.filterMode) === 'startsWith' ? 'both' : 'list'); }}
53
+ filter-mode=${(x) => { var _a; return ((_a = x.control.uischema.options) === null || _a === void 0 ? void 0 : _a.filterMode) || 'contains'; }}
54
+ ?disabled=${(x) => !x.control.enabled}
55
+ :value=${(x) => displaySetOrDefaultData(x)}
56
+ tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
57
+ @change=${(x, c) => updateEnumData(x, c.event.target.value)}
58
+ id=${(x) => x.control.path}
59
+ data-test-id=${(x) => x.control.path}
60
+ >
61
+ ${repeat((x) => x.control.options, html `
62
+ <${prefix}-option>${(x, ctx) => {
63
+ var _a, _b, _c, _d;
64
+ return getOptionLabel(x, (_d = (_c = (_b = (_a = ctx.parent) === null || _a === void 0 ? void 0 : _a.control) === null || _b === void 0 ? void 0 : _b.uischema) === null || _c === void 0 ? void 0 : _c.options) === null || _d === void 0 ? void 0 : _d.labelRowFormatter);
65
+ }}</${prefix}-option>
66
+ `)}
67
+ </${prefix}-combobox>
68
+ `,
69
+ })}
70
70
  </template>
71
71
  `;
72
72
  export const EnumControlRendererEntry = {
@@ -1,6 +1,7 @@
1
1
  import { mapStateToControlProps, rankWith } from '@jsonforms/core';
2
2
  import { html, repeat } from '@microsoft/fast-element';
3
3
  import { optionIs } from '../testers/optionIs';
4
+ import { controlWrapperTemplate } from './ControlWrapperRenderer';
4
5
  import { ENUM_RADIO_GROUP_CONTROL_RANK } from './RenderersRanks';
5
6
  const radioGroupStyles = (prefix) => `
6
7
  ${prefix}-radio-group {
@@ -19,38 +20,35 @@ const radioGroupStyles = (prefix) => `
19
20
  }
20
21
  `;
21
22
  export const EnumRadioGroupControlRendererTemplate = (prefix = 'zero') => html `
22
- <template>
23
- <style>
24
- ${radioGroupStyles(prefix)}
25
- </style>
26
- <control-wrapper
27
- :control=${(x) => x.control}
28
- :jsonForms=${(x) => x.jsonforms}
29
- :touched=${(x) => x.touched}
30
- ?submitted=${(x) => x.submitted}
31
- prefix="${prefix}"
32
- >
33
- <${prefix}-radio-group
34
- orientation="${(x) => { var _a, _b, _c; return (_c = (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.orientation) !== null && _c !== void 0 ? _c : 'horizontal'; }}"
35
- value=${(x) => { var _a; return (_a = x.control.data) !== null && _a !== void 0 ? _a : ''; }}
36
- ?disabled=${(x) => !x.control.enabled}
37
- id=${(x) => x.control.path}
38
- data-test-id=${(x) => x.control.path}
39
- @change=${(x, c) => {
40
- var _a;
41
- const target = c.event.currentTarget;
42
- const value = (_a = target.value) !== null && _a !== void 0 ? _a : '';
43
- x.control.handleChange(x.control.path, value === '' ? null : value);
44
- x.onBlur();
45
- }}
46
- >
47
- ${repeat((x) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = x.control) === null || _a === void 0 ? void 0 : _a.uischema) === null || _b === void 0 ? void 0 : _b.options) === null || _c === void 0 ? void 0 : _c.data) !== null && _d !== void 0 ? _d : []; }, html `
48
- <${prefix}-radio value=${(opt) => opt.value}>${(opt) => opt.label}</${prefix}-radio>
49
- `)}
50
- </${prefix}-radio-group>
51
- </control-wrapper>
52
- </template>
53
- `;
23
+ <template>
24
+ <style>
25
+ ${radioGroupStyles(prefix)}
26
+ </style>
27
+ ${controlWrapperTemplate({
28
+ prefix,
29
+ innerTemplate: html `
30
+ <${prefix}-radio-group
31
+ orientation="${(x) => { var _a, _b, _c; return (_c = (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.orientation) !== null && _c !== void 0 ? _c : 'horizontal'; }}"
32
+ value=${(x) => { var _a; return (_a = x.control.data) !== null && _a !== void 0 ? _a : ''; }}
33
+ ?disabled=${(x) => !x.control.enabled}
34
+ id=${(x) => x.control.path}
35
+ data-test-id=${(x) => x.control.path}
36
+ @change=${(x, c) => {
37
+ var _a;
38
+ const target = c.event.currentTarget;
39
+ const value = (_a = target.value) !== null && _a !== void 0 ? _a : '';
40
+ x.control.handleChange(x.control.path, value === '' ? null : value);
41
+ x.onBlur();
42
+ }}
43
+ >
44
+ ${repeat((x) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = x.control) === null || _a === void 0 ? void 0 : _a.uischema) === null || _b === void 0 ? void 0 : _b.options) === null || _c === void 0 ? void 0 : _c.data) !== null && _d !== void 0 ? _d : []; }, html `
45
+ <${prefix}-radio value=${(opt) => opt.value}>${(opt) => opt.label}</${prefix}-radio>
46
+ `)}
47
+ </${prefix}-radio-group>
48
+ `,
49
+ })}
50
+ </template>
51
+ `;
54
52
  /**
55
53
  * A JSON Forms renderer that renders enum options as a radio-group.
56
54
  *
@@ -2,6 +2,7 @@ import { mapStateToControlProps, rankWith } from '@jsonforms/core';
2
2
  import { html } from '@microsoft/fast-element';
3
3
  import { GenesisType } from '../../utils';
4
4
  import { isOneOfDate } from '../testers/isDate';
5
+ import { controlWrapperTemplate } from './ControlWrapperRenderer';
5
6
  import { DATE_CONTROL_RANK } from './RenderersRanks';
6
7
  /**
7
8
  * @internal
@@ -25,82 +26,85 @@ const formatDateValue = (timestamp, inputType) => {
25
26
  };
26
27
  export const DateControlRendererTemplate = (prefix = 'zero') => html `
27
28
  <template>
28
- <control-wrapper :control=${(x) => x.control} ?submitted=${(x) => x.submitted} prefix="${prefix}">
29
- <${prefix}-text-field
30
- :value=${(x) => {
31
- var _a;
32
- const inputType = typeSwitch(x.control);
33
- return formatDateValue((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min, inputType);
34
- }}
35
- id=${(x) => `min-${x.control.path}`}
36
- type="${(x) => typeSwitch(x.control)}"
37
- data-test-id=${(x) => `min-${x.control.path}`}
38
- tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
39
- @blur=${(x, c) => {
40
- var _a, _b, _c;
41
- const target = c.event.target;
42
- const inputValue = target.value;
43
- const inputType = typeSwitch(x.control);
44
- let minValue;
45
- if (inputValue) {
46
- minValue = new Date(inputValue).getTime();
47
- }
48
- const maxValue = ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max) !== undefined &&
49
- minValue !== undefined &&
50
- ((_b = x.control.data) === null || _b === void 0 ? void 0 : _b.max) < minValue
51
- ? undefined
52
- : (_c = x.control.data) === null || _c === void 0 ? void 0 : _c.max;
53
- x.control.handleChange(x.control.path, {
54
- min: minValue,
55
- max: maxValue,
56
- type: inputType === 'datetime-local' ? 'datetime' : 'date',
57
- });
58
- x.onBlur();
59
- }}
60
- style="width: 100%"
61
- ></${prefix}-text-field>
62
- <span
63
- style="
64
- font-size: xx-large;
65
- color: var(--neutral-stroke-divider-rest);
66
- padding: calc(var(--design-unit) * 1px);"
67
- >
68
- -
69
- </span>
70
- <${prefix}-text-field
71
- :value=${(x) => {
72
- var _a;
73
- const inputType = typeSwitch(x.control);
74
- return formatDateValue((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max, inputType);
75
- }}
76
- id=${(x) => `max-${x.control.path}`}
77
- type="${(x) => typeSwitch(x.control)}"
78
- data-test-id=${(x) => `max-${x.control.path}`}
79
- tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
80
- @blur=${(x, c) => {
81
- var _a, _b, _c;
82
- const target = c.event.target;
83
- const inputValue = target.value;
84
- const inputType = typeSwitch(x.control);
85
- let maxValue;
86
- if (inputValue) {
87
- maxValue = new Date(inputValue).getTime();
88
- }
89
- const minValue = ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min) !== undefined &&
90
- maxValue !== undefined &&
91
- ((_b = x.control.data) === null || _b === void 0 ? void 0 : _b.min) > maxValue
92
- ? undefined
93
- : (_c = x.control.data) === null || _c === void 0 ? void 0 : _c.min;
94
- x.control.handleChange(x.control.path, {
95
- min: minValue,
96
- max: maxValue,
97
- type: inputType === 'datetime-local' ? 'datetime' : 'date',
98
- });
99
- x.onBlur();
100
- }}
101
- style="width: 100%"
102
- ></${prefix}-text-field>
103
- </control-wrapper>
29
+ ${controlWrapperTemplate({
30
+ prefix,
31
+ innerTemplate: html `
32
+ <${prefix}-text-field
33
+ :value=${(x) => {
34
+ var _a;
35
+ const inputType = typeSwitch(x.control);
36
+ return formatDateValue((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min, inputType);
37
+ }}
38
+ id=${(x) => `min-${x.control.path}`}
39
+ type="${(x) => typeSwitch(x.control)}"
40
+ data-test-id=${(x) => `min-${x.control.path}`}
41
+ tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
42
+ @blur=${(x, c) => {
43
+ var _a, _b, _c;
44
+ const target = c.event.target;
45
+ const inputValue = target.value;
46
+ const inputType = typeSwitch(x.control);
47
+ let minValue;
48
+ if (inputValue) {
49
+ minValue = new Date(inputValue).getTime();
50
+ }
51
+ const maxValue = ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max) !== undefined &&
52
+ minValue !== undefined &&
53
+ ((_b = x.control.data) === null || _b === void 0 ? void 0 : _b.max) < minValue
54
+ ? undefined
55
+ : (_c = x.control.data) === null || _c === void 0 ? void 0 : _c.max;
56
+ x.control.handleChange(x.control.path, {
57
+ min: minValue,
58
+ max: maxValue,
59
+ type: inputType === 'datetime-local' ? 'datetime' : 'date',
60
+ });
61
+ x.onBlur();
62
+ }}
63
+ style="width: 100%"
64
+ ></${prefix}-text-field>
65
+ <span
66
+ style="
67
+ font-size: xx-large;
68
+ color: var(--neutral-stroke-divider-rest);
69
+ padding: calc(var(--design-unit) * 1px);"
70
+ >
71
+ -
72
+ </span>
73
+ <${prefix}-text-field
74
+ :value=${(x) => {
75
+ var _a;
76
+ const inputType = typeSwitch(x.control);
77
+ return formatDateValue((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max, inputType);
78
+ }}
79
+ id=${(x) => `max-${x.control.path}`}
80
+ type="${(x) => typeSwitch(x.control)}"
81
+ data-test-id=${(x) => `max-${x.control.path}`}
82
+ tabindex="${(x) => { var _a, _b; return (_b = (_a = x.control.uischema) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.tabIndex; }}"
83
+ @blur=${(x, c) => {
84
+ var _a, _b, _c;
85
+ const target = c.event.target;
86
+ const inputValue = target.value;
87
+ const inputType = typeSwitch(x.control);
88
+ let maxValue;
89
+ if (inputValue) {
90
+ maxValue = new Date(inputValue).getTime();
91
+ }
92
+ const minValue = ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min) !== undefined &&
93
+ maxValue !== undefined &&
94
+ ((_b = x.control.data) === null || _b === void 0 ? void 0 : _b.min) > maxValue
95
+ ? undefined
96
+ : (_c = x.control.data) === null || _c === void 0 ? void 0 : _c.min;
97
+ x.control.handleChange(x.control.path, {
98
+ min: minValue,
99
+ max: maxValue,
100
+ type: inputType === 'datetime-local' ? 'datetime' : 'date',
101
+ });
102
+ x.onBlur();
103
+ }}
104
+ style="width: 100%"
105
+ ></${prefix}-text-field>
106
+ `,
107
+ })}
104
108
  </template>
105
109
  `;
106
110
  export const FilterDateControlRendererEntry = {
@@ -108,5 +112,5 @@ export const FilterDateControlRendererEntry = {
108
112
  ${(x) => DateControlRendererTemplate(x.prefix)}
109
113
  `,
110
114
  tester: rankWith(DATE_CONTROL_RANK, isOneOfDate),
111
- mapper: mapStateToControlProps, // TODO: change mapper to handle dates instead of doing it in the template
115
+ mapper: mapStateToControlProps,
112
116
  };