@dxos/react-ui-table 0.7.1 → 0.7.2-main.f1adc9f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/lib/browser/{chunk-A5W4XWPD.mjs → chunk-EUQZHWXM.mjs} +10 -6
  2. package/dist/lib/browser/chunk-EUQZHWXM.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +29 -15
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +3 -1
  7. package/dist/lib/node/{chunk-32IGMRME.cjs → chunk-OM65ZSS6.cjs} +14 -9
  8. package/dist/lib/node/chunk-OM65ZSS6.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +30 -16
  10. package/dist/lib/node/index.cjs.map +3 -3
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/types/index.cjs +4 -2
  13. package/dist/lib/node/types/index.cjs.map +2 -2
  14. package/dist/lib/node-esm/{chunk-DWQ4KGLD.mjs → chunk-U6VD6VZ4.mjs} +10 -6
  15. package/dist/lib/node-esm/chunk-U6VD6VZ4.mjs.map +7 -0
  16. package/dist/lib/node-esm/index.mjs +29 -15
  17. package/dist/lib/node-esm/index.mjs.map +3 -3
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/types/index.mjs +3 -1
  20. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts.map +1 -1
  21. package/dist/types/src/components/Table/RowActionsMenu.d.ts.map +1 -1
  22. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  23. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/testing.d.ts +3 -2
  25. package/dist/types/src/components/testing.d.ts.map +1 -1
  26. package/dist/types/src/model/table-model.d.ts.map +1 -1
  27. package/dist/types/src/playwright/TableManager.d.ts +17 -0
  28. package/dist/types/src/playwright/TableManager.d.ts.map +1 -0
  29. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  30. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  31. package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
  32. package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
  33. package/dist/types/src/types/table.d.ts +60 -7
  34. package/dist/types/src/types/table.d.ts.map +1 -1
  35. package/dist/types/src/util/grid.d.ts +3 -3
  36. package/dist/types/src/util/grid.d.ts.map +1 -1
  37. package/dist/types/src/util/table-buttons.d.ts.map +1 -1
  38. package/dist/types/src/util/table.d.ts +5 -2
  39. package/dist/types/src/util/table.d.ts.map +1 -1
  40. package/package.json +38 -39
  41. package/src/_deprecated/components/ColumnMenu/ColumnMenu.stories.tsx +1 -1
  42. package/src/_deprecated/components/ColumnMenu/ColumnSettings.stories.tsx +1 -1
  43. package/src/_deprecated/components/Table/Table.stories.tsx +1 -1
  44. package/src/components/Table/ColumnActionsMenu.tsx +11 -6
  45. package/src/components/Table/ColumnSettings.tsx +2 -2
  46. package/src/components/Table/RowActionsMenu.tsx +2 -3
  47. package/src/components/Table/Table.stories.tsx +6 -4
  48. package/src/components/Table/Table.tsx +2 -3
  49. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +1 -1
  50. package/src/model/table-model.ts +1 -0
  51. package/src/playwright/TableManager.ts +60 -0
  52. package/src/playwright/playwright.config.ts +18 -0
  53. package/src/playwright/smoke.spec.ts +105 -0
  54. package/src/types/table.ts +13 -3
  55. package/src/util/grid.ts +3 -3
  56. package/src/util/table-buttons.ts +9 -4
  57. package/src/util/table-controls.ts +1 -1
  58. package/src/util/table.ts +11 -3
  59. package/dist/lib/browser/chunk-A5W4XWPD.mjs.map +0 -7
  60. package/dist/lib/node/chunk-32IGMRME.cjs.map +0 -7
  61. package/dist/lib/node-esm/chunk-DWQ4KGLD.mjs.map +0 -7
@@ -2,17 +2,21 @@
2
2
  import { ref, S, TypedObject } from "@dxos/echo-schema";
3
3
  import { ThreadType } from "@dxos/plugin-space";
4
4
  import { ViewType } from "@dxos/schema";
5
+ var TableSchema = S.Struct({
6
+ id: S.String,
7
+ name: S.optional(S.String),
8
+ view: S.optional(ref(ViewType)),
9
+ // TODO(burdon): Should not import from plugin. Either factor out type or use reverse deps when supported.
10
+ threads: S.optional(S.Array(ref(ThreadType)))
11
+ });
5
12
  var TableType = class extends TypedObject({
6
13
  typename: "dxos.org/type/Table",
7
14
  version: "0.1.0"
8
- })({
9
- name: S.optional(S.String),
10
- view: S.optional(ref(ViewType)),
11
- threads: S.optional(S.mutable(S.Array(ref(ThreadType))))
12
- }) {
15
+ })(TableSchema.fields) {
13
16
  };
