@dxos/react-ui-form 0.8.4-main.406dc2a → 0.8.4-main.52d7546f51

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 (190) hide show
  1. package/dist/lib/browser/index.mjs +2228 -2254
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +2228 -2254
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +6 -5
  8. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  9. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +13 -7
  10. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  11. package/dist/types/src/components/Form/Form-old.stories.d.ts +131 -0
  12. package/dist/types/src/components/Form/Form-old.stories.d.ts.map +1 -0
  13. package/dist/types/src/components/Form/Form.d.ts +81 -26
  14. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  15. package/dist/types/src/components/Form/Form.stories.d.ts +59 -84
  16. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Form/FormField.d.ts +37 -0
  18. package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
  19. package/dist/types/src/components/Form/FormFieldComponent.d.ts +78 -0
  20. package/dist/types/src/components/Form/FormFieldComponent.d.ts.map +1 -0
  21. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts +9 -0
  22. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts.map +1 -0
  23. package/dist/types/src/components/Form/FormFieldSet.d.ts +19 -0
  24. package/dist/types/src/components/Form/FormFieldSet.d.ts.map +1 -0
  25. package/dist/types/src/components/Form/fields/ArrayField.d.ts +18 -0
  26. package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +1 -0
  27. package/dist/types/src/components/Form/fields/BooleanField.d.ts +4 -0
  28. package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +1 -0
  29. package/dist/types/src/components/Form/fields/GeoPointField.d.ts +5 -0
  30. package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +1 -0
  31. package/dist/types/src/components/Form/fields/MarkdownField.d.ts +4 -0
  32. package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +1 -0
  33. package/dist/types/src/components/Form/fields/NumberField.d.ts +4 -0
  34. package/dist/types/src/components/Form/fields/NumberField.d.ts.map +1 -0
  35. package/dist/types/src/components/Form/fields/RefField.d.ts +14 -0
  36. package/dist/types/src/components/Form/fields/RefField.d.ts.map +1 -0
  37. package/dist/types/src/components/Form/fields/SelectField.d.ts +10 -0
  38. package/dist/types/src/components/Form/fields/SelectField.d.ts.map +1 -0
  39. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +5 -0
  40. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +1 -0
  41. package/dist/types/src/components/{ControlSection/ControlSection.stories.d.ts → Form/fields/SelectOptionField.stories.d.ts} +12 -14
  42. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +1 -0
  43. package/dist/types/src/components/Form/fields/TextAreaField.d.ts +4 -0
  44. package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +1 -0
  45. package/dist/types/src/components/Form/fields/TextField.d.ts +4 -0
  46. package/dist/types/src/components/Form/fields/TextField.d.ts.map +1 -0
  47. package/dist/types/src/components/Form/fields/TupleField.d.ts +6 -0
  48. package/dist/types/src/components/Form/fields/TupleField.d.ts.map +1 -0
  49. package/dist/types/src/components/Form/fields/index.d.ts +12 -0
  50. package/dist/types/src/components/Form/fields/index.d.ts.map +1 -0
  51. package/dist/types/src/components/Form/index.d.ts +2 -4
  52. package/dist/types/src/components/Form/index.d.ts.map +1 -1
  53. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +14 -9
  54. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -1
  55. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +9 -6
  56. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Settings/Settings.d.ts +56 -0
  58. package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
  59. package/dist/types/src/components/{Form/custom/SelectOptionsInput.stories.d.ts → Settings/Settings.stories.d.ts} +10 -8
  60. package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Settings/index.d.ts +2 -0
  62. package/dist/types/src/components/Settings/index.d.ts.map +1 -0
  63. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +11 -13
  64. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  65. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +12 -9
  66. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/index.d.ts +1 -1
  68. package/dist/types/src/components/index.d.ts.map +1 -1
  69. package/dist/types/src/components/testing.d.ts +0 -2
  70. package/dist/types/src/components/testing.d.ts.map +1 -1
  71. package/dist/types/src/hooks/index.d.ts +2 -3
  72. package/dist/types/src/hooks/index.d.ts.map +1 -1
  73. package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
  74. package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
  75. package/dist/types/src/hooks/useKeyHandler.d.ts +6 -0
  76. package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
  77. package/dist/types/src/translations.d.ts +10 -7
  78. package/dist/types/src/translations.d.ts.map +1 -1
  79. package/dist/types/src/util/echo.d.ts +6 -0
  80. package/dist/types/src/util/echo.d.ts.map +1 -0
  81. package/dist/types/src/util/field.d.ts +3 -3
  82. package/dist/types/src/util/field.d.ts.map +1 -1
  83. package/dist/types/src/util/formatting.d.ts +2 -2
  84. package/dist/types/src/util/formatting.d.ts.map +1 -1
  85. package/dist/types/src/util/index.d.ts +2 -1
  86. package/dist/types/src/util/index.d.ts.map +1 -1
  87. package/dist/types/src/util/properties.d.ts +7 -0
  88. package/dist/types/src/util/properties.d.ts.map +1 -0
  89. package/dist/types/src/util/refs.d.ts +1 -2
  90. package/dist/types/src/util/refs.d.ts.map +1 -1
  91. package/dist/types/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +49 -43
  93. package/src/components/FieldEditor/FieldEditor.stories.tsx +43 -22
  94. package/src/components/FieldEditor/FieldEditor.tsx +73 -76
  95. package/src/components/Form/Form-old.stories.tsx +314 -0
  96. package/src/components/Form/Form.stories.tsx +151 -248
  97. package/src/components/Form/Form.tsx +329 -108
  98. package/src/components/Form/FormField.tsx +286 -0
  99. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  100. package/src/components/Form/FormFieldComponent.tsx +174 -0
  101. package/src/components/Form/FormFieldSet.tsx +127 -0
  102. package/src/components/Form/README.md +3 -0
  103. package/src/components/Form/fields/ArrayField.tsx +154 -0
  104. package/src/components/Form/fields/BooleanField.tsx +22 -0
  105. package/src/components/Form/fields/GeoPointField.tsx +120 -0
  106. package/src/components/Form/fields/MarkdownField.tsx +78 -0
  107. package/src/components/Form/fields/NumberField.tsx +39 -0
  108. package/src/components/Form/fields/RefField.tsx +189 -0
  109. package/src/components/Form/fields/SelectField.tsx +65 -0
  110. package/src/components/Form/{custom/SelectOptionsInput.stories.tsx → fields/SelectOptionField.stories.tsx} +18 -15
  111. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +21 -15
  112. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  113. package/src/components/Form/fields/TextField.tsx +38 -0
  114. package/src/components/Form/{custom/TupleInput.tsx → fields/TupleField.tsx} +15 -8
  115. package/src/components/Form/fields/index.ts +15 -0
  116. package/src/components/Form/index.ts +3 -4
  117. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +21 -14
  118. package/src/components/ObjectPicker/ObjectPicker.tsx +76 -62
  119. package/src/components/Settings/Settings.stories.tsx +56 -0
  120. package/src/components/Settings/Settings.tsx +234 -0
  121. package/src/components/{ControlSection → Settings}/index.ts +1 -1
  122. package/src/components/ViewEditor/ViewEditor.stories.tsx +43 -41
  123. package/src/components/ViewEditor/ViewEditor.test.tsx +5 -5
  124. package/src/components/ViewEditor/ViewEditor.tsx +245 -192
  125. package/src/components/index.ts +1 -1
  126. package/src/components/testing.tsx +9 -7
  127. package/src/hooks/index.ts +2 -3
  128. package/src/hooks/useFormHandler.ts +362 -0
  129. package/src/hooks/useKeyHandler.tsx +37 -0
  130. package/src/translations.ts +12 -10
  131. package/src/util/echo.ts +25 -0
  132. package/src/util/field.ts +25 -25
  133. package/src/util/formatting.ts +22 -22
  134. package/src/util/index.ts +2 -1
  135. package/src/util/properties.ts +18 -0
  136. package/src/util/refs.ts +11 -17
  137. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  138. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  139. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  140. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  141. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  142. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  143. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  144. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  145. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  146. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  147. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  148. package/dist/types/src/components/Form/FormContent.d.ts +0 -63
  149. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  150. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  151. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  152. package/dist/types/src/components/Form/Input.d.ts +0 -29
  153. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  154. package/dist/types/src/components/Form/RefField.d.ts +0 -22
  155. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  156. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  157. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  158. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  159. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  160. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  161. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  162. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  163. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  164. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  165. package/dist/types/src/components/Form/factory.d.ts +0 -8
  166. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  167. package/dist/types/src/hooks/useForm.d.ts +0 -67
  168. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  169. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -29
  170. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  171. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  172. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  173. package/dist/types/src/util/schema.d.ts +0 -3
  174. package/dist/types/src/util/schema.d.ts.map +0 -1
  175. package/src/components/ControlSection/ControlSection.stories.tsx +0 -38
  176. package/src/components/ControlSection/ControlSection.tsx +0 -153
  177. package/src/components/Form/ArrayField.tsx +0 -125
  178. package/src/components/Form/Defaults.tsx +0 -205
  179. package/src/components/Form/FormActions.tsx +0 -54
  180. package/src/components/Form/FormContent.tsx +0 -322
  181. package/src/components/Form/FormContext.tsx +0 -110
  182. package/src/components/Form/Input.tsx +0 -54
  183. package/src/components/Form/RefField.tsx +0 -283
  184. package/src/components/Form/custom/GeoPointInput.tsx +0 -80
  185. package/src/components/Form/custom/index.ts +0 -7
  186. package/src/components/Form/factory.tsx +0 -31
  187. package/src/hooks/useForm.ts +0 -296
  188. package/src/hooks/useQueryRefOptions.ts +0 -62
  189. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  190. package/src/util/schema.ts +0 -12
