@dxos/react-ui-table 0.8.4-main.f5c0578 → 0.8.4-main.fcc0d83b33

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