@antelopejs/dms 0.7.11 → 0.7.13

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 (79) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/implementations/dms/page.js +14 -1
  3. package/dist/implementations/dms/page.js.map +1 -1
  4. package/dist/test/unit/implementations/dms/module-address-page.test.d.ts +1 -0
  5. package/dist/test/unit/implementations/dms/module-address-page.test.js +107 -0
  6. package/dist/test/unit/implementations/dms/module-address-page.test.js.map +1 -0
  7. package/dist/test/unit/interfaces/dms/page-topics.test.js +30 -0
  8. package/dist/test/unit/interfaces/dms/page-topics.test.js.map +1 -1
  9. package/dist/test/unit/interfaces/dms-base/block-parity-options.test.js +7 -0
  10. package/dist/test/unit/interfaces/dms-base/block-parity-options.test.js.map +1 -1
  11. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.js +10 -0
  12. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.js.map +1 -1
  13. package/frontend-vue/layers/dms-core/app/build/composables/page/usePageRecordLabel.ts +7 -29
  14. package/frontend-vue/layers/dms-core/app/composables/page/usePageRecordLabel.ts +53 -0
  15. package/frontend-vue/layers/dms-core/app/composables/user/useRegionalFormat.ts +73 -20
  16. package/frontend-vue/layers/dms-core/app/utils/formatter.ts +37 -1
  17. package/frontend-vue/layers/dms-core/app/utils/regional.ts +20 -0
  18. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +23 -2
  19. package/frontend-vue/layers/dms-layout/app/middleware/module-routing.global.ts +34 -39
  20. package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +6 -3
  21. package/frontend-vue/layers/dms-layout/app/utils/moduleLanding.ts +56 -0
  22. package/frontend-vue/layers/dms-ui/app/build/components/table-view/LiveHoldBanner.vue +69 -17
  23. package/frontend-vue/layers/dms-ui/app/build/composables/chart/apexTheme.ts +1 -1
  24. package/frontend-vue/layers/dms-ui/app/build/composables/form/enclosingForm.ts +38 -0
  25. package/frontend-vue/layers/dms-ui/app/build/composables/global/searchShortcuts.ts +7 -16
  26. package/frontend-vue/layers/dms-ui/app/build/composables/live/liveNotes.ts +54 -0
  27. package/frontend-vue/layers/dms-ui/app/build/composables/page/blockAnchors.ts +50 -0
  28. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableLiveHold.ts +78 -35
  29. package/frontend-vue/layers/dms-ui/app/build/utils/numberAdjustment.ts +60 -0
  30. package/frontend-vue/layers/dms-ui/app/components/RecursiveComponent.vue +11 -0
  31. package/frontend-vue/layers/dms-ui/app/components/activity/ActivityItem.vue +17 -9
  32. package/frontend-vue/layers/dms-ui/app/components/activity-feed/ActivityFeed.vue +58 -7
  33. package/frontend-vue/layers/dms-ui/app/components/blocks/CodeBlock.vue +5 -1
  34. package/frontend-vue/layers/dms-ui/app/components/blocks/EmptyStateBlock.vue +2 -1
  35. package/frontend-vue/layers/dms-ui/app/components/blocks/LiveToggleBlock.vue +7 -20
  36. package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +3 -0
  37. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +7 -1
  38. package/frontend-vue/layers/dms-ui/app/components/code-snippet/CodeSnippet.vue +51 -13
  39. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +38 -1
  40. package/frontend-vue/layers/dms-ui/app/components/form/components/InputNumber.vue +58 -3
  41. package/frontend-vue/layers/dms-ui/app/components/tab/Tab.vue +19 -1
  42. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +9 -1
  43. package/frontend-vue/layers/dms-ui/app/components/top-list/TopListCard.vue +2 -0
  44. package/frontend-vue/layers/dms-ui/app/composables/chart/types.ts +3 -0
  45. package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.types.ts +2 -0
  46. package/frontend-vue/layers/dms-ui/app/composables/form/types/validation.ts +10 -0
  47. package/frontend-vue/layers/dms-ui/app/composables/form/useEnclosingForm.ts +61 -0
  48. package/frontend-vue/layers/dms-ui/app/composables/global/searchShortcuts.ts +24 -0
  49. package/frontend-vue/layers/dms-ui/app/composables/live/usePageLive.ts +3 -2
  50. package/frontend-vue/layers/dms-ui/app/composables/live/usePageLiveRefresh.ts +103 -0
  51. package/frontend-vue/layers/dms-ui/app/composables/tab/types/composable.ts +1 -0
  52. package/frontend-vue/layers/dms-ui/app/composables/tab/types/item.ts +8 -1
  53. package/frontend-vue/layers/dms-ui/app/composables/tab/useTab.ts +35 -23
  54. package/frontend-vue/layers/dms-ui/app/types/input-number.ts +18 -0
  55. package/frontend-vue/layers/dms-ui/app/types/live.ts +6 -0
  56. package/frontend-vue/layers/dms-ui/app/utils/scrollToBlock.ts +23 -0
  57. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +9 -2
  58. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +9 -2
  59. package/frontend-vue/tests/activity-feed-fold.test.ts +119 -0
  60. package/frontend-vue/tests/block-fetch-options-forwarding.test.ts +5 -0
  61. package/frontend-vue/tests/breadcrumb-target.test.ts +10 -0
  62. package/frontend-vue/tests/chart-legend.test.ts +133 -0
  63. package/frontend-vue/tests/code-block.test.ts +28 -0
  64. package/frontend-vue/tests/field-suffix-count.test.ts +1 -0
  65. package/frontend-vue/tests/form-enclosing-form.test.ts +141 -0
  66. package/frontend-vue/tests/header-actions.test.ts +1 -1
  67. package/frontend-vue/tests/input-number-adjust.test.ts +176 -0
  68. package/frontend-vue/tests/live-hold-banner.test.ts +66 -8
  69. package/frontend-vue/tests/module-routing.test.ts +158 -0
  70. package/frontend-vue/tests/page-live-refresh.test.ts +169 -0
  71. package/frontend-vue/tests/page-record-label.test.ts +53 -0
  72. package/frontend-vue/tests/regional-format.test.ts +69 -2
  73. package/frontend-vue/tests/scroll-to-block.test.ts +171 -0
  74. package/frontend-vue/tests/settings-search-shortcuts.test.ts +17 -0
  75. package/frontend-vue/tests/tab-url-slot.test.ts +150 -0
  76. package/frontend-vue/tests/table-live-hold.test.ts +90 -0
  77. package/package.json +2 -2
  78. package/skills/dms/SKILL.md +28 -4
  79. package/skills/dms-module/SKILL.md +2 -1
