@dxos/react-ui-form 0.8.4-main.72ec0f3 → 0.8.4-main.7996785055

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +0 -1
  2. package/dist/lib/browser/index.mjs +2306 -2293
  3. package/dist/lib/browser/index.mjs.map +4 -4
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node-esm/index.mjs +2306 -2293
  6. package/dist/lib/node-esm/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/meta.json +1 -1
  8. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +8 -7
  9. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  10. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +14 -6
  11. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  12. package/dist/types/src/components/Form/Form.d.ts +84 -27
  13. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  14. package/dist/types/src/components/Form/Form.stories.d.ts +60 -83
  15. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  16. package/dist/types/src/components/Form/FormField.d.ts +43 -0
  17. package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
  18. package/dist/types/src/components/Form/FormFieldComponent.d.ts +77 -0
  19. package/dist/types/src/components/Form/FormFieldComponent.d.ts.map +1 -0
  20. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts +9 -0
  21. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts.map +1 -0
  22. package/dist/types/src/components/Form/FormFieldSet.d.ts +18 -0
  23. package/dist/types/src/components/Form/FormFieldSet.d.ts.map +1 -0
  24. package/dist/types/src/components/Form/fields/ArrayField.d.ts +18 -0
  25. package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +1 -0
  26. package/dist/types/src/components/Form/fields/BooleanField.d.ts +4 -0
  27. package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +1 -0
  28. package/dist/types/src/components/Form/fields/GeoPointField.d.ts +5 -0
  29. package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +1 -0
  30. package/dist/types/src/components/Form/fields/MarkdownField.d.ts +4 -0
  31. package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +1 -0
  32. package/dist/types/src/components/Form/fields/NumberField.d.ts +4 -0
  33. package/dist/types/src/components/Form/fields/NumberField.d.ts.map +1 -0
  34. package/dist/types/src/components/Form/fields/RefField.d.ts +16 -0
  35. package/dist/types/src/components/Form/fields/RefField.d.ts.map +1 -0
  36. package/dist/types/src/components/Form/fields/SelectField.d.ts +10 -0
  37. package/dist/types/src/components/Form/fields/SelectField.d.ts.map +1 -0
  38. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +5 -0
  39. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +1 -0
  40. package/dist/types/src/components/{ControlSection/ControlSection.stories.d.ts → Form/fields/SelectOptionField.stories.d.ts} +13 -13
  41. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +1 -0
  42. package/dist/types/src/components/Form/fields/TextAreaField.d.ts +4 -0
  43. package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +1 -0
  44. package/dist/types/src/components/Form/fields/TextField.d.ts +4 -0
  45. package/dist/types/src/components/Form/fields/TextField.d.ts.map +1 -0
  46. package/dist/types/src/components/Form/fields/TupleField.d.ts +6 -0
  47. package/dist/types/src/components/Form/fields/TupleField.d.ts.map +1 -0
  48. package/dist/types/src/components/Form/fields/index.d.ts +12 -0
  49. package/dist/types/src/components/Form/fields/index.d.ts.map +1 -0
  50. package/dist/types/src/components/Form/index.d.ts +2 -4
  51. package/dist/types/src/components/Form/index.d.ts.map +1 -1
  52. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +23 -10
  53. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -1
  54. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +10 -5
  55. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/Settings/Settings.d.ts +58 -0
  57. package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
  58. package/dist/types/src/components/{Form/custom/SelectOptionsInput.stories.d.ts → Settings/Settings.stories.d.ts} +11 -7
  59. package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
  60. package/dist/types/src/components/Settings/index.d.ts +2 -0
  61. package/dist/types/src/components/Settings/index.d.ts.map +1 -0
  62. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +11 -13
  63. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  64. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +15 -9
  65. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  66. package/dist/types/src/components/index.d.ts +1 -1
  67. package/dist/types/src/components/index.d.ts.map +1 -1
  68. package/dist/types/src/components/testing.d.ts +0 -2
  69. package/dist/types/src/components/testing.d.ts.map +1 -1
  70. package/dist/types/src/hooks/index.d.ts +2 -3
  71. package/dist/types/src/hooks/index.d.ts.map +1 -1
  72. package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
  73. package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
  74. package/dist/types/src/hooks/useKeyHandler.d.ts +6 -0
  75. package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
  76. package/dist/types/src/translations.d.ts +11 -6
  77. package/dist/types/src/translations.d.ts.map +1 -1
  78. package/dist/types/src/util/field.d.ts +3 -3
  79. package/dist/types/src/util/field.d.ts.map +1 -1
  80. package/dist/types/src/util/formatting.d.ts +2 -2
  81. package/dist/types/src/util/formatting.d.ts.map +1 -1
  82. package/dist/types/src/util/index.d.ts +1 -1
  83. package/dist/types/src/util/index.d.ts.map +1 -1
  84. package/dist/types/src/util/properties.d.ts +7 -0
  85. package/dist/types/src/util/properties.d.ts.map +1 -0
  86. package/dist/types/src/util/refs.d.ts +2 -2
  87. package/dist/types/src/util/refs.d.ts.map +1 -1
  88. package/dist/types/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +50 -47
  90. package/src/components/FieldEditor/FieldEditor.stories.tsx +43 -24
  91. package/src/components/FieldEditor/FieldEditor.tsx +74 -78
  92. package/src/components/Form/AUDIT.md +17 -0
  93. package/src/components/Form/Form.stories.tsx +149 -250
  94. package/src/components/Form/Form.tsx +314 -111
  95. package/src/components/Form/FormField.tsx +305 -0
  96. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  97. package/src/components/Form/FormFieldComponent.tsx +171 -0
  98. package/src/components/Form/FormFieldSet.tsx +129 -0
  99. package/src/components/Form/README.md +3 -0
  100. package/src/components/Form/fields/ArrayField.tsx +149 -0
  101. package/src/components/Form/fields/BooleanField.tsx +22 -0
  102. package/src/components/Form/fields/GeoPointField.tsx +120 -0
  103. package/src/components/Form/fields/MarkdownField.tsx +78 -0
  104. package/src/components/Form/fields/NumberField.tsx +39 -0
  105. package/src/components/Form/fields/RefField.tsx +199 -0
  106. package/src/components/Form/fields/SelectField.tsx +65 -0
  107. package/src/components/Form/{custom/SelectOptionsInput.stories.tsx → fields/SelectOptionField.stories.tsx} +19 -16
  108. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +25 -19
  109. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  110. package/src/components/Form/fields/TextField.tsx +38 -0
  111. package/src/components/Form/{custom/TupleInput.tsx → fields/TupleField.tsx} +16 -9
  112. package/src/components/Form/fields/index.ts +15 -0
  113. package/src/components/Form/index.ts +3 -4
  114. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +15 -12
  115. package/src/components/ObjectPicker/ObjectPicker.tsx +103 -78
  116. package/src/components/Settings/Settings.stories.tsx +56 -0
  117. package/src/components/Settings/Settings.tsx +235 -0
  118. package/src/components/{ControlSection → Settings}/index.ts +1 -1
  119. package/src/components/ViewEditor/ViewEditor.stories.tsx +47 -44
  120. package/src/components/ViewEditor/ViewEditor.test.tsx +5 -4
  121. package/src/components/ViewEditor/ViewEditor.tsx +297 -210
  122. package/src/components/index.ts +1 -1
  123. package/src/components/testing.tsx +17 -8
  124. package/src/hooks/index.ts +2 -3
  125. package/src/hooks/useFormHandler.ts +380 -0
  126. package/src/hooks/useKeyHandler.tsx +37 -0
  127. package/src/translations.ts +13 -9
  128. package/src/util/field.ts +25 -25
  129. package/src/util/formatting.ts +22 -22
  130. package/src/util/index.ts +1 -1
  131. package/src/util/properties.ts +18 -0
  132. package/src/util/refs.ts +13 -15
  133. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  134. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  135. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  136. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  137. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  138. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  139. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  140. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  141. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  142. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  143. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  144. package/dist/types/src/components/Form/FormContent.d.ts +0 -63
  145. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  146. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  147. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  148. package/dist/types/src/components/Form/Input.d.ts +0 -29
  149. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  150. package/dist/types/src/components/Form/RefField.d.ts +0 -22
  151. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  152. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  153. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  154. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  155. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  156. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  157. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  158. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  159. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  160. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  161. package/dist/types/src/components/Form/factory.d.ts +0 -8
  162. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  163. package/dist/types/src/hooks/useForm.d.ts +0 -67
  164. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  165. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -29
  166. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  167. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  168. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  169. package/dist/types/src/util/schema.d.ts +0 -3
  170. package/dist/types/src/util/schema.d.ts.map +0 -1
  171. package/src/components/ControlSection/ControlSection.stories.tsx +0 -38
  172. package/src/components/ControlSection/ControlSection.tsx +0 -153
  173. package/src/components/Form/ArrayField.tsx +0 -125
  174. package/src/components/Form/Defaults.tsx +0 -205
  175. package/src/components/Form/FormActions.tsx +0 -54
  176. package/src/components/Form/FormContent.tsx +0 -362
  177. package/src/components/Form/FormContext.tsx +0 -110
  178. package/src/components/Form/Input.tsx +0 -54
  179. package/src/components/Form/RefField.tsx +0 -283
  180. package/src/components/Form/custom/GeoPointInput.tsx +0 -80
  181. package/src/components/Form/custom/index.ts +0 -7
  182. package/src/components/Form/factory.tsx +0 -31
  183. package/src/hooks/useForm.ts +0 -296
  184. package/src/hooks/useQueryRefOptions.ts +0 -62
  185. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  186. package/src/util/schema.ts +0 -12
