@dxos/react-ui-form 0.8.4-main.7ace549 → 0.8.4-main.937b3ca

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