@libs-ui/components-pages-template-detail 0.2.356-0 → 0.2.356-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/detail-v2/detail-v2.component.d.ts +51 -0
- package/detail-v2/interfaces/detail-v2.interface.d.ts +16 -0
- package/detail-v2/interfaces/index.d.ts +1 -0
- package/esm2022/detail-v2/detail-v2.component.mjs +151 -0
- package/esm2022/detail-v2/interfaces/detail-v2.interface.mjs +2 -0
- package/esm2022/detail-v2/interfaces/index.mjs +2 -0
- package/esm2022/index.mjs +3 -1
- package/fesm2022/libs-ui-components-pages-template-detail.mjs +141 -4
- package/fesm2022/libs-ui-components-pages-template-detail.mjs.map +1 -1
- package/index.d.ts +2 -0
- package/package.json +12 -12
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { OnInit, Signal } from '@angular/core';
|
|
2
|
+
import { IButton } from '@libs-ui/components-buttons-button';
|
|
3
|
+
import { IDropdownFunctionControlEvent, IEmitSelectKey } from '@libs-ui/components-dropdown';
|
|
4
|
+
import { IPopoverFunctionControlEvent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';
|
|
5
|
+
import { IRadioEvent } from '@libs-ui/components-radio-single';
|
|
6
|
+
import { ISkeletonConfig } from '@libs-ui/components-skeleton';
|
|
7
|
+
import { ISwitch, ISwitchEvent } from '@libs-ui/components-switch';
|
|
8
|
+
import { IPagesTemplateDetailConfigCenter, IPagesTemplateDetailConfigRight, IPagesTemplateDetailConfigTitle } from '../interfaces/config.interface';
|
|
9
|
+
import { IPageDetailFunctionControl } from '../interfaces/function-control.interface';
|
|
10
|
+
import { IPageDetailV2BodyConfig, IPageDetailV2SectionData } from './interfaces/detail-v2.interface';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
export declare class LibsUiComponentsPagesTemplateDetailV2Component implements OnInit {
|
|
13
|
+
readonly zIndex: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
|
|
14
|
+
readonly configRight: import("@angular/core").InputSignal<IPagesTemplateDetailConfigRight[] | undefined>;
|
|
15
|
+
readonly configTitle: import("@angular/core").InputSignal<IPagesTemplateDetailConfigTitle | undefined>;
|
|
16
|
+
readonly configCenter: import("@angular/core").InputSignal<IPagesTemplateDetailConfigCenter | undefined>;
|
|
17
|
+
readonly classIncludeHeader: import("@angular/core").InputSignal<string | undefined>;
|
|
18
|
+
readonly isSplitHeaderRatio: import("@angular/core").InputSignal<boolean | undefined>;
|
|
19
|
+
/** Config để lazy load component vào vùng body */
|
|
20
|
+
readonly bodyConfig: import("@angular/core").InputSignalWithTransform<IPageDetailV2BodyConfig, IPageDetailV2BodyConfig | undefined>;
|
|
21
|
+
readonly disable: import("@angular/core").ModelSignal<boolean>;
|
|
22
|
+
readonly outScroll: import("@angular/core").OutputEmitterRef<Event>;
|
|
23
|
+
readonly outClose: import("@angular/core").OutputEmitterRef<boolean>;
|
|
24
|
+
readonly outSelectedMenuDropdown: import("@angular/core").OutputEmitterRef<IEmitSelectKey | undefined>;
|
|
25
|
+
readonly outSelectedButtonDropdown: import("@angular/core").OutputEmitterRef<IEmitSelectKey>;
|
|
26
|
+
readonly outFunctionControl: import("@angular/core").OutputEmitterRef<IPageDetailFunctionControl>;
|
|
27
|
+
readonly outSelectedRadio: import("@angular/core").OutputEmitterRef<IRadioEvent>;
|
|
28
|
+
readonly outStateDisable: import("@angular/core").OutputEmitterRef<boolean>;
|
|
29
|
+
readonly outTooltipButtonFunctionControl: import("@angular/core").OutputEmitterRef<IPopoverFunctionControlEvent>;
|
|
30
|
+
private dropdownFunctionControl;
|
|
31
|
+
protected readonly configTitleComputed: Signal<import("@libs-ui/components-popover").IPopoverOverlay>;
|
|
32
|
+
/** Dữ liệu state truyền vào Component Outlet body */
|
|
33
|
+
protected readonly sectionData: Signal<IPageDetailV2SectionData>;
|
|
34
|
+
/** Skeleton config cho Body (Dùng computed để resolve default logic) */
|
|
35
|
+
protected readonly resolvedSkeletonBody: Signal<ISkeletonConfig>;
|
|
36
|
+
ngOnInit(): void;
|
|
37
|
+
get FunctionsControl(): IPageDetailFunctionControl;
|
|
38
|
+
protected handlerClickAction(event: IButton): void;
|
|
39
|
+
protected handlerSwitch(event: ISwitch, swicthEvent: ISwitchEvent): Promise<void>;
|
|
40
|
+
protected handlerClose(e: Event): void;
|
|
41
|
+
protected handlerPopoverEvent(event: TYPE_POPOVER_EVENT): void;
|
|
42
|
+
protected handlerSelectedKey(event?: IEmitSelectKey): void;
|
|
43
|
+
protected handlerSelectedButtonDropdownItem(event: any): void;
|
|
44
|
+
protected handlerDropdownFunctionControl(event: IDropdownFunctionControlEvent): void;
|
|
45
|
+
protected handlerChangeRadio(event: IRadioEvent): void;
|
|
46
|
+
protected handlerFunctionControlTooltipButton(event: IPopoverFunctionControlEvent): void;
|
|
47
|
+
protected handlerScroll(event: Event): void;
|
|
48
|
+
private setStateDisable;
|
|
49
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsPagesTemplateDetailV2Component, never>;
|
|
50
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsPagesTemplateDetailV2Component, "libs_ui-components-pages_template-detail_v2", never, { "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "configRight": { "alias": "configRight"; "required": false; "isSignal": true; }; "configTitle": { "alias": "configTitle"; "required": false; "isSignal": true; }; "configCenter": { "alias": "configCenter"; "required": false; "isSignal": true; }; "classIncludeHeader": { "alias": "classIncludeHeader"; "required": false; "isSignal": true; }; "isSplitHeaderRatio": { "alias": "isSplitHeaderRatio"; "required": false; "isSignal": true; }; "bodyConfig": { "alias": "bodyConfig"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; }, { "disable": "disableChange"; "outScroll": "outScroll"; "outClose": "outClose"; "outSelectedMenuDropdown": "outSelectedMenuDropdown"; "outSelectedButtonDropdown": "outSelectedButtonDropdown"; "outFunctionControl": "outFunctionControl"; "outSelectedRadio": "outSelectedRadio"; "outStateDisable": "outStateDisable"; "outTooltipButtonFunctionControl": "outTooltipButtonFunctionControl"; }, never, never, true, never>;
|
|
51
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { WritableSignal } from '@angular/core';
|
|
2
|
+
import { ISkeletonConfig } from '@libs-ui/components-skeleton';
|
|
3
|
+
import { TYPE_FUNCTION } from '@libs-ui/interfaces-types';
|
|
4
|
+
export interface IPageDetailV2BodyConfig {
|
|
5
|
+
/** Hàm trả về Observable<Type<any>> để lazy load component vào body */
|
|
6
|
+
getComponentOutlet?: TYPE_FUNCTION<any>;
|
|
7
|
+
/** Hàm trả về Observable<Record> để truyền data vào component được load */
|
|
8
|
+
getDataComponentOutlet?: TYPE_FUNCTION<Record<string, unknown>>;
|
|
9
|
+
/** Skeleton hiển thị trong lúc Observable chưa resolve (dùng WritableSignal để reactive) */
|
|
10
|
+
skeletonConfig?: WritableSignal<ISkeletonConfig>;
|
|
11
|
+
/** Class thêm vào vùng body wrapper */
|
|
12
|
+
classInclude?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface IPageDetailV2SectionData {
|
|
15
|
+
disable: boolean;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './detail-v2.interface';
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { AsyncPipe, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';
|
|
3
|
+
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
4
|
+
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
5
|
+
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
6
|
+
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
7
|
+
import { LibsUiComponentsRadioGroupComponent } from '@libs-ui/components-radio-group';
|
|
8
|
+
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
9
|
+
import { LibsUiComponentsSkeletonComponent } from '@libs-ui/components-skeleton';
|
|
10
|
+
import { LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';
|
|
11
|
+
import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
|
|
12
|
+
import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
|
|
13
|
+
import { escapeHtml, get } from '@libs-ui/utils';
|
|
14
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@ngx-translate/core";
|
|
17
|
+
export class LibsUiComponentsPagesTemplateDetailV2Component {
|
|
18
|
+
// #region --- INPUTS (kế thừa từ V1) ---
|
|
19
|
+
zIndex = input(1000, { transform: (val) => val ?? 1000 });
|
|
20
|
+
configRight = input();
|
|
21
|
+
configTitle = input();
|
|
22
|
+
configCenter = input();
|
|
23
|
+
classIncludeHeader = input();
|
|
24
|
+
isSplitHeaderRatio = input();
|
|
25
|
+
// #endregion
|
|
26
|
+
// #region --- INPUTS (mới trong V2) ---
|
|
27
|
+
/** Config để lazy load component vào vùng body */
|
|
28
|
+
bodyConfig = input({}, { transform: (v) => v || {} });
|
|
29
|
+
// #endregion
|
|
30
|
+
// #region --- MODELS ---
|
|
31
|
+
disable = model(false);
|
|
32
|
+
// #endregion
|
|
33
|
+
// #region --- OUTPUTS ---
|
|
34
|
+
outScroll = output();
|
|
35
|
+
outClose = output();
|
|
36
|
+
outSelectedMenuDropdown = output();
|
|
37
|
+
outSelectedButtonDropdown = output();
|
|
38
|
+
outFunctionControl = output();
|
|
39
|
+
outSelectedRadio = output();
|
|
40
|
+
outStateDisable = output();
|
|
41
|
+
outTooltipButtonFunctionControl = output();
|
|
42
|
+
// #endregion
|
|
43
|
+
// #region --- INTERNAL STATE ---
|
|
44
|
+
dropdownFunctionControl;
|
|
45
|
+
// #endregion
|
|
46
|
+
// #region --- COMPUTED ---
|
|
47
|
+
configTitleComputed = computed(() => {
|
|
48
|
+
const config = this.configTitle()?.config;
|
|
49
|
+
if (!config) {
|
|
50
|
+
return { content: 'i18n_back_to_list' };
|
|
51
|
+
}
|
|
52
|
+
if (!config.content) {
|
|
53
|
+
config.content = 'i18n_back_to_list';
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
return { ...config, content: escapeHtml(config.content) };
|
|
57
|
+
});
|
|
58
|
+
/** Dữ liệu state truyền vào Component Outlet body */
|
|
59
|
+
sectionData = computed(() => ({
|
|
60
|
+
disable: this.disable(),
|
|
61
|
+
}));
|
|
62
|
+
/** Skeleton config cho Body (Dùng computed để resolve default logic) */
|
|
63
|
+
resolvedSkeletonBody = computed(() => {
|
|
64
|
+
return (get(this.bodyConfig, 'skeletonConfig') ?? {
|
|
65
|
+
repeat: 3,
|
|
66
|
+
styleMarginBottom: 16,
|
|
67
|
+
rows: [{ item: { classInclude: 'w-full h-[100px] rounded-[8px]' } }],
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
// #endregion
|
|
71
|
+
ngOnInit() {
|
|
72
|
+
this.outFunctionControl.emit(this.FunctionsControl);
|
|
73
|
+
}
|
|
74
|
+
// #region --- PUBLIC METHODS ---
|
|
75
|
+
get FunctionsControl() {
|
|
76
|
+
return {
|
|
77
|
+
setStateDisable: this.setStateDisable.bind(this),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// #endregion
|
|
81
|
+
// #region --- EVENT HANDLERS ---
|
|
82
|
+
handlerClickAction(event) {
|
|
83
|
+
if (event && event.action) {
|
|
84
|
+
event.action();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async handlerSwitch(event, swicthEvent) {
|
|
88
|
+
if (event && event.action) {
|
|
89
|
+
await event.action(swicthEvent);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
handlerClose(e) {
|
|
93
|
+
e.stopPropagation();
|
|
94
|
+
this.outClose.emit(true);
|
|
95
|
+
}
|
|
96
|
+
handlerPopoverEvent(event) {
|
|
97
|
+
if (event !== 'click') {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.outClose.emit(true);
|
|
101
|
+
}
|
|
102
|
+
handlerSelectedKey(event) {
|
|
103
|
+
this.outSelectedMenuDropdown.emit(event);
|
|
104
|
+
this.dropdownFunctionControl?.reset();
|
|
105
|
+
this.dropdownFunctionControl?.removeList();
|
|
106
|
+
}
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
+
handlerSelectedButtonDropdownItem(event) {
|
|
109
|
+
this.outSelectedButtonDropdown.emit(event);
|
|
110
|
+
}
|
|
111
|
+
handlerDropdownFunctionControl(event) {
|
|
112
|
+
this.dropdownFunctionControl = event;
|
|
113
|
+
}
|
|
114
|
+
handlerChangeRadio(event) {
|
|
115
|
+
this.outSelectedRadio.emit(event);
|
|
116
|
+
}
|
|
117
|
+
handlerFunctionControlTooltipButton(event) {
|
|
118
|
+
this.outTooltipButtonFunctionControl.emit(event);
|
|
119
|
+
}
|
|
120
|
+
handlerScroll(event) {
|
|
121
|
+
this.outScroll.emit(event);
|
|
122
|
+
}
|
|
123
|
+
// #endregion
|
|
124
|
+
// #region --- PRIVATE LOGIC ---
|
|
125
|
+
async setStateDisable(stateDisable) {
|
|
126
|
+
this.disable.set(stateDisable);
|
|
127
|
+
this.outStateDisable.emit(this.disable());
|
|
128
|
+
}
|
|
129
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
130
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateDetailV2Component, isStandalone: true, selector: "libs_ui-components-pages_template-detail_v2", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configRight: { classPropertyName: "configRight", publicName: "configRight", isSignal: true, isRequired: false, transformFunction: null }, configTitle: { classPropertyName: "configTitle", publicName: "configTitle", isSignal: true, isRequired: false, transformFunction: null }, configCenter: { classPropertyName: "configCenter", publicName: "configCenter", isSignal: true, isRequired: false, transformFunction: null }, classIncludeHeader: { classPropertyName: "classIncludeHeader", publicName: "classIncludeHeader", isSignal: true, isRequired: false, transformFunction: null }, isSplitHeaderRatio: { classPropertyName: "isSplitHeaderRatio", publicName: "isSplitHeaderRatio", isSignal: true, isRequired: false, transformFunction: null }, bodyConfig: { classPropertyName: "bodyConfig", publicName: "bodyConfig", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disable: "disableChange", outScroll: "outScroll", outClose: "outClose", outSelectedMenuDropdown: "outSelectedMenuDropdown", outSelectedButtonDropdown: "outSelectedButtonDropdown", outFunctionControl: "outFunctionControl", outSelectedRadio: "outSelectedRadio", outStateDisable: "outStateDisable", outTooltipButtonFunctionControl: "outTooltipButtonFunctionControl" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hi\u1EC3n th\u1ECB khi Observable ch\u01B0a emit (\u0111ang ch\u1EDD delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsRadioGroupComponent, selector: "libs_ui-components-radio-group", inputs: ["fieldKey", "keyActive", "keysDisable", "groups", "disable", "clickExactly", "horizontal", "labelConfig", "validRequired", "ignoreClassMarginLastItem", "typeRadio", "classInclude", "classLabelInclude", "classItemInclude", "alwaysShowSubText", "horizontalClassInclude"], outputs: ["groupsChange", "outClickButton", "outChange", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsButtonsDropdownComponent, selector: "libs_ui-components-buttons-dropdown", inputs: ["label", "fieldClass", "fieldClassIconLeft", "items", "fieldDisplay", "keyField", "keySelected", "applyNow", "showBorderBottom", "disable", "sizeButton", "classLabel", "iconOnlyType", "classIconRight", "classIconLeft", "typeButton", "popupConfig", "ignoreHiddenPopoverContentWhenMouseLeave", "classInclude", "modePopover", "classIncludeContainer"], outputs: ["keySelectedChange", "outSelectItem", "outHover", "outApply", "outPopoverEvent", "outFunctionsControl", "outIconEvent"] }, { kind: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [NgComponentOutlet]] });
|
|
131
|
+
}
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailV2Component, decorators: [{
|
|
133
|
+
type: Component,
|
|
134
|
+
args: [{ selector: 'libs_ui-components-pages_template-detail_v2', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
135
|
+
AsyncPipe,
|
|
136
|
+
NgComponentOutlet,
|
|
137
|
+
NgTemplateOutlet,
|
|
138
|
+
TranslateModule,
|
|
139
|
+
LibsUiComponentsButtonsButtonComponent,
|
|
140
|
+
LibsUiComponentsPopoverComponent,
|
|
141
|
+
LibsUiComponentsRadioGroupComponent,
|
|
142
|
+
LibsUiComponentsSwitchComponent,
|
|
143
|
+
LibsUiComponentsDropdownComponent,
|
|
144
|
+
LibsUiComponentsScrollOverlayDirective,
|
|
145
|
+
LibsUiComponentsButtonsDropdownComponent,
|
|
146
|
+
LibsUiComponentsSkeletonComponent,
|
|
147
|
+
LibsUiPipesCallFunctionInTemplatePipe,
|
|
148
|
+
LibsUiPipesEscapeHtmlPipe,
|
|
149
|
+
], template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hi\u1EC3n th\u1ECB khi Observable ch\u01B0a emit (\u0111ang ch\u1EDD delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"] }]
|
|
150
|
+
}] });
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wYWdlcy10ZW1wbGF0ZS9kZXRhaWwvc3JjL2RldGFpbC12Mi9kZXRhaWwtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2RldGFpbC9zcmMvZGV0YWlsLXYyL2RldGFpbC12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBa0IsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hHLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWdDLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ2pJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBbUIsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRyxPQUFPLEVBQXlCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEcsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1B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QUFNLFdBQ3RDO3dCQUNQLFNBQVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2Ysc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG1DQUFtQzt3QkFDbkMsK0JBQStCO3dCQUMvQixpQ0FBaUM7d0JBQ2pDLHNDQUFzQzt3QkFDdEMsd0NBQXdDO3dCQUN4QyxpQ0FBaUM7d0JBQ2pDLHFDQUFxQzt3QkFDckMseUJBQXlCO3FCQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdDb21wb25lbnRPdXRsZXQsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0LCBTaWduYWwsIGNvbXB1dGVkLCBpbnB1dCwgbW9kZWwsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXJhZGlvLWdyb3VwJztcbmltcG9ydCB7IElSYWRpb0V2ZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IElTa2VsZXRvbkNvbmZpZywgTGlic1VpQ29tcG9uZW50c1NrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1za2VsZXRvbic7XG5pbXBvcnQgeyBJU3dpdGNoLCBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCwgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlciwgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdSaWdodCwgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdUaXRsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBhZ2VEZXRhaWxWMkJvZHlDb25maWcsIElQYWdlRGV0YWlsVjJTZWN0aW9uRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9kZXRhaWwtdjIuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBhZ2VzX3RlbXBsYXRlLWRldGFpbF92MicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtdjIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUGFnZXNUZW1wbGF0ZURldGFpbFYyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTIChr4bq/IHRo4burYSB04burIFYxKSAtLS1cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnUmlnaHQgPSBpbnB1dDxBcnJheTxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1JpZ2h0Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGl0bGUgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1RpdGxlPigpO1xuICByZWFkb25seSBjb25maWdDZW50ZXIgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlcj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlSGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpc1NwbGl0SGVhZGVyUmF0aW8gPSBpbnB1dDxib29sZWFuPigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTICht4bubaSB0cm9uZyBWMikgLS0tXG4gIC8qKiBDb25maWcgxJHhu4MgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIHbDuW5nIGJvZHkgKi9cbiAgcmVhZG9ubHkgYm9keUNvbmZpZyA9IGlucHV0PElQYWdlRGV0YWlsVjJCb2R5Q29uZmlnLCBJUGFnZURldGFpbFYyQm9keUNvbmZpZyB8IHVuZGVmaW5lZD4oe30sIHsgdHJhbnNmb3JtOiAodikgPT4gdiB8fCB7fSB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIE1PREVMUyAtLS1cbiAgcmVhZG9ubHkgZGlzYWJsZSA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIE9VVFBVVFMgLS0tXG4gIHJlYWRvbmx5IG91dFNjcm9sbCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xvc2UgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRNZW51RHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdGVkQnV0dG9uRHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXk+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbD4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRSYWRpbyA9IG91dHB1dDxJUmFkaW9FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U3RhdGVEaXNhYmxlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dFRvb2x0aXBCdXR0b25GdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIElOVEVSTkFMIFNUQVRFIC0tLVxuICBwcml2YXRlIGRyb3Bkb3duRnVuY3Rpb25Db250cm9sITogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIC0tLSBDT01QVVRFRCAtLS1cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ1RpdGxlQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdUaXRsZSgpPy5jb25maWc7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6ICdpMThuX2JhY2tfdG9fbGlzdCcgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuY29udGVudCkge1xuICAgICAgY29uZmlnLmNvbnRlbnQgPSAnaTE4bl9iYWNrX3RvX2xpc3QnO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBjb250ZW50OiBlc2NhcGVIdG1sKGNvbmZpZy5jb250ZW50KSB9O1xuICB9KTtcblxuICAvKiogROG7ryBsaeG7h3Ugc3RhdGUgdHJ1eeG7gW4gdsOgbyBDb21wb25lbnQgT3V0bGV0IGJvZHkgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlY3Rpb25EYXRhID0gY29tcHV0ZWQ8SVBhZ2VEZXRhaWxWMlNlY3Rpb25EYXRhPigoKSA9PiAoe1xuICAgIGRpc2FibGU6IHRoaXMuZGlzYWJsZSgpLFxuICB9KSk7XG5cbiAgLyoqIFNrZWxldG9uIGNvbmZpZyBjaG8gQm9keSAoRMO5bmcgY29tcHV0ZWQgxJHhu4MgcmVzb2x2ZSBkZWZhdWx0IGxvZ2ljKSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRTa2VsZXRvbkJvZHk6IFNpZ25hbDxJU2tlbGV0b25Db25maWc+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBnZXQodGhpcy5ib2R5Q29uZmlnLCAnc2tlbGV0b25Db25maWcnKSA/PyB7XG4gICAgICAgIHJlcGVhdDogMyxcbiAgICAgICAgc3R5bGVNYXJnaW5Cb3R0b206IDE2LFxuICAgICAgICByb3dzOiBbeyBpdGVtOiB7IGNsYXNzSW5jbHVkZTogJ3ctZnVsbCBoLVsxMDBweF0gcm91bmRlZC1bOHB4XScgfSB9XSxcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIC8vICNyZWdpb24gLS0tIFBVQkxJQyBNRVRIT0RTIC0tLVxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBhZ2VEZXRhaWxGdW5jdGlvbkNvbnRyb2wge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTdGF0ZURpc2FibGU6IHRoaXMuc2V0U3RhdGVEaXNhYmxlLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gRVZFTlQgSEFORExFUlMgLS0tXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tBY3Rpb24oZXZlbnQ6IElCdXR0b24pIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuYWN0aW9uKSB7XG4gICAgICBldmVudC5hY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChldmVudDogSVN3aXRjaCwgc3dpY3RoRXZlbnQ6IElTd2l0Y2hFdmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC5hY3Rpb24pIHtcbiAgICAgIGF3YWl0IGV2ZW50LmFjdGlvbihzd2ljdGhFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbG9zZShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdXRDbG9zZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRXZlbnQoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIGlmIChldmVudCAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dENsb3NlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50PzogSUVtaXRTZWxlY3RLZXkpIHtcbiAgICB0aGlzLm91dFNlbGVjdGVkTWVudURyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuZHJvcGRvd25GdW5jdGlvbkNvbnRyb2w/LnJlc2V0KCk7XG4gICAgdGhpcy5kcm9wZG93bkZ1bmN0aW9uQ29udHJvbD8ucmVtb3ZlTGlzdCgpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duSXRlbShldmVudDogYW55KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcm9wZG93bkZ1bmN0aW9uQ29udHJvbChldmVudDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sID0gZXZlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVJhZGlvKGV2ZW50OiBJUmFkaW9FdmVudCkge1xuICAgIHRoaXMub3V0U2VsZWN0ZWRSYWRpby5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbihldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMub3V0VG9vbHRpcEJ1dHRvbkZ1bmN0aW9uQ29udHJvbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub3V0U2Nyb2xsLmVtaXQoZXZlbnQpO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIC0tLSBQUklWQVRFIExPR0lDIC0tLVxuICBwcml2YXRlIGFzeW5jIHNldFN0YXRlRGlzYWJsZShzdGF0ZURpc2FibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGUuc2V0KHN0YXRlRGlzYWJsZSk7XG4gICAgdGhpcy5vdXRTdGF0ZURpc2FibGUuZW1pdCh0aGlzLmRpc2FibGUoKSk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1wYWdlX2RldGFpbFwiXG4gIFtzdHlsZS56SW5kZXhdPVwiekluZGV4KClcIj5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSID09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPCEtLSBHaeG7ryBuZ3V5w6puIGhvw6BuIHRvw6BuIHThu6sgVjEgLS0+XG4gIDxkaXZcbiAgICBbY2xhc3Mucm93XT1cIiFpc1NwbGl0SGVhZGVyUmF0aW8oKVwiXG4gICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTZweF0gcHktWzhweF0ganVzdGlmeS1iZXR3ZWVuIGJnLXdoaXRlIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsIHt7IGNsYXNzSW5jbHVkZUhlYWRlcigpIHx8ICcnIH19XCI+XG4gICAgPGRpdlxuICAgICAgW2NsYXNzLmNvbHVtbnMtOF09XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgICAgW2NsYXNzLnctWzI0JV1dPVwiaXNTcGxpdEhlYWRlclJhdGlvKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAaWYgKCFjb25maWdUaXRsZSgpPy5pZ25vcmVCdXR0b25CYWNrKSB7XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIGJlZm9yZTp0ZXh0LVsxNnB4XSBtci1bOHB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsb3NlKCRldmVudClcIj48L2k+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uaXNTaG93QmFja1RvTGlzdExhYmVsKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9iYWNrX3RvX2xpc3QnXCJcbiAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYi11aS1mb250LWg2bSdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xvc2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uY29uZmlnOyBhcyBjb25maWcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1RpdGxlQ29tcHV0ZWQoKVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFttb2RlXT1cIidob3ZlcidcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidjdXJzb3ItcG9pbnRlciAnICsgKGNvbmZpZy5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIGxpYnMtdWktZm9udC1oNm0nKVwiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLmNvbnRlbnQgPyAoIWNvbmZpZ1RpdGxlKCk/Lmlnbm9yZUVzY2FwZUh0bWwgPyAoY29uZmlnLmNvbnRlbnQgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIHwgdHJhbnNsYXRlKSA6IChjb25maWcuY29udGVudCB8IHRyYW5zbGF0ZSkpIDogJyZtZGFzaDsnXCJcbiAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uY29uZmlnRGVzY3JpcHRpb247IGFzIGNvbmZpZ0Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdEZXNjcmlwdGlvbi5jb25maWdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbbW9kZV09XCInaG92ZXInXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdEZXNjcmlwdGlvbi5jb25maWcuY2xhc3NJbmNsdWRlIHx8ICdsaWJzLXVpLWZvbnQtaDZyIHRleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnRGVzY3JpcHRpb24uaW5uZXJWaWV3IHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoaXNTcGxpdEhlYWRlclJhdGlvKCkgJiYgY29uZmlnQ2VudGVyKCk7IGFzIGNvbmZpZ0NlbnRlcikge1xuICAgICAgPGRpdiBjbGFzcz1cInctWzUyJV0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtWzQ4cHhdXCI+XG4gICAgICAgIEBpZiAoIWNvbmZpZ0NlbnRlci50ZW1wbGF0ZSkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgICAgIG1heFdpZHRoOiAyNTAsXG4gICAgICAgICAgICAgIHpJbmRleDogekluZGV4KCkgKyAxLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0NlbnRlci5jbGFzc0luY2x1ZGVUaXRsZSA/PyAndXBwZXJjYXNlIGxpYnMtdWktZm9udC1oNHMnXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnQ2VudGVyLnRpdGxlID8gKGNvbmZpZ0NlbnRlci50aXRsZSB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUpIDogJyZtZGFzaCdcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29uZmlnQ2VudGVyLnRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzLmNvbHVtbnMtNF09XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgICAgW2NsYXNzLnctWzI0JV1dPVwiaXNTcGxpdEhlYWRlclJhdGlvKClcIj5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgY29uZmlnUmlnaHQoKTsgdHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzLm1yLVsxMnB4XV09XCIhbGFzdFwiPlxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdidXR0b24nICYmIGl0ZW0uY29uZmlnQnV0dG9uOyBhcyBjb25maWdCdXR0b24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvbi5sYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImNvbmZpZ0J1dHRvbi5jbGFzc0xhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImNvbmZpZ0J1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJjb25maWdCdXR0b24uaWNvbk9ubHlUeXBlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImNvbmZpZ0J1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ0J1dHRvbi5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnQnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJjb25maWdCdXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0FjdGlvbihjb25maWdCdXR0b24pXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ3N3aWN0aCcgJiYgIWl0ZW0uaWdub3JlU2hvd0J1dHRvbiAmJiBpdGVtLmNvbmZpZ1N3aWN0aDsgYXMgY29uZmlnU3dpY3RoKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICBbYWN0aXZlXT1cImNvbmZpZ1N3aWN0aC5hY3RpdmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJjb25maWdTd2ljdGguZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goY29uZmlnU3dpY3RoLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ21lbnUtZHJvcGRvd24nICYmIGl0ZW0uY29uZmlnRHJvcGRvd247IGFzIGNvbmZpZ0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCIyMDA0XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiY29uZmlnRHJvcGRvd24ubGlzdENvbmZpZ1wiXG4gICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cImNvbmZpZ0Ryb3Bkb3duLnBvcG92ZXJDdXN0b21Db25maWdcIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckRyb3Bkb3duRnVuY3Rpb25Db250cm9sKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHRleHQtWyMzMzMzMzNdIHRleHQtWzEycHhdIHt7IGNvbmZpZ0Ryb3Bkb3duLmNsYXNzSW5jbHVkZSB9fSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3AtWzdweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCdcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ2J1dHRvbi1kcm9wZG93bicgJiYgaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bjsgYXMgY29uZmlnRHJvcGRvd24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1kcm9wZG93blxuICAgICAgICAgICAgICBbYXBwbHlOb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmNsYXNzSWNvblJpZ2h0IHx8ICcgJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uY2xhc3NJY29uTGVmdCB8fCAnICdcIlxuICAgICAgICAgICAgICBbdHlwZUJ1dHRvbl09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLnR5cGUgfHwgJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uaXRlbXMgfHwgW11cIlxuICAgICAgICAgICAgICBbZmllbGREaXNwbGF5XT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uZmllbGREaXNwbGF5XCJcbiAgICAgICAgICAgICAgW3BvcHVwQ29uZmlnXT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24ucG9wdXBDb25maWcgfHwgeyB3aWR0aDogMjA1LCBtYXhXaWR0aDogNDA4LCBtYXhIZWlnaHQ6IDQ4LCB6SW5kZXg6IDEwMCwgZGlyZWN0aW9uOiAnYm90dG9tJyB9XCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEl0ZW0pPVwiaGFuZGxlclNlbGVjdGVkQnV0dG9uRHJvcGRvd25JdGVtKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGl0ZW0ua2V5ID09PSAncmFkaW8tZ3JvdXAnICYmIGl0ZW0uY29uZmlnUmFkaW9Hcm91cDsgYXMgY29uZmlnUmFkaW9Hcm91cCkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1yYWRpby1ncm91cFxuICAgICAgICAgICAgICBbZ3JvdXBzXT1cImNvbmZpZ1JhZGlvR3JvdXBcIlxuICAgICAgICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3R5cGVSYWRpb109XCInbWVkaXVtJ1wiXG4gICAgICAgICAgICAgIFtpZ25vcmVDbGFzc01hcmdpbkxhc3RJdGVtXT1cInRydWVcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VSYWRpbygkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ3Rvb2x0aXAtYnV0dG9uJyAmJiBpdGVtLmNvbmZpZ1Rvb2x0aXBCdXR0b247IGFzIGNvbmZpZ1Rvb2x0aXBCdXR0b24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbdHlwZV09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ1Rvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdUb29sdGlwPy5jb25maWdcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy50eXBlIHx8ICdidXR0b24tdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8uY2xhc3NJY29uTGVmdCB8fCAnbGlicy11aS1pY29uLW1vcmUtdmVydGljYWwgcm90YXRlLVs5MGRlZ10gbXItMCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/Lmljb25Pbmx5VHlwZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LnBvcG92ZXIgfHwge31cIlxuICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xUb29sdGlwQnV0dG9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8uZGlzYWJsZSA/PyBmYWxzZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEJPRFkgPT09PT09PT09PT09PT09PT09PT09IC0tPlxuICBAaWYgKGJvZHlDb25maWcoKS5nZXRDb21wb25lbnRPdXRsZXQ7IGFzIGdldEJvZHlDb21wb25lbnRPdXRsZXQpIHtcbiAgICA8IS0tIExhenkgbG9hZCBtb2RlOiBIaeG7g24gdGjhu4sgc2tlbGV0b24ga2hpIMSRYW5nIGxvYWQsIHNhdSDEkcOzIHJlbmRlciBjb21wb25lbnQgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9kZXRhaWwtYm9keSB7eyBib2R5Q29uZmlnKCkuY2xhc3NJbmNsdWRlIHx8ICcnIH19XCJcbiAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAob3V0U2Nyb2xsKT1cImhhbmRsZXJTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgQGxldCBjb25zdEh0bWxDb21wQm9keSA9IHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGdldEJvZHlDb21wb25lbnRPdXRsZXQgOiBzZWN0aW9uRGF0YSgpIDogbnVsbCA6IHsgdmFsdWVJc0VtcHR5OiBudWxsIH0gfCBhc3luYztcbiAgICAgIEBsZXQgY29uc3RIdG1sSW5wdXRzQm9keSA9IHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGJvZHlDb25maWcoKS5nZXREYXRhQ29tcG9uZW50T3V0bGV0IDogc2VjdGlvbkRhdGEoKSA6IG51bGwgOiB7IHZhbHVlSXNFbXB0eTogbnVsbCB9IHwgYXN5bmM7XG4gICAgICBAaWYgKGNvbnN0SHRtbENvbXBCb2R5KSB7XG4gICAgICAgIEBkZWZlciB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJjb25zdEh0bWxDb21wQm9keTsgaW5wdXRzOiBjb25zdEh0bWxJbnB1dHNCb2R5XCIgLz5cbiAgICAgICAgfSBAbG9hZGluZyB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1za2VsZXRvbiBbY29uZmlnXT1cInJlc29sdmVkU2tlbGV0b25Cb2R5KClcIiAvPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPCEtLSBTa2VsZXRvbiBoaeG7g24gdGjhu4sga2hpIE9ic2VydmFibGUgY2jGsGEgZW1pdCAoxJFhbmcgY2jhu50gZGVsYXkvaHR0cCkgLS0+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc2tlbGV0b24gW2NvbmZpZ109XCJyZXNvbHZlZFNrZWxldG9uQm9keSgpXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXYyLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wYWdlcy10ZW1wbGF0ZS9kZXRhaWwvc3JjL2RldGFpbC12Mi9pbnRlcmZhY2VzL2RldGFpbC12Mi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJU2tlbGV0b25Db25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNrZWxldG9uJztcbmltcG9ydCB7IFRZUEVfRlVOQ1RJT04gfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJUGFnZURldGFpbFYyQm9keUNvbmZpZyB7XG4gIC8qKiBIw6BtIHRy4bqjIHbhu4EgT2JzZXJ2YWJsZTxUeXBlPGFueT4+IMSR4buDIGxhenkgbG9hZCBjb21wb25lbnQgdsOgbyBib2R5ICovXG4gIGdldENvbXBvbmVudE91dGxldD86IFRZUEVfRlVOQ1RJT048YW55PjtcbiAgLyoqIEjDoG0gdHLhuqMgduG7gSBPYnNlcnZhYmxlPFJlY29yZD4gxJHhu4MgdHJ1eeG7gW4gZGF0YSB2w6BvIGNvbXBvbmVudCDEkcaw4bujYyBsb2FkICovXG4gIGdldERhdGFDb21wb25lbnRPdXRsZXQ/OiBUWVBFX0ZVTkNUSU9OPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFNrZWxldG9uIGhp4buDbiB0aOG7iyB0cm9uZyBsw7pjIE9ic2VydmFibGUgY2jGsGEgcmVzb2x2ZSAoZMO5bmcgV3JpdGFibGVTaWduYWwgxJHhu4MgcmVhY3RpdmUpICovXG4gIHNrZWxldG9uQ29uZmlnPzogV3JpdGFibGVTaWduYWw8SVNrZWxldG9uQ29uZmlnPjtcbiAgLyoqIENsYXNzIHRow6ptIHbDoG8gdsO5bmcgYm9keSB3cmFwcGVyICovXG4gIGNsYXNzSW5jbHVkZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFnZURldGFpbFYyU2VjdGlvbkRhdGEge1xuICBkaXNhYmxlOiBib29sZWFuO1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './detail-v2.interface';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZGV0YWlsL3NyYy9kZXRhaWwtdjIvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZXRhaWwtdjIuaW50ZXJmYWNlJztcbiJdfQ==
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
export * from './detail-v2/detail-v2.component';
|
|
2
|
+
export * from './detail-v2/interfaces';
|
|
1
3
|
export * from './detail.component';
|
|
2
4
|
export * from './interfaces/config.interface';
|
|
3
5
|
export * from './interfaces/function-control.interface';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZGV0YWlsL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMseUNBQXlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RldGFpbC12Mi9kZXRhaWwtdjIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZGV0YWlsLXYyL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXRhaWwuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLmludGVyZmFjZSc7XG4iXX0=
|
|
@@ -1,18 +1,155 @@
|
|
|
1
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
1
|
+
import { NgComponentOutlet, AsyncPipe, NgTemplateOutlet } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { input, model, output, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
4
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
5
|
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
6
6
|
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
7
7
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
8
8
|
import { LibsUiComponentsRadioGroupComponent } from '@libs-ui/components-radio-group';
|
|
9
9
|
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
10
|
+
import { LibsUiComponentsSkeletonComponent } from '@libs-ui/components-skeleton';
|
|
10
11
|
import { LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';
|
|
12
|
+
import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
|
|
11
13
|
import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
|
|
12
|
-
import { escapeHtml } from '@libs-ui/utils';
|
|
14
|
+
import { escapeHtml, get } from '@libs-ui/utils';
|
|
13
15
|
import * as i1 from '@ngx-translate/core';
|
|
14
16
|
import { TranslateModule } from '@ngx-translate/core';
|
|
15
17
|
|
|
18
|
+
class LibsUiComponentsPagesTemplateDetailV2Component {
|
|
19
|
+
// #region --- INPUTS (kế thừa từ V1) ---
|
|
20
|
+
zIndex = input(1000, { transform: (val) => val ?? 1000 });
|
|
21
|
+
configRight = input();
|
|
22
|
+
configTitle = input();
|
|
23
|
+
configCenter = input();
|
|
24
|
+
classIncludeHeader = input();
|
|
25
|
+
isSplitHeaderRatio = input();
|
|
26
|
+
// #endregion
|
|
27
|
+
// #region --- INPUTS (mới trong V2) ---
|
|
28
|
+
/** Config để lazy load component vào vùng body */
|
|
29
|
+
bodyConfig = input({}, { transform: (v) => v || {} });
|
|
30
|
+
// #endregion
|
|
31
|
+
// #region --- MODELS ---
|
|
32
|
+
disable = model(false);
|
|
33
|
+
// #endregion
|
|
34
|
+
// #region --- OUTPUTS ---
|
|
35
|
+
outScroll = output();
|
|
36
|
+
outClose = output();
|
|
37
|
+
outSelectedMenuDropdown = output();
|
|
38
|
+
outSelectedButtonDropdown = output();
|
|
39
|
+
outFunctionControl = output();
|
|
40
|
+
outSelectedRadio = output();
|
|
41
|
+
outStateDisable = output();
|
|
42
|
+
outTooltipButtonFunctionControl = output();
|
|
43
|
+
// #endregion
|
|
44
|
+
// #region --- INTERNAL STATE ---
|
|
45
|
+
dropdownFunctionControl;
|
|
46
|
+
// #endregion
|
|
47
|
+
// #region --- COMPUTED ---
|
|
48
|
+
configTitleComputed = computed(() => {
|
|
49
|
+
const config = this.configTitle()?.config;
|
|
50
|
+
if (!config) {
|
|
51
|
+
return { content: 'i18n_back_to_list' };
|
|
52
|
+
}
|
|
53
|
+
if (!config.content) {
|
|
54
|
+
config.content = 'i18n_back_to_list';
|
|
55
|
+
return config;
|
|
56
|
+
}
|
|
57
|
+
return { ...config, content: escapeHtml(config.content) };
|
|
58
|
+
});
|
|
59
|
+
/** Dữ liệu state truyền vào Component Outlet body */
|
|
60
|
+
sectionData = computed(() => ({
|
|
61
|
+
disable: this.disable(),
|
|
62
|
+
}));
|
|
63
|
+
/** Skeleton config cho Body (Dùng computed để resolve default logic) */
|
|
64
|
+
resolvedSkeletonBody = computed(() => {
|
|
65
|
+
return (get(this.bodyConfig, 'skeletonConfig') ?? {
|
|
66
|
+
repeat: 3,
|
|
67
|
+
styleMarginBottom: 16,
|
|
68
|
+
rows: [{ item: { classInclude: 'w-full h-[100px] rounded-[8px]' } }],
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
// #endregion
|
|
72
|
+
ngOnInit() {
|
|
73
|
+
this.outFunctionControl.emit(this.FunctionsControl);
|
|
74
|
+
}
|
|
75
|
+
// #region --- PUBLIC METHODS ---
|
|
76
|
+
get FunctionsControl() {
|
|
77
|
+
return {
|
|
78
|
+
setStateDisable: this.setStateDisable.bind(this),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// #endregion
|
|
82
|
+
// #region --- EVENT HANDLERS ---
|
|
83
|
+
handlerClickAction(event) {
|
|
84
|
+
if (event && event.action) {
|
|
85
|
+
event.action();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async handlerSwitch(event, swicthEvent) {
|
|
89
|
+
if (event && event.action) {
|
|
90
|
+
await event.action(swicthEvent);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
handlerClose(e) {
|
|
94
|
+
e.stopPropagation();
|
|
95
|
+
this.outClose.emit(true);
|
|
96
|
+
}
|
|
97
|
+
handlerPopoverEvent(event) {
|
|
98
|
+
if (event !== 'click') {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.outClose.emit(true);
|
|
102
|
+
}
|
|
103
|
+
handlerSelectedKey(event) {
|
|
104
|
+
this.outSelectedMenuDropdown.emit(event);
|
|
105
|
+
this.dropdownFunctionControl?.reset();
|
|
106
|
+
this.dropdownFunctionControl?.removeList();
|
|
107
|
+
}
|
|
108
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
109
|
+
handlerSelectedButtonDropdownItem(event) {
|
|
110
|
+
this.outSelectedButtonDropdown.emit(event);
|
|
111
|
+
}
|
|
112
|
+
handlerDropdownFunctionControl(event) {
|
|
113
|
+
this.dropdownFunctionControl = event;
|
|
114
|
+
}
|
|
115
|
+
handlerChangeRadio(event) {
|
|
116
|
+
this.outSelectedRadio.emit(event);
|
|
117
|
+
}
|
|
118
|
+
handlerFunctionControlTooltipButton(event) {
|
|
119
|
+
this.outTooltipButtonFunctionControl.emit(event);
|
|
120
|
+
}
|
|
121
|
+
handlerScroll(event) {
|
|
122
|
+
this.outScroll.emit(event);
|
|
123
|
+
}
|
|
124
|
+
// #endregion
|
|
125
|
+
// #region --- PRIVATE LOGIC ---
|
|
126
|
+
async setStateDisable(stateDisable) {
|
|
127
|
+
this.disable.set(stateDisable);
|
|
128
|
+
this.outStateDisable.emit(this.disable());
|
|
129
|
+
}
|
|
130
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
131
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateDetailV2Component, isStandalone: true, selector: "libs_ui-components-pages_template-detail_v2", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configRight: { classPropertyName: "configRight", publicName: "configRight", isSignal: true, isRequired: false, transformFunction: null }, configTitle: { classPropertyName: "configTitle", publicName: "configTitle", isSignal: true, isRequired: false, transformFunction: null }, configCenter: { classPropertyName: "configCenter", publicName: "configCenter", isSignal: true, isRequired: false, transformFunction: null }, classIncludeHeader: { classPropertyName: "classIncludeHeader", publicName: "classIncludeHeader", isSignal: true, isRequired: false, transformFunction: null }, isSplitHeaderRatio: { classPropertyName: "isSplitHeaderRatio", publicName: "isSplitHeaderRatio", isSignal: true, isRequired: false, transformFunction: null }, bodyConfig: { classPropertyName: "bodyConfig", publicName: "bodyConfig", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disable: "disableChange", outScroll: "outScroll", outClose: "outClose", outSelectedMenuDropdown: "outSelectedMenuDropdown", outSelectedButtonDropdown: "outSelectedButtonDropdown", outFunctionControl: "outFunctionControl", outSelectedRadio: "outSelectedRadio", outStateDisable: "outStateDisable", outTooltipButtonFunctionControl: "outTooltipButtonFunctionControl" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hi\u1EC3n th\u1ECB khi Observable ch\u01B0a emit (\u0111ang ch\u1EDD delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsRadioGroupComponent, selector: "libs_ui-components-radio-group", inputs: ["fieldKey", "keyActive", "keysDisable", "groups", "disable", "clickExactly", "horizontal", "labelConfig", "validRequired", "ignoreClassMarginLastItem", "typeRadio", "classInclude", "classLabelInclude", "classItemInclude", "alwaysShowSubText", "horizontalClassInclude"], outputs: ["groupsChange", "outClickButton", "outChange", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsButtonsDropdownComponent, selector: "libs_ui-components-buttons-dropdown", inputs: ["label", "fieldClass", "fieldClassIconLeft", "items", "fieldDisplay", "keyField", "keySelected", "applyNow", "showBorderBottom", "disable", "sizeButton", "classLabel", "iconOnlyType", "classIconRight", "classIconLeft", "typeButton", "popupConfig", "ignoreHiddenPopoverContentWhenMouseLeave", "classInclude", "modePopover", "classIncludeContainer"], outputs: ["keySelectedChange", "outSelectItem", "outHover", "outApply", "outPopoverEvent", "outFunctionsControl", "outIconEvent"] }, { kind: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [NgComponentOutlet]] });
|
|
132
|
+
}
|
|
133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailV2Component, decorators: [{
|
|
134
|
+
type: Component,
|
|
135
|
+
args: [{ selector: 'libs_ui-components-pages_template-detail_v2', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
136
|
+
AsyncPipe,
|
|
137
|
+
NgComponentOutlet,
|
|
138
|
+
NgTemplateOutlet,
|
|
139
|
+
TranslateModule,
|
|
140
|
+
LibsUiComponentsButtonsButtonComponent,
|
|
141
|
+
LibsUiComponentsPopoverComponent,
|
|
142
|
+
LibsUiComponentsRadioGroupComponent,
|
|
143
|
+
LibsUiComponentsSwitchComponent,
|
|
144
|
+
LibsUiComponentsDropdownComponent,
|
|
145
|
+
LibsUiComponentsScrollOverlayDirective,
|
|
146
|
+
LibsUiComponentsButtonsDropdownComponent,
|
|
147
|
+
LibsUiComponentsSkeletonComponent,
|
|
148
|
+
LibsUiPipesCallFunctionInTemplatePipe,
|
|
149
|
+
LibsUiPipesEscapeHtmlPipe,
|
|
150
|
+
], template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hi\u1EC3n th\u1ECB khi Observable ch\u01B0a emit (\u0111ang ch\u1EDD delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"] }]
|
|
151
|
+
}] });
|
|
152
|
+
|
|
16
153
|
class LibsUiComponentsPagesTemplateDetailComponent {
|
|
17
154
|
dropdownFunctionControl;
|
|
18
155
|
configTitleComputed = computed(() => {
|
|
@@ -118,5 +255,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
118
255
|
* Generated bundle index. Do not edit.
|
|
119
256
|
*/
|
|
120
257
|
|
|
121
|
-
export { LibsUiComponentsPagesTemplateDetailComponent };
|
|
258
|
+
export { LibsUiComponentsPagesTemplateDetailComponent, LibsUiComponentsPagesTemplateDetailV2Component };
|
|
122
259
|
//# sourceMappingURL=libs-ui-components-pages-template-detail.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-pages-template-detail.mjs","sources":["../../../../../../libs-ui/components/pages-template/detail/src/detail.component.ts","../../../../../../libs-ui/components/pages-template/detail/src/detail.component.html","../../../../../../libs-ui/components/pages-template/detail/src/libs-ui-components-pages-template-detail.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input, model, OnInit, output } from '@angular/core';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';\nimport { IDropdownFunctionControlEvent, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { LibsUiComponentsRadioGroupComponent } from '@libs-ui/components-radio-group';\nimport { IRadioEvent } from '@libs-ui/components-radio-single';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { ISwitch, ISwitchEvent, LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';\nimport { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';\nimport { escapeHtml } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPagesTemplateDetailConfigCenter, IPagesTemplateDetailConfigRight, IPagesTemplateDetailConfigTitle } from './interfaces/config.interface';\nimport { IPageDetailFunctionControl } from './interfaces/function-control.interface';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-pages_template-detail',\n templateUrl: './detail.component.html',\n styleUrls: ['./detail.component.scss'],\n standalone: true,\n imports: [\n TranslateModule,\n NgTemplateOutlet,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsPopoverComponent,\n LibsUiComponentsRadioGroupComponent,\n LibsUiComponentsSwitchComponent,\n LibsUiComponentsDropdownComponent,\n LibsUiComponentsScrollOverlayDirective,\n LibsUiComponentsButtonsDropdownComponent,\n LibsUiPipesEscapeHtmlPipe,\n ],\n})\nexport class LibsUiComponentsPagesTemplateDetailComponent implements OnInit {\n private dropdownFunctionControl!: IDropdownFunctionControlEvent;\n protected configTitleComputed = computed(() => {\n const config = this.configTitle()?.config;\n if (!config) {\n return { content: 'i18n_back_to_list' };\n }\n\n if (!config.content) {\n config.content = 'i18n_back_to_list';\n return config;\n }\n\n return { ...config, content: escapeHtml(config.content) };\n });\n\n readonly zIndex = input<number, number | undefined>(1000, { transform: (val) => val ?? 1000 });\n readonly configRight = input<Array<IPagesTemplateDetailConfigRight>>();\n readonly configTitle = input<IPagesTemplateDetailConfigTitle>();\n readonly configCenter = input<IPagesTemplateDetailConfigCenter>();\n readonly classIncludeHeader = input<string>();\n readonly classIncludeBody = input<string>();\n readonly disable = model<boolean>(false);\n readonly isSplitHeaderRatio = input<boolean>(); // dùng khi muốn chia header làm 3 phần theo tỉ lệ 24 52 24\n\n readonly outScroll = output<Event>();\n readonly outClose = output<boolean>();\n readonly outSelectedMenuDropdown = output<IEmitSelectKey | undefined>();\n readonly outSelectedButtonDropdown = output<IEmitSelectKey>();\n readonly outFunctionControl = output<IPageDetailFunctionControl>();\n readonly outSelectedRadio = output<IRadioEvent>();\n readonly outStateDisable = output<boolean>();\n readonly outTooltipButtonFunctionControl = output<IPopoverFunctionControlEvent>();\n\n ngOnInit() {\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IPageDetailFunctionControl {\n return {\n setStateDisable: this.setStateDisable.bind(this),\n };\n }\n\n protected handlerClickAction(event: IButton) {\n if (event && event.action) {\n event.action();\n }\n }\n\n protected async handlerSwitch(event: ISwitch, swicthEvent: ISwitchEvent) {\n if (event && event.action) {\n await event.action(swicthEvent);\n }\n }\n\n protected handlerClose(e: Event) {\n e.stopPropagation();\n this.outClose.emit(true);\n }\n\n protected handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n if (event !== 'click') {\n return;\n }\n this.outClose.emit(true);\n }\n\n protected handlerSelectedKey(event?: IEmitSelectKey) {\n this.outSelectedMenuDropdown.emit(event);\n this.dropdownFunctionControl?.reset(); //lỗi chọn lần 2 (chưa reset thì keySelected chưa reset nên không chọn tiếp vào lựa chọn cũ)\n this.dropdownFunctionControl?.removeList();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected handlerSelectedButtonDropdownItem(event: any) {\n this.outSelectedButtonDropdown.emit(event);\n }\n\n protected handlerDropdownFunctionControl(event: IDropdownFunctionControlEvent) {\n this.dropdownFunctionControl = event;\n }\n\n private async setStateDisable(stateDisable: boolean) {\n this.disable.set(stateDisable);\n this.outStateDisable.emit(this.disable());\n }\n\n protected handlerChangeRadio(event: IRadioEvent) {\n this.outSelectedRadio.emit(event);\n }\n\n protected handlerFunctionControlTooltipButton(event: IPopoverFunctionControlEvent) {\n this.outTooltipButtonFunctionControl.emit(event);\n }\n\n protected handlerScroll(event: Event) {\n this.outScroll.emit(event);\n }\n}\n","<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"libs-ui-components-page_detail-body {{ classIncludeBody() }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n <ng-content></ng-content>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-pages-template-detail.mjs","sources":["../../../../../../libs-ui/components/pages-template/detail/src/detail-v2/detail-v2.component.ts","../../../../../../libs-ui/components/pages-template/detail/src/detail-v2/detail-v2.component.html","../../../../../../libs-ui/components/pages-template/detail/src/detail.component.ts","../../../../../../libs-ui/components/pages-template/detail/src/detail.component.html","../../../../../../libs-ui/components/pages-template/detail/src/libs-ui-components-pages-template-detail.ts"],"sourcesContent":["import { AsyncPipe, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, OnInit, Signal, computed, input, model, output } from '@angular/core';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';\nimport { IDropdownFunctionControlEvent, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { LibsUiComponentsRadioGroupComponent } from '@libs-ui/components-radio-group';\nimport { IRadioEvent } from '@libs-ui/components-radio-single';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { ISkeletonConfig, LibsUiComponentsSkeletonComponent } from '@libs-ui/components-skeleton';\nimport { ISwitch, ISwitchEvent, LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';\nimport { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';\nimport { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';\nimport { escapeHtml, get } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPagesTemplateDetailConfigCenter, IPagesTemplateDetailConfigRight, IPagesTemplateDetailConfigTitle } from '../interfaces/config.interface';\nimport { IPageDetailFunctionControl } from '../interfaces/function-control.interface';\nimport { IPageDetailV2BodyConfig, IPageDetailV2SectionData } from './interfaces/detail-v2.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-pages_template-detail_v2',\n templateUrl: './detail-v2.component.html',\n styleUrls: ['./detail-v2.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AsyncPipe,\n NgComponentOutlet,\n NgTemplateOutlet,\n TranslateModule,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsPopoverComponent,\n LibsUiComponentsRadioGroupComponent,\n LibsUiComponentsSwitchComponent,\n LibsUiComponentsDropdownComponent,\n LibsUiComponentsScrollOverlayDirective,\n LibsUiComponentsButtonsDropdownComponent,\n LibsUiComponentsSkeletonComponent,\n LibsUiPipesCallFunctionInTemplatePipe,\n LibsUiPipesEscapeHtmlPipe,\n ],\n})\nexport class LibsUiComponentsPagesTemplateDetailV2Component implements OnInit {\n // #region --- INPUTS (kế thừa từ V1) ---\n readonly zIndex = input<number, number | undefined>(1000, { transform: (val) => val ?? 1000 });\n readonly configRight = input<Array<IPagesTemplateDetailConfigRight>>();\n readonly configTitle = input<IPagesTemplateDetailConfigTitle>();\n readonly configCenter = input<IPagesTemplateDetailConfigCenter>();\n readonly classIncludeHeader = input<string>();\n readonly isSplitHeaderRatio = input<boolean>();\n // #endregion\n\n // #region --- INPUTS (mới trong V2) ---\n /** Config để lazy load component vào vùng body */\n readonly bodyConfig = input<IPageDetailV2BodyConfig, IPageDetailV2BodyConfig | undefined>({}, { transform: (v) => v || {} });\n // #endregion\n\n // #region --- MODELS ---\n readonly disable = model<boolean>(false);\n // #endregion\n\n // #region --- OUTPUTS ---\n readonly outScroll = output<Event>();\n readonly outClose = output<boolean>();\n readonly outSelectedMenuDropdown = output<IEmitSelectKey | undefined>();\n readonly outSelectedButtonDropdown = output<IEmitSelectKey>();\n readonly outFunctionControl = output<IPageDetailFunctionControl>();\n readonly outSelectedRadio = output<IRadioEvent>();\n readonly outStateDisable = output<boolean>();\n readonly outTooltipButtonFunctionControl = output<IPopoverFunctionControlEvent>();\n // #endregion\n\n // #region --- INTERNAL STATE ---\n private dropdownFunctionControl!: IDropdownFunctionControlEvent;\n // #endregion\n\n // #region --- COMPUTED ---\n protected readonly configTitleComputed = computed(() => {\n const config = this.configTitle()?.config;\n if (!config) {\n return { content: 'i18n_back_to_list' };\n }\n if (!config.content) {\n config.content = 'i18n_back_to_list';\n return config;\n }\n return { ...config, content: escapeHtml(config.content) };\n });\n\n /** Dữ liệu state truyền vào Component Outlet body */\n protected readonly sectionData = computed<IPageDetailV2SectionData>(() => ({\n disable: this.disable(),\n }));\n\n /** Skeleton config cho Body (Dùng computed để resolve default logic) */\n protected readonly resolvedSkeletonBody: Signal<ISkeletonConfig> = computed(() => {\n return (\n get(this.bodyConfig, 'skeletonConfig') ?? {\n repeat: 3,\n styleMarginBottom: 16,\n rows: [{ item: { classInclude: 'w-full h-[100px] rounded-[8px]' } }],\n }\n );\n });\n // #endregion\n\n ngOnInit() {\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n // #region --- PUBLIC METHODS ---\n public get FunctionsControl(): IPageDetailFunctionControl {\n return {\n setStateDisable: this.setStateDisable.bind(this),\n };\n }\n // #endregion\n\n // #region --- EVENT HANDLERS ---\n protected handlerClickAction(event: IButton) {\n if (event && event.action) {\n event.action();\n }\n }\n\n protected async handlerSwitch(event: ISwitch, swicthEvent: ISwitchEvent) {\n if (event && event.action) {\n await event.action(swicthEvent);\n }\n }\n\n protected handlerClose(e: Event) {\n e.stopPropagation();\n this.outClose.emit(true);\n }\n\n protected handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n if (event !== 'click') {\n return;\n }\n this.outClose.emit(true);\n }\n\n protected handlerSelectedKey(event?: IEmitSelectKey) {\n this.outSelectedMenuDropdown.emit(event);\n this.dropdownFunctionControl?.reset();\n this.dropdownFunctionControl?.removeList();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected handlerSelectedButtonDropdownItem(event: any) {\n this.outSelectedButtonDropdown.emit(event);\n }\n\n protected handlerDropdownFunctionControl(event: IDropdownFunctionControlEvent) {\n this.dropdownFunctionControl = event;\n }\n\n protected handlerChangeRadio(event: IRadioEvent) {\n this.outSelectedRadio.emit(event);\n }\n\n protected handlerFunctionControlTooltipButton(event: IPopoverFunctionControlEvent) {\n this.outTooltipButtonFunctionControl.emit(event);\n }\n\n protected handlerScroll(event: Event) {\n this.outScroll.emit(event);\n }\n // #endregion\n\n // #region --- PRIVATE LOGIC ---\n private async setStateDisable(stateDisable: boolean) {\n this.disable.set(stateDisable);\n this.outStateDisable.emit(this.disable());\n }\n // #endregion\n}\n","<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Giữ nguyên hoàn toàn từ V1 -->\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hiển thị skeleton khi đang load, sau đó render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hiển thị khi Observable chưa emit (đang chờ delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input, model, OnInit, output } from '@angular/core';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';\nimport { IDropdownFunctionControlEvent, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { LibsUiComponentsRadioGroupComponent } from '@libs-ui/components-radio-group';\nimport { IRadioEvent } from '@libs-ui/components-radio-single';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { ISwitch, ISwitchEvent, LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';\nimport { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';\nimport { escapeHtml } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPagesTemplateDetailConfigCenter, IPagesTemplateDetailConfigRight, IPagesTemplateDetailConfigTitle } from './interfaces/config.interface';\nimport { IPageDetailFunctionControl } from './interfaces/function-control.interface';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-pages_template-detail',\n templateUrl: './detail.component.html',\n styleUrls: ['./detail.component.scss'],\n standalone: true,\n imports: [\n TranslateModule,\n NgTemplateOutlet,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsPopoverComponent,\n LibsUiComponentsRadioGroupComponent,\n LibsUiComponentsSwitchComponent,\n LibsUiComponentsDropdownComponent,\n LibsUiComponentsScrollOverlayDirective,\n LibsUiComponentsButtonsDropdownComponent,\n LibsUiPipesEscapeHtmlPipe,\n ],\n})\nexport class LibsUiComponentsPagesTemplateDetailComponent implements OnInit {\n private dropdownFunctionControl!: IDropdownFunctionControlEvent;\n protected configTitleComputed = computed(() => {\n const config = this.configTitle()?.config;\n if (!config) {\n return { content: 'i18n_back_to_list' };\n }\n\n if (!config.content) {\n config.content = 'i18n_back_to_list';\n return config;\n }\n\n return { ...config, content: escapeHtml(config.content) };\n });\n\n readonly zIndex = input<number, number | undefined>(1000, { transform: (val) => val ?? 1000 });\n readonly configRight = input<Array<IPagesTemplateDetailConfigRight>>();\n readonly configTitle = input<IPagesTemplateDetailConfigTitle>();\n readonly configCenter = input<IPagesTemplateDetailConfigCenter>();\n readonly classIncludeHeader = input<string>();\n readonly classIncludeBody = input<string>();\n readonly disable = model<boolean>(false);\n readonly isSplitHeaderRatio = input<boolean>(); // dùng khi muốn chia header làm 3 phần theo tỉ lệ 24 52 24\n\n readonly outScroll = output<Event>();\n readonly outClose = output<boolean>();\n readonly outSelectedMenuDropdown = output<IEmitSelectKey | undefined>();\n readonly outSelectedButtonDropdown = output<IEmitSelectKey>();\n readonly outFunctionControl = output<IPageDetailFunctionControl>();\n readonly outSelectedRadio = output<IRadioEvent>();\n readonly outStateDisable = output<boolean>();\n readonly outTooltipButtonFunctionControl = output<IPopoverFunctionControlEvent>();\n\n ngOnInit() {\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IPageDetailFunctionControl {\n return {\n setStateDisable: this.setStateDisable.bind(this),\n };\n }\n\n protected handlerClickAction(event: IButton) {\n if (event && event.action) {\n event.action();\n }\n }\n\n protected async handlerSwitch(event: ISwitch, swicthEvent: ISwitchEvent) {\n if (event && event.action) {\n await event.action(swicthEvent);\n }\n }\n\n protected handlerClose(e: Event) {\n e.stopPropagation();\n this.outClose.emit(true);\n }\n\n protected handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n if (event !== 'click') {\n return;\n }\n this.outClose.emit(true);\n }\n\n protected handlerSelectedKey(event?: IEmitSelectKey) {\n this.outSelectedMenuDropdown.emit(event);\n this.dropdownFunctionControl?.reset(); //lỗi chọn lần 2 (chưa reset thì keySelected chưa reset nên không chọn tiếp vào lựa chọn cũ)\n this.dropdownFunctionControl?.removeList();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected handlerSelectedButtonDropdownItem(event: any) {\n this.outSelectedButtonDropdown.emit(event);\n }\n\n protected handlerDropdownFunctionControl(event: IDropdownFunctionControlEvent) {\n this.dropdownFunctionControl = event;\n }\n\n private async setStateDisable(stateDisable: boolean) {\n this.disable.set(stateDisable);\n this.outStateDisable.emit(this.disable());\n }\n\n protected handlerChangeRadio(event: IRadioEvent) {\n this.outSelectedRadio.emit(event);\n }\n\n protected handlerFunctionControlTooltipButton(event: IPopoverFunctionControlEvent) {\n this.outTooltipButtonFunctionControl.emit(event);\n }\n\n protected handlerScroll(event: Event) {\n this.outScroll.emit(event);\n }\n}\n","<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '—'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"libs-ui-components-page_detail-body {{ classIncludeBody() }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n <ng-content></ng-content>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-pages-template-detail",
|
|
3
|
-
"version": "0.2.356-
|
|
3
|
+
"version": "0.2.356-2",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=18.0.0",
|
|
6
6
|
"@angular/core": ">=18.0.0",
|
|
7
|
-
"@libs-ui/components-buttons-button": "0.2.356-
|
|
8
|
-
"@libs-ui/components-buttons-dropdown": "0.2.356-
|
|
9
|
-
"@libs-ui/components-dropdown": "0.2.356-
|
|
10
|
-
"@libs-ui/components-popover": "0.2.356-
|
|
11
|
-
"@libs-ui/components-radio-group": "0.2.356-
|
|
12
|
-
"@libs-ui/components-radio-single": "0.2.356-
|
|
13
|
-
"@libs-ui/components-scroll-overlay": "0.2.356-
|
|
14
|
-
"@libs-ui/components-switch": "0.2.356-
|
|
15
|
-
"@libs-ui/pipes-escape-html": "0.2.356-
|
|
16
|
-
"@libs-ui/utils": "0.2.356-
|
|
7
|
+
"@libs-ui/components-buttons-button": "0.2.356-2",
|
|
8
|
+
"@libs-ui/components-buttons-dropdown": "0.2.356-2",
|
|
9
|
+
"@libs-ui/components-dropdown": "0.2.356-2",
|
|
10
|
+
"@libs-ui/components-popover": "0.2.356-2",
|
|
11
|
+
"@libs-ui/components-radio-group": "0.2.356-2",
|
|
12
|
+
"@libs-ui/components-radio-single": "0.2.356-2",
|
|
13
|
+
"@libs-ui/components-scroll-overlay": "0.2.356-2",
|
|
14
|
+
"@libs-ui/components-switch": "0.2.356-2",
|
|
15
|
+
"@libs-ui/pipes-escape-html": "0.2.356-2",
|
|
16
|
+
"@libs-ui/utils": "0.2.356-2",
|
|
17
17
|
"@ngx-translate/core": "^15.0.0",
|
|
18
|
-
"@libs-ui/interfaces-types": "0.2.356-
|
|
18
|
+
"@libs-ui/interfaces-types": "0.2.356-2"
|
|
19
19
|
},
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"module": "fesm2022/libs-ui-components-pages-template-detail.mjs",
|