@reskin/core 0.0.22 → 0.1.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 (45) hide show
  1. package/bundles/reskin-core-directives.umd.js +303 -163
  2. package/bundles/reskin-core-directives.umd.js.map +1 -1
  3. package/bundles/reskin-core-guards.umd.js +119 -32
  4. package/bundles/reskin-core-guards.umd.js.map +1 -1
  5. package/bundles/reskin-core-interceptors.umd.js +286 -104
  6. package/bundles/reskin-core-interceptors.umd.js.map +1 -1
  7. package/bundles/reskin-core-utils.umd.js +220 -77
  8. package/bundles/reskin-core-utils.umd.js.map +1 -1
  9. package/directives/auth.directive.d.ts +56 -9
  10. package/directives/load.styles.directive.d.ts +45 -5
  11. package/directives/string.template.outlet.directive.d.ts +68 -11
  12. package/esm2015/directives/auth.directive.js +71 -30
  13. package/esm2015/directives/load.styles.directive.js +84 -15
  14. package/esm2015/directives/string.template.outlet.directive.js +118 -60
  15. package/esm2015/guards/auth.guard.js +117 -30
  16. package/esm2015/interceptors/blob.interceptor.js +67 -28
  17. package/esm2015/interceptors/cache.interceptor.js +46 -14
  18. package/esm2015/interceptors/error.interceptor.js +104 -12
  19. package/esm2015/interceptors/public-api.js +2 -1
  20. package/esm2015/interceptors/token.interceptor.js +66 -53
  21. package/esm2015/interceptors/types.js +5 -0
  22. package/esm2015/utils/array.js +42 -22
  23. package/esm2015/utils/dom.js +29 -11
  24. package/esm2015/utils/form.js +44 -13
  25. package/esm2015/utils/store.js +101 -26
  26. package/fesm2015/reskin-core-directives.js +269 -103
  27. package/fesm2015/reskin-core-directives.js.map +1 -1
  28. package/fesm2015/reskin-core-guards.js +116 -29
  29. package/fesm2015/reskin-core-guards.js.map +1 -1
  30. package/fesm2015/reskin-core-interceptors.js +282 -102
  31. package/fesm2015/reskin-core-interceptors.js.map +1 -1
  32. package/fesm2015/reskin-core-utils.js +212 -68
  33. package/fesm2015/reskin-core-utils.js.map +1 -1
  34. package/guards/auth.guard.d.ts +85 -5
  35. package/interceptors/blob.interceptor.d.ts +30 -3
  36. package/interceptors/cache.interceptor.d.ts +28 -4
  37. package/interceptors/error.interceptor.d.ts +43 -2
  38. package/interceptors/public-api.d.ts +1 -0
  39. package/interceptors/token.interceptor.d.ts +35 -18
  40. package/interceptors/types.d.ts +68 -0
  41. package/package.json +1 -1
  42. package/utils/array.d.ts +8 -1
  43. package/utils/dom.d.ts +32 -5
  44. package/utils/form.d.ts +37 -2
  45. package/utils/store.d.ts +56 -15
@@ -1,63 +1,104 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Directive, Input, TemplateRef, EventEmitter, Output, NgModule } from '@angular/core';
3
- import { map } from 'rxjs/operators';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil, map } from 'rxjs/operators';
4
5
  import * as i1 from '@reskin/core/services';
5
6
 
