@rjsf/fluentui-rc 6.0.0-beta.9 → 6.0.0

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 (84) hide show
  1. package/README.md +2 -0
  2. package/dist/core.umd.js +129 -51
  3. package/dist/{index.js → index.cjs} +210 -123
  4. package/dist/index.cjs.map +7 -0
  5. package/dist/index.esm.js +192 -105
  6. package/dist/index.esm.js.map +4 -4
  7. package/lib/AddButton/AddButton.js +1 -1
  8. package/lib/AddButton/AddButton.js.map +1 -1
  9. package/lib/ArrayFieldItemTemplate/ArrayFieldItemTemplate.d.ts +3 -3
  10. package/lib/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js +1 -1
  11. package/lib/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js.map +1 -1
  12. package/lib/ArrayFieldTemplate/ArrayFieldTemplate.d.ts +1 -1
  13. package/lib/ArrayFieldTemplate/ArrayFieldTemplate.js +4 -5
  14. package/lib/ArrayFieldTemplate/ArrayFieldTemplate.js.map +1 -1
  15. package/lib/BaseInputTemplate/BaseInputTemplate.js +2 -2
  16. package/lib/BaseInputTemplate/BaseInputTemplate.js.map +1 -1
  17. package/lib/CheckboxWidget/CheckboxWidget.js +4 -4
  18. package/lib/CheckboxWidget/CheckboxWidget.js.map +1 -1
  19. package/lib/CheckboxesWidget/CheckboxesWidget.d.ts +1 -1
  20. package/lib/CheckboxesWidget/CheckboxesWidget.js +2 -2
  21. package/lib/CheckboxesWidget/CheckboxesWidget.js.map +1 -1
  22. package/lib/FieldErrorTemplate/FieldErrorTemplate.js +2 -2
  23. package/lib/FieldErrorTemplate/FieldErrorTemplate.js.map +1 -1
  24. package/lib/FieldHelpTemplate/FieldHelpTemplate.js +2 -2
  25. package/lib/FieldHelpTemplate/FieldHelpTemplate.js.map +1 -1
  26. package/lib/FieldTemplate/FieldTemplate.js +2 -2
  27. package/lib/FieldTemplate/FieldTemplate.js.map +1 -1
  28. package/lib/IconButton/IconButton.d.ts +7 -5
  29. package/lib/IconButton/IconButton.js.map +1 -1
  30. package/lib/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.d.ts +2 -0
  31. package/lib/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.js +13 -0
  32. package/lib/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.js.map +1 -0
  33. package/lib/MultiSchemaFieldTemplate/index.d.ts +2 -0
  34. package/lib/MultiSchemaFieldTemplate/index.js +3 -0
  35. package/lib/MultiSchemaFieldTemplate/index.js.map +1 -0
  36. package/lib/ObjectFieldTemplate/ObjectFieldTemplate.js +4 -3
  37. package/lib/ObjectFieldTemplate/ObjectFieldTemplate.js.map +1 -1
  38. package/lib/OptionalDataControlsTemplate/OptionalDataControlsTemplate.d.ts +10 -0
  39. package/lib/OptionalDataControlsTemplate/OptionalDataControlsTemplate.js +22 -0
  40. package/lib/OptionalDataControlsTemplate/OptionalDataControlsTemplate.js.map +1 -0
  41. package/lib/OptionalDataControlsTemplate/index.d.ts +2 -0
  42. package/lib/OptionalDataControlsTemplate/index.js +3 -0
  43. package/lib/OptionalDataControlsTemplate/index.js.map +1 -0
  44. package/lib/RadioWidget/RadioWidget.d.ts +1 -1
  45. package/lib/RadioWidget/RadioWidget.js +2 -2
  46. package/lib/RadioWidget/RadioWidget.js.map +1 -1
  47. package/lib/RangeWidget/RangeWidget.js.map +1 -1
  48. package/lib/SelectWidget/SelectWidget.d.ts +1 -1
  49. package/lib/SelectWidget/SelectWidget.js +2 -2
  50. package/lib/SelectWidget/SelectWidget.js.map +1 -1
  51. package/lib/Templates/Templates.js +4 -0
  52. package/lib/Templates/Templates.js.map +1 -1
  53. package/lib/TextareaWidget/TextareaWidget.js +2 -2
  54. package/lib/TextareaWidget/TextareaWidget.js.map +1 -1
  55. package/lib/TitleField/TitleField.d.ts +1 -1
  56. package/lib/TitleField/TitleField.js +7 -2
  57. package/lib/TitleField/TitleField.js.map +1 -1
  58. package/lib/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js +3 -4
  59. package/lib/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js.map +1 -1
  60. package/lib/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +18 -18
  62. package/src/AddButton/AddButton.tsx +1 -1
  63. package/src/ArrayFieldItemTemplate/ArrayFieldItemTemplate.tsx +3 -3
  64. package/src/ArrayFieldTemplate/ArrayFieldTemplate.tsx +23 -17
  65. package/src/BaseInputTemplate/BaseInputTemplate.tsx +5 -4
  66. package/src/CheckboxWidget/CheckboxWidget.tsx +6 -5
  67. package/src/CheckboxesWidget/CheckboxesWidget.tsx +3 -2
  68. package/src/FieldErrorTemplate/FieldErrorTemplate.tsx +2 -2
  69. package/src/FieldHelpTemplate/FieldHelpTemplate.tsx +2 -2
  70. package/src/FieldTemplate/FieldTemplate.tsx +6 -4
  71. package/src/IconButton/IconButton.tsx +12 -6
  72. package/src/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.tsx +25 -0
  73. package/src/MultiSchemaFieldTemplate/index.ts +2 -0
  74. package/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx +10 -6
  75. package/src/OptionalDataControlsTemplate/OptionalDataControlsTemplate.tsx +48 -0
  76. package/src/OptionalDataControlsTemplate/index.ts +2 -0
  77. package/src/RadioWidget/RadioWidget.tsx +3 -2
  78. package/src/RangeWidget/RangeWidget.tsx +1 -1
  79. package/src/SelectWidget/SelectWidget.tsx +3 -2
  80. package/src/Templates/Templates.ts +4 -0
  81. package/src/TextareaWidget/TextareaWidget.tsx +3 -2
  82. package/src/TitleField/TitleField.tsx +16 -3
  83. package/src/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.tsx +6 -7
  84. package/dist/index.js.map +0 -7
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@rjsf/fluentui-rc",
3
- "version": "6.0.0-beta.9",
3
+ "version": "6.0.0",
4
4
  "description": "FluentUI React Components theme, fields and widgets for react-jsonschema-form",
