@dxos/react-ui-table 0.8.4-main.d05673bc65 → 0.8.4-main.d9fc60f731

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 (126) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  3. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-PTHMYAAM.mjs → chunk-X7A7G6RR.mjs} +28 -83
  5. package/dist/lib/browser/chunk-X7A7G6RR.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-BF54SSNL.mjs → chunk-YURROGGF.mjs} +12 -15
  7. package/dist/lib/browser/chunk-YURROGGF.mjs.map +7 -0
  8. package/dist/lib/browser/index.mjs +230 -280
  9. package/dist/lib/browser/index.mjs.map +4 -4
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/testing/index.mjs +10 -9
  12. package/dist/lib/browser/testing/index.mjs.map +3 -3
  13. package/dist/lib/browser/translations.mjs +36 -0
  14. package/dist/lib/browser/translations.mjs.map +7 -0
  15. package/dist/lib/browser/types/index.mjs +2 -1
  16. package/dist/lib/node-esm/{chunk-SIRDIPHZ.mjs → chunk-DLAGRBKD.mjs} +12 -15
  17. package/dist/lib/node-esm/chunk-DLAGRBKD.mjs.map +7 -0
  18. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  19. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  20. package/dist/lib/node-esm/{chunk-GI72MQSG.mjs → chunk-Q4HSBRJJ.mjs} +28 -83
  21. package/dist/lib/node-esm/chunk-Q4HSBRJJ.mjs.map +7 -0
  22. package/dist/lib/node-esm/index.mjs +230 -280
  23. package/dist/lib/node-esm/index.mjs.map +4 -4
  24. package/dist/lib/node-esm/meta.json +1 -1
  25. package/dist/lib/node-esm/testing/index.mjs +10 -9
  26. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  27. package/dist/lib/node-esm/translations.mjs +37 -0
  28. package/dist/lib/node-esm/translations.mjs.map +7 -0
  29. package/dist/lib/node-esm/types/index.mjs +2 -1
  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 +3 -4
  34. package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
  35. package/dist/types/src/components/Table/DynamicTable.stories.d.ts +21 -22
  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 +83 -82
  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 +20 -21
  41. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  42. package/dist/types/src/components/Table/Table.stories.d.ts +85 -84
  43. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/Table/TableContent.d.ts +18 -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.map +1 -1
  49. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts +1 -1
  50. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts.map +1 -1
  51. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
  52. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts +22 -24
  53. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/index.d.ts +0 -1
  55. package/dist/types/src/components/index.d.ts.map +1 -1
  56. package/dist/types/src/components/testing.d.ts.map +1 -1
  57. package/dist/types/src/hooks/useAddRow.d.ts.map +1 -1
  58. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
  59. package/dist/types/src/hooks/useTableModel.d.ts.map +1 -1
  60. package/dist/types/src/index.d.ts +0 -2
  61. package/dist/types/src/index.d.ts.map +1 -1
  62. package/dist/types/src/model/modal-controller.d.ts.map +1 -1
  63. package/dist/types/src/model/selection-model.d.ts +1 -1
  64. package/dist/types/src/model/selection-model.d.ts.map +1 -1
  65. package/dist/types/src/model/table-model.d.ts +4 -5
  66. package/dist/types/src/model/table-model.d.ts.map +1 -1
  67. package/dist/types/src/model/table-presentation.d.ts.map +1 -1
  68. package/dist/types/src/playwright/TableManager.d.ts.map +1 -1
  69. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
  70. package/dist/types/src/testing/useTestTableModel.d.ts +1 -1
  71. package/dist/types/src/testing/useTestTableModel.d.ts.map +1 -1
  72. package/dist/types/src/translations.d.ts +19 -21
  73. package/dist/types/src/translations.d.ts.map +1 -1
  74. package/dist/types/src/types/Table.d.ts +11 -5
  75. package/dist/types/src/types/Table.d.ts.map +1 -1
  76. package/dist/types/src/util/dynamic-table.d.ts +6 -6
  77. package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
  78. package/dist/types/src/util/query-ast.d.ts.map +1 -1
  79. package/dist/types/src/util/schema.d.ts.map +1 -1
  80. package/dist/types/src/util/signals.d.ts.map +1 -1
  81. package/dist/types/src/util/sort.d.ts.map +1 -1
  82. package/dist/types/src/util/table-buttons.d.ts +20 -20
  83. package/dist/types/src/util/table-buttons.d.ts.map +1 -1
  84. package/dist/types/src/util/table-controls.d.ts +4 -4
  85. package/dist/types/src/util/table-controls.d.ts.map +1 -1
  86. package/dist/types/src/util/tag.d.ts.map +1 -1
  87. package/dist/types/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +55 -64
  89. package/src/components/Table/ColumnActionsMenu.tsx +7 -6
  90. package/src/components/Table/ColumnSettings.tsx +2 -2
  91. package/src/components/Table/DynamicTable.stories.tsx +19 -19
  92. package/src/components/Table/DynamicTable.tsx +13 -22
  93. package/src/components/Table/Relations.stories.tsx +76 -34
  94. package/src/components/Table/RowActionsMenu.tsx +3 -2
  95. package/src/components/Table/Table.stories.tsx +46 -51
  96. package/src/components/Table/Table.tsx +37 -426
  97. package/src/components/Table/TableContent.tsx +426 -0
  98. package/src/components/{TableToolbar → Table}/TableToolbar.tsx +34 -41
  99. package/src/components/TableCellEditor/CellValidationMessage.tsx +1 -2
  100. package/src/components/TableCellEditor/FormCellEditor.tsx +7 -6
  101. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +14 -12
  102. package/src/components/TableCellEditor/TableCellEditor.tsx +10 -8
  103. package/src/components/index.ts +0 -1
  104. package/src/components/testing.ts +11 -16
  105. package/src/hooks/useProjectionModel.ts +5 -6
  106. package/src/hooks/useTableModel.ts +1 -1
  107. package/src/index.ts +0 -4
  108. package/src/model/table-model.test.ts +4 -10
  109. package/src/model/table-model.ts +15 -15
  110. package/src/model/table-presentation.test.ts +4 -10
  111. package/src/model/table-presentation.ts +5 -7
  112. package/src/playwright/smoke.spec.ts +3 -3
  113. package/src/testing/useTestTableModel.ts +7 -8
  114. package/src/translations.ts +19 -21
  115. package/src/types/Table.ts +12 -13
  116. package/src/util/dynamic-table.test.ts +13 -20
  117. package/src/util/dynamic-table.ts +21 -20
  118. package/dist/lib/browser/chunk-BF54SSNL.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-PTHMYAAM.mjs.map +0 -7
  120. package/dist/lib/node-esm/chunk-GI72MQSG.mjs.map +0 -7
  121. package/dist/lib/node-esm/chunk-SIRDIPHZ.mjs.map +0 -7
  122. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts +0 -21
  123. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +0 -1
  124. package/dist/types/src/components/TableToolbar/index.d.ts +0 -2
  125. package/dist/types/src/components/TableToolbar/index.d.ts.map +0 -1
  126. package/src/components/TableToolbar/index.ts +0 -5