7
+ /**
8
+ * 权限指令
9
+ * 根据权限标识符控制模板的显示与隐藏
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <!-- 基础用法 -->
14
+ * <div *rkAuth="'user:edit'">有编辑权限才显示</div>
15
+ *
16
+ * <!-- 多个权限(或关系) -->
17
+ * <div *rkAuth="['user:edit', 'user:delete']">有任一权限即显示</div>
18
+ *
19
+ * <!-- 使用 then/else 模板 -->
20
+ * <ng-container *rkAuth="'user:edit'; then hasAuth; else noAuth"></ng-container>
21
+ * <ng-template #hasAuth let-menu>
22
+ * <p>有权限,菜单信息:{{ menu | json }}</p>
23
+ * </ng-template>
24
+ * <ng-template #noAuth>
25
+ * <p>无权限</p>
26
+ * </ng-template>
27
+ * ```
28
+ */
6
29
  class RkAuthDirective {
7
- constructor(menu, viewContainerRef, templateRef) {
8
- this.menu = menu;
30
+ constructor(menuService, viewContainerRef, templateRef) {
31
+ this.menuService = menuService;
9
32
  this.viewContainerRef = viewContainerRef;
10
33
  this.templateRef = templateRef;
11
34
  this.condition = '';
35
+ this.destroy$ = new Subject();
12
36
  this.thenTemplateRef = templateRef;
13
37
  }
14
38
  /**
15
- * 传递多个标识符时,逗号分隔,匹配按"或者"运算
16
- * @param condition
39
+ * 权限标识符
40
+ * 传递多个标识符时,匹配按"或"运算
17
41
  */
18
42
  set rkAuth(condition) {
19
43
  this.condition = condition;
20
44
  this.updateView();
21
45
  }
46
+ /**
47
+ * 有权限时显示的模板
48
+ */
22
49
  set rkAuthThen(templateRef) {
23
50
  this.thenTemplateRef = templateRef;
24
51
  this.updateView();
25
52
  }
53
+ /**
54
+ * 无权限时显示的模板
55
+ */
26
56
  set rkAuthElse(templateRef) {
27
57
  this.elseTemplateRef = templateRef;
28
58
  this.updateView();
29
59
  }
30
60
  ngOnDestroy() {
31
- var _a;
32
- (_a = this.authSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
61
+ this.destroy$.next();
62
+ this.destroy$.complete();
33
63
  }
64
+ /**
65
+ * 更新视图显示
66
+ */
34
67
  updateView() {
35
- var _a;
36
- (_a = this.authSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
37
- this.authSubscription = this.hasAuth(this.condition).subscribe((context) => {
68
+ if (!this.condition) {
38
69
  this.viewContainerRef.clear();
39
- if (context.status) {
40
- if (this.thenTemplateRef) {
41
- this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);
42
- }
43
- }
44
- else {
45
- if (this.elseTemplateRef) {
46
- this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);
47
- }
48
- }
70
+ return;
71
+ }
72
+ this.checkAuth(this.condition)
73
+ .pipe(takeUntil(this.destroy$))
74
+ .subscribe((context) => {
75
+ this.renderView(context);
49
76
  });
50
77
  }
51
- hasAuth(tags) {
52
- const tagList = typeof tags === 'string' ? [tags] : tags;
53
- return this.menu.requestData().pipe(map((json) => {
54
- const menus = json.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));
55
- if (!menus.length)
56
- return { $implicit: [], status: false };
57
- return {
58
- $implicit: typeof tags === 'string' ? menus[0] : menus,
59
- status: !!menus.length,
78
+ /**
79
+ * 渲染视图
80
+ */
81
+ renderView(context) {
82
+ this.viewContainerRef.clear();
83
+ if (context.status && this.thenTemplateRef) {
84
+ this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);
85
+ }
86
+ else if (!context.status && this.elseTemplateRef) {
87
+ this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);
88
+ }
89
+ }
90
+ /**
91
+ * 检查权限
92
+ */
93
+ checkAuth(tags) {
94
+ const tagList = Array.isArray(tags) ? tags : [tags];
95
+ return this.menuService.requestData().pipe(map((response) => {
96
+ const matchedMenus = response.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));
97
+ const context = {
98
+ $implicit: Array.isArray(tags) ? matchedMenus : matchedMenus[0] || null,
99
+ status: matchedMenus.length > 0,
60
100
  };
101
+ return context;
61
102
  }));
62
103
  }
63
104
  }
@@ -76,120 +117,245 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
76
117
  type: Input
77
118
  }] } });
78
119
 
