@antelopejs/dms 0.7.16 → 0.7.18

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/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.7.18
4
+
5
+ [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.17...v0.7.18)
6
+
7
+ ### 🚀 Enhancements
8
+
9
+ - **layout:** Let a header button's label read the page's query ([#247](https://github.com/AntelopeJS/dms/pull/247))
10
+
11
+ ### ❤️ Contributors
12
+
13
+ - Antony Rizzitelli <rizzitelli.antony@pm.me>
14
+
15
+ ## v0.7.17
16
+
17
+ [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.16...v0.7.17)
18
+
19
+ ### 🚀 Enhancements
20
+
21
+ - **actions:** Let a button download a file with the user's session ([#246](https://github.com/AntelopeJS/dms/pull/246))
22
+
23
+ ### 🏡 Chore
24
+
25
+ - **release:** @antelopejs/interface-dms v0.5.12 ([029d1f2d](https://github.com/AntelopeJS/dms/commit/029d1f2d))
26
+
27
+ ### ❤️ Contributors
28
+
29
+ - Antony Rizzitelli <rizzitelli.antony@pm.me>
30
+
3
31
  ## v0.7.16
4
32
 
5
33
  [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.15...v0.7.16)
@@ -63,6 +63,19 @@ describe("[unit] interfaces/dms-base/layouts — header buttons", () => {
63
63
  },
64
64
  ]);
65
65
  });
66
+ it("serves a download target as declared, its tokens for the client", () => {
67
+ const target = {
68
+ type: "download",
69
+ url: "/api/lang/translations/export?workspace={{query.workspace}}&locale={{query.locale}}",
70
+ filename: "{{query.locale}}.json",
71
+ };
72
+ const layout = (0, layouts_1.DefaultLayout)({
73
+ headerActions: [{ id: "download-language", label: "Download", target }],
74
+ });
75
+ (0, chai_1.expect)(actionsOf(layout.options)).to.deep.equal([
76
+ { id: "download-language", label: "Download", target },
77
+ ]);
78
+ });
66
79
  it("serves the order a button declares", () => {
67
80
  const layout = (0, layouts_1.DefaultLayout)({
68
81
  headerActions: [
@@ -1 +1 @@
1
- {"version":3,"file":"layout-header-actions.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/layout-header-actions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout-header-actions.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/layout-header-actions.test.ts"],"names":[],"mappings":"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"}
@@ -117,13 +117,20 @@ const defaultVariant = (
117
117
  const orderOf = (action: LayoutHeaderAction): number =>
118
118
  action.order ?? DEFAULT_PAGE_HEADER_ACTIONS_ORDER;
119
119
 
120
+ // A served label's translation reads the page query as its parameters:
121
+ // `"Download {locale}.json"` names the language of `?locale=`.
122
+ function labelParams(): Record<string, unknown> {
123
+ const { routeParams, routeQuery } = pageUrlValues.value;
124
+ return { ...routeParams, ...routeQuery };
125
+ }
126
+
120
127
  function baseButton(action: LayoutHeaderAction): ButtonProps {
121
128
  const color = action.color ?? "neutral";
122
129
  return {
123
130
  color,
124
131
  variant: action.variant ?? defaultVariant(color),
125
132
  icon: action.icon,
126
- label: action.label ? processI18n(action.label) : undefined,
133
+ label: action.label ? processI18n(action.label, labelParams()) : undefined,
127
134
  disabled: action.disabled,
128
135
  };
129
136
  }
@@ -47,7 +47,13 @@ export function withQuery(url: string, query: Record<string, QueryValue>) {
47
47
  return joined ? `${path}?${joined}` : (path ?? url);
48
48
  }
49
49
 
50
- const URL_TARGET_TYPES = new Set(["page", "external", "api", "exportJob"]);
50
+ const URL_TARGET_TYPES = new Set([
51
+ "page",
52
+ "external",
53
+ "download",
54
+ "api",
55
+ "exportJob",
56
+ ]);
51
57
 
52
58
  /** A target sending the selection along: its URL carries the query. */
53
59
  export function targetWithSelection(
@@ -51,7 +51,10 @@ import {
51
51
  import {
52
52
  hasUrlVariables,
53
53
  resolveLinkVariables,
54
+ resolveTextVariables,
54
55
  } from "../../utils/urlVariables";
56
+ import { interpolateLiteral } from "../../utils/literalText";
57
+ import { type DownloadFetch, saveDownload } from "../../utils/fileDownload";
55
58
 
56
59
  /** Runs a confirmed action from inside its dialog (see `onConfirm`). */
57
60
  type ConfirmedRun = NonNullable<ConfirmOptions["onConfirm"]>;
@@ -70,6 +73,21 @@ function linkTargetUrl(url: string, rowData?: Data): string {
70
73
  return rowData ? interpolateUrl(withPageValues, rowData) : withPageValues;
71
74
  }
72
75
 
76
+ /**
77
+ * A download target's file name with the page's tokens filled as they are
78
+ * (a name, not a URL: nothing is encoded), then the row's `{field}`. A token
79
+ * the page has no value for leaves no name: the server's one is used.
80
+ */
81
+ function downloadTargetFilename(
82
+ filename: string | undefined,
83
+ rowData?: Data,
84
+ ): string | undefined {
85
+ if (!filename) return undefined;
86
+ const withPageValues = resolveTextVariables(filename, currentPageUrlValues());
87
+ if (!withPageValues || !rowData) return withPageValues;
88
+ return interpolateLiteral(withPageValues, rowData);
89
+ }
90
+
73
91
  function currentPageUrlValues() {
74
92
  const route = useDmsRoute();
75
93
  return {
@@ -110,6 +128,7 @@ interface TargetRunExtras {
110
128
  }
111
129
 
112
130
  type SidePanelTarget = ActionTarget & { type: "sidePanel" };
131
+ type DownloadTarget = ActionTarget & { type: "download" };
113
132
 
114
133
  /** A side panel to open, and on what. */
115
134
  interface SidePanelTargetRun extends TargetRunExtras {
@@ -148,6 +167,7 @@ export function useActionTargets(config: ActionTargetsConfig) {
148
167
  const { copy: copyToClipboard } = useClipboard({ legacy: true });
149
168
  const { confirmAction } = useActionConfirm();
150
169
  const { handleApiError } = config;
170
+ const fetchRaw = useAuthFetch().$authFetch.raw as unknown as DownloadFetch;
151
171
 
152
172
  /** Calls an `api` target and tells how it went (rejects on a failure). */
153
173
  const requestApiTarget = async (
@@ -249,6 +269,26 @@ export function useActionTargets(config: ActionTargetsConfig) {
249
269
  });
250
270
  };
251
271
 
272
+ // Fetched with the user's session, as a confirmation's download is; a
273
+ // refusal is toasted like a failed API call.
274
+ const handleDownloadTarget = async (
275
+ target: DownloadTarget,
276
+ label: string,
277
+ rowData?: Data,
278
+ ) => {
279
+ try {
280
+ await saveDownload(
281
+ {
282
+ url: linkTargetUrl(target.url, rowData),
283
+ filename: downloadTargetFilename(target.filename, rowData),
284
+ },
285
+ fetchRaw,
286
+ );
287
+ } catch (error: unknown) {
288
+ handleApiError(error, label ? processI18n(label, rowData) : undefined);
289
+ }
290
+ };
291
+
252
292
  const openContainer = (
253
293
  run: ComponentTargetRun,
254
294
  component: Component,
@@ -462,6 +502,8 @@ export function useActionTargets(config: ActionTargetsConfig) {
462
502
  : jobTarget.url;
463
503
  await handleExportJobTarget(jobTarget, url, rowData);
464
504
  },
505
+ download: (target, label, rowData) =>
506
+ handleDownloadTarget(target as DownloadTarget, label, rowData),
465
507
  modal: componentHandler,
466
508
  // Runs the quick action as the command palette does; one the user is not
467
509
  // served runs nothing.
@@ -1,50 +1,10 @@
1
1
  import type {
2
- ConfirmDialogDownloadTarget,
3
2
  ConfirmDialogLinkTarget,
4
3
  ConfirmDialogSecondaryTarget,
5
4
  } from "#dms-core/app/types/confirm-dialog";
6
- import { downloadFile } from "#dms-core/app/utils/downloadFile";
5
+ import { type DownloadFetch, saveDownload } from "../../utils/fileDownload";
7
6
  import type { SecondaryTargetRun } from "./confirmDialogTexts";
8
7
 
9
- /** The response a download reads: its body and its headers. */
10
- export interface DownloadResponse {
11
- _data?: Blob;
12
- headers: Headers;
13
- }
14
-
15
- /** Fetches a download with the user's session (`$authFetch.raw`). */
16
- export type DownloadFetch = (
17
- url: string,
18
- options: { responseType: "blob" },
19
- ) => Promise<DownloadResponse>;
20
-
21
- const DISPOSITION_NAME = /filename\*?=(?:UTF-8'')?"?([^";]+)"?/i;
22
- const FALLBACK_FILENAME = "download";
23
-
24
- // A malformed escape is kept as written rather than failing the download.
25
- function decodeName(name: string): string {
26
- try {
27
- return decodeURIComponent(name);
28
- } catch {
29
- return name;
30
- }
31
- }
32
-
33
- /**
34
- * The name a download is saved under: the declared one, else the server's
35
- * `Content-Disposition` one, else the URL's last path segment.
36
- */
37
- export function downloadFilename(
38
- target: ConfirmDialogDownloadTarget,
39
- disposition: string | null,
40
- ): string {
41
- if (target.filename) return target.filename;
42
- const served = disposition ? DISPOSITION_NAME.exec(disposition)?.[1] : "";
43
- if (served) return decodeName(served.trim());
44
- const path = target.url.split(/[?#]/)[0] ?? "";
45
- return decodeName(path.split("/").pop() || FALLBACK_FILENAME);
46
- }
47
-
48
8
  function openLink(target: ConfirmDialogLinkTarget): void {
49
9
  if (typeof window === "undefined" || !target.url) return;
50
10
  if (target.newTab) {
@@ -54,24 +14,6 @@ function openLink(target: ConfirmDialogLinkTarget): void {
54
14
  window.location.href = target.url;
55
15
  }
56
16
 
57
- async function saveDownload(
58
- target: ConfirmDialogDownloadTarget,
59
- fetchRaw: DownloadFetch,
60
- ): Promise<void> {
61
- if (!target.url) return;
62
- const response = await fetchRaw(target.url, { responseType: "blob" });
63
- const blob = response._data ?? new Blob([]);
64
- const objectUrl = URL.createObjectURL(blob);
65
- try {
66
- downloadFile(
67
- objectUrl,
68
- downloadFilename(target, response.headers.get("content-disposition")),
69
- );
70
- } finally {
71
- URL.revokeObjectURL(objectUrl);
72
- }
73
- }
74
-
75
17
  /**
76
18
  * Runs the target of a confirmation's secondary action, the dialog left
77
19
  * open: a link opens, a download is fetched with `fetchRaw` and saved.
@@ -13,7 +13,8 @@ import {
13
13
  type ConfirmTranslate,
14
14
  resolveConfirmDialog,
15
15
  } from "./confirmDialogTexts";
16
- import { type DownloadFetch, secondaryTargetRunner } from "./secondaryTarget";
16
+ import type { DownloadFetch } from "../../utils/fileDownload";
17
+ import { secondaryTargetRunner } from "./secondaryTarget";
17
18
 
18
19
  /** What an action asks its confirmation with. */
19
20
  export interface ActionConfirmRequest {
@@ -0,0 +1,69 @@
1
+ import { downloadFile } from "#dms-core/app/utils/downloadFile";
2
+
3
+ /** A file to fetch with the user's session, and the name it is saved under. */
4
+ export interface FileDownload {
5
+ url: string;
6
+ /** Saved under; the response's `Content-Disposition` name, else the URL's. */
7
+ filename?: string;
8
+ }
9
+
10
+ /** The response a download reads: its body and its headers. */
11
+ export interface DownloadResponse {
12
+ _data?: Blob;
13
+ headers: Headers;
14
+ }
15
+
16
+ /** Fetches a download with the user's session (`$authFetch.raw`). */
17
+ export type DownloadFetch = (
18
+ url: string,
19
+ options: { responseType: "blob" },
20
+ ) => Promise<DownloadResponse>;
21
+
22
+ const DISPOSITION_NAME = /filename\*?=(?:UTF-8'')?"?([^";]+)"?/i;
23
+ const FALLBACK_FILENAME = "download";
24
+
25
+ // A malformed escape is kept as written rather than failing the download.
26
+ function decodeName(name: string): string {
27
+ try {
28
+ return decodeURIComponent(name);
29
+ } catch {
30
+ return name;
31
+ }
32
+ }
33
+
34
+ /**
35
+ * The name a download is saved under: the declared one, else the server's
36
+ * `Content-Disposition` one, else the URL's last path segment.
37
+ */
38
+ export function downloadFilename(
39
+ download: FileDownload,
40
+ disposition: string | null,
41
+ ): string {
42
+ if (download.filename) return download.filename;
43
+ const served = disposition ? DISPOSITION_NAME.exec(disposition)?.[1] : "";
44
+ if (served) return decodeName(served.trim());
45
+ const path = download.url.split(/[?#]/)[0] ?? "";
46
+ return decodeName(path.split("/").pop() || FALLBACK_FILENAME);
47
+ }
48
+
49
+ /**
50
+ * Fetches a file with `fetchRaw` (the user's session) and saves it; rejects
51
+ * when the request fails.
52
+ */
53
+ export async function saveDownload(
54
+ download: FileDownload,
55
+ fetchRaw: DownloadFetch,
56
+ ): Promise<void> {
57
+ if (!download.url) return;
58
+ const response = await fetchRaw(download.url, { responseType: "blob" });
59
+ const blob = response._data ?? new Blob([]);
60
+ const objectUrl = URL.createObjectURL(blob);
61
+ try {
62
+ downloadFile(
63
+ objectUrl,
64
+ downloadFilename(download, response.headers.get("content-disposition")),
65
+ );
66
+ } finally {
67
+ URL.revokeObjectURL(objectUrl);
68
+ }
69
+ }
@@ -25,6 +25,18 @@ export interface SidePanelTargetOptions {
25
25
  notFound?: SidePanelNotFoundTexts;
26
26
  }
27
27
 
28
+ /**
29
+ * Fetches a file with the user's session and saves it (backend
30
+ * `DownloadActionTarget`).
31
+ */
32
+ export interface DownloadActionTarget {
33
+ type: "download";
34
+ /** Takes the `{field}` and `{{params.X}}` / `{{query.X}}` tokens. */
35
+ url: string;
36
+ /** Saved under; the response's `Content-Disposition` name, else the URL's. */
37
+ filename?: string;
38
+ }
39
+
28
40
  export type ActionTarget =
29
41
  | {
30
42
  type: "drawer";
@@ -45,6 +57,7 @@ export type ActionTarget =
45
57
  | ({ type: "sidePanel"; component: ComponentInfo } & SidePanelTargetOptions)
46
58
  | { type: "page"; url: string }
47
59
  | { type: "external"; url: string; newTab?: boolean }
60
+ | DownloadActionTarget
48
61
  /** Runs a quick action, by its `category:id` key or bare id. */
49
62
  | { type: "quickAction"; id: string }
50
63
  | {
@@ -12,10 +12,8 @@ import {
12
12
  import { createI18n } from "vue-i18n";
13
13
  import ConfirmModal from "../layers/dms-ui/app/components/confirm/ConfirmModal.vue";
14
14
  import { resolveConfirmDialog } from "../layers/dms-ui/app/build/composables/confirm/confirmDialogTexts";
15
- import {
16
- downloadFilename,
17
- secondaryTargetRunner,
18
- } from "../layers/dms-ui/app/build/composables/confirm/secondaryTarget";
15
+ import { secondaryTargetRunner } from "../layers/dms-ui/app/build/composables/confirm/secondaryTarget";
16
+ import { downloadFilename } from "../layers/dms-ui/app/build/utils/fileDownload";
19
17
 
20
18
  vi.mock("reka-ui", async () => {
21
19
  const { defineComponent: define, h: render } = await import("vue");
@@ -0,0 +1,172 @@
1
+ // @vitest-environment jsdom
2
+ /**
3
+ * A `download` action target fetches its file with the user's session and
4
+ * saves it: its URL and file name take the page's `{{params.X}}` /
5
+ * `{{query.X}}` and the row's `{field}`, and a refusal is toasted.
6
+ */
7
+ import { createApp, defineComponent, h, reactive, type App } from "vue";
8
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
9
+ import { useActionTargets } from "../layers/dms-ui/app/build/composables/actions/useActionTargets";
10
+ import { interpolateUrl } from "../layers/dms-core/app/utils/url-interpolation";
11
+ import type { CustomButton } from "../layers/dms-ui/app/composables/table-view/types/custom-button";
12
+ import type { CustomRowAction } from "../layers/dms-ui/app/types/row-action";
13
+
14
+ const route = reactive<{ path: string; query: Record<string, unknown> }>({
15
+ path: "/modules/lang/queue/de",
16
+ query: {},
17
+ });
18
+ const fetchRaw = vi.fn();
19
+ const handleApiError = vi.fn();
20
+ const saved: string[] = [];
21
+ let app: App | undefined;
22
+
23
+ function mountTargets() {
24
+ let targets: ReturnType<typeof useActionTargets> | undefined;
25
+ app = createApp(
26
+ defineComponent({
27
+ setup() {
28
+ targets = useActionTargets({
29
+ api: vi.fn() as never,
30
+ pageId: "queue-page",
31
+ componentId: "page-header",
32
+ handleApiError,
33
+ });
34
+ return () => h("div");
35
+ },
36
+ }),
37
+ );
38
+ app.mount(document.createElement("div"));
39
+ return targets!;
40
+ }
41
+
42
+ const downloadButton = (filename?: string): CustomButton => ({
43
+ id: "download-language",
44
+ label: "Download",
45
+ target: {
46
+ type: "download",
47
+ url: "/api/lang/translations/export?workspace={{query.workspace}}&locale={{query.locale}}",
48
+ filename,
49
+ },
50
+ });
51
+
52
+ const served = (disposition?: string) =>
53
+ fetchRaw.mockResolvedValue({
54
+ _data: new Blob(["{}"]),
55
+ headers: new Headers(
56
+ disposition ? { "content-disposition": disposition } : {},
57
+ ),
58
+ });
59
+
60
+ beforeEach(() => {
61
+ route.query = { workspace: "web", locale: "pt BR" };
62
+ fetchRaw.mockReset();
63
+ handleApiError.mockReset();
64
+ saved.length = 0;
65
+ vi.stubGlobal("useToast", () => ({ add: vi.fn() }));
66
+ vi.stubGlobal("useTranslation", () => ({
67
+ processI18n: (text: string) => text,
68
+ processApiMessage: (text: string) => text,
69
+ }));
70
+ vi.stubGlobal("useI18n", () => ({ t: (key: string) => key }));
71
+ vi.stubGlobal("useModal", () => ({ open: vi.fn() }));
72
+ vi.stubGlobal("useDrawer", () => ({ open: vi.fn() }));
73
+ vi.stubGlobal("useExportJob", () => ({ runJob: vi.fn() }));
74
+ vi.stubGlobal("useConfirm", () => ({ confirm: vi.fn(async () => true) }));
75
+ vi.stubGlobal("useAuthFetch", () => ({
76
+ $authFetch: Object.assign(vi.fn(), { raw: fetchRaw }),
77
+ }));
78
+ vi.stubGlobal("interpolateUrl", interpolateUrl);
79
+ vi.stubGlobal("useDmsRoute", () => route);
80
+ vi.stubGlobal("useSiteLayout", () => ({
81
+ findMatchingRoute: () => ({ params: { locale: "de" } }),
82
+ }));
83
+ vi.stubGlobal(
84
+ "URL",
85
+ Object.assign(URL, {
86
+ createObjectURL: vi.fn(() => "blob:file"),
87
+ revokeObjectURL: vi.fn(),
88
+ }),
89
+ );
90
+ vi.spyOn(HTMLAnchorElement.prototype, "click").mockImplementation(function (
91
+ this: HTMLAnchorElement,
92
+ ) {
93
+ saved.push(this.download);
94
+ });
95
+ });
96
+
97
+ afterEach(() => {
98
+ app?.unmount();
99
+ app = undefined;
100
+ vi.restoreAllMocks();
101
+ vi.unstubAllGlobals();
102
+ });
103
+
104
+ describe("a download action target", () => {
105
+ it("fetches the page's file with the session, under the declared name", async () => {
106
+ served('attachment; filename="served.json"');
107
+ mountTargets().handleCustomButton(downloadButton("{{query.locale}}.json"));
108
+ await vi.waitFor(() => expect(saved).toEqual(["pt BR.json"]));
109
+ expect(fetchRaw).toHaveBeenCalledWith(
110
+ "/api/lang/translations/export?workspace=web&locale=pt%20BR",
111
+ { responseType: "blob" },
112
+ );
113
+ });
114
+
115
+ it("leaves out a query pair the page has no value for", async () => {
116
+ route.query = { locale: "fr" };
117
+ served();
118
+ mountTargets().handleCustomButton(downloadButton());
119
+ await vi.waitFor(() => expect(saved).toHaveLength(1));
120
+ expect(fetchRaw).toHaveBeenCalledWith(
121
+ "/api/lang/translations/export?locale=fr",
122
+ { responseType: "blob" },
123
+ );
124
+ });
125
+
126
+ it("is saved under the server's name, else the URL's, without one declared", async () => {
127
+ served('attachment; filename="fr.json"');
128
+ mountTargets().handleCustomButton(downloadButton());
129
+ await vi.waitFor(() => expect(saved).toEqual(["fr.json"]));
130
+
131
+ served();
132
+ mountTargets().handleCustomButton(downloadButton());
133
+ await vi.waitFor(() => expect(saved).toEqual(["fr.json", "export"]));
134
+ });
135
+
136
+ it("falls back to the server's name while a name token has no value", async () => {
137
+ route.query = { workspace: "web" };
138
+ served('attachment; filename="web.json"');
139
+ mountTargets().handleCustomButton(downloadButton("{{query.locale}}.json"));
140
+ await vi.waitFor(() => expect(saved).toEqual(["web.json"]));
141
+ });
142
+
143
+ it("fills a row action's URL and name with the row's fields", async () => {
144
+ served();
145
+ const action: CustomRowAction = {
146
+ label: "Download",
147
+ target: {
148
+ type: "download",
149
+ url: "/api/files/{_id}?workspace={{query.workspace}}",
150
+ filename: "{name}",
151
+ },
152
+ };
153
+ mountTargets().handleCustomRowAction(action, {
154
+ _id: "f 1",
155
+ name: "report.csv",
156
+ });
157
+ await vi.waitFor(() => expect(saved).toEqual(["report.csv"]));
158
+ expect(fetchRaw).toHaveBeenCalledWith("/api/files/f%201?workspace=web", {
159
+ responseType: "blob",
160
+ });
161
+ });
162
+
163
+ it("toasts a refused download under the button's label", async () => {
164
+ const refusal = new Error("Forbidden");
165
+ fetchRaw.mockRejectedValue(refusal);
166
+ mountTargets().handleCustomButton(downloadButton());
167
+ await vi.waitFor(() =>
168
+ expect(handleApiError).toHaveBeenCalledWith(refusal, "Download"),
169
+ );
170
+ expect(saved).toEqual([]);
171
+ });
172
+ });
@@ -73,7 +73,10 @@ beforeEach(() => {
73
73
  vi.stubGlobal("useAuthFetch", () => ({ $authFetch: authFetch }));
74
74
  vi.stubGlobal("computed", computed);
75
75
  vi.stubGlobal("useTranslation", () => ({
76
- processI18n: (value: string) => value,
76
+ processI18n: (value: string, params?: Record<string, unknown>) =>
77
+ value.replace(/\{(\w+)\}/g, (_, name: string) =>
78
+ String(params?.[name] ?? `{${name}}`),
79
+ ),
77
80
  }));
78
81
  vi.stubGlobal("useI18n", () => ({ t: (key: string) => key }));
79
82
  vi.stubGlobal("useDmsRoute", () => route);
@@ -244,6 +247,48 @@ describe("a header button's target URL", () => {
244
247
  }),
245
248
  );
246
249
  });
250
+ it("runs a download target on the page's scope, as a button", async () => {
251
+ await mountBar([
252
+ {
253
+ id: "download-language",
254
+ label: "Download",
255
+ target: {
256
+ type: "download",
257
+ url: "/api/lang/translations/export?workspace={{query.workspace}}&locale={{params.locale}}",
258
+ filename: "{{params.locale}}.json",
259
+ },
260
+ },
261
+ ]);
262
+ expect(buttons()[0]?.dataset.to).toBeUndefined();
263
+ buttons()[0]?.click();
264
+ expect(handleCustomButton).toHaveBeenCalledWith(
265
+ expect.objectContaining({
266
+ target: {
267
+ type: "download",
268
+ url: "/api/lang/translations/export?workspace=web&locale=de",
269
+ filename: "{{params.locale}}.json",
270
+ },
271
+ }),
272
+ );
273
+ });
274
+ });
275
+
276
+ describe("a header button's label", () => {
277
+ it("reads the page's query and params as its parameters, and follows them", async () => {
278
+ route.query = { workspace: "web", file: "fr" };
279
+ await mountBar([
280
+ {
281
+ id: "download",
282
+ label: "Download {file}.json for {locale}",
283
+ target: { type: "page", url: "/x" },
284
+ },
285
+ ]);
286
+ expect(labels()).toEqual(["Download fr.json for de"]);
287
+
288
+ route.query = { workspace: "web", file: "it" };
289
+ await nextTick();
290
+ expect(labels()).toEqual(["Download it.json for de"]);
291
+ });
247
292
  });
248
293
 
249
294
  describe("a header button's availability", () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/dms",
3
- "version": "0.7.16",
3
+ "version": "0.7.18",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/AntelopeJS/dms.git"
@@ -36,7 +36,8 @@ gets `navigation` (J / K, `index` / `total` in the order shown) —
36
36
  `docs/04.components/06.tables/8.row-drawers.md`.
37
37
 
38
38
  A page's `headerActions` follow its URL: a target URL takes `{{params.X}}` / `{{query.X}}`
39
- (`?workspace={{query.workspace}}`, a pair the page has no value for is dropped), and an
39
+ (`?workspace={{query.workspace}}`, a pair the page has no value for is dropped), a label's
40
+ translation takes the page's route and query parameters (`"Download {locale}.json"`), and an
40
41
  `availability` reads `context.query`, asked again when the query changes — no need to build
41
42
  the header in Vue with `usePageHeaderActions` to carry the scope —
42
43
  `docs/07.interfaces/3.base/6.layout.md#buttons-that-follow-the-page-url`. An `availability`
@@ -55,6 +56,9 @@ target instead: a non-modal panel docked on the right whose header the DMS draws
55
56
  `rowTitle` naming the row from its fields, `positionLabel` "x of y", previous / next, J / K, close), `?record=` kept by default (`deepLink: false` opts out), a "not found" state on a 404 (`notFound: { title, description }`) and the table's
56
57
  `rowClick: "single"` (a `TableView.fromSource` table reads a deep-linked row beyond its first page through `fetchRowUrl: "/api/x/{id}"`) — never bridge the table's DOM to build one —
57
58
  `docs/04.components/06.tables/8.row-drawers.md#side-panel`.
59
+ A button downloading a file the user's session may read (`/api/...`) takes a `download`
60
+ target, `{ url, filename? }`, with the same `{field}` / `{{query.X}}` tokens — never a Vue
61
+ header button or an `api` target for it — `docs/07.interfaces/3.base/2.types.md`.
58
62
 
59
63
  A row that must stay on top of a table under any sort (a base language, a default
60
64
  workspace) takes `pinnedRows: { field: "isBase", equals: true }` — never sort on the