@@ -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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"}
@@ -1,31 +1,9 @@
1
- import { computed } from "vue";
2
-
3
- interface PageRecordLabel {
4
- path: string;
5
- label: string;
6
- }
7
-
8
- const STATE_KEY = "dms-page-record-label";
9
-
10
1
  /**
11
- * The label of the row a page is about, e.g. the task an edit page changes:
12
- * the form that loads the row sets it, the breadcrumb ends with it. Held with
13
- * the page's path, so it never outlives its page.
2
+ * The former path of `usePageRecordLabel`, kept for the modules that import
3
+ * it from here. Import it from `#dms-core/app/composables/page/usePageRecordLabel`,
4
+ * or call the auto-imported `usePageRecordLabel()`.
5
+ *
6
+ * @internal
7
+ * @deprecated Use `#dms-core/app/composables/page/usePageRecordLabel`.
14
8
  */
15
- export function usePageRecordLabel() {
16
- const state = useDmsState<PageRecordLabel | null>(STATE_KEY, () => null);
17
- const route = useDmsRoute();
18
-
19
- const label = computed(() =>
20
- state.value && state.value.path === route.path
21
- ? state.value.label
22
- : undefined,
23
- );
24
-
25
- /** Names the row of the page at `path`; no label clears it. */
26
- const setLabel = (path: string, value: string | undefined) => {
27
- state.value = value ? { path, label: value } : null;
28
- };
29
-
30
- return { label, setLabel };
31
- }
9
+ export { usePageRecordLabel } from "../../../composables/page/usePageRecordLabel";
@@ -0,0 +1,53 @@
1
+ import { computed, type ComputedRef } from "vue";
2
+
3
+ interface StoredRecordLabel {
4
+ path: string;
5
+ label: string;
6
+ }
7
+
8
+ const STATE_KEY = "dms-page-record-label";
9
+
10
+ /** The label of the record a page is about (see {@link usePageRecordLabel}). */
11
+ export interface PageRecordLabel {
12
+ /** The label of the page on screen, `undefined` when none was set for it. */
13
+ label: ComputedRef<string | undefined>;
14
+ /**
15
+ * Names the record of the page at `path` (the current one is
16
+ * `useDmsRoute().path`); `undefined` or `""` clears it.
17
+ */
18
+ setLabel: (path: string, value: string | undefined) => void;
19
+ }
20
+
21
+ /**
22
+ * The label of the record a page is about, e.g. the task an edit page
23
+ * changes: the page header ends its breadcrumb with it, after the page's own
24
+ * name. A `Form` with `labelKey` sets it once it loaded its record; a module's
25
+ * own component on a record page sets it the same way, and may read it.
26
+ *
27
+ * The label is held with the path it was set for, so it never outlives its
28
+ * page: on another page `label` reads `undefined` until that page sets one.
29
+ * Shared state, so the server-rendered header shows it too when it is set
30
+ * during the render.
31
+ *
32
+ * ```ts
33
+ * const route = useDmsRoute();
34
+ * const { setLabel } = usePageRecordLabel();
35
+ * watch(routeName, (name) => setLabel(route.path, name), { immediate: true });
36
+ * ```
37
+ */
38
+ export function usePageRecordLabel(): PageRecordLabel {
39
+ const state = useDmsState<StoredRecordLabel | null>(STATE_KEY, () => null);
40
+ const route = useDmsRoute();
41
+
42
+ const label = computed(() =>
43
+ state.value && state.value.path === route.path
44
+ ? state.value.label
45
+ : undefined,
46
+ );
47
+
48
+ const setLabel = (path: string, value: string | undefined) => {
49
+ state.value = value ? { path, label: value } : null;
50
+ };
51
+
52
+ return { label, setLabel };
53
+ }
@@ -1,3 +1,4 @@
1
+ import { computed } from "vue";
1
2
  import {
2
3
  formatDate,
3
4
  formatDateTime,
@@ -9,11 +10,49 @@ import {
9
10
  } from "../../utils/formatter";
10
11
  import {
11
12
  regionalDateTimeFormat,
13
+ regionalFormatLocale,
12
14
  type RegionalOptionsSettings,
13
15
  } from "../../utils/regional";
14
16
 
15
17
  type DateInput = Date | string | number | undefined | null;
16
18
 
19
+ /**
20
+ * A number formatter of `useRegionalFormat`: a number is written as a
21
+ * `string`; a value that is not one is returned as is.
22
+ */
23
+ export interface RegionalNumberFormatter {
24
+ (value: number, options?: Intl.NumberFormatOptions): string;
25
+ (value: unknown, options?: Intl.NumberFormatOptions): unknown;
26
+ }
27
+
28
+ /**
29
+ * Which locale the formatters write in: `"interface"`, the interface
30
+ * language as it is (`en`, as the DMS's own blocks write their values), or
31
+ * `"format"`, the locale of the DMS's texts (`formatLocale`: `en` is
32
+ * `en-GB`).
33
+ */
34
+ export type RegionalFormatLocale = "interface" | "format";
35
+
36
+ type NumberFormat = (
37
+ value: unknown,
38
+ locale: string,
39
+ options?: Intl.NumberFormatOptions,
40
+ ) => unknown;
41
+
42
+ /** `format` bound to the locale `locale()` answers at each call. */
43
+ function numberFormatter(
44
+ format: NumberFormat,
45
+ locale: () => string,
46
+ ): RegionalNumberFormatter {
47
+ return ((value: unknown, options?: Intl.NumberFormatOptions) =>
48
+ format(value, locale(), options)) as RegionalNumberFormatter;
49
+ }
50
+
51
+ export interface RegionalFormatOptions {
52
+ /** Defaults to `"interface"`. */
53
+ locale?: RegionalFormatLocale;
54
+ }
55
+
17
56
  /**
18
57
  * The shared formatters bound to the signed-in user's language and regional
19
58
  * preferences (Settings › Language & region): the language of the interface,
@@ -22,13 +61,28 @@ type DateInput = Date | string | number | undefined | null;
22
61
  *
23
62
  * The plain formatters (`formatDate`, `formatNumber`…) fall back to `en-US`
24
63
  * when no locale is passed; these never need one.
64
+ *
65
+ * @param options `{ locale: "format" }` writes every value in `formatLocale`
25
66
  */
26
- export function useRegionalFormat() {
67
+ export function useRegionalFormat(options: RegionalFormatOptions = {}) {
27
68
  const { t, locale } = useI18n();
69
+ const formatLocale = computed(() => regionalFormatLocale(locale.value));
70
+ const writeIn = () =>
71
+ options.locale === "format" ? formatLocale.value : locale.value;
72
+
73
+ const formatNumberIn = numberFormatter(formatNumber, writeIn);
74
+ const formatPriceIn = numberFormatter(formatPrice, writeIn);
75
+ const formatPercentageIn = numberFormatter(formatPercentage, writeIn);
28
76
 
29
77
  return {
30
- /** The language the values are written in. */
78
+ /** The language of the interface (`en`, `fr`). */
31
79
  locale,
80
+ /**
81
+ * The locale the DMS's texts are written in for that language: `en` is
82
+ * `en-GB`, `fr` is `fr-FR`. For an `Intl` format of a module's own
83
+ * that reads in the convention of the texts around it.
84
+ */
85
+ formatLocale,
32
86
  /**
33
87
  * `new Intl.DateTimeFormat` in the user's language with their
34
88
  * preferences applied, for a format the helpers below do not cover.
@@ -37,29 +91,28 @@ export function useRegionalFormat() {
37
91
  * @param settings `keepLocalZone` for calendar days computed in the browser
38
92
  */
39
93
  dateTimeFormat: (
40
- options: Intl.DateTimeFormatOptions,
94
+ dateOptions: Intl.DateTimeFormatOptions,
41
95
  settings?: RegionalOptionsSettings,
42
- ) => regionalDateTimeFormat(locale.value, options, settings),
43
- /** A date ("1 October 2026" by default), `null` when it is not one. */
44
- formatDate: (date: unknown, options?: Intl.DateTimeFormatOptions) =>
45
- formatDate(date, locale.value, options),
46
- /** A time ("14:05:00" by default), `null` when it is not a date. */
47
- formatTime: (date: DateInput, options?: Intl.DateTimeFormatOptions) =>
48
- formatTime(date, locale.value, options),
96
+ ) => regionalDateTimeFormat(writeIn(), dateOptions, settings),
97
+ /** A date ("1 October 2026" in `en-GB`), `null` when it is not one. */
98
+ formatDate: (date: unknown, dateOptions?: Intl.DateTimeFormatOptions) =>
99
+ formatDate(date, writeIn(), dateOptions),
100
+ /** A time ("14:05:00" in `en-GB`), `null` when it is not a date. */
101
+ formatTime: (date: DateInput, dateOptions?: Intl.DateTimeFormatOptions) =>
102
+ formatTime(date, writeIn(), dateOptions),
49
103
  /** A date and its time, `null` when it is not a date. */
50
- formatDateTime: (date: DateInput, options?: Intl.DateTimeFormatOptions) =>
51
- formatDateTime(date, locale.value, options),
104
+ formatDateTime: (
105
+ date: DateInput,
106
+ dateOptions?: Intl.DateTimeFormatOptions,
107
+ ) => formatDateTime(date, writeIn(), dateOptions),
52
108
  /** "just now", "5 minutes ago", "yesterday at 14:05", then the date. */
53
109
  formatRelativeTime: (date: Date | string | number) =>
54
- formatRelativeTime(date, t, locale.value),
55
- /** A number; a value that is not one is returned as is. */
56
- formatNumber: (value: unknown, options?: Intl.NumberFormatOptions) =>
57
- formatNumber(value, locale.value, options),
110
+ formatRelativeTime(date, t, writeIn()),
111
+ /** A number as a `string`; a value that is not one is returned as is. */
112
+ formatNumber: formatNumberIn,
58
113
  /** An amount, in euros unless `options.currency` says otherwise. */
59
- formatPrice: (value: unknown, options?: Intl.NumberFormatOptions) =>
60
- formatPrice(value, locale.value, options),
114
+ formatPrice: formatPriceIn,
61
115
  /** A ratio as a percentage (`0.25` → "25%"). */
62
- formatPercentage: (value: unknown, options?: Intl.NumberFormatOptions) =>
63
- formatPercentage(value, locale.value, options),
116
+ formatPercentage: formatPercentageIn,
64
117
  };
65
118
  }
@@ -229,6 +229,20 @@ export function formatDateTime(
229
229
  });