5
5
  "scripts": {
6
6
  "build:ts": "tsc -b tsconfig.build.json && tsc-alias -p tsconfig.build.json",
7
- "build:cjs": "esbuild ./src/index.ts --bundle --outfile=dist/index.js --sourcemap --packages=external --format=cjs",
7
+ "build:cjs": "esbuild ./src/index.ts --bundle --outfile=dist/index.cjs --sourcemap --packages=external --format=cjs",
8
8
  "build:esm": "esbuild ./src/index.ts --bundle --outfile=dist/index.esm.js --sourcemap --packages=external --format=esm",
9
9
  "build:umd": "rollup dist/index.esm.js --format=umd --file=dist/core.umd.js --name=JSONSchemaForm",
10
10
  "build": "npm run build:ts && npm run build:cjs && npm run build:esm && npm run build:umd",
@@ -31,27 +31,27 @@
31
31
  "exports": {
32
32
  ".": {
33
33
  "types": "./lib/index.d.ts",
34
- "require": "./dist/index.js",
34
+ "require": "./dist/index.cjs",
35
35
  "import": "./lib/index.js"
36
36
  },
37
37
  "./lib": {
38
38
  "types": "./lib/index.d.ts",
39
- "require": "./dist/index.js",
39
+ "require": "./dist/index.cjs",
40
40
  "import": "./lib/index.js"
41
41
  },
42
42
  "./lib/*.js": {
43
43
  "types": "./lib/*.d.ts",
44
- "require": "./dist/*.js",
44
+ "require": "./dist/*.cjs",
45
45
  "import": "./lib/*.js"
46
46
  },
47
47
  "./dist": {
48
48
  "types": "./lib/index.d.ts",
49
- "require": "./dist/index.js",
49
+ "require": "./dist/index.cjs",
50
50
  "import": "./lib/index.js"
51
51
  },
52
- "./dist/*.js": {
52
+ "./dist/*.cjs": {
53
53
  "types": "./lib/*.d.ts",
54
- "require": "./dist/*.js",
54
+ "require": "./dist/*.cjs",
55
55
  "import": "./lib/*.js"
56
56
  }
57
57
  },
@@ -65,22 +65,22 @@
65
65
  "node": ">=20"
66
66
  },
67
67
  "peerDependencies": {
68
- "@rjsf/core": "^6.0.0-beta",
69
- "@rjsf/utils": "^6.0.0-beta",
70
68
  "@fluentui/react-components": "^9.63.0",
71
69
  "@fluentui/react-icons": "^2.0.298",
72
70
  "@fluentui/react-migration-v0-v9": "^9.3.10",
71
+ "@rjsf/core": "^6.0.0-beta.23",
72
+ "@rjsf/utils": "^6.0.0-beta.23",
73
73
  "react": ">=18"
74
74
  },
75
75
  "devDependencies": {
76
- "@fluentui/react-components": "^9.63.0",
77
- "@fluentui/react-icons": "^2.0.298",
78
- "@fluentui/react-migration-v0-v9": "^9.3.10",
79
- "@rjsf/core": "^6.0.0-beta.9",
80
- "@rjsf/snapshot-tests": "^6.0.0-beta.9",
81
- "@rjsf/utils": "^6.0.0-beta.9",
82
- "@rjsf/validator-ajv8": "^6.0.0-beta.9",
83
- "eslint": "^8.56.0"
76
+ "@fluentui/react-components": "^9.72.3",
77
+ "@fluentui/react-icons": "^2.0.313",
78
+ "@fluentui/react-migration-v0-v9": "^9.6.11",
79
+ "@rjsf/core": "^6.0.0-beta.23",
80
+ "@rjsf/snapshot-tests": "^6.0.0-beta.23",
81
+ "@rjsf/utils": "^6.0.0-beta.23",
82
+ "@rjsf/validator-ajv8": "^6.0.0-beta.23",
83
+ "eslint": "^8.57.1"
84
84
  },
85
85
  "directories": {
86
86
  "test": "test"
@@ -8,5 +8,5 @@ export default function AddButton<T = any, S extends StrictRJSFSchema = RJSFSche
8
8
  ...props
9
9
  }: IconButtonProps<T, S, F>) {
10
10
  const { translateString } = registry;
11
- return <Button {...props} icon={<AddRegular />} title={translateString(TranslatableString.AddItemButton)} />;
11
+ return <Button title={translateString(TranslatableString.AddItemButton)} {...props} icon={<AddRegular />} />;
12
12
  }
