@antelopejs/dms 0.7.19 → 0.7.21

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 (26) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/test/unit/interfaces/dms-base/table-view-row-menu-label.test.d.ts +1 -0
  3. package/dist/test/unit/interfaces/dms-base/table-view-row-menu-label.test.js +27 -0
  4. package/dist/test/unit/interfaces/dms-base/table-view-row-menu-label.test.js.map +1 -0
  5. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.js +11 -0
  6. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.js.map +1 -1
  7. package/frontend-vue/layers/dms-ui/app/build/components/table/Table.vue +13 -3
  8. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardsDisplay.vue +1 -1
  9. package/frontend-vue/layers/dms-ui/app/build/composables/actions/rowNavigation.ts +14 -0
  10. package/frontend-vue/layers/dms-ui/app/build/composables/actions/useActionTargets.ts +70 -8
  11. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableRecordLink.ts +93 -0
  12. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableUrlTab.ts +42 -12
  13. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewConfig.ts +3 -2
  14. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts +3 -0
  15. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/recordLink.ts +18 -16
  16. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/urlFilters.ts +18 -0
  17. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/views.ts +29 -0
  18. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +43 -54
  19. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +2 -0
  20. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/display.ts +6 -0
  21. package/frontend-vue/tests/row-side-panel.test.ts +93 -2
  22. package/frontend-vue/tests/table-view-bulk-drawer.test.ts +117 -0
  23. package/frontend-vue/tests/table-view-cards-reread.test.ts +77 -0
  24. package/frontend-vue/tests/table-view-record-link.test.ts +207 -0
  25. package/frontend-vue/tests/table-view-url-tab.test.ts +84 -2
  26. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.7.21
