@dxos/react-ui-form 0.9.0 → 0.9.1-staging.ee54ba693a
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.
- package/dist/lib/browser/index.mjs +2337 -1919
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +2337 -1919
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/annotations.d.ts +47 -0
- package/dist/types/src/annotations.d.ts.map +1 -0
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +3 -3
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.d.ts +23 -110
- package/dist/types/src/components/Form/Form.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.stories.d.ts +48 -101
- package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.theme.d.ts +252 -0
- package/dist/types/src/components/Form/Form.theme.d.ts.map +1 -0
- package/dist/types/src/components/Form/Form.theme.test.d.ts +2 -0
- package/dist/types/src/components/Form/Form.theme.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormControls.d.ts +75 -0
- package/dist/types/src/components/Form/FormControls.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/FormField.d.ts +44 -0
- package/dist/types/src/components/Form/FormField/FormField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/FormFieldHeader.d.ts +27 -0
- package/dist/types/src/components/Form/FormField/FormFieldHeader.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/FormRow.d.ts +85 -0
- package/dist/types/src/components/Form/FormField/FormRow.d.ts.map +1 -0
- package/dist/types/src/components/Form/{FormFieldComponent.stories.d.ts → FormField/FormRow.stories.d.ts} +6 -3
- package/dist/types/src/components/Form/FormField/FormRow.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/{fields → FormField/fields/ArrayField}/ArrayField.d.ts +2 -2
- package/dist/types/src/components/Form/FormField/fields/ArrayField/ArrayField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/ArrayField/ArrayField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/ArrayField/ArrayField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/ArrayField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/ArrayField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/AsyncSelectField/AsyncSelectField.d.ts +12 -0
- package/dist/types/src/components/Form/FormField/fields/AsyncSelectField/AsyncSelectField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/AsyncSelectField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/AsyncSelectField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/AutofillField/AutofillField.d.ts +12 -0
- package/dist/types/src/components/Form/FormField/fields/AutofillField/AutofillField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/AutofillField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/AutofillField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/BooleanField/BooleanField.d.ts +4 -0
- package/dist/types/src/components/Form/FormField/fields/BooleanField/BooleanField.d.ts.map +1 -0
- package/dist/types/src/components/{Settings/Settings.stories.d.ts → Form/FormField/fields/BooleanField/BooleanField.stories.d.ts} +1 -2
- package/dist/types/src/components/Form/FormField/fields/BooleanField/BooleanField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/BooleanField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/BooleanField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/ComboboxField/ComboboxField.d.ts +12 -0
- package/dist/types/src/components/Form/FormField/fields/ComboboxField/ComboboxField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/ComboboxField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/ComboboxField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/DateField/DateField.d.ts +4 -0
- package/dist/types/src/components/Form/FormField/fields/DateField/DateField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/DateField/DateField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/DateField/DateField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/DateField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/DateField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/GeoPointField/GeoPointField.d.ts +5 -0
- package/dist/types/src/components/Form/FormField/fields/GeoPointField/GeoPointField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/GeoPointField/GeoPointField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/GeoPointField/GeoPointField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/GeoPointField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/GeoPointField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/{fields → FormField/fields/MarkdownField}/MarkdownField.d.ts +2 -2
- package/dist/types/src/components/Form/FormField/fields/MarkdownField/MarkdownField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/MarkdownField/MarkdownField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/MarkdownField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/MarkdownField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/NumberField.d.ts +15 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/NumberField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/NumberField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/NumberField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/NumberField.test.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/NumberField.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/NumberField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/PasswordField/PasswordField.d.ts +4 -0
- package/dist/types/src/components/Form/FormField/fields/PasswordField/PasswordField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/PasswordField/PasswordField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/PasswordField/PasswordField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/PasswordField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/PasswordField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/InlineRefField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/RefField.d.ts +16 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/RefField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/RefField.stories.d.ts +92 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/RefField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/RefField.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/index.d.ts +3 -0
- package/dist/types/src/components/Form/FormField/fields/RefField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/SelectField/SelectField.d.ts +29 -0
- package/dist/types/src/components/Form/FormField/fields/SelectField/SelectField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/SelectField/SelectField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/SelectField/SelectField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/SelectField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/SelectField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/SelectOptionField/SelectOptionField.d.ts +5 -0
- package/dist/types/src/components/Form/FormField/fields/SelectOptionField/SelectOptionField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/SelectOptionField/SelectOptionField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/SelectOptionField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/SelectOptionField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TextAreaField/TextAreaField.d.ts +4 -0
- package/dist/types/src/components/Form/FormField/fields/TextAreaField/TextAreaField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TextAreaField/TextAreaField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/TextAreaField/TextAreaField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TextAreaField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/TextAreaField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TextField/TextField.d.ts +4 -0
- package/dist/types/src/components/Form/FormField/fields/TextField/TextField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TextField/TextField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/TextField/TextField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TextField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/TextField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/{fields → FormField/fields/TupleField}/TupleField.d.ts +2 -2
- package/dist/types/src/components/Form/FormField/fields/TupleField/TupleField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TupleField/TupleField.stories.d.ts +88 -0
- package/dist/types/src/components/Form/FormField/fields/TupleField/TupleField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/fields/TupleField/index.d.ts +2 -0
- package/dist/types/src/components/Form/FormField/fields/TupleField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/{fields → FormField/fields}/index.d.ts +4 -1
- package/dist/types/src/components/Form/FormField/fields/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/index.d.ts +6 -0
- package/dist/types/src/components/Form/FormField/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormField/presentation.d.ts +22 -0
- package/dist/types/src/components/Form/FormField/presentation.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormFieldSet/FormFieldSet.d.ts +30 -0
- package/dist/types/src/components/Form/FormFieldSet/FormFieldSet.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormFieldSet/FormFieldSetContainer.d.ts +22 -0
- package/dist/types/src/components/Form/FormFieldSet/FormFieldSetContainer.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormFieldSet/index.d.ts +3 -0
- package/dist/types/src/components/Form/FormFieldSet/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/{Layout → FormLayout}/FormLayout.d.ts +2 -0
- package/dist/types/src/components/Form/FormLayout/FormLayout.d.ts.map +1 -0
- package/dist/types/src/components/Form/{Layout → FormLayout}/FormLayout.stories.d.ts +5 -5
- package/dist/types/src/components/Form/FormLayout/FormLayout.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormLayout/FormLayout.stories.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormLayout/FormLayout.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormLayout/index.d.ts +3 -0
- package/dist/types/src/components/Form/FormLayout/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormLayout/parser.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormLayout/parser.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/index.d.ts +3 -5
- package/dist/types/src/components/Form/index.d.ts.map +1 -1
- package/dist/types/src/components/Form/meta-tags.d.ts +1 -12
- package/dist/types/src/components/Form/meta-tags.d.ts.map +1 -1
- package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -1
- package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +6 -23
- package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -1
- package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts +2 -1
- package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts.map +1 -1
- package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts +2 -2
- package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +1 -1
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +2 -2
- package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useAsyncFieldEffect.d.ts +24 -0
- package/dist/types/src/hooks/useAsyncFieldEffect.d.ts.map +1 -0
- package/dist/types/src/hooks/useFormContext.d.ts +42 -0
- package/dist/types/src/hooks/useFormContext.d.ts.map +1 -0
- package/dist/types/src/hooks/useFormHandler.d.ts +9 -6
- package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/{components/testing.d.ts → testing/TestLayout.d.ts} +2 -2
- package/dist/types/src/testing/TestLayout.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +3 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/schema.d.ts +40 -0
- package/dist/types/src/testing/schema.d.ts.map +1 -0
- package/dist/types/src/types.d.ts +161 -0
- package/dist/types/src/types.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +1 -1
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/omit.d.ts +12 -0
- package/dist/types/src/util/omit.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -41
- package/src/annotations.ts +63 -0
- package/src/components/FieldEditor/FieldEditor.stories.tsx +1 -1
- package/src/components/FieldEditor/FieldEditor.test.tsx +1 -1
- package/src/components/FieldEditor/FieldEditor.tsx +10 -6
- package/src/components/Form/DESIGN.md +24 -0
- package/src/components/Form/Form.stories.tsx +260 -61
- package/src/components/Form/Form.theme.test.ts +33 -0
- package/src/components/Form/Form.theme.ts +86 -0
- package/src/components/Form/Form.tsx +30 -453
- package/src/components/Form/FormControls.tsx +377 -0
- package/src/components/Form/{FormField.tsx → FormField/FormField.tsx} +98 -71
- package/src/components/Form/FormField/FormFieldHeader.tsx +68 -0
- package/src/components/Form/FormField/FormRow.stories.tsx +97 -0
- package/src/components/Form/FormField/FormRow.tsx +298 -0
- package/src/components/Form/FormField/fields/ArrayField/ArrayField.stories.tsx +119 -0
- package/src/components/Form/FormField/fields/ArrayField/ArrayField.tsx +328 -0
- package/src/components/Form/FormField/fields/ArrayField/index.ts +5 -0
- package/src/components/Form/FormField/fields/AsyncSelectField/AsyncSelectField.tsx +59 -0
- package/src/components/Form/FormField/fields/AsyncSelectField/index.ts +5 -0
- package/src/components/Form/FormField/fields/AutofillField/AutofillField.tsx +67 -0
- package/src/components/Form/FormField/fields/AutofillField/index.ts +5 -0
- package/src/components/Form/FormField/fields/BooleanField/BooleanField.stories.tsx +52 -0
- package/src/components/Form/FormField/fields/BooleanField/BooleanField.tsx +28 -0
- package/src/components/Form/FormField/fields/BooleanField/index.ts +5 -0
- package/src/components/Form/FormField/fields/ComboboxField/ComboboxField.tsx +104 -0
- package/src/components/Form/FormField/fields/ComboboxField/index.ts +5 -0
- package/src/components/Form/FormField/fields/DateField/DateField.stories.tsx +60 -0
- package/src/components/Form/{fields → FormField/fields/DateField}/DateField.tsx +12 -10
- package/src/components/Form/FormField/fields/DateField/index.ts +5 -0
- package/src/components/Form/FormField/fields/GeoPointField/GeoPointField.stories.tsx +53 -0
- package/src/components/Form/{fields → FormField/fields/GeoPointField}/GeoPointField.tsx +19 -21
- package/src/components/Form/FormField/fields/GeoPointField/index.ts +5 -0
- package/src/components/Form/{fields → FormField/fields/MarkdownField}/MarkdownField.stories.tsx +8 -8
- package/src/components/Form/{fields → FormField/fields/MarkdownField}/MarkdownField.tsx +41 -41
- package/src/components/Form/FormField/fields/MarkdownField/index.ts +5 -0
- package/src/components/Form/FormField/fields/NumberField/NumberField.stories.tsx +52 -0
- package/src/components/Form/FormField/fields/NumberField/NumberField.test.ts +29 -0
- package/src/components/Form/FormField/fields/NumberField/NumberField.tsx +140 -0
- package/src/components/Form/FormField/fields/NumberField/index.ts +5 -0
- package/src/components/Form/FormField/fields/PasswordField/PasswordField.stories.tsx +53 -0
- package/src/components/Form/FormField/fields/PasswordField/PasswordField.tsx +41 -0
- package/src/components/Form/FormField/fields/PasswordField/index.ts +5 -0
- package/src/components/Form/{fields → FormField/fields/RefField}/InlineRefField.tsx +21 -14
- package/src/components/Form/FormField/fields/RefField/RefField.stories.tsx +97 -0
- package/src/components/Form/{fields → FormField/fields/RefField}/RefField.test.ts +10 -1
- package/src/components/Form/{fields → FormField/fields/RefField}/RefField.tsx +55 -47
- package/src/components/Form/FormField/fields/RefField/index.ts +6 -0
- package/src/components/Form/FormField/fields/SelectField/SelectField.stories.tsx +53 -0
- package/src/components/Form/FormField/fields/SelectField/SelectField.tsx +136 -0
- package/src/components/Form/FormField/fields/SelectField/index.ts +5 -0
- package/src/components/Form/{fields → FormField/fields/SelectOptionField}/SelectOptionField.stories.tsx +5 -5
- package/src/components/Form/{fields → FormField/fields/SelectOptionField}/SelectOptionField.tsx +56 -54
- package/src/components/Form/FormField/fields/SelectOptionField/index.ts +5 -0
- package/src/components/Form/FormField/fields/TextAreaField/TextAreaField.stories.tsx +53 -0
- package/src/components/Form/{fields → FormField/fields/TextAreaField}/TextAreaField.tsx +6 -4
- package/src/components/Form/FormField/fields/TextAreaField/index.ts +5 -0
- package/src/components/Form/FormField/fields/TextField/TextField.stories.tsx +52 -0
- package/src/components/Form/{fields → FormField/fields/TextField}/TextField.tsx +6 -4
- package/src/components/Form/FormField/fields/TextField/index.ts +5 -0
- package/src/components/Form/FormField/fields/TupleField/TupleField.stories.tsx +55 -0
- package/src/components/Form/{fields → FormField/fields/TupleField}/TupleField.tsx +4 -2
- package/src/components/Form/FormField/fields/TupleField/index.ts +5 -0
- package/src/components/Form/{fields → FormField/fields}/index.ts +4 -1
- package/src/components/Form/FormField/index.ts +10 -0
- package/src/components/Form/FormField/presentation.tsx +32 -0
- package/src/components/Form/{FormFieldSet.tsx → FormFieldSet/FormFieldSet.tsx} +53 -90
- package/src/components/Form/FormFieldSet/FormFieldSetContainer.tsx +93 -0
- package/src/components/Form/FormFieldSet/index.ts +6 -0
- package/src/components/Form/{Layout → FormLayout}/FormLayout.stories.tsx +11 -9
- package/src/components/Form/{Layout → FormLayout}/FormLayout.tsx +29 -18
- package/src/components/Form/FormLayout/index.ts +6 -0
- package/src/components/Form/index.ts +3 -5
- package/src/components/Form/meta-tags.test.ts +1 -1
- package/src/components/Form/meta-tags.ts +1 -1
- package/src/components/ObjectForm/ObjectForm.tsx +15 -14
- package/src/components/ObjectPicker/ObjectPicker.tsx +20 -27
- package/src/components/ObjectProperties/ObjectProperties.stories.tsx +2 -2
- package/src/components/ObjectProperties/ObjectProperties.test.tsx +1 -1
- package/src/components/ObjectProperties/ObjectProperties.tsx +13 -8
- package/src/components/RefEditor/RefEditor.stories.tsx +2 -3
- package/src/components/RefEditor/RefEditor.tsx +1 -1
- package/src/components/ViewEditor/ViewEditor.stories.tsx +6 -7
- package/src/components/ViewEditor/ViewEditor.test.tsx +9 -3
- package/src/components/ViewEditor/ViewEditor.tsx +98 -128
- package/src/components/index.ts +0 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAsyncFieldEffect.ts +81 -0
- package/src/hooks/useFormContext.ts +89 -0
- package/src/hooks/useFormHandler.ts +12 -10
- package/src/index.ts +2 -0
- package/src/{components/testing.tsx → testing/TestLayout.tsx} +16 -13
- package/src/testing/index.ts +7 -0
- package/src/testing/schema.ts +59 -0
- package/src/types.ts +186 -0
- package/src/util/index.ts +1 -1
- package/src/util/omit.ts +61 -0
- package/src/util/properties.test.ts +110 -28
- package/src/util/refs.ts +1 -1
- package/src/vitest-setup.ts +40 -0
- package/dist/types/src/components/Form/FormField.d.ts +0 -52
- package/dist/types/src/components/Form/FormField.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormFieldComponent.d.ts +0 -98
- package/dist/types/src/components/Form/FormFieldComponent.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormFieldSet.d.ts +0 -26
- package/dist/types/src/components/Form/FormFieldSet.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormTooltipsContext.d.ts +0 -19
- package/dist/types/src/components/Form/FormTooltipsContext.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/FormLayout.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/annotation.d.ts +0 -30
- package/dist/types/src/components/Form/Layout/annotation.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/index.d.ts +0 -4
- package/dist/types/src/components/Form/Layout/index.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/parser.d.ts.map +0 -1
- package/dist/types/src/components/Form/Layout/parser.test.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/BooleanField.d.ts +0 -4
- package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/DateField.d.ts +0 -4
- package/dist/types/src/components/Form/fields/DateField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/GeoPointField.d.ts +0 -5
- package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/InlineRefField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/NumberField.d.ts +0 -4
- package/dist/types/src/components/Form/fields/NumberField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/RefField.d.ts +0 -34
- package/dist/types/src/components/Form/fields/RefField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/RefField.test.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/SelectField.d.ts +0 -13
- package/dist/types/src/components/Form/fields/SelectField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +0 -5
- package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/TextAreaField.d.ts +0 -4
- package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/TextField.d.ts +0 -4
- package/dist/types/src/components/Form/fields/TextField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/TupleField.d.ts.map +0 -1
- package/dist/types/src/components/Form/fields/index.d.ts.map +0 -1
- package/dist/types/src/components/Settings/Settings.d.ts +0 -51
- package/dist/types/src/components/Settings/Settings.d.ts.map +0 -1
- package/dist/types/src/components/Settings/Settings.stories.d.ts.map +0 -1
- package/dist/types/src/components/Settings/SettingsFieldSet.d.ts +0 -43
- package/dist/types/src/components/Settings/SettingsFieldSet.d.ts.map +0 -1
- package/dist/types/src/components/Settings/SettingsItem.d.ts +0 -16
- package/dist/types/src/components/Settings/SettingsItem.d.ts.map +0 -1
- package/dist/types/src/components/Settings/SettingsSelectField.d.ts +0 -18
- package/dist/types/src/components/Settings/SettingsSelectField.d.ts.map +0 -1
- package/dist/types/src/components/Settings/index.d.ts +0 -4
- package/dist/types/src/components/Settings/index.d.ts.map +0 -1
- package/dist/types/src/components/testing.d.ts.map +0 -1
- package/dist/types/src/util/field-type.d.ts +0 -19
- package/dist/types/src/util/field-type.d.ts.map +0 -1
- package/src/components/Form/AUDIT.md +0 -17
- package/src/components/Form/FormFieldComponent.stories.tsx +0 -65
- package/src/components/Form/FormFieldComponent.tsx +0 -253
- package/src/components/Form/FormTooltipsContext.ts +0 -25
- package/src/components/Form/Layout/annotation.ts +0 -38
- package/src/components/Form/Layout/index.ts +0 -7
- package/src/components/Form/README.md +0 -3
- package/src/components/Form/fields/ArrayField.tsx +0 -173
- package/src/components/Form/fields/BooleanField.tsx +0 -22
- package/src/components/Form/fields/NumberField.tsx +0 -76
- package/src/components/Form/fields/SelectField.tsx +0 -77
- package/src/components/Settings/AUDIT.md +0 -51
- package/src/components/Settings/Settings.stories.tsx +0 -104
- package/src/components/Settings/Settings.tsx +0 -81
- package/src/components/Settings/SettingsFieldSet.tsx +0 -257
- package/src/components/Settings/SettingsItem.tsx +0 -58
- package/src/components/Settings/SettingsSelectField.tsx +0 -59
- package/src/components/Settings/index.ts +0 -7
- package/src/util/field-type.ts +0 -60
- /package/dist/types/src/components/Form/{fields → FormField/fields/MarkdownField}/MarkdownField.stories.d.ts +0 -0
- /package/dist/types/src/components/Form/{fields → FormField/fields/RefField}/InlineRefField.d.ts +0 -0
- /package/dist/types/src/components/Form/{fields → FormField/fields/RefField}/RefField.test.d.ts +0 -0
- /package/dist/types/src/components/Form/{fields → FormField/fields/SelectOptionField}/SelectOptionField.stories.d.ts +0 -0
- /package/dist/types/src/components/Form/{Layout → FormLayout}/FormLayout.stories.test.d.ts +0 -0
- /package/dist/types/src/components/Form/{Layout → FormLayout}/FormLayout.test.d.ts +0 -0
- /package/dist/types/src/components/Form/{Layout → FormLayout}/parser.d.ts +0 -0
- /package/dist/types/src/components/Form/{Layout → FormLayout}/parser.test.d.ts +0 -0
- /package/src/components/Form/{Layout → FormLayout}/FormLayout.stories.test.tsx +0 -0
- /package/src/components/Form/{Layout → FormLayout}/FormLayout.test.ts +0 -0
- /package/src/components/Form/{Layout → FormLayout}/parser.test.ts +0 -0
- /package/src/components/Form/{Layout → FormLayout}/parser.ts +0 -0
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import * as SchemaAST from 'effect/SchemaAST';
|
|
6
|
-
import * as String from 'effect/String';
|
|
7
|
-
import React, { useCallback, useMemo } from 'react';
|
|
8
|
-
|
|
9
|
-
import { SchemaEx } from '@dxos/effect';
|
|
10
|
-
import { Input, Select } from '@dxos/react-ui';
|
|
11
|
-
|
|
12
|
-
import { getFormProperties, type SelectOption, detectFieldType, getSelectOptionsFromAst } from '../../util';
|
|
13
|
-
import { SettingsItem } from './SettingsItem';
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
// Types
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Props for a custom field renderer.
|
|
21
|
-
* The renderer provides the control only; SettingsItem wrapper is handled by FieldSet.
|
|
22
|
-
*/
|
|
23
|
-
export type SettingsFieldProps<T = any> = {
|
|
24
|
-
value: T;
|
|
25
|
-
onChange: (value: T) => void;
|
|
26
|
-
readonly?: boolean;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Map of property names to either a custom field renderer or a nested field map for struct fields.
|
|
31
|
-
* When a value type `T` is provided, the map shape is checked against the schema's value type.
|
|
32
|
-
*/
|
|
33
|
-
export type SettingsFieldMap<T extends Record<string, any> = Record<string, any>> = {
|
|
34
|
-
[K in keyof T]?: NonNullable<T[K]> extends Record<string, any>
|
|
35
|
-
? SettingsFieldMap<NonNullable<T[K]>>
|
|
36
|
-
: React.FC<SettingsFieldProps<T[K]>>;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export type SettingsFieldSetProps<T extends Record<string, any> = Record<string, any>> = {
|
|
40
|
-
/** Effect Schema for the settings object. */
|
|
41
|
-
schema: { ast: SchemaAST.AST };
|
|
42
|
-
|
|
43
|
-
/** Current settings values. */
|
|
44
|
-
values: T;
|
|
45
|
-
|
|
46
|
-
/** Callback when any value changes. Receives a new complete object. */
|
|
47
|
-
onValuesChanged?: (values: T) => void;
|
|
48
|
-
|
|
49
|
-
/** When true, all controls are disabled. */
|
|
50
|
-
readonly?: boolean;
|
|
51
|
-
|
|
52
|
-
/** Map of property names to custom field renderers. Nested objects map to struct sub-fields. */
|
|
53
|
-
fieldMap?: SettingsFieldMap<T>;
|
|
54
|
-
|
|
55
|
-
/** Control field visibility. Receives the dotted path (e.g. `'modelDefaults.edge'`) at every level. */
|
|
56
|
-
visible?: (path: string, values: T) => boolean;
|
|
57
|
-
|
|
58
|
-
/** Override the order of fields. Fields not listed are appended in schema order. Applied per scope. */
|
|
59
|
-
sort?: string[];
|
|
60
|
-
|
|
61
|
-
/** Internal: dot-path prefix used by recursive struct rendering. */
|
|
62
|
-
pathPrefix?: string;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
// Component
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
export const SettingsFieldSet = <T extends Record<string, any>>({
|
|
70
|
-
schema,
|
|
71
|
-
values,
|
|
72
|
-
onValuesChanged,
|
|
73
|
-
readonly,
|
|
74
|
-
fieldMap,
|
|
75
|
-
visible,
|
|
76
|
-
sort,
|
|
77
|
-
pathPrefix = '',
|
|
78
|
-
}: SettingsFieldSetProps<T>) => {
|
|
79
|
-
const properties = useMemo(() => {
|
|
80
|
-
const props = getFormProperties(schema.ast);
|
|
81
|
-
if (!sort) {
|
|
82
|
-
return props;
|
|
83
|
-
}
|
|
84
|
-
const rank = (name: string) => {
|
|
85
|
-
const idx = sort.indexOf(name);
|
|
86
|
-
return idx === -1 ? Number.POSITIVE_INFINITY : idx;
|
|
87
|
-
};
|
|
88
|
-
return [...props].sort(({ name: a }, { name: b }) => rank(a.toString()) - rank(b.toString()));
|
|
89
|
-
}, [schema, sort]);
|
|
90
|
-
|
|
91
|
-
const handleChange = useCallback(
|
|
92
|
-
(name: string, value: unknown) => {
|
|
93
|
-
onValuesChanged?.({ ...values, [name]: value } as T);
|
|
94
|
-
},
|
|
95
|
-
[values, onValuesChanged],
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
return (
|
|
99
|
-
<>
|
|
100
|
-
{properties.map((property) => {
|
|
101
|
-
const name = property.name.toString();
|
|
102
|
-
const path = pathPrefix ? `${pathPrefix}.${name}` : name;
|
|
103
|
-
if (visible && !visible(path, values)) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const entry = fieldMap?.[name as keyof typeof fieldMap] as
|
|
108
|
-
| React.FC<SettingsFieldProps>
|
|
109
|
-
| SettingsFieldMap
|
|
110
|
-
| undefined;
|
|
111
|
-
return (
|
|
112
|
-
<SettingsFieldItem
|
|
113
|
-
key={name}
|
|
114
|
-
path={path}
|
|
115
|
-
property={property}
|
|
116
|
-
value={values[name]}
|
|
117
|
-
onChange={(value) => handleChange(name, value)}
|
|
118
|
-
readonly={readonly}
|
|
119
|
-
customField={typeof entry === 'function' ? entry : undefined}
|
|
120
|
-
nestedFieldMap={typeof entry === 'object' ? entry : undefined}
|
|
121
|
-
visible={visible as (path: string, values: any) => boolean}
|
|
122
|
-
sort={sort}
|
|
123
|
-
/>
|
|
124
|
-
);
|
|
125
|
-
})}
|
|
126
|
-
</>
|
|
127
|
-
);
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
SettingsFieldSet.displayName = 'Settings.FieldSet';
|
|
131
|
-
|
|
132
|
-
//
|
|
133
|
-
// Internal: render a single settings field.
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
type SettingsFieldItemProps = {
|
|
137
|
-
property: SchemaEx.SchemaProperty;
|
|
138
|
-
path: string;
|
|
139
|
-
value: any;
|
|
140
|
-
onChange: (value: any) => void;
|
|
141
|
-
readonly?: boolean;
|
|
142
|
-
customField?: React.FC<SettingsFieldProps>;
|
|
143
|
-
nestedFieldMap?: SettingsFieldMap;
|
|
144
|
-
visible?: (path: string, values: any) => boolean;
|
|
145
|
-
sort?: string[];
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const SettingsFieldItem = ({
|
|
149
|
-
property,
|
|
150
|
-
path,
|
|
151
|
-
value,
|
|
152
|
-
onChange,
|
|
153
|
-
readonly,
|
|
154
|
-
customField,
|
|
155
|
-
nestedFieldMap,
|
|
156
|
-
visible,
|
|
157
|
-
sort,
|
|
158
|
-
}: SettingsFieldItemProps) => {
|
|
159
|
-
const { type } = property;
|
|
160
|
-
const name = property.name.toString();
|
|
161
|
-
const title = SchemaEx.getAnnotation<string>(SchemaAST.TitleAnnotationId)(type) ?? String.capitalize(name);
|
|
162
|
-
const description = SchemaEx.getAnnotation<string>(SchemaAST.DescriptionAnnotationId)(type);
|
|
163
|
-
|
|
164
|
-
// Custom field renderer.
|
|
165
|
-
if (customField) {
|
|
166
|
-
const CustomField = customField;
|
|
167
|
-
return (
|
|
168
|
-
<SettingsItem title={title} description={description}>
|
|
169
|
-
<CustomField value={value} onChange={onChange} readonly={readonly} />
|
|
170
|
-
</SettingsItem>
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const fieldType = detectFieldType(type);
|
|
175
|
-
|
|
176
|
-
switch (fieldType) {
|
|
177
|
-
case 'struct':
|
|
178
|
-
return (
|
|
179
|
-
<SettingsFieldSet
|
|
180
|
-
schema={{ ast: type }}
|
|
181
|
-
values={value ?? {}}
|
|
182
|
-
onValuesChanged={onChange}
|
|
183
|
-
readonly={readonly}
|
|
184
|
-
fieldMap={nestedFieldMap}
|
|
185
|
-
visible={visible}
|
|
186
|
-
sort={sort}
|
|
187
|
-
pathPrefix={path}
|
|
188
|
-
/>
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
case 'boolean':
|
|
192
|
-
return (
|
|
193
|
-
<SettingsItem title={title} description={description}>
|
|
194
|
-
<Input.Switch disabled={readonly} checked={!!value} onCheckedChange={(checked) => onChange(!!checked)} />
|
|
195
|
-
</SettingsItem>
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
case 'select': {
|
|
199
|
-
const options = getSelectOptionsFromAst(type) ?? [];
|
|
200
|
-
return (
|
|
201
|
-
<SettingsItem title={title} description={description}>
|
|
202
|
-
<Select.Root
|
|
203
|
-
disabled={readonly}
|
|
204
|
-
value={value == null ? '' : globalThis.String(value)}
|
|
205
|
-
onValueChange={(selected) => {
|
|
206
|
-
const matched = options.find((option) => globalThis.String(option.value) === selected);
|
|
207
|
-
onChange(matched?.value ?? selected);
|
|
208
|
-
}}
|
|
209
|
-
>
|
|
210
|
-
<Select.TriggerButton disabled={readonly} />
|
|
211
|
-
<Select.Portal>
|
|
212
|
-
<Select.Content>
|
|
213
|
-
<Select.Viewport>
|
|
214
|
-
{options.map((option: SelectOption) => (
|
|
215
|
-
<Select.Option key={globalThis.String(option.value)} value={globalThis.String(option.value)}>
|
|
216
|
-
{option.label ?? globalThis.String(option.value)}
|
|
217
|
-
</Select.Option>
|
|
218
|
-
))}
|
|
219
|
-
</Select.Viewport>
|
|
220
|
-
<Select.Arrow />
|
|
221
|
-
</Select.Content>
|
|
222
|
-
</Select.Portal>
|
|
223
|
-
</Select.Root>
|
|
224
|
-
</SettingsItem>
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
case 'string':
|
|
229
|
-
return (
|
|
230
|
-
<SettingsItem title={title} description={description}>
|
|
231
|
-
<Input.TextInput disabled={readonly} value={value ?? ''} onChange={(event) => onChange(event.target.value)} />
|
|
232
|
-
</SettingsItem>
|
|
233
|
-
);
|
|
234
|
-
|
|
235
|
-
case 'number':
|
|
236
|
-
return (
|
|
237
|
-
<SettingsItem title={title} description={description}>
|
|
238
|
-
<Input.TextInput
|
|
239
|
-
disabled={readonly}
|
|
240
|
-
type='number'
|
|
241
|
-
value={value ?? ''}
|
|
242
|
-
onChange={(event) => {
|
|
243
|
-
if (event.target.value === '') {
|
|
244
|
-
onChange(undefined);
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
const parsed = Number(event.target.value);
|
|
248
|
-
onChange(Number.isNaN(parsed) ? undefined : parsed);
|
|
249
|
-
}}
|
|
250
|
-
/>
|
|
251
|
-
</SettingsItem>
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
default:
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import React, { type PropsWithChildren } from 'react';
|
|
6
|
-
|
|
7
|
-
import { Input, type Label, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
8
|
-
import { mx } from '@dxos/ui-theme';
|
|
9
|
-
|
|
10
|
-
import { translationKey } from '#translations';
|
|
11
|
-
|
|
12
|
-
const SETTINGS_PANEL_NAME = 'Settings.Panel';
|
|
13
|
-
const SETTINGS_ITEM_NAME = 'Settings.Item';
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
// Panel (bordered card container).
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
type SettingsPanelProps = ThemedClassName<PropsWithChildren>;
|
|
20
|
-
|
|
21
|
-
export const SettingsPanel = ({ classNames, children }: SettingsPanelProps) => {
|
|
22
|
-
return (
|
|
23
|
-
<div className={mx('flex flex-col gap-3 p-trim-md border border-separator rounded-sm', classNames)}>{children}</div>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
SettingsPanel.displayName = SETTINGS_PANEL_NAME;
|
|
28
|
-
|
|
29
|
-
//
|
|
30
|
-
// Item (label + optional description + control, proper label semantics).
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
type SettingsItemProps = PropsWithChildren<{
|
|
34
|
-
title: Label;
|
|
35
|
-
description?: Label;
|
|
36
|
-
}>;
|
|
37
|
-
|
|
38
|
-
export const SettingsItem = ({ title, description = '', children }: SettingsItemProps) => {
|
|
39
|
-
const { t } = useTranslation(translationKey);
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<Input.Root>
|
|
43
|
-
<SettingsPanel classNames='grid grid-cols-1 md:grid-cols-[1fr_1fr] gap-x-trim-lg gap-y-0'>
|
|
44
|
-
<Input.Label classNames='pb-trim-md text-base-fg text-lg md:col-span-2'>
|
|
45
|
-
{toLocalizedString(title, t)}
|
|
46
|
-
</Input.Label>
|
|
47
|
-
<Input.DescriptionAndValidation>
|
|
48
|
-
<Input.Description classNames='text-base text-description'>
|
|
49
|
-
{toLocalizedString(description, t)}
|
|
50
|
-
</Input.Description>
|
|
51
|
-
</Input.DescriptionAndValidation>
|
|
52
|
-
<div className='text-end py-1'>{children}</div>
|
|
53
|
-
</SettingsPanel>
|
|
54
|
-
</Input.Root>
|
|
55
|
-
);
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
SettingsItem.displayName = SETTINGS_ITEM_NAME;
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import React from 'react';
|
|
6
|
-
|
|
7
|
-
import { Select } from '@dxos/react-ui';
|
|
8
|
-
|
|
9
|
-
import { type SettingsFieldProps } from './SettingsFieldSet';
|
|
10
|
-
|
|
11
|
-
export type SelectFieldOption = {
|
|
12
|
-
value: string;
|
|
13
|
-
label?: string;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export type CreateSelectFieldOptions = {
|
|
17
|
-
/** Options to display. Strings are used as both value and label. */
|
|
18
|
-
options: ReadonlyArray<string | SelectFieldOption>;
|
|
19
|
-
/** Label for the sentinel option that maps to `undefined`. Defaults to `'Default'`. Pass `null` to omit. */
|
|
20
|
-
defaultLabel?: string | null;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Factory for a `SettingsFieldSet` `fieldMap` entry that renders a Select control
|
|
25
|
-
* over a fixed list of options, with an optional sentinel for `undefined`.
|
|
26
|
-
*/
|
|
27
|
-
export const createSelectField = ({
|
|
28
|
-
options,
|
|
29
|
-
defaultLabel = 'Default',
|
|
30
|
-
}: CreateSelectFieldOptions): React.FC<SettingsFieldProps<string | undefined>> => {
|
|
31
|
-
const normalized = options.map((option) => (typeof option === 'string' ? { value: option, label: option } : option));
|
|
32
|
-
const hasDefault = defaultLabel !== null;
|
|
33
|
-
// Per-instance sentinel avoids collisions with real option values; empty string when the
|
|
34
|
-
// sentinel is omitted so `undefined` maps to a value Select.Root treats as "no selection".
|
|
35
|
-
const sentinel = hasDefault ? `__default__${Math.random().toString(36).slice(2)}` : '';
|
|
36
|
-
|
|
37
|
-
return ({ value, onChange, readonly }) => (
|
|
38
|
-
<Select.Root
|
|
39
|
-
disabled={readonly}
|
|
40
|
-
value={value ?? sentinel}
|
|
41
|
-
onValueChange={(next) => onChange(hasDefault && next === sentinel ? undefined : next)}
|
|
42
|
-
>
|
|
43
|
-
<Select.TriggerButton disabled={readonly} />
|
|
44
|
-
<Select.Portal>
|
|
45
|
-
<Select.Content>
|
|
46
|
-
<Select.Viewport>
|
|
47
|
-
{hasDefault && <Select.Option value={sentinel}>{defaultLabel}</Select.Option>}
|
|
48
|
-
{normalized.map((option) => (
|
|
49
|
-
<Select.Option key={option.value} value={option.value}>
|
|
50
|
-
{option.label ?? option.value}
|
|
51
|
-
</Select.Option>
|
|
52
|
-
))}
|
|
53
|
-
</Select.Viewport>
|
|
54
|
-
<Select.Arrow />
|
|
55
|
-
</Select.Content>
|
|
56
|
-
</Select.Portal>
|
|
57
|
-
</Select.Root>
|
|
58
|
-
);
|
|
59
|
-
};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
export * from './Settings';
|
|
6
|
-
export { type SettingsFieldMap, type SettingsFieldProps, type SettingsFieldSetProps } from './SettingsFieldSet';
|
|
7
|
-
export { createSelectField, type CreateSelectFieldOptions, type SelectFieldOption } from './SettingsSelectField';
|
package/src/util/field-type.ts
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import * as SchemaAST from 'effect/SchemaAST';
|
|
6
|
-
|
|
7
|
-
import { SchemaEx } from '@dxos/effect';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Detected field type for a schema property.
|
|
11
|
-
*/
|
|
12
|
-
export type SettingsFieldType = 'boolean' | 'string' | 'number' | 'select' | 'struct';
|
|
13
|
-
|
|
14
|
-
export type SelectOption = {
|
|
15
|
-
value: string | number;
|
|
16
|
-
label?: string;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Detect the field type from an Effect Schema AST node.
|
|
21
|
-
*/
|
|
22
|
-
export const detectFieldType = (ast: SchemaAST.AST): SettingsFieldType | undefined => {
|
|
23
|
-
if (SchemaEx.isLiteralUnion(ast)) {
|
|
24
|
-
return 'select';
|
|
25
|
-
}
|
|
26
|
-
if (SchemaAST.isTypeLiteral(ast)) {
|
|
27
|
-
return 'struct';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
switch (ast._tag) {
|
|
31
|
-
case 'BooleanKeyword':
|
|
32
|
-
return 'boolean';
|
|
33
|
-
case 'StringKeyword':
|
|
34
|
-
return 'string';
|
|
35
|
-
case 'NumberKeyword':
|
|
36
|
-
return 'number';
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return undefined;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Extract select options from a literal union AST node.
|
|
44
|
-
* Reads title annotations from individual literals for labels.
|
|
45
|
-
*/
|
|
46
|
-
export const getSelectOptionsFromAst = (ast: SchemaAST.AST): SelectOption[] | undefined => {
|
|
47
|
-
if (!SchemaEx.isLiteralUnion(ast)) {
|
|
48
|
-
return undefined;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return (ast as SchemaAST.Union<SchemaAST.Literal>).types.flatMap((literalNode) => {
|
|
52
|
-
const value = literalNode.literal;
|
|
53
|
-
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
54
|
-
return [];
|
|
55
|
-
}
|
|
56
|
-
const title = SchemaEx.getAnnotation<string>(SchemaAST.TitleAnnotationId, false)(literalNode);
|
|
57
|
-
const label = title ?? (typeof value === 'string' ? value.charAt(0).toUpperCase() + value.slice(1) : String(value));
|
|
58
|
-
return [{ value, label }];
|
|
59
|
-
});
|
|
60
|
-
};
|
|
File without changes
|
/package/dist/types/src/components/Form/{fields → FormField/fields/RefField}/InlineRefField.d.ts
RENAMED
|
File without changes
|
/package/dist/types/src/components/Form/{fields → FormField/fields/RefField}/RefField.test.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|