@ruc-lib/overlay 2.1.0 → 3.1.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/index.d.ts CHANGED
@@ -1,6 +1,115 @@
1
- export * from './lib/ruclib-overlay.module';
2
- export * from './lib/ruc-overlay-chart/ruc-overlay-chart.component';
3
- export * from './lib/service/overlay.service';
4
- export * from './lib/model/overlay.types';
5
- export * from './lib/overlay-content/overlay-content.component';
6
- export * from './lib/ruclib-overlay/ruclib-overlay.component';
1
+ import { Overlay } from '@angular/cdk/overlay';
2
+ import * as i0 from '@angular/core';
3
+ import { TemplateRef, InjectionToken, OnInit, OnDestroy, Injector, EventEmitter } from '@angular/core';
4
+ import * as rxjs from 'rxjs';
5
+
6
+ /**
7
+ * Defines the configuration options that a user can pass to the popover.
8
+ * This is the public API of your component.
9
+ */
10
+ interface OverlayConfig {
11
+ placement?: 'top' | 'bottom' | 'left' | 'right' | string;
12
+ overlayTitle?: string;
13
+ content?: string | TemplateRef<any>;
14
+ animation?: 'fade' | 'scale';
15
+ trigger?: 'click' | 'hover';
16
+ showCloseButton?: boolean;
17
+ closeIcon?: string;
18
+ tableData?: any[];
19
+ tableClass?: string;
20
+ closeDelay?: number;
21
+ chartConfig?: any;
22
+ }
23
+ /**
24
+ * Defines the data packet that the PopoverService sends.
25
+ * It contains the configuration AND the element to position against.
26
+ * THIS IS THE ONE THE SERVICE USES.
27
+ */
28
+ interface OverlayData {
29
+ config: OverlayConfig;
30
+ trigger: HTMLElement;
31
+ }
32
+ /**
33
+ * Defines the data and controls passed to the dynamically created PopoverContentComponent.
34
+ * It includes the config AND a callback function to close the popover.
35
+ */
36
+ interface OverlayControl {
37
+ config: OverlayConfig;
38
+ close: () => void;
39
+ }
40
+ /**
41
+ * The Injection Token used to provide the PopoverControl object to the
42
+ * PopoverContentComponent. This is the correct, final version.
43
+ */
44
+ declare const OVERLAY_CONTROL: InjectionToken<OverlayControl>;
45
+
46
+ declare class OverlayService {
47
+ private popoverState;
48
+ popoverState$: rxjs.Observable<OverlayData | null>;
49
+ /**
50
+ * Broadcasts a command to open a popover using the OverlayData structure.
51
+ */
52
+ open(config: OverlayData['config'], trigger: OverlayData['trigger']): void;
53
+ /**
54
+ * Broadcasts a command to close any currently open service-controlled popover.
55
+ */
56
+ close(): void;
57
+ static ɵfac: i0.ɵɵFactoryDeclaration<OverlayService, never>;
58
+ static ɵprov: i0.ɵɵInjectableDeclaration<OverlayService>;
59
+ }
60
+
61
+ type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';
62
+ type PopoverAnimation = 'fade' | 'scale';
63
+ type ChartType = 'doughnut' | 'pie' | 'bar';
64
+ interface ChartModel {
65
+ chartType: ChartType;
66
+ data: any;
67
+ }
68
+ declare class RuclibOverlayComponent implements OnInit, OnDestroy {
69
+ private overlay;
70
+ private injector;
71
+ private overlayService;
72
+ buttonText?: string;
73
+ rucInputData: OverlayConfig;
74
+ customTheme: string;
75
+ private triggerButtonRef;
76
+ private overlayRef;
77
+ private serviceSubscription;
78
+ private closeTimeout?;
79
+ private lastTriggerElement?;
80
+ private positionSubscription;
81
+ constructor(overlay: Overlay, injector: Injector, overlayService: OverlayService);
82
+ ngOnInit(): void;
83
+ ngOnDestroy(): void;
84
+ get isOpen(): boolean;
85
+ toggle(): void;
86
+ handleMouseEnter(): void;
87
+ handleMouseLeave(): void;
88
+ private show;
89
+ private destroy;
90
+ private getPlacementFromPosition;
91
+ private createPositionStrategy;
92
+ onEscape(): void;
93
+ static ɵfac: i0.ɵɵFactoryDeclaration<RuclibOverlayComponent, never>;
94
+ static ɵcmp: i0.ɵɵComponentDeclaration<RuclibOverlayComponent, "uxp-ruclib-overlay", never, { "buttonText": { "alias": "buttonText"; "required": false; }; "rucInputData": { "alias": "rucInputData"; "required": false; }; "customTheme": { "alias": "customTheme"; "required": false; }; }, {}, never, never, true, never>;
95
+ }
96
+
97
+ declare class OverlayContentComponent implements OnInit {
98
+ control: OverlayControl;
99
+ actualPlacement: string | PopoverPlacement;
100
+ tableHeaders: any[];
101
+ customTheme: string;
102
+ arrowOffset: number;
103
+ mouseEnterPopover: EventEmitter<void>;
104
+ mouseLeavePopover: EventEmitter<void>;
105
+ ngOnInit(): void;
106
+ get animationState(): "enter-scale" | "enter-fade";
107
+ constructor(control: OverlayControl);
108
+ isTemplateRef(content: any): content is TemplateRef<any>;
109
+ getTableHeaders(): void;
110
+ static ɵfac: i0.ɵɵFactoryDeclaration<OverlayContentComponent, never>;
111
+ static ɵcmp: i0.ɵɵComponentDeclaration<OverlayContentComponent, "uxp-overlay-content", never, { "customTheme": { "alias": "customTheme"; "required": false; }; }, { "mouseEnterPopover": "mouseEnterPopover"; "mouseLeavePopover": "mouseLeavePopover"; }, never, never, true, never>;
112
+ }
113
+
114
+ export { OVERLAY_CONTROL, OverlayContentComponent, OverlayService, RuclibOverlayComponent };
115
+ export type { ChartModel, ChartType, OverlayConfig, OverlayControl, OverlayData, PopoverAnimation, PopoverPlacement };
package/package.json CHANGED
@@ -1,26 +1,18 @@
1
1
  {
2
2
  "name": "@ruc-lib/overlay",
3
- "version": "2.1.0",
4
- "license": "MIT",
3
+ "version": "3.1.0",
5
4
  "peerDependencies": {
6
- "@angular/core": ">=15.0.0 <18.0.0",
7
- "@angular/common": ">=15.0.0 <18.0.0",
8
- "@angular/material": "^15.2.9 || ^14.0.0 || ^13.0.0",
9
- "@angular/animations": ">=15.0.0 <18.0.0",
10
- "chart.js": "^4.4.6"
5
+ "@angular/common": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
6
+ "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
7
+ "@angular/material": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
8
+ "@angular/animations": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0"
11
9
  },
12
10
  "dependencies": {
13
- "tslib": "^2.3.0"
14
- },
15
- "publishConfig": {
16
- "access": "public"
11
+ "tslib": "^2.3.0",
12
+ "chart.js": "^4.5.0"
17
13
  },
18
14
  "sideEffects": false,
19
- "module": "fesm2015/ruc-lib-overlay.mjs",
20
- "es2020": "fesm2020/ruc-lib-overlay.mjs",
21
- "esm2020": "esm2020/ruc-lib-overlay.mjs",
22
- "fesm2020": "fesm2020/ruc-lib-overlay.mjs",
23
- "fesm2015": "fesm2015/ruc-lib-overlay.mjs",
15
+ "module": "fesm2022/ruc-lib-overlay.mjs",
24
16
  "typings": "index.d.ts",
25
17
  "exports": {
26
18
  "./package.json": {
@@ -28,11 +20,7 @@
28
20
  },
29
21
  ".": {
30
22
  "types": "./index.d.ts",
31
- "esm2020": "./esm2020/ruc-lib-overlay.mjs",
32
- "es2020": "./fesm2020/ruc-lib-overlay.mjs",
33
- "es2015": "./fesm2015/ruc-lib-overlay.mjs",
34
- "node": "./fesm2015/ruc-lib-overlay.mjs",
35
- "default": "./fesm2020/ruc-lib-overlay.mjs"
23
+ "default": "./fesm2022/ruc-lib-overlay.mjs"
36
24
  }
37
25
  }
38
26
  }
