@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 +16 -0
- package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js +13 -0
- package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js.map +1 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/actions/bulkSelection.ts +7 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/actions/useActionTargets.ts +42 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/confirm/secondaryTarget.ts +1 -59
- package/frontend-vue/layers/dms-ui/app/build/composables/confirm/useActionConfirm.ts +2 -1
- package/frontend-vue/layers/dms-ui/app/build/utils/fileDownload.ts +69 -0
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/action-target.ts +13 -0
- package/frontend-vue/tests/confirm-secondary-action.test.ts +2 -4
- package/frontend-vue/tests/download-action-target.test.ts +172 -0
- package/frontend-vue/tests/header-action-page-query.test.ts +24 -0
- package/package.json +1 -1
- package/skills/dms-pages/REFERENCE.md +3 -0
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":";;AAAA,+BAA8B;AAC9B,oEAAuE;AAGvE,yFAG+D;AAC/D,sFAA4F;AAC5F,sGAAyG;AAMzG,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAExD,SAAS,SAAS,CAAC,OAAgB;IACjC,OAAQ,OAA4D;SACjE,aAAc,CAAC;AACpB,CAAC;AAED,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,IAAA,aAAM,EAAC,IAAA,uBAAa,GAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC;YAC3B,aAAa,EAAE;gBACb;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,aAAa;oBACpB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,qBAAqB,EAAE;iBAC3D;gBACD;oBACE,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE;wBACN,IAAI,EAAE,UAAU;wBAChB,GAAG,EAAE,wBAAwB;wBAC7B,MAAM,EAAE,IAAI;qBACb;iBACF;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE;oBACpE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE;iBACnD;aACF;SACF,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9C;gBACE,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,qBAAqB,EAAE;aAC3D;YACD;gBACE,EAAE,EAAE,UAAU;gBACd,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE;oBACN,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,wBAAwB;oBAC7B,MAAM,EAAE,IAAI;iBACb;aACF;YACD;gBACE,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE;gBACpE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE;aACnD;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,UAAmB;YACzB,GAAG,EAAE,qFAAqF;YAC1F,QAAQ,EAAE,uBAAuB;SAClC,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC;YAC3B,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;SACxE,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9C,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;SACvD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC;YAC3B,aAAa,EAAE;gBACb;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;oBACnC,KAAK,EAAE,CAAC;iBACT;aACF;SACF,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACnC,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,EAAE;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,UAAmB,EAAE,EAAE,CAAC,CAAC;QACjD,EAAE;QACF,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QAChD,UAAU;KACX,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC;QAC3B,aAAa,EAAE;YACb,IAAI,CAAC,MAAM,CAAC;YACZ,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YACtB,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;YACxB,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,mBAAmB,EAAE;SACzD;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,QAAQ,GAAG,MAAM,IAAA,yCAAyB,EAC9C,MAAM,EACN,KAAK,IAAI,EAAE,CACT,IAAI,GAAG,CACL,IAAA,wCAAuB,EAAC;YACtB,sBAAsB;YACtB,mBAAmB;SACpB,CAAC,CACH,EACH,OAAO,EACP,eAAe,CAChB,CAAC;QAEF,IAAA,aAAM,EACJ,SAAS,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CACxD,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9C,IAAA,aAAM,EAAC,SAAS,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC3E,IAAA,aAAM,EAAC,SAAS,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAC1D,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,QAAQ,GAAG,MAAM,IAAA,yCAAyB,EAC9C,MAAM,EACN,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,IAAA,wCAAuB,EAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EACtE,OAAO,EACP,SAAS,CACV,CAAC;QAEF,IAAA,aAAM,EACJ,SAAS,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CACxD,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC;YAC5B,aAAa,EAAE;gBACb;oBACE,GAAG,IAAI,CAAC,QAAQ,CAAC;oBACjB,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC7B,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS;iBAChE;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CACxB,CAAC,MAAM,IAAA,yCAAyB,EAC9B,OAAO,EACP,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,EACrB,OAAO,EACP,eAAe,CAChB,CAAE,CAAC,OAAO,CACZ,CAAC;QAEF,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,aAAa;SAC9B,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC;YAC3B,aAAa,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC;gBACZ;oBACE,GAAG,IAAI,CAAC,SAAS,CAAC;oBAClB,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC1B,KAAK,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;iBAChE;aACF;SACF,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,EAAE,KAA6B,EAAE,EAAE,CACpD,CAAC,MAAM,IAAA,yCAAyB,EAC9B,MAAM,EACN,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,EACrB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,EACrB,YAAY,CACb,CAAE,CAAC,OAGH,CAAC;QAEJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,IAAA,aAAM,EAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACtE,MAAM;SACP,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,IAAA,aAAM,EAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACjE,MAAM;YACN,SAAS;SACV,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC;YAC1B,aAAa,EAAE;gBACb;oBACE,GAAG,IAAI,CAAC,UAAU,CAAC;oBACnB,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC1B,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE;iBACnE;aACF;SACF,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,EAAE,KAA6B,EAAE,EAAE,CACpD,CAAC,MAAM,IAAA,yCAAyB,EAC9B,KAAK,EACL,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,EACrB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,EACrB,YAAY,CACb,CAAE,CAAC,OAGH,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAA,aAAM,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjE,IAAA,aAAM,EAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9C,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAA,aAAM,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,QAAQ,GAAG,MAAM,IAAA,yCAAyB,EAC9C,IAAA,uBAAa,EAAC,EAAE,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAChD,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,EACrB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAC3C,eAAe,CAChB,CAAC;QACF,IAAA,aAAM,EAAC,QAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,EAAE,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,MAAM,IAAA,yCAAyB,EAC7B,IAAI,EACJ,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,IAAI,GAAG,EAAU,CAAC;QAC3B,CAAC,EACD,OAAO,EACP,eAAe,CAChB,CAAC;QAEF,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAA,yCAAyB,EAC7B,MAAM,EACN,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,EACrB,OAAO,EACP,eAAe,CAChB,CAAC;QACF,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qEAAqE,EAAE,GAAG,EAAE;IACnF,MAAM,UAAU,GAAG;QACjB,KAAK,EAAE;YACL,aAAa,EAAE,gBAAgB;YAC/B,OAAO,EAAE;gBACP,aAAa,EAAE;oBACb;wBACE,EAAE,EAAE,QAAQ;wBACZ,KAAK,EAAE,QAAQ;wBACf,KAAK,EAAE,SAAS;wBAChB,SAAS,EAAE,QAAQ;wBACnB,QAAQ,EAAE,IAAI;wBACd,cAAc,EAAE,aAAa;wBAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE;qBAC7D;oBACD;wBACE,EAAE,EAAE,QAAQ;wBACZ,KAAK,EAAE,QAAQ;wBACf,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;qBACpC;iBACF;gBACD,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;aAClE;SACF;KACoD,CAAC;IAExD,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GAAG,IAAA,0CAA0B,EACvC,IAAA,uBAAa,EAAC;YACZ,aAAa,EAAE;gBACb,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;aAC1D;SACF,CAAC,EACF,UAAU,CACX,CAAC;QAEF,IAAA,aAAM,EAAC,SAAS,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/C,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YACzE;gBACE,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,IAAI;gBACd,cAAc,EAAE,aAAa;gBAC7B,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,QAAQ;aACnB;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,SAAS;gBAChB,WAAW,EAAE,OAAO;aACrB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG;YACd,KAAK,EAAE;gBACL,GAAG,UAAU,CAAC,KAAK;gBACnB,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;aACxC;SACoD,CAAC;QACxD,MAAM,MAAM,GAAG,IAAA,uBAAa,GAAE,CAAC;QAC/B,IAAA,aAAM,EAAC,IAAA,0CAA0B,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU;gBACzB,QAAQ,EAAE;oBACR;wBACE,EAAE,EAAE,QAAQ;wBACZ,SAAS,EAAE;4BACT,aAAa,EAAE,UAAU;4BACzB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;yBACzD;qBACF;iBACF;aACF;SACoD,CAAC;QAExD,MAAM,MAAM,GAAG,IAAA,0CAA0B,EAAC,IAAA,uBAAa,GAAE,EAAE,MAAM,CAAC,CAAC;QAEnE,IAAA,aAAM,EACJ,SAAS,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YACjE,EAAE;YACF,WAAW;YACX,QAAQ;SACT,CAAC,CAAC,CACJ,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACd;gBACE,EAAE,EAAE,yCAAyC;gBAC7C,WAAW,EAAE,kCAAkC;gBAC/C,QAAQ,EAAE,QAAQ;aACnB;YACD;gBACE,EAAE,EAAE,sCAAsC;gBAC1C,WAAW,EAAE,kCAAkC;gBAC/C,QAAQ,EAAE,SAAS;aACpB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAC/F,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACtE;gBACE,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;gBACrC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aACvC;YACD;gBACE,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE;gBACvC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;aAC5C;SACF,CAAC;QACF,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAC7B,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAC7C,MAAgC,CACnC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAA,qCAAoB,EACvC,IAAI,GAAG,EAAE,EACT,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,OAAO,CACR,CAAC;QAEF,IAAA,aAAM,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACvD,QAAQ;YACR,OAAO;SACR,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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([
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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
|
@@ -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
|