120
+ /**
121
+ * 字符串模板输出上下文
122
+ */
123
+ class RkStringTemplateOutletContext {
124
+ constructor() {
125
+ /** 隐式上下文值 */
126
+ this.$implicit = null;
127
+ }
128
+ }
129
+ /**
130
+ * 字符串模板输出指令
131
+ * 支持动态渲染字符串或 TemplateRef
132
+ *
133
+ * @example
134
+ * ```html
135
+ * <!-- 渲染字符串 -->
136
+ * <ng-container *rkStringTemplateOutlet="'Hello World'">
137
+ * <ng-template>默认模板</ng-template>
138
+ * </ng-container>
139
+ *
140
+ * <!-- 渲染 TemplateRef -->
141
+ * <ng-container *rkStringTemplateOutlet="customTemplate; context: { $implicit: data }">
142
+ * </ng-container>
143
+ * <ng-template #customTemplate let-item>
144
+ * <div>{{ item }}</div>
145
+ * </ng-template>
146
+ *
147
+ * <!-- 动态切换 -->
148
+ * <ng-container *rkStringTemplateOutlet="isTemplate ? templateRef : 'Static Text'">
149
+ * </ng-container>
150
+ * ```
151
+ */
79
152
  class RkStringTemplateOutletDirective {
80
- constructor(viewContainer, templateRef) {
81
- this.viewContainer = viewContainer;
153
+ constructor(viewContainerRef, templateRef) {
154
+ this.viewContainerRef = viewContainerRef;
82
155
  this.templateRef = templateRef;
83
156
  this.embeddedViewRef = null;
84
157
  this.context = new RkStringTemplateOutletContext();
85
- this.rkStringTemplateOutletContext = null;
158
+ /**
159
+ * 输出内容
160
+ * 可以是字符串或 TemplateRef
161
+ */
86
162
  this.rkStringTemplateOutlet = null;
163
+ /**
164
+ * 模板上下文
165
+ * 当 rkStringTemplateOutlet 是 TemplateRef 时使用
166
+ */
167
+ this.rkStringTemplateOutletContext = null;
87
168
  }
169
+ /**
170
+ * 类型守卫
171
+ * 用于 Angular 模板类型检查
172
+ */
88
173
  static rkTemplateContextGuard(_dir, _ctx) {
89
174
  return true;
90
175
  }
91
- recreateView() {
92
- this.viewContainer.clear();
93
- const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
94
- const templateRef = (isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef);
95
- this.embeddedViewRef = this.viewContainer.createEmbeddedView(templateRef, isTemplateRef ? this.rkStringTemplateOutletContext : this.context);
96
- }
97
- updateContext() {
98
- const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
99
- const newCtx = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;
100
- const oldCtx = this.embeddedViewRef.context;
101
- if (newCtx) {
102
- for (const propName of Object.keys(newCtx)) {
103
- oldCtx[propName] = newCtx[propName];
104
- }
105
- }
106
- }
107
176
  ngOnChanges(changes) {
108
- const { rkStringTemplateOutletContext, rkStringTemplateOutlet } = changes;
109
- const shouldRecreateView = () => {
110
- let shouldOutletRecreate = false;
111
- if (rkStringTemplateOutlet) {
112
- if (rkStringTemplateOutlet.firstChange) {
113
- shouldOutletRecreate = true;
114
- }
115
- else {
116
- const isPreviousOutletTemplate = rkStringTemplateOutlet.previousValue instanceof TemplateRef;
117
- const isCurrentOutletTemplate = rkStringTemplateOutlet.currentValue instanceof TemplateRef;
118
- shouldOutletRecreate = isPreviousOutletTemplate || isCurrentOutletTemplate;
119
- }
120
- }
121
- const hasContextShapeChanged = (ctxChange) => {
122
- const prevCtxKeys = Object.keys(ctxChange.previousValue || {});
123
- const currCtxKeys = Object.keys(ctxChange.currentValue || {});
124
- if (prevCtxKeys.length === currCtxKeys.length) {
125
- for (const propName of currCtxKeys) {
126
- if (prevCtxKeys.indexOf(propName) === -1) {
127
- return true;
128
- }
129
- }
130
- return false;
131
- }
132
- else {
133
- return true;
134
- }
135
- };
136
- const shouldContextRecreate = rkStringTemplateOutletContext && hasContextShapeChanged(rkStringTemplateOutletContext);
137
- return shouldContextRecreate || shouldOutletRecreate;
138
- };
177
+ const { rkStringTemplateOutlet, rkStringTemplateOutletContext } = changes;
178
+ // 更新隐式上下文
139
179
  if (rkStringTemplateOutlet) {
140
180
  this.context.$implicit = rkStringTemplateOutlet.currentValue;
141
181
  }
142
- const recreateView = shouldRecreateView();
143
- if (recreateView) {
144
- /** recreate view when context shape or outlet change **/
182
+ // 判断是否需要重建视图
183
+ if (this.shouldRecreateView(rkStringTemplateOutlet, rkStringTemplateOutletContext)) {
145
184
  this.recreateView();
146
185
  }
147
186
  else {
148
- /** update context **/
149
187
  this.updateContext();
150
188
  }
151
189
  }
190
+ /**
191
+ * 判断是否需要重建视图
192
+ */
193
+ shouldRecreateView(outletChange, contextChange) {
194
+ // 首次变更需要创建视图
195
+ if (outletChange === null || outletChange === void 0 ? void 0 : outletChange.firstChange) {
196
+ return true;
197
+ }
198
+ // outlet 在 TemplateRef 和非 TemplateRef 之间切换时需要重建
199
+ if (outletChange && this.isOutletTypeChanged(outletChange)) {
200
+ return true;
201
+ }
202
+ // 上下文结构变化时需要重建
203
+ if (contextChange && this.isContextShapeChanged(contextChange)) {
204
+ return true;
205
+ }
206
+ return false;
207
+ }
208
+ /**
209
+ * 检查 outlet 类型是否变化
210
+ */
211
+ isOutletTypeChanged(change) {
212
+ const isPreviousTemplate = change.previousValue instanceof TemplateRef;
213
+ const isCurrentTemplate = change.currentValue instanceof TemplateRef;
214
+ return isPreviousTemplate !== isCurrentTemplate;
215
+ }
216
+ /**
217
+ * 检查上下文结构是否变化
218
+ */
219
+ isContextShapeChanged(change) {
220
+ const prevKeys = Object.keys(change.previousValue || {});
221
+ const currKeys = Object.keys(change.currentValue || {});
222
+ if (prevKeys.length !== currKeys.length) {
223
+ return true;
224
+ }
225
+ return currKeys.some((key) => !prevKeys.includes(key));
226
+ }
227
+ /**
228
+ * 重建视图
229
+ */
230
+ recreateView() {
231
+ this.viewContainerRef.clear();
232
+ const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
233
+ const templateRef = isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef;
234
+ const context = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;
235
+ this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(templateRef, context || this.context);
236
+ }
237
+ /**
238
+ * 更新视图上下文
239
+ */
240
+ updateContext() {
241
+ if (!this.embeddedViewRef) {
242
+ return;
243
+ }
244
+ const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
245
+ const newContext = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;
246
+ const viewContext = this.embeddedViewRef.context;
247
+ if (newContext) {
248
+ Object.keys(newContext).forEach((key) => {
249
+ viewContext[key] = newContext[key];
250
+ });
251
+ }
252
+ }
152
253
  }
153
254
  RkStringTemplateOutletDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkStringTemplateOutletDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
154
- RkStringTemplateOutletDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: RkStringTemplateOutletDirective, selector: "[rkStringTemplateOutlet]", inputs: { rkStringTemplateOutletContext: "rkStringTemplateOutletContext", rkStringTemplateOutlet: "rkStringTemplateOutlet" }, usesOnChanges: true, ngImport: i0 });
255
+ RkStringTemplateOutletDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: RkStringTemplateOutletDirective, selector: "[rkStringTemplateOutlet]", inputs: { rkStringTemplateOutlet: "rkStringTemplateOutlet", rkStringTemplateOutletContext: "rkStringTemplateOutletContext" }, usesOnChanges: true, ngImport: i0 });
155
256
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkStringTemplateOutletDirective, decorators: [{
156
257
  type: Directive,
157
258
  args: [{
158
259
  selector: '[rkStringTemplateOutlet]',
159
260
  }]
160
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { rkStringTemplateOutletContext: [{
261
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { rkStringTemplateOutlet: [{
161
262
  type: Input
162
- }], rkStringTemplateOutlet: [{
263
+ }], rkStringTemplateOutletContext: [{
163
264
  type: Input
164
- }] } });
165
- class RkStringTemplateOutletContext {
166
- }
265
+ }] } });
167
266
 
