@dxos/react-ui-form 0.8.4-main.c4373fc → 0.8.4-main.c85a9c8dae

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 (185) hide show
  1. package/README.md +0 -1
  2. package/dist/lib/browser/index.mjs +2289 -2269
  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 +2289 -2269
  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 +13 -7
  11. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  12. package/dist/types/src/components/Form/Form.d.ts +81 -26
  13. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  14. package/dist/types/src/components/Form/Form.stories.d.ts +59 -84
  15. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  16. package/dist/types/src/components/Form/FormField.d.ts +37 -0
  17. package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
  18. package/dist/types/src/components/Form/FormFieldComponent.d.ts +78 -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 +19 -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 +14 -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} +12 -14
  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 +15 -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 -6
  55. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/Settings/Settings.d.ts +56 -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} +10 -8
  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 +16 -16
  63. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  64. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +13 -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 +10 -7
  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 +1 -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 -46
  90. package/src/components/FieldEditor/FieldEditor.stories.tsx +43 -24
  91. package/src/components/FieldEditor/FieldEditor.tsx +74 -78
  92. package/src/components/Form/Form.stories.tsx +149 -248
  93. package/src/components/Form/Form.tsx +347 -107
  94. package/src/components/Form/FormField.tsx +294 -0
  95. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  96. package/src/components/Form/FormFieldComponent.tsx +172 -0
  97. package/src/components/Form/FormFieldSet.tsx +123 -0
  98. package/src/components/Form/README.md +3 -0
  99. package/src/components/Form/fields/ArrayField.tsx +149 -0
  100. package/src/components/Form/fields/BooleanField.tsx +22 -0
  101. package/src/components/Form/fields/GeoPointField.tsx +120 -0
  102. package/src/components/Form/fields/MarkdownField.tsx +78 -0
  103. package/src/components/Form/fields/NumberField.tsx +39 -0
  104. package/src/components/Form/fields/RefField.tsx +189 -0
  105. package/src/components/Form/fields/SelectField.tsx +65 -0
  106. package/src/components/Form/{custom/SelectOptionsInput.stories.tsx → fields/SelectOptionField.stories.tsx} +19 -16
  107. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +23 -17
  108. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  109. package/src/components/Form/fields/TextField.tsx +38 -0
  110. package/src/components/Form/{custom/TupleInput.tsx → fields/TupleField.tsx} +15 -8
  111. package/src/components/Form/fields/index.ts +15 -0
  112. package/src/components/Form/index.ts +3 -4
  113. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +40 -37
  114. package/src/components/ObjectPicker/ObjectPicker.tsx +84 -70
  115. package/src/components/Settings/Settings.stories.tsx +56 -0
  116. package/src/components/Settings/Settings.tsx +230 -0
  117. package/src/components/{ControlSection → Settings}/index.ts +1 -1
  118. package/src/components/ViewEditor/ViewEditor.stories.tsx +69 -49
  119. package/src/components/ViewEditor/ViewEditor.test.tsx +8 -6
  120. package/src/components/ViewEditor/ViewEditor.tsx +302 -271
  121. package/src/components/index.ts +1 -1
  122. package/src/components/testing.tsx +12 -7
  123. package/src/hooks/index.ts +2 -3
  124. package/src/hooks/useFormHandler.ts +380 -0
  125. package/src/hooks/useKeyHandler.tsx +37 -0
  126. package/src/translations.ts +12 -10
  127. package/src/util/field.ts +25 -25
  128. package/src/util/formatting.ts +22 -22
  129. package/src/util/index.ts +1 -1
  130. package/src/util/properties.ts +18 -0
  131. package/src/util/refs.ts +11 -17
  132. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  133. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  134. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  135. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  136. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  137. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  138. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  139. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  140. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  141. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  142. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  143. package/dist/types/src/components/Form/FormContent.d.ts +0 -63
  144. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  145. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  146. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  147. package/dist/types/src/components/Form/Input.d.ts +0 -29
  148. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  149. package/dist/types/src/components/Form/RefField.d.ts +0 -21
  150. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  151. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  152. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  153. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  154. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  155. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  156. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  157. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  158. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  159. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  160. package/dist/types/src/components/Form/factory.d.ts +0 -8
  161. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  162. package/dist/types/src/hooks/useForm.d.ts +0 -67
  163. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  164. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -28
  165. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  166. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  167. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  168. package/dist/types/src/util/schema.d.ts +0 -3
  169. package/dist/types/src/util/schema.d.ts.map +0 -1
  170. package/src/components/ControlSection/ControlSection.stories.tsx +0 -38
  171. package/src/components/ControlSection/ControlSection.tsx +0 -153
  172. package/src/components/Form/ArrayField.tsx +0 -125
  173. package/src/components/Form/Defaults.tsx +0 -205
  174. package/src/components/Form/FormActions.tsx +0 -54
  175. package/src/components/Form/FormContent.tsx +0 -322
  176. package/src/components/Form/FormContext.tsx +0 -110
  177. package/src/components/Form/Input.tsx +0 -54
  178. package/src/components/Form/RefField.tsx +0 -269
  179. package/src/components/Form/custom/GeoPointInput.tsx +0 -80
  180. package/src/components/Form/custom/index.ts +0 -7
  181. package/src/components/Form/factory.tsx +0 -31
  182. package/src/hooks/useForm.ts +0 -295
  183. package/src/hooks/useQueryRefOptions.ts +0 -59
  184. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  185. package/src/util/schema.ts +0 -12
