@yelon/bis 12.0.17 → 13.0.0

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.
Files changed (110) hide show
  1. package/LICENSE +21 -21
  2. package/bis.d.ts +5 -4
  3. package/{esm2015/bis.js → esm2020/bis.mjs} +4 -4
  4. package/esm2020/layout/act.guard.mjs +108 -0
  5. package/{esm2015/layout/bis.config.js → esm2020/layout/bis.config.mjs} +10 -10
  6. package/esm2020/layout/contact/contact.component.mjs +492 -0
  7. package/esm2020/layout/contact/contact.service.mjs +146 -0
  8. package/esm2020/layout/layout.mjs +5 -0
  9. package/esm2020/layout/layout.module.mjs +73 -0
  10. package/{esm2015/layout/path-to-regexp.service.js → esm2020/layout/path-to-regexp.service.mjs} +238 -237
  11. package/{esm2015/layout/public_api.js → esm2020/layout/public_api.mjs} +15 -15
  12. package/esm2020/layout/stomp.config.mjs +18 -0
  13. package/{esm2015/layout/widgets/index.js → esm2020/layout/widgets/index.mjs} +7 -7
  14. package/esm2020/layout/widgets/yz.application.component.mjs +271 -0
  15. package/esm2020/layout/widgets/yz.clear-storage.component.mjs +45 -0
  16. package/esm2020/layout/widgets/yz.fullscreen.component.mjs +45 -0
  17. package/esm2020/layout/widgets/yz.i18n.component.mjs +115 -0
  18. package/esm2020/layout/widgets/yz.notify.component.mjs +184 -0
  19. package/esm2020/layout/widgets/yz.them-btn.component.mjs +196 -0
  20. package/esm2020/layout/widgets/yz.user.component.mjs +112 -0
  21. package/esm2020/layout/yz.auth.service.mjs +156 -0
  22. package/esm2020/layout/yz.basic.component.mjs +207 -0
  23. package/esm2020/layout/yz.default.interceptor.mjs +203 -0
  24. package/esm2020/layout/yz.i18n.service.mjs +93 -0
  25. package/esm2020/layout/yz.startup.service.mjs +137 -0
  26. package/esm2020/layout/yz.stomp.service.mjs +88 -0
  27. package/{esm2015/public_api.js → esm2020/public_api.mjs} +1 -1
  28. package/{esm2015/shared/public_api.js → esm2020/shared/public_api.mjs} +4 -4
  29. package/{esm2015/shared/shared-yelon.module.js → esm2020/shared/shared-yelon.module.mjs} +107 -107
  30. package/{esm2015/shared/shared-zorro.module.js → esm2020/shared/shared-zorro.module.mjs} +80 -80
  31. package/{esm2015/shared/shared.js → esm2020/shared/shared.mjs} +4 -4
  32. package/esm2020/shared/shared.module.mjs +116 -0
  33. package/{esm2015/shared/style-icons.js → esm2020/shared/style-icons.mjs} +795 -795
  34. package/fesm2015/{bis.js → bis.mjs} +3 -3
  35. package/fesm2015/bis.mjs.map +1 -0
  36. package/fesm2015/{layout.js → layout.mjs} +2514 -2181
  37. package/fesm2015/layout.mjs.map +1 -0
  38. package/fesm2015/{shared.js → shared.mjs} +1004 -910
  39. package/fesm2015/shared.mjs.map +1 -0
  40. package/fesm2020/bis.mjs +6 -0
  41. package/fesm2020/bis.mjs.map +1 -0
  42. package/fesm2020/layout.mjs +2796 -0
  43. package/fesm2020/layout.mjs.map +1 -0
  44. package/fesm2020/shared.mjs +1106 -0
  45. package/fesm2020/shared.mjs.map +1 -0
  46. package/layout/act.guard.d.ts +23 -20
  47. package/layout/bis.config.d.ts +3 -3
  48. package/layout/contact/contact.component.d.ts +169 -166
  49. package/layout/contact/contact.service.d.ts +118 -115
  50. package/layout/layout.d.ts +5 -7
  51. package/layout/layout.module.d.ts +20 -2
  52. package/layout/package.json +5 -6
  53. package/layout/path-to-regexp.service.d.ts +26 -23
  54. package/layout/public_api.d.ts +14 -12
  55. package/layout/stomp.config.d.ts +3 -3
  56. package/layout/widgets/index.d.ts +7 -7
  57. package/layout/widgets/yz.application.component.d.ts +48 -45
  58. package/layout/widgets/yz.clear-storage.component.d.ts +11 -8
  59. package/layout/widgets/yz.fullscreen.component.d.ts +8 -6
  60. package/layout/widgets/yz.i18n.component.d.ts +22 -19
  61. package/layout/widgets/yz.notify.component.d.ts +30 -25
  62. package/layout/widgets/yz.them-btn.component.d.ts +32 -29
  63. package/layout/widgets/yz.user.component.d.ts +28 -25
  64. package/layout/yz.auth.service.d.ts +22 -19
  65. package/layout/yz.basic.component.d.ts +24 -15
  66. package/layout/yz.default.interceptor.d.ts +29 -26
  67. package/layout/yz.i18n.service.d.ts +27 -24
  68. package/layout/yz.startup.service.d.ts +34 -31
  69. package/layout/yz.stomp.service.d.ts +42 -39
  70. package/package.json +46 -18
  71. package/public_api.d.ts +2 -2
  72. package/shared/package.json +5 -6
  73. package/shared/public_api.d.ts +4 -4
  74. package/shared/shared-yelon.module.d.ts +3 -3
  75. package/shared/shared-zorro.module.d.ts +2 -2
  76. package/shared/shared.d.ts +5 -4
  77. package/shared/shared.module.d.ts +95 -2
  78. package/shared/style-icons.d.ts +1 -1
  79. package/bis.metadata.json +0 -1
  80. package/bundles/bis.umd.js +0 -18
  81. package/bundles/bis.umd.js.map +0 -1
  82. package/bundles/layout.umd.js +0 -2669
  83. package/bundles/layout.umd.js.map +0 -1
  84. package/bundles/shared.umd.js +0 -1249
  85. package/bundles/shared.umd.js.map +0 -1
  86. package/esm2015/layout/act.guard.js +0 -115
  87. package/esm2015/layout/contact/contact.component.js +0 -434
  88. package/esm2015/layout/contact/contact.service.js +0 -150
  89. package/esm2015/layout/layout.js +0 -8
  90. package/esm2015/layout/layout.module.js +0 -47
  91. package/esm2015/layout/stomp.config.js +0 -20
  92. package/esm2015/layout/widgets/yz.application.component.js +0 -200
  93. package/esm2015/layout/widgets/yz.clear-storage.component.js +0 -39
  94. package/esm2015/layout/widgets/yz.fullscreen.component.js +0 -36
  95. package/esm2015/layout/widgets/yz.i18n.component.js +0 -78
  96. package/esm2015/layout/widgets/yz.notify.component.js +0 -154
  97. package/esm2015/layout/widgets/yz.them-btn.component.js +0 -146
  98. package/esm2015/layout/widgets/yz.user.component.js +0 -81
  99. package/esm2015/layout/yz.auth.service.js +0 -158
  100. package/esm2015/layout/yz.basic.component.js +0 -101
  101. package/esm2015/layout/yz.default.interceptor.js +0 -204
  102. package/esm2015/layout/yz.i18n.service.js +0 -102
  103. package/esm2015/layout/yz.startup.service.js +0 -138
  104. package/esm2015/layout/yz.stomp.service.js +0 -91
  105. package/esm2015/shared/shared.module.js +0 -22
  106. package/fesm2015/bis.js.map +0 -1
  107. package/fesm2015/layout.js.map +0 -1
  108. package/fesm2015/shared.js.map +0 -1
  109. package/layout/layout.metadata.json +0 -1
  110. package/shared/shared.metadata.json +0 -1