@@ -6,297 +6,200 @@ 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, Tag, Type } from '@dxos/echo';
10
+ import { type AnyProperties } from '@dxos/echo/internal';
11
+ import { log } from '@dxos/log';
12
+ import { useClient } from '@dxos/react-client';
13
+ import { withClientProvider } from '@dxos/react-client/testing';
13
14
  import { Tooltip } from '@dxos/react-ui';
14
- import { withSurfaceVariantsLayout, 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: 'example.com/type/Organization', // TODO(burdon): Change all types to /schema
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(Type.Ref(Organization).annotations({ title: 'Employer' })),
50
+ tags: Schema.optional(Schema.Array(Type.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: 'dxos.org/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 StoryProps<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
85
  }: StoryProps<T>) => {
34
- const [values, setValues] = useState(initialValues);
35
- const handleSave = useCallback<NonNullable<FormProps<T>['onSave']>>((values) => {
86
+ const [values, setValues] = useState<Partial<T>>(valuesProp ?? {});
87
+ const client = useClient();
88
+ const space = client.spaces.default;
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 ContactType.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} />;
100
+ return (
101
+ <Tooltip.Provider>
102
+ <TestLayout json={{ values, schema: schema.ast }}>
103
+ <Form.Root
104
+ debug={debug}
105
+ schema={schema}
106
+ values={values}
107
+ db={space.db}
108
+ onSave={handleSave}
109
+ onCancel={handleCancel}
110
+ {...props}
111
+ >
112
+ <Form.Viewport>
113
+ <Form.Content>
114
+ <Form.FieldSet />
115
+ <Form.Actions />
116
+ </Form.Content>
117
+ </Form.Viewport>
118
+ </Form.Root>
119
+ </TestLayout>
120
+ </Tooltip.Provider>
121
+ );
68
122
  };
69
123
 
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);
84
-
85
- type ContactSchema = Schema.Schema.Type<typeof ContactSchema>;
86
-
87
124
  const meta = {
88
125
  title: 'ui/react-ui-form/Form',
89
- component: Form as any,
126
+ component: Form.Root,
90
127
  render: DefaultStory,
91
- decorators: [withTheme, withSurfaceVariantsLayout()],
128
+
129
+ decorators: [
130
+ withTheme(),
131
+ withLayout({
132
+ layout: 'fullscreen',
133
+ }),
134
+ withClientProvider({
135
+ createIdentity: true,
136
+ createSpace: true,
137
+ types: [Tag.Tag, Organization, Person],
138
+ onCreateIdentity: ({ client }) => {
139
+ const space = client.spaces.default;
140
+ [
141
+ Obj.make(Organization, { name: 'DXOS' }),
142
+ Obj.make(Organization, { name: 'BlueYard' }),
143
+ Obj.make(Organization, { name: 'Backed' }),
144
+ Obj.make(Organization, { name: 'BCV' }),
145
+ Tag.make({ label: 'Tag 1' }),
146
+ Tag.make({ label: 'Tag 2' }),
147
+ Tag.make({ label: 'Tag 3' }),
148
+ ].map((obj) => space.db.add(obj));
149
+ },
150
+ }),
151
+ ],
92
152
  parameters: {
93
153
  layout: 'fullscreen',
94
154
  translations,
95
155
  },
96
- argTypes: {
97
- readonly: {
98
- control: 'boolean',
99
- description: 'Readonly',
100
- },
101
- },
102
156
  } satisfies Meta<StoryProps<any>>;
103
157
 
104
158
  export default meta;
105
159
 
106
- type Story = StoryObj<typeof meta>;
107
-
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
- },
120
- };
160
+ type Story<T extends AnyProperties> = StoryObj<StoryProps<T>>;
121
161
 
