@abp/ng.setting-management 7.2.2 → 7.3.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +129 -2
  2. package/config/index.d.ts +5 -5
  3. package/config/lib/components/email-setting-group/email-setting-group.component.d.ts +28 -28
  4. package/config/lib/enums/index.d.ts +3 -3
  5. package/config/lib/enums/policy-names.d.ts +3 -3
  6. package/config/lib/enums/route-names.d.ts +3 -3
  7. package/config/lib/enums/setting-tab-names.d.ts +3 -3
  8. package/config/lib/providers/features.token.d.ts +13 -13
  9. package/config/lib/providers/index.d.ts +3 -3
  10. package/config/lib/providers/route.provider.d.ts +16 -16
  11. package/config/lib/providers/setting-tab.provider.d.ts +8 -8
  12. package/config/lib/providers/visible.provider.d.ts +8 -8
  13. package/config/lib/proxy/email-settings.service.d.ts +13 -13
  14. package/config/lib/proxy/index.d.ts +2 -2
  15. package/config/lib/proxy/models.d.ts +28 -28
  16. package/config/lib/services/index.d.ts +1 -1
  17. package/config/lib/services/settings-tabs.service.d.ts +6 -6
  18. package/config/lib/setting-management-config.module.d.ts +12 -12
  19. package/config/public-api.d.ts +6 -6
  20. package/{esm2020 → esm2022}/abp-ng.setting-management.mjs +4 -4
  21. package/{esm2020 → esm2022}/config/abp-ng.setting-management-config.mjs +4 -4
  22. package/esm2022/config/lib/components/email-setting-group/email-setting-group.component.mjs +85 -0
  23. package/{esm2020 → esm2022}/config/lib/enums/index.mjs +3 -3
  24. package/{esm2020 → esm2022}/config/lib/enums/policy-names.mjs +1 -1
  25. package/{esm2020 → esm2022}/config/lib/enums/route-names.mjs +1 -1
  26. package/{esm2020 → esm2022}/config/lib/enums/setting-tab-names.mjs +1 -1
  27. package/{esm2020 → esm2022}/config/lib/providers/features.token.mjs +29 -29
  28. package/{esm2020 → esm2022}/config/lib/providers/index.mjs +3 -3
  29. package/{esm2020 → esm2022}/config/lib/providers/route.provider.mjs +33 -33
  30. package/{esm2020 → esm2022}/config/lib/providers/setting-tab.provider.mjs +23 -23
  31. package/{esm2020 → esm2022}/config/lib/providers/visible.provider.mjs +25 -25
  32. package/esm2022/config/lib/proxy/email-settings.service.mjs +34 -0
  33. package/{esm2020 → esm2022}/config/lib/proxy/index.mjs +2 -2
  34. package/{esm2020 → esm2022}/config/lib/proxy/models.mjs +1 -1
  35. package/{esm2020 → esm2022}/config/lib/services/index.mjs +1 -1
  36. package/esm2022/config/lib/services/settings-tabs.service.mjs +13 -0
  37. package/esm2022/config/lib/setting-management-config.module.mjs +36 -0
  38. package/{esm2020 → esm2022}/config/public-api.mjs +6 -6
  39. package/esm2022/lib/components/setting-management.component.mjs +34 -0
  40. package/{esm2020 → esm2022}/lib/enums/components.mjs +1 -1
  41. package/{esm2020 → esm2022}/lib/enums/index.mjs +2 -2
  42. package/{esm2020 → esm2022}/lib/enums/route-names.mjs +1 -1
  43. package/esm2022/lib/setting-management-routing.module.mjs +40 -0
  44. package/esm2022/lib/setting-management.module.mjs +31 -0
  45. package/{esm2020 → esm2022}/public-api.mjs +3 -3
  46. package/fesm2022/abp-ng.setting-management-config.mjs +254 -0
  47. package/fesm2022/abp-ng.setting-management-config.mjs.map +1 -0
  48. package/{fesm2020 → fesm2022}/abp-ng.setting-management.mjs +78 -78
  49. package/fesm2022/abp-ng.setting-management.mjs.map +1 -0
  50. package/index.d.ts +5 -5
  51. package/lib/components/setting-management.component.d.ts +16 -16
  52. package/lib/enums/components.d.ts +3 -3
  53. package/lib/enums/index.d.ts +2 -2
  54. package/lib/enums/route-names.d.ts +3 -3
  55. package/lib/setting-management-routing.module.d.ts +7 -7
  56. package/lib/setting-management.module.d.ts +14 -14
  57. package/package.json +25 -19
  58. package/public-api.d.ts +3 -3
  59. package/config/src/lib/proxy/README.md +0 -17
  60. package/esm2020/config/lib/components/email-setting-group/email-setting-group.component.mjs +0 -84
  61. package/esm2020/config/lib/proxy/email-settings.service.mjs +0 -33
  62. package/esm2020/config/lib/services/settings-tabs.service.mjs +0 -12
  63. package/esm2020/config/lib/setting-management-config.module.mjs +0 -35
  64. package/esm2020/lib/components/setting-management.component.mjs +0 -33
  65. package/esm2020/lib/setting-management-routing.module.mjs +0 -39
  66. package/esm2020/lib/setting-management.module.mjs +0 -30
  67. package/fesm2015/abp-ng.setting-management-config.mjs +0 -254
  68. package/fesm2015/abp-ng.setting-management-config.mjs.map +0 -1
  69. package/fesm2015/abp-ng.setting-management.mjs +0 -100
  70. package/fesm2015/abp-ng.setting-management.mjs.map +0 -1
  71. package/fesm2020/abp-ng.setting-management-config.mjs +0 -254
  72. package/fesm2020/abp-ng.setting-management-config.mjs.map +0 -1
  73. package/fesm2020/abp-ng.setting-management.mjs.map +0 -1
@@ -9,91 +9,91 @@ import * as i1 from '@abp/ng.setting-management/config';
9
9
  import { Subscription } from 'rxjs';
10
10
  import * as i2 from '@angular/common';
11
11
  import * as i1$1 from '@angular/router';
12
- import { RouterModule } from '@angular/router';
12
+ import { mapToCanActivate, RouterModule } from '@angular/router';
13
13
 
