@dxos/react-ui-table 0.8.4-main.72ec0f3 → 0.8.4-main.8360d9e660

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 (134) hide show
  1. package/dist/lib/browser/chunk-BF54SSNL.mjs +70 -0
  2. package/dist/lib/browser/chunk-BF54SSNL.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-GS2UNGJK.mjs → chunk-PTHMYAAM.mjs} +656 -680
  4. package/dist/lib/browser/chunk-PTHMYAAM.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +1158 -1028
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +30 -42
  9. package/dist/lib/browser/testing/index.mjs.map +3 -3
  10. package/dist/lib/browser/types/index.mjs +3 -3
  11. package/dist/lib/node-esm/{chunk-TRR3C5NX.mjs → chunk-GI72MQSG.mjs} +656 -679
  12. package/dist/lib/node-esm/chunk-GI72MQSG.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-SIRDIPHZ.mjs +71 -0
  14. package/dist/lib/node-esm/chunk-SIRDIPHZ.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +1158 -1028
  16. package/dist/lib/node-esm/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/meta.json +1 -1
  18. package/dist/lib/node-esm/testing/index.mjs +30 -42
  19. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/types/index.mjs +3 -3
  21. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts +1 -2
  22. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts.map +1 -1
  23. package/dist/types/src/components/Table/ColumnSettings.d.ts +2 -2
  24. package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -1
  25. package/dist/types/src/components/Table/DynamicTable.d.ts +7 -7
  26. package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
  27. package/dist/types/src/components/Table/DynamicTable.stories.d.ts +4 -18
  28. package/dist/types/src/components/Table/DynamicTable.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Table/Relations.stories.d.ts +12 -8
  30. package/dist/types/src/components/Table/Relations.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Table/RowActionsMenu.d.ts.map +1 -1
  32. package/dist/types/src/components/Table/Table.d.ts +11 -11
  33. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  34. package/dist/types/src/components/Table/Table.stories.d.ts +71 -5
  35. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  36. package/dist/types/src/components/TableCellEditor/CellValidationMessage.d.ts +1 -1
  37. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts +10 -12
  38. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts.map +1 -1
  39. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +5 -7
  40. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
  41. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts +4 -4
  42. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
  43. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts +3 -3
  44. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/testing.d.ts +22 -15
  46. package/dist/types/src/components/testing.d.ts.map +1 -1
  47. package/dist/types/src/hooks/index.d.ts +2 -1
  48. package/dist/types/src/hooks/index.d.ts.map +1 -1
  49. package/dist/types/src/hooks/useAddRow.d.ts +5 -6
  50. package/dist/types/src/hooks/useAddRow.d.ts.map +1 -1
  51. package/dist/types/src/hooks/useProjectionModel.d.ts +6 -0
  52. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
  53. package/dist/types/src/hooks/useTableModel.d.ts +9 -9
  54. package/dist/types/src/hooks/useTableModel.d.ts.map +1 -1
  55. package/dist/types/src/model/modal-controller.d.ts +5 -1
  56. package/dist/types/src/model/modal-controller.d.ts.map +1 -1
  57. package/dist/types/src/model/selection-model.d.ts +17 -8
  58. package/dist/types/src/model/selection-model.d.ts.map +1 -1
  59. package/dist/types/src/model/table-model.d.ts +104 -24
  60. package/dist/types/src/model/table-model.d.ts.map +1 -1
  61. package/dist/types/src/model/table-presentation.d.ts +3 -1
  62. package/dist/types/src/model/table-presentation.d.ts.map +1 -1
  63. package/dist/types/src/playwright/TableManager.d.ts +2 -1
  64. package/dist/types/src/playwright/TableManager.d.ts.map +1 -1
  65. package/dist/types/src/testing/useTestTableModel.d.ts +18 -15
  66. package/dist/types/src/testing/useTestTableModel.d.ts.map +1 -1
  67. package/dist/types/src/translations.d.ts +4 -4
  68. package/dist/types/src/translations.d.ts.map +1 -1
  69. package/dist/types/src/types/Table.d.ts +26 -0
  70. package/dist/types/src/types/Table.d.ts.map +1 -0
  71. package/dist/types/src/types/index.d.ts +1 -1
  72. package/dist/types/src/types/index.d.ts.map +1 -1
  73. package/dist/types/src/util/dynamic-table.d.ts +14 -11
  74. package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
  75. package/dist/types/src/util/dynamic-table.test.d.ts +2 -0
  76. package/dist/types/src/util/dynamic-table.test.d.ts.map +1 -0
  77. package/dist/types/src/util/index.d.ts +2 -0
  78. package/dist/types/src/util/index.d.ts.map +1 -1
  79. package/dist/types/src/util/query-ast.d.ts +7 -0
  80. package/dist/types/src/util/query-ast.d.ts.map +1 -0
  81. package/dist/types/src/util/sort.d.ts +12 -0
  82. package/dist/types/src/util/sort.d.ts.map +1 -0
  83. package/dist/types/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +54 -55
  85. package/src/components/Table/ColumnActionsMenu.tsx +10 -6
  86. package/src/components/Table/ColumnSettings.tsx +8 -9
  87. package/src/components/Table/DynamicTable.stories.tsx +16 -16
  88. package/src/components/Table/DynamicTable.tsx +30 -22
  89. package/src/components/Table/Relations.stories.tsx +39 -41
  90. package/src/components/Table/RowActionsMenu.tsx +3 -2
  91. package/src/components/Table/Table.stories.tsx +110 -92
  92. package/src/components/Table/Table.tsx +324 -299
  93. package/src/components/TableCellEditor/CellValidationMessage.tsx +5 -5
  94. package/src/components/TableCellEditor/FormCellEditor.tsx +118 -135
  95. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +14 -10
  96. package/src/components/TableCellEditor/TableCellEditor.tsx +31 -31
  97. package/src/components/TableToolbar/TableToolbar.tsx +25 -19
  98. package/src/components/testing.ts +38 -12
  99. package/src/hooks/index.ts +2 -1
  100. package/src/hooks/useAddRow.ts +8 -10
  101. package/src/hooks/useProjectionModel.ts +39 -0
  102. package/src/hooks/useTableModel.ts +36 -34
  103. package/src/model/modal-controller.ts +23 -12
  104. package/src/model/selection-model.ts +75 -44
  105. package/src/model/table-model.test.ts +82 -54
  106. package/src/model/table-model.ts +430 -167
  107. package/src/model/table-presentation.test.ts +59 -49
  108. package/src/model/table-presentation.ts +43 -37
  109. package/src/playwright/TableManager.ts +13 -6
  110. package/src/playwright/playwright.config.ts +1 -1
  111. package/src/playwright/smoke.spec.ts +49 -5
  112. package/src/testing/useTestTableModel.ts +45 -38
  113. package/src/translations.ts +3 -3
  114. package/src/types/Table.ts +79 -0
  115. package/src/types/index.ts +1 -1
  116. package/src/util/dynamic-table.test.ts +70 -0
  117. package/src/util/dynamic-table.ts +40 -26
  118. package/src/util/index.ts +2 -0
  119. package/src/util/query-ast.ts +22 -0
  120. package/src/util/sort.ts +90 -0
  121. package/src/util/table-buttons.ts +1 -1
  122. package/src/util/table-controls.ts +2 -2
  123. package/dist/lib/browser/chunk-2PFAPQL4.mjs +0 -66
  124. package/dist/lib/browser/chunk-2PFAPQL4.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-GS2UNGJK.mjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-6POOFFYF.mjs +0 -67
  127. package/dist/lib/node-esm/chunk-6POOFFYF.mjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-TRR3C5NX.mjs.map +0 -7
  129. package/dist/types/src/model/table-sorting.d.ts +0 -52
  130. package/dist/types/src/model/table-sorting.d.ts.map +0 -1
  131. package/dist/types/src/types/schema.d.ts +0 -28
  132. package/dist/types/src/types/schema.d.ts.map +0 -1
  133. package/src/model/table-sorting.ts +0 -225
  134. package/src/types/schema.ts +0 -73
