@dxos/react-ui-table 0.8.4-main.72ec0f3 → 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 (129) hide show
  1. package/dist/lib/browser/{chunk-GS2UNGJK.mjs → chunk-MNZKOFMA.mjs} +633 -662
  2. package/dist/lib/browser/chunk-MNZKOFMA.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-OZBLY7XM.mjs +76 -0
  4. package/dist/lib/browser/chunk-OZBLY7XM.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +1101 -973
  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 +29 -41
  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-2ATAIIAO.mjs} +633 -661
  12. package/dist/lib/node-esm/chunk-2ATAIIAO.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-WNZSKIRF.mjs +77 -0
  14. package/dist/lib/node-esm/chunk-WNZSKIRF.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +1101 -973
  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 +29 -41
  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 +4 -5
  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 +8 -8
  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 +2 -2
  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 +8 -8
  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 +101 -22
  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 +1 -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 +31 -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 +13 -11
  74. package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
  75. package/dist/types/src/util/index.d.ts +2 -0
  76. package/dist/types/src/util/index.d.ts.map +1 -1
  77. package/dist/types/src/util/query-ast.d.ts +7 -0
  78. package/dist/types/src/util/query-ast.d.ts.map +1 -0
  79. package/dist/types/src/util/sort.d.ts +12 -0
  80. package/dist/types/src/util/sort.d.ts.map +1 -0
  81. package/dist/types/tsconfig.tsbuildinfo +1 -1
  82. package/package.json +53 -54
  83. package/src/components/Table/ColumnActionsMenu.tsx +10 -6
  84. package/src/components/Table/ColumnSettings.tsx +6 -6
  85. package/src/components/Table/DynamicTable.stories.tsx +12 -13
  86. package/src/components/Table/DynamicTable.tsx +21 -14
  87. package/src/components/Table/Relations.stories.tsx +28 -33
  88. package/src/components/Table/RowActionsMenu.tsx +3 -2
  89. package/src/components/Table/Table.stories.tsx +65 -69
  90. package/src/components/Table/Table.tsx +335 -305
  91. package/src/components/TableCellEditor/CellValidationMessage.tsx +1 -1
  92. package/src/components/TableCellEditor/FormCellEditor.tsx +111 -134
  93. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +11 -8
  94. package/src/components/TableCellEditor/TableCellEditor.tsx +31 -31
  95. package/src/components/TableToolbar/TableToolbar.tsx +19 -13
  96. package/src/components/testing.ts +38 -12
  97. package/src/hooks/index.ts +2 -1
  98. package/src/hooks/useAddRow.ts +8 -10
  99. package/src/hooks/useProjectionModel.ts +40 -0
  100. package/src/hooks/useTableModel.ts +35 -33
  101. package/src/model/modal-controller.ts +23 -12
  102. package/src/model/selection-model.ts +75 -44
  103. package/src/model/table-model.test.ts +81 -53
  104. package/src/model/table-model.ts +422 -160
  105. package/src/model/table-presentation.test.ts +58 -48
  106. package/src/model/table-presentation.ts +31 -26
  107. package/src/playwright/TableManager.ts +5 -5
  108. package/src/playwright/playwright.config.ts +1 -1
  109. package/src/playwright/smoke.spec.ts +4 -3
  110. package/src/testing/useTestTableModel.ts +44 -37
  111. package/src/translations.ts +3 -3
  112. package/src/types/Table.ts +90 -0
  113. package/src/types/index.ts +1 -1
  114. package/src/util/dynamic-table.ts +36 -23
  115. package/src/util/index.ts +2 -0
  116. package/src/util/query-ast.ts +19 -0
  117. package/src/util/sort.ts +90 -0
  118. package/dist/lib/browser/chunk-2PFAPQL4.mjs +0 -66
  119. package/dist/lib/browser/chunk-2PFAPQL4.mjs.map +0 -7
  120. package/dist/lib/browser/chunk-GS2UNGJK.mjs.map +0 -7
  121. package/dist/lib/node-esm/chunk-6POOFFYF.mjs +0 -67
  122. package/dist/lib/node-esm/chunk-6POOFFYF.mjs.map +0 -7
  123. package/dist/lib/node-esm/chunk-TRR3C5NX.mjs.map +0 -7
  124. package/dist/types/src/model/table-sorting.d.ts +0 -52
  125. package/dist/types/src/model/table-sorting.d.ts.map +0 -1
  126. package/dist/types/src/types/schema.d.ts +0 -28
  127. package/dist/types/src/types/schema.d.ts.map +0 -1
  128. package/src/model/table-sorting.ts +0 -225
  129. package/src/types/schema.ts +0 -73
