tango-app-ui-shared 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/.eslintrc.json +37 -0
  2. package/README.md +24 -0
  3. package/ng-package.json +7 -0
  4. package/package.json +12 -0
  5. package/src/lib/guards/auth.guard.ts +20 -0
  6. package/src/lib/i18n/index.ts +2 -0
  7. package/src/lib/i18n/translation.module.ts +9 -0
  8. package/src/lib/i18n/translation.service.ts +61 -0
  9. package/src/lib/i18n/vocabs/ch.ts +105 -0
  10. package/src/lib/i18n/vocabs/de.ts +105 -0
  11. package/src/lib/i18n/vocabs/en.ts +105 -0
  12. package/src/lib/i18n/vocabs/es.ts +105 -0
  13. package/src/lib/i18n/vocabs/fr.ts +105 -0
  14. package/src/lib/i18n/vocabs/jp.ts +105 -0
  15. package/src/lib/interceptors/http-auth-interceptor.ts +21 -0
  16. package/src/lib/interfaces/global-state.ts +6 -0
  17. package/src/lib/modules/errors/error404/error404.component.html +24 -0
  18. package/src/lib/modules/errors/error404/error404.component.scss +0 -0
  19. package/src/lib/modules/errors/error404/error404.component.spec.ts +25 -0
  20. package/src/lib/modules/errors/error404/error404.component.ts +50 -0
  21. package/src/lib/modules/errors/error500/error500.component.html +24 -0
  22. package/src/lib/modules/errors/error500/error500.component.scss +0 -0
  23. package/src/lib/modules/errors/error500/error500.component.spec.ts +25 -0
  24. package/src/lib/modules/errors/error500/error500.component.ts +50 -0
  25. package/src/lib/modules/errors/errors-routing.module.ts +30 -0
  26. package/src/lib/modules/errors/errors.component.html +15 -0
  27. package/src/lib/modules/errors/errors.component.scss +4 -0
  28. package/src/lib/modules/errors/errors.component.spec.ts +25 -0
  29. package/src/lib/modules/errors/errors.component.ts +42 -0
  30. package/src/lib/modules/errors/errors.module.ts +21 -0
  31. package/src/lib/modules/layout/content/content.component.html +12 -0
  32. package/src/lib/modules/layout/content/content.component.scss +0 -0
  33. package/src/lib/modules/layout/content/content.component.ts +35 -0
  34. package/src/lib/modules/layout/footer/footer.component.html +32 -0
  35. package/src/lib/modules/layout/footer/footer.component.scss +0 -0
  36. package/src/lib/modules/layout/footer/footer.component.spec.ts +25 -0
  37. package/src/lib/modules/layout/footer/footer.component.ts +13 -0
  38. package/src/lib/modules/layout/header/header-menu/header-menu.component.html +27 -0
  39. package/src/lib/modules/layout/header/header-menu/header-menu.component.scss +4 -0
  40. package/src/lib/modules/layout/header/header-menu/header-menu.component.spec.ts +25 -0
  41. package/src/lib/modules/layout/header/header-menu/header-menu.component.ts +38 -0
  42. package/src/lib/modules/layout/header/header.component.html +90 -0
  43. package/src/lib/modules/layout/header/header.component.scss +0 -0
  44. package/src/lib/modules/layout/header/header.component.spec.ts +25 -0
  45. package/src/lib/modules/layout/header/header.component.ts +139 -0
  46. package/src/lib/modules/layout/header/navbar/navbar.component.html +92 -0
  47. package/src/lib/modules/layout/header/navbar/navbar.component.scss +0 -0
  48. package/src/lib/modules/layout/header/navbar/navbar.component.spec.ts +23 -0
  49. package/src/lib/modules/layout/header/navbar/navbar.component.ts +20 -0
  50. package/src/lib/modules/layout/header/page-title/page-title.component.html +32 -0
  51. package/src/lib/modules/layout/header/page-title/page-title.component.ts +40 -0
  52. package/src/lib/modules/layout/keenicon/icons.json +1 -0
  53. package/src/lib/modules/layout/keenicon/keenicon.component.html +4 -0
  54. package/src/lib/modules/layout/keenicon/keenicon.component.scss +0 -0
  55. package/src/lib/modules/layout/keenicon/keenicon.component.spec.ts +23 -0
  56. package/src/lib/modules/layout/keenicon/keenicon.component.ts +30 -0
  57. package/src/lib/modules/layout/layout/layout.component.html +70 -0
  58. package/src/lib/modules/layout/layout/layout.component.scss +15 -0
  59. package/src/lib/modules/layout/layout/layout.component.ts +399 -0
  60. package/src/lib/modules/layout/layout.module.ts +93 -0
  61. package/src/lib/modules/layout/scripts-init/scripts-init.component.html +0 -0
  62. package/src/lib/modules/layout/scripts-init/scripts-init.component.ts +81 -0
  63. package/src/lib/modules/layout/scroll-top/scroll-top.component.html +1 -0
  64. package/src/lib/modules/layout/scroll-top/scroll-top.component.ts +75 -0
  65. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.html +9 -0
  66. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.scss +0 -0
  67. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +23 -0
  68. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.ts +13 -0
  69. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.html +26 -0
  70. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.scss +0 -0
  71. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.spec.ts +23 -0
  72. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.ts +36 -0
  73. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.html +276 -0
  74. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.scss +0 -0
  75. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.spec.ts +23 -0
  76. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.ts +15 -0
  77. package/src/lib/modules/layout/sidebar/sidebar.component.html +16 -0
  78. package/src/lib/modules/layout/sidebar/sidebar.component.scss +0 -0
  79. package/src/lib/modules/layout/sidebar/sidebar.component.spec.ts +23 -0
  80. package/src/lib/modules/layout/sidebar/sidebar.component.ts +203 -0
  81. package/src/lib/modules/layout/toolbar/accounting/accounting.component.html +84 -0
  82. package/src/lib/modules/layout/toolbar/accounting/accounting.component.scss +0 -0
  83. package/src/lib/modules/layout/toolbar/accounting/accounting.component.spec.ts +23 -0
  84. package/src/lib/modules/layout/toolbar/accounting/accounting.component.ts +14 -0
  85. package/src/lib/modules/layout/toolbar/classic/classic.component.html +37 -0
  86. package/src/lib/modules/layout/toolbar/classic/classic.component.scss +0 -0
  87. package/src/lib/modules/layout/toolbar/classic/classic.component.spec.ts +23 -0
  88. package/src/lib/modules/layout/toolbar/classic/classic.component.ts +88 -0
  89. package/src/lib/modules/layout/toolbar/extended/extended.component.html +100 -0
  90. package/src/lib/modules/layout/toolbar/extended/extended.component.scss +0 -0
  91. package/src/lib/modules/layout/toolbar/extended/extended.component.spec.ts +23 -0
  92. package/src/lib/modules/layout/toolbar/extended/extended.component.ts +12 -0
  93. package/src/lib/modules/layout/toolbar/reports/reports.component.html +62 -0
  94. package/src/lib/modules/layout/toolbar/reports/reports.component.scss +0 -0
  95. package/src/lib/modules/layout/toolbar/reports/reports.component.spec.ts +23 -0
  96. package/src/lib/modules/layout/toolbar/reports/reports.component.ts +14 -0
  97. package/src/lib/modules/layout/toolbar/saas/saas.component.html +77 -0
  98. package/src/lib/modules/layout/toolbar/saas/saas.component.scss +0 -0
  99. package/src/lib/modules/layout/toolbar/saas/saas.component.spec.ts +23 -0
  100. package/src/lib/modules/layout/toolbar/saas/saas.component.ts +14 -0
  101. package/src/lib/modules/layout/toolbar/toolbar.component.html +27 -0
  102. package/src/lib/modules/layout/toolbar/toolbar.component.scss +0 -0
  103. package/src/lib/modules/layout/toolbar/toolbar.component.spec.ts +25 -0
  104. package/src/lib/modules/layout/toolbar/toolbar.component.ts +125 -0
  105. package/src/lib/routes/route-wraper-modules/manage-wrapper.module.ts +12 -0
  106. package/src/lib/routes/route-wraper-modules/profile-wrapper.module.ts +12 -0
  107. package/src/lib/routes/route-wraper-modules/store-wrapper.module.ts +12 -0
  108. package/src/lib/routes/routing.ts +72 -0
  109. package/src/lib/services/auth.service.ts +16 -0
  110. package/src/lib/services/global-state.service.ts +11 -0
  111. package/src/public-api.ts +64 -0
  112. package/tsconfig.lib.json +14 -0
  113. package/tsconfig.lib.prod.json +10 -0
  114. package/tsconfig.spec.json +14 -0