14
17
 
15
18
  export {
19
+ TableSchema,
16
20
  TableType
17
21
  };
18
- //# sourceMappingURL=chunk-A5W4XWPD.mjs.map
22
+ //# sourceMappingURL=chunk-EUQZHWXM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/table.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\nimport { ThreadType } from '@dxos/plugin-space';\nimport { ViewType } from '@dxos/schema';\n\nexport const TableSchema = S.Struct({\n id: S.String,\n name: S.optional(S.String),\n view: S.optional(ref(ViewType)),\n // TODO(burdon): Should not import from plugin. Either factor out type or use reverse deps when supported.\n threads: S.optional(S.Array(ref(ThreadType))),\n});\n\n// type TableType = S.ClassType<typeof TableSchema>;\n\n// TODO(burdon): UX should not depend on ECHO types.\nexport class TableType extends TypedObject({\n typename: 'dxos.org/type/Table',\n version: '0.1.0',\n})(TableSchema.fields) {}\n"],
5
+ "mappings": ";AAIA,SAASA,KAAKC,GAAGC,mBAAmB;AACpC,SAASC,kBAAkB;AAC3B,SAASC,gBAAgB;AAElB,IAAMC,cAAcC,EAAEC,OAAO;EAClCC,IAAIF,EAAEG;EACNC,MAAMJ,EAAEK,SAASL,EAAEG,MAAM;EACzBG,MAAMN,EAAEK,SAASE,IAAIC,QAAAA,CAAAA;;EAErBC,SAAST,EAAEK,SAASL,EAAEU,MAAMH,IAAII,UAAAA,CAAAA,CAAAA;AAClC,CAAA;AAKO,IAAMC,YAAN,cAAwBC,YAAY;EACzCC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGhB,YAAYiB,MAAM,EAAA;AAAG;",
6
+ "names": ["ref", "S", "TypedObject", "ThreadType", "ViewType", "TableSchema", "S", "Struct", "id", "String", "name", "optional", "view", "ref", "ViewType", "threads", "Array", "ThreadType", "TableType", "TypedObject", "typename", "version", "fields"]
7
+ }
@@ -1,6 +1,7 @@
1
1
  import {
2
+ TableSchema,
2
3
  TableType
3
- } from "./chunk-A5W4XWPD.mjs";
4
+ } from "./chunk-EUQZHWXM.mjs";
4
5
 
5
6
  // packages/ui/react-ui-table/src/translations.ts
6
7
  var translationKey = "table";
@@ -60,14 +61,19 @@ var ColumnActionsMenu = ({ model }) => {
60
61
  }, /* @__PURE__ */ React.createElement(DropdownMenu.VirtualTrigger, {
61
62
  virtualRef: model.modalController.trigger
62
63
  }), /* @__PURE__ */ React.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React.createElement(DropdownMenu.Content, null, /* @__PURE__ */ React.createElement(DropdownMenu.Viewport, null, (!isCurrentColumnSorted || currentSort?.direction === "asc") && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
64
+ "data-testid": "column-sort-descending",
63
65
  onClick: () => model.setSort(state.fieldId, "desc")
64
66
  }, t("column action sort descending")), (!isCurrentColumnSorted || currentSort?.direction === "desc") && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
67
+ "data-testid": "column-sort-ascending",
65
68
  onClick: () => model.setSort(state.fieldId, "asc")
66
69
  }, t("column action sort ascending")), isCurrentColumnSorted && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
70
+ "data-testid": "column-clear-sort",
67
71
  onClick: () => model.clearSort()
68
72
  }, t("column action clear sorting")), model.getColumnCount() > 1 && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
73
+ "data-testid": "column-delete",
69
74
  onClick: () => model.deleteColumn(state.fieldId)
70
75
  }, t("column action delete")), /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
76
+ "data-testid": "column-settings",
71
77
  onClick: () => model.modalController.openColumnSettings()
