eiu-app-kit 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -88
- package/esm2020/lib/footer/eiu-app-footer.component.mjs +3 -4
- package/esm2020/lib/user-menu/eiu-app-user-menu.component.mjs +87 -0
- package/esm2020/lib/user-menu/eiu-app-user-menu.module.mjs +22 -0
- package/esm2020/lib/user-menu/eiu-user-menu.model.mjs +2 -0
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/eiu-app-kit.mjs +107 -5
- package/fesm2015/eiu-app-kit.mjs.map +1 -1
- package/fesm2020/eiu-app-kit.mjs +106 -5
- package/fesm2020/eiu-app-kit.mjs.map +1 -1
- package/lib/footer/eiu-app-footer.component.d.ts +0 -1
- package/lib/user-menu/eiu-app-user-menu.component.d.ts +26 -0
- package/lib/user-menu/eiu-app-user-menu.module.d.ts +12 -0
- package/lib/user-menu/eiu-user-menu.model.d.ts +12 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
package/README.md
CHANGED
|
@@ -1,88 +1,105 @@
|
|
|
1
|
-
# eiu-app-kit
|
|
2
|
-
|
|
3
|
-
Thư viện Angular dùng chung cho các SPA EIU: **launcher ứng dụng trên header**, **tin Redmine / feature news**, popup “Có gì mới”.
|
|
4
|
-
|
|
5
|
-
## Cài qua npm
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install eiu-app-kit
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Ứng dụng Angular 15+, cùng major với peer dependencies của package.
|
|
12
|
-
|
|
13
|
-
## Cấu hình `AppModule` (hoặc `bootstrapApplication` + `importProvidersFrom`)
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
import { HttpClientModule } from '@angular/common/http';
|
|
17
|
-
import {
|
|
18
|
-
EIU_APP_API_BASE_URL,
|
|
19
|
-
EIU_APP_LAUNCHER_MENU_LOADER
|
|
20
|
-
} from 'eiu-app-kit';
|
|
21
|
-
import { environment } from './environments/environment';
|
|
22
|
-
// import { ProjectService } from '...';
|
|
23
|
-
|
|
24
|
-
@NgModule({
|
|
25
|
-
imports: [
|
|
26
|
-
HttpClientModule,
|
|
27
|
-
// ...
|
|
28
|
-
],
|
|
29
|
-
providers: [
|
|
30
|
-
{ provide: EIU_APP_API_BASE_URL, useValue: environment.API_EIU_APP },
|
|
31
|
-
{
|
|
32
|
-
provide: EIU_APP_LAUNCHER_MENU_LOADER,
|
|
33
|
-
useFactory: (project: ProjectService) => ({
|
|
34
|
-
loadItems: () => project.getAllProject()
|
|
35
|
-
}),
|
|
36
|
-
deps: [ProjectService]
|
|
37
|
-
}
|
|
38
|
-
]
|
|
39
|
-
})
|
|
40
|
-
export class AppModule {}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Kiểu phần tử từ `loadItems()` phải khớp `EiuAppLauncherMenuItem` (`name_VI`, `imageUrl`, `link`, `sortOrder`).
|
|
44
|
-
|
|
45
|
-
## Module layout (ví dụ `ThemeModule`)
|
|
46
|
-
|
|
47
|
-
```ts
|
|
48
|
-
import {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
1
|
+
# eiu-app-kit
|
|
2
|
+
|
|
3
|
+
Thư viện Angular dùng chung cho các SPA EIU: **launcher ứng dụng trên header**, **tin Redmine / feature news**, popup “Có gì mới”.
|
|
4
|
+
|
|
5
|
+
## Cài qua npm
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install eiu-app-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Ứng dụng Angular 15+, cùng major với peer dependencies của package.
|
|
12
|
+
|
|
13
|
+
## Cấu hình `AppModule` (hoặc `bootstrapApplication` + `importProvidersFrom`)
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { HttpClientModule } from '@angular/common/http';
|
|
17
|
+
import {
|
|
18
|
+
EIU_APP_API_BASE_URL,
|
|
19
|
+
EIU_APP_LAUNCHER_MENU_LOADER
|
|
20
|
+
} from 'eiu-app-kit';
|
|
21
|
+
import { environment } from './environments/environment';
|
|
22
|
+
// import { ProjectService } from '...';
|
|
23
|
+
|
|
24
|
+
@NgModule({
|
|
25
|
+
imports: [
|
|
26
|
+
HttpClientModule,
|
|
27
|
+
// ...
|
|
28
|
+
],
|
|
29
|
+
providers: [
|
|
30
|
+
{ provide: EIU_APP_API_BASE_URL, useValue: environment.API_EIU_APP },
|
|
31
|
+
{
|
|
32
|
+
provide: EIU_APP_LAUNCHER_MENU_LOADER,
|
|
33
|
+
useFactory: (project: ProjectService) => ({
|
|
34
|
+
loadItems: () => project.getAllProject()
|
|
35
|
+
}),
|
|
36
|
+
deps: [ProjectService]
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
})
|
|
40
|
+
export class AppModule {}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Kiểu phần tử từ `loadItems()` phải khớp `EiuAppLauncherMenuItem` (`name_VI`, `imageUrl`, `link`, `sortOrder`).
|
|
44
|
+
|
|
45
|
+
## Module layout (ví dụ `ThemeModule`)
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import {
|
|
49
|
+
EiuAppFeatureNewsModule,
|
|
50
|
+
EiuAppLauncherModule,
|
|
51
|
+
EiuAppUserMenuModule
|
|
52
|
+
} from 'eiu-app-kit';
|
|
53
|
+
|
|
54
|
+
@NgModule({
|
|
55
|
+
imports: [CommonModule, EiuAppFeatureNewsModule, EiuAppLauncherModule, EiuAppUserMenuModule]
|
|
56
|
+
})
|
|
57
|
+
export class ThemeModule {}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Template header / layout
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<app-eiu-app-launcher (sidebarToggle)="onToggleMenuSidebar()"></app-eiu-app-launcher>
|
|
64
|
+
<app-eiu-user-menu
|
|
65
|
+
[profile]="{ fullName: user.fullName, email: user.email, picture: user.picture }"
|
|
66
|
+
(changePassword)="changePassword()"
|
|
67
|
+
(logout)="logout()"
|
|
68
|
+
></app-eiu-user-menu>
|
|
69
|
+
<app-feature-news-dialog></app-feature-news-dialog>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`sidebarToggle`: host tự xử lý (NgRx, v.v.).
|
|
73
|
+
|
|
74
|
+
## User menu component
|
|
75
|
+
|
|
76
|
+
`app-eiu-user-menu` không phụ thuộc Keycloak, TokenService hay translate pipe.
|
|
77
|
+
|
|
78
|
+
- Host truyền dữ liệu qua `profile: EiuUserMenuProfile`.
|
|
79
|
+
- Host tự xử lý logic qua events `(changePassword)` và `(logout)`.
|
|
80
|
+
- Có thể đổi label bằng `changePasswordLabel`, `logoutLabel`.
|
|
81
|
+
|
|
82
|
+
## Feature news
|
|
83
|
+
|
|
84
|
+
Inject `FeatureNewsService`:
|
|
85
|
+
|
|
86
|
+
- `checkAndShowFeatureNews(userId, projectIdentifier)` — khi có tin mới.
|
|
87
|
+
- `showLatestFeatureNewsManually(userId, projectIdentifier)` — mở thủ công.
|
|
88
|
+
|
|
89
|
+
Hằng số mặc định project Redmine: `FEATURE_NEWS_REDMINE_PROJECT_IDENTIFIER`.
|
|
90
|
+
|
|
91
|
+
Khi logout có `localStorage.clear()`, cân nhắc giữ key prefix `FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX`.
|
|
92
|
+
|
|
93
|
+
## Monorepo (path mapping, không publish)
|
|
94
|
+
|
|
95
|
+
Trong `tsconfig` của app:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
"paths": {
|
|
99
|
+
"eiu-app-kit": ["../projects/eiu-app-kit/src/public-api.ts"]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Public API
|
|
104
|
+
|
|
105
|
+
Xem `src/public-api.ts`: modules, services, models, `EIU_APP_API_BASE_URL`, `EIU_APP_LAUNCHER_MENU_LOADER`.
|
|
@@ -7,7 +7,6 @@ export class EiuAppFooterComponent {
|
|
|
7
7
|
this.companyName = 'IT - EIU';
|
|
8
8
|
this.companyUrl = 'https://sites.google.com/eiu.edu.vn/oit/';
|
|
9
9
|
this.allRightsText = 'All rights reserved.';
|
|
10
|
-
/** Nhãn cạnh số phiên bản (ví dụ "Version"). */
|
|
11
10
|
this.versionLabel = 'Version';
|
|
12
11
|
this.newFeatureClick = new EventEmitter();
|
|
13
12
|
}
|
|
@@ -17,10 +16,10 @@ export class EiuAppFooterComponent {
|
|
|
17
16
|
}
|
|
18
17
|
}
|
|
19
18
|
EiuAppFooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
20
|
-
EiuAppFooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppFooterComponent, selector: "app-eiu-app-footer", inputs: { appVersion: "appVersion", copyrightYear: "copyrightYear", companyName: "companyName", companyUrl: "companyUrl", allRightsText: "allRightsText", versionLabel: "versionLabel" }, outputs: { newFeatureClick: "newFeatureClick" }, ngImport: i0, template: "<div class=\"main-footer\">\r\n <div class=\"
|
|
19
|
+
EiuAppFooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppFooterComponent, selector: "app-eiu-app-footer", inputs: { appVersion: "appVersion", copyrightYear: "copyrightYear", companyName: "companyName", companyUrl: "companyUrl", allRightsText: "allRightsText", versionLabel: "versionLabel" }, outputs: { newFeatureClick: "newFeatureClick" }, ngImport: i0, template: "<div class=\"main-footer\">\r\n <div class=\"footer-bar\">\r\n <div class=\"footer-bar__copy\">\r\n <span>Copyright \u00A9 {{ copyrightYear }}</span>\r\n <a\r\n class=\"footer-bar__link\"\r\n href=\"https://sites.google.com/eiu.edu.vn/oit/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {{ companyName }}\r\n </a>\r\n <span>. {{ allRightsText }}</span>\r\n </div>\r\n \r\n <div class=\"footer-bar__version\">\r\n <button\r\n type=\"button\"\r\n class=\"footer-version-chip-wrap\"\r\n (click)=\"onNewFeatureDialogClick($event)\"\r\n [attr.aria-label]=\"\r\n 'Application version ' + appVersion + '. Nh\u1EA5n \u0111\u1EC3 sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard'\r\n \"\r\n title=\"Sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard\"\r\n >\r\n <div class=\"footer-version-chip\">\r\n <span class=\"footer-radar\" aria-hidden=\"true\">\r\n <span class=\"footer-radar__sweep\"></span>\r\n <svg class=\"footer-radar__dot\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">\r\n <circle class=\"footer-radar__dot-shape\" cx=\"12\" cy=\"12\" r=\"3.25\" />\r\n </svg>\r\n </span>\r\n <div class=\"footer-version\">\r\n <span class=\"footer-version__label\">{{ versionLabel }}</span>\r\n <span class=\"footer-version__sep\" aria-hidden=\"true\">\u00B7</span>\r\n <span class=\"footer-version__value\" translate=\"no\">{{ appVersion }}</span>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block}:host.main-footer{display:block;padding:.65rem 1rem;background:#fff;border-top:1px solid #e5e7eb;color:#6b7280;font-size:.8125rem;line-height:1.45}.color-eiu-primary{color:#174168!important}.footer-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem}.footer-bar__copy{color:#6b7280}.footer-bar__link{color:var(--color-eiu-primary);font-weight:600;text-decoration:none;margin:0 .15em;&:hover{text-decoration:underline}&:focus-visible{outline:2px solid #2563eb;outline-offset:2px;border-radius:2px}}.footer-bar__version{margin-left:auto;display:inline-flex;align-items:center}.footer-version-chip-wrap{--footer-chip-duration: 2.8s;position:relative;display:inline-flex;padding:3px;border:none;border-radius:11px;overflow:hidden;font:inherit;color:inherit;line-height:inherit;cursor:pointer;background:transparent;box-shadow:0 2px 14px #0ea5e92e;transition:transform .15s ease,box-shadow .15s ease;&:hover{transform:translateY(-1px);box-shadow:0 3px 16px #0ea5e942}&:active{transform:translateY(0)}&:focus{outline:none}&:focus-visible{outline:2px solid var(--color-eiu-primary);outline-offset:3px}}.footer-version-chip-wrap:before{content:\"\";position:absolute;left:50%;top:50%;width:220%;height:220%;margin-left:-110%;margin-top:-110%;transform-origin:center center;backface-visibility:hidden;will-change:transform;background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 228deg,color-mix(in srgb,var(--color-eiu-primary) 32%,transparent) 242deg,color-mix(in srgb,var(--color-eiu-primary) 62%,#ffffff) 256deg,var(--color-eiu-primary) 274deg,color-mix(in srgb,var(--color-eiu-primary) 92%,#334155) 292deg,color-mix(in srgb,var(--color-eiu-primary) 48%,#ffffff) 306deg,color-mix(in srgb,var(--color-eiu-primary) 26%,transparent) 322deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 342deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 360deg);animation:footer-chip-beam-spin var(--footer-chip-duration) linear infinite}.footer-version-chip{position:relative;z-index:1;display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .45rem .2rem .3rem;border-radius:8px;border:none;background:#fafafa}@keyframes footer-chip-beam-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.footer-radar{position:relative;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:50%;overflow:hidden;background:transparent}.footer-radar__sweep{position:absolute;inset:-42%;border-radius:50%;background:conic-gradient(from 0deg,transparent 0deg,transparent 218deg,rgba(254,202,202,.55) 232deg,rgba(248,113,113,.9) 255deg,rgba(239,68,68,.95) 278deg,rgba(220,38,38,.98) 302deg,rgba(185,28,28,.75) 330deg,rgba(254,226,226,.65) 360deg);animation:footer-radar-spin 2.8s linear infinite}.footer-radar__dot{position:absolute;z-index:1;left:50%;top:50%;width:46%;height:46%;transform:translate(-50%,-50%);pointer-events:none;display:block;color:#ef4444;filter:drop-shadow(0 0 2px rgba(220,38,38,.85)) drop-shadow(0 0 3px rgba(248,113,113,.9))}.footer-radar__dot-shape{fill:currentColor}.footer-version{display:inline-flex;align-items:baseline;gap:.28rem;min-width:0;line-height:1.2}.footer-version__label{font-size:.625rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#9ca3af;white-space:nowrap}.footer-version__sep{color:#d1d5db;font-weight:600;-webkit-user-select:none;user-select:none}.footer-version__value{font-family:ui-monospace,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:600;color:#334155;letter-spacing:-.02em;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes footer-radar-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.footer-version-chip-wrap{box-shadow:0 1px 12px #3b82f629}.footer-version-chip-wrap:before{animation:none;will-change:auto;transform:rotate(52deg);background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 235deg,var(--color-eiu-primary) 258deg,color-mix(in srgb,var(--color-eiu-primary) 58%,#ffffff) 278deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 315deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 360deg)}.footer-radar__sweep{animation:none;background:conic-gradient(from 180deg,rgba(254,202,202,.55) 0deg,rgba(248,113,113,.75) 55deg,rgba(239,68,68,.85) 105deg,rgba(220,38,38,.8) 155deg,rgba(185,28,28,.55) 200deg,transparent 220deg,transparent 360deg)}}@media (max-width: 575.98px){.footer-bar__version{margin-left:0}}\n"] });
|
|
21
20
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFooterComponent, decorators: [{
|
|
22
21
|
type: Component,
|
|
23
|
-
args: [{ selector: 'app-eiu-app-footer', template: "<div class=\"main-footer\">\r\n <div class=\"
|
|
22
|
+
args: [{ selector: 'app-eiu-app-footer', template: "<div class=\"main-footer\">\r\n <div class=\"footer-bar\">\r\n <div class=\"footer-bar__copy\">\r\n <span>Copyright \u00A9 {{ copyrightYear }}</span>\r\n <a\r\n class=\"footer-bar__link\"\r\n href=\"https://sites.google.com/eiu.edu.vn/oit/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {{ companyName }}\r\n </a>\r\n <span>. {{ allRightsText }}</span>\r\n </div>\r\n \r\n <div class=\"footer-bar__version\">\r\n <button\r\n type=\"button\"\r\n class=\"footer-version-chip-wrap\"\r\n (click)=\"onNewFeatureDialogClick($event)\"\r\n [attr.aria-label]=\"\r\n 'Application version ' + appVersion + '. Nh\u1EA5n \u0111\u1EC3 sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard'\r\n \"\r\n title=\"Sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard\"\r\n >\r\n <div class=\"footer-version-chip\">\r\n <span class=\"footer-radar\" aria-hidden=\"true\">\r\n <span class=\"footer-radar__sweep\"></span>\r\n <svg class=\"footer-radar__dot\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">\r\n <circle class=\"footer-radar__dot-shape\" cx=\"12\" cy=\"12\" r=\"3.25\" />\r\n </svg>\r\n </span>\r\n <div class=\"footer-version\">\r\n <span class=\"footer-version__label\">{{ versionLabel }}</span>\r\n <span class=\"footer-version__sep\" aria-hidden=\"true\">\u00B7</span>\r\n <span class=\"footer-version__value\" translate=\"no\">{{ appVersion }}</span>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block}:host.main-footer{display:block;padding:.65rem 1rem;background:#fff;border-top:1px solid #e5e7eb;color:#6b7280;font-size:.8125rem;line-height:1.45}.color-eiu-primary{color:#174168!important}.footer-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem}.footer-bar__copy{color:#6b7280}.footer-bar__link{color:var(--color-eiu-primary);font-weight:600;text-decoration:none;margin:0 .15em;&:hover{text-decoration:underline}&:focus-visible{outline:2px solid #2563eb;outline-offset:2px;border-radius:2px}}.footer-bar__version{margin-left:auto;display:inline-flex;align-items:center}.footer-version-chip-wrap{--footer-chip-duration: 2.8s;position:relative;display:inline-flex;padding:3px;border:none;border-radius:11px;overflow:hidden;font:inherit;color:inherit;line-height:inherit;cursor:pointer;background:transparent;box-shadow:0 2px 14px #0ea5e92e;transition:transform .15s ease,box-shadow .15s ease;&:hover{transform:translateY(-1px);box-shadow:0 3px 16px #0ea5e942}&:active{transform:translateY(0)}&:focus{outline:none}&:focus-visible{outline:2px solid var(--color-eiu-primary);outline-offset:3px}}.footer-version-chip-wrap:before{content:\"\";position:absolute;left:50%;top:50%;width:220%;height:220%;margin-left:-110%;margin-top:-110%;transform-origin:center center;backface-visibility:hidden;will-change:transform;background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 228deg,color-mix(in srgb,var(--color-eiu-primary) 32%,transparent) 242deg,color-mix(in srgb,var(--color-eiu-primary) 62%,#ffffff) 256deg,var(--color-eiu-primary) 274deg,color-mix(in srgb,var(--color-eiu-primary) 92%,#334155) 292deg,color-mix(in srgb,var(--color-eiu-primary) 48%,#ffffff) 306deg,color-mix(in srgb,var(--color-eiu-primary) 26%,transparent) 322deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 342deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 360deg);animation:footer-chip-beam-spin var(--footer-chip-duration) linear infinite}.footer-version-chip{position:relative;z-index:1;display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .45rem .2rem .3rem;border-radius:8px;border:none;background:#fafafa}@keyframes footer-chip-beam-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.footer-radar{position:relative;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:50%;overflow:hidden;background:transparent}.footer-radar__sweep{position:absolute;inset:-42%;border-radius:50%;background:conic-gradient(from 0deg,transparent 0deg,transparent 218deg,rgba(254,202,202,.55) 232deg,rgba(248,113,113,.9) 255deg,rgba(239,68,68,.95) 278deg,rgba(220,38,38,.98) 302deg,rgba(185,28,28,.75) 330deg,rgba(254,226,226,.65) 360deg);animation:footer-radar-spin 2.8s linear infinite}.footer-radar__dot{position:absolute;z-index:1;left:50%;top:50%;width:46%;height:46%;transform:translate(-50%,-50%);pointer-events:none;display:block;color:#ef4444;filter:drop-shadow(0 0 2px rgba(220,38,38,.85)) drop-shadow(0 0 3px rgba(248,113,113,.9))}.footer-radar__dot-shape{fill:currentColor}.footer-version{display:inline-flex;align-items:baseline;gap:.28rem;min-width:0;line-height:1.2}.footer-version__label{font-size:.625rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#9ca3af;white-space:nowrap}.footer-version__sep{color:#d1d5db;font-weight:600;-webkit-user-select:none;user-select:none}.footer-version__value{font-family:ui-monospace,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:600;color:#334155;letter-spacing:-.02em;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes footer-radar-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.footer-version-chip-wrap{box-shadow:0 1px 12px #3b82f629}.footer-version-chip-wrap:before{animation:none;will-change:auto;transform:rotate(52deg);background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 235deg,var(--color-eiu-primary) 258deg,color-mix(in srgb,var(--color-eiu-primary) 58%,#ffffff) 278deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 315deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 360deg)}.footer-radar__sweep{animation:none;background:conic-gradient(from 180deg,rgba(254,202,202,.55) 0deg,rgba(248,113,113,.75) 55deg,rgba(239,68,68,.85) 105deg,rgba(220,38,38,.8) 155deg,rgba(185,28,28,.55) 200deg,transparent 220deg,transparent 360deg)}}@media (max-width: 575.98px){.footer-bar__version{margin-left:0}}\n"] }]
|
|
24
23
|
}], propDecorators: { appVersion: [{
|
|
25
24
|
type: Input
|
|
26
25
|
}], copyrightYear: [{
|
|
@@ -36,4 +35,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
36
35
|
}], newFeatureClick: [{
|
|
37
36
|
type: Output
|
|
38
37
|
}] } });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPdkUsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQU1ZLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsa0JBQWEsR0FBRyxNQUFNLENBQUM7UUFFdkIsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFFekIsZUFBVSxHQUFHLDBDQUEwQyxDQUFDO1FBRXhELGtCQUFhLEdBQUcsc0JBQXNCLENBQUM7UUFFdkMsaUJBQVksR0FBRyxTQUFTLENBQUM7UUFFZixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FNaEU7SUFKRSx1QkFBdUIsQ0FBQyxLQUFZO1FBQ2pDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7O21IQWxCUyxxQkFBcUI7dUdBQXJCLHFCQUFxQixxU0NQbEMsbzFEQXlDTTs0RkRsQ08scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNHLG9CQUFvQjs4QkFLckIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRWEsZUFBZTtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgc2VsZWN0b3I6ICdhcHAtZWl1LWFwcC1mb290ZXInLFxyXG4gICB0ZW1wbGF0ZVVybDogJy4vZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICBzdHlsZVVybHM6IFsnLi9laXUtYXBwLWZvb3Rlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVpdUFwcEZvb3RlckNvbXBvbmVudCB7XHJcbiAgIEBJbnB1dCgpIGFwcFZlcnNpb24gPSAnJztcclxuXHJcbiAgIEBJbnB1dCgpIGNvcHlyaWdodFllYXIgPSAnMjAyMyc7XHJcblxyXG4gICBASW5wdXQoKSBjb21wYW55TmFtZSA9ICdJVCAtIEVJVSc7XHJcblxyXG4gICBASW5wdXQoKSBjb21wYW55VXJsID0gJ2h0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9laXUuZWR1LnZuL29pdC8nO1xyXG5cclxuICAgQElucHV0KCkgYWxsUmlnaHRzVGV4dCA9ICdBbGwgcmlnaHRzIHJlc2VydmVkLic7XHJcblxyXG4gICBASW5wdXQoKSB2ZXJzaW9uTGFiZWwgPSAnVmVyc2lvbic7XHJcblxyXG4gICBAT3V0cHV0KCkgcmVhZG9ubHkgbmV3RmVhdHVyZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgb25OZXdGZWF0dXJlRGlhbG9nQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMubmV3RmVhdHVyZUNsaWNrLmVtaXQoKTtcclxuICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtYWluLWZvb3RlclwiPlxyXG4gICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJhclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJhcl9fY29weVwiPlxyXG4gICAgICAgICA8c3Bhbj5Db3B5cmlnaHQgwqkge3sgY29weXJpZ2h0WWVhciB9fTwvc3Bhbj5cclxuICAgICAgICAgPGFcclxuICAgICAgICAgICAgY2xhc3M9XCJmb290ZXItYmFyX19saW5rXCJcclxuICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9laXUuZWR1LnZuL29pdC9cIlxyXG4gICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb21wYW55TmFtZSB9fVxyXG4gICAgICAgICA8L2E+XHJcbiAgICAgICAgIDxzcGFuPi4ge3sgYWxsUmlnaHRzVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgIFxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJhcl9fdmVyc2lvblwiPlxyXG4gICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZvb3Rlci12ZXJzaW9uLWNoaXAtd3JhcFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5ld0ZlYXR1cmVEaWFsb2dDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcclxuICAgICAgICAgICAgICAgJ0FwcGxpY2F0aW9uIHZlcnNpb24gJyArIGFwcFZlcnNpb24gKyAnLiBOaOG6pW4gxJHhu4Mgc2FvIGNow6lwIHBoacOqbiBi4bqjbiB2w6BvIGNsaXBib2FyZCdcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJTYW8gY2jDqXAgcGhpw6puIGLhuqNuIHbDoG8gY2xpcGJvYXJkXCJcclxuICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLXZlcnNpb24tY2hpcFwiPlxyXG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvb3Rlci1yYWRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvb3Rlci1yYWRhcl9fc3dlZXBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJmb290ZXItcmFkYXJfX2RvdFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmb2N1c2FibGU9XCJmYWxzZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiZm9vdGVyLXJhZGFyX19kb3Qtc2hhcGVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzLjI1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci12ZXJzaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9vdGVyLXZlcnNpb25fX2xhYmVsXCI+e3sgdmVyc2lvbkxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvb3Rlci12ZXJzaW9uX19zZXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7Ctzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb290ZXItdmVyc2lvbl9fdmFsdWVcIiB0cmFuc2xhdGU9XCJub1wiPnt7IGFwcFZlcnNpb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export class EiuAppUserMenuComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
/** Thông tin user — host bind từ service token / session. */
|
|
7
|
+
this.profile = null;
|
|
8
|
+
/** Ảnh mặc định khi `picture` lỗi hoặc trống (đường dẫn trong assets của host). */
|
|
9
|
+
this.fallbackAvatar = 'assets/img/icons/default-profile.png';
|
|
10
|
+
this.changePasswordLabel = 'Đổi mật khẩu';
|
|
11
|
+
this.logoutLabel = 'Đăng xuất';
|
|
12
|
+
/** Host xử lý (ví dụ redirect SSO đổi mật khẩu). */
|
|
13
|
+
this.changePassword = new EventEmitter();
|
|
14
|
+
/** Host xử lý (ví dụ Keycloak logout + clear storage). */
|
|
15
|
+
this.logout = new EventEmitter();
|
|
16
|
+
this.menuOpen = false;
|
|
17
|
+
}
|
|
18
|
+
onTriggerClick(event) {
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
event.stopPropagation();
|
|
21
|
+
this.menuOpen = !this.menuOpen;
|
|
22
|
+
}
|
|
23
|
+
onChangePasswordClick(event) {
|
|
24
|
+
event.preventDefault();
|
|
25
|
+
this.changePassword.emit();
|
|
26
|
+
this.menuOpen = false;
|
|
27
|
+
}
|
|
28
|
+
onLogoutClick(event) {
|
|
29
|
+
event.preventDefault();
|
|
30
|
+
this.logout.emit();
|
|
31
|
+
this.menuOpen = false;
|
|
32
|
+
}
|
|
33
|
+
onAvatarError(event) {
|
|
34
|
+
const img = event.target;
|
|
35
|
+
if (img && img.src !== this._absoluteFallback()) {
|
|
36
|
+
img.src = this.fallbackAvatar;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
onDocumentClick(event) {
|
|
40
|
+
if (!this.menuOpen) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const root = this._root?.nativeElement;
|
|
44
|
+
if (root && !root.contains(event.target)) {
|
|
45
|
+
this.menuOpen = false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
onEscape() {
|
|
49
|
+
this.menuOpen = false;
|
|
50
|
+
}
|
|
51
|
+
_absoluteFallback() {
|
|
52
|
+
try {
|
|
53
|
+
return new URL(this.fallbackAvatar, window.location.origin).href;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return this.fallbackAvatar;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
EiuAppUserMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
61
|
+
EiuAppUserMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppUserMenuComponent, selector: "app-eiu-user-menu", inputs: { profile: "profile", fallbackAvatar: "fallbackAvatar", changePasswordLabel: "changePasswordLabel", logoutLabel: "logoutLabel" }, outputs: { changePassword: "changePassword", logout: "logout" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" } }, viewQueries: [{ propertyName: "_root", first: true, predicate: ["root"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"eiu-user-menu\" #root *ngIf=\"profile as p\">\r\n <div class=\"eiu-user-menu__shell\">\r\n <a\r\n class=\"nav-link eiu-user-menu__trigger\"\r\n href=\"#\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"menuOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n (click)=\"onTriggerClick($event)\"\r\n >\r\n <div class=\"eiu-user-menu__trigger-inner\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"25\"\r\n height=\"25\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--sm\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <span class=\"eiu-user-menu__name text-grey-8 text-capitalize\">{{ p.fullName }}</span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"eiu-user-menu__dropdown\" *ngIf=\"menuOpen\" role=\"menu\">\r\n <div class=\"eiu-user-menu__header bg-eiu-primary\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"90\"\r\n height=\"90\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--lg\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <p>\r\n <span>{{ p.fullName }}</span>\r\n <small *ngIf=\"p.email as email\">\r\n <span class=\"mr-2\">{{ email }}</span>\r\n </small>\r\n </p>\r\n </div>\r\n <div class=\"eiu-user-menu__footer\">\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-left\"\r\n role=\"menuitem\"\r\n (click)=\"onChangePasswordClick($event)\"\r\n >\r\n <i class=\"fa fa-exchange-alt mr-1\"></i>\r\n {{ changePasswordLabel }}\r\n </a>\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-right\"\r\n role=\"menuitem\"\r\n (click)=\"onLogoutClick($event)\"\r\n >\r\n <i class=\"fa fa-sign-out-alt mr-1\"></i>\r\n {{ logoutLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;justify-content:center;align-items:center}.eiu-user-menu{position:relative;border:none;width:auto;display:flex;justify-content:center;align-items:center}.eiu-user-menu__shell{position:relative;display:flex;align-items:center}.eiu-user-menu__trigger{padding:.5rem .75rem}.eiu-user-menu__dropdown{position:absolute;right:0;top:100%;z-index:1050;min-width:280px;margin-top:.25rem;background:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem #0000002d}.eiu-user-menu__img--sm{margin:0 3px;border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b}.eiu-user-menu__img--lg{border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b;border:3px solid rgba(255,255,255,.2)}.eiu-user-menu__header{display:flex;align-items:center;flex-direction:column;height:175px;padding:10px;text-align:center}.eiu-user-menu__header img{z-index:5;height:90px;width:90px}.eiu-user-menu__header p{z-index:5;font-size:17px;margin-top:10px}.eiu-user-menu__header p small{display:block;font-size:12px}.eiu-user-menu__footer{background-color:#f8f9fa;padding:10px}.eiu-user-menu__footer:after{display:block;clear:both;content:\"\"}.eiu-user-menu__footer .btn-default{color:#6c757d;font-size:13px}@media (min-width: 576px){.eiu-user-menu__footer .btn-default:hover{background-color:#f8f9fa}}.eiu-user-menu__trigger-inner{display:flex;flex-wrap:wrap;align-items:center}.eiu-user-menu__trigger-inner .eiu-user-menu__name{max-width:0 15px;margin:3px auto}.text-grey-8{color:#616161}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuComponent, decorators: [{
|
|
63
|
+
type: Component,
|
|
64
|
+
args: [{ selector: 'app-eiu-user-menu', template: "<div class=\"eiu-user-menu\" #root *ngIf=\"profile as p\">\r\n <div class=\"eiu-user-menu__shell\">\r\n <a\r\n class=\"nav-link eiu-user-menu__trigger\"\r\n href=\"#\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"menuOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n (click)=\"onTriggerClick($event)\"\r\n >\r\n <div class=\"eiu-user-menu__trigger-inner\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"25\"\r\n height=\"25\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--sm\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <span class=\"eiu-user-menu__name text-grey-8 text-capitalize\">{{ p.fullName }}</span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"eiu-user-menu__dropdown\" *ngIf=\"menuOpen\" role=\"menu\">\r\n <div class=\"eiu-user-menu__header bg-eiu-primary\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"90\"\r\n height=\"90\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--lg\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <p>\r\n <span>{{ p.fullName }}</span>\r\n <small *ngIf=\"p.email as email\">\r\n <span class=\"mr-2\">{{ email }}</span>\r\n </small>\r\n </p>\r\n </div>\r\n <div class=\"eiu-user-menu__footer\">\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-left\"\r\n role=\"menuitem\"\r\n (click)=\"onChangePasswordClick($event)\"\r\n >\r\n <i class=\"fa fa-exchange-alt mr-1\"></i>\r\n {{ changePasswordLabel }}\r\n </a>\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-right\"\r\n role=\"menuitem\"\r\n (click)=\"onLogoutClick($event)\"\r\n >\r\n <i class=\"fa fa-sign-out-alt mr-1\"></i>\r\n {{ logoutLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;justify-content:center;align-items:center}.eiu-user-menu{position:relative;border:none;width:auto;display:flex;justify-content:center;align-items:center}.eiu-user-menu__shell{position:relative;display:flex;align-items:center}.eiu-user-menu__trigger{padding:.5rem .75rem}.eiu-user-menu__dropdown{position:absolute;right:0;top:100%;z-index:1050;min-width:280px;margin-top:.25rem;background:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem #0000002d}.eiu-user-menu__img--sm{margin:0 3px;border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b}.eiu-user-menu__img--lg{border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b;border:3px solid rgba(255,255,255,.2)}.eiu-user-menu__header{display:flex;align-items:center;flex-direction:column;height:175px;padding:10px;text-align:center}.eiu-user-menu__header img{z-index:5;height:90px;width:90px}.eiu-user-menu__header p{z-index:5;font-size:17px;margin-top:10px}.eiu-user-menu__header p small{display:block;font-size:12px}.eiu-user-menu__footer{background-color:#f8f9fa;padding:10px}.eiu-user-menu__footer:after{display:block;clear:both;content:\"\"}.eiu-user-menu__footer .btn-default{color:#6c757d;font-size:13px}@media (min-width: 576px){.eiu-user-menu__footer .btn-default:hover{background-color:#f8f9fa}}.eiu-user-menu__trigger-inner{display:flex;flex-wrap:wrap;align-items:center}.eiu-user-menu__trigger-inner .eiu-user-menu__name{max-width:0 15px;margin:3px auto}.text-grey-8{color:#616161}\n"] }]
|
|
65
|
+
}], propDecorators: { _root: [{
|
|
66
|
+
type: ViewChild,
|
|
67
|
+
args: ['root', { static: true }]
|
|
68
|
+
}], profile: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], fallbackAvatar: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}], changePasswordLabel: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}], logoutLabel: [{
|
|
75
|
+
type: Input
|
|
76
|
+
}], changePassword: [{
|
|
77
|
+
type: Output
|
|
78
|
+
}], logout: [{
|
|
79
|
+
type: Output
|
|
80
|
+
}], onDocumentClick: [{
|
|
81
|
+
type: HostListener,
|
|
82
|
+
args: ['document:click', ['$event']]
|
|
83
|
+
}], onEscape: [{
|
|
84
|
+
type: HostListener,
|
|
85
|
+
args: ['document:keydown.escape']
|
|
86
|
+
}] } });
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNKLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNYLE1BQU0sZUFBZSxDQUFDOzs7QUFRdkIsTUFBTSxPQUFPLHVCQUF1QjtJQUxwQztRQVFHLDZEQUE2RDtRQUNwRCxZQUFPLEdBQThCLElBQUksQ0FBQztRQUVuRCxtRkFBbUY7UUFDMUUsbUJBQWMsR0FBRyxzQ0FBc0MsQ0FBQztRQUV4RCx3QkFBbUIsR0FBRyxjQUFjLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFFbkMsb0RBQW9EO1FBQ2pDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUM3RCwwREFBMEQ7UUFDdkMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFckQsYUFBUSxHQUFHLEtBQUssQ0FBQztLQWtEbkI7SUFoREUsY0FBYyxDQUFDLEtBQVk7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBWTtRQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVk7UUFDdkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFZO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQzdDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDOUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQ2hDO0lBQ0osQ0FBQztJQUdELGVBQWUsQ0FBQyxLQUFpQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1Q7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQztRQUN2QyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO0lBQ0osQ0FBQztJQUdELFFBQVE7UUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRU8saUJBQWlCO1FBQ3RCLElBQUk7WUFDRCxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDbkU7UUFBQyxNQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQzdCO0lBQ0osQ0FBQzs7cUhBbEVTLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLGdlQ2hCcEMsazFFQStEQTs0RkQvQ2EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNHLG1CQUFtQjs4QkFLeUIsS0FBSztzQkFBMUQsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUcxQixPQUFPO3NCQUFmLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHYSxjQUFjO3NCQUFoQyxNQUFNO2dCQUVZLE1BQU07c0JBQXhCLE1BQU07Z0JBOEJQLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgIENvbXBvbmVudCxcclxuICAgRWxlbWVudFJlZixcclxuICAgRXZlbnRFbWl0dGVyLFxyXG4gICBIb3N0TGlzdGVuZXIsXHJcbiAgIElucHV0LFxyXG4gICBPdXRwdXQsXHJcbiAgIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFaXVVc2VyTWVudVByb2ZpbGUgfSBmcm9tICcuL2VpdS11c2VyLW1lbnUubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgIHNlbGVjdG9yOiAnYXBwLWVpdS11c2VyLW1lbnUnLFxyXG4gICB0ZW1wbGF0ZVVybDogJy4vZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICBzdHlsZVVybHM6IFsnLi9laXUtYXBwLXVzZXItbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFaXVBcHBVc2VyTWVudUNvbXBvbmVudCB7XHJcbiAgIEBWaWV3Q2hpbGQoJ3Jvb3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHJlYWRvbmx5IF9yb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gICAvKiogVGjDtG5nIHRpbiB1c2VyIOKAlCBob3N0IGJpbmQgdOG7qyBzZXJ2aWNlIHRva2VuIC8gc2Vzc2lvbi4gKi9cclxuICAgQElucHV0KCkgcHJvZmlsZTogRWl1VXNlck1lbnVQcm9maWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAvKiog4bqibmggbeG6t2MgxJHhu4tuaCBraGkgYHBpY3R1cmVgIGzhu5dpIGhv4bq3YyB0cuG7kW5nICjEkcaw4budbmcgZOG6q24gdHJvbmcgYXNzZXRzIGPhu6dhIGhvc3QpLiAqL1xyXG4gICBASW5wdXQoKSBmYWxsYmFja0F2YXRhciA9ICdhc3NldHMvaW1nL2ljb25zL2RlZmF1bHQtcHJvZmlsZS5wbmcnO1xyXG5cclxuICAgQElucHV0KCkgY2hhbmdlUGFzc3dvcmRMYWJlbCA9ICfEkOG7lWkgbeG6rXQga2jhuql1JztcclxuICAgQElucHV0KCkgbG9nb3V0TGFiZWwgPSAnxJDEg25nIHh14bqldCc7XHJcblxyXG4gICAvKiogSG9zdCB44butIGzDvSAodsOtIGThu6UgcmVkaXJlY3QgU1NPIMSR4buVaSBt4bqtdCBraOG6qXUpLiAqL1xyXG4gICBAT3V0cHV0KCkgcmVhZG9ubHkgY2hhbmdlUGFzc3dvcmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgIC8qKiBIb3N0IHjhu60gbMO9ICh2w60gZOG7pSBLZXljbG9hayBsb2dvdXQgKyBjbGVhciBzdG9yYWdlKS4gKi9cclxuICAgQE91dHB1dCgpIHJlYWRvbmx5IGxvZ291dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgIG1lbnVPcGVuID0gZmFsc2U7XHJcblxyXG4gICBvblRyaWdnZXJDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHRoaXMubWVudU9wZW4gPSAhdGhpcy5tZW51T3BlbjtcclxuICAgfVxyXG5cclxuICAgb25DaGFuZ2VQYXNzd29yZENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNoYW5nZVBhc3N3b3JkLmVtaXQoKTtcclxuICAgICAgdGhpcy5tZW51T3BlbiA9IGZhbHNlO1xyXG4gICB9XHJcblxyXG4gICBvbkxvZ291dENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmxvZ291dC5lbWl0KCk7XHJcbiAgICAgIHRoaXMubWVudU9wZW4gPSBmYWxzZTtcclxuICAgfVxyXG5cclxuICAgb25BdmF0YXJFcnJvcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgIGlmIChpbWcgJiYgaW1nLnNyYyAhPT0gdGhpcy5fYWJzb2x1dGVGYWxsYmFjaygpKSB7XHJcbiAgICAgICAgIGltZy5zcmMgPSB0aGlzLmZhbGxiYWNrQXZhdGFyO1xyXG4gICAgICB9XHJcbiAgIH1cclxuXHJcbiAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5tZW51T3Blbikge1xyXG4gICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX3Jvb3Q/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGlmIChyb290ICYmICFyb290LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xyXG4gICAgICAgICB0aGlzLm1lbnVPcGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgfVxyXG5cclxuICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxyXG4gICBvbkVzY2FwZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tZW51T3BlbiA9IGZhbHNlO1xyXG4gICB9XHJcblxyXG4gICBwcml2YXRlIF9hYnNvbHV0ZUZhbGxiYWNrKCk6IHN0cmluZyB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgIHJldHVybiBuZXcgVVJMKHRoaXMuZmFsbGJhY2tBdmF0YXIsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pLmhyZWY7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja0F2YXRhcjtcclxuICAgICAgfVxyXG4gICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImVpdS11c2VyLW1lbnVcIiAjcm9vdCAqbmdJZj1cInByb2ZpbGUgYXMgcFwiPlxyXG4gICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9fc2hlbGxcIj5cclxuICAgICAgPGFcclxuICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBlaXUtdXNlci1tZW51X190cmlnZ2VyXCJcclxuICAgICAgICAgaHJlZj1cIiNcIlxyXG4gICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiXHJcbiAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgIChjbGljayk9XCJvblRyaWdnZXJDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9fdHJpZ2dlci1pbm5lclwiPlxyXG4gICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgIFtzcmNdPVwicC5waWN0dXJlIHx8IGZhbGxiYWNrQXZhdGFyXCJcclxuICAgICAgICAgICAgICAgW2FsdF09XCJwLmZ1bGxOYW1lXCJcclxuICAgICAgICAgICAgICAgd2lkdGg9XCIyNVwiXHJcbiAgICAgICAgICAgICAgIGhlaWdodD1cIjI1XCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJlaXUtdXNlci1tZW51X19pbWcgZWl1LXVzZXItbWVudV9faW1nLS1zbVwiXHJcbiAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkF2YXRhckVycm9yKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVpdS11c2VyLW1lbnVfX25hbWUgdGV4dC1ncmV5LTggdGV4dC1jYXBpdGFsaXplXCI+e3sgcC5mdWxsTmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYT5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJlaXUtdXNlci1tZW51X19kcm9wZG93blwiICpuZ0lmPVwibWVudU9wZW5cIiByb2xlPVwibWVudVwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9faGVhZGVyIGJnLWVpdS1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgW3NyY109XCJwLnBpY3R1cmUgfHwgZmFsbGJhY2tBdmF0YXJcIlxyXG4gICAgICAgICAgICAgICBbYWx0XT1cInAuZnVsbE5hbWVcIlxyXG4gICAgICAgICAgICAgICB3aWR0aD1cIjkwXCJcclxuICAgICAgICAgICAgICAgaGVpZ2h0PVwiOTBcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImVpdS11c2VyLW1lbnVfX2ltZyBlaXUtdXNlci1tZW51X19pbWctLWxnXCJcclxuICAgICAgICAgICAgICAgKGVycm9yKT1cIm9uQXZhdGFyRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICA8c3Bhbj57eyBwLmZ1bGxOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJwLmVtYWlsIGFzIGVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMlwiPnt7IGVtYWlsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9fZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWZsYXQgZmxvYXQtbGVmdFwiXHJcbiAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoYW5nZVBhc3N3b3JkQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1leGNoYW5nZS1hbHQgbXItMVwiPjwvaT5cclxuICAgICAgICAgICAgICAge3sgY2hhbmdlUGFzc3dvcmRMYWJlbCB9fVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWZsYXQgZmxvYXQtcmlnaHRcIlxyXG4gICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAoY2xpY2spPVwib25Mb2dvdXRDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNpZ24tb3V0LWFsdCBtci0xXCI+PC9pPlxyXG4gICAgICAgICAgICAgICB7eyBsb2dvdXRMYWJlbCB9fVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { EiuAppUserMenuComponent } from './eiu-app-user-menu.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Menu user header (avatar, đổi mật khẩu, đăng xuất).
|
|
7
|
+
* Host cung cấp `[profile]` và xử lý `(changePassword)` / `(logout)`.
|
|
8
|
+
*/
|
|
9
|
+
export class EiuAppUserMenuModule {
|
|
10
|
+
}
|
|
11
|
+
EiuAppUserMenuModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
EiuAppUserMenuModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, declarations: [EiuAppUserMenuComponent], imports: [CommonModule], exports: [EiuAppUserMenuComponent] });
|
|
13
|
+
EiuAppUserMenuModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, imports: [CommonModule] });
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, decorators: [{
|
|
15
|
+
type: NgModule,
|
|
16
|
+
args: [{
|
|
17
|
+
imports: [CommonModule],
|
|
18
|
+
declarations: [EiuAppUserMenuComponent],
|
|
19
|
+
exports: [EiuAppUserMenuComponent]
|
|
20
|
+
}]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC11c2VyLW1lbnUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQUV4RTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sb0JBQW9COztrSEFBcEIsb0JBQW9CO21IQUFwQixvQkFBb0IsaUJBSGYsdUJBQXVCLGFBRDVCLFlBQVksYUFFWix1QkFBdUI7bUhBRXZCLG9CQUFvQixZQUpwQixZQUFZOzRGQUlaLG9CQUFvQjtrQkFMaEMsUUFBUTttQkFBQztvQkFDUCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztpQkFDcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFaXVBcHBVc2VyTWVudUNvbXBvbmVudCB9IGZyb20gJy4vZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBNZW51IHVzZXIgaGVhZGVyIChhdmF0YXIsIMSR4buVaSBt4bqtdCBraOG6qXUsIMSRxINuZyB4deG6pXQpLlxyXG4gKiBIb3N0IGN1bmcgY+G6pXAgYFtwcm9maWxlXWAgdsOgIHjhu60gbMO9IGAoY2hhbmdlUGFzc3dvcmQpYCAvIGAobG9nb3V0KWAuXHJcbiAqL1xyXG5ATmdNb2R1bGUoe1xyXG4gICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICAgZGVjbGFyYXRpb25zOiBbRWl1QXBwVXNlck1lbnVDb21wb25lbnRdLFxyXG4gICBleHBvcnRzOiBbRWl1QXBwVXNlck1lbnVDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFaXVBcHBVc2VyTWVudU1vZHVsZSB7fVxyXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LXVzZXItbWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9saWIvdXNlci1tZW51L2VpdS11c2VyLW1lbnUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUaMO0bmcgdGluIHVzZXIgaGnhu4NuIHRo4buLIHRyw6puIG1lbnUgKGF2YXRhciwgdMOqbiwgZW1haWwpLlxyXG4gKiBIb3N0IG1hcCB04burIHRva2VuIC8gQVBJIGPhu6dhIOG7qW5nIGThu6VuZy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWl1VXNlck1lbnVQcm9maWxlIHtcclxuICAgLyoqIFVSTCDhuqNuaCDEkeG6oWkgZGnhu4duICh0deG7syBjaOG7jW4pLiAqL1xyXG4gICBwaWN0dXJlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgLyoqIEjhu40gdMOqbiBoaeG7g24gdGjhu4suICovXHJcbiAgIGZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgIC8qKiBFbWFpbCAodHXhu7MgY2jhu41uKS4gKi9cclxuICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xyXG59XHJcbiJdfQ==
|
package/esm2020/public-api.mjs
CHANGED
|
@@ -6,6 +6,9 @@ export * from './lib/app-launcher/eiu-app-launcher-menu.model';
|
|
|
6
6
|
export * from './lib/app-launcher/eiu-app-launcher-menu.token';
|
|
7
7
|
export * from './lib/app-launcher/eiu-app-launcher.component';
|
|
8
8
|
export * from './lib/app-launcher/eiu-app-launcher.module';
|
|
9
|
+
export * from './lib/user-menu/eiu-user-menu.model';
|
|
10
|
+
export * from './lib/user-menu/eiu-app-user-menu.component';
|
|
11
|
+
export * from './lib/user-menu/eiu-app-user-menu.module';
|
|
9
12
|
export * from './lib/sidebar-shared/sidebar-shared.model';
|
|
10
13
|
export * from './lib/sidebar-shared/logo/eiu-sidebar-logo.component';
|
|
11
14
|
export * from './lib/sidebar-shared/contact/eiu-contact-support.component';
|
|
@@ -20,4 +23,4 @@ export * from './lib/feature-news/feature-news-dialog.service';
|
|
|
20
23
|
export * from './lib/feature-news/feature-news.service';
|
|
21
24
|
export * from './lib/feature-news/feature-news-dialog.component';
|
|
22
25
|
export * from './lib/feature-news/eiu-app-feature-news.module';
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxrREFBa0QsQ0FBQztBQUNqRSxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxnREFBZ0QsQ0FBQztBQUMvRCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyxnREFBZ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEVJVSBBcHAgS2l0IOKAlCB0w6FpIHPhu60gZOG7pW5nIGdp4buvYSBjw6FjIEFuZ3VsYXIgYXBwIChmZWF0dXJlIG5ld3MgUmVkbWluZSwgbGF1bmNoZXIgaGVhZGVyLCDigKYpXHJcbiAqL1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZWl1LWFwcC1raXQudG9rZW5zJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYXBwLWxhdW5jaGVyL2VpdS1hcHAtbGF1bmNoZXItbWVudS5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwcC1sYXVuY2hlci9laXUtYXBwLWxhdW5jaGVyLW1lbnUudG9rZW4nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi91c2VyLW1lbnUvZWl1LXVzZXItbWVudS5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3VzZXItbWVudS9laXUtYXBwLXVzZXItbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lkZWJhci1zaGFyZWQvc2lkZWJhci1zaGFyZWQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWRlYmFyLXNoYXJlZC9sb2dvL2VpdS1zaWRlYmFyLWxvZ28uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lkZWJhci1zaGFyZWQvY29udGFjdC9laXUtY29udGFjdC1zdXBwb3J0LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NpZGViYXItc2hhcmVkL2VpdS1zaWRlYmFyLXNoYXJlZC5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZm9vdGVyL2VpdS1hcHAtZm9vdGVyLm1vZHVsZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mZWF0dXJlLW5ld3MvbW9kZWxzL29wZXJhdGlvbi1yZXN1bHQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mZWF0dXJlLW5ld3MvbW9kZWxzL3JlZG1pbmUtbmV3cy5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9uZXdzLWFwaS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL2ZlYXR1cmUtbmV3cy1kaWFsb2cuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9mZWF0dXJlLW5ld3Muc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9mZWF0dXJlLW5ld3MtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9laXUtYXBwLWZlYXR1cmUtbmV3cy5tb2R1bGUnO1xyXG4iXX0=
|