@@ -6,41 +6,34 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Schema from 'effect/Schema';
7
7
  import React, { useCallback } from 'react';
8
8
 
9
- import { Obj, type QueryAST, Type } from '@dxos/echo';
10
- import {
11
- EchoObject,
12
- FormatAnnotation,
13
- FormatEnum,
14
- GeneratorAnnotation,
15
- LabelAnnotation,
16
- PropertyMetaAnnotationId,
17
- } from '@dxos/echo/internal';
18
- import { live } from '@dxos/echo/internal';
9
+ import { Annotation, type Database, Format, Obj, type QueryAST, Ref, Type } from '@dxos/echo';
10
+ import { View } from '@dxos/echo';
11
+ import { type Mutable, PropertyMetaAnnotationId } from '@dxos/echo/internal';
19
12
  import { invariant } from '@dxos/invariant';
20
13
  import { faker } from '@dxos/random';
21
14
  import { PublicKey } from '@dxos/react-client';
22
- import { type Space } from '@dxos/react-client/echo';
23
15
  import { withClientProvider } from '@dxos/react-client/testing';
24
- import { withTheme } from '@dxos/react-ui/testing';
25
- import { ViewEditor } from '@dxos/react-ui-form';
16
+ import { Panel, ScrollArea } from '@dxos/react-ui';
17
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
18
+ import { ViewEditor, translations as formTranslations } from '@dxos/react-ui-form';
26
19
  import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