72
78
  }, t("column action settings"))), /* @__PURE__ */ React.createElement(DropdownMenu.Arrow, null))));
73
79
  };
@@ -104,7 +110,7 @@ var ColumnSettings = ({ model }) => {
104
110
  state
105
111
  ]);
106
112
  const field = existingField ?? newField;
107
- const handleClose = useCallback(() => {
113
+ const handleSave = useCallback(() => {
108
114
  model?.modalController.close();
109
115
  }, [
110
116
  model?.modalController
@@ -133,7 +139,7 @@ var ColumnSettings = ({ model }) => {
133
139
  projection: model.projection,
134
140
  field,
135
141
  registry: space?.db.schemaRegistry,
136
- onClose: handleClose,
142
+ onSave: handleSave,
137
143
  onCancel: handleCancel
138
144
  })), /* @__PURE__ */ React2.createElement(DropdownMenu2.Arrow, null))));
139
145
  };
@@ -143,8 +149,8 @@ import React3 from "react";
143
149
  import { DropdownMenu as DropdownMenu3, useTranslation as useTranslation2 } from "@dxos/react-ui";
144
150
  var RowActionsMenu = ({ model }) => {
145
151
  const { t } = useTranslation2(translationKey);
146
- const state = model.modalController.state.value;
147
152
  const hasSelection = model.selection.hasSelection.value;
153
+ const state = model.modalController.state.value;
148
154
  if (state?.type !== "row") {
149
155
  return null;
150
156
  }
@@ -155,6 +161,7 @@ var RowActionsMenu = ({ model }) => {
155
161
  }, /* @__PURE__ */ React3.createElement(DropdownMenu3.VirtualTrigger, {
156
162
  virtualRef: model.modalController.trigger
157
163
  }), /* @__PURE__ */ React3.createElement(DropdownMenu3.Content, null, /* @__PURE__ */ React3.createElement(DropdownMenu3.Viewport, null, /* @__PURE__ */ React3.createElement(DropdownMenu3.Item, {
164
+ "data-testid": "row-menu-delete",
158
165
  onClick: () => model.deleteRow(state.rowIndex)
159
166
  }, t(hasSelection ? "bulk delete row label" : "delete row label"))), /* @__PURE__ */ React3.createElement(DropdownMenu3.Arrow, null)));
160
167
  };
@@ -225,12 +232,12 @@ import { PublicKey } from "@dxos/react-client";
225
232
  import { create } from "@dxos/react-client/echo";
226
233
  import { createFieldId, createView, ViewProjection } from "@dxos/schema";
227
234
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/util/table.ts";
228
- var initializeTable = ({ space, table }) => {
235
+ var initializeTable = ({ space, table, initialRow = true }) => {
229
236
  log.info("initializeTable", {
230
237
  table
231
238
  }, {
232
239
  F: __dxlog_file,
233
- L: 26,
240
+ L: 32,
234
241
  S: void 0,
235
242
  C: (f, a) => f(...a)
236
243
  });
@@ -279,7 +286,9 @@ var initializeTable = ({ space, table }) => {
279
286
  title: "Manager"
280
287
  }
281
288
  });
282
- space.db.add(create(contactSchema, {}));
289
+ if (initialRow) {
290
+ space.db.add(create(contactSchema, {}));
291
+ }
283
292
  return contactSchema;
284
293
  };
285
294
 
@@ -294,9 +303,9 @@ var ICONS = {
294
303
  rowMenu: "ph--dots-three--regular",
295
304
  newColumn: "ph--plus--regular"
296
305
  };