@@ -6,297 +6,196 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Schema from 'effect/Schema';
7
7
  import React, { useCallback, useState } from 'react';
8
8
 
9
- import { ContactType } from '@dxos/client/testing';
10
- import { type Type } from '@dxos/echo';
11
- import { type BaseObject, Expando, Format, Ref, type TypeAnnotation, getObjectDXN } from '@dxos/echo/internal';
12
- import { live } from '@dxos/echo/internal';
9
+ import { Annotation, Format, Obj, Ref, Tag, Type } from '@dxos/echo';
10
+ import { type AnyProperties } from '@dxos/echo/internal';
11
+ import { log } from '@dxos/log';
12
+ import { useSpaces } from '@dxos/react-client/echo';
13
+ import { withClientProvider } from '@dxos/react-client/testing';
13
14
  import { Tooltip } from '@dxos/react-ui';
14
- import { withLayoutVariants, withTheme } from '@dxos/react-ui/testing';
15
- import { Testing } from '@dxos/schema/testing';
15
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
16
16
 
17
17
  import { translations } from '../../translations';
18
- import { TestLayout, TestPanel } from '../testing';
18
+ import { TestLayout } from '../testing';
19
19
 
20
- import { SelectInput } from './Defaults';
21
- import { Form, type FormProps } from './Form';
20
+ import { type ExcludeId, Form, type FormRootProps, omitId } from './Form';
22
21
 
