@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Directive, ElementRef, effect, inject, input } from '@angular/core';
|
|
2
|
+
import { SpotlightTourService } from '../services/spotlight-tour.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class SpotlightStepDirective {
|
|
5
|
+
sdcSpotlightStep = input();
|
|
6
|
+
sSpotlightStep = input();
|
|
7
|
+
elementRef = inject(ElementRef);
|
|
8
|
+
tourService = inject(SpotlightTourService);
|
|
9
|
+
currentId = null;
|
|
10
|
+
constructor() {
|
|
11
|
+
effect(() => {
|
|
12
|
+
const nextId = this.sdcSpotlightStep() || this.sSpotlightStep();
|
|
13
|
+
if (!nextId) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (this.currentId && this.currentId !== nextId) {
|
|
17
|
+
this.tourService.unregisterElement(this.currentId);
|
|
18
|
+
}
|
|
19
|
+
this.currentId = nextId;
|
|
20
|
+
this.tourService.registerElement(nextId, this.elementRef);
|
|
21
|
+
}, { allowSignalWrites: true });
|
|
22
|
+
}
|
|
23
|
+
ngOnDestroy() {
|
|
24
|
+
if (this.currentId) {
|
|
25
|
+
this.tourService.unregisterElement(this.currentId);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightStepDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
29
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: SpotlightStepDirective, isStandalone: true, selector: "[sdcSpotlightStep],[sSpotlightStep]", inputs: { sdcSpotlightStep: { classPropertyName: "sdcSpotlightStep", publicName: "sdcSpotlightStep", isSignal: true, isRequired: false, transformFunction: null }, sSpotlightStep: { classPropertyName: "sSpotlightStep", publicName: "sSpotlightStep", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightStepDirective, decorators: [{
|
|
32
|
+
type: Directive,
|
|
33
|
+
args: [{
|
|
34
|
+
selector: '[sdcSpotlightStep],[sSpotlightStep]',
|
|
35
|
+
standalone: true
|
|
36
|
+
}]
|
|
37
|
+
}], ctorParameters: () => [] });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXN0ZXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9zcG90bGlnaHQvZGlyZWN0aXZlcy9zcG90bGlnaHQtc3RlcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBTTFFLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsZ0JBQWdCLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDbkMsY0FBYyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRWhCLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3BELFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRXhDO1FBQ0UsTUFBTSxDQUNKLEdBQUcsRUFBRTtZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVoRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO3dHQWhDVSxzQkFBc0I7NEZBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFKbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUNBQXFDO29CQUMvQyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgZWZmZWN0LCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNwb3RsaWdodFRvdXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3BvdGxpZ2h0LXRvdXIuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzZGNTcG90bGlnaHRTdGVwXSxbc1Nwb3RsaWdodFN0ZXBdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBTcG90bGlnaHRTdGVwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgc2RjU3BvdGxpZ2h0U3RlcCA9IGlucHV0PHN0cmluZz4oKTtcbiAgc1Nwb3RsaWdodFN0ZXAgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRvdXJTZXJ2aWNlID0gaW5qZWN0KFNwb3RsaWdodFRvdXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjdXJyZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dElkID0gdGhpcy5zZGNTcG90bGlnaHRTdGVwKCkgfHwgdGhpcy5zU3BvdGxpZ2h0U3RlcCgpO1xuXG4gICAgICAgIGlmICghbmV4dElkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudElkICYmIHRoaXMuY3VycmVudElkICE9PSBuZXh0SWQpIHtcbiAgICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnVucmVnaXN0ZXJFbGVtZW50KHRoaXMuY3VycmVudElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudElkID0gbmV4dElkO1xuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnJlZ2lzdGVyRWxlbWVudChuZXh0SWQsIHRoaXMuZWxlbWVudFJlZik7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRJZCkge1xuICAgICAgdGhpcy50b3VyU2VydmljZS51bnJlZ2lzdGVyRWxlbWVudCh0aGlzLmN1cnJlbnRJZCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { EnvironmentInjector, Injectable, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { Overlay } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { SpotlightOverlayComponent } from '../components/spotlight-overlay/spotlight-overlay.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class SpotlightTourService {
|
|
8
|
+
overlay = inject(Overlay);
|
|
9
|
+
environmentInjector = inject(EnvironmentInjector);
|
|
10
|
+
overlayRef = null;
|
|
11
|
+
stepsSignal = signal([]);
|
|
12
|
+
currentIndexSignal = signal(0);
|
|
13
|
+
activeSignal = signal(false);
|
|
14
|
+
registrationVersionSignal = signal(0);
|
|
15
|
+
registeredElements = new Map();
|
|
16
|
+
pendingDoNotShowAgain = false;
|
|
17
|
+
interactionVersion = 0;
|
|
18
|
+
stoppedSubject = new Subject();
|
|
19
|
+
stepChangedSubject = new Subject();
|
|
20
|
+
isActive = this.activeSignal.asReadonly();
|
|
21
|
+
currentIndex = this.currentIndexSignal.asReadonly();
|
|
22
|
+
totalSteps = computed(() => this.stepsSignal().length);
|
|
23
|
+
currentStep = computed(() => this.stepsSignal()[this.currentIndexSignal()]);
|
|
24
|
+
stopped$ = this.stoppedSubject.asObservable();
|
|
25
|
+
stepChanged$ = this.stepChangedSubject.asObservable();
|
|
26
|
+
registrationVersion = this.registrationVersionSignal.asReadonly();
|
|
27
|
+
start(steps) {
|
|
28
|
+
if (!steps.length) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (this.activeSignal()) {
|
|
32
|
+
this.stop();
|
|
33
|
+
}
|
|
34
|
+
this.interactionVersion += 1;
|
|
35
|
+
this.stepsSignal.set(steps);
|
|
36
|
+
this.currentIndexSignal.set(0);
|
|
37
|
+
this.activeSignal.set(true);
|
|
38
|
+
this.attachOverlay();
|
|
39
|
+
this.stepChangedSubject.next({
|
|
40
|
+
stepId: steps[0].stepId,
|
|
41
|
+
stepIndex: 0,
|
|
42
|
+
totalSteps: steps.length
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
spotlight(stepId, config) {
|
|
46
|
+
this.start([{ stepId, ...config }]);
|
|
47
|
+
}
|
|
48
|
+
next(doNotShowAgain = false) {
|
|
49
|
+
const current = this.currentStep();
|
|
50
|
+
const interactionVersion = this.interactionVersion;
|
|
51
|
+
this.pendingDoNotShowAgain = doNotShowAgain;
|
|
52
|
+
if (current?.beforeNext) {
|
|
53
|
+
const result = current.beforeNext();
|
|
54
|
+
if (result instanceof Promise) {
|
|
55
|
+
result.then(() => this.advanceIfCurrent(interactionVersion)).catch(() => undefined);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.advance();
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.advance();
|
|
63
|
+
}
|
|
64
|
+
previous() {
|
|
65
|
+
if (this.currentIndexSignal() <= 0) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const current = this.currentStep();
|
|
69
|
+
const interactionVersion = this.interactionVersion;
|
|
70
|
+
if (current?.beforePrevious) {
|
|
71
|
+
const result = current.beforePrevious();
|
|
72
|
+
if (result instanceof Promise) {
|
|
73
|
+
result.then(() => this.retreatIfCurrent(interactionVersion)).catch(() => undefined);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this.retreat();
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.retreat();
|
|
81
|
+
}
|
|
82
|
+
stop(event) {
|
|
83
|
+
const steps = this.stepsSignal();
|
|
84
|
+
const stepIndex = this.currentIndexSignal();
|
|
85
|
+
const fullEvent = {
|
|
86
|
+
reason: 'interrupted',
|
|
87
|
+
doNotShowAgain: false,
|
|
88
|
+
stepId: steps[stepIndex]?.stepId ?? '',
|
|
89
|
+
stepIndex,
|
|
90
|
+
totalSteps: steps.length,
|
|
91
|
+
...event
|
|
92
|
+
};
|
|
93
|
+
this.interactionVersion += 1;
|
|
94
|
+
this.activeSignal.set(false);
|
|
95
|
+
this.stepsSignal.set([]);
|
|
96
|
+
this.currentIndexSignal.set(0);
|
|
97
|
+
this.pendingDoNotShowAgain = false;
|
|
98
|
+
this.stoppedSubject.next(fullEvent);
|
|
99
|
+
this.detachOverlay();
|
|
100
|
+
}
|
|
101
|
+
registerElement(stepId, element) {
|
|
102
|
+
this.registeredElements.set(stepId, element);
|
|
103
|
+
this.registrationVersionSignal.update((value) => value + 1);
|
|
104
|
+
}
|
|
105
|
+
unregisterElement(stepId) {
|
|
106
|
+
this.registeredElements.delete(stepId);
|
|
107
|
+
this.registrationVersionSignal.update((value) => value + 1);
|
|
108
|
+
}
|
|
109
|
+
getElement(stepId) {
|
|
110
|
+
return this.registeredElements.get(stepId);
|
|
111
|
+
}
|
|
112
|
+
advance() {
|
|
113
|
+
const steps = this.stepsSignal();
|
|
114
|
+
const currentIndex = this.currentIndexSignal();
|
|
115
|
+
if (currentIndex < steps.length - 1) {
|
|
116
|
+
const nextIndex = currentIndex + 1;
|
|
117
|
+
this.pendingDoNotShowAgain = false;
|
|
118
|
+
this.currentIndexSignal.set(nextIndex);
|
|
119
|
+
this.stepChangedSubject.next({
|
|
120
|
+
stepId: steps[nextIndex].stepId,
|
|
121
|
+
stepIndex: nextIndex,
|
|
122
|
+
totalSteps: steps.length
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this.stop({ reason: 'completed', doNotShowAgain: this.pendingDoNotShowAgain });
|
|
127
|
+
}
|
|
128
|
+
advanceIfCurrent(interactionVersion) {
|
|
129
|
+
if (!this.isCurrentInteraction(interactionVersion)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.advance();
|
|
133
|
+
}
|
|
134
|
+
retreat() {
|
|
135
|
+
const steps = this.stepsSignal();
|
|
136
|
+
const nextIndex = this.currentIndexSignal() - 1;
|
|
137
|
+
this.currentIndexSignal.set(nextIndex);
|
|
138
|
+
this.stepChangedSubject.next({
|
|
139
|
+
stepId: steps[nextIndex].stepId,
|
|
140
|
+
stepIndex: nextIndex,
|
|
141
|
+
totalSteps: steps.length
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
retreatIfCurrent(interactionVersion) {
|
|
145
|
+
if (!this.isCurrentInteraction(interactionVersion)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.retreat();
|
|
149
|
+
}
|
|
150
|
+
isCurrentInteraction(interactionVersion) {
|
|
151
|
+
return this.activeSignal() && this.interactionVersion === interactionVersion;
|
|
152
|
+
}
|
|
153
|
+
attachOverlay() {
|
|
154
|
+
if (this.overlayRef) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this.overlayRef = this.overlay.create({
|
|
158
|
+
hasBackdrop: false,
|
|
159
|
+
scrollStrategy: this.overlay.scrollStrategies.noop(),
|
|
160
|
+
positionStrategy: this.overlay.position().global()
|
|
161
|
+
});
|
|
162
|
+
this.overlayRef.attach(new ComponentPortal(SpotlightOverlayComponent, null, this.environmentInjector));
|
|
163
|
+
}
|
|
164
|
+
detachOverlay() {
|
|
165
|
+
if (!this.overlayRef) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.overlayRef.detach();
|
|
169
|
+
this.overlayRef.dispose();
|
|
170
|
+
this.overlayRef = null;
|
|
171
|
+
}
|
|
172
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
173
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, providedIn: 'root' });
|
|
174
|
+
}
|
|
175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, decorators: [{
|
|
176
|
+
type: Injectable,
|
|
177
|
+
args: [{ providedIn: 'root' }]
|
|
178
|
+
}] });
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvc3BvdGxpZ2h0L3NlcnZpY2VzL3Nwb3RsaWdodC10b3VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFRM0MsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkRBQTZELENBQUM7O0FBS3hHLE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRTNELFVBQVUsR0FBc0IsSUFBSSxDQUFDO0lBQzVCLFdBQVcsR0FBRyxNQUFNLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUM1RCxxQkFBcUIsR0FBRyxLQUFLLENBQUM7SUFDOUIsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0lBQ25ELGtCQUFrQixHQUFHLElBQUksT0FBTyxF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QU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxrQkFBa0IsQ0FBQztJQUMvRSxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDcEMsV0FBVyxFQUFFLEtBQUs7WUFDbEIsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1lBQ3BELGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFO1NBQ25ELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUNwQixJQUFJLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQy9FLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7d0dBM01VLG9CQUFvQjs0R0FBcEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBFbnZpcm9ubWVudEluamVjdG9yLCBJbmplY3RhYmxlLCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHR5cGUge1xuICBTcG90bGlnaHRDb25maWcsXG4gIFNwb3RsaWdodFN0ZXAsXG4gIFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQsXG4gIFNwb3RsaWdodFN0b3BFdmVudFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL3R5cGVzL3Nwb3RsaWdodC50eXBlJztcbmltcG9ydCB7IFNwb3RsaWdodE92ZXJsYXlDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudCc7XG5cbnR5cGUgU3BvdGxpZ2h0U3RlcEludGVybmFsID0gU3BvdGxpZ2h0U3RlcCAmIHsgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbiB9O1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodFRvdXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50SW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XG5cbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RlcHNTaWduYWwgPSBzaWduYWw8U3BvdGxpZ2h0U3RlcEludGVybmFsW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50SW5kZXhTaWduYWwgPSBzaWduYWwoMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlU2lnbmFsID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyYXRpb25WZXJzaW9uU2lnbmFsID0gc2lnbmFsKDApO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50UmVmPigpO1xuICBwcml2YXRlIHBlbmRpbmdEb05vdFNob3dBZ2FpbiA9IGZhbHNlO1xuICBwcml2YXRlIGludGVyYWN0aW9uVmVyc2lvbiA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcHBlZFN1YmplY3QgPSBuZXcgU3ViamVjdDxTcG90bGlnaHRTdG9wRXZlbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RlcENoYW5nZWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8U3BvdGxpZ2h0U3RlcENoYW5nZWRFdmVudD4oKTtcblxuICByZWFkb25seSBpc0FjdGl2ZSA9IHRoaXMuYWN0aXZlU2lnbmFsLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXhTaWduYWwuYXNSZWFkb25seSgpO1xuICByZWFkb25seSB0b3RhbFN0ZXBzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGVwc1NpZ25hbCgpLmxlbmd0aCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTdGVwID0gY29tcHV0ZWQ8U3BvdGxpZ2h0U3RlcEludGVybmFsIHwgdW5kZWZpbmVkPihcbiAgICAoKSA9PiB0aGlzLnN0ZXBzU2lnbmFsKClbdGhpcy5jdXJyZW50SW5kZXhTaWduYWwoKV1cbiAgKTtcbiAgcmVhZG9ubHkgc3RvcHBlZCQ6IE9ic2VydmFibGU8U3BvdGxpZ2h0U3RvcEV2ZW50PiA9IHRoaXMuc3RvcHBlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHN0ZXBDaGFuZ2VkJDogT2JzZXJ2YWJsZTxTcG90bGlnaHRTdGVwQ2hhbmdlZEV2ZW50PiA9XG4gICAgdGhpcy5zdGVwQ2hhbmdlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblZlcnNpb24gPSB0aGlzLnJlZ2lzdHJhdGlvblZlcnNpb25TaWduYWwuYXNSZWFkb25seSgpO1xuXG4gIHN0YXJ0KHN0ZXBzOiBTcG90bGlnaHRTdGVwW10pOiB2b2lkIHtcbiAgICBpZiAoIXN0ZXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVNpZ25hbCgpKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyYWN0aW9uVmVyc2lvbiArPSAxO1xuICAgIHRoaXMuc3RlcHNTaWduYWwuc2V0KHN0ZXBzIGFzIFNwb3RsaWdodFN0ZXBJbnRlcm5hbFtdKTtcbiAgICB0aGlzLmN1cnJlbnRJbmRleFNpZ25hbC5zZXQoMCk7XG4gICAgdGhpcy5hY3RpdmVTaWduYWwuc2V0KHRydWUpO1xuICAgIHRoaXMuYXR0YWNoT3ZlcmxheSgpO1xuICAgIHRoaXMuc3RlcENoYW5nZWRTdWJqZWN0Lm5leHQoe1xuICAgICAgc3RlcElkOiBzdGVwc1swXS5zdGVwSWQsXG4gICAgICBzdGVwSW5kZXg6IDAsXG4gICAgICB0b3RhbFN0ZXBzOiBzdGVwcy5sZW5ndGhcbiAgICB9KTtcbiAgfVxuXG4gIHNwb3RsaWdodChzdGVwSWQ6IHN0cmluZywgY29uZmlnOiBTcG90bGlnaHRDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0KFt7IHN0ZXBJZCwgLi4uY29uZmlnIH1dKTtcbiAgfVxuXG4gIG5leHQoZG9Ob3RTaG93QWdhaW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25WZXJzaW9uID0gdGhpcy5pbnRlcmFjdGlvblZlcnNpb247XG4gICAgdGhpcy5wZW5kaW5nRG9Ob3RTaG93QWdhaW4gPSBkb05vdFNob3dBZ2FpbjtcblxuICAgIGlmIChjdXJyZW50Py5iZWZvcmVOZXh0KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBjdXJyZW50LmJlZm9yZU5leHQoKTtcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmVzdWx0LnRoZW4oKCkgPT4gdGhpcy5hZHZhbmNlSWZDdXJyZW50KGludGVyYWN0aW9uVmVyc2lvbikpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWR2YW5jZSgpO1xuICB9XG5cbiAgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4U2lnbmFsKCkgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25WZXJzaW9uID0gdGhpcy5pbnRlcmFjdGlvblZlcnNpb247XG5cbiAgICBpZiAoY3VycmVudD8uYmVmb3JlUHJldmlvdXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnQuYmVmb3JlUHJldmlvdXMoKTtcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmVzdWx0LnRoZW4oKCkgPT4gdGhpcy5yZXRyZWF0SWZDdXJyZW50KGludGVyYWN0aW9uVmVyc2lvbikpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJldHJlYXQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmV0cmVhdCgpO1xuICB9XG5cbiAgc3RvcChldmVudD86IFBhcnRpYWw8U3BvdGxpZ2h0U3RvcEV2ZW50Pik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5zdGVwc1NpZ25hbCgpO1xuICAgIGNvbnN0IHN0ZXBJbmRleCA9IHRoaXMuY3VycmVudEluZGV4U2lnbmFsKCk7XG4gICAgY29uc3QgZnVsbEV2ZW50OiBTcG90bGlnaHRTdG9wRXZlbnQgPSB7XG4gICAgICByZWFzb246ICdpbnRlcnJ1cHRlZCcsXG4gICAgICBkb05vdFNob3dBZ2FpbjogZmFsc2UsXG4gICAgICBzdGVwSWQ6IHN0ZXBzW3N0ZXBJbmRleF0/LnN0ZXBJZCA/PyAnJyxcbiAgICAgIHN0ZXBJbmRleCxcbiAgICAgIHRvdGFsU3RlcHM6IHN0ZXBzLmxlbmd0aCxcbiAgICAgIC4uLmV2ZW50XG4gICAgfTtcblxuICAgIHRoaXMuaW50ZXJhY3Rpb25WZXJzaW9uICs9IDE7XG4gICAgdGhpcy5hY3RpdmVTaWduYWwuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnN0ZXBzU2lnbmFsLnNldChbXSk7XG4gICAgdGhpcy5jdXJyZW50SW5kZXhTaWduYWwuc2V0KDApO1xuICAgIHRoaXMucGVuZGluZ0RvTm90U2hvd0FnYWluID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wcGVkU3ViamVjdC5uZXh0KGZ1bGxFdmVudCk7XG4gICAgdGhpcy5kZXRhY2hPdmVybGF5KCk7XG4gIH1cblxuICByZWdpc3RlckVsZW1lbnQoc3RlcElkOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyZWRFbGVtZW50cy5zZXQoc3RlcElkLCBlbGVtZW50KTtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvblZlcnNpb25TaWduYWwudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgKyAxKTtcbiAgfVxuXG4gIHVucmVnaXN0ZXJFbGVtZW50KHN0ZXBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlcmVkRWxlbWVudHMuZGVsZXRlKHN0ZXBJZCk7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25WZXJzaW9uU2lnbmFsLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlICsgMSk7XG4gIH1cblxuICBnZXRFbGVtZW50KHN0ZXBJZDogc3RyaW5nKTogRWxlbWVudFJlZiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJlZEVsZW1lbnRzLmdldChzdGVwSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZHZhbmNlKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5zdGVwc1NpZ25hbCgpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudEluZGV4U2lnbmFsKCk7XG5cbiAgICBpZiAoY3VycmVudEluZGV4IDwgc3RlcHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgIHRoaXMucGVuZGluZ0RvTm90U2hvd0FnYWluID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFNpZ25hbC5zZXQobmV4dEluZGV4KTtcbiAgICAgIHRoaXMuc3RlcENoYW5nZWRTdWJqZWN0Lm5leHQoe1xuICAgICAgICBzdGVwSWQ6IHN0ZXBzW25leHRJbmRleF0uc3RlcElkLFxuICAgICAgICBzdGVwSW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3AoeyByZWFzb246ICdjb21wbGV0ZWQnLCBkb05vdFNob3dBZ2FpbjogdGhpcy5wZW5kaW5nRG9Ob3RTaG93QWdhaW4gfSk7XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2VJZkN1cnJlbnQoaW50ZXJhY3Rpb25WZXJzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50SW50ZXJhY3Rpb24oaW50ZXJhY3Rpb25WZXJzaW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWR2YW5jZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXRyZWF0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5zdGVwc1NpZ25hbCgpO1xuICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuY3VycmVudEluZGV4U2lnbmFsKCkgLSAxO1xuICAgIHRoaXMuY3VycmVudEluZGV4U2lnbmFsLnNldChuZXh0SW5kZXgpO1xuICAgIHRoaXMuc3RlcENoYW5nZWRTdWJqZWN0Lm5leHQoe1xuICAgICAgc3RlcElkOiBzdGVwc1tuZXh0SW5kZXhdLnN0ZXBJZCxcbiAgICAgIHN0ZXBJbmRleDogbmV4dEluZGV4LFxuICAgICAgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldHJlYXRJZkN1cnJlbnQoaW50ZXJhY3Rpb25WZXJzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50SW50ZXJhY3Rpb24oaW50ZXJhY3Rpb25WZXJzaW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmV0cmVhdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0N1cnJlbnRJbnRlcmFjdGlvbihpbnRlcmFjdGlvblZlcnNpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVNpZ25hbCgpICYmIHRoaXMuaW50ZXJhY3Rpb25WZXJzaW9uID09PSBpbnRlcmFjdGlvblZlcnNpb247XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaE92ZXJsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpXG4gICAgfSk7XG5cbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKFxuICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChTcG90bGlnaHRPdmVybGF5Q29tcG9uZW50LCBudWxsLCB0aGlzLmVudmlyb25tZW50SW5qZWN0b3IpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0YWNoT3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, ChangeDetectionStrategy, TemplateRef, input, output, signal, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
+
import { SPOTLIGHT_BACK_LABEL_KEY, SPOTLIGHT_CLOSE_LABEL_KEY, SPOTLIGHT_COMPLETE_LABEL_KEY, SPOTLIGHT_DO_NOT_SHOW_AGAIN_LABEL_KEY, SPOTLIGHT_NEXT_LABEL_KEY, SPOTLIGHT_STEP_COUNTER_LABEL_KEY, SPOTLIGHT_STEP_PROGRESS_LABEL_KEY, SPOTLIGHT_UNDERSTOOD_LABEL_KEY } from '../../core/constants/spotlight.const';
|
|
5
|
+
import { ButtonComponent } from '../button/button.component';
|
|
6
|
+
import { CheckboxComponent } from '../checkbox/checkbox.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "@ngx-translate/core";
|
|
10
|
+
export class SpotlightComponent {
|
|
11
|
+
static SPOTLIGHT_DUPLICATE_LITERAL = 3;
|
|
12
|
+
title = input('');
|
|
13
|
+
message = input();
|
|
14
|
+
content = input(null);
|
|
15
|
+
position = input('bottom-center');
|
|
16
|
+
currentStep = input(1);
|
|
17
|
+
totalSteps = input(1);
|
|
18
|
+
showDoNotShowAgain = input(true);
|
|
19
|
+
actions = input([]);
|
|
20
|
+
arrowOffsetPx = input(null);
|
|
21
|
+
closed = output();
|
|
22
|
+
next = output();
|
|
23
|
+
previous = output();
|
|
24
|
+
understand = output();
|
|
25
|
+
isDoNotShowAgainChecked = signal(false);
|
|
26
|
+
closeLabelKey = SPOTLIGHT_CLOSE_LABEL_KEY;
|
|
27
|
+
backLabelKey = SPOTLIGHT_BACK_LABEL_KEY;
|
|
28
|
+
nextLabelKey = SPOTLIGHT_NEXT_LABEL_KEY;
|
|
29
|
+
completeLabelKey = SPOTLIGHT_COMPLETE_LABEL_KEY;
|
|
30
|
+
understoodLabelKey = SPOTLIGHT_UNDERSTOOD_LABEL_KEY;
|
|
31
|
+
doNotShowAgainLabelKey = SPOTLIGHT_DO_NOT_SHOW_AGAIN_LABEL_KEY;
|
|
32
|
+
stepCounterLabelKey = SPOTLIGHT_STEP_COUNTER_LABEL_KEY;
|
|
33
|
+
stepProgressLabelKey = SPOTLIGHT_STEP_PROGRESS_LABEL_KEY;
|
|
34
|
+
static instanceCount = 0;
|
|
35
|
+
static incrementInstanceCount() {
|
|
36
|
+
SpotlightComponent.instanceCount += 1;
|
|
37
|
+
return SpotlightComponent.instanceCount;
|
|
38
|
+
}
|
|
39
|
+
instanceId = `sdc-spotlight-${SpotlightComponent.incrementInstanceCount()}`;
|
|
40
|
+
titleId = `${this.instanceId}-title`;
|
|
41
|
+
descId = `${this.instanceId}-desc`;
|
|
42
|
+
get titleTemplate() {
|
|
43
|
+
const value = this.title();
|
|
44
|
+
return value instanceof TemplateRef ? value : null;
|
|
45
|
+
}
|
|
46
|
+
get titleString() {
|
|
47
|
+
const value = this.title();
|
|
48
|
+
return value instanceof TemplateRef ? '' : (value ?? '');
|
|
49
|
+
}
|
|
50
|
+
get messageTemplate() {
|
|
51
|
+
const value = this.message();
|
|
52
|
+
return value instanceof TemplateRef ? value : null;
|
|
53
|
+
}
|
|
54
|
+
get messageString() {
|
|
55
|
+
const value = this.message();
|
|
56
|
+
return value instanceof TemplateRef ? '' : (value ?? '');
|
|
57
|
+
}
|
|
58
|
+
get arrowPosition() {
|
|
59
|
+
const [direction, alignment] = this.position().split('-');
|
|
60
|
+
return `${this.getOppositeDirection(direction)}-${alignment}`;
|
|
61
|
+
}
|
|
62
|
+
get isArrowTop() {
|
|
63
|
+
return this.arrowPosition.startsWith('top-');
|
|
64
|
+
}
|
|
65
|
+
get isArrowBottom() {
|
|
66
|
+
return this.arrowPosition.startsWith('bottom-');
|
|
67
|
+
}
|
|
68
|
+
get isArrowLeft() {
|
|
69
|
+
return this.arrowPosition.startsWith('left-');
|
|
70
|
+
}
|
|
71
|
+
get isArrowRight() {
|
|
72
|
+
return this.arrowPosition.startsWith('right-');
|
|
73
|
+
}
|
|
74
|
+
get arrowTransform() {
|
|
75
|
+
const direction = this.arrowPosition.split('-')[0];
|
|
76
|
+
return this.getArrowTransformForDirection(direction);
|
|
77
|
+
}
|
|
78
|
+
get arrowJustifyContent() {
|
|
79
|
+
const offset = this.arrowOffsetPx();
|
|
80
|
+
if (offset !== null) {
|
|
81
|
+
return this.FLEX_START;
|
|
82
|
+
}
|
|
83
|
+
const alignment = this.arrowPosition.split('-')[1];
|
|
84
|
+
return this.getFlexPropertyForAlignment(alignment);
|
|
85
|
+
}
|
|
86
|
+
get arrowAlignItems() {
|
|
87
|
+
const alignment = this.arrowPosition.split('-')[1];
|
|
88
|
+
return this.getFlexPropertyForAlignment(alignment);
|
|
89
|
+
}
|
|
90
|
+
get arrowPaddingStyle() {
|
|
91
|
+
const offset = this.arrowOffsetPx();
|
|
92
|
+
if (offset === null) {
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
return this.isArrowTop || this.isArrowBottom
|
|
96
|
+
? { 'padding-left': `${offset}px` }
|
|
97
|
+
: { 'padding-top': `${offset}px` };
|
|
98
|
+
}
|
|
99
|
+
FLEX_START = 'flex-start';
|
|
100
|
+
FLEX_END = 'flex-end';
|
|
101
|
+
FLEX_CENTER = 'center';
|
|
102
|
+
getArrowTransformForDirection(direction) {
|
|
103
|
+
switch (direction) {
|
|
104
|
+
case 'bottom':
|
|
105
|
+
return 'rotate(180deg)';
|
|
106
|
+
case 'left':
|
|
107
|
+
return 'rotate(-90deg)';
|
|
108
|
+
case 'right':
|
|
109
|
+
return 'rotate(90deg)';
|
|
110
|
+
default:
|
|
111
|
+
return 'none';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
getFlexPropertyForAlignment(alignment) {
|
|
115
|
+
switch (alignment) {
|
|
116
|
+
case 'start':
|
|
117
|
+
return this.FLEX_START;
|
|
118
|
+
case 'end':
|
|
119
|
+
return this.FLEX_END;
|
|
120
|
+
default:
|
|
121
|
+
return this.FLEX_CENTER;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
onClose() {
|
|
125
|
+
this.closed.emit();
|
|
126
|
+
}
|
|
127
|
+
onNext() {
|
|
128
|
+
this.next.emit();
|
|
129
|
+
}
|
|
130
|
+
onPrevious() {
|
|
131
|
+
this.previous.emit();
|
|
132
|
+
}
|
|
133
|
+
onUnderstand() {
|
|
134
|
+
this.understand.emit();
|
|
135
|
+
}
|
|
136
|
+
toggleDoNotShowAgain() {
|
|
137
|
+
this.isDoNotShowAgainChecked.update((checked) => !checked);
|
|
138
|
+
}
|
|
139
|
+
getOppositeDirection(direction) {
|
|
140
|
+
switch (direction) {
|
|
141
|
+
case 'top':
|
|
142
|
+
return 'bottom';
|
|
143
|
+
case 'bottom':
|
|
144
|
+
return 'top';
|
|
145
|
+
case 'left':
|
|
146
|
+
return 'right';
|
|
147
|
+
case 'right':
|
|
148
|
+
return 'left';
|
|
149
|
+
default:
|
|
150
|
+
return direction;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
154
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpotlightComponent, isStandalone: true, selector: "sdc-spotlight", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, currentStep: { classPropertyName: "currentStep", publicName: "currentStep", isSignal: true, isRequired: false, transformFunction: null }, totalSteps: { classPropertyName: "totalSteps", publicName: "totalSteps", isSignal: true, isRequired: false, transformFunction: null }, showDoNotShowAgain: { classPropertyName: "showDoNotShowAgain", publicName: "showDoNotShowAgain", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, arrowOffsetPx: { classPropertyName: "arrowOffsetPx", publicName: "arrowOffsetPx", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", next: "next", previous: "previous", understand: "understand" }, ngImport: i0, template: "<div\n class=\"sdc-spotlight\"\n [class.sdc-spotlight--horizontal]=\"isArrowLeft || isArrowRight\"\n [attr.role]=\"totalSteps() > 1 ? 'dialog' : 'tooltip'\"\n [attr.aria-modal]=\"totalSteps() > 1 ? 'true' : null\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descId\"\n>\n @if (isArrowTop) {\n <ng-container [ngTemplateOutlet]=\"arrowTopTemplate\"></ng-container>\n }\n @if (isArrowLeft) {\n <ng-container [ngTemplateOutlet]=\"arrowLeftTemplate\"></ng-container>\n }\n\n <div class=\"sdc-spotlight__card\">\n <span\n class=\"sdc-spotlight__sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n @if (totalSteps() > 1) {\n {{ stepProgressLabelKey | translate: { current: currentStep(), total: totalSteps() } }}\n }\n </span>\n\n <header class=\"sdc-spotlight__header\">\n <h2\n [id]=\"titleId\"\n class=\"sdc-spotlight__title\"\n >\n @if (titleTemplate) {\n <ng-container [ngTemplateOutlet]=\"titleTemplate\"></ng-container>\n } @else {\n {{ titleString }}\n }\n </h2>\n\n <button\n type=\"button\"\n class=\"sdc-spotlight__close\"\n [attr.aria-label]=\"closeLabelKey | translate\"\n (click)=\"onClose()\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </header>\n\n @if (content()) {\n <ng-container [ngTemplateOutlet]=\"content()\"></ng-container>\n }\n\n <div class=\"sdc-spotlight__body\">\n <div\n [id]=\"descId\"\n class=\"sdc-spotlight__message\"\n >\n @if (messageTemplate) {\n <ng-container [ngTemplateOutlet]=\"messageTemplate\"></ng-container>\n } @else {\n {{ messageString }}\n }\n </div>\n\n <div class=\"sdc-spotlight__footer\">\n @if (totalSteps() > 1) {\n <p class=\"sdc-spotlight__counter\">\n {{ stepCounterLabelKey | translate: { current: currentStep(), total: totalSteps() } }}\n </p>\n }\n\n @if (totalSteps() === 1 && showDoNotShowAgain()) {\n <sdc-checkbox\n [checked]=\"isDoNotShowAgainChecked()\"\n [label]=\"doNotShowAgainLabelKey\"\n (checkedChange)=\"toggleDoNotShowAgain()\"\n ></sdc-checkbox>\n }\n\n <div class=\"sdc-spotlight__actions\">\n @for (action of actions(); track action.label) {\n <sdc-button\n priority=\"default\"\n size=\"small\"\n [label]=\"action.label\"\n (clicked)=\"action.handler()\"\n ></sdc-button>\n }\n\n @if (totalSteps() > 1 && currentStep() > 1) {\n <sdc-button\n priority=\"default\"\n size=\"small\"\n [label]=\"backLabelKey\"\n (clicked)=\"onPrevious()\"\n ></sdc-button>\n }\n\n <sdc-button\n priority=\"secondary\"\n size=\"small\"\n [label]=\"\n totalSteps() <= 1\n ? understoodLabelKey\n : currentStep() < totalSteps()\n ? nextLabelKey\n : completeLabelKey\n \"\n (clicked)=\"totalSteps() > 1 ? onNext() : onUnderstand()\"\n ></sdc-button>\n </div>\n </div>\n </div>\n </div>\n\n @if (isArrowBottom) {\n <ng-container [ngTemplateOutlet]=\"arrowBottomTemplate\"></ng-container>\n }\n @if (isArrowRight) {\n <ng-container [ngTemplateOutlet]=\"arrowRightTemplate\"></ng-container>\n }\n</div>\n\n<ng-template #arrowTopTemplate>\n <div\n class=\"sdc-spotlight__arrow-row\"\n [style.justify-content]=\"arrowJustifyContent\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowBottomTemplate>\n <div\n class=\"sdc-spotlight__arrow-row\"\n [style.justify-content]=\"arrowJustifyContent\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowLeftTemplate>\n <div\n class=\"sdc-spotlight__arrow-column\"\n [style.align-items]=\"arrowAlignItems\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowRightTemplate>\n <div\n class=\"sdc-spotlight__arrow-column\"\n [style.align-items]=\"arrowAlignItems\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n", styles: [".sdc-spotlight{display:flex;flex-direction:column;max-width:21.375rem;color:#212533}.sdc-spotlight--horizontal{flex-direction:row}.sdc-spotlight__card{position:relative;overflow:hidden;border-radius:.25rem;background:#fff;box-shadow:0 3px 5px #0003,0 1px 18px #0000001f,0 6px 10px #00000024}.sdc-spotlight__header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.75rem}.sdc-spotlight__title{flex:1;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:700}.sdc-spotlight__close{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;border:0;background:transparent;cursor:pointer}.sdc-spotlight__body{display:flex;flex-direction:column;gap:1.25rem;padding:.75rem}.sdc-spotlight__message{white-space:pre-wrap;font-size:.875rem;line-height:1.5}.sdc-spotlight__footer{display:flex;flex-direction:column;gap:.75rem}.sdc-spotlight__counter{margin:0;font-size:.875rem}.sdc-spotlight__actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem}.sdc-spotlight__arrow-row{display:flex;width:100%;height:.5rem;padding:0 .75rem;color:#fff}.sdc-spotlight__arrow-column{display:flex;width:.5rem;align-self:stretch;padding:0;color:#fff}.sdc-spotlight__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
155
|
+
}
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightComponent, decorators: [{
|
|
157
|
+
type: Component,
|
|
158
|
+
args: [{ selector: 'sdc-spotlight', standalone: true, imports: [CommonModule, TranslateModule, ButtonComponent, CheckboxComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div\n class=\"sdc-spotlight\"\n [class.sdc-spotlight--horizontal]=\"isArrowLeft || isArrowRight\"\n [attr.role]=\"totalSteps() > 1 ? 'dialog' : 'tooltip'\"\n [attr.aria-modal]=\"totalSteps() > 1 ? 'true' : null\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descId\"\n>\n @if (isArrowTop) {\n <ng-container [ngTemplateOutlet]=\"arrowTopTemplate\"></ng-container>\n }\n @if (isArrowLeft) {\n <ng-container [ngTemplateOutlet]=\"arrowLeftTemplate\"></ng-container>\n }\n\n <div class=\"sdc-spotlight__card\">\n <span\n class=\"sdc-spotlight__sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n @if (totalSteps() > 1) {\n {{ stepProgressLabelKey | translate: { current: currentStep(), total: totalSteps() } }}\n }\n </span>\n\n <header class=\"sdc-spotlight__header\">\n <h2\n [id]=\"titleId\"\n class=\"sdc-spotlight__title\"\n >\n @if (titleTemplate) {\n <ng-container [ngTemplateOutlet]=\"titleTemplate\"></ng-container>\n } @else {\n {{ titleString }}\n }\n </h2>\n\n <button\n type=\"button\"\n class=\"sdc-spotlight__close\"\n [attr.aria-label]=\"closeLabelKey | translate\"\n (click)=\"onClose()\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </header>\n\n @if (content()) {\n <ng-container [ngTemplateOutlet]=\"content()\"></ng-container>\n }\n\n <div class=\"sdc-spotlight__body\">\n <div\n [id]=\"descId\"\n class=\"sdc-spotlight__message\"\n >\n @if (messageTemplate) {\n <ng-container [ngTemplateOutlet]=\"messageTemplate\"></ng-container>\n } @else {\n {{ messageString }}\n }\n </div>\n\n <div class=\"sdc-spotlight__footer\">\n @if (totalSteps() > 1) {\n <p class=\"sdc-spotlight__counter\">\n {{ stepCounterLabelKey | translate: { current: currentStep(), total: totalSteps() } }}\n </p>\n }\n\n @if (totalSteps() === 1 && showDoNotShowAgain()) {\n <sdc-checkbox\n [checked]=\"isDoNotShowAgainChecked()\"\n [label]=\"doNotShowAgainLabelKey\"\n (checkedChange)=\"toggleDoNotShowAgain()\"\n ></sdc-checkbox>\n }\n\n <div class=\"sdc-spotlight__actions\">\n @for (action of actions(); track action.label) {\n <sdc-button\n priority=\"default\"\n size=\"small\"\n [label]=\"action.label\"\n (clicked)=\"action.handler()\"\n ></sdc-button>\n }\n\n @if (totalSteps() > 1 && currentStep() > 1) {\n <sdc-button\n priority=\"default\"\n size=\"small\"\n [label]=\"backLabelKey\"\n (clicked)=\"onPrevious()\"\n ></sdc-button>\n }\n\n <sdc-button\n priority=\"secondary\"\n size=\"small\"\n [label]=\"\n totalSteps() <= 1\n ? understoodLabelKey\n : currentStep() < totalSteps()\n ? nextLabelKey\n : completeLabelKey\n \"\n (clicked)=\"totalSteps() > 1 ? onNext() : onUnderstand()\"\n ></sdc-button>\n </div>\n </div>\n </div>\n </div>\n\n @if (isArrowBottom) {\n <ng-container [ngTemplateOutlet]=\"arrowBottomTemplate\"></ng-container>\n }\n @if (isArrowRight) {\n <ng-container [ngTemplateOutlet]=\"arrowRightTemplate\"></ng-container>\n }\n</div>\n\n<ng-template #arrowTopTemplate>\n <div\n class=\"sdc-spotlight__arrow-row\"\n [style.justify-content]=\"arrowJustifyContent\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowBottomTemplate>\n <div\n class=\"sdc-spotlight__arrow-row\"\n [style.justify-content]=\"arrowJustifyContent\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowLeftTemplate>\n <div\n class=\"sdc-spotlight__arrow-column\"\n [style.align-items]=\"arrowAlignItems\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowRightTemplate>\n <div\n class=\"sdc-spotlight__arrow-column\"\n [style.align-items]=\"arrowAlignItems\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n [style.transform]=\"arrowTransform\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n", styles: [".sdc-spotlight{display:flex;flex-direction:column;max-width:21.375rem;color:#212533}.sdc-spotlight--horizontal{flex-direction:row}.sdc-spotlight__card{position:relative;overflow:hidden;border-radius:.25rem;background:#fff;box-shadow:0 3px 5px #0003,0 1px 18px #0000001f,0 6px 10px #00000024}.sdc-spotlight__header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.75rem}.sdc-spotlight__title{flex:1;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:700}.sdc-spotlight__close{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;border:0;background:transparent;cursor:pointer}.sdc-spotlight__body{display:flex;flex-direction:column;gap:1.25rem;padding:.75rem}.sdc-spotlight__message{white-space:pre-wrap;font-size:.875rem;line-height:1.5}.sdc-spotlight__footer{display:flex;flex-direction:column;gap:.75rem}.sdc-spotlight__counter{margin:0;font-size:.875rem}.sdc-spotlight__actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem}.sdc-spotlight__arrow-row{display:flex;width:100%;height:.5rem;padding:0 .75rem;color:#fff}.sdc-spotlight__arrow-column{display:flex;width:.5rem;align-self:stretch;padding:0;color:#fff}.sdc-spotlight__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
|
|
159
|
+
}] });
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvc3BvdGxpZ2h0L3Nwb3RsaWdodC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Nwb3RsaWdodC9zcG90bGlnaHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIscUNBQXFDLEVBQ3JDLHdCQUF3QixFQUN4QixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEVBQ2pDLDhCQUE4QixFQUMvQixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7OztBQVduRSxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLE1BQU0sQ0FBVSwyQkFBMkIsR0FBRyxDQUFDLENBQUM7SUFFeEQsS0FBSyxHQUFHLEtBQUssQ0FBZ0MsRUFBRSxDQUFDLENBQUM7SUFDakQsT0FBTyxHQUFHLEtBQUssRUFBaUMsQ0FBQztJQUNqRCxPQUFPLEdBQUcsS0FBSyxDQUE4QixJQUFJLENBQUMsQ0FBQztJQUNuRCxRQUFRLEdBQUcsS0FBSyxDQUFvQixlQUFlLENBQUMsQ0FBQztJQUNyRCxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMs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RSxDQUFDO0lBQ3pCLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUI7UUFDNUMsUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNsQixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxRQUFRLENBQUM7WUFDbEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sT0FBTyxDQUFDO1lBQ2pCLEtBQUssT0FBTztnQkFDVixPQUFPLE1BQU0sQ0FBQztZQUNoQjtnQkFDRSxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQzt3R0E1S1Usa0JBQWtCOzRGQUFsQixrQkFBa0IscTJDQzNCL0IsaXFLQTBNQSwwNkNEckxZLFlBQVksMFJBQUUsZUFBZSw0RkFBRSxlQUFlLDhTQUFFLGlCQUFpQjs7NEZBTWhFLGtCQUFrQjtrQkFUOUIsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUMsbUJBRzNELHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVGVtcGxhdGVSZWYsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQge1xuICBTUE9UTElHSFRfQkFDS19MQUJFTF9LRVksXG4gIFNQT1RMSUdIVF9DTE9TRV9MQUJFTF9LRVksXG4gIFNQT1RMSUdIVF9DT01QTEVURV9MQUJFTF9LRVksXG4gIFNQT1RMSUdIVF9ET19OT1RfU0hPV19BR0FJTl9MQUJFTF9LRVksXG4gIFNQT1RMSUdIVF9ORVhUX0xBQkVMX0tFWSxcbiAgU1BPVExJR0hUX1NURVBfQ09VTlRFUl9MQUJFTF9LRVksXG4gIFNQT1RMSUdIVF9TVEVQX1BST0dSRVNTX0xBQkVMX0tFWSxcbiAgU1BPVExJR0hUX1VOREVSU1RPT0RfTEFCRUxfS0VZXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL3Nwb3RsaWdodC5jb25zdCc7XG5pbXBvcnQgdHlwZSB7IFNwb3RsaWdodFBvc2l0aW9uLCBTcG90bGlnaHRTdGVwQWN0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zcG90bGlnaHQudHlwZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1zcG90bGlnaHQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgQ2hlY2tib3hDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BvdGxpZ2h0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3BvdGxpZ2h0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZFxufSlcbmV4cG9ydCBjbGFzcyBTcG90bGlnaHRDb21wb25lbnQge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUE9UTElHSFRfRFVQTElDQVRFX0xJVEVSQUwgPSAzO1xuXG4gIHRpdGxlID0gaW5wdXQ8c3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj4+KCcnKTtcbiAgbWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+PigpO1xuICBjb250ZW50ID0gaW5wdXQ8VGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsPihudWxsKTtcbiAgcG9zaXRpb24gPSBpbnB1dDxTcG90bGlnaHRQb3NpdGlvbj4oJ2JvdHRvbS1jZW50ZXInKTtcbiAgY3VycmVudFN0ZXAgPSBpbnB1dCgxKTtcbiAgdG90YWxTdGVwcyA9IGlucHV0KDEpO1xuICBzaG93RG9Ob3RTaG93QWdhaW4gPSBpbnB1dCh0cnVlKTtcbiAgYWN0aW9ucyA9IGlucHV0PFNwb3RsaWdodFN0ZXBBY3Rpb25bXT4oW10pO1xuICBhcnJvd09mZnNldFB4ID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgY2xvc2VkID0gb3V0cHV0KCk7XG4gIG5leHQgPSBvdXRwdXQoKTtcbiAgcHJldmlvdXMgPSBvdXRwdXQoKTtcbiAgdW5kZXJzdGFuZCA9IG91dHB1dCgpO1xuXG4gIGlzRG9Ob3RTaG93QWdhaW5DaGVja2VkID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xvc2VMYWJlbEtleSA9IFNQT1RMSUdIVF9DTE9TRV9MQUJFTF9LRVk7XG4gIHByb3RlY3RlZCByZWFkb25seSBiYWNrTGFiZWxLZXkgPSBTUE9UTElHSFRfQkFDS19MQUJFTF9LRVk7XG4gIHByb3RlY3RlZCByZWFkb25seSBuZXh0TGFiZWxLZXkgPSBTUE9UTElHSFRfTkVYVF9MQUJFTF9LRVk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb21wbGV0ZUxhYmVsS2V5ID0gU1BPVExJR0hUX0NPTVBMRVRFX0xBQkVMX0tFWTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHVuZGVyc3Rvb2RMYWJlbEtleSA9IFNQT1RMSUdIVF9VTkRFUlNUT09EX0xBQkVMX0tFWTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRvTm90U2hvd0FnYWluTGFiZWxLZXkgPSBTUE9UTElHSFRfRE9fTk9UX1NIT1dfQUdBSU5fTEFCRUxfS0VZO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RlcENvdW50ZXJMYWJlbEtleSA9IFNQT1RMSUdIVF9TVEVQX0NPVU5URVJfTEFCRUxfS0VZO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RlcFByb2dyZXNzTGFiZWxLZXkgPSBTUE9UTElHSFRfU1RFUF9QUk9HUkVTU19MQUJFTF9LRVk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VDb3VudCA9IDA7XG4gIHByaXZhdGUgc3RhdGljIGluY3JlbWVudEluc3RhbmNlQ291bnQoKTogbnVtYmVyIHtcbiAgICBTcG90bGlnaHRDb21wb25lbnQuaW5zdGFuY2VDb3VudCArPSAxO1xuICAgIHJldHVybiBTcG90bGlnaHRDb21wb25lbnQuaW5zdGFuY2VDb3VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBpbnN0YW5jZUlkID0gYHNkYy1zcG90bGlnaHQtJHtTcG90bGlnaHRDb21wb25lbnQuaW5jcmVtZW50SW5zdGFuY2VDb3VudCgpfWA7XG4gIHByb3RlY3RlZCByZWFkb25seSB0aXRsZUlkID0gYCR7dGhpcy5pbnN0YW5jZUlkfS10aXRsZWA7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXNjSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LWRlc2NgO1xuXG4gIHByb3RlY3RlZCBnZXQgdGl0bGVUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50aXRsZSgpO1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gdmFsdWUgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0aXRsZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50aXRsZSgpO1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gJycgOiAodmFsdWUgPz8gJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtZXNzYWdlVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWVzc2FnZSgpO1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gdmFsdWUgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtZXNzYWdlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1lc3NhZ2UoKTtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiA/ICcnIDogKHZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYXJyb3dQb3NpdGlvbigpOiBTcG90bGlnaHRQb3NpdGlvbiB7XG4gICAgY29uc3QgW2RpcmVjdGlvbiwgYWxpZ25tZW50XSA9IHRoaXMucG9zaXRpb24oKS5zcGxpdCgnLScpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uKX0tJHthbGlnbm1lbnR9YCBhcyBTcG90bGlnaHRQb3NpdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNBcnJvd1RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcnJvd1Bvc2l0aW9uLnN0YXJ0c1dpdGgoJ3RvcC0nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNBcnJvd0JvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcnJvd1Bvc2l0aW9uLnN0YXJ0c1dpdGgoJ2JvdHRvbS0nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNBcnJvd0xlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXJyb3dQb3NpdGlvbi5zdGFydHNXaXRoKCdsZWZ0LScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc0Fycm93UmlnaHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXJyb3dQb3NpdGlvbi5zdGFydHNXaXRoKCdyaWdodC0nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYXJyb3dUcmFuc2Zvcm0oKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmFycm93UG9zaXRpb24uc3BsaXQoJy0nKVswXTtcbiAgICByZXR1cm4gdGhpcy5nZXRBcnJvd1RyYW5zZm9ybUZvckRpcmVjdGlvbihkaXJlY3Rpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhcnJvd0p1c3RpZnlDb250ZW50KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5hcnJvd09mZnNldFB4KCk7XG4gICAgaWYgKG9mZnNldCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuRkxFWF9TVEFSVDtcbiAgICB9XG5cbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLmFycm93UG9zaXRpb24uc3BsaXQoJy0nKVsxXTtcbiAgICByZXR1cm4gdGhpcy5nZXRGbGV4UHJvcGVydHlGb3JBbGlnbm1lbnQoYWxpZ25tZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYXJyb3dBbGlnbkl0ZW1zKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYWxpZ25tZW50ID0gdGhpcy5hcnJvd1Bvc2l0aW9uLnNwbGl0KCctJylbMV07XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmxleFByb3BlcnR5Rm9yQWxpZ25tZW50KGFsaWdubWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFycm93UGFkZGluZ1N0eWxlKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYXJyb3dPZmZzZXRQeCgpO1xuICAgIGlmIChvZmZzZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc0Fycm93VG9wIHx8IHRoaXMuaXNBcnJvd0JvdHRvbVxuICAgICAgPyB7ICdwYWRkaW5nLWxlZnQnOiBgJHtvZmZzZXR9cHhgIH1cbiAgICAgIDogeyAncGFkZGluZy10b3AnOiBgJHtvZmZzZXR9cHhgIH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IEZMRVhfU1RBUlQgPSAnZmxleC1zdGFydCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgRkxFWF9FTkQgPSAnZmxleC1lbmQnO1xuICBwcml2YXRlIHJlYWRvbmx5IEZMRVhfQ0VOVEVSID0gJ2NlbnRlcic7XG5cbiAgcHJpdmF0ZSBnZXRBcnJvd1RyYW5zZm9ybUZvckRpcmVjdGlvbihkaXJlY3Rpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHJldHVybiAncm90YXRlKDE4MGRlZyknO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHJldHVybiAncm90YXRlKC05MGRlZyknO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gJ3JvdGF0ZSg5MGRlZyknO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZsZXhQcm9wZXJ0eUZvckFsaWdubWVudChhbGlnbm1lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRkxFWF9TVEFSVDtcbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIHJldHVybiB0aGlzLkZMRVhfRU5EO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuRkxFWF9DRU5URVI7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLm5leHQuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aW91cy5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmRlcnN0YW5kKCk6IHZvaWQge1xuICAgIHRoaXMudW5kZXJzdGFuZC5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRG9Ob3RTaG93QWdhaW4oKTogdm9pZCB7XG4gICAgdGhpcy5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZC51cGRhdGUoKGNoZWNrZWQpID0+ICFjaGVja2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICByZXR1cm4gJ3RvcCc7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGlyZWN0aW9uO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInNkYy1zcG90bGlnaHRcIlxuICBbY2xhc3Muc2RjLXNwb3RsaWdodC0taG9yaXpvbnRhbF09XCJpc0Fycm93TGVmdCB8fCBpc0Fycm93UmlnaHRcIlxuICBbYXR0ci5yb2xlXT1cInRvdGFsU3RlcHMoKSA+IDEgPyAnZGlhbG9nJyA6ICd0b29sdGlwJ1wiXG4gIFthdHRyLmFyaWEtbW9kYWxdPVwidG90YWxTdGVwcygpID4gMSA/ICd0cnVlJyA6IG51bGxcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidGl0bGVJZFwiXG4gIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZGVzY0lkXCJcbj5cbiAgQGlmIChpc0Fycm93VG9wKSB7XG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYXJyb3dUb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICB9XG4gIEBpZiAoaXNBcnJvd0xlZnQpIHtcbiAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhcnJvd0xlZnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICB9XG5cbiAgPGRpdiBjbGFzcz1cInNkYy1zcG90bGlnaHRfX2NhcmRcIj5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJzZGMtc3BvdGxpZ2h0X19zci1vbmx5XCJcbiAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuICAgID5cbiAgICAgIEBpZiAodG90YWxTdGVwcygpID4gMSkge1xuICAgICAge3sgc3RlcFByb2dyZXNzTGFiZWxLZXkgfCB0cmFuc2xhdGU6IHsgY3VycmVudDogY3VycmVudFN0ZXAoKSwgdG90YWw6IHRvdGFsU3RlcHMoKSB9IH19XG4gICAgICB9XG4gICAgPC9zcGFuPlxuXG4gICAgPGhlYWRlciBjbGFzcz1cInNkYy1zcG90bGlnaHRfX2hlYWRlclwiPlxuICAgICAgPGgyXG4gICAgICAgIFtpZF09XCJ0aXRsZUlkXCJcbiAgICAgICAgY2xhc3M9XCJzZGMtc3BvdGxpZ2h0X190aXRsZVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAodGl0bGVUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRpdGxlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIHt7IHRpdGxlU3RyaW5nIH19XG4gICAgICAgIH1cbiAgICAgIDwvaDI+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic2RjLXNwb3RsaWdodF9fY2xvc2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNsb3NlTGFiZWxLZXkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2hlYWRlcj5cblxuICAgIEBpZiAoY29udGVudCgpKSB7XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50KClcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLXNwb3RsaWdodF9fYm9keVwiPlxuICAgICAgPGRpdlxuICAgICAgICBbaWRdPVwiZGVzY0lkXCJcbiAgICAgICAgY2xhc3M9XCJzZGMtc3BvdGxpZ2h0X19tZXNzYWdlXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChtZXNzYWdlVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIHt7IG1lc3NhZ2VTdHJpbmcgfX1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZGMtc3BvdGxpZ2h0X19mb290ZXJcIj5cbiAgICAgICAgQGlmICh0b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICAgIDxwIGNsYXNzPVwic2RjLXNwb3RsaWdodF9fY291bnRlclwiPlxuICAgICAgICAgIHt7IHN0ZXBDb3VudGVyTGFiZWxLZXkgfCB0cmFuc2xhdGU6IHsgY3VycmVudDogY3VycmVudFN0ZXAoKSwgdG90YWw6IHRvdGFsU3RlcHMoKSB9IH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAodG90YWxTdGVwcygpID09PSAxICYmIHNob3dEb05vdFNob3dBZ2FpbigpKSB7XG4gICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICBbY2hlY2tlZF09XCJpc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpXCJcbiAgICAgICAgICBbbGFiZWxdPVwiZG9Ob3RTaG93QWdhaW5MYWJlbEtleVwiXG4gICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlRG9Ob3RTaG93QWdhaW4oKVwiXG4gICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtc3BvdGxpZ2h0X19hY3Rpb25zXCI+XG4gICAgICAgICAgQGZvciAoYWN0aW9uIG9mIGFjdGlvbnMoKTsgdHJhY2sgYWN0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIHByaW9yaXR5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImFjdGlvbi5sYWJlbFwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJhY3Rpb24uaGFuZGxlcigpXCJcbiAgICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAodG90YWxTdGVwcygpID4gMSAmJiBjdXJyZW50U3RlcCgpID4gMSkge1xuICAgICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgICBwcmlvcml0eT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJiYWNrTGFiZWxLZXlcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwib25QcmV2aW91cygpXCJcbiAgICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgICBwcmlvcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgICAgICB0b3RhbFN0ZXBzKCkgPD0gMVxuICAgICAgICAgICAgICAgID8gdW5kZXJzdG9vZExhYmVsS2V5XG4gICAgICAgICAgICAgICAgOiBjdXJyZW50U3RlcCgpIDwgdG90YWxTdGVwcygpXG4gICAgICAgICAgICAgICAgICA/IG5leHRMYWJlbEtleVxuICAgICAgICAgICAgICAgICAgOiBjb21wbGV0ZUxhYmVsS2V5XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwidG90YWxTdGVwcygpID4gMSA/IG9uTmV4dCgpIDogb25VbmRlcnN0YW5kKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIEBpZiAoaXNBcnJvd0JvdHRvbSkge1xuICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFycm93Qm90dG9tVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgfVxuICBAaWYgKGlzQXJyb3dSaWdodCkge1xuICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFycm93UmlnaHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNhcnJvd1RvcFRlbXBsYXRlPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzZGMtc3BvdGxpZ2h0X19hcnJvdy1yb3dcIlxuICAgIFtzdHlsZS5qdXN0aWZ5LWNvbnRlbnRdPVwiYXJyb3dKdXN0aWZ5Q29udGVudFwiXG4gICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICA+XG4gICAgPHN2Z1xuICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICBbc3R5bGUudHJhbnNmb3JtXT1cImFycm93VHJhbnNmb3JtXCJcbiAgICA+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgLz5cbiAgICA8L3N2Zz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Fycm93Qm90dG9tVGVtcGxhdGU+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNkYy1zcG90bGlnaHRfX2Fycm93LXJvd1wiXG4gICAgW3N0eWxlLmp1c3RpZnktY29udGVudF09XCJhcnJvd0p1c3RpZnlDb250ZW50XCJcbiAgICBbbmdTdHlsZV09XCJhcnJvd1BhZGRpbmdTdHlsZVwiXG4gID5cbiAgICA8c3ZnXG4gICAgICB3aWR0aD1cIjE2XCJcbiAgICAgIGhlaWdodD1cIjhcIlxuICAgICAgdmlld0JveD1cIjAgMCAxNiA4XCJcbiAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiYXJyb3dUcmFuc2Zvcm1cIlxuICAgID5cbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9XCJNMCA4TDggMEwxNiA4XCJcbiAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAvPlxuICAgIDwvc3ZnPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXJyb3dMZWZ0VGVtcGxhdGU+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNkYy1zcG90bGlnaHRfX2Fycm93LWNvbHVtblwiXG4gICAgW3N0eWxlLmFsaWduLWl0ZW1zXT1cImFycm93QWxpZ25JdGVtc1wiXG4gICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICA+XG4gICAgPHN2Z1xuICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICBbc3R5bGUudHJhbnNmb3JtXT1cImFycm93VHJhbnNmb3JtXCJcbiAgICA+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgLz5cbiAgICA8L3N2Zz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Fycm93UmlnaHRUZW1wbGF0ZT5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2RjLXNwb3RsaWdodF9fYXJyb3ctY29sdW1uXCJcbiAgICBbc3R5bGUuYWxpZ24taXRlbXNdPVwiYXJyb3dBbGlnbkl0ZW1zXCJcbiAgICBbbmdTdHlsZV09XCJhcnJvd1BhZGRpbmdTdHlsZVwiXG4gID5cbiAgICA8c3ZnXG4gICAgICB3aWR0aD1cIjE2XCJcbiAgICAgIGhlaWdodD1cIjhcIlxuICAgICAgdmlld0JveD1cIjAgMCAxNiA4XCJcbiAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiYXJyb3dUcmFuc2Zvcm1cIlxuICAgID5cbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9XCJNMCA4TDggMEwxNiA4XCJcbiAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAvPlxuICAgIDwvc3ZnPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation, forwardRef, inject } from '@angular/core';
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
5
|
+
import { STAR_RATING_ARIA_LABEL_KEY, STAR_RATING_DEFAULT_MAX, STAR_RATING_DEFAULT_VALUE, STAR_RATING_STAR_LABEL_KEY } from '../../core/constants/star-rating.const';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class StarRatingComponent {
|
|
8
|
+
cdr = inject(ChangeDetectorRef);
|
|
9
|
+
translate = inject(TranslateService);
|
|
10
|
+
value = STAR_RATING_DEFAULT_VALUE;
|
|
11
|
+
maxStars = STAR_RATING_DEFAULT_MAX;
|
|
12
|
+
disabled = false;
|
|
13
|
+
ariaLabel;
|
|
14
|
+
valueChange = new EventEmitter();
|
|
15
|
+
onChangeFn = () => { };
|
|
16
|
+
onTouchedFn = () => { };
|
|
17
|
+
get stars() {
|
|
18
|
+
return Array.from({ length: this.maxStars }, (_, i) => i + 1);
|
|
19
|
+
}
|
|
20
|
+
get groupAriaLabel() {
|
|
21
|
+
if (this.ariaLabel) {
|
|
22
|
+
return this.translate.instant(this.ariaLabel);
|
|
23
|
+
}
|
|
24
|
+
return this.translate.instant(STAR_RATING_ARIA_LABEL_KEY);
|
|
25
|
+
}
|
|
26
|
+
isFilled(star) {
|
|
27
|
+
return star <= this.value;
|
|
28
|
+
}
|
|
29
|
+
getStarAriaLabel(star) {
|
|
30
|
+
return this.translate.instant(STAR_RATING_STAR_LABEL_KEY, { n: star });
|
|
31
|
+
}
|
|
32
|
+
onStarClick(star) {
|
|
33
|
+
if (this.disabled) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const next = this.value === star ? 0 : star;
|
|
37
|
+
this.value = next;
|
|
38
|
+
this.onChangeFn(next);
|
|
39
|
+
this.onTouchedFn();
|
|
40
|
+
this.valueChange.emit(next);
|
|
41
|
+
this.cdr.markForCheck();
|
|
42
|
+
}
|
|
43
|
+
onKeydown(event, star) {
|
|
44
|
+
if (this.disabled) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
this.onStarClick(star);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
writeValue(value) {
|
|
53
|
+
this.value = value ?? STAR_RATING_DEFAULT_VALUE;
|
|
54
|
+
this.cdr.markForCheck();
|
|
55
|
+
}
|
|
56
|
+
registerOnChange(fn) {
|
|
57
|
+
this.onChangeFn = fn;
|
|
58
|
+
}
|
|
59
|
+
registerOnTouched(fn) {
|
|
60
|
+
this.onTouchedFn = fn;
|
|
61
|
+
}
|
|
62
|
+
setDisabledState(isDisabled) {
|
|
63
|
+
this.disabled = isDisabled;
|
|
64
|
+
this.cdr.markForCheck();
|
|
65
|
+
}
|
|
66
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StarRatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
67
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StarRatingComponent, isStandalone: true, selector: "sdc-star-rating", inputs: { value: "value", maxStars: "maxStars", disabled: "disabled", ariaLabel: "ariaLabel" }, outputs: { valueChange: "valueChange" }, providers: [
|
|
68
|
+
{
|
|
69
|
+
provide: NG_VALUE_ACCESSOR,
|
|
70
|
+
useExisting: forwardRef(() => StarRatingComponent),
|
|
71
|
+
multi: true
|
|
72
|
+
}
|
|
73
|
+
], ngImport: i0, template: "<div\n class=\"sdc-star-rating\"\n [class.sdc-star-rating--disabled]=\"disabled\"\n [attr.aria-label]=\"groupAriaLabel\"\n>\n @for (star of stars; track star) {\n <button\n type=\"button\"\n class=\"sdc-star-rating__star\"\n [class.sdc-star-rating__star--filled]=\"isFilled(star)\"\n [attr.aria-label]=\"getStarAriaLabel(star)\"\n [disabled]=\"disabled\"\n (click)=\"onStarClick(star)\"\n (keydown)=\"onKeydown($event, star)\"\n >\n @if (isFilled(star)) {\n <i class=\"fas fa-star\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"far fa-star\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n</div>\n", styles: [":host{display:inline-flex}.sdc-star-rating{--sdc-star-rating-color: #f5a319;--sdc-star-rating-size: 1.25rem;--sdc-star-rating-gap: .5rem;align-items:center;display:inline-flex;gap:var(--sdc-star-rating-gap)}.sdc-star-rating--disabled{cursor:not-allowed;opacity:.65}.sdc-star-rating__star{color:var(--sdc-star-rating-color);cursor:pointer;font-size:var(--sdc-star-rating-size);line-height:1;transition:transform var(--sdc-transition-fast, .18s ease),opacity var(--sdc-transition-fast, .18s ease);-webkit-user-select:none;user-select:none}.sdc-star-rating__star:focus-visible{border-radius:2px;outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-star-rating--disabled .sdc-star-rating__star{cursor:not-allowed;pointer-events:none}.sdc-star-rating__star:hover:not(.sdc-star-rating--disabled .sdc-star-rating__star){opacity:.8;transform:scale(1.15)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
74
|
+
}
|
|
75
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StarRatingComponent, decorators: [{
|
|
76
|
+
type: Component,
|
|
77
|
+
args: [{ selector: 'sdc-star-rating', standalone: true, imports: [CommonModule, TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
|
|
78
|
+
{
|
|
79
|
+
provide: NG_VALUE_ACCESSOR,
|
|
80
|
+
useExisting: forwardRef(() => StarRatingComponent),
|
|
81
|
+
multi: true
|
|
82
|
+
}
|
|
83
|
+
], template: "<div\n class=\"sdc-star-rating\"\n [class.sdc-star-rating--disabled]=\"disabled\"\n [attr.aria-label]=\"groupAriaLabel\"\n>\n @for (star of stars; track star) {\n <button\n type=\"button\"\n class=\"sdc-star-rating__star\"\n [class.sdc-star-rating__star--filled]=\"isFilled(star)\"\n [attr.aria-label]=\"getStarAriaLabel(star)\"\n [disabled]=\"disabled\"\n (click)=\"onStarClick(star)\"\n (keydown)=\"onKeydown($event, star)\"\n >\n @if (isFilled(star)) {\n <i class=\"fas fa-star\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"far fa-star\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n</div>\n", styles: [":host{display:inline-flex}.sdc-star-rating{--sdc-star-rating-color: #f5a319;--sdc-star-rating-size: 1.25rem;--sdc-star-rating-gap: .5rem;align-items:center;display:inline-flex;gap:var(--sdc-star-rating-gap)}.sdc-star-rating--disabled{cursor:not-allowed;opacity:.65}.sdc-star-rating__star{color:var(--sdc-star-rating-color);cursor:pointer;font-size:var(--sdc-star-rating-size);line-height:1;transition:transform var(--sdc-transition-fast, .18s ease),opacity var(--sdc-transition-fast, .18s ease);-webkit-user-select:none;user-select:none}.sdc-star-rating__star:focus-visible{border-radius:2px;outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-star-rating--disabled .sdc-star-rating__star{cursor:not-allowed;pointer-events:none}.sdc-star-rating__star:hover:not(.sdc-star-rating--disabled .sdc-star-rating__star){opacity:.8;transform:scale(1.15)}\n"] }]
|
|
84
|
+
}], propDecorators: { value: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}], maxStars: [{
|
|
87
|
+
type: Input
|
|
88
|
+
}], disabled: [{
|
|
89
|
+
type: Input
|
|
90
|
+
}], ariaLabel: [{
|
|
91
|
+
type: Input
|
|
92
|
+
}], valueChange: [{
|
|
93
|
+
type: Output
|
|
94
|
+
}] } });
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rhci1yYXRpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9zdGFyLXJhdGluZy9zdGFyLXJhdGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3N0YXItcmF0aW5nL3N0YXItcmF0aW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzNCLE1BQU0sd0NBQXdDLENBQUM7O0FBa0JoRCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3QyxLQUFLLEdBQVcseUJBQXlCLENBQUM7SUFDMUMsUUFBUSxHQUFXLHVCQUF1QixDQUFDO0lBQzNDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsU0FBUyxDQUFVO0lBRWxCLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRTNDLFVBQVUsR0FBNEIsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQy9DLFdBQVcsR0FB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QUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsbUJBR3ZCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLFFBQVEsYUFDOUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQU1RLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHtcbiAgU1RBUl9SQVRJTkdfQVJJQV9MQUJFTF9LRVksXG4gIFNUQVJfUkFUSU5HX0RFRkFVTFRfTUFYLFxuICBTVEFSX1JBVElOR19ERUZBVUxUX1ZBTFVFLFxuICBTVEFSX1JBVElOR19TVEFSX0xBQkVMX0tFWVxufSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy9zdGFyLXJhdGluZy5jb25zdCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1zdGFyLXJhdGluZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFyLXJhdGluZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9zdGFyLXJhdGluZy5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTdGFyUmF0aW5nQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFN0YXJSYXRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IFNUQVJfUkFUSU5HX0RFRkFVTFRfVkFMVUU7XG4gIEBJbnB1dCgpIG1heFN0YXJzOiBudW1iZXIgPSBTVEFSX1JBVElOR19ERUZBVUxUX01BWDtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXJpYUxhYmVsPzogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2VGbjogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWRGbjogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGdldCBzdGFycygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMubWF4U3RhcnMgfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIGdldCBncm91cEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmFyaWFMYWJlbCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5hcmlhTGFiZWwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFNUQVJfUkFUSU5HX0FSSUFfTEFCRUxfS0VZKTtcbiAgfVxuXG4gIGlzRmlsbGVkKHN0YXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGFyIDw9IHRoaXMudmFsdWU7XG4gIH1cblxuICBnZXRTdGFyQXJpYUxhYmVsKHN0YXI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoU1RBUl9SQVRJTkdfU1RBUl9MQUJFTF9LRVksIHsgbjogc3RhciB9KTtcbiAgfVxuXG4gIG9uU3RhckNsaWNrKHN0YXI6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IHRoaXMudmFsdWUgPT09IHN0YXIgPyAwIDogc3RhcjtcbiAgICB0aGlzLnZhbHVlID0gbmV4dDtcbiAgICB0aGlzLm9uQ2hhbmdlRm4obmV4dCk7XG4gICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChuZXh0KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgc3RhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vblN0YXJDbGljayhzdGFyKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUgPz8gU1RBUl9SQVRJTkdfREVGQVVMVF9WQUxVRTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2RjLXN0YXItcmF0aW5nXCJcbiAgW2NsYXNzLnNkYy1zdGFyLXJhdGluZy0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImdyb3VwQXJpYUxhYmVsXCJcbj5cbiAgQGZvciAoc3RhciBvZiBzdGFyczsgdHJhY2sgc3Rhcikge1xuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJzZGMtc3Rhci1yYXRpbmdfX3N0YXJcIlxuICAgICAgW2NsYXNzLnNkYy1zdGFyLXJhdGluZ19fc3Rhci0tZmlsbGVkXT1cImlzRmlsbGVkKHN0YXIpXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0U3RhckFyaWFMYWJlbChzdGFyKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cIm9uU3RhckNsaWNrKHN0YXIpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQsIHN0YXIpXCJcbiAgICA+XG4gICAgICBAaWYgKGlzRmlsbGVkKHN0YXIpKSB7XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXN0YXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtc3RhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIH1cbiAgICA8L2J1dHRvbj5cbiAgfVxuPC9kaXY+XG4iXX0=
|