@geoit/ui 0.0.4 → 0.0.6
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/AGENTS.md +12 -8
- package/README.md +94 -66
- package/ai/AGENTS.md +106 -16
- package/ai/README.md +35 -1
- package/ai/catalog.json +2855 -275
- package/ai/components/geo-alert.md +3 -3
- package/ai/components/geo-back-button.md +2 -2
- package/ai/components/geo-breadcrumb.md +1 -1
- package/ai/components/geo-button.md +3 -3
- package/ai/components/geo-chart.md +115 -0
- package/ai/components/geo-checkbox.md +4 -6
- package/ai/components/geo-column-picker.md +3 -3
- package/ai/components/geo-confirm-modal.md +4 -5
- package/ai/components/geo-dashboard.md +102 -0
- package/ai/components/geo-date-picker.md +5 -3
- package/ai/components/geo-date-range-picker.md +5 -3
- package/ai/components/geo-empty-state.md +75 -0
- package/ai/components/geo-feedback-form.md +97 -0
- package/ai/components/geo-file-picker.md +4 -2
- package/ai/components/geo-forgot-password.md +81 -0
- package/ai/components/geo-form-modal.md +9 -10
- package/ai/components/geo-icon.md +3 -3
- package/ai/components/geo-input.md +8 -6
- package/ai/components/geo-layout-footer.md +70 -0
- package/ai/components/geo-layout-header-actions.md +82 -0
- package/ai/components/geo-layout-header.md +89 -0
- package/ai/components/geo-layout-sidebar.md +86 -0
- package/ai/components/geo-layout.md +155 -0
- package/ai/components/geo-list-page.md +75 -0
- package/ai/components/geo-login.md +106 -0
- package/ai/components/geo-map-admin-filter.md +85 -0
- package/ai/components/geo-map-basemap-switcher.md +79 -0
- package/ai/components/geo-map-help.md +72 -0
- package/ai/components/geo-map-layer-card.md +73 -0
- package/ai/components/geo-map-layer-panel.md +75 -0
- package/ai/components/geo-map-layers-drawer.md +78 -0
- package/ai/components/geo-map-legend.md +74 -0
- package/ai/components/geo-map-locate.md +75 -0
- package/ai/components/geo-map-location-chip.md +71 -0
- package/ai/components/geo-map-measure.md +74 -0
- package/ai/components/geo-map-opacity.md +75 -0
- package/ai/components/geo-map-parcel-popup.md +84 -0
- package/ai/components/geo-map-search.md +89 -0
- package/ai/components/geo-map-shell.md +146 -0
- package/ai/components/geo-map-snapshot.md +75 -0
- package/ai/components/geo-map-swipe.md +73 -0
- package/ai/components/geo-map-toolbar.md +81 -0
- package/ai/components/geo-map-zoom.md +74 -0
- package/ai/components/geo-map.md +212 -0
- package/ai/components/geo-overlap-result.md +88 -0
- package/ai/components/geo-page-header.md +72 -0
- package/ai/components/geo-page-title.md +1 -1
- package/ai/components/geo-pagination.md +4 -7
- package/ai/components/geo-radio.md +3 -1
- package/ai/components/geo-row-actions.md +3 -3
- package/ai/components/geo-select.md +4 -2
- package/ai/components/geo-slider.md +6 -8
- package/ai/components/geo-stat-card.md +98 -0
- package/ai/components/geo-status-tag.md +2 -2
- package/ai/components/geo-step-form-layout.md +7 -8
- package/ai/components/geo-stepper.md +3 -4
- package/ai/components/geo-table-filter.md +4 -5
- package/ai/components/geo-table-pagination.md +4 -7
- package/ai/components/geo-table-toolbar.md +7 -7
- package/ai/components/geo-table.md +17 -20
- package/ai/components/geo-tabs.md +4 -6
- package/ai/components/geo-textarea.md +4 -2
- package/ai/components/geo-toast.md +4 -4
- package/ai/components/geo-tree.md +4 -6
- package/ai/components/geo-typography.md +1 -1
- package/ai/components/geo-upload.md +9 -10
- package/ai/mockup.html +1194 -0
- package/ai/recipes.md +184 -85
- package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +19 -36
- package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +14 -24
- package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +8 -11
- package/esm2022/lib/figma/geo-button/geo-button.component.mjs +30 -59
- package/esm2022/lib/figma/geo-chart/geo-chart.component.mjs +88 -0
- package/esm2022/lib/figma/geo-chart/geo-chart.types.mjs +2 -0
- package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +11 -22
- package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +22 -54
- package/esm2022/lib/figma/geo-dashboard/geo-dashboard.component.mjs +49 -0
- package/esm2022/lib/figma/geo-dashboard/geo-dashboard.types.mjs +2 -0
- package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +48 -78
- package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +47 -75
- package/esm2022/lib/figma/geo-empty-state/geo-empty-state.component.mjs +25 -0
- package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.component.mjs +75 -0
- package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.types.mjs +2 -0
- package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +59 -81
- package/esm2022/lib/figma/geo-forgot-password/geo-forgot-password.component.mjs +51 -0
- package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +45 -112
- package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +22 -32
- package/esm2022/lib/figma/geo-input/geo-input.component.mjs +41 -70
- package/esm2022/lib/figma/geo-layout/footer/geo-layout-footer.component.mjs +18 -0
- package/esm2022/lib/figma/geo-layout/geo-layout-actions.directive.mjs +15 -0
- package/esm2022/lib/figma/geo-layout/geo-layout.component.mjs +79 -0
- package/esm2022/lib/figma/geo-layout/geo-layout.types.mjs +42 -0
- package/esm2022/lib/figma/geo-layout/header/geo-layout-header.component.mjs +60 -0
- package/esm2022/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.mjs +70 -0
- package/esm2022/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.mjs +90 -0
- package/esm2022/lib/figma/geo-list-page/geo-list-page.component.mjs +22 -0
- package/esm2022/lib/figma/geo-login/geo-login.component.mjs +58 -0
- package/esm2022/lib/figma/geo-login/geo-login.types.mjs +2 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.mjs +52 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.mjs +61 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.mjs +26 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.mjs +24 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.mjs +146 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.mjs +37 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.mjs +30 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +72 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.mjs +21 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.mjs +375 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.mjs +94 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.mjs +136 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.mjs +182 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +577 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.mjs +93 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.mjs +129 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.mjs +64 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.mjs +295 -0
- package/esm2022/lib/figma/geo-map/geo-map-toolbar.icons.mjs +18 -0
- package/esm2022/lib/figma/geo-map/geo-map.component.mjs +144 -0
- package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +497 -0
- package/esm2022/lib/figma/geo-map/geo-map.controller.mjs +71 -0
- package/esm2022/lib/figma/geo-map/geo-map.types.mjs +2 -0
- package/esm2022/lib/figma/geo-map/services/geo-map-layer.service.mjs +368 -0
- package/esm2022/lib/figma/geo-map/services/geo-map-projection.service.mjs +110 -0
- package/esm2022/lib/figma/geo-map/services/geo-map.service.mjs +540 -0
- package/esm2022/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.mjs +47 -0
- package/esm2022/lib/figma/geo-map/utils/geo-map-interactions.util.mjs +30 -0
- package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.component.mjs +25 -0
- package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.types.mjs +2 -0
- package/esm2022/lib/figma/geo-page-header/geo-page-header.component.mjs +23 -0
- package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +20 -35
- package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +13 -43
- package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +32 -52
- package/esm2022/lib/figma/geo-select/geo-select.component.mjs +46 -72
- package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +12 -28
- package/esm2022/lib/figma/geo-stat-card/geo-stat-card.component.mjs +163 -0
- package/esm2022/lib/figma/geo-stat-card/geo-stat-card.types.mjs +2 -0
- package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +23 -27
- package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +39 -96
- package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +18 -33
- package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +14 -24
- package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +18 -36
- package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +41 -98
- package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +40 -73
- package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +26 -56
- package/esm2022/lib/figma/geo-table/geo-table.component.mjs +110 -210
- package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +33 -63
- package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +28 -44
- package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +18 -39
- package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +12 -40
- package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +49 -64
- package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +50 -101
- package/esm2022/lib/figma/index.mjs +50 -1
- package/esm2022/lib/styles/tokens.mjs +56 -24
- package/fesm2022/geoit-ui.mjs +5981 -1825
- package/fesm2022/geoit-ui.mjs.map +1 -1
- package/lib/figma/geo-alert/geo-alert.component.d.ts +10 -11
- package/lib/figma/geo-back-button/geo-back-button.component.d.ts +6 -7
- package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +2 -2
- package/lib/figma/geo-button/geo-button.component.d.ts +21 -17
- package/lib/figma/geo-chart/geo-chart.component.d.ts +40 -0
- package/lib/figma/geo-chart/geo-chart.types.d.ts +13 -0
- package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +6 -7
- package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +15 -17
- package/lib/figma/geo-dashboard/geo-dashboard.component.d.ts +29 -0
- package/lib/figma/geo-dashboard/geo-dashboard.types.d.ts +7 -0
- package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +26 -21
- package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +25 -20
- package/lib/figma/geo-empty-state/geo-empty-state.component.d.ts +17 -0
- package/lib/figma/geo-feedback-form/geo-feedback-form.component.d.ts +36 -0
- package/lib/figma/geo-feedback-form/geo-feedback-form.types.d.ts +8 -0
- package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +23 -20
- package/lib/figma/geo-forgot-password/geo-forgot-password.component.d.ts +24 -0
- package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +33 -35
- package/lib/figma/geo-icon/geo-icon.component.d.ts +7 -7
- package/lib/figma/geo-input/geo-input.component.d.ts +23 -21
- package/lib/figma/geo-layout/footer/geo-layout-footer.component.d.ts +10 -0
- package/lib/figma/geo-layout/geo-layout-actions.directive.d.ts +6 -0
- package/lib/figma/geo-layout/geo-layout.component.d.ts +48 -0
- package/lib/figma/geo-layout/geo-layout.types.d.ts +44 -0
- package/lib/figma/geo-layout/header/geo-layout-header.component.d.ts +31 -0
- package/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.d.ts +32 -0
- package/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.d.ts +34 -0
- package/lib/figma/geo-list-page/geo-list-page.component.d.ts +16 -0
- package/lib/figma/geo-login/geo-login.component.d.ts +27 -0
- package/lib/figma/geo-login/geo-login.types.d.ts +6 -0
- package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +28 -0
- package/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.d.ts +26 -0
- package/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.d.ts +20 -0
- package/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.d.ts +15 -0
- package/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.d.ts +40 -0
- package/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.d.ts +25 -0
- package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +18 -0
- package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.d.ts +24 -0
- package/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.d.ts +14 -0
- package/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.d.ts +49 -0
- package/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.d.ts +30 -0
- package/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.d.ts +44 -0
- package/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.d.ts +56 -0
- package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +103 -0
- package/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.d.ts +21 -0
- package/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.d.ts +33 -0
- package/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.d.ts +30 -0
- package/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.d.ts +67 -0
- package/lib/figma/geo-map/geo-map-toolbar.icons.d.ts +17 -0
- package/lib/figma/geo-map/geo-map.component.d.ts +53 -0
- package/lib/figma/geo-map/geo-map.constants.d.ts +73 -0
- package/lib/figma/geo-map/geo-map.controller.d.ts +49 -0
- package/lib/figma/geo-map/geo-map.types.d.ts +224 -0
- package/lib/figma/geo-map/services/geo-map-layer.service.d.ts +42 -0
- package/lib/figma/geo-map/services/geo-map-projection.service.d.ts +32 -0
- package/lib/figma/geo-map/services/geo-map.service.d.ts +99 -0
- package/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.d.ts +13 -0
- package/lib/figma/geo-map/utils/geo-map-interactions.util.d.ts +9 -0
- package/lib/figma/geo-overlap-result/geo-overlap-result.component.d.ts +18 -0
- package/lib/figma/geo-overlap-result/geo-overlap-result.types.d.ts +7 -0
- package/lib/figma/geo-page-header/geo-page-header.component.d.ts +16 -0
- package/lib/figma/geo-page-title/geo-page-title.component.d.ts +9 -9
- package/lib/figma/geo-pagination/geo-pagination.component.d.ts +9 -14
- package/lib/figma/geo-radio/geo-radio.component.d.ts +17 -15
- package/lib/figma/geo-select/geo-select.component.d.ts +24 -19
- package/lib/figma/geo-slider/geo-slider.component.d.ts +7 -9
- package/lib/figma/geo-stat-card/geo-stat-card.component.d.ts +50 -0
- package/lib/figma/geo-stat-card/geo-stat-card.types.d.ts +11 -0
- package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +7 -7
- package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +27 -29
- package/lib/figma/geo-stepper/geo-stepper.component.d.ts +6 -8
- package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +6 -7
- package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +11 -12
- package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +21 -28
- package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +17 -20
- package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +17 -18
- package/lib/figma/geo-table/geo-table.component.d.ts +58 -62
- package/lib/figma/geo-tabs/geo-tabs.component.d.ts +14 -17
- package/lib/figma/geo-textarea/geo-textarea.component.d.ts +15 -13
- package/lib/figma/geo-toast/geo-toast.component.d.ts +11 -12
- package/lib/figma/geo-tree/geo-tree.component.d.ts +8 -13
- package/lib/figma/geo-typography/geo-typography.component.d.ts +13 -13
- package/lib/figma/geo-upload/geo-upload.component.d.ts +26 -28
- package/lib/figma/index.d.ts +49 -0
- package/lib/styles/tokens.d.ts +56 -23
- package/package.json +4 -2
- package/src/lib/figma/geo-map/assets/toolbar/fullscreen.svg +8 -0
- package/src/lib/figma/geo-map/assets/toolbar/home.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/layers.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/measure-area.svg +12 -0
- package/src/lib/figma/geo-map/assets/toolbar/measure-distance.svg +5 -0
- package/src/lib/figma/geo-map/assets/toolbar/pan.svg +13 -0
- package/src/lib/figma/geo-map/assets/toolbar/search.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/zoom-in.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/zoom-out.svg +5 -0
- package/src/lib/styles/design-tokens.scss +108 -35
- package/src/lib/styles/scrollbar.scss +2 -2
- package/src/lib/styles/theme.scss +1 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input, output, signal, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { NzBadgeModule } from 'ng-zorro-antd/badge';
|
|
3
|
+
import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
|
|
4
|
+
import { GeoIconComponent } from '../../geo-icon/geo-icon.component';
|
|
5
|
+
import { GEO_LAYOUT_DEFAULT_NOTIFICATIONS, GEO_LAYOUT_DEFAULT_SUBSYSTEMS, GEO_LAYOUT_DEFAULT_USER, GEO_LAYOUT_DEFAULT_USER_MENU, } from '../geo-layout.types';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "ng-zorro-antd/badge";
|
|
8
|
+
import * as i2 from "ng-zorro-antd/dropdown";
|
|
9
|
+
/**
|
|
10
|
+
* Header actions mặc định: thông báo, phân hệ, user chip + popovers (mock/data-driven).
|
|
11
|
+
*/
|
|
12
|
+
export class GeoLayoutHeaderActionsComponent {
|
|
13
|
+
user = input(GEO_LAYOUT_DEFAULT_USER);
|
|
14
|
+
notifications = input(GEO_LAYOUT_DEFAULT_NOTIFICATIONS);
|
|
15
|
+
subsystems = input(GEO_LAYOUT_DEFAULT_SUBSYSTEMS);
|
|
16
|
+
userMenuItems = input(GEO_LAYOUT_DEFAULT_USER_MENU);
|
|
17
|
+
/** Ẩn tên/email trên chip (mobile). */
|
|
18
|
+
compact = input(false);
|
|
19
|
+
notificationClick = output();
|
|
20
|
+
subsystemClick = output();
|
|
21
|
+
userMenuClick = output();
|
|
22
|
+
logout = output();
|
|
23
|
+
notifyOpen = signal(false);
|
|
24
|
+
subsystemOpen = signal(false);
|
|
25
|
+
userOpen = signal(false);
|
|
26
|
+
unreadCount = computed(() => this.notifications().filter((item) => !item.read).length);
|
|
27
|
+
initials = computed(() => {
|
|
28
|
+
const name = this.user().name?.trim() || '?';
|
|
29
|
+
const parts = name.split(/\s+/).filter(Boolean);
|
|
30
|
+
if (parts.length >= 2) {
|
|
31
|
+
return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();
|
|
32
|
+
}
|
|
33
|
+
return name.slice(0, 2).toUpperCase();
|
|
34
|
+
});
|
|
35
|
+
primaryMenuItems = computed(() => this.userMenuItems().filter((item) => !item.danger));
|
|
36
|
+
dangerMenuItems = computed(() => this.userMenuItems().filter((item) => item.danger));
|
|
37
|
+
onNotifyVisible(visible) {
|
|
38
|
+
this.notifyOpen.set(visible);
|
|
39
|
+
}
|
|
40
|
+
onSubsystemVisible(visible) {
|
|
41
|
+
this.subsystemOpen.set(visible);
|
|
42
|
+
}
|
|
43
|
+
onUserVisible(visible) {
|
|
44
|
+
this.userOpen.set(visible);
|
|
45
|
+
}
|
|
46
|
+
onNotificationItem(item) {
|
|
47
|
+
this.notificationClick.emit(item);
|
|
48
|
+
}
|
|
49
|
+
onSubsystemItem(item) {
|
|
50
|
+
this.subsystemOpen.set(false);
|
|
51
|
+
this.subsystemClick.emit(item);
|
|
52
|
+
}
|
|
53
|
+
onUserMenuItem(item) {
|
|
54
|
+
this.userOpen.set(false);
|
|
55
|
+
if (item.key === 'logout' || item.danger) {
|
|
56
|
+
this.logout.emit();
|
|
57
|
+
}
|
|
58
|
+
this.userMenuClick.emit(item);
|
|
59
|
+
}
|
|
60
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLayoutHeaderActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
61
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoLayoutHeaderActionsComponent, isStandalone: true, selector: "geo-layout-header-actions", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, subsystems: { classPropertyName: "subsystems", publicName: "subsystems", isSignal: true, isRequired: false, transformFunction: null }, userMenuItems: { classPropertyName: "userMenuItems", publicName: "userMenuItems", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { notificationClick: "notificationClick", subsystemClick: "subsystemClick", userMenuClick: "userMenuClick", logout: "logout" }, host: { properties: { "class.geo-layout-header-actions-host--compact": "compact()" }, classAttribute: "geo-layout-header-actions-host" }, ngImport: i0, template: "<div class=\"geo-layout-ha\">\n <div class=\"geo-layout-ha__icons\">\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"notifyMenu\"\n [nzVisible]=\"notifyOpen()\"\n (nzVisibleChange)=\"onNotifyVisible($event)\"\n aria-label=\"Th\u00F4ng b\u00E1o\"\n >\n <nz-badge [nzCount]=\"unreadCount()\" [nzOverflowCount]=\"9\" nzSize=\"small\">\n <geo-icon type=\"bell\" size=\"lg\" />\n </nz-badge>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"subsystemMenu\"\n [nzVisible]=\"subsystemOpen()\"\n (nzVisibleChange)=\"onSubsystemVisible($event)\"\n aria-label=\"Ph\u00E2n h\u1EC7\"\n >\n <geo-icon type=\"appstore\" size=\"lg\" />\n </button>\n </div>\n\n <span class=\"geo-layout-ha__divider\" aria-hidden=\"true\"></span>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__user\"\n [class.geo-layout-ha__user--open]=\"userOpen()\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"userMenu\"\n [nzVisible]=\"userOpen()\"\n (nzVisibleChange)=\"onUserVisible($event)\"\n aria-label=\"T\u00E0i kho\u1EA3n ng\u01B0\u1EDDi d\u00F9ng\"\n >\n <span class=\"geo-layout-ha__avatar\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n\n @if (!compact()) {\n <span class=\"geo-layout-ha__user-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n }\n </button>\n</div>\n\n<nz-dropdown-menu #notifyMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--notify\" role=\"dialog\" aria-label=\"Th\u00F4ng b\u00E1o\">\n <div class=\"geo-layout-ha-pop__head\">\n <div class=\"geo-layout-ha-pop__title-row\">\n <h3 class=\"geo-layout-ha-pop__title\">Th\u00F4ng b\u00E1o</h3>\n @if (unreadCount() > 0) {\n <span class=\"geo-layout-ha-pop__badge\">{{ unreadCount() }} m\u1EDBi</span>\n }\n </div>\n </div>\n\n <div class=\"geo-layout-ha-pop__list\">\n @if (notifications().length) {\n @for (item of notifications(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-notify\"\n [class.geo-layout-ha-notify--unread]=\"!item.read\"\n (click)=\"onNotificationItem(item)\"\n >\n <span class=\"geo-layout-ha-notify__icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"item.icon || 'bell'\" size=\"md\" />\n </span>\n <span class=\"geo-layout-ha-notify__body\">\n <span class=\"geo-layout-ha-notify__msg\">{{ item.message }}</span>\n <span class=\"geo-layout-ha-notify__time\">{{ item.time }}</span>\n </span>\n @if (!item.read) {\n <span class=\"geo-layout-ha-notify__dot\" aria-hidden=\"true\"></span>\n }\n </button>\n }\n } @else {\n <div class=\"geo-layout-ha-pop__empty\">\n <geo-icon type=\"bell\" size=\"xl\" />\n <p>Kh\u00F4ng c\u00F3 th\u00F4ng b\u00E1o m\u1EDBi</p>\n </div>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #subsystemMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--subsystem\" role=\"dialog\" aria-label=\"Ph\u00E2n h\u1EC7\">\n <div class=\"geo-layout-ha-pop__head\">\n <h3 class=\"geo-layout-ha-pop__title\">Ph\u00E2n h\u1EC7</h3>\n </div>\n <div class=\"geo-layout-ha-subgrid\">\n @for (item of subsystems(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-sub\"\n (click)=\"onSubsystemItem(item)\"\n >\n <span class=\"geo-layout-ha-sub__mark\">{{ item.initials }}</span>\n <span class=\"geo-layout-ha-sub__label\">{{ item.label }}</span>\n </button>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #userMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--user\" role=\"dialog\" aria-label=\"T\u00E0i kho\u1EA3n\">\n <div class=\"geo-layout-ha-pop__profile\">\n <span class=\"geo-layout-ha__avatar geo-layout-ha__avatar--lg\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n <span class=\"geo-layout-ha-pop__profile-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n </div>\n\n <div class=\"geo-layout-ha-pop__menu\">\n @for (item of primaryMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n\n @if (dangerMenuItems().length) {\n <div class=\"geo-layout-ha-pop__menu geo-layout-ha-pop__menu--footer\">\n @for (item of dangerMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item geo-layout-ha-menu-item--danger\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n }\n </div>\n</nz-dropdown-menu>\n", styles: ["@charset \"UTF-8\";.geo-layout-header-actions-host{display:inline-flex;align-items:center}.geo-layout-ha{display:inline-flex;align-items:center;gap:10px}.geo-layout-ha__icons{display:inline-flex;align-items:center;gap:4px}.geo-layout-ha__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:0;border-radius:var(--geo-radius-md);background:transparent;color:var(--geo-color-neutral-700);cursor:pointer;line-height:1;transition:background-color .15s ease,color .15s ease}.geo-layout-ha__icon-btn:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-layout-ha__icon-btn:active{transform:scale(.98)}.geo-layout-ha__icon-btn .ant-badge{color:inherit;line-height:1}.geo-layout-ha__icon-btn .ant-badge-count{min-width:16px;height:16px;padding:0 4px;border:0;box-shadow:none;background:var(--geo-color-error-default);font-size:10px;line-height:16px}.geo-layout-ha__divider{width:1px;height:28px;margin-inline:4px;background:var(--geo-color-neutral-200)}.geo-layout-ha__user{display:inline-flex;align-items:center;gap:10px;max-width:260px;min-height:44px;padding:6px 12px 6px 6px;border:0;border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-page);color:var(--geo-color-neutral-900);cursor:pointer;transition:background-color .15s ease,box-shadow .15s ease}.geo-layout-ha__user:hover,.geo-layout-ha__user--open{background:var(--geo-color-primary-soft-hover)}.geo-layout-ha__avatar{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;overflow:hidden;border-radius:var(--geo-radius-full);background:var(--geo-color-neutral-white);color:var(--geo-color-neutral-800);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-bold);letter-spacing:.02em;box-shadow:inset 0 0 0 1px var(--geo-color-neutral-200)}.geo-layout-ha__avatar img{width:100%;height:100%;object-fit:cover}.geo-layout-ha__avatar--lg{width:40px;height:40px;font-size:var(--geo-font-size-body)}.geo-layout-ha__user-text{display:flex;flex:1;flex-direction:column;align-items:flex-start;min-width:0;gap:1px;text-align:left}.geo-layout-ha__user-name{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-bold);line-height:1.25;color:var(--geo-color-neutral-900);text-overflow:ellipsis;white-space:nowrap}.geo-layout-ha__user-email{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-regular);line-height:1.25;color:var(--geo-color-neutral-500);text-overflow:ellipsis;white-space:nowrap}.geo-layout-header-actions-host--compact .geo-layout-ha__user{max-width:none;padding:4px;border-radius:var(--geo-radius-full)}.geo-layout-ha-overlay .ant-dropdown-menu{padding:0;background:transparent;box-shadow:none}.geo-layout-ha-pop{width:320px;overflow:hidden;border:1px solid var(--geo-color-neutral-200);border-radius:var(--geo-radius-xl);background:linear-gradient(180deg,var(--geo-color-neutral-white) 0%,var(--geo-color-neutral-100) 160%);box-shadow:var(--geo-shadow-lg)}.geo-layout-ha-pop--user{width:280px}.geo-layout-ha-pop--subsystem{width:300px}.geo-layout-ha-pop__head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px 10px}.geo-layout-ha-pop__title-row{display:flex;align-items:center;gap:8px}.geo-layout-ha-pop__title{margin:0;font-size:var(--geo-font-size-subtitle);font-weight:var(--geo-font-weight-bold);line-height:1.3;color:var(--geo-color-neutral-900)}.geo-layout-ha-pop__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-tiny);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-primary-default)}.geo-layout-ha-pop__list{max-height:320px;overflow-y:auto;padding:4px 8px 12px}.geo-layout-ha-pop__empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 16px;color:var(--geo-color-neutral-400);text-align:center}.geo-layout-ha-pop__empty p{margin:0;font-size:var(--geo-font-size-body-small)}.geo-layout-ha-notify{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px;border:0;border-radius:var(--geo-radius-md);background:transparent;text-align:left;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-notify:hover,.geo-layout-ha-notify--unread{background:var(--geo-color-primary-soft)}.geo-layout-ha-notify__icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--geo-radius-md);background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-layout-ha-notify__body{display:flex;flex:1;flex-direction:column;gap:4px;min-width:0}.geo-layout-ha-notify__msg{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1.4;color:var(--geo-color-neutral-800)}.geo-layout-ha-notify__time{font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-layout-ha-notify__dot{flex-shrink:0;width:8px;height:8px;margin-top:6px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-default)}.geo-layout-ha-subgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:4px 16px 16px}.geo-layout-ha-sub{display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px 4px;border:0;border-radius:var(--geo-radius-md);background:transparent;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-sub:hover{background:var(--geo-color-primary-soft)}.geo-layout-ha-sub__mark{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-bold);color:var(--geo-color-primary-default)}.geo-layout-ha-sub__label{max-width:72px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.25;color:var(--geo-color-neutral-600, var(--geo-color-neutral-500));text-align:center}.geo-layout-ha-pop__profile{display:flex;align-items:center;gap:12px;padding:16px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-pop__profile-text{display:flex;flex-direction:column;gap:2px;min-width:0}.geo-layout-ha-pop__menu{display:flex;flex-direction:column;padding:8px}.geo-layout-ha-pop__menu--footer{padding-top:0;border-top:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:0;border-radius:var(--geo-radius-md);background:transparent;font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-800);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}.geo-layout-ha-menu-item:hover{background:var(--geo-color-primary-soft);color:var(--geo-color-primary-default)}.geo-layout-ha-menu-item--danger{color:var(--geo-color-error-default)}.geo-layout-ha-menu-item--danger:hover{background:var(--geo-color-error-light);color:var(--geo-color-error-dark)}@media (prefers-reduced-motion: reduce){.geo-layout-ha__icon-btn,.geo-layout-ha__user,.geo-layout-ha-notify,.geo-layout-ha-sub,.geo-layout-ha-menu-item{transition:none}}\n"], dependencies: [{ kind: "ngmodule", type: NzBadgeModule }, { kind: "component", type: i1.NzBadgeComponent, selector: "nz-badge", inputs: ["nzShowZero", "nzShowDot", "nzStandalone", "nzDot", "nzOverflowCount", "nzColor", "nzStyle", "nzText", "nzTitle", "nzStatus", "nzCount", "nzOffset", "nzSize"], exportAs: ["nzBadge"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i2.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
62
|
+
}
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLayoutHeaderActionsComponent, decorators: [{
|
|
64
|
+
type: Component,
|
|
65
|
+
args: [{ selector: 'geo-layout-header-actions', standalone: true, imports: [NzBadgeModule, NzDropDownModule, GeoIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
66
|
+
class: 'geo-layout-header-actions-host',
|
|
67
|
+
'[class.geo-layout-header-actions-host--compact]': 'compact()',
|
|
68
|
+
}, template: "<div class=\"geo-layout-ha\">\n <div class=\"geo-layout-ha__icons\">\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"notifyMenu\"\n [nzVisible]=\"notifyOpen()\"\n (nzVisibleChange)=\"onNotifyVisible($event)\"\n aria-label=\"Th\u00F4ng b\u00E1o\"\n >\n <nz-badge [nzCount]=\"unreadCount()\" [nzOverflowCount]=\"9\" nzSize=\"small\">\n <geo-icon type=\"bell\" size=\"lg\" />\n </nz-badge>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"subsystemMenu\"\n [nzVisible]=\"subsystemOpen()\"\n (nzVisibleChange)=\"onSubsystemVisible($event)\"\n aria-label=\"Ph\u00E2n h\u1EC7\"\n >\n <geo-icon type=\"appstore\" size=\"lg\" />\n </button>\n </div>\n\n <span class=\"geo-layout-ha__divider\" aria-hidden=\"true\"></span>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__user\"\n [class.geo-layout-ha__user--open]=\"userOpen()\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"userMenu\"\n [nzVisible]=\"userOpen()\"\n (nzVisibleChange)=\"onUserVisible($event)\"\n aria-label=\"T\u00E0i kho\u1EA3n ng\u01B0\u1EDDi d\u00F9ng\"\n >\n <span class=\"geo-layout-ha__avatar\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n\n @if (!compact()) {\n <span class=\"geo-layout-ha__user-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n }\n </button>\n</div>\n\n<nz-dropdown-menu #notifyMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--notify\" role=\"dialog\" aria-label=\"Th\u00F4ng b\u00E1o\">\n <div class=\"geo-layout-ha-pop__head\">\n <div class=\"geo-layout-ha-pop__title-row\">\n <h3 class=\"geo-layout-ha-pop__title\">Th\u00F4ng b\u00E1o</h3>\n @if (unreadCount() > 0) {\n <span class=\"geo-layout-ha-pop__badge\">{{ unreadCount() }} m\u1EDBi</span>\n }\n </div>\n </div>\n\n <div class=\"geo-layout-ha-pop__list\">\n @if (notifications().length) {\n @for (item of notifications(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-notify\"\n [class.geo-layout-ha-notify--unread]=\"!item.read\"\n (click)=\"onNotificationItem(item)\"\n >\n <span class=\"geo-layout-ha-notify__icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"item.icon || 'bell'\" size=\"md\" />\n </span>\n <span class=\"geo-layout-ha-notify__body\">\n <span class=\"geo-layout-ha-notify__msg\">{{ item.message }}</span>\n <span class=\"geo-layout-ha-notify__time\">{{ item.time }}</span>\n </span>\n @if (!item.read) {\n <span class=\"geo-layout-ha-notify__dot\" aria-hidden=\"true\"></span>\n }\n </button>\n }\n } @else {\n <div class=\"geo-layout-ha-pop__empty\">\n <geo-icon type=\"bell\" size=\"xl\" />\n <p>Kh\u00F4ng c\u00F3 th\u00F4ng b\u00E1o m\u1EDBi</p>\n </div>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #subsystemMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--subsystem\" role=\"dialog\" aria-label=\"Ph\u00E2n h\u1EC7\">\n <div class=\"geo-layout-ha-pop__head\">\n <h3 class=\"geo-layout-ha-pop__title\">Ph\u00E2n h\u1EC7</h3>\n </div>\n <div class=\"geo-layout-ha-subgrid\">\n @for (item of subsystems(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-sub\"\n (click)=\"onSubsystemItem(item)\"\n >\n <span class=\"geo-layout-ha-sub__mark\">{{ item.initials }}</span>\n <span class=\"geo-layout-ha-sub__label\">{{ item.label }}</span>\n </button>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #userMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--user\" role=\"dialog\" aria-label=\"T\u00E0i kho\u1EA3n\">\n <div class=\"geo-layout-ha-pop__profile\">\n <span class=\"geo-layout-ha__avatar geo-layout-ha__avatar--lg\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n <span class=\"geo-layout-ha-pop__profile-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n </div>\n\n <div class=\"geo-layout-ha-pop__menu\">\n @for (item of primaryMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n\n @if (dangerMenuItems().length) {\n <div class=\"geo-layout-ha-pop__menu geo-layout-ha-pop__menu--footer\">\n @for (item of dangerMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item geo-layout-ha-menu-item--danger\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n }\n </div>\n</nz-dropdown-menu>\n", styles: ["@charset \"UTF-8\";.geo-layout-header-actions-host{display:inline-flex;align-items:center}.geo-layout-ha{display:inline-flex;align-items:center;gap:10px}.geo-layout-ha__icons{display:inline-flex;align-items:center;gap:4px}.geo-layout-ha__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:0;border-radius:var(--geo-radius-md);background:transparent;color:var(--geo-color-neutral-700);cursor:pointer;line-height:1;transition:background-color .15s ease,color .15s ease}.geo-layout-ha__icon-btn:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-layout-ha__icon-btn:active{transform:scale(.98)}.geo-layout-ha__icon-btn .ant-badge{color:inherit;line-height:1}.geo-layout-ha__icon-btn .ant-badge-count{min-width:16px;height:16px;padding:0 4px;border:0;box-shadow:none;background:var(--geo-color-error-default);font-size:10px;line-height:16px}.geo-layout-ha__divider{width:1px;height:28px;margin-inline:4px;background:var(--geo-color-neutral-200)}.geo-layout-ha__user{display:inline-flex;align-items:center;gap:10px;max-width:260px;min-height:44px;padding:6px 12px 6px 6px;border:0;border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-page);color:var(--geo-color-neutral-900);cursor:pointer;transition:background-color .15s ease,box-shadow .15s ease}.geo-layout-ha__user:hover,.geo-layout-ha__user--open{background:var(--geo-color-primary-soft-hover)}.geo-layout-ha__avatar{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;overflow:hidden;border-radius:var(--geo-radius-full);background:var(--geo-color-neutral-white);color:var(--geo-color-neutral-800);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-bold);letter-spacing:.02em;box-shadow:inset 0 0 0 1px var(--geo-color-neutral-200)}.geo-layout-ha__avatar img{width:100%;height:100%;object-fit:cover}.geo-layout-ha__avatar--lg{width:40px;height:40px;font-size:var(--geo-font-size-body)}.geo-layout-ha__user-text{display:flex;flex:1;flex-direction:column;align-items:flex-start;min-width:0;gap:1px;text-align:left}.geo-layout-ha__user-name{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-bold);line-height:1.25;color:var(--geo-color-neutral-900);text-overflow:ellipsis;white-space:nowrap}.geo-layout-ha__user-email{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-regular);line-height:1.25;color:var(--geo-color-neutral-500);text-overflow:ellipsis;white-space:nowrap}.geo-layout-header-actions-host--compact .geo-layout-ha__user{max-width:none;padding:4px;border-radius:var(--geo-radius-full)}.geo-layout-ha-overlay .ant-dropdown-menu{padding:0;background:transparent;box-shadow:none}.geo-layout-ha-pop{width:320px;overflow:hidden;border:1px solid var(--geo-color-neutral-200);border-radius:var(--geo-radius-xl);background:linear-gradient(180deg,var(--geo-color-neutral-white) 0%,var(--geo-color-neutral-100) 160%);box-shadow:var(--geo-shadow-lg)}.geo-layout-ha-pop--user{width:280px}.geo-layout-ha-pop--subsystem{width:300px}.geo-layout-ha-pop__head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px 10px}.geo-layout-ha-pop__title-row{display:flex;align-items:center;gap:8px}.geo-layout-ha-pop__title{margin:0;font-size:var(--geo-font-size-subtitle);font-weight:var(--geo-font-weight-bold);line-height:1.3;color:var(--geo-color-neutral-900)}.geo-layout-ha-pop__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-tiny);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-primary-default)}.geo-layout-ha-pop__list{max-height:320px;overflow-y:auto;padding:4px 8px 12px}.geo-layout-ha-pop__empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 16px;color:var(--geo-color-neutral-400);text-align:center}.geo-layout-ha-pop__empty p{margin:0;font-size:var(--geo-font-size-body-small)}.geo-layout-ha-notify{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px;border:0;border-radius:var(--geo-radius-md);background:transparent;text-align:left;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-notify:hover,.geo-layout-ha-notify--unread{background:var(--geo-color-primary-soft)}.geo-layout-ha-notify__icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--geo-radius-md);background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-layout-ha-notify__body{display:flex;flex:1;flex-direction:column;gap:4px;min-width:0}.geo-layout-ha-notify__msg{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1.4;color:var(--geo-color-neutral-800)}.geo-layout-ha-notify__time{font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-layout-ha-notify__dot{flex-shrink:0;width:8px;height:8px;margin-top:6px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-default)}.geo-layout-ha-subgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:4px 16px 16px}.geo-layout-ha-sub{display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px 4px;border:0;border-radius:var(--geo-radius-md);background:transparent;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-sub:hover{background:var(--geo-color-primary-soft)}.geo-layout-ha-sub__mark{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-bold);color:var(--geo-color-primary-default)}.geo-layout-ha-sub__label{max-width:72px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.25;color:var(--geo-color-neutral-600, var(--geo-color-neutral-500));text-align:center}.geo-layout-ha-pop__profile{display:flex;align-items:center;gap:12px;padding:16px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-pop__profile-text{display:flex;flex-direction:column;gap:2px;min-width:0}.geo-layout-ha-pop__menu{display:flex;flex-direction:column;padding:8px}.geo-layout-ha-pop__menu--footer{padding-top:0;border-top:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:0;border-radius:var(--geo-radius-md);background:transparent;font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-800);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}.geo-layout-ha-menu-item:hover{background:var(--geo-color-primary-soft);color:var(--geo-color-primary-default)}.geo-layout-ha-menu-item--danger{color:var(--geo-color-error-default)}.geo-layout-ha-menu-item--danger:hover{background:var(--geo-color-error-light);color:var(--geo-color-error-dark)}@media (prefers-reduced-motion: reduce){.geo-layout-ha__icon-btn,.geo-layout-ha__user,.geo-layout-ha-notify,.geo-layout-ha-sub,.geo-layout-ha-menu-item{transition:none}}\n"] }]
|
|
69
|
+
}] });
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLWxheW91dC1oZWFkZXItYWN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tbGF5b3V0L2hlYWRlci1hY3Rpb25zL2dlby1sYXlvdXQtaGVhZGVyLWFjdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLWxheW91dC9oZWFkZXItYWN0aW9ucy9nZW8tbGF5b3V0LWhlYWRlci1hY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDaEMsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2Qiw0QkFBNEIsR0FLN0IsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUU3Qjs7R0FFRztBQWNILE1BQU0sT0FBTywrQkFBK0I7SUFDakMsSUFBSSxHQUFHLEtBQUssQ0FBb0IsdUJBQXVCLENBQUMsQ0FBQztJQUN6RCxhQUFhLEdBQUcsS0FBSyxDQUM1QixnQ0FBZ0MsQ0FDakMsQ0FBQztJQUNPLFVBQVUsR0FBRyxLQUFLLENBQ3pCLDZCQUE2QixDQUM5QixDQUFDO0lBQ08sYUFBYSxHQUFHLEtBQUssQ0FDNUIsNEJBQTRCLENBQzdCLENBQUM7SUFDRix1Q0FBdUM7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2QixpQkFBaUIsR0FBRyxNQUFNLEVBQTZCLENBQUM7SUFDeEQsY0FBYyxHQUFHLE1BQU0sRUFBMEIsQ0FBQztJQUNsRCxhQUFhLEdBQUcsTUFBTSxFQUF5QixDQUFDO0lBQ2hELE1BQU0sR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUV4QixVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6QixXQUFXLEdBQUcsUUFBUSxDQUM3QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQy9ELENBQUM7SUFFTyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBRU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUN4QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDcEQsQ0FBQztJQUVPLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDbkQsQ0FBQztJQUVGLGVBQWUsQ0FBQyxPQUFnQjtRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFnQjtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBK0I7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQTRCO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBMkI7UUFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQzt3R0F2RVUsK0JBQStCOzRGQUEvQiwrQkFBK0IsOGdDQ3ZDNUMsc21NQWtMQSx1d09EckpZLGFBQWEsc1NBQUUsZ0JBQWdCLDJjQUFFLGdCQUFnQjs7NEZBVWhELCtCQUErQjtrQkFiM0MsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLG1CQUczQyx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLEtBQUssRUFBRSxnQ0FBZ0M7d0JBQ3ZDLGlEQUFpRCxFQUFFLFdBQVc7cUJBQy9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpCYWRnZU1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvYmFkZ2UnO1xuaW1wb3J0IHsgTnpEcm9wRG93bk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZHJvcGRvd24nO1xuaW1wb3J0IHsgR2VvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2dlby1pY29uL2dlby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBHRU9fTEFZT1VUX0RFRkFVTFRfTk9USUZJQ0FUSU9OUyxcbiAgR0VPX0xBWU9VVF9ERUZBVUxUX1NVQlNZU1RFTVMsXG4gIEdFT19MQVlPVVRfREVGQVVMVF9VU0VSLFxuICBHRU9fTEFZT1VUX0RFRkFVTFRfVVNFUl9NRU5VLFxuICBHZW9MYXlvdXROb3RpZmljYXRpb25JdGVtLFxuICBHZW9MYXlvdXRTdWJzeXN0ZW1JdGVtLFxuICBHZW9MYXlvdXRVc2VySW5mbyxcbiAgR2VvTGF5b3V0VXNlck1lbnVJdGVtLFxufSBmcm9tICcuLi9nZW8tbGF5b3V0LnR5cGVzJztcblxuLyoqXG4gKiBIZWFkZXIgYWN0aW9ucyBt4bq3YyDEkeG7i25oOiB0aMO0bmcgYsOhbywgcGjDom4gaOG7hywgdXNlciBjaGlwICsgcG9wb3ZlcnMgKG1vY2svZGF0YS1kcml2ZW4pLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnZW8tbGF5b3V0LWhlYWRlci1hY3Rpb25zJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW056QmFkZ2VNb2R1bGUsIE56RHJvcERvd25Nb2R1bGUsIEdlb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VvLWxheW91dC1oZWFkZXItYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9nZW8tbGF5b3V0LWhlYWRlci1hY3Rpb25zLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2dlby1sYXlvdXQtaGVhZGVyLWFjdGlvbnMtaG9zdCcsXG4gICAgJ1tjbGFzcy5nZW8tbGF5b3V0LWhlYWRlci1hY3Rpb25zLWhvc3QtLWNvbXBhY3RdJzogJ2NvbXBhY3QoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb0xheW91dEhlYWRlckFjdGlvbnNDb21wb25lbnQge1xuICByZWFkb25seSB1c2VyID0gaW5wdXQ8R2VvTGF5b3V0VXNlckluZm8+KEdFT19MQVlPVVRfREVGQVVMVF9VU0VSKTtcbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9ucyA9IGlucHV0PEdlb0xheW91dE5vdGlmaWNhdGlvbkl0ZW1bXT4oXG4gICAgR0VPX0xBWU9VVF9ERUZBVUxUX05PVElGSUNBVElPTlNcbiAgKTtcbiAgcmVhZG9ubHkgc3Vic3lzdGVtcyA9IGlucHV0PEdlb0xheW91dFN1YnN5c3RlbUl0ZW1bXT4oXG4gICAgR0VPX0xBWU9VVF9ERUZBVUxUX1NVQlNZU1RFTVNcbiAgKTtcbiAgcmVhZG9ubHkgdXNlck1lbnVJdGVtcyA9IGlucHV0PEdlb0xheW91dFVzZXJNZW51SXRlbVtdPihcbiAgICBHRU9fTEFZT1VUX0RFRkFVTFRfVVNFUl9NRU5VXG4gICk7XG4gIC8qKiDhuqhuIHTDqm4vZW1haWwgdHLDqm4gY2hpcCAobW9iaWxlKS4gKi9cbiAgcmVhZG9ubHkgY29tcGFjdCA9IGlucHV0KGZhbHNlKTtcblxuICByZWFkb25seSBub3RpZmljYXRpb25DbGljayA9IG91dHB1dDxHZW9MYXlvdXROb3RpZmljYXRpb25JdGVtPigpO1xuICByZWFkb25seSBzdWJzeXN0ZW1DbGljayA9IG91dHB1dDxHZW9MYXlvdXRTdWJzeXN0ZW1JdGVtPigpO1xuICByZWFkb25seSB1c2VyTWVudUNsaWNrID0gb3V0cHV0PEdlb0xheW91dFVzZXJNZW51SXRlbT4oKTtcbiAgcmVhZG9ubHkgbG9nb3V0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgbm90aWZ5T3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHN1YnN5c3RlbU9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB1c2VyT3BlbiA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgdW5yZWFkQ291bnQgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLm5vdGlmaWNhdGlvbnMoKS5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLnJlYWQpLmxlbmd0aFxuICApO1xuXG4gIHJlYWRvbmx5IGluaXRpYWxzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnVzZXIoKS5uYW1lPy50cmltKCkgfHwgJz8nO1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBgJHtwYXJ0c1swXVswXX0ke3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdWzBdfWAudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWUuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcHJpbWFyeU1lbnVJdGVtcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy51c2VyTWVudUl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5kYW5nZXIpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGFuZ2VyTWVudUl0ZW1zID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLnVzZXJNZW51SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZGFuZ2VyKVxuICApO1xuXG4gIG9uTm90aWZ5VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZnlPcGVuLnNldCh2aXNpYmxlKTtcbiAgfVxuXG4gIG9uU3Vic3lzdGVtVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzeXN0ZW1PcGVuLnNldCh2aXNpYmxlKTtcbiAgfVxuXG4gIG9uVXNlclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudXNlck9wZW4uc2V0KHZpc2libGUpO1xuICB9XG5cbiAgb25Ob3RpZmljYXRpb25JdGVtKGl0ZW06IEdlb0xheW91dE5vdGlmaWNhdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNsaWNrLmVtaXQoaXRlbSk7XG4gIH1cblxuICBvblN1YnN5c3RlbUl0ZW0oaXRlbTogR2VvTGF5b3V0U3Vic3lzdGVtSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuc3Vic3lzdGVtT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc3Vic3lzdGVtQ2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIG9uVXNlck1lbnVJdGVtKGl0ZW06IEdlb0xheW91dFVzZXJNZW51SXRlbSk6IHZvaWQge1xuICAgIHRoaXMudXNlck9wZW4uc2V0KGZhbHNlKTtcbiAgICBpZiAoaXRlbS5rZXkgPT09ICdsb2dvdXQnIHx8IGl0ZW0uZGFuZ2VyKSB7XG4gICAgICB0aGlzLmxvZ291dC5lbWl0KCk7XG4gICAgfVxuICAgIHRoaXMudXNlck1lbnVDbGljay5lbWl0KGl0ZW0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYVwiPlxuICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYV9faWNvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1oYV9faWNvbi1idG5cIlxuICAgICAgbnotZHJvcGRvd25cbiAgICAgIG56VHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgIG56UGxhY2VtZW50PVwiYm90dG9tUmlnaHRcIlxuICAgICAgbnpPdmVybGF5Q2xhc3NOYW1lPVwiZ2VvLWxheW91dC1oYS1vdmVybGF5XCJcbiAgICAgIFtuekRyb3Bkb3duTWVudV09XCJub3RpZnlNZW51XCJcbiAgICAgIFtuelZpc2libGVdPVwibm90aWZ5T3BlbigpXCJcbiAgICAgIChuelZpc2libGVDaGFuZ2UpPVwib25Ob3RpZnlWaXNpYmxlKCRldmVudClcIlxuICAgICAgYXJpYS1sYWJlbD1cIlRow7RuZyBiw6FvXCJcbiAgICA+XG4gICAgICA8bnotYmFkZ2UgW256Q291bnRdPVwidW5yZWFkQ291bnQoKVwiIFtuek92ZXJmbG93Q291bnRdPVwiOVwiIG56U2l6ZT1cInNtYWxsXCI+XG4gICAgICAgIDxnZW8taWNvbiB0eXBlPVwiYmVsbFwiIHNpemU9XCJsZ1wiIC8+XG4gICAgICA8L256LWJhZGdlPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImdlby1sYXlvdXQtaGFfX2ljb24tYnRuXCJcbiAgICAgIG56LWRyb3Bkb3duXG4gICAgICBuelRyaWdnZXI9XCJjbGlja1wiXG4gICAgICBuelBsYWNlbWVudD1cImJvdHRvbVJpZ2h0XCJcbiAgICAgIG56T3ZlcmxheUNsYXNzTmFtZT1cImdlby1sYXlvdXQtaGEtb3ZlcmxheVwiXG4gICAgICBbbnpEcm9wZG93bk1lbnVdPVwic3Vic3lzdGVtTWVudVwiXG4gICAgICBbbnpWaXNpYmxlXT1cInN1YnN5c3RlbU9wZW4oKVwiXG4gICAgICAobnpWaXNpYmxlQ2hhbmdlKT1cIm9uU3Vic3lzdGVtVmlzaWJsZSgkZXZlbnQpXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJQaMOibiBo4buHXCJcbiAgICA+XG4gICAgICA8Z2VvLWljb24gdHlwZT1cImFwcHN0b3JlXCIgc2l6ZT1cImxnXCIgLz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gY2xhc3M9XCJnZW8tbGF5b3V0LWhhX19kaXZpZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuXG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImdlby1sYXlvdXQtaGFfX3VzZXJcIlxuICAgIFtjbGFzcy5nZW8tbGF5b3V0LWhhX191c2VyLS1vcGVuXT1cInVzZXJPcGVuKClcIlxuICAgIG56LWRyb3Bkb3duXG4gICAgbnpUcmlnZ2VyPVwiY2xpY2tcIlxuICAgIG56UGxhY2VtZW50PVwiYm90dG9tUmlnaHRcIlxuICAgIG56T3ZlcmxheUNsYXNzTmFtZT1cImdlby1sYXlvdXQtaGEtb3ZlcmxheVwiXG4gICAgW256RHJvcGRvd25NZW51XT1cInVzZXJNZW51XCJcbiAgICBbbnpWaXNpYmxlXT1cInVzZXJPcGVuKClcIlxuICAgIChuelZpc2libGVDaGFuZ2UpPVwib25Vc2VyVmlzaWJsZSgkZXZlbnQpXCJcbiAgICBhcmlhLWxhYmVsPVwiVMOgaSBraG/huqNuIG5nxrDhu51pIGTDuW5nXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1oYV9fYXZhdGFyXCI+XG4gICAgICBAaWYgKHVzZXIoKS5hdmF0YXJVcmwpIHtcbiAgICAgICAgPGltZyBbc3JjXT1cInVzZXIoKS5hdmF0YXJVcmxcIiBhbHQ9XCJcIiAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzcGFuPnt7IGluaXRpYWxzKCkgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghY29tcGFjdCgpKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGFfX3VzZXItdGV4dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGFfX3VzZXItbmFtZVwiPnt7IHVzZXIoKS5uYW1lIH19PC9zcGFuPlxuICAgICAgICBAaWYgKHVzZXIoKS5lbWFpbCkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1oYV9fdXNlci1lbWFpbFwiPnt7IHVzZXIoKS5lbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9zcGFuPlxuICAgIH1cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG56LWRyb3Bkb3duLW1lbnUgI25vdGlmeU1lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYS1wb3AgZ2VvLWxheW91dC1oYS1wb3AtLW5vdGlmeVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsPVwiVGjDtG5nIGLDoW9cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYS1wb3BfX2hlYWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LWhhLXBvcF9fdGl0bGUtcm93XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImdlby1sYXlvdXQtaGEtcG9wX190aXRsZVwiPlRow7RuZyBiw6FvPC9oMz5cbiAgICAgICAgQGlmICh1bnJlYWRDb3VudCgpID4gMCkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1oYS1wb3BfX2JhZGdlXCI+e3sgdW5yZWFkQ291bnQoKSB9fSBt4bubaTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYS1wb3BfX2xpc3RcIj5cbiAgICAgIEBpZiAobm90aWZpY2F0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICBAZm9yIChpdGVtIG9mIG5vdGlmaWNhdGlvbnMoKTsgdHJhY2sgaXRlbS5pZCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJnZW8tbGF5b3V0LWhhLW5vdGlmeVwiXG4gICAgICAgICAgICBbY2xhc3MuZ2VvLWxheW91dC1oYS1ub3RpZnktLXVucmVhZF09XCIhaXRlbS5yZWFkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5vdGlmaWNhdGlvbkl0ZW0oaXRlbSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1oYS1ub3RpZnlfX2ljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPGdlby1pY29uIFt0eXBlXT1cIml0ZW0uaWNvbiB8fCAnYmVsbCdcIiBzaXplPVwibWRcIiAvPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tbGF5b3V0LWhhLW5vdGlmeV9fYm9keVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGEtbm90aWZ5X19tc2dcIj57eyBpdGVtLm1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1oYS1ub3RpZnlfX3RpbWVcIj57eyBpdGVtLnRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKCFpdGVtLnJlYWQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tbGF5b3V0LWhhLW5vdGlmeV9fZG90XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImdlby1sYXlvdXQtaGEtcG9wX19lbXB0eVwiPlxuICAgICAgICAgIDxnZW8taWNvbiB0eXBlPVwiYmVsbFwiIHNpemU9XCJ4bFwiIC8+XG4gICAgICAgICAgPHA+S2jDtG5nIGPDsyB0aMO0bmcgYsOhbyBt4bubaTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uei1kcm9wZG93bi1tZW51PlxuXG48bnotZHJvcGRvd24tbWVudSAjc3Vic3lzdGVtTWVudT1cIm56RHJvcGRvd25NZW51XCI+XG4gIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LWhhLXBvcCBnZW8tbGF5b3V0LWhhLXBvcC0tc3Vic3lzdGVtXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWw9XCJQaMOibiBo4buHXCI+XG4gICAgPGRpdiBjbGFzcz1cImdlby1sYXlvdXQtaGEtcG9wX19oZWFkXCI+XG4gICAgICA8aDMgY2xhc3M9XCJnZW8tbGF5b3V0LWhhLXBvcF9fdGl0bGVcIj5QaMOibiBo4buHPC9oMz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYS1zdWJncmlkXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIHN1YnN5c3RlbXMoKTsgdHJhY2sgaXRlbS5pZCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJnZW8tbGF5b3V0LWhhLXN1YlwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3Vic3lzdGVtSXRlbShpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGEtc3ViX19tYXJrXCI+e3sgaXRlbS5pbml0aWFscyB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGEtc3ViX19sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbnotZHJvcGRvd24tbWVudT5cblxuPG56LWRyb3Bkb3duLW1lbnUgI3VzZXJNZW51PVwibnpEcm9wZG93bk1lbnVcIj5cbiAgPGRpdiBjbGFzcz1cImdlby1sYXlvdXQtaGEtcG9wIGdlby1sYXlvdXQtaGEtcG9wLS11c2VyXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWw9XCJUw6BpIGtob+G6o25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1oYS1wb3BfX3Byb2ZpbGVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1oYV9fYXZhdGFyIGdlby1sYXlvdXQtaGFfX2F2YXRhci0tbGdcIj5cbiAgICAgICAgQGlmICh1c2VyKCkuYXZhdGFyVXJsKSB7XG4gICAgICAgICAgPGltZyBbc3JjXT1cInVzZXIoKS5hdmF0YXJVcmxcIiBhbHQ9XCJcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8c3Bhbj57eyBpbml0aWFscygpIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGEtcG9wX19wcm9maWxlLXRleHRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tbGF5b3V0LWhhX191c2VyLW5hbWVcIj57eyB1c2VyKCkubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgQGlmICh1c2VyKCkuZW1haWwpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtaGFfX3VzZXItZW1haWxcIj57eyB1c2VyKCkuZW1haWwgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LWhhLXBvcF9fbWVudVwiPlxuICAgICAgQGZvciAoaXRlbSBvZiBwcmltYXJ5TWVudUl0ZW1zKCk7IHRyYWNrIGl0ZW0ua2V5KSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImdlby1sYXlvdXQtaGEtbWVudS1pdGVtXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Vc2VyTWVudUl0ZW0oaXRlbSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGdlby1pY29uIFt0eXBlXT1cIml0ZW0uaWNvblwiIHNpemU9XCJtZFwiIC8+XG4gICAgICAgICAgPHNwYW4+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGRhbmdlck1lbnVJdGVtcygpLmxlbmd0aCkge1xuICAgICAgPGRpdiBjbGFzcz1cImdlby1sYXlvdXQtaGEtcG9wX19tZW51IGdlby1sYXlvdXQtaGEtcG9wX19tZW51LS1mb290ZXJcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBkYW5nZXJNZW51SXRlbXMoKTsgdHJhY2sgaXRlbS5rZXkpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1oYS1tZW51LWl0ZW0gZ2VvLWxheW91dC1oYS1tZW51LWl0ZW0tLWRhbmdlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Vc2VyTWVudUl0ZW0oaXRlbSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxnZW8taWNvbiBbdHlwZV09XCJpdGVtLmljb25cIiBzaXplPVwibWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvbnotZHJvcGRvd24tbWVudT5cbiJdfQ==
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input, model, output, signal, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import { GeoIconComponent } from '../../geo-icon/geo-icon.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Sidebar shell: brand + recursive menu.
|
|
7
|
+
* Collapsed (desktop): hover item mở popover bên phải (tên leaf / submenu group).
|
|
8
|
+
*/
|
|
9
|
+
export class GeoLayoutSidebarComponent {
|
|
10
|
+
menuItems = input([]);
|
|
11
|
+
brandTitle = input('iLIS');
|
|
12
|
+
logoSrc = input('');
|
|
13
|
+
logoAlt = input('Logo');
|
|
14
|
+
sidebarBackgroundSrc = input('');
|
|
15
|
+
selectedKey = model(null);
|
|
16
|
+
collapsed = input(false);
|
|
17
|
+
isMobile = input(false);
|
|
18
|
+
mobileOpen = input(false);
|
|
19
|
+
width = input(280);
|
|
20
|
+
collapsedWidth = input(80);
|
|
21
|
+
menuSelect = output();
|
|
22
|
+
openKeys = signal(new Set());
|
|
23
|
+
/** Desktop icon-rail: hiện popover khi hover. */
|
|
24
|
+
flyoutEnabled = computed(() => this.collapsed() && !this.isMobile());
|
|
25
|
+
showLabels = computed(() => !this.collapsed() || this.isMobile());
|
|
26
|
+
widthCss = computed(() => {
|
|
27
|
+
if (this.isMobile()) {
|
|
28
|
+
return this.toCssSize(this.width());
|
|
29
|
+
}
|
|
30
|
+
return this.collapsed()
|
|
31
|
+
? this.toCssSize(this.collapsedWidth())
|
|
32
|
+
: this.toCssSize(this.width());
|
|
33
|
+
});
|
|
34
|
+
isOpen(key) {
|
|
35
|
+
return this.openKeys().has(key);
|
|
36
|
+
}
|
|
37
|
+
isSelected(key) {
|
|
38
|
+
return this.selectedKey() === key;
|
|
39
|
+
}
|
|
40
|
+
hasSelectedDescendant(item) {
|
|
41
|
+
const selected = this.selectedKey();
|
|
42
|
+
if (!selected || !item.children?.length) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return item.children.some((child) => child.key === selected || this.hasSelectedDescendant(child));
|
|
46
|
+
}
|
|
47
|
+
toggleSubmenu(key) {
|
|
48
|
+
this.openKeys.update((prev) => {
|
|
49
|
+
const next = new Set(prev);
|
|
50
|
+
if (next.has(key)) {
|
|
51
|
+
next.delete(key);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
next.add(key);
|
|
55
|
+
}
|
|
56
|
+
return next;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
onMenuItemClick(item) {
|
|
60
|
+
if (item.children?.length) {
|
|
61
|
+
if (this.flyoutEnabled()) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.toggleSubmenu(item.key);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.selectLeaf(item);
|
|
68
|
+
}
|
|
69
|
+
selectLeaf(item) {
|
|
70
|
+
this.selectedKey.set(item.key);
|
|
71
|
+
this.menuSelect.emit(item);
|
|
72
|
+
}
|
|
73
|
+
toCssSize(value) {
|
|
74
|
+
return typeof value === 'number' ? `${value}px` : value;
|
|
75
|
+
}
|
|
76
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLayoutSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
77
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoLayoutSidebarComponent, isStandalone: true, selector: "geo-layout-sidebar", inputs: { menuItems: { classPropertyName: "menuItems", publicName: "menuItems", isSignal: true, isRequired: false, transformFunction: null }, brandTitle: { classPropertyName: "brandTitle", publicName: "brandTitle", isSignal: true, isRequired: false, transformFunction: null }, logoSrc: { classPropertyName: "logoSrc", publicName: "logoSrc", isSignal: true, isRequired: false, transformFunction: null }, logoAlt: { classPropertyName: "logoAlt", publicName: "logoAlt", isSignal: true, isRequired: false, transformFunction: null }, sidebarBackgroundSrc: { classPropertyName: "sidebarBackgroundSrc", publicName: "sidebarBackgroundSrc", isSignal: true, isRequired: false, transformFunction: null }, selectedKey: { classPropertyName: "selectedKey", publicName: "selectedKey", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, isMobile: { classPropertyName: "isMobile", publicName: "isMobile", isSignal: true, isRequired: false, transformFunction: null }, mobileOpen: { classPropertyName: "mobileOpen", publicName: "mobileOpen", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, collapsedWidth: { classPropertyName: "collapsedWidth", publicName: "collapsedWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedKey: "selectedKeyChange", menuSelect: "menuSelect" }, host: { properties: { "class.geo-layout-sidebar-host--collapsed": "collapsed()", "class.geo-layout-sidebar-host--mobile": "isMobile()", "class.geo-layout-sidebar-host--mobile-open": "isMobile() && mobileOpen()", "style.width": "widthCss()", "attr.aria-hidden": "isMobile() && !mobileOpen() ? \"true\" : null" }, classAttribute: "geo-layout-sidebar-host" }, ngImport: i0, template: "<aside\n class=\"geo-layout-sidebar\"\n [class.geo-layout-sidebar--collapsed]=\"collapsed()\"\n [class.geo-layout-sidebar--mobile]=\"isMobile()\"\n [class.geo-layout-sidebar--mobile-open]=\"isMobile() && mobileOpen()\"\n>\n @if (sidebarBackgroundSrc()) {\n <div\n class=\"geo-layout-sidebar__bg\"\n [style.background-image]=\"'url(' + sidebarBackgroundSrc() + ')'\"\n aria-hidden=\"true\"\n ></div>\n } @else {\n <div class=\"geo-layout-sidebar__bg geo-layout-sidebar__bg--tint\" aria-hidden=\"true\"></div>\n }\n\n <div class=\"geo-layout-sidebar__brand\">\n @if (logoSrc()) {\n <img class=\"geo-layout-sidebar__logo\" [src]=\"logoSrc()\" [alt]=\"logoAlt()\" />\n } @else {\n <span class=\"geo-layout-sidebar__logo-fallback\" aria-hidden=\"true\">TN</span>\n }\n @if (showLabels()) {\n <span class=\"geo-layout-sidebar__brand-title\">{{ brandTitle() }}</span>\n }\n </div>\n\n <nav class=\"geo-layout-sidebar__nav\" aria-label=\"Menu ch\u00EDnh\">\n <ul class=\"geo-layout-sidebar__menu\">\n @for (item of menuItems(); track item.key) {\n <ng-container\n [ngTemplateOutlet]=\"menuNode\"\n [ngTemplateOutletContext]=\"{ $implicit: item, depth: 0 }\"\n />\n }\n </ul>\n </nav>\n</aside>\n\n<ng-template #menuNode let-item let-depth=\"depth\">\n @if (item.children?.length) {\n <li\n class=\"geo-layout-sidebar__menu-group\"\n [class.geo-layout-sidebar__menu-group--open]=\"isOpen(item.key) || hasSelectedDescendant(item)\"\n [class.geo-layout-sidebar__menu-group--active]=\"hasSelectedDescendant(item)\"\n [class.geo-layout-sidebar__menu-group--flyout]=\"flyoutEnabled() && depth === 0\"\n >\n <button\n type=\"button\"\n class=\"geo-layout-sidebar__menu-btn geo-layout-sidebar__menu-btn--parent\"\n [class.geo-layout-sidebar__menu-btn--active]=\"hasSelectedDescendant(item)\"\n [attr.aria-haspopup]=\"flyoutEnabled() && depth === 0 ? 'menu' : null\"\n (click)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <geo-icon\n class=\"geo-layout-sidebar__menu-icon\"\n [type]=\"item.icon\"\n size=\"md\"\n />\n }\n @if (showLabels()) {\n <span class=\"geo-layout-sidebar__menu-label\">{{ item.title }}</span>\n <geo-icon\n class=\"geo-layout-sidebar__menu-chevron\"\n type=\"down\"\n size=\"xs\"\n />\n }\n </button>\n\n @if (flyoutEnabled() && depth === 0) {\n <div\n class=\"geo-layout-sidebar-flyout geo-layout-sidebar-flyout--group\"\n role=\"menu\"\n [attr.aria-label]=\"item.title\"\n >\n <div class=\"geo-layout-sidebar-flyout__panel\">\n <div class=\"geo-layout-sidebar-flyout__title\">{{ item.title }}</div>\n <ul class=\"geo-layout-sidebar-flyout__list\">\n @for (child of item.children; track child.key) {\n @if (child.children?.length) {\n <li class=\"geo-layout-sidebar-flyout__section\">\n <div class=\"geo-layout-sidebar-flyout__section-title\">\n @if (child.icon) {\n <geo-icon [type]=\"child.icon\" size=\"sm\" />\n }\n {{ child.title }}\n </div>\n <ul class=\"geo-layout-sidebar-flyout__list\">\n @for (grand of child.children; track grand.key) {\n <li>\n <button\n type=\"button\"\n class=\"geo-layout-sidebar-flyout__item\"\n [class.geo-layout-sidebar-flyout__item--active]=\"isSelected(grand.key)\"\n role=\"menuitem\"\n (click)=\"selectLeaf(grand)\"\n >\n {{ grand.title }}\n </button>\n </li>\n }\n </ul>\n </li>\n } @else {\n <li>\n <button\n type=\"button\"\n class=\"geo-layout-sidebar-flyout__item\"\n [class.geo-layout-sidebar-flyout__item--active]=\"isSelected(child.key)\"\n role=\"menuitem\"\n (click)=\"selectLeaf(child)\"\n >\n @if (child.icon) {\n <geo-icon [type]=\"child.icon\" size=\"sm\" />\n }\n <span>{{ child.title }}</span>\n </button>\n </li>\n }\n }\n </ul>\n </div>\n </div>\n }\n\n @if (showLabels() && (isOpen(item.key) || hasSelectedDescendant(item))) {\n <ul class=\"geo-layout-sidebar__submenu\">\n @for (child of item.children; track child.key) {\n <ng-container\n [ngTemplateOutlet]=\"menuNode\"\n [ngTemplateOutletContext]=\"{ $implicit: child, depth: depth + 1 }\"\n />\n }\n </ul>\n }\n </li>\n } @else {\n <li\n class=\"geo-layout-sidebar__menu-item\"\n [class.geo-layout-sidebar__menu-item--flyout]=\"flyoutEnabled() && depth === 0\"\n >\n <button\n type=\"button\"\n class=\"geo-layout-sidebar__menu-btn\"\n [class.geo-layout-sidebar__menu-btn--active]=\"isSelected(item.key)\"\n [class.geo-layout-sidebar__menu-btn--leaf]=\"!item.icon && depth > 0\"\n [attr.aria-haspopup]=\"flyoutEnabled() && depth === 0 ? 'menu' : null\"\n (click)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <geo-icon\n class=\"geo-layout-sidebar__menu-icon\"\n [type]=\"item.icon\"\n size=\"md\"\n />\n }\n @if (showLabels()) {\n <span class=\"geo-layout-sidebar__menu-label\">{{ item.title }}</span>\n }\n </button>\n\n @if (flyoutEnabled() && depth === 0) {\n <div\n class=\"geo-layout-sidebar-flyout geo-layout-sidebar-flyout--leaf\"\n role=\"menu\"\n [attr.aria-label]=\"item.title\"\n >\n <div class=\"geo-layout-sidebar-flyout__panel\">\n <button\n type=\"button\"\n class=\"geo-layout-sidebar-flyout__item\"\n [class.geo-layout-sidebar-flyout__item--active]=\"isSelected(item.key)\"\n role=\"menuitem\"\n (click)=\"selectLeaf(item)\"\n >\n @if (item.icon) {\n <geo-icon [type]=\"item.icon\" size=\"sm\" />\n }\n <span>{{ item.title }}</span>\n </button>\n </div>\n </div>\n }\n </li>\n }\n</ng-template>\n", styles: ["@charset \"UTF-8\";.geo-layout-sidebar-host{display:block;flex-shrink:0;height:100%;max-height:100dvh;transition:width .2s ease}.geo-layout-sidebar-host--collapsed{overflow:visible;z-index:20}.geo-layout-sidebar{position:relative;z-index:2;display:flex;flex-direction:column;height:100%;max-height:100dvh;overflow:hidden;background:var(--geo-color-surface-elevated);color:var(--geo-color-neutral-700);border-right:1px solid var(--geo-color-neutral-200);transition:transform .2s ease,box-shadow .2s ease}.geo-layout-sidebar-host--collapsed .geo-layout-sidebar{overflow:visible}.geo-layout-sidebar__bg{position:absolute;inset:0;z-index:0;pointer-events:none;background-size:90% auto;background-repeat:no-repeat;background-position:center bottom;opacity:.06}.geo-layout-sidebar__bg--tint{background-image:none;background:linear-gradient(180deg,var(--geo-color-primary-soft) 0%,transparent 42%);opacity:1}.geo-layout-sidebar__brand{position:relative;z-index:1;display:flex;flex-shrink:0;align-items:center;justify-content:flex-start;gap:12px;height:64px;padding:0 20px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-layout-sidebar__logo{width:36px;height:36px;object-fit:contain}.geo-layout-sidebar__logo-fallback{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:var(--geo-radius);background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-bold);letter-spacing:.04em}.geo-layout-sidebar__brand-title{font-size:22px;font-weight:var(--geo-font-weight-bold);line-height:1;letter-spacing:-.02em;color:var(--geo-color-primary-default)}.geo-layout-sidebar__nav{position:relative;z-index:1;flex:1;min-height:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:12px 12px 24px}.geo-layout-sidebar__menu,.geo-layout-sidebar__submenu{margin:0;padding:0;list-style:none}.geo-layout-sidebar__menu{display:flex;flex-direction:column;gap:2px}.geo-layout-sidebar__submenu{display:flex;flex-direction:column;gap:2px;margin-top:2px;margin-bottom:4px;padding-left:8px;border-left:1px solid var(--geo-color-neutral-100);margin-left:22px}.geo-layout-sidebar__menu-btn{position:relative;display:flex;align-items:center;gap:10px;width:100%;min-height:40px;margin:0;padding:9px 12px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);line-height:1.35;text-align:left;cursor:pointer;transition:background-color .18s ease,color .18s ease}.geo-layout-sidebar__menu-btn:hover{background:var(--geo-color-primary-soft);color:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn:hover .geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-btn:hover .geo-layout-sidebar__menu-chevron{color:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}.geo-layout-sidebar__menu-btn--active .geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-btn--active .geo-layout-sidebar__menu-chevron{color:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn--active:before{content:\"\";position:absolute;top:8px;bottom:8px;left:0;width:3px;border-radius:0 var(--geo-radius-xs) var(--geo-radius-xs) 0;background:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn--parent.geo-layout-sidebar__menu-btn--active{background:var(--geo-color-primary-soft);font-weight:var(--geo-font-weight-medium)}.geo-layout-sidebar__menu-btn--parent.geo-layout-sidebar__menu-btn--active:before{display:none}.geo-layout-sidebar__menu-btn--leaf{padding-left:14px}.geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-chevron{flex-shrink:0;color:var(--geo-color-neutral-500);transition:color .18s ease}.geo-layout-sidebar__menu-label{flex:1;min-width:0;white-space:normal;word-break:break-word}.geo-layout-sidebar__menu-chevron{transition:transform .2s ease,color .18s ease}.geo-layout-sidebar__menu-group--open>.geo-layout-sidebar__menu-btn .geo-layout-sidebar__menu-chevron{transform:rotate(180deg)}.geo-layout-sidebar--collapsed .geo-layout-sidebar__brand{justify-content:center;padding-inline:8px}.geo-layout-sidebar--collapsed .geo-layout-sidebar__nav{padding-inline:8px;overflow:visible}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu{overflow:visible}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-btn{justify-content:center;padding-inline:0}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-btn--active:before{display:none}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-label,.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-chevron,.geo-layout-sidebar--collapsed .geo-layout-sidebar__submenu{display:none}.geo-layout-sidebar__menu-item--flyout,.geo-layout-sidebar__menu-group--flyout{position:relative}.geo-layout-sidebar__menu-item--flyout:after,.geo-layout-sidebar__menu-group--flyout:after{content:\"\";position:absolute;top:-8px;bottom:-8px;left:0;width:calc(100% + 16px);z-index:1}.geo-layout-sidebar__menu-item--flyout>.geo-layout-sidebar__menu-btn,.geo-layout-sidebar__menu-group--flyout>.geo-layout-sidebar__menu-btn{position:relative;z-index:2}.geo-layout-sidebar-flyout{position:absolute;top:-4px;left:100%;z-index:30;padding:4px 0 4px 8px;overflow:visible;border:0;background:transparent;box-shadow:none;opacity:0;visibility:hidden;pointer-events:none;transform:translate(-4px);transition:opacity .15s ease,transform .15s ease,visibility .15s ease}.geo-layout-sidebar-flyout__panel{min-width:220px;max-width:320px;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-md)}.geo-layout-sidebar-flyout--leaf .geo-layout-sidebar-flyout__panel{min-width:180px}.geo-layout-sidebar__menu-item--flyout:hover>.geo-layout-sidebar-flyout,.geo-layout-sidebar__menu-group--flyout:hover>.geo-layout-sidebar-flyout,.geo-layout-sidebar__menu-item--flyout:focus-within>.geo-layout-sidebar-flyout,.geo-layout-sidebar__menu-group--flyout:focus-within>.geo-layout-sidebar-flyout{opacity:1;visibility:visible;pointer-events:auto;transform:translate(0)}.geo-layout-sidebar-flyout__title{padding:12px 14px 10px;border-bottom:1px solid var(--geo-color-neutral-100);font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);line-height:1.3;color:var(--geo-color-neutral-900)}.geo-layout-sidebar-flyout__list{display:flex;flex-direction:column;gap:4px;margin:0;padding:8px;list-style:none}.geo-layout-sidebar-flyout__section{margin-top:4px}.geo-layout-sidebar-flyout__section-title{display:flex;align-items:center;gap:6px;padding:8px 12px 4px;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-500)}.geo-layout-sidebar-flyout__item{display:flex;align-items:center;gap:10px;width:100%;min-height:40px;padding:10px 12px;border:0;border-radius:var(--geo-radius);background:transparent;font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-800);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}.geo-layout-sidebar-flyout__item:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-layout-sidebar-flyout__item--active,.geo-layout-sidebar-flyout__item--active:hover{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}@media (prefers-reduced-motion: reduce){.geo-layout-sidebar-flyout{transition:none}}.geo-layout-sidebar--mobile{position:fixed;top:0;left:0;z-index:1001;width:inherit;height:100dvh;max-height:100dvh}.geo-layout-sidebar-host--mobile{width:0!important;overflow:visible}.geo-layout-sidebar--mobile:not(.geo-layout-sidebar--mobile-open){transform:translate(-100%);box-shadow:none;pointer-events:none;visibility:hidden}.geo-layout-sidebar--mobile-open{transform:translate(0);box-shadow:var(--geo-shadow-drawer);pointer-events:auto;visibility:visible}@media (prefers-reduced-motion: reduce){.geo-layout-sidebar-host,.geo-layout-sidebar,.geo-layout-sidebar__menu-btn,.geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-chevron{transition:none}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
78
|
+
}
|
|
79
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLayoutSidebarComponent, decorators: [{
|
|
80
|
+
type: Component,
|
|
81
|
+
args: [{ selector: 'geo-layout-sidebar', standalone: true, imports: [NgTemplateOutlet, GeoIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
82
|
+
class: 'geo-layout-sidebar-host',
|
|
83
|
+
'[class.geo-layout-sidebar-host--collapsed]': 'collapsed()',
|
|
84
|
+
'[class.geo-layout-sidebar-host--mobile]': 'isMobile()',
|
|
85
|
+
'[class.geo-layout-sidebar-host--mobile-open]': 'isMobile() && mobileOpen()',
|
|
86
|
+
'[style.width]': 'widthCss()',
|
|
87
|
+
'[attr.aria-hidden]': 'isMobile() && !mobileOpen() ? "true" : null',
|
|
88
|
+
}, template: "<aside\n class=\"geo-layout-sidebar\"\n [class.geo-layout-sidebar--collapsed]=\"collapsed()\"\n [class.geo-layout-sidebar--mobile]=\"isMobile()\"\n [class.geo-layout-sidebar--mobile-open]=\"isMobile() && mobileOpen()\"\n>\n @if (sidebarBackgroundSrc()) {\n <div\n class=\"geo-layout-sidebar__bg\"\n [style.background-image]=\"'url(' + sidebarBackgroundSrc() + ')'\"\n aria-hidden=\"true\"\n ></div>\n } @else {\n <div class=\"geo-layout-sidebar__bg geo-layout-sidebar__bg--tint\" aria-hidden=\"true\"></div>\n }\n\n <div class=\"geo-layout-sidebar__brand\">\n @if (logoSrc()) {\n <img class=\"geo-layout-sidebar__logo\" [src]=\"logoSrc()\" [alt]=\"logoAlt()\" />\n } @else {\n <span class=\"geo-layout-sidebar__logo-fallback\" aria-hidden=\"true\">TN</span>\n }\n @if (showLabels()) {\n <span class=\"geo-layout-sidebar__brand-title\">{{ brandTitle() }}</span>\n }\n </div>\n\n <nav class=\"geo-layout-sidebar__nav\" aria-label=\"Menu ch\u00EDnh\">\n <ul class=\"geo-layout-sidebar__menu\">\n @for (item of menuItems(); track item.key) {\n <ng-container\n [ngTemplateOutlet]=\"menuNode\"\n [ngTemplateOutletContext]=\"{ $implicit: item, depth: 0 }\"\n />\n }\n </ul>\n </nav>\n</aside>\n\n<ng-template #menuNode let-item let-depth=\"depth\">\n @if (item.children?.length) {\n <li\n class=\"geo-layout-sidebar__menu-group\"\n [class.geo-layout-sidebar__menu-group--open]=\"isOpen(item.key) || hasSelectedDescendant(item)\"\n [class.geo-layout-sidebar__menu-group--active]=\"hasSelectedDescendant(item)\"\n [class.geo-layout-sidebar__menu-group--flyout]=\"flyoutEnabled() && depth === 0\"\n >\n <button\n type=\"button\"\n class=\"geo-layout-sidebar__menu-btn geo-layout-sidebar__menu-btn--parent\"\n [class.geo-layout-sidebar__menu-btn--active]=\"hasSelectedDescendant(item)\"\n [attr.aria-haspopup]=\"flyoutEnabled() && depth === 0 ? 'menu' : null\"\n (click)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <geo-icon\n class=\"geo-layout-sidebar__menu-icon\"\n [type]=\"item.icon\"\n size=\"md\"\n />\n }\n @if (showLabels()) {\n <span class=\"geo-layout-sidebar__menu-label\">{{ item.title }}</span>\n <geo-icon\n class=\"geo-layout-sidebar__menu-chevron\"\n type=\"down\"\n size=\"xs\"\n />\n }\n </button>\n\n @if (flyoutEnabled() && depth === 0) {\n <div\n class=\"geo-layout-sidebar-flyout geo-layout-sidebar-flyout--group\"\n role=\"menu\"\n [attr.aria-label]=\"item.title\"\n >\n <div class=\"geo-layout-sidebar-flyout__panel\">\n <div class=\"geo-layout-sidebar-flyout__title\">{{ item.title }}</div>\n <ul class=\"geo-layout-sidebar-flyout__list\">\n @for (child of item.children; track child.key) {\n @if (child.children?.length) {\n <li class=\"geo-layout-sidebar-flyout__section\">\n <div class=\"geo-layout-sidebar-flyout__section-title\">\n @if (child.icon) {\n <geo-icon [type]=\"child.icon\" size=\"sm\" />\n }\n {{ child.title }}\n </div>\n <ul class=\"geo-layout-sidebar-flyout__list\">\n @for (grand of child.children; track grand.key) {\n <li>\n <button\n type=\"button\"\n class=\"geo-layout-sidebar-flyout__item\"\n [class.geo-layout-sidebar-flyout__item--active]=\"isSelected(grand.key)\"\n role=\"menuitem\"\n (click)=\"selectLeaf(grand)\"\n >\n {{ grand.title }}\n </button>\n </li>\n }\n </ul>\n </li>\n } @else {\n <li>\n <button\n type=\"button\"\n class=\"geo-layout-sidebar-flyout__item\"\n [class.geo-layout-sidebar-flyout__item--active]=\"isSelected(child.key)\"\n role=\"menuitem\"\n (click)=\"selectLeaf(child)\"\n >\n @if (child.icon) {\n <geo-icon [type]=\"child.icon\" size=\"sm\" />\n }\n <span>{{ child.title }}</span>\n </button>\n </li>\n }\n }\n </ul>\n </div>\n </div>\n }\n\n @if (showLabels() && (isOpen(item.key) || hasSelectedDescendant(item))) {\n <ul class=\"geo-layout-sidebar__submenu\">\n @for (child of item.children; track child.key) {\n <ng-container\n [ngTemplateOutlet]=\"menuNode\"\n [ngTemplateOutletContext]=\"{ $implicit: child, depth: depth + 1 }\"\n />\n }\n </ul>\n }\n </li>\n } @else {\n <li\n class=\"geo-layout-sidebar__menu-item\"\n [class.geo-layout-sidebar__menu-item--flyout]=\"flyoutEnabled() && depth === 0\"\n >\n <button\n type=\"button\"\n class=\"geo-layout-sidebar__menu-btn\"\n [class.geo-layout-sidebar__menu-btn--active]=\"isSelected(item.key)\"\n [class.geo-layout-sidebar__menu-btn--leaf]=\"!item.icon && depth > 0\"\n [attr.aria-haspopup]=\"flyoutEnabled() && depth === 0 ? 'menu' : null\"\n (click)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <geo-icon\n class=\"geo-layout-sidebar__menu-icon\"\n [type]=\"item.icon\"\n size=\"md\"\n />\n }\n @if (showLabels()) {\n <span class=\"geo-layout-sidebar__menu-label\">{{ item.title }}</span>\n }\n </button>\n\n @if (flyoutEnabled() && depth === 0) {\n <div\n class=\"geo-layout-sidebar-flyout geo-layout-sidebar-flyout--leaf\"\n role=\"menu\"\n [attr.aria-label]=\"item.title\"\n >\n <div class=\"geo-layout-sidebar-flyout__panel\">\n <button\n type=\"button\"\n class=\"geo-layout-sidebar-flyout__item\"\n [class.geo-layout-sidebar-flyout__item--active]=\"isSelected(item.key)\"\n role=\"menuitem\"\n (click)=\"selectLeaf(item)\"\n >\n @if (item.icon) {\n <geo-icon [type]=\"item.icon\" size=\"sm\" />\n }\n <span>{{ item.title }}</span>\n </button>\n </div>\n </div>\n }\n </li>\n }\n</ng-template>\n", styles: ["@charset \"UTF-8\";.geo-layout-sidebar-host{display:block;flex-shrink:0;height:100%;max-height:100dvh;transition:width .2s ease}.geo-layout-sidebar-host--collapsed{overflow:visible;z-index:20}.geo-layout-sidebar{position:relative;z-index:2;display:flex;flex-direction:column;height:100%;max-height:100dvh;overflow:hidden;background:var(--geo-color-surface-elevated);color:var(--geo-color-neutral-700);border-right:1px solid var(--geo-color-neutral-200);transition:transform .2s ease,box-shadow .2s ease}.geo-layout-sidebar-host--collapsed .geo-layout-sidebar{overflow:visible}.geo-layout-sidebar__bg{position:absolute;inset:0;z-index:0;pointer-events:none;background-size:90% auto;background-repeat:no-repeat;background-position:center bottom;opacity:.06}.geo-layout-sidebar__bg--tint{background-image:none;background:linear-gradient(180deg,var(--geo-color-primary-soft) 0%,transparent 42%);opacity:1}.geo-layout-sidebar__brand{position:relative;z-index:1;display:flex;flex-shrink:0;align-items:center;justify-content:flex-start;gap:12px;height:64px;padding:0 20px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-layout-sidebar__logo{width:36px;height:36px;object-fit:contain}.geo-layout-sidebar__logo-fallback{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:var(--geo-radius);background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-bold);letter-spacing:.04em}.geo-layout-sidebar__brand-title{font-size:22px;font-weight:var(--geo-font-weight-bold);line-height:1;letter-spacing:-.02em;color:var(--geo-color-primary-default)}.geo-layout-sidebar__nav{position:relative;z-index:1;flex:1;min-height:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:12px 12px 24px}.geo-layout-sidebar__menu,.geo-layout-sidebar__submenu{margin:0;padding:0;list-style:none}.geo-layout-sidebar__menu{display:flex;flex-direction:column;gap:2px}.geo-layout-sidebar__submenu{display:flex;flex-direction:column;gap:2px;margin-top:2px;margin-bottom:4px;padding-left:8px;border-left:1px solid var(--geo-color-neutral-100);margin-left:22px}.geo-layout-sidebar__menu-btn{position:relative;display:flex;align-items:center;gap:10px;width:100%;min-height:40px;margin:0;padding:9px 12px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);line-height:1.35;text-align:left;cursor:pointer;transition:background-color .18s ease,color .18s ease}.geo-layout-sidebar__menu-btn:hover{background:var(--geo-color-primary-soft);color:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn:hover .geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-btn:hover .geo-layout-sidebar__menu-chevron{color:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}.geo-layout-sidebar__menu-btn--active .geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-btn--active .geo-layout-sidebar__menu-chevron{color:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn--active:before{content:\"\";position:absolute;top:8px;bottom:8px;left:0;width:3px;border-radius:0 var(--geo-radius-xs) var(--geo-radius-xs) 0;background:var(--geo-color-primary-default)}.geo-layout-sidebar__menu-btn--parent.geo-layout-sidebar__menu-btn--active{background:var(--geo-color-primary-soft);font-weight:var(--geo-font-weight-medium)}.geo-layout-sidebar__menu-btn--parent.geo-layout-sidebar__menu-btn--active:before{display:none}.geo-layout-sidebar__menu-btn--leaf{padding-left:14px}.geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-chevron{flex-shrink:0;color:var(--geo-color-neutral-500);transition:color .18s ease}.geo-layout-sidebar__menu-label{flex:1;min-width:0;white-space:normal;word-break:break-word}.geo-layout-sidebar__menu-chevron{transition:transform .2s ease,color .18s ease}.geo-layout-sidebar__menu-group--open>.geo-layout-sidebar__menu-btn .geo-layout-sidebar__menu-chevron{transform:rotate(180deg)}.geo-layout-sidebar--collapsed .geo-layout-sidebar__brand{justify-content:center;padding-inline:8px}.geo-layout-sidebar--collapsed .geo-layout-sidebar__nav{padding-inline:8px;overflow:visible}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu{overflow:visible}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-btn{justify-content:center;padding-inline:0}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-btn--active:before{display:none}.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-label,.geo-layout-sidebar--collapsed .geo-layout-sidebar__menu-chevron,.geo-layout-sidebar--collapsed .geo-layout-sidebar__submenu{display:none}.geo-layout-sidebar__menu-item--flyout,.geo-layout-sidebar__menu-group--flyout{position:relative}.geo-layout-sidebar__menu-item--flyout:after,.geo-layout-sidebar__menu-group--flyout:after{content:\"\";position:absolute;top:-8px;bottom:-8px;left:0;width:calc(100% + 16px);z-index:1}.geo-layout-sidebar__menu-item--flyout>.geo-layout-sidebar__menu-btn,.geo-layout-sidebar__menu-group--flyout>.geo-layout-sidebar__menu-btn{position:relative;z-index:2}.geo-layout-sidebar-flyout{position:absolute;top:-4px;left:100%;z-index:30;padding:4px 0 4px 8px;overflow:visible;border:0;background:transparent;box-shadow:none;opacity:0;visibility:hidden;pointer-events:none;transform:translate(-4px);transition:opacity .15s ease,transform .15s ease,visibility .15s ease}.geo-layout-sidebar-flyout__panel{min-width:220px;max-width:320px;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-md)}.geo-layout-sidebar-flyout--leaf .geo-layout-sidebar-flyout__panel{min-width:180px}.geo-layout-sidebar__menu-item--flyout:hover>.geo-layout-sidebar-flyout,.geo-layout-sidebar__menu-group--flyout:hover>.geo-layout-sidebar-flyout,.geo-layout-sidebar__menu-item--flyout:focus-within>.geo-layout-sidebar-flyout,.geo-layout-sidebar__menu-group--flyout:focus-within>.geo-layout-sidebar-flyout{opacity:1;visibility:visible;pointer-events:auto;transform:translate(0)}.geo-layout-sidebar-flyout__title{padding:12px 14px 10px;border-bottom:1px solid var(--geo-color-neutral-100);font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);line-height:1.3;color:var(--geo-color-neutral-900)}.geo-layout-sidebar-flyout__list{display:flex;flex-direction:column;gap:4px;margin:0;padding:8px;list-style:none}.geo-layout-sidebar-flyout__section{margin-top:4px}.geo-layout-sidebar-flyout__section-title{display:flex;align-items:center;gap:6px;padding:8px 12px 4px;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-500)}.geo-layout-sidebar-flyout__item{display:flex;align-items:center;gap:10px;width:100%;min-height:40px;padding:10px 12px;border:0;border-radius:var(--geo-radius);background:transparent;font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-800);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}.geo-layout-sidebar-flyout__item:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-layout-sidebar-flyout__item--active,.geo-layout-sidebar-flyout__item--active:hover{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}@media (prefers-reduced-motion: reduce){.geo-layout-sidebar-flyout{transition:none}}.geo-layout-sidebar--mobile{position:fixed;top:0;left:0;z-index:1001;width:inherit;height:100dvh;max-height:100dvh}.geo-layout-sidebar-host--mobile{width:0!important;overflow:visible}.geo-layout-sidebar--mobile:not(.geo-layout-sidebar--mobile-open){transform:translate(-100%);box-shadow:none;pointer-events:none;visibility:hidden}.geo-layout-sidebar--mobile-open{transform:translate(0);box-shadow:var(--geo-shadow-drawer);pointer-events:auto;visibility:visible}@media (prefers-reduced-motion: reduce){.geo-layout-sidebar-host,.geo-layout-sidebar,.geo-layout-sidebar__menu-btn,.geo-layout-sidebar__menu-icon,.geo-layout-sidebar__menu-chevron{transition:none}}\n"] }]
|
|
89
|
+
}] });
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLWxheW91dC1zaWRlYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dlby11aS9zcmMvbGliL2ZpZ21hL2dlby1sYXlvdXQvc2lkZWJhci9nZW8tbGF5b3V0LXNpZGViYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLWxheW91dC9zaWRlYmFyL2dlby1sYXlvdXQtc2lkZWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFHckU7OztHQUdHO0FBa0JILE1BQU0sT0FBTyx5QkFBeUI7SUFDM0IsU0FBUyxHQUFHLEtBQUssQ0FBc0IsRUFBRSxDQUFDLENBQUM7SUFDM0MsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixPQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLFdBQVcsR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ3pDLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLEtBQUssR0FBRyxLQUFLLENBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLGNBQWMsR0FBRyxLQUFLLENBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBRWhELFVBQVUsR0FBRyxNQUFNLEVBQXFCLENBQUM7SUFFakMsUUFBUSxHQUFHLE1BQU0sQ0FBc0IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRW5FLGlEQUFpRDtJQUN4QyxhQUFhLEdBQUcsUUFBUSxDQUMvQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzNDLENBQUM7SUFFTyxVQUFVLEdBQUcsUUFBUSxDQUM1QixHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzNDLENBQUM7SUFFTyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUF1QjtRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDdkIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FDOUQsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBVztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUF1QjtRQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDekIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUF1QjtRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUEwQjtRQUMxQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFELENBQUM7d0dBckZVLHlCQUF5Qjs0RkFBekIseUJBQXlCLHE5RENuQ3RDLHc0TkE0TEEsbzJRRHZLWSxnQkFBZ0Isb0pBQUUsZ0JBQWdCOzs0RkFjakMseUJBQXlCO2tCQWpCckMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsbUJBRzVCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osS0FBSyxFQUFFLHlCQUF5Qjt3QkFDaEMsNENBQTRDLEVBQUUsYUFBYTt3QkFDM0QseUNBQXlDLEVBQUUsWUFBWTt3QkFDdkQsOENBQThDLEVBQUUsNEJBQTRCO3dCQUM1RSxlQUFlLEVBQUUsWUFBWTt3QkFDN0Isb0JBQW9CLEVBQUUsNkNBQTZDO3FCQUNwRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdlb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9nZW8taWNvbi9nZW8taWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTGF5b3V0TWVudUl0ZW0sIEdlb0xheW91dFNpZGVyV2lkdGggfSBmcm9tICcuLi9nZW8tbGF5b3V0LnR5cGVzJztcblxuLyoqXG4gKiBTaWRlYmFyIHNoZWxsOiBicmFuZCArIHJlY3Vyc2l2ZSBtZW51LlxuICogQ29sbGFwc2VkIChkZXNrdG9wKTogaG92ZXIgaXRlbSBt4bufIHBvcG92ZXIgYsOqbiBwaOG6o2kgKHTDqm4gbGVhZiAvIHN1Ym1lbnUgZ3JvdXApLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnZW8tbGF5b3V0LXNpZGViYXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldCwgR2VvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW8tbGF5b3V0LXNpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VvLWxheW91dC1zaWRlYmFyLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2dlby1sYXlvdXQtc2lkZWJhci1ob3N0JyxcbiAgICAnW2NsYXNzLmdlby1sYXlvdXQtc2lkZWJhci1ob3N0LS1jb2xsYXBzZWRdJzogJ2NvbGxhcHNlZCgpJyxcbiAgICAnW2NsYXNzLmdlby1sYXlvdXQtc2lkZWJhci1ob3N0LS1tb2JpbGVdJzogJ2lzTW9iaWxlKCknLFxuICAgICdbY2xhc3MuZ2VvLWxheW91dC1zaWRlYmFyLWhvc3QtLW1vYmlsZS1vcGVuXSc6ICdpc01vYmlsZSgpICYmIG1vYmlsZU9wZW4oKScsXG4gICAgJ1tzdHlsZS53aWR0aF0nOiAnd2lkdGhDc3MoKScsXG4gICAgJ1thdHRyLmFyaWEtaGlkZGVuXSc6ICdpc01vYmlsZSgpICYmICFtb2JpbGVPcGVuKCkgPyBcInRydWVcIiA6IG51bGwnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBHZW9MYXlvdXRTaWRlYmFyQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgbWVudUl0ZW1zID0gaW5wdXQ8R2VvTGF5b3V0TWVudUl0ZW1bXT4oW10pO1xuICByZWFkb25seSBicmFuZFRpdGxlID0gaW5wdXQoJ2lMSVMnKTtcbiAgcmVhZG9ubHkgbG9nb1NyYyA9IGlucHV0KCcnKTtcbiAgcmVhZG9ubHkgbG9nb0FsdCA9IGlucHV0KCdMb2dvJyk7XG4gIHJlYWRvbmx5IHNpZGViYXJCYWNrZ3JvdW5kU3JjID0gaW5wdXQoJycpO1xuICByZWFkb25seSBzZWxlY3RlZEtleSA9IG1vZGVsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBjb2xsYXBzZWQgPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5IGlzTW9iaWxlID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSBtb2JpbGVPcGVuID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSB3aWR0aCA9IGlucHV0PEdlb0xheW91dFNpZGVyV2lkdGg+KDI4MCk7XG4gIHJlYWRvbmx5IGNvbGxhcHNlZFdpZHRoID0gaW5wdXQ8R2VvTGF5b3V0U2lkZXJXaWR0aD4oODApO1xuXG4gIHJlYWRvbmx5IG1lbnVTZWxlY3QgPSBvdXRwdXQ8R2VvTGF5b3V0TWVudUl0ZW0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuS2V5cyA9IHNpZ25hbDxSZWFkb25seVNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXG4gIC8qKiBEZXNrdG9wIGljb24tcmFpbDogaGnhu4duIHBvcG92ZXIga2hpIGhvdmVyLiAqL1xuICByZWFkb25seSBmbHlvdXRFbmFibGVkID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5jb2xsYXBzZWQoKSAmJiAhdGhpcy5pc01vYmlsZSgpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0xhYmVscyA9IGNvbXB1dGVkKFxuICAgICgpID0+ICF0aGlzLmNvbGxhcHNlZCgpIHx8IHRoaXMuaXNNb2JpbGUoKVxuICApO1xuXG4gIHJlYWRvbmx5IHdpZHRoQ3NzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzTW9iaWxlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQ3NzU2l6ZSh0aGlzLndpZHRoKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb2xsYXBzZWQoKVxuICAgICAgPyB0aGlzLnRvQ3NzU2l6ZSh0aGlzLmNvbGxhcHNlZFdpZHRoKCkpXG4gICAgICA6IHRoaXMudG9Dc3NTaXplKHRoaXMud2lkdGgoKSk7XG4gIH0pO1xuXG4gIGlzT3BlbihrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW5LZXlzKCkuaGFzKGtleSk7XG4gIH1cblxuICBpc1NlbGVjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRLZXkoKSA9PT0ga2V5O1xuICB9XG5cbiAgaGFzU2VsZWN0ZWREZXNjZW5kYW50KGl0ZW06IEdlb0xheW91dE1lbnVJdGVtKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkS2V5KCk7XG4gICAgaWYgKCFzZWxlY3RlZCB8fCAhaXRlbS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpdGVtLmNoaWxkcmVuLnNvbWUoXG4gICAgICAoY2hpbGQpID0+XG4gICAgICAgIGNoaWxkLmtleSA9PT0gc2VsZWN0ZWQgfHwgdGhpcy5oYXNTZWxlY3RlZERlc2NlbmRhbnQoY2hpbGQpXG4gICAgKTtcbiAgfVxuXG4gIHRvZ2dsZVN1Ym1lbnUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5LZXlzLnVwZGF0ZSgocHJldikgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldik7XG4gICAgICBpZiAobmV4dC5oYXMoa2V5KSkge1xuICAgICAgICBuZXh0LmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dC5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgb25NZW51SXRlbUNsaWNrKGl0ZW06IEdlb0xheW91dE1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuZmx5b3V0RW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudG9nZ2xlU3VibWVudShpdGVtLmtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RMZWFmKGl0ZW0pO1xuICB9XG5cbiAgc2VsZWN0TGVhZihpdGVtOiBHZW9MYXlvdXRNZW51SXRlbSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRLZXkuc2V0KGl0ZW0ua2V5KTtcbiAgICB0aGlzLm1lbnVTZWxlY3QuZW1pdChpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Dc3NTaXplKHZhbHVlOiBHZW9MYXlvdXRTaWRlcldpZHRoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IGAke3ZhbHVlfXB4YCA6IHZhbHVlO1xuICB9XG59XG4iLCI8YXNpZGVcbiAgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXJcIlxuICBbY2xhc3MuZ2VvLWxheW91dC1zaWRlYmFyLS1jb2xsYXBzZWRdPVwiY29sbGFwc2VkKClcIlxuICBbY2xhc3MuZ2VvLWxheW91dC1zaWRlYmFyLS1tb2JpbGVdPVwiaXNNb2JpbGUoKVwiXG4gIFtjbGFzcy5nZW8tbGF5b3V0LXNpZGViYXItLW1vYmlsZS1vcGVuXT1cImlzTW9iaWxlKCkgJiYgbW9iaWxlT3BlbigpXCJcbj5cbiAgQGlmIChzaWRlYmFyQmFja2dyb3VuZFNyYygpKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXJfX2JnXCJcbiAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cIid1cmwoJyArIHNpZGViYXJCYWNrZ3JvdW5kU3JjKCkgKyAnKSdcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICA+PC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXJfX2JnIGdlby1sYXlvdXQtc2lkZWJhcl9fYmctLXRpbnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgfVxuXG4gIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXJfX2JyYW5kXCI+XG4gICAgQGlmIChsb2dvU3JjKCkpIHtcbiAgICAgIDxpbWcgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXJfX2xvZ29cIiBbc3JjXT1cImxvZ29TcmMoKVwiIFthbHRdPVwibG9nb0FsdCgpXCIgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19sb2dvLWZhbGxiYWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+VE48L3NwYW4+XG4gICAgfVxuICAgIEBpZiAoc2hvd0xhYmVscygpKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhcl9fYnJhbmQtdGl0bGVcIj57eyBicmFuZFRpdGxlKCkgfX08L3NwYW4+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8bmF2IGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19uYXZcIiBhcmlhLWxhYmVsPVwiTWVudSBjaMOtbmhcIj5cbiAgICA8dWwgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXJfX21lbnVcIj5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgbWVudUl0ZW1zKCk7IHRyYWNrIGl0ZW0ua2V5KSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZW51Tm9kZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtLCBkZXB0aDogMCB9XCJcbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA8L3VsPlxuICA8L25hdj5cbjwvYXNpZGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVudU5vZGUgbGV0LWl0ZW0gbGV0LWRlcHRoPVwiZGVwdGhcIj5cbiAgQGlmIChpdGVtLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICA8bGlcbiAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWdyb3VwXCJcbiAgICAgIFtjbGFzcy5nZW8tbGF5b3V0LXNpZGViYXJfX21lbnUtZ3JvdXAtLW9wZW5dPVwiaXNPcGVuKGl0ZW0ua2V5KSB8fCBoYXNTZWxlY3RlZERlc2NlbmRhbnQoaXRlbSlcIlxuICAgICAgW2NsYXNzLmdlby1sYXlvdXQtc2lkZWJhcl9fbWVudS1ncm91cC0tYWN0aXZlXT1cImhhc1NlbGVjdGVkRGVzY2VuZGFudChpdGVtKVwiXG4gICAgICBbY2xhc3MuZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWdyb3VwLS1mbHlvdXRdPVwiZmx5b3V0RW5hYmxlZCgpICYmIGRlcHRoID09PSAwXCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhcl9fbWVudS1idG4gZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWJ0bi0tcGFyZW50XCJcbiAgICAgICAgW2NsYXNzLmdlby1sYXlvdXQtc2lkZWJhcl9fbWVudS1idG4tLWFjdGl2ZV09XCJoYXNTZWxlY3RlZERlc2NlbmRhbnQoaXRlbSlcIlxuICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImZseW91dEVuYWJsZWQoKSAmJiBkZXB0aCA9PT0gMCA/ICdtZW51JyA6IG51bGxcIlxuICAgICAgICAoY2xpY2spPVwib25NZW51SXRlbUNsaWNrKGl0ZW0pXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICA8Z2VvLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWljb25cIlxuICAgICAgICAgICAgW3R5cGVdPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgIHNpemU9XCJtZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNob3dMYWJlbHMoKSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWxhYmVsXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8Z2VvLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWNoZXZyb25cIlxuICAgICAgICAgICAgdHlwZT1cImRvd25cIlxuICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgQGlmIChmbHlvdXRFbmFibGVkKCkgJiYgZGVwdGggPT09IDApIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyLWZseW91dCBnZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0LS1ncm91cFwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXRlbS50aXRsZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyLWZseW91dF9fcGFuZWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X190aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhci1mbHlvdXRfX2xpc3RcIj5cbiAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQua2V5KSB7XG4gICAgICAgICAgICAgICAgQGlmIChjaGlsZC5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X19zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X19zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjaGlsZC5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8Z2VvLWljb24gW3R5cGVdPVwiY2hpbGQuaWNvblwiIHNpemU9XCJzbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaWxkLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoZ3JhbmQgb2YgY2hpbGQuY2hpbGRyZW47IHRyYWNrIGdyYW5kLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJnZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZ2VvLWxheW91dC1zaWRlYmFyLWZseW91dF9faXRlbS0tYWN0aXZlXT1cImlzU2VsZWN0ZWQoZ3JhbmQua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TGVhZihncmFuZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JhbmQudGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhci1mbHlvdXRfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5nZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X19pdGVtLS1hY3RpdmVdPVwiaXNTZWxlY3RlZChjaGlsZC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMZWFmKGNoaWxkKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNoaWxkLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnZW8taWNvbiBbdHlwZV09XCJjaGlsZC5pY29uXCIgc2l6ZT1cInNtXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY2hpbGQudGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dMYWJlbHMoKSAmJiAoaXNPcGVuKGl0ZW0ua2V5KSB8fCBoYXNTZWxlY3RlZERlc2NlbmRhbnQoaXRlbSkpKSB7XG4gICAgICAgIDx1bCBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhcl9fc3VibWVudVwiPlxuICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIGNoaWxkLmtleSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZW51Tm9kZVwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY2hpbGQsIGRlcHRoOiBkZXB0aCArIDEgfVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cbiAgICAgIH1cbiAgICA8L2xpPlxuICB9IEBlbHNlIHtcbiAgICA8bGlcbiAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWl0ZW1cIlxuICAgICAgW2NsYXNzLmdlby1sYXlvdXQtc2lkZWJhcl9fbWVudS1pdGVtLS1mbHlvdXRdPVwiZmx5b3V0RW5hYmxlZCgpICYmIGRlcHRoID09PSAwXCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhcl9fbWVudS1idG5cIlxuICAgICAgICBbY2xhc3MuZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWJ0bi0tYWN0aXZlXT1cImlzU2VsZWN0ZWQoaXRlbS5rZXkpXCJcbiAgICAgICAgW2NsYXNzLmdlby1sYXlvdXQtc2lkZWJhcl9fbWVudS1idG4tLWxlYWZdPVwiIWl0ZW0uaWNvbiAmJiBkZXB0aCA+IDBcIlxuICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImZseW91dEVuYWJsZWQoKSAmJiBkZXB0aCA9PT0gMCA/ICdtZW51JyA6IG51bGxcIlxuICAgICAgICAoY2xpY2spPVwib25NZW51SXRlbUNsaWNrKGl0ZW0pXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICA8Z2VvLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWljb25cIlxuICAgICAgICAgICAgW3R5cGVdPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgIHNpemU9XCJtZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNob3dMYWJlbHMoKSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyX19tZW51LWxhYmVsXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIEBpZiAoZmx5b3V0RW5hYmxlZCgpICYmIGRlcHRoID09PSAwKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdlby1sYXlvdXQtc2lkZWJhci1mbHlvdXQgZ2VvLWxheW91dC1zaWRlYmFyLWZseW91dC0tbGVhZlwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXRlbS50aXRsZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyLWZseW91dF9fcGFuZWxcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZ2VvLWxheW91dC1zaWRlYmFyLWZseW91dF9faXRlbVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5nZW8tbGF5b3V0LXNpZGViYXItZmx5b3V0X19pdGVtLS1hY3RpdmVdPVwiaXNTZWxlY3RlZChpdGVtLmtleSlcIlxuICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TGVhZihpdGVtKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uKSB7XG4gICAgICAgICAgICAgICAgPGdlby1pY29uIFt0eXBlXT1cIml0ZW0uaWNvblwiIHNpemU9XCJzbVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2xpPlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { GeoPageHeaderComponent } from '../geo-page-header/geo-page-header.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Standard list / CRUD page chrome (admin & thống kê).
|
|
6
|
+
*
|
|
7
|
+
* @summary Layout trang danh sách: header + filter + toolbar + nội dung bảng.
|
|
8
|
+
* @whenToUse QL người dùng, đồng bộ iLIS, QL dịch vụ/bản đồ, thống kê tờ.
|
|
9
|
+
* @doNotUseWhen Map portal — use geo-map-shell.
|
|
10
|
+
*/
|
|
11
|
+
export class GeoListPageComponent {
|
|
12
|
+
title = input('');
|
|
13
|
+
breadcrumb = input([]);
|
|
14
|
+
uppercase = input(true);
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoListPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
16
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoListPageComponent, isStandalone: true, selector: "geo-list-page", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, breadcrumb: { classPropertyName: "breadcrumb", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, uppercase: { classPropertyName: "uppercase", publicName: "uppercase", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "geo-list-page-host" }, ngImport: i0, template: "<div class=\"geo-list-page\">\n <geo-page-header\n [title]=\"title()\"\n [breadcrumb]=\"breadcrumb()\"\n [uppercase]=\"uppercase()\"\n >\n <div geoPageActions>\n <ng-content select=\"[geoListActions]\" />\n </div>\n <div geoPageFilters>\n <ng-content select=\"[geoListFilters]\" />\n </div>\n </geo-page-header>\n\n <div class=\"geo-list-page__filter\">\n <ng-content select=\"geo-table-filter,[geoListFilter]\" />\n </div>\n\n <div class=\"geo-list-page__table-panel\">\n <div class=\"geo-list-page__toolbar\">\n <ng-content select=\"geo-table-toolbar,[geoListToolbar]\" />\n </div>\n <div class=\"geo-list-page__body\">\n <ng-content />\n </div>\n </div>\n</div>\n", styles: [".geo-list-page-host{display:block}.geo-list-page{display:flex;flex-direction:column;gap:16px}.geo-list-page__filter:empty,.geo-list-page__toolbar:empty{display:none}.geo-list-page__table-panel{display:flex;flex-direction:column;min-width:0;gap:0}.geo-list-page__body{min-width:0}\n"], dependencies: [{ kind: "component", type: GeoPageHeaderComponent, selector: "geo-page-header", inputs: ["title", "breadcrumb", "uppercase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoListPageComponent, decorators: [{
|
|
19
|
+
type: Component,
|
|
20
|
+
args: [{ selector: 'geo-list-page', standalone: true, imports: [GeoPageHeaderComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-list-page-host' }, template: "<div class=\"geo-list-page\">\n <geo-page-header\n [title]=\"title()\"\n [breadcrumb]=\"breadcrumb()\"\n [uppercase]=\"uppercase()\"\n >\n <div geoPageActions>\n <ng-content select=\"[geoListActions]\" />\n </div>\n <div geoPageFilters>\n <ng-content select=\"[geoListFilters]\" />\n </div>\n </geo-page-header>\n\n <div class=\"geo-list-page__filter\">\n <ng-content select=\"geo-table-filter,[geoListFilter]\" />\n </div>\n\n <div class=\"geo-list-page__table-panel\">\n <div class=\"geo-list-page__toolbar\">\n <ng-content select=\"geo-table-toolbar,[geoListToolbar]\" />\n </div>\n <div class=\"geo-list-page__body\">\n <ng-content />\n </div>\n </div>\n</div>\n", styles: [".geo-list-page-host{display:block}.geo-list-page{display:flex;flex-direction:column;gap:16px}.geo-list-page__filter:empty,.geo-list-page__toolbar:empty{display:none}.geo-list-page__table-panel{display:flex;flex-direction:column;min-width:0;gap:0}.geo-list-page__body{min-width:0}\n"] }]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLWxpc3QtcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tbGlzdC1wYWdlL2dlby1saXN0LXBhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLWxpc3QtcGFnZS9nZW8tbGlzdC1wYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFDTCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOENBQThDLENBQUM7O0FBR3RGOzs7Ozs7R0FNRztBQVdILE1BQU0sT0FBTyxvQkFBb0I7SUFDdEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixVQUFVLEdBQUcsS0FBSyxDQUFzQixFQUFFLENBQUMsQ0FBQztJQUM1QyxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dHQUh0QixvQkFBb0I7NEZBQXBCLG9CQUFvQix3Z0JDMUJqQywydEJBMkJBLG1WRFJZLHNCQUFzQjs7NEZBT3JCLG9CQUFvQjtrQkFWaEMsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQLENBQUMsc0JBQXNCLENBQUMsbUJBR2hCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0IsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBpbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR2VvUGFnZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1wYWdlLWhlYWRlci9nZW8tcGFnZS1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgR2VvQnJlYWRjcnVtYkl0ZW0gfSBmcm9tICcuLi9nZW8tYnJlYWRjcnVtYi9nZW8tYnJlYWRjcnVtYi50eXBlcyc7XG5cbi8qKlxuICogU3RhbmRhcmQgbGlzdCAvIENSVUQgcGFnZSBjaHJvbWUgKGFkbWluICYgdGjhu5FuZyBrw6opLlxuICpcbiAqIEBzdW1tYXJ5IExheW91dCB0cmFuZyBkYW5oIHPDoWNoOiBoZWFkZXIgKyBmaWx0ZXIgKyB0b29sYmFyICsgbuG7mWkgZHVuZyBi4bqjbmcuXG4gKiBAd2hlblRvVXNlIFFMIG5nxrDhu51pIGTDuW5nLCDEkeG7k25nIGLhu5kgaUxJUywgUUwgZOG7i2NoIHbhu6UvYuG6o24gxJHhu5MsIHRo4buRbmcga8OqIHThu50uXG4gKiBAZG9Ob3RVc2VXaGVuIE1hcCBwb3J0YWwg4oCUIHVzZSBnZW8tbWFwLXNoZWxsLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnZW8tbGlzdC1wYWdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0dlb1BhZ2VIZWFkZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VvLWxpc3QtcGFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9nZW8tbGlzdC1wYWdlLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHsgY2xhc3M6ICdnZW8tbGlzdC1wYWdlLWhvc3QnIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb0xpc3RQYWdlQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dCgnJyk7XG4gIHJlYWRvbmx5IGJyZWFkY3J1bWIgPSBpbnB1dDxHZW9CcmVhZGNydW1iSXRlbVtdPihbXSk7XG4gIHJlYWRvbmx5IHVwcGVyY2FzZSA9IGlucHV0KHRydWUpO1xufVxuIiwiPGRpdiBjbGFzcz1cImdlby1saXN0LXBhZ2VcIj5cbiAgPGdlby1wYWdlLWhlYWRlclxuICAgIFt0aXRsZV09XCJ0aXRsZSgpXCJcbiAgICBbYnJlYWRjcnVtYl09XCJicmVhZGNydW1iKClcIlxuICAgIFt1cHBlcmNhc2VdPVwidXBwZXJjYXNlKClcIlxuICA+XG4gICAgPGRpdiBnZW9QYWdlQWN0aW9ucz5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltnZW9MaXN0QWN0aW9uc11cIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZ2VvUGFnZUZpbHRlcnM+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZ2VvTGlzdEZpbHRlcnNdXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9nZW8tcGFnZS1oZWFkZXI+XG5cbiAgPGRpdiBjbGFzcz1cImdlby1saXN0LXBhZ2VfX2ZpbHRlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImdlby10YWJsZS1maWx0ZXIsW2dlb0xpc3RGaWx0ZXJdXCIgLz5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImdlby1saXN0LXBhZ2VfX3RhYmxlLXBhbmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImdlby1saXN0LXBhZ2VfX3Rvb2xiYXJcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImdlby10YWJsZS10b29sYmFyLFtnZW9MaXN0VG9vbGJhcl1cIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnZW8tbGlzdC1wYWdlX19ib2R5XCI+XG4gICAgICA8bmctY29udGVudCAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, model, output, signal, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { FormsModule } from '@angular/forms';
|
|
3
|
+
import { GeoAlertComponent } from '../geo-alert/geo-alert.component';
|
|
4
|
+
import { GeoButtonComponent } from '../geo-button/geo-button.component';
|
|
5
|
+
import { GeoCheckboxComponent } from '../geo-checkbox/geo-checkbox.component';
|
|
6
|
+
import { GeoInputComponent } from '../geo-input/geo-input.component';
|
|
7
|
+
import { GeoTypographyComponent } from '../geo-typography/geo-typography.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
/**
|
|
11
|
+
* Login form (STT 35 — đăng nhập).
|
|
12
|
+
*
|
|
13
|
+
* @summary Form đăng nhập: tài khoản, mật khẩu, mã kiểm tra, ghi nhớ.
|
|
14
|
+
* @whenToUse Màn Đăng nhập chuyên viên.
|
|
15
|
+
* @doNotUseWhen SSO-only flows without local credentials.
|
|
16
|
+
*/
|
|
17
|
+
export class GeoLoginComponent {
|
|
18
|
+
title = input('Đăng nhập hệ thống');
|
|
19
|
+
subtitle = input('Cổng tra cứu thông tin đất đai');
|
|
20
|
+
captchaHint = input('Nhập mã kiểm tra hiển thị bên cạnh');
|
|
21
|
+
loading = input(false);
|
|
22
|
+
errorMessage = input('');
|
|
23
|
+
showForgotPassword = input(true);
|
|
24
|
+
username = model('');
|
|
25
|
+
password = model('');
|
|
26
|
+
captcha = model('');
|
|
27
|
+
remember = model(false);
|
|
28
|
+
submitLogin = output();
|
|
29
|
+
forgotPassword = output();
|
|
30
|
+
submitted = signal(false);
|
|
31
|
+
submit() {
|
|
32
|
+
this.submitted.set(true);
|
|
33
|
+
const payload = {
|
|
34
|
+
username: this.username().trim(),
|
|
35
|
+
password: this.password(),
|
|
36
|
+
captcha: this.captcha().trim(),
|
|
37
|
+
remember: this.remember(),
|
|
38
|
+
};
|
|
39
|
+
if (!payload.username || !payload.password || !payload.captcha) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.submitLogin.emit(payload);
|
|
43
|
+
}
|
|
44
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
45
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoLoginComponent, isStandalone: true, selector: "geo-login", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, captchaHint: { classPropertyName: "captchaHint", publicName: "captchaHint", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, showForgotPassword: { classPropertyName: "showForgotPassword", publicName: "showForgotPassword", isSignal: true, isRequired: false, transformFunction: null }, username: { classPropertyName: "username", publicName: "username", isSignal: true, isRequired: false, transformFunction: null }, password: { classPropertyName: "password", publicName: "password", isSignal: true, isRequired: false, transformFunction: null }, captcha: { classPropertyName: "captcha", publicName: "captcha", isSignal: true, isRequired: false, transformFunction: null }, remember: { classPropertyName: "remember", publicName: "remember", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { username: "usernameChange", password: "passwordChange", captcha: "captchaChange", remember: "rememberChange", submitLogin: "submitLogin", forgotPassword: "forgotPassword" }, host: { classAttribute: "geo-login-host" }, ngImport: i0, template: "<section class=\"geo-login\" aria-label=\"\u0110\u0103ng nh\u1EADp\">\n <header class=\"geo-login__header\">\n <geo-typography variant=\"h3\">{{ title() }}</geo-typography>\n @if (subtitle()) {\n <geo-typography variant=\"body\" color=\"secondary\">{{ subtitle() }}</geo-typography>\n }\n </header>\n\n @if (errorMessage()) {\n <geo-alert\n type=\"error\"\n title=\"\u0110\u0103ng nh\u1EADp th\u1EA5t b\u1EA1i\"\n [message]=\"errorMessage()\"\n [closable]=\"false\"\n />\n }\n\n <form class=\"geo-login__form\" (ngSubmit)=\"submit()\">\n <geo-input\n label=\"T\u00EAn \u0111\u0103ng nh\u1EADp\"\n placeholder=\"Nh\u1EADp t\u00EAn \u0111\u0103ng nh\u1EADp\"\n [required]=\"true\"\n [block]=\"true\"\n [error]=\"submitted() && !username().trim()\"\n errorMessage=\"Vui l\u00F2ng nh\u1EADp t\u00EAn \u0111\u0103ng nh\u1EADp\"\n [ngModel]=\"username()\"\n (ngModelChange)=\"username.set($event)\"\n name=\"username\"\n />\n <geo-input\n label=\"M\u1EADt kh\u1EA9u\"\n type=\"password\"\n placeholder=\"Nh\u1EADp m\u1EADt kh\u1EA9u\"\n [required]=\"true\"\n [block]=\"true\"\n [error]=\"submitted() && !password()\"\n errorMessage=\"Vui l\u00F2ng nh\u1EADp m\u1EADt kh\u1EA9u\"\n [ngModel]=\"password()\"\n (ngModelChange)=\"password.set($event)\"\n name=\"password\"\n />\n\n <div class=\"geo-login__captcha\">\n <geo-input\n label=\"M\u00E3 ki\u1EC3m tra\"\n placeholder=\"Nh\u1EADp m\u00E3 ki\u1EC3m tra\"\n [required]=\"true\"\n [block]=\"true\"\n [error]=\"submitted() && !captcha().trim()\"\n errorMessage=\"Vui l\u00F2ng nh\u1EADp m\u00E3 ki\u1EC3m tra\"\n [ngModel]=\"captcha()\"\n (ngModelChange)=\"captcha.set($event)\"\n name=\"captcha\"\n />\n <div class=\"geo-login__captcha-box\" aria-hidden=\"true\">\n <ng-content select=\"[geoCaptcha]\" />\n <span class=\"geo-login__captcha-fallback\">A7K2</span>\n </div>\n </div>\n @if (captchaHint()) {\n <p class=\"geo-login__hint\">{{ captchaHint() }}</p>\n }\n\n <div class=\"geo-login__row\">\n <geo-checkbox label=\"Ghi nh\u1EDB \u0111\u0103ng nh\u1EADp\" [(checked)]=\"remember\" />\n @if (showForgotPassword()) {\n <button\n type=\"button\"\n class=\"geo-login__link\"\n (click)=\"forgotPassword.emit()\"\n >\n Qu\u00EAn m\u1EADt kh\u1EA9u?\n </button>\n }\n </div>\n\n <geo-button appearance=\"primary\" type=\"submit\" [disabled]=\"loading()\">\n {{ loading() ? '\u0110ang \u0111\u0103ng nh\u1EADp\u2026' : '\u0110\u0103ng nh\u1EADp' }}\n </geo-button>\n </form>\n</section>\n", styles: ["@charset \"UTF-8\";.geo-login-host{display:block;max-width:420px}.geo-login{display:flex;flex-direction:column;gap:16px;padding:28px 24px;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated)}.geo-login__header{display:flex;flex-direction:column;gap:4px}.geo-login__form{display:flex;flex-direction:column;gap:14px}.geo-login__captcha{display:grid;grid-template-columns:1fr 112px;gap:12px;align-items:end}.geo-login__captcha-box{position:relative;display:flex;align-items:center;justify-content:center;height:40px;border:1px dashed var(--geo-color-border-default);border-radius:var(--geo-radius);background:var(--geo-color-neutral-50);overflow:hidden}.geo-login__captcha-fallback{font-family:ui-monospace,monospace;font-weight:700;letter-spacing:.2em;color:var(--geo-color-neutral-700);-webkit-user-select:none;user-select:none}.geo-login__hint{margin:-6px 0 0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-login__row{display:flex;align-items:center;justify-content:space-between;gap:12px}.geo-login__link{margin:0;padding:0;border:0;background:transparent;color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);cursor:pointer}.geo-login__link:hover{text-decoration:underline}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: GeoAlertComponent, selector: "geo-alert", inputs: ["type", "title", "message", "closable", "visible", "showIcon"], outputs: ["visibleChange", "closed"] }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoCheckboxComponent, selector: "geo-checkbox", inputs: ["label", "checked", "disabled", "indeterminate"], outputs: ["checkedChange"] }, { kind: "component", type: GeoInputComponent, selector: "geo-input", inputs: ["label", "placeholder", "type", "disabled", "readonly", "required", "error", "errorMessage", "maxlength", "prefixIcon", "suffixIcon", "allowClear", "block", "width"], outputs: ["valueChange", "enterPressed"] }, { kind: "component", type: GeoTypographyComponent, selector: "geo-typography", inputs: ["variant", "color", "strong", "underline", "delete", "mark", "code", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLoginComponent, decorators: [{
|
|
48
|
+
type: Component,
|
|
49
|
+
args: [{ selector: 'geo-login', standalone: true, imports: [
|
|
50
|
+
FormsModule,
|
|
51
|
+
GeoAlertComponent,
|
|
52
|
+
GeoButtonComponent,
|
|
53
|
+
GeoCheckboxComponent,
|
|
54
|
+
GeoInputComponent,
|
|
55
|
+
GeoTypographyComponent,
|
|
56
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-login-host' }, template: "<section class=\"geo-login\" aria-label=\"\u0110\u0103ng nh\u1EADp\">\n <header class=\"geo-login__header\">\n <geo-typography variant=\"h3\">{{ title() }}</geo-typography>\n @if (subtitle()) {\n <geo-typography variant=\"body\" color=\"secondary\">{{ subtitle() }}</geo-typography>\n }\n </header>\n\n @if (errorMessage()) {\n <geo-alert\n type=\"error\"\n title=\"\u0110\u0103ng nh\u1EADp th\u1EA5t b\u1EA1i\"\n [message]=\"errorMessage()\"\n [closable]=\"false\"\n />\n }\n\n <form class=\"geo-login__form\" (ngSubmit)=\"submit()\">\n <geo-input\n label=\"T\u00EAn \u0111\u0103ng nh\u1EADp\"\n placeholder=\"Nh\u1EADp t\u00EAn \u0111\u0103ng nh\u1EADp\"\n [required]=\"true\"\n [block]=\"true\"\n [error]=\"submitted() && !username().trim()\"\n errorMessage=\"Vui l\u00F2ng nh\u1EADp t\u00EAn \u0111\u0103ng nh\u1EADp\"\n [ngModel]=\"username()\"\n (ngModelChange)=\"username.set($event)\"\n name=\"username\"\n />\n <geo-input\n label=\"M\u1EADt kh\u1EA9u\"\n type=\"password\"\n placeholder=\"Nh\u1EADp m\u1EADt kh\u1EA9u\"\n [required]=\"true\"\n [block]=\"true\"\n [error]=\"submitted() && !password()\"\n errorMessage=\"Vui l\u00F2ng nh\u1EADp m\u1EADt kh\u1EA9u\"\n [ngModel]=\"password()\"\n (ngModelChange)=\"password.set($event)\"\n name=\"password\"\n />\n\n <div class=\"geo-login__captcha\">\n <geo-input\n label=\"M\u00E3 ki\u1EC3m tra\"\n placeholder=\"Nh\u1EADp m\u00E3 ki\u1EC3m tra\"\n [required]=\"true\"\n [block]=\"true\"\n [error]=\"submitted() && !captcha().trim()\"\n errorMessage=\"Vui l\u00F2ng nh\u1EADp m\u00E3 ki\u1EC3m tra\"\n [ngModel]=\"captcha()\"\n (ngModelChange)=\"captcha.set($event)\"\n name=\"captcha\"\n />\n <div class=\"geo-login__captcha-box\" aria-hidden=\"true\">\n <ng-content select=\"[geoCaptcha]\" />\n <span class=\"geo-login__captcha-fallback\">A7K2</span>\n </div>\n </div>\n @if (captchaHint()) {\n <p class=\"geo-login__hint\">{{ captchaHint() }}</p>\n }\n\n <div class=\"geo-login__row\">\n <geo-checkbox label=\"Ghi nh\u1EDB \u0111\u0103ng nh\u1EADp\" [(checked)]=\"remember\" />\n @if (showForgotPassword()) {\n <button\n type=\"button\"\n class=\"geo-login__link\"\n (click)=\"forgotPassword.emit()\"\n >\n Qu\u00EAn m\u1EADt kh\u1EA9u?\n </button>\n }\n </div>\n\n <geo-button appearance=\"primary\" type=\"submit\" [disabled]=\"loading()\">\n {{ loading() ? '\u0110ang \u0111\u0103ng nh\u1EADp\u2026' : '\u0110\u0103ng nh\u1EADp' }}\n </geo-button>\n </form>\n</section>\n", styles: ["@charset \"UTF-8\";.geo-login-host{display:block;max-width:420px}.geo-login{display:flex;flex-direction:column;gap:16px;padding:28px 24px;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated)}.geo-login__header{display:flex;flex-direction:column;gap:4px}.geo-login__form{display:flex;flex-direction:column;gap:14px}.geo-login__captcha{display:grid;grid-template-columns:1fr 112px;gap:12px;align-items:end}.geo-login__captcha-box{position:relative;display:flex;align-items:center;justify-content:center;height:40px;border:1px dashed var(--geo-color-border-default);border-radius:var(--geo-radius);background:var(--geo-color-neutral-50);overflow:hidden}.geo-login__captcha-fallback{font-family:ui-monospace,monospace;font-weight:700;letter-spacing:.2em;color:var(--geo-color-neutral-700);-webkit-user-select:none;user-select:none}.geo-login__hint{margin:-6px 0 0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-login__row{display:flex;align-items:center;justify-content:space-between;gap:12px}.geo-login__link{margin:0;padding:0;border:0;background:transparent;color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);cursor:pointer}.geo-login__link:hover{text-decoration:underline}\n"] }]
|
|
57
|
+
}] });
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLWxvZ2luLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dlby11aS9zcmMvbGliL2ZpZ21hL2dlby1sb2dpbi9nZW8tbG9naW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLWxvZ2luL2dlby1sb2dpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7O0FBR3BGOzs7Ozs7R0FNRztBQWtCSCxNQUFNLE9BQU8saUJBQWlCO0lBQ25CLEtBQUssR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNwQyxRQUFRLEdBQUcsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsV0FBVyxHQUFHLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQzFELE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsWUFBWSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixrQkFBa0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakMsUUFBUSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQixRQUFRLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4QixXQUFXLEdBQUcsTUFBTSxFQUFtQixDQUFDO0lBQ3hDLGNBQWMsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUVoQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRW5DLE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixNQUFNLE9BQU8sR0FBb0I7WUFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDaEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7U0FDMUIsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7d0dBOUJVLGlCQUFpQjs0RkFBakIsaUJBQWlCLG9tREN6QzlCLHd1RkFpRkEsZzVDRHJESSxXQUFXLHEvQkFDWCxpQkFBaUIscUtBQ2pCLGtCQUFrQixzT0FDbEIsb0JBQW9CLGdKQUNwQixpQkFBaUIsZ1JBQ2pCLHNCQUFzQjs7NEZBUWIsaUJBQWlCO2tCQWpCN0IsU0FBUzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3dCQUNqQixzQkFBc0I7cUJBQ3ZCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBHZW9BbGVydENvbXBvbmVudCB9IGZyb20gJy4uL2dlby1hbGVydC9nZW8tYWxlcnQuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1idXR0b24vZ2VvLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tY2hlY2tib3gvZ2VvLWNoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2dlby1pbnB1dC9nZW8taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb1R5cG9ncmFwaHlDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tdHlwb2dyYXBoeS9nZW8tdHlwb2dyYXBoeS5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBHZW9Mb2dpblBheWxvYWQgfSBmcm9tICcuL2dlby1sb2dpbi50eXBlcyc7XG5cbi8qKlxuICogTG9naW4gZm9ybSAoU1RUIDM1IOKAlCDEkcSDbmcgbmjhuq1wKS5cbiAqXG4gKiBAc3VtbWFyeSBGb3JtIMSRxINuZyBuaOG6rXA6IHTDoGkga2hv4bqjbiwgbeG6rXQga2jhuql1LCBtw6Mga2nhu4NtIHRyYSwgZ2hpIG5o4bubLlxuICogQHdoZW5Ub1VzZSBNw6BuIMSQxINuZyBuaOG6rXAgY2h1ecOqbiB2acOqbi5cbiAqIEBkb05vdFVzZVdoZW4gU1NPLW9ubHkgZmxvd3Mgd2l0aG91dCBsb2NhbCBjcmVkZW50aWFscy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ2VvLWxvZ2luJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIEdlb0FsZXJ0Q29tcG9uZW50LFxuICAgIEdlb0J1dHRvbkNvbXBvbmVudCxcbiAgICBHZW9DaGVja2JveENvbXBvbmVudCxcbiAgICBHZW9JbnB1dENvbXBvbmVudCxcbiAgICBHZW9UeXBvZ3JhcGh5Q29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VvLWxvZ2luLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2dlby1sb2dpbi5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7IGNsYXNzOiAnZ2VvLWxvZ2luLWhvc3QnIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb0xvZ2luQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dCgnxJDEg25nIG5o4bqtcCBo4buHIHRo4buRbmcnKTtcbiAgcmVhZG9ubHkgc3VidGl0bGUgPSBpbnB1dCgnQ+G7lW5nIHRyYSBj4bupdSB0aMO0bmcgdGluIMSR4bqldCDEkWFpJyk7XG4gIHJlYWRvbmx5IGNhcHRjaGFIaW50ID0gaW5wdXQoJ05o4bqtcCBtw6Mga2nhu4NtIHRyYSBoaeG7g24gdGjhu4sgYsOqbiBj4bqhbmgnKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IGlucHV0KGZhbHNlKTtcbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gaW5wdXQoJycpO1xuICByZWFkb25seSBzaG93Rm9yZ290UGFzc3dvcmQgPSBpbnB1dCh0cnVlKTtcblxuICByZWFkb25seSB1c2VybmFtZSA9IG1vZGVsKCcnKTtcbiAgcmVhZG9ubHkgcGFzc3dvcmQgPSBtb2RlbCgnJyk7XG4gIHJlYWRvbmx5IGNhcHRjaGEgPSBtb2RlbCgnJyk7XG4gIHJlYWRvbmx5IHJlbWVtYmVyID0gbW9kZWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IHN1Ym1pdExvZ2luID0gb3V0cHV0PEdlb0xvZ2luUGF5bG9hZD4oKTtcbiAgcmVhZG9ubHkgZm9yZ290UGFzc3dvcmQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBzdWJtaXR0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Ym1pdHRlZC5zZXQodHJ1ZSk7XG4gICAgY29uc3QgcGF5bG9hZDogR2VvTG9naW5QYXlsb2FkID0ge1xuICAgICAgdXNlcm5hbWU6IHRoaXMudXNlcm5hbWUoKS50cmltKCksXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCgpLFxuICAgICAgY2FwdGNoYTogdGhpcy5jYXB0Y2hhKCkudHJpbSgpLFxuICAgICAgcmVtZW1iZXI6IHRoaXMucmVtZW1iZXIoKSxcbiAgICB9O1xuICAgIGlmICghcGF5bG9hZC51c2VybmFtZSB8fCAhcGF5bG9hZC5wYXNzd29yZCB8fCAhcGF5bG9hZC5jYXB0Y2hhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3VibWl0TG9naW4uZW1pdChwYXlsb2FkKTtcbiAgfVxufVxuIiwiPHNlY3Rpb24gY2xhc3M9XCJnZW8tbG9naW5cIiBhcmlhLWxhYmVsPVwixJDEg25nIG5o4bqtcFwiPlxuICA8aGVhZGVyIGNsYXNzPVwiZ2VvLWxvZ2luX19oZWFkZXJcIj5cbiAgICA8Z2VvLXR5cG9ncmFwaHkgdmFyaWFudD1cImgzXCI+e3sgdGl0bGUoKSB9fTwvZ2VvLXR5cG9ncmFwaHk+XG4gICAgQGlmIChzdWJ0aXRsZSgpKSB7XG4gICAgICA8Z2VvLXR5cG9ncmFwaHkgdmFyaWFudD1cImJvZHlcIiBjb2xvcj1cInNlY29uZGFyeVwiPnt7IHN1YnRpdGxlKCkgfX08L2dlby10eXBvZ3JhcGh5PlxuICAgIH1cbiAgPC9oZWFkZXI+XG5cbiAgQGlmIChlcnJvck1lc3NhZ2UoKSkge1xuICAgIDxnZW8tYWxlcnRcbiAgICAgIHR5cGU9XCJlcnJvclwiXG4gICAgICB0aXRsZT1cIsSQxINuZyBuaOG6rXAgdGjhuqV0IGLhuqFpXCJcbiAgICAgIFttZXNzYWdlXT1cImVycm9yTWVzc2FnZSgpXCJcbiAgICAgIFtjbG9zYWJsZV09XCJmYWxzZVwiXG4gICAgLz5cbiAgfVxuXG4gIDxmb3JtIGNsYXNzPVwiZ2VvLWxvZ2luX19mb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgPGdlby1pbnB1dFxuICAgICAgbGFiZWw9XCJUw6puIMSRxINuZyBuaOG6rXBcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJOaOG6rXAgdMOqbiDEkcSDbmcgbmjhuq1wXCJcbiAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgIFtibG9ja109XCJ0cnVlXCJcbiAgICAgIFtlcnJvcl09XCJzdWJtaXR0ZWQoKSAmJiAhdXNlcm5hbWUoKS50cmltKClcIlxuICAgICAgZXJyb3JNZXNzYWdlPVwiVnVpIGzDsm5nIG5o4bqtcCB0w6puIMSRxINuZyBuaOG6rXBcIlxuICAgICAgW25nTW9kZWxdPVwidXNlcm5hbWUoKVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJ1c2VybmFtZS5zZXQoJGV2ZW50KVwiXG4gICAgICBuYW1lPVwidXNlcm5hbWVcIlxuICAgIC8+XG4gICAgPGdlby1pbnB1dFxuICAgICAgbGFiZWw9XCJN4bqtdCBraOG6qXVcIlxuICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiTmjhuq1wIG3huq10IGto4bqpdVwiXG4gICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICBbYmxvY2tdPVwidHJ1ZVwiXG4gICAgICBbZXJyb3JdPVwic3VibWl0dGVkKCkgJiYgIXBhc3N3b3JkKClcIlxuICAgICAgZXJyb3JNZXNzYWdlPVwiVnVpIGzDsm5nIG5o4bqtcCBt4bqtdCBraOG6qXVcIlxuICAgICAgW25nTW9kZWxdPVwicGFzc3dvcmQoKVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXNzd29yZC5zZXQoJGV2ZW50KVwiXG4gICAgICBuYW1lPVwicGFzc3dvcmRcIlxuICAgIC8+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxvZ2luX19jYXB0Y2hhXCI+XG4gICAgICA8Z2VvLWlucHV0XG4gICAgICAgIGxhYmVsPVwiTcOjIGtp4buDbSB0cmFcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIk5o4bqtcCBtw6Mga2nhu4NtIHRyYVwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgW2Jsb2NrXT1cInRydWVcIlxuICAgICAgICBbZXJyb3JdPVwic3VibWl0dGVkKCkgJiYgIWNhcHRjaGEoKS50cmltKClcIlxuICAgICAgICBlcnJvck1lc3NhZ2U9XCJWdWkgbMOybmcgbmjhuq1wIG3DoyBraeG7g20gdHJhXCJcbiAgICAgICAgW25nTW9kZWxdPVwiY2FwdGNoYSgpXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2FwdGNoYS5zZXQoJGV2ZW50KVwiXG4gICAgICAgIG5hbWU9XCJjYXB0Y2hhXCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxvZ2luX19jYXB0Y2hhLWJveFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZ2VvQ2FwdGNoYV1cIiAvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImdlby1sb2dpbl9fY2FwdGNoYS1mYWxsYmFja1wiPkE3SzI8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGNhcHRjaGFIaW50KCkpIHtcbiAgICAgIDxwIGNsYXNzPVwiZ2VvLWxvZ2luX19oaW50XCI+e3sgY2FwdGNoYUhpbnQoKSB9fTwvcD5cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLWxvZ2luX19yb3dcIj5cbiAgICAgIDxnZW8tY2hlY2tib3ggbGFiZWw9XCJHaGkgbmjhu5sgxJHEg25nIG5o4bqtcFwiIFsoY2hlY2tlZCldPVwicmVtZW1iZXJcIiAvPlxuICAgICAgQGlmIChzaG93Rm9yZ290UGFzc3dvcmQoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJnZW8tbG9naW5fX2xpbmtcIlxuICAgICAgICAgIChjbGljayk9XCJmb3Jnb3RQYXNzd29yZC5lbWl0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgUXXDqm4gbeG6rXQga2jhuql1P1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDxnZW8tYnV0dG9uIGFwcGVhcmFuY2U9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgIHt7IGxvYWRpbmcoKSA/ICfEkGFuZyDEkcSDbmcgbmjhuq1w4oCmJyA6ICfEkMSDbmcgbmjhuq1wJyB9fVxuICAgIDwvZ2VvLWJ1dHRvbj5cbiAgPC9mb3JtPlxuPC9zZWN0aW9uPlxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLWxvZ2luLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLWxvZ2luL2dlby1sb2dpbi50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBHZW9Mb2dpblBheWxvYWQge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBjYXB0Y2hhOiBzdHJpbmc7XG4gIHJlbWVtYmVyOiBib29sZWFuO1xufVxuIl19
|