@dxos/react-ui-table 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8
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.
- package/dist/lib/browser/{chunk-OZBLY7XM.mjs → chunk-BF54SSNL.mjs} +12 -18
- package/dist/lib/browser/chunk-BF54SSNL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-I5IFW7UF.mjs → chunk-PTHMYAAM.mjs} +33 -28
- package/dist/lib/browser/chunk-PTHMYAAM.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +178 -176
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +3 -3
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node-esm/{chunk-DDJKYJFY.mjs → chunk-GI72MQSG.mjs} +33 -28
- package/dist/lib/node-esm/chunk-GI72MQSG.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-WNZSKIRF.mjs → chunk-SIRDIPHZ.mjs} +12 -18
- package/dist/lib/node-esm/chunk-SIRDIPHZ.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +178 -176
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +3 -3
- package/dist/lib/node-esm/testing/index.mjs.map +2 -2
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -1
- package/dist/types/src/components/Table/DynamicTable.d.ts +5 -4
- package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
- package/dist/types/src/components/Table/DynamicTable.stories.d.ts +1 -1
- package/dist/types/src/components/Table/DynamicTable.stories.d.ts.map +1 -1
- package/dist/types/src/components/Table/Relations.stories.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.d.ts +6 -6
- package/dist/types/src/components/Table/Table.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
- package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts +3 -3
- package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts.map +1 -1
- package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +2 -2
- package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
- package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TableToolbar/TableToolbar.d.ts +1 -1
- package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +1 -1
- package/dist/types/src/hooks/useAddRow.d.ts +1 -1
- package/dist/types/src/hooks/useAddRow.d.ts.map +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
- package/dist/types/src/hooks/useTableModel.d.ts +1 -1
- package/dist/types/src/model/table-model.d.ts +5 -4
- package/dist/types/src/model/table-model.d.ts.map +1 -1
- package/dist/types/src/model/table-presentation.d.ts.map +1 -1
- package/dist/types/src/playwright/TableManager.d.ts +2 -1
- package/dist/types/src/playwright/TableManager.d.ts.map +1 -1
- package/dist/types/src/testing/useTestTableModel.d.ts +2 -2
- package/dist/types/src/testing/useTestTableModel.d.ts.map +1 -1
- package/dist/types/src/types/Table.d.ts +1 -6
- package/dist/types/src/types/Table.d.ts.map +1 -1
- package/dist/types/src/util/dynamic-table.d.ts +6 -5
- package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
- package/dist/types/src/util/dynamic-table.test.d.ts +2 -0
- package/dist/types/src/util/dynamic-table.test.d.ts.map +1 -0
- package/dist/types/src/util/query-ast.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -42
- package/src/components/Table/ColumnSettings.tsx +3 -4
- package/src/components/Table/DynamicTable.stories.tsx +6 -5
- package/src/components/Table/DynamicTable.tsx +11 -10
- package/src/components/Table/Relations.stories.tsx +13 -10
- package/src/components/Table/Table.stories.tsx +54 -32
- package/src/components/Table/Table.tsx +51 -56
- package/src/components/TableCellEditor/CellValidationMessage.tsx +4 -4
- package/src/components/TableCellEditor/FormCellEditor.tsx +11 -5
- package/src/components/TableCellEditor/TableCellEditor.stories.tsx +4 -3
- package/src/components/TableCellEditor/TableCellEditor.tsx +3 -3
- package/src/components/TableToolbar/TableToolbar.tsx +6 -6
- package/src/components/testing.ts +1 -1
- package/src/hooks/useAddRow.ts +1 -1
- package/src/hooks/useProjectionModel.ts +3 -3
- package/src/hooks/useTableModel.ts +1 -1
- package/src/model/table-model.test.ts +5 -5
- package/src/model/table-model.ts +9 -8
- package/src/model/table-presentation.test.ts +5 -5
- package/src/model/table-presentation.ts +12 -11
- package/src/playwright/TableManager.ts +10 -3
- package/src/playwright/playwright.config.ts +1 -1
- package/src/playwright/smoke.spec.ts +45 -2
- package/src/testing/useTestTableModel.ts +3 -3
- package/src/types/Table.ts +11 -22
- package/src/util/dynamic-table.test.ts +70 -0
- package/src/util/dynamic-table.ts +13 -12
- package/src/util/query-ast.ts +3 -0
- package/src/util/table-buttons.ts +1 -1
- package/src/util/table-controls.ts +2 -2
- package/dist/lib/browser/chunk-I5IFW7UF.mjs.map +0 -7
- package/dist/lib/browser/chunk-OZBLY7XM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-DDJKYJFY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WNZSKIRF.mjs.map +0 -7
|
@@ -8,29 +8,32 @@ var __export = (target, all) => {
|
|
|
8
8
|
var Table_exports = {};
|
|
9
9
|
__export(Table_exports, {
|
|
10
10
|
Table: () => Table,
|
|
11
|
-
TableV1: () => TableV1,
|
|
12
11
|
make: () => make
|
|
13
12
|
});
|
|
14
13
|
import * as Match from "effect/Match";
|
|
15
14
|
import * as Schema from "effect/Schema";
|
|
16
15
|
import * as SchemaAST from "effect/SchemaAST";
|
|
17
|
-
import { Obj, Ref, Type } from "@dxos/echo";
|
|
16
|
+
import { Annotation, JsonSchema, Obj, Ref, Type } from "@dxos/echo";
|
|
17
|
+
import { View } from "@dxos/echo";
|
|
18
18
|
import { FormInputAnnotation, LabelAnnotation } from "@dxos/echo/internal";
|
|
19
|
-
import {
|
|
19
|
+
import { ViewAnnotation } from "@dxos/schema";
|
|
20
20
|
var Table = Schema.Struct({
|
|
21
21
|
name: Schema.String.pipe(Schema.optional),
|
|
22
|
-
view:
|
|
22
|
+
view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),
|
|
23
23
|
sizes: Schema.Record({
|
|
24
24
|
// TODO(wittjosiah): Should be JsonPath.
|
|
25
25
|
key: Schema.String,
|
|
26
26
|
value: Schema.Number
|
|
27
27
|
}).pipe(Schema.mutable, FormInputAnnotation.set(false))
|
|
28
28
|
}).pipe(Type.object({
|
|
29
|
-
typename: "dxos.
|
|
30
|
-
version: "0.
|
|
29
|
+
typename: "org.dxos.type.table",
|
|
30
|
+
version: "0.1.0"
|
|
31
31
|
}), LabelAnnotation.set([
|
|
32
32
|
"name"
|
|
33
|
-
]), ViewAnnotation.set(true)
|
|
33
|
+
]), ViewAnnotation.set(true), Annotation.IconAnnotation.set({
|
|
34
|
+
icon: "ph--table--regular",
|
|
35
|
+
hue: "green"
|
|
36
|
+
}));
|
|
34
37
|
var make = ({ name, sizes = {}, view, jsonSchema }) => {
|
|
35
38
|
const table = Obj.make(Table, {
|
|
36
39
|
name,
|
|
@@ -38,7 +41,7 @@ var make = ({ name, sizes = {}, view, jsonSchema }) => {
|
|
|
38
41
|
sizes
|
|
39
42
|
});
|
|
40
43
|
if (jsonSchema) {
|
|
41
|
-
const schema =
|
|
44
|
+
const schema = JsonSchema.toEffectSchema(jsonSchema);
|
|
42
45
|
const properties = SchemaAST.getPropertySignatures(schema.ast);
|
|
43
46
|
for (const property of properties) {
|
|
44
47
|
const name2 = property.name.toString();
|
|
@@ -60,17 +63,8 @@ var make = ({ name, sizes = {}, view, jsonSchema }) => {
|
|
|
60
63
|
}
|
|
61
64
|
return table;
|
|
62
65
|
};
|
|
63
|
-
var TableV1 = Schema.Struct({
|
|
64
|
-
sizes: Schema.Record({
|
|
65
|
-
key: Schema.String,
|
|
66
|
-
value: Schema.Number
|
|
67
|
-
}).pipe(Schema.mutable)
|
|
68
|
-
}).pipe(Type.object({
|
|
69
|
-
typename: "dxos.org/type/Table",
|
|
70
|
-
version: "0.1.0"
|
|
71
|
-
}));
|
|
72
66
|
|
|
73
67
|
export {
|
|
74
68
|
Table_exports
|
|
75
69
|
};
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
70
|
+
//# sourceMappingURL=chunk-BF54SSNL.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/Table.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { Annotation, JsonSchema, Obj, Ref, Type } from '@dxos/echo';\nimport { View } from '@dxos/echo';\nimport { FormInputAnnotation, type JsonPath, type JsonSchemaType, LabelAnnotation } from '@dxos/echo/internal';\nimport { ViewAnnotation } from '@dxos/schema';\n\nexport const Table = Schema.Struct({\n name: Schema.String.pipe(Schema.optional),\n\n view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),\n\n sizes: Schema.Record({\n // TODO(wittjosiah): Should be JsonPath.\n key: Schema.String,\n value: Schema.Number,\n }).pipe(Schema.mutable, FormInputAnnotation.set(false)),\n}).pipe(\n Type.object({\n typename: 'org.dxos.type.table',\n version: '0.1.0',\n }),\n LabelAnnotation.set(['name']),\n ViewAnnotation.set(true),\n Annotation.IconAnnotation.set({\n icon: 'ph--table--regular',\n hue: 'green',\n }),\n);\n\nexport interface Table extends Schema.Schema.Type<typeof Table> {}\n\ntype MakeProps = {\n name?: string;\n sizes?: Record<string, number>;\n view: View.View;\n /** Required to auto-size columns. */\n jsonSchema?: JsonSchemaType;\n};\n\n/**\n * Make a table as a view of a data set.\n */\nexport const make = ({ name, sizes = {}, view, jsonSchema }: MakeProps): Table => {\n const table = Obj.make(Table, { name, view: Ref.make(view), sizes } as Obj.MakeProps<typeof Table>);\n\n // Preset sizes.\n if (jsonSchema) {\n const schema = JsonSchema.toEffectSchema(jsonSchema);\n const properties = SchemaAST.getPropertySignatures(schema.ast);\n for (const property of properties) {\n const name = property.name.toString() as JsonPath;\n if (sizes?.[name]) {\n table.sizes[name] = sizes[name];\n continue;\n }\n\n Match.type<SchemaAST.AST>().pipe(\n Match.when({ _tag: 'BooleanKeyword' }, () => {\n table.sizes[name] = 100;\n }),\n Match.when({ _tag: 'NumberKeyword' }, () => {\n table.sizes[name] = 100;\n }),\n Match.orElse(() => {\n // Noop.\n }),\n )(property.type);\n }\n }\n\n return table;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAAA;;;;;AAIA,YAAYA,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,eAAe;AAE3B,SAASC,YAAYC,YAAYC,KAAKC,KAAKC,YAAY;AACvD,SAASC,YAAY;AACrB,SAASC,qBAAyDC,uBAAuB;AACzF,SAASC,sBAAsB;AAExB,IAAMC,QAAeC,cAAO;EACjCC,MAAaC,cAAOC,KAAYC,eAAQ;EAExCC,MAAMC,IAAIA,IAAIC,KAAKA,IAAI,EAAEJ,KAAKK,oBAAoBC,IAAI,KAAA,CAAA;EAEtDC,OAAcC,cAAO;;IAEnBC,KAAYV;IACZW,OAAcC;EAChB,CAAA,EAAGX,KAAYY,gBAASP,oBAAoBC,IAAI,KAAA,CAAA;AAClD,CAAA,EAAGN,KACDa,KAAKC,OAAO;EACVC,UAAU;EACVC,SAAS;AACX,CAAA,GACAC,gBAAgBX,IAAI;EAAC;CAAO,GAC5BY,eAAeZ,IAAI,IAAA,GACnBa,WAAWC,eAAed,IAAI;EAC5Be,MAAM;EACNC,KAAK;AACP,CAAA,CAAA;AAgBK,IAAMC,OAAO,CAAC,EAAEzB,MAAMS,QAAQ,CAAC,GAAGL,MAAMsB,WAAU,MAAa;AACpE,QAAMC,QAAQC,IAAIH,KAAK3B,OAAO;IAAEE;IAAMI,MAAMC,IAAIoB,KAAKrB,IAAAA;IAAOK;EAAM,CAAA;AAGlE,MAAIiB,YAAY;AACd,UAAMG,SAASC,WAAWC,eAAeL,UAAAA;AACzC,UAAMM,aAAuBC,gCAAsBJ,OAAOK,GAAG;AAC7D,eAAWC,YAAYH,YAAY;AACjC,YAAMhC,QAAOmC,SAASnC,KAAKoC,SAAQ;AACnC,UAAI3B,QAAQT,KAAAA,GAAO;AACjB2B,cAAMlB,MAAMT,KAAAA,IAAQS,MAAMT,KAAAA;AAC1B;MACF;AAEAqC,MAAMC,WAAI,EAAkBpC,KACpBqC,WAAK;QAAEC,MAAM;MAAiB,GAAG,MAAA;AACrCb,cAAMlB,MAAMT,KAAAA,IAAQ;MACtB,CAAA,GACMuC,WAAK;QAAEC,MAAM;MAAgB,GAAG,MAAA;AACpCb,cAAMlB,MAAMT,KAAAA,IAAQ;MACtB,CAAA,GACMyC,aAAO,MAAA;MAEb,CAAA,CAAA,EACAN,SAASG,IAAI;IACjB;EACF;AAEA,SAAOX;AACT;",
|
|
6
|
+
"names": ["Match", "Schema", "SchemaAST", "Annotation", "JsonSchema", "Obj", "Ref", "Type", "View", "FormInputAnnotation", "LabelAnnotation", "ViewAnnotation", "Table", "Struct", "name", "String", "pipe", "optional", "view", "Ref", "View", "FormInputAnnotation", "set", "sizes", "Record", "key", "value", "Number", "mutable", "Type", "object", "typename", "version", "LabelAnnotation", "ViewAnnotation", "Annotation", "IconAnnotation", "icon", "hue", "make", "jsonSchema", "table", "Obj", "schema", "JsonSchema", "toEffectSchema", "properties", "getPropertySignatures", "ast", "property", "toString", "Match", "type", "when", "_tag", "orElse"]
|
|
7
|
+
}
|
|
@@ -6,6 +6,9 @@ var extractOrder = (queryAst) => {
|
|
|
6
6
|
if (queryAst.type === "options") {
|
|
7
7
|
return extractOrder(queryAst.query);
|
|
8
8
|
}
|
|
9
|
+
if (queryAst.type === "from") {
|
|
10
|
+
return extractOrder(queryAst.query);
|
|
11
|
+
}
|
|
9
12
|
return void 0;
|
|
10
13
|
};
|
|
11
14
|
|
|
@@ -69,7 +72,7 @@ var BUTTON_IDENTIFIERS = {
|
|
|
69
72
|
};
|
|
70
73
|
var createButton = ({ attr, data, disabled = false, icon, testId, type: _type = "primary" }) => {
|
|
71
74
|
const dataAttrs = Object.entries(data).map(([k, v]) => `${k}="${v}"`).join(" ");
|
|
72
|
-
return `<button ${attr} data-testid="${testId}" class="dx-button
|
|
75
|
+
return `<button ${attr} data-testid="${testId}" class="dx-button w-6 aspect-square px-0.5 min-h-0" ${dataAttrs} ${disabled ? "disabled" : ""} data-dx-grid-action="accessory"><svg data-size="4"><use href="/icons.svg#${icon}"/></svg></button>`;
|
|
73
76
|
};
|
|
74
77
|
var addColumnButton = {
|
|
75
78
|
attr: BUTTON_IDENTIFIERS.newColumn,
|
|
@@ -182,8 +185,8 @@ var CONTROL_IDENTIFIERS = {
|
|
|
182
185
|
switch: "data-table-switch"
|
|
183
186
|
};
|
|
184
187
|
var BASE_CLASSES = {
|
|
185
|
-
checkbox: "absolute inset-
|
|
186
|
-
switch: "absolute inset-
|
|
188
|
+
checkbox: "absolute inset-y-[.375rem] end-[.375rem] dx-checkbox",
|
|
189
|
+
switch: "absolute inset-y-[.25rem] end-[.25rem] dx-checkbox--switch"
|
|
187
190
|
};
|
|
188
191
|
var renderAttributes = (data) => {
|
|
189
192
|
return Object.entries(data).map(([k, v]) => `${k}="${v}"`).join(" ");
|
|
@@ -410,7 +413,7 @@ var TableModel = class extends Resource2 {
|
|
|
410
413
|
_visibleRange;
|
|
411
414
|
_onInsertRow;
|
|
412
415
|
_onDeleteRows;
|
|
413
|
-
|
|
416
|
+
_onColumnDelete;
|
|
414
417
|
_onCellUpdate;
|
|
415
418
|
_onRowOrderChange;
|
|
416
419
|
_onRowAction;
|
|
@@ -436,7 +439,7 @@ var TableModel = class extends Resource2 {
|
|
|
436
439
|
constructor({ registry, object, projection, db, change, features = {}, initialSelection = [], pinnedRows = {
|
|
437
440
|
top: [],
|
|
438
441
|
bottom: []
|
|
439
|
-
}, rowActions = [], onCellUpdate,
|
|
442
|
+
}, rowActions = [], onCellUpdate, onColumnDelete, onDeleteRows, onInsertRow, onRowOrderChange, onRowAction }) {
|
|
440
443
|
super();
|
|
441
444
|
this._registry = registry;
|
|
442
445
|
this._object = object;
|
|
@@ -450,7 +453,7 @@ var TableModel = class extends Resource2 {
|
|
|
450
453
|
};
|
|
451
454
|
invariant(!(this._features.dataEditable && this._features.selection.enabled && this._features.selection.mode === "single"), "Single selection is not compatible with editable tables.", {
|
|
452
455
|
F: __dxlog_file,
|
|
453
|
-
L:
|
|
456
|
+
L: 197,
|
|
454
457
|
S: this,
|
|
455
458
|
A: [
|
|
456
459
|
"!(this._features.dataEditable && this._features.selection.enabled && this._features.selection.mode === 'single')",
|
|
@@ -529,7 +532,7 @@ var TableModel = class extends Resource2 {
|
|
|
529
532
|
this._rowActions = rowActions;
|
|
530
533
|
this._onInsertRow = onInsertRow;
|
|
531
534
|
this._onDeleteRows = onDeleteRows;
|
|
532
|
-
this.
|
|
535
|
+
this._onColumnDelete = onColumnDelete;
|
|
533
536
|
this._onCellUpdate = onCellUpdate;
|
|
534
537
|
this._onRowOrderChange = onRowOrderChange;
|
|
535
538
|
this._onRowAction = onRowAction;
|
|
@@ -541,7 +544,7 @@ var TableModel = class extends Resource2 {
|
|
|
541
544
|
const view = this._object.view.target;
|
|
542
545
|
invariant(view, "Table model not initialized", {
|
|
543
546
|
F: __dxlog_file,
|
|
544
|
-
L:
|
|
547
|
+
L: 308,
|
|
545
548
|
S: this,
|
|
546
549
|
A: [
|
|
547
550
|
"view",
|
|
@@ -609,7 +612,7 @@ var TableModel = class extends Resource2 {
|
|
|
609
612
|
get columnMeta() {
|
|
610
613
|
invariant(this._columnMeta, void 0, {
|
|
611
614
|
F: __dxlog_file,
|
|
612
|
-
L:
|
|
615
|
+
L: 381,
|
|
613
616
|
S: this,
|
|
614
617
|
A: [
|
|
615
618
|
"this._columnMeta",
|
|
@@ -636,7 +639,7 @@ var TableModel = class extends Resource2 {
|
|
|
636
639
|
initializeColumnMeta() {
|
|
637
640
|
invariant(this._object.view.target, "View must be loaded before initializing column meta", {
|
|
638
641
|
F: __dxlog_file,
|
|
639
|
-
L:
|
|
642
|
+
L: 405,
|
|
640
643
|
S: this,
|
|
641
644
|
A: [
|
|
642
645
|
"this._object.view.target",
|
|
@@ -906,19 +909,21 @@ var TableModel = class extends Resource2 {
|
|
|
906
909
|
const currentRow = this._registry.get(this._rows)[row];
|
|
907
910
|
invariant(currentRow, "Invalid row index", {
|
|
908
911
|
F: __dxlog_file,
|
|
909
|
-
L:
|
|
912
|
+
L: 693,
|
|
910
913
|
S: this,
|
|
911
914
|
A: [
|
|
912
915
|
"currentRow",
|
|
913
916
|
"'Invalid row index'"
|
|
914
917
|
]
|
|
915
918
|
});
|
|
916
|
-
const snapshot =
|
|
919
|
+
const snapshot = {
|
|
920
|
+
...getSnapshot(currentRow)
|
|
921
|
+
};
|
|
917
922
|
setValue(snapshot, field.path, transformedValue);
|
|
918
923
|
const schema = Obj.getSchema(currentRow);
|
|
919
924
|
invariant(schema, void 0, {
|
|
920
925
|
F: __dxlog_file,
|
|
921
|
-
L:
|
|
926
|
+
L: 699,
|
|
922
927
|
S: this,
|
|
923
928
|
A: [
|
|
924
929
|
"schema",
|
|
@@ -930,7 +935,7 @@ var TableModel = class extends Resource2 {
|
|
|
930
935
|
const error = validationResult[0];
|
|
931
936
|
invariant(error.path === field.path, void 0, {
|
|
932
937
|
F: __dxlog_file,
|
|
933
|
-
L:
|
|
938
|
+
L: 704,
|
|
934
939
|
S: this,
|
|
935
940
|
A: [
|
|
936
941
|
"error.path === field.path",
|
|
@@ -1021,8 +1026,8 @@ var TableModel = class extends Resource2 {
|
|
|
1021
1026
|
return;
|
|
1022
1027
|
}
|
|
1023
1028
|
const field = this._projection?.getFields().find((field2) => field2.id === fieldId);
|
|
1024
|
-
if (field && this.
|
|
1025
|
-
this.
|
|
1029
|
+
if (field && this._onColumnDelete) {
|
|
1030
|
+
this._onColumnDelete(field.id);
|
|
1026
1031
|
}
|
|
1027
1032
|
}
|
|
1028
1033
|
//
|
|
@@ -1314,7 +1319,7 @@ var TablePresentation = class {
|
|
|
1314
1319
|
const targetObj = getValue2(obj, field.path)?.target;
|
|
1315
1320
|
if (targetObj) {
|
|
1316
1321
|
const dxn = Obj2.getDXN(targetObj)?.toString();
|
|
1317
|
-
cell.accessoryHtml = `<div role="none" class="absolute
|
|
1322
|
+
cell.accessoryHtml = `<div role="none" class="absolute end-0 inset-y-0 p-(--dx-grid-cell-content-padding-block)"><dx-anchor dxn=${dxn} class="dx-button w-6 aspect-square min-h-0" data-dx-grid-action="accessory"><dx-icon icon="ph--link-simple--regular"/></dx-anchor></div>`;
|
|
1318
1323
|
}
|
|
1319
1324
|
}
|
|
1320
1325
|
if (props.format === Format3.TypeFormat.Boolean) {
|
|
@@ -1428,7 +1433,7 @@ var TablePresentation = class {
|
|
|
1428
1433
|
value: "",
|
|
1429
1434
|
resizeHandle: "col",
|
|
1430
1435
|
accessoryHtml: `
|
|
1431
|
-
<span class="grow min-
|
|
1436
|
+
<span class="grow min-w-0 truncate">${props.title ?? field.path}</span>
|
|
1432
1437
|
${direction !== void 0 ? tableButtons.sort.render({
|
|
1433
1438
|
fieldId: field.id,
|
|
1434
1439
|
direction
|
|
@@ -1437,7 +1442,7 @@ var TablePresentation = class {
|
|
|
1437
1442
|
fieldId: field.id
|
|
1438
1443
|
})}
|
|
1439
1444
|
`,
|
|
1440
|
-
className: "!bg-
|
|
1445
|
+
className: "!bg-toolbar-surface text-description! [&>div]:flex [&>div]:items-stretch"
|
|
1441
1446
|
};
|
|
1442
1447
|
}
|
|
1443
1448
|
return cells;
|
|
@@ -1488,7 +1493,7 @@ var TablePresentation = class {
|
|
|
1488
1493
|
col: 0,
|
|
1489
1494
|
row: 0
|
|
1490
1495
|
})]: {
|
|
1491
|
-
className: "!bg-
|
|
1496
|
+
className: "!bg-toolbar-surface",
|
|
1492
1497
|
readonly: true,
|
|
1493
1498
|
value: ""
|
|
1494
1499
|
}
|
|
@@ -1504,7 +1509,7 @@ var TablePresentation = class {
|
|
|
1504
1509
|
header: true,
|
|
1505
1510
|
checked: this.model.selection.allRowsSelected
|
|
1506
1511
|
}),
|
|
1507
|
-
className: "!bg-
|
|
1512
|
+
className: "!bg-toolbar-surface",
|
|
1508
1513
|
readonly: true,
|
|
1509
1514
|
value: ""
|
|
1510
1515
|
}
|
|
@@ -1519,7 +1524,7 @@ var TablePresentation = class {
|
|
|
1519
1524
|
accessoryHtml: this.model.features.schemaEditable ? tableButtons.addColumn.render({
|
|
1520
1525
|
disabled: (this.model.projection?.getFields()?.length ?? 0) >= VIEW_FIELD_LIMIT
|
|
1521
1526
|
}) : void 0,
|
|
1522
|
-
className: "!bg-
|
|
1527
|
+
className: "!bg-toolbar-surface",
|
|
1523
1528
|
readonly: true,
|
|
1524
1529
|
value: ""
|
|
1525
1530
|
}
|
|
@@ -1577,7 +1582,7 @@ var cellClassesForRowSelection = (selected, selectionMode) => {
|
|
|
1577
1582
|
if (!selected) {
|
|
1578
1583
|
if (selectionMode === "single") {
|
|
1579
1584
|
return [
|
|
1580
|
-
"
|
|
1585
|
+
"cursor-pointer!"
|
|
1581
1586
|
];
|
|
1582
1587
|
} else {
|
|
1583
1588
|
return void 0;
|
|
@@ -1586,11 +1591,11 @@ var cellClassesForRowSelection = (selected, selectionMode) => {
|
|
|
1586
1591
|
switch (selectionMode) {
|
|
1587
1592
|
case "single":
|
|
1588
1593
|
return [
|
|
1589
|
-
"
|
|
1594
|
+
"dx-grid__cell--no-focus-unfurl !bg-current-surface hover:bg-hover-surface cursor-pointer!"
|
|
1590
1595
|
];
|
|
1591
1596
|
case "multiple":
|
|
1592
1597
|
return [
|
|
1593
|
-
"!bg-
|
|
1598
|
+
"!bg-grid-cell-selected"
|
|
1594
1599
|
];
|
|
1595
1600
|
}
|
|
1596
1601
|
};
|
|
@@ -1617,7 +1622,7 @@ var useAddRow = ({ db, schema }) => {
|
|
|
1617
1622
|
|
|
1618
1623
|
// src/hooks/useProjectionModel.ts
|
|
1619
1624
|
import { useState } from "react";
|
|
1620
|
-
import { Type } from "@dxos/echo";
|
|
1625
|
+
import { JsonSchema, Type } from "@dxos/echo";
|
|
1621
1626
|
import { useAsyncEffect } from "@dxos/react-ui";
|
|
1622
1627
|
import { ProjectionModel, createEchoChangeCallback as createEchoChangeCallback2 } from "@dxos/schema";
|
|
1623
1628
|
var useProjectionModel = (schema, table, registry) => {
|
|
@@ -1625,7 +1630,7 @@ var useProjectionModel = (schema, table, registry) => {
|
|
|
1625
1630
|
useAsyncEffect(async () => {
|
|
1626
1631
|
if (schema && table) {
|
|
1627
1632
|
const view = await table.view.load();
|
|
1628
|
-
const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema :
|
|
1633
|
+
const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);
|
|
1629
1634
|
const change = createEchoChangeCallback2(view, Type.isMutable(schema) ? schema : void 0);
|
|
1630
1635
|
const projection2 = new ProjectionModel({
|
|
1631
1636
|
registry,
|
|
@@ -1743,4 +1748,4 @@ export {
|
|
|
1743
1748
|
useProjectionModel,
|
|
1744
1749
|
useTableModel
|
|
1745
1750
|
};
|
|
1746
|
-
//# sourceMappingURL=chunk-
|
|
1751
|
+
//# sourceMappingURL=chunk-PTHMYAAM.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/util/query-ast.ts", "../../../src/util/sort.ts", "../../../src/util/table-buttons.ts", "../../../src/util/table-controls.ts", "../../../src/model/table-model.ts", "../../../src/util/tag.ts", "../../../src/model/selection-model.ts", "../../../src/model/table-presentation.ts", "../../../src/hooks/useAddRow.ts", "../../../src/hooks/useProjectionModel.ts", "../../../src/hooks/useTableModel.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type QueryAST } from '@dxos/echo';\n\n/**\n * Extracts order clauses from a query AST.\n * Handles nested structures (options, order, etc.).\n */\nexport const extractOrder = (queryAst: QueryAST.Query): readonly QueryAST.Order[] | undefined => {\n if (queryAst.type === 'order') {\n return queryAst.order;\n }\n if (queryAst.type === 'options') {\n return extractOrder(queryAst.query);\n }\n if (queryAst.type === 'from') {\n return extractOrder(queryAst.query);\n }\n return undefined;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Format, type QueryAST } from '@dxos/echo';\n\n/**\n * Gets a normalized sort value for a given value and format.\n * This ensures consistent sorting behavior across different data types.\n */\nexport const getSortValue = (value: any, format: Format.TypeFormat): any => {\n // Handle null/undefined\n if (value === undefined || value === null) {\n return null;\n }\n\n // Handle dates chronologically if schema indicates date format\n const isDateFormat = format === Format.TypeFormat.DateTime || format === Format.TypeFormat.Date;\n if (isDateFormat) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date.getTime();\n }\n // Fallback to string if date parsing fails\n return String(value);\n }\n\n // Handle numbers if schema indicates number format\n if (\n format === Format.TypeFormat.Number ||\n format === Format.TypeFormat.Integer ||\n format === Format.TypeFormat.Currency ||\n format === Format.TypeFormat.Percent ||\n format === Format.TypeFormat.Duration\n ) {\n const num = typeof value === 'number' ? value : Number(value);\n if (!isNaN(num)) {\n return num;\n }\n // Fallback to string if number parsing fails\n return String(value);\n }\n\n // Default to string comparison\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return value;\n }\n\n // Fallback to string representation\n return String(value);\n};\n\n/**\n * Compares two values for sorting based on the field format.\n * Handles dates, numbers, and strings appropriately.\n */\nexport const compareValues = (\n aValue: any,\n bValue: any,\n format: Format.TypeFormat,\n direction: QueryAST.OrderDirection,\n): number => {\n // Handle null/undefined values - nulls sort to the end\n if (aValue === undefined || aValue === null) {\n return bValue === undefined || bValue === null ? 0 : 1;\n }\n if (bValue === undefined || bValue === null) {\n return -1;\n }\n\n // Get normalized sort values\n const aSortValue = getSortValue(aValue, format);\n const bSortValue = getSortValue(bValue, format);\n\n // Compare based on type\n let comparison = 0;\n if (typeof aSortValue === 'number' && typeof bSortValue === 'number') {\n comparison = aSortValue - bSortValue;\n } else if (typeof aSortValue === 'string' && typeof bSortValue === 'string') {\n comparison = aSortValue.localeCompare(bSortValue);\n } else {\n // Mixed types - convert both to strings\n comparison = String(aSortValue).localeCompare(String(bSortValue));\n }\n\n return direction === 'desc' ? -comparison : comparison;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport type TableButton = 'columnSettings' | 'rowMenu' | 'newColumn' | 'referencedCell' | 'sort' | 'saveDraftRow';\n\nexport const BUTTON_IDENTIFIERS: { [K in TableButton]: string } = {\n columnSettings: 'data-table-column-settings-button',\n newColumn: 'data-table-new-column-button',\n referencedCell: 'data-table-ref-cell-button',\n rowMenu: 'data-table-row-menu-button',\n saveDraftRow: 'data-table-save-draft-row-button',\n sort: 'data-table-sort-button',\n} as const;\n\ntype ButtonData =\n | { type: 'columnSettings'; fieldId: string }\n | { type: 'newColumn'; disabled?: boolean }\n | { type: 'rowMenu'; rowIndex: number }\n | { type: 'saveDraftRow'; rowIndex: number; disabled?: boolean }\n | { type: 'sort'; fieldId: string; direction?: 'asc' | 'desc' };\n\nconst createButton = ({\n attr,\n data,\n disabled = false,\n icon,\n testId,\n type: _type = 'primary',\n}: {\n attr: string;\n data: Record<string, string>;\n disabled?: boolean;\n icon: string;\n testId: string;\n type?: 'primary' | 'secondary';\n}) => {\n const dataAttrs = Object.entries(data)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n\n return `<button ${attr} data-testid=\"${testId}\" class=\"dx-button w-6 aspect-square px-0.5 min-h-0\" ${dataAttrs} ${disabled ? 'disabled' : ''} data-dx-grid-action=\"accessory\"><svg data-size=\"4\"><use href=\"/icons.svg#${icon}\"/></svg></button>`;\n};\n\nconst addColumnButton = {\n attr: BUTTON_IDENTIFIERS.newColumn,\n icon: 'ph--plus--regular',\n render: ({ disabled }: Omit<Extract<ButtonData, { type: 'newColumn' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.newColumn,\n icon: addColumnButton.icon,\n disabled,\n data: {},\n testId: 'table-new-column-button',\n });\n },\n getData: (_el: HTMLElement): Extract<ButtonData, { type: 'newColumn' }> => ({ type: 'newColumn' }),\n} as const;\n\nconst columnSettingsButton = {\n attr: BUTTON_IDENTIFIERS.columnSettings,\n icon: 'ph--caret-down--regular',\n render: ({ fieldId }: Omit<Extract<ButtonData, { type: 'columnSettings' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.columnSettings,\n icon: columnSettingsButton.icon,\n data: {\n 'data-field-id': fieldId,\n 'data-variant': 'ghost',\n },\n testId: 'table-column-settings-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'columnSettings' }> => ({\n type: 'columnSettings',\n fieldId: el.getAttribute('data-field-id')!,\n }),\n} as const;\n\nconst rowMenuButton = {\n attr: BUTTON_IDENTIFIERS.rowMenu,\n icon: 'ph--dots-three--regular',\n render: ({ rowIndex }: Omit<Extract<ButtonData, { type: 'rowMenu' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.rowMenu,\n icon: rowMenuButton.icon,\n data: {\n 'data-row-index': rowIndex.toString(),\n },\n testId: 'table-row-menu-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'rowMenu' }> => ({\n type: 'rowMenu',\n rowIndex: Number(el.getAttribute('data-row-index')!),\n }),\n} as const;\n\nconst sortButton = {\n attr: BUTTON_IDENTIFIERS.sort,\n icon: 'ph--sort-ascending--regular',\n render: ({ fieldId, direction }: Omit<Extract<ButtonData, { type: 'sort' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.sort,\n icon: direction === 'desc' ? 'ph--sort-descending--regular' : 'ph--sort-ascending--regular',\n data: {\n 'data-field-id': fieldId,\n 'data-direction': direction ?? '',\n },\n testId: 'table-sort-button',\n // TODO(ZaymonFC): All buttons should be rendered into an absolutely positioned flex container.\n // This is a bit hacky.\n type: 'secondary',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'sort' }> => ({\n type: 'sort',\n fieldId: el.getAttribute('data-field-id')!,\n direction: el.getAttribute('data-direction') as 'asc' | 'desc' | undefined,\n }),\n} as const;\n\nconst saveDraftRowButton = {\n attr: BUTTON_IDENTIFIERS.saveDraftRow,\n icon: 'ph--floppy-disk--regular',\n render: ({ rowIndex, disabled }: Omit<Extract<ButtonData, { type: 'saveDraftRow' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.saveDraftRow,\n icon: saveDraftRowButton.icon,\n disabled,\n data: {\n 'data-row-index': rowIndex.toString(),\n 'data-variant': 'primary',\n },\n testId: 'table-save-draft-row-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'saveDraftRow' }> => ({\n type: 'saveDraftRow',\n rowIndex: Number(el.getAttribute('data-row-index')!),\n }),\n} as const;\n\nexport const tableButtons = {\n addColumn: addColumnButton,\n columnSettings: columnSettingsButton,\n rowMenu: rowMenuButton,\n saveDraftRow: saveDraftRowButton,\n sort: sortButton,\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Core types.\nimport { accessoryHandlesPointerdownAttrs } from '@dxos/lit-grid';\n\nexport type TableControl = 'checkbox' | 'switch';\n\nexport type ControlData =\n | { type: 'checkbox'; rowIndex: number; header?: boolean }\n | { type: 'switch'; colIndex: number; rowIndex: number };\n\ntype CommonRenderProps = {\n checked?: boolean;\n disabled?: boolean;\n};\n\nexport type RenderCheckboxProps = CommonRenderProps & Omit<Extract<ControlData, { type: 'checkbox' }>, 'type'>;\nexport type RenderSwitchProps = CommonRenderProps & Omit<Extract<ControlData, { type: 'switch' }>, 'type'>;\n\nexport const CONTROL_IDENTIFIERS = {\n checkbox: 'data-table-checkbox',\n switch: 'data-table-switch',\n} as const;\n\nconst BASE_CLASSES = {\n checkbox: 'absolute inset-y-[.375rem] end-[.375rem] dx-checkbox',\n switch: 'absolute inset-y-[.25rem] end-[.25rem] dx-checkbox--switch',\n} as const;\n\nconst renderAttributes = (data: Record<string, string>) => {\n return Object.entries(data)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n};\n\nconst renderInput = (\n baseClass: string,\n attrs: Record<string, string>,\n checked = false,\n disabled = false,\n preventToggle = false,\n testId: string,\n) => {\n return `<input type=\"checkbox\" class=\"${baseClass}\" ${renderAttributes(attrs)} ${checked ? 'checked' : ''} ${preventToggle ? 'onclick=\"return false\"' : ''} ${disabled ? 'disabled' : ''} data-testid=\"${testId}\" data-dx-grid-action=\"accessory\"/>`;\n};\n\nexport const CheckboxStory = ({\n rowIndex,\n header = false,\n checked = false,\n disabled = false,\n}: RenderCheckboxProps): string => {\n const attrs = {\n [CONTROL_IDENTIFIERS.checkbox]: '',\n 'data-row-index': rowIndex.toString(),\n ...(header && { 'data-header': '' }),\n };\n\n return renderInput(BASE_CLASSES.checkbox, attrs, checked, disabled, true, 'table-selection');\n};\n\nexport const SwitchStory = ({ colIndex, rowIndex, checked = false, disabled = false }: RenderSwitchProps): string => {\n const attrs = {\n [CONTROL_IDENTIFIERS.switch]: '',\n 'data-row-index': rowIndex.toString(),\n 'data-col-index': colIndex.toString(),\n ...accessoryHandlesPointerdownAttrs,\n };\n\n return renderInput(BASE_CLASSES.switch, attrs, checked, disabled, true, 'table-switch');\n};\n\nexport const tableControls = {\n checkbox: {\n attr: CONTROL_IDENTIFIERS.checkbox,\n render: CheckboxStory,\n getData: (el: HTMLElement): Extract<ControlData, { type: 'checkbox' }> => ({\n type: 'checkbox',\n rowIndex: Number(el.getAttribute('data-row-index')),\n header: el.hasAttribute('data-header'),\n }),\n },\n switch: {\n attr: CONTROL_IDENTIFIERS.switch,\n render: SwitchStory,\n getData: (el: HTMLElement): Extract<ControlData, { type: 'switch' }> => ({\n type: 'switch',\n rowIndex: Number(el.getAttribute('data-row-index')),\n colIndex: Number(el.getAttribute('data-col-index')),\n }),\n },\n} as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { Resource } from '@dxos/context';\nimport { type Database, Format, Obj, Order, Query, type QueryAST, Ref } from '@dxos/echo';\nimport { type View } from '@dxos/echo';\nimport { type JsonProp, type JsonSchemaType, type Mutable, toEffectSchema } from '@dxos/echo/internal';\nimport { getSnapshot } from '@dxos/echo/internal';\nimport { getValue, setValue } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { ObjectId } from '@dxos/keys';\nimport { type Label } from '@dxos/react-ui';\nimport { formatForEditing, parseValue } from '@dxos/react-ui-form';\nimport {\n type DxGridAxisMeta,\n type DxGridPlanePosition,\n type DxGridPlaneRange,\n type DxGridPosition,\n} from '@dxos/react-ui-grid';\nimport { type ProjectionModel, type PropertyType, type ValidationError, validateSchema } from '@dxos/schema';\n\nimport { type Table } from '../types';\nimport { extractOrder } from '../util';\nimport { compareValues } from '../util/sort';\nimport { extractTagIds } from '../util/tag';\n\n/**\n * Field sort configuration.\n */\nexport type FieldSortType = {\n fieldId: string;\n direction: QueryAST.OrderDirection;\n};\n\nimport { type SelectionMode, SelectionModel } from './selection-model';\n\n/**\n * Callback type for wrapping mutations in Obj.change().\n * Contains separate callbacks for table object and row mutations.\n */\nexport type TableChangeCallback<T extends TableRow> = {\n /** Callback to wrap table object mutations. */\n table: (mutate: (mutableTable: Table.Table) => void) => void;\n /** Callback to wrap row mutations. */\n row: (row: T, mutate: (mutableRow: T) => void) => void;\n};\n\n/**\n * Creates a change callback for ECHO-backed table and rows.\n * Use this when the table and rows are stored in the ECHO database.\n */\nexport const createEchoChangeCallback = <T extends TableRow>(table: Table.Table): TableChangeCallback<T> => ({\n table: (mutate) => Obj.change(table, (mutableTable) => mutate(mutableTable as unknown as Table.Table)),\n row: (row, mutate) => {\n if (Obj.isObject(row)) {\n Obj.change(row, (mutableRow) => mutate(mutableRow as T));\n } else {\n mutate(row);\n }\n },\n});\n\n/**\n * Creates a change callback that directly mutates objects without wrapping.\n * Use this for plain JavaScript objects (tests, non-ECHO scenarios).\n */\nexport const createDirectChangeCallback = <T extends TableRow>(table: Table.Table): TableChangeCallback<T> => ({\n table: (mutate) => mutate(table),\n row: (row, mutate) => mutate(row),\n});\n\n// Domain types for cell classification\nexport type TableCellType = 'standard' | 'draft' | 'header';\n\n// TODO(ZaymonFC): Use a common type?\nexport type ValidationResult = { valid: true } | { valid: false; error: string };\n\nexport type DraftRow<T extends TableRow = TableRow> = {\n data: T;\n valid: boolean;\n validationErrors: ValidationError[];\n};\n\n// TODO(burdon): Use schema types.\nexport type TableRow = Record<JsonProp, any> & { id: string };\n\nexport type TableRowAction = {\n id: string;\n label: Label;\n};\n\nexport type TableFeatures = {\n selection: { enabled: boolean; mode?: SelectionMode };\n dataEditable: boolean;\n schemaEditable: boolean;\n};\n\nconst defaultFeatures: TableFeatures = {\n selection: { enabled: true, mode: 'multiple' },\n dataEditable: false,\n schemaEditable: false,\n};\n\nexport type InsertRowResult = 'draft' | 'final';\n\nexport type TableModelProps<T extends TableRow = TableRow> = {\n registry: Registry.Registry;\n object: Table.Table;\n projection: ProjectionModel;\n db?: Database.Database;\n /**\n * Callbacks to wrap mutations in Obj.change().\n * Use createEchoChangeCallback() for ECHO-backed objects or createDirectChangeCallback() for plain objects.\n */\n change?: TableChangeCallback<T>;\n features?: Partial<TableFeatures>;\n initialSelection?: string[];\n pinnedRows?: { top: number[]; bottom: number[] };\n rowActions?: TableRowAction[];\n onResolveSchema?: (typename: string) => Promise<JsonSchemaType>;\n onInsertRow?: (data?: any) => InsertRowResult;\n onDeleteRows?: (index: number, obj: T[]) => void;\n onColumnDelete?: (fieldId: string) => void;\n onCellUpdate?: (cell: DxGridPosition) => void;\n onRowOrderChange?: () => void;\n onRowAction?: (actionId: string, data: T) => void;\n};\n\nexport class TableModel<T extends TableRow = TableRow> extends Resource {\n private readonly _registry: Registry.Registry;\n private readonly _object: Table.Table;\n private readonly _projection: ProjectionModel;\n private readonly _db?: Database.Database;\n private readonly _change: TableChangeCallback<T>;\n\n private readonly _visibleRange: Atom.Writable<DxGridPlaneRange>;\n\n private readonly _onInsertRow?: (data?: any) => InsertRowResult;\n private readonly _onDeleteRows?: TableModelProps<T>['onDeleteRows'];\n private readonly _onColumnDelete?: TableModelProps<T>['onColumnDelete'];\n private readonly _onCellUpdate?: TableModelProps<T>['onCellUpdate'];\n private readonly _onRowOrderChange?: TableModelProps<T>['onRowOrderChange'];\n private readonly _onRowAction?: TableModelProps<T>['onRowAction'];\n private readonly _rowActions: TableRowAction[];\n private readonly _features: TableFeatures;\n\n private readonly _rows: Atom.Writable<T[]>;\n private readonly _draftRows: Atom.Writable<DraftRow<T>[]>;\n // In-memory sort state - changes are local until saved.\n private readonly _inMemorySort: Atom.Writable<FieldSortType | undefined>;\n // Derived atom for persisted sort from view.query.ast.\n private readonly _persistedSort: Atom.Atom<FieldSortType | undefined>;\n // Derived atom for current sort (in-memory takes precedence over persisted).\n private readonly _sorting: Atom.Atom<FieldSortType | undefined>;\n // Derived atom for sorted rows (used by rows getter and SelectionModel).\n private readonly _sortedRows: Atom.Atom<T[]>;\n // Derived atom for viewDirty state.\n private readonly _viewDirty: Atom.Atom<boolean>;\n\n private _pinnedRows: NonNullable<TableModelProps<T>['pinnedRows']>;\n private _selection!: SelectionModel<T>;\n private _columnMeta?: Atom.Atom<DxGridAxisMeta>;\n // Counter atom that increments when cells are updated - allows UI to react to cell changes.\n private readonly _cellUpdateCounter: Atom.Writable<number>;\n\n constructor({\n registry,\n object,\n projection,\n db,\n change,\n features = {},\n initialSelection = [],\n pinnedRows = { top: [], bottom: [] },\n rowActions = [],\n onCellUpdate,\n onColumnDelete,\n onDeleteRows,\n onInsertRow,\n onRowOrderChange,\n onRowAction,\n }: TableModelProps<T>) {\n super();\n this._registry = registry;\n this._object = object;\n this._projection = projection;\n this._projection.normalizeView();\n this._db = db;\n this._change = change ?? createEchoChangeCallback<T>(object);\n\n // TODO(ZaymonFC): Use our more robust config merging module?\n this._features = { ...defaultFeatures, ...features };\n\n invariant(\n !(this._features.dataEditable && this._features.selection.enabled && this._features.selection.mode === 'single'),\n 'Single selection is not compatible with editable tables.',\n );\n\n // Initialize writable atoms.\n this._visibleRange = Atom.make<DxGridPlaneRange>({\n start: { row: 0, col: 0 },\n end: { row: 0, col: 0 },\n });\n this._rows = Atom.make<T[]>([]);\n this._draftRows = Atom.make<DraftRow<T>[]>([]);\n this._inMemorySort = Atom.make<FieldSortType | undefined>(undefined);\n this._cellUpdateCounter = Atom.make<number>(0);\n\n // Create derived atom for persisted sort from view.query.ast.\n this._persistedSort = Atom.make((_get) => {\n // Note: This depends on the view being loaded and the projection being set.\n // The view is loaded in _open().\n const viewSnapshot = Obj.getSnapshot(this.view);\n const ast = viewSnapshot.query.ast;\n const orders = extractOrder(ast);\n\n if (orders && orders.length > 0) {\n const firstOrder = orders[0];\n if (firstOrder.kind === 'property') {\n // Find field by property path.\n const field = this._projection.getFields().find((f) => f.path === firstOrder.property);\n if (field) {\n return {\n fieldId: field.id,\n direction: firstOrder.direction,\n };\n }\n }\n }\n\n return undefined;\n });\n\n // Create derived atom for current sort (in-memory takes precedence over persisted).\n this._sorting = Atom.make((get) => {\n const inMemorySort = get(this._inMemorySort);\n return inMemorySort ?? get(this._persistedSort);\n });\n\n // Create derived atom for sorted rows (used by rows getter and SelectionModel).\n this._sortedRows = Atom.make((get) => {\n const rows = get(this._rows);\n const sort = get(this._sorting);\n\n if (!sort || rows.length === 0) {\n return rows;\n }\n\n const field = this._projection.getFields().find((f) => f.id === sort.fieldId);\n if (!field) {\n return rows;\n }\n\n // Get field projection to check format.\n const fieldProjection = this._projection.getFieldProjection(field.id);\n\n const sorted = [...rows].sort((a, b) => {\n const aValue = getValue(a, field.path);\n const bValue = getValue(b, field.path);\n return compareValues(aValue, bValue, fieldProjection.props.format, sort.direction);\n });\n\n return sorted;\n });\n\n this._selection = new SelectionModel(\n this._registry,\n this._sortedRows,\n this._features.selection.mode ?? 'multiple',\n initialSelection,\n () => this._onRowOrderChange?.(),\n );\n\n // Create derived atom for viewDirty.\n this._viewDirty = Atom.make((get) => {\n const inMemorySort = get(this._inMemorySort);\n if (!inMemorySort) {\n return false;\n }\n\n const persisted = get(this._persistedSort);\n if (!persisted) {\n return true; // In-memory sort but no persisted sort.\n }\n\n return inMemorySort.fieldId !== persisted.fieldId || inMemorySort.direction !== persisted.direction;\n });\n\n this._pinnedRows = pinnedRows;\n this._rowActions = rowActions;\n this._onInsertRow = onInsertRow;\n this._onDeleteRows = onDeleteRows;\n this._onColumnDelete = onColumnDelete;\n this._onCellUpdate = onCellUpdate;\n this._onRowOrderChange = onRowOrderChange;\n this._onRowAction = onRowAction;\n }\n\n public get id(): string {\n return Obj.getDXN(this._object).toString();\n }\n\n public get view(): View.View {\n const view = this._object.view.target;\n invariant(view, 'Table model not initialized');\n return view;\n }\n\n public get table(): Table.Table {\n return this._object;\n }\n\n public get projection(): ProjectionModel {\n return this._projection;\n }\n\n public get db(): Database.Database | undefined {\n return this._db;\n }\n\n /**\n * Atom for reactive access to rows with in-memory sorting applied.\n */\n public get rows(): Atom.Atom<T[]> {\n return this._sortedRows;\n }\n\n /**\n * Gets rows with in-memory sorting applied.\n * In-memory sort is local to this instance until saved.\n */\n public getRows(): T[] {\n return this._registry.get(this._sortedRows);\n }\n\n /** Atom for reactive access to cell changes. */\n public get cellUpdate(): Atom.Atom<number> {\n return this._cellUpdateCounter;\n }\n\n /**\n * Change a row using the configured change callback.\n * Use this instead of directly mutating to ensure consistent mutation handling.\n */\n public changeRow(row: T, mutate: (mutableRow: T) => void): void {\n this._change.row(row, mutate);\n }\n\n public get features(): TableFeatures {\n return this._features;\n }\n\n /**\n * Gets the current sort state.\n * Priority: in-memory sort (local changes) > persisted sort (from query AST).\n */\n public getSorting(): FieldSortType | undefined {\n return this._registry.get(this._sorting);\n }\n\n /**\n * Gets the row data at the specified display index.\n */\n public getRowAt(displayIndex: number): T | undefined {\n const sortedRows = this._registry.get(this._sortedRows);\n if (displayIndex < 0 || displayIndex >= sortedRows.length) {\n return undefined;\n }\n\n return sortedRows[displayIndex];\n }\n\n public get pinnedRows(): NonNullable<TableModelProps<T>['pinnedRows']> {\n return this._pinnedRows;\n }\n\n public get columnMeta(): Atom.Atom<DxGridAxisMeta> {\n invariant(this._columnMeta);\n return this._columnMeta;\n }\n\n public get selection() {\n return this._selection;\n }\n\n public get rowActions(): TableRowAction[] {\n return this._rowActions;\n }\n\n //\n // Initialisation\n //\n\n protected override async _open(): Promise<void> {\n await this._object.view.load();\n this.initializeColumnMeta();\n this.initializeEffects();\n await this._selection.open(this._ctx);\n }\n\n private initializeColumnMeta(): void {\n invariant(this._object.view.target, 'View must be loaded before initializing column meta');\n\n // Derive columnMeta from the projection's fields atom - updates when fields change.\n // The projection.fields atom handles subscriptions to view changes internally.\n this._columnMeta = Atom.make((get) => {\n const fields = get(this._projection.fields);\n const meta = Object.fromEntries(\n fields.map((field, index: number) => [index, { size: this.table.sizes[field.path] ?? 256, resizeable: true }]),\n );\n\n return {\n grid: meta,\n frozenColsStart: { 0: { size: 30, resizeable: false } },\n frozenColsEnd: { 0: { size: 32, resizeable: false } },\n };\n });\n }\n\n private initializeEffects(): void {\n // Subscribe to rows changes to notify row order changed.\n const rowsUnsubscribe = this._registry.subscribe(this._rows, () => {\n this._onRowOrderChange?.();\n });\n this._ctx.onDispose(rowsUnsubscribe);\n\n // Track row subscriptions for cleanup.\n const rowSubscriptions = new Map<string, () => void>();\n\n // Subscribe to visible range changes to set up row subscriptions.\n const visibleRangeUnsubscribe = this._registry.subscribe(this._visibleRange, () => {\n // Unsubscribe from old row subscriptions.\n for (const [id, unsub] of rowSubscriptions) {\n unsub();\n rowSubscriptions.delete(id);\n }\n\n const { start, end } = this._registry.get(this._visibleRange);\n const sortedRows = this._registry.get(this._sortedRows);\n\n // Subscribe to each visible row's changes.\n for (let row = start.row; row <= end.row && row < sortedRows.length; row++) {\n const obj = sortedRows[row];\n if (Obj.isObject(obj) && !rowSubscriptions.has(obj.id)) {\n const unsub = Obj.subscribe(obj, () => {\n // Increment cell update counter to notify UI of changes.\n this._registry.set(this._cellUpdateCounter, this._registry.get(this._cellUpdateCounter) + 1);\n this._onCellUpdate?.({ row, col: start.col, plane: 'grid' });\n });\n rowSubscriptions.set(obj.id, unsub);\n }\n }\n });\n this._ctx.onDispose(() => {\n visibleRangeUnsubscribe();\n for (const unsub of rowSubscriptions.values()) {\n unsub();\n }\n });\n\n // Subscribe to draft rows changes to notify grid.\n const draftRowsUnsubscribe = this._registry.subscribe(this._draftRows, () => {\n this._onRowOrderChange?.();\n });\n this._ctx.onDispose(draftRowsUnsubscribe);\n }\n\n //\n // Data\n //\n\n public setRows = (obj: T[]): void => {\n this._registry.set(this._rows, obj);\n };\n\n public getRowCount = (): number => this._registry.get(this._sortedRows).length;\n\n public getDraftRowCount(): number {\n return this._registry.get(this._draftRows).length;\n }\n\n /** Atom for reactive access to draft rows. */\n public get draftRows(): Atom.Atom<DraftRow<T>[]> {\n return this._draftRows;\n }\n\n /** Gets the current draft rows. */\n public getDraftRows(): DraftRow<T>[] {\n return this._registry.get(this._draftRows);\n }\n\n /**\n * Checks if a specific field path has validation errors for a given draft row.\n * @param draftRowIndex - The index of the draft row to check\n * @param fieldPath - The path of the field to check for validation errors\n * @returns true if the field has validation errors, false otherwise\n */\n public hasDraftRowValidationError(draftRowIndex: number, fieldPath: string): boolean {\n if (draftRowIndex < 0 || draftRowIndex >= this._registry.get(this._draftRows).length) {\n return false;\n }\n\n const draftRow = this._registry.get(this._draftRows)[draftRowIndex];\n const validationErrors = draftRow.validationErrors || [];\n return validationErrors.some((error) => error.path === fieldPath);\n }\n\n public getColumnCount = (): number => this._projection?.getFields().length ?? 0;\n\n public insertRow = (): InsertRowResult => {\n const result = this._onInsertRow?.();\n if (result === 'draft' && this._registry.get(this._draftRows).length === 0) {\n this.createDraftRow();\n }\n return result ?? 'final';\n };\n\n private createDraftRow(): void {\n if (!this._projection) {\n return;\n }\n\n // NOTE(ZaymonFC): This is initialized with id because it's required in all schemata?\n const draftData = { id: ObjectId.random() } as any as T;\n const validationErrors = this.validateDraftRowData(draftData);\n\n const draftRow: DraftRow<T> = {\n data: draftData,\n valid: validationErrors.length === 0,\n validationErrors,\n };\n\n this._registry.set(this._draftRows, [...this._registry.get(this._draftRows), draftRow]);\n }\n\n private validateDraftRow(draftRowIndex: number): void {\n if (draftRowIndex < 0 || draftRowIndex >= this._registry.get(this._draftRows).length) {\n return;\n }\n\n const draftRow = this._registry.get(this._draftRows)[draftRowIndex];\n const validationErrors = this.validateDraftRowData(draftRow.data);\n\n const updatedDraftRow = {\n ...draftRow,\n valid: validationErrors.length === 0,\n validationErrors,\n };\n\n const newDraftRows = [...this._registry.get(this._draftRows)];\n newDraftRows[draftRowIndex] = updatedDraftRow;\n this._registry.set(this._draftRows, newDraftRows);\n }\n\n private validateDraftRowData(data: T): ValidationError[] {\n const schema = toEffectSchema(this._projection.baseSchema);\n return validateSchema(schema, data) || [];\n }\n\n public commitDraftRow = (draftRowIndex: number): boolean => {\n if (draftRowIndex < 0 || draftRowIndex >= this._registry.get(this._draftRows).length) {\n return false;\n }\n\n const draftRow = this._registry.get(this._draftRows)[draftRowIndex];\n if (!draftRow.valid) {\n return false;\n }\n\n const insertRowResult = this._onInsertRow?.(draftRow.data);\n\n if (insertRowResult === 'final') {\n const newDraftRows = this._registry.get(this._draftRows).filter((_, index) => index !== draftRowIndex);\n this._registry.set(this._draftRows, newDraftRows);\n }\n\n return insertRowResult === 'final';\n };\n\n public deleteRow = (rowIndex: number): void => {\n const sortedRows = this._registry.get(this._sortedRows);\n const obj = sortedRows[rowIndex];\n const objectsToDelete = [];\n\n if (this.features.selection.enabled && this._selection.hasSelection) {\n const selectedRows = this._selection.getSelectedRows();\n objectsToDelete.push(...selectedRows);\n } else if (obj) {\n objectsToDelete.push(obj);\n }\n\n if (objectsToDelete.length > 0) {\n this._onDeleteRows?.(rowIndex, objectsToDelete);\n }\n };\n\n public handleRowAction = (actionId: string, rowIndex: number): void => {\n if (!this._onRowAction) {\n return;\n }\n\n const sortedRows = this._registry.get(this._sortedRows);\n const data = sortedRows[rowIndex];\n\n if (data) {\n this._onRowAction(actionId, data);\n }\n };\n\n public getCellData = (cell: DxGridPosition): any => {\n const { col, row, plane } = cell;\n const fields = this._projection?.getFields() ?? [];\n if (col < 0 || col >= fields.length) {\n return undefined;\n }\n\n const field = fields[col];\n let value: any;\n\n if (plane === 'frozenRowsEnd') {\n // Get data from draft row\n if (row >= 0 && row < this._registry.get(this._draftRows).length) {\n value = getValue(this._registry.get(this._draftRows)[row].data, field.path);\n } else {\n return undefined;\n }\n } else {\n // Get data from regular row (use sorted rows for display index)\n const sortedRows = this._registry.get(this._sortedRows);\n value = getValue(sortedRows[row], field.path);\n }\n\n if (value == null) {\n return '';\n }\n\n const { props } = this._projection.getFieldProjection(field.id);\n switch (props.format) {\n case Format.TypeFormat.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value.target, field.referencePath);\n }\n\n default: {\n return formatForEditing({\n type: props.type,\n format: props.format,\n value,\n });\n }\n }\n };\n\n public validateCellData = async ({ col, row, plane }: DxGridPosition, value: any): Promise<ValidationResult> => {\n const fields = this._projection?.getFields() ?? [];\n if (col < 0 || col >= fields.length) {\n return { valid: false, error: 'Invalid column index' };\n }\n\n const field = fields[col];\n const { props } = this._projection.getFieldProjection(field.id);\n const transformedValue = editorTextToCellValue(props, value);\n\n const isDraftRow = plane === 'frozenRowsEnd';\n\n if (isDraftRow) {\n const isInvalidDraftRowIndex = row < 0 || row >= this._registry.get(this._draftRows).length;\n if (isInvalidDraftRowIndex) {\n return { valid: false, error: 'Invalid draft row index' };\n }\n\n const draftRow = this._registry.get(this._draftRows)[row];\n const snapshot = { ...draftRow.data };\n setValue(snapshot, field.path, transformedValue);\n\n const validationErrors = this.validateDraftRowData(snapshot);\n // TODO(thure): These errors sometimes result in a useless message like “is missing” (what is missing?)\n if (validationErrors.length > 0) {\n const error = validationErrors.find((err) => err.path === field.path);\n if (error) {\n return { valid: false, error: error.message };\n }\n }\n return { valid: true };\n } else {\n const currentRow = this._registry.get(this._rows)[row];\n invariant(currentRow, 'Invalid row index');\n\n const snapshot = { ...getSnapshot(currentRow) };\n setValue(snapshot, field.path, transformedValue);\n\n const schema = Obj.getSchema(currentRow);\n invariant(schema);\n\n const validationResult = validateSchema(schema, snapshot);\n if (validationResult && validationResult.length > 0) {\n const error = validationResult[0];\n invariant(error.path === field.path);\n return { valid: false, error: error.message };\n }\n\n return { valid: true };\n }\n };\n\n public setCellData = (cell: DxGridPosition, value: any): void => {\n const { col, row, plane } = cell;\n const fields = this._projection?.getFields() ?? [];\n if (col < 0 || col >= fields.length) {\n return;\n }\n\n const field = fields[col];\n const { props } = this._projection.getFieldProjection(field.id);\n const transformedValue = editorTextToCellValue(props, value);\n\n // Special handling for Ref format to preserve existing behavior\n if (props.format === Format.TypeFormat.Ref && !Obj.isObject(value)) {\n return;\n }\n\n if (plane === 'frozenRowsEnd') {\n // Update draft row data (draft rows are plain objects, not ECHO objects).\n if (row >= 0 && row < this._registry.get(this._draftRows).length) {\n setValue(this._registry.get(this._draftRows)[row].data, field.path, transformedValue);\n // Re-validate the draft row after the update\n this.validateDraftRow(row);\n }\n } else {\n // Update regular row data (use sorted rows for display index)\n const sortedRows = this._registry.get(this._sortedRows);\n const rowData = sortedRows[row];\n this._change.row(rowData, (mutableRow) => {\n setValue(mutableRow, field.path, transformedValue);\n });\n }\n };\n\n /**\n * Updates a cell's value using a transform function.\n * @param {DxGridPlanePosition} position - The position of the cell to update.\n * @param {(value: any) => any} update - A function that takes the current value and returns the updated value.\n */\n public updateCellData({ col, row }: DxGridPlanePosition, update: (value: any) => any): void {\n const fields = this._projection?.getFields() ?? [];\n const field = fields[col];\n const sortedRows = this._registry.get(this._sortedRows);\n const rowData = sortedRows[row];\n\n const value = getValue(rowData, field.path);\n const updatedValue = update(value);\n this._change.row(rowData, (mutableRow) => {\n setValue(mutableRow, field.path, updatedValue);\n });\n }\n\n /**\n * Gets the domain-appropriate cell type for a given cell position.\n * This abstracts away the low-level grid plane concepts and provides domain-specific types.\n * @param cell - The cell position to classify\n * @returns The domain-appropriate cell type\n */\n public getCellType(cell: DxGridPosition): TableCellType {\n switch (cell.plane) {\n case 'frozenRowsEnd':\n return 'draft';\n case 'frozenRowsStart':\n return 'header';\n case 'grid':\n default:\n return 'standard';\n }\n }\n\n /**\n * Convenience method to check if a cell is a draft cell.\n * @param cell - The cell position to check\n * @returns true if the cell is a draft cell, false otherwise\n */\n public isDraftCell(cell: DxGridPosition): boolean {\n return this.getCellType(cell) === 'draft';\n }\n\n //\n // Column Operations\n //\n\n public deleteColumn(fieldId: string): void {\n if (!this._projection) {\n return;\n }\n\n const field = this._projection?.getFields().find((field) => field.id === fieldId);\n if (field && this._onColumnDelete) {\n this._onColumnDelete(field.id);\n }\n }\n\n //\n // Resize\n //\n\n public setColumnWidth(columnIndex: number, width: number): void {\n const fields = this._projection?.getFields() ?? [];\n if (columnIndex < fields.length) {\n const newWidth = Math.max(0, width);\n const field = fields[columnIndex];\n if (field) {\n this._change.table((mutableTable) => {\n mutableTable.sizes[field.path] = newWidth;\n });\n }\n }\n }\n\n //\n // Pinning\n //\n\n // TODO(burdon): Change to setPinned(on/off).\n public pinRow(rowIndex: number, side: 'top' | 'bottom'): void {\n this._pinnedRows[side].push(rowIndex);\n }\n\n public unpinRow(rowIndex: number): void {\n this._pinnedRows.top = this._pinnedRows.top.filter((index: number) => index !== rowIndex);\n this._pinnedRows.bottom = this._pinnedRows.bottom.filter((index: number) => index !== rowIndex);\n }\n\n //\n // Sort operations\n //\n\n /**\n * Sets the sort order for a field in-memory (local to this instance).\n * Use saveView() to persist the sort to the view query.\n */\n public setSort(fieldId: string, direction: QueryAST.OrderDirection): void {\n const field = this._projection.getFields().find((f) => f.id === fieldId);\n if (!field) {\n return;\n }\n\n // Update in-memory sort (local changes).\n this._registry.set(this._inMemorySort, {\n fieldId,\n direction,\n });\n }\n\n /**\n * Toggles the sort direction for a field in-memory.\n */\n public toggleSort(fieldId: string): void {\n const currentSort = this.getSorting();\n if (!currentSort || currentSort.fieldId !== fieldId) {\n this.setSort(fieldId, 'asc');\n return;\n }\n\n const newDirection = currentSort.direction === 'asc' ? 'desc' : 'asc';\n this.setSort(fieldId, newDirection);\n }\n\n /**\n * Clears the in-memory sort order.\n */\n public clearSort(): void {\n this._registry.set(this._inMemorySort, undefined);\n }\n\n /**\n * Saves the current in-memory sort to the view query AST.\n * This persists the sort so it becomes the default for all viewers.\n */\n public saveView(): void {\n const view = this.view;\n const inMemorySort = this._registry.get(this._inMemorySort);\n\n // Snapshot view before accessing query.ast\n const viewSnapshot = Obj.getSnapshot(view);\n const currentQuery = Query.fromAst(viewSnapshot.query.ast);\n const baseQuery = this._getBaseQuery(currentQuery);\n\n if (inMemorySort) {\n // Find the field to get its path\n const field = this._projection.getFields().find((f) => f.id === inMemorySort.fieldId);\n if (field) {\n // Persist sort to view.query.ast\n const newQuery = baseQuery.orderBy(Order.property<any>(field.path as string, inMemorySort.direction));\n Obj.change(view, (v) => {\n v.query.ast = newQuery.ast as Mutable<typeof newQuery.ast>;\n });\n }\n } else {\n // Clear sort from view.query.ast\n Obj.change(view, (v) => {\n v.query.ast = baseQuery.ast as Mutable<typeof baseQuery.ast>;\n });\n }\n\n // Clear in-memory sort since it's now persisted.\n this._registry.set(this._inMemorySort, undefined);\n }\n\n /**\n * Extracts the base query without order clauses.\n */\n private _getBaseQuery(query: Query.Any): Query.Any {\n const ast = query.ast;\n // If the query has an order clause, extract the inner query\n if (ast.type === 'order') {\n return Query.fromAst(ast.query);\n }\n return query;\n }\n\n /**\n * Checks if the view has unsaved changes (in-memory sort differs from persisted sort).\n */\n public getViewDirty(): boolean {\n return this._registry.get(this._viewDirty);\n }\n}\n\nconst editorTextToCellValue = (props: PropertyType, value: any): any => {\n switch (props.format) {\n case Format.TypeFormat.Ref: {\n if (Obj.isObject(value)) {\n return Ref.make(value);\n } else {\n return value;\n }\n }\n\n case Format.TypeFormat.SingleSelect: {\n const ids = extractTagIds(value);\n if (ids && ids.length > 0) {\n return ids[0];\n } else {\n return value;\n }\n }\n\n case Format.TypeFormat.MultiSelect: {\n const ids = extractTagIds(value);\n return ids || value;\n }\n\n default: {\n return parseValue({\n type: props.type,\n format: props.format,\n value,\n });\n }\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// TODO(ZaymonFC): Push this into the tag picker module.\n\n/**\n * Regex pattern for matching tags in the format [Label](id)\n */\nexport const TAG_PATTERN_REGEX = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\n/**\n * Extracts tag IDs from a string in the format [Label](id)\n * @param value The string to extract IDs from\n * @returns Array of extracted IDs or undefined if no matches or value is not a string\n */\nexport const extractTagIds = (value: unknown): string[] | undefined => {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const ids: string[] = [];\n let match;\n\n // Use the global regex to find all matches\n while ((match = TAG_PATTERN_REGEX.exec(value)) !== null) {\n if (match[2]) {\n ids.push(match[2]);\n }\n }\n\n return ids.length > 0 ? ids : undefined;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { Resource } from '@dxos/context';\n\nimport { type TableRow } from './table-model';\n\nexport type SelectionMode = 'single' | 'multiple';\n\nexport class SelectionModel<T extends TableRow> extends Resource {\n private readonly _registry: Registry.Registry;\n private readonly _rows: Atom.Atom<T[]>;\n private readonly _selection: Atom.Writable<Set<string>>;\n private readonly _validSelectedIds: Atom.Atom<Set<string>>;\n private readonly _hasSelection: Atom.Atom<boolean>;\n private readonly _allSelected: Atom.Atom<boolean>;\n private readonly _selectionMode: SelectionMode;\n private readonly _onSelectionChanged?: () => void;\n\n constructor(\n registry: Registry.Registry,\n rows: Atom.Atom<T[]>,\n selectionMode: SelectionMode,\n initialSelection: string[],\n onSelectionChanged?: () => void,\n ) {\n super();\n this._registry = registry;\n this._rows = rows;\n this._selectionMode = selectionMode;\n this._onSelectionChanged = onSelectionChanged;\n\n this._selection = Atom.make<Set<string>>(new Set(initialSelection));\n\n this._validSelectedIds = Atom.make((get) => {\n const rows = get(this._rows);\n if (!rows) {\n return new Set<string>();\n }\n\n const validIds = new Set(rows.map((row) => row.id));\n const selection = get(this._selection);\n return new Set([...selection].filter((id) => validIds.has(id)));\n });\n\n this._hasSelection = Atom.make((get) => get(this._validSelectedIds).size > 0);\n\n this._allSelected = Atom.make((get) => {\n const rows = get(this._rows);\n if (rows.length === 0) {\n return false;\n }\n\n const selection = get(this._selection);\n return rows.every((row) => selection.has(row.id));\n });\n }\n\n protected override async _open(): Promise<void> {\n const selectionUnsubscribe = this._registry.subscribe(this._selection, () => {\n this._onSelectionChanged?.();\n });\n this._ctx.onDispose(selectionUnsubscribe);\n }\n\n //\n // Getters\n //\n\n /** Get the selection atom for reactive access. */\n public get selectionAtom(): Atom.Atom<Set<string>> {\n return this._selection;\n }\n\n /** Get the current selection value. */\n public get selection(): Set<string> {\n return this._registry.get(this._selection);\n }\n\n /** Get the hasSelection atom for reactive access. */\n public get hasSelectionAtom(): Atom.Atom<boolean> {\n return this._hasSelection;\n }\n\n /** Check if there is any selection. */\n public get hasSelection(): boolean {\n return this._registry.get(this._hasSelection);\n }\n\n /** Get the allRowsSelected atom for reactive access. */\n public get allRowsSelectedAtom(): Atom.Atom<boolean> {\n return this._allSelected;\n }\n\n /** Check if all rows are selected. */\n public get allRowsSelected(): boolean {\n return this._registry.get(this._allSelected);\n }\n\n public get selectionMode(): SelectionMode {\n return this._selectionMode;\n }\n\n public getSelectedRows = (): T[] => {\n const selectedIds = this._registry.get(this._validSelectedIds);\n return this._registry.get(this._rows).filter((row) => selectedIds.has(row.id));\n };\n\n public isRowIndexSelected = (rowIndex: number): boolean => {\n const row = this._registry.get(this._rows)[rowIndex];\n return this._registry.get(this._selection).has(row.id);\n };\n\n public isObjectSelected = (object: T): boolean => {\n return this._registry.get(this._selection).has(object.id);\n };\n\n //\n // Manipulation\n //\n\n public toggleSelectionForRowIndex = (rowIndex: number): void => {\n const row = this._registry.get(this._rows)[rowIndex];\n const currentSelection = this._registry.get(this._selection);\n const newSelection = new Set(currentSelection);\n\n if (newSelection.has(row.id)) {\n newSelection.delete(row.id);\n } else {\n if (this._selectionMode === 'single') {\n newSelection.clear();\n }\n newSelection.add(row.id);\n }\n\n this._registry.set(this._selection, newSelection);\n };\n\n public setSelection = (mode: 'all' | 'none'): void => {\n switch (mode) {\n case 'all': {\n this._registry.set(this._selection, new Set(this._registry.get(this._rows).map((row) => row.id)));\n break;\n }\n case 'none': {\n this._registry.set(this._selection, new Set());\n break;\n }\n }\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Predicate from 'effect/Predicate';\n\nimport { Obj } from '@dxos/echo';\nimport { type View } from '@dxos/echo';\nimport { Format, TypeEnum, getValue } from '@dxos/echo/internal';\nimport { cellClassesForFieldType, formatForDisplay } from '@dxos/react-ui-form';\nimport {\n type DxGridCellValue,\n type DxGridPlane,\n type DxGridPlaneCells,\n type DxGridPlaneRange,\n toPlaneCellIndex,\n} from '@dxos/react-ui-grid';\nimport { VIEW_FIELD_LIMIT } from '@dxos/schema';\nimport { mx } from '@dxos/ui-theme';\n\nimport { tableButtons, tableControls } from '../util';\n\nimport { type SelectionMode } from './selection-model';\nimport { type TableModel, type TableRow } from './table-model';\n\n/**\n * Presentation layer for a table component, handling cell rendering and grid display logic.\n * Manages rendering of table cells, headers, selection columns, and action columns across\n * different grid planes.\n */\nexport class TablePresentation<T extends TableRow = TableRow> {\n private readonly _registry: Registry.Registry;\n private readonly _visibleRange: Atom.Writable<DxGridPlaneRange>;\n private fieldProjectionCache = new Map<string, ReturnType<typeof this.model.projection.getFieldProjection>>();\n\n constructor(\n registry: Registry.Registry,\n private readonly model: TableModel<T>,\n ) {\n this._registry = registry;\n this._visibleRange = Atom.make<DxGridPlaneRange>({\n start: { row: 0, col: 0 },\n end: { row: 0, col: 0 },\n });\n }\n\n public getCells(range: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells {\n // Clear cache at the start of each render pass\n this.fieldProjectionCache.clear();\n\n let cells: DxGridPlaneCells;\n\n switch (plane) {\n case 'grid':\n this._registry.set(this._visibleRange, range);\n cells = this.getMainGridCells(range);\n break;\n case 'frozenRowsStart':\n cells = this.getHeaderCells(range);\n break;\n case 'frozenColsStart':\n cells = this.getSelectionColumnCells(range);\n break;\n case 'frozenColsEnd':\n cells = this.getActionColumnCells(range);\n break;\n case 'fixedStartStart':\n cells = this.getSelectAllCell();\n break;\n case 'fixedStartEnd':\n cells = this.getNewColumnCell();\n break;\n case 'frozenRowsEnd':\n cells = this.getDraftRowCells(range);\n break;\n case 'fixedEndStart':\n cells = this.getDraftIconCells(range);\n break;\n case 'fixedEndEnd':\n cells = this.getDraftActionCells(range);\n break;\n default:\n cells = {};\n }\n\n if (plane === 'grid' && this.model.features.dataEditable === false) {\n Object.values<DxGridCellValue>(cells).forEach((cell) => {\n cell.readonly = 'text-select';\n });\n }\n\n return cells;\n }\n\n /**\n * Gets a field projection, using cache if available within the current render pass.\n */\n private getFieldProjection(fieldId: string) {\n let projection = this.fieldProjectionCache.get(fieldId);\n if (!projection) {\n projection = this.model.projection.getFieldProjection(fieldId);\n this.fieldProjectionCache.set(fieldId, projection);\n }\n return projection;\n }\n\n private createDataCell(\n cells: DxGridPlaneCells,\n obj: T,\n field: View.FieldType,\n colIndex: number,\n displayIndex: number,\n ): void {\n const { props } = this.getFieldProjection(field.id);\n\n const cell: DxGridCellValue = {\n get value() {\n const value = getValue(obj, field.path);\n if (value == null) {\n return '';\n }\n\n if (props.type === 'array') {\n return '';\n }\n\n switch (props.format) {\n case Format.TypeFormat.Boolean:\n case Format.TypeFormat.SingleSelect:\n case Format.TypeFormat.MultiSelect: {\n return '';\n }\n case Format.TypeFormat.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value.target, field.referencePath);\n }\n\n default: {\n return formatForDisplay({ type: props.type, format: props.format, value });\n }\n }\n },\n };\n\n const classes = [];\n const formatClasses = cellClassesForFieldType(props);\n\n if (formatClasses) {\n classes.push(formatClasses);\n }\n\n const rowSelectionClasses = cellClassesForRowSelection(\n this.model.selection.isObjectSelected(obj),\n this.model.selection.selectionMode,\n );\n\n if (rowSelectionClasses) {\n classes.push(rowSelectionClasses);\n }\n\n cell.className = mx(classes);\n\n // Arrays.\n if (props.type === TypeEnum.Array) {\n const targetArray = getValue(obj, field.path);\n if (targetArray && Array.isArray(targetArray)) {\n // TODO(ZaymonFC): For arrays of objects, objects should have a 'label' annotation on the field\n // that can be used to render tags.\n // TODO(ZaymonFC): Move to util.\n const getLabel = (value: any) => {\n // If the value is falsy, return undefined\n // If the object is an array, check for 'name' property\n // If the object is a primitive type (string, number, boolean) stringify\n // If the object is an array return 'Array'\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (Array.isArray(value)) {\n return 'Array';\n }\n if (typeof value === 'object' && value.name) {\n return value.name;\n }\n if (typeof value === 'object' && value.value) {\n return `${value.value}`;\n }\n return 'Object';\n };\n\n const tags = targetArray\n .map(getLabel)\n .filter(Predicate.isNotNullable)\n .map((title) => {\n return `<span class=\"dx-tag\" data-hue=\"neutral\">${title}</span>`;\n })\n .join('');\n\n cell.accessoryHtml = `<div role='none' class=\"flex flex-row gap-1 overflow-x-auto\">${tags}</div>`;\n }\n }\n\n // References.\n if (props.format === Format.TypeFormat.Ref && props.referenceSchema) {\n const targetObj = getValue(obj, field.path)?.target;\n if (targetObj) {\n const dxn = Obj.getDXN(targetObj)?.toString();\n cell.accessoryHtml = `<div role=\"none\" class=\"absolute end-0 inset-y-0 p-(--dx-grid-cell-content-padding-block)\"><dx-anchor dxn=${dxn} class=\"dx-button w-6 aspect-square min-h-0\" data-dx-grid-action=\"accessory\"><dx-icon icon=\"ph--link-simple--regular\"/></dx-anchor></div>`;\n }\n }\n\n // Booleans.\n if (props.format === Format.TypeFormat.Boolean) {\n const value = getValue(obj, field.path);\n cell.accessoryHtml = tableControls.switch.render({\n colIndex,\n rowIndex: displayIndex,\n checked: value ?? false,\n });\n cell.readonly = 'no-text-select';\n }\n\n // Single-Selects.\n if (props.format === Format.TypeFormat.SingleSelect) {\n const value = getValue(obj, field.path);\n const options = this.model.projection.getFieldProjection(field.id).props.options;\n if (options) {\n const option = options.find((o) => o.id === value);\n if (option) {\n cell.accessoryHtml = `<span class=\"dx-tag\" data-hue=\"${option.color}\">${option.title}</span>`;\n }\n }\n }\n\n // Multi-Selects.\n if (props.format === Format.TypeFormat.MultiSelect) {\n const values = getValue(obj, field.path) as string[] | undefined;\n const options = this.model.projection.getFieldProjection(field.id).props.options;\n if (options && values && values.length > 0) {\n const tags = values\n .map((value) => {\n const option = options.find((o) => o.id === value);\n if (option) {\n return `<span class=\"dx-tag\" data-hue=\"${option.color}\">${option.title}</span>`;\n }\n return null;\n })\n .filter(Boolean)\n .join('');\n\n if (tags) {\n cell.accessoryHtml = tags;\n }\n }\n }\n\n const idx = toPlaneCellIndex({ col: colIndex, row: displayIndex });\n cells[idx] = cell;\n }\n\n private getMainGridCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const fields = this.model.projection?.getFields() ?? [];\n\n for (let row = range.start.row; row <= range.end.row && row < this.model.getRowCount(); row++) {\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const field = fields[col];\n if (!field) {\n continue;\n }\n\n this.createDataCell(cells, this.model.getRows()[row], field, col, row);\n }\n }\n\n return cells;\n }\n\n private getDraftRowCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const fields = this.model.projection?.getFields() ?? [];\n const draftRows = this.model.getDraftRows();\n\n // Return cells of the CTA row if no draft row is active\n if (draftRows.length === 0) {\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n cells[toPlaneCellIndex({ col, row: 0 })] = {\n value: '',\n readonly: true,\n className: 'dx-grid__row--cta__cell',\n };\n }\n } else {\n for (let row = range.start.row; row <= range.end.row && row < draftRows.length; row++) {\n const draftRow = draftRows[row];\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const cellIndex = toPlaneCellIndex({ col, row });\n const field = fields[col];\n if (!field) {\n continue;\n }\n\n this.createDataCell(cells, draftRow.data, field, col, row);\n\n if (this.model.hasDraftRowValidationError(row, field.path)) {\n const cellValue = cells[cellIndex];\n if (cellValue) {\n const existingClasses = cellValue.className || '';\n const draftClasses = 'dx-grid__cell--flagged';\n cellValue.className = existingClasses ? `${existingClasses} ${draftClasses}` : draftClasses;\n }\n }\n }\n }\n }\n\n return cells;\n }\n\n private getHeaderCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const fields = this.model.projection?.getFields() ?? [];\n const currentSort = this.model.getSorting();\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const { field, props } = this.model.projection.getFieldProjection(fields[col].id);\n const direction = currentSort?.fieldId === field.id ? currentSort.direction : undefined;\n\n cells[toPlaneCellIndex({ col, row: 0 })] = {\n // TODO(burdon): Use same logic as form for fallback title.\n value: '',\n resizeHandle: 'col',\n accessoryHtml: `\n <span class=\"grow min-w-0 truncate\">${props.title ?? field.path}</span>\n ${direction !== undefined ? tableButtons.sort.render({ fieldId: field.id, direction }) : ''}\n ${tableButtons.columnSettings.render({ fieldId: field.id })}\n `,\n className: '!bg-toolbar-surface text-description! [&>div]:flex [&>div]:items-stretch',\n };\n }\n\n return cells;\n }\n\n private getSelectionColumnCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < this.model.getRowCount(); row++) {\n const isSelected = this.model.selection.isRowIndexSelected(row);\n const classes = cellClassesForRowSelection(isSelected, this.model.selection.selectionMode);\n cells[toPlaneCellIndex({ col: 0, row })] = {\n value: '',\n readonly: 'no-text-select',\n className: classes ? mx(classes) : undefined,\n accessoryHtml: tableControls.checkbox.render({ rowIndex: row, checked: isSelected }),\n };\n }\n\n return cells;\n }\n\n private getActionColumnCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < this.model.getRowCount(); row++) {\n const isSelected = this.model.selection.isRowIndexSelected(row);\n const classes = cellClassesForRowSelection(isSelected, this.model.selection.selectionMode);\n cells[toPlaneCellIndex({ col: 0, row })] = {\n value: '',\n readonly: true,\n className: classes ? mx(classes) : undefined,\n accessoryHtml: tableButtons.rowMenu.render({ rowIndex: row }),\n };\n }\n\n return cells;\n }\n\n private getSelectAllCell(): DxGridPlaneCells {\n if (!this.model.features.selection.enabled || this.model.selection.selectionMode === 'single') {\n return {\n [toPlaneCellIndex({ col: 0, row: 0 })]: {\n className: '!bg-toolbar-surface',\n readonly: true,\n value: '',\n },\n };\n }\n\n return {\n [toPlaneCellIndex({ col: 0, row: 0 })]: {\n accessoryHtml: tableControls.checkbox.render({\n rowIndex: 0,\n header: true,\n checked: this.model.selection.allRowsSelected,\n }),\n className: '!bg-toolbar-surface',\n readonly: true,\n value: '',\n },\n };\n }\n\n private getNewColumnCell(): DxGridPlaneCells {\n return {\n [toPlaneCellIndex({ col: 0, row: 0 })]: {\n accessoryHtml: this.model.features.schemaEditable\n ? tableButtons.addColumn.render({\n disabled: (this.model.projection?.getFields()?.length ?? 0) >= VIEW_FIELD_LIMIT,\n })\n : undefined,\n className: '!bg-toolbar-surface',\n readonly: true,\n value: '',\n },\n };\n }\n\n private getDraftActionCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const draftRows = this.model.getDraftRows();\n\n // Return cells of the CTA row if no draft row is active\n if (draftRows.length === 0) {\n cells[toPlaneCellIndex({ col: 0, row: 0 })] = {\n value: '',\n className: 'dx-grid__row--cta__cell',\n readonly: true,\n };\n } else {\n for (let row = range.start.row; row <= range.end.row && row < draftRows.length; row++) {\n const draftRow = draftRows[row];\n const disabled = !draftRow.valid;\n\n cells[toPlaneCellIndex({ col: 0, row })] = {\n value: '',\n readonly: true,\n accessoryHtml: tableButtons.saveDraftRow.render({ rowIndex: row, disabled }),\n };\n }\n }\n\n return cells;\n }\n\n private getDraftIconCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const draftRows = this.model.getDraftRows();\n\n for (let row = range.start.row; row <= range.end.row; row++) {\n cells[toPlaneCellIndex({ col: 0, row })] = {\n value: '',\n readonly: true,\n accessoryHtml: '<dx-icon icon=\"ph--plus--regular\" class=\"contents\"></dx-icon>',\n className: mx('[&>div]:grid [&>div]:place-content-center', draftRows.length < 1 && 'dx-grid__row--cta__cell'),\n };\n }\n\n return cells;\n }\n}\n\nexport const cellClassesForRowSelection = (selected: boolean, selectionMode: SelectionMode) => {\n if (!selected) {\n if (selectionMode === 'single') {\n return ['cursor-pointer!'];\n } else {\n return undefined;\n }\n }\n\n switch (selectionMode) {\n case 'single':\n return ['dx-grid__cell--no-focus-unfurl !bg-current-surface hover:bg-hover-surface cursor-pointer!'];\n case 'multiple':\n return ['!bg-grid-cell-selected'];\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { type Database, Obj, type Type } from '@dxos/echo';\n\nimport { type InsertRowResult } from '../model';\n\nexport type UseAddRowProps = {\n db?: Database.Database;\n schema?: Type.AnyObj;\n};\n\n/**\n * Hook that provides a safe row creation function that handles schema validation failures.\n * Returns a callback that attempts to create an object and returns boolean success/failure.\n * Can accept optional data to create objects with specific content (used for committing draft rows).\n */\nexport const useAddRow = ({ db, schema }: UseAddRowProps) => {\n return useCallback(\n (data?: any): InsertRowResult => {\n if (db && schema) {\n try {\n db.add(Obj.make(schema, data ?? {}));\n return 'final';\n } catch (error) {\n return 'draft';\n }\n }\n return 'final';\n },\n [db, schema],\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Registry } from '@effect-atom/atom-react';\nimport { useState } from 'react';\n\nimport { JsonSchema, Type } from '@dxos/echo';\nimport { useAsyncEffect } from '@dxos/react-ui';\nimport { ProjectionModel, createEchoChangeCallback } from '@dxos/schema';\n\nimport { type Table } from '../types';\n\nexport const useProjectionModel = <S extends Type.AnyEntity>(\n schema: S | undefined,\n table: Table.Table | undefined,\n registry: Registry.Registry,\n) => {\n const [projection, setProjection] = useState<ProjectionModel | undefined>();\n\n useAsyncEffect(async () => {\n if (schema && table) {\n const view = await table.view.load();\n // For mutable schemas (EchoSchema), use the live jsonSchema reference for reactivity.\n // For immutable schemas, create a snapshot.\n const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);\n\n // Always use createEchoChangeCallback since the view is ECHO-backed.\n // Pass schema only when mutable to allow schema mutations.\n const change = createEchoChangeCallback(view, Type.isMutable(schema) ? schema : undefined);\n\n const projection = new ProjectionModel({ registry, view, baseSchema: jsonSchema, change });\n projection.normalizeView();\n setProjection(projection);\n }\n }, [schema, table, registry]);\n\n return projection;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport { useContext, useEffect, useMemo, useState } from 'react';\n\nimport { type Database, Obj } from '@dxos/echo';\nimport { useSelected, useSelectionActions } from '@dxos/react-ui-attention';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n TableModel,\n type TableModelProps,\n type TableRow,\n type TableRowAction,\n createEchoChangeCallback,\n} from '../model';\nimport { type Table } from '../types';\n\nexport type UseTableModelProps<T extends TableRow = TableRow> = {\n object?: Table.Table;\n projection?: ProjectionModel;\n db?: Database.Database;\n rows?: T[];\n rowActions?: TableRowAction[];\n onSelectionChanged?: (selection: string[]) => void;\n onRowAction?: (actionId: string, data: T) => void;\n} & Pick<\n TableModelProps<T>,\n 'features' | 'onInsertRow' | 'onDeleteRows' | 'onColumnDelete' | 'onCellUpdate' | 'onRowOrderChange'\n>;\n\nexport const useTableModel = <T extends TableRow = TableRow>({\n object,\n projection,\n db,\n rows,\n rowActions,\n features,\n onSelectionChanged,\n onRowAction,\n ...props\n}: UseTableModelProps<T>): TableModel<T> | undefined => {\n const registry = useContext(RegistryContext);\n const selected = useSelected(object && Obj.getDXN(object).toString(), 'multi');\n const initialSelection = useMemo(() => selected, [object]);\n\n const [model, setModel] = useState<TableModel<T>>();\n useEffect(() => {\n if (!object || !projection) {\n return;\n }\n\n let model: TableModel<T> | undefined;\n const t = setTimeout(async () => {\n model = new TableModel<T>({\n registry,\n object,\n projection,\n db,\n change: createEchoChangeCallback<T>(object),\n features,\n rowActions,\n initialSelection,\n onRowAction,\n ...props,\n });\n await model.open();\n setModel(model);\n });\n\n return () => {\n clearTimeout(t);\n void model?.close();\n };\n // TODO(burdon): Trigger if callbacks change?\n }, [registry, object, projection, features, rowActions, initialSelection]);\n\n // Update data when rows change.\n useEffect(() => {\n if (rows && model) {\n model.setRows(rows);\n }\n }, [model, rows]);\n\n const { multiSelect, clear } = useSelectionActions([model?.id].filter(isNonNullable));\n\n useEffect(() => {\n if (!model) {\n return;\n }\n\n const unsubscribe = registry.subscribe(model.selection.selectionAtom, () => {\n const selectedItems = [...model.selection.selection];\n multiSelect(selectedItems);\n onSelectionChanged?.(selectedItems);\n });\n\n // Maybe clear the selection here?\n return () => {\n clear();\n unsubscribe();\n };\n }, [registry, model, onSelectionChanged]);\n\n return model;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["extractOrder", "queryAst", "type", "order", "query", "undefined", "Format", "getSortValue", "value", "format", "undefined", "isDateFormat", "Format", "TypeFormat", "DateTime", "Date", "date", "isNaN", "getTime", "String", "Number", "Integer", "Currency", "Percent", "Duration", "num", "compareValues", "aValue", "bValue", "direction", "aSortValue", "bSortValue", "comparison", "localeCompare", "BUTTON_IDENTIFIERS", "columnSettings", "newColumn", "referencedCell", "rowMenu", "saveDraftRow", "sort", "createButton", "attr", "data", "disabled", "icon", "testId", "type", "_type", "dataAttrs", "Object", "entries", "map", "k", "v", "join", "addColumnButton", "render", "getData", "_el", "columnSettingsButton", "fieldId", "el", "getAttribute", "rowMenuButton", "rowIndex", "toString", "Number", "sortButton", "direction", "saveDraftRowButton", "tableButtons", "addColumn", "accessoryHandlesPointerdownAttrs", "CONTROL_IDENTIFIERS", "checkbox", "switch", "BASE_CLASSES", "renderAttributes", "data", "Object", "entries", "map", "k", "v", "join", "renderInput", "baseClass", "attrs", "checked", "disabled", "preventToggle", "testId", "CheckboxStory", "rowIndex", "header", "toString", "SwitchStory", "colIndex", "accessoryHandlesPointerdownAttrs", "tableControls", "attr", "render", "getData", "el", "type", "Number", "getAttribute", "hasAttribute", "Atom", "Resource", "Format", "Obj", "Order", "Query", "Ref", "toEffectSchema", "getSnapshot", "getValue", "setValue", "invariant", "ObjectId", "formatForEditing", "parseValue", "validateSchema", "TAG_PATTERN_REGEX", "extractTagIds", "value", "undefined", "ids", "match", "exec", "push", "length", "Atom", "Resource", "SelectionModel", "Resource", "_registry", "_rows", "_selection", "_validSelectedIds", "_hasSelection", "_allSelected", "_selectionMode", "_onSelectionChanged", "registry", "rows", "selectionMode", "initialSelection", "onSelectionChanged", "Atom", "make", "Set", "get", "validIds", "map", "row", "id", "selection", "filter", "has", "size", "length", "every", "_open", "selectionUnsubscribe", "subscribe", "_ctx", "onDispose", "selectionAtom", "hasSelectionAtom", "hasSelection", "allRowsSelectedAtom", "allRowsSelected", "getSelectedRows", "selectedIds", "isRowIndexSelected", "rowIndex", "isObjectSelected", "object", "toggleSelectionForRowIndex", "currentSelection", "newSelection", "delete", "clear", "add", "set", "setSelection", "mode", "createEchoChangeCallback", "table", "mutate", "Obj", "change", "mutableTable", "row", "isObject", "mutableRow", "createDirectChangeCallback", "defaultFeatures", "selection", "enabled", "mode", "dataEditable", "schemaEditable", "TableModel", "Resource", "_registry", "_object", "_projection", "_db", "_change", "_visibleRange", "_onInsertRow", "_onDeleteRows", "_onColumnDelete", "_onCellUpdate", "_onRowOrderChange", "_onRowAction", "_rowActions", "_features", "_rows", "_draftRows", "_inMemorySort", "_persistedSort", "_sorting", "_sortedRows", "_viewDirty", "_pinnedRows", "_selection", "_columnMeta", "_cellUpdateCounter", "registry", "object", "projection", "db", "features", "initialSelection", "pinnedRows", "top", "bottom", "rowActions", "onCellUpdate", "onColumnDelete", "onDeleteRows", "onInsertRow", "onRowOrderChange", "onRowAction", "normalizeView", "invariant", "Atom", "make", "start", "col", "end", "undefined", "_get", "viewSnapshot", "getSnapshot", "view", "ast", "query", "orders", "extractOrder", "length", "firstOrder", "kind", "field", "getFields", "find", "f", "path", "property", "fieldId", "id", "direction", "get", "inMemorySort", "rows", "sort", "fieldProjection", "getFieldProjection", "sorted", "a", "b", "aValue", "getValue", "bValue", "compareValues", "props", "format", "SelectionModel", "persisted", "getDXN", "toString", "target", "getRows", "cellUpdate", "changeRow", "getSorting", "getRowAt", "displayIndex", "sortedRows", "columnMeta", "_open", "load", "initializeColumnMeta", "initializeEffects", "open", "_ctx", "fields", "meta", "Object", "fromEntries", "map", "index", "size", "sizes", "resizeable", "grid", "frozenColsStart", "frozenColsEnd", "rowsUnsubscribe", "subscribe", "onDispose", "rowSubscriptions", "Map", "visibleRangeUnsubscribe", "unsub", "delete", "obj", "has", "set", "plane", "values", "draftRowsUnsubscribe", "setRows", "getRowCount", "getDraftRowCount", "draftRows", "getDraftRows", "hasDraftRowValidationError", "draftRowIndex", "fieldPath", "draftRow", "validationErrors", "some", "error", "getColumnCount", "insertRow", "result", "createDraftRow", "draftData", "ObjectId", "random", "validateDraftRowData", "data", "valid", "validateDraftRow", "updatedDraftRow", "newDraftRows", "schema", "toEffectSchema", "baseSchema", "validateSchema", "commitDraftRow", "insertRowResult", "filter", "_", "deleteRow", "rowIndex", "objectsToDelete", "hasSelection", "selectedRows", "getSelectedRows", "push", "handleRowAction", "actionId", "getCellData", "cell", "value", "Format", "TypeFormat", "Ref", "referencePath", "formatForEditing", "type", "validateCellData", "transformedValue", "editorTextToCellValue", "isDraftRow", "isInvalidDraftRowIndex", "snapshot", "setValue", "err", "message", "currentRow", "getSchema", "validationResult", "setCellData", "rowData", "updateCellData", "update", "updatedValue", "getCellType", "isDraftCell", "deleteColumn", "setColumnWidth", "columnIndex", "width", "newWidth", "Math", "max", "pinRow", "side", "unpinRow", "setSort", "toggleSort", "currentSort", "newDirection", "clearSort", "saveView", "currentQuery", "Query", "fromAst", "baseQuery", "_getBaseQuery", "newQuery", "orderBy", "Order", "v", "getViewDirty", "SingleSelect", "ids", "extractTagIds", "MultiSelect", "parseValue", "Atom", "Predicate", "Obj", "Format", "TypeEnum", "getValue", "cellClassesForFieldType", "formatForDisplay", "toPlaneCellIndex", "VIEW_FIELD_LIMIT", "mx", "TablePresentation", "_registry", "_visibleRange", "fieldProjectionCache", "Map", "registry", "model", "Atom", "make", "start", "row", "col", "end", "getCells", "range", "plane", "clear", "cells", "set", "getMainGridCells", "getHeaderCells", "getSelectionColumnCells", "getActionColumnCells", "getSelectAllCell", "getNewColumnCell", "getDraftRowCells", "getDraftIconCells", "getDraftActionCells", "features", "dataEditable", "Object", "values", "forEach", "cell", "readonly", "getFieldProjection", "fieldId", "projection", "get", "createDataCell", "obj", "field", "colIndex", "displayIndex", "props", "id", "value", "getValue", "path", "type", "format", "Format", "TypeFormat", "Boolean", "SingleSelect", "MultiSelect", "Ref", "referencePath", "target", "formatForDisplay", "classes", "formatClasses", "cellClassesForFieldType", "push", "rowSelectionClasses", "cellClassesForRowSelection", "selection", "isObjectSelected", "selectionMode", "className", "mx", "TypeEnum", "Array", "targetArray", "isArray", "getLabel", "undefined", "String", "name", "tags", "map", "filter", "isNotNullable", "title", "join", "accessoryHtml", "referenceSchema", "targetObj", "dxn", "Obj", "getDXN", "toString", "tableControls", "switch", "render", "rowIndex", "checked", "options", "option", "find", "o", "color", "length", "idx", "toPlaneCellIndex", "fields", "getFields", "getRowCount", "getRows", "draftRows", "getDraftRows", "draftRow", "cellIndex", "data", "hasDraftRowValidationError", "cellValue", "existingClasses", "draftClasses", "currentSort", "getSorting", "direction", "resizeHandle", "tableButtons", "sort", "columnSettings", "isSelected", "isRowIndexSelected", "checkbox", "rowMenu", "enabled", "header", "allRowsSelected", "schemaEditable", "addColumn", "disabled", "VIEW_FIELD_LIMIT", "valid", "saveDraftRow", "selected", "useCallback", "Obj", "useAddRow", "db", "schema", "useCallback", "data", "add", "Obj", "make", "error", "useState", "JsonSchema", "Type", "useAsyncEffect", "ProjectionModel", "createEchoChangeCallback", "useProjectionModel", "schema", "table", "registry", "projection", "setProjection", "useState", "useAsyncEffect", "view", "load", "jsonSchema", "Type", "isMutable", "JsonSchema", "toJsonSchema", "change", "createEchoChangeCallback", "undefined", "ProjectionModel", "baseSchema", "normalizeView", "RegistryContext", "useContext", "useEffect", "useMemo", "useState", "Obj", "useSelected", "useSelectionActions", "isNonNullable", "useTableModel", "object", "projection", "db", "rows", "rowActions", "features", "onSelectionChanged", "onRowAction", "props", "registry", "useContext", "RegistryContext", "selected", "useSelected", "Obj", "getDXN", "toString", "initialSelection", "useMemo", "model", "setModel", "useState", "useEffect", "t", "setTimeout", "TableModel", "change", "createEchoChangeCallback", "open", "clearTimeout", "close", "setRows", "multiSelect", "clear", "useSelectionActions", "id", "filter", "isNonNullable", "unsubscribe", "subscribe", "selection", "selectionAtom", "selectedItems"]
|
|
7
|
+
}
|