@@ -2,34 +2,34 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { computed } from '@preact/signals-core';
5
+ import { Registry } from '@effect-atom/atom-react';
6
6
  import * as Schema from 'effect/Schema';
7
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
7
+ import { afterEach, beforeEach, describe, expect, test } from 'vitest';
8
8
 
9
- import { Filter, Query } from '@dxos/echo';
10
- import { TypedObject } from '@dxos/echo/internal';
11
- import { updateCounter } from '@dxos/echo/testing';
9
+ import { Filter, Query, Type } from '@dxos/echo';
12
10
  import { createEchoSchema } from '@dxos/echo/testing';
13
- import { registerSignalsRuntime } from '@dxos/echo-signals';
14
- import { live } from '@dxos/live-object';
15
- import { View } from '@dxos/schema';
11
+ import { ProjectionModel, View, createDirectChangeCallback } from '@dxos/schema';
16
12
 
17
13
  import { Table } from '../types';
18
14
 
19
- import { TableModel, type TableModelProps } from './table-model';
15
+ import {
16
+ TableModel,
17
+ type TableModelProps,
18
+ createDirectChangeCallback as createTableDirectChangeCallback,
19
+ } from './table-model';
20
20
 
21
21
  // TODO(burdon): Tests are disabled in project.json since they bring in plugin deps.
22
22
  // Restore once factored out into react-ui-table.
23
23
 