23
- type StoryProps<T extends BaseObject> = {
22
+ const Organization = Schema.Struct({
23
+ name: Schema.String.pipe(Schema.minLength(1)).annotations({ title: 'Full name' }),
24
+ }).pipe(
25
+ Type.object({
26
+ typename: 'com.example.type.organization',
27
+ version: '0.1.0',
28
+ }),
29
+ );
30
+
31
+ export interface Organization extends Schema.Schema.Type<typeof Organization> {}
32
+
33
+ const Person = Schema.Struct({
34
+ name: Schema.String.pipe(Schema.minLength(1)).annotations({ title: 'Full name' }),
35
+ ignore: Schema.String.pipe(Annotation.FormInputAnnotation.set(false), Schema.optional),
36
+ active: Schema.optional(Schema.Boolean.annotations({ title: 'Active' })),
37
+ address: Schema.optional(
38
+ Schema.Struct({
39
+ street: Schema.String,
40
+ city: Schema.String,
41
+ // TODO(burdon): Constrain input control.
42
+ state: Schema.String.pipe(Schema.minLength(2), Schema.maxLength(2)).annotations({
43
+ title: 'State',
44
+ description: 'State code',
45
+ }),
46
+ zip: Schema.Number,
47
+ }).annotations({ title: 'Address' }),
48
+ ),
49
+ employer: Schema.optional(Ref.Ref(Organization).annotations({ title: 'Employer' })),
50
+ tags: Schema.optional(Schema.Array(Ref.Ref(Tag.Tag)).annotations({ title: 'Tags' })),
51
+ status: Schema.optional(Schema.Literal('active', 'inactive').annotations({ title: 'Status' })),
52
+ notes: Schema.optional(Format.Text.annotations({ title: 'Notes' })),
53
+ location: Schema.optional(Format.GeoPoint.annotations({ title: 'Location' })),
54
+ tasks: Schema.optional(Schema.Array(Schema.String).annotations({ title: 'Tasks' })),
55
+ locations: Schema.optional(Schema.Array(Format.GeoPoint).annotations({ title: 'Locations' })),
56
+ identities: Schema.optional(
57
+ Schema.Array(
58
+ Schema.Struct({
59
+ type: Schema.String.annotations({ title: 'Type' }),
60
+ value: Schema.String.annotations({ title: 'Value' }),
61
+ }).annotations({ title: 'Identities' }),
62
+ ).annotations({
63
+ title: 'Identities',
64
+ }),
65
+ ),
66
+ }).pipe(
67
+ Type.object({
68
+ typename: 'org.dxos.type.person', // TODO(burdon): Change all types to /schema
69
+ version: '0.1.0',
70
+ }),
71
+ );
72
+
73
+ export interface Person extends Schema.Schema.Type<typeof Person> {}
74
+
75
+ type DefaultStoryProps<T extends AnyProperties> = {
24
76
  debug?: boolean;
25
- schema: Type.Obj.Any;
26
- } & FormProps<T>;
77
+ schema: Schema.Schema<T>;
78
+ } & FormRootProps<T>;
27
79
 