@@ -6,297 +6,198 @@ 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 { 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(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: '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({ layout: 'fullscreen' }),
132
+ withClientProvider({
133
+ createIdentity: true,
134
+ createSpace: true,
135
+ types: [Tag.Tag, Organization, Person],
136
+ onCreateIdentity: ({ client }) => {
137
+ const space = client.spaces.default;
138
+ [
139
+ Obj.make(Organization, { name: 'DXOS' }),
140
+ Obj.make(Organization, { name: 'BlueYard' }),
141
+ Obj.make(Organization, { name: 'Backed' }),
142
+ Obj.make(Organization, { name: 'BCV' }),
143
+ Tag.make({ label: 'Tag 1' }),
144
+ Tag.make({ label: 'Tag 2' }),
145
+ Tag.make({ label: 'Tag 3' }),
146
+ ].map((obj) => space.db.add(obj));
147
+ },
148
+ }),
149
+ ],
92
150
  parameters: {
93
151
  layout: 'fullscreen',
94
152
  translations,
95
153
  },
96
- argTypes: {
97
- readonly: {
98
- control: 'boolean',
99
- description: 'Readonly',
100
- },
101
- },
102
154
  } satisfies Meta<StoryProps<any>>;
103
155
 
104
156
  export default meta;
105
157
 
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
- };
158
+ type Story<T extends AnyProperties> = StoryObj<StoryProps<T>>;
121
159
 
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
- },
160
+ const values: Partial<Person> = {
161
+ name: 'Alice',
162
+ location: [40.7128, -74.006],
163
+ tasks: ['task 1', 'task 2'],
132
164
  };
133
165
 
134
- export const OrganizationAutoSave: Story = {
166
+ export const Default: Story<ExcludeId<typeof Person>> = {
135
167
  args: {
136
- debug: true,
137
- schema: Testing.OrganizationSchema,
138
- values: {
139
- name: 'DXOS',
140
- website: 'https://dxos.org',
141
- },
168
+ schema: omitId(Person),
169
+ values,
142
170
  autoSave: true,
143
- readonly: false,
144
171
  },
145
172
  };
146
173
 
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 = {
174
+ export const Readonly: Story<ExcludeId<typeof Person>> = {
151
175
  args: {
152
- debug: true,
153
- schema: Testing.ContactSchema,
154
- values: {
155
- name: 'Bot',
156
- },
176
+ schema: omitId(Person),
177
+ values,
178
+ readonly: true,
157
179
  },
158
180
  };
159
181
 
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>> = {
182
+ export const Static: Story<ExcludeId<typeof Person>> = {
266
183
  args: {
267
- debug: true,
268
- schema: ColorSchema,
269
- readonly: false,
270
- values: {
271
- color: 'red',
272
- },
184
+ schema: omitId(Person),
185
+ values,
186
+ layout: 'static',
273
187
  },
274
188
  };
275
189
 
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
- },
190
+ export const Empty: Story<ExcludeId<typeof Person>> = {
191
+ render: () => (
192
+ <TestLayout>
193
+ <Form.Root>
194
+ <Form.Viewport>
195
+ <Form.Content>
196
+ <Form.FieldSet />
197
+ <Form.Actions />
198
+ </Form.Content>
199
+ </Form.Viewport>
200
+ </Form.Root>
201
+ </TestLayout>
202
+ ),
302
203
  };