eiu-app-kit 1.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.
- package/README.md +88 -0
- package/esm2020/eiu-app-kit.mjs +5 -0
- package/esm2020/lib/app-launcher/eiu-app-launcher-menu.model.mjs +2 -0
- package/esm2020/lib/app-launcher/eiu-app-launcher-menu.token.mjs +6 -0
- package/esm2020/lib/app-launcher/eiu-app-launcher.component.mjs +89 -0
- package/esm2020/lib/app-launcher/eiu-app-launcher.module.mjs +22 -0
- package/esm2020/lib/eiu-app-kit.tokens.mjs +7 -0
- package/esm2020/lib/feature-news/constants.mjs +8 -0
- package/esm2020/lib/feature-news/eiu-app-feature-news.module.mjs +22 -0
- package/esm2020/lib/feature-news/feature-news-dialog.component.mjs +41 -0
- package/esm2020/lib/feature-news/feature-news-dialog.service.mjs +30 -0
- package/esm2020/lib/feature-news/feature-news.service.mjs +55 -0
- package/esm2020/lib/feature-news/models/operation-result.model.mjs +2 -0
- package/esm2020/lib/feature-news/models/redmine-news.model.mjs +2 -0
- package/esm2020/lib/feature-news/news-api.service.mjs +36 -0
- package/esm2020/lib/footer/eiu-app-footer.component.mjs +38 -0
- package/esm2020/lib/footer/eiu-app-footer.module.mjs +18 -0
- package/esm2020/lib/sidebar-shared/contact/eiu-contact-support.component.mjs +23 -0
- package/esm2020/lib/sidebar-shared/eiu-sidebar-shared.module.mjs +20 -0
- package/esm2020/lib/sidebar-shared/logo/eiu-sidebar-logo.component.mjs +26 -0
- package/esm2020/lib/sidebar-shared/sidebar-shared.model.mjs +2 -0
- package/esm2020/public-api.mjs +23 -0
- package/fesm2015/eiu-app-kit.mjs +418 -0
- package/fesm2015/eiu-app-kit.mjs.map +1 -0
- package/fesm2020/eiu-app-kit.mjs +409 -0
- package/fesm2020/eiu-app-kit.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/app-launcher/eiu-app-launcher-menu.model.d.ts +10 -0
- package/lib/app-launcher/eiu-app-launcher-menu.token.d.ts +10 -0
- package/lib/app-launcher/eiu-app-launcher.component.d.ts +30 -0
- package/lib/app-launcher/eiu-app-launcher.module.d.ts +12 -0
- package/lib/eiu-app-kit.tokens.d.ts +6 -0
- package/lib/feature-news/constants.d.ts +7 -0
- package/lib/feature-news/eiu-app-feature-news.module.d.ts +12 -0
- package/lib/feature-news/feature-news-dialog.component.d.ts +16 -0
- package/lib/feature-news/feature-news-dialog.service.d.ts +15 -0
- package/lib/feature-news/feature-news.service.d.ts +13 -0
- package/lib/feature-news/models/operation-result.model.d.ts +6 -0
- package/lib/feature-news/models/redmine-news.model.d.ts +17 -0
- package/lib/feature-news/news-api.service.d.ts +11 -0
- package/lib/footer/eiu-app-footer.component.d.ts +14 -0
- package/lib/footer/eiu-app-footer.module.d.ts +8 -0
- package/lib/sidebar-shared/contact/eiu-contact-support.component.d.ts +9 -0
- package/lib/sidebar-shared/eiu-sidebar-shared.module.d.ts +10 -0
- package/lib/sidebar-shared/logo/eiu-sidebar-logo.component.d.ts +9 -0
- package/lib/sidebar-shared/sidebar-shared.model.d.ts +12 -0
- package/package.json +54 -0
- package/public-api.d.ts +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,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 { EiuAppFeatureNewsModule, EiuAppLauncherModule } from 'eiu-app-kit';
|
|
49
|
+
|
|
50
|
+
@NgModule({
|
|
51
|
+
imports: [CommonModule, EiuAppFeatureNewsModule, EiuAppLauncherModule]
|
|
52
|
+
})
|
|
53
|
+
export class ThemeModule {}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Template header / layout
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<app-eiu-app-launcher (sidebarToggle)="onToggleMenuSidebar()"></app-eiu-app-launcher>
|
|
60
|
+
<app-feature-news-dialog></app-feature-news-dialog>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`sidebarToggle`: host tự xử lý (NgRx, v.v.).
|
|
64
|
+
|
|
65
|
+
## Feature news
|
|
66
|
+
|
|
67
|
+
Inject `FeatureNewsService`:
|
|
68
|
+
|
|
69
|
+
- `checkAndShowFeatureNews(userId, projectIdentifier)` — khi có tin mới.
|
|
70
|
+
- `showLatestFeatureNewsManually(userId, projectIdentifier)` — mở thủ công.
|
|
71
|
+
|
|
72
|
+
Hằng số mặc định project Redmine: `FEATURE_NEWS_REDMINE_PROJECT_IDENTIFIER`.
|
|
73
|
+
|
|
74
|
+
Khi logout có `localStorage.clear()`, cân nhắc giữ key prefix `FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX`.
|
|
75
|
+
|
|
76
|
+
## Monorepo (path mapping, không publish)
|
|
77
|
+
|
|
78
|
+
Trong `tsconfig` của app:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
"paths": {
|
|
82
|
+
"eiu-app-kit": ["../projects/eiu-app-kit/src/public-api.ts"]
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Public API
|
|
87
|
+
|
|
88
|
+
Xem `src/public-api.ts`: modules, services, models, `EIU_APP_API_BASE_URL`, `EIU_APP_LAUNCHER_MENU_LOADER`.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1raXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9laXUtYXBwLWtpdC9zcmMvZWl1LWFwcC1raXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1sYXVuY2hlci1tZW51Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci1tZW51Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogROG7ryBsaeG7h3UgdOG7kWkgdGhp4buDdSDEkeG7gyBoaeG7g24gdGjhu4sgbeG7mXQgbeG7pWMgdHJvbmcgbGF1bmNoZXIgKG1lZ2EgbWVudSkuXHJcbiAqIEto4bubcCB24bubaSBwYXlsb2FkIHRoxrDhu51uZyBn4bq3cCB04burIEFQSSBQcm9qZWN0IChuYW1lX1ZJLCBpbWFnZVVybCwg4oCmKS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWl1QXBwTGF1bmNoZXJNZW51SXRlbSB7XHJcbiAgIHNvcnRPcmRlcjogbnVtYmVyIHwgbnVsbDtcclxuICAgbmFtZV9WSTogc3RyaW5nIHwgbnVsbDtcclxuICAgaW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XHJcbiAgIGxpbms6IHN0cmluZyB8IG51bGw7XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Host app cung cấp cách load danh sách ứng dụng (ví dụ `ProjectService.getAllProject()`).
|
|
4
|
+
*/
|
|
5
|
+
export const EIU_APP_LAUNCHER_MENU_LOADER = new InjectionToken('EIU_APP_LAUNCHER_MENU_LOADER');
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1sYXVuY2hlci1tZW51LnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci1tZW51LnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFRL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLGNBQWMsQ0FDM0QsOEJBQThCLENBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEVpdUFwcExhdW5jaGVyTWVudUl0ZW0gfSBmcm9tICcuL2VpdS1hcHAtbGF1bmNoZXItbWVudS5tb2RlbCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVpdUFwcExhdW5jaGVyTWVudUxvYWRlciB7XHJcbiAgIGxvYWRJdGVtcygpOiBPYnNlcnZhYmxlPEVpdUFwcExhdW5jaGVyTWVudUl0ZW1bXT47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIb3N0IGFwcCBjdW5nIGPhuqVwIGPDoWNoIGxvYWQgZGFuaCBzw6FjaCDhu6luZyBk4bulbmcgKHbDrSBk4bulIGBQcm9qZWN0U2VydmljZS5nZXRBbGxQcm9qZWN0KClgKS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBFSVVfQVBQX0xBVU5DSEVSX01FTlVfTE9BREVSID0gbmV3IEluamVjdGlvblRva2VuPEVpdUFwcExhdW5jaGVyTWVudUxvYWRlcj4oXHJcbiAgICdFSVVfQVBQX0xBVU5DSEVSX01FTlVfTE9BREVSJ1xyXG4pO1xyXG4iXX0=
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostListener, Inject, Input, Output } from '@angular/core';
|
|
2
|
+
import { EIU_APP_API_BASE_URL } from '../eiu-app-kit.tokens';
|
|
3
|
+
import { EIU_APP_LAUNCHER_MENU_LOADER } from './eiu-app-launcher-menu.token';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
export class EiuAppLauncherComponent {
|
|
7
|
+
constructor(_menuLoader, apiBaseUrl, _cdr) {
|
|
8
|
+
this._menuLoader = _menuLoader;
|
|
9
|
+
this._cdr = _cdr;
|
|
10
|
+
/** Phát ra khi user bấm icon menu (sidebar). Host gắn với store / layout. */
|
|
11
|
+
this.sidebarToggle = new EventEmitter();
|
|
12
|
+
this.appLabel = 'Ứng dụng';
|
|
13
|
+
this.isScreenWide = true;
|
|
14
|
+
this.menuItems = [];
|
|
15
|
+
this._apiBase = (apiBaseUrl || '').replace(/\/$/, '');
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
this._loadMenu();
|
|
19
|
+
}
|
|
20
|
+
onResize() {
|
|
21
|
+
this._adjustMenuPosition();
|
|
22
|
+
}
|
|
23
|
+
ngAfterViewInit() {
|
|
24
|
+
this._adjustMenuPosition();
|
|
25
|
+
this._cdr.detectChanges();
|
|
26
|
+
}
|
|
27
|
+
onToggleMenuSidebar() {
|
|
28
|
+
this.sidebarToggle.emit();
|
|
29
|
+
}
|
|
30
|
+
_adjustMenuPosition() {
|
|
31
|
+
this.isScreenWide = window.innerWidth > 1300;
|
|
32
|
+
}
|
|
33
|
+
_loadMenu() {
|
|
34
|
+
this._menuLoader.loadItems().subscribe({
|
|
35
|
+
next: (res) => {
|
|
36
|
+
this.menuItems = (res ?? [])
|
|
37
|
+
.filter((x) => x.link)
|
|
38
|
+
.sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0))
|
|
39
|
+
.map((x) => ({
|
|
40
|
+
label: x.name_VI ?? '',
|
|
41
|
+
icon: this._iconUrl(x.imageUrl),
|
|
42
|
+
link: x.link,
|
|
43
|
+
isActive: this._isActive(x.link)
|
|
44
|
+
}));
|
|
45
|
+
},
|
|
46
|
+
error: (err) => console.error(err)
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
_iconUrl(imageUrl) {
|
|
50
|
+
if (!imageUrl) {
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
if (/^https?:\/\//i.test(imageUrl)) {
|
|
54
|
+
return imageUrl;
|
|
55
|
+
}
|
|
56
|
+
const path = imageUrl.replace(/^\//, '');
|
|
57
|
+
return this._apiBase ? `${this._apiBase}/${path}` : path;
|
|
58
|
+
}
|
|
59
|
+
_isActive(link) {
|
|
60
|
+
try {
|
|
61
|
+
const currentDomain = new URL(window.location.href).origin;
|
|
62
|
+
const linkDomain = new URL(link).origin;
|
|
63
|
+
return currentDomain === linkDomain;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
EiuAppLauncherComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppLauncherComponent, deps: [{ token: EIU_APP_LAUNCHER_MENU_LOADER }, { token: EIU_APP_API_BASE_URL }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
71
|
+
EiuAppLauncherComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppLauncherComponent, selector: "app-eiu-app-launcher", inputs: { appLabel: "appLabel" }, outputs: { sidebarToggle: "sidebarToggle" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<ul class=\"navbar-nav\">\n <li class=\"nav-item\">\n <a class=\"nav-link\" href=\"#\" (click)=\"onToggleMenuSidebar(); $event.preventDefault()\" role=\"button\"><i\n class=\"fas fa-bars\"></i></a>\n </li>\n <ng-container *ngIf=\"isScreenWide\">\n <li class=\"nav-item\" *ngFor=\"let menuItem of menuItems | slice: 0:5\">\n <a class=\"nav-link\" href=\"{{ menuItem.link }}\" [ngClass]=\"{ active: menuItem.isActive }\" target=\"_blank\">\n {{ menuItem.label }}\n </a>\n </li>\n </ng-container>\n <li class=\"nav-item dropdown\">\n <a class=\"nav-link dropdown-toggle\" role=\"button\" aria-expanded=\"false\">\n {{ appLabel }}\n </a>\n\n <!-- Mega Menu -->\n <div class=\"mega-dropdown\" id=\"megaDropdown\">\n <div class=\"menu-item-card\" *ngFor=\"let menuItem of menuItems\">\n <a class=\"dropdown-item\" href=\"{{ menuItem.link }}\" [ngClass]=\"{ active: menuItem.isActive }\"\n target=\"_blank\">\n <div class=\"icon-container\">\n <img [src]=\"menuItem.icon\" alt=\"\" height=\"25\" width=\"25\" />\n </div>\n <span>{{ menuItem.label }}</span>\n </a>\n </div>\n </div>\n </li>\n</ul>", styles: ["img{object-fit:scale-down}.fa-bars,.nav-item .nav-link{cursor:pointer}.nav-item button.nav-link{outline:none;border:none;background-color:transparent}.mega-dropdown{display:none;opacity:0;transform:translateY(10px);transition:all .2s ease-in-out;position:absolute;top:100%;z-index:9999;background-color:#fff;padding:10px;border-radius:8px;box-shadow:0 2px 8px #00000014;width:600px;grid-template-columns:repeat(3,1fr);gap:8px}.nav-item.dropdown:hover>.mega-dropdown{display:grid;opacity:1;z-index:9999;transform:translateY(0)}.menu-item-card{padding:5px;transition:transform .2s ease}.dropdown-item{display:flex;align-items:center;padding:8px 12px;border-radius:6px;box-shadow:none;transition:background-color .2s ease,transform .2s ease;color:#194266}.dropdown-item:hover,.dropdown-item.active{background-color:#f0f5fd;color:var(--color-eiu-main)}.icon-container{width:28px;height:28px;border:1px solid #194266;border-radius:6px;display:flex;justify-content:center;align-items:center;margin-right:10px}.icon-container i{font-size:14px;color:#fff}.navbar-nav .nav-item{display:inline-block}.navbar-nav .nav-link{display:flex;align-items:center;border-radius:6px;transition:background-color .2s ease;font-size:16px;color:var(--color-eiu-primary);padding:6px 12px}.navbar-nav .nav-link:hover{color:var(--color-eiu-main)}.navbar-nav .nav-link.active{color:var(--color-eiu-main);font-weight:600}@media (max-width: 768px){.mega-dropdown{width:auto;right:auto;height:380px;overflow:scroll;left:50%;transform:translate(-50%);grid-template-columns:1fr}::ng-deep .navbar-expand .navbar-nav .nav-link{padding-left:0rem!important}}@media (min-width: 769px) and (max-width: 1480px){.mega-dropdown{width:500px;grid-template-columns:repeat(2,1fr)}}@media (min-width: 1481px){.mega-dropdown{width:auto;grid-template-columns:repeat(3,1fr)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }] });
|
|
72
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppLauncherComponent, decorators: [{
|
|
73
|
+
type: Component,
|
|
74
|
+
args: [{ selector: 'app-eiu-app-launcher', template: "<ul class=\"navbar-nav\">\n <li class=\"nav-item\">\n <a class=\"nav-link\" href=\"#\" (click)=\"onToggleMenuSidebar(); $event.preventDefault()\" role=\"button\"><i\n class=\"fas fa-bars\"></i></a>\n </li>\n <ng-container *ngIf=\"isScreenWide\">\n <li class=\"nav-item\" *ngFor=\"let menuItem of menuItems | slice: 0:5\">\n <a class=\"nav-link\" href=\"{{ menuItem.link }}\" [ngClass]=\"{ active: menuItem.isActive }\" target=\"_blank\">\n {{ menuItem.label }}\n </a>\n </li>\n </ng-container>\n <li class=\"nav-item dropdown\">\n <a class=\"nav-link dropdown-toggle\" role=\"button\" aria-expanded=\"false\">\n {{ appLabel }}\n </a>\n\n <!-- Mega Menu -->\n <div class=\"mega-dropdown\" id=\"megaDropdown\">\n <div class=\"menu-item-card\" *ngFor=\"let menuItem of menuItems\">\n <a class=\"dropdown-item\" href=\"{{ menuItem.link }}\" [ngClass]=\"{ active: menuItem.isActive }\"\n target=\"_blank\">\n <div class=\"icon-container\">\n <img [src]=\"menuItem.icon\" alt=\"\" height=\"25\" width=\"25\" />\n </div>\n <span>{{ menuItem.label }}</span>\n </a>\n </div>\n </div>\n </li>\n</ul>", styles: ["img{object-fit:scale-down}.fa-bars,.nav-item .nav-link{cursor:pointer}.nav-item button.nav-link{outline:none;border:none;background-color:transparent}.mega-dropdown{display:none;opacity:0;transform:translateY(10px);transition:all .2s ease-in-out;position:absolute;top:100%;z-index:9999;background-color:#fff;padding:10px;border-radius:8px;box-shadow:0 2px 8px #00000014;width:600px;grid-template-columns:repeat(3,1fr);gap:8px}.nav-item.dropdown:hover>.mega-dropdown{display:grid;opacity:1;z-index:9999;transform:translateY(0)}.menu-item-card{padding:5px;transition:transform .2s ease}.dropdown-item{display:flex;align-items:center;padding:8px 12px;border-radius:6px;box-shadow:none;transition:background-color .2s ease,transform .2s ease;color:#194266}.dropdown-item:hover,.dropdown-item.active{background-color:#f0f5fd;color:var(--color-eiu-main)}.icon-container{width:28px;height:28px;border:1px solid #194266;border-radius:6px;display:flex;justify-content:center;align-items:center;margin-right:10px}.icon-container i{font-size:14px;color:#fff}.navbar-nav .nav-item{display:inline-block}.navbar-nav .nav-link{display:flex;align-items:center;border-radius:6px;transition:background-color .2s ease;font-size:16px;color:var(--color-eiu-primary);padding:6px 12px}.navbar-nav .nav-link:hover{color:var(--color-eiu-main)}.navbar-nav .nav-link.active{color:var(--color-eiu-main);font-weight:600}@media (max-width: 768px){.mega-dropdown{width:auto;right:auto;height:380px;overflow:scroll;left:50%;transform:translate(-50%);grid-template-columns:1fr}::ng-deep .navbar-expand .navbar-nav .nav-link{padding-left:0rem!important}}@media (min-width: 769px) and (max-width: 1480px){.mega-dropdown{width:500px;grid-template-columns:repeat(2,1fr)}}@media (min-width: 1481px){.mega-dropdown{width:auto;grid-template-columns:repeat(3,1fr)}}\n"] }]
|
|
75
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
76
|
+
type: Inject,
|
|
77
|
+
args: [EIU_APP_LAUNCHER_MENU_LOADER]
|
|
78
|
+
}] }, { type: undefined, decorators: [{
|
|
79
|
+
type: Inject,
|
|
80
|
+
args: [EIU_APP_API_BASE_URL]
|
|
81
|
+
}] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { sidebarToggle: [{
|
|
82
|
+
type: Output
|
|
83
|
+
}], appLabel: [{
|
|
84
|
+
type: Input
|
|
85
|
+
}], onResize: [{
|
|
86
|
+
type: HostListener,
|
|
87
|
+
args: ['window:resize']
|
|
88
|
+
}] } });
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1sYXVuY2hlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9laXUtYXBwLWtpdC9zcmMvbGliL2FwcC1sYXVuY2hlci9laXUtYXBwLWxhdW5jaGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9saWIvYXBwLWxhdW5jaGVyL2VpdS1hcHAtbGF1bmNoZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdKLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFFTixLQUFLLEVBQ0wsTUFBTSxFQUNSLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFDSiw0QkFBNEIsRUFFOUIsTUFBTSwrQkFBK0IsQ0FBQzs7O0FBY3ZDLE1BQU0sT0FBTyx1QkFBdUI7SUFVakMsWUFFb0IsV0FBcUMsRUFDeEIsVUFBa0IsRUFDL0IsSUFBdUI7UUFGdkIsZ0JBQVcsR0FBWCxXQUFXLENBQTBCO1FBRXJDLFNBQUksR0FBSixJQUFJLENBQW1CO1FBYjNDLDZFQUE2RTtRQUMxRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbkQsYUFBUSxHQUFHLFVBQVUsQ0FBQztRQUUvQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixjQUFTLEdBQTZCLEVBQUUsQ0FBQztRQVV0QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFFBQVE7UUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUdELFFBQVE7UUFDTCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsZUFBZTtRQUNaLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG1CQUFtQjtRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNoRCxDQUFDO0lBRU8sU0FBUztRQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3BDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO3FCQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7cUJBQ3JCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7cUJBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFO29CQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQWM7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFjLENBQUM7aUJBQzVDLENBQUMsQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLFFBQVEsQ0FBQyxRQUF1QjtRQUNyQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1osT0FBTyxFQUFFLENBQUM7U0FDWjtRQUNELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNqQyxPQUFPLFFBQVEsQ0FBQztTQUNsQjtRQUNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFZO1FBQzNCLElBQUk7WUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDeEMsT0FBTyxhQUFhLEtBQUssVUFBVSxDQUFDO1NBQ3RDO1FBQUMsTUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Y7SUFDSixDQUFDOztxSEE3RVMsdUJBQXVCLGtCQVd0Qiw0QkFBNEIsYUFFNUIsb0JBQW9CO3lHQWJyQix1QkFBdUIsbU1DN0JwQyxveENBOEJLOzRGRERRLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRyxzQkFBc0I7OzBCQWU1QixNQUFNOzJCQUFDLDRCQUE0Qjs7MEJBRW5DLE1BQU07MkJBQUMsb0JBQW9COzRFQVhaLGFBQWE7c0JBQS9CLE1BQU07Z0JBQ0UsUUFBUTtzQkFBaEIsS0FBSztnQkFxQk4sUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgQWZ0ZXJWaWV3SW5pdCxcbiAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgQ29tcG9uZW50LFxuICAgRXZlbnRFbWl0dGVyLFxuICAgSG9zdExpc3RlbmVyLFxuICAgSW5qZWN0LFxuICAgT25Jbml0LFxuICAgSW5wdXQsXG4gICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFSVVfQVBQX0FQSV9CQVNFX1VSTCB9IGZyb20gJy4uL2VpdS1hcHAta2l0LnRva2Vucyc7XG5pbXBvcnQge1xuICAgRUlVX0FQUF9MQVVOQ0hFUl9NRU5VX0xPQURFUixcbiAgIEVpdUFwcExhdW5jaGVyTWVudUxvYWRlclxufSBmcm9tICcuL2VpdS1hcHAtbGF1bmNoZXItbWVudS50b2tlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWl1QXBwTGF1bmNoZXJWaWV3SXRlbSB7XG4gICBsYWJlbDogc3RyaW5nO1xuICAgaWNvbjogc3RyaW5nO1xuICAgbGluazogc3RyaW5nO1xuICAgaXNBY3RpdmU6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgc2VsZWN0b3I6ICdhcHAtZWl1LWFwcC1sYXVuY2hlcicsXG4gICB0ZW1wbGF0ZVVybDogJy4vZWl1LWFwcC1sYXVuY2hlci5jb21wb25lbnQuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnLi9laXUtYXBwLWxhdW5jaGVyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFaXVBcHBMYXVuY2hlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAvKiogUGjDoXQgcmEga2hpIHVzZXIgYuG6pW0gaWNvbiBtZW51IChzaWRlYmFyKS4gSG9zdCBn4bqvbiB24bubaSBzdG9yZSAvIGxheW91dC4gKi9cbiAgIEBPdXRwdXQoKSByZWFkb25seSBzaWRlYmFyVG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgQElucHV0KCkgYXBwTGFiZWwgPSAn4buobmcgZOG7pW5nJztcblxuICAgaXNTY3JlZW5XaWRlID0gdHJ1ZTtcbiAgIG1lbnVJdGVtczogRWl1QXBwTGF1bmNoZXJWaWV3SXRlbVtdID0gW107XG5cbiAgIHByaXZhdGUgcmVhZG9ubHkgX2FwaUJhc2U6IHN0cmluZztcblxuICAgY29uc3RydWN0b3IoXG4gICAgICBASW5qZWN0KEVJVV9BUFBfTEFVTkNIRVJfTUVOVV9MT0FERVIpXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IF9tZW51TG9hZGVyOiBFaXVBcHBMYXVuY2hlck1lbnVMb2FkZXIsXG4gICAgICBASW5qZWN0KEVJVV9BUFBfQVBJX0JBU0VfVVJMKSBhcGlCYXNlVXJsOiBzdHJpbmcsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IF9jZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICApIHtcbiAgICAgIHRoaXMuX2FwaUJhc2UgPSAoYXBpQmFzZVVybCB8fCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgIH1cblxuICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICB0aGlzLl9sb2FkTWVudSgpO1xuICAgfVxuXG4gICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgIG9uUmVzaXplKCk6IHZvaWQge1xuICAgICAgdGhpcy5fYWRqdXN0TWVudVBvc2l0aW9uKCk7XG4gICB9XG5cbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2FkanVzdE1lbnVQb3NpdGlvbigpO1xuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgb25Ub2dnbGVNZW51U2lkZWJhcigpOiB2b2lkIHtcbiAgICAgIHRoaXMuc2lkZWJhclRvZ2dsZS5lbWl0KCk7XG4gICB9XG5cbiAgIHByaXZhdGUgX2FkanVzdE1lbnVQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAgIHRoaXMuaXNTY3JlZW5XaWRlID0gd2luZG93LmlubmVyV2lkdGggPiAxMzAwO1xuICAgfVxuXG4gICBwcml2YXRlIF9sb2FkTWVudSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX21lbnVMb2FkZXIubG9hZEl0ZW1zKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zID0gKHJlcyA/PyBbXSlcbiAgICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHgubGluaylcbiAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5zb3J0T3JkZXIgPz8gMCkgLSAoYi5zb3J0T3JkZXIgPz8gMCkpXG4gICAgICAgICAgICAgICAubWFwKCh4KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IHgubmFtZV9WSSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgIGljb246IHRoaXMuX2ljb25VcmwoeC5pbWFnZVVybCksXG4gICAgICAgICAgICAgICAgICBsaW5rOiB4LmxpbmsgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IHRoaXMuX2lzQWN0aXZlKHgubGluayBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICB9LFxuICAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgX2ljb25VcmwoaW1hZ2VVcmw6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgaWYgKCFpbWFnZVVybCkge1xuICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoaW1hZ2VVcmwpKSB7XG4gICAgICAgICByZXR1cm4gaW1hZ2VVcmw7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gaW1hZ2VVcmwucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgICAgIHJldHVybiB0aGlzLl9hcGlCYXNlID8gYCR7dGhpcy5fYXBpQmFzZX0vJHtwYXRofWAgOiBwYXRoO1xuICAgfVxuXG4gICBwcml2YXRlIF9pc0FjdGl2ZShsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICBjb25zdCBjdXJyZW50RG9tYWluID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luO1xuICAgICAgICAgY29uc3QgbGlua0RvbWFpbiA9IG5ldyBVUkwobGluaykub3JpZ2luO1xuICAgICAgICAgcmV0dXJuIGN1cnJlbnREb21haW4gPT09IGxpbmtEb21haW47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgIH1cblxufVxuIiwiPHVsIGNsYXNzPVwibmF2YmFyLW5hdlwiPlxuICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIiBocmVmPVwiI1wiIChjbGljayk9XCJvblRvZ2dsZU1lbnVTaWRlYmFyKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgcm9sZT1cImJ1dHRvblwiPjxpXG4gICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1iYXJzXCI+PC9pPjwvYT5cbiAgIDwvbGk+XG4gICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTY3JlZW5XaWRlXCI+XG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiICpuZ0Zvcj1cImxldCBtZW51SXRlbSBvZiBtZW51SXRlbXMgfCBzbGljZTogMDo1XCI+XG4gICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rXCIgaHJlZj1cInt7IG1lbnVJdGVtLmxpbmsgfX1cIiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogbWVudUl0ZW0uaXNBY3RpdmUgfVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAge3sgbWVudUl0ZW0ubGFiZWwgfX1cbiAgICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICA8L25nLWNvbnRhaW5lcj5cbiAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGRyb3Bkb3duXCI+XG4gICAgICA8YSBjbGFzcz1cIm5hdi1saW5rIGRyb3Bkb3duLXRvZ2dsZVwiIHJvbGU9XCJidXR0b25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cbiAgICAgICAgIHt7IGFwcExhYmVsIH19XG4gICAgICA8L2E+XG5cbiAgICAgIDwhLS0gTWVnYSBNZW51IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1lZ2EtZHJvcGRvd25cIiBpZD1cIm1lZ2FEcm9wZG93blwiPlxuICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbS1jYXJkXCIgKm5nRm9yPVwibGV0IG1lbnVJdGVtIG9mIG1lbnVJdGVtc1wiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cInt7IG1lbnVJdGVtLmxpbmsgfX1cIiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogbWVudUl0ZW0uaXNBY3RpdmUgfVwiXG4gICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIm1lbnVJdGVtLmljb25cIiBhbHQ9XCJcIiBoZWlnaHQ9XCIyNVwiIHdpZHRoPVwiMjVcIiAvPlxuICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICA8c3Bhbj57eyBtZW51SXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICA8L2xpPlxuPC91bD4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { EiuAppLauncherComponent } from './eiu-app-launcher.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Import ở shell layout (ví dụ `ThemeModule`).
|
|
7
|
+
* Cần `EIU_APP_API_BASE_URL` và `EIU_APP_LAUNCHER_MENU_LOADER` trong `providers`.
|
|
8
|
+
*/
|
|
9
|
+
export class EiuAppLauncherModule {
|
|
10
|
+
}
|
|
11
|
+
EiuAppLauncherModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppLauncherModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
EiuAppLauncherModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: EiuAppLauncherModule, declarations: [EiuAppLauncherComponent], imports: [CommonModule], exports: [EiuAppLauncherComponent] });
|
|
13
|
+
EiuAppLauncherModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppLauncherModule, imports: [CommonModule] });
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppLauncherModule, decorators: [{
|
|
15
|
+
type: NgModule,
|
|
16
|
+
args: [{
|
|
17
|
+
imports: [CommonModule],
|
|
18
|
+
declarations: [EiuAppLauncherComponent],
|
|
19
|
+
exports: [EiuAppLauncherComponent]
|
|
20
|
+
}]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1sYXVuY2hlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9laXUtYXBwLWtpdC9zcmMvbGliL2FwcC1sYXVuY2hlci9laXUtYXBwLWxhdW5jaGVyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFFdkU7OztHQUdHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjs7a0hBQXBCLG9CQUFvQjttSEFBcEIsb0JBQW9CLGlCQUhmLHVCQUF1QixhQUQ1QixZQUFZLGFBRVosdUJBQXVCO21IQUV2QixvQkFBb0IsWUFKcEIsWUFBWTs0RkFJWixvQkFBb0I7a0JBTGhDLFFBQVE7bUJBQUM7b0JBQ1AsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixZQUFZLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDdkMsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUM7aUJBQ3BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRWl1QXBwTGF1bmNoZXJDb21wb25lbnQgfSBmcm9tICcuL2VpdS1hcHAtbGF1bmNoZXIuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBJbXBvcnQg4bufIHNoZWxsIGxheW91dCAodsOtIGThu6UgYFRoZW1lTW9kdWxlYCkuXHJcbiAqIEPhuqduIGBFSVVfQVBQX0FQSV9CQVNFX1VSTGAgdsOgIGBFSVVfQVBQX0xBVU5DSEVSX01FTlVfTE9BREVSYCB0cm9uZyBgcHJvdmlkZXJzYC5cclxuICovXHJcbkBOZ01vZHVsZSh7XHJcbiAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gICBkZWNsYXJhdGlvbnM6IFtFaXVBcHBMYXVuY2hlckNvbXBvbmVudF0sXHJcbiAgIGV4cG9ydHM6IFtFaXVBcHBMYXVuY2hlckNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEVpdUFwcExhdW5jaGVyTW9kdWxlIHsgfVxyXG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Base URL API EIU App (ví dụ `environment.API_EIU_APP`).
|
|
4
|
+
* Dùng cho News API, icon launcher, … — cung cấp một lần trong `AppModule`.
|
|
5
|
+
*/
|
|
6
|
+
export const EIU_APP_API_BASE_URL = new InjectionToken('EIU_APP_API_BASE_URL');
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1raXQudG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9laXUtYXBwLWtpdC50b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FDbkQsc0JBQXNCLENBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgVVJMIEFQSSBFSVUgQXBwICh2w60gZOG7pSBgZW52aXJvbm1lbnQuQVBJX0VJVV9BUFBgKS5cclxuICogRMO5bmcgY2hvIE5ld3MgQVBJLCBpY29uIGxhdW5jaGVyLCDigKYg4oCUIGN1bmcgY+G6pXAgbeG7mXQgbOG6p24gdHJvbmcgYEFwcE1vZHVsZWAuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRUlVX0FQUF9BUElfQkFTRV9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcclxuICAgJ0VJVV9BUFBfQVBJX0JBU0VfVVJMJ1xyXG4pO1xyXG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Prefix localStorage: feature_news_seen::<userId>::<projectIdentifier> */
|
|
2
|
+
export const FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX = 'feature_news_seen::';
|
|
3
|
+
/**
|
|
4
|
+
* Mặc định project identifier trên Redmine (EIU App).
|
|
5
|
+
* Ứng dụng host có thể dùng hằng này hoặc chuỗi riêng khi gọi service.
|
|
6
|
+
*/
|
|
7
|
+
export const FEATURE_NEWS_REDMINE_PROJECT_IDENTIFIER = 'login-sso-quan-ly-nhan-su';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mZWF0dXJlLW5ld3MvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxxQkFBcUIsQ0FBQztBQUUxRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FDakQsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUHJlZml4IGxvY2FsU3RvcmFnZTogZmVhdHVyZV9uZXdzX3NlZW46Ojx1c2VySWQ+Ojo8cHJvamVjdElkZW50aWZpZXI+ICovXHJcbmV4cG9ydCBjb25zdCBGRUFUVVJFX05FV1NfU0VFTl9TVE9SQUdFX0tFWV9QUkVGSVggPSAnZmVhdHVyZV9uZXdzX3NlZW46Oic7XHJcblxyXG4vKipcclxuICogTeG6t2MgxJHhu4tuaCBwcm9qZWN0IGlkZW50aWZpZXIgdHLDqm4gUmVkbWluZSAoRUlVIEFwcCkuXHJcbiAqIOG7qG5nIGThu6VuZyBob3N0IGPDsyB0aOG7gyBkw7luZyBo4bqxbmcgbsOgeSBob+G6t2MgY2h14buXaSByacOqbmcga2hpIGfhu41pIHNlcnZpY2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRkVBVFVSRV9ORVdTX1JFRE1JTkVfUFJPSkVDVF9JREVOVElGSUVSID1cclxuICAgJ2xvZ2luLXNzby1xdWFuLWx5LW5oYW4tc3UnO1xyXG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { FeatureNewsDialogComponent } from './feature-news-dialog.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Import module này ở shell layout (hoặc `AppModule`) để có `<app-feature-news-dialog />`.
|
|
7
|
+
* Nhớ cung cấp `EIU_APP_API_BASE_URL` trong providers.
|
|
8
|
+
*/
|
|
9
|
+
export class EiuAppFeatureNewsModule {
|
|
10
|
+
}
|
|
11
|
+
EiuAppFeatureNewsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFeatureNewsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
EiuAppFeatureNewsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFeatureNewsModule, declarations: [FeatureNewsDialogComponent], imports: [CommonModule], exports: [FeatureNewsDialogComponent] });
|
|
13
|
+
EiuAppFeatureNewsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFeatureNewsModule, imports: [CommonModule] });
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFeatureNewsModule, decorators: [{
|
|
15
|
+
type: NgModule,
|
|
16
|
+
args: [{
|
|
17
|
+
imports: [CommonModule],
|
|
18
|
+
declarations: [FeatureNewsDialogComponent],
|
|
19
|
+
exports: [FeatureNewsDialogComponent]
|
|
20
|
+
}]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1mZWF0dXJlLW5ld3MubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mZWF0dXJlLW5ld3MvZWl1LWFwcC1mZWF0dXJlLW5ld3MubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQUU3RTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sdUJBQXVCOztxSEFBdkIsdUJBQXVCO3NIQUF2Qix1QkFBdUIsaUJBSGxCLDBCQUEwQixhQUQvQixZQUFZLGFBRVosMEJBQTBCO3NIQUUxQix1QkFBdUIsWUFKdkIsWUFBWTs0RkFJWix1QkFBdUI7a0JBTG5DLFFBQVE7bUJBQUM7b0JBQ1AsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixZQUFZLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDMUMsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmVhdHVyZU5ld3NEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2ZlYXR1cmUtbmV3cy1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBJbXBvcnQgbW9kdWxlIG7DoHkg4bufIHNoZWxsIGxheW91dCAoaG/hurdjIGBBcHBNb2R1bGVgKSDEkeG7gyBjw7MgYDxhcHAtZmVhdHVyZS1uZXdzLWRpYWxvZyAvPmAuXHJcbiAqIE5o4bubIGN1bmcgY+G6pXAgYEVJVV9BUFBfQVBJX0JBU0VfVVJMYCB0cm9uZyBwcm92aWRlcnMuXHJcbiAqL1xyXG5ATmdNb2R1bGUoe1xyXG4gICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICAgZGVjbGFyYXRpb25zOiBbRmVhdHVyZU5ld3NEaWFsb2dDb21wb25lbnRdLFxyXG4gICBleHBvcnRzOiBbRmVhdHVyZU5ld3NEaWFsb2dDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFaXVBcHBGZWF0dXJlTmV3c01vZHVsZSB7fVxyXG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FeatureNewsDialogService } from './feature-news-dialog.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class FeatureNewsDialogComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this._featureNewsDialogService = inject(FeatureNewsDialogService);
|
|
8
|
+
this._subscription = null;
|
|
9
|
+
this.dialogState = null;
|
|
10
|
+
}
|
|
11
|
+
ngOnInit() {
|
|
12
|
+
this._subscription = this._featureNewsDialogService.dialogState$.subscribe((state) => {
|
|
13
|
+
this.dialogState = state;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
ngOnDestroy() {
|
|
17
|
+
this._subscription?.unsubscribe();
|
|
18
|
+
}
|
|
19
|
+
getSummary(item) {
|
|
20
|
+
return this._truncateText(item.summary || '', 200);
|
|
21
|
+
}
|
|
22
|
+
closeDialog() {
|
|
23
|
+
this._featureNewsDialogService.close();
|
|
24
|
+
}
|
|
25
|
+
_truncateText(text, maxLength) {
|
|
26
|
+
if (!text) {
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
if (text.length <= maxLength) {
|
|
30
|
+
return text;
|
|
31
|
+
}
|
|
32
|
+
return `${text.slice(0, maxLength)}...`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
FeatureNewsDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
+
FeatureNewsDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FeatureNewsDialogComponent, selector: "app-feature-news-dialog", ngImport: i0, template: "<div class=\"feature-news-overlay\" *ngIf=\"dialogState\">\n <div class=\"feature-news-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"feature-news-title\">\n <div class=\"feature-news-header\">\n <div class=\"feature-news-header__main\">\n <div class=\"feature-news-brand\">\n <div class=\"feature-news-title-wrap mt-2\">\n <span id=\"feature-news-title\" class=\"feature-news-chip\">C\u1EADp nh\u1EADt t\u00EDnh n\u0103ng</span>\n </div>\n </div>\n </div>\n <button type=\"button\" class=\"feature-news-close\" aria-label=\"Dong\" (click)=\"closeDialog()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <div class=\"feature-news-body\">\n <div class=\"feature-news-item\" *ngFor=\"let item of dialogState?.news\">\n <div class=\"feature-news-item-head\">\n <h5 class=\"feature-news-content-label mt-2\">{{ item?.title }}</h5>\n <span class=\"feature-news-item-tag\">M\u1EDBi nh\u1EA5t</span>\n </div>\n <div class=\"feature-news-content-block\" *ngIf=\"item?.summary\">\n <div class=\"feature-news-content-label mt-2\">T\u00F3m t\u1EAFt</div>\n <div class=\"feature-news-content-panel\">\n <p class=\"feature-news-item-summary\">{{ getSummary(item) }}</p>\n </div>\n </div>\n <div class=\"feature-news-content-block\" *ngIf=\"item?.description\">\n <div class=\"feature-news-content-label mt-2\">Chi ti\u1EBFt</div>\n <div class=\"feature-news-content-panel feature-news-content-panel--detail\">\n <p class=\"feature-news-item-description\">{{ item?.description }}</p>\n </div>\n </div>\n <div class=\"feature-news-item-meta\">\n <span class=\"feature-news-item-meta__dot\" *ngIf=\"item?.author?.name\" aria-hidden=\"true\"></span>\n <span class=\"feature-news-item-meta__date\">{{\n item?.createdOn | date : 'dd/MM/yyyy'\n }}</span>\n\n </div>\n </div>\n </div>\n\n <div class=\"feature-news-footer\">\n <div class=\"feature-news-footer-note\">\n <span class=\"feature-news-footer-note__icon\" aria-hidden=\"true\"></span>\n Th\u00F4ng b\u00E1o ch\u1EC9 hi\u1EC7n khi c\u00F3 tin m\u1EDBi; b\u1EA1n lu\u00F4n c\u00F3 th\u1EC3 xem l\u1EA1i t\u1EEB footer.\n </div>\n <button type=\"button\" class=\"feature-news-confirm-btn\" (click)=\"closeDialog()\">\n \u0110\u00E3 hi\u1EC3u\n </button>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.feature-news-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:2000;padding:24px 16px;background:radial-gradient(ellipse 120% 80% at 50% 0%,rgba(30,58,95,.45) 0%,transparent 55%),rgba(15,23,42,.62);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.feature-news-dialog{--fn-gold: #c9a227;--fn-gold-soft: rgba(201, 162, 39, .35);--fn-navy: #0f172a;--fn-navy-mid: #1e293b;position:relative;width:100%;max-width:720px;max-height:min(86vh,880px);display:flex;flex-direction:column;border-radius:16px;overflow:hidden;background:linear-gradient(180deg,#ffffff 0%,#f8fafc 100%);border:1px solid rgba(255,255,255,.65);box-shadow:0 0 0 1px #0f172a0f,0 24px 56px #0f172a38,0 2px #ffffffe6 inset}.feature-news-header{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;padding:20px 22px 16px;background:linear-gradient(165deg,#f8fafc 0%,#ffffff 42%,rgba(248,250,252,.96) 100%);border-bottom:1px solid rgba(148,163,184,.28)}.feature-news-header__main{flex:1;min-width:0}.feature-news-brand{display:flex;gap:14px;align-items:flex-start}.feature-news-title-wrap{display:flex;flex-direction:column;gap:8px;min-width:0}.feature-news-chip{font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:#1d4ed8}.feature-news-title-wrap h4{margin:0;color:var(--fn-navy);font-size:21px;font-weight:800;letter-spacing:-.02em;line-height:1.25}.feature-news-subtitle{margin:0;color:#64748b;font-size:13px;line-height:1.5;max-width:52ch}.feature-news-close{flex-shrink:0;width:38px;height:38px;border:1px solid rgba(148,163,184,.35);border-radius:12px;background:linear-gradient(180deg,#ffffff 0%,#f1f5f9 100%);color:#64748b;font-size:22px;line-height:1;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,box-shadow .2s ease}.feature-news-close:hover{color:var(--fn-navy);border-color:#2563eb59;box-shadow:0 4px 14px #2563eb1f}.feature-news-close:focus{outline:none;box-shadow:0 0 0 3px #93c5fd8c}.feature-news-body{flex:1 1 auto;overflow-y:auto;padding:18px 22px 14px;background:linear-gradient(180deg,#f8fafc 0%,#ffffff 100%);-webkit-overflow-scrolling:touch}.feature-news-item{border-radius:14px;padding:0;margin-bottom:0;background:#ffffff;border:1px solid rgba(148,163,184,.22);box-shadow:0 1px #ffffffe6 inset,0 8px 28px #0f172a0f;overflow:hidden}.feature-news-item-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 18px 12px;background:linear-gradient(180deg,rgba(248,250,252,.9) 0%,#ffffff 100%);border-bottom:1px solid rgba(226,232,240,.9)}.feature-news-item-title{margin:0;font-size:18px;font-weight:800;color:var(--fn-navy);letter-spacing:-.02em;line-height:1.3}.feature-news-item-tag{flex-shrink:0;padding:5px 11px;border-radius:999px;font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:#1e40af;background:rgba(239,246,255,.95);border:1px solid rgba(191,219,254,.95)}.feature-news-content-block{padding:0 18px;margin-bottom:0}.feature-news-content-block:first-of-type{padding-top:14px}.feature-news-content-block+.feature-news-content-block{padding-top:12px}.feature-news-content-label{display:block;margin-bottom:8px;font-size:11px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:#64748b}.feature-news-content-panel{margin-bottom:14px;padding:12px 14px;border-radius:10px;background:#f8fafc;border:1px solid rgba(226,232,240,.95)}.feature-news-content-panel--detail{background:linear-gradient(180deg,#fafbfc 0%,#f1f5f9 100%)}.feature-news-item-summary,.feature-news-item-description{margin:0;font-size:14px;line-height:1.65;white-space:pre-line;color:#334155}.feature-news-item-description{color:#1e293b}.feature-news-item-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:12px 18px 16px;margin-top:0;font-size:12px;font-weight:600;color:#64748b;border-top:1px solid rgba(241,245,249,.98);background:rgba(248,250,252,.65)}.feature-news-item-meta__date{font-variant-numeric:tabular-nums;color:#475569}.feature-news-item-meta__dot{width:4px;height:4px;border-radius:50%;background:linear-gradient(180deg,var(--fn-gold),#94a3b8)}.feature-news-item-meta__author{color:#334155}.feature-news-footer{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 22px 18px;border-top:1px solid rgba(226,232,240,.95);background:linear-gradient(180deg,#f8fafc 0%,#f1f5f9 100%)}.feature-news-footer-note{display:flex;align-items:flex-start;gap:10px;flex:1;min-width:0;font-size:12px;line-height:1.45;color:#64748b}.feature-news-footer-note__icon{flex-shrink:0;width:8px;height:8px;margin-top:4px;border-radius:50%;background:radial-gradient(circle at 30% 30%,#93c5fd,#2563eb);box-shadow:0 0 0 2px #2563eb26}.feature-news-confirm-btn{flex-shrink:0;min-width:128px;padding:10px 22px;border:none;border-radius:10px;font-size:14px;font-weight:700;letter-spacing:.02em;color:#fff;cursor:pointer;background:linear-gradient(180deg,#3b82f6 0%,#1d4ed8 48%,#1e3a8a 100%);box-shadow:0 1px #fff3 inset,0 8px 22px #2563eb59;transition:box-shadow .2s ease,transform .15s ease}.feature-news-confirm-btn:hover{box-shadow:0 1px #ffffff40 inset,0 10px 28px #2563eb6b}.feature-news-confirm-btn:focus{outline:none;box-shadow:0 1px #fff3 inset,0 0 0 3px #c9a22773,0 8px 22px #2563eb59}.feature-news-confirm-btn:active{transform:translateY(1px)}@media (max-width: 768px){.feature-news-overlay{padding:12px}.feature-news-dialog{max-height:90vh;border-radius:14px}.feature-news-header{padding:16px 16px 14px}.feature-news-brand{gap:10px}.feature-news-title-wrap h4{font-size:18px}.feature-news-subtitle{font-size:12px}.feature-news-body{padding:14px 14px 10px}.feature-news-item-head{flex-direction:column;align-items:flex-start;padding:14px 14px 10px}.feature-news-content-block{padding:0 14px}.feature-news-content-block:first-of-type{padding-top:12px}.feature-news-item-meta{padding:10px 14px 14px}.feature-news-footer{flex-direction:column;align-items:stretch;padding:12px 14px 16px;text-align:center}.feature-news-footer-note{justify-content:center;text-align:left}.feature-news-confirm-btn{width:100%}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsDialogComponent, decorators: [{
|
|
38
|
+
type: Component,
|
|
39
|
+
args: [{ selector: 'app-feature-news-dialog', template: "<div class=\"feature-news-overlay\" *ngIf=\"dialogState\">\n <div class=\"feature-news-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"feature-news-title\">\n <div class=\"feature-news-header\">\n <div class=\"feature-news-header__main\">\n <div class=\"feature-news-brand\">\n <div class=\"feature-news-title-wrap mt-2\">\n <span id=\"feature-news-title\" class=\"feature-news-chip\">C\u1EADp nh\u1EADt t\u00EDnh n\u0103ng</span>\n </div>\n </div>\n </div>\n <button type=\"button\" class=\"feature-news-close\" aria-label=\"Dong\" (click)=\"closeDialog()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <div class=\"feature-news-body\">\n <div class=\"feature-news-item\" *ngFor=\"let item of dialogState?.news\">\n <div class=\"feature-news-item-head\">\n <h5 class=\"feature-news-content-label mt-2\">{{ item?.title }}</h5>\n <span class=\"feature-news-item-tag\">M\u1EDBi nh\u1EA5t</span>\n </div>\n <div class=\"feature-news-content-block\" *ngIf=\"item?.summary\">\n <div class=\"feature-news-content-label mt-2\">T\u00F3m t\u1EAFt</div>\n <div class=\"feature-news-content-panel\">\n <p class=\"feature-news-item-summary\">{{ getSummary(item) }}</p>\n </div>\n </div>\n <div class=\"feature-news-content-block\" *ngIf=\"item?.description\">\n <div class=\"feature-news-content-label mt-2\">Chi ti\u1EBFt</div>\n <div class=\"feature-news-content-panel feature-news-content-panel--detail\">\n <p class=\"feature-news-item-description\">{{ item?.description }}</p>\n </div>\n </div>\n <div class=\"feature-news-item-meta\">\n <span class=\"feature-news-item-meta__dot\" *ngIf=\"item?.author?.name\" aria-hidden=\"true\"></span>\n <span class=\"feature-news-item-meta__date\">{{\n item?.createdOn | date : 'dd/MM/yyyy'\n }}</span>\n\n </div>\n </div>\n </div>\n\n <div class=\"feature-news-footer\">\n <div class=\"feature-news-footer-note\">\n <span class=\"feature-news-footer-note__icon\" aria-hidden=\"true\"></span>\n Th\u00F4ng b\u00E1o ch\u1EC9 hi\u1EC7n khi c\u00F3 tin m\u1EDBi; b\u1EA1n lu\u00F4n c\u00F3 th\u1EC3 xem l\u1EA1i t\u1EEB footer.\n </div>\n <button type=\"button\" class=\"feature-news-confirm-btn\" (click)=\"closeDialog()\">\n \u0110\u00E3 hi\u1EC3u\n </button>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.feature-news-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:2000;padding:24px 16px;background:radial-gradient(ellipse 120% 80% at 50% 0%,rgba(30,58,95,.45) 0%,transparent 55%),rgba(15,23,42,.62);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.feature-news-dialog{--fn-gold: #c9a227;--fn-gold-soft: rgba(201, 162, 39, .35);--fn-navy: #0f172a;--fn-navy-mid: #1e293b;position:relative;width:100%;max-width:720px;max-height:min(86vh,880px);display:flex;flex-direction:column;border-radius:16px;overflow:hidden;background:linear-gradient(180deg,#ffffff 0%,#f8fafc 100%);border:1px solid rgba(255,255,255,.65);box-shadow:0 0 0 1px #0f172a0f,0 24px 56px #0f172a38,0 2px #ffffffe6 inset}.feature-news-header{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;padding:20px 22px 16px;background:linear-gradient(165deg,#f8fafc 0%,#ffffff 42%,rgba(248,250,252,.96) 100%);border-bottom:1px solid rgba(148,163,184,.28)}.feature-news-header__main{flex:1;min-width:0}.feature-news-brand{display:flex;gap:14px;align-items:flex-start}.feature-news-title-wrap{display:flex;flex-direction:column;gap:8px;min-width:0}.feature-news-chip{font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:#1d4ed8}.feature-news-title-wrap h4{margin:0;color:var(--fn-navy);font-size:21px;font-weight:800;letter-spacing:-.02em;line-height:1.25}.feature-news-subtitle{margin:0;color:#64748b;font-size:13px;line-height:1.5;max-width:52ch}.feature-news-close{flex-shrink:0;width:38px;height:38px;border:1px solid rgba(148,163,184,.35);border-radius:12px;background:linear-gradient(180deg,#ffffff 0%,#f1f5f9 100%);color:#64748b;font-size:22px;line-height:1;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,box-shadow .2s ease}.feature-news-close:hover{color:var(--fn-navy);border-color:#2563eb59;box-shadow:0 4px 14px #2563eb1f}.feature-news-close:focus{outline:none;box-shadow:0 0 0 3px #93c5fd8c}.feature-news-body{flex:1 1 auto;overflow-y:auto;padding:18px 22px 14px;background:linear-gradient(180deg,#f8fafc 0%,#ffffff 100%);-webkit-overflow-scrolling:touch}.feature-news-item{border-radius:14px;padding:0;margin-bottom:0;background:#ffffff;border:1px solid rgba(148,163,184,.22);box-shadow:0 1px #ffffffe6 inset,0 8px 28px #0f172a0f;overflow:hidden}.feature-news-item-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 18px 12px;background:linear-gradient(180deg,rgba(248,250,252,.9) 0%,#ffffff 100%);border-bottom:1px solid rgba(226,232,240,.9)}.feature-news-item-title{margin:0;font-size:18px;font-weight:800;color:var(--fn-navy);letter-spacing:-.02em;line-height:1.3}.feature-news-item-tag{flex-shrink:0;padding:5px 11px;border-radius:999px;font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:#1e40af;background:rgba(239,246,255,.95);border:1px solid rgba(191,219,254,.95)}.feature-news-content-block{padding:0 18px;margin-bottom:0}.feature-news-content-block:first-of-type{padding-top:14px}.feature-news-content-block+.feature-news-content-block{padding-top:12px}.feature-news-content-label{display:block;margin-bottom:8px;font-size:11px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:#64748b}.feature-news-content-panel{margin-bottom:14px;padding:12px 14px;border-radius:10px;background:#f8fafc;border:1px solid rgba(226,232,240,.95)}.feature-news-content-panel--detail{background:linear-gradient(180deg,#fafbfc 0%,#f1f5f9 100%)}.feature-news-item-summary,.feature-news-item-description{margin:0;font-size:14px;line-height:1.65;white-space:pre-line;color:#334155}.feature-news-item-description{color:#1e293b}.feature-news-item-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:12px 18px 16px;margin-top:0;font-size:12px;font-weight:600;color:#64748b;border-top:1px solid rgba(241,245,249,.98);background:rgba(248,250,252,.65)}.feature-news-item-meta__date{font-variant-numeric:tabular-nums;color:#475569}.feature-news-item-meta__dot{width:4px;height:4px;border-radius:50%;background:linear-gradient(180deg,var(--fn-gold),#94a3b8)}.feature-news-item-meta__author{color:#334155}.feature-news-footer{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 22px 18px;border-top:1px solid rgba(226,232,240,.95);background:linear-gradient(180deg,#f8fafc 0%,#f1f5f9 100%)}.feature-news-footer-note{display:flex;align-items:flex-start;gap:10px;flex:1;min-width:0;font-size:12px;line-height:1.45;color:#64748b}.feature-news-footer-note__icon{flex-shrink:0;width:8px;height:8px;margin-top:4px;border-radius:50%;background:radial-gradient(circle at 30% 30%,#93c5fd,#2563eb);box-shadow:0 0 0 2px #2563eb26}.feature-news-confirm-btn{flex-shrink:0;min-width:128px;padding:10px 22px;border:none;border-radius:10px;font-size:14px;font-weight:700;letter-spacing:.02em;color:#fff;cursor:pointer;background:linear-gradient(180deg,#3b82f6 0%,#1d4ed8 48%,#1e3a8a 100%);box-shadow:0 1px #fff3 inset,0 8px 22px #2563eb59;transition:box-shadow .2s ease,transform .15s ease}.feature-news-confirm-btn:hover{box-shadow:0 1px #ffffff40 inset,0 10px 28px #2563eb6b}.feature-news-confirm-btn:focus{outline:none;box-shadow:0 1px #fff3 inset,0 0 0 3px #c9a22773,0 8px 22px #2563eb59}.feature-news-confirm-btn:active{transform:translateY(1px)}@media (max-width: 768px){.feature-news-overlay{padding:12px}.feature-news-dialog{max-height:90vh;border-radius:14px}.feature-news-header{padding:16px 16px 14px}.feature-news-brand{gap:10px}.feature-news-title-wrap h4{font-size:18px}.feature-news-subtitle{font-size:12px}.feature-news-body{padding:14px 14px 10px}.feature-news-item-head{flex-direction:column;align-items:flex-start;padding:14px 14px 10px}.feature-news-content-block{padding:0 14px}.feature-news-content-block:first-of-type{padding-top:12px}.feature-news-item-meta{padding:10px 14px 14px}.feature-news-footer{flex-direction:column;align-items:stretch;padding:12px 14px 16px;text-align:center}.feature-news-footer-note{justify-content:center;text-align:left}.feature-news-confirm-btn{width:100%}}\n"] }]
|
|
40
|
+
}] });
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1uZXdzLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9laXUtYXBwLWtpdC9zcmMvbGliL2ZlYXR1cmUtbmV3cy9mZWF0dXJlLW5ld3MtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9saWIvZmVhdHVyZS1uZXdzL2ZlYXR1cmUtbmV3cy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3JFLE9BQU8sRUFDSix3QkFBd0IsRUFFMUIsTUFBTSwrQkFBK0IsQ0FBQzs7O0FBT3ZDLE1BQU0sT0FBTywwQkFBMEI7SUFMdkM7UUFNb0IsOEJBQXlCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdEUsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBQ3hDLGdCQUFXLEdBQWtDLElBQUksQ0FBQztLQStCOUQ7SUE3QkUsUUFBUTtRQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ3ZFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDLENBQ0gsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1IsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXFCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsV0FBVztRQUNSLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVksRUFBRSxTQUFpQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1IsT0FBTyxFQUFFLENBQUM7U0FDWjtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDZDtRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7O3dIQWpDUywwQkFBMEI7NEdBQTFCLDBCQUEwQiwrRENidkMsMnRGQXFETTs0RkR4Q08sMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNHLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZWRtaW5lTmV3c0l0ZW0gfSBmcm9tICcuL21vZGVscy9yZWRtaW5lLW5ld3MubW9kZWwnO1xuaW1wb3J0IHtcbiAgIEZlYXR1cmVOZXdzRGlhbG9nU2VydmljZSxcbiAgIEZlYXR1cmVOZXdzRGlhbG9nU3RhdGVcbn0gZnJvbSAnLi9mZWF0dXJlLW5ld3MtZGlhbG9nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnYXBwLWZlYXR1cmUtbmV3cy1kaWFsb2cnLFxuICAgdGVtcGxhdGVVcmw6ICcuL2ZlYXR1cmUtbmV3cy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgc3R5bGVVcmxzOiBbJy4vZmVhdHVyZS1uZXdzLWRpYWxvZy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZlYXR1cmVOZXdzRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgcHJpdmF0ZSByZWFkb25seSBfZmVhdHVyZU5ld3NEaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEZlYXR1cmVOZXdzRGlhbG9nU2VydmljZSk7XG4gICBwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAgcHJvdGVjdGVkIGRpYWxvZ1N0YXRlOiBGZWF0dXJlTmV3c0RpYWxvZ1N0YXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5fZmVhdHVyZU5ld3NEaWFsb2dTZXJ2aWNlLmRpYWxvZ1N0YXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgIH1cbiAgICAgICk7XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgfVxuXG4gICBnZXRTdW1tYXJ5KGl0ZW06IFJlZG1pbmVOZXdzSXRlbSk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJ1bmNhdGVUZXh0KGl0ZW0uc3VtbWFyeSB8fCAnJywgMjAwKTtcbiAgIH1cblxuICAgY2xvc2VEaWFsb2coKTogdm9pZCB7XG4gICAgICB0aGlzLl9mZWF0dXJlTmV3c0RpYWxvZ1NlcnZpY2UuY2xvc2UoKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBfdHJ1bmNhdGVUZXh0KHRleHQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICBpZiAodGV4dC5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHt0ZXh0LnNsaWNlKDAsIG1heExlbmd0aCl9Li4uYDtcbiAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3Mtb3ZlcmxheVwiICpuZ0lmPVwiZGlhbG9nU3RhdGVcIj5cbiAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtZGlhbG9nXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZmVhdHVyZS1uZXdzLXRpdGxlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWhlYWRlclwiPlxuICAgICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtbmV3cy1oZWFkZXJfX21haW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtYnJhbmRcIj5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtdGl0bGUtd3JhcCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImZlYXR1cmUtbmV3cy10aXRsZVwiIGNsYXNzPVwiZmVhdHVyZS1uZXdzLWNoaXBcIj5D4bqtcCBuaOG6rXQgdMOtbmggbsSDbmc8L3NwYW4+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPC9kaXY+XG4gICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZlYXR1cmUtbmV3cy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJEb25nXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWJvZHlcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRpYWxvZ1N0YXRlPy5uZXdzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWl0ZW0taGVhZFwiPlxuICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWNvbnRlbnQtbGFiZWwgbXQtMlwiPnt7IGl0ZW0/LnRpdGxlIH19PC9oNT5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmVhdHVyZS1uZXdzLWl0ZW0tdGFnXCI+TeG7m2kgbmjhuqV0PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWNvbnRlbnQtYmxvY2tcIiAqbmdJZj1cIml0ZW0/LnN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtY29udGVudC1sYWJlbCBtdC0yXCI+VMOzbSB04bqvdDwvZGl2PlxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtbmV3cy1jb250ZW50LXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZlYXR1cmUtbmV3cy1pdGVtLXN1bW1hcnlcIj57eyBnZXRTdW1tYXJ5KGl0ZW0pIH19PC9wPlxuICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtY29udGVudC1ibG9ja1wiICpuZ0lmPVwiaXRlbT8uZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWF0dXJlLW5ld3MtY29udGVudC1sYWJlbCBtdC0yXCI+Q2hpIHRp4bq/dDwvZGl2PlxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtbmV3cy1jb250ZW50LXBhbmVsIGZlYXR1cmUtbmV3cy1jb250ZW50LXBhbmVsLS1kZXRhaWxcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmVhdHVyZS1uZXdzLWl0ZW0tZGVzY3JpcHRpb25cIj57eyBpdGVtPy5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWl0ZW0tbWV0YVwiPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZWF0dXJlLW5ld3MtaXRlbS1tZXRhX19kb3RcIiAqbmdJZj1cIml0ZW0/LmF1dGhvcj8ubmFtZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmVhdHVyZS1uZXdzLWl0ZW0tbWV0YV9fZGF0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICBpdGVtPy5jcmVhdGVkT24gfCBkYXRlIDogJ2RkL01NL3l5eXknXG4gICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZS1uZXdzLWZvb3RlclwiPlxuICAgICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtbmV3cy1mb290ZXItbm90ZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZWF0dXJlLW5ld3MtZm9vdGVyLW5vdGVfX2ljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICBUaMO0bmcgYsOhbyBjaOG7iSBoaeG7h24ga2hpIGPDsyB0aW4gbeG7m2k7IGLhuqFuIGx1w7RuIGPDsyB0aOG7gyB4ZW0gbOG6oWkgdOG7qyBmb290ZXIuXG4gICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmVhdHVyZS1uZXdzLWNvbmZpcm0tYnRuXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgIMSQw6MgaGnhu4N1XG4gICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject, take } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class FeatureNewsDialogService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this._dialogState = new BehaviorSubject(null);
|
|
7
|
+
this._closeNotifier = null;
|
|
8
|
+
this.dialogState$ = this._dialogState.asObservable();
|
|
9
|
+
}
|
|
10
|
+
open(news) {
|
|
11
|
+
this._closeNotifier = new Subject();
|
|
12
|
+
this._dialogState.next({ news });
|
|
13
|
+
return this._closeNotifier.asObservable().pipe(take(1));
|
|
14
|
+
}
|
|
15
|
+
close() {
|
|
16
|
+
this._dialogState.next(null);
|
|
17
|
+
this._closeNotifier?.next();
|
|
18
|
+
this._closeNotifier?.complete();
|
|
19
|
+
this._closeNotifier = null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
FeatureNewsDialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
23
|
+
FeatureNewsDialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsDialogService, providedIn: 'root' });
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsDialogService, decorators: [{
|
|
25
|
+
type: Injectable,
|
|
26
|
+
args: [{
|
|
27
|
+
providedIn: 'root'
|
|
28
|
+
}]
|
|
29
|
+
}] });
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1uZXdzLWRpYWxvZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mZWF0dXJlLW5ld3MvZmVhdHVyZS1uZXdzLWRpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQVVsRSxNQUFNLE9BQU8sd0JBQXdCO0lBSHJDO1FBSW9CLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQ2hELElBQUksQ0FDTixDQUFDO1FBQ00sbUJBQWMsR0FBeUIsSUFBSSxDQUFDO1FBRTNDLGlCQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQWMzRDtJQVpFLElBQUksQ0FBQyxJQUF1QjtRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELEtBQUs7UUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQzs7c0hBbkJTLHdCQUF3QjswSEFBeEIsd0JBQXdCLGNBRnRCLE1BQU07NEZBRVIsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNULFVBQVUsRUFBRSxNQUFNO2lCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlZG1pbmVOZXdzSXRlbSB9IGZyb20gJy4vbW9kZWxzL3JlZG1pbmUtbmV3cy5tb2RlbCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVOZXdzRGlhbG9nU3RhdGUge1xyXG4gICBuZXdzOiBSZWRtaW5lTmV3c0l0ZW1bXTtcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZlYXR1cmVOZXdzRGlhbG9nU2VydmljZSB7XHJcbiAgIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1N0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlTmV3c0RpYWxvZ1N0YXRlIHwgbnVsbD4oXHJcbiAgICAgIG51bGxcclxuICAgKTtcclxuICAgcHJpdmF0ZSBfY2xvc2VOb3RpZmllcjogU3ViamVjdDx2b2lkPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgcmVhZG9ubHkgZGlhbG9nU3RhdGUkID0gdGhpcy5fZGlhbG9nU3RhdGUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICBvcGVuKG5ld3M6IFJlZG1pbmVOZXdzSXRlbVtdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgIHRoaXMuX2Nsb3NlTm90aWZpZXIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgICB0aGlzLl9kaWFsb2dTdGF0ZS5uZXh0KHsgbmV3cyB9KTtcclxuICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlTm90aWZpZXIuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKTtcclxuICAgfVxyXG5cclxuICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuX2RpYWxvZ1N0YXRlLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMuX2Nsb3NlTm90aWZpZXI/Lm5leHQoKTtcclxuICAgICAgdGhpcy5fY2xvc2VOb3RpZmllcj8uY29tcGxldGUoKTtcclxuICAgICAgdGhpcy5fY2xvc2VOb3RpZmllciA9IG51bGw7XHJcbiAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { catchError, map, of, switchMap, tap } from 'rxjs';
|
|
3
|
+
import { FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX } from './constants';
|
|
4
|
+
import { FeatureNewsDialogService } from './feature-news-dialog.service';
|
|
5
|
+
import { NewsApiService } from './news-api.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class FeatureNewsService {
|
|
8
|
+
constructor() {
|
|
9
|
+
this._newsApiService = inject(NewsApiService);
|
|
10
|
+
this._featureNewsDialogService = inject(FeatureNewsDialogService);
|
|
11
|
+
}
|
|
12
|
+
buildSeenKey(userId, projectIdentifier) {
|
|
13
|
+
return `${FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX}${userId}::${projectIdentifier}`;
|
|
14
|
+
}
|
|
15
|
+
hasSeenLatestNews(userId, projectIdentifier, latestNewsId) {
|
|
16
|
+
const key = this.buildSeenKey(userId, projectIdentifier);
|
|
17
|
+
return localStorage.getItem(key) === String(latestNewsId);
|
|
18
|
+
}
|
|
19
|
+
markSeen(userId, projectIdentifier, latestNewsId) {
|
|
20
|
+
const key = this.buildSeenKey(userId, projectIdentifier);
|
|
21
|
+
localStorage.setItem(key, String(latestNewsId));
|
|
22
|
+
}
|
|
23
|
+
checkAndShowFeatureNews(userId, projectIdentifier) {
|
|
24
|
+
return this._newsApiService.getNewsByProjectIdentifier(projectIdentifier, 1).pipe(switchMap((result) => {
|
|
25
|
+
const news = result.success ? (result.data?.news ?? []).slice(0, 1) : [];
|
|
26
|
+
if (!news.length) {
|
|
27
|
+
return of(void 0);
|
|
28
|
+
}
|
|
29
|
+
const latestNews = news[0];
|
|
30
|
+
if (this.hasSeenLatestNews(userId, projectIdentifier, latestNews.id)) {
|
|
31
|
+
return of(void 0);
|
|
32
|
+
}
|
|
33
|
+
return this._featureNewsDialogService.open(news).pipe(tap(() => this.markSeen(userId, projectIdentifier, latestNews.id)), map(() => void 0));
|
|
34
|
+
}), catchError(() => of(void 0)));
|
|
35
|
+
}
|
|
36
|
+
showLatestFeatureNewsManually(userId, projectIdentifier) {
|
|
37
|
+
return this._newsApiService.getNewsByProjectIdentifier(projectIdentifier, 1).pipe(switchMap((result) => {
|
|
38
|
+
const news = result.success ? (result.data?.news ?? []).slice(0, 1) : [];
|
|
39
|
+
if (!news.length) {
|
|
40
|
+
return of(void 0);
|
|
41
|
+
}
|
|
42
|
+
const latestNews = news[0];
|
|
43
|
+
return this._featureNewsDialogService.open(news).pipe(tap(() => this.markSeen(userId, projectIdentifier, latestNews.id)), map(() => void 0));
|
|
44
|
+
}), catchError(() => of(void 0)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
FeatureNewsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
48
|
+
FeatureNewsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsService, providedIn: 'root' });
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FeatureNewsService, decorators: [{
|
|
50
|
+
type: Injectable,
|
|
51
|
+
args: [{
|
|
52
|
+
providedIn: 'root'
|
|
53
|
+
}]
|
|
54
|
+
}] });
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1uZXdzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9laXUtYXBwLWtpdC9zcmMvbGliL2ZlYXR1cmUtbmV3cy9mZWF0dXJlLW5ld3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUtwRCxNQUFNLE9BQU8sa0JBQWtCO0lBSC9CO1FBSW9CLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pDLDhCQUF5QixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0tBK0RoRjtJQTdERSxZQUFZLENBQUMsTUFBYyxFQUFFLGlCQUF5QjtRQUNuRCxPQUFPLEdBQUcsb0NBQW9DLEdBQUcsTUFBTSxLQUFLLGlCQUFpQixFQUFFLENBQUM7SUFDbkYsQ0FBQztJQUVELGlCQUFpQixDQUNkLE1BQWMsRUFDZCxpQkFBeUIsRUFDekIsWUFBb0I7UUFFcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxRQUFRLENBQUMsTUFBYyxFQUFFLGlCQUF5QixFQUFFLFlB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QUFNOzRGQUVSLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVCxVQUFVLEVBQUUsTUFBTTtpQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgbWFwLCBvZiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRkVBVFVSRV9ORVdTX1NFRU5fU1RPUkFHRV9LRVlfUFJFRklYIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBGZWF0dXJlTmV3c0RpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL2ZlYXR1cmUtbmV3cy1kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ld3NBcGlTZXJ2aWNlIH0gZnJvbSAnLi9uZXdzLWFwaS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGZWF0dXJlTmV3c1NlcnZpY2Uge1xyXG4gICBwcml2YXRlIHJlYWRvbmx5IF9uZXdzQXBpU2VydmljZSA9IGluamVjdChOZXdzQXBpU2VydmljZSk7XHJcbiAgIHByaXZhdGUgcmVhZG9ubHkgX2ZlYXR1cmVOZXdzRGlhbG9nU2VydmljZSA9IGluamVjdChGZWF0dXJlTmV3c0RpYWxvZ1NlcnZpY2UpO1xyXG5cclxuICAgYnVpbGRTZWVuS2V5KHVzZXJJZDogc3RyaW5nLCBwcm9qZWN0SWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGAke0ZFQVRVUkVfTkVXU19TRUVOX1NUT1JBR0VfS0VZX1BSRUZJWH0ke3VzZXJJZH06OiR7cHJvamVjdElkZW50aWZpZXJ9YDtcclxuICAgfVxyXG5cclxuICAgaGFzU2VlbkxhdGVzdE5ld3MoXHJcbiAgICAgIHVzZXJJZDogc3RyaW5nLFxyXG4gICAgICBwcm9qZWN0SWRlbnRpZmllcjogc3RyaW5nLFxyXG4gICAgICBsYXRlc3ROZXdzSWQ6IG51bWJlclxyXG4gICApOiBib29sZWFuIHtcclxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZFNlZW5LZXkodXNlcklkLCBwcm9qZWN0SWRlbnRpZmllcik7XHJcbiAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpID09PSBTdHJpbmcobGF0ZXN0TmV3c0lkKTtcclxuICAgfVxyXG5cclxuICAgbWFya1NlZW4odXNlcklkOiBzdHJpbmcsIHByb2plY3RJZGVudGlmaWVyOiBzdHJpbmcsIGxhdGVzdE5ld3NJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRTZWVuS2V5KHVzZXJJZCwgcHJvamVjdElkZW50aWZpZXIpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIFN0cmluZyhsYXRlc3ROZXdzSWQpKTtcclxuICAgfVxyXG5cclxuICAgY2hlY2tBbmRTaG93RmVhdHVyZU5ld3MoXHJcbiAgICAgIHVzZXJJZDogc3RyaW5nLFxyXG4gICAgICBwcm9qZWN0SWRlbnRpZmllcjogc3RyaW5nXHJcbiAgICk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbmV3c0FwaVNlcnZpY2UuZ2V0TmV3c0J5UHJvamVjdElkZW50aWZpZXIocHJvamVjdElkZW50aWZpZXIsIDEpLnBpcGUoXHJcbiAgICAgICAgIHN3aXRjaE1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld3MgPSByZXN1bHQuc3VjY2VzcyA/IChyZXN1bHQuZGF0YT8ubmV3cyA/PyBbXSkuc2xpY2UoMCwgMSkgOiBbXTtcclxuICAgICAgICAgICAgaWYgKCFuZXdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICByZXR1cm4gb2Yodm9pZCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBsYXRlc3ROZXdzID0gbmV3c1swXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzU2VlbkxhdGVzdE5ld3ModXNlcklkLCBwcm9qZWN0SWRlbnRpZmllciwgbGF0ZXN0TmV3cy5pZCkpIHtcclxuICAgICAgICAgICAgICAgcmV0dXJuIG9mKHZvaWQgMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mZWF0dXJlTmV3c0RpYWxvZ1NlcnZpY2Uub3BlbihuZXdzKS5waXBlKFxyXG4gICAgICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5tYXJrU2Vlbih1c2VySWQsIHByb2plY3RJZGVudGlmaWVyLCBsYXRlc3ROZXdzLmlkKSksXHJcbiAgICAgICAgICAgICAgIG1hcCgoKSA9PiB2b2lkIDApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgIH0pLFxyXG4gICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHZvaWQgMCkpXHJcbiAgICAgICk7XHJcbiAgIH1cclxuXHJcbiAgIHNob3dMYXRlc3RGZWF0dXJlTmV3c01hbnVhbGx5KFxyXG4gICAgICB1c2VySWQ6IHN0cmluZyxcclxuICAgICAgcHJvamVjdElkZW50aWZpZXI6IHN0cmluZ1xyXG4gICApOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuX25ld3NBcGlTZXJ2aWNlLmdldE5ld3NCeVByb2plY3RJZGVudGlmaWVyKHByb2plY3RJZGVudGlmaWVyLCAxKS5waXBlKFxyXG4gICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdzID0gcmVzdWx0LnN1Y2Nlc3MgPyAocmVzdWx0LmRhdGE/Lm5ld3MgPz8gW10pLnNsaWNlKDAsIDEpIDogW107XHJcbiAgICAgICAgICAgIGlmICghbmV3cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgcmV0dXJuIG9mKHZvaWQgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbGF0ZXN0TmV3cyA9IG5ld3NbMF07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mZWF0dXJlTmV3c0RpYWxvZ1NlcnZpY2Uub3BlbihuZXdzKS5waXBlKFxyXG4gICAgICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5tYXJrU2Vlbih1c2VySWQsIHByb2plY3RJZGVudGlmaWVyLCBsYXRlc3ROZXdzLmlkKSksXHJcbiAgICAgICAgICAgICAgIG1hcCgoKSA9PiB2b2lkIDApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgIH0pLFxyXG4gICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHZvaWQgMCkpXHJcbiAgICAgICk7XHJcbiAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLXJlc3VsdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9saWIvZmVhdHVyZS1uZXdzL21vZGVscy9vcGVyYXRpb24tcmVzdWx0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblJlc3VsdDxUPiB7XHJcbiAgIHN0YXR1c0NvZGU6IG51bWJlcjtcclxuICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICBzdWNjZXNzOiBib29sZWFuO1xyXG4gICBkYXRhOiBUIHwgbnVsbDtcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkbWluZS1uZXdzLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mZWF0dXJlLW5ld3MvbW9kZWxzL3JlZG1pbmUtbmV3cy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBSZWRtaW5lQXV0aG9yIHtcclxuICAgaWQ6IG51bWJlcjtcclxuICAgbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlZG1pbmVOZXdzSXRlbSB7XHJcbiAgIGlkOiBudW1iZXI7XHJcbiAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgIHN1bW1hcnk6IHN0cmluZztcclxuICAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICAgY3JlYXRlZE9uOiBzdHJpbmc7XHJcbiAgIGF1dGhvcjogUmVkbWluZUF1dGhvciB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVkbWluZU5ld3NSZXNwb25zZSB7XHJcbiAgIHByb2plY3ROYW1lOiBzdHJpbmc7XHJcbiAgIHByb2plY3RJZGVudGlmaWVyOiBzdHJpbmc7XHJcbiAgIG5ld3M6IFJlZG1pbmVOZXdzSXRlbVtdO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { HttpClient, HttpParams } from '@angular/common/http';
|
|
2
|
+
import { Injectable, inject } from '@angular/core';
|
|
3
|
+
import { catchError, of } from 'rxjs';
|
|
4
|
+
import { EIU_APP_API_BASE_URL } from '../eiu-app-kit.tokens';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class NewsApiService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this._httpClient = inject(HttpClient);
|
|
9
|
+
this._apiBaseUrl = inject(EIU_APP_API_BASE_URL);
|
|
10
|
+
}
|
|
11
|
+
getNewsByProjectIdentifier(projectIdentifier, limit = 1) {
|
|
12
|
+
const params = new HttpParams()
|
|
13
|
+
.set('projectIdentifier', projectIdentifier)
|
|
14
|
+
.set('limit', String(limit));
|
|
15
|
+
const url = `${this._apiBaseUrl}/News/GetRedmineNewsByProjectIdentifier`;
|
|
16
|
+
return this._httpClient
|
|
17
|
+
.get(url, { params })
|
|
18
|
+
.pipe(catchError((error) => of({
|
|
19
|
+
success: false,
|
|
20
|
+
statusCode: 500,
|
|
21
|
+
message: error instanceof Error
|
|
22
|
+
? error.message
|
|
23
|
+
: 'Cannot get feature news from API.',
|
|
24
|
+
data: null
|
|
25
|
+
})));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
NewsApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NewsApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
29
|
+
NewsApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NewsApiService, providedIn: 'root' });
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NewsApiService, decorators: [{
|
|
31
|
+
type: Injectable,
|
|
32
|
+
args: [{
|
|
33
|
+
providedIn: 'root'
|
|
34
|
+
}]
|
|
35
|
+
}] });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3cy1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9saWIvZmVhdHVyZS1uZXdzL25ld3MtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFPN0QsTUFBTSxPQUFPLGNBQWM7SUFIM0I7UUFJb0IsZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztLQTJCOUQ7SUF6QkUsMEJBQTBCLENBQ3ZCLGlCQUF5QixFQUN6QixLQUFLLEdBQUcsQ0FBQztRQUVULE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO2FBQzNCLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQzthQUMzQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcseUNBQXlDLENBQUM7UUFFekUsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNuQixHQUFHLENBQXVDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO2FBQzFELElBQUksQ0FDRixVQUFVLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUMzQixFQUFFLENBQUM7WUFDQSxPQUFPLEVBQUUsS0FBSztZQUNkLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUNKLEtBQUssWUFBWSxLQUFLO2dCQUNuQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87Z0JBQ2YsQ0FBQyxDQUFDLG1DQUFtQztZQUMzQyxJQUFJLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FDSixDQUNILENBQUM7SUFDUixDQUFDOzs0R0E1QlMsY0FBYztnSEFBZCxjQUFjLGNBRlosTUFBTTs0RkFFUixjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNULFVBQVUsRUFBRSxNQUFNO2lCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBFSVVfQVBQX0FQSV9CQVNFX1VSTCB9IGZyb20gJy4uL2VpdS1hcHAta2l0LnRva2Vucyc7XHJcbmltcG9ydCB7IE9wZXJhdGlvblJlc3VsdCB9IGZyb20gJy4vbW9kZWxzL29wZXJhdGlvbi1yZXN1bHQubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWRtaW5lTmV3c1Jlc3BvbnNlIH0gZnJvbSAnLi9tb2RlbHMvcmVkbWluZS1uZXdzLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZXdzQXBpU2VydmljZSB7XHJcbiAgIHByaXZhdGUgcmVhZG9ubHkgX2h0dHBDbGllbnQgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgIHByaXZhdGUgcmVhZG9ubHkgX2FwaUJhc2VVcmwgPSBpbmplY3QoRUlVX0FQUF9BUElfQkFTRV9VUkwpO1xyXG5cclxuICAgZ2V0TmV3c0J5UHJvamVjdElkZW50aWZpZXIoXHJcbiAgICAgIHByb2plY3RJZGVudGlmaWVyOiBzdHJpbmcsXHJcbiAgICAgIGxpbWl0ID0gMVxyXG4gICApOiBPYnNlcnZhYmxlPE9wZXJhdGlvblJlc3VsdDxSZWRtaW5lTmV3c1Jlc3BvbnNlPj4ge1xyXG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAgICAgIC5zZXQoJ3Byb2plY3RJZGVudGlmaWVyJywgcHJvamVjdElkZW50aWZpZXIpXHJcbiAgICAgICAgIC5zZXQoJ2xpbWl0JywgU3RyaW5nKGxpbWl0KSk7XHJcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuX2FwaUJhc2VVcmx9L05ld3MvR2V0UmVkbWluZU5ld3NCeVByb2plY3RJZGVudGlmaWVyYDtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XHJcbiAgICAgICAgIC5nZXQ8T3BlcmF0aW9uUmVzdWx0PFJlZG1pbmVOZXdzUmVzcG9uc2U+Pih1cmwsIHsgcGFyYW1zIH0pXHJcbiAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT5cclxuICAgICAgICAgICAgICAgb2Yoe1xyXG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxyXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdDYW5ub3QgZ2V0IGZlYXR1cmUgbmV3cyBmcm9tIEFQSS4nLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhOiBudWxsXHJcbiAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgKTtcclxuICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class EiuAppFooterComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.appVersion = '';
|
|
6
|
+
this.copyrightYear = '2023';
|
|
7
|
+
this.companyName = 'IT - EIU';
|
|
8
|
+
this.companyUrl = 'https://sites.google.com/eiu.edu.vn/oit/';
|
|
9
|
+
this.allRightsText = 'All rights reserved.';
|
|
10
|
+
this.ringLabel = 'Phiên bản';
|
|
11
|
+
this.ringClick = new EventEmitter();
|
|
12
|
+
}
|
|
13
|
+
onRingClick(event) {
|
|
14
|
+
event.preventDefault();
|
|
15
|
+
this.ringClick.emit();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
EiuAppFooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
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", ringLabel: "ringLabel" }, outputs: { ringClick: "ringClick" }, ngImport: i0, template: "<div class=\"float-right d-none d-sm-block footer-version-wrap\">\r\n <a href=\"#\" class=\"radar-ring\" (click)=\"onRingClick($event)\">\r\n <span>{{ ringLabel }}</span>\r\n </a>\r\n <b>Version</b> {{ appVersion }}\r\n</div>\r\n<strong>\r\n <span>Copyright © {{ copyrightYear }}</span>\r\n <a [href]=\"companyUrl\" target=\"_blank\" rel=\"noopener\" style=\"margin: 0\">\r\n {{ companyName }}</a\r\n >\r\n <span>.</span>\r\n</strong>\r\n<span> {{ allRightsText }}</span>\r\n", styles: [".footer-version-wrap{display:flex;align-items:center;gap:10px}.radar-ring{position:relative;width:34px;height:34px;border-radius:50%;background:#194266;color:#fff;font-size:8px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;text-decoration:none}.radar-ring:before,.radar-ring:after{content:\"\";position:absolute;inset:-6px;border-radius:50%;border:2px solid rgba(25,66,102,.35);animation:radarPulse 2.2s infinite}.radar-ring:after{animation-delay:1.1s}@keyframes radarPulse{0%{transform:scale(.8);opacity:.75}to{transform:scale(1.45);opacity:0}}\n"] });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFooterComponent, decorators: [{
|
|
21
|
+
type: Component,
|
|
22
|
+
args: [{ selector: 'app-eiu-app-footer', template: "<div class=\"float-right d-none d-sm-block footer-version-wrap\">\r\n <a href=\"#\" class=\"radar-ring\" (click)=\"onRingClick($event)\">\r\n <span>{{ ringLabel }}</span>\r\n </a>\r\n <b>Version</b> {{ appVersion }}\r\n</div>\r\n<strong>\r\n <span>Copyright © {{ copyrightYear }}</span>\r\n <a [href]=\"companyUrl\" target=\"_blank\" rel=\"noopener\" style=\"margin: 0\">\r\n {{ companyName }}</a\r\n >\r\n <span>.</span>\r\n</strong>\r\n<span> {{ allRightsText }}</span>\r\n", styles: [".footer-version-wrap{display:flex;align-items:center;gap:10px}.radar-ring{position:relative;width:34px;height:34px;border-radius:50%;background:#194266;color:#fff;font-size:8px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;text-decoration:none}.radar-ring:before,.radar-ring:after{content:\"\";position:absolute;inset:-6px;border-radius:50%;border:2px solid rgba(25,66,102,.35);animation:radarPulse 2.2s infinite}.radar-ring:after{animation-delay:1.1s}@keyframes radarPulse{0%{transform:scale(.8);opacity:.75}to{transform:scale(1.45);opacity:0}}\n"] }]
|
|
23
|
+
}], propDecorators: { appVersion: [{
|
|
24
|
+
type: Input
|
|
25
|
+
}], copyrightYear: [{
|
|
26
|
+
type: Input
|
|
27
|
+
}], companyName: [{
|
|
28
|
+
type: Input
|
|
29
|
+
}], companyUrl: [{
|
|
30
|
+
type: Input
|
|
31
|
+
}], allRightsText: [{
|
|
32
|
+
type: Input
|
|
33
|
+
}], ringLabel: [{
|
|
34
|
+
type: Input
|
|
35
|
+
}], ringClick: [{
|
|
36
|
+
type: Output
|
|
37
|
+
}] } });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPdkUsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQU1ZLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsa0JBQWEsR0FBRyxNQUFNLENBQUM7UUFDdkIsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsZUFBVSxHQUFHLDBDQUEwQyxDQUFDO1FBQ3hELGtCQUFhLEdBQUcsc0JBQXNCLENBQUM7UUFDdkMsY0FBUyxHQUFHLFdBQVcsQ0FBQztRQUNkLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBTTFEO0lBSkUsV0FBVyxDQUFDLEtBQVk7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7bUhBWlMscUJBQXFCO3VHQUFyQixxQkFBcUIsbVJDUGxDLDBmQWNBOzRGRFBhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRyxvQkFBb0I7OEJBS3JCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNhLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgIHNlbGVjdG9yOiAnYXBwLWVpdS1hcHAtZm9vdGVyJyxcclxuICAgdGVtcGxhdGVVcmw6ICcuL2VpdS1hcHAtZm9vdGVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgc3R5bGVVcmxzOiBbJy4vZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFaXVBcHBGb290ZXJDb21wb25lbnQge1xyXG4gICBASW5wdXQoKSBhcHBWZXJzaW9uID0gJyc7XHJcbiAgIEBJbnB1dCgpIGNvcHlyaWdodFllYXIgPSAnMjAyMyc7XHJcbiAgIEBJbnB1dCgpIGNvbXBhbnlOYW1lID0gJ0lUIC0gRUlVJztcclxuICAgQElucHV0KCkgY29tcGFueVVybCA9ICdodHRwczovL3NpdGVzLmdvb2dsZS5jb20vZWl1LmVkdS52bi9vaXQvJztcclxuICAgQElucHV0KCkgYWxsUmlnaHRzVGV4dCA9ICdBbGwgcmlnaHRzIHJlc2VydmVkLic7XHJcbiAgIEBJbnB1dCgpIHJpbmdMYWJlbCA9ICdQaGnDqm4gYuG6o24nO1xyXG4gICBAT3V0cHV0KCkgcmVhZG9ubHkgcmluZ0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgb25SaW5nQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMucmluZ0NsaWNrLmVtaXQoKTtcclxuICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmbG9hdC1yaWdodCBkLW5vbmUgZC1zbS1ibG9jayBmb290ZXItdmVyc2lvbi13cmFwXCI+XHJcbiAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJyYWRhci1yaW5nXCIgKGNsaWNrKT1cIm9uUmluZ0NsaWNrKCRldmVudClcIj5cclxuICAgICAgPHNwYW4+e3sgcmluZ0xhYmVsIH19PC9zcGFuPlxyXG4gICA8L2E+XHJcbiAgIDxiPlZlcnNpb248L2I+IHt7IGFwcFZlcnNpb24gfX1cclxuPC9kaXY+XHJcbjxzdHJvbmc+XHJcbiAgIDxzcGFuPkNvcHlyaWdodCAmY29weTsge3sgY29weXJpZ2h0WWVhciB9fTwvc3Bhbj5cclxuICAgPGEgW2hyZWZdPVwiY29tcGFueVVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCIgc3R5bGU9XCJtYXJnaW46IDBcIj5cclxuICAgICAge3sgY29tcGFueU5hbWUgfX08L2FcclxuICAgPlxyXG4gICA8c3Bhbj4uPC9zcGFuPlxyXG48L3N0cm9uZz5cclxuPHNwYW4+IHt7IGFsbFJpZ2h0c1RleHQgfX08L3NwYW4+XHJcbiJdfQ==
|