@dxos/react-ui-table 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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-G7MGPBSR.mjs → chunk-I5IFW7UF.mjs} +633 -663
  2. package/dist/lib/browser/chunk-I5IFW7UF.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 +1131 -999
  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-LD5JEBA6.mjs → chunk-DDJKYJFY.mjs} +633 -662
  12. package/dist/lib/node-esm/chunk-DDJKYJFY.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 +1131 -999
  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 -9
  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 +4 -4
  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 +102 -23
  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 -53
  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 +35 -39
  88. package/src/components/Table/RowActionsMenu.tsx +24 -15
  89. package/src/components/Table/Table.stories.tsx +71 -75
  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 +110 -133
  93. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +16 -12
  94. package/src/components/TableCellEditor/TableCellEditor.tsx +31 -31
  95. package/src/components/TableToolbar/TableToolbar.tsx +44 -31
  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 +39 -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 +82 -54
  104. package/src/model/table-model.ts +428 -163
  105. package/src/model/table-presentation.test.ts +59 -49
  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 +8 -5
  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 +39 -27
  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-4K7JPALT.mjs +0 -66
  119. package/dist/lib/browser/chunk-4K7JPALT.mjs.map +0 -7
  120. package/dist/lib/browser/chunk-G7MGPBSR.mjs.map +0 -7
  121. package/dist/lib/node-esm/chunk-LD5JEBA6.mjs.map +0 -7
  122. package/dist/lib/node-esm/chunk-MK6OVUF6.mjs +0 -67
  123. package/dist/lib/node-esm/chunk-MK6OVUF6.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 { createView } 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
- const view = createView({
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
  };