@genesislcap/pbc-documents-ui 14.446.0 → 14.446.1-FUI-2541.2
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/dist/dts/services/document.service.d.ts +10 -0
- package/dist/dts/services/document.service.d.ts.map +1 -1
- package/dist/dts/services/document.service.test.d.ts +2 -0
- package/dist/dts/services/document.service.test.d.ts.map +1 -0
- package/dist/esm/services/document.service.js +13 -3
- package/dist/esm/services/document.service.js.map +1 -1
- package/dist/esm/services/document.service.test.js +50 -0
- package/dist/esm/services/document.service.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -27
- package/src/services/document.service.test.ts +87 -0
- package/src/services/document.service.ts +13 -4
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Auth, Connect } from '@genesislcap/foundation-comms';
|
|
1
2
|
import { FileMetaType } from '../types';
|
|
2
3
|
export type UploadParams = {
|
|
3
4
|
file: File;
|
|
@@ -14,5 +15,14 @@ export interface IDocumentService {
|
|
|
14
15
|
downloadDocument(documentId: string): any;
|
|
15
16
|
deleteDocument(documentId: string): any;
|
|
16
17
|
}
|
|
18
|
+
export declare class DocumentServiceImpl implements IDocumentService {
|
|
19
|
+
private connect;
|
|
20
|
+
private auth;
|
|
21
|
+
constructor(connect: Connect, auth: Auth);
|
|
22
|
+
uploadDocument({ file, path, fileMetaType }: UploadParams): Promise<Response>;
|
|
23
|
+
replaceDocument({ file, fileStorageId }: ReplaceParams): Promise<any>;
|
|
24
|
+
deleteDocument(documentId: string): Promise<void>;
|
|
25
|
+
downloadDocument(documentId: string): void;
|
|
26
|
+
}
|
|
17
27
|
export declare const IDocumentService: import("@microsoft/fast-foundation").InterfaceSymbol<IDocumentService>;
|
|
18
28
|
//# sourceMappingURL=document.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.service.d.ts","sourceRoot":"","sources":["../../../src/services/document.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"document.service.d.ts","sourceRoot":"","sources":["../../../src/services/document.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,gBAAgB,CAAC,UAAU,EAAE,MAAM,OAAE;IACrC,cAAc,CAAC,UAAU,EAAE,MAAM,OAAE;CACpC;AAED,qBAAa,mBAAoB,YAAW,gBAAgB;IAE/C,OAAO,CAAC,OAAO;IAClB,OAAO,CAAC,IAAI;gBADD,OAAO,EAAE,OAAO,EACnB,IAAI,EAAE,IAAI;IAGpB,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,YAAY;IA0BzD,eAAe,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IA0BrE,cAAc,CAAC,UAAU,EAAE,MAAM;IA4BvC,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAqCpC;AAED,eAAO,MAAM,gBAAgB,wEAE5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.service.test.d.ts","sourceRoot":"","sources":["../../../src/services/document.service.test.ts"],"names":[],"mappings":""}
|
|
@@ -84,15 +84,24 @@ let DocumentServiceImpl = class DocumentServiceImpl {
|
|
|
84
84
|
}
|
|
85
85
|
downloadDocument(documentId) {
|
|
86
86
|
const headers = new Headers();
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
if (this.auth.loggedUserResult) {
|
|
88
|
+
headers.append('SESSION_AUTH_TOKEN', this.auth.loggedUserResult.authToken);
|
|
89
|
+
}
|
|
90
|
+
let filename = documentId;
|
|
89
91
|
fetch(`gwf/file-server/download?fileStorageId=${documentId}`, {
|
|
90
92
|
method: 'GET',
|
|
91
93
|
headers: headers,
|
|
92
94
|
})
|
|
93
95
|
.then((response) => {
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new Error(`Download failed: ${response.status} ${response.statusText}`);
|
|
98
|
+
}
|
|
94
99
|
const contentDispositionHeader = response.headers.get('Content-disposition');
|
|
95
|
-
|
|
100
|
+
const match = contentDispositionHeader === null || contentDispositionHeader === void 0 ? void 0 : contentDispositionHeader.match(/filename\s*=\s*(?:"([^"]+)"|([^;\s]+))/i);
|
|
101
|
+
const parsedFilename = (match === null || match === void 0 ? void 0 : match[1]) || (match === null || match === void 0 ? void 0 : match[2]);
|
|
102
|
+
if (parsedFilename) {
|
|
103
|
+
filename = parsedFilename.trim();
|
|
104
|
+
}
|
|
96
105
|
return response.blob();
|
|
97
106
|
})
|
|
98
107
|
.then((blob) => URL.createObjectURL(blob))
|
|
@@ -114,5 +123,6 @@ DocumentServiceImpl = __decorate([
|
|
|
114
123
|
__param(0, Connect),
|
|
115
124
|
__param(1, Auth)
|
|
116
125
|
], DocumentServiceImpl);
|
|
126
|
+
export { DocumentServiceImpl };
|
|
117
127
|
export const IDocumentService = DI.createInterface((x) => x.singleton(DocumentServiceImpl));
|
|
118
128
|
//# sourceMappingURL=document.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.service.js","sourceRoot":"","sources":["../../../src/services/document.service.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"document.service.js","sourceRoot":"","sources":["../../../src/services/document.service.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAmBlD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YACmB,OAAgB,EACnB,IAAU;QADP,YAAO,GAAP,OAAO,CAAS;QACnB,SAAI,GAAJ,IAAI,CAAM;IACvB,CAAC;IAEJ,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAgB;QAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACjC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtD,OAAO,KAAK,CAAC,yBAAyB,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,aAAa,EAAiB;QAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAElD,OAAO,KAAK,CAAC,0BAA0B,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB;;QACrC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE;gBACjF,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU;iBAC5B;gBACD,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,IAAI,cAAc,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;gBAChD,qBAAqB,CAAC;oBACpB,KAAK,EAAE,iBAAiB;oBACxB,IAAI,EAAE,mCAAmC;oBACzC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAgB,EAAE;iBAClC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,CAAA,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,0CAAE,MAAM,EAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChF,qBAAqB,CAAC;oBACpB,KAAK,EAAE,iBAAiB;oBACxB,IAAI,EAAE,oDAAoD,KAAK,GAAG;oBAClE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAiB,EAAE;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,UAAkB;QACjC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,QAAQ,GAAG,UAAU,CAAC;QAC1B,KAAK,CAAC,0CAA0C,UAAU,EAAE,EAAE;YAC5D,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,OAAO;SACjB,CAAC;aACC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,wBAAwB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACzF,MAAM,cAAc,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,MAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,CAAA,CAAC;YAChD,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;YACnC,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;aACzC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACzB,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;YACb,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;CACF,CAAA;AA3HY,mBAAmB;IAE3B,WAAA,OAAO,CAAA;IACP,WAAA,IAAI,CAAA;GAHI,mBAAmB,CA2H/B;;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,eAAe,CAAmB,CAAC,CAAC,EAAE,EAAE,CACzE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CACjC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
|
|
2
|
+
import { DocumentServiceImpl } from './document.service';
|
|
3
|
+
function withStubbedGlobals(run, sessionStore = {}) {
|
|
4
|
+
const original = {
|
|
5
|
+
fetch: globalThis.fetch,
|
|
6
|
+
sessionStorage: globalThis.sessionStorage,
|
|
7
|
+
};
|
|
8
|
+
let captured;
|
|
9
|
+
globalThis.fetch = ((url, init) => {
|
|
10
|
+
captured = { url, init };
|
|
11
|
+
return new Promise(() => { });
|
|
12
|
+
});
|
|
13
|
+
globalThis.sessionStorage = {
|
|
14
|
+
getItem: (key) => (key in sessionStore ? sessionStore[key] : null),
|
|
15
|
+
};
|
|
16
|
+
try {
|
|
17
|
+
run(() => captured);
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
globalThis.fetch = original.fetch;
|
|
21
|
+
globalThis.sessionStorage = original.sessionStorage;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function makeService(authToken) {
|
|
25
|
+
const auth = {
|
|
26
|
+
loggedUserResult: authToken === null ? null : { authToken },
|
|
27
|
+
};
|
|
28
|
+
const connect = {};
|
|
29
|
+
return new DocumentServiceImpl(connect, auth);
|
|
30
|
+
}
|
|
31
|
+
const Suite = createLogicSuite('DocumentServiceImpl.downloadDocument');
|
|
32
|
+
Suite('sends the auth token from Auth.loggedUserResult, not raw sessionStorage', () => {
|
|
33
|
+
withStubbedGlobals((capture) => {
|
|
34
|
+
const service = makeService('valid-token-123');
|
|
35
|
+
service.downloadDocument('FILE_ID');
|
|
36
|
+
const { url, init } = capture();
|
|
37
|
+
assert.is(url, 'gwf/file-server/download?fileStorageId=FILE_ID');
|
|
38
|
+
assert.is(init.headers.get('SESSION_AUTH_TOKEN'), 'valid-token-123', 'should use the token from Auth, regardless of the sessionStorage key prefix');
|
|
39
|
+
}, { '@custxClientApp/authToken': 'valid-token-123' });
|
|
40
|
+
});
|
|
41
|
+
Suite('omits the auth header when there is no logged-in user', () => {
|
|
42
|
+
withStubbedGlobals((capture) => {
|
|
43
|
+
const service = makeService(null);
|
|
44
|
+
service.downloadDocument('FILE_ID');
|
|
45
|
+
const { init } = capture();
|
|
46
|
+
assert.not.ok(init.headers.get('SESSION_AUTH_TOKEN'), 'no user means no SESSION_AUTH_TOKEN header (never the string "null")');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
Suite.run();
|
|
50
|
+
//# sourceMappingURL=document.service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.service.test.js","sourceRoot":"","sources":["../../../src/services/document.service.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAWzD,SAAS,kBAAkB,CACzB,GAA6C,EAC7C,eAAuC,EAAE;IAEzC,MAAM,QAAQ,GAAG;QACf,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,cAAc,EAAG,UAAkB,CAAC,cAAc;KACnD,CAAC;IAEF,IAAI,QAAyB,CAAC;IAG9B,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAW,EAAE,IAAiB,EAAE,EAAE;QACrD,QAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAW,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzC,CAAC,CAAiB,CAAC;IAIlB,UAAkB,CAAC,cAAc,GAAG;QACnC,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KAC3E,CAAC;IAEF,IAAI,CAAC;QACH,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACjC,UAAkB,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,SAAwB;IAC3C,MAAM,IAAI,GAAG;QACX,gBAAgB,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE;KACzC,CAAC;IACrB,MAAM,OAAO,GAAG,EAAwB,CAAC;IACzC,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,sCAAsC,CAAC,CAAC;AAEvE,KAAK,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACpF,kBAAkB,CAChB,CAAC,OAAO,EAAE,EAAE;QACV,MAAM,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAC/C,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,gDAAgD,CAAC,CAAC;QACjE,MAAM,CAAC,EAAE,CACN,IAAI,CAAC,OAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,EACnD,iBAAiB,EACjB,6EAA6E,CAC9E,CAAC;IACJ,CAAC,EAED,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,CACnD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,uDAAuD,EAAE,GAAG,EAAE;IAClE,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,EAAE,CACV,IAAI,CAAC,OAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,EACnD,sEAAsE,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/globals.d.ts","../src/index.federated.ts","../src/index.ts","../src/sandbox.ts","../src/typings.d.ts","../src/components/rapid-components.ts","../src/components/zero-components.ts","../src/components/document-upload/document-upload.styles.ts","../src/components/document-upload/document-upload.template.ts","../src/components/document-upload/document-upload.ts","../src/components/document-upload/document-upload.types.ts","../src/components/template-asset-link/template-asset-link.styles.ts","../src/components/template-asset-link/template-asset-link.template.ts","../src/components/template-asset-link/template-asset-link.ts","../src/components/utils/action-cell-renderer.ts","../src/components/utils/column-config.ts","../src/components/utils/icons.ts","../src/config/config.ts","../src/config/configure.ts","../src/config/index.ts","../src/config/templates.ts","../src/main/index.ts","../src/main/main.styles.ts","../src/main/main.template.ts","../src/main/main.ts","../src/services/document.service.ts","../src/tags/index.ts","../src/tags/tags.ts","../src/types/index.ts","../src/types/main.types.ts","../src/types/utils.types.ts","../src/utils/formatting.ts","../src/utils/index.ts","../src/utils/logger.ts","../src/utils/misc.ts","../src/utils/notifications.ts","../src/utils/styles.ts"],"version":"5.9.2"}
|
|
1
|
+
{"root":["../src/globals.d.ts","../src/index.federated.ts","../src/index.ts","../src/sandbox.ts","../src/typings.d.ts","../src/components/rapid-components.ts","../src/components/zero-components.ts","../src/components/document-upload/document-upload.styles.ts","../src/components/document-upload/document-upload.template.ts","../src/components/document-upload/document-upload.ts","../src/components/document-upload/document-upload.types.ts","../src/components/template-asset-link/template-asset-link.styles.ts","../src/components/template-asset-link/template-asset-link.template.ts","../src/components/template-asset-link/template-asset-link.ts","../src/components/utils/action-cell-renderer.ts","../src/components/utils/column-config.ts","../src/components/utils/icons.ts","../src/config/config.ts","../src/config/configure.ts","../src/config/index.ts","../src/config/templates.ts","../src/main/index.ts","../src/main/main.styles.ts","../src/main/main.template.ts","../src/main/main.ts","../src/services/document.service.test.ts","../src/services/document.service.ts","../src/tags/index.ts","../src/tags/tags.ts","../src/types/index.ts","../src/types/main.types.ts","../src/types/utils.types.ts","../src/utils/formatting.ts","../src/utils/index.ts","../src/utils/logger.ts","../src/utils/misc.ts","../src/utils/notifications.ts","../src/utils/styles.ts"],"version":"5.9.2"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genesislcap/pbc-documents-ui",
|
|
3
3
|
"description": "Genesis Document Management UI",
|
|
4
|
-
"version": "14.446.
|
|
4
|
+
"version": "14.446.1-FUI-2541.2",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "SEE LICENSE IN license.txt",
|
|
7
7
|
"main": "dist/esm/index.js",
|
|
@@ -78,37 +78,37 @@
|
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@genesiscommunitysuccess/cep-fast-plugin": "4.1.1",
|
|
80
80
|
"@genesiscommunitysuccess/custom-elements-lsp": "4.1.1",
|
|
81
|
-
"@genesislcap/design-system-configurator": "14.446.
|
|
82
|
-
"@genesislcap/eslint-config": "14.446.
|
|
83
|
-
"@genesislcap/foundation-testing": "14.446.
|
|
84
|
-
"@genesislcap/genx": "14.446.
|
|
85
|
-
"@genesislcap/prettier-config": "14.446.
|
|
86
|
-
"@genesislcap/stylelint-config": "14.446.
|
|
81
|
+
"@genesislcap/design-system-configurator": "14.446.1-FUI-2541.2",
|
|
82
|
+
"@genesislcap/eslint-config": "14.446.1-FUI-2541.2",
|
|
83
|
+
"@genesislcap/foundation-testing": "14.446.1-FUI-2541.2",
|
|
84
|
+
"@genesislcap/genx": "14.446.1-FUI-2541.2",
|
|
85
|
+
"@genesislcap/prettier-config": "14.446.1-FUI-2541.2",
|
|
86
|
+
"@genesislcap/stylelint-config": "14.446.1-FUI-2541.2",
|
|
87
87
|
"@types/node": "^22.10.2",
|
|
88
88
|
"rimraf": "^3.0.2",
|
|
89
89
|
"tslib": "^2.3.1",
|
|
90
90
|
"typescript": "^4.9.5"
|
|
91
91
|
},
|
|
92
92
|
"dependencies": {
|
|
93
|
-
"@genesislcap/foundation-comms": "14.446.
|
|
94
|
-
"@genesislcap/foundation-entity-management": "14.446.
|
|
95
|
-
"@genesislcap/foundation-events": "14.446.
|
|
96
|
-
"@genesislcap/foundation-forms": "14.446.
|
|
97
|
-
"@genesislcap/foundation-header": "14.446.
|
|
98
|
-
"@genesislcap/foundation-layout": "14.446.
|
|
99
|
-
"@genesislcap/foundation-logger": "14.446.
|
|
100
|
-
"@genesislcap/foundation-login": "14.446.
|
|
101
|
-
"@genesislcap/foundation-notifications": "14.446.
|
|
102
|
-
"@genesislcap/foundation-store": "14.446.
|
|
103
|
-
"@genesislcap/foundation-ui": "14.446.
|
|
104
|
-
"@genesislcap/foundation-user": "14.446.
|
|
105
|
-
"@genesislcap/foundation-utils": "14.446.
|
|
106
|
-
"@genesislcap/foundation-zero": "14.446.
|
|
107
|
-
"@genesislcap/foundation-zero-grid-tabulator": "14.446.
|
|
108
|
-
"@genesislcap/grid-tabulator": "14.446.
|
|
109
|
-
"@genesislcap/rapid-design-system": "14.446.
|
|
110
|
-
"@genesislcap/rapid-grid-tabulator": "14.446.
|
|
111
|
-
"@genesislcap/web-core": "14.446.
|
|
93
|
+
"@genesislcap/foundation-comms": "14.446.1-FUI-2541.2",
|
|
94
|
+
"@genesislcap/foundation-entity-management": "14.446.1-FUI-2541.2",
|
|
95
|
+
"@genesislcap/foundation-events": "14.446.1-FUI-2541.2",
|
|
96
|
+
"@genesislcap/foundation-forms": "14.446.1-FUI-2541.2",
|
|
97
|
+
"@genesislcap/foundation-header": "14.446.1-FUI-2541.2",
|
|
98
|
+
"@genesislcap/foundation-layout": "14.446.1-FUI-2541.2",
|
|
99
|
+
"@genesislcap/foundation-logger": "14.446.1-FUI-2541.2",
|
|
100
|
+
"@genesislcap/foundation-login": "14.446.1-FUI-2541.2",
|
|
101
|
+
"@genesislcap/foundation-notifications": "14.446.1-FUI-2541.2",
|
|
102
|
+
"@genesislcap/foundation-store": "14.446.1-FUI-2541.2",
|
|
103
|
+
"@genesislcap/foundation-ui": "14.446.1-FUI-2541.2",
|
|
104
|
+
"@genesislcap/foundation-user": "14.446.1-FUI-2541.2",
|
|
105
|
+
"@genesislcap/foundation-utils": "14.446.1-FUI-2541.2",
|
|
106
|
+
"@genesislcap/foundation-zero": "14.446.1-FUI-2541.2",
|
|
107
|
+
"@genesislcap/foundation-zero-grid-tabulator": "14.446.1-FUI-2541.2",
|
|
108
|
+
"@genesislcap/grid-tabulator": "14.446.1-FUI-2541.2",
|
|
109
|
+
"@genesislcap/rapid-design-system": "14.446.1-FUI-2541.2",
|
|
110
|
+
"@genesislcap/rapid-grid-tabulator": "14.446.1-FUI-2541.2",
|
|
111
|
+
"@genesislcap/web-core": "14.446.1-FUI-2541.2",
|
|
112
112
|
"rxjs": "^7.5.4",
|
|
113
113
|
"tslib": "^2.3.1"
|
|
114
114
|
},
|
|
@@ -116,5 +116,5 @@
|
|
|
116
116
|
"access": "public"
|
|
117
117
|
},
|
|
118
118
|
"customElements": "dist/custom-elements.json",
|
|
119
|
-
"gitHead": "
|
|
119
|
+
"gitHead": "e29fdf28775074bde37c45c152bada6b3b446386"
|
|
120
120
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Auth, Connect } from '@genesislcap/foundation-comms';
|
|
2
|
+
import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
|
|
3
|
+
import { DocumentServiceImpl } from './document.service';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* These tests run in Node (genx test default), so there is no DOM,
|
|
7
|
+
* `window`, or `sessionStorage`. We stub the globals the service touches
|
|
8
|
+
* and capture the outgoing `fetch` request synchronously, before the
|
|
9
|
+
* promise chain (which would reach for DOM APIs) has a chance to run.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
type CapturedRequest = { url: string; init: RequestInit };
|
|
13
|
+
|
|
14
|
+
function withStubbedGlobals(
|
|
15
|
+
run: (capture: () => CapturedRequest) => void,
|
|
16
|
+
sessionStore: Record<string, string> = {},
|
|
17
|
+
) {
|
|
18
|
+
const original = {
|
|
19
|
+
fetch: globalThis.fetch,
|
|
20
|
+
sessionStorage: (globalThis as any).sessionStorage,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
let captured: CapturedRequest;
|
|
24
|
+
// A fetch that records the request but never resolves, so the service's
|
|
25
|
+
// `.then` chain (blob/createObjectURL/DOM) is never reached during the test.
|
|
26
|
+
globalThis.fetch = ((url: string, init: RequestInit) => {
|
|
27
|
+
captured = { url, init };
|
|
28
|
+
return new Promise<Response>(() => {});
|
|
29
|
+
}) as typeof fetch;
|
|
30
|
+
|
|
31
|
+
// Simulate a prefixed app: the real token lives under a prefixed key,
|
|
32
|
+
// so a raw `getItem('authToken')` returns null.
|
|
33
|
+
(globalThis as any).sessionStorage = {
|
|
34
|
+
getItem: (key: string) => (key in sessionStore ? sessionStore[key] : null),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
run(() => captured);
|
|
39
|
+
} finally {
|
|
40
|
+
globalThis.fetch = original.fetch;
|
|
41
|
+
(globalThis as any).sessionStorage = original.sessionStorage;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function makeService(authToken: string | null) {
|
|
46
|
+
const auth = {
|
|
47
|
+
loggedUserResult: authToken === null ? null : { authToken },
|
|
48
|
+
} as unknown as Auth;
|
|
49
|
+
const connect = {} as unknown as Connect;
|
|
50
|
+
return new DocumentServiceImpl(connect, auth);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const Suite = createLogicSuite('DocumentServiceImpl.downloadDocument');
|
|
54
|
+
|
|
55
|
+
Suite('sends the auth token from Auth.loggedUserResult, not raw sessionStorage', () => {
|
|
56
|
+
withStubbedGlobals(
|
|
57
|
+
(capture) => {
|
|
58
|
+
const service = makeService('valid-token-123');
|
|
59
|
+
service.downloadDocument('FILE_ID');
|
|
60
|
+
|
|
61
|
+
const { url, init } = capture();
|
|
62
|
+
assert.is(url, 'gwf/file-server/download?fileStorageId=FILE_ID');
|
|
63
|
+
assert.is(
|
|
64
|
+
(init.headers as Headers).get('SESSION_AUTH_TOKEN'),
|
|
65
|
+
'valid-token-123',
|
|
66
|
+
'should use the token from Auth, regardless of the sessionStorage key prefix',
|
|
67
|
+
);
|
|
68
|
+
},
|
|
69
|
+
// Prefixed app: plain `authToken` is absent; only the prefixed key exists.
|
|
70
|
+
{ '@custxClientApp/authToken': 'valid-token-123' },
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
Suite('omits the auth header when there is no logged-in user', () => {
|
|
75
|
+
withStubbedGlobals((capture) => {
|
|
76
|
+
const service = makeService(null);
|
|
77
|
+
service.downloadDocument('FILE_ID');
|
|
78
|
+
|
|
79
|
+
const { init } = capture();
|
|
80
|
+
assert.not.ok(
|
|
81
|
+
(init.headers as Headers).get('SESSION_AUTH_TOKEN'),
|
|
82
|
+
'no user means no SESSION_AUTH_TOKEN header (never the string "null")',
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
Suite.run();
|
|
@@ -20,7 +20,7 @@ export interface IDocumentService {
|
|
|
20
20
|
deleteDocument(documentId: string);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
class DocumentServiceImpl implements IDocumentService {
|
|
23
|
+
export class DocumentServiceImpl implements IDocumentService {
|
|
24
24
|
constructor(
|
|
25
25
|
@Connect private connect: Connect,
|
|
26
26
|
@Auth private auth: Auth,
|
|
@@ -108,16 +108,25 @@ class DocumentServiceImpl implements IDocumentService {
|
|
|
108
108
|
|
|
109
109
|
downloadDocument(documentId: string) {
|
|
110
110
|
const headers = new Headers();
|
|
111
|
-
|
|
111
|
+
if (this.auth.loggedUserResult) {
|
|
112
|
+
headers.append('SESSION_AUTH_TOKEN', this.auth.loggedUserResult.authToken);
|
|
113
|
+
}
|
|
112
114
|
|
|
113
|
-
let filename =
|
|
115
|
+
let filename = documentId;
|
|
114
116
|
fetch(`gwf/file-server/download?fileStorageId=${documentId}`, {
|
|
115
117
|
method: 'GET',
|
|
116
118
|
headers: headers,
|
|
117
119
|
})
|
|
118
120
|
.then((response) => {
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new Error(`Download failed: ${response.status} ${response.statusText}`);
|
|
123
|
+
}
|
|
119
124
|
const contentDispositionHeader = response.headers.get('Content-disposition');
|
|
120
|
-
|
|
125
|
+
const match = contentDispositionHeader?.match(/filename\s*=\s*(?:"([^"]+)"|([^;\s]+))/i);
|
|
126
|
+
const parsedFilename = match?.[1] || match?.[2];
|
|
127
|
+
if (parsedFilename) {
|
|
128
|
+
filename = parsedFilename.trim();
|
|
129
|
+
}
|
|
121
130
|
return response.blob();
|
|
122
131
|
})
|
|
123
132
|
.then((blob) => URL.createObjectURL(blob))
|