4
+
5
+ [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.20...v0.7.21)
6
+
7
+ ### 🚀 Enhancements
8
+
9
+ - **table-view:** Let a row's panel, drawer or modal show another row in place ([#252](https://github.com/AntelopeJS/dms/pull/252))
10
+ - **table-view:** Let a table view drop the built-in table display ([#255](https://github.com/AntelopeJS/dms/pull/255))
11
+
12
+ ### 🩹 Fixes
13
+
14
+ - **table-view:** Keep an empty list on screen while it is read again ([#250](https://github.com/AntelopeJS/dms/pull/250))
15
+ - **table-view:** Serve the row menu label to the browser ([#253](https://github.com/AntelopeJS/dms/pull/253))
16
+ - **table-view:** Keep the tab the user opens in the URL ([#254](https://github.com/AntelopeJS/dms/pull/254))
17
+
18
+ ### 🏡 Chore
19
+
20
+ - **release:** @antelopejs/interface-dms v0.5.13 ([6b58111b](https://github.com/AntelopeJS/dms/commit/6b58111b))
21
+
22
+ ### ❤️ Contributors
23
+
24
+ - Antony Rizzitelli <rizzitelli.antony@pm.me>
25
+
26
+ ## v0.7.20
27
+
28
+ [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.19...v0.7.20)
29
+
30
+ ### 🩹 Fixes
31
+
32
+ - **table-view:** Reopen a record link to a closed row and keep chips from restoring it ([#249](https://github.com/AntelopeJS/dms/pull/249))
33
+
34
+ ### ❤️ Contributors
35
+
36
+ - Antony Rizzitelli <rizzitelli.antony@pm.me>
37
+
3
38
  ## v0.7.19
4
39
 
5
40
  [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.18...v0.7.19)
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const request_filter_1 = require("@antelopejs/interface-dms/base/table-view/internal/request-filter");
5
+ const ALL_GRANTED = {
6
+ add: true,
7
+ edit: true,
8
+ delete: true,
9
+ view: true,
10
+ archive: true,
11
+ restore: true,
12
+ viewArchived: true,
13
+ export: true,
14
+ };
15
+ describe("[unit] interfaces/dms-base/table-view row menu label", () => {
16
+ it("serves the table's menuLabel to the browser", () => {
17
+ const served = (0, request_filter_1.adaptRowActions)({
18
+ rowActions: { menuLabel: "$features.row_menu" },
19
+ archiveMode: false,
20
+ grants: ALL_GRANTED,
21
+ custom: undefined,
22
+ controllerRules: undefined,
23
+ });
24
+ (0, chai_1.expect)(served.menuLabel).to.equal("$features.row_menu");
25
+ });
26
+ });
27
+ //# sourceMappingURL=table-view-row-menu-label.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-view-row-menu-label.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-row-menu-label.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAC9B,sGAG2E;AAE3E,MAAM,WAAW,GAAoB;IACnC,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAA,gCAAe,EAAC;YAC7B,UAAU,EAAE,EAAE,SAAS,EAAE,oBAAoB,EAAE;YAC/C,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -171,6 +171,17 @@ describe("[unit] interfaces/dms-base — table view sources and reorder", () =>
171
171
  (0, chai_1.expect)(() => sourceOf({ pageSize: 0 })).to.throw(/pageSize/);
172
172
  (0, chai_1.expect)(() => sourceOf({ displays: [{ id: "plan-cards" }] })).to.throw(/named "<module>:<id>"/);
173
173
  (0, chai_1.expect)(() => sourceOf({ defaultDisplay: "cards" })).to.throw(/not declared in displays/);
174
+ (0, chai_1.expect)(() => sourceOf({ tableDisplay: false, displays: [{ id: "cards" }] })).to.throw(/drops the table display without a defaultDisplay/);
175
+ (0, chai_1.expect)(() => sourceOf({
176
+ tableDisplay: false,
177
+ displays: [{ id: "cards" }],
178
+ defaultDisplay: "table",
179
+ })).to.throw(/not declared in displays/);
180
+ (0, chai_1.expect)(sourceOf({
181
+ tableDisplay: false,
182
+ displays: [{ id: "cards" }],
183
+ defaultDisplay: "cards",
184
+ }).tableDisplay).to.equal(false);
174
185
  (0, chai_1.expect)(() => sourceOf({ card: { fields: ["status"] } })).to.throw(/unknown column "status"/);
175
186
  const both = [
176
187
  {
@@ -1 +1 @@
1
- {"version":3,"file":"table-view-source-reorder.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-source-reorder.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-view-source-reorder.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-source-reorder.test.ts"],"names":[],"mappings":"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"}
@@ -256,6 +256,12 @@ export interface TableProps<T> {
256
256
  data?: T[] | null;
257
257
  columns?: TableColumn<T>[];
258
258
  loading?: boolean;
259
+ /**
260
+ * No answer has arrived yet. Without it, a load with no row listed counts
261
+ * as the first one, which also draws the skeleton over a re-read of an
262
+ * empty list.
263
+ */
264
+ firstPageLoading?: boolean;
259
265
  /**
260
266
  * Message (i18n key) of a failed data fetch; switches the empty-table panel
261
267
  * to its error state so a refused query never reads as "no data".
@@ -713,7 +719,11 @@ const DEFAULT_CAPABILITIES = resolveDisplayCapabilities({
713
719
  columnManagement: true,
714
720
  });
715
721
 
716
- const props = defineProps<TableProps<T>>();
722
+ // Undefined, not the `false` an absent boolean prop casts to: the table then
723
+ // judges the first load by itself.
724
+ const props = withDefaults(defineProps<TableProps<T>>(), {
725
+ firstPageLoading: undefined,
726
+ });
717
727
  const emits = defineEmits<TableEmits<T>>();
718
728
 
719
729
  const appConfig = useDmsAppConfig() as DmsAppConfig & {
@@ -827,7 +837,7 @@ const paginationState = defineModel<PaginationState>("pagination", {
827
837
  // The first page is on its way: skeleton rows (and placeholders for the
828
838
  // counts) hold the list's place instead of its empty state.
829
839
  const isFirstPageLoading = computed(
830
- () => !!props.loading && !props.data?.length,
840
+ () => props.firstPageLoading ?? (!!props.loading && !props.data?.length),
831
841
  );
832
842
  const skeletonRowCount = computed(() =>
833
843
  Math.min(
@@ -1654,7 +1664,7 @@ defineShortcuts({
1654
1664
  </template>
1655
1665
  <!-- First load: skeleton rows keep the column rhythm instead of
1656
1666
  flashing the empty state. -->
1657
- <template v-else-if="loading">
1667
+ <template v-else-if="isFirstPageLoading">
1658
1668
  <tr
1659
1669
  v-for="rowIndex in skeletonRowCount"
1660
1670
  :key="`skeleton-${rowIndex}`"
@@ -113,7 +113,7 @@ const cardReorder = (index: number): TableViewCardReorder | undefined =>
113
113
  <!-- v2 cards display: an auto-fill grid inside the table card, sharing
114
114
  its selection and its pagination footer. -->
115
115
  <CardGridSkeleton
116
- v-if="props.context.loading && props.context.items.length === 0"
116
+ v-if="props.context.firstPageLoading"
117
117
  :count="props.context.pagination.pageSize"
118
118
  :fields="fieldColumns.length"
119
119
  />
@@ -18,8 +18,22 @@ export interface RowNavigation {
18
18
  export interface RowNavigationSource {
19
19
  rows: () => Data[];
20
20
  rowIdKey: string;
21
+ /**
22
+ * Reads one row by id (the table's `get` route or `fetchRowUrl`): what a
23
+ * container's `showRow` falls back to for a row the table does not list.
24
+ */
25
+ getRow?: (id: string) => Promise<Data | undefined>;
21
26
  }
22
27
 
28
+ /**
29
+ * What a drawer, modal or side panel opened on a row receives to show
30
+ * another row of the same table in its place (`showRow` prop): the row
31
+ * itself, or its id, read from the rows shown or else from the table's route.
32
+ * The table then treats it as the open row: its highlight, its position, its
33
+ * `?record=`. It rejects when the row could not be read.
34
+ */
35
+ export type ShowRow = (row: Data | string) => Promise<void>;
36
+
23
37
  const rowIdOf = (row: Data, rowIdKey: string): string =>
24
38
  String(get(row, rowIdKey));
25
39
 
@@ -25,10 +25,12 @@ import {
25
25
  type RowNavigation,
26
26
  type RowNavigationSource,
27
27
  rowNavigation,
28
+ type ShowRow,
28
29
  } from "./rowNavigation";
29
30
  import {
30
31
  clearWrittenRecord,
31
32
  isDeepLinkAction,
33
+ resolveDeepLinkedRow,
32
34
  writeRecordId,
33
35
  type WrittenRecord,
34
36
  } from "../table-view/utils/recordLink";
@@ -37,6 +39,7 @@ import {
37
39
  closeRowSidePanelOf,
38
40
  openRowSidePanel,
39
41
  rowSidePanelOwnerKey,
42
+ useRowSidePanelContent,
40
43
  } from "#dms-layout/app/build/composables/layout/rowSidePanel";
41
44
  import type { TableUrlScope } from "../table-view/utils/views";
42
45
  import { useActionConfirm } from "../confirm/useActionConfirm";
@@ -110,6 +113,11 @@ export interface ActionTargetsConfig {
110
113
  rowNavigation?: RowNavigationSource;
111
114
  /** Where a `deepLink` action writes the row it has open in the URL. */
112
115
  recordScope?: TableUrlScope;
116
+ /**
117
+ * Told the row a `deepLink` action shows each time it writes it in the URL,
118
+ * and `undefined` once its container closed and removed it.
119
+ */
120
+ onRecordShown?: (id?: string) => void;
113
121
  /**
114
122
  * The field a row's id is read from (`_id` by default): it fills `{id}` in
115
123
  * the `from` URL of a row action's confirmation, as on a built-in action.
@@ -140,6 +148,18 @@ interface SidePanelTargetRun extends TargetRunExtras {
140
148
  missingId?: string;
141
149
  }
142
150
 
151
+ /**
152
+ * `show`, run only while the row side panel still shows `session`: a row read
153
+ * after the panel closed, or moved to another run, leaves it alone.
154
+ */
155
+ function whileShown<V>(session: symbol, show: (value: V) => void) {
156
+ return (value: V): void => {
157
+ if (useRowSidePanelContent().value?.session === session) show(value);
158
+ };
159
+ }
160
+
161
+ const NO_ROW_ROUTE = async (): Promise<undefined> => undefined;
162
+
143
163
  const NOT_FOUND_TITLE_KEY = "side_panel.not_found.title";
144
164
  const NOT_FOUND_DESCRIPTION_KEY = "side_panel.not_found.description";
145
165
 
@@ -326,13 +346,39 @@ export function useActionTargets(config: ActionTargetsConfig) {
326
346
  return (id?: string): void => {
327
347
  if (!deepLink || !config.recordScope || !config.rowNavigation) return;
328
348
  if (!id) {
329
- clearWrittenRecord(written);
349
+ if (clearWrittenRecord(written)) config.onRecordShown?.(undefined);
330
350
  written = undefined;
331
351
  return;
332
352
  }
333
353
  written = writeRecordId(config.recordScope, id);
354
+ config.onRecordShown?.(id);
334
355
  };
335
356
  };
357
+ // `showRow` given an id: the listed row, else the one the table's route
358
+ // reads. A row its route answered 404 for goes to `showMissing` when the
359
+ // container has a state for it; any other row not found rejects. Only the
360
+ // latest call applies: a read that resolves after a later call is dropped.
361
+ const rowShower = (
362
+ show: (row: Data) => void,
363
+ showMissing?: (id: string) => void,
364
+ ): ShowRow => {
365
+ let latest = 0;
366
+ return async (rowOrId) => {
367
+ const call = ++latest;
368
+ if (typeof rowOrId !== "string") return show(rowOrId);
369
+ const source = config.rowNavigation;
370
+ const found = await resolveDeepLinkedRow(rowOrId, {
371
+ listed: source?.rows(),
372
+ idOf: rowIdOf,
373
+ getRow: source?.getRow ?? NO_ROW_ROUTE,
374
+ });
375
+ if (call !== latest) return;
376
+ if (found.row) return show(found.row);
377
+ if (found.isMissing && showMissing) return showMissing(rowOrId);
378
+ throw new Error(`The row "${rowOrId}" could not be read`);
379
+ };
380
+ };
381
+
336
382
  const rowRecorder = (deepLink?: boolean) => {
337
383
  const recordId = recordRecorder(deepLink);
338
384
  return (row?: Data): void => recordId(rowIdOf(row));
@@ -376,6 +422,10 @@ export function useActionTargets(config: ActionTargetsConfig) {
376
422
  componentId: config.componentId,
377
423
  containerId: run.containerId,
378
424
  selection: run.selection,
425
+ showRow: rowShower(
426
+ whileShown(session, showRow),
427
+ whileShown(session, showMissing),
428
+ ),
379
429
  onSuccessCallback: () => {
380
430
  closeRowSidePanel(session);
381
431
  config.refreshCallback?.();
@@ -383,7 +433,7 @@ export function useActionTargets(config: ActionTargetsConfig) {
383
433
  },
384
434
  onClose: () => recordId(undefined),
385
435
  };
386
- const showRow = (row?: Data) => {
436
+ function showRow(row?: Data) {
387
437
  openRowSidePanel({
388
438
  ...panel,
389
439
  rowTitle: rowTitleOf(run.target, row),
@@ -393,10 +443,13 @@ export function useActionTargets(config: ActionTargetsConfig) {
393
443
  showRow,
394
444
  });
395
445
  recordId(rowIdOf(row));
396
- };
397
- if (!run.missingId) return showRow(run.rowData);
398
- openRowSidePanel({ ...panel, notFound: notFoundOf(run.target), showRow });
399
- recordId(run.missingId);
446
+ }
447
+ function showMissing(id: string) {
448
+ openRowSidePanel({ ...panel, notFound: notFoundOf(run.target), showRow });
449
+ recordId(id);
450
+ }
451
+ if (run.missingId) return showMissing(run.missingId);
452
+ showRow(run.rowData);
400
453
  };
401
454
 
402
455
  // A container opened on a listed row steps through the rows shown (its
@@ -409,6 +462,12 @@ export function useActionTargets(config: ActionTargetsConfig) {
409
462
  const source = config.rowNavigation;
410
463
  let instance: ContainerInstance | undefined;
411
464
  let navigation: RowNavigation | undefined;
465
+ // Set once the container closes: a row read that resolves later neither
466
+ // writes `?record=` back nor patches the closed container.
467
+ let closed = false;
468
+ const showRowById = rowShower((row) => {
469
+ if (!closed) showRow(row);
470
+ });
412
471
  const optionsFor = (row?: Data) => {
413
472
  navigation =
414
473
  row && source ? rowNavigation(source, row, showRow) : undefined;
@@ -419,6 +478,7 @@ export function useActionTargets(config: ActionTargetsConfig) {
419
478
  containerId: run.containerId,
420
479
  rowData: row,
421
480
  navigation,
481
+ showRow: showRowById,
422
482
  selection: run.selection,
423
483
  onSuccessCallback: () => {
424
484
  instance?.close();
@@ -430,14 +490,16 @@ export function useActionTargets(config: ActionTargetsConfig) {
430
490
  function showRow(row: Data) {
431
491
  instance?.patch({
432
492
  componentOptions: optionsFor(row),
433
- componentKey: String(get(row, source!.rowIdKey)),
493
+ componentKey: rowIdOf(row),
434
494
  });
435
495
  recordRow(row);
436
496
  }
437
497
  instance = openContainer(run, component, optionsFor(run.rowData));
438
498
  recordRow(run.rowData);
439
- const stopSteps = navigation ? listenRowSteps(() => navigation) : undefined;
499
+ // `showRow` may move an unlisted row's container onto a listed one.
500
+ const stopSteps = source ? listenRowSteps(() => navigation) : undefined;
440
501
  const settle = () => {
502
+ closed = true;
441
503
  stopSteps?.();
442
504
  recordRow(undefined);
443
505
  };
@@ -0,0 +1,93 @@
1
+ import { router as inertiaRouter } from "@inertiajs/vue3";
2
+ import { onBeforeUnmount, onMounted, watch } from "vue";
3
+ import type { CustomRowAction } from "../../../types/row-action";
4
+ import {
5
+ deepLinkOutcome,
6
+ type DeepLinkedRow,
7
+ readRecordId,
8
+ writeRecordId,
9
+ } from "./utils/recordLink";
10
+ import { queryOfUrl } from "./utils/urlFilters";
11
+ import type { TableUrlScope } from "./utils/views";
12
+
13
+ /** What `useTableRecordLink` follows the URL's `?record=` with. */
14
+ export interface TableRecordLinkOptions<T> {
15
+ route: { query: Record<string, unknown> };
16
+ urlScope: TableUrlScope;
17
+ /** The table's `deepLink` action: the container a link opens. */
18
+ action: CustomRowAction;
19
+ /** Finds the row a link names, once the list is loaded. */
20
+ resolve: (id: string) => Promise<DeepLinkedRow<T>>;
21
+ /** Opens the row found in the action's container. */
22
+ open: (row: T) => void;
23
+ /** Opens a side panel's own "no longer available" state on the id. */
24
+ showMissing: (id: string) => void;
25
+ /** Tells the user the link led nowhere, or could not be followed. */
26
+ notify: (outcome: "notify" | "notifyFailed") => void;
27
+ }
28
+
29
+ /** What the table tells the link about the row its container shows. */
30
+ export interface TableRecordLink {
31
+ /**
32
+ * The row the action's container shows, as written in the URL, or
33
+ * `undefined` once it closed: a link to the row shown opens nothing again,
34
+ * a link to a row closed reopens it.
35
+ */
36
+ shown: (id?: string) => void;
37
+ }
38
+
39
+ /**
40
+ * Opens the row the URL's `?record=` names: on arrival, and on each visit
41
+ * that keeps the page mounted (a link to the same page naming a row, back and
42
+ * forward), as a fresh load would. The visit is followed rather than the
43
+ * route's value: the table writes and removes the key in place, so a link to
44
+ * a row closed meanwhile leaves the route's value unchanged. A link naming no
45
+ * row removes the key and tells the user.
46
+ */
47
+ export function useTableRecordLink<T>(
48
+ options: TableRecordLinkOptions<T>,
49
+ ): TableRecordLink {
50
+ const { action, urlScope } = options;
51
+ // The row opened or being opened: arrival and the visit that mounted the
52
+ // table name it twice, a visit while it is open names it again.
53
+ let linkedId: string | undefined;
54
+
55
+ const settle = async (id: string) => {
56
+ const found = await options.resolve(id);
57
+ const outcome = deepLinkOutcome(found, action);
58
+ if (outcome === "open") return options.open(found.row as T);
59
+ if (outcome === "missingPanel") return options.showMissing(id);
60
+ writeRecordId(urlScope);
61
+ if (linkedId === id) linkedId = undefined;
62
+ options.notify(outcome);
63
+ };
64
+
65
+ const follow = (query: Record<string, unknown>) => {
66
+ const id = readRecordId(query, urlScope);
67
+ if (!id || id === linkedId) return;
68
+ linkedId = id;
69
+ void settle(id);
70
+ };
71
+
72
+ let stopFollowingVisits: (() => void) | undefined;
73
+ onMounted(() => {
74
+ follow(options.route.query);
75
+ stopFollowingVisits = inertiaRouter.on("navigate", (event) =>
76
+ follow(queryOfUrl(event.detail.page.url)),
77
+ );
78
+ });
79
+ onBeforeUnmount(() => stopFollowingVisits?.());
80
+
81
+ // A visit Inertia does not announce (a `router.replace`) still moves the
82
+ // route: a new value there is followed as well.
83
+ watch(
84
+ () => readRecordId(options.route.query, urlScope),
85
+ () => follow(options.route.query),
86
+ );
87
+
88
+ return {
89
+ shown: (id) => {
90
+ linkedId = id;
91
+ },
92
+ };
93
+ }
@@ -1,5 +1,11 @@
1
- import { watch, type Ref } from "vue";
2
- import { readTableUrlKey, type TableUrlScope } from "./utils/views";
1
+ import { router as inertiaRouter } from "@inertiajs/vue3";
2
+ import { onBeforeUnmount, onMounted, watch, type Ref } from "vue";
3
+ import { queryOfUrl } from "./utils/urlFilters";
4
+ import {
5
+ readTableUrlKey,
6
+ type TableUrlScope,
7
+ writeTableUrlKey,
8
+ } from "./utils/views";
3
9
 
4
10
  const TAB_URL_KEY = "tab";
5
11
 
@@ -30,18 +36,42 @@ export function readTableUrlTab(
30
36
  }
31
37
 
32
38
  /**
33
- * Follows the URL's tab after arrival: a link or a `router.replace` naming
34
- * another tab of the same page switches to it without remounting the page.
35
- * A URL dropping the key, or naming a tab the table cannot open in place (an
36
- * unknown id, a link tab), leaves the open tab alone.
39
+ * Keeps the open tab and the URL in step after arrival. A tab the user opens
40
+ * is written to the URL in place (no visit, no history entry), under the key
41
+ * it is read from, so a reload or a shared link opens it again. A link or a
42
+ * `router.replace` naming another tab of the same page switches to it without
43
+ * remounting the page. A URL dropping the key, or naming a tab the table
44
+ * cannot open in place (an unknown id, a link tab), leaves the open tab alone.
37
45
  */
38
46
  export function useTableUrlTab(options: TableUrlTabOptions): void {
47
+ const { activeTabId, urlScope } = options;
48
+
49
+ const follow = (query: Record<string, unknown>) => {
50
+ const tabId = readTableUrlTab(query, urlScope);
51
+ if (!tabId || tabId === activeTabId.value) return;
52
+ if (!options.isOpenable(tabId)) return;
53
+ activeTabId.value = tabId;
54
+ };
55
+
56
+ // The tab is written in place, so the route keeps the value of the last
57
+ // visit: a link back to that tab leaves it unchanged, and only the visit
58
+ // tells it was followed. A `router.replace`, which Inertia does not
59
+ // announce, still moves the route.
39
60
  watch(
40
- () => readTableUrlTab(options.route.query, options.urlScope),
41
- (tabId) => {
42
- if (!tabId || tabId === options.activeTabId.value) return;
43
- if (!options.isOpenable(tabId)) return;
44
- options.activeTabId.value = tabId;
45
- },
61
+ () => readTableUrlTab(options.route.query, urlScope),
62
+ () => follow(options.route.query),
46
63
  );
64
+ let stopFollowingVisits: (() => void) | undefined;
65
+ onMounted(() => {
66
+ stopFollowingVisits = inertiaRouter.on("navigate", (event) =>
67
+ follow(queryOfUrl(event.detail.page.url)),
68
+ );
69
+ });
70
+ onBeforeUnmount(() => stopFollowingVisits?.());
71
+
72
+ watch(activeTabId, (tabId) => {
73
+ if (options.isOpenable(tabId)) {
74
+ writeTableUrlKey(urlScope, TAB_URL_KEY, tabId);
75
+ }
76
+ });
47
77
  }
@@ -103,10 +103,11 @@ export const useTableViewConfig = <T extends Data>(
103
103
  );
104
104
 
105
105
  // Config-derived (SSR-safe; the registry is client-only): the implicit `table`
106
- // display plus explicit `displays`. Built-in defaults
106
+ // display (unless `tableDisplay` is false) plus explicit `displays`. Built-in defaults
107
107
  // (selfManagedData/capabilities) are merged per id.
108
108
  const resolvedDisplays: TableViewDisplayConfig[] = (() => {
109
- const list: TableViewDisplayConfig[] = [{ id: TABLE_DISPLAY_ID }];
109
+ const list: TableViewDisplayConfig[] =
110
+ config.tableDisplay === false ? [] : [{ id: TABLE_DISPLAY_ID }];
110
111
  for (const display of config.displays ?? []) {
111
112
  if (display.id === TABLE_DISPLAY_ID) continue;
112
113
  list.push(display);
@@ -76,6 +76,8 @@ interface TableRowActionsConfig {
76
76
  rowNavigation?: RowNavigationSource;
77
77
  /** Where a `deepLink` action writes its open row in the URL. */
78
78
  recordScope?: TableUrlScope;
79
+ /** Told the row a `deepLink` action shows, `undefined` once closed. */
80
+ onRecordShown?: (id?: string) => void;
79
81
  }
80
82
 
81
83
  interface BulkActionConfig {
@@ -814,6 +816,7 @@ export const useTableRowActions = <T extends Data>(
814
816
  handleApiError,
815
817
  rowNavigation: config.rowNavigation,
816
818
  recordScope: config.recordScope,
819
+ onRecordShown: config.onRecordShown,
817
820
  rowIdKey: config.rowIdKey,
818
821
  });
819
822
 
@@ -1,5 +1,10 @@
1
1
  import type { CustomRowAction } from "../../../../types/row-action";
2
- import { readTableUrlKey, type TableUrlScope } from "./views";
2
+ import {
3
+ readTableUrlKey,
4
+ tableUrlKey,
5
+ type TableUrlScope,
6
+ writeTableUrlKey,
7
+ } from "./views";
3
8
  import { readFetchNotFound } from "../../../utils/fetchNotFound";
4
9
 
5
10
  /** Query key of the row a `deepLink` action has open. */
@@ -7,9 +12,7 @@ export const RECORD_URL_KEY = "record";
7
12
 
8
13
  /** The key this table writes the open row under: short on a sole table. */
9
14
  export function recordUrlKey(scope: TableUrlScope): string {
10
- return scope.isSoleTableView || !scope.tableId
11
- ? RECORD_URL_KEY
12
- : `${scope.tableId}.${RECORD_URL_KEY}`;
15
+ return tableUrlKey(scope, RECORD_URL_KEY);
13
16
  }
14
17
 
15
18
  /** The row the URL names for this table, if any. */
@@ -29,13 +32,9 @@ export function writeRecordId(
29
32
  scope: TableUrlScope,
30
33
  id?: string,
31
34
  ): WrittenRecord | undefined {
32
- if (typeof window === "undefined") return undefined;
33
- const url = new URL(window.location.href);
34
- const key = recordUrlKey(scope);
35
- if (id) url.searchParams.set(key, id);
36
- else url.searchParams.delete(key);
37
- window.history.replaceState(window.history.state, "", url);
38
- return id ? { pathname: url.pathname, key, id } : undefined;
35
+ const url = writeTableUrlKey(scope, RECORD_URL_KEY, id);
36
+ if (!url || !id) return undefined;
37
+ return { pathname: url.pathname, key: recordUrlKey(scope), id };
39
38
  }
40
39
 
41
40
  /**
@@ -58,15 +57,18 @@ export interface WrittenRecord {
58
57
  /**
59
58
  * Removes the row a table wrote in the URL, only while the URL still holds
60
59
  * it: a container closing as the user leaves the page must not erase the
61
- * `?record=` of the page reached.
60
+ * `?record=` of the page reached. Returns whether it removed it.
62
61
  */
63
- export function clearWrittenRecord(written: WrittenRecord | undefined): void {
64
- if (typeof window === "undefined" || !written) return;
62
+ export function clearWrittenRecord(
63
+ written: WrittenRecord | undefined,
64
+ ): boolean {
65
+ if (typeof window === "undefined" || !written) return false;
65
66
  const url = new URL(window.location.href);
66
- if (url.pathname !== written.pathname) return;
67
- if (url.searchParams.get(written.key) !== written.id) return;
67
+ if (url.pathname !== written.pathname) return false;
68
+ if (url.searchParams.get(written.key) !== written.id) return false;
68
69
  url.searchParams.delete(written.key);
69
70
  window.history.replaceState(window.history.state, "", url);
71
+ return true;
70
72
  }
71
73
 
72
74
  /** Where a deep link finds its row: among the rows listed, or by id. */