28
- const DefaultStory = <T extends BaseObject = any>({
80
+ const DefaultStory = <T extends AnyProperties = AnyProperties>({
29
81
  debug,
30
82
  schema,
31
- values: initialValues,
83
+ values: valuesProp,
32
84
  ...props
33
- }: StoryProps<T>) => {
34
- const [values, setValues] = useState(initialValues);
35
- const handleSave = useCallback<NonNullable<FormProps<T>['onSave']>>((values) => {
85
+ }: DefaultStoryProps<T>) => {
86
+ const [values, setValues] = useState<Partial<T>>(valuesProp ?? {});
87
+ const spaces = useSpaces();
88
+ const space = spaces[0];
89
+
90
+ const handleSave = useCallback<NonNullable<FormRootProps<T>['onSave']>>((values) => {
91
+ log.info('save', { values, meta });
36
92
  setValues(values);
37
93
  }, []);
38
94
 
39
- if (debug) {
40
- return (
41
- <Tooltip.Provider>
42
- <TestLayout json={{ values, schema: schema.ast }}>
43
- <TestPanel>
44
- <Form<T> schema={schema} values={values} onSave={handleSave} {...props} />
45
- </TestPanel>
46
- </TestLayout>
47
- </Tooltip.Provider>
48
- );
49
- }
50
-
51
- return <Form<T> schema={schema} values={values} onSave={handleSave} {...props} />;
52
- };
53
-
54
- const RefStory = <T extends BaseObject = any>(props: StoryProps<T>) => {
55
- const onQueryRefOptions = useCallback((typeInfo: TypeAnnotation) => {
56
- switch (typeInfo.typename) {
57
- case Testing.Person.typename:
58
- return [
59
- { dxn: getObjectDXN(contact1)!, label: 'John Coltraine' },
60
- { dxn: getObjectDXN(contact2)!, label: 'Erykah Badu' },
61
- ];
62
- default:
63
- return [];
64
- }
95
+ const handleCancel = useCallback<NonNullable<FormRootProps<T>['onCancel']>>(() => {
96
+ log.info('cancel');
97
+ setValues(valuesProp ?? {});
65
98
  }, []);
66
99
 
67
- return <DefaultStory<T> onQueryRefOptions={onQueryRefOptions} {...props} />;
68
- };
69
-
70
- const AddressSchema = Schema.Struct({
71
- street: Schema.optional(Schema.String.annotations({ title: 'Street' })),
72
- city: Schema.optional(Schema.String.annotations({ title: 'City' })),
73
- zip: Schema.optional(Schema.String.pipe(Schema.pattern(/^\d{5}(-\d{4})?$/)).annotations({ title: 'ZIP' })),
74
- location: Schema.optional(Format.GeoPoint.annotations({ title: 'Location' })),
75
- }).annotations({ title: 'Address' });
76
-
77
- const ContactSchema = Schema.Struct({
78
- name: Schema.optional(Schema.String.annotations({ title: 'Name' })),
79
- active: Schema.optional(Schema.Boolean.annotations({ title: 'Active' })),
80
- rank: Schema.optional(Schema.Number.annotations({ title: 'Rank' })),
81
- website: Schema.optional(Format.URL.annotations({ title: 'Website' })),
82
- address: Schema.optional(AddressSchema),
83
- }).pipe(Schema.mutable);
100
+ if (!space) {
101
+ return <></>;
102
+ }
84
103
 
85
- type ContactSchema = Schema.Schema.Type<typeof ContactSchema>;
104
+ return (
105
+ <Tooltip.Provider>
106
+ <TestLayout json={{ values, schema: schema.ast }}>
107
+ <Form.Root
108
+ debug={debug}
109
+ schema={schema}
110
+ defaultValues={values}
111
+ db={space.db}
112
+ onSave={handleSave}
113
+ onCancel={handleCancel}
114
+ {...props}
115
+ >
116
+ <Form.Viewport>
117
+ <Form.Content>
118
+ <Form.FieldSet />
119
+ <Form.Actions />
120
+ </Form.Content>
121
+ </Form.Viewport>
122
+ </Form.Root>
123
+ </TestLayout>
124
+ </Tooltip.Provider>
125
+ );
126
+ };
86
127
 
87
128
  const meta = {
88
129
  title: 'ui/react-ui-form/Form',
89
- component: Form as any,
130
+ component: Form.Root,
90
131
  render: DefaultStory,
91
- decorators: [withTheme, withLayoutVariants()],
132
+
133
+ decorators: [
134
+ withTheme(),
135
+ withLayout({ layout: 'fullscreen' }),
136
+ withClientProvider({
137
+ createIdentity: true,
138
+ createSpace: true,
139
+ types: [Tag.Tag, Organization, Person],
140
+ onCreateSpace: ({ space }) => {
141
+ [
142
+ ...Array.from({ length: 3 }).map((_, i) => Obj.make(Tag.Tag, { label: `Tag ${i}` })),
143
+ ...Array.from({ length: 50 }).map((_, i) => Obj.make(Organization, { name: `Organization ${i}` })),
144
+ ].map((obj) => space.db.add(obj));
145
+ },
146
+ }),
147
+ ],
92
148
  parameters: {
93
149
  layout: 'fullscreen',
94
150
  translations,
95
151
  },
96
- argTypes: {
97
- readonly: {
98
- control: 'boolean',
99
- description: 'Readonly',
100
- },
101
- },
102
- } satisfies Meta<StoryProps<any>>;
152
+ } satisfies Meta<DefaultStoryProps<any>>;
103
153
 
104
154
  export default meta;
105
155
 
106
- type Story = StoryObj<typeof meta>;
156
+ type Story<T extends AnyProperties> = StoryObj<DefaultStoryProps<T>>;
107
157
 
108
- export const Default: Story = {
109
- args: {
110
- schema: ContactSchema,
111
- values: {
112
- name: 'DXOS',
113
- active: true,
114
- address: {
115
- zip: '11205',
116
- },
117
- },
118
- readonly: false,
119
- },
158
+ const values: Partial<Person> = {
159
+ name: 'Alice',
160
+ location: [40.7128, -74.006],
161
+ tasks: ['task 1', 'task 2'],
120
162
  };
121
163
 
122
- export const Organization: Story = {
164
+ export const Default: Story<ExcludeId<typeof Person>> = {
123
165
  args: {
124
- debug: true,
125
- schema: Testing.OrganizationSchema,
126
- values: {
127
- name: 'DXOS',
128
- website: 'https://dxos.org',
129
- },
130
- readonly: false,
131
- },
132
- };
133
-
134
- export const OrganizationAutoSave: Story = {
135
- args: {
136
- debug: true,
137
- schema: Testing.OrganizationSchema,
138
- values: {
139
- name: 'DXOS',
140
- website: 'https://dxos.org',
141
- },
166
+ schema: omitId(Person),
167
+ values,
142
168
  autoSave: true,
143
- readonly: false,
144
- },
145
- };
146
-
147
- // TODO(burdon): Type issue with employer reference.
148
- // TODO(burdon): Test table/form with compound values (e.g., address).
149
- // Property name is missing in type EncodedReference but required in type
150
- export const Person: Story = {
151
- args: {
152
- debug: true,
153
- schema: Testing.Person,
154
- values: {
155
- name: 'Bot',
156
- },
157
- },
158
- };
159
-
160
- //
161
- // Union
162
- //
163
-
164
- const ShapeSchema = Schema.Struct({
165
- shape: Schema.optional(
166
- Schema.Union(
167
- Schema.Struct({
168
- type: Schema.Literal('circle').annotations({ title: 'Type' }),
169
- radius: Schema.optional(Schema.Number.annotations({ title: 'Radius' })),
170
- }),
171
- Schema.Struct({
172
- type: Schema.Literal('square').annotations({ title: 'Type' }),
173
- size: Schema.optional(Schema.Number.pipe(Schema.nonNegative()).annotations({ title: 'Size' })),
174
- }),
175
- ).annotations({ title: 'Shape' }),
176
- ),
177
- }).pipe(Schema.mutable);
178
-
179
- type ShapeSchema = Schema.Schema.Type<typeof ShapeSchema>;
180
-
181
- export const DiscriminatedShape: StoryObj<StoryProps<ShapeSchema>> = {
182
- args: {
183
- debug: true,
184
- schema: ShapeSchema,
185
- readonly: false,
186
- values: {
187
- shape: {
188
- type: 'circle',
189
- radius: 5,
190
- },
191
- },
192
- Custom: {
193
- ['shape.type' as const]: (props) => (
194
- <SelectInput
195
- {...props}
196
- options={['circle', 'square'].map((value) => ({
197
- value,
198
- label: value,
199
- }))}
200
- />
201
- ),
202
- },
203
- },
204
- };
205
-
206
- //
207
- // Arrays
208
- //
209
-
210
- const ArraysSchema = Schema.Struct({
211
- names: Schema.Array(Schema.String.pipe(Schema.nonEmptyString())),
212
- addresses: Schema.Array(AddressSchema),
213
- }).pipe(Schema.mutable);
214
-
215
- type ArraysSchema = Schema.Schema.Type<typeof ArraysSchema>;
216
-
217
- export const Arrays: StoryObj<StoryProps<ArraysSchema>> = {
218
- args: {
219
- debug: true,
220
- schema: ArraysSchema,
221
- readonly: false,
222
- values: {
223
- names: ['Alice', 'Bob'],
224
- addresses: [],
225
- },
226
169
  },
227
170
  };
228
171
 
229
- //
230
- // Tuple
231
- //
232
-
233
- // TODO(wittjosiah): Only GeoPoint is works currently.
234
- const TupleSchema = Schema.Struct({
235
- tuple: Schema.Tuple(Schema.Number, Schema.String, Schema.Boolean),
236
- geopoint: Format.GeoPoint,
237
- }).pipe(Schema.mutable);
238
-
239
- type TupleSchema = Schema.Schema.Type<typeof TupleSchema>;
240
-
241
- export const Tuple: StoryObj<StoryProps<TupleSchema>> = {
172
+ export const Readonly: Story<ExcludeId<typeof Person>> = {
242
173
  args: {
243
- debug: true,
244
- schema: TupleSchema,
245
- readonly: false,
246
- values: {
247
- tuple: [1, 'a', true],
248
- geopoint: [-122.41941, 37.77492],
249
- },
174
+ schema: omitId(Person),
175
+ values,
176
+ readonly: true,
250
177
  },
251
178
  };
252
179
 
253
- //
254
- // Enum
255
- //
256
-
257
- const ColorSchema = Schema.Struct({
258
- color: Schema.Union(Schema.Literal('red'), Schema.Literal('green'), Schema.Literal('blue')).annotations({
259
- title: 'Color',
260
- }),
261
- }).pipe(Schema.mutable);
262
-
263
- type ColorType = Schema.Schema.Type<typeof ColorSchema>;
264
-
265
- export const Enum: StoryObj<StoryProps<ColorType>> = {
180
+ export const Static: Story<ExcludeId<typeof Person>> = {
266
181
  args: {
267
- debug: true,
268
- schema: ColorSchema,
269
- readonly: false,
270
- values: {
271
- color: 'red',
272
- },
182
+ schema: omitId(Person),
183
+ values,
184
+ layout: 'static',
273
185
  },
274
186
  };
275
187
 
276
- //
277
- // Refs
278
- //
279
-
280
- const RefSchema = Schema.Struct({
281
- contact: Ref(ContactType).annotations({ title: 'Contact Reference' }),
282
- optionalContact: Schema.optional(Ref(ContactType).annotations({ title: 'Optional Contact Reference' })),
283
- refArray: Schema.optional(Schema.Array(Ref(ContactType))),
284
- unknownExpando: Schema.optional(Ref(Expando).annotations({ title: 'Optional Ref to an Expando (DXN Input)' })),
285
- });
286
-
287
- type RefSchema = Schema.Schema.Type<typeof RefSchema>;
288
-
289
- const contact1 = live(ContactType, { identifiers: [] });
290
- const contact2 = live(ContactType, { identifiers: [] });
291
-
292
- export const Refs: StoryObj<StoryProps<RefSchema>> = {
293
- render: RefStory,
294
- args: {
295
- debug: true,
296
- schema: RefSchema,
297
- readonly: false,
298
- values: {
299
- refArray: [Ref.make(contact1), Ref.make(contact2)],
300
- },
301
- },
188
+ export const Empty: Story<ExcludeId<typeof Person>> = {
189
+ render: () => (
190
+ <TestLayout>
191
+ <Form.Root>
192
+ <Form.Viewport>
193
+ <Form.Content>
194
+ <Form.FieldSet />
195
+ <Form.Actions />
196
+ </Form.Content>
197
+ </Form.Viewport>
198
+ </Form.Root>
199
+ </TestLayout>
200
+ ),
302
201
  };