@dxos/react-ui-form 0.7.2-staging.6d26b2a → 0.7.3-main.2dd075e
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 +39 -36
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +39 -36
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +39 -36
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +2 -2
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.d.ts +3 -2
- package/dist/types/src/components/Form/Form.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.stories.d.ts +9 -5
- package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/components/deprecated/Form.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/useForm.d.ts +10 -4
- package/dist/types/src/hooks/useForm.d.ts.map +1 -1
- package/package.json +23 -22
- package/src/components/FieldEditor/FieldEditor.stories.tsx +3 -3
- package/src/components/FieldEditor/FieldEditor.tsx +8 -8
- package/src/components/Form/Form.stories.tsx +41 -11
- package/src/components/Form/Form.tsx +23 -12
- package/src/components/ViewEditor/ViewEditor.tsx +8 -7
- package/src/components/deprecated/Form.stories.tsx +4 -4
- package/src/hooks/useForm.ts +20 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/ui/react-ui-form/src/translations.ts":{"bytes":5683,"imports":[],"format":"esm"},"packages/ui/react-ui-form/src/components/deprecated/FormInput.tsx":{"bytes":4795,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/components/deprecated/index.ts":{"bytes":520,"imports":[{"path":"packages/ui/react-ui-form/src/components/deprecated/FormInput.tsx","kind":"import-statement","original":"./FormInput"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Input.tsx":{"bytes":3849,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Defaults.tsx":{"bytes":11785,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Input.tsx","kind":"import-statement","original":"./Input"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Custom.tsx":{"bytes":6401,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Input.tsx","kind":"import-statement","original":"./Input"},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/factory.tsx":{"bytes":2489,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Custom.tsx","kind":"import-statement","original":"./Custom"},{"path":"packages/ui/react-ui-form/src/components/Form/Defaults.tsx","kind":"import-statement","original":"./Defaults"}],"format":"esm"},"packages/ui/react-ui-form/src/hooks/useForm.ts":{"bytes":19494,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/hooks/index.ts":{"bytes":502,"imports":[{"path":"packages/ui/react-ui-form/src/hooks/useForm.ts","kind":"import-statement","original":"./useForm"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Form.tsx":{"bytes":21560,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"effect/String","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/effect","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Defaults.tsx","kind":"import-statement","original":"./Defaults"},{"path":"packages/ui/react-ui-form/src/components/Form/factory.tsx","kind":"import-statement","original":"./factory"},{"path":"packages/ui/react-ui-form/src/hooks/index.ts","kind":"import-statement","original":"../../hooks"},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/index.ts":{"bytes":760,"imports":[{"path":"packages/ui/react-ui-form/src/components/Form/Form.tsx","kind":"import-statement","original":"./Form"},{"path":"packages/ui/react-ui-form/src/components/Form/Custom.tsx","kind":"import-statement","original":"./Custom"},{"path":"packages/ui/react-ui-form/src/components/Form/Defaults.tsx","kind":"import-statement","original":"./Defaults"},{"path":"packages/ui/react-ui-form/src/components/Form/Input.tsx","kind":"import-statement","original":"./Input"}],"format":"esm"},"packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx":{"bytes":17958,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"packages/ui/react-ui-form/src/components/Form/index.ts","kind":"import-statement","original":"../Form"}],"format":"esm"},"packages/ui/react-ui-form/src/components/FieldEditor/index.ts":{"bytes":531,"imports":[{"path":"packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx","kind":"import-statement","original":"./FieldEditor"}],"format":"esm"},"packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx":{"bytes":16911,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-list","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"packages/ui/react-ui-form/src/components/FieldEditor/index.ts","kind":"import-statement","original":"../FieldEditor"},{"path":"packages/ui/react-ui-form/src/components/Form/index.ts","kind":"import-statement","original":"../Form"}],"format":"esm"},"packages/ui/react-ui-form/src/components/ViewEditor/index.ts":{"bytes":525,"imports":[{"path":"packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx","kind":"import-statement","original":"./ViewEditor"}],"format":"esm"},"packages/ui/react-ui-form/src/components/index.ts":{"bytes":787,"imports":[{"path":"packages/ui/react-ui-form/src/components/deprecated/index.ts","kind":"import-statement","original":"./deprecated"},{"path":"packages/ui/react-ui-form/src/components/FieldEditor/index.ts","kind":"import-statement","original":"./FieldEditor"},{"path":"packages/ui/react-ui-form/src/components/Form/index.ts","kind":"import-statement","original":"./Form"},{"path":"packages/ui/react-ui-form/src/components/ViewEditor/index.ts","kind":"import-statement","original":"./ViewEditor"}],"format":"esm"},"packages/ui/react-ui-form/src/util/field.ts":{"bytes":12238,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/util/formatting.ts":{"bytes":12559,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/util/index.ts":{"bytes":589,"imports":[{"path":"packages/ui/react-ui-form/src/util/field.ts","kind":"import-statement","original":"./field"},{"path":"packages/ui/react-ui-form/src/util/formatting.ts","kind":"import-statement","original":"./formatting"}],"format":"esm"},"packages/ui/react-ui-form/src/index.ts":{"bytes":916,"imports":[{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/ui/react-ui-form/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-form/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/ui/react-ui-form/src/util/index.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-form/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":69129},"packages/ui/react-ui-form/dist/lib/node-esm/index.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"effect/String","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/effect","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-list","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["BooleanInput","DeprecatedFormInput","FieldEditor","Form","GeiPointInput","InputHeader","NumberInput","SelectInput","TextInput","ViewEditor","cellClassesForFieldType","cellClassesForRowSelection","formatForDisplay","formatForEditing","parseValue","pathNotUniqueError","translations","useForm"],"entryPoint":"packages/ui/react-ui-form/src/index.ts","inputs":{"packages/ui/react-ui-form/src/translations.ts":{"bytesInOutput":1666},"packages/ui/react-ui-form/src/components/deprecated/FormInput.tsx":{"bytesInOutput":1121},"packages/ui/react-ui-form/src/components/deprecated/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx":{"bytesInOutput":4175},"packages/ui/react-ui-form/src/components/Form/Form.tsx":{"bytesInOutput":5036},"packages/ui/react-ui-form/src/components/Form/Defaults.tsx":{"bytesInOutput":2997},"packages/ui/react-ui-form/src/components/Form/Input.tsx":{"bytesInOutput":737},"packages/ui/react-ui-form/src/components/Form/factory.tsx":{"bytesInOutput":332},"packages/ui/react-ui-form/src/components/Form/Custom.tsx":{"bytesInOutput":1388},"packages/ui/react-ui-form/src/hooks/useForm.ts":{"bytesInOutput":3562},"packages/ui/react-ui-form/src/hooks/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/Form/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/FieldEditor/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx":{"bytesInOutput":4295},"packages/ui/react-ui-form/src/components/ViewEditor/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/util/field.ts":{"bytesInOutput":2809},"packages/ui/react-ui-form/src/util/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/util/formatting.ts":{"bytesInOutput":2779}},"bytes":32348}}}
|
|
1
|
+
{"inputs":{"packages/ui/react-ui-form/src/translations.ts":{"bytes":5683,"imports":[],"format":"esm"},"packages/ui/react-ui-form/src/components/deprecated/FormInput.tsx":{"bytes":4795,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/components/deprecated/index.ts":{"bytes":520,"imports":[{"path":"packages/ui/react-ui-form/src/components/deprecated/FormInput.tsx","kind":"import-statement","original":"./FormInput"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Input.tsx":{"bytes":3849,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Defaults.tsx":{"bytes":11785,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Input.tsx","kind":"import-statement","original":"./Input"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Custom.tsx":{"bytes":6401,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Input.tsx","kind":"import-statement","original":"./Input"},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/factory.tsx":{"bytes":2489,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Custom.tsx","kind":"import-statement","original":"./Custom"},{"path":"packages/ui/react-ui-form/src/components/Form/Defaults.tsx","kind":"import-statement","original":"./Defaults"}],"format":"esm"},"packages/ui/react-ui-form/src/hooks/useForm.ts":{"bytes":19634,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/hooks/index.ts":{"bytes":502,"imports":[{"path":"packages/ui/react-ui-form/src/hooks/useForm.ts","kind":"import-statement","original":"./useForm"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/Form.tsx":{"bytes":22191,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"effect/String","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/effect","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/components/Form/Defaults.tsx","kind":"import-statement","original":"./Defaults"},{"path":"packages/ui/react-ui-form/src/components/Form/factory.tsx","kind":"import-statement","original":"./factory"},{"path":"packages/ui/react-ui-form/src/hooks/index.ts","kind":"import-statement","original":"../../hooks"},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"}],"format":"esm"},"packages/ui/react-ui-form/src/components/Form/index.ts":{"bytes":760,"imports":[{"path":"packages/ui/react-ui-form/src/components/Form/Form.tsx","kind":"import-statement","original":"./Form"},{"path":"packages/ui/react-ui-form/src/components/Form/Custom.tsx","kind":"import-statement","original":"./Custom"},{"path":"packages/ui/react-ui-form/src/components/Form/Defaults.tsx","kind":"import-statement","original":"./Defaults"},{"path":"packages/ui/react-ui-form/src/components/Form/Input.tsx","kind":"import-statement","original":"./Input"}],"format":"esm"},"packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx":{"bytes":17911,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"packages/ui/react-ui-form/src/components/Form/index.ts","kind":"import-statement","original":"../Form"}],"format":"esm"},"packages/ui/react-ui-form/src/components/FieldEditor/index.ts":{"bytes":531,"imports":[{"path":"packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx","kind":"import-statement","original":"./FieldEditor"}],"format":"esm"},"packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx":{"bytes":16960,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-list","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"packages/ui/react-ui-form/src/components/FieldEditor/index.ts","kind":"import-statement","original":"../FieldEditor"},{"path":"packages/ui/react-ui-form/src/components/Form/index.ts","kind":"import-statement","original":"../Form"}],"format":"esm"},"packages/ui/react-ui-form/src/components/ViewEditor/index.ts":{"bytes":525,"imports":[{"path":"packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx","kind":"import-statement","original":"./ViewEditor"}],"format":"esm"},"packages/ui/react-ui-form/src/components/index.ts":{"bytes":787,"imports":[{"path":"packages/ui/react-ui-form/src/components/deprecated/index.ts","kind":"import-statement","original":"./deprecated"},{"path":"packages/ui/react-ui-form/src/components/FieldEditor/index.ts","kind":"import-statement","original":"./FieldEditor"},{"path":"packages/ui/react-ui-form/src/components/Form/index.ts","kind":"import-statement","original":"./Form"},{"path":"packages/ui/react-ui-form/src/components/ViewEditor/index.ts","kind":"import-statement","original":"./ViewEditor"}],"format":"esm"},"packages/ui/react-ui-form/src/util/field.ts":{"bytes":12238,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/util/formatting.ts":{"bytes":12559,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-form/src/util/index.ts":{"bytes":589,"imports":[{"path":"packages/ui/react-ui-form/src/util/field.ts","kind":"import-statement","original":"./field"},{"path":"packages/ui/react-ui-form/src/util/formatting.ts","kind":"import-statement","original":"./formatting"}],"format":"esm"},"packages/ui/react-ui-form/src/index.ts":{"bytes":916,"imports":[{"path":"packages/ui/react-ui-form/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/ui/react-ui-form/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-form/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/ui/react-ui-form/src/util/index.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-form/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":69574},"packages/ui/react-ui-form/dist/lib/node-esm/index.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"effect/String","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/effect","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-list","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["BooleanInput","DeprecatedFormInput","FieldEditor","Form","GeiPointInput","InputHeader","NumberInput","SelectInput","TextInput","ViewEditor","cellClassesForFieldType","cellClassesForRowSelection","formatForDisplay","formatForEditing","parseValue","pathNotUniqueError","translations","useForm"],"entryPoint":"packages/ui/react-ui-form/src/index.ts","inputs":{"packages/ui/react-ui-form/src/translations.ts":{"bytesInOutput":1666},"packages/ui/react-ui-form/src/components/deprecated/FormInput.tsx":{"bytesInOutput":1121},"packages/ui/react-ui-form/src/components/deprecated/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx":{"bytesInOutput":4164},"packages/ui/react-ui-form/src/components/Form/Form.tsx":{"bytesInOutput":5122},"packages/ui/react-ui-form/src/components/Form/Defaults.tsx":{"bytesInOutput":2997},"packages/ui/react-ui-form/src/components/Form/Input.tsx":{"bytesInOutput":737},"packages/ui/react-ui-form/src/components/Form/factory.tsx":{"bytesInOutput":332},"packages/ui/react-ui-form/src/components/Form/Custom.tsx":{"bytesInOutput":1388},"packages/ui/react-ui-form/src/hooks/useForm.ts":{"bytesInOutput":3548},"packages/ui/react-ui-form/src/hooks/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/Form/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/FieldEditor/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx":{"bytesInOutput":4320},"packages/ui/react-ui-form/src/components/ViewEditor/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/util/field.ts":{"bytesInOutput":2809},"packages/ui/react-ui-form/src/util/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-form/src/util/formatting.ts":{"bytesInOutput":2779}},"bytes":32434}}}
|
|
@@ -6,11 +6,11 @@ export type FieldEditorProps = {
|
|
|
6
6
|
projection: ViewProjection;
|
|
7
7
|
field: FieldType;
|
|
8
8
|
registry?: SchemaResolver;
|
|
9
|
-
|
|
9
|
+
onSave: () => void;
|
|
10
10
|
onCancel?: () => void;
|
|
11
11
|
};
|
|
12
12
|
/**
|
|
13
13
|
* Displays a Form representing the metadata for a given `Field` and `View`.
|
|
14
14
|
*/
|
|
15
|
-
export declare const FieldEditor: ({ view, projection, field, registry,
|
|
15
|
+
export declare const FieldEditor: ({ view, projection, field, registry, onSave, onCancel }: FieldEditorProps) => React.JSX.Element | null;
|
|
16
16
|
//# sourceMappingURL=FieldEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldEditor.d.ts","sourceRoot":"","sources":["../../../../../src/components/FieldEditor/FieldEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAKtB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"FieldEditor.d.ts","sourceRoot":"","sources":["../../../../../src/components/FieldEditor/FieldEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAKtB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,4DAA6D,gBAAgB,6BAmIpG,CAAC"}
|
|
@@ -14,14 +14,15 @@ export type FormProps<T extends BaseObject> = ThemedClassName<{
|
|
|
14
14
|
filter?: PropsFilter<T>;
|
|
15
15
|
sort?: PropertyKey<T>[];
|
|
16
16
|
autoSave?: boolean;
|
|
17
|
+
testId?: string;
|
|
17
18
|
onCancel?: () => void;
|
|
18
19
|
/**
|
|
19
20
|
* Map of custom renderers for specific properties.
|
|
20
21
|
*/
|
|
21
22
|
Custom?: Partial<Record<string, InputComponent<T>>>;
|
|
22
|
-
} & Pick<FormOptions<T>, 'schema' | 'onValuesChanged' | 'onValidate' | '
|
|
23
|
+
} & Pick<FormOptions<T>, 'schema' | 'onValuesChanged' | 'onValidate' | 'onSave'>>;
|
|
23
24
|
/**
|
|
24
25
|
* General purpose form component that displays field controls based on the given schema.
|
|
25
26
|
*/
|
|
26
|
-
export declare const Form: <T extends BaseObject>({ classNames, schema, values: initialValues, path, readonly, filter, sort, autoSave, onValuesChanged, onValidate,
|
|
27
|
+
export declare const Form: <T extends BaseObject>({ classNames, schema, values: initialValues, path, readonly, filter, sort, autoSave, testId, onValuesChanged, onValidate, onSave, onCancel, Custom, }: FormProps<T>) => React.JSX.Element;
|
|
27
28
|
//# sourceMappingURL=Form.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../../../src/components/Form/Form.tsx"],"names":[],"mappings":"AAMA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAElD,OAAO,EAAO,KAAK,UAAU,EAAK,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG9E,OAAO,EAAc,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAElF,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAIxE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,aAAa,CAAC;AAOxD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,UAAU,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;AAEpG,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,UAAU,IAAI,eAAe,CAC3D;
|
|
1
|
+
{"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../../../src/components/Form/Form.tsx"],"names":[],"mappings":"AAMA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAElD,OAAO,EAAO,KAAK,UAAU,EAAK,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG9E,OAAO,EAAc,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAElF,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAIxE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,aAAa,CAAC;AAOxD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,UAAU,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;AAEpG,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,UAAU,IAAI,eAAe,CAC3D;IAEE,MAAM,EAAE,CAAC,CAAC;IAEV,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAGhB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACrD,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,YAAY,GAAG,QAAQ,CAAC,CACjF,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,UAAU,yJAetC,SAAS,CAAC,CAAC,CAAC,sBA0Id,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '@dxos-theme';
|
|
2
2
|
import { type Meta, type StoryObj } from '@storybook/react';
|
|
3
|
-
import { S } from '@dxos/echo-schema';
|
|
3
|
+
import { type BaseObject, S } from '@dxos/echo-schema';
|
|
4
|
+
import { Testing } from '@dxos/schema/testing';
|
|
4
5
|
import { type FormProps } from './Form';
|
|
5
6
|
declare const TestSchema: S.mutable<S.Struct<{
|
|
6
7
|
name: S.optional<S.SchemaClass<string, string, never>>;
|
|
@@ -15,11 +16,14 @@ declare const TestSchema: S.mutable<S.Struct<{
|
|
|
15
16
|
}>>;
|
|
16
17
|
}>>;
|
|
17
18
|
type TestType = S.Schema.Type<typeof TestSchema>;
|
|
18
|
-
type StoryProps =
|
|
19
|
-
|
|
19
|
+
type StoryProps<T extends BaseObject> = {
|
|
20
|
+
schema: S.Schema<T>;
|
|
21
|
+
} & FormProps<T>;
|
|
22
|
+
declare const meta: Meta<StoryProps<any>>;
|
|
20
23
|
export default meta;
|
|
21
|
-
type Story = StoryObj<StoryProps
|
|
22
|
-
export declare const Default: Story
|
|
24
|
+
type Story<T extends BaseObject> = StoryObj<StoryProps<T>>;
|
|
25
|
+
export declare const Default: Story<TestType>;
|
|
26
|
+
export declare const Org: Story<Testing.OrgSchemaType>;
|
|
23
27
|
declare const ShapeSchema: S.mutable<S.Struct<{
|
|
24
28
|
shape: S.optional<S.Union<[S.Struct<{
|
|
25
29
|
type: S.Literal<["circle"]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Form/Form.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,
|
|
1
|
+
{"version":3,"file":"Form.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Form/Form.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAO,KAAK,UAAU,EAAU,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAK9C,QAAA,MAAM,UAAU;;;;;;;;;;;GAaE,CAAC;AAEnB,KAAK,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC;AAEjD,KAAK,UAAU,CAAC,CAAC,SAAS,UAAU,IAAI;IAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAiB/E,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAQ/B,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,CAAC,CAAC,SAAS,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,QAAQ,CAWnC,CAAC;AAGF,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAQ5C,CAAC;AAkBF,QAAA,MAAM,WAAW;;;;;;;;GAaC,CAAC;AAEnB,KAAK,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;AAEnD,KAAK,4BAA4B,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;AAgCzD,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,4BAA4B,CAUrE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewEditor.d.ts","sourceRoot":"","sources":["../../../../../src/components/ViewEditor/ViewEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAe,KAAK,aAAa,EAAK,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAc,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAGlF,OAAO,EAA+B,KAAK,QAAQ,EAAoC,MAAM,cAAc,CAAC;AAoB5G,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC;IAC5C,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU,6EAQpB,eAAe,
|
|
1
|
+
{"version":3,"file":"ViewEditor.d.ts","sourceRoot":"","sources":["../../../../../src/components/ViewEditor/ViewEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAe,KAAK,aAAa,EAAK,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAc,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAGlF,OAAO,EAA+B,KAAK,QAAQ,EAAoC,MAAM,cAAc,CAAC;AAoB5G,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC;IAC5C,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU,6EAQpB,eAAe,sBA2GjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/deprecated/Form.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrF,OAAO,
|
|
1
|
+
{"version":3,"file":"Form.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/deprecated/Form.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrF,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAIlE,QAAA,MAAM,YAAY,UAAW,mBAAmB,sBAM/C,CAAC;AAEF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAQnC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAErD,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC"}
|
|
@@ -10,8 +10,8 @@ export type FormHandler<T extends BaseObject> = {
|
|
|
10
10
|
errors: Record<PropertyKey<T>, string>;
|
|
11
11
|
touched: Record<PropertyKey<T>, boolean>;
|
|
12
12
|
changed: Record<PropertyKey<T>, boolean>;
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
canSave: boolean;
|
|
14
|
+
handleSave: () => void;
|
|
15
15
|
getStatus: (property: PropertyKey<T>) => {
|
|
16
16
|
status?: 'error';
|
|
17
17
|
error?: string;
|
|
@@ -24,7 +24,13 @@ export type FormHandler<T extends BaseObject> = {
|
|
|
24
24
|
* Hook options.
|
|
25
25
|
*/
|
|
26
26
|
export interface FormOptions<T extends BaseObject> {
|
|
27
|
+
/**
|
|
28
|
+
* Effect schema.
|
|
29
|
+
*/
|
|
27
30
|
schema: S.Schema<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Initial values (which may not pass validation).
|
|
33
|
+
*/
|
|
28
34
|
initialValues: T;
|
|
29
35
|
/**
|
|
30
36
|
* Callback for value changes. Note: This is called even when values are invalid.
|
|
@@ -47,7 +53,7 @@ export interface FormOptions<T extends BaseObject> {
|
|
|
47
53
|
/**
|
|
48
54
|
* Called when the form is submitted and passes validation.
|
|
49
55
|
*/
|
|
50
|
-
|
|
56
|
+
onSave?: (values: T, meta: {
|
|
51
57
|
changed: FormHandler<T>['changed'];
|
|
52
58
|
}) => void;
|
|
53
59
|
}
|
|
@@ -55,5 +61,5 @@ export interface FormOptions<T extends BaseObject> {
|
|
|
55
61
|
* Creates a hook for managing form state, including values, validation, and submission.
|
|
56
62
|
* Deeply integrated with `@dxos/schema` for schema-based validation.
|
|
57
63
|
*/
|
|
58
|
-
export declare const useForm: <T extends BaseObject>({ schema, initialValues, onValuesChanged, onValidate, onValid,
|
|
64
|
+
export declare const useForm: <T extends BaseObject>({ schema, initialValues, onValuesChanged, onValidate, onValid, onSave, }: FormOptions<T>) => FormHandler<T>;
|
|
59
65
|
//# sourceMappingURL=useForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useForm.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAA6C,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,UAAU,IAAI;IAK9C,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,
|
|
1
|
+
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useForm.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAA6C,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,UAAU,IAAI;IAK9C,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,IAAI,CAAC;IAMvB,SAAS,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7C,aAAa,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACjF,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,IAAI,CAAC;CAC7E,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,UAAU;IAC/C;;OAEG;IAEH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEpB;;OAEG;IAEH,aAAa,EAAE,CAAC,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAEtC;;;;OAIG;IAEH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,eAAe,EAAE,GAAG,SAAS,CAAC;IAE1D;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAE5E;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5E;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,UAAU,4EAOzC,WAAW,CAAC,CAAC,CAAC,KAAG,WAAW,CAAC,CAAC,CAiIhC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-form",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3-main.2dd075e",
|
|
4
4
|
"description": "Data components.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -29,19 +29,20 @@
|
|
|
29
29
|
"date-fns": "^3.3.1",
|
|
30
30
|
"effect": "^3.9.2",
|
|
31
31
|
"jsonpath": "^1.1.1",
|
|
32
|
-
"@dxos/async": "0.7.
|
|
33
|
-
"@dxos/debug": "0.7.
|
|
34
|
-
"@dxos/echo-db": "0.7.
|
|
35
|
-
"@dxos/effect": "0.7.
|
|
36
|
-
"@dxos/invariant": "0.7.
|
|
37
|
-
"@dxos/echo-schema": "0.7.
|
|
38
|
-
"@dxos/keys": "0.7.
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/react-
|
|
42
|
-
"@dxos/react-
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
32
|
+
"@dxos/async": "0.7.3-main.2dd075e",
|
|
33
|
+
"@dxos/debug": "0.7.3-main.2dd075e",
|
|
34
|
+
"@dxos/echo-db": "0.7.3-main.2dd075e",
|
|
35
|
+
"@dxos/effect": "0.7.3-main.2dd075e",
|
|
36
|
+
"@dxos/invariant": "0.7.3-main.2dd075e",
|
|
37
|
+
"@dxos/echo-schema": "0.7.3-main.2dd075e",
|
|
38
|
+
"@dxos/keys": "0.7.3-main.2dd075e",
|
|
39
|
+
"@dxos/live-object": "0.7.3-main.2dd075e",
|
|
40
|
+
"@dxos/log": "0.7.3-main.2dd075e",
|
|
41
|
+
"@dxos/react-client": "0.7.3-main.2dd075e",
|
|
42
|
+
"@dxos/react-ui-list": "0.7.3-main.2dd075e",
|
|
43
|
+
"@dxos/react-ui-types": "0.7.3-main.2dd075e",
|
|
44
|
+
"@dxos/schema": "0.7.3-main.2dd075e",
|
|
45
|
+
"@dxos/util": "0.7.3-main.2dd075e"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@phosphor-icons/react": "^2.1.5",
|
|
@@ -52,12 +53,12 @@
|
|
|
52
53
|
"react": "~18.2.0",
|
|
53
54
|
"react-dom": "~18.2.0",
|
|
54
55
|
"vite": "5.4.7",
|
|
55
|
-
"@dxos/echo-signals": "0.7.
|
|
56
|
-
"@dxos/random": "0.7.
|
|
57
|
-
"@dxos/react-ui": "0.7.
|
|
58
|
-
"@dxos/react-ui
|
|
59
|
-
"@dxos/react-ui-theme": "0.7.
|
|
60
|
-
"@dxos/storybook-utils": "0.7.
|
|
56
|
+
"@dxos/echo-signals": "0.7.3-main.2dd075e",
|
|
57
|
+
"@dxos/random": "0.7.3-main.2dd075e",
|
|
58
|
+
"@dxos/react-ui-syntax-highlighter": "0.7.3-main.2dd075e",
|
|
59
|
+
"@dxos/react-ui": "0.7.3-main.2dd075e",
|
|
60
|
+
"@dxos/react-ui-theme": "0.7.3-main.2dd075e",
|
|
61
|
+
"@dxos/storybook-utils": "0.7.3-main.2dd075e"
|
|
61
62
|
},
|
|
62
63
|
"peerDependencies": {
|
|
63
64
|
"@effect/schema": "^0.75.5",
|
|
@@ -65,8 +66,8 @@
|
|
|
65
66
|
"effect": "^3.9.2",
|
|
66
67
|
"react": "~18.2.0",
|
|
67
68
|
"react-dom": "~18.2.0",
|
|
68
|
-
"@dxos/react-ui": "0.7.
|
|
69
|
-
"@dxos/react-ui-theme": "0.7.
|
|
69
|
+
"@dxos/react-ui": "0.7.3-main.2dd075e",
|
|
70
|
+
"@dxos/react-ui-theme": "0.7.3-main.2dd075e"
|
|
70
71
|
},
|
|
71
72
|
"publishConfig": {
|
|
72
73
|
"access": "public"
|
|
@@ -7,7 +7,7 @@ import '@dxos-theme';
|
|
|
7
7
|
import { type Meta, type StoryObj } from '@storybook/react';
|
|
8
8
|
import React from 'react';
|
|
9
9
|
|
|
10
|
-
import { createMutableSchema } from '@dxos/
|
|
10
|
+
import { createMutableSchema } from '@dxos/live-object/testing';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
import { ViewProjection } from '@dxos/schema';
|
|
13
13
|
import { TestSchema, testView } from '@dxos/schema/testing';
|
|
@@ -20,14 +20,14 @@ import { TestLayout, TestPanel } from '../testing';
|
|
|
20
20
|
type StoryProps = FieldEditorProps;
|
|
21
21
|
|
|
22
22
|
const DefaultStory = (props: FieldEditorProps) => {
|
|
23
|
-
const handleComplete: FieldEditorProps['
|
|
23
|
+
const handleComplete: FieldEditorProps['onSave'] = () => {
|
|
24
24
|
log.info('onClose', { props });
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
return (
|
|
28
28
|
<TestLayout json={{ props }}>
|
|
29
29
|
<TestPanel>
|
|
30
|
-
<FieldEditor {...props}
|
|
30
|
+
<FieldEditor {...props} onSave={handleComplete} />
|
|
31
31
|
</TestPanel>
|
|
32
32
|
</TestLayout>
|
|
33
33
|
);
|
|
@@ -26,14 +26,14 @@ export type FieldEditorProps = {
|
|
|
26
26
|
projection: ViewProjection;
|
|
27
27
|
field: FieldType;
|
|
28
28
|
registry?: SchemaResolver;
|
|
29
|
-
|
|
29
|
+
onSave: () => void;
|
|
30
30
|
onCancel?: () => void;
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Displays a Form representing the metadata for a given `Field` and `View`.
|
|
35
35
|
*/
|
|
36
|
-
export const FieldEditor = ({ view, projection, field, registry,
|
|
36
|
+
export const FieldEditor = ({ view, projection, field, registry, onSave, onCancel }: FieldEditorProps) => {
|
|
37
37
|
const { t } = useTranslation(translationKey);
|
|
38
38
|
const [props, setProps] = useState<PropertyType>(projection.getFieldProjection(field.id).props);
|
|
39
39
|
useEffect(() => setProps(projection.getFieldProjection(field.id).props), [field, projection]);
|
|
@@ -100,19 +100,19 @@ export const FieldEditor = ({ view, projection, field, registry, onClose, onCanc
|
|
|
100
100
|
[view.fields, field],
|
|
101
101
|
);
|
|
102
102
|
|
|
103
|
-
const
|
|
103
|
+
const handleSave = useCallback<NonNullable<FormProps<PropertyType>['onSave']>>(
|
|
104
104
|
(props) => {
|
|
105
105
|
projection.setFieldProjection({ field, props });
|
|
106
|
-
|
|
106
|
+
onSave();
|
|
107
107
|
},
|
|
108
|
-
[projection, field,
|
|
108
|
+
[projection, field, onSave],
|
|
109
109
|
);
|
|
110
110
|
|
|
111
111
|
const handleCancel = useCallback<NonNullable<FormProps<PropertyType>['onCancel']>>(() => {
|
|
112
112
|
// Need to defer to allow form to close.
|
|
113
113
|
requestAnimationFrame(() => onCancel?.());
|
|
114
|
-
|
|
115
|
-
}, [
|
|
114
|
+
onSave();
|
|
115
|
+
}, [onSave]);
|
|
116
116
|
|
|
117
117
|
if (!fieldSchema) {
|
|
118
118
|
log.warn('invalid format', { props });
|
|
@@ -129,7 +129,7 @@ export const FieldEditor = ({ view, projection, field, registry, onClose, onCanc
|
|
|
129
129
|
sort={['property', 'format']}
|
|
130
130
|
onValuesChanged={handleValuesChanged}
|
|
131
131
|
onValidate={handleValidate}
|
|
132
|
-
|
|
132
|
+
onSave={handleSave}
|
|
133
133
|
onCancel={handleCancel}
|
|
134
134
|
Custom={{
|
|
135
135
|
['format' satisfies keyof PropertyType]: (props) => (
|
|
@@ -7,7 +7,8 @@ import '@dxos-theme';
|
|
|
7
7
|
import { type Meta, type StoryObj } from '@storybook/react';
|
|
8
8
|
import React, { useCallback, useState } from 'react';
|
|
9
9
|
|
|
10
|
-
import { AST, Format, S } from '@dxos/echo-schema';
|
|
10
|
+
import { AST, type BaseObject, Format, S } from '@dxos/echo-schema';
|
|
11
|
+
import { Testing } from '@dxos/schema/testing';
|
|
11
12
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
12
13
|
|
|
13
14
|
import { SelectInput } from './Defaults';
|
|
@@ -33,24 +34,24 @@ const TestSchema = S.Struct({
|
|
|
33
34
|
|
|
34
35
|
type TestType = S.Schema.Type<typeof TestSchema>;
|
|
35
36
|
|
|
36
|
-
type StoryProps = FormProps<
|
|
37
|
+
type StoryProps<T extends BaseObject> = { schema: S.Schema<T> } & FormProps<T>;
|
|
37
38
|
|
|
38
|
-
const DefaultStory = ({ values: initialValues }: StoryProps) => {
|
|
39
|
+
const DefaultStory = <T extends BaseObject>({ schema, values: initialValues }: StoryProps<T>) => {
|
|
39
40
|
const [values, setValues] = useState(initialValues);
|
|
40
|
-
const
|
|
41
|
+
const handleSave = useCallback<NonNullable<FormProps<T>['onSave']>>((values) => {
|
|
41
42
|
setValues(values);
|
|
42
43
|
}, []);
|
|
43
44
|
|
|
44
45
|
return (
|
|
45
|
-
<TestLayout json={{ values, schema:
|
|
46
|
+
<TestLayout json={{ values, schema: schema.ast.toJSON() }}>
|
|
46
47
|
<TestPanel>
|
|
47
|
-
<Form<
|
|
48
|
+
<Form<T> schema={schema} values={values} onSave={handleSave} />
|
|
48
49
|
</TestPanel>
|
|
49
50
|
</TestLayout>
|
|
50
51
|
);
|
|
51
52
|
};
|
|
52
53
|
|
|
53
|
-
const meta: Meta<StoryProps
|
|
54
|
+
const meta: Meta<StoryProps<any>> = {
|
|
54
55
|
title: 'ui/react-ui-form/Form',
|
|
55
56
|
component: Form,
|
|
56
57
|
render: DefaultStory,
|
|
@@ -62,10 +63,11 @@ const meta: Meta<StoryProps> = {
|
|
|
62
63
|
|
|
63
64
|
export default meta;
|
|
64
65
|
|
|
65
|
-
type Story = StoryObj<StoryProps
|
|
66
|
+
type Story<T extends BaseObject> = StoryObj<StoryProps<T>>;
|
|
66
67
|
|
|
67
|
-
export const Default: Story = {
|
|
68
|
+
export const Default: Story<TestType> = {
|
|
68
69
|
args: {
|
|
70
|
+
schema: TestSchema,
|
|
69
71
|
values: {
|
|
70
72
|
name: 'DXOS',
|
|
71
73
|
active: true,
|
|
@@ -76,6 +78,33 @@ export const Default: Story = {
|
|
|
76
78
|
},
|
|
77
79
|
};
|
|
78
80
|
|
|
81
|
+
// TODO(burdon): Should accept partial values.
|
|
82
|
+
export const Org: Story<Testing.OrgSchemaType> = {
|
|
83
|
+
args: {
|
|
84
|
+
schema: Testing.OrgSchema,
|
|
85
|
+
values: {
|
|
86
|
+
name: 'DXOS',
|
|
87
|
+
website: 'https://dxos.org',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// TODO(burdon): Type issue with employer reference.
|
|
93
|
+
// TODO(burdon): Test table/form with compound values (e.g., address).
|
|
94
|
+
// export const Contact: Story<Testing.ContactSchemaType> = {
|
|
95
|
+
// args: {
|
|
96
|
+
// // Property name is missing in type EncodedReference but required in type
|
|
97
|
+
// schema: Testing.ContactSchema,
|
|
98
|
+
// values: {
|
|
99
|
+
// name: 'Bot',
|
|
100
|
+
// },
|
|
101
|
+
// },
|
|
102
|
+
// };
|
|
103
|
+
|
|
104
|
+
//
|
|
105
|
+
// TODO(burdon): Move into separate storybook and use test types.
|
|
106
|
+
//
|
|
107
|
+
|
|
79
108
|
const ShapeSchema = S.Struct({
|
|
80
109
|
shape: S.optional(
|
|
81
110
|
S.Union(
|
|
@@ -92,11 +121,12 @@ const ShapeSchema = S.Struct({
|
|
|
92
121
|
}).pipe(S.mutable);
|
|
93
122
|
|
|
94
123
|
type ShapeType = S.Schema.Type<typeof ShapeSchema>;
|
|
124
|
+
|
|
95
125
|
type DiscriminatedUnionStoryProps = FormProps<ShapeType>;
|
|
96
126
|
|
|
97
127
|
const DiscriminatedUnionStory = ({ values: initialValues }: DiscriminatedUnionStoryProps) => {
|
|
98
128
|
const [values, setValues] = useState(initialValues);
|
|
99
|
-
const
|
|
129
|
+
const handleSave = useCallback<NonNullable<FormProps<ShapeType>['onSave']>>((values) => {
|
|
100
130
|
setValues(values);
|
|
101
131
|
}, []);
|
|
102
132
|
|
|
@@ -106,7 +136,7 @@ const DiscriminatedUnionStory = ({ values: initialValues }: DiscriminatedUnionSt
|
|
|
106
136
|
<Form<ShapeType>
|
|
107
137
|
schema={ShapeSchema}
|
|
108
138
|
values={values}
|
|
109
|
-
|
|
139
|
+
onSave={handleSave}
|
|
110
140
|
Custom={{
|
|
111
141
|
['shape.type' as const]: (props) => (
|
|
112
142
|
<SelectInput<ShapeType>
|
|
@@ -28,7 +28,9 @@ export type PropsFilter<T extends BaseObject> = (props: SchemaProperty<T>[]) =>
|
|
|
28
28
|
|
|
29
29
|
export type FormProps<T extends BaseObject> = ThemedClassName<
|
|
30
30
|
{
|
|
31
|
+
// TODO(burdon): Partial<T>?
|
|
31
32
|
values: T;
|
|
33
|
+
|
|
32
34
|
/** Path to the current object from the root. Used with nested forms. */
|
|
33
35
|
path?: string[];
|
|
34
36
|
|
|
@@ -39,18 +41,20 @@ export type FormProps<T extends BaseObject> = ThemedClassName<
|
|
|
39
41
|
filter?: PropsFilter<T>;
|
|
40
42
|
sort?: PropertyKey<T>[];
|
|
41
43
|
autoSave?: boolean;
|
|
44
|
+
testId?: string;
|
|
42
45
|
onCancel?: () => void;
|
|
43
46
|
|
|
44
47
|
/**
|
|
45
48
|
* Map of custom renderers for specific properties.
|
|
46
49
|
*/
|
|
47
50
|
Custom?: Partial<Record<string, InputComponent<T>>>;
|
|
48
|
-
} & Pick<FormOptions<T>, 'schema' | 'onValuesChanged' | 'onValidate' | '
|
|
51
|
+
} & Pick<FormOptions<T>, 'schema' | 'onValuesChanged' | 'onValidate' | 'onSave'>
|
|
49
52
|
>;
|
|
50
53
|
|
|
51
54
|
/**
|
|
52
55
|
* General purpose form component that displays field controls based on the given schema.
|
|
53
56
|
*/
|
|
57
|
+
// TODO(burdon): Area to show general validation errors.
|
|
54
58
|
export const Form = <T extends BaseObject>({
|
|
55
59
|
classNames,
|
|
56
60
|
schema,
|
|
@@ -60,21 +64,22 @@ export const Form = <T extends BaseObject>({
|
|
|
60
64
|
filter,
|
|
61
65
|
sort,
|
|
62
66
|
autoSave,
|
|
67
|
+
testId,
|
|
63
68
|
onValuesChanged,
|
|
64
69
|
onValidate,
|
|
65
|
-
|
|
70
|
+
onSave,
|
|
66
71
|
onCancel,
|
|
67
72
|
Custom,
|
|
68
73
|
}: FormProps<T>) => {
|
|
69
74
|
const { t } = useTranslation(translationKey);
|
|
70
|
-
const onValid = useMemo(() => (autoSave ?
|
|
71
|
-
const {
|
|
75
|
+
const onValid = useMemo(() => (autoSave ? onSave : undefined), [autoSave, onSave]);
|
|
76
|
+
const { canSave, values, errors, handleSave, ...inputProps } = useForm<T>({
|
|
72
77
|
schema,
|
|
73
78
|
initialValues,
|
|
74
79
|
onValuesChanged,
|
|
75
80
|
onValidate,
|
|
76
81
|
onValid,
|
|
77
|
-
|
|
82
|
+
onSave,
|
|
78
83
|
});
|
|
79
84
|
|
|
80
85
|
// Filter and sort props.
|
|
@@ -98,12 +103,12 @@ export const Form = <T extends BaseObject>({
|
|
|
98
103
|
}, [errors]);
|
|
99
104
|
|
|
100
105
|
return (
|
|
101
|
-
<div role='form' className={mx('flex flex-col w-full gap-2 py-2', classNames)}>
|
|
106
|
+
<div role='form' className={mx('flex flex-col w-full gap-2 py-2', classNames)} data-testid={testId}>
|
|
102
107
|
{properties
|
|
103
108
|
.map((property) => {
|
|
104
109
|
const { ast, name, type, format, title, description, examples, options } = property;
|
|
105
110
|
const key = [...path, name];
|
|
106
|
-
const label =
|
|
111
|
+
const label = title ?? pipe(name, capitalize);
|
|
107
112
|
const placeholder = examples?.length ? `Example: "${examples[0]}"` : description;
|
|
108
113
|
|
|
109
114
|
// Get generic input.
|
|
@@ -177,19 +182,25 @@ export const Form = <T extends BaseObject>({
|
|
|
177
182
|
})
|
|
178
183
|
.filter(isNotFalsy)}
|
|
179
184
|
|
|
180
|
-
{(onCancel ||
|
|
185
|
+
{(onCancel || onSave) && !autoSave && (
|
|
181
186
|
<div role='none' className='flex justify-center'>
|
|
182
187
|
<div role='none' className={mx(onCancel && !readonly && 'grid grid-cols-2 gap-2')}>
|
|
183
188
|
{onCancel && !readonly && (
|
|
184
|
-
<IconButton
|
|
189
|
+
<IconButton
|
|
190
|
+
data-testid='cancel-button'
|
|
191
|
+
icon='ph--x--regular'
|
|
192
|
+
label={t('button cancel')}
|
|
193
|
+
onClick={onCancel}
|
|
194
|
+
/>
|
|
185
195
|
)}
|
|
186
|
-
{
|
|
196
|
+
{onSave && (
|
|
187
197
|
<IconButton
|
|
188
198
|
type='submit'
|
|
189
|
-
|
|
199
|
+
data-testid='save-button'
|
|
200
|
+
disabled={!canSave}
|
|
190
201
|
icon='ph--check--regular'
|
|
191
202
|
label={t('button save')}
|
|
192
|
-
onClick={
|
|
203
|
+
onClick={handleSave}
|
|
193
204
|
/>
|
|
194
205
|
)}
|
|
195
206
|
</div>
|