@@ -0,0 +1,25 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { FooterComponent } from './footer.component';
4
+
5
+ describe('FooterComponent', () => {
6
+ let component: FooterComponent;
7
+ let fixture: ComponentFixture<FooterComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ FooterComponent ]
12
+ })
13
+ .compileComponents();
14
+ });
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(FooterComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -0,0 +1,13 @@
1
+ import { Component, Input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'lib-footer',
5
+ templateUrl: './footer.component.html',
6
+ styleUrls: ['./footer.component.scss'],
7
+ })
8
+ export class FooterComponent {
9
+ @Input() appFooterContainerCSSClass: string = '';
10
+
11
+ currentDateStr: string = new Date().getFullYear().toString();
12
+ constructor() {}
13
+ }
@@ -0,0 +1,27 @@
1
+ <ng-container *ngIf="title$ | async as title">
2
+ <!-- begin::Title -->
3
+ <h1 class="page-heading d-flex text-gray-900 fw-bold fs-3 my-0 flex-column justify-content-center">
4
+ {{ title }}
5
+ <ng-container *ngIf="appPageTitleDescription">
6
+ <ng-container *ngIf="description$ | async as description">
7
+
8
+
9
+ <!--begin::Description-->
10
+ <span class="page-desc text-muted fs-7 fw-semibold" [ngClass]="{'pt-2': appPageTitleDirection === 'column'}">
11
+ <ng-container *ngIf="appPageTitleDirection === 'row'">
12
+ <!--begin::Separator-->
13
+ <span class="h-20px border-1 border-gray-300 border-start ms-3 mx-2"></span>
14
+ <!--end::Separator-->
15
+ </ng-container>
16
+
17
+ {{description}}
18
+ </span>
19
+ <!--end::Description-->
20
+ </ng-container>
21
+
22
+ </ng-container>
23
+
24
+ </h1>
25
+ <!-- end::Title -->
26
+
27
+ </ng-container>
@@ -0,0 +1,4 @@
1
+ :host {
2
+ height: inherit;
3
+ width: inherit;
4
+ }
@@ -0,0 +1,25 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { HeaderMenuComponent } from './header-menu.component';
4
+
5
+ describe('HeaderMenuComponent', () => {
6
+ let component: HeaderMenuComponent;
7
+ let fixture: ComponentFixture<HeaderMenuComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ HeaderMenuComponent ]
12
+ })
13
+ .compileComponents();
14
+ });
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(HeaderMenuComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -0,0 +1,38 @@
1
+ import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';
2
+ import { Observable, Subscription } from 'rxjs';
3
+ import { PageInfoService, PageLink } from 'tango-app-metronics';
4
+
5
+
6
+ @Component({
7
+ selector: 'lib-header-menu',
8
+ templateUrl: './header-menu.component.html',
9
+ styleUrls: ['./header-menu.component.scss'],
10
+ })
11
+ export class HeaderMenuComponent implements OnInit, OnDestroy {
12
+ private unsubscribe: Subscription[] = [];
13
+
14
+ @Input() appPageTitleDirection: string = '';
15
+ @Input() appPageTitleDescription: boolean = true;
16
+
17
+ title$: Observable<string>;
18
+ description$: Observable<string>;
19
+
20
+ constructor(private pageInfo: PageInfoService, private cd:ChangeDetectorRef) {}
21
+
22
+ ngOnInit(): void {
23
+ this.title$ = this.pageInfo.title.asObservable();
24
+ this.description$ = this.pageInfo.description.asObservable();
25
+
26
+ this.title$.subscribe((e)=>{
27
+ this.cd.detectChanges()
28
+ })
29
+ this.description$.subscribe((e)=>{
30
+ this.cd.detectChanges()
31
+ })
32
+ }
33
+
34
+ ngOnDestroy() {
35
+ this.unsubscribe.forEach((sb) => sb.unsubscribe());
36
+ }
37
+ }
38
+
@@ -0,0 +1,90 @@
1
+ <!--begin::Header container-->
2
+ <div class="app-container" id="kt_app_header_container" [ngClass]="headerContainerCssClass">
3
+ <ng-container *ngIf="appSidebarDefaultCollapseDesktopEnabled">
4
+ <div class="app-sidebar-collapse-d-flex align-items-center me-3">
5
+ <!--begin::sidebar toggle-->
6
+ <div class="btn btn-icon w-auto px-0 btn-color-muted btn-active-icon-primary" data-kt-toggle="true"
7
+ data-kt-toggle-target="body" data-kt-toggle-mode="on" data-kt-toggle-name="app-sidebar-collapse">
8
+ <lib-keenicon name="double-right" class="fs-1"></lib-keenicon>
9
+ </div>
10
+ <!--end::sidebar toggle-->
11
+ </div>
12
+ </ng-container>
13
+
14
+ <ng-container *ngIf="appSidebarDisplay">
15
+ <!--begin::sidebar mobile toggle-->
16
+ <div class="d-flex align-items-center d-lg-none ms-n2 me-2" title="Show sidebar menu">
17
+ <div class="btn btn-icon btn-active-color-primary w-35px h-35px" id="kt_app_sidebar_mobile_toggle">
18
+ <lib-keenicon name="abstract-14" class="fs-1"></lib-keenicon>
19
+ </div>
20
+ </div>
21
+ <!--end::sidebar mobile toggle-->
22
+ <!--begin::Mobile logo-->
23
+ <div class="d-flex align-items-center flex-grow-1 flex-lg-grow-0">
24
+ <a routerLink="/dashboard" class="d-lg-none">
25
+ <img alt="Logo" src="./assets/media/logos/default-small.svg" class="h-30px" />
26
+ </a>
27
+ </div>
28
+ <!--end::Mobile logo-->
29
+ </ng-container>
30
+
31
+ <ng-container *ngIf="!appSidebarDisplay">
32
+ <!--begin::Logo-->
33
+ <div class="d-flex align-items-center flex-grow-1 flex-lg-grow-0 me-lg-15">
34
+ <a routerLink="/dashboard">
35
+ <ng-container *ngIf="currentLayoutType === 'dark-header'">
36
+ <img alt="Logo" src="./assets/media/logos/default-dark.svg"
37
+ class="h-20px h-lg-30px app-sidebar-logo-default" />
38
+ </ng-container>
39
+ <ng-container *ngIf="currentLayoutType !== 'dark-header'">
40
+ <img alt="Logo" src="./assets/media/logos/default.svg"
41
+ class="h-20px h-lg-30px app-sidebar-logo-default theme-light-show" />
42
+ <img alt="Logo" src="./assets/media/logos/default-dark.svg"
43
+ class="h-20px h-lg-30px app-sidebar-logo-default theme-dark-show" />
44
+ </ng-container>
45
+ </a>
46
+ </div>
47
+ <!--end::Logo-->
48
+ </ng-container>
49
+
50
+ <!--begin::Header wrapper-->
51
+ <div class="d-flex align-items-stretch justify-content-between flex-lg-grow-1" id="kt_app_header_wrapper">
52
+ <ng-container *ngIf="appHeaderDefaultContent === 'menu' && appHeaderDefaulMenuDisplay">
53
+ <!--begin::Menu wrapper-->
54
+ <div class="
55
+ app-header-menu
56
+ app-header-mobile-drawer
57
+ align-items-stretch
58
+ " data-kt-drawer="true" data-kt-drawer-name="app-header-menu" data-kt-drawer-activate="{default: true, lg: false}"
59
+ data-kt-drawer-overlay="true" data-kt-drawer-width="225px" data-kt-drawer-direction="end"
60
+ data-kt-drawer-toggle="#kt_app_header_menu_toggle" data-kt-swapper="true"
61
+ data-kt-swapper-mode="{default: 'append', lg: 'prepend'}"
62
+ data-kt-swapper-parent="{default: '#kt_app_body', lg: '#kt_app_header_wrapper'}">
63
+ <!--begin::Menu-->
64
+ <lib-header-menu
65
+ appPageTitleDirection = ''
66
+ [appPageTitleDescription] = true
67
+ class="
68
+ menu
69
+ menu-rounded
70
+ menu-column
71
+ menu-lg-row
72
+ my-5
73
+ my-lg-0
74
+ align-items-stretch
75
+ fw-semibold
76
+ px-2 px-lg-0
77
+ " id="kt_app_header_menu" data-kt-menu="true"></lib-header-menu>
78
+ <!--end::Menu-->
79
+ </div>
80
+ <!--end::Menu wrapper-->
81
+ </ng-container>
82
+ <!-- <ng-container *ngIf="appHeaderDefaultContent === 'page-title' && appPageTitleDisplay">
83
+ <app-page-title #ktPageTitle class="page-title d-flex"></app-page-title>
84
+ </ng-container> -->
85
+ <lib-navbar class="app-navbar flex-shrink-0" [appHeaderDefaulMenuDisplay]="appHeaderDefaulMenuDisplay"
86
+ [isRtl]="false"></lib-navbar>
87
+ </div>
88
+ <!--end::Header wrapper-->
89
+ </div>
90
+ <!--end::Header container-->
@@ -0,0 +1,25 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { HeaderComponent } from './header.component';
4
+
5
+ describe('HeaderComponent', () => {
6
+ let component: HeaderComponent;
7
+ let fixture: ComponentFixture<HeaderComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ HeaderComponent ]
12
+ })
13
+ .compileComponents();
14
+ });
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(HeaderComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -0,0 +1,139 @@
1
+ import { Component, OnDestroy, OnInit } from '@angular/core';
2
+ import { NavigationCancel, NavigationEnd, Router } from '@angular/router';
3
+ import { Subscription } from 'rxjs';
4
+ import { ILayout, LayoutType } from 'tango-app-metronics';
5
+ import { LayoutService } from 'tango-app-metronics';
6
+ import { MenuComponent } from 'tango-app-metronics';
7
+
8
+ @Component({
9
+ selector: 'lib-header',
10
+ templateUrl: './header.component.html',
11
+ styleUrls: ['./header.component.scss'],
12
+ })
13
+ export class HeaderComponent implements OnInit, OnDestroy {
14
+ private unsubscribe: Subscription[] = [];
15
+ // Public props
16
+ currentLayoutType: LayoutType | null;
17
+
18
+ appHeaderDisplay: boolean;
19
+ appHeaderDefaultFixedDesktop: boolean;
20
+ appHeaderDefaultFixedMobile: boolean;
21
+
22
+ appHeaderDefaultContainer: 'fixed' | 'fluid';
23
+ headerContainerCssClass: string = '';
24
+ appHeaderDefaultContainerClass: string = '';
25
+
26
+ appHeaderDefaultStacked: boolean;
27
+
28
+ // view
29
+ appSidebarDefaultCollapseDesktopEnabled: boolean;
30
+ appSidebarDisplay: boolean;
31
+ appHeaderDefaultContent: string = '';
32
+ appHeaderDefaulMenuDisplay: boolean;
33
+ appPageTitleDisplay: boolean;
34
+
35
+ constructor(private layout: LayoutService, private router: Router) {
36
+ this.routingChanges();
37
+ }
38
+
39
+ updateProps(config: ILayout) {
40
+ this.appHeaderDisplay = this.layout.getProp(
41
+ 'app.header.display',
42
+ config
43
+ ) as boolean;
44
+ // view
45
+ this.appSidebarDefaultCollapseDesktopEnabled = this.layout.getProp(
46
+ 'app.sidebar.default.collapse.desktop.enabled',
47
+ config
48
+ ) as boolean;
49
+ this.appSidebarDisplay = this.layout.getProp(
50
+ 'app.sidebar.display',
51
+ config
52
+ ) as boolean;
53
+ this.appHeaderDefaultContent = this.layout.getProp(
54
+ 'app.header.default.content',
55
+ config
56
+ ) as string;
57
+ this.appHeaderDefaulMenuDisplay = this.layout.getProp(
58
+ 'app.header.default.menu.display',
59
+ config
60
+ ) as boolean;
61
+ this.appPageTitleDisplay = this.layout.getProp(
62
+ 'app.pageTitle.display',
63
+ config
64
+ ) as boolean;
65
+
66
+ // body attrs and container css classes
67
+ this.appHeaderDefaultFixedDesktop = this.layout.getProp(
68
+ 'app.header.default.fixed.desktop',
69
+ config
70
+ ) as boolean;
71
+ if (this.appHeaderDefaultFixedDesktop) {
72
+ document.body.setAttribute('data-kt-app-header-fixed', 'true');
73
+ }
74
+
75
+ this.appHeaderDefaultFixedMobile = this.layout.getProp(
76
+ 'app.header.default.fixed.mobile',
77
+ config
78
+ ) as boolean;
79
+ if (this.appHeaderDefaultFixedMobile) {
80
+ document.body.setAttribute('data-kt-app-header-fixed-mobile', 'true');
81
+ }
82
+
83
+ this.appHeaderDefaultContainer = this.layout.getProp(
84
+ 'appHeaderDefaultContainer',
85
+ config
86
+ ) as 'fixed' | 'fluid';
87
+ this.headerContainerCssClass =
88
+ this.appHeaderDefaultContainer === 'fixed'
89
+ ? 'container-xxl'
90
+ : 'container-fluid';
91
+
92
+ this.appHeaderDefaultContainerClass = this.layout.getProp(
93
+ 'app.header.default.containerClass',
94
+ config
95
+ ) as string;
96
+ if (this.appHeaderDefaultContainerClass) {
97
+ this.headerContainerCssClass += ` ${this.appHeaderDefaultContainerClass}`;
98
+ }
99
+
100
+ this.appHeaderDefaultStacked = this.layout.getProp(
101
+ 'app.header.default.stacked',
102
+ config
103
+ ) as boolean;
104
+ if (this.appHeaderDefaultStacked) {
105
+ document.body.setAttribute('data-kt-app-header-stacked', 'true');
106
+ }
107
+
108
+ // Primary header
109
+ // Secondary header
110
+ }
111
+
112
+ ngOnInit(): void {
113
+ const subscr = this.layout.layoutConfigSubject
114
+ .asObservable()
115
+ .subscribe((config: ILayout) => {
116
+ this.updateProps(config);
117
+ });
118
+ this.unsubscribe.push(subscr);
119
+ const layoutSubscr = this.layout.currentLayoutTypeSubject
120
+ .asObservable()
121
+ .subscribe((layout) => {
122
+ this.currentLayoutType = layout;
123
+ });
124
+ this.unsubscribe.push(layoutSubscr);
125
+ }
126
+
127
+ routingChanges() {
128
+ const routerSubscription = this.router.events.subscribe((event) => {
129
+ if (event instanceof NavigationEnd || event instanceof NavigationCancel) {
130
+ MenuComponent.reinitialization();
131
+ }
132
+ });
133
+ this.unsubscribe.push(routerSubscription);
134
+ }
135
+
136
+ ngOnDestroy() {
137
+ this.unsubscribe.forEach((sb) => sb.unsubscribe());
138
+ }
139
+ }
@@ -0,0 +1,92 @@
1
+ <!--begin::Search-->
2
+ <div class="app-navbar-item align-items-stretch" [ngClass]="itemClass">
3
+ <!--begin::Search-->
4
+ <div id="kt_header_search" class="header-search d-flex align-items-stretch" data-kt-search-keypress="true"
5
+ data-kt-search-min-length="2" data-kt-search-enter="enter" data-kt-search-layout="menu"
6
+ data-kt-menu-trigger="{default: 'hover'}" data-kt-menu-overflow="false" data-kt-menu-permanent="true"
7
+ data-kt-menu-placement="bottom-end" data-kt-search="true">
8
+ <!--begin::Search toggle-->
9
+ <div class="d-flex align-items-center" data-kt-search-element="toggle" id="kt_header_search_toggle">
10
+ <div [ngClass]="btnClass">
11
+ <lib-keenicon name="magnifier" [class]="btnIconClass"></lib-keenicon>
12
+ </div>
13
+ </div>
14
+ <!--end::Search toggle-->
15
+ <!-- <lib-search-result-inner data-kt-search-element="content" data-kt-menu="true"
16
+ class="menu menu-sub menu-sub-dropdown p-7 w-325px w-md-375px"></lib-search-result-inner> -->
17
+ </div>
18
+
19
+ </div>
20
+ <!--end::Search-->
21
+
22
+ <!--begin::Activities-->
23
+ <div class="app-navbar-item" [ngClass]="itemClass">
24
+ <!--begin::Drawer toggle-->
25
+ <div [ngClass]="btnClass" id="kt_activities_toggle">
26
+ <lib-keenicon name="messages" class="fs-2"></lib-keenicon>
27
+ </div>
28
+ <!--end::Drawer toggle-->
29
+ </div>
30
+ <!--end::Activities-->
31
+
32
+ <!--begin::Notifications-->
33
+ <div class="app-navbar-item" [ngClass]="itemClass">
34
+ <!--begin::Menu- wrapper-->
35
+ <div [ngClass]="btnClass" data-kt-menu-trigger="{default: 'click', lg: 'hover'}" data-kt-menu-attach="parent"
36
+ data-kt-menu-placement="bottom-end">
37
+ <lib-keenicon name="notification-status" class="fs-2"></lib-keenicon>
38
+ </div>
39
+ <!-- <lib-notifications-inner></lib-notifications-inner> -->
40
+ <!--end::Menu wrapper-->
41
+ </div>
42
+ <!--end::Notifications-->
43
+
44
+ <!--begin::Chat-->
45
+ <div class="app-navbar-item" [ngClass]="itemClass">
46
+ <div [ngClass]="btnClass" class="position-relative" id="kt_drawer_chat_toggle">
47
+ <lib-keenicon name="message-text-2" class="fs-2"></lib-keenicon>
48
+ <span
49
+ class="bullet bullet-dot bg-success h-6px w-6px position-absolute translate-middle top-0 start-50 animation-blink">
50
+ </span>
51
+ </div>
52
+ </div>
53
+ <!--end::Chat-->
54
+
55
+ <!--begin::Quick links-->
56
+ <div class="app-navbar-item" [ngClass]="itemClass">
57
+ <!--begin::Menu wrapper-->
58
+ <div [ngClass]="btnClass" data-kt-menu-trigger="click" data-kt-menu-attach="parent"
59
+ data-kt-menu-placement="bottom-end">
60
+ <lib-keenicon name="element-11" class="fs-2"></lib-keenicon>
61
+ </div>
62
+ <!--end::Menu wrapper-->
63
+ <!-- <lib-quick-links-inner></lib-quick-links-inner> -->
64
+ </div>
65
+ <!--end::Quick links-->
66
+
67
+ <!--begin::Theme mode-->
68
+ <div class="app-navbar-item" [ngClass]="itemClass">
69
+ <!-- <lib-theme-mode-switcher [toggleBtnClass]="btnClass" toggleBtnClass="{`btn-active-light-primary btn-custom ${toolbarButtonHeightClass}`}"></lib-theme-mode-switcher> -->
70
+ </div>
71
+ <!--end::Theme mode-->
72
+
73
+ <!--begin::User menu-->
74
+ <div class="app-navbar-item" [ngClass]="itemClass">
75
+ <!--begin::Menu wrapper-->
76
+ <div class="cursor-pointer symbol" [ngClass]="userAvatarClass" data-kt-menu-trigger="{default: 'click'}" data-kt-menu-attach="parent" data-kt-menu-placement="bottom-end">
77
+ <img src="./assets/media/avatars/300-3.jpg" />
78
+ </div>
79
+ <!-- <lib-user-inner data-kt-menu='true'></lib-user-inner> -->
80
+ <!--end::Menu wrapper-->
81
+ </div>
82
+ <!--end::User menu-->
83
+
84
+ <!--begin::Header menu toggle-->
85
+ <ng-container *ngIf="appHeaderDefaulMenuDisplay">
86
+ <div class="app-navbar-item d-lg-none ms-2 me-n3" title="Show header menu">
87
+ <div class="btn btn-icon btn-active-color-primary w-35px h-35px" id="kt_app_header_menu_toggle">
88
+ <lib-keenicon name="element-4" class="fs-1" [ngClass]="btnIconClass"></lib-keenicon>
89
+ </div>
90
+ </div>
91
+ </ng-container>
92
+ <!--end::Header menu toggle-->
@@ -0,0 +1,23 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { NavbarComponent } from './navbar.component';
4
+
5
+ describe('NavbarComponent', () => {
6
+ let component: NavbarComponent;
7
+ let fixture: ComponentFixture<NavbarComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ NavbarComponent ]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(NavbarComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
@@ -0,0 +1,20 @@
1
+ import { Component, Input, OnInit } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'lib-navbar',
5
+ templateUrl: './navbar.component.html',
6
+ styleUrls: ['./navbar.component.scss'],
7
+ })
8
+ export class NavbarComponent implements OnInit {
9
+ @Input() appHeaderDefaulMenuDisplay: boolean;
10
+ @Input() isRtl: boolean;
11
+
12
+ itemClass: string = 'ms-1 ms-lg-3';
13
+ btnClass: string = 'btn btn-icon btn-custom btn-icon-muted btn-active-light btn-active-color-primary w-35px h-35px w-md-40px h-md-40px';
14
+ userAvatarClass: string = 'symbol-35px symbol-md-40px';
15
+ btnIconClass: string = 'fs-2 fs-md-1';
16
+
17
+ constructor() {}
18
+
19
+ ngOnInit(): void {}
20
+ }
@@ -0,0 +1,32 @@
1
+ <ng-container *ngIf="title$ | async as title">
2
+
3
+ <ng-container *ngIf="appPageTitleBreadcrumb">
4
+ <ng-container *ngIf="bc$ | async as _bc">
5
+ <!-- <ng-container *ngIf="_bc.length > 0"> -->
6
+ <ng-container *ngIf="appPageTitleDirection === 'row'">
7
+ <span class="h-20px border-gray-300 border-start mx-4"></span>
8
+ </ng-container>
9
+ <!--begin::Breadcrumb-->
10
+
11
+ <ul class="breadcrumb breadcrumb-separatorless fw-semibold fs-7 my-0"
12
+ [ngClass]="{'pt-1': appPageTitleDirection === 'column'}">
13
+ <li *ngFor="let bc of _bc" class="breadcrumb-item"
14
+ [ngClass]="!bc.isSeparator && bc.isActive ? 'text-gray-900' : ''"
15
+ [ngClass]="!bc.isSeparator && !bc.isActive ? 'text-muted' : ''">
16
+ <ng-container *ngIf="!bc.isSeparator">
17
+ <a class="text-muted text-hover-primary" [routerLink]="bc.path">
18
+ {{ bc.title }}
19
+ </a>
20
+ </ng-container>
21
+ <ng-container *ngIf="bc.isSeparator">
22
+ <span class="bullet bg-gray-200 w-5px h-2px"></span>
23
+ </ng-container>
24
+ </li>
25
+ <li class="breadcrumb-item text-gray-900">{{ title }}</li>
26
+ </ul>
27
+ <!--end::Breadcrumb-->
28
+
29
+ <!-- </ng-container> -->
30
+ </ng-container>
31
+ </ng-container>
32
+ </ng-container>
@@ -0,0 +1,40 @@
1
+ import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';
2
+ import { Observable, Subscription } from 'rxjs';
3
+ import { PageInfoService, PageLink } from 'tango-app-metronics';
4
+
5
+ @Component({
6
+ selector: 'lib-page-title',
7
+ templateUrl: './page-title.component.html',
8
+ })
9
+ export class PageTitleComponent implements OnInit, OnDestroy {
10
+ private unsubscribe: Subscription[] = [];
11
+
12
+ @Input() appPageTitleDirection: string = '';
13
+ @Input() appPageTitleBreadcrumb: boolean;
14
+ @Input() appPageTitleDescription: boolean;
15
+
16
+ title$: Observable<string>;
17
+ description$: Observable<string>;
18
+ bc$: Observable<Array<PageLink>>;
19
+
20
+ constructor(private pageInfo: PageInfoService, private cd:ChangeDetectorRef) {}
21
+
22
+ ngOnInit(): void {
23
+ this.title$ = this.pageInfo.title.asObservable();
24
+ this.description$ = this.pageInfo.description.asObservable();
25
+ this.bc$ = this.pageInfo.breadcrumbs.asObservable();
26
+ this.title$.subscribe((e)=>{
27
+ this.cd.detectChanges()
28
+ })
29
+ this.description$.subscribe((e)=>{
30
+ this.cd.detectChanges()
31
+ })
32
+ this.bc$.subscribe((e)=>{
33
+ this.cd.detectChanges()
34
+ })
35
+ }
36
+
37
+ ngOnDestroy() {
38
+ this.unsubscribe.forEach((sb) => sb.unsubscribe());
39
+ }
40
+ }