@geoit/ui 0.0.2 → 0.0.5
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 +140 -17
- package/ai/AGENTS.md +43 -32
- package/ai/README.md +36 -2
- package/ai/catalog.json +5585 -437
- package/ai/components/geo-alert.md +75 -21
- package/ai/components/geo-back-button.md +64 -18
- package/ai/components/geo-breadcrumb.md +71 -12
- package/ai/components/geo-button.md +90 -27
- package/ai/components/geo-chart.md +103 -0
- package/ai/components/geo-checkbox.md +67 -20
- package/ai/components/geo-column-picker.md +91 -18
- package/ai/components/geo-confirm-modal.md +92 -27
- package/ai/components/geo-dashboard.md +91 -0
- package/ai/components/geo-date-picker.md +105 -29
- package/ai/components/geo-date-range-picker.md +101 -28
- 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 +99 -26
- package/ai/components/geo-forgot-password.md +78 -0
- package/ai/components/geo-form-modal.md +111 -44
- package/ai/components/geo-icon.md +70 -16
- package/ai/components/geo-input.md +94 -29
- 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 +72 -0
- package/ai/components/geo-login.md +94 -0
- package/ai/components/geo-map-admin-filter.md +80 -0
- package/ai/components/geo-map-basemap-switcher.md +75 -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 +79 -0
- package/ai/components/geo-map-search.md +83 -0
- package/ai/components/geo-map-shell.md +110 -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 +76 -0
- package/ai/components/geo-map-zoom.md +74 -0
- package/ai/components/geo-map.md +205 -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 +62 -16
- package/ai/components/geo-pagination.md +76 -24
- package/ai/components/geo-radio.md +110 -27
- package/ai/components/geo-row-actions.md +87 -19
- package/ai/components/geo-select.md +108 -28
- package/ai/components/geo-slider.md +70 -21
- package/ai/components/geo-stat-card.md +98 -0
- package/ai/components/geo-status-tag.md +67 -15
- package/ai/components/geo-step-form-layout.md +121 -38
- package/ai/components/geo-stepper.md +81 -19
- package/ai/components/geo-table-filter.md +90 -29
- package/ai/components/geo-table-pagination.md +70 -23
- package/ai/components/geo-table-toolbar.md +84 -29
- package/ai/components/geo-table.md +191 -59
- package/ai/components/geo-tabs.md +99 -27
- package/ai/components/geo-textarea.md +84 -23
- package/ai/components/geo-toast.md +138 -27
- package/ai/components/geo-tree.md +94 -22
- package/ai/components/geo-typography.md +70 -19
- package/ai/components/geo-upload.md +109 -39
- package/ai/mockup.html +1194 -0
- package/ai/recipes.md +132 -47
- 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,93 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output, signal, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
|
|
3
|
+
import { GeoIconComponent } from '../../../geo-icon/geo-icon.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "ng-zorro-antd/tooltip";
|
|
6
|
+
/**
|
|
7
|
+
* Export current map view as PNG download.
|
|
8
|
+
*
|
|
9
|
+
* @summary Export current map view as PNG download.
|
|
10
|
+
* @whenToUse Chụp ảnh bản đồ.
|
|
11
|
+
* @doNotUseWhen Server-side print/PDF pipelines.
|
|
12
|
+
*/
|
|
13
|
+
export class GeoMapSnapshotComponent {
|
|
14
|
+
controller = input(null);
|
|
15
|
+
label = input('Chụp ảnh bản đồ');
|
|
16
|
+
filename = input('ban-do.png');
|
|
17
|
+
captured = output();
|
|
18
|
+
captureError = output();
|
|
19
|
+
busy = signal(false);
|
|
20
|
+
/** Public so shell/toolbar can trigger capture without a visible button. */
|
|
21
|
+
capture() {
|
|
22
|
+
const map = this.controller()?.getMap();
|
|
23
|
+
if (!map || this.busy()) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.busy.set(true);
|
|
27
|
+
map.once('rendercomplete', () => {
|
|
28
|
+
try {
|
|
29
|
+
const mapCanvas = document.createElement('canvas');
|
|
30
|
+
const size = map.getSize();
|
|
31
|
+
if (!size) {
|
|
32
|
+
throw new Error('Map size unavailable');
|
|
33
|
+
}
|
|
34
|
+
mapCanvas.width = size[0];
|
|
35
|
+
mapCanvas.height = size[1];
|
|
36
|
+
const ctx = mapCanvas.getContext('2d');
|
|
37
|
+
if (!ctx) {
|
|
38
|
+
throw new Error('Canvas 2D unavailable');
|
|
39
|
+
}
|
|
40
|
+
const layers = map
|
|
41
|
+
.getViewport()
|
|
42
|
+
.querySelectorAll('.ol-layer canvas, canvas.ol-layer');
|
|
43
|
+
layers.forEach((canvas) => {
|
|
44
|
+
const el = canvas;
|
|
45
|
+
if (el.width > 0) {
|
|
46
|
+
const opacity = Number(el.parentElement?.style.opacity || '1');
|
|
47
|
+
ctx.globalAlpha = Number.isFinite(opacity) ? opacity : 1;
|
|
48
|
+
const transform = el.style.transform;
|
|
49
|
+
const matrix = transform
|
|
50
|
+
.match(/^matrix\(([^)]*)\)$/)?.[1]
|
|
51
|
+
?.split(',')
|
|
52
|
+
.map(Number);
|
|
53
|
+
if (matrix && matrix.length === 6) {
|
|
54
|
+
ctx.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
58
|
+
}
|
|
59
|
+
ctx.drawImage(el, 0, 0);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
63
|
+
ctx.globalAlpha = 1;
|
|
64
|
+
mapCanvas.toBlob((blob) => {
|
|
65
|
+
this.busy.set(false);
|
|
66
|
+
if (!blob) {
|
|
67
|
+
this.captureError.emit(new Error('Không tạo được ảnh PNG.'));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const url = URL.createObjectURL(blob);
|
|
71
|
+
const anchor = document.createElement('a');
|
|
72
|
+
anchor.href = url;
|
|
73
|
+
anchor.download = this.filename();
|
|
74
|
+
anchor.click();
|
|
75
|
+
URL.revokeObjectURL(url);
|
|
76
|
+
this.captured.emit();
|
|
77
|
+
}, 'image/png');
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
this.busy.set(false);
|
|
81
|
+
this.captureError.emit(err);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
map.renderSync();
|
|
85
|
+
}
|
|
86
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSnapshotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
87
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoMapSnapshotComponent, isStandalone: true, selector: "geo-map-snapshot", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, filename: { classPropertyName: "filename", publicName: "filename", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { captured: "captured", captureError: "captureError" }, host: { classAttribute: "geo-map-snapshot-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-snapshot__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"capture()\"\n>\n <geo-icon type=\"camera\" size=\"md\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-snapshot-host{display:block}.geo-map-snapshot__btn{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-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-snapshot__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn:active:not(:disabled){transform:scale(.98)}.geo-map-snapshot__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-snapshot__btn--active,.geo-map-snapshot__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn--icon-only{width:40px;padding:0}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
88
|
+
}
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSnapshotComponent, decorators: [{
|
|
90
|
+
type: Component,
|
|
91
|
+
args: [{ selector: 'geo-map-snapshot', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-snapshot-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-snapshot__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"capture()\"\n>\n <geo-icon type=\"camera\" size=\"md\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-snapshot-host{display:block}.geo-map-snapshot__btn{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-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-snapshot__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn:active:not(:disabled){transform:scale(.98)}.geo-map-snapshot__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-snapshot__btn--active,.geo-map-snapshot__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn--icon-only{width:40px;padding:0}\n"] }]
|
|
92
|
+
}] });
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1zbmFwc2hvdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tbWFwL2Nocm9tZS9nZW8tbWFwLXNuYXBzaG90L2dlby1tYXAtc25hcHNob3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1zbmFwc2hvdC9nZW8tbWFwLXNuYXBzaG90LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7OztBQUd4RTs7Ozs7O0dBTUc7QUFXSCxNQUFNLE9BQU8sdUJBQXVCO0lBQ3pCLFVBQVUsR0FBRyxLQUFLLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQ2xELEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNqQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRS9CLFFBQVEsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUMxQixZQUFZLEdBQUcsTUFBTSxFQUFXLENBQUM7SUFFakMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5Qiw0RUFBNEU7SUFDNUUsT0FBTztRQUNMLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBRyxJ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QUUsZUFBZSxDQUFDLG1CQUczQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOelRvb2xUaXBNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL3Rvb2x0aXAnO1xuaW1wb3J0IHsgR2VvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlby1pY29uL2dlby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vZ2VvLW1hcC5jb250cm9sbGVyJztcblxuLyoqXG4gKiBFeHBvcnQgY3VycmVudCBtYXAgdmlldyBhcyBQTkcgZG93bmxvYWQuXG4gKlxuICogQHN1bW1hcnkgRXhwb3J0IGN1cnJlbnQgbWFwIHZpZXcgYXMgUE5HIGRvd25sb2FkLlxuICogQHdoZW5Ub1VzZSBDaOG7pXAg4bqjbmggYuG6o24gxJHhu5MuXG4gKiBAZG9Ob3RVc2VXaGVuIFNlcnZlci1zaWRlIHByaW50L1BERiBwaXBlbGluZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dlby1tYXAtc25hcHNob3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbR2VvSWNvbkNvbXBvbmVudCwgTnpUb29sVGlwTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAtc25hcHNob3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VvLW1hcC1zbmFwc2hvdC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7IGNsYXNzOiAnZ2VvLW1hcC1zbmFwc2hvdC1ob3N0JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBHZW9NYXBTbmFwc2hvdENvbXBvbmVudCB7XG4gIHJlYWRvbmx5IGNvbnRyb2xsZXIgPSBpbnB1dDxHZW9NYXBDb250cm9sbGVyIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGxhYmVsID0gaW5wdXQoJ0No4bulcCDhuqNuaCBi4bqjbiDEkeG7kycpO1xuICByZWFkb25seSBmaWxlbmFtZSA9IGlucHV0KCdiYW4tZG8ucG5nJyk7XG5cbiAgcmVhZG9ubHkgY2FwdHVyZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgY2FwdHVyZUVycm9yID0gb3V0cHV0PHVua25vd24+KCk7XG5cbiAgcmVhZG9ubHkgYnVzeSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLyoqIFB1YmxpYyBzbyBzaGVsbC90b29sYmFyIGNhbiB0cmlnZ2VyIGNhcHR1cmUgd2l0aG91dCBhIHZpc2libGUgYnV0dG9uLiAqL1xuICBjYXB0dXJlKCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuY29udHJvbGxlcigpPy5nZXRNYXAoKTtcbiAgICBpZiAoIW1hcCB8fCB0aGlzLmJ1c3koKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgbWFwLm9uY2UoJ3JlbmRlcmNvbXBsZXRlJywgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFwQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBtYXAuZ2V0U2l6ZSgpO1xuICAgICAgICBpZiAoIXNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hcCBzaXplIHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgbWFwQ2FudmFzLndpZHRoID0gc2l6ZVswXTtcbiAgICAgICAgbWFwQ2FudmFzLmhlaWdodCA9IHNpemVbMV07XG4gICAgICAgIGNvbnN0IGN0eCA9IG1hcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FudmFzIDJEIHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXllcnMgPSBtYXBcbiAgICAgICAgICAuZ2V0Vmlld3BvcnQoKVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcub2wtbGF5ZXIgY2FudmFzLCBjYW52YXMub2wtbGF5ZXInKTtcbiAgICAgICAgbGF5ZXJzLmZvckVhY2goKGNhbnZhcykgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsID0gY2FudmFzIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgICAgICAgIGlmIChlbC53aWR0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9wYWNpdHkgPSBOdW1iZXIoZWwucGFyZW50RWxlbWVudD8uc3R5bGUub3BhY2l0eSB8fCAnMScpO1xuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gTnVtYmVyLmlzRmluaXRlKG9wYWNpdHkpID8gb3BhY2l0eSA6IDE7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBlbC5zdHlsZS50cmFuc2Zvcm07XG4gICAgICAgICAgICBjb25zdCBtYXRyaXggPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgLm1hdGNoKC9ebWF0cml4XFwoKFteKV0qKVxcKSQvKT8uWzFdXG4gICAgICAgICAgICAgID8uc3BsaXQoJywnKVxuICAgICAgICAgICAgICAubWFwKE51bWJlcik7XG4gICAgICAgICAgICBpZiAobWF0cml4ICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgICAgY3R4LnNldFRyYW5zZm9ybShcbiAgICAgICAgICAgICAgICBtYXRyaXhbMF0sXG4gICAgICAgICAgICAgICAgbWF0cml4WzFdLFxuICAgICAgICAgICAgICAgIG1hdHJpeFsyXSxcbiAgICAgICAgICAgICAgICBtYXRyaXhbM10sXG4gICAgICAgICAgICAgICAgbWF0cml4WzRdLFxuICAgICAgICAgICAgICAgIG1hdHJpeFs1XSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKGVsLCAwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICAgIG1hcENhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICAgICAgICBpZiAoIWJsb2IpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwdHVyZUVycm9yLmVtaXQobmV3IEVycm9yKCdLaMO0bmcgdOG6oW8gxJHGsOG7o2Mg4bqjbmggUE5HLicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICBjb25zdCBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgYW5jaG9yLmhyZWYgPSB1cmw7XG4gICAgICAgICAgYW5jaG9yLmRvd25sb2FkID0gdGhpcy5maWxlbmFtZSgpO1xuICAgICAgICAgIGFuY2hvci5jbGljaygpO1xuICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICB0aGlzLmNhcHR1cmVkLmVtaXQoKTtcbiAgICAgICAgfSwgJ2ltYWdlL3BuZycpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmNhcHR1cmVFcnJvci5lbWl0KGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbWFwLnJlbmRlclN5bmMoKTtcbiAgfVxufVxuIiwiPGJ1dHRvblxuICB0eXBlPVwiYnV0dG9uXCJcbiAgY2xhc3M9XCJnZW8tbWFwLXNuYXBzaG90X19idG5cIlxuICBbbnotdG9vbHRpcF09XCJsYWJlbCgpXCJcbiAgbnpUb29sdGlwUGxhY2VtZW50PVwibGVmdFwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWwoKVwiXG4gIFtkaXNhYmxlZF09XCIhY29udHJvbGxlcigpIHx8IGJ1c3koKVwiXG4gIChjbGljayk9XCJjYXB0dXJlKClcIlxuPlxuICA8Z2VvLWljb24gdHlwZT1cImNhbWVyYVwiIHNpemU9XCJtZFwiIC8+XG48L2J1dHRvbj5cbiJdfQ==
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, model, signal, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { unByKey } from 'ol/Observable';
|
|
3
|
+
import { GEO_MAP_BASEMAP_LAYER_ID } from '../../geo-map.constants';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Swipe compare between basemap and the top visible thematic overlay.
|
|
7
|
+
*
|
|
8
|
+
* @summary Layer swipe compare control.
|
|
9
|
+
* @whenToUse So sánh chồng xếp trực quan (UC-17 UX).
|
|
10
|
+
* @doNotUseWhen Full geometry intersection analysis — use analysis tools.
|
|
11
|
+
*/
|
|
12
|
+
export class GeoMapSwipeComponent {
|
|
13
|
+
destroyRef = inject(DestroyRef);
|
|
14
|
+
controller = input(null);
|
|
15
|
+
/** When true, swipe mode is on. */
|
|
16
|
+
active = model(false);
|
|
17
|
+
/** 0–100, left portion shows clipped overlay. */
|
|
18
|
+
position = model(50);
|
|
19
|
+
/** Optional explicit overlay layer id; defaults to top visible non-basemap. */
|
|
20
|
+
layerId = input(null);
|
|
21
|
+
dragging = signal(false);
|
|
22
|
+
keys = [];
|
|
23
|
+
boundLayer = null;
|
|
24
|
+
constructor() {
|
|
25
|
+
effect(() => {
|
|
26
|
+
const active = this.active();
|
|
27
|
+
const ctrl = this.controller();
|
|
28
|
+
const pos = this.position();
|
|
29
|
+
const layerId = this.layerId();
|
|
30
|
+
this.teardownClip();
|
|
31
|
+
if (!active || !ctrl) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.attachClip(ctrl, pos, layerId);
|
|
35
|
+
});
|
|
36
|
+
this.destroyRef.onDestroy(() => this.teardownClip());
|
|
37
|
+
}
|
|
38
|
+
ngOnDestroy() {
|
|
39
|
+
this.teardownClip();
|
|
40
|
+
}
|
|
41
|
+
onPointerDown(event) {
|
|
42
|
+
if (!this.active()) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.dragging.set(true);
|
|
46
|
+
event.target.setPointerCapture?.(event.pointerId);
|
|
47
|
+
this.updateFromEvent(event);
|
|
48
|
+
}
|
|
49
|
+
onPointerMove(event) {
|
|
50
|
+
if (!this.dragging()) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.updateFromEvent(event);
|
|
54
|
+
}
|
|
55
|
+
onPointerUp() {
|
|
56
|
+
this.dragging.set(false);
|
|
57
|
+
}
|
|
58
|
+
updateFromEvent(event) {
|
|
59
|
+
const host = event.currentTarget.closest('.geo-map-swipe');
|
|
60
|
+
if (!host) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const rect = host.getBoundingClientRect();
|
|
64
|
+
const ratio = Math.min(100, Math.max(0, ((event.clientX - rect.left) / rect.width) * 100));
|
|
65
|
+
this.position.set(ratio);
|
|
66
|
+
this.controller()?.getMap()?.render();
|
|
67
|
+
}
|
|
68
|
+
attachClip(ctrl, pos, preferredId) {
|
|
69
|
+
const map = ctrl.getMap();
|
|
70
|
+
if (!map) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const managed = ctrl.getLayers();
|
|
74
|
+
const overlay = (preferredId
|
|
75
|
+
? managed.find((item) => item.id === preferredId)
|
|
76
|
+
: undefined) ??
|
|
77
|
+
[...managed]
|
|
78
|
+
.filter((item) => item.id !== GEO_MAP_BASEMAP_LAYER_ID &&
|
|
79
|
+
!item.config.basemap &&
|
|
80
|
+
(item.config.visible ?? true))
|
|
81
|
+
.sort((a, b) => (b.config.zIndex ?? 0) - (a.config.zIndex ?? 0))[0];
|
|
82
|
+
if (!overlay) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.boundLayer = overlay.layer;
|
|
86
|
+
const layer = overlay.layer;
|
|
87
|
+
const prerender = (event) => {
|
|
88
|
+
const ctx = event.context;
|
|
89
|
+
const size = map.getSize();
|
|
90
|
+
if (!ctx || !size) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const width = (size[0] * this.position()) / 100;
|
|
94
|
+
ctx.save();
|
|
95
|
+
ctx.beginPath();
|
|
96
|
+
ctx.rect(0, 0, width, size[1]);
|
|
97
|
+
ctx.clip();
|
|
98
|
+
};
|
|
99
|
+
const postrender = (event) => {
|
|
100
|
+
const ctx = event.context;
|
|
101
|
+
ctx?.restore();
|
|
102
|
+
};
|
|
103
|
+
this.keys = [
|
|
104
|
+
// OL Layer supports prerender/postrender; typings on BaseLayer are incomplete in some versions.
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
+
layer.on('prerender', prerender),
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
+
layer.on('postrender', postrender),
|
|
109
|
+
];
|
|
110
|
+
map.render();
|
|
111
|
+
void pos;
|
|
112
|
+
}
|
|
113
|
+
teardownClip() {
|
|
114
|
+
unByKey(this.keys);
|
|
115
|
+
this.keys = [];
|
|
116
|
+
this.boundLayer = null;
|
|
117
|
+
this.controller()?.getMap()?.render();
|
|
118
|
+
}
|
|
119
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSwipeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapSwipeComponent, isStandalone: true, selector: "geo-map-swipe", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, layerId: { classPropertyName: "layerId", publicName: "layerId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange", position: "positionChange" }, host: { properties: { "class.geo-map-swipe-host--active": "active()" }, classAttribute: "geo-map-swipe-host" }, ngImport: i0, template: "@if (active()) {\n <div\n class=\"geo-map-swipe\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp()\"\n (pointercancel)=\"onPointerUp()\"\n >\n <div\n class=\"geo-map-swipe__divider\"\n [style.left.%]=\"position()\"\n role=\"slider\"\n tabindex=\"0\"\n aria-label=\"V\u1ECB tr\u00ED so s\u00E1nh l\u1EDBp\"\n [attr.aria-valuenow]=\"position()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <span class=\"geo-map-swipe__handle\"></span>\n </div>\n <div class=\"geo-map-swipe__hint\">K\u00E9o \u0111\u1EC3 so s\u00E1nh l\u1EDBp ch\u1ED3ng x\u1EBFp</div>\n </div>\n}\n", styles: [".geo-map-swipe-host{display:contents}.geo-map-swipe{position:absolute;inset:0;z-index:4;cursor:ew-resize;touch-action:none;pointer-events:auto}.geo-map-swipe__divider{position:absolute;top:0;bottom:0;width:2px;transform:translate(-50%);background:var(--geo-color-primary-default);box-shadow:var(--geo-shadow-sm);pointer-events:none}.geo-map-swipe__handle{position:absolute;top:50%;left:50%;width:28px;height:28px;border-radius:var(--geo-radius-full, 999px);border:2px solid var(--geo-color-surface-elevated);background:var(--geo-color-primary-default);transform:translate(-50%,-50%);box-shadow:var(--geo-shadow-md)}.geo-map-swipe__hint{position:absolute;top:16px;left:50%;transform:translate(-50%);padding:6px 10px;border-radius:var(--geo-radius);background:color-mix(in srgb,var(--geo-color-neutral-900) 72%,transparent);color:var(--geo-color-neutral-white, #fff);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);pointer-events:none;white-space:nowrap}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
121
|
+
}
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSwipeComponent, decorators: [{
|
|
123
|
+
type: Component,
|
|
124
|
+
args: [{ selector: 'geo-map-swipe', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
125
|
+
class: 'geo-map-swipe-host',
|
|
126
|
+
'[class.geo-map-swipe-host--active]': 'active()',
|
|
127
|
+
}, template: "@if (active()) {\n <div\n class=\"geo-map-swipe\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp()\"\n (pointercancel)=\"onPointerUp()\"\n >\n <div\n class=\"geo-map-swipe__divider\"\n [style.left.%]=\"position()\"\n role=\"slider\"\n tabindex=\"0\"\n aria-label=\"V\u1ECB tr\u00ED so s\u00E1nh l\u1EDBp\"\n [attr.aria-valuenow]=\"position()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <span class=\"geo-map-swipe__handle\"></span>\n </div>\n <div class=\"geo-map-swipe__hint\">K\u00E9o \u0111\u1EC3 so s\u00E1nh l\u1EDBp ch\u1ED3ng x\u1EBFp</div>\n </div>\n}\n", styles: [".geo-map-swipe-host{display:contents}.geo-map-swipe{position:absolute;inset:0;z-index:4;cursor:ew-resize;touch-action:none;pointer-events:auto}.geo-map-swipe__divider{position:absolute;top:0;bottom:0;width:2px;transform:translate(-50%);background:var(--geo-color-primary-default);box-shadow:var(--geo-shadow-sm);pointer-events:none}.geo-map-swipe__handle{position:absolute;top:50%;left:50%;width:28px;height:28px;border-radius:var(--geo-radius-full, 999px);border:2px solid var(--geo-color-surface-elevated);background:var(--geo-color-primary-default);transform:translate(-50%,-50%);box-shadow:var(--geo-shadow-md)}.geo-map-swipe__hint{position:absolute;top:16px;left:50%;transform:translate(-50%);padding:6px 10px;border-radius:var(--geo-radius);background:color-mix(in srgb,var(--geo-color-neutral-900) 72%,transparent);color:var(--geo-color-neutral-white, #fff);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);pointer-events:none;white-space:nowrap}\n"] }]
|
|
128
|
+
}], ctorParameters: () => [] });
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1zd2lwZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tbWFwL2Nocm9tZS9nZW8tbWFwLXN3aXBlL2dlby1tYXAtc3dpcGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1zd2lwZS9nZW8tbWFwLXN3aXBlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQUVuRTs7Ozs7O0dBTUc7QUFjSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QyxVQUFVLEdBQUcsS0FBSyxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUMzRCxtQ0FBbUM7SUFDMUIsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixpREFBaUQ7SUFDeEMsUUFBUSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QiwrRUFBK0U7SUFDdEUsT0FBTyxHQUFHLEtBQUssQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFckMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQixJQUFJLEdBQWdCLEVBQUUsQ0FBQztJQUN2QixVQUFV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bnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgT25EZXN0cm95LFxuICBzaWduYWwsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIEJhc2VMYXllciBmcm9tICdvbC9sYXllci9CYXNlJztcbmltcG9ydCBMYXllciBmcm9tICdvbC9sYXllci9MYXllcic7XG5pbXBvcnQgdHlwZSBSZW5kZXJFdmVudCBmcm9tICdvbC9yZW5kZXIvRXZlbnQnO1xuaW1wb3J0IHsgdW5CeUtleSB9IGZyb20gJ29sL09ic2VydmFibGUnO1xuaW1wb3J0IHR5cGUgeyBFdmVudHNLZXkgfSBmcm9tICdvbC9ldmVudHMnO1xuaW1wb3J0IHsgR2VvTWFwQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2dlby1tYXAuY29udHJvbGxlcic7XG5pbXBvcnQgeyBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQgfSBmcm9tICcuLi8uLi9nZW8tbWFwLmNvbnN0YW50cyc7XG5cbi8qKlxuICogU3dpcGUgY29tcGFyZSBiZXR3ZWVuIGJhc2VtYXAgYW5kIHRoZSB0b3AgdmlzaWJsZSB0aGVtYXRpYyBvdmVybGF5LlxuICpcbiAqIEBzdW1tYXJ5IExheWVyIHN3aXBlIGNvbXBhcmUgY29udHJvbC5cbiAqIEB3aGVuVG9Vc2UgU28gc8OhbmggY2jhu5NuZyB44bq/cCB0cuG7sWMgcXVhbiAoVUMtMTcgVVgpLlxuICogQGRvTm90VXNlV2hlbiBGdWxsIGdlb21ldHJ5IGludGVyc2VjdGlvbiBhbmFseXNpcyDigJQgdXNlIGFuYWx5c2lzIHRvb2xzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnZW8tbWFwLXN3aXBlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW8tbWFwLXN3aXBlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2dlby1tYXAtc3dpcGUuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZ2VvLW1hcC1zd2lwZS1ob3N0JyxcbiAgICAnW2NsYXNzLmdlby1tYXAtc3dpcGUtaG9zdC0tYWN0aXZlXSc6ICdhY3RpdmUoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb01hcFN3aXBlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHJlYWRvbmx5IGNvbnRyb2xsZXIgPSBpbnB1dDxHZW9NYXBDb250cm9sbGVyIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBXaGVuIHRydWUsIHN3aXBlIG1vZGUgaXMgb24uICovXG4gIHJlYWRvbmx5IGFjdGl2ZSA9IG1vZGVsKGZhbHNlKTtcbiAgLyoqIDDigJMxMDAsIGxlZnQgcG9ydGlvbiBzaG93cyBjbGlwcGVkIG92ZXJsYXkuICovXG4gIHJlYWRvbmx5IHBvc2l0aW9uID0gbW9kZWwoNTApO1xuICAvKiogT3B0aW9uYWwgZXhwbGljaXQgb3ZlcmxheSBsYXllciBpZDsgZGVmYXVsdHMgdG8gdG9wIHZpc2libGUgbm9uLWJhc2VtYXAuICovXG4gIHJlYWRvbmx5IGxheWVySWQgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBkcmFnZ2luZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJpdmF0ZSBrZXlzOiBFdmVudHNLZXlbXSA9IFtdO1xuICBwcml2YXRlIGJvdW5kTGF5ZXI6IEJhc2VMYXllciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZSgpO1xuICAgICAgY29uc3QgY3RybCA9IHRoaXMuY29udHJvbGxlcigpO1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5wb3NpdGlvbigpO1xuICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMubGF5ZXJJZCgpO1xuICAgICAgdGhpcy50ZWFyZG93bkNsaXAoKTtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFjdHJsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXR0YWNoQ2xpcChjdHJsLCBwb3MsIGxheWVySWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB0aGlzLnRlYXJkb3duQ2xpcCgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudGVhcmRvd25DbGlwKCk7XG4gIH1cblxuICBvblBvaW50ZXJEb3duKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kcmFnZ2luZy5zZXQodHJ1ZSk7XG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2V0UG9pbnRlckNhcHR1cmU/LihldmVudC5wb2ludGVySWQpO1xuICAgIHRoaXMudXBkYXRlRnJvbUV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIG9uUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRnJvbUV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIG9uUG9pbnRlclVwKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRnJvbUV2ZW50KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAnLmdlby1tYXAtc3dpcGUnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByYXRpbyA9IE1hdGgubWluKFxuICAgICAgMTAwLFxuICAgICAgTWF0aC5tYXgoMCwgKChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpICogMTAwKSxcbiAgICApO1xuICAgIHRoaXMucG9zaXRpb24uc2V0KHJhdGlvKTtcbiAgICB0aGlzLmNvbnRyb2xsZXIoKT8uZ2V0TWFwKCk/LnJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hDbGlwKFxuICAgIGN0cmw6IEdlb01hcENvbnRyb2xsZXIsXG4gICAgcG9zOiBudW1iZXIsXG4gICAgcHJlZmVycmVkSWQ6IHN0cmluZyB8IG51bGwsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IGN0cmwuZ2V0TWFwKCk7XG4gICAgaWYgKCFtYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYW5hZ2VkID0gY3RybC5nZXRMYXllcnMoKTtcbiAgICBjb25zdCBvdmVybGF5ID1cbiAgICAgIChwcmVmZXJyZWRJZFxuICAgICAgICA/IG1hbmFnZWQuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gcHJlZmVycmVkSWQpXG4gICAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgICAgWy4uLm1hbmFnZWRdXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICBpdGVtLmlkICE9PSBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQgJiZcbiAgICAgICAgICAgICFpdGVtLmNvbmZpZy5iYXNlbWFwICYmXG4gICAgICAgICAgICAoaXRlbS5jb25maWcudmlzaWJsZSA/PyB0cnVlKSxcbiAgICAgICAgKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gKGIuY29uZmlnLnpJbmRleCA/PyAwKSAtIChhLmNvbmZpZy56SW5kZXggPz8gMCkpWzBdO1xuXG4gICAgaWYgKCFvdmVybGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ib3VuZExheWVyID0gb3ZlcmxheS5sYXllcjtcbiAgICBjb25zdCBsYXllciA9IG92ZXJsYXkubGF5ZXIgYXMgTGF5ZXI7XG5cbiAgICBjb25zdCBwcmVyZW5kZXIgPSAoZXZlbnQ6IFJlbmRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBjdHggPSBldmVudC5jb250ZXh0IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpemUgPSBtYXAuZ2V0U2l6ZSgpO1xuICAgICAgaWYgKCFjdHggfHwgIXNpemUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2lkdGggPSAoc2l6ZVswXSAqIHRoaXMucG9zaXRpb24oKSkgLyAxMDA7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4LnJlY3QoMCwgMCwgd2lkdGgsIHNpemVbMV0pO1xuICAgICAgY3R4LmNsaXAoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcG9zdHJlbmRlciA9IChldmVudDogUmVuZGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGV2ZW50LmNvbnRleHQgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgdW5kZWZpbmVkO1xuICAgICAgY3R4Py5yZXN0b3JlKCk7XG4gICAgfTtcblxuICAgIHRoaXMua2V5cyA9IFtcbiAgICAgIC8vIE9MIExheWVyIHN1cHBvcnRzIHByZXJlbmRlci9wb3N0cmVuZGVyOyB0eXBpbmdzIG9uIEJhc2VMYXllciBhcmUgaW5jb21wbGV0ZSBpbiBzb21lIHZlcnNpb25zLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIChsYXllciBhcyBhbnkpLm9uKCdwcmVyZW5kZXInLCBwcmVyZW5kZXIpLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIChsYXllciBhcyBhbnkpLm9uKCdwb3N0cmVuZGVyJywgcG9zdHJlbmRlciksXG4gICAgXTtcbiAgICBtYXAucmVuZGVyKCk7XG4gICAgdm9pZCBwb3M7XG4gIH1cblxuICBwcml2YXRlIHRlYXJkb3duQ2xpcCgpOiB2b2lkIHtcbiAgICB1bkJ5S2V5KHRoaXMua2V5cyk7XG4gICAgdGhpcy5rZXlzID0gW107XG4gICAgdGhpcy5ib3VuZExheWVyID0gbnVsbDtcbiAgICB0aGlzLmNvbnRyb2xsZXIoKT8uZ2V0TWFwKCk/LnJlbmRlcigpO1xuICB9XG59XG4iLCJAaWYgKGFjdGl2ZSgpKSB7XG4gIDxkaXZcbiAgICBjbGFzcz1cImdlby1tYXAtc3dpcGVcIlxuICAgIChwb2ludGVyZG93bik9XCJvblBvaW50ZXJEb3duKCRldmVudClcIlxuICAgIChwb2ludGVybW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRldmVudClcIlxuICAgIChwb2ludGVydXApPVwib25Qb2ludGVyVXAoKVwiXG4gICAgKHBvaW50ZXJjYW5jZWwpPVwib25Qb2ludGVyVXAoKVwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImdlby1tYXAtc3dpcGVfX2RpdmlkZXJcIlxuICAgICAgW3N0eWxlLmxlZnQuJV09XCJwb3NpdGlvbigpXCJcbiAgICAgIHJvbGU9XCJzbGlkZXJcIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJW4buLIHRyw60gc28gc8OhbmggbOG7m3BcIlxuICAgICAgW2F0dHIuYXJpYS12YWx1ZW5vd109XCJwb3NpdGlvbigpXCJcbiAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCJcbiAgICAgIGFyaWEtdmFsdWVtYXg9XCIxMDBcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLW1hcC1zd2lwZV9faGFuZGxlXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXN3aXBlX19oaW50XCI+S8OpbyDEkeG7gyBzbyBzw6FuaCBs4bubcCBjaOG7k25nIHjhur9wPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input, model, output, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
|
|
3
|
+
import { GeoIconComponent } from '../../../geo-icon/geo-icon.component';
|
|
4
|
+
import { GEO_MAP_DEFAULT_TOOLBAR_ACTIONS } from '../../geo-map.constants';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "ng-zorro-antd/tooltip";
|
|
7
|
+
/**
|
|
8
|
+
* Floating pill action bar for map chrome (measure / snapshot / …).
|
|
9
|
+
*
|
|
10
|
+
* @summary Floating pill action bar (measure, traffic, …).
|
|
11
|
+
* @whenToUse Top-center map chrome like cổng công khai; pass actions + (actionClick).
|
|
12
|
+
* @doNotUseWhen Need only one tool — use individual geo-map-* components.
|
|
13
|
+
*/
|
|
14
|
+
export class GeoMapToolbarComponent {
|
|
15
|
+
controller = input(null);
|
|
16
|
+
/** When empty, uses built-in portal action set. */
|
|
17
|
+
actions = input([]);
|
|
18
|
+
compact = input(false);
|
|
19
|
+
/** Two-way checked map keyed by action id (for checkbox-style actions). */
|
|
20
|
+
checkedMap = model({});
|
|
21
|
+
actionClick = output();
|
|
22
|
+
actionToggle = output();
|
|
23
|
+
resolvedActions = computed(() => {
|
|
24
|
+
const supplied = this.actions();
|
|
25
|
+
return supplied.length ? supplied : GEO_MAP_DEFAULT_TOOLBAR_ACTIONS;
|
|
26
|
+
});
|
|
27
|
+
tooltipOf(action) {
|
|
28
|
+
return action.tooltip || action.label || action.id;
|
|
29
|
+
}
|
|
30
|
+
isToggleAction(action) {
|
|
31
|
+
if (action.checked !== undefined) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return Object.prototype.hasOwnProperty.call(this.checkedMap(), action.id);
|
|
35
|
+
}
|
|
36
|
+
isChecked(action) {
|
|
37
|
+
const map = this.checkedMap();
|
|
38
|
+
if (Object.prototype.hasOwnProperty.call(map, action.id)) {
|
|
39
|
+
return !!map[action.id];
|
|
40
|
+
}
|
|
41
|
+
return !!action.checked;
|
|
42
|
+
}
|
|
43
|
+
onActionClick(action) {
|
|
44
|
+
if (action.disabled) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (this.isToggleAction(action)) {
|
|
48
|
+
const next = !this.isChecked(action);
|
|
49
|
+
this.checkedMap.update((prev) => ({ ...prev, [action.id]: next }));
|
|
50
|
+
this.actionToggle.emit({ action, checked: next });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.actionClick.emit(action);
|
|
54
|
+
}
|
|
55
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
56
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapToolbarComponent, isStandalone: true, selector: "geo-map-toolbar", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedMap: "checkedMapChange", actionClick: "actionClick", actionToggle: "actionToggle" }, host: { classAttribute: "geo-map-toolbar-host" }, ngImport: i0, template: "<div\n class=\"geo-map-toolbar\"\n [class.geo-map-toolbar--compact]=\"compact()\"\n role=\"toolbar\"\n aria-label=\"Thao t\u00E1c b\u1EA3n \u0111\u1ED3\"\n>\n @for (action of resolvedActions(); track action.id) {\n <span\n class=\"geo-map-toolbar__tip\"\n [nz-tooltip]=\"tooltipOf(action)\"\n nzTooltipPlacement=\"bottom\"\n >\n <button\n type=\"button\"\n class=\"geo-map-toolbar__btn\"\n [class.geo-map-toolbar__btn--icon-only]=\"\n action.iconOnly || !action.label || compact()\n \"\n [class.geo-map-toolbar__btn--active]=\"action.active\"\n [class.geo-map-toolbar__btn--checked]=\"isChecked(action)\"\n [class.geo-map-toolbar__btn--primary]=\"action.variant === 'primary'\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"tooltipOf(action)\"\n [attr.aria-pressed]=\"isToggleAction(action) ? isChecked(action) : null\"\n (click)=\"onActionClick(action)\"\n >\n @if (action.iconSrc) {\n <img\n class=\"geo-map-toolbar__icon-img\"\n [class.geo-map-toolbar__icon-img--home]=\"action.variant === 'primary'\"\n [src]=\"action.iconSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n } @else if (action.icon) {\n <geo-icon [type]=\"action.icon\" size=\"md\" />\n }\n @if (action.label && !action.iconOnly && !compact()) {\n <span class=\"geo-map-toolbar__label\">{{ action.label }}</span>\n }\n </button>\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-toolbar-host{display:block;pointer-events:none}.geo-map-toolbar{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:18px;min-height:64px;padding:7px 12px;overflow:visible;pointer-events:auto;border:0;border-radius:var(--geo-radius-md);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-sm)}.geo-map-toolbar__tip{display:inline-flex}.geo-map-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;padding:5px;border:1px solid var(--geo-color-primary-default);border-radius:var(--geo-radius-xs);background:var(--geo-color-neutral-white, #fff);color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;box-shadow:0 0 2px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-toolbar__btn:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-default) 14%,var(--geo-color-neutral-white))}.geo-map-toolbar__btn:active:not(:disabled){transform:scale(.98)}.geo-map-toolbar__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-toolbar__btn--icon-only{width:40px;padding:5px}.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--checked{background:color-mix(in srgb,var(--geo-color-primary-light) 58%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--active:hover:not(:disabled),.geo-map-toolbar__btn--checked:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-light) 68%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--primary{width:50px;min-width:50px;min-height:50px;padding:0;border:0;border-radius:50%;background:var(--geo-color-primary-light);box-shadow:0 4px 4px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);margin-right:-3px}.geo-map-toolbar__btn--primary:hover:not(:disabled){background:var(--geo-color-primary-default);filter:none}.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--checked{background:var(--geo-color-primary-light)}.geo-map-toolbar__icon-img{display:block;width:25px;height:25px;object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none}.geo-map-toolbar__icon-img--home{width:22px;height:20px}.geo-map-toolbar__label{white-space:nowrap}.geo-map-toolbar--compact .geo-map-toolbar__label{display:none}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
57
|
+
}
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapToolbarComponent, decorators: [{
|
|
59
|
+
type: Component,
|
|
60
|
+
args: [{ selector: 'geo-map-toolbar', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
61
|
+
class: 'geo-map-toolbar-host',
|
|
62
|
+
}, template: "<div\n class=\"geo-map-toolbar\"\n [class.geo-map-toolbar--compact]=\"compact()\"\n role=\"toolbar\"\n aria-label=\"Thao t\u00E1c b\u1EA3n \u0111\u1ED3\"\n>\n @for (action of resolvedActions(); track action.id) {\n <span\n class=\"geo-map-toolbar__tip\"\n [nz-tooltip]=\"tooltipOf(action)\"\n nzTooltipPlacement=\"bottom\"\n >\n <button\n type=\"button\"\n class=\"geo-map-toolbar__btn\"\n [class.geo-map-toolbar__btn--icon-only]=\"\n action.iconOnly || !action.label || compact()\n \"\n [class.geo-map-toolbar__btn--active]=\"action.active\"\n [class.geo-map-toolbar__btn--checked]=\"isChecked(action)\"\n [class.geo-map-toolbar__btn--primary]=\"action.variant === 'primary'\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"tooltipOf(action)\"\n [attr.aria-pressed]=\"isToggleAction(action) ? isChecked(action) : null\"\n (click)=\"onActionClick(action)\"\n >\n @if (action.iconSrc) {\n <img\n class=\"geo-map-toolbar__icon-img\"\n [class.geo-map-toolbar__icon-img--home]=\"action.variant === 'primary'\"\n [src]=\"action.iconSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n } @else if (action.icon) {\n <geo-icon [type]=\"action.icon\" size=\"md\" />\n }\n @if (action.label && !action.iconOnly && !compact()) {\n <span class=\"geo-map-toolbar__label\">{{ action.label }}</span>\n }\n </button>\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-toolbar-host{display:block;pointer-events:none}.geo-map-toolbar{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:18px;min-height:64px;padding:7px 12px;overflow:visible;pointer-events:auto;border:0;border-radius:var(--geo-radius-md);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-sm)}.geo-map-toolbar__tip{display:inline-flex}.geo-map-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;padding:5px;border:1px solid var(--geo-color-primary-default);border-radius:var(--geo-radius-xs);background:var(--geo-color-neutral-white, #fff);color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;box-shadow:0 0 2px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-toolbar__btn:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-default) 14%,var(--geo-color-neutral-white))}.geo-map-toolbar__btn:active:not(:disabled){transform:scale(.98)}.geo-map-toolbar__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-toolbar__btn--icon-only{width:40px;padding:5px}.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--checked{background:color-mix(in srgb,var(--geo-color-primary-light) 58%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--active:hover:not(:disabled),.geo-map-toolbar__btn--checked:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-light) 68%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--primary{width:50px;min-width:50px;min-height:50px;padding:0;border:0;border-radius:50%;background:var(--geo-color-primary-light);box-shadow:0 4px 4px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);margin-right:-3px}.geo-map-toolbar__btn--primary:hover:not(:disabled){background:var(--geo-color-primary-default);filter:none}.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--checked{background:var(--geo-color-primary-light)}.geo-map-toolbar__icon-img{display:block;width:25px;height:25px;object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none}.geo-map-toolbar__icon-img--home{width:22px;height:20px}.geo-map-toolbar__label{white-space:nowrap}.geo-map-toolbar--compact .geo-map-toolbar__label{display:none}\n"] }]
|
|
63
|
+
}] });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dlby11aS9zcmMvbGliL2ZpZ21hL2dlby1tYXAvY2hyb21lL2dlby1tYXAtdG9vbGJhci9nZW8tbWFwLXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC10b29sYmFyL2dlby1tYXAtdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7O0FBSTFFOzs7Ozs7R0FNRztBQWFILE1BQU0sT0FBTyxzQkFBc0I7SUFDeEIsVUFBVSxHQUFHLEtBQUssQ0FBMEIsSUFBSSxDQUFDLENBQUM7SUFDM0QsbURBQW1EO0lBQzFDLE9BQU8sR0FBRyxLQUFLLENBQXdCLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsMkVBQTJFO0lBQ2xFLFVBQVUsR0FBRyxLQUFLLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBRWhELFdBQVcsR0FBRyxNQUFNLEVBQXVCLENBQUM7SUFDNUMsWUFBWSxHQUFHLE1BQU0sRUFHMUIsQ0FBQztJQUVJLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsTUFBMkI7UUFDbkMsT0FBTyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQTJCO1FBQ3hDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBMkI7UUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN6RCxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBMkI7UUFDdkMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO3dHQW5EVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwwdkJDbENuQyxnakRBNENBLGtsRkRuQlksZ0JBQWdCLHdHQUFFLGVBQWU7OzRGQVNoQyxzQkFBc0I7a0JBWmxDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLG1CQUczQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLEtBQUssRUFBRSxzQkFBc0I7cUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgb3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOelRvb2xUaXBNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL3Rvb2x0aXAnO1xuaW1wb3J0IHsgR2VvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlby1pY29uL2dlby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHRU9fTUFQX0RFRkFVTFRfVE9PTEJBUl9BQ1RJT05TIH0gZnJvbSAnLi4vLi4vZ2VvLW1hcC5jb25zdGFudHMnO1xuaW1wb3J0IHsgR2VvTWFwQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2dlby1tYXAuY29udHJvbGxlcic7XG5pbXBvcnQgdHlwZSB7IEdlb01hcFRvb2xiYXJBY3Rpb24gfSBmcm9tICcuLi8uLi9nZW8tbWFwLnR5cGVzJztcblxuLyoqXG4gKiBGbG9hdGluZyBwaWxsIGFjdGlvbiBiYXIgZm9yIG1hcCBjaHJvbWUgKG1lYXN1cmUgLyBzbmFwc2hvdCAvIOKApikuXG4gKlxuICogQHN1bW1hcnkgRmxvYXRpbmcgcGlsbCBhY3Rpb24gYmFyIChtZWFzdXJlLCB0cmFmZmljLCDigKYpLlxuICogQHdoZW5Ub1VzZSBUb3AtY2VudGVyIG1hcCBjaHJvbWUgbGlrZSBj4buVbmcgY8O0bmcga2hhaTsgcGFzcyBhY3Rpb25zICsgKGFjdGlvbkNsaWNrKS5cbiAqIEBkb05vdFVzZVdoZW4gTmVlZCBvbmx5IG9uZSB0b29sIOKAlCB1c2UgaW5kaXZpZHVhbCBnZW8tbWFwLSogY29tcG9uZW50cy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ2VvLW1hcC10b29sYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0dlb0ljb25Db21wb25lbnQsIE56VG9vbFRpcE1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW8tbWFwLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VvLW1hcC10b29sYmFyLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2dlby1tYXAtdG9vbGJhci1ob3N0JyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgR2VvTWFwVG9vbGJhckNvbXBvbmVudCB7XG4gIHJlYWRvbmx5IGNvbnRyb2xsZXIgPSBpbnB1dDxHZW9NYXBDb250cm9sbGVyIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBXaGVuIGVtcHR5LCB1c2VzIGJ1aWx0LWluIHBvcnRhbCBhY3Rpb24gc2V0LiAqL1xuICByZWFkb25seSBhY3Rpb25zID0gaW5wdXQ8R2VvTWFwVG9vbGJhckFjdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGNvbXBhY3QgPSBpbnB1dChmYWxzZSk7XG4gIC8qKiBUd28td2F5IGNoZWNrZWQgbWFwIGtleWVkIGJ5IGFjdGlvbiBpZCAoZm9yIGNoZWNrYm94LXN0eWxlIGFjdGlvbnMpLiAqL1xuICByZWFkb25seSBjaGVja2VkTWFwID0gbW9kZWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KTtcblxuICByZWFkb25seSBhY3Rpb25DbGljayA9IG91dHB1dDxHZW9NYXBUb29sYmFyQWN0aW9uPigpO1xuICByZWFkb25seSBhY3Rpb25Ub2dnbGUgPSBvdXRwdXQ8e1xuICAgIGFjdGlvbjogR2VvTWFwVG9vbGJhckFjdGlvbjtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICB9PigpO1xuXG4gIHJlYWRvbmx5IHJlc29sdmVkQWN0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdXBwbGllZCA9IHRoaXMuYWN0aW9ucygpO1xuICAgIHJldHVybiBzdXBwbGllZC5sZW5ndGggPyBzdXBwbGllZCA6IEdFT19NQVBfREVGQVVMVF9UT09MQkFSX0FDVElPTlM7XG4gIH0pO1xuXG4gIHRvb2x0aXBPZihhY3Rpb246IEdlb01hcFRvb2xiYXJBY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBhY3Rpb24udG9vbHRpcCB8fCBhY3Rpb24ubGFiZWwgfHwgYWN0aW9uLmlkO1xuICB9XG5cbiAgaXNUb2dnbGVBY3Rpb24oYWN0aW9uOiBHZW9NYXBUb29sYmFyQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKGFjdGlvbi5jaGVja2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY2hlY2tlZE1hcCgpLCBhY3Rpb24uaWQpO1xuICB9XG5cbiAgaXNDaGVja2VkKGFjdGlvbjogR2VvTWFwVG9vbGJhckFjdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuY2hlY2tlZE1hcCgpO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWFwLCBhY3Rpb24uaWQpKSB7XG4gICAgICByZXR1cm4gISFtYXBbYWN0aW9uLmlkXTtcbiAgICB9XG4gICAgcmV0dXJuICEhYWN0aW9uLmNoZWNrZWQ7XG4gIH1cblxuICBvbkFjdGlvbkNsaWNrKGFjdGlvbjogR2VvTWFwVG9vbGJhckFjdGlvbik6IHZvaWQge1xuICAgIGlmIChhY3Rpb24uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1RvZ2dsZUFjdGlvbihhY3Rpb24pKSB7XG4gICAgICBjb25zdCBuZXh0ID0gIXRoaXMuaXNDaGVja2VkKGFjdGlvbik7XG4gICAgICB0aGlzLmNoZWNrZWRNYXAudXBkYXRlKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbYWN0aW9uLmlkXTogbmV4dCB9KSk7XG4gICAgICB0aGlzLmFjdGlvblRvZ2dsZS5lbWl0KHsgYWN0aW9uLCBjaGVja2VkOiBuZXh0IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChhY3Rpb24pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiZ2VvLW1hcC10b29sYmFyXCJcbiAgW2NsYXNzLmdlby1tYXAtdG9vbGJhci0tY29tcGFjdF09XCJjb21wYWN0KClcIlxuICByb2xlPVwidG9vbGJhclwiXG4gIGFyaWEtbGFiZWw9XCJUaGFvIHTDoWMgYuG6o24gxJHhu5NcIlxuPlxuICBAZm9yIChhY3Rpb24gb2YgcmVzb2x2ZWRBY3Rpb25zKCk7IHRyYWNrIGFjdGlvbi5pZCkge1xuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cImdlby1tYXAtdG9vbGJhcl9fdGlwXCJcbiAgICAgIFtuei10b29sdGlwXT1cInRvb2x0aXBPZihhY3Rpb24pXCJcbiAgICAgIG56VG9vbHRpcFBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJnZW8tbWFwLXRvb2xiYXJfX2J0blwiXG4gICAgICAgIFtjbGFzcy5nZW8tbWFwLXRvb2xiYXJfX2J0bi0taWNvbi1vbmx5XT1cIlxuICAgICAgICAgIGFjdGlvbi5pY29uT25seSB8fCAhYWN0aW9uLmxhYmVsIHx8IGNvbXBhY3QoKVxuICAgICAgICBcIlxuICAgICAgICBbY2xhc3MuZ2VvLW1hcC10b29sYmFyX19idG4tLWFjdGl2ZV09XCJhY3Rpb24uYWN0aXZlXCJcbiAgICAgICAgW2NsYXNzLmdlby1tYXAtdG9vbGJhcl9fYnRuLS1jaGVja2VkXT1cImlzQ2hlY2tlZChhY3Rpb24pXCJcbiAgICAgICAgW2NsYXNzLmdlby1tYXAtdG9vbGJhcl9fYnRuLS1wcmltYXJ5XT1cImFjdGlvbi52YXJpYW50ID09PSAncHJpbWFyeSdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0b29sdGlwT2YoYWN0aW9uKVwiXG4gICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1RvZ2dsZUFjdGlvbihhY3Rpb24pID8gaXNDaGVja2VkKGFjdGlvbikgOiBudWxsXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uQ2xpY2soYWN0aW9uKVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAoYWN0aW9uLmljb25TcmMpIHtcbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBjbGFzcz1cImdlby1tYXAtdG9vbGJhcl9faWNvbi1pbWdcIlxuICAgICAgICAgICAgW2NsYXNzLmdlby1tYXAtdG9vbGJhcl9faWNvbi1pbWctLWhvbWVdPVwiYWN0aW9uLnZhcmlhbnQgPT09ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICBbc3JjXT1cImFjdGlvbi5pY29uU3JjXCJcbiAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aW9uLmljb24pIHtcbiAgICAgICAgICA8Z2VvLWljb24gW3R5cGVdPVwiYWN0aW9uLmljb25cIiBzaXplPVwibWRcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoYWN0aW9uLmxhYmVsICYmICFhY3Rpb24uaWNvbk9ubHkgJiYgIWNvbXBhY3QoKSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLW1hcC10b29sYmFyX19sYWJlbFwiPnt7IGFjdGlvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9idXR0b24+XG4gICAgPC9zcGFuPlxuICB9XG48L2Rpdj5cbiJdfQ==
|