@abp/ng.theme.basic 5.0.1 → 5.1.1

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 (68) hide show
  1. package/{esm2015/abp-ng.theme.basic.js → esm2020/abp-ng.theme.basic.mjs} +0 -0
  2. package/esm2020/lib/components/account-layout/account-layout.component.mjs +32 -0
  3. package/esm2020/lib/components/account-layout/auth-wrapper/auth-wrapper.component.mjs +19 -0
  4. package/esm2020/lib/components/account-layout/tenant-box/tenant-box.component.mjs +20 -0
  5. package/esm2020/lib/components/application-layout/application-layout.component.mjs +31 -0
  6. package/{esm2015/lib/components/empty-layout/empty-layout.component.js → esm2020/lib/components/empty-layout/empty-layout.component.mjs} +5 -5
  7. package/{esm2015/lib/components/index.js → esm2020/lib/components/index.mjs} +2 -2
  8. package/{esm2015/lib/components/logo/logo.component.js → esm2020/lib/components/logo/logo.component.mjs} +5 -5
  9. package/esm2020/lib/components/nav-items/current-user.component.mjs +39 -0
  10. package/esm2020/lib/components/nav-items/languages.component.mjs +107 -0
  11. package/esm2020/lib/components/nav-items/nav-items.component.mjs +19 -0
  12. package/esm2020/lib/components/page-alert-container/page-alert-container.component.mjs +18 -0
  13. package/esm2020/lib/components/routes/routes.component.mjs +37 -0
  14. package/esm2020/lib/components/validation-error/validation-error.component.mjs +44 -0
  15. package/{esm2015/lib/constants/styles.js → esm2020/lib/constants/styles.mjs} +0 -0
  16. package/{esm2015/lib/enums/components.js → esm2020/lib/enums/components.mjs} +0 -0
  17. package/{esm2015/lib/enums/index.js → esm2020/lib/enums/index.mjs} +2 -1
  18. package/esm2020/lib/enums/user-menu-items.mjs +2 -0
  19. package/{esm2015/lib/handlers/index.js → esm2020/lib/handlers/index.mjs} +0 -0
  20. package/{esm2015/lib/handlers/lazy-style.handler.js → esm2020/lib/handlers/lazy-style.handler.mjs} +4 -4
  21. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  22. package/{esm2015/lib/models/layout.js → esm2020/lib/models/layout.mjs} +0 -0
  23. package/{esm2015/lib/providers/index.js → esm2020/lib/providers/index.mjs} +2 -1
  24. package/{esm2015/lib/providers/nav-item.provider.js → esm2020/lib/providers/nav-item.provider.mjs} +0 -0
  25. package/{esm2015/lib/providers/styles.provider.js → esm2020/lib/providers/styles.provider.mjs} +0 -0
  26. package/esm2020/lib/providers/user-menu.provider.mjs +41 -0
  27. package/{esm2015/lib/services/layout.service.js → esm2020/lib/services/layout.service.mjs} +4 -4
  28. package/esm2020/lib/theme-basic.module.mjs +128 -0
  29. package/{esm2015/lib/tokens/index.js → esm2020/lib/tokens/index.mjs} +0 -0
  30. package/{esm2015/lib/tokens/lazy-styles.token.js → esm2020/lib/tokens/lazy-styles.token.mjs} +0 -0
  31. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  32. package/{esm2015/testing/abp-ng.theme.basic-testing.js → esm2020/testing/abp-ng.theme.basic-testing.mjs} +0 -0
  33. package/{esm2015/testing/lib/theme-basic-testing.module.js → esm2020/testing/lib/theme-basic-testing.module.mjs} +5 -5
  34. package/{esm2015/testing/public-api.js → esm2020/testing/public-api.mjs} +0 -0
  35. package/fesm2015/{abp-ng.theme.basic-testing.js → abp-ng.theme.basic-testing.mjs} +5 -5
  36. package/fesm2015/abp-ng.theme.basic-testing.mjs.map +1 -0
  37. package/fesm2015/abp-ng.theme.basic.mjs +833 -0
  38. package/fesm2015/abp-ng.theme.basic.mjs.map +1 -0
  39. package/fesm2020/abp-ng.theme.basic-testing.mjs +45 -0
  40. package/fesm2020/abp-ng.theme.basic-testing.mjs.map +1 -0
  41. package/fesm2020/abp-ng.theme.basic.mjs +835 -0
  42. package/fesm2020/abp-ng.theme.basic.mjs.map +1 -0
  43. package/lib/components/index.d.ts +1 -1
  44. package/lib/components/nav-items/current-user.component.d.ts +6 -2
  45. package/lib/enums/index.d.ts +1 -0
  46. package/lib/enums/user-menu-items.d.ts +4 -0
  47. package/lib/providers/index.d.ts +1 -0
  48. package/lib/providers/user-menu.provider.d.ts +8 -0
  49. package/package.json +30 -9
  50. package/testing/package.json +5 -5
  51. package/bundles/abp-ng.theme.basic-testing.umd.js +0 -73
  52. package/bundles/abp-ng.theme.basic-testing.umd.js.map +0 -1
  53. package/bundles/abp-ng.theme.basic.umd.js +0 -989
  54. package/bundles/abp-ng.theme.basic.umd.js.map +0 -1
  55. package/esm2015/lib/components/account-layout/account-layout.component.js +0 -36
  56. package/esm2015/lib/components/account-layout/auth-wrapper/auth-wrapper.component.js +0 -23
  57. package/esm2015/lib/components/account-layout/tenant-box/tenant-box.component.js +0 -24
  58. package/esm2015/lib/components/application-layout/application-layout.component.js +0 -36
  59. package/esm2015/lib/components/nav-items/current-user.component.js +0 -38
  60. package/esm2015/lib/components/nav-items/languages.component.js +0 -107
  61. package/esm2015/lib/components/nav-items/nav-items.component.js +0 -22
  62. package/esm2015/lib/components/page-alert-container/page-alert-container.component.js +0 -22
  63. package/esm2015/lib/components/routes/routes.component.js +0 -40
  64. package/esm2015/lib/components/validation-error/validation-error.component.js +0 -40
  65. package/esm2015/lib/theme-basic.module.js +0 -127
  66. package/fesm2015/abp-ng.theme.basic-testing.js.map +0 -1
  67. package/fesm2015/abp-ng.theme.basic.js +0 -821
  68. package/fesm2015/abp-ng.theme.basic.js.map +0 -1
