@yelon/bis 17.2.1 → 17.2.3

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 (109) hide show
  1. package/config/index.d.ts +5 -0
  2. package/config/public_api.d.ts +1 -0
  3. package/esm2022/bis.mjs +2 -2
  4. package/esm2022/{layout → config}/bis.config.mjs +1 -1
  5. package/esm2022/config/config.mjs +5 -0
  6. package/esm2022/config/public_api.mjs +2 -0
  7. package/esm2022/layout/layout-basic.component.mjs +376 -0
  8. package/esm2022/layout/layout-nav-application.component.mjs +368 -0
  9. package/esm2022/layout/layout-nav-group.component.mjs +160 -0
  10. package/esm2022/layout/layout-nav-tile.component.mjs +15 -0
  11. package/esm2022/layout/layout.module.mjs +54 -0
  12. package/esm2022/layout/public_api.mjs +6 -14
  13. package/esm2022/public_api.mjs +9 -2
  14. package/esm2022/src/bis.module.mjs +17 -0
  15. package/esm2022/src/helper.mjs +45 -0
  16. package/esm2022/src/provide.mjs +8 -0
  17. package/esm2022/src/refresh-token.mjs +79 -0
  18. package/esm2022/src/startup.service.mjs +184 -0
  19. package/esm2022/src/yunzai-act.guard.mjs +88 -0
  20. package/esm2022/src/yunzai-analysis-addon.guard.mjs +99 -0
  21. package/esm2022/src/yunzai-default.interceptor.mjs +63 -0
  22. package/esm2022/yunzai-widgets/public_api.mjs +7 -0
  23. package/esm2022/yunzai-widgets/yunzai-clear-storage.component.mjs +47 -0
  24. package/esm2022/yunzai-widgets/yunzai-fullscreen.component.mjs +47 -0
  25. package/esm2022/yunzai-widgets/yunzai-i18n.component.mjs +139 -0
  26. package/esm2022/yunzai-widgets/yunzai-notify.component.mjs +180 -0
  27. package/esm2022/yunzai-widgets/yunzai-user.component.mjs +120 -0
  28. package/esm2022/yunzai-widgets/yunzai-widget.module.mjs +62 -0
  29. package/esm2022/yunzai-widgets/yunzai-widgets.mjs +5 -0
  30. package/fesm2022/bis.mjs +554 -1
  31. package/fesm2022/bis.mjs.map +1 -1
  32. package/fesm2022/config.mjs +21 -0
  33. package/fesm2022/config.mjs.map +1 -0
  34. package/fesm2022/layout.mjs +396 -2781
  35. package/fesm2022/layout.mjs.map +1 -1
  36. package/fesm2022/yunzai-widgets.mjs +563 -0
  37. package/fesm2022/yunzai-widgets.mjs.map +1 -0
  38. package/index.d.ts +4 -0
  39. package/layout/{layout-basic/layout-basic.component.d.ts → layout-basic.component.d.ts} +12 -8
  40. package/layout/layout-nav-application.component.d.ts +26 -0
  41. package/layout/layout-nav-group.component.d.ts +14 -0
  42. package/layout/layout-nav-tile.component.d.ts +5 -0
  43. package/layout/layout.module.d.ts +18 -0
  44. package/layout/public_api.d.ts +5 -13
  45. package/package.json +40 -11
  46. package/public_api.d.ts +8 -2
  47. package/src/bis.module.d.ts +8 -0
  48. package/src/helper.d.ts +16 -0
  49. package/src/provide.d.ts +2 -0
  50. package/src/refresh-token.d.ts +6 -0
  51. package/src/startup.service.d.ts +24 -0
  52. package/src/yunzai-default.interceptor.d.ts +2 -0
  53. package/yunzai-widgets/index.d.ts +5 -0
  54. package/{layout/widgets/index.d.ts → yunzai-widgets/public_api.d.ts} +2 -2
  55. package/yunzai-widgets/yunzai-clear-storage.component.d.ts +8 -0
  56. package/yunzai-widgets/yunzai-fullscreen.component.d.ts +8 -0
  57. package/yunzai-widgets/yunzai-i18n.component.d.ts +19 -0
  58. package/yunzai-widgets/yunzai-notify.component.d.ts +25 -0
  59. package/yunzai-widgets/yunzai-user.component.d.ts +22 -0
  60. package/yunzai-widgets/yunzai-widget.module.d.ts +18 -0
  61. package/README.md +0 -23
  62. package/esm2022/index.mjs +0 -2
  63. package/esm2022/layout/html-names.mjs +0 -33
  64. package/esm2022/layout/icon/style-icons.mjs +0 -796
  65. package/esm2022/layout/layout-basic/index.mjs +0 -3
  66. package/esm2022/layout/layout-basic/interface.mjs +0 -2
  67. package/esm2022/layout/layout-basic/layout-basic.component.mjs +0 -368
  68. package/esm2022/layout/layout-nav/index.mjs +0 -4
  69. package/esm2022/layout/layout-nav/layout-nav-application.component.mjs +0 -382
  70. package/esm2022/layout/layout-nav/layout-nav-group.component.mjs +0 -122
  71. package/esm2022/layout/layout-nav/layout-nav-tile.component.mjs +0 -15
  72. package/esm2022/layout/widgets/index.mjs +0 -7
  73. package/esm2022/layout/widgets/yunzai-clear-storage.component.mjs +0 -44
  74. package/esm2022/layout/widgets/yunzai-fullscreen.component.mjs +0 -44
  75. package/esm2022/layout/widgets/yunzai-i18n.component.mjs +0 -140
  76. package/esm2022/layout/widgets/yunzai-notify.component.mjs +0 -185
  77. package/esm2022/layout/widgets/yunzai-theme-btn.component.mjs +0 -200
  78. package/esm2022/layout/widgets/yunzai-user.component.mjs +0 -129
  79. package/esm2022/layout/yunzai-act.guard.mjs +0 -88
  80. package/esm2022/layout/yunzai-analysis-addon.guard.mjs +0 -100
  81. package/esm2022/layout/yunzai-auth.service.mjs +0 -108
  82. package/esm2022/layout/yunzai-default.interceptor.mjs +0 -201
  83. package/esm2022/layout/yunzai-i18n.service.mjs +0 -107
  84. package/esm2022/layout/yunzai-lang.mjs +0 -114
  85. package/esm2022/layout/yunzai-layout.module.mjs +0 -118
  86. package/esm2022/layout/yunzai-startup.service.mjs +0 -152
  87. package/layout/html-names.d.ts +0 -31
  88. package/layout/icon/style-icons.d.ts +0 -1
  89. package/layout/layout-basic/index.d.ts +0 -2
  90. package/layout/layout-basic/interface.d.ts +0 -8
  91. package/layout/layout-nav/index.d.ts +0 -3
  92. package/layout/layout-nav/layout-nav-application.component.d.ts +0 -32
  93. package/layout/layout-nav/layout-nav-group.component.d.ts +0 -16
  94. package/layout/layout-nav/layout-nav-tile.component.d.ts +0 -6
  95. package/layout/widgets/yunzai-clear-storage.component.d.ts +0 -11
  96. package/layout/widgets/yunzai-fullscreen.component.d.ts +0 -8
  97. package/layout/widgets/yunzai-i18n.component.d.ts +0 -22
  98. package/layout/widgets/yunzai-notify.component.d.ts +0 -30
  99. package/layout/widgets/yunzai-theme-btn.component.d.ts +0 -32
  100. package/layout/widgets/yunzai-user.component.d.ts +0 -26
  101. package/layout/yunzai-auth.service.d.ts +0 -19
  102. package/layout/yunzai-default.interceptor.d.ts +0 -28
  103. package/layout/yunzai-i18n.service.d.ts +0 -27
  104. package/layout/yunzai-lang.d.ts +0 -12
  105. package/layout/yunzai-layout.module.d.ts +0 -30
  106. package/layout/yunzai-startup.service.d.ts +0 -34
  107. /package/{layout → config}/bis.config.d.ts +0 -0
  108. /package/{layout → src}/yunzai-act.guard.d.ts +0 -0
  109. /package/{layout → src}/yunzai-analysis-addon.guard.d.ts +0 -0