14
- class SettingManagementComponent {
15
- constructor(settingTabsService) {
16
- this.settingTabsService = settingTabsService;
17
- this.subscription = new Subscription();
18
- this.settings = [];
19
- this.trackByFn = (_, item) => item.name;
20
- }
21
- ngOnDestroy() {
22
- this.subscription.unsubscribe();
23
- }
24
- ngOnInit() {
25
- this.subscription.add(this.settingTabsService.visible$.subscribe(settings => {
26
- this.settings = settings;
27
- if (!this.selected)
28
- this.selected = this.settings[0];
29
- }));
30
- }
31
- }
32
- SettingManagementComponentfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementComponent, deps: [{ token: i1.SettingTabsService }], target: i0.ɵɵFactoryTarget.Component });
33
- SettingManagementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: SettingManagementComponent, selector: "abp-setting-management", ngImport: i0, template: "<abp-page [title]=\"'AbpSettingManagement::Settings' | abpLocalization\">\r\n <div id=\"SettingManagementWrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12 col-md-3 mb-2 mb-md-0\">\r\n <ul class=\"nav flex-column nav-pills\" id=\"nav-tab\" role=\"tablist\">\r\n <ng-container *abpFor=\"let setting of settings; trackBy: trackByFn\">\r\n <li\r\n (click)=\"selected = setting\"\r\n class=\"nav-item pointer\"\r\n *abpPermission=\"setting.requiredPolicy\"\r\n >\r\n <a\r\n class=\"nav-link\"\r\n [id]=\"setting.name + '-tab'\"\r\n role=\"tab\"\r\n [class.active]=\"setting.name === selected.name\"\r\n >{{ setting.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"col-12 col-md-9\">\r\n <div *ngIf=\"settings.length\" class=\"tab-content\">\r\n <div class=\"tab-pane fade show active\" [id]=\"selected.name + '-tab'\" role=\"tabpanel\">\r\n <ng-container *ngComponentOutlet=\"selected.component\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ForDirective, selector: "[abpFor]", inputs: ["abpForOf", "abpForOrderBy", "abpForOrderDir", "abpForFilterBy", "abpForFilterVal", "abpForTrackBy", "abpForCompareBy", "abpForEmptyRef"] }, { kind: "directive", type: i3.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "component", type: i4.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }] });
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementComponent, decorators: [{
35
- type: Component,
36
- args: [{ selector: 'abp-setting-management', template: "<abp-page [title]=\"'AbpSettingManagement::Settings' | abpLocalization\">\r\n <div id=\"SettingManagementWrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12 col-md-3 mb-2 mb-md-0\">\r\n <ul class=\"nav flex-column nav-pills\" id=\"nav-tab\" role=\"tablist\">\r\n <ng-container *abpFor=\"let setting of settings; trackBy: trackByFn\">\r\n <li\r\n (click)=\"selected = setting\"\r\n class=\"nav-item pointer\"\r\n *abpPermission=\"setting.requiredPolicy\"\r\n >\r\n <a\r\n class=\"nav-link\"\r\n [id]=\"setting.name + '-tab'\"\r\n role=\"tab\"\r\n [class.active]=\"setting.name === selected.name\"\r\n >{{ setting.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"col-12 col-md-9\">\r\n <div *ngIf=\"settings.length\" class=\"tab-content\">\r\n <div class=\"tab-pane fade show active\" [id]=\"selected.name + '-tab'\" role=\"tabpanel\">\r\n <ng-container *ngComponentOutlet=\"selected.component\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n" }]
14
+ class SettingManagementComponent {
15
+ constructor(settingTabsService) {
16
+ this.settingTabsService = settingTabsService;
17
+ this.subscription = new Subscription();
18
+ this.settings = [];
19
+ this.trackByFn = (_, item) => item.name;
20
+ }
21
+ ngOnDestroy() {
22
+ this.subscription.unsubscribe();
23
+ }
24
+ ngOnInit() {
25
+ this.subscription.add(this.settingTabsService.visible$.subscribe(settings => {
26
+ this.settings = settings;
27
+ if (!this.selected)
28
+ this.selected = this.settings[0];
29
+ }));
30
+ }
31
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementComponent, deps: [{ token: i1.SettingTabsService }], target: i0.ɵɵFactoryTarget.Component }); }
32
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.1", type: SettingManagementComponent, selector: "abp-setting-management", ngImport: i0, template: "<abp-page [title]=\"'AbpSettingManagement::Settings' | abpLocalization\">\r\n <div id=\"SettingManagementWrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12 col-md-3 mb-2 mb-md-0\">\r\n <ul class=\"nav flex-column nav-pills\" id=\"nav-tab\" role=\"tablist\">\r\n <ng-container *abpFor=\"let setting of settings; trackBy: trackByFn\">\r\n <li\r\n (click)=\"selected = setting\"\r\n class=\"nav-item pointer\"\r\n *abpPermission=\"setting.requiredPolicy\"\r\n >\r\n <a\r\n class=\"nav-link\"\r\n [id]=\"setting.name + '-tab'\"\r\n role=\"tab\"\r\n [class.active]=\"setting.name === selected.name\"\r\n >{{ setting.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"col-12 col-md-9\">\r\n <div *ngIf=\"settings.length\" class=\"tab-content\">\r\n <div class=\"tab-pane fade show active\" [id]=\"selected.name + '-tab'\" role=\"tabpanel\">\r\n <ng-container *ngComponentOutlet=\"selected.component\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ForDirective, selector: "[abpFor]", inputs: ["abpForOf", "abpForOrderBy", "abpForOrderDir", "abpForFilterBy", "abpForFilterVal", "abpForTrackBy", "abpForCompareBy", "abpForEmptyRef"] }, { kind: "directive", type: i3.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "component", type: i4.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }] }); }
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementComponent, decorators: [{
35
+ type: Component,
36
+ args: [{ selector: 'abp-setting-management', template: "<abp-page [title]=\"'AbpSettingManagement::Settings' | abpLocalization\">\r\n <div id=\"SettingManagementWrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12 col-md-3 mb-2 mb-md-0\">\r\n <ul class=\"nav flex-column nav-pills\" id=\"nav-tab\" role=\"tablist\">\r\n <ng-container *abpFor=\"let setting of settings; trackBy: trackByFn\">\r\n <li\r\n (click)=\"selected = setting\"\r\n class=\"nav-item pointer\"\r\n *abpPermission=\"setting.requiredPolicy\"\r\n >\r\n <a\r\n class=\"nav-link\"\r\n [id]=\"setting.name + '-tab'\"\r\n role=\"tab\"\r\n [class.active]=\"setting.name === selected.name\"\r\n >{{ setting.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"col-12 col-md-9\">\r\n <div *ngIf=\"settings.length\" class=\"tab-content\">\r\n <div class=\"tab-pane fade show active\" [id]=\"selected.name + '-tab'\" role=\"tabpanel\">\r\n <ng-container *ngComponentOutlet=\"selected.component\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n" }]
37
37
  }], ctorParameters: function () { return [{ type: i1.SettingTabsService }]; } });
38
38
 
39
- const routes = [
40
- {
41
- path: '',
42
- component: RouterOutletComponent,
43
- canActivate: [AuthGuard],
44
- children: [
45
- {
46
- path: '',
47
- component: ReplaceableRouteContainerComponent,
48
- data: {
49
- requiredPolicy: 'AbpAccount.SettingManagement',
50
- replaceableComponent: {
51
- key: "SettingManagement.SettingManagementComponent" /* eSettingManagementComponents.SettingManagement */,
52
- defaultComponent: SettingManagementComponent,
53
- },
54
- },
55
- },
56
- ],
57
- },
58
- ];
59
- class SettingManagementRoutingModule {
60
- }
61
- SettingManagementRoutingModulefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
62
- SettingManagementRoutingModulemod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementRoutingModule, imports: [i1$1.RouterModule], exports: [RouterModule] });
63
- SettingManagementRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] });
64
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementRoutingModule, decorators: [{
65
- type: NgModule,
66
- args: [{
67
- imports: [RouterModule.forChild(routes)],
68
- exports: [RouterModule],
69
- }]
39
+ const routes = [
40
+ {
41
+ path: '',
42
+ component: RouterOutletComponent,
43
+ canActivate: mapToCanActivate([AuthGuard]),
44
+ children: [
45
+ {
46
+ path: '',
47
+ component: ReplaceableRouteContainerComponent,
48
+ data: {
49
+ requiredPolicy: 'AbpAccount.SettingManagement',
50
+ replaceableComponent: {
51
+ key: "SettingManagement.SettingManagementComponent" /* eSettingManagementComponents.SettingManagement */,
52
+ defaultComponent: SettingManagementComponent,
53
+ },
54
+ },
55
+ },
56
+ ],
57
+ },
58
+ ];
59
+ class SettingManagementRoutingModule {
60
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
61
+ static { thismod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementRoutingModule, imports: [i1$1.RouterModule], exports: [RouterModule] }); }
62
+ static { thisinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementRoutingModule, decorators: [{
65
+ type: NgModule,
66
+ args: [{
67
+ imports: [RouterModule.forChild(routes)],
68
+ exports: [RouterModule],
69
+ }]
70
70
  }] });