package/esm2020/index.mjs DELETED
@@ -1,7 +0,0 @@
1
- export * from './lib/ruclib-overlay.module';
2
- export * from './lib/ruc-overlay-chart/ruc-overlay-chart.component';
3
- export * from './lib/service/overlay.service';
4
- export * from './lib/model/overlay.types';
5
- export * from './lib/overlay-content/overlay-content.component';
6
- export * from './lib/ruclib-overlay/ruclib-overlay.component';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHFEQUFxRCxDQUFDO0FBQ3BFLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMsK0NBQStDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9ydWNsaWItb3ZlcmxheS5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ydWMtb3ZlcmxheS1jaGFydC9ydWMtb3ZlcmxheS1jaGFydC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlL292ZXJsYXkuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVsL292ZXJsYXkudHlwZXMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9vdmVybGF5LWNvbnRlbnQvb3ZlcmxheS1jb250ZW50LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3J1Y2xpYi1vdmVybGF5L3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudCc7XHJcbiJdfQ==
@@ -1,7 +0,0 @@
1
- export const positions = [
2
- { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 10 },
3
- { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -10 },
4
- { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 10 },
5
- { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -10 }
6
- ];
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMvcG9zaXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBd0I7SUFDeEMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7SUFDMUYsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUMzRixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtJQUN6RixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcclxuICAgICAgeyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICd0b3AnLCBvZmZzZXRZOiAxMCB9LFxyXG4gICAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC0xMCB9LFxyXG4gICAgICB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnY2VudGVyJywgb2Zmc2V0WDogMTAgfSxcclxuICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IC0xMCB9XHJcbiAgICBdO1xyXG4iXX0=
@@ -1,7 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- /**
3
- * The Injection Token used to provide the PopoverControl object to the
4
- * PopoverContentComponent. This is the correct, final version.
5
- */
6
- export const OVERLAY_CONTROL = new InjectionToken('OVERLAY_CONTROL');
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWwvb3ZlcmxheS50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBdUM1RDs7O0VBR0U7QUFDRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxjQUFjLENBQWlCLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4qIERlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGEgdXNlciBjYW4gcGFzcyB0byB0aGUgcG9wb3Zlci5cclxuKiBUaGlzIGlzIHRoZSBwdWJsaWMgQVBJIG9mIHlvdXIgY29tcG9uZW50LlxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlDb25maWcge1xyXG4gIHBsYWNlbWVudD86ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnIHwgc3RyaW5nO1xyXG4gIG92ZXJsYXlUaXRsZT86IHN0cmluZztcclxuICBjb250ZW50Pzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcclxuICBhbmltYXRpb24/OiAnZmFkZScgfCAnc2NhbGUnO1xyXG4gIHRyaWdnZXI/OiAnY2xpY2snIHwgJ2hvdmVyJztcclxuICBzaG93Q2xvc2VCdXR0b24/OiBib29sZWFuO1xyXG4gIGNsb3NlSWNvbj86IHN0cmluZztcclxuICB0YWJsZURhdGE/OiBhbnlbXTtcclxuICB0YWJsZUNsYXNzPzogc3RyaW5nO1xyXG4gIGNsb3NlRGVsYXk/Om51bWJlcixcclxuICBjaGFydENvbmZpZz86YW55XHJcbn1cclxuXHJcbi8qKlxyXG4qIERlZmluZXMgdGhlIGRhdGEgcGFja2V0IHRoYXQgdGhlIFBvcG92ZXJTZXJ2aWNlIHNlbmRzLlxyXG4qIEl0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIEFORCB0aGUgZWxlbWVudCB0byBwb3NpdGlvbiBhZ2FpbnN0LlxyXG4qIFRISVMgSVMgVEhFIE9ORSBUSEUgU0VSVklDRSBVU0VTLlxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlEYXRhIHtcclxuICBjb25maWc6IE92ZXJsYXlDb25maWc7XHJcbiAgdHJpZ2dlcjogSFRNTEVsZW1lbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4qIERlZmluZXMgdGhlIGRhdGEgYW5kIGNvbnRyb2xzIHBhc3NlZCB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCBQb3BvdmVyQ29udGVudENvbXBvbmVudC5cclxuKiBJdCBpbmNsdWRlcyB0aGUgY29uZmlnIEFORCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBwb3BvdmVyLlxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlDb250cm9sIHtcclxuICBjb25maWc6IE92ZXJsYXlDb25maWc7XHJcbiAgY2xvc2U6ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4qIFRoZSBJbmplY3Rpb24gVG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSBQb3BvdmVyQ29udHJvbCBvYmplY3QgdG8gdGhlXHJcbiogUG9wb3ZlckNvbnRlbnRDb21wb25lbnQuIFRoaXMgaXMgdGhlIGNvcnJlY3QsIGZpbmFsIHZlcnNpb24uXHJcbiovXHJcbmV4cG9ydCBjb25zdCBPVkVSTEFZX0NPTlRST0wgPSBuZXcgSW5qZWN0aW9uVG9rZW48T3ZlcmxheUNvbnRyb2w+KCdPVkVSTEFZX0NPTlRST0wnKTtcclxuIl19
@@ -1,91 +0,0 @@
1
- import { Component, EventEmitter, HostBinding, Inject, Input, Output, TemplateRef, } from '@angular/core';
2
- import { animate, state, style, transition, trigger, } from '@angular/animations';
3
- import { OVERLAY_CONTROL } from '../model/overlay.types';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/material/icon";
7
- import * as i3 from "@angular/material/button";
8
- import * as i4 from "@angular/material/card";
9
- import * as i5 from "../ruc-overlay-chart/ruc-overlay-chart.component";
10
- export class OverlayContentComponent {
11
- ngOnInit() {
12
- if (this.control.config.tableData) {
13
- this.getTableHeaders();
14
- }
15
- }
16
- get animationState() {
17
- return this.control.config.animation === 'scale'
18
- ? 'enter-scale'
19
- : 'enter-fade';
20
- }
21
- constructor(control) {
22
- this.control = control;
23
- this.actualPlacement = 'bottom';
24
- this.tableHeaders = [];
25
- this.arrowOffset = 0;
26
- this.mouseEnterPopover = new EventEmitter();
27
- this.mouseLeavePopover = new EventEmitter();
28
- this.actualPlacement = this.control.config.placement || 'bottom';
29
- }
30
- // Helper to check if content is a TemplateRef
31
- isTemplateRef(content) {
32
- return content instanceof TemplateRef;
33
- }
34
- // Helper to get keys for the table header, robustly
35
- getTableHeaders() {
36
- const tempData = this.control.config.tableData;
37
- if (!tempData || tempData.length === 0) {
38
- this.tableHeaders = [];
39
- return;
40
- }
41
- // Assumes all objects in the array have the same shape
42
- this.tableHeaders = Object.keys(tempData[0]);
43
- }
44
- }
45
- OverlayContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayContentComponent, deps: [{ token: OVERLAY_CONTROL }], target: i0.ɵɵFactoryTarget.Component });
46
- OverlayContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OverlayContentComponent, selector: "uxp-overlay-content", inputs: { customTheme: "customTheme" }, outputs: { mouseEnterPopover: "mouseEnterPopover", mouseLeavePopover: "mouseLeavePopover" }, host: { properties: { "@popoverAnimation": "this.animationState" } }, ngImport: i0, template: "<mat-card class=\"popover-container\" class={{customTheme}} (click)=\"$event.stopPropagation()\">\r\n\r\n <div class=\"popover-arrow\"\r\n[attr.data-placement]=\"actualPlacement\"\r\n [style.left.px]=\"(actualPlacement.startsWith('top') || actualPlacement.startsWith('bottom')) ? arrowOffset : null\"\r\n[style.top.px]=\"(actualPlacement.startsWith('left') || actualPlacement.startsWith('right')) ? arrowOffset : null\">\r\n </div>\r\n <!-- Header with optional title and close button -->\r\n\r\n <mat-card-header *ngIf=\"\r\n control.config.overlayTitle ||\r\n control.config.showCloseButton ||\r\n control.config.closeIcon\r\n \"\r\n class=\"popover-header\"\r\n >\r\n <mat-card-title class=\"popover-title\" *ngIf=\"control.config.overlayTitle\">{{ control.config.overlayTitle }}</mat-card-title>\r\n <ng-container *ngIf=\"control.config.showCloseButton && control.config.closeIcon\">\r\n <button mat-icon-button class=\"close-btn\" (click)=\"control.close()\" color=\"primary\" aria-label=\"Close popover icon\">\r\n <mat-icon>{{ control.config.closeIcon }}</mat-icon>\r\n </button>\r\n </ng-container>\r\n </mat-card-header>\r\n\r\n\r\n <!-- Body with dynamic content -->\r\n <mat-card-content class=\"popover-body\">\r\n <!-- Case 1: Content is a simple string -->\r\n <ng-container\r\n *ngIf=\"\r\n !isTemplateRef(control.config.content) && !control.config.tableData\r\n \"\r\n >\r\n {{ control.config.content }}\r\n </ng-container>\r\n\r\n <!-- Case 2: Content is a TemplateRef -->\r\n <ng-container *ngIf=\"isTemplateRef(control.config.content)\">\r\n <ng-container *ngTemplateOutlet=\"control.config.content\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"control.config.chartConfig\">\r\n\r\n <uxp-ruc-overlay-chart [chartConfig]=\"control.config.chartConfig\"></uxp-ruc-overlay-chart>\r\n </ng-container>\r\n\r\n <!-- Case 3: Content is table data -->\r\n <ng-container *ngIf=\"control.config.tableData?.length\">\r\n <table\r\n class=\"popover-table\"\r\n [class]=\"control.config.tableClass || 'basic-table'\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ header }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of control.config.tableData\">\r\n <td\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ row[header] }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [":host{display:block}.popover-container{z-index:1080;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px #0003;position:relative;max-width:300px}.popover-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px}.close-btn .mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-title{font-size:16px;font-weight:600}.mat-card-header.mat-mdc-card-header.popover-header .mat-mdc-card-header-text .mat-card-title.mat-mdc-card-title{font-size:16px}button.close-btn.mdc-icon-button.mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-arrow[data-placement^=bottom]{top:-10px;transform:translate(-50%);border-width:0 10px 10px 10px;border-bottom-color:#fff;filter:drop-shadow(0 -1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=top]{bottom:-10px;transform:translate(-50%);border-width:10px 10px 0 10px;border-top-color:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=right]{left:-10px;transform:translateY(-50%);border-width:10px 10px 10px 0;border-right-color:#fff;filter:drop-shadow(-1px 0 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=left]{right:-10px;transform:translateY(-50%);border-width:10px 0 10px 10px;border-left-color:#fff;filter:drop-shadow(1px 0 1px rgba(0,0,0,.15))}.popover-header{display:flex;justify-content:space-between;align-items:center;padding:.5rem 1rem;margin:0;font-size:1rem;border-bottom:1px solid #dcdcdc;border-radius:5px 5px 0 0}.popover-header h3{margin:0;font-size:1rem}.popover-body{padding:9px 14px}.popover-table{width:100%;border-collapse:collapse;margin-top:5px}.popover-table th,.popover-table td{border:1px solid #ddd;padding:8px;text-align:left}.popover-table th{text-transform:capitalize}.striped-table{width:100%;border-collapse:collapse;font-size:.9em}.striped-table th,.striped-table td{border:1px solid #ddd;padding:8px;text-align:left}.striped-table thead th{font-weight:700}.striped-table tbody tr:nth-child(even){background-color:#00000061}.basic-table{width:100%;border-collapse:collapse;font-size:.9em}.basic-table th,.basic-table td{border:1px solid #ddd;padding:8px;text-align:left}.basic-table thead th{font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i5.RucOverlayChartComponent, selector: "uxp-ruc-overlay-chart", inputs: ["index", "chartConfig"] }], animations: [
47
- trigger('popoverAnimation', [
48
- state('void', style({ transform: 'scale(0.9)', opacity: 0 })),
49
- state('enter-scale', style({ transform: 'scale(1)', opacity: 1 })),
50
- state('enter-fade', style({ opacity: 1 })),
51
- transition('void => enter-scale', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),
52
- transition('void => enter-fade', [
53
- style({ opacity: 0, transform: 'translateY(10px)' }),
54
- animate('500ms', style({ opacity: 1, transform: 'translateY(0)' })),
55
- ]),
56
- transition('* => void', [
57
- animate('500ms', style({ opacity: 0, transform: 'translateY(10px)' })),
58
- ]),
59
- ]),
60
- ] });
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayContentComponent, decorators: [{
62
- type: Component,
63
- args: [{ selector: 'uxp-overlay-content', animations: [
64
- trigger('popoverAnimation', [
65
- state('void', style({ transform: 'scale(0.9)', opacity: 0 })),
66
- state('enter-scale', style({ transform: 'scale(1)', opacity: 1 })),
67
- state('enter-fade', style({ opacity: 1 })),
68
- transition('void => enter-scale', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),
69
- transition('void => enter-fade', [
70
- style({ opacity: 0, transform: 'translateY(10px)' }),
71
- animate('500ms', style({ opacity: 1, transform: 'translateY(0)' })),
72
- ]),
73
- transition('* => void', [
74
- animate('500ms', style({ opacity: 0, transform: 'translateY(10px)' })),
75
- ]),
76
- ]),
77
- ], template: "<mat-card class=\"popover-container\" class={{customTheme}} (click)=\"$event.stopPropagation()\">\r\n\r\n <div class=\"popover-arrow\"\r\n[attr.data-placement]=\"actualPlacement\"\r\n [style.left.px]=\"(actualPlacement.startsWith('top') || actualPlacement.startsWith('bottom')) ? arrowOffset : null\"\r\n[style.top.px]=\"(actualPlacement.startsWith('left') || actualPlacement.startsWith('right')) ? arrowOffset : null\">\r\n </div>\r\n <!-- Header with optional title and close button -->\r\n\r\n <mat-card-header *ngIf=\"\r\n control.config.overlayTitle ||\r\n control.config.showCloseButton ||\r\n control.config.closeIcon\r\n \"\r\n class=\"popover-header\"\r\n >\r\n <mat-card-title class=\"popover-title\" *ngIf=\"control.config.overlayTitle\">{{ control.config.overlayTitle }}</mat-card-title>\r\n <ng-container *ngIf=\"control.config.showCloseButton && control.config.closeIcon\">\r\n <button mat-icon-button class=\"close-btn\" (click)=\"control.close()\" color=\"primary\" aria-label=\"Close popover icon\">\r\n <mat-icon>{{ control.config.closeIcon }}</mat-icon>\r\n </button>\r\n </ng-container>\r\n </mat-card-header>\r\n\r\n\r\n <!-- Body with dynamic content -->\r\n <mat-card-content class=\"popover-body\">\r\n <!-- Case 1: Content is a simple string -->\r\n <ng-container\r\n *ngIf=\"\r\n !isTemplateRef(control.config.content) && !control.config.tableData\r\n \"\r\n >\r\n {{ control.config.content }}\r\n </ng-container>\r\n\r\n <!-- Case 2: Content is a TemplateRef -->\r\n <ng-container *ngIf=\"isTemplateRef(control.config.content)\">\r\n <ng-container *ngTemplateOutlet=\"control.config.content\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"control.config.chartConfig\">\r\n\r\n <uxp-ruc-overlay-chart [chartConfig]=\"control.config.chartConfig\"></uxp-ruc-overlay-chart>\r\n </ng-container>\r\n\r\n <!-- Case 3: Content is table data -->\r\n <ng-container *ngIf=\"control.config.tableData?.length\">\r\n <table\r\n class=\"popover-table\"\r\n [class]=\"control.config.tableClass || 'basic-table'\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ header }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of control.config.tableData\">\r\n <td\r\n *ngFor=\"let header of this.tableHeaders!\"\r\n >\r\n {{ row[header] }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [":host{display:block}.popover-container{z-index:1080;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px #0003;position:relative;max-width:300px}.popover-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px}.close-btn .mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-title{font-size:16px;font-weight:600}.mat-card-header.mat-mdc-card-header.popover-header .mat-mdc-card-header-text .mat-card-title.mat-mdc-card-title{font-size:16px}button.close-btn.mdc-icon-button.mat-mdc-icon-button.mat-mdc-button-base{width:30px;height:30px;padding:2px}.popover-arrow[data-placement^=bottom]{top:-10px;transform:translate(-50%);border-width:0 10px 10px 10px;border-bottom-color:#fff;filter:drop-shadow(0 -1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=top]{bottom:-10px;transform:translate(-50%);border-width:10px 10px 0 10px;border-top-color:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=right]{left:-10px;transform:translateY(-50%);border-width:10px 10px 10px 0;border-right-color:#fff;filter:drop-shadow(-1px 0 1px rgba(0,0,0,.15))}.popover-arrow[data-placement^=left]{right:-10px;transform:translateY(-50%);border-width:10px 0 10px 10px;border-left-color:#fff;filter:drop-shadow(1px 0 1px rgba(0,0,0,.15))}.popover-header{display:flex;justify-content:space-between;align-items:center;padding:.5rem 1rem;margin:0;font-size:1rem;border-bottom:1px solid #dcdcdc;border-radius:5px 5px 0 0}.popover-header h3{margin:0;font-size:1rem}.popover-body{padding:9px 14px}.popover-table{width:100%;border-collapse:collapse;margin-top:5px}.popover-table th,.popover-table td{border:1px solid #ddd;padding:8px;text-align:left}.popover-table th{text-transform:capitalize}.striped-table{width:100%;border-collapse:collapse;font-size:.9em}.striped-table th,.striped-table td{border:1px solid #ddd;padding:8px;text-align:left}.striped-table thead th{font-weight:700}.striped-table tbody tr:nth-child(even){background-color:#00000061}.basic-table{width:100%;border-collapse:collapse;font-size:.9em}.basic-table th,.basic-table td{border:1px solid #ddd;padding:8px;text-align:left}.basic-table thead th{font-weight:700}\n"] }]
78
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
79
- type: Inject,
80
- args: [OVERLAY_CONTROL]
81
- }] }]; }, propDecorators: { customTheme: [{
82
- type: Input
83
- }], mouseEnterPopover: [{
84
- type: Output
85
- }], mouseLeavePopover: [{
86
- type: Output
87
- }], animationState: [{
88
- type: HostBinding,
89
- args: ['@popoverAnimation']
90
- }] } });
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb3ZlcmxheS1jb250ZW50L292ZXJsYXktY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL292ZXJsYXktY29udGVudC9vdmVybGF5LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE9BQU8sR0FDUixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQTJCekQsTUFBTSxPQUFPLHVCQUF1QjtJQVVsQyxRQUFRO1FBQ04sSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELElBQ0ksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxPQUFPO1lBQzlDLENBQUMsQ0FBQyxhQUFhO1lBQ2YsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNuQixDQUFDO0lBRUQsWUFBNEMsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUF0QjVELG9CQUFlLEdBQThCLFFBQVEsQ0FBQztRQUN0RCxpQkFBWSxHQUFPLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFFLENBQUMsQ0FBQztRQUViLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDN0Msc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQWlCckQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDO0lBQ25FLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsYUFBYSxDQUFDLE9BQVk7UUFDeEIsT0FBTyxPQUFPLFlBQVksV0FBVyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsZUFBZTtRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUUvQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU87U0FDUjtRQUNELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7cUhBMUNVLHVCQUF1QixrQkF1QmQsZUFBZTt5R0F2QnhCLHVCQUF1QixzUUM5Q3BDLDh1RkEwRUEsMDVHRGhEYztRQUNWLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtZQUMxQixLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsVUFBVSxDQUNSLHFCQUFxQixFQUNyQixPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FDNUM7WUFDRCxVQUFVLENBQUMsb0JBQW9CLEVBQUU7Z0JBQy9CLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3BELE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQzthQUNwRSxDQUFDO1lBQ0YsVUFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7YUFDdkUsQ0FBQztTQUNILENBQUM7S0FDSDs0RkFHVSx1QkFBdUI7a0JBeEJuQyxTQUFTOytCQUNFLHFCQUFxQixjQUduQjt3QkFDVixPQUFPLENBQUMsa0JBQWtCLEVBQUU7NEJBQzFCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDN0QsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNsRSxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUMxQyxVQUFVLENBQ1IscUJBQXFCLEVBQ3JCLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUM1Qzs0QkFDRCxVQUFVLENBQUMsb0JBQW9CLEVBQUU7Z0NBQy9CLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUM7Z0NBQ3BELE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQzs2QkFDcEUsQ0FBQzs0QkFDRixVQUFVLENBQUMsV0FBVyxFQUFFO2dDQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQzs2QkFDdkUsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIOzswQkEwQlksTUFBTTsyQkFBQyxlQUFlOzRDQXBCekIsV0FBVztzQkFBbkIsS0FBSztnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQVVILGNBQWM7c0JBRGpCLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheUNvbnRyb2wgfSBmcm9tICcuLy4uL21vZGVsL292ZXJsYXkudHlwZXMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGFuaW1hdGUsXHJcbiAgc3RhdGUsXHJcbiAgc3R5bGUsXHJcbiAgdHJhbnNpdGlvbixcclxuICB0cmlnZ2VyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBPVkVSTEFZX0NPTlRST0wgfSBmcm9tICcuLi9tb2RlbC9vdmVybGF5LnR5cGVzJztcclxuaW1wb3J0IHsgUG9wb3ZlclBsYWNlbWVudCB9IGZyb20gJy4uL3J1Y2xpYi1vdmVybGF5L3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3V4cC1vdmVybGF5LWNvbnRlbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9vdmVybGF5LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL292ZXJsYXktY29udGVudC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ3BvcG92ZXJBbmltYXRpb24nLCBbXHJcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgwLjkpJywgb3BhY2l0eTogMCB9KSksXHJcbiAgICAgIHN0YXRlKCdlbnRlci1zY2FsZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMSknLCBvcGFjaXR5OiAxIH0pKSxcclxuICAgICAgc3RhdGUoJ2VudGVyLWZhZGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKFxyXG4gICAgICAgICd2b2lkID0+IGVudGVyLXNjYWxlJyxcclxuICAgICAgICBhbmltYXRlKCcxNTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScpXHJcbiAgICAgICksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gZW50ZXItZmFkZScsIFtcclxuICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTBweCknIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoJzUwMG1zJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJyB9KSksXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTBweCknIH0pKSxcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICBdLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE92ZXJsYXlDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwdWJsaWMgYWN0dWFsUGxhY2VtZW50OiBzdHJpbmcgfCBQb3BvdmVyUGxhY2VtZW50ID0gJ2JvdHRvbSc7XHJcbiAgcHVibGljIHRhYmxlSGVhZGVyczphbnlbXT1bXTtcclxuICAgQElucHV0KCkgY3VzdG9tVGhlbWUhOnN0cmluZztcclxuICAgcHVibGljIGFycm93T2Zmc2V0ID0wO1xyXG5cclxuICBAT3V0cHV0KCkgbW91c2VFbnRlclBvcG92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG1vdXNlTGVhdmVQb3BvdmVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmNvbnRyb2wuY29uZmlnLnRhYmxlRGF0YSkge1xyXG4gICAgICAgIHRoaXMuZ2V0VGFibGVIZWFkZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ0Bwb3BvdmVyQW5pbWF0aW9uJylcclxuICBnZXQgYW5pbWF0aW9uU3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sLmNvbmZpZy5hbmltYXRpb24gPT09ICdzY2FsZSdcclxuICAgICAgPyAnZW50ZXItc2NhbGUnXHJcbiAgICAgIDogJ2VudGVyLWZhZGUnO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChPVkVSTEFZX0NPTlRST0wpIHB1YmxpYyBjb250cm9sOiBPdmVybGF5Q29udHJvbCkge1xyXG4gICAgdGhpcy5hY3R1YWxQbGFjZW1lbnQgPSB0aGlzLmNvbnRyb2wuY29uZmlnLnBsYWNlbWVudCB8fCAnYm90dG9tJztcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciB0byBjaGVjayBpZiBjb250ZW50IGlzIGEgVGVtcGxhdGVSZWZcclxuICBpc1RlbXBsYXRlUmVmKGNvbnRlbnQ6IGFueSk6IGNvbnRlbnQgaXMgVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVscGVyIHRvIGdldCBrZXlzIGZvciB0aGUgdGFibGUgaGVhZGVyLCByb2J1c3RseVxyXG4gIGdldFRhYmxlSGVhZGVycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRlbXBEYXRhID0gdGhpcy5jb250cm9sLmNvbmZpZy50YWJsZURhdGE7XHJcblxyXG4gICAgaWYgKCF0ZW1wRGF0YSB8fCB0ZW1wRGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy50YWJsZUhlYWRlcnMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQXNzdW1lcyBhbGwgb2JqZWN0cyBpbiB0aGUgYXJyYXkgaGF2ZSB0aGUgc2FtZSBzaGFwZVxyXG4gICAgdGhpcy50YWJsZUhlYWRlcnMgPSBPYmplY3Qua2V5cyh0ZW1wRGF0YVswXSk7XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtY2FyZCBjbGFzcz1cInBvcG92ZXItY29udGFpbmVyXCIgY2xhc3M9e3tjdXN0b21UaGVtZX19IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiXHJcblthdHRyLmRhdGEtcGxhY2VtZW50XT1cImFjdHVhbFBsYWNlbWVudFwiXHJcbiAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIihhY3R1YWxQbGFjZW1lbnQuc3RhcnRzV2l0aCgndG9wJykgfHwgYWN0dWFsUGxhY2VtZW50LnN0YXJ0c1dpdGgoJ2JvdHRvbScpKSA/IGFycm93T2Zmc2V0IDogbnVsbFwiXHJcbltzdHlsZS50b3AucHhdPVwiKGFjdHVhbFBsYWNlbWVudC5zdGFydHNXaXRoKCdsZWZ0JykgfHwgYWN0dWFsUGxhY2VtZW50LnN0YXJ0c1dpdGgoJ3JpZ2h0JykpID8gYXJyb3dPZmZzZXQgOiBudWxsXCI+XHJcbiAgICA8L2Rpdj5cclxuICA8IS0tIEhlYWRlciB3aXRoIG9wdGlvbmFsIHRpdGxlIGFuZCBjbG9zZSBidXR0b24gLS0+XHJcblxyXG4gIDxtYXQtY2FyZC1oZWFkZXIgICpuZ0lmPVwiXHJcbiAgICAgIGNvbnRyb2wuY29uZmlnLm92ZXJsYXlUaXRsZSB8fFxyXG4gICAgICBjb250cm9sLmNvbmZpZy5zaG93Q2xvc2VCdXR0b24gfHxcclxuICAgICAgY29udHJvbC5jb25maWcuY2xvc2VJY29uXHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiXHJcbiAgPlxyXG4gICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVwicG9wb3Zlci10aXRsZVwiICpuZ0lmPVwiY29udHJvbC5jb25maWcub3ZlcmxheVRpdGxlXCI+e3sgY29udHJvbC5jb25maWcub3ZlcmxheVRpdGxlIH19PC9tYXQtY2FyZC10aXRsZT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmNvbmZpZy5zaG93Q2xvc2VCdXR0b24gJiYgIGNvbnRyb2wuY29uZmlnLmNsb3NlSWNvblwiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAgIGNsYXNzPVwiY2xvc2UtYnRuXCIgKGNsaWNrKT1cImNvbnRyb2wuY2xvc2UoKVwiIGNvbG9yPVwicHJpbWFyeVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBwb3BvdmVyIGljb25cIj5cclxuICAgICAgICA8bWF0LWljb24+e3sgY29udHJvbC5jb25maWcuY2xvc2VJY29uIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgPC9tYXQtY2FyZC1oZWFkZXI+XHJcblxyXG5cclxuICA8IS0tIEJvZHkgd2l0aCBkeW5hbWljIGNvbnRlbnQgLS0+XHJcbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj5cclxuICAgIDwhLS0gQ2FzZSAxOiBDb250ZW50IGlzIGEgc2ltcGxlIHN0cmluZyAtLT5cclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgKm5nSWY9XCJcclxuICAgICAgICAhaXNUZW1wbGF0ZVJlZihjb250cm9sLmNvbmZpZy5jb250ZW50KSAmJiAhY29udHJvbC5jb25maWcudGFibGVEYXRhXHJcbiAgICAgIFwiXHJcbiAgICA+XHJcbiAgICAgIHt7IGNvbnRyb2wuY29uZmlnLmNvbnRlbnQgfX1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQ2FzZSAyOiBDb250ZW50IGlzIGEgVGVtcGxhdGVSZWYgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNUZW1wbGF0ZVJlZihjb250cm9sLmNvbmZpZy5jb250ZW50KVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbC5jb25maWcuY29udGVudFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wuY29uZmlnLmNoYXJ0Q29uZmlnXCI+XHJcblxyXG4gICAgICA8dXhwLXJ1Yy1vdmVybGF5LWNoYXJ0ICBbY2hhcnRDb25maWddPVwiY29udHJvbC5jb25maWcuY2hhcnRDb25maWdcIj48L3V4cC1ydWMtb3ZlcmxheS1jaGFydD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQ2FzZSAzOiBDb250ZW50IGlzIHRhYmxlIGRhdGEgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC5jb25maWcudGFibGVEYXRhPy5sZW5ndGhcIj5cclxuICAgICAgPHRhYmxlXHJcbiAgICAgICAgY2xhc3M9XCJwb3BvdmVyLXRhYmxlXCJcclxuICAgICAgICBbY2xhc3NdPVwiY29udHJvbC5jb25maWcudGFibGVDbGFzcyB8fCAnYmFzaWMtdGFibGUnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhlYWRlciBvZiB0aGlzLnRhYmxlSGVhZGVycyFcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgaGVhZGVyIH19XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgY29udHJvbC5jb25maWcudGFibGVEYXRhXCI+XHJcbiAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgdGhpcy50YWJsZUhlYWRlcnMhXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IHJvd1toZWFkZXJdIH19XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbjwvbWF0LWNhcmQ+XHJcbiJdfQ==
@@ -1,29 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
- import Chart from 'chart.js/auto';
3
- import * as i0 from "@angular/core";
4
- export class RucOverlayChartComponent {
5
- constructor() {
6
- this.index = 0;
7
- }
8
- ngAfterViewInit() {
9
- if (this.chartConfig) {
10
- this.chart = new Chart('canvas' + this.index, this.chartConfig);
11
- }
12
- }
13
- ngOnDestroy() {
14
- this.chart?.destroy();
15
- this.chart = null;
16
- this.chartConfig = null;
17
- }
18
- }
19
- RucOverlayChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RucOverlayChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- RucOverlayChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RucOverlayChartComponent, selector: "uxp-ruc-overlay-chart", inputs: { index: "index", chartConfig: "chartConfig" }, ngImport: i0, template: "<div style=\"position: relative; height:220px;\">\r\n <canvas id=\"canvas{{index}}\">{{chart}}</canvas>\r\n</div>\r\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RucOverlayChartComponent, decorators: [{
22
- type: Component,
23
- args: [{ selector: 'uxp-ruc-overlay-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div style=\"position: relative; height:220px;\">\r\n <canvas id=\"canvas{{index}}\">{{chart}}</canvas>\r\n</div>\r\n" }]
24
- }], propDecorators: { index: [{
25
- type: Input
26
- }], chartConfig: [{
27
- type: Input
28
- }] } });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLW92ZXJsYXktY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydWMtb3ZlcmxheS1jaGFydC9ydWMtb3ZlcmxheS1jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Yy1vdmVybGF5LWNoYXJ0L3J1Yy1vdmVybGF5LWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssTUFBTSxlQUFlLENBQUM7O0FBT2xDLE1BQU0sT0FBTyx3QkFBd0I7SUFOckM7UUFRVyxVQUFLLEdBQVcsQ0FBQyxDQUFDO0tBYzVCO0lBWEMsZUFBZTtRQUNiLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDOztzSEFmVSx3QkFBd0I7MEdBQXhCLHdCQUF3QixxSENkckMsMEhBR0E7NEZEV2Esd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgQ2hhcnQgZnJvbSAnY2hhcnQuanMvYXV0byc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndXhwLXJ1Yy1vdmVybGF5LWNoYXJ0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcnVjLW92ZXJsYXktY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3J1Yy1vdmVybGF5LWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSdWNPdmVybGF5Q2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNoYXJ0OiBhbnk7XHJcbiAgQElucHV0KCkgaW5kZXg/Om51bWJlciA9IDA7XHJcbiAgQElucHV0KCkgY2hhcnRDb25maWc6IGFueTtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5jaGFydENvbmZpZykge1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gbmV3IENoYXJ0KCdjYW52YXMnICsgdGhpcy5pbmRleCwgdGhpcy5jaGFydENvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhcnQ/LmRlc3Ryb3koKTtcclxuICAgIHRoaXMuY2hhcnQgPSBudWxsO1xyXG4gICAgdGhpcy5jaGFydENvbmZpZyA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGhlaWdodDoyMjBweDtcIj5cclxuICAgIDxjYW52YXMgaWQ9XCJjYW52YXN7e2luZGV4fX1cIj57e2NoYXJ0fX08L2NhbnZhcz5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,196 +0,0 @@
1
- import { Overlay, } from '@angular/cdk/overlay';
2
- import { Component, ElementRef, HostListener, Injector, Input, ViewChild, } from '@angular/core';
3
- import { OVERLAY_CONTROL, } from '../model/overlay.types';
4
- import { filter } from 'rxjs';
5
- import { ComponentPortal } from '@angular/cdk/portal';
6
- import { OverlayService } from '../service/overlay.service';
7
- import { OverlayContentComponent } from '../overlay-content/overlay-content.component';
8
- import { MatButton } from '@angular/material/button';
9
- import { ESCAPE } from '@angular/cdk/keycodes';
10
- import { positions } from '../constants/positions';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/cdk/overlay";
13
- import * as i2 from "../service/overlay.service";
14
- import * as i3 from "@angular/common";
15
- import * as i4 from "@angular/material/button";
16
- export class RuclibOverlayComponent {
17
- constructor(overlay, injector, overlayService) {
18
- this.overlay = overlay;
19
- this.injector = injector;
20
- this.overlayService = overlayService;
21
- this.rucInputData = {
22
- content: 'Default content',
23
- };
24
- this.overlayRef = null;
25
- }
26
- ngOnInit() {
27
- if (!this.buttonText) {
28
- this.serviceSubscription = this.overlayService.popoverState$.subscribe((data) => {
29
- if (data && !this.isOpen) {
30
- this.show(data.trigger, data.config);
31
- }
32
- else if (!data) {
33
- this.destroy();
34
- }
35
- });
36
- }
37
- }
38
- ngOnDestroy() {
39
- this.positionSubscription?.unsubscribe();
40
- this.serviceSubscription?.unsubscribe();
41
- this.destroy();
42
- }
43
- get isOpen() {
44
- return !!this.overlayRef;
45
- }
46
- // --- Trigger Handlers for self-contained button ---
47
- toggle() {
48
- if (this.rucInputData.trigger !== 'hover') {
49
- this.isOpen
50
- ? this.destroy()
51
- : this.show(this.triggerButtonRef.nativeElement, this.rucInputData);
52
- }
53
- }
54
- handleMouseEnter() {
55
- if (this.rucInputData.trigger === 'hover') {
56
- if (this.closeTimeout)
57
- clearTimeout(this.closeTimeout); // Clear any pending close command
58
- this.show(this.triggerButtonRef.nativeElement, this.rucInputData);
59
- }
60
- }
61
- handleMouseLeave() {
62
- if (this.rucInputData.trigger === 'hover') {
63
- // Use the configurable closeDelay
64
- const delay = this.rucInputData.closeDelay ?? 200;
65
- this.closeTimeout = setTimeout(() => this.destroy(), delay);
66
- }
67
- }
68
- show(trigger, config) {
69
- if (this.isOpen)
70
- return;
71
- const positionStrategy = this.createPositionStrategy(trigger, config.placement || 'bottom');
72
- this.overlayRef = this.overlay.create({
73
- positionStrategy,
74
- hasBackdrop: config.trigger !== 'hover',
75
- backdropClass: 'cdk-overlay-transparent-backdrop',
76
- scrollStrategy: this.overlay.scrollStrategies.reposition(),
77
- });
78
- this.overlayRef.keydownEvents().pipe(filter(event => event.keyCode === ESCAPE)).subscribe(() => this.destroy());
79
- const control = { config, close: this.destroy.bind(this) };
80
- const injector = Injector.create({
81
- parent: this.injector,
82
- providers: [{ provide: OVERLAY_CONTROL, useValue: control }],
83
- });
84
- const portal = new ComponentPortal(OverlayContentComponent, null, injector);
85
- const componentRef = this.overlayRef.attach(portal);
86
- componentRef.instance.customTheme = this.customTheme;
87
- // --- START: MODIFICATION FOR DYNAMIC ARROW ---
88
- this.positionSubscription = positionStrategy.positionChanges.subscribe((change) => {
89
- // 1. Get the new placement ('top', 'bottom', etc.)
90
- const newPlacement = this.getPlacementFromPosition(change.connectionPair);
91
- componentRef.instance.actualPlacement = newPlacement;
92
- // 2. Calculate the arrow's offset
93
- if (this.overlayRef) {
94
- const triggerRect = trigger.getBoundingClientRect();
95
- const popoverRect = this.overlayRef.overlayElement.getBoundingClientRect();
96
- let arrowOffset = 0;
97
- // If popover is top/bottom, arrow moves horizontally (left)
98
- if (newPlacement.startsWith('top') ||
99
- newPlacement.startsWith('bottom')) {
100
- const triggerCenter = triggerRect.left + triggerRect.width / 2;
101
- arrowOffset = triggerCenter - popoverRect.left;
102
- }
103
- // If popover is left/right, arrow moves vertically (top)
104
- else {
105
- const triggerCenter = triggerRect.top + triggerRect.height / 2;
106
- arrowOffset = triggerCenter - popoverRect.top;
107
- }
108
- // 3. Pass the offset to the content component
109
- componentRef.instance.arrowOffset = arrowOffset;
110
- }
111
- componentRef.changeDetectorRef.detectChanges();
112
- });
113
- componentRef.instance.mouseEnterPopover.subscribe(() => {
114
- if (this.closeTimeout)
115
- clearTimeout(this.closeTimeout);
116
- });
117
- componentRef.instance.mouseLeavePopover.subscribe(() => this.handleMouseLeave());
118
- if (config.trigger !== 'hover') {
119
- this.overlayRef.backdropClick().subscribe(() => this.destroy());
120
- }
121
- const popoverId = `popover-${Math.random().toString(36).substring(2, 9)}`;
122
- componentRef.location.nativeElement.setAttribute('id', popoverId);
123
- trigger.setAttribute('aria-describedby', popoverId);
124
- this.lastTriggerElement = trigger;
125
- }
126
- // Renamed from hide() to destroy() for clarity
127
- destroy() {
128
- if (!this.overlayRef)
129
- return; // Prevent multiple calls
130
- if (this.lastTriggerElement) {
131
- this.lastTriggerElement.removeAttribute('aria-describedby');
132
- this.lastTriggerElement = undefined;
133
- }
134
- this.positionSubscription?.unsubscribe();
135
- this.overlayRef.dispose();
136
- this.overlayRef = null;
137
- }
138
- getPlacementFromPosition(position) {
139
- if (position.originY === 'top' && position.overlayY === 'bottom')
140
- return 'top';
141
- if (position.originY === 'bottom' && position.overlayY === 'top')
142
- return 'bottom';
143
- if (position.originX === 'start' && position.overlayX === 'end')
144
- return 'left';
145
- if (position.originX === 'end' && position.overlayX === 'start')
146
- return 'right';
147
- return 'bottom';
148
- }
149
- createPositionStrategy(origin, placement) {
150
- let preferredPosition;
151
- switch (placement) {
152
- case 'top':
153
- preferredPosition = positions[1];
154
- break;
155
- case 'right':
156
- preferredPosition = positions[2];
157
- break;
158
- case 'left':
159
- preferredPosition = positions[3];
160
- break;
161
- default:
162
- preferredPosition = positions[0];
163
- break;
164
- }
165
- return this.overlay
166
- .position()
167
- .flexibleConnectedTo(origin)
168
- .withPositions([preferredPosition, ...positions])
169
- .withPush(true);
170
- }
171
- //Document-level listeners for closing
172
- onEscape() {
173
- this.positionSubscription?.unsubscribe();
174
- this.serviceSubscription?.unsubscribe();
175
- this.destroy();
176
- }
177
- }
178
- RuclibOverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOverlayComponent, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: i2.OverlayService }], target: i0.ɵɵFactoryTarget.Component });
179
- RuclibOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibOverlayComponent, selector: "uxp-ruclib-overlay", inputs: { buttonText: "buttonText", rucInputData: "rucInputData", customTheme: "customTheme" }, host: { listeners: { "document:keydown:escape": "onEscape()" } }, viewQueries: [{ propertyName: "triggerButtonRef", first: true, predicate: MatButton, descendants: true, read: ElementRef }], ngImport: i0, template: "<button\r\nmat-raised-button\r\n color=\"primary\"\r\n *ngIf=\"buttonText\"\r\n #triggerButton\r\n (click)=\"toggle()\"\r\n (mouseenter)=\"handleMouseEnter()\"\r\n (mouseleave)=\"handleMouseLeave()\"\r\n class=\"popover-trigger-btn\">\r\n {{ buttonText }}\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }] });
180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOverlayComponent, decorators: [{
181
- type: Component,
182
- args: [{ selector: 'uxp-ruclib-overlay', template: "<button\r\nmat-raised-button\r\n color=\"primary\"\r\n *ngIf=\"buttonText\"\r\n #triggerButton\r\n (click)=\"toggle()\"\r\n (mouseenter)=\"handleMouseEnter()\"\r\n (mouseleave)=\"handleMouseLeave()\"\r\n class=\"popover-trigger-btn\">\r\n {{ buttonText }}\r\n</button>\r\n" }]
183
- }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }, { type: i2.OverlayService }]; }, propDecorators: { buttonText: [{
184
- type: Input
185
- }], rucInputData: [{
186
- type: Input
187
- }], customTheme: [{
188
- type: Input
189
- }], triggerButtonRef: [{
190
- type: ViewChild,
191
- args: [MatButton, { read: ElementRef }]
192
- }], onEscape: [{
193
- type: HostListener,
194
- args: ['document:keydown:escape']
195
- }] } });
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydWNsaWItb3ZlcmxheS9ydWNsaWItb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1vdmVybGF5L3J1Y2xpYi1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCxPQUFPLEdBRVIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGVBQWUsR0FJaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFnQm5ELE1BQU0sT0FBTyxzQkFBc0I7SUFnQmpDLFlBQ1UsT0FBZ0IsRUFDaEIsUUFBa0IsRUFDbEIsY0FBOEI7UUFGOUIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWpCL0IsaUJBQVksR0FBa0I7WUFDckMsT0FBTyxFQUFFLGlC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QjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7a0pBS3JCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdFLGdCQUFnQjtzQkFEdkIsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXdNMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29ubmVjdGVkUG9zaXRpb24sXHJcbiAgQ29ubmVjdGlvblBvc2l0aW9uUGFpcixcclxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgT1ZFUkxBWV9DT05UUk9MLFxyXG4gIE92ZXJsYXlDb25maWcsXHJcbiAgT3ZlcmxheUNvbnRyb2wsXHJcbiAgT3ZlcmxheURhdGEsXHJcbn0gZnJvbSAnLi4vbW9kZWwvb3ZlcmxheS50eXBlcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvb3ZlcmxheS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3ZlcmxheUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9vdmVybGF5LWNvbnRlbnQvb3ZlcmxheS1jb250ZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IEVTQ0FQRSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9ucyB9IGZyb20gJy4uL2NvbnN0YW50cy9wb3NpdGlvbnMnO1xyXG5cclxuZXhwb3J0IHR5cGUgUG9wb3ZlclBsYWNlbWVudCA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xyXG5leHBvcnQgdHlwZSBQb3BvdmVyQW5pbWF0aW9uID0gJ2ZhZGUnIHwgJ3NjYWxlJztcclxuZXhwb3J0IHR5cGUgQ2hhcnRUeXBlID0gJ2RvdWdobnV0JyB8ICdwaWUnIHwgJ2Jhcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0TW9kZWwge1xyXG4gIGNoYXJ0VHlwZTogQ2hhcnRUeXBlO1xyXG4gIGRhdGE6IGFueTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1eHAtcnVjbGliLW92ZXJsYXknLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ydWNsaWItb3ZlcmxheS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcnVjbGliLW92ZXJsYXkuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1Y2xpYk92ZXJsYXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgYnV0dG9uVGV4dD86IHN0cmluZztcclxuICBASW5wdXQoKSBydWNJbnB1dERhdGE6IE92ZXJsYXlDb25maWcgPSB7XHJcbiAgICBjb250ZW50OiAnRGVmYXVsdCBjb250ZW50JyxcclxuICB9O1xyXG4gIEBJbnB1dCgpIGN1c3RvbVRoZW1lITogc3RyaW5nO1xyXG5cclxuICBAVmlld0NoaWxkKE1hdEJ1dHRvbiwgeyByZWFkOiBFbGVtZW50UmVmIH0pXHJcbiAgcHJpdmF0ZSB0cmlnZ2VyQnV0dG9uUmVmITogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzZXJ2aWNlU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgY2xvc2VUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47IC8vIFVzZSB0aGUgY29ycmVjdCB0eXBlXHJcbiAgcHJpdmF0ZSBsYXN0VHJpZ2dlckVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHBvc2l0aW9uU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5U2VydmljZTogT3ZlcmxheVNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmJ1dHRvblRleHQpIHtcclxuICAgICAgdGhpcy5zZXJ2aWNlU3Vic2NyaXB0aW9uID0gdGhpcy5vdmVybGF5U2VydmljZS5wb3BvdmVyU3RhdGUkLnN1YnNjcmliZShcclxuICAgICAgICAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5pc09wZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93KGRhdGEudHJpZ2dlciwgZGF0YS5jb25maWcpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9zaXRpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLm92ZXJsYXlSZWY7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gVHJpZ2dlciBIYW5kbGVycyBmb3Igc2VsZi1jb250YWluZWQgYnV0dG9uIC0tLVxyXG4gIHRvZ2dsZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJ1Y0lucHV0RGF0YS50cmlnZ2VyICE9PSAnaG92ZXInKSB7XHJcbiAgICAgIHRoaXMuaXNPcGVuXHJcbiAgICAgICAgPyB0aGlzLmRlc3Ryb3koKVxyXG4gICAgICAgIDogdGhpcy5zaG93KHRoaXMudHJpZ2dlckJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnJ1Y0lucHV0RGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNb3VzZUVudGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucnVjSW5wdXREYXRhLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgaWYgKHRoaXMuY2xvc2VUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVRpbWVvdXQpOyAvLyBDbGVhciBhbnkgcGVuZGluZyBjbG9zZSBjb21tYW5kXHJcbiAgICAgIHRoaXMuc2hvdyh0aGlzLnRyaWdnZXJCdXR0b25SZWYubmF0aXZlRWxlbWVudCwgdGhpcy5ydWNJbnB1dERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW91c2VMZWF2ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJ1Y0lucHV0RGF0YS50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgIC8vIFVzZSB0aGUgY29uZmlndXJhYmxlIGNsb3NlRGVsYXlcclxuICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLnJ1Y0lucHV0RGF0YS5jbG9zZURlbGF5ID8/IDIwMDtcclxuICAgICAgdGhpcy5jbG9zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGVzdHJveSgpLCBkZWxheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3codHJpZ2dlcjogSFRNTEVsZW1lbnQsIGNvbmZpZzogT3ZlcmxheUNvbmZpZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNPcGVuKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMuY3JlYXRlUG9zaXRpb25TdHJhdGVneShcclxuICAgICAgdHJpZ2dlcixcclxuICAgICAgY29uZmlnLnBsYWNlbWVudCB8fCAnYm90dG9tJ1xyXG4gICAgKTtcclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBoYXNCYWNrZHJvcDogY29uZmlnLnRyaWdnZXIgIT09ICdob3ZlcicsXHJcbiAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnBpcGUoZmlsdGVyKGV2ZW50PT4gZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFKSkuc3Vic2NyaWJlKCgpPT4gdGhpcy5kZXN0cm95KCkpO1xyXG5cclxuICAgIGNvbnN0IGNvbnRyb2w6IE92ZXJsYXlDb250cm9sID0geyBjb25maWcsIGNsb3NlOiB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSB9O1xyXG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xyXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXHJcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogT1ZFUkxBWV9DT05UUk9MLCB1c2VWYWx1ZTogY29udHJvbCB9XSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoT3ZlcmxheUNvbnRlbnRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jdXN0b21UaGVtZSA9IHRoaXMuY3VzdG9tVGhlbWU7XHJcblxyXG4gICAgLy8gLS0tIFNUQVJUOiBNT0RJRklDQVRJT04gRk9SIERZTkFNSUMgQVJST1cgLS0tXHJcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uID0gcG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZXMuc3Vic2NyaWJlKFxyXG4gICAgICAoY2hhbmdlKSA9PiB7XHJcbiAgICAgICAgLy8gMS4gR2V0IHRoZSBuZXcgcGxhY2VtZW50ICgndG9wJywgJ2JvdHRvbScsIGV0Yy4pXHJcbiAgICAgICAgY29uc3QgbmV3UGxhY2VtZW50ID0gdGhpcy5nZXRQbGFjZW1lbnRGcm9tUG9zaXRpb24oXHJcbiAgICAgICAgICBjaGFuZ2UuY29ubmVjdGlvblBhaXJcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5hY3R1YWxQbGFjZW1lbnQgPSBuZXdQbGFjZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIDIuIENhbGN1bGF0ZSB0aGUgYXJyb3cncyBvZmZzZXRcclxuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XHJcbiAgICAgICAgICBjb25zdCB0cmlnZ2VyUmVjdCA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICBjb25zdCBwb3BvdmVyUmVjdCA9XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICBsZXQgYXJyb3dPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgLy8gSWYgcG9wb3ZlciBpcyB0b3AvYm90dG9tLCBhcnJvdyBtb3ZlcyBob3Jpem9udGFsbHkgKGxlZnQpXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG5ld1BsYWNlbWVudC5zdGFydHNXaXRoKCd0b3AnKSB8fFxyXG4gICAgICAgICAgICBuZXdQbGFjZW1lbnQuc3RhcnRzV2l0aCgnYm90dG9tJylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyQ2VudGVyID0gdHJpZ2dlclJlY3QubGVmdCArIHRyaWdnZXJSZWN0LndpZHRoIC8gMjtcclxuICAgICAgICAgICAgYXJyb3dPZmZzZXQgPSB0cmlnZ2VyQ2VudGVyIC0gcG9wb3ZlclJlY3QubGVmdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIElmIHBvcG92ZXIgaXMgbGVmdC9yaWdodCwgYXJyb3cgbW92ZXMgdmVydGljYWxseSAodG9wKVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJDZW50ZXIgPSB0cmlnZ2VyUmVjdC50b3AgKyB0cmlnZ2VyUmVjdC5oZWlnaHQgLyAyO1xyXG4gICAgICAgICAgICBhcnJvd09mZnNldCA9IHRyaWdnZXJDZW50ZXIgLSBwb3BvdmVyUmVjdC50b3A7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gMy4gUGFzcyB0aGUgb2Zmc2V0IHRvIHRoZSBjb250ZW50IGNvbXBvbmVudFxyXG4gICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmFycm93T2Zmc2V0ID0gYXJyb3dPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5tb3VzZUVudGVyUG9wb3Zlci5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jbG9zZVRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XHJcbiAgICB9KTtcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5tb3VzZUxlYXZlUG9wb3Zlci5zdWJzY3JpYmUoKCkgPT5cclxuICAgICAgdGhpcy5oYW5kbGVNb3VzZUxlYXZlKClcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbmZpZy50cmlnZ2VyICE9PSAnaG92ZXInKSB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGVzdHJveSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwb3BvdmVySWQgPSBgcG9wb3Zlci0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gO1xyXG4gICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIHBvcG92ZXJJZCk7XHJcbiAgICB0cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHBvcG92ZXJJZCk7XHJcbiAgICB0aGlzLmxhc3RUcmlnZ2VyRWxlbWVudCA9IHRyaWdnZXI7XHJcbiAgfVxyXG5cclxuICAvLyBSZW5hbWVkIGZyb20gaGlkZSgpIHRvIGRlc3Ryb3koKSBmb3IgY2xhcml0eVxyXG4gIHByaXZhdGUgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSByZXR1cm47IC8vIFByZXZlbnQgbXVsdGlwbGUgY2FsbHNcclxuXHJcbiAgICBpZiAodGhpcy5sYXN0VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5sYXN0VHJpZ2dlckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XHJcbiAgICAgIHRoaXMubGFzdFRyaWdnZXJFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3NpdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQbGFjZW1lbnRGcm9tUG9zaXRpb24oXHJcbiAgICBwb3NpdGlvbjogQ29ubmVjdGlvblBvc2l0aW9uUGFpclxyXG4gICk6IFBvcG92ZXJQbGFjZW1lbnQge1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblkgPT09ICd0b3AnICYmIHBvc2l0aW9uLm92ZXJsYXlZID09PSAnYm90dG9tJylcclxuICAgICAgcmV0dXJuICd0b3AnO1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblkgPT09ICdib3R0b20nICYmIHBvc2l0aW9uLm92ZXJsYXlZID09PSAndG9wJylcclxuICAgICAgcmV0dXJuICdib3R0b20nO1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblggPT09ICdzdGFydCcgJiYgcG9zaXRpb24ub3ZlcmxheVggPT09ICdlbmQnKVxyXG4gICAgICByZXR1cm4gJ2xlZnQnO1xyXG4gICAgaWYgKHBvc2l0aW9uLm9yaWdpblggPT09ICdlbmQnICYmIHBvc2l0aW9uLm92ZXJsYXlYID09PSAnc3RhcnQnKVxyXG4gICAgICByZXR1cm4gJ3JpZ2h0JztcclxuICAgIHJldHVybiAnYm90dG9tJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9zaXRpb25TdHJhdGVneShcclxuICAgIG9yaWdpbjogSFRNTEVsZW1lbnQsXHJcbiAgICBwbGFjZW1lbnQ6IHN0cmluZ1xyXG4gICk6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICBsZXQgcHJlZmVycmVkUG9zaXRpb246IENvbm5lY3RlZFBvc2l0aW9uO1xyXG4gICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICBwcmVmZXJyZWRQb3NpdGlvbiA9IHBvc2l0aW9uc1sxXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgIHByZWZlcnJlZFBvc2l0aW9uID0gcG9zaXRpb25zWzJdO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICBwcmVmZXJyZWRQb3NpdGlvbiA9IHBvc2l0aW9uc1szXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBwcmVmZXJyZWRQb3NpdGlvbiA9IHBvc2l0aW9uc1swXTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5XHJcbiAgICAgIC5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKG9yaWdpbilcclxuICAgICAgLndpdGhQb3NpdGlvbnMoW3ByZWZlcnJlZFBvc2l0aW9uLCAuLi5wb3NpdGlvbnNdKVxyXG4gICAgICAud2l0aFB1c2godHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvL0RvY3VtZW50LWxldmVsIGxpc3RlbmVycyBmb3IgY2xvc2luZ1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd246ZXNjYXBlJylcclxuICBvbkVzY2FwZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9zaXRpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICB9XHJcbn1cclxuIiwiPGJ1dHRvblxyXG5tYXQtcmFpc2VkLWJ1dHRvblxyXG4gIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgKm5nSWY9XCJidXR0b25UZXh0XCJcclxuICAjdHJpZ2dlckJ1dHRvblxyXG4gIChjbGljayk9XCJ0b2dnbGUoKVwiXHJcbiAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlTW91c2VFbnRlcigpXCJcclxuICAobW91c2VsZWF2ZSk9XCJoYW5kbGVNb3VzZUxlYXZlKClcIlxyXG4gIGNsYXNzPVwicG9wb3Zlci10cmlnZ2VyLWJ0blwiPlxyXG4gIHt7IGJ1dHRvblRleHQgfX1cclxuPC9idXR0b24+XHJcbiJdfQ==