@sumaris-net/ngx-components 2.4.114 → 2.4.115
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/doc/changelog.md +3 -0
- package/esm2020/public_api.mjs +2 -1
- package/esm2020/src/app/admin/services/filter/person.filter.mjs +1 -1
- package/esm2020/src/app/admin/services/person.service.mjs +9 -1
- package/esm2020/src/app/core/form/entity/editor.class.mjs +6 -6
- package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +5 -2
- package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +1 -1
- package/esm2020/src/app/core/menu/menu.component.mjs +32 -197
- package/esm2020/src/app/core/menu/menu.model.mjs +38 -13
- package/esm2020/src/app/core/menu/menu.service.mjs +249 -18
- package/esm2020/src/app/core/menu/testing/menu-other.testing.mjs +52 -0
- package/esm2020/src/app/core/menu/testing/menu.testing.mjs +68 -51
- package/esm2020/src/app/core/menu/testing/menu.testing.module.mjs +41 -6
- package/esm2020/src/app/core/services/crypto.service.mjs +14 -21
- package/esm2020/src/app/core/services/model/account.model.mjs +1 -1
- package/esm2020/src/app/core/services/model/config.model.mjs +1 -1
- package/esm2020/src/app/core/services/model/department.model.mjs +1 -1
- package/esm2020/src/app/core/services/model/peer.model.mjs +1 -1
- package/esm2020/src/app/core/services/model/person.model.mjs +1 -1
- package/esm2020/src/app/core/services/model/referential.model.mjs +1 -1
- package/esm2020/src/app/core/services/model/settings.model.mjs +1 -1
- package/esm2020/src/app/core/services/platform.service.mjs +3 -2
- package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +1 -1
- package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +1 -1
- package/esm2020/src/app/shared/file/json.utils.mjs +3 -3
- package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
- package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +1 -1
- package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +1 -1
- package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +1 -1
- package/esm2020/src/app/shared/services/startable-service.class.mjs +1 -1
- package/esm2020/src/app/social/job/progression/job-progression.model.mjs +1 -1
- package/esm2020/src/app/social/message/message.model.mjs +1 -1
- package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +1 -1
- package/fesm2015/sumaris-net.ngx-components.mjs +917 -739
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
- package/fesm2020/sumaris-net.ngx-components.mjs +910 -736
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +7 -5
- package/public_api.d.ts +1 -0
- package/src/app/admin/services/person.service.d.ts +5 -0
- package/src/app/core/form/text-popover/text-popover.component.d.ts +2 -1
- package/src/app/core/menu/menu.component.d.ts +10 -19
- package/src/app/core/menu/menu.model.d.ts +17 -7
- package/src/app/core/menu/menu.service.d.ts +51 -11
- package/src/app/core/menu/testing/menu-other.testing.d.ts +13 -0
- package/src/app/core/menu/testing/menu.testing.d.ts +16 -3
- package/src/app/core/menu/testing/menu.testing.module.d.ts +6 -5
- package/src/app/core/services/crypto.service.d.ts +7 -7
- package/src/app/core/services/platform.service.d.ts +3 -2
|
@@ -1,22 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isNilOrBlank } from '../../shared/functions';
|
|
2
2
|
export class MenuItems {
|
|
3
3
|
/**
|
|
4
4
|
* Compare, without checking the children
|
|
5
|
-
* @param
|
|
6
|
-
* @param
|
|
5
|
+
* @param mainItem
|
|
6
|
+
* @param otherItem
|
|
7
7
|
*/
|
|
8
|
-
static isSame(
|
|
9
|
-
return
|
|
10
|
-
&&
|
|
11
|
-
&&
|
|
12
|
-
&& this.isSameParams(
|
|
8
|
+
static isSame(mainItem, otherItem) {
|
|
9
|
+
return mainItem.path === otherItem.path
|
|
10
|
+
&& mainItem.parentPath === otherItem.parentPath
|
|
11
|
+
&& mainItem.title === otherItem.title
|
|
12
|
+
&& this.isSameParams(mainItem.pathParams, otherItem.pathParams);
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* All key/value of the mainParams should exist (and be equals) in the other params
|
|
16
|
+
* @param mainParams
|
|
17
|
+
* @param otherParams
|
|
18
|
+
*/
|
|
19
|
+
static isSameParams(mainParams, otherParams) {
|
|
20
|
+
const result = Object.entries(mainParams).every(([key, value]) => value === otherParams[key]);
|
|
21
|
+
return result;
|
|
16
22
|
}
|
|
17
23
|
static isParent(child, parent) {
|
|
18
|
-
|
|
19
|
-
&& this.isSameParams(child.parentPathParams, parent
|
|
24
|
+
const result = child.parentPath && child.parentPath === parent?.path
|
|
25
|
+
&& this.isSameParams(child.parentPathParams, parent['pathParams'] || parent['params']) || false;
|
|
26
|
+
return result;
|
|
20
27
|
}
|
|
21
28
|
static checkIfVisible(item, accountService, config, opts) {
|
|
22
29
|
opts = opts || {};
|
|
@@ -48,7 +55,25 @@ export class MenuItems {
|
|
|
48
55
|
}
|
|
49
56
|
return true;
|
|
50
57
|
}
|
|
58
|
+
static parsePathWithQuery(pathWithQuery) {
|
|
59
|
+
const index = pathWithQuery.lastIndexOf('?');
|
|
60
|
+
if (index < 0)
|
|
61
|
+
return { path: pathWithQuery, params: {} };
|
|
62
|
+
const path = pathWithQuery.substring(0, index);
|
|
63
|
+
const queryString = pathWithQuery.substring(index);
|
|
64
|
+
const params = Object.fromEntries(new URLSearchParams(queryString));
|
|
65
|
+
return { path, params };
|
|
66
|
+
}
|
|
67
|
+
static getUrl(item) {
|
|
68
|
+
return this.getUrlFromPathAndParams(item?.path, item?.pathParams);
|
|
69
|
+
}
|
|
70
|
+
static getUrlFromPathAndParams(path, params) {
|
|
71
|
+
const queryString = Object.entries(params || {}).map(([key, value]) => `${key}=${value}`).join('&');
|
|
72
|
+
if (isNilOrBlank(queryString))
|
|
73
|
+
return path || '';
|
|
74
|
+
return `${path || ''}?${queryString}`;
|
|
75
|
+
}
|
|
51
76
|
}
|
|
52
77
|
export class MenuOptions {
|
|
53
78
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9tZW51L21lbnUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBc0I5QyxNQUFNLE9BQU8sU0FBUztJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFXLEVBQUUsQ0FBVztRQUNwQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUk7ZUFDckIsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVTtlQUM3QixDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLO2VBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBMEIsRUFBRSxDQUEwQjtRQUN4RSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFlLEVBQUUsTUFBZ0I7UUFDL0MsT0FBTyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFLElBQUk7ZUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFjLEVBQ2QsY0FBOEIsRUFDOUIsTUFBcUIsRUFDckIsSUFJQztRQUNyQixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsS0FBSztvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksUUFBUSxlQUFlLElBQUksQ0FBQyxLQUFLLDRCQUE0QixJQUFJLENBQUMsT0FBTyxxQkFBcUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ3ZLLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUVJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUMxQixNQUFNLGVBQWUsR0FBSSxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxRQUFRLGVBQWUsSUFBSSxDQUFDLEtBQUssMEJBQTBCLElBQUksQ0FBQyxZQUFZLHFCQUFxQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDMUssT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQix3R0FBd0c7WUFDeEcsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssTUFBTSxDQUFDO1lBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDckIsSUFBSSxJQUFJLENBQUMsS0FBSztvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqSCxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxXQUFXO0NBRXZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVc2VyUHJvZmlsZUxhYmVsfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7SWNvblJlZn0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7ZXF1YWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBNZW51SXRlbSBleHRlbmRzIEljb25SZWYge1xuICB0aXRsZTogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmcgfCBhbnk7XG4gIHByb2ZpbGU/OiBVc2VyUHJvZmlsZUxhYmVsO1xuICBleGFjdFByb2ZpbGU/OiBVc2VyUHJvZmlsZUxhYmVsO1xuICBjb2xvcj86IHN0cmluZztcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIC8vIEEgY29uZmlnIHByb3BlcnR5LCB0byBlbmFibGUgdGhlIG1lbnUgaXRlbVxuICBpZlByb3BlcnR5Pzogc3RyaW5nO1xuICAvLyBBIGNvbmZpZyBwcm9wZXJ0eSwgdG8gb3ZlcnJpZGUgdGhlIHRpdGxlXG4gIHRpdGxlUHJvcGVydHk/OiBzdHJpbmc7XG4gIHRpdGxlQXJncz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBwYXRoUGFyYW1zPzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIHBhcmVudFBhdGg/OiBzdHJpbmc7XG4gIHBhcmVudFBhdGhQYXJhbXM/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICBjaGlsZHJlbj86IE1lbnVJdGVtW107XG59XG5cbmV4cG9ydCBjbGFzcyBNZW51SXRlbXMge1xuXG4gIC8qKlxuICAgKiBDb21wYXJlLCB3aXRob3V0IGNoZWNraW5nIHRoZSBjaGlsZHJlblxuICAgKiBAcGFyYW0gYVxuICAgKiBAcGFyYW0gYlxuICAgKi9cbiAgc3RhdGljIGlzU2FtZShhOiBNZW51SXRlbSwgYjogTWVudUl0ZW0pIHtcbiAgICByZXR1cm4gYS5wYXRoID09PSBiLnBhdGhcbiAgICAmJiBhLnBhcmVudFBhdGggPT09IGIucGFyZW50UGF0aFxuICAgICYmIGEudGl0bGUgPT09IGIudGl0bGVcbiAgICAmJiB0aGlzLmlzU2FtZVBhcmFtcyhhLnBhdGhQYXJhbXMsIGIucGF0aFBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgaXNTYW1lUGFyYW1zKGE6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBiOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgIHJldHVybiBlcXVhbHMoYSB8fCB7fSwgYiB8fCB7fSk7XG4gIH1cblxuICBzdGF0aWMgaXNQYXJlbnQoY2hpbGQ6IE1lbnVJdGVtLCBwYXJlbnQ6IE1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIGNoaWxkLnBhcmVudFBhdGggJiYgY2hpbGQucGFyZW50UGF0aCA9PT0gcGFyZW50Py5wYXRoXG4gICAgICAmJiB0aGlzLmlzU2FtZVBhcmFtcyhjaGlsZC5wYXJlbnRQYXRoUGFyYW1zLCBwYXJlbnQucGF0aFBhcmFtcykgfHwgZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZpc2libGUoaXRlbTogTWVudUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzPzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvZ2luPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTogYm9vbGVhbiB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKGl0ZW0ucHJvZmlsZSkge1xuICAgICAgY29uc3QgaGFzUHJvZmlsZSA9IGFjY291bnRTZXJ2aWNlLmlzTG9naW4oKSAmJiBhY2NvdW50U2VydmljZS5oYXNNaW5Qcm9maWxlKGl0ZW0ucHJvZmlsZSk7XG4gICAgICBpZiAoIWhhc1Byb2ZpbGUpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7b3B0cyAmJiBvcHRzLmxvZ1ByZWZpeCB8fCAnW21lbnVdJ30gSGlkZSBpdGVtICcke2l0ZW0udGl0bGV9JzogbmVlZCB0aGUgbWluIHByb2ZpbGUgJyR7aXRlbS5wcm9maWxlfScgdG8gYWNjZXNzIHBhdGggJyR7aXRlbS5wYXRofSdgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsc2UgaWYgKGl0ZW0uZXhhY3RQcm9maWxlKSB7XG4gICAgICBjb25zdCBoYXNFeGFjdFByb2ZpbGUgPSAgYWNjb3VudFNlcnZpY2UuaGFzRXhhY3RQcm9maWxlKGl0ZW0uZXhhY3RQcm9maWxlKTtcbiAgICAgIGlmICghaGFzRXhhY3RQcm9maWxlKSB7XG4gICAgICAgIGlmIChvcHRzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke29wdHMgJiYgb3B0cy5sb2dQcmVmaXggfHwgJ1ttZW51XSd9IEhpZGUgaXRlbSAnJHtpdGVtLnRpdGxlfSc6IG5lZWQgZXhhY3QgcHJvZmlsZSAnJHtpdGVtLmV4YWN0UHJvZmlsZX0nIHRvIGFjY2VzcyBwYXRoICcke2l0ZW0ucGF0aH0nYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBlbmFibGUgYnkgY29uZmlnXG4gICAgaWYgKGl0ZW0uaWZQcm9wZXJ0eSkge1xuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiW21lbnVdIENoZWNraW5nIGlmIHByb3BlcnR5IGVuYWJsZSA/IFwiICsgaXRlbS5pZlByb3BlcnR5LCBjb25maWcgJiYgY29uZmlnLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgaXNFbmFibGVCeUNvbmZpZyA9IGNvbmZpZyAmJiBjb25maWcucHJvcGVydGllc1tpdGVtLmlmUHJvcGVydHldID09PSAndHJ1ZSc7XG4gICAgICBpZiAoIWlzRW5hYmxlQnlDb25maWcpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW51XSBDb25maWcgcHJvcGVydHkgXFwnJyArIGl0ZW0uaWZQcm9wZXJ0eSArICdcXCcgbm90IFxcJ3RydWVcXCcgZm9yICcsIGl0ZW0ucGF0aCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWVudU9wdGlvbnMge1xuICAvLyBUT0RPIGFkZCBvcHRpb25zLCB3aGVuIG5lZWQgc3BlY2lmaWMgYmVoYXZpb3Igb24gcHJvamVjdHNcbn1cbiJdfQ==
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9tZW51L21lbnUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBd0JwRCxNQUFNLE9BQU8sU0FBUztJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFrQixFQUFFLFNBQW1CO1FBQ25ELE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSTtlQUNwQyxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxVQUFVO2VBQzVDLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLEtBQUs7ZUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBbUMsRUFBRSxXQUFvQztRQUMzRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBZSxFQUFFLE1BQWdDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUUsSUFBSTtlQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksTUFB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QUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BHLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNqRCxPQUFPLEdBQUcsSUFBSSxJQUFHLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sV0FBVztDQUV2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VXNlclByb2ZpbGVMYWJlbH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvcGVyc29uLm1vZGVsJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7QWNjb3VudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQge0ljb25SZWZ9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQge2lzTmlsT3JCbGFua30gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7TWVudVBhdGhQYXJhbX0gZnJvbSBcIi4vbWVudS5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW0gZXh0ZW5kcyBJY29uUmVmIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nIHwgYW55O1xuICBwcm9maWxlPzogVXNlclByb2ZpbGVMYWJlbDtcbiAgZXhhY3RQcm9maWxlPzogVXNlclByb2ZpbGVMYWJlbDtcbiAgY29sb3I/OiBzdHJpbmc7XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuICAvLyBBIGNvbmZpZyBwcm9wZXJ0eSwgdG8gZW5hYmxlIHRoZSBtZW51IGl0ZW1cbiAgaWZQcm9wZXJ0eT86IHN0cmluZztcbiAgLy8gQSBjb25maWcgcHJvcGVydHksIHRvIG92ZXJyaWRlIHRoZSB0aXRsZVxuICB0aXRsZVByb3BlcnR5Pzogc3RyaW5nO1xuICB0aXRsZUFyZ3M/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgcGF0aFBhcmFtcz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBwYXJlbnRQYXRoPzogc3RyaW5nO1xuICBwYXJlbnRQYXRoUGFyYW1zPzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgJGNoaWxkcmVuPzogQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+O1xufVxuXG5leHBvcnQgY2xhc3MgTWVudUl0ZW1zIHtcblxuICAvKipcbiAgICogQ29tcGFyZSwgd2l0aG91dCBjaGVja2luZyB0aGUgY2hpbGRyZW5cbiAgICogQHBhcmFtIG1haW5JdGVtXG4gICAqIEBwYXJhbSBvdGhlckl0ZW1cbiAgICovXG4gIHN0YXRpYyBpc1NhbWUobWFpbkl0ZW06IE1lbnVJdGVtLCBvdGhlckl0ZW06IE1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIG1haW5JdGVtLnBhdGggPT09IG90aGVySXRlbS5wYXRoXG4gICAgJiYgbWFpbkl0ZW0ucGFyZW50UGF0aCA9PT0gb3RoZXJJdGVtLnBhcmVudFBhdGhcbiAgICAmJiBtYWluSXRlbS50aXRsZSA9PT0gb3RoZXJJdGVtLnRpdGxlXG4gICAgJiYgdGhpcy5pc1NhbWVQYXJhbXMobWFpbkl0ZW0ucGF0aFBhcmFtcywgb3RoZXJJdGVtLnBhdGhQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBrZXkvdmFsdWUgb2YgdGhlIG1haW5QYXJhbXMgc2hvdWxkIGV4aXN0IChhbmQgYmUgZXF1YWxzKSBpbiB0aGUgb3RoZXIgcGFyYW1zXG4gICAqIEBwYXJhbSBtYWluUGFyYW1zXG4gICAqIEBwYXJhbSBvdGhlclBhcmFtc1xuICAgKi9cbiAgc3RhdGljIGlzU2FtZVBhcmFtcyhtYWluUGFyYW1zOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgb3RoZXJQYXJhbXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMobWFpblBhcmFtcykuZXZlcnkoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgPT09IG90aGVyUGFyYW1zW2tleV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgaXNQYXJlbnQoY2hpbGQ6IE1lbnVJdGVtLCBwYXJlbnQ6IE1lbnVJdGVtIHwgTWVudVBhdGhQYXJhbSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNoaWxkLnBhcmVudFBhdGggJiYgY2hpbGQucGFyZW50UGF0aCA9PT0gcGFyZW50Py5wYXRoXG4gICAgICAgICYmIHRoaXMuaXNTYW1lUGFyYW1zKGNoaWxkLnBhcmVudFBhdGhQYXJhbXMsIHBhcmVudFsncGF0aFBhcmFtcyddIHx8IHBhcmVudFsncGFyYW1zJ10pIHx8IGZhbHNlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZpc2libGUoaXRlbTogTWVudUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzPzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvZ2luPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTogYm9vbGVhbiB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKGl0ZW0ucHJvZmlsZSkge1xuICAgICAgY29uc3QgaGFzUHJvZmlsZSA9IGFjY291bnRTZXJ2aWNlLmlzTG9naW4oKSAmJiBhY2NvdW50U2VydmljZS5oYXNNaW5Qcm9maWxlKGl0ZW0ucHJvZmlsZSk7XG4gICAgICBpZiAoIWhhc1Byb2ZpbGUpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7b3B0cyAmJiBvcHRzLmxvZ1ByZWZpeCB8fCAnW21lbnVdJ30gSGlkZSBpdGVtICcke2l0ZW0udGl0bGV9JzogbmVlZCB0aGUgbWluIHByb2ZpbGUgJyR7aXRlbS5wcm9maWxlfScgdG8gYWNjZXNzIHBhdGggJyR7aXRlbS5wYXRofSdgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsc2UgaWYgKGl0ZW0uZXhhY3RQcm9maWxlKSB7XG4gICAgICBjb25zdCBoYXNFeGFjdFByb2ZpbGUgPSAgYWNjb3VudFNlcnZpY2UuaGFzRXhhY3RQcm9maWxlKGl0ZW0uZXhhY3RQcm9maWxlKTtcbiAgICAgIGlmICghaGFzRXhhY3RQcm9maWxlKSB7XG4gICAgICAgIGlmIChvcHRzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke29wdHMgJiYgb3B0cy5sb2dQcmVmaXggfHwgJ1ttZW51XSd9IEhpZGUgaXRlbSAnJHtpdGVtLnRpdGxlfSc6IG5lZWQgZXhhY3QgcHJvZmlsZSAnJHtpdGVtLmV4YWN0UHJvZmlsZX0nIHRvIGFjY2VzcyBwYXRoICcke2l0ZW0ucGF0aH0nYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBlbmFibGUgYnkgY29uZmlnXG4gICAgaWYgKGl0ZW0uaWZQcm9wZXJ0eSkge1xuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiW21lbnVdIENoZWNraW5nIGlmIHByb3BlcnR5IGVuYWJsZSA/IFwiICsgaXRlbS5pZlByb3BlcnR5LCBjb25maWcgJiYgY29uZmlnLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgaXNFbmFibGVCeUNvbmZpZyA9IGNvbmZpZyAmJiBjb25maWcucHJvcGVydGllc1tpdGVtLmlmUHJvcGVydHldID09PSAndHJ1ZSc7XG4gICAgICBpZiAoIWlzRW5hYmxlQnlDb25maWcpIHtcbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW51XSBDb25maWcgcHJvcGVydHkgXFwnJyArIGl0ZW0uaWZQcm9wZXJ0eSArICdcXCcgbm90IFxcJ3RydWVcXCcgZm9yICcsIGl0ZW0ucGF0aCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVBhdGhXaXRoUXVlcnkocGF0aFdpdGhRdWVyeTogc3RyaW5nKTogTWVudVBhdGhQYXJhbSB7XG4gICAgY29uc3QgaW5kZXggPSBwYXRoV2l0aFF1ZXJ5Lmxhc3RJbmRleE9mKCc/Jyk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHtwYXRoOiBwYXRoV2l0aFF1ZXJ5LCBwYXJhbXM6IHt9fTtcbiAgICBjb25zdCBwYXRoID0gcGF0aFdpdGhRdWVyeS5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcGF0aFdpdGhRdWVyeS5zdWJzdHJpbmcoaW5kZXgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcm9tRW50cmllcyhuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5U3RyaW5nKSk7XG4gICAgcmV0dXJuIHtwYXRoLCBwYXJhbXN9O1xuICB9XG5cbiAgc3RhdGljIGdldFVybChpdGVtOiBNZW51SXRlbSkge1xuICAgIHJldHVybiB0aGlzLmdldFVybEZyb21QYXRoQW5kUGFyYW1zKGl0ZW0/LnBhdGgsIGl0ZW0/LnBhdGhQYXJhbXMpO1xuICB9XG4gIHN0YXRpYyBnZXRVcmxGcm9tUGF0aEFuZFBhcmFtcyhwYXRoOiBzdHJpbmcsIHBhcmFtcz86IGFueSkge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmVudHJpZXMocGFyYW1zIHx8IHt9KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApLmpvaW4oJyYnKTtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHF1ZXJ5U3RyaW5nKSkgcmV0dXJuIHBhdGggfHwgJyc7XG4gICAgcmV0dXJuIGAke3BhdGggfHwnJ30/JHtxdWVyeVN0cmluZ31gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZW51T3B0aW9ucyB7XG4gIC8vIFRPRE8gYWRkIG9wdGlvbnMsIHdoZW4gbmVlZCBzcGVjaWZpYyBiZWhhdmlvciBvbiBwcm9qZWN0c1xufVxuIl19
|
|
@@ -1,18 +1,42 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
1
|
+
import { EventEmitter, Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, merge, Subject } from 'rxjs';
|
|
3
|
+
import { MenuItems } from './menu.model';
|
|
4
|
+
import { APP_MENU_ITEMS } from './menu.component';
|
|
5
|
+
import { NavigationEnd } from '@angular/router';
|
|
6
|
+
import { StartableService } from '../../shared/services/startable-service.class';
|
|
7
|
+
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
8
|
+
import { DateUtils } from '../../shared/dates';
|
|
9
|
+
import { debounceTime, filter, map, mapTo, mergeMap, tap } from 'rxjs/operators';
|
|
10
|
+
import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
|
|
11
|
+
import { isNotNilOrBlank } from '../../shared/functions';
|
|
3
12
|
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "../services/platform.service";
|
|
14
|
+
import * as i2 from "../services/config.service";
|
|
15
|
+
import * as i3 from "../services/account.service";
|
|
16
|
+
import * as i4 from "@angular/router";
|
|
17
|
+
import * as i5 from "../../../environments/environment.class";
|
|
4
18
|
export const DEFAULT_MENU_SHOW_WHEN = 'lg';
|
|
5
|
-
export class MenuService {
|
|
6
|
-
constructor() {
|
|
7
|
-
|
|
19
|
+
export class MenuService extends StartableService {
|
|
20
|
+
constructor(platformService, configService, accountService, router, environment, rootItems) {
|
|
21
|
+
super(platformService);
|
|
22
|
+
this.platformService = platformService;
|
|
23
|
+
this.configService = configService;
|
|
24
|
+
this.accountService = accountService;
|
|
25
|
+
this.router = router;
|
|
26
|
+
this.environment = environment;
|
|
27
|
+
this.onLoginChange = new Subject();
|
|
28
|
+
this.onUpdateMenu = new EventEmitter();
|
|
29
|
+
this.$items = new BehaviorSubject(undefined);
|
|
30
|
+
this._logPrefix = '[menu-service]';
|
|
8
31
|
this._$toggled = new Subject();
|
|
9
32
|
this._$opened = new Subject();
|
|
10
33
|
this._$splitPaneWhen = new BehaviorSubject(DEFAULT_MENU_SHOW_WHEN);
|
|
11
34
|
this._$enabled = new BehaviorSubject(true);
|
|
12
|
-
this.
|
|
35
|
+
this._debug = !environment.production;
|
|
36
|
+
this.$items.next((rootItems || []).map(i => this.prepareItem(i)));
|
|
13
37
|
}
|
|
14
|
-
get
|
|
15
|
-
return this.
|
|
38
|
+
get rootItems() {
|
|
39
|
+
return this.$items.value;
|
|
16
40
|
}
|
|
17
41
|
get opened() {
|
|
18
42
|
return this._$opened.asObservable();
|
|
@@ -42,26 +66,233 @@ export class MenuService {
|
|
|
42
66
|
this._$splitPaneWhen.next(DEFAULT_MENU_SHOW_WHEN);
|
|
43
67
|
}
|
|
44
68
|
}
|
|
45
|
-
clearSubMenuItems() {
|
|
46
|
-
// TODO
|
|
47
|
-
this._$subMenuItem.next(null);
|
|
48
|
-
}
|
|
49
|
-
addSubMenuItem(value) {
|
|
50
|
-
this._$subMenuItem.next(value);
|
|
51
|
-
}
|
|
52
69
|
_markAsOpened() {
|
|
53
70
|
this._$opened.next(true);
|
|
54
71
|
}
|
|
55
72
|
_markAsClosed() {
|
|
56
73
|
this._$opened.next(false);
|
|
57
74
|
}
|
|
75
|
+
async addSubMenuItems(newItems, opts) {
|
|
76
|
+
await this.ready();
|
|
77
|
+
newItems.forEach(i => this.addSubMenuItem(i), opts);
|
|
78
|
+
}
|
|
79
|
+
async ngOnStart() {
|
|
80
|
+
console.info(`${this._logPrefix} Starting...`);
|
|
81
|
+
// Update component when refresh is need (=login events or config changed)
|
|
82
|
+
this.registerSubscription(merge(merge(this.accountService.onLogin
|
|
83
|
+
.pipe(
|
|
84
|
+
// Filter on account changes
|
|
85
|
+
filter(account => !DateUtils.isSame(account?.updateDate, this.lastAccountUpdateDate))), this.configService.config
|
|
86
|
+
.pipe(
|
|
87
|
+
// Store the config
|
|
88
|
+
tap(config => this._config = config)))
|
|
89
|
+
.pipe(
|
|
90
|
+
// Add debounce to avoid to trigger twice, at startup
|
|
91
|
+
debounceTime(250),
|
|
92
|
+
// Wait account service ready (can be restarted)
|
|
93
|
+
mergeMap(() => this.accountService.ready()), map(() => this.accountService.account)),
|
|
94
|
+
// Logout
|
|
95
|
+
this.accountService.onLogout.pipe(mapTo(null)))
|
|
96
|
+
.subscribe(async (account) => {
|
|
97
|
+
if (account?.updateDate) {
|
|
98
|
+
this.lastAccountUpdateDate = account.updateDate;
|
|
99
|
+
this.onLoginChange.next(account);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.lastAccountUpdateDate = null;
|
|
103
|
+
this.onLoginChange.next(null);
|
|
104
|
+
}
|
|
105
|
+
this.refreshMenuItems();
|
|
106
|
+
}));
|
|
107
|
+
this.registerSubscription(this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((event) => {
|
|
108
|
+
const pathParam = MenuItems.parsePathWithQuery(event.url);
|
|
109
|
+
const excludedItems = [];
|
|
110
|
+
const items = this.detachSubMenus(pathParam, this.$items.value, excludedItems);
|
|
111
|
+
console.debug(`${this._logPrefix} Detached sub menus: `, excludedItems);
|
|
112
|
+
// this.addSubMenuItems();
|
|
113
|
+
//this.$items.next(items);
|
|
114
|
+
}));
|
|
115
|
+
return this.$items.value;
|
|
116
|
+
}
|
|
117
|
+
refreshMenuItems() {
|
|
118
|
+
if (this._debug)
|
|
119
|
+
console.debug(`${this._logPrefix} Refreshing menu items...`);
|
|
120
|
+
// Insert menu items, from the config
|
|
121
|
+
const configValue = this._config && this._config.getProperty(CORE_CONFIG_OPTIONS.MENU_ITEMS);
|
|
122
|
+
if (isNotNilOrBlank(configValue)) {
|
|
123
|
+
try {
|
|
124
|
+
const configItems = JSON.parse(configValue);
|
|
125
|
+
this._data = (configItems || []).reduce((res, item) => {
|
|
126
|
+
if (item.after) {
|
|
127
|
+
const index = res.findIndex(i => i.title === item.after);
|
|
128
|
+
if (index !== -1) {
|
|
129
|
+
return res.slice(0, index + 1)
|
|
130
|
+
.concat(item)
|
|
131
|
+
.concat(res.slice(index + 1));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (item.before) {
|
|
135
|
+
const index = res.findIndex(i => i.title === item.before);
|
|
136
|
+
if (index !== -1) {
|
|
137
|
+
return res.slice(0, index)
|
|
138
|
+
.concat(item)
|
|
139
|
+
.concat(res.slice(index));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return res.concat(item);
|
|
143
|
+
}, this._data);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.error(`${this._logPrefix} Invalid value for option '${CORE_CONFIG_OPTIONS.MENU_ITEMS.key}'. Expected an array of menu item`, err);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// TODO : isLogin is not used in MenuItems.checkIfVisible
|
|
150
|
+
const opts = { debug: this._debug };
|
|
151
|
+
const filteredItems = this._data
|
|
152
|
+
.filter(item => MenuItems.checkIfVisible(item, this.accountService, this._config, opts))
|
|
153
|
+
.map(item => {
|
|
154
|
+
// Replace title using properties
|
|
155
|
+
if (isNotNilOrBlank(item.titleProperty) && this._config) {
|
|
156
|
+
const title = this._config.properties[item.titleProperty];
|
|
157
|
+
if (title)
|
|
158
|
+
return { ...item, title }; // Create a copy, to keep the original item.title
|
|
159
|
+
}
|
|
160
|
+
return item;
|
|
161
|
+
});
|
|
162
|
+
this.$items.next(filteredItems);
|
|
163
|
+
}
|
|
164
|
+
async addSubMenuItem(newItem, opts) {
|
|
165
|
+
opts = {
|
|
166
|
+
skipIfExists: false,
|
|
167
|
+
...opts,
|
|
168
|
+
};
|
|
169
|
+
// Make sure path (and pathParams) are filled in the same way
|
|
170
|
+
newItem = this.prepareItem(newItem);
|
|
171
|
+
// Find if item already exists
|
|
172
|
+
const existingItem = this.findExistingItem(newItem);
|
|
173
|
+
if (existingItem && opts.skipIfExists) {
|
|
174
|
+
// DEBUG
|
|
175
|
+
console.debug(`${this._logPrefix} Skipping sub item (already exist)`, newItem);
|
|
176
|
+
return; // Already add
|
|
177
|
+
}
|
|
178
|
+
const parent = this.findParent(newItem);
|
|
179
|
+
if (!parent) {
|
|
180
|
+
console.warn(`${this._logPrefix} Unable to add sub item: no parent found`);
|
|
181
|
+
const parentUrlTre = this.router.createUrlTree(newItem.parentPath.split('/'), {
|
|
182
|
+
queryParams: newItem.parentPathParams
|
|
183
|
+
});
|
|
184
|
+
const data = this.router.routerState.root.parent?.data;
|
|
185
|
+
console.log('TODO check parent data', data);
|
|
186
|
+
/*await this.router.navigateByUrl(newItem.parentPath, {
|
|
187
|
+
skipLocationChange: true
|
|
188
|
+
});*/
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this.addMenuToParent(parent, newItem);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
;
|
|
195
|
+
prepareItem(item) {
|
|
196
|
+
item = {
|
|
197
|
+
...item,
|
|
198
|
+
$children: item.$children || new BehaviorSubject([])
|
|
199
|
+
};
|
|
200
|
+
// Clean
|
|
201
|
+
if (item.path) {
|
|
202
|
+
const { path, params } = MenuItems.parsePathWithQuery(item.path);
|
|
203
|
+
item.path = path;
|
|
204
|
+
item.pathParams = { ...item.pathParams, ...params };
|
|
205
|
+
}
|
|
206
|
+
if (item.parentPath) {
|
|
207
|
+
const { path, params } = MenuItems.parsePathWithQuery(item.parentPath);
|
|
208
|
+
item.parentPath = path;
|
|
209
|
+
item.parentPathParams = { ...item.parentPathParams, ...params };
|
|
210
|
+
}
|
|
211
|
+
return item;
|
|
212
|
+
}
|
|
213
|
+
findExistingItem(item, items) {
|
|
214
|
+
items = items || this.$items.value;
|
|
215
|
+
if (!items.length)
|
|
216
|
+
return undefined; // Not found
|
|
217
|
+
return items.find(i => MenuItems.isSame(i, item) || (i.$children && this.findExistingItem(item, i.$children.value)));
|
|
218
|
+
}
|
|
219
|
+
findParent(childItem, parentItems) {
|
|
220
|
+
if (!childItem?.path)
|
|
221
|
+
return undefined;
|
|
222
|
+
parentItems = parentItems || this.$items.value;
|
|
223
|
+
return parentItems.reduce((res, item) => {
|
|
224
|
+
if (!item?.path)
|
|
225
|
+
return res;
|
|
226
|
+
// A found item already match with the menuItem.parentPath : keep it as it
|
|
227
|
+
// There is a found candidate that already match the current candidate : keep it
|
|
228
|
+
if (MenuItems.isParent(childItem, res))
|
|
229
|
+
return res;
|
|
230
|
+
// If the menu item has explicit parentPath and its path and path param are the same as the candidate : use it as parent
|
|
231
|
+
if (MenuItems.isParent(childItem, item))
|
|
232
|
+
return item;
|
|
233
|
+
if (!res && item.$children?.value.length) {
|
|
234
|
+
return this.findParent(childItem, item.$children?.value);
|
|
235
|
+
}
|
|
236
|
+
return res;
|
|
237
|
+
}, undefined);
|
|
238
|
+
}
|
|
239
|
+
;
|
|
240
|
+
addMenuToParent(parent, child) {
|
|
241
|
+
console.debug(`${this._logPrefix}Adding a sub-menu ${MenuItems.getUrl(child)} to parent menu ${MenuItems.getUrl(parent)}`);
|
|
242
|
+
// Avoid to keep identical menu item (we replace it with the new child menu item)
|
|
243
|
+
//if (!parent?.$children) parent.$children = new BehaviorSubject<MenuItem[]>([]);
|
|
244
|
+
const children = parent.$children.value || [];
|
|
245
|
+
const existingIndex = children.findIndex(item => MenuItems.isSame(child, item));
|
|
246
|
+
if (existingIndex !== -1) {
|
|
247
|
+
children[existingIndex] = child;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
children.push(child);
|
|
251
|
+
}
|
|
252
|
+
parent.$children.next(children);
|
|
253
|
+
this.onUpdateMenu.emit();
|
|
254
|
+
}
|
|
255
|
+
detachSubMenus(currentPathParam, items, excludedItems) {
|
|
256
|
+
items = items || this.rootItems;
|
|
257
|
+
excludedItems = excludedItems || [];
|
|
258
|
+
items = items.filter(item => {
|
|
259
|
+
if (!item.parentPath)
|
|
260
|
+
return true; // Always keep root items
|
|
261
|
+
// Current route = param: keep it
|
|
262
|
+
// if (MenuItems.isParent(item, currentPathParam)) return true;
|
|
263
|
+
// Item parent path starts with the current path: keep it
|
|
264
|
+
// if (item.path?.startsWith(currentPathParam.path)) return true;
|
|
265
|
+
// Keep each menu items in the scope of the current url path
|
|
266
|
+
if (currentPathParam.path.startsWith(item.path))
|
|
267
|
+
return true;
|
|
268
|
+
// Else, exclude
|
|
269
|
+
excludedItems.push(item);
|
|
270
|
+
return false;
|
|
271
|
+
});
|
|
272
|
+
items.forEach(item => {
|
|
273
|
+
const children = this.detachSubMenus(currentPathParam, item.$children.value || [], excludedItems);
|
|
274
|
+
item.$children.next(children);
|
|
275
|
+
});
|
|
276
|
+
return items;
|
|
277
|
+
}
|
|
278
|
+
isVisibleForRoute(item, currentPathParam) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
58
281
|
}
|
|
59
|
-
MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
282
|
+
MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [{ token: i1.PlatformService }, { token: i2.ConfigService }, { token: i3.AccountService }, { token: i4.Router }, { token: ENVIRONMENT }, { token: APP_MENU_ITEMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
60
283
|
MenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, providedIn: 'root' });
|
|
61
284
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, decorators: [{
|
|
62
285
|
type: Injectable,
|
|
63
286
|
args: [{
|
|
64
287
|
providedIn: 'root'
|
|
65
288
|
}]
|
|
66
|
-
}] }
|
|
67
|
-
|
|
289
|
+
}], ctorParameters: function () { return [{ type: i1.PlatformService }, { type: i2.ConfigService }, { type: i3.AccountService }, { type: i4.Router }, { type: i5.Environment, decorators: [{
|
|
290
|
+
type: Inject,
|
|
291
|
+
args: [ENVIRONMENT]
|
|
292
|
+
}] }, { type: undefined, decorators: [{
|
|
293
|
+
type: Optional
|
|
294
|
+
}, {
|
|
295
|
+
type: Inject,
|
|
296
|
+
args: [APP_MENU_ITEMS]
|
|
297
|
+
}] }]; } });
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQXlCLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEVBQVcsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDL0UsT0FBTyxFQUFjLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBR2pGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUkvRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFJdkQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQXNCLElBQUksQ0FBQztBQW1COUQsTUFBTSxPQUFPLFdBQVksU0FBUSxnQkFBaUM7SUFrQmhFLFlBQ1ksZUFBZ0MsRUFDaEMsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsTUFBYyxFQUNPLFdBQXdCLEVBQ25CLFNBQXNCO1FBRTFELEtBQUssQ0FBQyxlQUFlLENBQUMs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QUFJLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNsRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVTLGlCQUFpQixDQUFDLElBQWMsRUFBRSxnQkFBK0I7UUFDekUsT0FBUTtJQUNWLENBQUM7O3dHQS9UVSxXQUFXLGtJQXVCWixXQUFXLGFBQ0MsY0FBYzs0R0F4QnpCLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3QkksTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBPYnNlcnZhYmxlLCBza2lwV2hpbGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge01lbnVJdGVtLCBNZW51SXRlbXN9IGZyb20gJy4vbWVudS5tb2RlbCc7XG5pbXBvcnQge0FQUF9NRU5VX0lURU1TfSBmcm9tICcuL21lbnUuY29tcG9uZW50JztcbmltcG9ydCB7TmF2aWdhdGlvbkVuZCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtTdGFydGFibGVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge1BsYXRmb3JtU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0uc2VydmljZSc7XG5pbXBvcnQge01vbWVudH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7RGF0ZVV0aWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBtYXBUbywgbWVyZ2VNYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHtpc05vdE5pbE9yQmxhbmt9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtBY2NvdW50fSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9hY2NvdW50Lm1vZGVsJztcblxuZXhwb3J0IHR5cGUgU3BsaXRQYW5lU2hvd1doZW4gPSBib29sZWFufCdsZyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU5VX1NIT1dfV0hFTjogU3BsaXRQYW5lU2hvd1doZW4gPSAnbGcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFkZFN1Yk1lbnVJdGVtc09wdGlvbiB7XG4gIHNraXBJZkV4aXN0czogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGRTdWJNZW51SXRlbXMge1xuICBpdGVtczogTWVudUl0ZW1bXTtcbiAgb3B0cz86IEFkZFN1Yk1lbnVJdGVtc09wdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW51UGF0aFBhcmFtIHtcbiAgcGF0aDogc3RyaW5nO1xuICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2U8TWVudUl0ZW1bXSwgYW55PiB7XG5cbiAgcHVibGljIG9uTG9naW5DaGFuZ2UgPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBwdWJsaWMgb25VcGRhdGVNZW51ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcmVhZG9ubHkgJGl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBsYXN0QWNjb3VudFVwZGF0ZURhdGU6IE1vbWVudCB8IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9nUHJlZml4ID0gJ1ttZW51LXNlcnZpY2VdJztcbiAgcHJpdmF0ZSBfY29uZmlnOiBDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kdG9nZ2xlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRvcGVuZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kc3BsaXRQYW5lV2hlbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3BsaXRQYW5lU2hvd1doZW4+KERFRkFVTFRfTUVOVV9TSE9XX1dIRU4pO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kZW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcHJpdmF0ZSBnZXQgcm9vdEl0ZW1zKCk6IE1lbnVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLiRpdGVtcy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybVNlcnZpY2U6IFBsYXRmb3JtU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX01FTlVfSVRFTVMpIHJvb3RJdGVtcz86IE1lbnVJdGVtW11cbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm1TZXJ2aWNlKTtcbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIHRoaXMuJGl0ZW1zLm5leHQoKHJvb3RJdGVtcyB8fCBbXSkubWFwKGkgPT4gdGhpcy5wcmVwYXJlSXRlbShpKSkpO1xuICB9XG5cbiAgZ2V0IG9wZW5lZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJG9wZW5lZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBzcGxpdFBhbmVXaGVuKCk6IE9ic2VydmFibGU8U3BsaXRQYW5lU2hvd1doZW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJHNwbGl0UGFuZVdoZW4uYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fJGVuYWJsZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICB0b2dnbGUoKSB7XG4gICAgdGhpcy5fJHRvZ2dsZWQubmV4dCgpO1xuICB9XG5cbiAgZW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fJGVuYWJsZWQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBzZXRTcGxpdFBhbmVTaG93V2hlbih2YWx1ZTogU3BsaXRQYW5lU2hvd1doZW4pIHtcbiAgICBpZiAodGhpcy5fJHNwbGl0UGFuZVdoZW4udmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTcGxpdFBhbmVXaGVuKCkge1xuICAgIGlmICh0aGlzLl8kc3BsaXRQYW5lV2hlbi52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoREVGQVVMVF9NRU5VX1NIT1dfV0hFTik7XG4gICAgfVxuICB9XG5cbiAgX21hcmtBc09wZW5lZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBfbWFya0FzQ2xvc2VkKCkge1xuICAgIHRoaXMuXyRvcGVuZWQubmV4dChmYWxzZSk7XG4gIH1cblxuICBhc3luYyBhZGRTdWJNZW51SXRlbXMobmV3SXRlbXM6IE1lbnVJdGVtW10sIG9wdHM/OiBBZGRTdWJNZW51SXRlbXNPcHRpb24pIHtcbiAgICBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgbmV3SXRlbXMuZm9yRWFjaChpID0+IHRoaXMuYWRkU3ViTWVudUl0ZW0oaSksIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPE1lbnVJdGVtW10+IHtcbiAgICBjb25zb2xlLmluZm8oYCR7dGhpcy5fbG9nUHJlZml4fSBTdGFydGluZy4uLmApO1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvbmVudCB3aGVuIHJlZnJlc2ggaXMgbmVlZCAoPWxvZ2luIGV2ZW50cyBvciBjb25maWcgY2hhbmdlZClcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpblxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBvbiBhY2NvdW50IGNoYW5nZXNcbiAgICAgICAgICAgICAgZmlsdGVyKGFjY291bnQgPT4gIURhdGVVdGlscy5pc1NhbWUoYWNjb3VudD8udXBkYXRlRGF0ZSwgdGhpcy5sYXN0QWNjb3VudFVwZGF0ZURhdGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGNvbmZpZ1xuICAgICAgICAgICAgICB0YXAoY29uZmlnID0+IHRoaXMuX2NvbmZpZyA9IGNvbmZpZylcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgLy8gQWRkIGRlYm91bmNlIHRvIGF2b2lkIHRvIHRyaWdnZXIgdHdpY2UsIGF0IHN0YXJ0dXBcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgICAgLy8gV2FpdCBhY2NvdW50IHNlcnZpY2UgcmVhZHkgKGNhbiBiZSByZXN0YXJ0ZWQpXG4gICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCkpLFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuYWNjb3VudFNlcnZpY2UuYWNjb3VudClcbiAgICAgICAgICApLFxuICAgICAgICAvLyBMb2dvdXRcbiAgICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ291dC5waXBlKG1hcFRvKG51bGwpKSxcbiAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShhc3luYyBhY2NvdW50ID0+IHtcbiAgICAgICAgICBpZiAoYWNjb3VudD8udXBkYXRlRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNjb3VudFVwZGF0ZURhdGUgPSBhY2NvdW50LnVwZGF0ZURhdGU7XG4gICAgICAgICAgICB0aGlzLm9uTG9naW5DaGFuZ2UubmV4dChhY2NvdW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNjb3VudFVwZGF0ZURhdGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5vbkxvZ2luQ2hhbmdlLm5leHQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVmcmVzaE1lbnVJdGVtcygpO1xuICAgICAgICB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAvLyBmaWx0ZXIoZXZlbnQgPT4gISF0aGlzLiRpdGVtcz8udmFsdWUpLFxuICAgICAgKS5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGhQYXJhbSA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkoZXZlbnQudXJsKTtcbiAgICAgICAgY29uc3QgZXhjbHVkZWRJdGVtcyA9IFtdO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGV0YWNoU3ViTWVudXMocGF0aFBhcmFtLCB0aGlzLiRpdGVtcy52YWx1ZSwgZXhjbHVkZWRJdGVtcyk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fSBEZXRhY2hlZCBzdWIgbWVudXM6IGAsIGV4Y2x1ZGVkSXRlbXMpO1xuICAgICAgICAvLyB0aGlzLmFkZFN1Yk1lbnVJdGVtcygpO1xuICAgICAgICAvL3RoaXMuJGl0ZW1zLm5leHQoaXRlbXMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuJGl0ZW1zLnZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hNZW51SXRlbXMoKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH0gUmVmcmVzaGluZyBtZW51IGl0ZW1zLi4uYCk7XG5cbiAgICAvLyBJbnNlcnQgbWVudSBpdGVtcywgZnJvbSB0aGUgY29uZmlnXG4gICAgY29uc3QgY29uZmlnVmFsdWU6IHN0cmluZyA9IHRoaXMuX2NvbmZpZyAmJiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5NRU5VX0lURU1TKTtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGNvbmZpZ1ZhbHVlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnSXRlbXMgPSBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IChjb25maWdJdGVtcyB8fCBbXSkucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5hZnRlcikge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSByZXMuZmluZEluZGV4KGkgPT4gaS50aXRsZSA9PT0gaXRlbS5hZnRlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuc2xpY2UoMCwgaW5kZXggKyAxKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoaXRlbSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHJlcy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlcy5maW5kSW5kZXgoaSA9PiBpLnRpdGxlID09PSBpdGVtLmJlZm9yZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChpdGVtKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVzLnNsaWNlKGluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICAgICAgICB9LCB0aGlzLl9kYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH0gSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICcke0NPUkVfQ09ORklHX09QVElPTlMuTUVOVV9JVEVNUy5rZXl9Jy4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgbWVudSBpdGVtYCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPIDogaXNMb2dpbiBpcyBub3QgdXNlZCBpbiBNZW51SXRlbXMuY2hlY2tJZlZpc2libGVcbiAgICBjb25zdCBvcHRzID0ge2RlYnVnOiB0aGlzLl9kZWJ1Z307XG4gICAgY29uc3QgZmlsdGVyZWRJdGVtcyA9IHRoaXMuX2RhdGFcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiBNZW51SXRlbXMuY2hlY2tJZlZpc2libGUoaXRlbSwgdGhpcy5hY2NvdW50U2VydmljZSwgdGhpcy5fY29uZmlnLCBvcHRzKSlcbiAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUgdXNpbmcgcHJvcGVydGllc1xuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGl0ZW0udGl0bGVQcm9wZXJ0eSkgJiYgdGhpcy5fY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9jb25maWcucHJvcGVydGllc1tpdGVtLnRpdGxlUHJvcGVydHldO1xuICAgICAgICAgIGlmICh0aXRsZSkgcmV0dXJuIHsuLi5pdGVtLCB0aXRsZX07IC8vIENyZWF0ZSBhIGNvcHksIHRvIGtlZXAgdGhlIG9yaWdpbmFsIGl0ZW0udGl0bGVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy4kaXRlbXMubmV4dChmaWx0ZXJlZEl0ZW1zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRTdWJNZW51SXRlbShuZXdJdGVtOiBNZW51SXRlbSwgb3B0cz86IEFkZFN1Yk1lbnVJdGVtc09wdGlvbikge1xuICAgIG9wdHMgPSB7XG4gICAgICBza2lwSWZFeGlzdHM6IGZhbHNlLFxuICAgICAgLi4ub3B0cyxcbiAgICB9O1xuXG4gICAgLy8gTWFrZSBzdXJlIHBhdGggKGFuZCBwYXRoUGFyYW1zKSBhcmUgZmlsbGVkIGluIHRoZSBzYW1lIHdheVxuICAgIG5ld0l0ZW0gPSB0aGlzLnByZXBhcmVJdGVtKG5ld0l0ZW0pO1xuXG4gICAgLy8gRmluZCBpZiBpdGVtIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgZXhpc3RpbmdJdGVtID0gdGhpcy5maW5kRXhpc3RpbmdJdGVtKG5ld0l0ZW0pO1xuICAgIGlmIChleGlzdGluZ0l0ZW0gJiYgb3B0cy5za2lwSWZFeGlzdHMpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH0gU2tpcHBpbmcgc3ViIGl0ZW0gKGFscmVhZHkgZXhpc3QpYCwgbmV3SXRlbSk7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgYWRkXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50KG5ld0l0ZW0pO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5fbG9nUHJlZml4fSBVbmFibGUgdG8gYWRkIHN1YiBpdGVtOiBubyBwYXJlbnQgZm91bmRgKTtcbiAgICAgIGNvbnN0IHBhcmVudFVybFRyZSA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUobmV3SXRlbS5wYXJlbnRQYXRoLnNwbGl0KCcvJyksIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IG5ld0l0ZW0ucGFyZW50UGF0aFBhcmFtc1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUucm9vdC5wYXJlbnQ/LmRhdGE7XG4gICAgICBjb25zb2xlLmxvZygnVE9ETyBjaGVjayBwYXJlbnQgZGF0YScsIGRhdGEpO1xuXG4gICAgICAvKmF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobmV3SXRlbS5wYXJlbnRQYXRoLCB7XG4gICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZVxuICAgICAgfSk7Ki9cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmFkZE1lbnVUb1BhcmVudChwYXJlbnQsIG5ld0l0ZW0pO1xuICAgIH1cbiAgfTtcblxuICBwcm90ZWN0ZWQgcHJlcGFyZUl0ZW0oaXRlbTogTWVudUl0ZW0pOiBNZW51SXRlbSB7XG5cbiAgICBpdGVtID0gPE1lbnVJdGVtPntcbiAgICAgIC4uLml0ZW0sXG4gICAgICAkY2hpbGRyZW46IGl0ZW0uJGNoaWxkcmVuIHx8IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4oW10pXG4gICAgfTtcblxuICAgIC8vIENsZWFuXG4gICAgaWYgKGl0ZW0ucGF0aCkge1xuICAgICAgY29uc3Qge3BhdGgsIHBhcmFtc30gPSBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGl0ZW0ucGF0aCk7XG4gICAgICBpdGVtLnBhdGggPSBwYXRoO1xuICAgICAgaXRlbS5wYXRoUGFyYW1zID0gey4uLml0ZW0ucGF0aFBhcmFtcywgLi4ucGFyYW1zfTtcbiAgICB9XG4gICAgaWYgKGl0ZW0ucGFyZW50UGF0aCkge1xuICAgICAgY29uc3Qge3BhdGgsIHBhcmFtc30gPSBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGl0ZW0ucGFyZW50UGF0aCk7XG4gICAgICBpdGVtLnBhcmVudFBhdGggPSBwYXRoO1xuICAgICAgaXRlbS5wYXJlbnRQYXRoUGFyYW1zID0gey4uLml0ZW0ucGFyZW50UGF0aFBhcmFtcywgLi4ucGFyYW1zfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kRXhpc3RpbmdJdGVtKGl0ZW06IE1lbnVJdGVtLCBpdGVtcz86IE1lbnVJdGVtW10pOiBNZW51SXRlbSB7XG4gICAgaXRlbXMgPSBpdGVtcyB8fCB0aGlzLiRpdGVtcy52YWx1ZTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm90IGZvdW5kXG4gICAgcmV0dXJuIGl0ZW1zLmZpbmQoaSA9PiBNZW51SXRlbXMuaXNTYW1lKGksIGl0ZW0pIHx8IChcbiAgICAgIGkuJGNoaWxkcmVuICYmIHRoaXMuZmluZEV4aXN0aW5nSXRlbShpdGVtLCBpLiRjaGlsZHJlbi52YWx1ZSlcbiAgICApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kUGFyZW50KGNoaWxkSXRlbTogTWVudUl0ZW0sIHBhcmVudEl0ZW1zPzogTWVudUl0ZW1bXSk6IE1lbnVJdGVtIHtcbiAgICBpZiAoIWNoaWxkSXRlbT8ucGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBwYXJlbnRJdGVtcyA9IHBhcmVudEl0ZW1zIHx8IHRoaXMuJGl0ZW1zLnZhbHVlO1xuXG4gICAgcmV0dXJuIHBhcmVudEl0ZW1zLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0/LnBhdGgpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIEEgZm91bmQgaXRlbSBhbHJlYWR5IG1hdGNoIHdpdGggdGhlIG1lbnVJdGVtLnBhcmVudFBhdGggOiBrZWVwIGl0IGFzIGl0XG4gICAgICAvLyBUaGVyZSBpcyBhIGZvdW5kIGNhbmRpZGF0ZSB0aGF0IGFscmVhZHkgbWF0Y2ggdGhlIGN1cnJlbnQgY2FuZGlkYXRlIDoga2VlcCBpdFxuICAgICAgaWYgKE1lbnVJdGVtcy5pc1BhcmVudChjaGlsZEl0ZW0sIHJlcykpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaGFzIGV4cGxpY2l0IHBhcmVudFBhdGggYW5kIGl0cyBwYXRoIGFuZCBwYXRoIHBhcmFtIGFyZSB0aGUgc2FtZSBhcyB0aGUgY2FuZGlkYXRlICA6IHVzZSBpdCBhcyBwYXJlbnRcbiAgICAgIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoY2hpbGRJdGVtLCBpdGVtKSkgcmV0dXJuIGl0ZW07XG5cbiAgICAgIGlmICghcmVzICYmIGl0ZW0uJGNoaWxkcmVuPy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFBhcmVudChjaGlsZEl0ZW0sIGl0ZW0uJGNoaWxkcmVuPy52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwgdW5kZWZpbmVkKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgYWRkTWVudVRvUGFyZW50KHBhcmVudDogTWVudUl0ZW0sIGNoaWxkOiBNZW51SXRlbSkge1xuXG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9QWRkaW5nIGEgc3ViLW1lbnUgJHtNZW51SXRlbXMuZ2V0VXJsKGNoaWxkKX0gdG8gcGFyZW50IG1lbnUgJHtNZW51SXRlbXMuZ2V0VXJsKHBhcmVudCl9YCk7XG5cbiAgICAvLyBBdm9pZCB0byBrZWVwIGlkZW50aWNhbCBtZW51IGl0ZW0gKHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3IGNoaWxkIG1lbnUgaXRlbSlcbiAgICAvL2lmICghcGFyZW50Py4kY2hpbGRyZW4pIHBhcmVudC4kY2hpbGRyZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+KFtdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC4kY2hpbGRyZW4udmFsdWUgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChpdGVtID0+IE1lbnVJdGVtcy5pc1NhbWUoY2hpbGQsIGl0ZW0pKTtcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNoaWxkcmVuW2V4aXN0aW5nSW5kZXhdID0gY2hpbGQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfVxuICAgIHBhcmVudC4kY2hpbGRyZW4ubmV4dChjaGlsZHJlbik7XG5cblxuICAgIHRoaXMub25VcGRhdGVNZW51LmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRhY2hTdWJNZW51cyhjdXJyZW50UGF0aFBhcmFtOiBNZW51UGF0aFBhcmFtLCBpdGVtcz86IE1lbnVJdGVtW10sIGV4Y2x1ZGVkSXRlbXM/OiBNZW51SXRlbVtdKSB7XG4gICAgaXRlbXMgPSBpdGVtcyB8fCB0aGlzLnJvb3RJdGVtcztcbiAgICBleGNsdWRlZEl0ZW1zID0gZXhjbHVkZWRJdGVtcyB8fCBbXTtcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbS5wYXJlbnRQYXRoKSByZXR1cm4gdHJ1ZTsgLy8gQWx3YXlzIGtlZXAgcm9vdCBpdGVtc1xuXG4gICAgICAvLyBDdXJyZW50IHJvdXRlID0gcGFyYW06IGtlZXAgaXRcbiAgICAgIC8vIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoaXRlbSwgY3VycmVudFBhdGhQYXJhbSkpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBJdGVtIHBhcmVudCBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBjdXJyZW50IHBhdGg6IGtlZXAgaXRcbiAgICAgIC8vIGlmIChpdGVtLnBhdGg/LnN0YXJ0c1dpdGgoY3VycmVudFBhdGhQYXJhbS5wYXRoKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIEtlZXAgZWFjaCBtZW51IGl0ZW1zIGluIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCB1cmwgcGF0aFxuICAgICAgaWYgKGN1cnJlbnRQYXRoUGFyYW0ucGF0aC5zdGFydHNXaXRoKGl0ZW0ucGF0aCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBFbHNlLCBleGNsdWRlXG4gICAgICBleGNsdWRlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kZXRhY2hTdWJNZW51cyhjdXJyZW50UGF0aFBhcmFtLCBpdGVtLiRjaGlsZHJlbi52YWx1ZSB8fCBbXSwgZXhjbHVkZWRJdGVtcyk7XG4gICAgICBpdGVtLiRjaGlsZHJlbi5uZXh0KGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNWaXNpYmxlRm9yUm91dGUoaXRlbTogTWVudUl0ZW0sIGN1cnJlbnRQYXRoUGFyYW06IE1lbnVQYXRoUGFyYW0pIHtcbiAgICByZXR1cm4gO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Component, } from '@angular/core';
|
|
2
|
+
import { MenuItems } from '../menu.model';
|
|
3
|
+
import { MenuTestingPage } from './menu.testing';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/router";
|
|
6
|
+
import * as i2 from "@ionic/angular";
|
|
7
|
+
import * as i3 from "@ngx-translate/core";
|
|
8
|
+
import * as i4 from "../menu.service";
|
|
9
|
+
import * as i5 from "@angular/common";
|
|
10
|
+
import * as i6 from "@angular/material/tabs";
|
|
11
|
+
import * as i7 from "../../../shared/toolbar/toolbar";
|
|
12
|
+
export class OtherMenuTestingPage extends MenuTestingPage {
|
|
13
|
+
constructor(route, // Modal editor give 'null'
|
|
14
|
+
router, navController, alertCtrl, translate, menuService) {
|
|
15
|
+
super(route, router, navController, alertCtrl, translate, menuService);
|
|
16
|
+
this.logPrefix = '[menu-testing-other] ';
|
|
17
|
+
}
|
|
18
|
+
initSubMenu() {
|
|
19
|
+
const pathParam = MenuItems.parsePathWithQuery(this.router.url);
|
|
20
|
+
this.title = 'Other';
|
|
21
|
+
this.secondTabTitle = 'Second';
|
|
22
|
+
this.parentPath = '/testing/shared/menu?tab=1';
|
|
23
|
+
this.childPath = '';
|
|
24
|
+
const path = '/testing/shared/menu/other';
|
|
25
|
+
const parentPath = '/testing/shared/menu?tab=1';
|
|
26
|
+
console.debug(`${this.logPrefix} Setup with`, { path, parentPath });
|
|
27
|
+
this.menuService.addSubMenuItems([
|
|
28
|
+
{
|
|
29
|
+
title: 'Other',
|
|
30
|
+
path,
|
|
31
|
+
parentPath,
|
|
32
|
+
action: null,
|
|
33
|
+
profile: 'GUEST',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
title: this.secondTabTitle,
|
|
37
|
+
path,
|
|
38
|
+
pathParams: { tab: '1' },
|
|
39
|
+
parentPath: path,
|
|
40
|
+
action: null,
|
|
41
|
+
profile: 'GUEST',
|
|
42
|
+
}
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
OtherMenuTestingPage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtherMenuTestingPage, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.NavController }, { token: i2.AlertController }, { token: i3.TranslateService }, { token: i4.MenuService }], target: i0.ɵɵFactoryTarget.Component });
|
|
47
|
+
OtherMenuTestingPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OtherMenuTestingPage, selector: "app-testing-menu-other", usesInheritance: true, ngImport: i0, template: "<app-toolbar [defaultBackHref]=\"parentPath\">\n <ion-title>{{ title }}</ion-title>\n</app-toolbar>\n\n<ion-content>\n\n <mat-tab-group #tabGroup\n [(selectedIndex)]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n dynamicHeight>\n\n <!-- TAB: 1 -->\n <mat-tab label=\"Details\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>Details</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A first tab<br/>\n\n <ion-button (click)=\"toggleThird()\">\n Third tab ?\n </ion-button>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 2 -->\n <mat-tab [label]=\"secondTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{secondTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A second tab<br/>\n\n <ng-container *ngIf=\"secondTabTitle=== 'Others'\">\n Navigate to : <a [routerLink]=\"childPath\" >\n {{ childPath }}\n </a>\n </ng-container>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 3 -->\n <mat-tab *ngIf=\"thirdTabTitle\"\n [label]=\"thirdTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{thirdTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A third tab\n </div>\n\n </mat-tab>\n </mat-tab-group>\n</ion-content>\n", styles: [".menu-item{padding-left:0 px}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "directive", type: i2.RouterLinkWithHrefDelegate, selector: "a[routerLink],area[routerLink]", inputs: ["routerDirection", "routerAnimation"] }, { kind: "component", type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i6.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i7.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }] });
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtherMenuTestingPage, decorators: [{
|
|
49
|
+
type: Component,
|
|
50
|
+
args: [{ selector: 'app-testing-menu-other', template: "<app-toolbar [defaultBackHref]=\"parentPath\">\n <ion-title>{{ title }}</ion-title>\n</app-toolbar>\n\n<ion-content>\n\n <mat-tab-group #tabGroup\n [(selectedIndex)]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n dynamicHeight>\n\n <!-- TAB: 1 -->\n <mat-tab label=\"Details\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>Details</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A first tab<br/>\n\n <ion-button (click)=\"toggleThird()\">\n Third tab ?\n </ion-button>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 2 -->\n <mat-tab [label]=\"secondTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{secondTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A second tab<br/>\n\n <ng-container *ngIf=\"secondTabTitle=== 'Others'\">\n Navigate to : <a [routerLink]=\"childPath\" >\n {{ childPath }}\n </a>\n </ng-container>\n </div>\n\n </mat-tab>\n\n <!-- TAB: 3 -->\n <mat-tab *ngIf=\"thirdTabTitle\"\n [label]=\"thirdTabTitle\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <ion-label>{{thirdTabTitle}}</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n A third tab\n </div>\n\n </mat-tab>\n </mat-tab-group>\n</ion-content>\n", styles: [".menu-item{padding-left:0 px}\n"] }]
|
|
51
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.NavController }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: i4.MenuService }]; } });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1vdGhlci50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvdGVzdGluZy9tZW51LW90aGVyLnRlc3RpbmcudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvbWVudS90ZXN0aW5nL21lbnUudGVzdGluZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEdBQUUsTUFBTSxlQUFlLENBQUM7QUFLekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQU8vQyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsZUFBZTtJQUd2RCxZQUNFLEtBQXFCLEVBQUUsMkJBQTJCO0lBQ2xELE1BQWMsRUFDZCxhQUE0QixFQUM1QixTQUEwQixFQUMxQixTQUEyQixFQUMzQixXQUF3QjtRQUV4QixLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLHVCQUF1QixDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQztRQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsYUFBYSxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCO1lBQ0U7Z0JBQ0UsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSTtnQkFDSixVQUFVO2dCQUNWLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE9BQU8sRUFBRSxPQUFPO2FBQ2pCO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjO2dCQUMxQixJQUFJO2dCQUNKLFVBQVUsRUFBRSxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUM7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixNQUFNLEVBQUUsSUFBSTtnQkFDWixPQUFPLEVBQUUsT0FBTzthQUNqQjtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7O2lIQTNDVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixxRkNiakMsbStDQTJEQTsyRkQ5Q2Esb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01lbnVTZXJ2aWNlfSBmcm9tICcuLi9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtBbGVydENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge01lbnVJdGVtc30gZnJvbSAnLi4vbWVudS5tb2RlbCc7XG5pbXBvcnQge01lbnVUZXN0aW5nUGFnZX0gZnJvbSAnLi9tZW51LnRlc3RpbmcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGVzdGluZy1tZW51LW90aGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUudGVzdGluZy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVudS50ZXN0aW5nLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgT3RoZXJNZW51VGVzdGluZ1BhZ2UgZXh0ZW5kcyBNZW51VGVzdGluZ1BhZ2Uge1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCAvLyBNb2RhbCBlZGl0b3IgZ2l2ZSAnbnVsbCdcbiAgICByb3V0ZXI6IFJvdXRlcixcbiAgICBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBtZW51U2VydmljZTogTWVudVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIocm91dGUsIHJvdXRlciwgbmF2Q29udHJvbGxlciwgYWxlcnRDdHJsLCB0cmFuc2xhdGUsIG1lbnVTZXJ2aWNlKTtcbiAgICB0aGlzLmxvZ1ByZWZpeCA9ICdbbWVudS10ZXN0aW5nLW90aGVyXSAnO1xuICB9XG5cbiAgaW5pdFN1Yk1lbnUoKSB7XG4gICAgY29uc3QgcGF0aFBhcmFtID0gTWVudUl0ZW1zLnBhcnNlUGF0aFdpdGhRdWVyeSh0aGlzLnJvdXRlci51cmwpO1xuICAgIHRoaXMudGl0bGUgPSAnT3RoZXInO1xuICAgIHRoaXMuc2Vjb25kVGFiVGl0bGUgPSAnU2Vjb25kJztcbiAgICB0aGlzLnBhcmVudFBhdGggPSAnL3Rlc3Rpbmcvc2hhcmVkL21lbnU/dGFiPTEnO1xuICAgIHRoaXMuY2hpbGRQYXRoID0gJyc7XG4gICAgY29uc3QgcGF0aCA9ICcvdGVzdGluZy9zaGFyZWQvbWVudS9vdGhlcic7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9ICcvdGVzdGluZy9zaGFyZWQvbWVudT90YWI9MSc7XG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gU2V0dXAgd2l0aGAsIHtwYXRoLCBwYXJlbnRQYXRofSk7XG4gICAgdGhpcy5tZW51U2VydmljZS5hZGRTdWJNZW51SXRlbXMoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogJ090aGVyJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHBhcmVudFBhdGgsXG4gICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgIHByb2ZpbGU6ICdHVUVTVCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogdGhpcy5zZWNvbmRUYWJUaXRsZSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHBhdGhQYXJhbXM6IHt0YWI6ICcxJ30sXG4gICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgcHJvZmlsZTogJ0dVRVNUJyxcbiAgICAgICAgfVxuICAgICAgXVxuICAgICk7XG4gIH1cblxufVxuIiwiPGFwcC10b29sYmFyIFtkZWZhdWx0QmFja0hyZWZdPVwicGFyZW50UGF0aFwiPlxuICA8aW9uLXRpdGxlPnt7IHRpdGxlIH19PC9pb24tdGl0bGU+XG48L2FwcC10b29sYmFyPlxuXG48aW9uLWNvbnRlbnQ+XG5cbiAgPG1hdC10YWItZ3JvdXAgI3RhYkdyb3VwXG4gICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRJbmRleCldPVwic2VsZWN0ZWRUYWJJbmRleFwiXG4gICAgICAgICAgICAgICAgIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgZHluYW1pY0hlaWdodD5cblxuICAgIDwhLS0gVEFCOiAxIC0tPlxuICAgIDxtYXQtdGFiIGxhYmVsPVwiRGV0YWlsc1wiIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICA8aW9uLWxhYmVsPkRldGFpbHM8L2lvbi1sYWJlbD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgICBBIGZpcnN0IHRhYjxici8+XG5cbiAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZVRoaXJkKClcIj5cbiAgICAgICAgICBUaGlyZCB0YWIgP1xuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvbWF0LXRhYj5cblxuICAgIDwhLS0gVEFCOiAyIC0tPlxuICAgIDxtYXQtdGFiIFtsYWJlbF09XCJzZWNvbmRUYWJUaXRsZVwiIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICA8aW9uLWxhYmVsPnt7c2Vjb25kVGFiVGl0bGV9fTwvaW9uLWxhYmVsPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGRpdiBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICAgIEEgc2Vjb25kIHRhYjxici8+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY29uZFRhYlRpdGxlPT09ICdPdGhlcnMnXCI+XG4gICAgICAgICAgTmF2aWdhdGUgdG8gOiA8YSBbcm91dGVyTGlua109XCJjaGlsZFBhdGhcIiA+XG4gICAgICAgICAgICB7eyBjaGlsZFBhdGggfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC10YWI+XG5cbiAgICA8IS0tIFRBQjogMyAtLT5cbiAgICA8bWF0LXRhYiAqbmdJZj1cInRoaXJkVGFiVGl0bGVcIlxuICAgICAgICAgICAgIFtsYWJlbF09XCJ0aGlyZFRhYlRpdGxlXCIgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgIDxpb24tbGFiZWw+e3t0aGlyZFRhYlRpdGxlfX08L2lvbi1sYWJlbD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgICBBIHRoaXJkIHRhYlxuICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC10YWI+XG4gIDwvbWF0LXRhYi1ncm91cD5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
|