@@ -6,25 +6,25 @@ 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 { Annotation, type Database, Format, Obj, type QueryAST, Ref, Type } from '@dxos/echo';
10
- import { View } from '@dxos/echo';
9
+ import { DXN, Annotation, type Database, Format, Obj, type QueryAST, Ref, Type, View } from '@dxos/echo';
11
10
  import { type Mutable, PropertyMetaAnnotationId } from '@dxos/echo/internal';
12
11
  import { invariant } from '@dxos/invariant';
13
- import { faker } from '@dxos/random';
12
+ import { random } from '@dxos/random';
14
13
  import { PublicKey } from '@dxos/react-client';
15
14
  import { withClientProvider } from '@dxos/react-client/testing';
16
15
  import { Panel, ScrollArea } from '@dxos/react-ui';
16
+ import { ViewEditor } from '@dxos/react-ui-form';
17
+ import { translations as formTranslations } from '@dxos/react-ui-form/translations';
18
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
17
19
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
18
- import { ViewEditor, translations as formTranslations } from '@dxos/react-ui-form';
19
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
20
- import { ViewModel, getSchemaFromPropertyDefinitions, getTypenameFromQuery } from '@dxos/schema';
20
+ import { ViewModel, getSchemaFromPropertyDefinitions } from '@dxos/schema';
21
21
  import { TestSchema, createObjectFactory } from '@dxos/schema/testing';
22
22
  import { withRegistry } from '@dxos/storybook-utils';
23
23
 
24
+ import { translations } from '#translations';
25
+
24
26
  import { useTestTableModel } from '../../testing';
25
- import { translations } from '../../translations';
26
27
  import { Table } from '../../types';
27
-
28
28
  import { Table as TableComponent } from './Table';
29
29
 
30
30
  const Example = Schema.Struct({
@@ -52,10 +52,11 @@ const Example = Schema.Struct({
52
52
  title: 'Parent',
53
53
  }),
54
54
  }).pipe(
55
- Type.object({ typename: `com.example.type.${PublicKey.random().truncate()}`, version: '0.1.0' }),
56
55
  Annotation.LabelAnnotation.set(['name']),
56
+ // NSID last segment must start with a letter (DXN spec), so prefix the random hex.
57
+ Type.makeObject(DXN.make(`com.example.type.example${PublicKey.random().truncate()}`, '0.1.0')),
57
58
  );