@@ -1,5 +1,5 @@
1
1
  import {
2
- ArrayFieldItemTemplateType,
2
+ ArrayFieldItemTemplateProps,
3
3
  FormContextType,
4
4
  getTemplate,
5
5
  getUiOptions,
@@ -19,13 +19,13 @@ const useStyles = makeStyles({
19
19
 
20
20
  /** The `ArrayFieldItemTemplate` component is the template used to render an items of an array.
21
21
  *
22
- * @param props - The `ArrayFieldItemTemplateType` props for the component
22
+ * @param props - The `ArrayFieldItemTemplateProps` props for the component
23
23
  */
24
24
  export default function ArrayFieldItemTemplate<
25
25
  T = any,
26
26
  S extends StrictRJSFSchema = RJSFSchema,
27
27
  F extends FormContextType = any,
28
- >(props: ArrayFieldItemTemplateType<T, S, F>) {
28
+ >(props: ArrayFieldItemTemplateProps<T, S, F>) {
29
29
  const classes = useStyles();
30
30
  const { children, buttonsProps, hasToolbar, uiSchema, registry } = props;
31
31
  const uiOptions = getUiOptions<T, S, F>(uiSchema);
@@ -4,7 +4,6 @@ import {
4
4
  getTemplate,
5
5
  getUiOptions,
6
6
  ArrayFieldTemplateProps,
7
- ArrayFieldItemTemplateType,
8
7
  FormContextType,
9
8
  RJSFSchema,
10
9
  StrictRJSFSchema,
@@ -19,15 +18,27 @@ const useStyles = makeStyles({
19
18
 
20
19
  /** The `ArrayFieldTemplate` component is the template used to render all items in an array.
21
20
  *
22
- * @param props - The `ArrayFieldItemTemplateType` props for the component
21
+ * @param props - The `ArrayFieldTemplateProps` props for the component
23
22
  */
24
23
  export default function ArrayFieldTemplate<
25
24
  T = any,
26
25
  S extends StrictRJSFSchema = RJSFSchema,
27
26
  F extends FormContextType = any,
28
27
  >(props: ArrayFieldTemplateProps<T, S, F>) {
29
- const { canAdd, disabled, idSchema, uiSchema, items, onAddClick, readonly, registry, required, schema, title } =
30
- props;
28
+ const {
29
+ canAdd,
30
+ disabled,
31
+ fieldPathId,
32
+ uiSchema,
33
+ items,
34
+ optionalDataControl,
35
+ onAddClick,
36
+ readonly,
37
+ registry,
38
+ required,
39
+ schema,
40
+ title,
41
+ } = props;
31
42
  const classes = useStyles();
32
43
  const uiOptions = getUiOptions<T, S, F>(uiSchema);
33
44
  const ArrayFieldDescriptionTemplate = getTemplate<'ArrayFieldDescriptionTemplate', T, S, F>(
@@ -35,16 +46,12 @@ export default function ArrayFieldTemplate<
35
46
  registry,
36
47
  uiOptions,
37
48
  );
38
- const ArrayFieldItemTemplate = getTemplate<'ArrayFieldItemTemplate', T, S, F>(
39
- 'ArrayFieldItemTemplate',
40
- registry,
41
- uiOptions,
42
- );
43
49
  const ArrayFieldTitleTemplate = getTemplate<'ArrayFieldTitleTemplate', T, S, F>(
44
50
  'ArrayFieldTitleTemplate',
45
51
  registry,
46
52
  uiOptions,
47
53
  );
54
+ const showOptionalDataControlInTitle = !readonly && !disabled;
48
55
  // Button templates are not overridden in the uiSchema
49
56
  const {
50
57
  ButtonTemplates: { AddButton },
@@ -52,29 +59,28 @@ export default function ArrayFieldTemplate<
52
59
  return (
53
60
  <>
54
61
  <ArrayFieldTitleTemplate
55
- idSchema={idSchema}
62
+ fieldPathId={fieldPathId}
56
63
  title={uiOptions.title || title}
57
64
  schema={schema}
58
65
  uiSchema={uiSchema}
59
66
  required={required}
60
67
  registry={registry}
68
+ optionalDataControl={showOptionalDataControlInTitle ? optionalDataControl : undefined}
61
69
  />
62
70
  <ArrayFieldDescriptionTemplate
63
- idSchema={idSchema}
71
+ fieldPathId={fieldPathId}
64
72
  description={uiOptions.description || schema.description}
65
73
  schema={schema}
66
74
  uiSchema={uiSchema}
67
75
  registry={registry}
68
76
  />
69
- <Flex column key={`array-item-list-${idSchema.$id}`} className={classes.arrayItemList}>
70
- {items &&
71
- items.map(({ key, ...itemProps }: ArrayFieldItemTemplateType<T, S, F>) => (
72
- <ArrayFieldItemTemplate key={key} {...itemProps} />
73
- ))}
77
+ <Flex column key={`array-item-list-${fieldPathId.$id}`} className={classes.arrayItemList}>
78
+ {!showOptionalDataControlInTitle ? optionalDataControl : undefined}
79
+ {items}
74
80
  {canAdd && (
75
81
  <Flex hAlign='end'>
76
82
  <AddButton
77
- id={buttonId<T>(idSchema, 'add')}
83
+ id={buttonId(fieldPathId, 'add')}
78
84
  className='rjsf-array-item-add'
79
85
  onClick={onAddClick}
80
86
  disabled={disabled || readonly}
@@ -35,6 +35,7 @@ export default function BaseInputTemplate<
35
35
  >(props: BaseInputTemplateProps<T, S, F>) {
36
36
  const {
37
37
  id,
38
+ htmlName,
38
39
  placeholder,
39
40
  required,
40
41
  readonly,
@@ -68,7 +69,7 @@ export default function BaseInputTemplate<
68
69
  )}
69
70
  <Input
70
71
  id={id}
71
- name={id}
72
+ name={htmlName || id}
72
73
  placeholder={placeholder}
73
74
  autoFocus={autofocus}
74
75
  required={required}
@@ -77,16 +78,16 @@ export default function BaseInputTemplate<
77
78
  input={{
78
79
  className: classes.input,
79
80
  // Due to Fluent UI this does not work correctly
80
- list: schema.examples ? examplesId<T>(id) : undefined,
81
+ list: schema.examples ? examplesId(id) : undefined,
81
82
  }}
82
83
  value={value || value === 0 ? value : ''}
83
84
  onChange={onChangeOverride || _onChange}
84
85
  onFocus={_onFocus}
85
86
  onBlur={_onBlur}
86
- aria-describedby={ariaDescribedByIds<T>(id, !!schema.examples)}
87
+ aria-describedby={ariaDescribedByIds(id, !!schema.examples)}
87
88
  />
88
89
  {Array.isArray(schema.examples) && (
89
- <datalist id={examplesId<T>(id)}>
90
+ <datalist id={examplesId(id)}>
90
91
  {(schema.examples as string[])
91
92
  .concat(schema.default && !schema.examples.includes(schema.default) ? ([schema.default] as string[]) : [])
92
93
  .map((example: any) => {
@@ -24,6 +24,7 @@ export default function CheckboxWidget<
24
24
  const {
25
25
  schema,
26
26
  id,
27
+ htmlName,
27
28
  value,
28
29
  disabled,
29
30
  readonly,
@@ -48,15 +49,15 @@ export default function CheckboxWidget<
48
49
  const required = schemaRequiresTrueValue<S>(schema);
49
50
 
50
51
  const _onChange = ({ target: { checked } }: ChangeEvent<HTMLInputElement>) => onChange(checked);
51
- const _onBlur = ({ target }: FocusEvent<HTMLInputElement>) => onBlur(id, target && target.value);
52
- const _onFocus = ({ target }: FocusEvent<HTMLInputElement>) => onFocus(id, target && target.value);
52
+ const _onBlur = ({ target }: FocusEvent<HTMLInputElement>) => onBlur(id, target && target.checked);
53
+ const _onFocus = ({ target }: FocusEvent<HTMLInputElement>) => onFocus(id, target && target.checked);
53
54
  const description = options.description ?? schema.description;
54
55
 
55
56
  return (
56
57
  <>
57
58
  {!hideLabel && description && (
58
59
  <DescriptionFieldTemplate
59
- id={descriptionId<T>(id)}
60
+ id={descriptionId(id)}
60
61
  description={description}
61
62
  schema={schema}
62
63
  uiSchema={uiSchema}
@@ -65,7 +66,7 @@ export default function CheckboxWidget<
65
66
  )}
66
67
  <Checkbox
67
68
  id={id}
68
- name={id}
69
+ name={htmlName || id}
69
70
  label={label}
70
71
  checked={typeof value === 'undefined' ? false : Boolean(value)}
71
72
  required={required}
@@ -74,7 +75,7 @@ export default function CheckboxWidget<
74
75
  onChange={_onChange}
75
76
  onBlur={_onBlur}
76
77
  onFocus={_onFocus}
77
- aria-describedby={ariaDescribedByIds<T>(id)}
78
+ aria-describedby={ariaDescribedByIds(id)}
78
79
  />
79
80
  </>
80
81
  );
@@ -28,6 +28,7 @@ export default function CheckboxesWidget<
28
28
  label,
29
29
  hideLabel,
30
30
  id,
31
+ htmlName,
31
32
  disabled,
32
33
  options,
33
34
  value,
@@ -73,7 +74,7 @@ export default function CheckboxesWidget<
73
74
  <Checkbox
74
75
  key={index}
75
76
  id={optionId(id, index)}
76
- name={id}
77
+ name={htmlName || id}
77
78
  label={option.label}
78
79
  checked={checked}
79
80
  disabled={disabled || itemDisabled || readonly}
@@ -81,7 +82,7 @@ export default function CheckboxesWidget<
81
82
  onChange={_onChange(index)}
82
83
  onBlur={_onBlur}
83
84
  onFocus={_onFocus}
84
- aria-describedby={ariaDescribedByIds<T>(id)}
85
+ aria-describedby={ariaDescribedByIds(id)}
85
86
  />
86
87
  );
87
88
  })}
@@ -20,13 +20,13 @@ export default function FieldErrorTemplate<
20
20
  S extends StrictRJSFSchema = RJSFSchema,
21
21
  F extends FormContextType = any,
22
22
  >(props: FieldErrorProps<T, S, F>) {
23
- const { errors = [], idSchema } = props;
23
+ const { errors = [], fieldPathId } = props;
24
24
  const classes = useStyles();
25
25
 
26
26
  if (errors.length === 0) {
27
27
  return null;
28
28
  }
29
- const id = errorId<T>(idSchema);
29
+ const id = errorId(fieldPathId);
30
30
 
31
31
  return (
32
32
  <ul className={classes.list}>
@@ -10,10 +10,10 @@ export default function FieldHelpTemplate<
10
10
  S extends StrictRJSFSchema = RJSFSchema,
11
11
  F extends FormContextType = any,
12
12
  >(props: FieldHelpProps<T, S, F>) {
13
- const { idSchema, help } = props;
13
+ const { fieldPathId, help } = props;
14
14
  if (!help) {
15
15
  return null;
16
16
  }
17
- const id = helpId<T>(idSchema);
17
+ const id = helpId(fieldPathId);
18
18
  return <Caption1 id={id}>{help}</Caption1>;
19
19
  }
@@ -27,8 +27,9 @@ export default function FieldTemplate<
27
27
  displayLabel,
28
28
  hidden,
29
29
  label,
30
- onDropPropertyClick,
31
- onKeyChange,
30
+ onKeyRename,
31
+ onKeyRenameBlur,
32
+ onRemoveProperty,
32
33
  readonly,
33
34
  required,
34
35
  rawErrors = [],
@@ -57,8 +58,9 @@ export default function FieldTemplate<
57
58
  disabled={disabled}
58
59
  id={id}
59
60
  label={label}
60
- onDropPropertyClick={onDropPropertyClick}
61
- onKeyChange={onKeyChange}
61
+ onKeyRename={onKeyRename}
62
+ onKeyRenameBlur={onKeyRenameBlur}
63
+ onRemoveProperty={onRemoveProperty}
62
64
  readonly={readonly}
63
65
  required={required}
64
66
  schema={schema}
@@ -1,19 +1,25 @@
1
- import { Button } from '@fluentui/react-components';
1
+ import { Button, ButtonProps } from '@fluentui/react-components';
2
2
  import { ArrowSortUpRegular, ArrowSortDownRegular, CopyRegular, SubtractRegular } from '@fluentui/react-icons';
3
3
  import { FormContextType, IconButtonProps, RJSFSchema, StrictRJSFSchema, TranslatableString } from '@rjsf/utils';
4
4
 
5
+ export type FluentIconButtonProps<
6
+ T = any,
7
+ S extends StrictRJSFSchema = RJSFSchema,
8
+ F extends FormContextType = any,
9
+ > = IconButtonProps<T, S, F> & Omit<ButtonProps, 'onChange' | 'as'>;
10
+
5
11
  export default function FluentIconButton<
6
12
  T = any,
7
13
  S extends StrictRJSFSchema = RJSFSchema,
8
14
  F extends FormContextType = any,
9
- >(props: IconButtonProps<T, S, F>) {
15
+ >(props: FluentIconButtonProps<T, S, F>) {
10
16
  const { color, uiSchema, registry, ...otherProps } = props;
11
17
 
12
18
  return <Button {...otherProps} color='secondary' />;
13
19
  }
14
20
 
15
21
  export function CopyButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
16
- props: IconButtonProps<T, S, F>,
22
+ props: FluentIconButtonProps<T, S, F>,
17
23
  ) {
18
24
  const {
19
25
  registry: { translateString },
@@ -28,7 +34,7 @@ export function CopyButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F e
28
34
  }
29
35
 
30
36
  export function MoveDownButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
31
- props: IconButtonProps<T, S, F>,
37
+ props: FluentIconButtonProps<T, S, F>,
32
38
  ) {
33
39
  const {
34
40
  registry: { translateString },
@@ -43,7 +49,7 @@ export function MoveDownButton<T = any, S extends StrictRJSFSchema = RJSFSchema,
43
49
  }
44
50
 
45
51
  export function MoveUpButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
46
- props: IconButtonProps<T, S, F>,
52
+ props: FluentIconButtonProps<T, S, F>,
47
53
  ) {
48
54
  const {
49
55
  registry: { translateString },
@@ -58,7 +64,7 @@ export function MoveUpButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F
58
64
  }
59
65
 
60
66
  export function RemoveButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
61
- props: IconButtonProps<T, S, F>,
67
+ props: FluentIconButtonProps<T, S, F>,
62
68
  ) {
63
69
  const {
64
70
  registry: { translateString },
@@ -0,0 +1,25 @@
1
+ import { makeStyles } from '@fluentui/react-components';
2
+ import { FormContextType, MultiSchemaFieldTemplateProps, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';
3
+
4
+ const useStyles = makeStyles({
5
+ root: {
6
+ '> div': { marginBottom: '4px' },
7
+ },
8
+ });
9
+
10
+ export default function MultiSchemaFieldTemplate<
11
+ T = any,
12
+ S extends StrictRJSFSchema = RJSFSchema,
13
+ F extends FormContextType = any,
14
+ >(props: MultiSchemaFieldTemplateProps<T, S, F>) {
15
+ const { selector, optionSchemaField } = props;
16
+
17
+ const styles = useStyles();
18
+
19
+ return (
20
+ <div className={styles.root}>
21
+ <div>{selector}</div>
22
+ {optionSchemaField}
23
+ </div>
24
+ );
25
+ }
@@ -0,0 +1,2 @@
1
+ export { default } from './MultiSchemaFieldTemplate';
2
+ export * from './MultiSchemaFieldTemplate';
@@ -31,10 +31,11 @@ export default function ObjectFieldTemplate<
31
31
  disabled,
32
32
  readonly,
33
33
  uiSchema,
34
- idSchema,
34
+ fieldPathId,
35
35
  schema,
36
36
  formData,
37
- onAddClick,
37
+ optionalDataControl,
38
+ onAddProperty,
38
39
  registry,
39
40
  } = props;
40
41
  const uiOptions = getUiOptions<T, S, F>(uiSchema);
@@ -44,6 +45,7 @@ export default function ObjectFieldTemplate<
44
45
  registry,
45
46
  uiOptions,
46
47
  );
48
+ const showOptionalDataControlInTitle = !readonly && !disabled;
47
49
  // Button templates are not overridden in the uiSchema
48
50
  const {
49
51
  ButtonTemplates: { AddButton },
@@ -52,17 +54,18 @@ export default function ObjectFieldTemplate<
52
54
  <>
53
55
  {title && (
54
56
  <TitleFieldTemplate
55
- id={titleId<T>(idSchema)}
57
+ id={titleId(fieldPathId)}
56
58
  title={title}
57
59
  required={required}
58
60
  schema={schema}
59
61
  uiSchema={uiSchema}
60
62
  registry={registry}
63
+ optionalDataControl={showOptionalDataControlInTitle ? optionalDataControl : undefined}
61
64
  />
62
65
  )}
63
66
  {description && (
64
67
  <DescriptionFieldTemplate
65
- id={descriptionId<T>(idSchema)}
68
+ id={descriptionId(fieldPathId)}
66
69
  description={description}
67
70
  schema={schema}
68
71
  uiSchema={uiSchema}
@@ -70,6 +73,7 @@ export default function ObjectFieldTemplate<
70
73
  />
71
74
  )}
72
75
  <Flex fill column gap='gap.medium'>
76
+ {!showOptionalDataControlInTitle ? optionalDataControl : undefined}
73
77
  {properties.map((element, index) =>
74
78
  // Remove the <Grid> if the inner element is hidden as the <Grid>
75
79
  // itself would otherwise still take up space.
@@ -84,9 +88,9 @@ export default function ObjectFieldTemplate<
84
88
  {canExpand<T, S, F>(schema, uiSchema, formData) && (
85
89
  <Flex hAlign='end'>
86
90
  <AddButton
87
- id={buttonId<T>(idSchema, 'add')}
91
+ id={buttonId(fieldPathId, 'add')}
88
92
  className='rjsf-object-property-expand'
89
- onClick={onAddClick(schema)}
93
+ onClick={onAddProperty}
90
94
  disabled={disabled || readonly}
91
95
  uiSchema={uiSchema}
92
96
  registry={registry}
@@ -0,0 +1,48 @@
1
+ import { FormContextType, OptionalDataControlsTemplateProps, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';
2
+ import { AddSquareMultipleRegular, SubtractSquareMultipleRegular } from '@fluentui/react-icons';
3
+
4
+ import FluentIconButton from '../IconButton';
5
+
6
+ /** The OptionalDataControlsTemplate renders one of three different states. If
7
+ * there is an `onAddClick()` function, it renders the "Add" button. If there is
8
+ * an `onRemoveClick()` function, it renders the "Remove" button. Otherwise it
9
+ * renders the "No data found" section. All of them use the `label` as either
10
+ * the `title` of buttons or simply outputting it.
11
+ *
12
+ * @param props - The `OptionalDataControlsTemplateProps` for the template
13
+ */
14
+ export default function OptionalDataControlsTemplate<
15
+ T = any,
16
+ S extends StrictRJSFSchema = RJSFSchema,
17
+ F extends FormContextType = any,
18
+ >(props: OptionalDataControlsTemplateProps<T, S, F>) {
19
+ const { id, registry, label, onAddClick, onRemoveClick } = props;
20
+ if (onAddClick) {
21
+ return (
22
+ <FluentIconButton
23
+ id={id}
24
+ registry={registry}
25
+ icon={<AddSquareMultipleRegular />}
26
+ className='rjsf-add-optional-data'
27
+ onClick={onAddClick}
28
+ title={label}
29
+ size='small'
30
+ appearance='secondary'
31
+ />
32
+ );
33
+ } else if (onRemoveClick) {
34
+ return (
35
+ <FluentIconButton
36
+ id={id}
37
+ registry={registry}
38
+ icon={<SubtractSquareMultipleRegular />}
39
+ className='rjsf-remove-optional-data'
40
+ onClick={onRemoveClick}
41
+ title={label}
42
+ size='small'
43
+ appearance='secondary'
44
+ />
45
+ );
46
+ }
47
+ return <em id={id}>{label}</em>;
48
+ }
@@ -0,0 +1,2 @@
1
+ export { default } from './OptionalDataControlsTemplate';
2
+ export * from './OptionalDataControlsTemplate';
@@ -19,6 +19,7 @@ import { Label, Radio, RadioGroup, RadioGroupOnChangeData } from '@fluentui/reac
19
19
  */
20
20
  export default function RadioWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
21
21
  id,
22
+ htmlName,
22
23
  options,
23
24
  value,
24
25
  required,
@@ -51,13 +52,13 @@ export default function RadioWidget<T = any, S extends StrictRJSFSchema = RJSFSc
51
52
  )}
52
53
  <RadioGroup
53
54
  id={id}
54
- name={id}
55
+ name={htmlName || id}
55
56
  layout={inline ? 'horizontal' : 'vertical'}
56
57
  value={selectedIndex as string | undefined}
57
58
  onChange={_onChange}
58
59
  onBlur={_onBlur}
59
60
  onFocus={_onFocus}
60
- aria-describedby={ariaDescribedByIds<T>(id)}
61
+ aria-describedby={ariaDescribedByIds(id)}
61
62
  >
62
63
  {Array.isArray(enumOptions) &&
63
64
  enumOptions.map((option, index) => {
@@ -42,7 +42,7 @@ export default function RangeWidget<T = any, S extends StrictRJSFSchema = RJSFSc
42
42
  onBlur={_onBlur}
43
43
  onFocus={_onFocus}
44
44
  {...sliderProps}
45
- aria-describedby={ariaDescribedByIds<T>(id)}
45
+ aria-describedby={ariaDescribedByIds(id)}
46
46
  />
47
47
  </>
48
48
  );
@@ -25,6 +25,7 @@ function getValue(data: OptionOnSelectData, multiple: boolean) {
25
25
  */
26
26
  function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
27
27
  id,
28
+ htmlName,
28
29
  options,
29
30
  label,
30
31
  hideLabel,
@@ -72,7 +73,7 @@ function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extend
72
73
  >
73
74
  <Dropdown
74
75
  id={id}
75
- name={id}
76
+ name={htmlName || id}
76
77
  multiselect={multiple}
77
78
  className='form-control'
78
79
  value={dropdownValue}
@@ -82,7 +83,7 @@ function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extend
82
83
  onFocus={_onFocus}
83
84
  onOptionSelect={_onChange}
84
85
  selectedOptions={selectedIndexesAsArray}
85
- aria-describedby={ariaDescribedByIds<T>(id)}
86
+ aria-describedby={ariaDescribedByIds(id)}
86
87
  >
87
88
  {showPlaceholderOption && <Option value=''>{placeholder || ''}</Option>}
88
89
  {Array.isArray(enumOptions) &&
@@ -9,7 +9,9 @@ import FieldErrorTemplate from '../FieldErrorTemplate';
9
9
  import FieldHelpTemplate from '../FieldHelpTemplate';
10
10
  import FieldTemplate from '../FieldTemplate';
11
11
  import GridTemplate from '../GridTemplate';
12
+ import MultiSchemaFieldTemplate from '../MultiSchemaFieldTemplate';
12
13
  import ObjectFieldTemplate from '../ObjectFieldTemplate';
14
+ import OptionalDataControlsTemplate from '../OptionalDataControlsTemplate';
13
15
  import SubmitButton from '../SubmitButton';
14
16
  import TitleField from '../TitleField';
15
17
  import WrapIfAdditionalTemplate from '../WrapIfAdditionalTemplate';
@@ -38,7 +40,9 @@ export function generateTemplates<
38
40
  FieldHelpTemplate,
39
41
  FieldTemplate,
40
42
  GridTemplate,
43
+ MultiSchemaFieldTemplate,
41
44
  ObjectFieldTemplate,
45
+ OptionalDataControlsTemplate,
42
46
  TitleFieldTemplate: TitleField,
43
47
  WrapIfAdditionalTemplate,
44
48
  };