71
71
 
72
- class SettingManagementModule {
73
- static forChild() {
74
- return {
75
- ngModule: SettingManagementModule,
76
- providers: [],
77
- };
78
- }
79
- static forLazy() {
80
- return new LazyModuleFactory(SettingManagementModule.forChild());
81
- }
82
- }
83
- SettingManagementModulefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
84
- SettingManagementModulemod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementModule, declarations: [SettingManagementComponent], imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule], exports: [SettingManagementComponent] });
85
- SettingManagementModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementModule, imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule] });
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SettingManagementModule, decorators: [{
87
- type: NgModule,
88
- args: [{
89
- declarations: [SettingManagementComponent],
90
- exports: [SettingManagementComponent],
91
- imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule],
92
- }]
72
+ class SettingManagementModule {
73
+ static forChild() {
74
+ return {
75
+ ngModule: SettingManagementModule,
76
+ providers: [],
77
+ };
78
+ }
79
+ static forLazy() {
80
+ return new LazyModuleFactory(SettingManagementModule.forChild());
81
+ }
82
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
83
+ static { thismod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementModule, declarations: [SettingManagementComponent], imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule], exports: [SettingManagementComponent] }); }
84
+ static { thisinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementModule, imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule] }); }
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SettingManagementModule, decorators: [{
87
+ type: NgModule,
88
+ args: [{
89
+ declarations: [SettingManagementComponent],
90
+ exports: [SettingManagementComponent],
91
+ imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule],
92
+ }]
93
93
  }] });
94
94
 
95
- /**
96
- * Generated bundle index. Do not edit.
95
+ /**
96
+ * Generated bundle index. Do not edit.
97
97
  */
98
98
 