230
230
  }
231
231
 
232
+ /**
233
+ * A number written for `locale`; a value that is not a number is returned as
234
+ * is. Options Intl refuses (an unknown currency) write the bare number.
235
+ */
236
+ export function formatNumber(
237
+ value: number,
238
+ locale?: string,
239
+ options?: Intl.NumberFormatOptions,
240
+ ): string;
241
+ export function formatNumber(
242
+ value: unknown,
243
+ locale?: string,
244
+ options?: Intl.NumberFormatOptions,
245
+ ): unknown;
232
246
  export function formatNumber(
233
247
  value: unknown,
234
248
  locale: string = DEFAULT_LOCALE,
@@ -238,10 +252,21 @@ export function formatNumber(
238
252
  try {
239
253
  return new Intl.NumberFormat(locale, options).format(value);
240
254
  } catch {
241
- return value;
255
+ return String(value);
242
256
  }
243
257
  }
244
258
 
259
+ /** An amount, in euros unless `options.currency` says otherwise. */
260
+ export function formatPrice(
261
+ value: number,
262
+ locale?: string,
263
+ options?: Intl.NumberFormatOptions,
264
+ ): string;
265
+ export function formatPrice(
266
+ value: unknown,
267
+ locale?: string,
268
+ options?: Intl.NumberFormatOptions,
269
+ ): unknown;
245
270
  export function formatPrice(
246
271
  value: unknown,
247
272
  locale: string = DEFAULT_LOCALE,
@@ -256,6 +281,17 @@ export function formatPrice(
256
281
  });
257
282
  }