@@ -0,0 +1,156 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { forkJoin, of } from 'rxjs';
3
+ import { map, mergeAll, mergeMap } from 'rxjs/operators';
4
+ import { mergeConfig as mergeAuthConfig, YA_SERVICE_TOKEN } from '@yelon/auth';
5
+ import { CacheService } from '@yelon/cache';
6
+ import { _HttpClient } from '@yelon/theme';
7
+ import { WINDOW } from '@yelon/util';
8
+ import { YunzaiConfigService } from '@yelon/util/config';
9
+ import { log } from '@yelon/util/other';
10
+ import { mergeBisConfig } from './bis.config';
11
+ import * as i0 from "@angular/core";
12
+ export class YzAuthService {
13
+ constructor(injector) {
14
+ this.injector = injector;
15
+ this.option = mergeAuthConfig(this.csr);
16
+ this.bis = mergeBisConfig(this.csr);
17
+ }
18
+ get csr() {
19
+ return this.injector.get(YunzaiConfigService);
20
+ }
21
+ get tokenService() {
22
+ return this.injector.get(YA_SERVICE_TOKEN);
23
+ }
24
+ get httpClient() {
25
+ return this.injector.get(_HttpClient);
26
+ }
27
+ get cacheService() {
28
+ return this.injector.get(CacheService);
29
+ }
30
+ askToken() {
31
+ log('yz.auth.service: ', 'askToken');
32
+ if (this.tokenService.get()?.token) {
33
+ return of(this.tokenService.get());
34
+ }
35
+ else {
36
+ if (this.bis.loginForm) {
37
+ return this.fetchTokenByUP();
38
+ }
39
+ else {
40
+ return this.fetchTokenByCas();
41
+ }
42
+ }
43
+ }
44
+ fetchTokenByUP() {
45
+ log('yz.auth.service: ', 'fetchTokenByUP');
46
+ return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.bis.loginForm).pipe(map((response) => {
47
+ const { access_token, expires_in, refresh_token, scope, token_type } = response;
48
+ return {
49
+ token: access_token,
50
+ expired: expires_in,
51
+ refreshToken: refresh_token,
52
+ tokenType: token_type,
53
+ scope
54
+ };
55
+ }));
56
+ }
57
+ fetchTokenByCas() {
58
+ log('yz.auth.service: ', 'fetchTokenByCas');
59
+ const uri = encodeURIComponent(this.injector.get(WINDOW).location.href);
60
+ return this.httpClient
61
+ .get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true&timestamp=${new Date().getTime()}`)
62
+ .pipe(map((response) => {
63
+ switch (response.errcode) {
64
+ case 2000:
65
+ const { access_token, expires_in, refresh_token, scope, token_type } = response.data;
66
+ return {
67
+ token: access_token,
68
+ expired: expires_in,
69
+ refreshToken: refresh_token,
70
+ tokenType: token_type,
71
+ scope
72
+ };
73
+ case 2001:
74
+ this.injector.get(WINDOW).location.href = response.msg;
75
+ throw Error("Cookie Error: Can't find Cas Cookie,So jump to login!");
76
+ default:
77
+ if (response.data) {
78
+ console.error(response.data);
79
+ throw Error(response.data);
80
+ }
81
+ else if (response.msg) {
82
+ console.error(response.msg);
83
+ throw Error(response.msg);
84
+ }
85
+ else {
86
+ console.error('cas unknown error');
87
+ throw Error('Unknown Error: Cas auth exception!');
88
+ }
89
+ }
90
+ }));
91
+ }
92
+ login() {
93
+ log('yz.auth.service: ', 'login white login form->', this.bis.loginForm);
94
+ return this.askToken().pipe(mergeMap(token => {
95
+ log('yz.auth.service: get token->', token);
96
+ this.csr.set('auth', {
97
+ token_send_key: 'Authorization',
98
+ token_send_template: `${token.tokenType} \${token}`,
99
+ token_send_place: 'header'
100
+ });
101
+ log('yz.auth.service: ', 'set token');
102
+ this.tokenService.set(token);
103
+ return this.cacheInit();
104
+ }), mergeAll());
105
+ }
106
+ cacheInit() {
107
+ log('yz.auth.service: ', 'cacheInit');
108
+ const user = this.cacheService.get('_yz_user', { mode: 'none' });
109
+ const header = this.cacheService.get('_yz_header', { mode: 'none' });
110
+ const project = this.cacheService.get('_yz_project_info', { mode: 'none' });
111
+ return forkJoin(of(user), of(header), of(project)).pipe(mergeMap(([u, h, p]) => {
112
+ let list = [];
113
+ // user cache
114
+ if (!u) {
115
+ log('yz.auth.service: ', 'fetch user cache');
116
+ list.push(this.httpClient.get(`/auth/user`).pipe(map((user) => {
117
+ this.cacheService.set('_yz_user', user.principal);
118
+ })));
119
+ }
120
+ else {
121
+ log('yz.auth.service: ', 'user recache');
122
+ list.push(of(() => { }));
123
+ }
124
+ // header cache
125
+ if (!h) {
126
+ log('yz.auth.service: ', 'fetch header cache');
127
+ list.push(this.httpClient.get(`/auth/allheader/v2`).pipe(map((header) => {
128
+ this.cacheService.set('_yz_header', header.data);
129
+ })));
130
+ }
131
+ else {
132
+ log('yz.auth.service: ', 'header recache');
133
+ list.push(of(() => { }));
134
+ }
135
+ // project cache
136
+ if (!p) {
137
+ log('yz.auth.service: ', 'fetch project cache');
138
+ list.push(this.httpClient.get(`/app-manager/project/info`).pipe(map((info) => {
139
+ this.cacheService.set('_yz_project_info', info.data);
140
+ })));
141
+ }
142
+ else {
143
+ log('yz.auth.service: ', 'project recache');
144
+ list.push(of(() => { }));
145
+ }
146
+ return forkJoin(list);
147
+ }));
148
+ }
149
+ }
150
+ YzAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: YzAuthService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
151
+ YzAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: YzAuthService, providedIn: 'root' });
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: YzAuthService, decorators: [{
153
+ type: Injectable,
154
+ args: [{ providedIn: 'root' }]
155
+ }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXouYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYmlzL2xheW91dC95ei5hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RCxPQUFPLEVBQThCLFdBQVcsSUFBSSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQTBDLE1BQU0sYUFBYSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUc5QyxNQUFNLE9BQU8sYUFBYTtJQUl4QixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVksR0FBRztRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFD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WUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7MEdBaktVLGFBQWE7OEdBQWIsYUFBYSxjQURBLE1BQU07MkZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBtZXJnZUFsbCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbmltcG9ydCB7IElUb2tlbk1vZGVsLCBJVG9rZW5TZXJ2aWNlLCBtZXJnZUNvbmZpZyBhcyBtZXJnZUF1dGhDb25maWcsIFlBX1NFUlZJQ0VfVE9LRU4gfSBmcm9tICdAeWVsb24vYXV0aCc7XG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tICdAeWVsb24vY2FjaGUnO1xuaW1wb3J0IHsgX0h0dHBDbGllbnQgfSBmcm9tICdAeWVsb24vdGhlbWUnO1xuaW1wb3J0IHsgV0lORE9XLCBZdW56YWlBdXRoQ29uZmlnLCBZdW56YWlCdXNpbmVzc0NvbmZpZyB9IGZyb20gJ0B5ZWxvbi91dGlsJztcbmltcG9ydCB7IFl1bnphaUNvbmZpZ1NlcnZpY2UgfSBmcm9tICdAeWVsb24vdXRpbC9jb25maWcnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnQHllbG9uL3V0aWwvb3RoZXInO1xuXG5pbXBvcnQgeyBtZXJnZUJpc0NvbmZpZyB9IGZyb20gJy4vYmlzLmNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgWXpBdXRoU2VydmljZSB7XG4gIHByb3RlY3RlZCBvcHRpb246IFl1bnphaUF1dGhDb25maWc7XG4gIHByb3RlY3RlZCBiaXM6IFl1bnphaUJ1c2luZXNzQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5vcHRpb24gPSBtZXJnZUF1dGhDb25maWcodGhpcy5jc3IpO1xuICAgIHRoaXMuYmlzID0gbWVyZ2VCaXNDb25maWcodGhpcy5jc3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY3NyKCk6IFl1bnphaUNvbmZpZ1NlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChZdW56YWlDb25maWdTZXJ2aWNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRva2VuU2VydmljZSgpOiBJVG9rZW5TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoWUFfU0VSVklDRV9UT0tFTik7XG4gIH1cblxuICBwcml2YXRlIGdldCBodHRwQ2xpZW50KCk6IF9IdHRwQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoX0h0dHBDbGllbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGVTZXJ2aWNlKCk6IENhY2hlU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KENhY2hlU2VydmljZSk7XG4gIH1cblxuICBhc2tUb2tlbigpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdhc2tUb2tlbicpO1xuICAgIGlmICh0aGlzLnRva2VuU2VydmljZS5nZXQoKT8udG9rZW4pIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnRva2VuU2VydmljZS5nZXQoKSEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5iaXMubG9naW5Gb3JtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoVG9rZW5CeVVQKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRva2VuQnlDYXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmZXRjaFRva2VuQnlVUCgpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlVUCcpO1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChgL2F1dGgvb2F1dGgvdG9rZW4/X2FsbG93X2Fub255bW91cz10cnVlYCwgdGhpcy5iaXMubG9naW5Gb3JtKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBzY29wZSwgdG9rZW5fdHlwZSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICBleHBpcmVkOiBleHBpcmVzX2luLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICB0b2tlblR5cGU6IHRva2VuX3R5cGUsXG4gICAgICAgICAgc2NvcGVcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoVG9rZW5CeUNhcygpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlDYXMnKTtcbiAgICBjb25zdCB1cmkgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAuZ2V0KGAvY2FzLXByb3h5L2FwcC92YWxpZGF0ZV9mdWxsP2NhbGxiYWNrPSR7dXJpfSZfYWxsb3dfYW5vbnltb3VzPXRydWUmdGltZXN0YW1wPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3BvbnNlLmVycmNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMjAwMDpcbiAgICAgICAgICAgICAgY29uc3QgeyBhY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW4sIHNjb3BlLCB0b2tlbl90eXBlIH0gPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRva2VuOiBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgZXhwaXJlZDogZXhwaXJlc19pbixcbiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5UeXBlOiB0b2tlbl90eXBlLFxuICAgICAgICAgICAgICAgIHNjb3BlXG4gICAgICAgICAgICAgIH0gYXMgSVRva2VuTW9kZWw7XG4gICAgICAgICAgICBjYXNlIDIwMDE6XG4gICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KFdJTkRPVykubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLm1zZztcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJDb29raWUgRXJyb3I6IENhbid0IGZpbmQgQ2FzIENvb2tpZSxTbyBqdW1wIHRvIGxvZ2luIVwiKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5tc2cpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlLm1zZyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocmVzcG9uc2UubXNnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjYXMgdW5rbm93biBlcnJvcicpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIEVycm9yOiBDYXMgYXV0aCBleGNlcHRpb24hJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgbG9naW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdsb2dpbiB3aGl0ZSBsb2dpbiBmb3JtLT4nLCB0aGlzLmJpcy5sb2dpbkZvcm0pO1xuICAgIHJldHVybiB0aGlzLmFza1Rva2VuKCkucGlwZShcbiAgICAgIG1lcmdlTWFwKHRva2VuID0+IHtcbiAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6IGdldCB0b2tlbi0+JywgdG9rZW4pO1xuICAgICAgICB0aGlzLmNzci5zZXQoJ2F1dGgnLCB7XG4gICAgICAgICAgdG9rZW5fc2VuZF9rZXk6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgICB0b2tlbl9zZW5kX3RlbXBsYXRlOiBgJHt0b2tlbi50b2tlblR5cGV9IFxcJHt0b2tlbn1gLFxuICAgICAgICAgIHRva2VuX3NlbmRfcGxhY2U6ICdoZWFkZXInXG4gICAgICAgIH0pO1xuICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ3NldCB0b2tlbicpO1xuICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQodG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUluaXQoKTtcbiAgICAgIH0pLFxuICAgICAgbWVyZ2VBbGwoKVxuICAgICk7XG4gIH1cblxuICBjYWNoZUluaXQoKTogT2JzZXJ2YWJsZTx2b2lkW10+IHtcbiAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2NhY2hlSW5pdCcpO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el91c2VyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3Byb2plY3RfaW5mbycsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIHJldHVybiBmb3JrSm9pbihvZih1c2VyKSwgb2YoaGVhZGVyKSwgb2YocHJvamVjdCkpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3UsIGgsIHBdKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgIC8vIHVzZXIgY2FjaGVcbiAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaCB1c2VyIGNhY2hlJyk7XG4gICAgICAgICAgbGlzdC5wdXNoKFxuICAgICAgICAgICAgdGhpcy5odHRwQ2xpZW50LmdldChgL2F1dGgvdXNlcmApLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgodXNlcjogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0KCdfeXpfdXNlcicsIHVzZXIucHJpbmNpcGFsKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZygneXouYXV0aC5zZXJ2aWNlOiAnLCAndXNlciByZWNhY2hlJyk7XG4gICAgICAgICAgbGlzdC5wdXNoKG9mPE56U2FmZUFueT4oKCkgPT4ge30pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoZWFkZXIgY2FjaGVcbiAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaCBoZWFkZXIgY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYXV0aC9hbGxoZWFkZXIvdjJgKS5waXBlKFxuICAgICAgICAgICAgICBtYXAoKGhlYWRlcjogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0KCdfeXpfaGVhZGVyJywgaGVhZGVyLmRhdGEpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdoZWFkZXIgcmVjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChvZjxOelNhZmVBbnk+KCgpID0+IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJvamVjdCBjYWNoZVxuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2ZldGNoIHByb2plY3QgY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYXBwLW1hbmFnZXIvcHJvamVjdC9pbmZvYCkucGlwZShcbiAgICAgICAgICAgICAgbWFwKChpbmZvOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el9wcm9qZWN0X2luZm8nLCBpbmZvLmRhdGEpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdwcm9qZWN0IHJlY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2gob2Y8TnpTYWZlQW55PigoKSA9PiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihsaXN0KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,207 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@yelon/cache";
4
+ import * as i2 from "./yz.stomp.service";
5
+ import * as i3 from "@yelon/theme/layout-default";
6
+ import * as i4 from "./widgets/yz.application.component";
7
+ import * as i5 from "./widgets/yz.notify.component";
8
+ import * as i6 from "./widgets/yz.them-btn.component";
9
+ import * as i7 from "ng-zorro-antd/dropdown";
10
+ import * as i8 from "./widgets/yz.fullscreen.component";
11
+ import * as i9 from "./widgets/yz.clear-storage.component";
12
+ import * as i10 from "./widgets/yz.i18n.component";
13
+ import * as i11 from "./widgets/yz.user.component";
14
+ import * as i12 from "ng-zorro-antd/avatar";
15
+ import * as i13 from "@yelon/abc/reuse-tab";
16
+ import * as i14 from "ng-zorro-antd/core/transition-patch";
17
+ import * as i15 from "ng-zorro-antd/icon";
18
+ import * as i16 from "ng-zorro-antd/menu";
19
+ import * as i17 from "@angular/router";
20
+ import * as i18 from "@angular/common";
21
+ import * as i19 from "@yelon/theme";
22
+ export class YzLayoutBasicComponent {
23
+ constructor(cacheService, yzStompService, layoutService) {
24
+ this.cacheService = cacheService;
25
+ this.yzStompService = yzStompService;
26
+ this.layoutService = layoutService;
27
+ this.options = {
28
+ logoExpanded: `./assets/logo-full.svg`,
29
+ logoCollapsed: `./assets/logo.svg`
30
+ };
31
+ this.intro = '';
32
+ this.text = '';
33
+ this.icon = '';
34
+ this.showReuseTab = true;
35
+ this.showHeader = true;
36
+ this.showSider = true;
37
+ }
38
+ get reuseStyleSheet() {
39
+ let cascadingStyleSheet = {};
40
+ if (!this.showHeader) {
41
+ cascadingStyleSheet = {
42
+ ...cascadingStyleSheet,
43
+ top: 0
44
+ };
45
+ }
46
+ if (!this.showSider) {
47
+ cascadingStyleSheet = {
48
+ ...cascadingStyleSheet,
49
+ left: '24px'
50
+ };
51
+ }
52
+ return cascadingStyleSheet;
53
+ }
54
+ ngOnInit() {
55
+ const current = this.cacheService.get('_yz_current', { mode: 'none' });
56
+ const project = this.cacheService.get('_yz_project_info', { mode: 'none' });
57
+ this.text = current.text ? current.text : '应用名称';
58
+ this.intro = current.intro ? current.intro : '应用描述';
59
+ this.icon = current.icon ? current.icon : `./assets/tmp/img/avatar.jpg`;
60
+ this.options.logoExpanded = project.maxLogoUrl ? project.maxLogoUrl : `./assets/logo-full.svg`;
61
+ this.options.logoCollapsed = project.miniLogoUrl ? project.miniLogoUrl : `./assets/logo.svg`;
62
+ this.yzStompService.listen();
63
+ this.layoutService.reuseTab.asObservable().subscribe(show => (this.showReuseTab = show));
64
+ this.layoutService.header.asObservable().subscribe(show => (this.showHeader = show));
65
+ this.layoutService.sidebar.asObservable().subscribe(show => (this.showSider = show));
66
+ }
67
+ ngOnDestroy() {
68
+ this.yzStompService.unListen();
69
+ }
70
+ }
71
+ YzLayoutBasicComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: YzLayoutBasicComponent, deps: [{ token: i1.CacheService }, { token: i2.YzStompService }, { token: i3.LayoutService }], target: i0.ɵɵFactoryTarget.Component });
72
+ YzLayoutBasicComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: YzLayoutBasicComponent, selector: "yz-layout-basic", ngImport: i0, template: `
73
+ <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="showReuseTab ? contentTpl : noneTpl">
74
+ <layout-default-header-item direction="left">
75
+ <yz-header-application></yz-header-application>
76
+ </layout-default-header-item>
77
+
78
+ <layout-default-header-item direction="right" hidden="mobile">
79
+ <yz-header-notify></yz-header-notify>
80
+ </layout-default-header-item>
81
+
82
+ <layout-default-header-item direction="right" hidden="mobile">
83
+ <yz-header-theme-btn></yz-header-theme-btn>
84
+ </layout-default-header-item>
85
+
86
+ <layout-default-header-item direction="right" hidden="mobile">
87
+ <div
88
+ layout-default-header-item-trigger
89
+ nz-dropdown
90
+ [nzDropdownMenu]="settingsMenu"
91
+ nzTrigger="click"
92
+ nzPlacement="bottomRight"
93
+ >
94
+ <i nz-icon nzType="setting"></i>
95
+ </div>
96
+ <nz-dropdown-menu #settingsMenu="nzDropdownMenu">
97
+ <div nz-menu style="width: 200px;">
98
+ <div nz-menu-item>
99
+ <yz-header-fullscreen></yz-header-fullscreen>
100
+ </div>
101
+ <div nz-menu-item>
102
+ <yz-header-clear-storage></yz-header-clear-storage>
103
+ </div>
104
+ <div nz-menu-item>
105
+ <yz-header-i18n></yz-header-i18n>
106
+ </div>
107
+ </div>
108
+ </nz-dropdown-menu>
109
+ </layout-default-header-item>
110
+ <layout-default-header-item direction="right">
111
+ <yz-header-user></yz-header-user>
112
+ </layout-default-header-item>
113
+ <ng-template #asideUserTpl>
114
+ <div nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu" class="yunzai-default__aside-user">
115
+ <nz-avatar class="yunzai-default__aside-user-avatar" [nzSrc]="icon"></nz-avatar>
116
+ <div class="yunzai-default__aside-user-info">
117
+ <strong>{{ text }}</strong>
118
+ <p class="mb0">{{ intro }}</p>
119
+ </div>
120
+ </div>
121
+ <nz-dropdown-menu #userMenu="nzDropdownMenu">
122
+ <ul nz-menu>
123
+ <li nz-menu-item routerLink="/">{{ 'menu.backtohome' | i18n }}</li>
124
+ </ul>
125
+ </nz-dropdown-menu>
126
+ </ng-template>
127
+ <ng-template #contentTpl>
128
+ <reuse-tab #reuseTab [ngStyle]="reuseStyleSheet"></reuse-tab>
129
+ <router-outlet (activate)="reuseTab.activate($event)"></router-outlet>
130
+ </ng-template>
131
+ <ng-template #noneTpl>
132
+ <router-outlet></router-outlet>
133
+ </ng-template>
134
+ </layout-default>
135
+ `, isInline: true, components: [{ type: i3.LayoutDefaultComponent, selector: "layout-default", inputs: ["options", "asideUser", "nav", "content", "customError"], exportAs: ["layoutDefault"] }, { type: i3.LayoutDefaultHeaderItemComponent, selector: "layout-default-header-item", inputs: ["hidden", "direction"] }, { type: i4.YzHeaderApplicationComponent, selector: "yz-header-application" }, { type: i5.YzHeaderNotifyComponent, selector: "yz-header-notify" }, { type: i6.YzHeaderThemBtnComponent, selector: "yz-header-theme-btn", inputs: ["types", "devTips", "deployUrl"] }, { type: i7.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { type: i8.YzHeaderFullScreenComponent, selector: "yz-header-fullscreen" }, { type: i9.YzHeaderClearStorageComponent, selector: "yz-header-clear-storage" }, { type: i10.YzHeaderI18NComponent, selector: "yz-header-i18n", inputs: ["showLangText"] }, { type: i11.YzHeaderUserComponent, selector: "yz-header-user" }, { type: i12.NzAvatarComponent, selector: "nz-avatar", inputs: ["nzShape", "nzSize", "nzGap", "nzText", "nzSrc", "nzSrcSet", "nzAlt", "nzIcon"], outputs: ["nzError"], exportAs: ["nzAvatar"] }, { type: i13.ReuseTabComponent, selector: "reuse-tab, [reuse-tab]", inputs: ["mode", "i18n", "debug", "max", "tabMaxWidth", "excludes", "allowClose", "keepingScroll", "keepingScrollContainer", "customContextMenu", "tabBarExtraContent", "tabBarGutter", "tabBarStyle", "tabType", "routeParamMatchMode", "disabled", "titleRender"], outputs: ["change", "close"], exportAs: ["reuseTab"] }], directives: [{ type: i3.LayoutDefaultHeaderItemTriggerDirective, selector: "[layout-default-header-item-trigger]" }, { type: i7.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i15.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i16.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { type: i16.NzMenuItemDirective, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { type: i17.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i18.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i17.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], pipes: { "i18n": i19.I18nPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: YzLayoutBasicComponent, decorators: [{
137
+ type: Component,
138
+ args: [{
139
+ selector: 'yz-layout-basic',
140
+ template: `
141
+ <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="showReuseTab ? contentTpl : noneTpl">
142
+ <layout-default-header-item direction="left">
143
+ <yz-header-application></yz-header-application>
144
+ </layout-default-header-item>
145
+
146
+ <layout-default-header-item direction="right" hidden="mobile">
147
+ <yz-header-notify></yz-header-notify>
148
+ </layout-default-header-item>
149
+
150
+ <layout-default-header-item direction="right" hidden="mobile">
151
+ <yz-header-theme-btn></yz-header-theme-btn>
152
+ </layout-default-header-item>
153
+
154
+ <layout-default-header-item direction="right" hidden="mobile">
155
+ <div
156
+ layout-default-header-item-trigger
157
+ nz-dropdown
158
+ [nzDropdownMenu]="settingsMenu"
159
+ nzTrigger="click"
160
+ nzPlacement="bottomRight"
161
+ >
162
+ <i nz-icon nzType="setting"></i>
163
+ </div>
164
+ <nz-dropdown-menu #settingsMenu="nzDropdownMenu">
165
+ <div nz-menu style="width: 200px;">
166
+ <div nz-menu-item>
167
+ <yz-header-fullscreen></yz-header-fullscreen>
168
+ </div>
169
+ <div nz-menu-item>
170
+ <yz-header-clear-storage></yz-header-clear-storage>
171
+ </div>
172
+ <div nz-menu-item>
173
+ <yz-header-i18n></yz-header-i18n>
174
+ </div>
175
+ </div>
176
+ </nz-dropdown-menu>
177
+ </layout-default-header-item>
178
+ <layout-default-header-item direction="right">
179
+ <yz-header-user></yz-header-user>
180
+ </layout-default-header-item>
181
+ <ng-template #asideUserTpl>
182
+ <div nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu" class="yunzai-default__aside-user">
183
+ <nz-avatar class="yunzai-default__aside-user-avatar" [nzSrc]="icon"></nz-avatar>
184
+ <div class="yunzai-default__aside-user-info">
185
+ <strong>{{ text }}</strong>
186
+ <p class="mb0">{{ intro }}</p>
187
+ </div>
188
+ </div>
189
+ <nz-dropdown-menu #userMenu="nzDropdownMenu">
190
+ <ul nz-menu>
191
+ <li nz-menu-item routerLink="/">{{ 'menu.backtohome' | i18n }}</li>
192
+ </ul>
193
+ </nz-dropdown-menu>
194
+ </ng-template>
195
+ <ng-template #contentTpl>
196
+ <reuse-tab #reuseTab [ngStyle]="reuseStyleSheet"></reuse-tab>
197
+ <router-outlet (activate)="reuseTab.activate($event)"></router-outlet>
198
+ </ng-template>
199
+ <ng-template #noneTpl>
200
+ <router-outlet></router-outlet>
201
+ </ng-template>
202
+ </layout-default>
203
+ `,
204
+ changeDetection: ChangeDetectionStrategy.OnPush
205
+ }]
206
+ }], ctorParameters: function () { return [{ type: i1.CacheService }, { type: i2.YzStompService }, { type: i3.LayoutService }]; } });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXouYmFzaWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYmlzL2xheW91dC95ei5iYXNpYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRFdEYsTUFBTSxPQUFPLHNCQUFzQjtJQStCakMsWUFDVSxZQUEwQixFQUMxQixjQUE4QixFQUM5QixhQUE0QjtRQUY1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQ3RDLFlBQU8sR0FBeUI7WUFDOUIsWUFBWSxFQUFFLHdCQUF3QjtZQUN0QyxhQUFhLEVBQUUsbUJBQW1CO1NBQ25DLENBQUM7UUFFRixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVsQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUM3QixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQzNCLGNBQVMsR0FBWSxJQUFJLENBQUM7SUF1QnZCLENBQUM7SUFyQkosSUFBSSxlQUFlO1FBQ2pCLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLG1CQUFtQixHQUFHO2dCQUNwQixHQUFHLG1CQUFtQjtnQkFDdEIsR0FBRyxFQUFFLENBQUM7YUFDUCxDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixtQkFBbUIsR0FBRztnQkFDcEIsR0FBRyxtQkFBbUI7Z0JBQ3RCLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQztTQUNIO1FBQ0QsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBUUQsUUFBUTtRQUNOLE1BQU0sT0FBTyxHQUFjLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxHQUFjLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQztRQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQztRQUMvRixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztRQUM3RixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQyxDQUFDOzttSEFyRFUsc0JBQXNCO3VHQUF0QixzQkFBc0IsdURBbEV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0RUOzJGQUdVLHNCQUFzQjtrQkFwRWxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErRFQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnQHllbG9uL2NhY2hlJztcbmltcG9ydCB7IExheW91dERlZmF1bHRPcHRpb25zLCBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnQHllbG9uL3RoZW1lL2xheW91dC1kZWZhdWx0JztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbmltcG9ydCB7IFl6U3RvbXBTZXJ2aWNlIH0gZnJvbSAnLi95ei5zdG9tcC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXotbGF5b3V0LWJhc2ljJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGF5b3V0LWRlZmF1bHQgW29wdGlvbnNdPVwib3B0aW9uc1wiIFthc2lkZVVzZXJdPVwiYXNpZGVVc2VyVHBsXCIgW2NvbnRlbnRdPVwic2hvd1JldXNlVGFiID8gY29udGVudFRwbCA6IG5vbmVUcGxcIj5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJsZWZ0XCI+XG4gICAgICAgIDx5ei1oZWFkZXItYXBwbGljYXRpb24+PC95ei1oZWFkZXItYXBwbGljYXRpb24+XG4gICAgICA8L2xheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtPlxuXG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPHl6LWhlYWRlci1ub3RpZnk+PC95ei1oZWFkZXItbm90aWZ5PlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cblxuICAgICAgPGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtIGRpcmVjdGlvbj1cInJpZ2h0XCIgaGlkZGVuPVwibW9iaWxlXCI+XG4gICAgICAgIDx5ei1oZWFkZXItdGhlbWUtYnRuPjwveXotaGVhZGVyLXRoZW1lLWJ0bj5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiIGhpZGRlbj1cIm1vYmlsZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0tdHJpZ2dlclxuICAgICAgICAgIG56LWRyb3Bkb3duXG4gICAgICAgICAgW256RHJvcGRvd25NZW51XT1cInNldHRpbmdzTWVudVwiXG4gICAgICAgICAgbnpUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgIG56UGxhY2VtZW50PVwiYm90dG9tUmlnaHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJzZXR0aW5nXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG56LWRyb3Bkb3duLW1lbnUgI3NldHRpbmdzTWVudT1cIm56RHJvcGRvd25NZW51XCI+XG4gICAgICAgICAgPGRpdiBuei1tZW51IHN0eWxlPVwid2lkdGg6IDIwMHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIDx5ei1oZWFkZXItZnVsbHNjcmVlbj48L3l6LWhlYWRlci1mdWxsc2NyZWVuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IG56LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgPHl6LWhlYWRlci1jbGVhci1zdG9yYWdlPjwveXotaGVhZGVyLWNsZWFyLXN0b3JhZ2U+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXotaGVhZGVyLWkxOG4+PC95ei1oZWFkZXItaTE4bj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L256LWRyb3Bkb3duLW1lbnU+XG4gICAgICA8L2xheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtPlxuICAgICAgPGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtIGRpcmVjdGlvbj1cInJpZ2h0XCI+XG4gICAgICAgIDx5ei1oZWFkZXItdXNlcj48L3l6LWhlYWRlci11c2VyPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjYXNpZGVVc2VyVHBsPlxuICAgICAgICA8ZGl2IG56LWRyb3Bkb3duIG56VHJpZ2dlcj1cImNsaWNrXCIgW256RHJvcGRvd25NZW51XT1cInVzZXJNZW51XCIgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlclwiPlxuICAgICAgICAgIDxuei1hdmF0YXIgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlci1hdmF0YXJcIiBbbnpTcmNdPVwiaWNvblwiPjwvbnotYXZhdGFyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlci1pbmZvXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHRleHQgfX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWIwXCI+e3sgaW50cm8gfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotZHJvcGRvd24tbWVudSAjdXNlck1lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgICAgIDx1bCBuei1tZW51PlxuICAgICAgICAgICAgPGxpIG56LW1lbnUtaXRlbSByb3V0ZXJMaW5rPVwiL1wiPnt7ICdtZW51LmJhY2t0b2hvbWUnIHwgaTE4biB9fTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9uei1kcm9wZG93bi1tZW51PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRwbD5cbiAgICAgICAgPHJldXNlLXRhYiAjcmV1c2VUYWIgW25nU3R5bGVdPVwicmV1c2VTdHlsZVNoZWV0XCI+PC9yZXVzZS10YWI+XG4gICAgICAgIDxyb3V0ZXItb3V0bGV0IChhY3RpdmF0ZSk9XCJyZXVzZVRhYi5hY3RpdmF0ZSgkZXZlbnQpXCI+PC9yb3V0ZXItb3V0bGV0PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uZVRwbD5cbiAgICAgICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2xheW91dC1kZWZhdWx0PlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBZekxheW91dEJhc2ljQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBvcHRpb25zOiBMYXlvdXREZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBsb2dvRXhwYW5kZWQ6IGAuL2Fzc2V0cy9sb2dvLWZ1bGwuc3ZnYCxcbiAgICBsb2dvQ29sbGFwc2VkOiBgLi9hc3NldHMvbG9nby5zdmdgXG4gIH07XG5cbiAgaW50cm86IHN0cmluZyA9ICcnO1xuICB0ZXh0OiBzdHJpbmcgPSAnJztcbiAgaWNvbjogc3RyaW5nID0gJyc7XG5cbiAgc2hvd1JldXNlVGFiOiBib29sZWFuID0gdHJ1ZTtcbiAgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIHNob3dTaWRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgZ2V0IHJldXNlU3R5bGVTaGVldCgpOiBOelNhZmVBbnkge1xuICAgIGxldCBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge307XG4gICAgaWYgKCF0aGlzLnNob3dIZWFkZXIpIHtcbiAgICAgIGNhc2NhZGluZ1N0eWxlU2hlZXQgPSB7XG4gICAgICAgIC4uLmNhc2NhZGluZ1N0eWxlU2hlZXQsXG4gICAgICAgIHRvcDogMFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3dTaWRlcikge1xuICAgICAgY2FzY2FkaW5nU3R5bGVTaGVldCA9IHtcbiAgICAgICAgLi4uY2FzY2FkaW5nU3R5bGVTaGVldCxcbiAgICAgICAgbGVmdDogJzI0cHgnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY2FzY2FkaW5nU3R5bGVTaGVldDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB5elN0b21wU2VydmljZTogWXpTdG9tcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50OiBOelNhZmVBbnkgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9jdXJyZW50JywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgcHJvamVjdDogTnpTYWZlQW55ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfcHJvamVjdF9pbmZvJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgdGhpcy50ZXh0ID0gY3VycmVudC50ZXh0ID8gY3VycmVudC50ZXh0IDogJ+W6lOeUqOWQjeensCc7XG4gICAgdGhpcy5pbnRybyA9IGN1cnJlbnQuaW50cm8gPyBjdXJyZW50LmludHJvIDogJ+W6lOeUqOaPj+i/sCc7XG4gICAgdGhpcy5pY29uID0gY3VycmVudC5pY29uID8gY3VycmVudC5pY29uIDogYC4vYXNzZXRzL3RtcC9pbWcvYXZhdGFyLmpwZ2A7XG4gICAgdGhpcy5vcHRpb25zLmxvZ29FeHBhbmRlZCA9IHByb2plY3QubWF4TG9nb1VybCA/IHByb2plY3QubWF4TG9nb1VybCA6IGAuL2Fzc2V0cy9sb2dvLWZ1bGwuc3ZnYDtcbiAgICB0aGlzLm9wdGlvbnMubG9nb0NvbGxhcHNlZCA9IHByb2plY3QubWluaUxvZ29VcmwgPyBwcm9qZWN0Lm1pbmlMb2dvVXJsIDogYC4vYXNzZXRzL2xvZ28uc3ZnYDtcbiAgICB0aGlzLnl6U3RvbXBTZXJ2aWNlLmxpc3RlbigpO1xuICAgIHRoaXMubGF5b3V0U2VydmljZS5yZXVzZVRhYi5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoc2hvdyA9PiAodGhpcy5zaG93UmV1c2VUYWIgPSBzaG93KSk7XG4gICAgdGhpcy5sYXlvdXRTZXJ2aWNlLmhlYWRlci5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoc2hvdyA9PiAodGhpcy5zaG93SGVhZGVyID0gc2hvdykpO1xuICAgIHRoaXMubGF5b3V0U2VydmljZS5zaWRlYmFyLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZShzaG93ID0+ICh0aGlzLnNob3dTaWRlciA9IHNob3cpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMueXpTdG9tcFNlcnZpY2UudW5MaXN0ZW4oKTtcbiAgfVxufVxuIl19