package/fesm2022/bis.mjs CHANGED
@@ -1,6 +1,559 @@
1
- var public_api = void 0;
1
+ import * as i0 from '@angular/core';
2
+ import { NgModule, importProvidersFrom, makeEnvironmentProviders, inject, APP_INITIALIZER, Injector, Injectable, Inject } from '@angular/core';
3
+ import { YunzaiLayoutModule } from '@yelon/bis/layout';
4
+ import { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';
5
+ import * as i2 from '@angular/router';
6
+ import { Router } from '@angular/router';
7
+ import { YA_SERVICE_TOKEN } from '@yelon/auth';
8
+ import { YUNZAI_I18N_TOKEN, IGNORE_BASE_URL, MenuService, TitleService, SettingsService } from '@yelon/theme';
9
+ import { NzNotificationService } from 'ng-zorro-antd/notification';
10
+ import { HttpClient, HttpErrorResponse, HttpResponseBase } from '@angular/common/http';
11
+ import { BehaviorSubject, throwError, filter, take, switchMap, catchError, of, mergeMap, combineLatest, map } from 'rxjs';
12
+ import { mergeBisConfig, BUSINESS_DEFAULT_CONFIG } from '@yelon/bis/config';
13
+ import * as i1 from '@yelon/util';
14
+ import { log, YUNZAI_CONFIG, YunzaiConfigService, WINDOW, useLocalStorageTenant, useLocalStorageUser, useLocalStorageHeader, useLocalStorageProjectInfo, useLocalStorageDefaultRoute, useLocalStorageCurrent, deepCopy } from '@yelon/util';
15
+ import { ACLService } from '@yelon/acl';
16
+
17
+ class BisModule {
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: BisModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
19
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: BisModule, imports: [YunzaiLayoutModule, YunzaiWidgetsModule], exports: [YunzaiLayoutModule, YunzaiWidgetsModule] }); }
20
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: BisModule, imports: [YunzaiLayoutModule, YunzaiWidgetsModule, YunzaiLayoutModule, YunzaiWidgetsModule] }); }
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: BisModule, decorators: [{
23
+ type: NgModule,
24
+ args: [{
25
+ imports: [YunzaiLayoutModule, YunzaiWidgetsModule],
26
+ exports: [YunzaiLayoutModule, YunzaiWidgetsModule]
27
+ }]
28
+ }] });
29
+
30
+ function provideYunzaiBis() {
31
+ const provides = [];
32
+ provides.push(importProvidersFrom(BisModule));
33
+ return makeEnvironmentProviders(provides);
34
+ }
35
+
36
+ const CODEMESSAGE = {
37
+ 200: '服务器成功返回请求的数据。',
38
+ 201: '新建或修改数据成功。',
39
+ 202: '一个请求已经进入后台排队(异步任务)。',
40
+ 204: '删除数据成功。',
41
+ 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
42
+ 401: '用户没有权限(令牌、用户名、密码错误)。',
43
+ 403: '用户得到授权,但是访问是被禁止的。',
44
+ 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
45
+ 406: '请求的格式不可得。',
46
+ 410: '请求的资源被永久删除,且不会再得到的。',
47
+ 422: '当创建一个对象时,发生一个验证错误。',
48
+ 500: '服务器发生错误,请检查服务器。',
49
+ 502: '网关错误。',
50
+ 503: '服务不可用,服务器暂时过载或维护。',
51
+ 504: '网关超时。'
52
+ };
53
+ function getAdditionalHeaders(headers) {
54
+ const res = {};
55
+ const lang = inject(YUNZAI_I18N_TOKEN).currentLang;
56
+ if (!headers?.has('Accept-Language') && lang) {
57
+ res['Accept-Language'] = lang;
58
+ }
59
+ return res;
60
+ }
61
+ function checkStatus(injector, ev) {
62
+ if ((ev.status >= 200 && ev.status < 300) || ev.status === 401) {
63
+ return;
64
+ }
65
+ const errortext = CODEMESSAGE[ev.status] || ev.statusText;
66
+ injector.get(NzNotificationService).error(`请求错误 ${ev.status}: ${ev.url}`, errortext);
67
+ }
68
+ function goTo(injector, url) {
69
+ setTimeout(() => injector.get(Router).navigateByUrl(url));
70
+ }
71
+ function toLogin(injector) {
72
+ injector.get(NzNotificationService).error(`未登录或登录已过期,请重新登录。`, ``);
73
+ goTo(injector, injector.get(YA_SERVICE_TOKEN).login_url);
74
+ }
75
+
76
+ let refreshToking = false;
77
+ let refreshToken$ = new BehaviorSubject(null);
78
+ const tryRefreshToken = (injector, ev, req, next) => {
79
+ // 连刷新Token的请求都错了,那就是真错了
80
+ if (['/auth/oauth/getOrCreateToken/webapp'].some(url => req.url.includes(url))) {
81
+ toLogin(injector);
82
+ return throwError(() => ev);
83
+ }
84
+ // 2、如果 `refreshToking` 为 `true` 表示已经在请求刷新 Token 中,后续所有请求转入等待状态,直至结果返回后再重新发起请求
85
+ if (refreshToking) {
86
+ return refreshToken$.pipe(filter(v => !!v), take(1), switchMap(() => next(reAttachToken(injector, req))));
87
+ }
88
+ // 3、尝试调用刷新 Token
89
+ refreshToking = true;
90
+ refreshToken$.next(null);
91
+ return refreshTokenRequest(injector).pipe(switchMap(res => {
92
+ // 通知后续请求继续执行
93
+ refreshToking = false;
94
+ refreshToken$.next(res);
95
+ // 重新保存新 token
96
+ injector.get(YA_SERVICE_TOKEN).set(res);
97
+ // 重新发起请求
98
+ return next(reAttachToken(injector, req));
99
+ }), catchError(err => {
100
+ refreshToking = false;
101
+ toLogin(injector);
102
+ return throwError(() => err);
103
+ }));
104
+ };
105
+ function reAttachToken(injector, req) {
106
+ const token = injector.get(YA_SERVICE_TOKEN).get()?.access_token;
107
+ return req.clone({
108
+ setHeaders: {
109
+ Authorization: `Bearer ${token}`
110
+ }
111
+ });
112
+ }
113
+ function refreshTokenRequest(injector) {
114
+ const model = injector.get(YA_SERVICE_TOKEN).get();
115
+ const form = new FormData();
116
+ form.set('refresh_token', model?.refresh_token);
117
+ form.set('grant_type', 'refresh_token');
118
+ form.set('scope', 'webapp');
119
+ return injector.get(HttpClient).post(`/auth/oauth/getOrCreateToken/webapp`, form);
120
+ }
121
+ function buildAuthRefresh(injector) {
122
+ const tokenSrv = injector.get(YA_SERVICE_TOKEN);
123
+ tokenSrv.refresh
124
+ .pipe(filter(() => !refreshToking), switchMap(res => {
125
+ log(res);
126
+ refreshToking = true;
127
+ return refreshTokenRequest(injector);
128
+ }))
129
+ .subscribe({
130
+ next: res => {
131
+ res.expired = +new Date() + 1000 * 60 * 5;
132
+ refreshToking = false;
133
+ tokenSrv.set(res);
134
+ },
135
+ error: () => toLogin(injector)
136
+ });
137
+ }
138
+ function provideYunzaiBindAuthRefresh() {
139
+ return [
140
+ {
141
+ provide: APP_INITIALIZER,
142
+ useFactory: (injector) => () => buildAuthRefresh(injector),
143
+ deps: [Injector],
144
+ multi: true
145
+ }
146
+ ];
147
+ }
148
+
149
+ function handleData(injector, ev, req, next) {
150
+ checkStatus(injector, ev);
151
+ const config = injector.get(YUNZAI_CONFIG).bis;
152
+ switch (ev.status) {
153
+ case 200:
154
+ return of(ev);
155
+ case 401:
156
+ if (config.refreshTokenEnabled && config.refreshTokenType === 're-request') {
157
+ const unAuthorizationReq = req.clone();
158
+ unAuthorizationReq.headers.delete('Authorization');
159
+ return tryRefreshToken(injector, ev, unAuthorizationReq, next);
160
+ }
161
+ toLogin(injector);
162
+ break;
163
+ case 403:
164
+ case 404:
165
+ case 500:
166
+ goTo(injector, `/exception/${ev.status}?url=${req.urlWithParams}`);
167
+ break;
168
+ default:
169
+ if (ev instanceof HttpErrorResponse) {
170
+ console.warn('未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起,请参考 https://ng.yunzainfo.com/docs/server 解决跨域问题', ev);
171
+ }
172
+ break;
173
+ }
174
+ if (ev instanceof HttpErrorResponse) {
175
+ return throwError(() => ev);
176
+ }
177
+ else if (ev._throw) {
178
+ return throwError(() => ev.body);
179
+ }
180
+ else {
181
+ return of(ev);
182
+ }
183
+ }
184
+ const yunzaiDefaultInterceptor = (req, next) => {
185
+ const config = mergeBisConfig(inject(YunzaiConfigService));
186
+ const { baseUrl } = config;
187
+ let url = req.url;
188
+ if (!req.context.get(IGNORE_BASE_URL) && !url.startsWith('https://') && !url.startsWith('http://')) {
189
+ url = baseUrl + (baseUrl.endsWith('/') && url.startsWith('/') ? url.substring(1) : url);
190
+ }
191
+ if (url.includes('.json') && url.includes('assets')) {
192
+ url = req.url;
193
+ }
194
+ const newReq = req.clone({ url, setHeaders: getAdditionalHeaders(req.headers) });
195
+ const injector = inject(Injector);
196
+ return next(newReq).pipe(mergeMap(ev => {
197
+ if (ev instanceof HttpResponseBase) {
198
+ return handleData(injector, ev, newReq, next);
199
+ }
200
+ return of(ev);
201
+ }), catchError((err) => handleData(injector, err, newReq, next)));
202
+ };
203
+
204
+ function provideYunzaiStartup() {
205
+ return [
206
+ YunzaiStartupService,
207
+ {
208
+ provide: APP_INITIALIZER,
209
+ useFactory: (startupService) => () => startupService.load(),
210
+ deps: [YunzaiStartupService],
211
+ multi: true
212
+ }
213
+ ];
214
+ }
215
+ class YunzaiStartupService {
216
+ constructor() {
217
+ this.config = mergeBisConfig(inject(YunzaiConfigService));
218
+ this.menuService = inject(MenuService);
219
+ this.aclService = inject(ACLService);
220
+ this.titleService = inject(TitleService);
221
+ this.tokenService = inject(YA_SERVICE_TOKEN);
222
+ this.httpClient = inject(HttpClient);
223
+ this.settingService = inject(SettingsService);
224
+ this.i18n = inject(YUNZAI_I18N_TOKEN);
225
+ this.win = inject(WINDOW);
226
+ this.configService = inject(YunzaiConfigService);
227
+ }
228
+ load() {
229
+ let defaultLang = this.settingService.layout.lang || this.i18n.defaultLang;
230
+ const [setTenant] = useLocalStorageTenant();
231
+ const [setUser, getUser] = useLocalStorageUser();
232
+ const [setHeader] = useLocalStorageHeader();
233
+ const [setProject] = useLocalStorageProjectInfo();
234
+ const [setDefaultRoute] = useLocalStorageDefaultRoute();
235
+ const [setCurrent] = useLocalStorageCurrent();
236
+ return this.token().pipe(mergeMap((token) => {
237
+ this.configService.set('auth', {
238
+ token_send_key: 'Authorization',
239
+ token_send_template: `${token.token_type} \${access_token}`,
240
+ token_send_place: 'header'
241
+ });
242
+ this.tokenService.set(token);
243
+ return of(void 0);
244
+ }), mergeMap(() => {
245
+ return combineLatest([
246
+ this.httpClient.get(`/auth/user`),
247
+ this.httpClient.get(`/auth/allheader/v2`),
248
+ this.httpClient.get(`/app-manager/project/info`)
249
+ ]).pipe(map(([user, header, project]) => {
250
+ setUser(user.principal);
251
+ setTenant(user.tenantId);
252
+ setHeader(header.data);
253
+ setProject(project.data);
254
+ return void 0;
255
+ }));
256
+ }), mergeMap(() => {
257
+ return this.i18n.loadLangData(defaultLang).pipe(map((langData) => {
258
+ this.i18n.use(defaultLang, langData);
259
+ return void 0;
260
+ }));
261
+ }), mergeMap(() => {
262
+ const yunzaiUser = getUser();
263
+ const yunzaiMenus = deepCopy(yunzaiUser.menu).filter(m => m.systemCode && m.systemCode === this.config.systemCode);
264
+ const currentMenu = yunzaiMenus.pop();
265
+ if (currentMenu) {
266
+ this.settingService.setApp({ name: currentMenu.text, description: currentMenu.intro });
267
+ this.settingService.setUser({
268
+ name: yunzaiUser.realname,
269
+ avatar: `${this.config.baseUrl}/filecenter/file/${yunzaiUser.avatarId}` || '',
270
+ email: yunzaiUser.email
271
+ });
272
+ this.titleService.default = currentMenu && currentMenu.text ? currentMenu.text : 'default application name';
273
+ this.titleService.setTitle(currentMenu && currentMenu.text ? currentMenu.text : 'no title');
274
+ const abilities = [];
275
+ generateAbility([currentMenu], abilities, '');
276
+ this.aclService.attachRole(yunzaiUser?.roles
277
+ .map((role) => {
278
+ return role.roleValue;
279
+ })
280
+ .filter((a) => !!a) || []);
281
+ this.aclService.attachAbility(abilities);
282
+ this.menuService.add([currentMenu]);
283
+ setCurrent({
284
+ name: currentMenu.text,
285
+ intro: currentMenu.intro || '',
286
+ icon: currentMenu.appIconUrl || './assets/tmp/img/avatar.jpg'
287
+ });
288
+ const attributes = currentMenu.attribute;
289
+ if (attributes) {
290
+ const attr = JSON.parse(attributes);
291
+ if (attr && attr.defaultRoute) {
292
+ setDefaultRoute(attr.defaultRoute);
293
+ }
294
+ else {
295
+ setDefaultRoute('/displayIndex');
296
+ }
297
+ }
298
+ else {
299
+ setDefaultRoute('/displayIndex');
300
+ }
301
+ }
302
+ return of(void 0);
303
+ }));
304
+ }
305
+ token() {
306
+ if (this.config.loginForm) {
307
+ return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.config.loginForm).pipe(map((response) => {
308
+ return response;
309
+ }));
310
+ }
311
+ else {
312
+ const uri = encodeURIComponent(this.win.location.href);
313
+ return this.httpClient
314
+ .get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true&timestamp=${new Date().getTime()}`)
315
+ .pipe(map((response) => {
316
+ switch (response.errcode) {
317
+ case 2000:
318
+ return response.data;
319
+ case 2001:
320
+ this.win.location.href = response.msg;
321
+ throw Error("Cookie Error: Can't find Cas Cookie,So jump to login!");
322
+ default:
323
+ if (response.data) {
324
+ console.error(response.data);
325
+ throw Error(response.data);
326
+ }
327
+ else if (response.msg) {
328
+ console.error(response.msg);
329
+ throw Error(response.msg);
330
+ }
331
+ else {
332
+ console.error('cas unknown error');
333
+ throw Error('Unknown Error: Cas auth exception!');
334
+ }
335
+ }
336
+ }));
337
+ }
338
+ }
339
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiStartupService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
340
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiStartupService }); }
341
+ }
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiStartupService, decorators: [{
343
+ type: Injectable
344
+ }] });
345
+ function mapYzSideToYelonMenu(menus) {
346
+ menus.forEach(menu => {
347
+ if (menu.children && menu.hideChildren) {
348
+ menu.children.forEach(c => (c.hide = true));
349
+ }
350
+ menu.badgeDot = menu.badge_dot || null;
351
+ menu.badgeStatus = menu.badge_status || null;
352
+ menu.shortcutRoot = menu.shortcut_root || null;
353
+ menu.reuse = true;
354
+ if (menu.children) {
355
+ mapYzSideToYelonMenu(menu.children);
356
+ }
357
+ });
358
+ }
359
+ function generateAbility(menus, abilities, prefix) {
360
+ menus.forEach(menu => {
361
+ if (menu.link) {
362
+ prefix += menu.link;
363
+ }
364
+ else {
365
+ prefix += '';
366
+ }
367
+ if (menu.menuAuths) {
368
+ menu.menuAuths.forEach((a) => {
369
+ abilities.push(`${prefix}:${a}`);
370
+ abilities.push(a);
371
+ });
372
+ }
373
+ if (menu.children) {
374
+ generateAbility(menu.children, abilities, prefix);
375
+ }
376
+ });
377
+ }
378
+
379
+ class YunzaiAnalysisAddonGuardService {
380
+ constructor(configService, pathToRegexp, win, tokenService) {
381
+ this.configService = configService;
382
+ this.pathToRegexp = pathToRegexp;
383
+ this.win = win;
384
+ this.tokenService = tokenService;
385
+ this.bis = BUSINESS_DEFAULT_CONFIG;
386
+ this.menus = [];
387
+ this.links = [];
388
+ this.value = {};
389
+ this.bis = mergeBisConfig(this.configService);
390
+ const [, getUser] = useLocalStorageUser();
391
+ const user = getUser();
392
+ this.menus = deepCopy(user.menu || []).filter((m) => m.systemCode && m.systemCode === this.bis.systemCode);
393
+ if (user) {
394
+ this.value = {
395
+ systemCode: this.bis.systemCode,
396
+ userid: user.id,
397
+ realname: user.realname,
398
+ usertype: user.userType,
399
+ usercode: user.userCode,
400
+ username: user.username,
401
+ account: user.username,
402
+ deptid: user.deptId,
403
+ deptname: user.deptName,
404
+ token: this.tokenService.get()?.access_token
405
+ };
406
+ }
407
+ if (this.menus && this.menus.length > 0) {
408
+ this.value['system'] = this.menus[0].text;
409
+ }
410
+ this.getAllLinks(this.menus, this.links);
411
+ }
412
+ process(url) {
413
+ let flag = false;
414
+ this.links.forEach(link => {
415
+ if (link.link === url.split('?')[0]) {
416
+ flag = true;
417
+ this.value['routename'] = link.title;
418
+ this.value['routeurl'] = link.link;
419
+ if (this.win['yunzai']) {
420
+ this.win['yunzai'].setExtra(this.value);
421
+ }
422
+ return;
423
+ }
424
+ const regexp = this.pathToRegexp.stringToRegexp(link, null, null);
425
+ if (regexp.test(url.split('?')[0])) {
426
+ flag = true;
427
+ this.value['routename'] = link.title;
428
+ this.value['routeurl'] = link.link;
429
+ if (this.win['yunzai']) {
430
+ this.win['yunzai'].setExtra(this.value);
431
+ }
432
+ return;
433
+ }
434
+ });
435
+ if (!flag) {
436
+ this.value['routename'] = url;
437
+ this.value['routeurl'] = url;
438
+ if (this.win['yunzai']) {
439
+ this.win['yunzai'].setExtra(this.value);
440
+ }
441
+ }
442
+ return true;
443
+ }
444
+ getAllLinks(menu, links) {
445
+ menu.forEach((sider) => {
446
+ if (sider.link) {
447
+ links.push({ title: sider.text ? sider.text : sider.link, link: sider.link });
448
+ }
449
+ if (sider.children && sider.children.length > 0) {
450
+ this.getAllLinks(sider.children, links);
451
+ }
452
+ });
453
+ }
454
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiAnalysisAddonGuardService, deps: [{ token: i1.YunzaiConfigService }, { token: i1.PathToRegexpService }, { token: WINDOW }, { token: YA_SERVICE_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
455
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiAnalysisAddonGuardService, providedIn: 'root' }); }
456
+ }
457
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiAnalysisAddonGuardService, decorators: [{
458
+ type: Injectable,
459
+ args: [{
460
+ providedIn: 'root'
461
+ }]
462
+ }], ctorParameters: () => [{ type: i1.YunzaiConfigService }, { type: i1.PathToRegexpService }, { type: undefined, decorators: [{
463
+ type: Inject,
464
+ args: [WINDOW]
465
+ }] }, { type: undefined, decorators: [{
466
+ type: Inject,
467
+ args: [YA_SERVICE_TOKEN]
468
+ }] }] });
469
+ const analysisAddonCanActive = (_, state) => inject(YunzaiAnalysisAddonGuardService).process(state.url);
470
+ const analysisAddonCanActiveChild = (_, state) => inject(YunzaiAnalysisAddonGuardService).process(state.url);
471
+
472
+ class ActGuardService {
473
+ constructor(configService, pathToRegexp, router) {
474
+ this.configService = configService;
475
+ this.pathToRegexp = pathToRegexp;
476
+ this.router = router;
477
+ this.bis = BUSINESS_DEFAULT_CONFIG;
478
+ this.menus = [];
479
+ this.links = [];
480
+ log('act: ');
481
+ this.bis = mergeBisConfig(this.configService);
482
+ log('act: config ', this.bis);
483
+ const [, getUser] = useLocalStorageUser();
484
+ const user = getUser();
485
+ log('act: user ', user);
486
+ // @ts-ignore
487
+ this.menus = deepCopy(user.menu || []).filter((m) => m.systemCode && m.systemCode === this.bis.systemCode);
488
+ log('act: menus ', this.menus);
489
+ this.getAllLinks(this.menus, this.links);
490
+ log('act: links ', this.links);
491
+ }
492
+ process(url) {
493
+ log('act: can activate ', url);
494
+ if (this.preHandle(url)) {
495
+ return true;
496
+ }
497
+ log('act: can activate child prehandle success');
498
+ let canactivate = false;
499
+ this.links.forEach((link) => {
500
+ // path = /xxx
501
+ if (link === url.split('?')[0]) {
502
+ canactivate = true;
503
+ log(`act: link value ${link} equals url value ${url}`);
504
+ return;
505
+ }
506
+ // paht = /xxx/:xx
507
+ const regexp = this.pathToRegexp.stringToRegexp(link, null, null);
508
+ log(`act: ${link} test ${url.split('?')[0]}`);
509
+ if (regexp.test(url.split('?')[0])) {
510
+ canactivate = true;
511
+ log(`act: test value ${canactivate}`);
512
+ return;
513
+ }
514
+ });
515
+ if (canactivate) {
516
+ log(`act: test sucess`);
517
+ return true;
518
+ }
519
+ else {
520
+ log(`act: test error`);
521
+ this.router.navigate(['displayIndex']);
522
+ return false;
523
+ }
524
+ }
525
+ preHandle(url) {
526
+ return (url.includes('error') ||
527
+ url.includes('exception') ||
528
+ url.includes('displayIndex') ||
529
+ url === '' ||
530
+ url === null ||
531
+ url === '/' ||
532
+ url.includes('iframePage'));
533
+ }
534
+ getAllLinks(menu, links) {
535
+ menu.forEach((sider) => {
536
+ if (sider.link) {
537
+ links.push(sider.link);
538
+ }
539
+ if (sider.children && sider.children.length > 0) {
540
+ this.getAllLinks(sider.children, links);
541
+ }
542
+ });
543
+ }
544
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: ActGuardService, deps: [{ token: i1.YunzaiConfigService }, { token: i1.PathToRegexpService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
545
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: ActGuardService, providedIn: 'root' }); }
546
+ }
547
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: ActGuardService, decorators: [{
548
+ type: Injectable,
549
+ args: [{ providedIn: 'root' }]
550
+ }], ctorParameters: () => [{ type: i1.YunzaiConfigService }, { type: i1.PathToRegexpService }, { type: i2.Router }] });
551
+ const actGuardCanActive = (_, state) => inject(ActGuardService).process(state.url);
552
+ const actGuardCanActiveChild = (_, state) => inject(ActGuardService).process(state.url);
2
553
 
3
554
  /**
4
555
  * Generated bundle index. Do not edit.
5
556
  */
557
+
558
+ export { ActGuardService, BisModule, CODEMESSAGE, YunzaiAnalysisAddonGuardService, YunzaiStartupService, actGuardCanActive, actGuardCanActiveChild, analysisAddonCanActive, analysisAddonCanActiveChild, checkStatus, generateAbility, getAdditionalHeaders, goTo, mapYzSideToYelonMenu, provideYunzaiBindAuthRefresh, provideYunzaiBis, provideYunzaiStartup, toLogin, tryRefreshToken, yunzaiDefaultInterceptor };
6
559
  //# sourceMappingURL=bis.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bis.mjs","sources":["../../../../packages/bis/public_api.ts","../../../../packages/bis/bis.ts"],"sourcesContent":["export default void 0;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA,iBAAe,KAAK,CAAC;;ACArB;;AAEG"}
1
+ {"version":3,"file":"bis.mjs","sources":["../../../../packages/bis/src/bis.module.ts","../../../../packages/bis/src/provide.ts","../../../../packages/bis/src/helper.ts","../../../../packages/bis/src/refresh-token.ts","../../../../packages/bis/src/yunzai-default.interceptor.ts","../../../../packages/bis/src/startup.service.ts","../../../../packages/bis/src/yunzai-analysis-addon.guard.ts","../../../../packages/bis/src/yunzai-act.guard.ts","../../../../packages/bis/bis.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\n\nimport { YunzaiLayoutModule } from '@yelon/bis/layout';\nimport { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';\n@NgModule({\n imports: [YunzaiLayoutModule, YunzaiWidgetsModule],\n exports: [YunzaiLayoutModule, YunzaiWidgetsModule]\n})\nexport class BisModule {}\n","import { EnvironmentProviders, importProvidersFrom, makeEnvironmentProviders } from '@angular/core';\n\nimport { BisModule } from './bis.module';\n\nexport function provideYunzaiBis(): EnvironmentProviders {\n const provides: EnvironmentProviders[] = [];\n provides.push(importProvidersFrom(BisModule));\n return makeEnvironmentProviders(provides);\n}\n","import { HttpHeaders, HttpResponseBase } from '@angular/common/http';\nimport { inject, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { YUNZAI_I18N_TOKEN } from '@yelon/theme';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\n\nexport const CODEMESSAGE: { [key: number]: string } = {\n 200: '服务器成功返回请求的数据。',\n 201: '新建或修改数据成功。',\n 202: '一个请求已经进入后台排队(异步任务)。',\n 204: '删除数据成功。',\n 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',\n 401: '用户没有权限(令牌、用户名、密码错误)。',\n 403: '用户得到授权,但是访问是被禁止的。',\n 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',\n 406: '请求的格式不可得。',\n 410: '请求的资源被永久删除,且不会再得到的。',\n 422: '当创建一个对象时,发生一个验证错误。',\n 500: '服务器发生错误,请检查服务器。',\n 502: '网关错误。',\n 503: '服务不可用,服务器暂时过载或维护。',\n 504: '网关超时。'\n};\n\nexport function getAdditionalHeaders(headers?: HttpHeaders): { [name: string]: string } {\n const res: { [name: string]: string } = {};\n const lang = inject(YUNZAI_I18N_TOKEN).currentLang;\n if (!headers?.has('Accept-Language') && lang) {\n res['Accept-Language'] = lang;\n }\n\n return res;\n}\n\nexport function checkStatus(injector: Injector, ev: HttpResponseBase): void {\n if ((ev.status >= 200 && ev.status < 300) || ev.status === 401) {\n return;\n }\n const errortext = CODEMESSAGE[ev.status] || ev.statusText;\n injector.get(NzNotificationService).error(`请求错误 ${ev.status}: ${ev.url}`, errortext);\n}\n\nexport interface ReThrowHttpError {\n body: NzSafeAny;\n _throw: true;\n}\n\nexport function goTo(injector: Injector, url: string): void {\n setTimeout(() => injector.get(Router).navigateByUrl(url));\n}\n\nexport function toLogin(injector: Injector): void {\n injector.get(NzNotificationService).error(`未登录或登录已过期,请重新登录。`, ``);\n goTo(injector, injector.get(YA_SERVICE_TOKEN).login_url!);\n}\n","import { HttpClient, HttpHandlerFn, HttpRequest, HttpResponseBase } from '@angular/common/http';\nimport { APP_INITIALIZER, Injector, Provider } from '@angular/core';\nimport { BehaviorSubject, catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\n\nimport { YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { log } from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\nimport { toLogin } from './helper';\n\nlet refreshToking = false;\nlet refreshToken$: BehaviorSubject<NzSafeAny> = new BehaviorSubject<NzSafeAny>(null);\n\nexport const tryRefreshToken = (\n injector: Injector,\n ev: HttpResponseBase,\n req: HttpRequest<NzSafeAny>,\n next: HttpHandlerFn\n): Observable<NzSafeAny> => {\n // 连刷新Token的请求都错了,那就是真错了\n if (['/auth/oauth/getOrCreateToken/webapp'].some(url => req.url.includes(url))) {\n toLogin(injector);\n return throwError(() => ev);\n }\n // 2、如果 `refreshToking` 为 `true` 表示已经在请求刷新 Token 中,后续所有请求转入等待状态,直至结果返回后再重新发起请求\n if (refreshToking) {\n return refreshToken$.pipe(\n filter(v => !!v),\n take(1),\n switchMap(() => next(reAttachToken(injector, req)))\n );\n }\n // 3、尝试调用刷新 Token\n refreshToking = true;\n refreshToken$.next(null);\n\n return refreshTokenRequest(injector).pipe(\n switchMap(res => {\n // 通知后续请求继续执行\n refreshToking = false;\n refreshToken$.next(res);\n // 重新保存新 token\n injector.get(YA_SERVICE_TOKEN).set(res);\n // 重新发起请求\n return next(reAttachToken(injector, req));\n }),\n catchError(err => {\n refreshToking = false;\n toLogin(injector);\n return throwError(() => err);\n })\n );\n};\n\nfunction reAttachToken(injector: Injector, req: HttpRequest<NzSafeAny>): HttpRequest<NzSafeAny> {\n const token = injector.get(YA_SERVICE_TOKEN).get()?.access_token;\n return req.clone({\n setHeaders: {\n Authorization: `Bearer ${token}`\n }\n });\n}\n\nfunction refreshTokenRequest(injector: Injector): Observable<NzSafeAny> {\n const model = injector.get(YA_SERVICE_TOKEN).get();\n const form = new FormData();\n form.set('refresh_token', model?.refresh_token!);\n form.set('grant_type', 'refresh_token');\n form.set('scope', 'webapp');\n return injector.get(HttpClient).post(`/auth/oauth/getOrCreateToken/webapp`, form);\n}\n\nfunction buildAuthRefresh(injector: Injector): void {\n const tokenSrv = injector.get(YA_SERVICE_TOKEN);\n tokenSrv.refresh\n .pipe(\n filter(() => !refreshToking),\n switchMap(res => {\n log(res);\n refreshToking = true;\n return refreshTokenRequest(injector);\n })\n )\n .subscribe({\n next: res => {\n res.expired = +new Date() + 1000 * 60 * 5;\n refreshToking = false;\n tokenSrv.set(res);\n },\n error: () => toLogin(injector)\n });\n}\n\nexport function provideYunzaiBindAuthRefresh(): Provider[] {\n return [\n {\n provide: APP_INITIALIZER,\n useFactory: (injector: Injector) => () => buildAuthRefresh(injector),\n deps: [Injector],\n multi: true\n }\n ];\n}\n","import {\n HttpErrorResponse,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n HttpResponseBase\n} from '@angular/common/http';\nimport { Injector, inject } from '@angular/core';\nimport { Observable, of, throwError, mergeMap, catchError } from 'rxjs';\n\nimport { mergeBisConfig } from '@yelon/bis/config';\nimport { IGNORE_BASE_URL } from '@yelon/theme';\nimport { YUNZAI_CONFIG, YunzaiConfigService } from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\nimport { checkStatus, getAdditionalHeaders, goTo, ReThrowHttpError, toLogin } from './helper';\nimport { tryRefreshToken } from './refresh-token';\n\nfunction handleData(\n injector: Injector,\n ev: HttpResponseBase,\n req: HttpRequest<NzSafeAny>,\n next: HttpHandlerFn\n): Observable<NzSafeAny> {\n checkStatus(injector, ev);\n const config = injector.get(YUNZAI_CONFIG).bis!;\n switch (ev.status) {\n case 200:\n return of(ev);\n case 401:\n if (config.refreshTokenEnabled && config.refreshTokenType === 're-request') {\n const unAuthorizationReq = req.clone();\n unAuthorizationReq.headers.delete('Authorization');\n return tryRefreshToken(injector, ev, unAuthorizationReq, next);\n }\n toLogin(injector);\n break;\n case 403:\n case 404:\n case 500:\n goTo(injector, `/exception/${ev.status}?url=${req.urlWithParams}`);\n break;\n default:\n if (ev instanceof HttpErrorResponse) {\n console.warn(\n '未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起,请参考 https://ng.yunzainfo.com/docs/server 解决跨域问题',\n ev\n );\n }\n break;\n }\n if (ev instanceof HttpErrorResponse) {\n return throwError(() => ev);\n } else if ((ev as unknown as ReThrowHttpError)._throw) {\n return throwError(() => (ev as unknown as ReThrowHttpError).body);\n } else {\n return of(ev);\n }\n}\n\nexport const yunzaiDefaultInterceptor: HttpInterceptorFn = (req, next) => {\n const config = mergeBisConfig(inject(YunzaiConfigService));\n const { baseUrl } = config;\n let url = req.url;\n if (!req.context.get(IGNORE_BASE_URL) && !url.startsWith('https://') && !url.startsWith('http://')) {\n url = baseUrl + (baseUrl!.endsWith('/') && url.startsWith('/') ? url.substring(1) : url);\n }\n if (url.includes('.json') && url.includes('assets')) {\n url = req.url;\n }\n const newReq = req.clone({ url, setHeaders: getAdditionalHeaders(req.headers) });\n const injector = inject(Injector);\n return next(newReq).pipe(\n mergeMap(ev => {\n if (ev instanceof HttpResponseBase) {\n return handleData(injector, ev, newReq, next);\n }\n return of(ev);\n }),\n catchError((err: HttpErrorResponse) => handleData(injector, err, newReq, next))\n );\n};\n","import { HttpClient } from '@angular/common/http';\nimport { APP_INITIALIZER, inject, Injectable, Provider } from '@angular/core';\nimport { combineLatest, map, mergeMap, Observable, of } from 'rxjs';\n\nimport { ACLService } from '@yelon/acl';\nimport { ITokenModel, YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { mergeBisConfig } from '@yelon/bis/config';\nimport {\n Menu,\n MenuService,\n SettingsService,\n TitleService,\n YUNZAI_I18N_TOKEN,\n YunzaiHttpI18NService\n} from '@yelon/theme';\nimport {\n deepCopy,\n useLocalStorageCurrent,\n useLocalStorageDefaultRoute,\n useLocalStorageHeader,\n useLocalStorageProjectInfo,\n useLocalStorageTenant,\n useLocalStorageUser,\n WINDOW,\n YunzaiConfigService,\n YunzaiMenu,\n YunzaiMenuAttribute\n} from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\nexport function provideYunzaiStartup(): Provider[] {\n return [\n YunzaiStartupService,\n {\n provide: APP_INITIALIZER,\n useFactory: (startupService: YunzaiStartupService) => () => startupService.load(),\n deps: [YunzaiStartupService],\n multi: true\n }\n ];\n}\n@Injectable()\nexport class YunzaiStartupService {\n private readonly config = mergeBisConfig(inject(YunzaiConfigService));\n private readonly menuService = inject(MenuService);\n private readonly aclService = inject(ACLService);\n private readonly titleService = inject(TitleService);\n private readonly tokenService = inject(YA_SERVICE_TOKEN);\n private readonly httpClient = inject(HttpClient);\n private readonly settingService = inject(SettingsService);\n private readonly i18n = inject<YunzaiHttpI18NService>(YUNZAI_I18N_TOKEN);\n private readonly win = inject(WINDOW);\n private readonly configService = inject(YunzaiConfigService);\n\n load(): Observable<void> {\n let defaultLang: string = this.settingService.layout.lang || this.i18n.defaultLang;\n const [setTenant] = useLocalStorageTenant();\n const [setUser, getUser] = useLocalStorageUser();\n const [setHeader] = useLocalStorageHeader();\n const [setProject] = useLocalStorageProjectInfo();\n const [setDefaultRoute] = useLocalStorageDefaultRoute();\n const [setCurrent] = useLocalStorageCurrent();\n return this.token().pipe(\n mergeMap((token: ITokenModel) => {\n this.configService.set('auth', {\n token_send_key: 'Authorization',\n token_send_template: `${token.token_type} \\${access_token}`,\n token_send_place: 'header'\n });\n this.tokenService.set(token);\n return of(void 0);\n }),\n mergeMap(() => {\n return combineLatest([\n this.httpClient.get(`/auth/user`),\n this.httpClient.get(`/auth/allheader/v2`),\n this.httpClient.get(`/app-manager/project/info`)\n ]).pipe(\n map(([user, header, project]: NzSafeAny) => {\n setUser(user.principal);\n setTenant(user.tenantId);\n setHeader(header.data);\n setProject(project.data);\n return void 0;\n })\n );\n }),\n mergeMap(() => {\n return this.i18n.loadLangData(defaultLang).pipe(\n map((langData: NzSafeAny) => {\n this.i18n.use(defaultLang, langData);\n return void 0;\n })\n );\n }),\n mergeMap(() => {\n const yunzaiUser = getUser()!;\n const yunzaiMenus: YunzaiMenu[] = deepCopy(yunzaiUser.menu).filter(\n m => m.systemCode && m.systemCode === this.config.systemCode\n );\n const currentMenu = yunzaiMenus.pop();\n if (currentMenu) {\n this.settingService.setApp({ name: currentMenu.text, description: currentMenu.intro });\n this.settingService.setUser({\n name: yunzaiUser.realname,\n avatar: `${this.config.baseUrl}/filecenter/file/${yunzaiUser.avatarId}` || '',\n email: yunzaiUser.email\n });\n this.titleService.default = currentMenu && currentMenu.text ? currentMenu.text : 'default application name';\n this.titleService.setTitle(currentMenu && currentMenu.text ? currentMenu.text : 'no title');\n const abilities: string[] = [];\n generateAbility([currentMenu], abilities, '');\n this.aclService.attachRole(\n yunzaiUser?.roles\n .map((role: NzSafeAny) => {\n return role.roleValue;\n })\n .filter((a: NzSafeAny) => !!a) || []\n );\n this.aclService.attachAbility(abilities);\n this.menuService.add([currentMenu as Menu]);\n setCurrent({\n name: currentMenu.text,\n intro: currentMenu.intro || '',\n icon: currentMenu.appIconUrl || './assets/tmp/img/avatar.jpg'\n });\n const attributes = currentMenu.attribute;\n if (attributes) {\n const attr: YunzaiMenuAttribute = JSON.parse(attributes);\n if (attr && attr.defaultRoute) {\n setDefaultRoute(attr.defaultRoute);\n } else {\n setDefaultRoute('/displayIndex');\n }\n } else {\n setDefaultRoute('/displayIndex');\n }\n }\n return of(void 0);\n })\n );\n }\n\n token(): Observable<ITokenModel> {\n if (this.config.loginForm) {\n return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.config.loginForm).pipe(\n map((response: NzSafeAny) => {\n return response;\n })\n );\n } else {\n const uri = encodeURIComponent(this.win.location.href);\n return this.httpClient\n .get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true&timestamp=${new Date().getTime()}`)\n .pipe(\n map((response: NzSafeAny) => {\n switch (response.errcode) {\n case 2000:\n return response.data;\n case 2001:\n this.win.location.href = response.msg;\n throw Error(\"Cookie Error: Can't find Cas Cookie,So jump to login!\");\n default:\n if (response.data) {\n console.error(response.data);\n throw Error(response.data);\n } else if (response.msg) {\n console.error(response.msg);\n throw Error(response.msg);\n } else {\n console.error('cas unknown error');\n throw Error('Unknown Error: Cas auth exception!');\n }\n }\n })\n );\n }\n }\n}\n\nexport function mapYzSideToYelonMenu(menus: YunzaiMenu[]): void {\n menus.forEach(menu => {\n if (menu.children && menu.hideChildren) {\n menu.children.forEach(c => (c.hide = true));\n }\n menu.badgeDot = menu.badge_dot || null;\n menu.badgeStatus = menu.badge_status || null;\n menu.shortcutRoot = menu.shortcut_root || null;\n menu.reuse = true;\n if (menu.children) {\n mapYzSideToYelonMenu(menu.children);\n }\n });\n}\n\nexport function generateAbility(menus: YunzaiMenu[], abilities: string[], prefix: string): void {\n menus.forEach(menu => {\n if (menu.link) {\n prefix += menu.link;\n } else {\n prefix += '';\n }\n if (menu.menuAuths) {\n menu.menuAuths.forEach((a: string) => {\n abilities.push(`${prefix}:${a}`);\n abilities.push(a);\n });\n }\n\n if (menu.children) {\n generateAbility(menu.children, abilities, prefix);\n }\n });\n}\n","import { Inject, inject, Injectable } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn } from '@angular/router';\n\nimport { ITokenService, YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { BUSINESS_DEFAULT_CONFIG, mergeBisConfig } from '@yelon/bis/config';\nimport { Menu } from '@yelon/theme';\nimport {\n deepCopy,\n PathToRegexpService,\n useLocalStorageUser,\n WINDOW,\n YunzaiBusinessConfig,\n YunzaiConfigService,\n YunzaiUser\n} from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class YunzaiAnalysisAddonGuardService {\n private bis: YunzaiBusinessConfig = BUSINESS_DEFAULT_CONFIG;\n private menus: NzSafeAny[] = [];\n private links: Array<{ title: string; link: string }> = [];\n private value: NzSafeAny = {};\n\n constructor(\n private configService: YunzaiConfigService,\n private pathToRegexp: PathToRegexpService,\n @Inject(WINDOW) private win: NzSafeAny,\n @Inject(YA_SERVICE_TOKEN) private tokenService: ITokenService\n ) {\n this.bis = mergeBisConfig(this.configService);\n const [, getUser] = useLocalStorageUser();\n const user: YunzaiUser = getUser()!;\n this.menus = deepCopy((user.menu as NzSafeAny) || []).filter(\n (m: Menu) => m.systemCode && m.systemCode === this.bis.systemCode\n ) as Menu[];\n if (user) {\n this.value = {\n systemCode: this.bis.systemCode,\n userid: user.id,\n realname: user.realname,\n usertype: user.userType,\n usercode: user.userCode,\n username: user.username,\n account: user.username,\n deptid: user.deptId,\n deptname: user.deptName,\n token: this.tokenService.get()?.access_token\n };\n }\n if (this.menus && this.menus.length > 0) {\n this.value['system'] = (this.menus[0] as Menu).text;\n }\n this.getAllLinks(this.menus, this.links);\n }\n\n process(url: string): boolean {\n let flag = false;\n this.links.forEach(link => {\n if (link.link === url.split('?')[0]) {\n flag = true;\n this.value['routename'] = link.title;\n this.value['routeurl'] = link.link;\n if (this.win['yunzai']) {\n this.win['yunzai'].setExtra(this.value);\n }\n return;\n }\n const regexp: RegExp = this.pathToRegexp.stringToRegexp(link, null, null);\n if (regexp.test(url.split('?')[0])) {\n flag = true;\n this.value['routename'] = link.title;\n this.value['routeurl'] = link.link;\n if (this.win['yunzai']) {\n this.win['yunzai'].setExtra(this.value);\n }\n return;\n }\n });\n if (!flag) {\n this.value['routename'] = url;\n this.value['routeurl'] = url;\n if (this.win['yunzai']) {\n this.win['yunzai'].setExtra(this.value);\n }\n }\n return true;\n }\n\n getAllLinks(menu: Menu[], links: Array<{ title: string; link: string }>): void {\n menu.forEach((sider: Menu) => {\n if (sider.link) {\n links.push({ title: sider.text ? sider.text : sider.link, link: sider.link });\n }\n if (sider.children && sider.children.length > 0) {\n this.getAllLinks(sider.children, links);\n }\n });\n }\n}\n\nexport const analysisAddonCanActive: CanActivateFn = (_, state) =>\n inject(YunzaiAnalysisAddonGuardService).process(state.url);\nexport const analysisAddonCanActiveChild: CanActivateChildFn = (_, state) =>\n inject(YunzaiAnalysisAddonGuardService).process(state.url);\n","import { Injectable, inject } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn, Router } from '@angular/router';\n\nimport { BUSINESS_DEFAULT_CONFIG, mergeBisConfig } from '@yelon/bis/config';\nimport { Menu } from '@yelon/theme';\nimport {\n deepCopy,\n log,\n YunzaiBusinessConfig,\n YunzaiConfigService,\n PathToRegexpService,\n useLocalStorageUser,\n YunzaiUser\n} from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\n@Injectable({ providedIn: 'root' })\nexport class ActGuardService {\n private bis: YunzaiBusinessConfig = BUSINESS_DEFAULT_CONFIG;\n private menus: NzSafeAny[] = [];\n private links: string[] = [];\n\n constructor(\n private configService: YunzaiConfigService,\n private pathToRegexp: PathToRegexpService,\n private router: Router\n ) {\n log('act: ');\n this.bis = mergeBisConfig(this.configService);\n log('act: config ', this.bis);\n const [, getUser] = useLocalStorageUser();\n const user: YunzaiUser = getUser()!;\n log('act: user ', user);\n // @ts-ignore\n this.menus = deepCopy((user.menu as NzSafeAny) || []).filter(\n (m: Menu) => m.systemCode && m.systemCode === this.bis.systemCode\n ) as Menu[];\n log('act: menus ', this.menus);\n this.getAllLinks(this.menus, this.links);\n log('act: links ', this.links);\n }\n\n process(url: string): boolean {\n log('act: can activate ', url);\n if (this.preHandle(url)) {\n return true;\n }\n log('act: can activate child prehandle success');\n let canactivate = false;\n this.links.forEach((link: string) => {\n // path = /xxx\n if (link === url.split('?')[0]) {\n canactivate = true;\n log(`act: link value ${link} equals url value ${url}`);\n return;\n }\n // paht = /xxx/:xx\n const regexp: RegExp = this.pathToRegexp.stringToRegexp(link, null, null);\n log(`act: ${link} test ${url.split('?')[0]}`);\n if (regexp.test(url.split('?')[0])) {\n canactivate = true;\n log(`act: test value ${canactivate}`);\n return;\n }\n });\n if (canactivate) {\n log(`act: test sucess`);\n return true;\n } else {\n log(`act: test error`);\n this.router.navigate(['displayIndex']);\n return false;\n }\n }\n\n preHandle(url: string): boolean {\n return (\n url.includes('error') ||\n url.includes('exception') ||\n url.includes('displayIndex') ||\n url === '' ||\n url === null ||\n url === '/' ||\n url.includes('iframePage')\n );\n }\n\n getAllLinks(menu: Menu[], links: string[]): void {\n menu.forEach((sider: Menu) => {\n if (sider.link) {\n links.push(sider.link);\n }\n if (sider.children && sider.children.length > 0) {\n this.getAllLinks(sider.children, links);\n }\n });\n }\n}\n\nexport const actGuardCanActive: CanActivateFn = (_, state) => inject(ActGuardService).process(state.url);\nexport const actGuardCanActiveChild: CanActivateChildFn = (_, state) => inject(ActGuardService).process(state.url);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}