27
- import { View, getSchemaFromPropertyDefinitions, getTypenameFromQuery } from '@dxos/schema';
28
- import { Testing, createObjectFactory } from '@dxos/schema/testing';
20
+ import { ViewModel, getSchemaFromPropertyDefinitions, getTypenameFromQuery } from '@dxos/schema';
21
+ import { TestSchema, createObjectFactory } from '@dxos/schema/testing';
22
+ import { withRegistry } from '@dxos/storybook-utils';
29
23
 
30
24
  import { useTestTableModel } from '../../testing';
31
25
  import { translations } from '../../translations';
32
26
  import { Table } from '../../types';
33
- import { TableToolbar } from '../TableToolbar';
34
27
 
35
28
  import { Table as TableComponent } from './Table';
36
29
 
37
- const TestSchema = Schema.Struct({
30
+ const Example = Schema.Struct({
38
31
  // TODO(wittjosiah): Should be title. Currently name to work with default label.
39
32
  name: Schema.optional(Schema.String).annotations({ title: 'Title' }),
40
33
  urgent: Schema.optional(Schema.Boolean).annotations({ title: 'Urgent' }),
41
34
  status: Schema.optional(
42
35
  Schema.Literal('todo', 'in-progress', 'done')
43
- .pipe(FormatAnnotation.set(FormatEnum.SingleSelect))
36
+ .pipe(Format.FormatAnnotation.set(Format.TypeFormat.SingleSelect))
44
37
  .annotations({
45
38
  title: 'Status',
46
39
  [PropertyMetaAnnotationId]: {
@@ -55,24 +48,24 @@ const TestSchema = Schema.Struct({
55
48
  }),
56
49
  ),
57
50
  description: Schema.optional(Schema.String).annotations({ title: 'Description' }),
58
- parent: Schema.optional(Schema.suspend((): Type.Ref<TestSchema> => Type.Ref(TestSchema))).annotations({
51
+ parent: Schema.optional(Schema.suspend((): Ref.RefSchema<Example> => Ref.Ref(Example))).annotations({
59
52
  title: 'Parent',
60
53
  }),
61
54
  }).pipe(
62
- Type.Obj({ typename: `example.com/type/${PublicKey.random().truncate()}`, version: '0.1.0' }),
63
- LabelAnnotation.set(['name']),
55
+ Type.object({ typename: `com.example.type.${PublicKey.random().truncate()}`, version: '0.1.0' }),
56
+ Annotation.LabelAnnotation.set(['name']),
64
57
  );
65
- interface TestSchema extends Schema.Schema.Type<typeof TestSchema> {}
58
+ interface Example extends Schema.Schema.Type<typeof Example> {}
66
59
 
67
60
  const StoryViewEditor = ({
68
61
  view,
69
62
  schema,
70
- space,
63
+ db,
71
64
  handleDeleteColumn,
72
65
  }: {
73
66
  view?: View.View;
74
67
  schema?: Schema.Schema.AnyNoContext;
75
- space?: Space;
68
+ db?: Database.Database;
76
69
  handleDeleteColumn: (fieldId: string) => void;
77
70
  }) => {
78
71
  const handleQueryChanged = useCallback(
@@ -81,7 +74,9 @@ const StoryViewEditor = ({
81
74
  invariant(Type.isMutable(schema));
82
75
  schema.updateTypename(getTypenameFromQuery(newQuery));
83
76
  invariant(view);
84
- view.query.ast = newQuery;
77
+ Obj.change(view, (v) => {
78
+ v.query.ast = newQuery as Mutable<typeof newQuery>;
79
+ });
85
80
  },
86
81
  [schema, view],
87
82
  );
@@ -92,7 +87,7 @@ const StoryViewEditor = ({
92
87
 
93
88
  return (
94
89
  <ViewEditor
95
- registry={space?.db.schemaRegistry}
90
+ registry={db?.schemaRegistry}
96
91
  schema={schema}
97
92
  view={view}
98
93
  onQueryChanged={handleQueryChanged}
@@ -106,44 +101,53 @@ const StoryViewEditor = ({
106
101
  //
107
102
 
108
103
  const DefaultStory = () => {
109
- const {
110
- space,
111
- schema,
112
- view,
113
- tableRef,
114
- model,
115
- presentation,
116
- client,
117
- handleInsertRow,
118
- handleSaveView,
119
- handleDeleteColumn,
120
- } = useTestTableModel();
121
-
122
- if (!schema || !view) {
104
+ const { db, schema, table, tableRef, model, presentation, handleInsertRow, handleSaveView, handleDeleteColumn } =
105
+ useTestTableModel();
106
+
107
+ const handleRowClick = useCallback(
108
+ (row: any) => {
109
+ if (model?.getDraftRowCount() === 0 && ['frozenRowsEnd', 'fixedEndStart', 'fixedEndEnd'].includes(row?.plane)) {
110
+ handleInsertRow();
111
+ }
112
+ },
113
+ [model, handleInsertRow],
114
+ );
115
+
116
+ if (!schema || !table?.view.target) {
123
117
  return <div />;
124
118
  }
125
119
 
126
120
  return (
127
121
  <div className='grow grid grid-cols-[1fr_350px]'>
128
- <div className='grid grid-rows-[min-content_1fr] min-bs-0 overflow-hidden'>
129
- <TableToolbar classNames='border-be border-subduedSeparator' onAdd={handleInsertRow} onSave={handleSaveView} />
130
- <TableComponent.Root>
131
- <TableComponent.Main
132
- ref={tableRef}
133
- model={model}
134
- presentation={presentation}
135
- schema={schema}
136
- client={client}
137
- ignoreAttention
138
- />
139
- </TableComponent.Root>
140
- </div>
141
- <div className='flex flex-col bs-full border-l border-separator overflow-y-auto'>
142
- <StoryViewEditor view={view} schema={schema} space={space} handleDeleteColumn={handleDeleteColumn} />
143
- <SyntaxHighlighter language='json' className='text-xs'>
144
- {JSON.stringify({ view, schema }, null, 2)}
145
- </SyntaxHighlighter>
146
- </div>
122
+ <TableComponent.Root>
123
+ <Panel.Root>
124
+ <Panel.Toolbar asChild>
125
+ <TableComponent.Toolbar
126
+ classNames='border-b border-subdued-separator'
127
+ onAdd={handleInsertRow}
128
+ onSave={handleSaveView}
129
+ />
130
+ </Panel.Toolbar>
131
+ <Panel.Content asChild>
132
+ <TableComponent.Main
133
+ ref={tableRef}
134
+ schema={schema}
135
+ model={model}
136
+ presentation={presentation}
137
+ onRowClick={handleRowClick}
138
+ ignoreAttention
139
+ />
140
+ </Panel.Content>
141
+ </Panel.Root>
142
+ </TableComponent.Root>
143
+ <ScrollArea.Root orientation='vertical' classNames='border-l border-separator'>
144
+ <ScrollArea.Viewport>
145
+ <StoryViewEditor view={table.view.target} schema={schema} db={db} handleDeleteColumn={handleDeleteColumn} />
146
+ <SyntaxHighlighter language='json' className='text-xs'>
147
+ {JSON.stringify({ view: table.view.target, schema }, null, 2)}
148
+ </SyntaxHighlighter>
149
+ </ScrollArea.Viewport>
150
+ </ScrollArea.Root>
147
151
  </div>
148
152
  );
149
153
  };
@@ -154,26 +158,31 @@ type StoryProps = { rows?: number };
154
158
  // Story definitions.
155
159
  //
156
160
 
157
- // TODO(burdon): Need super simple story.
161
+ // TODO(burdon): Need simpler story.
158
162
 
159
163
  const meta = {
160
164
  title: 'ui/react-ui-table/Table',
161
165
  render: DefaultStory,
162
166
  decorators: [
163
- withTheme,
167
+ withTheme(),
168
+ withLayout({ layout: 'fullscreen' }),
169
+ withRegistry,
164
170
  withClientProvider({
165
171
  types: [View.View, Table.Table],
166
172
  createIdentity: true,
167
173
  createSpace: true,
168
- onCreateSpace: async ({ client, space }) => {
169
- const [schema] = await space.db.schemaRegistry.register([TestSchema]);
170
- const { view } = await Table.makeView({ client, space, typename: schema.typename });
171
- view.projection.fields = [
172
- view.projection.fields.find((field: any) => field.path === 'name')!,
173
- ...view.projection.fields.filter((field: any) => field.path !== 'name'),
174
- ];
174
+ onCreateSpace: async ({ space }) => {
175
+ const [schema] = await space.db.schemaRegistry.register([Example]);
176
+ const { view, jsonSchema } = await ViewModel.makeFromDatabase({ db: space.db, typename: schema.typename });
177
+ const table = Table.make({ view, jsonSchema });
178
+ Obj.change(view, (v) => {
179
+ v.projection.fields = [
180
+ v.projection.fields.find((field) => field.path === 'name')!,
181
+ ...v.projection.fields.filter((field) => field.path !== 'name'),
182
+ ];
183
+ });
175
184
 
176
- space.db.add(view);
185
+ space.db.add(table);
177
186
 
178
187
  Array.from({ length: 10 }).map(() => {
179
188
  return space.db.add(
@@ -192,7 +201,7 @@ const meta = {
192
201
  controls: {
193
202
  disable: true,
194
203
  },
195
- translations,
204
+ translations: [...translations, ...formTranslations],
196
205
  },
197
206
  } satisfies Meta<typeof TableComponent>;
198
207
 
@@ -209,26 +218,30 @@ export const StaticSchema: StoryObj = {
209
218
  types: [View.View, Table.Table],
210
219
  createIdentity: true,
211
220
  createSpace: true,
212
- onCreateSpace: async ({ client, space }) => {
213
- const { view } = await Table.makeView({ client, space, typename: Testing.Person.typename });
214
- space.db.add(view);
221
+ onCreateSpace: async ({ space }) => {
222
+ const { view, jsonSchema } = await ViewModel.makeFromDatabase({
223
+ db: space.db,
224
+ typename: TestSchema.Person.typename,
225
+ });
226
+ const table = Table.make({ view, jsonSchema });
227
+ space.db.add(table);
215
228
 
216
229
  const factory = createObjectFactory(space.db, faker as any);
217
230
  await factory([
218
- { type: Testing.Person, count: 10 },
219
- // { type: Testing.Organization, count: 1 },
231
+ { type: TestSchema.Person, count: 10 },
232
+ // { type: TestSchema.Organization, count: 1 },
220
233
  ]);
221
234
  },
222
235
  }),
223
236
  ],
224
237
  parameters: {
225
238
  layout: 'fullscreen',
226
- translations,
239
+ translations: [...translations, ...formTranslations],
227
240
  },
228
241
  };
229
242
 
230
243
  const ContactWithArrayOfEmails = Schema.Struct({
231
- name: Schema.String.pipe(GeneratorAnnotation.set('person.fullName')),
244
+ name: Schema.String.pipe(Annotation.GeneratorAnnotation.set('person.fullName')),
232
245
  emails: Schema.optional(
233
246
  Schema.Array(
234
247
  Schema.Struct({
@@ -238,8 +251,8 @@ const ContactWithArrayOfEmails = Schema.Struct({
238
251
  ),
239
252
  ),
240
253
  }).pipe(
241
- EchoObject({
242
- typename: 'dxos.org/type/ContactWithArrayOfEmails',
254
+ Type.object({
255
+ typename: 'org.dxos.type.contact-with-array-of-emails',
243
256
  version: '0.1.0',
244
257
  }),
245
258
  );
@@ -248,17 +261,21 @@ export const ArrayOfObjects: StoryObj = {
248
261
  render: DefaultStory,
249
262
  decorators: [
250
263
  withClientProvider({
251
- types: [View.View, Table.Table, Testing.Person, Testing.Organization, ContactWithArrayOfEmails],
264
+ types: [View.View, Table.Table, TestSchema.Person, TestSchema.Organization, ContactWithArrayOfEmails],
252
265
  createIdentity: true,
253
266
  createSpace: true,
254
- onCreateSpace: async ({ client, space }) => {
255
- const { view } = await Table.makeView({ client, space, typename: ContactWithArrayOfEmails.typename });
256
- space.db.add(view);
267
+ onCreateSpace: async ({ space }) => {
268
+ const { view, jsonSchema } = await ViewModel.makeFromDatabase({
269
+ db: space.db,
270
+ typename: ContactWithArrayOfEmails.typename,
271
+ });
272
+ const table = Table.make({ view, jsonSchema });
273
+ space.db.add(table);
257
274
 
258
275
  const factory = createObjectFactory(space.db, faker as any);
259
276
  await factory([
260
- // { type: Testing.Person, count: 10 },
261
- // { type: Testing.Organization, count: 1 },
277
+ // { type: TestSchema.Person, count: 10 },
278
+ // { type: TestSchema.Organization, count: 1 },
262
279
  { type: ContactWithArrayOfEmails, count: 10 },
263
280
  ]);
264
281
  },
@@ -278,9 +295,9 @@ export const Tags: Meta<StoryProps> = {
278
295
  types: [View.View, Table.Table],
279
296
  createIdentity: true,
280
297
  createSpace: true,
281
- onCreateSpace: async ({ client, space }) => {
298
+ onCreateSpace: async ({ space }) => {
282
299
  // Configure schema.
283
- const typename = 'example.com/SingleSelect';
300
+ const typename = 'com.example.type.single-select';
284
301
  const selectOptions = [
285
302
  { id: 'one', title: 'One', color: 'emerald' },
286
303
  { id: 'two', title: 'Two', color: 'blue' },
@@ -294,25 +311,26 @@ export const Tags: Meta<StoryProps> = {
294
311
  const schema = getSchemaFromPropertyDefinitions(typename, [
295
312
  {
296
313
  name: 'single',
297
- format: FormatEnum.SingleSelect,
314
+ format: Format.TypeFormat.SingleSelect,
298
315
  config: { options: selectOptions },
299
316
  },
300
317
  {
301
318
  name: 'multiple',
302
- format: FormatEnum.MultiSelect,
319
+ format: Format.TypeFormat.MultiSelect,
303
320
  config: { options: selectOptions },
304
321
  },
305
322
  ]);
306
323
  const [storedSchema] = await space.db.schemaRegistry.register([schema]);
307
324
 
308
325
  // Initialize table.
309
- const { view } = await Table.makeView({ client, space, typename });
310
- space.db.add(view);
326
+ const { view, jsonSchema } = await ViewModel.makeFromDatabase({ db: space.db, typename });
327
+ const table = Table.make({ view, jsonSchema });
328
+ space.db.add(table);
311
329
 
312
330
  // Populate.
313
331
  Array.from({ length: 10 }).map(() => {
314
332
  return space.db.add(
315
- live(storedSchema, {
333
+ Obj.make(storedSchema, {
316
334
  single: faker.helpers.arrayElement([...selectOptionIds, undefined]),
317
335
  multiple: faker.helpers.randomSubset(selectOptionIds),
318
336
  }),