99
99
  export { SettingManagementComponent, SettingManagementModule };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abp-ng.setting-management.mjs","sources":["../../../../packages/setting-management/src/lib/components/setting-management.component.ts","../../../../packages/setting-management/src/lib/components/setting-management.component.html","../../../../packages/setting-management/src/lib/setting-management-routing.module.ts","../../../../packages/setting-management/src/lib/setting-management.module.ts","../../../../packages/setting-management/src/abp-ng.setting-management.ts"],"sourcesContent":["import { ABP } from '@abp/ng.core';\r\nimport { SettingTabsService } from '@abp/ng.setting-management/config';\r\nimport { Component, OnDestroy, OnInit, TrackByFunction } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'abp-setting-management',\r\n templateUrl: './setting-management.component.html',\r\n})\r\nexport class SettingManagementComponent implements OnDestroy, OnInit {\r\n private subscription = new Subscription();\r\n settings: ABP.Tab[] = [];\r\n\r\n selected!: ABP.Tab;\r\n\r\n trackByFn: TrackByFunction<ABP.Tab> = (_, item) => item.name;\r\n\r\n constructor(private settingTabsService: SettingTabsService) {}\r\n\r\n ngOnDestroy() {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n ngOnInit() {\r\n this.subscription.add(\r\n this.settingTabsService.visible$.subscribe(settings => {\r\n this.settings = settings;\r\n\r\n if (!this.selected) this.selected = this.settings[0];\r\n }),\r\n );\r\n }\r\n}\r\n","<abp-page [title]=\"'AbpSettingManagement::Settings' | abpLocalization\">\r\n <div id=\"SettingManagementWrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12 col-md-3 mb-2 mb-md-0\">\r\n <ul class=\"nav flex-column nav-pills\" id=\"nav-tab\" role=\"tablist\">\r\n <ng-container *abpFor=\"let setting of settings; trackBy: trackByFn\">\r\n <li\r\n (click)=\"selected = setting\"\r\n class=\"nav-item pointer\"\r\n *abpPermission=\"setting.requiredPolicy\"\r\n >\r\n <a\r\n class=\"nav-link\"\r\n [id]=\"setting.name + '-tab'\"\r\n role=\"tab\"\r\n [class.active]=\"setting.name === selected.name\"\r\n >{{ setting.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"col-12 col-md-9\">\r\n <div *ngIf=\"settings.length\" class=\"tab-content\">\r\n <div class=\"tab-pane fade show active\" [id]=\"selected.name + '-tab'\" role=\"tabpanel\">\r\n <ng-container *ngComponentOutlet=\"selected.component\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes, mapToCanActivate } from '@angular/router';\r\nimport {\r\n AuthGuard,\r\n ReplaceableComponents,\r\n ReplaceableRouteContainerComponent,\r\n RouterOutletComponent,\r\n} from '@abp/ng.core';\r\nimport { SettingManagementComponent } from './components/setting-management.component';\r\nimport { eSettingManagementComponents } from './enums/components';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: RouterOutletComponent,\r\n canActivate: mapToCanActivate([AuthGuard]),\r\n children: [\r\n {\r\n path: '',\r\n component: ReplaceableRouteContainerComponent,\r\n data: {\r\n requiredPolicy: 'AbpAccount.SettingManagement',\r\n replaceableComponent: {\r\n key: eSettingManagementComponents.SettingManagement,\r\n defaultComponent: SettingManagementComponent,\r\n } as ReplaceableComponents.RouteData,\r\n },\r\n },\r\n ],\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class SettingManagementRoutingModule {}\r\n","import { PageModule } from '@abp/ng.components/page';\r\nimport { CoreModule, LazyModuleFactory } from '@abp/ng.core';\r\nimport { ThemeSharedModule } from '@abp/ng.theme.shared';\r\nimport { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core';\r\nimport { SettingManagementComponent } from './components/setting-management.component';\r\nimport { SettingManagementRoutingModule } from './setting-management-routing.module';\r\n\r\n@NgModule({\r\n declarations: [SettingManagementComponent],\r\n exports: [SettingManagementComponent],\r\n imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule, PageModule],\r\n})\r\nexport class SettingManagementModule {\r\n static forChild(): ModuleWithProviders<SettingManagementModule> {\r\n return {\r\n ngModule: SettingManagementModule,\r\n providers: [],\r\n };\r\n }\r\n\r\n static forLazy(): NgModuleFactory<SettingManagementModule> {\r\n return new LazyModuleFactory(SettingManagementModule.forChild());\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@abp/ng.setting-management" />
5
- export * from './public-api';
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@abp/ng.setting-management" />
5
+ export * from './public-api';
@@ -1,16 +1,16 @@
1
- import { ABP } from '@abp/ng.core';
2
- import { SettingTabsService } from '@abp/ng.setting-management/config';
3
- import { OnDestroy, OnInit, TrackByFunction } from '@angular/core';
4
- import * as i0 from "@angular/core";
5
- export declare class SettingManagementComponent implements OnDestroy, OnInit {
6
- private settingTabsService;
7
- private subscription;
8
- settings: ABP.Tab[];
9
- selected: ABP.Tab;
10
- trackByFn: TrackByFunction<ABP.Tab>;
11
- constructor(settingTabsService: SettingTabsService);
12
- ngOnDestroy(): void;
13
- ngOnInit(): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<SettingManagementComponent, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<SettingManagementComponent, "abp-setting-management", never, {}, {}, never, never, false, never>;
16
- }
1
+ import { ABP } from '@abp/ng.core';
2
+ import { SettingTabsService } from '@abp/ng.setting-management/config';
3
+ import { OnDestroy, OnInit, TrackByFunction } from '@angular/core';
4
+ import * as i0 from "@angular/core";
5
+ export declare class SettingManagementComponent implements OnDestroy, OnInit {
6
+ private settingTabsService;
7
+ private subscription;
8
+ settings: ABP.Tab[];
9
+ selected: ABP.Tab;
10
+ trackByFn: TrackByFunction<ABP.Tab>;
11
+ constructor(settingTabsService: SettingTabsService);
12
+ ngOnDestroy(): void;
13
+ ngOnInit(): void;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingManagementComponent, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<SettingManagementComponent, "abp-setting-management", never, {}, {}, never, never, false, never>;
16
+ }
@@ -1,3 +1,3 @@
1
- export declare const enum eSettingManagementComponents {
2
- SettingManagement = "SettingManagement.SettingManagementComponent"
3
- }
1
+ export declare const enum eSettingManagementComponents {
2
+ SettingManagement = "SettingManagement.SettingManagementComponent"
3
+ }
@@ -1,2 +1,2 @@
1
- export * from './components';
2
- export * from './route-names';
1
+ export * from './components';
2
+ export * from './route-names';
@@ -1,3 +1,3 @@
1
- export declare const enum eSettingManagementRouteNames {
2
- Settings = "AbpSettingManagement::Settings"
3
- }
1
+ export declare const enum eSettingManagementRouteNames {
2
+ Settings = "AbpSettingManagement::Settings"
3
+ }
@@ -1,7 +1,7 @@
1
- import * as i0 from "@angular/core";
2
- import * as i1 from "@angular/router";
3
- export declare class SettingManagementRoutingModule {
4
- static ɵfac: i0.ɵɵFactoryDeclaration<SettingManagementRoutingModule, never>;
5
- static ɵmod: i0.ɵɵNgModuleDeclaration<SettingManagementRoutingModule, never, [typeof i1.RouterModule], [typeof i1.RouterModule]>;
6
- static ɵinj: i0.ɵɵInjectorDeclaration<SettingManagementRoutingModule>;
7
- }
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "@angular/router";
3
+ export declare class SettingManagementRoutingModule {
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingManagementRoutingModule, never>;
5
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SettingManagementRoutingModule, never, [typeof i1.RouterModule], [typeof i1.RouterModule]>;
6
+ static ɵinj: i0.ɵɵInjectorDeclaration<SettingManagementRoutingModule>;
7
+ }
@@ -1,14 +1,14 @@
1
- import { ModuleWithProviders, NgModuleFactory } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "./components/setting-management.component";
4
- import * as i2 from "./setting-management-routing.module";
5
- import * as i3 from "@abp/ng.core";
6
- import * as i4 from "@abp/ng.theme.shared";
7
- import * as i5 from "@abp/ng.components/page";
8
- export declare class SettingManagementModule {
9
- static forChild(): ModuleWithProviders<SettingManagementModule>;
10
- static forLazy(): NgModuleFactory<SettingManagementModule>;
11
- static ɵfac: i0.ɵɵFactoryDeclaration<SettingManagementModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<SettingManagementModule, [typeof i1.SettingManagementComponent], [typeof i2.SettingManagementRoutingModule, typeof i3.CoreModule, typeof i4.ThemeSharedModule, typeof i5.PageModule], [typeof i1.SettingManagementComponent]>;
13
- static ɵinj: i0.ɵɵInjectorDeclaration<SettingManagementModule>;
14
- }
1
+ import { ModuleWithProviders, NgModuleFactory } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./components/setting-management.component";
4
+ import * as i2 from "./setting-management-routing.module";
5
+ import * as i3 from "@abp/ng.core";
6
+ import * as i4 from "@abp/ng.theme.shared";
7
+ import * as i5 from "@abp/ng.components/page";
8
+ export declare class SettingManagementModule {
9
+ static forChild(): ModuleWithProviders<SettingManagementModule>;
10
+ static forLazy(): NgModuleFactory<SettingManagementModule>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingManagementModule, never>;
12
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SettingManagementModule, [typeof i1.SettingManagementComponent], [typeof i2.SettingManagementRoutingModule, typeof i3.CoreModule, typeof i4.ThemeSharedModule, typeof i5.PageModule], [typeof i1.SettingManagementComponent]>;
13
+ static ɵinj: i0.ɵɵInjectorDeclaration<SettingManagementModule>;
14
+ }
package/package.json CHANGED
@@ -1,24 +1,34 @@
1
1
  {
2
2
  "name": "@abp/ng.setting-management",
3
- "version": "7.2.2",
3
+ "version": "7.3.0-rc.2",
4
4
  "homepage": "https://abp.io",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/abpframework/abp.git"
8
8
  },
9
9
  "dependencies": {
10
- "@abp/ng.components": "~7.2.2",
11
- "@abp/ng.theme.shared": "~7.2.2",
10
+ "@abp/ng.components": "~7.3.0-rc.2",
11
+ "@abp/ng.theme.shared": "~7.3.0-rc.2",
12
12
  "tslib": "^2.0.0"
13
13
  },
14
14
  "publishConfig": {
15
15
  "access": "public"
16
16
  },
17
- "module": "fesm2015/abp-ng.setting-management.mjs",
18
- "es2020": "fesm2020/abp-ng.setting-management.mjs",
19
- "esm2020": "esm2020/abp-ng.setting-management.mjs",
20
- "fesm2020": "fesm2020/abp-ng.setting-management.mjs",
21
- "fesm2015": "fesm2015/abp-ng.setting-management.mjs",
17
+ "license": "LGPL-3.0",
18
+ "keywords": [
19
+ "aspnetcore",
20
+ "boilerplate",
21
+ "framework",
22
+ "web",
23
+ "best-practices",
24
+ "angular",
25
+ "maui",
26
+ "blazor",
27
+ "mvc",
28
+ "csharp",
29
+ "webapp"
30
+ ],
31
+ "module": "fesm2022/abp-ng.setting-management.mjs",
22
32
  "typings": "index.d.ts",
23
33
  "exports": {
24
34
  "./package.json": {
@@ -26,23 +36,19 @@
26
36
  },
27
37
  ".": {
28
38
  "types": "./index.d.ts",
29
- "esm2020": "./esm2020/abp-ng.setting-management.mjs",
30
- "es2020": "./fesm2020/abp-ng.setting-management.mjs",
31
- "es2015": "./fesm2015/abp-ng.setting-management.mjs",
32
- "node": "./fesm2015/abp-ng.setting-management.mjs",
33
- "default": "./fesm2020/abp-ng.setting-management.mjs"
39
+ "esm2022": "./esm2022/abp-ng.setting-management.mjs",
40
+ "esm": "./esm2022/abp-ng.setting-management.mjs",
41
+ "default": "./fesm2022/abp-ng.setting-management.mjs"
34
42
  },
35
43
  "./config": {
36
44
  "types": "./config/index.d.ts",
37
- "esm2020": "./esm2020/config/abp-ng.setting-management-config.mjs",
38
- "es2020": "./fesm2020/abp-ng.setting-management-config.mjs",
39
- "es2015": "./fesm2015/abp-ng.setting-management-config.mjs",
40
- "node": "./fesm2015/abp-ng.setting-management-config.mjs",
41
- "default": "./fesm2020/abp-ng.setting-management-config.mjs"
45
+ "esm2022": "./esm2022/config/abp-ng.setting-management-config.mjs",
46
+ "esm": "./esm2022/config/abp-ng.setting-management-config.mjs",
47
+ "default": "./fesm2022/abp-ng.setting-management-config.mjs"
42
48
  }
43
49
  },
44
50
  "sideEffects": false,
45
51
  "peerDependencies": {
46
- "@abp/ng.core": "7.2.2"
52
+ "@abp/ng.core": "7.3.0-rc.2"
47
53
  }
48
54
  }