24
- registerSignalsRuntime();
25
-
26
24
  describe('TableModel', () => {
27
25
  let updateCount = 0;
28
26
  let model: any;
27
+ let registry: Registry.Registry;
29
28
 
30
29
  beforeEach(async () => {
31
30
  updateCount = 0;
32
- model = createTableModel({
31
+ registry = Registry.make();
32
+ model = createTableModel(registry, {
33
33
  onCellUpdate: () => updateCount++,
34
34
  });
35
35
  await model.open();
@@ -45,78 +45,106 @@ describe('TableModel', () => {
45
45
  });
46
46
 
47
47
  describe('methods', () => {
48
- it('should pin a row', () => {
48
+ test('should pin a row', () => {
49
49
  model.pinRow(1, 'top');
50
50
  expect(model.pinnedRows.top).toContain(1);
51
51
  });
52
52
 
53
- it('should unpin a row', () => {
53
+ test('should unpin a row', () => {
54
54
  model.pinRow(1, 'top');
55
55
  model.unpinRow(1);
56
56
  expect(model.pinnedRows.top).not.toContain(1);
57
57
  });
58
58
 
59
- it('should toggle row selection', () => {
59
+ test('should toggle row selection', () => {
60
60
  model.selection.toggleSelectionForRowIndex(2);
61
- expect(model.selection.hasSelection.value).toBe(true);
61
+ expect(model.selection.hasSelection).toBe(true);
62
62
  });
63
63
 
64
- it('should deselect a row', () => {
64
+ test('should deselect a row', () => {
65
65
  model.selection.toggleSelectionForRowIndex(2);
66
66
  model.selection.toggleSelectionForRowIndex(2);
67
- expect(model.selection.hasSelection.value).toBe(false);
67
+ expect(model.selection.hasSelection).toBe(false);
68
68
  });
69
69
 
70
- it('should bulk select rows', () => {
70
+ test('should bulk select rows', () => {
71
71
  model.selection.setSelection('all');
72
- expect(model.selection.allRowsSeleted.value).toBe(true);
72
+ expect(model.selection.allRowsSelected).toBe(true);
73
73
  model.selection.setSelection('none');
74
- expect(model.selection.hasSelection.value).toBe(false);
74
+ expect(model.selection.hasSelection).toBe(false);
75
75
  });
76
76
  });
77
77
 
78
78
  describe('reactivity', () => {
79
- it('pure signals should nest', () => {
80
- const signal$ = live({ arr: [{ thingInside: 1 }, { thingInside: 2 }] });
81
- const computed$ = computed(() => {
82
- return signal$.arr.map((row) =>
83
- computed(() => {
84
- return row.thingInside;
85
- }),
86
- );
87
- });
88
-
89
- using outerCounter = updateCounter(() => {
90
- computed$.value.map((c) => c.value);
91
- });
92
-
93
- using innerCounter = updateCounter(() => {
94
- computed$.value[0].value;
95
- });
96
-
97
- expect(computed$.value.map((v) => v.value)).toEqual([1, 2]);
98
-
99
- signal$.arr[0].thingInside = 3;
100
-
101
- expect(computed$.value.map((v) => v.value)).toEqual([3, 2]);
102
- expect(outerCounter.count).toBe(1);
103
- expect(innerCounter.count).toBe(1);
79
+ test('rows should update when setRows is called', () => {
80
+ model.setRows([{ id: '4', title: 'Test 4', completed: false }]);
81
+ expect(model.getRows()).toHaveLength(1);
82
+ expect(model.getRows()[0].id).toBe('4');
83
+
84
+ model.setRows([
85
+ { id: '5', title: 'Test 5', completed: false },
86
+ { id: '6', title: 'Test 6', completed: true },
87
+ ]);
88
+ expect(model.getRows()).toHaveLength(2);
89
+ expect(model.getRows()[0].id).toBe('5');
90
+ expect(model.getRows()[1].id).toBe('6');
91
+ });
92
+
93
+ test('selection should update when toggled', () => {
94
+ model.selection.toggleSelectionForRowIndex(0);
95
+ expect(model.selection.hasSelection).toBe(true);
96
+ expect(model.selection.selection.size).toBe(1);
97
+
98
+ model.selection.toggleSelectionForRowIndex(0);
99
+ expect(model.selection.hasSelection).toBe(false);
100
+ expect(model.selection.selection.size).toBe(0);
101
+ });
102
+
103
+ test('derived atoms should reflect current state', () => {
104
+ // Set initial rows.
105
+ model.setRows([
106
+ { id: '1', title: 'Zebra', completed: false },
107
+ { id: '2', title: 'Apple', completed: true },
108
+ { id: '3', title: 'Mango', completed: false },
109
+ ]);
110
+
111
+ // Verify rows are accessible.
112
+ const rows = model.getRows();
113
+ expect(rows).toHaveLength(3);
114
+ expect(rows[0].id).toBeDefined();
104
115
  });
105
116
  });
106
117
  });
107
118
 
108
- class Test extends TypedObject({ typename: 'example.com/type/Test', version: '0.1.0' })({
119
+ const Test = Schema.Struct({
109
120
  title: Schema.String,
110
121
  completed: Schema.Boolean,
111
- }) {}
112
-
113
- const createTableModel = (props: Partial<TableModelProps> = {}): TableModel => {
122
+ }).pipe(
123
+ Type.object({
124
+ typename: 'example.com/type/Test',
125
+ version: '0.1.0',
126
+ }),
127
+ );
128
+
129
+ const createTableModel = (registry: Registry.Registry, props: Partial<TableModelProps> = {}): TableModel => {
114
130
  const schema = createEchoSchema(Test);
115
- const table = Table.make();
116
131
  const view = View.make({
117
132
  query: Query.select(Filter.type(schema)),
118
133
  jsonSchema: schema.jsonSchema,
119
- presentation: table,
120
134
  });
121
- return new TableModel({ view, schema: schema.jsonSchema, ...props });
135
+ const object = Table.make({ view });
136
+ const projection = new ProjectionModel({
137
+ registry,
138
+ view,
139
+ baseSchema: schema.jsonSchema,
140
+ change: createDirectChangeCallback(view.projection, schema.jsonSchema),
141
+ });
142
+ projection.normalizeView();
143
+ return new TableModel({
144
+ registry,
145
+ object,
146
+ projection,
147
+ change: createTableDirectChangeCallback(object),
148
+ ...props,
149
+ });
122
150
  };