@antelopejs/dms 0.7.16 → 0.7.17

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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.7.17
4
+
5
+ [compare changes](https://github.com/AntelopeJS/dms/compare/v0.7.16...v0.7.17)
6
+
7
+ ### 🚀 Enhancements
8
+
9
+ - **actions:** Let a button download a file with the user's session ([#246](https://github.com/AntelopeJS/dms/pull/246))
10
+
11
+ ### 🏡 Chore
12
+
13
+ - **release:** @antelopejs/interface-dms v0.5.12 ([029d1f2d](https://github.com/AntelopeJS/dms/commit/029d1f2d))
14
+
15
+ ### ❤️ Contributors
16
+
17
+ - Antony Rizzitelli <rizzitelli.antony@pm.me>
18
+
3
19
  ## v0.7.16
4
20
 
5
21
  [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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"}
@@ -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
+ });
@@ -244,6 +244,30 @@ describe("a header button's target URL", () => {
244
244
  }),
245
245
  );
246
246
  });
247
+ it("runs a download target on the page's scope, as a button", async () => {
248
+ await mountBar([
249
+ {
250
+ id: "download-language",
251
+ label: "Download",
252
+ target: {
253
+ type: "download",
254
+ url: "/api/lang/translations/export?workspace={{query.workspace}}&locale={{params.locale}}",
255
+ filename: "{{params.locale}}.json",
256
+ },
257
+ },
258
+ ]);
259
+ expect(buttons()[0]?.dataset.to).toBeUndefined();
260
+ buttons()[0]?.click();
261
+ expect(handleCustomButton).toHaveBeenCalledWith(
262
+ expect.objectContaining({
263
+ target: {
264
+ type: "download",
265
+ url: "/api/lang/translations/export?workspace=web&locale=de",
266
+ filename: "{{params.locale}}.json",
267
+ },
268
+ }),
269
+ );
270
+ });
247
271
  });
248
272
 
249
273
  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.17",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/AntelopeJS/dms.git"
@@ -55,6 +55,9 @@ target instead: a non-modal panel docked on the right whose header the DMS draws
55
55
  `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
56
  `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
57
  `docs/04.components/06.tables/8.row-drawers.md#side-panel`.
58
+ A button downloading a file the user's session may read (`/api/...`) takes a `download`
59
+ target, `{ url, filename? }`, with the same `{field}` / `{{query.X}}` tokens — never a Vue
60
+ header button or an `api` target for it — `docs/07.interfaces/3.base/2.types.md`.
58
61
 
59
62
  A row that must stay on top of a table under any sort (a base language, a default
60
63
  workspace) takes `pinnedRows: { field: "isBase", equals: true }` — never sort on the