package/public-api.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from './lib/setting-management.module';
2
- export * from './lib/components/setting-management.component';
3
- export * from './lib/enums';
1
+ export * from './lib/setting-management.module';
2
+ export * from './lib/components/setting-management.component';
3
+ export * from './lib/enums';
@@ -1,17 +0,0 @@
1
- # Proxy Generation Output
2
-
3
- This directory includes the output of the latest proxy generation.
4
- The files and folders in it will be overwritten when proxy generation is run again.
5
- Therefore, please do not place your own content in this folder.
6
-
7
- In addition, `generate-proxy.json` works like a lock file.
8
- It includes information used by the proxy generator, so please do not delete or modify it.
9
-
10
- Finally, the name of the files and folders should not be changed for two reasons:
11
- - Proxy generator will keep creating them at those paths and you will have multiple copies of the same content.
12
- - ABP Suite generates files which include imports from this folder.
13
-
14
- > **Important Notice:** If you are building a module and are planning to publish to npm,
15
- > some of the generated proxies are likely to be exported from public-api.ts file. In such a case,
16
- > please make sure you export files directly and not from barrel exports. In other words,
17
- > do not include index.ts exports in your public-api.ts exports.
@@ -1,84 +0,0 @@
1
- import { collapse, ToasterService } from '@abp/ng.theme.shared';
2
- import { Component } from '@angular/core';
3
- import { UntypedFormBuilder, Validators } from '@angular/forms';
4
- import { finalize } from 'rxjs/operators';
5
- import { EmailSettingsService } from '../../proxy/email-settings.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../proxy/email-settings.service";
8
- import * as i2 from "@angular/forms";
9
- import * as i3 from "@abp/ng.theme.shared";
10
- import * as i4 from "@angular/common";
11
- import * as i5 from "@abp/ng.core";
12
- import * as i6 from "@ngx-validate/core";
13
- export class EmailSettingGroupComponent {
14
- constructor(emailSettingsService, fb, toasterService) {
15
- this.emailSettingsService = emailSettingsService;
16
- this.fb = fb;
17
- this.toasterService = toasterService;
18
- this.saving = false;
19
- this.emailingPolicy = "SettingManagement.Emailing" /* SettingManagementPolicyNames.Emailing */;
20
- this.isEmailTestModalOpen = false;
21
- this.modalSize = { size: "lg" };
22
- }
23
- ngOnInit() {
24
- this.getData();
25
- }
26
- getData() {
27
- this.emailSettingsService.get().subscribe(res => {
28
- this.buildForm(res);
29
- });
30
- }
31
- buildForm(emailSettings) {
32
- this.form = this.fb.group({
33
- defaultFromDisplayName: [emailSettings.defaultFromDisplayName, [Validators.required]],
34
- defaultFromAddress: [emailSettings.defaultFromAddress, [Validators.required]],
35
- smtpHost: [emailSettings.smtpHost],
36
- smtpPort: [emailSettings.smtpPort, [Validators.required]],
37
- smtpEnableSsl: [emailSettings.smtpEnableSsl],
38
- smtpUseDefaultCredentials: [emailSettings.smtpUseDefaultCredentials],
39
- smtpDomain: [emailSettings.smtpDomain],
40
- smtpUserName: [emailSettings.smtpUserName],
41
- smtpPassword: [emailSettings.smtpPassword],
42
- });
43
- }
44
- submit() {
45
- if (this.saving || this.form.invalid)
46
- return;
47
- this.saving = true;
48
- this.emailSettingsService
49
- .update(this.form.value)
50
- .pipe(finalize(() => (this.saving = false)))
51
- .subscribe(() => {
52
- this.toasterService.success('AbpSettingManagement::SuccessfullySaved');
53
- this.getData();
54
- });
55
- }
56
- openSendEmailModal() {
57
- this.buildEmailTestForm();
58
- this.isEmailTestModalOpen = true;
59
- }
60
- buildEmailTestForm() {
61
- this.emailTestForm = this.fb.group({
62
- senderEmailAddress: ['', [Validators.required, Validators.email]],
63
- targetEmailAddress: ['', [Validators.required, Validators.email]],
64
- subject: ['', [Validators.required]],
65
- body: [''],
66
- });
67
- }
68
- emailTestFormSubmit() {
69
- if (this.emailTestForm.invalid) {
70
- return;
71
- }
72
- this.emailSettingsService.sendTestEmail(this.emailTestForm.value).subscribe(res => {
73
- this.toasterService.success('AbpSettingManagement::SuccessfullySent');
74
- this.isEmailTestModalOpen = false;
75
- });
76
- }
77
- }
78
- EmailSettingGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: EmailSettingGroupComponent, deps: [{ token: i1.EmailSettingsService }, { token: i2.UntypedFormBuilder }, { token: i3.ToasterService }], target: i0.ɵɵFactoryTarget.Component });
79
- EmailSettingGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: EmailSettingGroupComponent, selector: "abp-email-setting-group", ngImport: i0, template: "<h2>{{ 'AbpSettingManagement::Menu:Emailing' | abpLocalization }}</h2>\r\n\r\n<hr class=\"my-3\" />\r\n\r\n<form *ngIf=\"form\" [formGroup]=\"form\" (ngSubmit)=\"submit()\" [validateOnSubmit]=\"true\">\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{\r\n 'AbpSettingManagement::DefaultFromDisplayName' | abpLocalization\r\n }}<span class=\"ms-1\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"defaultFromDisplayName\" />\r\n </div>\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{\r\n 'AbpSettingManagement::DefaultFromAddress' | abpLocalization\r\n }}<span class=\"ms-1\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"defaultFromAddress\" />\r\n </div>\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpHost' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"smtpHost\" />\r\n </div>\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpPort' | abpLocalization }}<span class=\"ms-1\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" formControlName=\"smtpPort\" />\r\n </div>\r\n\r\n <div class=\"form-check mb-2\">\r\n <input type=\"checkbox\" id=\"smtp-enable-ssl\" class=\"form-check-input\" formControlName=\"smtpEnableSsl\" />\r\n <label class=\"form-check-label\" for=\"smtp-enable-ssl\">{{\r\n 'AbpSettingManagement::SmtpEnableSsl' | abpLocalization\r\n }}</label>\r\n </div>\r\n <div class=\"form-check mb-2\">\r\n <input type=\"checkbox\" id=\"smtp-use-default-credentials\" class=\"form-check-input\"\r\n formControlName=\"smtpUseDefaultCredentials\" />\r\n <label class=\"form-check-label\" for=\"smtp-use-default-credentials\">{{\r\n 'AbpSettingManagement::SmtpUseDefaultCredentials' | abpLocalization\r\n }}</label>\r\n </div>\r\n\r\n <div [@collapse]=\"{\r\n value: form.get('smtpUseDefaultCredentials')?.value ? 'collapsed' : 'expanded',\r\n params: { time: '200ms', easing: 'linear' }\r\n }\">\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpDomain' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"smtpDomain\" />\r\n </div>\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpUserName' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"smtpUserName\" />\r\n </div>\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpPassword' | abpLocalization }}</label>\r\n <input type=\"password\" class=\"form-control\" formControlName=\"smtpPassword\" />\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n {{ 'AbpSettingManagement::Save' | abpLocalization }}\r\n </button>\r\n <button type=\"button\" (click)=\"openSendEmailModal()\" class=\"btn btn-primary mx-2\" *abpPermission=\"emailingPolicy\">\r\n <i class=\"fa f-send\"></i>\r\n {{ 'AbpSettingManagement::SendTestEmail' | abpLocalization }}\r\n </button>\r\n</form>\r\n\r\n<abp-modal [(visible)]=\"isEmailTestModalOpen\" [options]=\"modalSize\">\r\n <ng-template #abpHeader>\r\n <h3>{{\"SendTestEmail\" | abpLocalization}}</h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n <form [formGroup]=\"emailTestForm\" id=\"emailTestForm\" (ngSubmit)=\"emailTestFormSubmit()\">\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SenderEmailAddress' | abpLocalization }}</label>\r\n <input class=\"form-control\" formControlName=\"senderEmailAddress\" />\r\n </div>\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::TargetEmailAddress' | abpLocalization }}</label>\r\n <input class=\"form-control\" formControlName=\"targetEmailAddress\" />\r\n </div>\r\n\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::Subject' | abpLocalization }}</label>\r\n <input class=\"form-control\" formControlName=\"subject\" />\r\n </div>\r\n\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::Body' | abpLocalization }}</label>\r\n <textarea class=\"form-control\" formControlName=\"body\"></textarea>\r\n </div>\r\n </form>\r\n </ng-template>\r\n\r\n\r\n <ng-template #abpFooter>\r\n <abp-button buttonType=\"submit\" iconClass=\"fa fa-send\" formName=\"emailTestForm\"\r\n [disabled]=\"emailTestForm.invalid && emailTestForm.dirty\">\r\n <span>{{ 'AbpTenantManagement::Send' | abpLocalization }}</span>\r\n </abp-button>\r\n\r\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>Close</button>\r\n </ng-template>\r\n</abp-modal>", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i5.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: i6.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i6.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i3.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i3.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i3.ModalCloseDirective, selector: "[abpClose]" }, { kind: "pipe", type: i5.LocalizationPipe, name: "abpLocalization" }], animations: [collapse] });
80
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: EmailSettingGroupComponent, decorators: [{
81
- type: Component,
82
- args: [{ selector: 'abp-email-setting-group', animations: [collapse], template: "<h2>{{ 'AbpSettingManagement::Menu:Emailing' | abpLocalization }}</h2>\r\n\r\n<hr class=\"my-3\" />\r\n\r\n<form *ngIf=\"form\" [formGroup]=\"form\" (ngSubmit)=\"submit()\" [validateOnSubmit]=\"true\">\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{\r\n 'AbpSettingManagement::DefaultFromDisplayName' | abpLocalization\r\n }}<span class=\"ms-1\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"defaultFromDisplayName\" />\r\n </div>\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{\r\n 'AbpSettingManagement::DefaultFromAddress' | abpLocalization\r\n }}<span class=\"ms-1\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"defaultFromAddress\" />\r\n </div>\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpHost' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"smtpHost\" />\r\n </div>\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpPort' | abpLocalization }}<span class=\"ms-1\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" formControlName=\"smtpPort\" />\r\n </div>\r\n\r\n <div class=\"form-check mb-2\">\r\n <input type=\"checkbox\" id=\"smtp-enable-ssl\" class=\"form-check-input\" formControlName=\"smtpEnableSsl\" />\r\n <label class=\"form-check-label\" for=\"smtp-enable-ssl\">{{\r\n 'AbpSettingManagement::SmtpEnableSsl' | abpLocalization\r\n }}</label>\r\n </div>\r\n <div class=\"form-check mb-2\">\r\n <input type=\"checkbox\" id=\"smtp-use-default-credentials\" class=\"form-check-input\"\r\n formControlName=\"smtpUseDefaultCredentials\" />\r\n <label class=\"form-check-label\" for=\"smtp-use-default-credentials\">{{\r\n 'AbpSettingManagement::SmtpUseDefaultCredentials' | abpLocalization\r\n }}</label>\r\n </div>\r\n\r\n <div [@collapse]=\"{\r\n value: form.get('smtpUseDefaultCredentials')?.value ? 'collapsed' : 'expanded',\r\n params: { time: '200ms', easing: 'linear' }\r\n }\">\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpDomain' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"smtpDomain\" />\r\n </div>\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpUserName' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"smtpUserName\" />\r\n </div>\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SmtpPassword' | abpLocalization }}</label>\r\n <input type=\"password\" class=\"form-control\" formControlName=\"smtpPassword\" />\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n {{ 'AbpSettingManagement::Save' | abpLocalization }}\r\n </button>\r\n <button type=\"button\" (click)=\"openSendEmailModal()\" class=\"btn btn-primary mx-2\" *abpPermission=\"emailingPolicy\">\r\n <i class=\"fa f-send\"></i>\r\n {{ 'AbpSettingManagement::SendTestEmail' | abpLocalization }}\r\n </button>\r\n</form>\r\n\r\n<abp-modal [(visible)]=\"isEmailTestModalOpen\" [options]=\"modalSize\">\r\n <ng-template #abpHeader>\r\n <h3>{{\"SendTestEmail\" | abpLocalization}}</h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n <form [formGroup]=\"emailTestForm\" id=\"emailTestForm\" (ngSubmit)=\"emailTestFormSubmit()\">\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::SenderEmailAddress' | abpLocalization }}</label>\r\n <input class=\"form-control\" formControlName=\"senderEmailAddress\" />\r\n </div>\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::TargetEmailAddress' | abpLocalization }}</label>\r\n <input class=\"form-control\" formControlName=\"targetEmailAddress\" />\r\n </div>\r\n\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::Subject' | abpLocalization }}</label>\r\n <input class=\"form-control\" formControlName=\"subject\" />\r\n </div>\r\n\r\n\r\n <div class=\"mb-3 form-group\">\r\n <label class=\"form-label\">{{ 'AbpSettingManagement::Body' | abpLocalization }}</label>\r\n <textarea class=\"form-control\" formControlName=\"body\"></textarea>\r\n </div>\r\n </form>\r\n </ng-template>\r\n\r\n\r\n <ng-template #abpFooter>\r\n <abp-button buttonType=\"submit\" iconClass=\"fa fa-send\" formName=\"emailTestForm\"\r\n [disabled]=\"emailTestForm.invalid && emailTestForm.dirty\">\r\n <span>{{ 'AbpTenantManagement::Send' | abpLocalization }}</span>\r\n </abp-button>\r\n\r\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>Close</button>\r\n </ng-template>\r\n</abp-modal>" }]
83
- }], ctorParameters: function () { return [{ type: i1.EmailSettingsService }, { type: i2.UntypedFormBuilder }, { type: i3.ToasterService }]; } });
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtc2V0dGluZy1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zZXR0aW5nLW1hbmFnZW1lbnQvY29uZmlnL3NyYy9saWIvY29tcG9uZW50cy9lbWFpbC1zZXR0aW5nLWdyb3VwL2VtYWlsLXNldHRpbmctZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc2V0dGluZy1tYW5hZ2VtZW50L2NvbmZpZy9zcmMvbGliL2NvbXBvbmVudHMvZW1haWwtc2V0dGluZy1ncm91cC9lbWFpbC1zZXR0aW5nLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7QUFRMUUsTUFBTSxPQUFPLDBCQUEwQjtJQVFyQyxZQUNVLG9CQUEwQyxFQUMxQyxFQUFzQixFQUN0QixjQUE4QjtRQUY5Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQVJ4QyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsbUJBQWMsNEVBQXlDO1FBQ3ZELHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QixjQUFTLEdBQWtCLEVBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxDQUFBO0lBTXBDLENBQUM7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SSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQzs7dUhBMUVVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLCtEQ2R2QyxzaEtBZ0hZLG1qRkRwR0UsQ0FBQyxRQUFRLENBQUM7MkZBRVgsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5QixjQUV2QixDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nYk1vZGFsT3B0aW9ucyB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgY29sbGFwc2UsIFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTZXR0aW5nTWFuYWdlbWVudFBvbGljeU5hbWVzIH0gZnJvbSAnLi4vLi4vZW51bXMvcG9saWN5LW5hbWVzJztcclxuaW1wb3J0IHsgRW1haWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9wcm94eS9lbWFpbC1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW1haWxTZXR0aW5nc0R0byB9IGZyb20gJy4uLy4uL3Byb3h5L21vZGVscyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FicC1lbWFpbC1zZXR0aW5nLWdyb3VwJyxcclxuICB0ZW1wbGF0ZVVybDogJ2VtYWlsLXNldHRpbmctZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGFuaW1hdGlvbnM6IFtjb2xsYXBzZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFbWFpbFNldHRpbmdHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgZm9ybSE6IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgZW1haWxUZXN0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICBlbWFpbGluZ1BvbGljeSA9IFNldHRpbmdNYW5hZ2VtZW50UG9saWN5TmFtZXMuRW1haWxpbmc7XHJcbiAgaXNFbWFpbFRlc3RNb2RhbE9wZW4gPSBmYWxzZTtcclxuICBtb2RhbFNpemU6TmdiTW9kYWxPcHRpb25zPSB7IHNpemU6XCJsZ1wifSBcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVtYWlsU2V0dGluZ3NTZXJ2aWNlOiBFbWFpbFNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmdldERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YSgpIHtcclxuICAgIHRoaXMuZW1haWxTZXR0aW5nc1NlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMuYnVpbGRGb3JtKHJlcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRGb3JtKGVtYWlsU2V0dGluZ3M6IEVtYWlsU2V0dGluZ3NEdG8pIHtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBkZWZhdWx0RnJvbURpc3BsYXlOYW1lOiBbZW1haWxTZXR0aW5ncy5kZWZhdWx0RnJvbURpc3BsYXlOYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBkZWZhdWx0RnJvbUFkZHJlc3M6IFtlbWFpbFNldHRpbmdzLmRlZmF1bHRGcm9tQWRkcmVzcywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgc210cEhvc3Q6IFtlbWFpbFNldHRpbmdzLnNtdHBIb3N0XSxcclxuICAgICAgc210cFBvcnQ6IFtlbWFpbFNldHRpbmdzLnNtdHBQb3J0LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBzbXRwRW5hYmxlU3NsOiBbZW1haWxTZXR0aW5ncy5zbXRwRW5hYmxlU3NsXSxcclxuICAgICAgc210cFVzZURlZmF1bHRDcmVkZW50aWFsczogW2VtYWlsU2V0dGluZ3Muc210cFVzZURlZmF1bHRDcmVkZW50aWFsc10sXHJcbiAgICAgIHNtdHBEb21haW46IFtlbWFpbFNldHRpbmdzLnNtdHBEb21haW5dLFxyXG4gICAgICBzbXRwVXNlck5hbWU6IFtlbWFpbFNldHRpbmdzLnNtdHBVc2VyTmFtZV0sXHJcbiAgICAgIHNtdHBQYXNzd29yZDogW2VtYWlsU2V0dGluZ3Muc210cFBhc3N3b3JkXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMuc2F2aW5nIHx8IHRoaXMuZm9ybS5pbnZhbGlkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5lbWFpbFNldHRpbmdzU2VydmljZVxyXG4gICAgICAudXBkYXRlKHRoaXMuZm9ybS52YWx1ZSlcclxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuc2F2aW5nID0gZmFsc2UpKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKCdBYnBTZXR0aW5nTWFuYWdlbWVudDo6U3VjY2Vzc2Z1bGx5U2F2ZWQnKTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIG9wZW5TZW5kRW1haWxNb2RhbCgpIHtcclxuICAgIHRoaXMuYnVpbGRFbWFpbFRlc3RGb3JtKCk7XHJcbiAgICB0aGlzLmlzRW1haWxUZXN0TW9kYWxPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGJ1aWxkRW1haWxUZXN0Rm9ybSgpIHtcclxuICAgIHRoaXMuZW1haWxUZXN0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBzZW5kZXJFbWFpbEFkZHJlc3M6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdXSxcclxuICAgICAgdGFyZ2V0RW1haWxBZGRyZXNzOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXV0sXHJcbiAgICAgIHN1YmplY3Q6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgYm9keTogWycnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZW1haWxUZXN0Rm9ybVN1Ym1pdCgpIHtcclxuXHJcbiAgICBpZih0aGlzLmVtYWlsVGVzdEZvcm0uaW52YWxpZCl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgICB0aGlzLmVtYWlsU2V0dGluZ3NTZXJ2aWNlLnNlbmRUZXN0RW1haWwodGhpcy5lbWFpbFRlc3RGb3JtLnZhbHVlKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKCdBYnBTZXR0aW5nTWFuYWdlbWVudDo6U3VjY2Vzc2Z1bGx5U2VudCcpO1xyXG4gICAgICB0aGlzLmlzRW1haWxUZXN0TW9kYWxPcGVuID0gZmFsc2U7XHJcbiAgICB9KVxyXG4gICAgICBcclxuICB9XHJcblxyXG59XHJcbiIsIjxoMj57eyAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6Ok1lbnU6RW1haWxpbmcnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9oMj5cclxuXHJcbjxociBjbGFzcz1cIm15LTNcIiAvPlxyXG5cclxuPGZvcm0gKm5nSWY9XCJmb3JtXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgW3ZhbGlkYXRlT25TdWJtaXRdPVwidHJ1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57e1xyXG4gICAgICAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6OkRlZmF1bHRGcm9tRGlzcGxheU5hbWUnIHwgYWJwTG9jYWxpemF0aW9uXHJcbiAgICAgIH19PHNwYW4gY2xhc3M9XCJtcy0xXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0RnJvbURpc3BsYXlOYW1lXCIgLz5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibWItMyBmb3JtLWdyb3VwXCI+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tcclxuICAgICAgJ0FicFNldHRpbmdNYW5hZ2VtZW50OjpEZWZhdWx0RnJvbUFkZHJlc3MnIHwgYWJwTG9jYWxpemF0aW9uXHJcbiAgICAgIH19PHNwYW4gY2xhc3M9XCJtcy0xXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0RnJvbUFkZHJlc3NcIiAvPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cclxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6OlNtdHBIb3N0JyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNtdHBIb3N0XCIgLz5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibWItMyBmb3JtLWdyb3VwXCI+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicFNldHRpbmdNYW5hZ2VtZW50OjpTbXRwUG9ydCcgfCBhYnBMb2NhbGl6YXRpb24gfX08c3BhbiBjbGFzcz1cIm1zLTFcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic210cFBvcnRcIiAvPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yXCI+XHJcbiAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzbXRwLWVuYWJsZS1zc2xcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJzbXRwRW5hYmxlU3NsXCIgLz5cclxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzbXRwLWVuYWJsZS1zc2xcIj57e1xyXG4gICAgICAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6OlNtdHBFbmFibGVTc2wnIHwgYWJwTG9jYWxpemF0aW9uXHJcbiAgICAgIH19PC9sYWJlbD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yXCI+XHJcbiAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzbXRwLXVzZS1kZWZhdWx0LWNyZWRlbnRpYWxzXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic210cFVzZURlZmF1bHRDcmVkZW50aWFsc1wiIC8+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic210cC11c2UtZGVmYXVsdC1jcmVkZW50aWFsc1wiPnt7XHJcbiAgICAgICdBYnBTZXR0aW5nTWFuYWdlbWVudDo6U210cFVzZURlZmF1bHRDcmVkZW50aWFscycgfCBhYnBMb2NhbGl6YXRpb25cclxuICAgICAgfX08L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IFtAY29sbGFwc2VdPVwie1xyXG4gICAgICB2YWx1ZTogZm9ybS5nZXQoJ3NtdHBVc2VEZWZhdWx0Q3JlZGVudGlhbHMnKT8udmFsdWUgPyAnY29sbGFwc2VkJyA6ICdleHBhbmRlZCcsXHJcbiAgICAgIHBhcmFtczogeyB0aW1lOiAnMjAwbXMnLCBlYXNpbmc6ICdsaW5lYXInIH1cclxuICAgIH1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdBYnBTZXR0aW5nTWFuYWdlbWVudDo6U210cERvbWFpbicgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNtdHBEb21haW5cIiAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicFNldHRpbmdNYW5hZ2VtZW50OjpTbXRwVXNlck5hbWUnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJzbXRwVXNlck5hbWVcIiAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicFNldHRpbmdNYW5hZ2VtZW50OjpTbXRwUGFzc3dvcmQnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic210cFBhc3N3b3JkXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8aHIgLz5cclxuXHJcbiAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5cclxuICAgIHt7ICdBYnBTZXR0aW5nTWFuYWdlbWVudDo6U2F2ZScgfCBhYnBMb2NhbGl6YXRpb24gfX1cclxuICA8L2J1dHRvbj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib3BlblNlbmRFbWFpbE1vZGFsKClcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBteC0yXCIgKmFicFBlcm1pc3Npb249XCJlbWFpbGluZ1BvbGljeVwiPlxyXG4gICAgPGkgY2xhc3M9XCJmYSBmLXNlbmRcIj48L2k+XHJcbiAgICB7eyAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6OlNlbmRUZXN0RW1haWwnIHwgYWJwTG9jYWxpemF0aW9uIH19XHJcbiAgPC9idXR0b24+XHJcbjwvZm9ybT5cclxuXHJcbjxhYnAtbW9kYWwgWyh2aXNpYmxlKV09XCJpc0VtYWlsVGVzdE1vZGFsT3BlblwiIFtvcHRpb25zXT1cIm1vZGFsU2l6ZVwiPlxyXG4gIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxyXG4gICAgPGgzPnt7XCJTZW5kVGVzdEVtYWlsXCIgfCBhYnBMb2NhbGl6YXRpb259fTwvaDM+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJlbWFpbFRlc3RGb3JtXCIgaWQ9XCJlbWFpbFRlc3RGb3JtXCIgKG5nU3VibWl0KT1cImVtYWlsVGVzdEZvcm1TdWJtaXQoKVwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6OlNlbmRlckVtYWlsQWRkcmVzcycgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNlbmRlckVtYWlsQWRkcmVzc1wiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnQWJwU2V0dGluZ01hbmFnZW1lbnQ6OlRhcmdldEVtYWlsQWRkcmVzcycgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRhcmdldEVtYWlsQWRkcmVzc1wiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicFNldHRpbmdNYW5hZ2VtZW50OjpTdWJqZWN0JyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic3ViamVjdFwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicFNldHRpbmdNYW5hZ2VtZW50OjpCb2R5JyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYm9keVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cclxuICAgIDxhYnAtYnV0dG9uIGJ1dHRvblR5cGU9XCJzdWJtaXRcIiBpY29uQ2xhc3M9XCJmYSBmYS1zZW5kXCIgZm9ybU5hbWU9XCJlbWFpbFRlc3RGb3JtXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImVtYWlsVGVzdEZvcm0uaW52YWxpZCAmJiBlbWFpbFRlc3RGb3JtLmRpcnR5XCI+XHJcbiAgICAgIDxzcGFuPnt7ICdBYnBUZW5hbnRNYW5hZ2VtZW50OjpTZW5kJyB8IGFicExvY2FsaXphdGlvbiB9fTwvc3Bhbj5cclxuICAgIDwvYWJwLWJ1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+Q2xvc2U8L2J1dHRvbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2FicC1tb2RhbD4iXX0=