258
283
 
284
+ /** A ratio as a percentage (`0.25` → "25%"). */
285
+ export function formatPercentage(
286
+ value: number,
287
+ locale?: string,
288
+ options?: Intl.NumberFormatOptions,
289
+ ): string;
290
+ export function formatPercentage(
291
+ value: unknown,
292
+ locale?: string,
293
+ options?: Intl.NumberFormatOptions,
294
+ ): unknown;
259
295
  export function formatPercentage(
260
296
  value: unknown,
261
297
  locale: string = DEFAULT_LOCALE,
@@ -47,6 +47,16 @@ const DAY_MS = 24 * 60 * 60 * 1000;
47
47
  const MONDAY = 1;
48
48
  const DAYS_PER_WEEK = 7;
49
49
 
50
+ /**
51
+ * The region each language the DMS is translated into is written for: its
52
+ * texts are British English and French of France (`core-en-GB.json`,
53
+ * `core-fr-FR.json`), while the interface language is the bare tag.
54
+ */
55
+ const DMS_TEXT_LOCALES: Record<string, string> = {
56
+ en: "en-GB",
57
+ fr: "fr-FR",
58
+ };
59
+
50
60
  /** `timeStyle` as the fields it stands for, when a date format replaces `dateStyle`. */
51
61
  const TIME_STYLE_FIELDS: Record<string, Intl.DateTimeFormatOptions> = {
52
62
  full: { hour: "2-digit", minute: "2-digit", second: "2-digit" },
@@ -196,6 +206,16 @@ export function withRegionalOptions(
196
206
  return result;
197
207
  }
198
208
 
209
+ /**
210
+ * The locale the DMS's texts are written in for the interface language
211
+ * `locale`: a bare `en` is `en-GB` (24-hour clock, day before month), a bare
212
+ * `fr` is `fr-FR`. A tag naming its region, or a language the DMS is not
213
+ * translated into, is returned as is.
214
+ */
215
+ export function regionalFormatLocale(locale: string): string {
216
+ return DMS_TEXT_LOCALES[locale.toLowerCase()] ?? locale;
217
+ }
218
+
199
219
  /** `new Intl.DateTimeFormat` with the user's preferences applied. */
200
220
  export function regionalDateTimeFormat(
201
221
  locale: string,
@@ -4,7 +4,9 @@ import NotificationPopover from "../notification/NotificationPopover.vue";
4
4
  import QuickActionsPopover from "./QuickActionsPopover.vue";
5
5
  import { useSidebarState } from "./sidebarState";
6
6
  import { useHeaderActionControls } from "../../composables/layout/useHeaderActionControls";
7
- import { usePageRecordLabel } from "#dms-core/app/build/composables/page/usePageRecordLabel";
7
+ import { usePageRecordLabel } from "#dms-core/app/composables/page/usePageRecordLabel";
8
+ import type { CategoryInfo } from "../../../types/page";
9
+ import { resolveModuleLandingSlug } from "../../../utils/moduleLanding";
8
10
 
9
11
  const HOME_ICON = "i-ph-house-light";
10
12
  /** Breadcrumb slot of the folded middle crumbs on small screens. */
@@ -96,6 +98,22 @@ const toggleCurrentPageFavorite = () => {
96
98
  favoritePages.toggleFavorite(currentPageInfo.value);
97
99
  };
98
100
 
101
+ /** The page a module's root crumb opens: the module's landing page. */
102
+ function moduleLandingSlug(
103
+ metadata: CategoryInfo,
104
+ ): string | undefined {
105
+ if (!metadata.isModuleRoot || metadata.hasAccess === false) return undefined;
106
+ const module = siteLayout.modules.value?.[metadata.id];
107
+ if (!module) return undefined;
108
+ return (
109
+ resolveModuleLandingSlug(
110
+ siteLayout.siteLayoutTree.value,
111
+ metadata.id,
112
+ module.landingPage,
113
+ ) ?? undefined
114
+ );
115
+ }
116
+
99
117
  const breadcrumb = computed((): BreadcrumbItem[] => {
100
118
  const base: BreadcrumbItem[] = [
101
119
  { icon: HOME_ICON, to: homepage || "/", "aria-label": t("header.home") },
@@ -122,7 +140,10 @@ const breadcrumb = computed((): BreadcrumbItem[] => {
122
140
 
123
141
  const target = buildBreadcrumbTarget(
124
142
  to,
125
- matchingRoute.metadata,
143
+ {
144
+ ...matchingRoute.metadata,
145
+ landingSlug: moduleLandingSlug(matchingRoute.metadata),
146
+ },
126
147
  route.query,
127
148
  );
128
149
 
@@ -1,7 +1,12 @@
1
+ import { resolveModuleLandingSlug } from "../utils/moduleLanding";
2
+
1
3
  const MODULE_NOT_FOUND_KIND = "module-not-found";
2
4
  const MODULE_NOT_FOUND_STATUS = 404;
3
5
  const MODULE_NOT_FOUND_MESSAGE = "Module not found";
4
- const MODULES_TREE_KEY = "modules";
6
+
7
+ interface GuardedRoute {
8
+ path: string;
9
+ }
5
10
 
6
11
  interface ModuleRouteParts {
7
12
  moduleId: string;
@@ -26,44 +31,24 @@ function parseModuleRoute(path: string): ModuleRouteParts | null {
26
31
  };
27
32
  }
28
33
 
29
- function findModuleRootNode(
30
- tree: SiteLayoutTree | undefined,
31
- moduleId: string,
32
- ): SiteLayoutTree | null {
33
- if (!tree) return null;
34
- const modulesNode = tree.children[MODULES_TREE_KEY];
35
- if (!modulesNode) return null;
36
- for (const childId of modulesNode.childrenOrders) {
37
- const child = modulesNode.children[childId];
38
- if (!child) continue;
39
- if (child.isModuleRoot && child.id === moduleId) {
40
- return child;
41
- }
42
- }
43
- return null;
44
- }
45
-
46
- function pickLandingFromNode(node: SiteLayoutTree): string | null {
47
- if (node.layoutUrl && node.hasAccess !== false) {
48
- return node.fullSlug;
49
- }
50
- for (const childId of node.childrenOrders) {
51
- const child = node.children[childId];
52
- if (!child) continue;
53
- if (child.hasAccess === false) continue;
54
- const candidate = pickLandingFromNode(child);
55
- if (candidate) return candidate;
56
- }
57
- return null;
34
+ /** `landing` with the query and hash of `fullPath`, as the module was entered. */
35
+ function withQueryAndHash(landing: string, fullPath: string): string {
36
+ const start = fullPath.search(/[?#]/);
37
+ return start < 0 ? landing : `${landing}${fullPath.slice(start)}`;
58
38
  }
59
39
 
60
- function resolveModuleLandingSlug(
61
- tree: SiteLayoutTree | undefined,
62
- moduleId: string,
63
- ): string | null {
64
- const moduleRoot = findModuleRootNode(tree, moduleId);
65
- if (!moduleRoot) return null;
66
- return pickLandingFromNode(moduleRoot);
40
+ /**
41
+ * Whether the browser already draws the page at `to`: a link that visits the
42
+ * module's address without a navigation guard gets the landing page served
43
+ * there, and the guard then runs from that page's own setup (`to` is the page
44
+ * on screen). A navigation started from there restarts with each remount of
45
+ * the page it starts, so the browser loads the landing page instead.
46
+ */
47
+ function isDrawnInBrowser(
48
+ to: GuardedRoute,
49
+ from: GuardedRoute | undefined,
50
+ ): boolean {
51
+ return typeof window !== "undefined" && from?.path === to.path;
67
52
  }
68
53
 
69
54
  function ensureSiteLayoutLoaded(
@@ -73,7 +58,7 @@ function ensureSiteLayoutLoaded(
73
58
  return siteLayout.loadSiteLayout();
74
59
  }
75
60
 
76
- export default defineDmsMiddleware(async (to) => {
61
+ export default defineDmsMiddleware(async (to, from) => {
77
62
  const moduleRoute = parseModuleRoute(to.path);
78
63
  if (!moduleRoute) return;
79
64
 
@@ -126,10 +111,20 @@ export default defineDmsMiddleware(async (to) => {
126
111
  const landingSlug = resolveModuleLandingSlug(
127
112
  siteLayout.siteLayoutTree.value,
128
113
  moduleId,
114
+ moduleEntry.landingPage,
129
115
  );
130
116
 
117
+ // Answered rather than navigated to: the navigation that entered the
118
+ // module goes to the landing page instead, so the module's own address
119
+ // never renders (a 404 before the redirect landed), never enters the
120
+ // history, and a server render answers it with a redirect.
131
121
  if (landingSlug && landingSlug !== to.path) {
132
- return navigateDms(landingSlug, { replace: true });
122
+ const landing = withQueryAndHash(landingSlug, to.fullPath);
123
+ if (isDrawnInBrowser(to, from)) {
124
+ window.location.replace(landing);
125
+ return false;
126
+ }
127
+ return landing;
133
128
  }
134
129
 
135
130
  return redirectToHomepage();
@@ -3,6 +3,8 @@ import type { PageValidation } from "../types/page";
3
3
  export interface BreadcrumbTargetSource {
4
4
  layoutUrl?: string;
5
5
  validation?: PageValidation;
6
+ /** A module's root: the page the module opens on, its crumb's link. */
7
+ landingSlug?: string;
6
8
  }
7
9
 
8
10
  /**
@@ -32,8 +34,9 @@ export function buildPageTarget(
32
34
  }
33
35
 
34
36
  /**
35
- * The link of a breadcrumb crumb: the page's {@link buildPageTarget}.
36
- * Categories without a page behind them get no link.
37
+ * The link of a breadcrumb crumb: the page's {@link buildPageTarget}. A
38
+ * module's root links to its landing page; other categories without a page
39
+ * behind them get no link.
37
40
  */
38
41
  export function buildBreadcrumbTarget(
39
42
  path: string,
@@ -41,7 +44,7 @@ export function buildBreadcrumbTarget(
41
44
  currentQuery: Record<string, unknown>,
42
45
  ): string | undefined {
43
46
  if (!metadata.layoutUrl) {
44
- return undefined;
47
+ return metadata.landingSlug;
45
48
  }
46
49
 
47
50
  return buildPageTarget(path, metadata.validation, currentQuery);
@@ -0,0 +1,56 @@
1
+ import type { SiteLayoutTree } from "../types/page";
2
+
3
+ const MODULES_TREE_KEY = "modules";
4
+
5
+ function findModuleRootNode(
6
+ tree: SiteLayoutTree | undefined,
7
+ moduleId: string,
8
+ ): SiteLayoutTree | null {
9
+ if (!tree) return null;
10
+ const modulesNode = tree.children[MODULES_TREE_KEY];
11
+ if (!modulesNode) return null;
12
+ for (const childId of modulesNode.childrenOrders) {
13
+ const child = modulesNode.children[childId];
14
+ if (!child) continue;
15
+ if (child.isModuleRoot && child.id === moduleId) {
16
+ return child;
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+
22
+ function isOpenablePage(node: SiteLayoutTree): boolean {
23
+ return !!node.layoutUrl && node.hasAccess !== false;
24
+ }
25
+
26
+ /** The first page the caller may open under `node`, in menu order. */
27
+ function findPage(
28
+ node: SiteLayoutTree,
29
+ accepts: (page: SiteLayoutTree) => boolean,
30
+ ): SiteLayoutTree | null {
31
+ if (isOpenablePage(node) && accepts(node)) return node;
32
+ for (const childId of node.childrenOrders) {
33
+ const child = node.children[childId];
34
+ if (!child || child.hasAccess === false) continue;
35
+ const found = findPage(child, accepts);
36
+ if (found) return found;
37
+ }
38
+ return null;
39
+ }
40
+
41
+ /**
42
+ * The page a module opens on: its `landingPage` when the caller may open it,
43
+ * else its first page in menu order.
44
+ */
45
+ export function resolveModuleLandingSlug(
46
+ tree: SiteLayoutTree | undefined,
47
+ moduleId: string,
48
+ landingPage: string | undefined,
49
+ ): string | null {
50
+ const moduleRoot = findModuleRootNode(tree, moduleId);
51
+ if (!moduleRoot) return null;
52
+ const declared = landingPage
53
+ ? findPage(moduleRoot, (page) => page.id === landingPage)
54
+ : null;
55
+ return (declared ?? findPage(moduleRoot, () => true))?.fullSlug ?? null;
56
+ }