267
+ /**
268
+ * 样式按需加载指令
269
+ * 在指令初始化时加载指定的样式文件,销毁时自动卸载
270
+ *
271
+ * @example
272
+ * ```html
273
+ * <!-- 加载单个样式 -->
274
+ * <div [rkLoadStyles]="'assets/styles/theme.css'">内容</div>
275
+ *
276
+ * <!-- 加载多个样式 -->
277
+ * <div [rkLoadStyles]="['assets/styles/theme.css', 'assets/styles/components.css']">内容</div>
278
+ *
279
+ * <!-- 监听加载完成事件 -->
280
+ * <div [rkLoadStyles]="styleUrls" (stylesLoaded)="onLoaded($event)">内容</div>
281
+ * ```
282
+ */
168
283
  class RkLoadStylesDirective {
169
- constructor(styleLoader) {
170
- this.styleLoader = styleLoader;
284
+ constructor(styleLoaderService) {
285
+ this.styleLoaderService = styleLoaderService;
286
+ this.destroy$ = new Subject();
287
+ this.styleUrls = [];
288
+ /**
289
+ * 样式文件路径
290
+ * 可以是单个路径字符串或路径数组
291
+ */
171
292
  this.hrefs = [];
172
- // (可选) 输出加载完成事件,以便父组件可以响应
293
+ /**
294
+ * 样式加载完成事件
295
+ * 返回每个样式文件的加载结果
296
+ */
173
297
  this.stylesLoaded = new EventEmitter();
174
- this.styleUrls = [];
175
298
  }
176
299
  ngOnInit() {
177
- this.styleUrls = Array.isArray(this.hrefs) ? this.hrefs : [this.hrefs];
178
- if (this.styleUrls.length > 0) {
179
- this.subscription = this.styleLoader.load(...this.styleUrls).subscribe((results) => {
180
- this.stylesLoaded.emit(results);
181
- });
182
- }
300
+ this.loadStyles();
183
301
  }
184
302
  ngOnDestroy() {
185
- if (this.subscription) {
186
- this.subscription.unsubscribe();
303
+ this.destroy$.next();
304
+ this.destroy$.complete();
305
+ this.unloadStyles();
306
+ }
307
+ /**
308
+ * 加载样式文件
309
+ */
310
+ loadStyles() {
311
+ this.styleUrls = this.normalizeHrefs(this.hrefs);
312
+ if (this.styleUrls.length === 0) {
313
+ return;
187
314
  }
188
- // 指令销毁时,自动调用 unload,服务内部会处理引用计数
315
+ this.styleLoaderService
316
+ .load(...this.styleUrls)
317
+ .pipe(takeUntil(this.destroy$))
318
+ .subscribe({
319
+ next: (results) => {
320
+ this.stylesLoaded.emit(results);
321
+ this.logLoadResults(results);
322
+ },
323
+ error: (error) => {
324
+ console.error('[RkLoadStyles] 样式加载失败:', error);
325
+ },
326
+ });
327
+ }
328
+ /**
329
+ * 卸载样式文件
330
+ */
331
+ unloadStyles() {
189
332
  if (this.styleUrls.length > 0) {
190
- this.styleLoader.unload(...this.styleUrls);
333
+ this.styleLoaderService.unload(...this.styleUrls);
191
334
  }
192
335
  }
336
+ /**
337
+ * 标准化 hrefs 输入为数组
338
+ */
339
+ normalizeHrefs(hrefs) {
340
+ if (!hrefs) {
341
+ return [];
342
+ }
343
+ return Array.isArray(hrefs) ? hrefs : [hrefs];
344
+ }
345
+ /**
346
+ * 记录加载结果(仅在开发模式)
347
+ */
348
+ logLoadResults(results) {
349
+ // 开发模式下记录加载结果
350
+ results.forEach((result) => {
351
+ if (result.success) {
352
+ console.log(`[RkLoadStyles] 样式加载成功: ${result.href}`);
353
+ }
354
+ else {
355
+ console.error(`[RkLoadStyles] 样式加载失败: ${result.href}`, result.error);
356
+ }
357
+ });
358
+ }
193
359
  }
194
360
  RkLoadStylesDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkLoadStylesDirective, deps: [{ token: i1.RkStyleLoaderService }], target: i0.ɵɵFactoryTarget.Directive });