297
- var createButtonHtml = ({ button, value = "", disabled = false }) => {
306
+ var createButtonHtml = ({ button, value = "", disabled = false, testId }) => {
298
307
  const buttonClasses = "ch-button is-6 pli-0.5 min-bs-0 absolute inset-block-1 inline-end-2";
299
- return `<button class="${buttonClasses}" ${TABLE_ATTRS[button]}="${value}" ${disabled ? "disabled" : ""}><svg><use href="/icons.svg#${ICONS[button]}"/></svg></button>`;
308
+ return `<button class="${buttonClasses}" ${TABLE_ATTRS[button]}="${value}" data-testid="${testId}" ${disabled ? "disabled" : ""}><svg><use href="/icons.svg#${ICONS[button]}"/></svg></button>`;
300
309
  };
301
310
  var tableButtons = {
302
311
  columnSettings: {
@@ -304,7 +313,8 @@ var tableButtons = {
304
313
  icon: ICONS.columnSettings,
305
314
  render: ({ fieldId }) => createButtonHtml({
306
315
  button: "columnSettings",
307
- value: fieldId
316
+ value: fieldId,
317
+ testId: "table-column-settings-button"
308
318
  })
309
319
  },
310
320
  rowMenu: {
@@ -312,7 +322,8 @@ var tableButtons = {
312
322
  icon: ICONS.rowMenu,
313
323
  render: ({ rowIndex }) => createButtonHtml({
314
324
  button: "rowMenu",
315
- value: rowIndex.toString()
325
+ value: rowIndex.toString(),
326
+ testId: "table-row-menu-button"
316
327
  })
317
328
  },
318
329
  addColumn: {
@@ -320,7 +331,8 @@ var tableButtons = {
320
331
  icon: ICONS.newColumn,
321
332
  render: ({ disabled } = {}) => createButtonHtml({
322
333
  button: "newColumn",
323
- disabled
334
+ disabled,
335
+ testId: "table-new-column-button"
324
336
  })
325
337
  }
326
338
  };
@@ -471,7 +483,7 @@ var frozen = {
471
483
  var TableRoot = ({ children, role }) => {
472
484
  return /* @__PURE__ */ React5.createElement("div", {
473
485
  role: "none",
474
- className: mx("relative border-bs !border-separator", role === "section" ? "attention-surface overflow-hidden [&_.dx-grid]:max-is-max" : "flex flex-col [&_.dx-grid]:grow [&_.dx-grid]:max-is-max [&_.dx-grid]:bs-0 [&_.dx-grid]:max-bs-max")
486
+ className: mx("relative border-bs !border-separator", role === "section" ? "attention-surface overflow-hidden [&_.dx-grid]:max-is-[--dx-grid-content-inline-size]" : "flex flex-col [&_.dx-grid]:grow [&_.dx-grid]:max-is-[--dx-grid-content-inline-size] [&_.dx-grid]:bs-0 [&_.dx-grid]:max-bs-[--dx-grid-content-block-size]")
475
487
  }, children);
476
488
  };
477
489
  var TableMain = /* @__PURE__ */ forwardRef(({ model, ignoreAttention }, forwardedRef) => {
@@ -541,7 +553,7 @@ var TableMain = /* @__PURE__ */ forwardRef(({ model, ignoreAttention }, forwarde
541
553
  const space = getSpace2(model.table);
542
554
  invariant2(space, void 0, {
543
555
  F: __dxlog_file3,
544
- L: 158,
556
+ L: 157,
545
557
  S: void 0,
546
558
  A: [
547
559
  "space",
@@ -847,7 +859,7 @@ var checkboxAttributes = {
847
859
  var renderCheckbox = ({ rowIndex, header = false, checked = false, disabled = false }) => {
848
860
  const baseClasses = "absolute inset-block-[6px] inline-end-[6px] ch-checkbox";
849
861
  const { attributes } = tableControls.checkbox;
850
- return `<input type="checkbox" class="${baseClasses}" ${attributes.checkbox}="${rowIndex}" ${header ? attributes.header : ""} ${checked ? "checked" : ""} ${disabled ? "disabled" : ""}/>`;
862
+ return `<input type="checkbox" class="${baseClasses}" ${attributes.checkbox}="${rowIndex}" ${header ? attributes.header : ""} ${checked ? "checked" : ""} ${disabled ? "disabled" : ""} data-testid="table-selection"/>`;
851
863
  };
852
864
  var tableControls = {
853
865
  checkbox: {
@@ -982,6 +994,7 @@ var TableModel = class extends Resource2 {
982
994
  col,
983
995
  row: 0
984
996
  })] = {
997
+ // TODO(burdon): Use same logic as form for fallback title.
985
998
  value: props.title ?? field.path,
986
999
  readonly: true,
987
1000
  resizeHandle: "col",
@@ -1384,6 +1397,7 @@ var useTableModel = ({ objects, table, projection, ...props }) => {
1384
1397
  };
1385
1398
  export {
1386
1399
  Table,
1400
+ TableSchema,
1387
1401
  TableType,
1388
1402
  Toolbar,
1389
1403
  fromGridCell,