@@ -0,0 +1,835 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, Component, Input, ViewChildren, ViewEncapsulation, Inject, ChangeDetectionStrategy, InjectionToken, APP_INITIALIZER, Injector, NgModule } from '@angular/core';
3
+ import * as i1 from '@abp/ng.core';
4
+ import { SubscriptionService, NAVIGATE_TO_MANAGE_PROFILE, LazyLoadService, LOADING_STRATEGY, DomInsertionService, ReplaceableComponentsService, CONTENT_STRATEGY, AuthService, CoreModule, noop } from '@abp/ng.core';
5
+ import { fromEvent } from 'rxjs';
6
+ import { debounceTime, map } from 'rxjs/operators';
7
+ import * as i2 from '@angular/router';
8
+ import * as i2$1 from '@angular/common';
9
+ import * as i4 from '@ng-bootstrap/ng-bootstrap';
10
+ import { NgbCollapseModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
11
+ import * as i1$1 from '@abp/ng.theme.shared';
12
+ import { slideFromBottom, collapseWithMargin, DocumentDirHandlerService, NavItemsService, UserMenuService, ThemeSharedModule } from '@abp/ng.theme.shared';
13
+ import * as i1$2 from '@abp/ng.account.core';
14
+ import { TenantBoxService, AuthWrapperService } from '@abp/ng.account.core';
15
+ import * as i4$1 from '@angular/forms';
16
+ import { ValidationErrorComponent as ValidationErrorComponent$1, NgxValidateCoreModule, VALIDATION_ERROR_TEMPLATE, VALIDATION_TARGET_SELECTOR, VALIDATION_INVALID_CLASSES } from '@ngx-validate/core';
17
+
18
+ class LayoutService {
19
+ constructor(subscription, cdRef) {
20
+ this.subscription = subscription;
21
+ this.cdRef = cdRef;
22
+ this.isCollapsed = true;
23
+ this.logoComponentKey = "Theme.LogoComponent" /* Logo */;
24
+ this.routesComponentKey = "Theme.RoutesComponent" /* Routes */;
25
+ this.navItemsComponentKey = "Theme.NavItemsComponent" /* NavItems */;
26
+ }
27
+ checkWindowWidth() {
28
+ const isSmallScreen = window.innerWidth < 992;
29
+ if (isSmallScreen && this.smallScreen === false) {
30
+ this.isCollapsed = false;
31
+ setTimeout(() => {
32
+ this.isCollapsed = true;
33
+ }, 100);
34
+ }
35
+ this.smallScreen = isSmallScreen;
36
+ this.cdRef.detectChanges();
37
+ }
38
+ subscribeWindowSize() {
39
+ this.checkWindowWidth();
40
+ const resize$ = fromEvent(window, 'resize').pipe(debounceTime(150));
41
+ this.subscription.addOne(resize$, () => this.checkWindowWidth());
42
+ }
43
+ }
44
+ LayoutService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LayoutService, deps: [{ token: i1.SubscriptionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Injectable });
45
+ LayoutService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LayoutService });
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LayoutService, decorators: [{
47
+ type: Injectable
48
+ }], ctorParameters: function () { return [{ type: i1.SubscriptionService }, { type: i0.ChangeDetectorRef }]; } });
49
+
50
+ class LogoComponent {
51
+ constructor(environment) {
52
+ this.environment = environment;
53
+ }
54
+ get appInfo() {
55
+ return this.environment.getEnvironment().application;
56
+ }
57
+ }
58
+ LogoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LogoComponent, deps: [{ token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
59
+ LogoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: LogoComponent, selector: "abp-logo", ngImport: i0, template: `
60
+ <a class="navbar-brand" routerLink="/">
61
+ <img
62
+ *ngIf="appInfo.logoUrl; else appName"
63
+ [src]="appInfo.logoUrl"
64
+ [alt]="appInfo.name"
65
+ width="100%"
66
+ height="auto"
67
+ />
68
+ </a>
69
+
70
+ <ng-template #appName>
71
+ {{ appInfo.name }}
72
+ </ng-template>
73
+ `, isInline: true, directives: [{ type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LogoComponent, decorators: [{
75
+ type: Component,
76
+ args: [{
77
+ selector: 'abp-logo',
78
+ template: `
79
+ <a class="navbar-brand" routerLink="/">
80
+ <img
81
+ *ngIf="appInfo.logoUrl; else appName"
82
+ [src]="appInfo.logoUrl"
83
+ [alt]="appInfo.name"
84
+ width="100%"
85
+ height="auto"
86
+ />
87
+ </a>
88
+
89
+ <ng-template #appName>
90
+ {{ appInfo.name }}
91
+ </ng-template>
92
+ `,
93
+ }]
94
+ }], ctorParameters: function () { return [{ type: i1.EnvironmentService }]; } });
95
+
96
+ class RoutesComponent {
97
+ constructor(routesService, renderer) {
98
+ this.routesService = routesService;
99
+ this.renderer = renderer;
100
+ this.rootDropdownExpand = {};
101
+ this.trackByFn = (_, item) => item.name;
102
+ }
103
+ isDropdown(node) {
104
+ return !node?.isLeaf || this.routesService.hasChildren(node.name);
105
+ }
106
+ closeDropdown() {
107
+ this.childrenContainers.forEach(({ nativeElement }) => {
108
+ this.renderer.addClass(nativeElement, 'd-none');
109
+ setTimeout(() => this.renderer.removeClass(nativeElement, 'd-none'), 0);
110
+ });
111
+ }
112
+ }
113
+ RoutesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: RoutesComponent, deps: [{ token: i1.RoutesService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
114
+ RoutesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: RoutesComponent, selector: "abp-routes", inputs: { smallScreen: "smallScreen" }, viewQueries: [{ propertyName: "childrenContainers", predicate: ["childrenContainer"], descendants: true }], ngImport: i0, template: "<ul class=\"navbar-nav\">\r\n <ng-container\r\n *ngFor=\"let route of routesService.visible$ | async; trackBy: trackByFn\"\r\n [ngTemplateOutlet]=\"isDropdown(route) ? dropdownLink : defaultLink\"\r\n [ngTemplateOutletContext]=\"{ $implicit: route }\"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultLink let-route>\r\n <li class=\"nav-item\" *abpPermission=\"route.requiredPolicy\">\r\n <a class=\"nav-link\" [routerLink]=\"[route.path]\"\r\n ><i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-template>\r\n\r\n <ng-template #dropdownLink let-route>\r\n <ng-container *ngIf=\"route.children?.length\">\r\n <li\r\n class=\"nav-item dropdown\"\r\n display=\"static\"\r\n *abpPermission=\"route.requiredPolicy\"\r\n (click)=\"\r\n rootDropdownExpand[route.name]\r\n ? (rootDropdownExpand[route.name] = false)\r\n : (rootDropdownExpand[route.name] = true)\r\n \"\r\n >\r\n <a\r\n class=\"nav-link dropdown-toggle\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n href=\"javascript:void(0)\"\r\n >\r\n <i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}\r\n </a>\r\n <div\r\n #routeContainer\r\n class=\"dropdown-menu border-0 shadow-sm\"\r\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n [class.d-block]=\"smallScreen && rootDropdownExpand[route.name]\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"forTemplate; context: { $implicit: route }\"\r\n ></ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #forTemplate let-route>\r\n <ng-container *ngFor=\"let child of route.children\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"child.children?.length ? dropdownChild : defaultChild\"\r\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\r\n ></ng-template>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #defaultChild let-child>\r\n <ng-container *ngIf=\"child.path\">\r\n <div class=\"dropdown-submenu\" *abpPermission=\"child.requiredPolicy\">\r\n <a class=\"dropdown-item\" [routerLink]=\"[child.path]\" (click)=\"closeDropdown()\">\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}</a\r\n >\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #dropdownChild let-child>\r\n <div\r\n class=\"dropdown-submenu\"\r\n ngbDropdown\r\n #dropdownSubmenu=\"ngbDropdown\"\r\n placement=\"right-top\"\r\n [autoClose]=\"true\"\r\n *abpPermission=\"child.requiredPolicy\"\r\n >\r\n <div ngbDropdownToggle [class.dropdown-toggle]=\"false\">\r\n <a\r\n abpEllipsis=\"210px\"\r\n [abpEllipsisEnabled]=\"!smallScreen\"\r\n role=\"button\"\r\n class=\"btn d-block text-start dropdown-toggle\"\r\n >\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}\r\n </a>\r\n </div>\r\n <div\r\n #childrenContainer\r\n class=\"dropdown-menu dropdown-menu-start border-0 shadow-sm\"\r\n [class.d-block]=\"smallScreen && dropdownSubmenu.isOpen()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"forTemplate; context: { $implicit: child }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ul>\r\n", directives: [{ type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i1$1.EllipsisDirective, selector: "[abpEllipsis]", inputs: ["abpEllipsis", "title", "abpEllipsisEnabled"] }], pipes: { "async": i2$1.AsyncPipe, "abpLocalization": i1.LocalizationPipe } });
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: RoutesComponent, decorators: [{
116
+ type: Component,
117
+ args: [{ selector: 'abp-routes', template: "<ul class=\"navbar-nav\">\r\n <ng-container\r\n *ngFor=\"let route of routesService.visible$ | async; trackBy: trackByFn\"\r\n [ngTemplateOutlet]=\"isDropdown(route) ? dropdownLink : defaultLink\"\r\n [ngTemplateOutletContext]=\"{ $implicit: route }\"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultLink let-route>\r\n <li class=\"nav-item\" *abpPermission=\"route.requiredPolicy\">\r\n <a class=\"nav-link\" [routerLink]=\"[route.path]\"\r\n ><i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-template>\r\n\r\n <ng-template #dropdownLink let-route>\r\n <ng-container *ngIf=\"route.children?.length\">\r\n <li\r\n class=\"nav-item dropdown\"\r\n display=\"static\"\r\n *abpPermission=\"route.requiredPolicy\"\r\n (click)=\"\r\n rootDropdownExpand[route.name]\r\n ? (rootDropdownExpand[route.name] = false)\r\n : (rootDropdownExpand[route.name] = true)\r\n \"\r\n >\r\n <a\r\n class=\"nav-link dropdown-toggle\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n href=\"javascript:void(0)\"\r\n >\r\n <i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}\r\n </a>\r\n <div\r\n #routeContainer\r\n class=\"dropdown-menu border-0 shadow-sm\"\r\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n [class.d-block]=\"smallScreen && rootDropdownExpand[route.name]\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"forTemplate; context: { $implicit: route }\"\r\n ></ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #forTemplate let-route>\r\n <ng-container *ngFor=\"let child of route.children\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"child.children?.length ? dropdownChild : defaultChild\"\r\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\r\n ></ng-template>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #defaultChild let-child>\r\n <ng-container *ngIf=\"child.path\">\r\n <div class=\"dropdown-submenu\" *abpPermission=\"child.requiredPolicy\">\r\n <a class=\"dropdown-item\" [routerLink]=\"[child.path]\" (click)=\"closeDropdown()\">\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}</a\r\n >\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #dropdownChild let-child>\r\n <div\r\n class=\"dropdown-submenu\"\r\n ngbDropdown\r\n #dropdownSubmenu=\"ngbDropdown\"\r\n placement=\"right-top\"\r\n [autoClose]=\"true\"\r\n *abpPermission=\"child.requiredPolicy\"\r\n >\r\n <div ngbDropdownToggle [class.dropdown-toggle]=\"false\">\r\n <a\r\n abpEllipsis=\"210px\"\r\n [abpEllipsisEnabled]=\"!smallScreen\"\r\n role=\"button\"\r\n class=\"btn d-block text-start dropdown-toggle\"\r\n >\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}\r\n </a>\r\n </div>\r\n <div\r\n #childrenContainer\r\n class=\"dropdown-menu dropdown-menu-start border-0 shadow-sm\"\r\n [class.d-block]=\"smallScreen && dropdownSubmenu.isOpen()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"forTemplate; context: { $implicit: child }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ul>\r\n" }]
118
+ }], ctorParameters: function () { return [{ type: i1.RoutesService }, { type: i0.Renderer2 }]; }, propDecorators: { smallScreen: [{
119
+ type: Input
120
+ }], childrenContainers: [{
121
+ type: ViewChildren,
122
+ args: ['childrenContainer']
123
+ }] } });
124
+
125
+ class NavItemsComponent {
126
+ constructor(navItems) {
127
+ this.navItems = navItems;
128
+ this.trackByFn = (_, element) => element.id;
129
+ }
130
+ }
131
+ NavItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NavItemsComponent, deps: [{ token: i1$1.NavItemsService }], target: i0.ɵɵFactoryTarget.Component });
132
+ NavItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: NavItemsComponent, selector: "abp-nav-items", ngImport: i0, template: "<ul class=\"navbar-nav\">\r\n <ng-container *ngFor=\"let item of navItems.items$ | async; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"item.visible && item.visible()\">\r\n <li class=\"nav-item d-flex align-items-center\" *abpPermission=\"item.requiredPolicy\">\r\n <ng-container\r\n *ngIf=\"item.component; else htmlTemplate\"\r\n [ngComponentOutlet]=\"item.component\"\r\n [ngComponentOutletInjector]=\"item | toInjector\"\r\n ></ng-container>\r\n\r\n <ng-template #htmlTemplate>\r\n <div [innerHTML]=\"item.html\" (click)=\"item.action ? item.action() : null\"></div>\r\n </ng-template>\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n</ul>\r\n", directives: [{ type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission"] }, { type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModuleFactory"] }], pipes: { "async": i2$1.AsyncPipe, "toInjector": i1.ToInjectorPipe } });
133
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NavItemsComponent, decorators: [{
134
+ type: Component,
135
+ args: [{ selector: 'abp-nav-items', template: "<ul class=\"navbar-nav\">\r\n <ng-container *ngFor=\"let item of navItems.items$ | async; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"item.visible && item.visible()\">\r\n <li class=\"nav-item d-flex align-items-center\" *abpPermission=\"item.requiredPolicy\">\r\n <ng-container\r\n *ngIf=\"item.component; else htmlTemplate\"\r\n [ngComponentOutlet]=\"item.component\"\r\n [ngComponentOutletInjector]=\"item | toInjector\"\r\n ></ng-container>\r\n\r\n <ng-template #htmlTemplate>\r\n <div [innerHTML]=\"item.html\" (click)=\"item.action ? item.action() : null\"></div>\r\n </ng-template>\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n</ul>\r\n" }]
136
+ }], ctorParameters: function () { return [{ type: i1$1.NavItemsService }]; } });
137
+
138
+ class PageAlertContainerComponent {
139
+ constructor(service) {
140
+ this.service = service;
141
+ }
142
+ }
143
+ PageAlertContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: PageAlertContainerComponent, deps: [{ token: i1$1.PageAlertService }], target: i0.ɵɵFactoryTarget.Component });
144
+ PageAlertContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: PageAlertContainerComponent, selector: "abp-page-alert-container", ngImport: i0, template: "<ng-container *ngFor=\"let alert of service.alerts$ | async; let i = index\">\r\n <div\r\n class=\"alert alert-{{ alert.type }} fade show\"\r\n [ngClass]=\"{ 'alert-dismissible fade show': alert.dismissible }\"\r\n role=\"alert\"\r\n >\r\n <h4 class=\"alert-heading\" *ngIf=\"alert.title\">\r\n {{ alert.title | abpLocalization: alert.titleLocalizationParams }}\r\n </h4>\r\n {{ alert.message | abpLocalization: alert.messageLocalizationParams }}\r\n <button\r\n *ngIf=\"alert.dismissible\"\r\n type=\"button\"\r\n class=\"btn-close\"\r\n data-dismiss=\"alert\"\r\n aria-label=\"Close\"\r\n (click)=\"service.remove(i)\"\r\n ></button>\r\n </div>\r\n</ng-container>\r\n", directives: [{ type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i2$1.AsyncPipe, "abpLocalization": i1.LocalizationPipe }, encapsulation: i0.ViewEncapsulation.None });
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: PageAlertContainerComponent, decorators: [{
146
+ type: Component,
147
+ args: [{ selector: 'abp-page-alert-container', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngFor=\"let alert of service.alerts$ | async; let i = index\">\r\n <div\r\n class=\"alert alert-{{ alert.type }} fade show\"\r\n [ngClass]=\"{ 'alert-dismissible fade show': alert.dismissible }\"\r\n role=\"alert\"\r\n >\r\n <h4 class=\"alert-heading\" *ngIf=\"alert.title\">\r\n {{ alert.title | abpLocalization: alert.titleLocalizationParams }}\r\n </h4>\r\n {{ alert.message | abpLocalization: alert.messageLocalizationParams }}\r\n <button\r\n *ngIf=\"alert.dismissible\"\r\n type=\"button\"\r\n class=\"btn-close\"\r\n data-dismiss=\"alert\"\r\n aria-label=\"Close\"\r\n (click)=\"service.remove(i)\"\r\n ></button>\r\n </div>\r\n</ng-container>\r\n" }]
148
+ }], ctorParameters: function () { return [{ type: i1$1.PageAlertService }]; } });
149
+
150
+ class TenantBoxComponent {
151
+ constructor(service) {
152
+ this.service = service;
153
+ }
154
+ }
155
+ TenantBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TenantBoxComponent, deps: [{ token: i1$2.TenantBoxService }], target: i0.ɵɵFactoryTarget.Component });
156
+ TenantBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: TenantBoxComponent, selector: "abp-tenant-box", providers: [TenantBoxService], ngImport: i0, template: "<ng-container *ngIf=\"(service.currentTenant$ | async) || { name: '' } as currentTenant\">\r\n <div class=\"card shadow-sm rounded mb-3\">\r\n <div class=\"card-body px-5\">\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <span style=\"font-size: 0.8em\" class=\"text-uppercase text-muted\">{{\r\n 'AbpUiMultiTenancy::Tenant' | abpLocalization\r\n }}</span\r\n ><br />\r\n <h6 class=\"m-0 d-inline-block\">\r\n <i>{{ currentTenant.name || ('AbpUiMultiTenancy::NotSelected' | abpLocalization) }}</i>\r\n </h6>\r\n </div>\r\n <div class=\"col-auto\">\r\n <a\r\n id=\"AbpTenantSwitchLink\"\r\n href=\"javascript:void(0);\"\r\n class=\"btn btn-sm mt-3 btn-outline-primary\"\r\n (click)=\"service.onSwitch()\"\r\n >{{ 'AbpUiMultiTenancy::Switch' | abpLocalization }}</a\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <abp-modal [(visible)]=\"service.isModalVisible\" [busy]=\"service.modalBusy\">\r\n <ng-template #abpHeader>\r\n <h5>Switch Tenant</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <form (ngSubmit)=\"service.save()\">\r\n <div class=\"mt-2\">\r\n <div class=\"mb-3 form-group\">\r\n <label for=\"name\" class=\"form-label\">{{\r\n 'AbpUiMultiTenancy::Name' | abpLocalization\r\n }}</label>\r\n <input\r\n [(ngModel)]=\"service.name\"\r\n type=\"text\"\r\n id=\"name\"\r\n name=\"tenant\"\r\n class=\"form-control\"\r\n autofocus\r\n />\r\n </div>\r\n <p>{{ 'AbpUiMultiTenancy::SwitchTenantHint' | abpLocalization }}</p>\r\n </div>\r\n </form>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button abpClose type=\"button\" class=\"btn btn-secondary\">\r\n {{ 'AbpTenantManagement::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button\r\n type=\"abp-button\"\r\n iconClass=\"fa fa-check\"\r\n (click)=\"service.save()\"\r\n [disabled]=\"currentTenant?.name === service.name\"\r\n >\r\n <span>{{ 'AbpTenantManagement::Save' | abpLocalization }}</span>\r\n </abp-button>\r\n </ng-template>\r\n </abp-modal>\r\n</ng-container>\r\n", components: [{ type: i1$1.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { type: i1$1.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }], directives: [{ type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.AutofocusDirective, selector: "[autofocus]", inputs: ["autofocus"] }, { type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i1$1.ModalCloseDirective, selector: "[abpClose]" }], pipes: { "async": i2$1.AsyncPipe, "abpLocalization": i1.LocalizationPipe } });
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TenantBoxComponent, decorators: [{
158
+ type: Component,
159
+ args: [{ selector: 'abp-tenant-box', providers: [TenantBoxService], template: "<ng-container *ngIf=\"(service.currentTenant$ | async) || { name: '' } as currentTenant\">\r\n <div class=\"card shadow-sm rounded mb-3\">\r\n <div class=\"card-body px-5\">\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <span style=\"font-size: 0.8em\" class=\"text-uppercase text-muted\">{{\r\n 'AbpUiMultiTenancy::Tenant' | abpLocalization\r\n }}</span\r\n ><br />\r\n <h6 class=\"m-0 d-inline-block\">\r\n <i>{{ currentTenant.name || ('AbpUiMultiTenancy::NotSelected' | abpLocalization) }}</i>\r\n </h6>\r\n </div>\r\n <div class=\"col-auto\">\r\n <a\r\n id=\"AbpTenantSwitchLink\"\r\n href=\"javascript:void(0);\"\r\n class=\"btn btn-sm mt-3 btn-outline-primary\"\r\n (click)=\"service.onSwitch()\"\r\n >{{ 'AbpUiMultiTenancy::Switch' | abpLocalization }}</a\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <abp-modal [(visible)]=\"service.isModalVisible\" [busy]=\"service.modalBusy\">\r\n <ng-template #abpHeader>\r\n <h5>Switch Tenant</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <form (ngSubmit)=\"service.save()\">\r\n <div class=\"mt-2\">\r\n <div class=\"mb-3 form-group\">\r\n <label for=\"name\" class=\"form-label\">{{\r\n 'AbpUiMultiTenancy::Name' | abpLocalization\r\n }}</label>\r\n <input\r\n [(ngModel)]=\"service.name\"\r\n type=\"text\"\r\n id=\"name\"\r\n name=\"tenant\"\r\n class=\"form-control\"\r\n autofocus\r\n />\r\n </div>\r\n <p>{{ 'AbpUiMultiTenancy::SwitchTenantHint' | abpLocalization }}</p>\r\n </div>\r\n </form>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button abpClose type=\"button\" class=\"btn btn-secondary\">\r\n {{ 'AbpTenantManagement::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button\r\n type=\"abp-button\"\r\n iconClass=\"fa fa-check\"\r\n (click)=\"service.save()\"\r\n [disabled]=\"currentTenant?.name === service.name\"\r\n >\r\n <span>{{ 'AbpTenantManagement::Save' | abpLocalization }}</span>\r\n </abp-button>\r\n </ng-template>\r\n </abp-modal>\r\n</ng-container>\r\n" }]
160
+ }], ctorParameters: function () { return [{ type: i1$2.TenantBoxService }]; } });
161
+
162
+ class AuthWrapperComponent {
163
+ constructor(service) {
164
+ this.service = service;
165
+ }
166
+ }
167
+ AuthWrapperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AuthWrapperComponent, deps: [{ token: i1$2.AuthWrapperService }], target: i0.ɵɵFactoryTarget.Component });
168
+ AuthWrapperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: AuthWrapperComponent, selector: "abp-auth-wrapper", providers: [AuthWrapperService], ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"mx-auto col col-md-5\">\r\n <ng-container *ngIf=\"(service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible\">\r\n <abp-tenant-box\r\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\r\n ></abp-tenant-box>\r\n </ng-container>\r\n\r\n <div class=\"abp-account-container\">\r\n <div\r\n *ngIf=\"service.enableLocalLogin$ | async; else disableLocalLoginTemplate\"\r\n class=\"card mt-3 shadow-sm rounded\"\r\n >\r\n <div class=\"card-body p-5\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #disableLocalLoginTemplate>\r\n <div class=\"alert alert-warning\">\r\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | abpLocalization }}</strong>\r\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | abpLocalization }}\r\n </div>\r\n</ng-template>\r\n", components: [{ type: TenantBoxComponent, selector: "abp-tenant-box" }], directives: [{ type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }], pipes: { "async": i2$1.AsyncPipe, "abpLocalization": i1.LocalizationPipe } });
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AuthWrapperComponent, decorators: [{
170
+ type: Component,
171
+ args: [{ selector: 'abp-auth-wrapper', providers: [AuthWrapperService], template: "<div class=\"row\">\r\n <div class=\"mx-auto col col-md-5\">\r\n <ng-container *ngIf=\"(service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible\">\r\n <abp-tenant-box\r\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\r\n ></abp-tenant-box>\r\n </ng-container>\r\n\r\n <div class=\"abp-account-container\">\r\n <div\r\n *ngIf=\"service.enableLocalLogin$ | async; else disableLocalLoginTemplate\"\r\n class=\"card mt-3 shadow-sm rounded\"\r\n >\r\n <div class=\"card-body p-5\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #disableLocalLoginTemplate>\r\n <div class=\"alert alert-warning\">\r\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | abpLocalization }}</strong>\r\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | abpLocalization }}\r\n </div>\r\n</ng-template>\r\n" }]
172
+ }], ctorParameters: function () { return [{ type: i1$2.AuthWrapperService }]; } });
173
+
174
+ class AccountLayoutComponent {
175
+ constructor(service) {
176
+ this.service = service;
177
+ this.authWrapperKey = 'Account.AuthWrapperComponent';
178
+ }
179
+ ngAfterViewInit() {
180
+ this.service.subscribeWindowSize();
181
+ }
182
+ }
183
+ // required for dynamic component
184
+ AccountLayoutComponent.type = "account" /* account */;
185
+ AccountLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AccountLayoutComponent, deps: [{ token: LayoutService }], target: i0.ɵɵFactoryTarget.Component });
186
+ AccountLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: AccountLayoutComponent, selector: "abp-layout-account", providers: [LayoutService, SubscriptionService], ngImport: i0, template: "<nav\r\n class=\"navbar navbar-expand-lg navbar-dark bg-dark shadow-sm flex-column flex-md-row mb-4\"\r\n id=\"main-navbar\"\r\n style=\"min-height: 4rem\"\r\n>\r\n <div class=\"container\">\r\n <abp-logo *abpReplaceableTemplate=\"{ componentKey: service.logoComponentKey }\"></abp-logo>\r\n <button\r\n class=\"navbar-toggler\"\r\n type=\"button\"\r\n [attr.aria-expanded]=\"!service.isCollapsed\"\r\n (click)=\"service.isCollapsed = !service.isCollapsed\"\r\n >\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div\r\n class=\"navbar-collapse\"\r\n [class.overflow-hidden]=\"service.smallScreen\"\r\n id=\"main-navbar-collapse\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"!service.smallScreen ? navigations : null\"></ng-container>\r\n\r\n <div\r\n *ngIf=\"service.smallScreen\"\r\n [@collapseWithMargin]=\"service.isCollapsed ? 'collapsed' : 'expanded'\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"navigations\"></ng-container>\r\n </div>\r\n\r\n <ng-template #navigations>\r\n <abp-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: {\r\n smallScreen: { value: service.smallScreen }\r\n }\r\n }\"\r\n class=\"mx-auto\"\r\n [smallScreen]=\"service.smallScreen\"\r\n ></abp-routes>\r\n\r\n <abp-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></abp-nav-items>\r\n </ng-template>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- [@slideFromBottom]=\"outlet.isActivated && outlet.activatedRoute?.routeConfig?.path\" TODO: throws ExpressionChangedAfterItHasBeenCheck when animation is active. It should be fixed -->\r\n<div class=\"container\">\r\n <abp-page-alert-container></abp-page-alert-container>\r\n <abp-auth-wrapper\r\n *abpReplaceableTemplate=\"{\r\n componentKey: authWrapperKey\r\n }\"\r\n >\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </abp-auth-wrapper>\r\n</div>\r\n", components: [{ type: LogoComponent, selector: "abp-logo" }, { type: RoutesComponent, selector: "abp-routes", inputs: ["smallScreen"] }, { type: NavItemsComponent, selector: "abp-nav-items" }, { type: PageAlertContainerComponent, selector: "abp-page-alert-container" }, { type: AuthWrapperComponent, selector: "abp-auth-wrapper" }], directives: [{ type: i4.NgbNavbar, selector: ".navbar" }, { type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }, { type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AccountLayoutComponent, decorators: [{
188
+ type: Component,
189
+ args: [{ selector: 'abp-layout-account', providers: [LayoutService, SubscriptionService], template: "<nav\r\n class=\"navbar navbar-expand-lg navbar-dark bg-dark shadow-sm flex-column flex-md-row mb-4\"\r\n id=\"main-navbar\"\r\n style=\"min-height: 4rem\"\r\n>\r\n <div class=\"container\">\r\n <abp-logo *abpReplaceableTemplate=\"{ componentKey: service.logoComponentKey }\"></abp-logo>\r\n <button\r\n class=\"navbar-toggler\"\r\n type=\"button\"\r\n [attr.aria-expanded]=\"!service.isCollapsed\"\r\n (click)=\"service.isCollapsed = !service.isCollapsed\"\r\n >\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div\r\n class=\"navbar-collapse\"\r\n [class.overflow-hidden]=\"service.smallScreen\"\r\n id=\"main-navbar-collapse\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"!service.smallScreen ? navigations : null\"></ng-container>\r\n\r\n <div\r\n *ngIf=\"service.smallScreen\"\r\n [@collapseWithMargin]=\"service.isCollapsed ? 'collapsed' : 'expanded'\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"navigations\"></ng-container>\r\n </div>\r\n\r\n <ng-template #navigations>\r\n <abp-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: {\r\n smallScreen: { value: service.smallScreen }\r\n }\r\n }\"\r\n class=\"mx-auto\"\r\n [smallScreen]=\"service.smallScreen\"\r\n ></abp-routes>\r\n\r\n <abp-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></abp-nav-items>\r\n </ng-template>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- [@slideFromBottom]=\"outlet.isActivated && outlet.activatedRoute?.routeConfig?.path\" TODO: throws ExpressionChangedAfterItHasBeenCheck when animation is active. It should be fixed -->\r\n<div class=\"container\">\r\n <abp-page-alert-container></abp-page-alert-container>\r\n <abp-auth-wrapper\r\n *abpReplaceableTemplate=\"{\r\n componentKey: authWrapperKey\r\n }\"\r\n >\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </abp-auth-wrapper>\r\n</div>\r\n" }]
190
+ }], ctorParameters: function () { return [{ type: LayoutService }]; } });
191
+
192
+ class ApplicationLayoutComponent {
193
+ constructor(service) {
194
+ this.service = service;
195
+ }
196
+ ngAfterViewInit() {
197
+ this.service.subscribeWindowSize();
198
+ }
199
+ }
200
+ // required for dynamic component
201
+ ApplicationLayoutComponent.type = "application" /* application */;
202
+ ApplicationLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ApplicationLayoutComponent, deps: [{ token: LayoutService }], target: i0.ɵɵFactoryTarget.Component });
203
+ ApplicationLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: ApplicationLayoutComponent, selector: "abp-layout-application", providers: [LayoutService, SubscriptionService], ngImport: i0, template: "<nav\r\n class=\"navbar navbar-expand-lg navbar-dark bg-dark shadow-sm flex-column flex-md-row mb-4\"\r\n id=\"main-navbar\"\r\n style=\"min-height: 4rem\"\r\n>\r\n <div class=\"container\">\r\n <abp-logo *abpReplaceableTemplate=\"{ componentKey: service.logoComponentKey }\"></abp-logo>\r\n <button\r\n class=\"navbar-toggler\"\r\n type=\"button\"\r\n [attr.aria-expanded]=\"!service.isCollapsed\"\r\n (click)=\"service.isCollapsed = !service.isCollapsed\"\r\n >\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"navbar-collapse\" [class.overflow-hidden]=\"service.smallScreen\" id=\"main-navbar-collapse\">\r\n <ng-container *ngTemplateOutlet=\"!service.smallScreen ? navigations : null\"></ng-container>\r\n\r\n <div *ngIf=\"service.smallScreen\" [@collapseWithMargin]=\"service.isCollapsed ? 'collapsed' : 'expanded'\">\r\n <ng-container *ngTemplateOutlet=\"navigations\"></ng-container>\r\n </div>\r\n\r\n <ng-template #navigations>\r\n <abp-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: {\r\n smallScreen: { value: service.smallScreen }\r\n }\r\n }\"\r\n class=\"mx-auto\"\r\n [smallScreen]=\"service.smallScreen\"\r\n ></abp-routes>\r\n\r\n <abp-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></abp-nav-items>\r\n </ng-template>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- [@slideFromBottom]=\"outlet.isActivated && outlet.activatedRoute?.routeConfig?.path\" TODO: throws ExpressionChangedAfterItHasBeenCheck when animation is active. It should be fixed -->\r\n<div class=\"container\">\r\n <abp-page-alert-container></abp-page-alert-container>\r\n\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n</div>\r\n", components: [{ type: LogoComponent, selector: "abp-logo" }, { type: RoutesComponent, selector: "abp-routes", inputs: ["smallScreen"] }, { type: NavItemsComponent, selector: "abp-nav-items" }, { type: PageAlertContainerComponent, selector: "abp-page-alert-container" }], directives: [{ type: i4.NgbNavbar, selector: ".navbar" }, { type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }, { type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], animations: [slideFromBottom, collapseWithMargin] });
204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ApplicationLayoutComponent, decorators: [{
205
+ type: Component,
206
+ args: [{ selector: 'abp-layout-application', animations: [slideFromBottom, collapseWithMargin], providers: [LayoutService, SubscriptionService], template: "<nav\r\n class=\"navbar navbar-expand-lg navbar-dark bg-dark shadow-sm flex-column flex-md-row mb-4\"\r\n id=\"main-navbar\"\r\n style=\"min-height: 4rem\"\r\n>\r\n <div class=\"container\">\r\n <abp-logo *abpReplaceableTemplate=\"{ componentKey: service.logoComponentKey }\"></abp-logo>\r\n <button\r\n class=\"navbar-toggler\"\r\n type=\"button\"\r\n [attr.aria-expanded]=\"!service.isCollapsed\"\r\n (click)=\"service.isCollapsed = !service.isCollapsed\"\r\n >\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"navbar-collapse\" [class.overflow-hidden]=\"service.smallScreen\" id=\"main-navbar-collapse\">\r\n <ng-container *ngTemplateOutlet=\"!service.smallScreen ? navigations : null\"></ng-container>\r\n\r\n <div *ngIf=\"service.smallScreen\" [@collapseWithMargin]=\"service.isCollapsed ? 'collapsed' : 'expanded'\">\r\n <ng-container *ngTemplateOutlet=\"navigations\"></ng-container>\r\n </div>\r\n\r\n <ng-template #navigations>\r\n <abp-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: {\r\n smallScreen: { value: service.smallScreen }\r\n }\r\n }\"\r\n class=\"mx-auto\"\r\n [smallScreen]=\"service.smallScreen\"\r\n ></abp-routes>\r\n\r\n <abp-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></abp-nav-items>\r\n </ng-template>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- [@slideFromBottom]=\"outlet.isActivated && outlet.activatedRoute?.routeConfig?.path\" TODO: throws ExpressionChangedAfterItHasBeenCheck when animation is active. It should be fixed -->\r\n<div class=\"container\">\r\n <abp-page-alert-container></abp-page-alert-container>\r\n\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n</div>\r\n" }]
207
+ }], ctorParameters: function () { return [{ type: LayoutService }]; } });
208
+
209
+ class EmptyLayoutComponent {
210
+ }
211
+ EmptyLayoutComponent.type = "empty" /* empty */;
212
+ EmptyLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EmptyLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
213
+ EmptyLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: EmptyLayoutComponent, selector: "abp-layout-empty", ngImport: i0, template: `
214
+ <router-outlet></router-outlet>
215
+ <abp-confirmation></abp-confirmation>
216
+ `, isInline: true, components: [{ type: i1$1.ConfirmationComponent, selector: "abp-confirmation" }], directives: [{ type: i2.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EmptyLayoutComponent, decorators: [{
218
+ type: Component,
219
+ args: [{
220
+ selector: 'abp-layout-empty',
221
+ template: `
222
+ <router-outlet></router-outlet>
223
+ <abp-confirmation></abp-confirmation>
224
+ `,
225
+ }]
226
+ }] });
227
+
228
+ class CurrentUserComponent {
229
+ constructor(navigateToManageProfile, userMenu, authService, configState, sessionState) {
230
+ this.navigateToManageProfile = navigateToManageProfile;
231
+ this.userMenu = userMenu;
232
+ this.authService = authService;
233
+ this.configState = configState;
234
+ this.sessionState = sessionState;
235
+ this.currentUser$ = this.configState.getOne$('currentUser');
236
+ this.selectedTenant$ = this.sessionState.getTenant$();
237
+ this.trackByFn = (_, element) => element.id;
238
+ }
239
+ get smallScreen() {
240
+ return window.innerWidth < 992;
241
+ }
242
+ navigateToLogin() {
243
+ this.authService.navigateToLogin();
244
+ }
245
+ logout() {
246
+ this.authService.logout().subscribe();
247
+ }
248
+ }
249
+ CurrentUserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: CurrentUserComponent, deps: [{ token: NAVIGATE_TO_MANAGE_PROFILE }, { token: i1$1.UserMenuService }, { token: i1.AuthService }, { token: i1.ConfigStateService }, { token: i1.SessionStateService }], target: i0.ɵɵFactoryTarget.Component });
250
+ CurrentUserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: CurrentUserComponent, selector: "abp-current-user", ngImport: i0, template: "<ng-template #loginBtn>\r\n <a role=\"button\" class=\"nav-link pointer\" (click)=\"navigateToLogin()\">{{\r\n 'AbpAccount::Login' | abpLocalization\r\n }}</a>\r\n</ng-template>\r\n<div\r\n *ngIf=\"(currentUser$ | async)?.isAuthenticated; else loginBtn\"\r\n ngbDropdown\r\n class=\"dropdown\"\r\n #currentUserDropdown=\"ngbDropdown\"\r\n display=\"static\"\r\n>\r\n <a\r\n ngbDropdownToggle\r\n class=\"nav-link\"\r\n href=\"javascript:void(0)\"\r\n role=\"button\"\r\n id=\"dropdownMenuLink\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n >\r\n <small *ngIf=\"(selectedTenant$ | async)?.name as tenantName\"\r\n ><i>{{ tenantName }}</i\r\n >\\</small\r\n >\r\n <strong>{{ (currentUser$ | async)?.userName }}</strong>\r\n </a>\r\n <div\r\n class=\"dropdown-menu dropdown-menu-end border-0 shadow-sm\"\r\n aria-labelledby=\"dropdownMenuLink\"\r\n [class.d-block]=\"smallScreen && currentUserDropdown.isOpen()\"\r\n >\r\n <ng-container *ngFor=\"let item of userMenu.items$ | async; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"item.visible && item.visible()\">\r\n <li class=\"nav-item d-flex align-items-center\" *abpPermission=\"item.requiredPolicy\">\r\n <ng-container\r\n *ngIf=\"item.component; else htmlTemplate\"\r\n [ngComponentOutlet]=\"item.component\"\r\n [ngComponentOutletInjector]=\"item | toInjector\"\r\n ></ng-container>\r\n\r\n <ng-template #htmlTemplate>\r\n <div\r\n *ngIf=\"item.html; else textTemplate\"\r\n [innerHTML]=\"item.html\"\r\n (click)=\"item.action ? item.action() : null\"\r\n ></div>\r\n </ng-template>\r\n\r\n <ng-template #textTemplate>\r\n <a\r\n *ngIf=\"item.textTemplate\"\r\n (click)=\"item.action ? item.action() : null\"\r\n class=\"dropdown-item pointer\"\r\n >\r\n <i *ngIf=\"item.textTemplate.icon\" class=\"me-1 {{ item.textTemplate.icon }}\"></i>\r\n {{ item.textTemplate.text | abpLocalization }}</a\r\n >\r\n </ng-template>\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", directives: [{ type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission"] }, { type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModuleFactory"] }], pipes: { "abpLocalization": i1.LocalizationPipe, "async": i2$1.AsyncPipe, "toInjector": i1.ToInjectorPipe } });
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: CurrentUserComponent, decorators: [{
252
+ type: Component,
253
+ args: [{ selector: 'abp-current-user', template: "<ng-template #loginBtn>\r\n <a role=\"button\" class=\"nav-link pointer\" (click)=\"navigateToLogin()\">{{\r\n 'AbpAccount::Login' | abpLocalization\r\n }}</a>\r\n</ng-template>\r\n<div\r\n *ngIf=\"(currentUser$ | async)?.isAuthenticated; else loginBtn\"\r\n ngbDropdown\r\n class=\"dropdown\"\r\n #currentUserDropdown=\"ngbDropdown\"\r\n display=\"static\"\r\n>\r\n <a\r\n ngbDropdownToggle\r\n class=\"nav-link\"\r\n href=\"javascript:void(0)\"\r\n role=\"button\"\r\n id=\"dropdownMenuLink\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n >\r\n <small *ngIf=\"(selectedTenant$ | async)?.name as tenantName\"\r\n ><i>{{ tenantName }}</i\r\n >\\</small\r\n >\r\n <strong>{{ (currentUser$ | async)?.userName }}</strong>\r\n </a>\r\n <div\r\n class=\"dropdown-menu dropdown-menu-end border-0 shadow-sm\"\r\n aria-labelledby=\"dropdownMenuLink\"\r\n [class.d-block]=\"smallScreen && currentUserDropdown.isOpen()\"\r\n >\r\n <ng-container *ngFor=\"let item of userMenu.items$ | async; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"item.visible && item.visible()\">\r\n <li class=\"nav-item d-flex align-items-center\" *abpPermission=\"item.requiredPolicy\">\r\n <ng-container\r\n *ngIf=\"item.component; else htmlTemplate\"\r\n [ngComponentOutlet]=\"item.component\"\r\n [ngComponentOutletInjector]=\"item | toInjector\"\r\n ></ng-container>\r\n\r\n <ng-template #htmlTemplate>\r\n <div\r\n *ngIf=\"item.html; else textTemplate\"\r\n [innerHTML]=\"item.html\"\r\n (click)=\"item.action ? item.action() : null\"\r\n ></div>\r\n </ng-template>\r\n\r\n <ng-template #textTemplate>\r\n <a\r\n *ngIf=\"item.textTemplate\"\r\n (click)=\"item.action ? item.action() : null\"\r\n class=\"dropdown-item pointer\"\r\n >\r\n <i *ngIf=\"item.textTemplate.icon\" class=\"me-1 {{ item.textTemplate.icon }}\"></i>\r\n {{ item.textTemplate.text | abpLocalization }}</a\r\n >\r\n </ng-template>\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n" }]
254
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
255
+ type: Inject,
256
+ args: [NAVIGATE_TO_MANAGE_PROFILE]
257
+ }] }, { type: i1$1.UserMenuService }, { type: i1.AuthService }, { type: i1.ConfigStateService }, { type: i1.SessionStateService }]; } });
258
+
259
+ class LanguagesComponent {
260
+ constructor(sessionState, configState) {
261
+ this.sessionState = sessionState;
262
+ this.configState = configState;
263
+ this.languages$ = this.configState.getDeep$('localization.languages');
264
+ }
265
+ get smallScreen() {
266
+ return window.innerWidth < 992;
267
+ }
268
+ get defaultLanguage$() {
269
+ return this.languages$.pipe(map(languages => languages?.find(lang => lang.cultureName === this.selectedLangCulture)?.displayName || ''));
270
+ }
271
+ get dropdownLanguages$() {
272
+ return this.languages$.pipe(map(languages => languages?.filter(lang => lang.cultureName !== this.selectedLangCulture) || []));
273
+ }
274
+ get selectedLangCulture() {
275
+ return this.sessionState.getLanguage();
276
+ }
277
+ onChangeLang(cultureName) {
278
+ this.sessionState.setLanguage(cultureName);
279
+ }
280
+ }
281
+ LanguagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LanguagesComponent, deps: [{ token: i1.SessionStateService }, { token: i1.ConfigStateService }], target: i0.ɵɵFactoryTarget.Component });
282
+ LanguagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: LanguagesComponent, selector: "abp-languages", ngImport: i0, template: `
283
+ <div
284
+ *ngIf="((dropdownLanguages$ | async)?.length || 0) > 0"
285
+ class="dropdown"
286
+ ngbDropdown
287
+ #languageDropdown="ngbDropdown"
288
+ display="static"
289
+ >
290
+ <a
291
+ ngbDropdownToggle
292
+ class="nav-link"
293
+ href="javascript:void(0)"
294
+ role="button"
295
+ id="dropdownMenuLink"
296
+ data-toggle="dropdown"
297
+ aria-haspopup="true"
298
+ aria-expanded="false"
299
+ >
300
+ {{ defaultLanguage$ | async }}
301
+ </a>
302
+ <div
303
+ class="dropdown-menu dropdown-menu-end border-0 shadow-sm"
304
+ aria-labelledby="dropdownMenuLink"
305
+ [class.d-block]="smallScreen && languageDropdown.isOpen()"
306
+ >
307
+ <a
308
+ *ngFor="let lang of dropdownLanguages$ | async"
309
+ href="javascript:void(0)"
310
+ class="dropdown-item"
311
+ (click)="onChangeLang(lang.cultureName || '')"
312
+ >{{ lang?.displayName }}</a
313
+ >
314
+ </div>
315
+ </div>
316
+ `, isInline: true, directives: [{ type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i2$1.AsyncPipe } });
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LanguagesComponent, decorators: [{
318
+ type: Component,
319
+ args: [{
320
+ selector: 'abp-languages',
321
+ template: `
322
+ <div
323
+ *ngIf="((dropdownLanguages$ | async)?.length || 0) > 0"
324
+ class="dropdown"
325
+ ngbDropdown
326
+ #languageDropdown="ngbDropdown"
327
+ display="static"
328
+ >
329
+ <a
330
+ ngbDropdownToggle
331
+ class="nav-link"
332
+ href="javascript:void(0)"
333
+ role="button"
334
+ id="dropdownMenuLink"
335
+ data-toggle="dropdown"
336
+ aria-haspopup="true"
337
+ aria-expanded="false"
338
+ >
339
+ {{ defaultLanguage$ | async }}
340
+ </a>
341
+ <div
342
+ class="dropdown-menu dropdown-menu-end border-0 shadow-sm"
343
+ aria-labelledby="dropdownMenuLink"
344
+ [class.d-block]="smallScreen && languageDropdown.isOpen()"
345
+ >
346
+ <a
347
+ *ngFor="let lang of dropdownLanguages$ | async"
348
+ href="javascript:void(0)"
349
+ class="dropdown-item"
350
+ (click)="onChangeLang(lang.cultureName || '')"
351
+ >{{ lang?.displayName }}</a
352
+ >
353
+ </div>
354
+ </div>
355
+ `,
356
+ }]
357
+ }], ctorParameters: function () { return [{ type: i1.SessionStateService }, { type: i1.ConfigStateService }]; } });
358
+
359
+ class ValidationErrorComponent extends ValidationErrorComponent$1 {
360
+ get abpErrors() {
361
+ if (!this.errors || !this.errors.length)
362
+ return [];
363
+ return this.errors.map(error => {
364
+ if (!error.message)
365
+ return error;
366
+ const index = error.message.indexOf('[');
367
+ if (index > -1) {
368
+ return {
369
+ ...error,
370
+ message: error.message.slice(0, index),
371
+ interpoliteParams: error.message.slice(index + 1, error.message.length - 1).split(','),
372
+ };
373
+ }
374
+ return error;
375
+ });
376
+ }
377
+ }
378
+ ValidationErrorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ValidationErrorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
379
+ ValidationErrorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: ValidationErrorComponent, selector: "abp-validation-error", usesInheritance: true, ngImport: i0, template: `
380
+ <div class="invalid-feedback" *ngFor="let error of abpErrors; trackBy: trackByFn">
381
+ {{ error.message | abpLocalization: error.interpoliteParams }}
382
+ </div>
383
+ `, isInline: true, directives: [{ type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "abpLocalization": i1.LocalizationPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ValidationErrorComponent, decorators: [{
385
+ type: Component,
386
+ args: [{
387
+ selector: 'abp-validation-error',
388
+ template: `
389
+ <div class="invalid-feedback" *ngFor="let error of abpErrors; trackBy: trackByFn">
390
+ {{ error.message | abpLocalization: error.interpoliteParams }}
391
+ </div>
392
+ `,
393
+ changeDetection: ChangeDetectionStrategy.OnPush,
394
+ encapsulation: ViewEncapsulation.None,
395
+ }]
396
+ }] });
397
+
398
+ const LAZY_STYLES = new InjectionToken('LAZY_STYLES');
399
+
400
+ const BOOTSTRAP = 'bootstrap-{{dir}}.min.css';
401
+ class LazyStyleHandler {
402
+ constructor(injector) {
403
+ this._dir = 'ltr';
404
+ this.loaded = new Map();
405
+ this.setStyles(injector);
406
+ this.setLazyLoad(injector);
407
+ this.listenToDirectionChanges(injector);
408
+ }
409
+ set dir(dir) {
410
+ if (dir === this._dir)
411
+ return;
412
+ this.switchCSS(dir);
413
+ this._dir = dir;
414
+ }
415
+ get dir() {
416
+ return this._dir;
417
+ }
418
+ getHrefFromLink(link) {
419
+ if (!link)
420
+ return '';
421
+ const a = document.createElement('a');
422
+ a.href = link.href;
423
+ return a.pathname.replace(/^\//, '');
424
+ }
425
+ getLoadedBootstrap() {
426
+ const href = createLazyStyleHref(BOOTSTRAP, this.dir);
427
+ const selector = `[href*="${href.replace(/\.css$/, '')}"]`;
428
+ const link = document.querySelector(selector);
429
+ return { href, link };
430
+ }
431
+ listenToDirectionChanges(injector) {
432
+ const docDirHandler = injector.get(DocumentDirHandlerService);
433
+ // will always listen, no need to unsubscribe
434
+ docDirHandler.dir$.subscribe(dir => {
435
+ this.dir = dir;
436
+ });
437
+ }
438
+ setLazyLoad(injector) {
439
+ this.lazyLoad = injector.get(LazyLoadService);
440
+ const { href, link } = this.getLoadedBootstrap();
441
+ this.lazyLoad.loaded.set(href, link);
442
+ }
443
+ setStyles(injector) {
444
+ this.styles = injector.get(LAZY_STYLES, [BOOTSTRAP]);
445
+ }
446
+ switchCSS(dir) {
447
+ this.styles.forEach(style => {
448
+ const oldHref = createLazyStyleHref(style, this.dir);
449
+ const newHref = createLazyStyleHref(style, dir);
450
+ const link = this.loaded.get(newHref);
451
+ const href = this.getHrefFromLink(link) || newHref;
452
+ const strategy = LOADING_STRATEGY.PrependAnonymousStyleToHead(href);
453
+ this.lazyLoad.load(strategy).subscribe(() => {
454
+ const oldLink = this.lazyLoad.loaded.get(oldHref);
455
+ this.loaded.delete(newHref);
456
+ this.loaded.set(oldHref, oldLink);
457
+ const newLink = this.lazyLoad.loaded.get(href);
458
+ this.lazyLoad.loaded.delete(href);
459
+ this.lazyLoad.loaded.set(newHref, newLink);
460
+ this.lazyLoad.remove(oldHref);
461
+ });
462
+ });
463
+ }
464
+ }
465
+ LazyStyleHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LazyStyleHandler, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
466
+ LazyStyleHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LazyStyleHandler });
467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LazyStyleHandler, decorators: [{
468
+ type: Injectable
469
+ }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
470
+ function createLazyStyleHref(style, dir) {
471
+ return style.replace(/{{\s*dir\s*}}/g, dir);
472
+ }
473
+ function initLazyStyleHandler(injector) {
474
+ return () => new LazyStyleHandler(injector);
475
+ }
476
+
477
+ const BASIC_THEME_NAV_ITEM_PROVIDERS = [
478
+ {
479
+ provide: APP_INITIALIZER,
480
+ useFactory: configureNavItems,
481
+ deps: [NavItemsService],
482
+ multi: true,
483
+ },
484
+ ];
485
+ function configureNavItems(navItems) {
486
+ return () => {
487
+ navItems.addItems([
488
+ {
489
+ id: "Theme.LanguagesComponent" /* Languages */,
490
+ order: 100,
491
+ component: LanguagesComponent,
492
+ },
493
+ {
494
+ id: "Theme.CurrentUserComponent" /* CurrentUser */,
495
+ order: 100,
496
+ component: CurrentUserComponent,
497
+ },
498
+ ]);
499
+ };
500
+ }
501
+
502
+ var styles = `
503
+ .content-header-title {
504
+ font-size: 24px;
505
+ }
506
+ .entry-row {
507
+ margin-bottom: 15px;
508
+ }
509
+ #main-navbar-tools a.dropdown-toggle {
510
+ text-decoration: none;
511
+ color: #fff;
512
+ }
513
+ .navbar .dropdown-submenu {
514
+ position: relative;
515
+ }
516
+ .navbar .dropdown-menu {
517
+ margin: 0;
518
+ padding: 0;
519
+ }
520
+ .navbar .dropdown-menu a {
521
+ font-size: .9em;
522
+ padding: 10px 15px;
523
+ display: block;
524
+ min-width: 210px;
525
+ text-align: left;
526
+ border-radius: 0.25rem;
527
+ min-height: 44px;
528
+ }
529
+ [dir=rtl] .navbar .dropdown-menu a {
530
+ text-align: right!important;
531
+ }
532
+ .navbar .dropdown-submenu a::after {
533
+ transform: rotate(-90deg);
534
+ position: absolute;
535
+ right: 16px;
536
+ top: 18px;
537
+ }
538
+ [dir=rtl] .navbar .dropdown-submenu a::after {
539
+ transform: rotate(90deg);
540
+ left: 16px;
541
+ right: auto;
542
+ top: 20px;
543
+ }
544
+ .navbar .dropdown-submenu .dropdown-menu {
545
+ top: 0;
546
+ left: 100%;
547
+ }
548
+ /* work around for rtl. Track https://github.com/ng-bootstrap/ng-bootstrap/issues/4100 issue */
549
+ [dir=rtl] .navbar .dropdown-submenu .dropdown-menu {
550
+ top: 0;
551
+ right: 100%;
552
+ }
553
+ .card-header .btn {
554
+ padding: 2px 6px;
555
+ }
556
+ .card-header h5 {
557
+ margin: 0;
558
+ }
559
+ .container > .card {
560
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
561
+ }
562
+ @media screen and (min-width: 992px) {
563
+ .navbar .dropdown:hover > .dropdown-menu {
564
+ display: block;
565
+ }
566
+
567
+ .navbar .dropdown-submenu:hover > .dropdown-menu {
568
+ display: block;
569
+ }
570
+ }
571
+ .input-validation-error {
572
+ border-color: #dc3545;
573
+ }
574
+ .field-validation-error {
575
+ font-size: 0.8em;
576
+ }
577
+ .ui-table .ui-table-tbody > tr.empty-row > div.empty-row-content {
578
+ border: 1px solid #c8c8c8;
579
+ }
580
+ .abp-loading {
581
+ background: rgba(0, 0, 0, 0.05);
582
+ }
583
+ .modal-backdrop {
584
+ background-color: rgba(0, 0, 0, 0.6);
585
+ }
586
+
587
+ .confirmation .confirmation-backdrop {
588
+ background: rgba(0, 0, 0, 0.7) !important;
589
+ }
590
+ .confirmation .confirmation-dialog {
591
+ border: none;
592
+ border-radius: 10px;
593
+ background-color: #fff;
594
+ box-shadow: 0 0 10px -5px rgba(0, 0, 0, 0.5);
595
+ }
596
+ .confirmation .confirmation-dialog .icon-container .icon {
597
+ stroke: #fff;
598
+ color: #fff;
599
+ }
600
+ .confirmation .confirmation-dialog .icon-container.info .icon {
601
+ stroke: #2f96b4;
602
+ color: #2f96b4;
603
+ }
604
+ .confirmation .confirmation-dialog .icon-container.success .icon {
605
+ stroke: #51a351;
606
+ color: #51a351;
607
+ }
608
+ .confirmation .confirmation-dialog .icon-container.warning .icon {
609
+ stroke: #f89406;
610
+ color: #f89406;
611
+ }
612
+ .confirmation .confirmation-dialog .icon-container.error .icon {
613
+ stroke: #bd362f;
614
+ color: #bd362f;
615
+ }
616
+ .confirmation .confirmation-dialog .content .title {
617
+ color: #222;
618
+ }
619
+ .confirmation .confirmation-dialog .content .message {
620
+ color: #777;
621
+ }
622
+ .confirmation .confirmation-dialog .footer {
623
+ background: transparent;
624
+ }
625
+ .confirmation .confirmation-dialog .footer .confirmation-button {
626
+ background-color: #eee;
627
+ color: #777;
628
+ }
629
+ .confirmation .confirmation-dialog .footer .confirmation-button:hover, .confirmation .confirmation-dialog .footer .confirmation-button:focus, .confirmation .confirmation-dialog .footer .confirmation-button:active {
630
+ background-color: #bbb;
631
+ }
632
+ .confirmation .confirmation-dialog .footer .confirmation-button--confirm {
633
+ background-color: #2f96b4;
634
+ color: #fff;
635
+ }
636
+ .confirmation .confirmation-dialog .footer .confirmation-button--confirm:hover {
637
+ background-color: #2e819b;
638
+ }
639
+ .ui-table .pagination-wrapper {
640
+ background-color: #f4f4f4;
641
+ border: 1px solid #c8c8c8;
642
+ }
643
+ .bordered .datatable-body-row {
644
+ border-top: 1px solid #eee;
645
+ margin-top: -1px;
646
+ }
647
+ .breadcrumb {
648
+ background-color: transparent;
649
+ padding: 0.27rem;
650
+ }
651
+ `;
652
+
653
+ const BASIC_THEME_STYLES_PROVIDERS = [
654
+ {
655
+ provide: APP_INITIALIZER,
656
+ useFactory: configureStyles,
657
+ deps: [DomInsertionService, ReplaceableComponentsService],
658
+ multi: true,
659
+ },
660
+ ];
661
+ function configureStyles(domInsertion, replaceableComponents) {
662
+ return () => {
663
+ domInsertion.insertContent(CONTENT_STRATEGY.AppendStyleToHead(styles));
664
+ initLayouts(replaceableComponents);
665
+ };
666
+ }
667
+ function initLayouts(replaceableComponents) {
668
+ replaceableComponents.add({
669
+ key: "Theme.ApplicationLayoutComponent" /* ApplicationLayout */,
670
+ component: ApplicationLayoutComponent,
671
+ });
672
+ replaceableComponents.add({
673
+ key: "Theme.AccountLayoutComponent" /* AccountLayout */,
674
+ component: AccountLayoutComponent,
675
+ });
676
+ replaceableComponents.add({
677
+ key: "Theme.EmptyLayoutComponent" /* EmptyLayout */,
678
+ component: EmptyLayoutComponent,
679
+ });
680
+ }
681
+
682
+ const BASIC_THEME_USER_MENU_PROVIDERS = [
683
+ {
684
+ provide: APP_INITIALIZER,
685
+ useFactory: configureUserMenu,
686
+ deps: [Injector],
687
+ multi: true,
688
+ },
689
+ ];
690
+ function configureUserMenu(injector) {
691
+ const userMenu = injector.get(UserMenuService);
692
+ const authService = injector.get(AuthService);
693
+ const navigateToManageProfile = injector.get(NAVIGATE_TO_MANAGE_PROFILE);
694
+ return () => {
695
+ userMenu.addItems([
696
+ {
697
+ id: "UserMenu.MyAccount" /* MyAccount */,
698
+ order: 100,
699
+ textTemplate: {
700
+ text: 'AbpAccount::MyAccount',
701
+ icon: 'fa fa-cog',
702
+ },
703
+ action: () => navigateToManageProfile(),
704
+ },
705
+ {
706
+ id: "UserMenu.Logout" /* Logout */,
707
+ order: 101,
708
+ textTemplate: {
709
+ text: 'AbpUi::Logout',
710
+ icon: 'fa fa-power-off',
711
+ },
712
+ action: () => {
713
+ authService.logout().subscribe();
714
+ },
715
+ },
716
+ ]);
717
+ };
718
+ }
719
+
720
+ const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent];
721
+ class BaseThemeBasicModule {
722
+ }
723
+ BaseThemeBasicModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseThemeBasicModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
724
+ BaseThemeBasicModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseThemeBasicModule, declarations: [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent, ValidationErrorComponent,
725
+ LogoComponent,
726
+ NavItemsComponent,
727
+ RoutesComponent,
728
+ CurrentUserComponent,
729
+ LanguagesComponent,
730
+ PageAlertContainerComponent,
731
+ TenantBoxComponent,
732
+ AuthWrapperComponent], imports: [CoreModule,
733
+ ThemeSharedModule,
734
+ NgbCollapseModule,
735
+ NgbDropdownModule,
736
+ NgxValidateCoreModule], exports: [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent, ValidationErrorComponent,
737
+ LogoComponent,
738
+ NavItemsComponent,
739
+ RoutesComponent,
740
+ CurrentUserComponent,
741
+ LanguagesComponent,
742
+ PageAlertContainerComponent] });
743
+ BaseThemeBasicModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseThemeBasicModule, imports: [[
744
+ CoreModule,
745
+ ThemeSharedModule,
746
+ NgbCollapseModule,
747
+ NgbDropdownModule,
748
+ NgxValidateCoreModule,
749
+ ]] });
750
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseThemeBasicModule, decorators: [{
751
+ type: NgModule,
752
+ args: [{
753
+ declarations: [
754
+ ...LAYOUTS,
755
+ ValidationErrorComponent,
756
+ LogoComponent,
757
+ NavItemsComponent,
758
+ RoutesComponent,
759
+ CurrentUserComponent,
760
+ LanguagesComponent,
761
+ PageAlertContainerComponent,
762
+ TenantBoxComponent,
763
+ AuthWrapperComponent,
764
+ ],
765
+ exports: [
766
+ ...LAYOUTS,
767
+ ValidationErrorComponent,
768
+ LogoComponent,
769
+ NavItemsComponent,
770
+ RoutesComponent,
771
+ CurrentUserComponent,
772
+ LanguagesComponent,
773
+ PageAlertContainerComponent,
774
+ ],
775
+ imports: [
776
+ CoreModule,
777
+ ThemeSharedModule,
778
+ NgbCollapseModule,
779
+ NgbDropdownModule,
780
+ NgxValidateCoreModule,
781
+ ]
782
+ }]
783
+ }] });
784
+ class ThemeBasicModule {
785
+ static forRoot() {
786
+ return {
787
+ ngModule: ThemeBasicModule,
788
+ providers: [
789
+ BASIC_THEME_NAV_ITEM_PROVIDERS,
790
+ BASIC_THEME_USER_MENU_PROVIDERS,
791
+ BASIC_THEME_STYLES_PROVIDERS,
792
+ {
793
+ provide: VALIDATION_ERROR_TEMPLATE,
794
+ useValue: ValidationErrorComponent,
795
+ },
796
+ {
797
+ provide: VALIDATION_TARGET_SELECTOR,
798
+ useValue: '.form-group',
799
+ },
800
+ {
801
+ provide: VALIDATION_INVALID_CLASSES,
802
+ useValue: 'is-invalid',
803
+ },
804
+ LazyStyleHandler,
805
+ {
806
+ provide: APP_INITIALIZER,
807
+ useFactory: noop,
808
+ multi: true,
809
+ deps: [LazyStyleHandler],
810
+ },
811
+ ],
812
+ };
813
+ }
814
+ }
815
+ ThemeBasicModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ThemeBasicModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
816
+ ThemeBasicModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ThemeBasicModule, imports: [BaseThemeBasicModule], exports: [BaseThemeBasicModule] });
817
+ ThemeBasicModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ThemeBasicModule, imports: [[BaseThemeBasicModule], BaseThemeBasicModule] });
818
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ThemeBasicModule, decorators: [{
819
+ type: NgModule,
820
+ args: [{
821
+ exports: [BaseThemeBasicModule],
822
+ imports: [BaseThemeBasicModule],
823
+ }]
824
+ }] });
825
+
826
+ /*
827
+ * Public API Surface of theme-basic
828
+ */
829
+
830
+ /**
831
+ * Generated bundle index. Do not edit.
832
+ */
833
+
834
+ export { AccountLayoutComponent, ApplicationLayoutComponent, AuthWrapperComponent, BASIC_THEME_NAV_ITEM_PROVIDERS, BASIC_THEME_STYLES_PROVIDERS, BASIC_THEME_USER_MENU_PROVIDERS, BOOTSTRAP, BaseThemeBasicModule, CurrentUserComponent, EmptyLayoutComponent, LAYOUTS, LAZY_STYLES, LanguagesComponent, LazyStyleHandler, LogoComponent, NavItemsComponent, PageAlertContainerComponent, RoutesComponent, TenantBoxComponent, ThemeBasicModule, ValidationErrorComponent, configureNavItems, configureStyles, configureUserMenu, createLazyStyleHref, initLazyStyleHandler };
835
+ //# sourceMappingURL=abp-ng.theme.basic.mjs.map