58
- interface Example extends Schema.Schema.Type<typeof Example> {}
59
+ interface Example extends Type.InstanceType<typeof Example> {}
59
60
 
60
61
  const StoryViewEditor = ({
61
62
  view,
@@ -64,18 +65,17 @@ const StoryViewEditor = ({
64
65
  handleDeleteColumn,
65
66
  }: {
66
67
  view?: View.View;
67
- schema?: Schema.Schema.AnyNoContext;
68
+ schema?: Type.AnyEntity;
68
69
  db?: Database.Database;
69
70
  handleDeleteColumn: (fieldId: string) => void;
70
71
  }) => {
71
72
  const handleQueryChanged = useCallback(
72
73
  (newQuery: QueryAST.Query) => {
73
74
  invariant(schema);
74
- invariant(Type.isMutable(schema));
75
- schema.updateTypename(getTypenameFromQuery(newQuery));
75
+ invariant(Type.getDatabase(schema) != null);
76
76
  invariant(view);
77
- Obj.change(view, (v) => {
78
- v.query.ast = newQuery as Mutable<typeof newQuery>;
77
+ Obj.update(view, (view) => {
78
+ view.query.ast = newQuery as Mutable<typeof newQuery>;
79
79
  });
80
80
  },
81
81
  [schema, view],
@@ -87,8 +87,8 @@ const StoryViewEditor = ({
87
87
 
88
88
  return (
89
89
  <ViewEditor
90
- registry={db?.schemaRegistry}
91
- schema={schema}
90
+ registry={db?.graph.registry}
91
+ type={schema}
92
92
  view={view}
93
93
  onQueryChanged={handleQueryChanged}
94
94
  onDelete={handleDeleteColumn}
@@ -119,7 +119,7 @@ const DefaultStory = () => {
119
119
 
120
120
  return (
121
121
  <div className='grow grid grid-cols-[1fr_350px]'>
122
- <TableComponent.Root>
122
+ <TableComponent.Root ref={tableRef}>
123
123
  <Panel.Root>
124
124
  <Panel.Toolbar asChild>
125
125
  <TableComponent.Toolbar
@@ -129,8 +129,7 @@ const DefaultStory = () => {
129
129
  />
130
130
  </Panel.Toolbar>
131
131
  <Panel.Content asChild>
132
- <TableComponent.Main
133
- ref={tableRef}
132
+ <TableComponent.Content
134
133
  schema={schema}
135
134
  model={model}
136
135
  presentation={presentation}
@@ -143,16 +142,14 @@ const DefaultStory = () => {
143
142
  <ScrollArea.Root orientation='vertical' classNames='border-l border-separator'>
144
143
  <ScrollArea.Viewport>
145
144
  <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>
145
+ <JsonHighlighter data={{ view: table.view.target, schema }} classNames='text-xs' />
149
146
  </ScrollArea.Viewport>
150
147
  </ScrollArea.Root>
151
148
  </div>
152
149
  );
153
150
  };
154
151
 
155
- type StoryProps = { rows?: number };
152
+ type DefaultStoryProps = { rows?: number };
156
153
 
157
154
  //
158
155
  // Story definitions.
@@ -172,13 +169,16 @@ const meta = {
172
169
  createIdentity: true,
173
170
  createSpace: true,
174
171
  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 });
172
+ const type = await space.db.addType(Example);
173
+ const { view, jsonSchema } = await ViewModel.makeFromDatabase({
174
+ db: space.db,
175
+ typename: Type.getTypename(type),
176
+ });
177
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'),
178
+ Obj.update(view, (view) => {
179
+ view.projection.fields = [
180
+ view.projection.fields.find((field) => field.path === 'name')!,
181
+ ...view.projection.fields.filter((field) => field.path !== 'name'),
182
182
  ];
183
183
  });
184
184
 
@@ -186,10 +186,10 @@ const meta = {
186
186
 
187
187
  Array.from({ length: 10 }).map(() => {
188
188
  return space.db.add(
189
- Obj.make(schema, {
190
- name: faker.lorem.sentence(),
191
- status: faker.helpers.arrayElement(['todo', 'in-progress', 'done'] as const),
192
- description: faker.lorem.paragraph(),
189
+ Obj.make(type, {
190
+ name: random.lorem.sentence(),
191
+ status: random.helpers.arrayElement(['todo', 'in-progress', 'done'] as const),
192
+ description: random.lorem.paragraph(),
193
193
  }),
194
194
  );
195
195
  });
@@ -221,12 +221,12 @@ export const StaticSchema: StoryObj = {
221
221
  onCreateSpace: async ({ space }) => {
222
222
  const { view, jsonSchema } = await ViewModel.makeFromDatabase({
223
223
  db: space.db,
224
- typename: TestSchema.Person.typename,
224
+ typename: Type.getTypename(TestSchema.Person),
225
225
  });
226
226
  const table = Table.make({ view, jsonSchema });
227
227
  space.db.add(table);
228
228
 
229
- const factory = createObjectFactory(space.db, faker as any);
229
+ const factory = createObjectFactory(space.db, random as any);
230
230
  await factory([
231
231
  { type: TestSchema.Person, count: 10 },
232
232
  // { type: TestSchema.Organization, count: 1 },
@@ -250,12 +250,7 @@ const ContactWithArrayOfEmails = Schema.Struct({
250
250
  }),
251
251
  ),
252
252
  ),
253
- }).pipe(
254
- Type.object({
255
- typename: 'org.dxos.type.contact-with-array-of-emails',
256
- version: '0.1.0',
257
- }),
258
- );
253
+ }).pipe(Type.makeObject(DXN.make('org.dxos.type.contactWithArrayOfEmails', '0.1.0')));
259
254
 
260
255
  export const ArrayOfObjects: StoryObj = {
261
256
  render: DefaultStory,
@@ -267,12 +262,12 @@ export const ArrayOfObjects: StoryObj = {
267
262
  onCreateSpace: async ({ space }) => {
268
263
  const { view, jsonSchema } = await ViewModel.makeFromDatabase({
269
264
  db: space.db,
270
- typename: ContactWithArrayOfEmails.typename,
265
+ typename: Type.getTypename(ContactWithArrayOfEmails),
271
266
  });
272
267
  const table = Table.make({ view, jsonSchema });
273
268
  space.db.add(table);
274
269
 
275
- const factory = createObjectFactory(space.db, faker as any);
270
+ const factory = createObjectFactory(space.db, random as any);
276
271
  await factory([
277
272
  // { type: TestSchema.Person, count: 10 },
278
273
  // { type: TestSchema.Organization, count: 1 },
@@ -287,7 +282,7 @@ export const ArrayOfObjects: StoryObj = {
287
282
  },
288
283
  };
289
284
 
290
- export const Tags: Meta<StoryProps> = {
285
+ export const Tags: Meta<DefaultStoryProps> = {
291
286
  title: 'ui/react-ui-table/Table',
292
287
  render: DefaultStory,
293
288
  decorators: [
@@ -297,7 +292,7 @@ export const Tags: Meta<StoryProps> = {
297
292
  createSpace: true,
298
293
  onCreateSpace: async ({ space }) => {
299
294
  // Configure schema.
300
- const typename = 'com.example.type.single-select';
295
+ const typename = 'com.example.type.singleSelect';
301
296
  const selectOptions = [
302
297
  { id: 'one', title: 'One', color: 'emerald' },
303
298
  { id: 'two', title: 'Two', color: 'blue' },
@@ -308,7 +303,7 @@ export const Tags: Meta<StoryProps> = {
308
303
 
309
304
  const selectOptionIds = selectOptions.map((o) => o.id);
310
305
 
311
- const schema = getSchemaFromPropertyDefinitions(typename, [
306
+ const type = getSchemaFromPropertyDefinitions(typename, [
312
307
  {
313
308
  name: 'single',
314
309
  format: Format.TypeFormat.SingleSelect,
@@ -320,7 +315,7 @@ export const Tags: Meta<StoryProps> = {
320
315
  config: { options: selectOptions },
321
316
  },
322
317
  ]);
323
- const [storedSchema] = await space.db.schemaRegistry.register([schema]);
318
+ const storedType = await space.db.addType(type);
324
319
 
325
320
  // Initialize table.
326
321
  const { view, jsonSchema } = await ViewModel.makeFromDatabase({ db: space.db, typename });
@@ -330,9 +325,9 @@ export const Tags: Meta<StoryProps> = {
330
325
  // Populate.
331
326
  Array.from({ length: 10 }).map(() => {
332
327
  return space.db.add(
333
- Obj.make(storedSchema, {
334
- single: faker.helpers.arrayElement([...selectOptionIds, undefined]),
335
- multiple: faker.helpers.randomSubset(selectOptionIds),
328
+ Obj.make(Type.assertObject(storedType), {
329
+ single: random.helpers.arrayElement([...selectOptionIds, undefined]),
330
+ multiple: random.helpers.randomSubset(selectOptionIds),
336
331
  }),
337
332
  );
338
333
  });