122
- export const Organization: Story = {
123
- args: {
124
- debug: true,
125
- schema: Testing.OrganizationSchema,
126
- values: {
127
- name: 'DXOS',
128
- website: 'https://dxos.org',
129
- },
130
- readonly: false,
131
- },
162
+ const values: Partial<Person> = {
163
+ name: 'Alice',
164
+ location: [40.7128, -74.006],
165
+ tasks: ['task 1', 'task 2'],
132
166
  };
133
167
 
134
- export const OrganizationAutoSave: Story = {
168
+ export const Default: Story<ExcludeId<typeof Person>> = {
135
169
  args: {
136
- debug: true,
137
- schema: Testing.OrganizationSchema,
138
- values: {
139
- name: 'DXOS',
140
- website: 'https://dxos.org',
141
- },
170
+ schema: omitId(Person),
171
+ values,
142
172
  autoSave: true,
143
- readonly: false,
144
173
  },
145
174
  };
146
175
 
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 Contact: Story = {
176
+ export const Readonly: Story<ExcludeId<typeof Person>> = {
151
177
  args: {
152
- debug: true,
153
- schema: Testing.ContactSchema,
154
- values: {
155
- name: 'Bot',
156
- },
178
+ schema: omitId(Person),
179
+ values,
180
+ readonly: true,
157
181
  },
158
182
  };
159
183
 
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
- },
227
- };
228
-
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>> = {
242
- args: {
243
- debug: true,
244
- schema: TupleSchema,
245
- readonly: false,
246
- values: {
247
- tuple: [1, 'a', true],
248
- geopoint: [-122.41941, 37.77492],
249
- },
250
- },
251
- };
252
-
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>> = {
184
+ export const Static: Story<ExcludeId<typeof Person>> = {
266
185
  args: {
267
- debug: true,
268
- schema: ColorSchema,
269
- readonly: false,
270
- values: {
271
- color: 'red',
272
- },
186
+ schema: omitId(Person),
187
+ values,
188
+ layout: 'static',
273
189
  },
274
190
  };
275
191
 
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
- },
192
+ export const Empty: Story<ExcludeId<typeof Person>> = {
193
+ render: () => (
194
+ <TestLayout>
195
+ <Form.Root>
196
+ <Form.Viewport>
197
+ <Form.Content>
198
+ <Form.FieldSet />
199
+ <Form.Actions />
200
+ </Form.Content>
201
+ </Form.Viewport>
202
+ </Form.Root>
203
+ </TestLayout>
204
+ ),
302
205
  };