195
361
  RkLoadStylesDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: RkLoadStylesDirective, selector: "[rkLoadStyles]", inputs: { hrefs: ["rkLoadStyles", "hrefs"] }, outputs: { stylesLoaded: "stylesLoaded" }, ngImport: i0 });
@@ -1 +1 @@
1
- {"version":3,"file":"reskin-core-directives.js","sources":["../../../library/core/directives/auth.directive.ts","../../../library/core/directives/string.template.outlet.directive.ts","../../../library/core/directives/load.styles.directive.ts","../../../library/core/directives/directives.module.ts","../../../library/core/directives/reskin-core-directives.ts"],"sourcesContent":["import { Directive, Input, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { RkMenuService } from '@reskin/core/services';\r\n\r\n@Directive({\r\n selector: '[rkAuth]',\r\n})\r\nexport class RkAuthDirective implements OnDestroy {\r\n /**\r\n * 传递多个标识符时,逗号分隔,匹配按\"或者\"运算\r\n * @param condition\r\n */\r\n @Input()\r\n set rkAuth(condition: string | string[]) {\r\n this.condition = condition;\r\n this.updateView();\r\n }\r\n\r\n @Input()\r\n set rkAuthThen(templateRef: TemplateRef<any>) {\r\n this.thenTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n @Input()\r\n set rkAuthElse(templateRef: TemplateRef<any>) {\r\n this.elseTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n constructor(\r\n private menu: RkMenuService,\r\n private viewContainerRef: ViewContainerRef,\r\n public templateRef: TemplateRef<any>,\r\n ) {\r\n this.thenTemplateRef = templateRef;\r\n }\r\n\r\n private condition: string | string[] = '';\r\n private thenTemplateRef?: TemplateRef<any>;\r\n private elseTemplateRef?: TemplateRef<any>;\r\n private authSubscription?: Subscription;\r\n\r\n ngOnDestroy() {\r\n this.authSubscription?.unsubscribe();\r\n }\r\n\r\n private updateView() {\r\n this.authSubscription?.unsubscribe();\r\n this.authSubscription = this.hasAuth(this.condition).subscribe((context) => {\r\n this.viewContainerRef.clear();\r\n if (context.status) {\r\n if (this.thenTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);\r\n }\r\n } else {\r\n if (this.elseTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private hasAuth(tags: string | string[]) {\r\n const tagList: string[] = typeof tags === 'string' ? [tags] : tags;\r\n return this.menu.requestData().pipe(\r\n map((json) => {\r\n const menus = json.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));\r\n if (!menus.length) return { $implicit: [], status: false };\r\n return {\r\n $implicit: typeof tags === 'string' ? menus[0] : menus,\r\n status: !!menus.length,\r\n };\r\n }),\r\n );\r\n }\r\n}\r\n","import { Directive, EmbeddedViewRef, Input, OnChanges, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[rkStringTemplateOutlet]',\r\n})\r\nexport class RkStringTemplateOutletDirective<_T = unknown> implements OnChanges {\r\n private embeddedViewRef: EmbeddedViewRef<any> | null = null;\r\n private context = new RkStringTemplateOutletContext();\r\n @Input() rkStringTemplateOutletContext: any | null = null;\r\n @Input() rkStringTemplateOutlet: any | TemplateRef<any> = null;\r\n\r\n static rkTemplateContextGuard<T>(_dir: RkStringTemplateOutletDirective<T>, _ctx: any): _ctx is RkStringTemplateOutletContext {\r\n return true;\r\n }\r\n\r\n private recreateView(): void {\r\n this.viewContainer.clear();\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const templateRef = (isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef) as any;\r\n this.embeddedViewRef = this.viewContainer.createEmbeddedView(\r\n templateRef,\r\n isTemplateRef ? this.rkStringTemplateOutletContext : this.context,\r\n );\r\n }\r\n\r\n private updateContext(): void {\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const newCtx = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;\r\n const oldCtx = this.embeddedViewRef!.context as any;\r\n if (newCtx) {\r\n for (const propName of Object.keys(newCtx)) {\r\n oldCtx[propName] = newCtx[propName];\r\n }\r\n }\r\n }\r\n\r\n constructor(\r\n private viewContainer: ViewContainerRef,\r\n private templateRef: TemplateRef<any>,\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { rkStringTemplateOutletContext, rkStringTemplateOutlet } = changes;\r\n const shouldRecreateView = (): boolean => {\r\n let shouldOutletRecreate = false;\r\n if (rkStringTemplateOutlet) {\r\n if (rkStringTemplateOutlet.firstChange) {\r\n shouldOutletRecreate = true;\r\n } else {\r\n const isPreviousOutletTemplate = rkStringTemplateOutlet.previousValue instanceof TemplateRef;\r\n const isCurrentOutletTemplate = rkStringTemplateOutlet.currentValue instanceof TemplateRef;\r\n shouldOutletRecreate = isPreviousOutletTemplate || isCurrentOutletTemplate;\r\n }\r\n }\r\n const hasContextShapeChanged = (ctxChange: SimpleChange): boolean => {\r\n const prevCtxKeys = Object.keys(ctxChange.previousValue || {});\r\n const currCtxKeys = Object.keys(ctxChange.currentValue || {});\r\n if (prevCtxKeys.length === currCtxKeys.length) {\r\n for (const propName of currCtxKeys) {\r\n if (prevCtxKeys.indexOf(propName) === -1) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n const shouldContextRecreate = rkStringTemplateOutletContext && hasContextShapeChanged(rkStringTemplateOutletContext);\r\n return shouldContextRecreate || shouldOutletRecreate;\r\n };\r\n\r\n if (rkStringTemplateOutlet) {\r\n this.context.$implicit = rkStringTemplateOutlet.currentValue;\r\n }\r\n\r\n const recreateView = shouldRecreateView();\r\n if (recreateView) {\r\n /** recreate view when context shape or outlet change **/\r\n this.recreateView();\r\n } else {\r\n /** update context **/\r\n this.updateContext();\r\n }\r\n }\r\n}\r\n\r\nexport class RkStringTemplateOutletContext {\r\n public $implicit: any;\r\n}\r\n","import { Directive, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { ILoadResult, RkStyleLoaderService } from '@reskin/core/services';\r\n\r\n@Directive({\r\n selector: '[rkLoadStyles]',\r\n})\r\nexport class RkLoadStylesDirective implements OnInit, OnDestroy {\r\n @Input('rkLoadStyles') hrefs: string[] | string = [];\r\n\r\n // (可选) 输出加载完成事件,以便父组件可以响应\r\n @Output() stylesLoaded = new EventEmitter<ILoadResult[]>();\r\n\r\n private subscription: Subscription | undefined;\r\n private styleUrls: string[] = [];\r\n\r\n constructor(private styleLoader: RkStyleLoaderService) {}\r\n\r\n ngOnInit(): void {\r\n this.styleUrls = Array.isArray(this.hrefs) ? this.hrefs : [this.hrefs];\r\n if (this.styleUrls.length > 0) {\r\n this.subscription = this.styleLoader.load(...this.styleUrls).subscribe((results) => {\r\n this.stylesLoaded.emit(results);\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n // 指令销毁时,自动调用 unload,服务内部会处理引用计数\r\n if (this.styleUrls.length > 0) {\r\n this.styleLoader.unload(...this.styleUrls);\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RkAuthDirective } from './auth.directive';\r\nimport { RkStringTemplateOutletDirective } from './string.template.outlet.directive';\r\nimport { RkLoadStylesDirective } from './load.styles.directive';\r\n\r\n@NgModule({\r\n declarations: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n exports: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n})\r\nexport class RkDirectivesModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reskin-core-directives.js","sources":["../../../library/core/directives/auth.directive.ts","../../../library/core/directives/string.template.outlet.directive.ts","../../../library/core/directives/load.styles.directive.ts","../../../library/core/directives/directives.module.ts","../../../library/core/directives/reskin-core-directives.ts"],"sourcesContent":["import { Directive, Input, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { map, takeUntil } from 'rxjs/operators';\r\nimport { RkMenuService } from '@reskin/core/services';\r\n\r\n/**\r\n * 权限指令上下文\r\n */\r\nexport interface RkAuthContext<T = any> {\r\n /** 隐式上下文,包含匹配的菜单数据 */\r\n $implicit: T;\r\n /** 权限验证状态 */\r\n status: boolean;\r\n}\r\n\r\n/**\r\n * 权限指令\r\n * 根据权限标识符控制模板的显示与隐藏\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 基础用法 -->\r\n * <div *rkAuth=\"'user:edit'\">有编辑权限才显示</div>\r\n *\r\n * <!-- 多个权限(或关系) -->\r\n * <div *rkAuth=\"['user:edit', 'user:delete']\">有任一权限即显示</div>\r\n *\r\n * <!-- 使用 then/else 模板 -->\r\n * <ng-container *rkAuth=\"'user:edit'; then hasAuth; else noAuth\"></ng-container>\r\n * <ng-template #hasAuth let-menu>\r\n * <p>有权限,菜单信息:{{ menu | json }}</p>\r\n * </ng-template>\r\n * <ng-template #noAuth>\r\n * <p>无权限</p>\r\n * </ng-template>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[rkAuth]',\r\n})\r\nexport class RkAuthDirective implements OnDestroy {\r\n private condition: string | string[] = '';\r\n private thenTemplateRef?: TemplateRef<any>;\r\n private elseTemplateRef?: TemplateRef<any>;\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n /**\r\n * 权限标识符\r\n * 传递多个标识符时,匹配按\"或\"运算\r\n */\r\n @Input()\r\n set rkAuth(condition: string | string[]) {\r\n this.condition = condition;\r\n this.updateView();\r\n }\r\n\r\n /**\r\n * 有权限时显示的模板\r\n */\r\n @Input()\r\n set rkAuthThen(templateRef: TemplateRef<any>) {\r\n this.thenTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n /**\r\n * 无权限时显示的模板\r\n */\r\n @Input()\r\n set rkAuthElse(templateRef: TemplateRef<any>) {\r\n this.elseTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n constructor(\r\n private menuService: RkMenuService,\r\n private viewContainerRef: ViewContainerRef,\r\n public templateRef: TemplateRef<any>,\r\n ) {\r\n this.thenTemplateRef = templateRef;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * 更新视图显示\r\n */\r\n private updateView(): void {\r\n if (!this.condition) {\r\n this.viewContainerRef.clear();\r\n return;\r\n }\r\n\r\n this.checkAuth(this.condition)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((context) => {\r\n this.renderView(context);\r\n });\r\n }\r\n\r\n /**\r\n * 渲染视图\r\n */\r\n private renderView(context: RkAuthContext): void {\r\n this.viewContainerRef.clear();\r\n\r\n if (context.status && this.thenTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);\r\n } else if (!context.status && this.elseTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);\r\n }\r\n }\r\n\r\n /**\r\n * 检查权限\r\n */\r\n private checkAuth(tags: string | string[]) {\r\n const tagList: string[] = Array.isArray(tags) ? tags : [tags];\r\n\r\n return this.menuService.requestData().pipe(\r\n map((response) => {\r\n const matchedMenus = response.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));\r\n\r\n const context: RkAuthContext = {\r\n $implicit: Array.isArray(tags) ? matchedMenus : matchedMenus[0] || null,\r\n status: matchedMenus.length > 0,\r\n };\r\n\r\n return context;\r\n }),\r\n );\r\n }\r\n}\r\n","import { Directive, EmbeddedViewRef, Input, OnChanges, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\n/**\r\n * 字符串模板输出上下文\r\n */\r\nexport class RkStringTemplateOutletContext<T = any> {\r\n /** 隐式上下文值 */\r\n public $implicit: T | null = null;\r\n}\r\n\r\n/**\r\n * 字符串模板输出指令\r\n * 支持动态渲染字符串或 TemplateRef\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 渲染字符串 -->\r\n * <ng-container *rkStringTemplateOutlet=\"'Hello World'\">\r\n * <ng-template>默认模板</ng-template>\r\n * </ng-container>\r\n *\r\n * <!-- 渲染 TemplateRef -->\r\n * <ng-container *rkStringTemplateOutlet=\"customTemplate; context: { $implicit: data }\">\r\n * </ng-container>\r\n * <ng-template #customTemplate let-item>\r\n * <div>{{ item }}</div>\r\n * </ng-template>\r\n *\r\n * <!-- 动态切换 -->\r\n * <ng-container *rkStringTemplateOutlet=\"isTemplate ? templateRef : 'Static Text'\">\r\n * </ng-container>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[rkStringTemplateOutlet]',\r\n})\r\nexport class RkStringTemplateOutletDirective<T = unknown> implements OnChanges {\r\n private embeddedViewRef: EmbeddedViewRef<RkStringTemplateOutletContext<T>> | null = null;\r\n private context = new RkStringTemplateOutletContext<T>();\r\n\r\n /**\r\n * 输出内容\r\n * 可以是字符串或 TemplateRef\r\n */\r\n @Input() rkStringTemplateOutlet: T | TemplateRef<RkStringTemplateOutletContext<T>> | null = null;\r\n\r\n /**\r\n * 模板上下文\r\n * 当 rkStringTemplateOutlet 是 TemplateRef 时使用\r\n */\r\n @Input() rkStringTemplateOutletContext: RkStringTemplateOutletContext<T> | null = null;\r\n\r\n /**\r\n * 类型守卫\r\n * 用于 Angular 模板类型检查\r\n */\r\n static rkTemplateContextGuard<T>(\r\n _dir: RkStringTemplateOutletDirective<T>,\r\n _ctx: any,\r\n ): _ctx is RkStringTemplateOutletContext<T> {\r\n return true;\r\n }\r\n\r\n constructor(\r\n private viewContainerRef: ViewContainerRef,\r\n private templateRef: TemplateRef<RkStringTemplateOutletContext<T>>,\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { rkStringTemplateOutlet, rkStringTemplateOutletContext } = changes;\r\n\r\n // 更新隐式上下文\r\n if (rkStringTemplateOutlet) {\r\n this.context.$implicit = rkStringTemplateOutlet.currentValue;\r\n }\r\n\r\n // 判断是否需要重建视图\r\n if (this.shouldRecreateView(rkStringTemplateOutlet, rkStringTemplateOutletContext)) {\r\n this.recreateView();\r\n } else {\r\n this.updateContext();\r\n }\r\n }\r\n\r\n /**\r\n * 判断是否需要重建视图\r\n */\r\n private shouldRecreateView(outletChange?: SimpleChange, contextChange?: SimpleChange): boolean {\r\n // 首次变更需要创建视图\r\n if (outletChange?.firstChange) {\r\n return true;\r\n }\r\n\r\n // outlet 在 TemplateRef 和非 TemplateRef 之间切换时需要重建\r\n if (outletChange && this.isOutletTypeChanged(outletChange)) {\r\n return true;\r\n }\r\n\r\n // 上下文结构变化时需要重建\r\n if (contextChange && this.isContextShapeChanged(contextChange)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 检查 outlet 类型是否变化\r\n */\r\n private isOutletTypeChanged(change: SimpleChange): boolean {\r\n const isPreviousTemplate = change.previousValue instanceof TemplateRef;\r\n const isCurrentTemplate = change.currentValue instanceof TemplateRef;\r\n return isPreviousTemplate !== isCurrentTemplate;\r\n }\r\n\r\n /**\r\n * 检查上下文结构是否变化\r\n */\r\n private isContextShapeChanged(change: SimpleChange): boolean {\r\n const prevKeys = Object.keys(change.previousValue || {});\r\n const currKeys = Object.keys(change.currentValue || {});\r\n\r\n if (prevKeys.length !== currKeys.length) {\r\n return true;\r\n }\r\n\r\n return currKeys.some((key) => !prevKeys.includes(key));\r\n }\r\n\r\n /**\r\n * 重建视图\r\n */\r\n private recreateView(): void {\r\n this.viewContainerRef.clear();\r\n\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const templateRef = isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef;\r\n const context = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;\r\n\r\n this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(\r\n templateRef as TemplateRef<RkStringTemplateOutletContext<T>>,\r\n context || this.context,\r\n );\r\n }\r\n\r\n /**\r\n * 更新视图上下文\r\n */\r\n private updateContext(): void {\r\n if (!this.embeddedViewRef) {\r\n return;\r\n }\r\n\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const newContext = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;\r\n const viewContext = this.embeddedViewRef.context;\r\n\r\n if (newContext) {\r\n Object.keys(newContext).forEach((key) => {\r\n (viewContext as any)[key] = (newContext as any)[key];\r\n });\r\n }\r\n }\r\n}\r\n","import { Directive, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { ILoadResult, RkStyleLoaderService } from '@reskin/core/services';\r\n\r\n/**\r\n * 样式按需加载指令\r\n * 在指令初始化时加载指定的样式文件,销毁时自动卸载\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 加载单个样式 -->\r\n * <div [rkLoadStyles]=\"'assets/styles/theme.css'\">内容</div>\r\n *\r\n * <!-- 加载多个样式 -->\r\n * <div [rkLoadStyles]=\"['assets/styles/theme.css', 'assets/styles/components.css']\">内容</div>\r\n *\r\n * <!-- 监听加载完成事件 -->\r\n * <div [rkLoadStyles]=\"styleUrls\" (stylesLoaded)=\"onLoaded($event)\">内容</div>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[rkLoadStyles]',\r\n})\r\nexport class RkLoadStylesDirective implements OnInit, OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private styleUrls: string[] = [];\r\n\r\n /**\r\n * 样式文件路径\r\n * 可以是单个路径字符串或路径数组\r\n */\r\n @Input('rkLoadStyles') hrefs: string | string[] = [];\r\n\r\n /**\r\n * 样式加载完成事件\r\n * 返回每个样式文件的加载结果\r\n */\r\n @Output() stylesLoaded = new EventEmitter<ILoadResult[]>();\r\n\r\n constructor(private styleLoaderService: RkStyleLoaderService) {}\r\n\r\n ngOnInit(): void {\r\n this.loadStyles();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.unloadStyles();\r\n }\r\n\r\n /**\r\n * 加载样式文件\r\n */\r\n private loadStyles(): void {\r\n this.styleUrls = this.normalizeHrefs(this.hrefs);\r\n\r\n if (this.styleUrls.length === 0) {\r\n return;\r\n }\r\n\r\n this.styleLoaderService\r\n .load(...this.styleUrls)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (results) => {\r\n this.stylesLoaded.emit(results);\r\n this.logLoadResults(results);\r\n },\r\n error: (error) => {\r\n console.error('[RkLoadStyles] 样式加载失败:', error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * 卸载样式文件\r\n */\r\n private unloadStyles(): void {\r\n if (this.styleUrls.length > 0) {\r\n this.styleLoaderService.unload(...this.styleUrls);\r\n }\r\n }\r\n\r\n /**\r\n * 标准化 hrefs 输入为数组\r\n */\r\n private normalizeHrefs(hrefs: string | string[]): string[] {\r\n if (!hrefs) {\r\n return [];\r\n }\r\n return Array.isArray(hrefs) ? hrefs : [hrefs];\r\n }\r\n\r\n /**\r\n * 记录加载结果(仅在开发模式)\r\n */\r\n private logLoadResults(results: ILoadResult[]): void {\r\n // 开发模式下记录加载结果\r\n results.forEach((result) => {\r\n if (result.success) {\r\n console.log(`[RkLoadStyles] 样式加载成功: ${result.href}`);\r\n } else {\r\n console.error(`[RkLoadStyles] 样式加载失败: ${result.href}`, result.error);\r\n }\r\n });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RkAuthDirective } from './auth.directive';\r\nimport { RkStringTemplateOutletDirective } from './string.template.outlet.directive';\r\nimport { RkLoadStylesDirective } from './load.styles.directive';\r\n\r\n@NgModule({\r\n declarations: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n exports: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n})\r\nexport class RkDirectivesModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}