ngx-apexsankey 1.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.
@@ -0,0 +1,182 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, PLATFORM_ID, Inject, } from '@angular/core';
2
+ import { isPlatformBrowser } from '@angular/common';
3
+ import { getApexSankeyClass, applyStoredLicense } from './utils';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * angular wrapper component for ApexSankey
7
+ * renders a sankey diagram using the ApexSankey library
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <ngx-apexsankey
12
+ * [data]="sankeyData"
13
+ * [options]="sankeyOptions"
14
+ * (nodeClick)="onNodeClick($event)">
15
+ * </ngx-apexsankey>
16
+ * ```
17
+ */
18
+ export class NgxApexsankeyComponent {
19
+ /**
20
+ * sankey diagram data containing nodes and edges
21
+ */
22
+ data;
23
+ /**
24
+ * configuration options for the sankey diagram
25
+ */
26
+ options = {};
27
+ /**
28
+ * emits when a node is clicked
29
+ */
30
+ nodeClick = new EventEmitter();
31
+ /**
32
+ * reference to the container element
33
+ */
34
+ containerRef;
35
+ /**
36
+ * the rendered sankey graph instance
37
+ */
38
+ graph = null;
39
+ instance = null;
40
+ isBrowser;
41
+ constructor(platformId) {
42
+ this.isBrowser = isPlatformBrowser(platformId);
43
+ }
44
+ /**
45
+ * computed container styles from options
46
+ */
47
+ get containerStyle() {
48
+ const style = {};
49
+ if (this.options?.width) {
50
+ style['width'] =
51
+ typeof this.options.width === 'number'
52
+ ? `${this.options.width}px`
53
+ : this.options.width;
54
+ }
55
+ if (this.options?.height) {
56
+ style['height'] =
57
+ typeof this.options.height === 'number'
58
+ ? `${this.options.height}px`
59
+ : this.options.height;
60
+ }
61
+ return style;
62
+ }
63
+ ngOnInit() {
64
+ if (this.isBrowser) {
65
+ this.initChart();
66
+ }
67
+ }
68
+ ngOnChanges(changes) {
69
+ if (!this.isBrowser) {
70
+ return;
71
+ }
72
+ // if options changed, recreate the chart
73
+ if (changes['options'] && !changes['options'].firstChange) {
74
+ this.recreateChart();
75
+ return;
76
+ }
77
+ // if data changed, re-render
78
+ if (changes['data'] && !changes['data'].firstChange) {
79
+ this.renderChart();
80
+ }
81
+ }
82
+ ngOnDestroy() {
83
+ this.destroyChart();
84
+ }
85
+ /**
86
+ * initializes the sankey chart
87
+ */
88
+ initChart() {
89
+ const container = this.containerRef?.nativeElement;
90
+ if (!container) {
91
+ return;
92
+ }
93
+ const ApexSankey = getApexSankeyClass();
94
+ if (!ApexSankey) {
95
+ throw new Error('[ngx-apexsankey] ApexSankey not found. ' +
96
+ 'Make sure to import apexsankey and @svgdotjs/svg.js before using this component. ' +
97
+ 'See README for installation instructions.');
98
+ }
99
+ // apply stored license if set before ApexSankey loaded
100
+ applyStoredLicense(ApexSankey);
101
+ // merge options with node click handler
102
+ const mergedOptions = this.getMergedOptions();
103
+ // create instance and render
104
+ this.instance = new ApexSankey(container, mergedOptions);
105
+ this.graph = this.instance.render(this.data);
106
+ }
107
+ /**
108
+ * re-renders the chart with current data
109
+ */
110
+ renderChart() {
111
+ if (!this.instance || !this.containerRef?.nativeElement) {
112
+ return;
113
+ }
114
+ // clear existing content
115
+ if (this.graph?.clear) {
116
+ this.graph.clear();
117
+ }
118
+ // re-render with new data
119
+ this.graph = this.instance.render(this.data);
120
+ }
121
+ /**
122
+ * destroys and recreates the chart with new options
123
+ */
124
+ recreateChart() {
125
+ this.destroyChart();
126
+ this.initChart();
127
+ }
128
+ /**
129
+ * destroys the chart instance
130
+ */
131
+ destroyChart() {
132
+ if (this.graph?.clear) {
133
+ this.graph.clear();
134
+ }
135
+ const container = this.containerRef?.nativeElement;
136
+ if (container) {
137
+ container.innerHTML = '';
138
+ }
139
+ this.graph = null;
140
+ this.instance = null;
141
+ }
142
+ /**
143
+ * merges user options with the node click event emitter
144
+ */
145
+ getMergedOptions() {
146
+ const options = { ...this.options };
147
+ // wrap onNodeClick to also emit the event
148
+ const userCallback = options.onNodeClick;
149
+ options.onNodeClick = (node) => {
150
+ this.nodeClick.emit(node);
151
+ if (userCallback) {
152
+ userCallback(node);
153
+ }
154
+ };
155
+ return options;
156
+ }
157
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
158
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NgxApexsankeyComponent, isStandalone: true, selector: "ngx-apexsankey", inputs: { data: "data", options: "options" }, outputs: { nodeClick: "nodeClick" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `<div #container [style]="containerStyle"></div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, decorators: [{
161
+ type: Component,
162
+ args: [{
163
+ selector: 'ngx-apexsankey',
164
+ standalone: true,
165
+ template: `<div #container [style]="containerStyle"></div>`,
166
+ changeDetection: ChangeDetectionStrategy.OnPush,
167
+ }]
168
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
169
+ type: Inject,
170
+ args: [PLATFORM_ID]
171
+ }] }], propDecorators: { data: [{
172
+ type: Input,
173
+ args: [{ required: true }]
174
+ }], options: [{
175
+ type: Input
176
+ }], nodeClick: [{
177
+ type: Output
178
+ }], containerRef: [{
179
+ type: ViewChild,
180
+ args: ['container', { static: true }]
181
+ }] } });
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFwZXhzYW5rZXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFLWixTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLFdBQVcsRUFDWCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFRcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUVqRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFPSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDOztPQUVHO0lBQ3dCLElBQUksQ0FBYTtJQUU1Qzs7T0FFRztJQUNNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO0lBRTlDOztPQUVHO0lBQ08sU0FBUyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFFckQ7O09BRUc7SUFDdUMsWUFBWSxDQUEyQjtJQUVqRjs7T0FFRztJQUNILEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBRXpCLFFBQVEsR0FBOEIsSUFBSSxDQUFDO0lBQzNDLFNBQVMsQ0FBVTtJQUUzQixZQUFpQyxVQUFrQjtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksY0FBYztRQUNoQixNQUFNLEtBQUssR0FBMkIsRUFBRSxDQUFDO1FBRXpDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUU7WUFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVE7b0JBQ3BDLENBQUMsQ0FBQyxH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QkFBbEIsTUFBTTtnQkFLbUMsWUFBWTtzQkFBckQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFBMQVRGT1JNX0lELFxuICBJbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgR3JhcGhEYXRhLFxuICBTYW5rZXlPcHRpb25zLFxuICBTYW5rZXlHcmFwaCxcbiAgU2Fua2V5Tm9kZSxcbiAgQXBleFNhbmtleUluc3RhbmNlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldEFwZXhTYW5rZXlDbGFzcywgYXBwbHlTdG9yZWRMaWNlbnNlIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogYW5ndWxhciB3cmFwcGVyIGNvbXBvbmVudCBmb3IgQXBleFNhbmtleVxuICogcmVuZGVycyBhIHNhbmtleSBkaWFncmFtIHVzaW5nIHRoZSBBcGV4U2Fua2V5IGxpYnJhcnlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPG5neC1hcGV4c2Fua2V5XG4gKiAgIFtkYXRhXT1cInNhbmtleURhdGFcIlxuICogICBbb3B0aW9uc109XCJzYW5rZXlPcHRpb25zXCJcbiAqICAgKG5vZGVDbGljayk9XCJvbk5vZGVDbGljaygkZXZlbnQpXCI+XG4gKiA8L25neC1hcGV4c2Fua2V5PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1hcGV4c2Fua2V5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGA8ZGl2ICNjb250YWluZXIgW3N0eWxlXT1cImNvbnRhaW5lclN0eWxlXCI+PC9kaXY+YCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5neEFwZXhzYW5rZXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIHNhbmtleSBkaWFncmFtIGRhdGEgY29udGFpbmluZyBub2RlcyBhbmQgZWRnZXNcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGRhdGEhOiBHcmFwaERhdGE7XG5cbiAgLyoqXG4gICAqIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNhbmtleSBkaWFncmFtXG4gICAqL1xuICBASW5wdXQoKSBvcHRpb25zOiBQYXJ0aWFsPFNhbmtleU9wdGlvbnM+ID0ge307XG5cbiAgLyoqXG4gICAqIGVtaXRzIHdoZW4gYSBub2RlIGlzIGNsaWNrZWRcbiAgICovXG4gIEBPdXRwdXQoKSBub2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFNhbmtleU5vZGU+KCk7XG5cbiAgLyoqXG4gICAqIHJlZmVyZW5jZSB0byB0aGUgY29udGFpbmVyIGVsZW1lbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiB0aGUgcmVuZGVyZWQgc2Fua2V5IGdyYXBoIGluc3RhbmNlXG4gICAqL1xuICBncmFwaDogU2Fua2V5R3JhcGggfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGluc3RhbmNlOiBBcGV4U2Fua2V5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0Jyb3dzZXI6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjb21wdXRlZCBjb250YWluZXIgc3R5bGVzIGZyb20gb3B0aW9uc1xuICAgKi9cbiAgZ2V0IGNvbnRhaW5lclN0eWxlKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy53aWR0aCkge1xuICAgICAgc3R5bGVbJ3dpZHRoJ10gPVxuICAgICAgICB0eXBlb2YgdGhpcy5vcHRpb25zLndpZHRoID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYCR7dGhpcy5vcHRpb25zLndpZHRofXB4YFxuICAgICAgICAgIDogdGhpcy5vcHRpb25zLndpZHRoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmhlaWdodCkge1xuICAgICAgc3R5bGVbJ2hlaWdodCddID1cbiAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucy5oZWlnaHQgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMuaGVpZ2h0fXB4YFxuICAgICAgICAgIDogdGhpcy5vcHRpb25zLmhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHRoaXMuaW5pdENoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiBvcHRpb25zIGNoYW5nZWQsIHJlY3JlYXRlIHRoZSBjaGFydFxuICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10gJiYgIWNoYW5nZXNbJ29wdGlvbnMnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUNoYXJ0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgZGF0YSBjaGFuZ2VkLCByZS1yZW5kZXJcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmICFjaGFuZ2VzWydkYXRhJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVuZGVyQ2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluaXRpYWxpemVzIHRoZSBzYW5rZXkgY2hhcnRcbiAgICovXG4gIHByaXZhdGUgaW5pdENoYXJ0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgQXBleFNhbmtleSA9IGdldEFwZXhTYW5rZXlDbGFzcygpO1xuXG4gICAgaWYgKCFBcGV4U2Fua2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbbmd4LWFwZXhzYW5rZXldIEFwZXhTYW5rZXkgbm90IGZvdW5kLiAnICtcbiAgICAgICAgICAnTWFrZSBzdXJlIHRvIGltcG9ydCBhcGV4c2Fua2V5IGFuZCBAc3ZnZG90anMvc3ZnLmpzIGJlZm9yZSB1c2luZyB0aGlzIGNvbXBvbmVudC4gJyArXG4gICAgICAgICAgJ1NlZSBSRUFETUUgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzdG9yZWQgbGljZW5zZSBpZiBzZXQgYmVmb3JlIEFwZXhTYW5rZXkgbG9hZGVkXG4gICAgYXBwbHlTdG9yZWRMaWNlbnNlKEFwZXhTYW5rZXkpO1xuXG4gICAgLy8gbWVyZ2Ugb3B0aW9ucyB3aXRoIG5vZGUgY2xpY2sgaGFuZGxlclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB0aGlzLmdldE1lcmdlZE9wdGlvbnMoKTtcblxuICAgIC8vIGNyZWF0ZSBpbnN0YW5jZSBhbmQgcmVuZGVyXG4gICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBBcGV4U2Fua2V5KGNvbnRhaW5lciwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgdGhpcy5ncmFwaCA9IHRoaXMuaW5zdGFuY2UucmVuZGVyKHRoaXMuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogcmUtcmVuZGVycyB0aGUgY2hhcnQgd2l0aCBjdXJyZW50IGRhdGFcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlIHx8ICF0aGlzLmNvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNsZWFyIGV4aXN0aW5nIGNvbnRlbnRcbiAgICBpZiAodGhpcy5ncmFwaD8uY2xlYXIpIHtcbiAgICAgIHRoaXMuZ3JhcGguY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyByZS1yZW5kZXIgd2l0aCBuZXcgZGF0YVxuICAgIHRoaXMuZ3JhcGggPSB0aGlzLmluc3RhbmNlLnJlbmRlcih0aGlzLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlc3Ryb3lzIGFuZCByZWNyZWF0ZXMgdGhlIGNoYXJ0IHdpdGggbmV3IG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcmVjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lDaGFydCgpO1xuICAgIHRoaXMuaW5pdENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogZGVzdHJveXMgdGhlIGNoYXJ0IGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGRlc3Ryb3lDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmFwaD8uY2xlYXIpIHtcbiAgICAgIHRoaXMuZ3JhcGguY2xlYXIoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaCA9IG51bGw7XG4gICAgdGhpcy5pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VzIHVzZXIgb3B0aW9ucyB3aXRoIHRoZSBub2RlIGNsaWNrIGV2ZW50IGVtaXR0ZXJcbiAgICovXG4gIHByaXZhdGUgZ2V0TWVyZ2VkT3B0aW9ucygpOiBQYXJ0aWFsPFNhbmtleU9wdGlvbnM+IHtcbiAgICBjb25zdCBvcHRpb25zID0geyAuLi50aGlzLm9wdGlvbnMgfTtcblxuICAgIC8vIHdyYXAgb25Ob2RlQ2xpY2sgdG8gYWxzbyBlbWl0IHRoZSBldmVudFxuICAgIGNvbnN0IHVzZXJDYWxsYmFjayA9IG9wdGlvbnMub25Ob2RlQ2xpY2s7XG4gICAgb3B0aW9ucy5vbk5vZGVDbGljayA9IChub2RlOiBTYW5rZXlOb2RlKSA9PiB7XG4gICAgICB0aGlzLm5vZGVDbGljay5lbWl0KG5vZGUpO1xuICAgICAgaWYgKHVzZXJDYWxsYmFjaykge1xuICAgICAgICB1c2VyQ2FsbGJhY2sobm9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUgZGVmaW5pdGlvbiBmb3Igc2Fua2V5IGRpYWdyYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlOb2RlIHtcbiAgLyoqIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm9kZSAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogZGlzcGxheSBsYWJlbCBmb3IgdGhlIG5vZGUgKi9cbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgLyoqIG9wdGlvbmFsIGN1c3RvbSBjb2xvciBmb3IgdGhlIG5vZGUgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogZWRnZSBkZWZpbml0aW9uIGNvbm5lY3RpbmcgdHdvIG5vZGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Fua2V5RWRnZSB7XG4gIC8qKiBzb3VyY2Ugbm9kZSBpZCAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbiAgLyoqIHRhcmdldCBub2RlIGlkICovXG4gIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuICAvKiogZWRnZSB3ZWlnaHQvc2l6ZSAqL1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAvKiogb3B0aW9uYWwgZ3JvdXBpbmcgdHlwZSAqL1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAvKiogb3B0aW9uYWwgY3VzdG9tIGNvbG9yIGZvciB0aGUgZWRnZSAqL1xuICByZWFkb25seSBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBjb21tb24gb3B0aW9ucyBmb3IgdGhlIHNhbmtleSBkaWFncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uT3B0aW9ucyB7XG4gIC8qKiBjc3Mgc3R5bGVzIGZvciBjYW52YXMgcm9vdCBjb250YWluZXIgKi9cbiAgcmVhZG9ubHkgY2FudmFzU3R5bGU/OiBzdHJpbmc7XG4gIC8qKiBlbmFibGUvZGlzYWJsZSBncmFwaCB0b29sYmFyICovXG4gIHJlYWRvbmx5IGVuYWJsZVRvb2xiYXI/OiBib29sZWFuO1xuICAvKiogaGVpZ2h0IG9mIGdyYXBoIGNvbnRhaW5lciAqL1xuICByZWFkb25seSBoZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBzcGFjaW5nIGZyb20gdG9wIGFuZCBsZWZ0IG9mIGdyYXBoIGNvbnRhaW5lciAqL1xuICByZWFkb25seSBzcGFjaW5nPzogbnVtYmVyO1xuICAvKiogdmlld3BvcnQgaGVpZ2h0ICovXG4gIHJlYWRvbmx5IHZpZXdQb3J0SGVpZ2h0PzogbnVtYmVyO1xuICAvKiogdmlld3BvcnQgd2lkdGggKi9cbiAgcmVhZG9ubHkgdmlld1BvcnRXaWR0aD86IG51bWJlcjtcbiAgLyoqIHdpZHRoIG9mIGdyYXBoIGNvbnRhaW5lciAqL1xuICByZWFkb25seSB3aWR0aD86IG51bWJlciB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBub2RlIHN0eWxpbmcgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVPcHRpb25zIHtcbiAgLyoqIGJvcmRlciBjb2xvciBvZiBub2RlcyAqL1xuICByZWFkb25seSBub2RlQm9yZGVyQ29sb3I/OiBzdHJpbmc7XG4gIC8qKiBib3JkZXIgd2lkdGggb2Ygbm9kZXMgaW4gcGl4ZWxzICovXG4gIHJlYWRvbmx5IG5vZGVCb3JkZXJXaWR0aD86IG51bWJlcjtcbiAgLyoqIHdpZHRoIG9mIGdyYXBoIG5vZGVzICovXG4gIHJlYWRvbmx5IG5vZGVXaWR0aD86IG51bWJlcjtcbiAgLyoqIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBub2RlIGNsaWNrICovXG4gIHJlYWRvbmx5IG9uTm9kZUNsaWNrPzogKG5vZGU6IFNhbmtleU5vZGUpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogZWRnZSBzdHlsaW5nIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGdlT3B0aW9ucyB7XG4gIC8qKiBlbmFibGUgZ3JhZGllbnQgZmlsbCBiYXNlZCBvbiBzb3VyY2UgYW5kIHRhcmdldCBub2RlIGNvbG9ycyAqL1xuICByZWFkb25seSBlZGdlR3JhZGllbnRGaWxsPzogYm9vbGVhbjtcbiAgLyoqIG9wYWNpdHkgdmFsdWUgZm9yIGVkZ2VzICgwIHRvIDEpICovXG4gIHJlYWRvbmx5IGVkZ2VPcGFjaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIGZvbnQgc3R5bGluZyBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9udE9wdGlvbnMge1xuICAvKiogZm9udCBjb2xvciBvZiBub2RlIGxhYmVscyAqL1xuICByZWFkb25seSBmb250Q29sb3I/OiBzdHJpbmc7XG4gIC8qKiBmb250IGZhbWlseSBvZiBub2RlIGxhYmVscyAqL1xuICByZWFkb25seSBmb250RmFtaWx5Pzogc3RyaW5nO1xuICAvKiogZm9udCBzaXplIG9mIG5vZGUgbGFiZWxzICovXG4gIHJlYWRvbmx5IGZvbnRTaXplPzogc3RyaW5nO1xuICAvKiogZm9udCB3ZWlnaHQgb2Ygbm9kZSBsYWJlbHMgKi9cbiAgcmVhZG9ubHkgZm9udFdlaWdodD86IHN0cmluZztcbn1cblxuLyoqXG4gKiB0b29sdGlwIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2x0aXBPcHRpb25zIHtcbiAgLyoqIGVuYWJsZSB0b29sdGlwIG9uIGhvdmVyICovXG4gIHJlYWRvbmx5IGVuYWJsZVRvb2x0aXA/OiBib29sZWFuO1xuICAvKiogYmFja2dyb3VuZCBjb2xvciBvZiB0b29sdGlwICovXG4gIHJlYWRvbmx5IHRvb2x0aXBCR0NvbG9yPzogc3RyaW5nO1xuICAvKiogYm9yZGVyIGNvbG9yIG9mIHRvb2x0aXAgKi9cbiAgcmVhZG9ubHkgdG9vbHRpcEJvcmRlckNvbG9yPzogc3RyaW5nO1xuICAvKiogdG9vbHRpcCBodG1sIGVsZW1lbnQgaWQgKi9cbiAgcmVhZG9ubHkgdG9vbHRpcElkPzogc3RyaW5nO1xuICAvKiogaHRtbCB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdG9vbHRpcCAqL1xuICByZWFkb25seSB0b29sdGlwVGVtcGxhdGU/OiAoY29udGVudDogVG9vbHRpcENvbnRlbnQpID0+IHN0cmluZztcbn1cblxuLyoqXG4gKiBjb250ZW50IHBhc3NlZCB0byB0b29sdGlwIHRlbXBsYXRlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbHRpcENvbnRlbnQge1xuICBzb3VyY2U6IFNhbmtleU5vZGU7XG4gIHRhcmdldDogU2Fua2V5Tm9kZTtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBkYXRhIG9wdGlvbnMgZm9yIGN1c3RvbSBvcmRlcmluZyBhbmQgbGluayBhbGlnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhT3B0aW9ucyB7XG4gIC8qKiBjdXN0b20gbm9kZSBvcmRlcmluZyAtIGxpc3Qgb2YgbGF5ZXJzLCBlYWNoIGNvbnRhaW5pbmcgYmFuZHMgb2Ygbm9kZSBpZHMgKi9cbiAgcmVhZG9ubHkgb3JkZXI/OiBzdHJpbmdbXVtdW107XG4gIC8qKiB3aGV0aGVyIHRvIGFsaWduIGxpbmsgdHlwZXMgYWNyb3NzIG5vZGVzICovXG4gIHJlYWRvbmx5IGFsaWduTGlua1R5cGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBjb21wbGV0ZSBzYW5rZXkgb3B0aW9ucyBjb21iaW5pbmcgYWxsIG9wdGlvbiBpbnRlcmZhY2VzXG4gKi9cbmV4cG9ydCB0eXBlIFNhbmtleU9wdGlvbnMgPSBDb21tb25PcHRpb25zICZcbiAgTm9kZU9wdGlvbnMgJlxuICBFZGdlT3B0aW9ucyAmXG4gIEZvbnRPcHRpb25zICZcbiAgVG9vbHRpcE9wdGlvbnM7XG5cbi8qKlxuICogZ3JhcGggZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBub2RlcywgZWRnZXMsIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhEYXRhIHtcbiAgLyoqIGFycmF5IG9mIG5vZGVzICovXG4gIHJlYWRvbmx5IG5vZGVzOiBTYW5rZXlOb2RlW107XG4gIC8qKiBhcnJheSBvZiBlZGdlcyBjb25uZWN0aW5nIG5vZGVzICovXG4gIHJlYWRvbmx5IGVkZ2VzOiBTYW5rZXlFZGdlW107XG4gIC8qKiBvcHRpb25hbCBkYXRhLWxldmVsIG9wdGlvbnMgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IERhdGFPcHRpb25zO1xufVxuXG4vKipcbiAqIHNhbmtleSBncmFwaCBpbnN0YW5jZSByZXR1cm5lZCBieSBBcGV4U2Fua2V5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Fua2V5R3JhcGgge1xuICAvKiogdGhlIGdyYXBobGliIGdyYXBoIGluc3RhbmNlICovXG4gIGdyYXBoOiB1bmtub3duO1xuICAvKiogbWF4aW11bSByYW5rIGluIHRoZSBncmFwaCAqL1xuICBtYXhSYW5rOiBudW1iZXI7XG4gIC8qKiByZS1yZW5kZXIgdGhlIGdyYXBoICovXG4gIHJlbmRlcjogKG9wdGlvbnM/OiB7IGtlZXBPbGRQb3NpdGlvbj86IGJvb2xlYW4gfSkgPT4gdm9pZDtcbiAgLyoqIGNsZWFyIHRoZSBjYW52YXMgKi9cbiAgY2xlYXI/OiAoKSA9PiB2b2lkO1xuICAvKiogZXhwb3J0IHRvIHN2ZyAqL1xuICBleHBvcnRUb1N2Zz86ICgpID0+IHZvaWQ7XG4gIC8qKiBjYW52YXMgaGVpZ2h0ICovXG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogY2FudmFzIHdpZHRoICovXG4gIHdpZHRoOiBudW1iZXI7XG4gIC8qKiBjYW52YXMgc3BhY2luZyAqL1xuICBzcGFjaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogYXBleHNhbmtleSBjb25zdHJ1Y3RvciB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBleFNhbmtleUNvbnN0cnVjdG9yIHtcbiAgbmV3IChlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IFBhcnRpYWw8U2Fua2V5T3B0aW9ucz4pOiBBcGV4U2Fua2V5SW5zdGFuY2U7XG4gIHNldExpY2Vuc2U6IChrZXk6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBhcGV4c2Fua2V5IGluc3RhbmNlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGV4U2Fua2V5SW5zdGFuY2Uge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgb3B0aW9uczogU2Fua2V5T3B0aW9ucztcbiAgZ3JhcGg6IFNhbmtleUdyYXBoO1xuICByZW5kZXI6IChkYXRhOiBHcmFwaERhdGEpID0+IFNhbmtleUdyYXBoO1xufVxuXG4vKipcbiAqIGV4dGVuZGVkIHdpbmRvdyBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBBcGV4U2Fua2V5IGdsb2JhbGx5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBleFNhbmtleVdpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIEFwZXhTYW5rZXk/OiBBcGV4U2Fua2V5Q29uc3RydWN0b3I7XG4gIF9fQVBFWF9TQU5LRVlfTElDRU5TRV9LRVlfXz86IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,50 @@
1
+ /**
2
+ * gets the ApexSankey constructor from window
3
+ */
4
+ export function getApexSankeyClass() {
5
+ if (typeof window === 'undefined') {
6
+ return null;
7
+ }
8
+ const win = window;
9
+ return win.ApexSankey || null;
10
+ }
11
+ /**
12
+ * sets the ApexSankey license key globally
13
+ * should be called once at app initialization, before rendering any charts
14
+ *
15
+ * @param licenseKey - the license key string provided by ApexSankey
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { setApexSankeyLicense } from 'ngx-apexsankey';
20
+ *
21
+ * // call this in your app.config.ts or main.ts
22
+ * setApexSankeyLicense('your-license-key-here');
23
+ * ```
24
+ */
25
+ export function setApexSankeyLicense(licenseKey) {
26
+ if (typeof window === 'undefined') {
27
+ return;
28
+ }
29
+ const win = window;
30
+ if (win.ApexSankey) {
31
+ win.ApexSankey.setLicense(licenseKey);
32
+ }
33
+ else {
34
+ // store license key to be applied when ApexSankey loads
35
+ win.__APEX_SANKEY_LICENSE_KEY__ = licenseKey;
36
+ }
37
+ }
38
+ /**
39
+ * applies stored license key if it was set before ApexSankey loaded
40
+ */
41
+ export function applyStoredLicense(ApexSankey) {
42
+ if (typeof window === 'undefined') {
43
+ return;
44
+ }
45
+ const win = window;
46
+ if (win.__APEX_SANKEY_LICENSE_KEY__) {
47
+ ApexSankey.setLicense(win.__APEX_SANKEY_LICENSE_KEY__);
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUNqQyxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBMEIsQ0FBQztJQUN2QyxPQUFPLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFVBQWtCO0lBQ3JELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1FBQ2pDLE9BQU87S0FDUjtJQUVELE1BQU0sR0FBRyxHQUFHLE1BQTBCLENBQUM7SUFFdkMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQ2xCLEdBQUcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3ZDO1NBQU07UUFDTCx3REFBd0Q7UUFDeEQsR0FBRyxDQUFDLDJCQUEyQixHQUFHLFVBQVUsQ0FBQztLQUM5QztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxVQUFpQztJQUNsRSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUNqQyxPQUFPO0tBQ1I7SUFFRCxNQUFNLEdBQUcsR0FBRyxNQUEwQixDQUFDO0lBRXZDLElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFO1FBQ25DLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7S0FDeEQ7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBleFNhbmtleUNvbnN0cnVjdG9yLCBBcGV4U2Fua2V5V2luZG93IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogZ2V0cyB0aGUgQXBleFNhbmtleSBjb25zdHJ1Y3RvciBmcm9tIHdpbmRvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBleFNhbmtleUNsYXNzKCk6IEFwZXhTYW5rZXlDb25zdHJ1Y3RvciB8IG51bGwge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHdpbiA9IHdpbmRvdyBhcyBBcGV4U2Fua2V5V2luZG93O1xuICByZXR1cm4gd2luLkFwZXhTYW5rZXkgfHwgbnVsbDtcbn1cblxuLyoqXG4gKiBzZXRzIHRoZSBBcGV4U2Fua2V5IGxpY2Vuc2Uga2V5IGdsb2JhbGx5XG4gKiBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYXQgYXBwIGluaXRpYWxpemF0aW9uLCBiZWZvcmUgcmVuZGVyaW5nIGFueSBjaGFydHNcbiAqXG4gKiBAcGFyYW0gbGljZW5zZUtleSAtIHRoZSBsaWNlbnNlIGtleSBzdHJpbmcgcHJvdmlkZWQgYnkgQXBleFNhbmtleVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2V0QXBleFNhbmtleUxpY2Vuc2UgfSBmcm9tICduZ3gtYXBleHNhbmtleSc7XG4gKlxuICogLy8gY2FsbCB0aGlzIGluIHlvdXIgYXBwLmNvbmZpZy50cyBvciBtYWluLnRzXG4gKiBzZXRBcGV4U2Fua2V5TGljZW5zZSgneW91ci1saWNlbnNlLWtleS1oZXJlJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEFwZXhTYW5rZXlMaWNlbnNlKGxpY2Vuc2VLZXk6IHN0cmluZyk6IHZvaWQge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB3aW4gPSB3aW5kb3cgYXMgQXBleFNhbmtleVdpbmRvdztcblxuICBpZiAod2luLkFwZXhTYW5rZXkpIHtcbiAgICB3aW4uQXBleFNhbmtleS5zZXRMaWNlbnNlKGxpY2Vuc2VLZXkpO1xuICB9IGVsc2Uge1xuICAgIC8vIHN0b3JlIGxpY2Vuc2Uga2V5IHRvIGJlIGFwcGxpZWQgd2hlbiBBcGV4U2Fua2V5IGxvYWRzXG4gICAgd2luLl9fQVBFWF9TQU5LRVlfTElDRU5TRV9LRVlfXyA9IGxpY2Vuc2VLZXk7XG4gIH1cbn1cblxuLyoqXG4gKiBhcHBsaWVzIHN0b3JlZCBsaWNlbnNlIGtleSBpZiBpdCB3YXMgc2V0IGJlZm9yZSBBcGV4U2Fua2V5IGxvYWRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTdG9yZWRMaWNlbnNlKEFwZXhTYW5rZXk6IEFwZXhTYW5rZXlDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB3aW4gPSB3aW5kb3cgYXMgQXBleFNhbmtleVdpbmRvdztcblxuICBpZiAod2luLl9fQVBFWF9TQU5LRVlfTElDRU5TRV9LRVlfXykge1xuICAgIEFwZXhTYW5rZXkuc2V0TGljZW5zZSh3aW4uX19BUEVYX1NBTktFWV9MSUNFTlNFX0tFWV9fKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFwZXhzYW5rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmd4LWFwZXhzYW5rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ // main component
2
+ export { NgxApexsankeyComponent } from './lib/ngx-apexsankey.component';
3
+ // utility functions
4
+ export { setApexSankeyLicense } from './lib/utils';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbWFpbiBjb21wb25lbnRcbmV4cG9ydCB7IE5neEFwZXhzYW5rZXlDb21wb25lbnQgfSBmcm9tICcuL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQnO1xuXG4vLyB1dGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IHsgc2V0QXBleFNhbmtleUxpY2Vuc2UgfSBmcm9tICcuL2xpYi91dGlscyc7XG5cbi8vIHR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIC8vIGRhdGEgdHlwZXNcbiAgU2Fua2V5Tm9kZSxcbiAgU2Fua2V5RWRnZSxcbiAgR3JhcGhEYXRhLFxuICBEYXRhT3B0aW9ucyxcblxuICAvLyBvcHRpb25zIHR5cGVzXG4gIFNhbmtleU9wdGlvbnMsXG4gIENvbW1vbk9wdGlvbnMsXG4gIE5vZGVPcHRpb25zLFxuICBFZGdlT3B0aW9ucyxcbiAgRm9udE9wdGlvbnMsXG4gIFRvb2x0aXBPcHRpb25zLFxuICBUb29sdGlwQ29udGVudCxcblxuICAvLyBpbnN0YW5jZSB0eXBlc1xuICBTYW5rZXlHcmFwaCxcbiAgQXBleFNhbmtleUluc3RhbmNlLFxuICBBcGV4U2Fua2V5Q29uc3RydWN0b3IsXG59IGZyb20gJy4vbGliL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,240 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, PLATFORM_ID, ViewChild, Output, Input, Inject, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { isPlatformBrowser } from '@angular/common';
4
+
5
+ /**
6
+ * gets the ApexSankey constructor from window
7
+ */
8
+ function getApexSankeyClass() {
9
+ if (typeof window === 'undefined') {
10
+ return null;
11
+ }
12
+ const win = window;
13
+ return win.ApexSankey || null;
14
+ }
15
+ /**
16
+ * sets the ApexSankey license key globally
17
+ * should be called once at app initialization, before rendering any charts
18
+ *
19
+ * @param licenseKey - the license key string provided by ApexSankey
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { setApexSankeyLicense } from 'ngx-apexsankey';
24
+ *
25
+ * // call this in your app.config.ts or main.ts
26
+ * setApexSankeyLicense('your-license-key-here');
27
+ * ```
28
+ */
29
+ function setApexSankeyLicense(licenseKey) {
30
+ if (typeof window === 'undefined') {
31
+ return;
32
+ }
33
+ const win = window;
34
+ if (win.ApexSankey) {
35
+ win.ApexSankey.setLicense(licenseKey);
36
+ }
37
+ else {
38
+ // store license key to be applied when ApexSankey loads
39
+ win.__APEX_SANKEY_LICENSE_KEY__ = licenseKey;
40
+ }
41
+ }
42
+ /**
43
+ * applies stored license key if it was set before ApexSankey loaded
44
+ */
45
+ function applyStoredLicense(ApexSankey) {
46
+ if (typeof window === 'undefined') {
47
+ return;
48
+ }
49
+ const win = window;
50
+ if (win.__APEX_SANKEY_LICENSE_KEY__) {
51
+ ApexSankey.setLicense(win.__APEX_SANKEY_LICENSE_KEY__);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * angular wrapper component for ApexSankey
57
+ * renders a sankey diagram using the ApexSankey library
58
+ *
59
+ * @example
60
+ * ```html
61
+ * <ngx-apexsankey
62
+ * [data]="sankeyData"
63
+ * [options]="sankeyOptions"
64
+ * (nodeClick)="onNodeClick($event)">
65
+ * </ngx-apexsankey>
66
+ * ```
67
+ */
68
+ class NgxApexsankeyComponent {
69
+ /**
70
+ * sankey diagram data containing nodes and edges
71
+ */
72
+ data;
73
+ /**
74
+ * configuration options for the sankey diagram
75
+ */
76
+ options = {};
77
+ /**
78
+ * emits when a node is clicked
79
+ */
80
+ nodeClick = new EventEmitter();
81
+ /**
82
+ * reference to the container element
83
+ */
84
+ containerRef;
85
+ /**
86
+ * the rendered sankey graph instance
87
+ */
88
+ graph = null;
89
+ instance = null;
90
+ isBrowser;
91
+ constructor(platformId) {
92
+ this.isBrowser = isPlatformBrowser(platformId);
93
+ }
94
+ /**
95
+ * computed container styles from options
96
+ */
97
+ get containerStyle() {
98
+ const style = {};
99
+ if (this.options?.width) {
100
+ style['width'] =
101
+ typeof this.options.width === 'number'
102
+ ? `${this.options.width}px`
103
+ : this.options.width;
104
+ }
105
+ if (this.options?.height) {
106
+ style['height'] =
107
+ typeof this.options.height === 'number'
108
+ ? `${this.options.height}px`
109
+ : this.options.height;
110
+ }
111
+ return style;
112
+ }
113
+ ngOnInit() {
114
+ if (this.isBrowser) {
115
+ this.initChart();
116
+ }
117
+ }
118
+ ngOnChanges(changes) {
119
+ if (!this.isBrowser) {
120
+ return;
121
+ }
122
+ // if options changed, recreate the chart
123
+ if (changes['options'] && !changes['options'].firstChange) {
124
+ this.recreateChart();
125
+ return;
126
+ }
127
+ // if data changed, re-render
128
+ if (changes['data'] && !changes['data'].firstChange) {
129
+ this.renderChart();
130
+ }
131
+ }
132
+ ngOnDestroy() {
133
+ this.destroyChart();
134
+ }
135
+ /**
136
+ * initializes the sankey chart
137
+ */
138
+ initChart() {
139
+ const container = this.containerRef?.nativeElement;
140
+ if (!container) {
141
+ return;
142
+ }
143
+ const ApexSankey = getApexSankeyClass();
144
+ if (!ApexSankey) {
145
+ throw new Error('[ngx-apexsankey] ApexSankey not found. ' +
146
+ 'Make sure to import apexsankey and @svgdotjs/svg.js before using this component. ' +
147
+ 'See README for installation instructions.');
148
+ }
149
+ // apply stored license if set before ApexSankey loaded
150
+ applyStoredLicense(ApexSankey);
151
+ // merge options with node click handler
152
+ const mergedOptions = this.getMergedOptions();
153
+ // create instance and render
154
+ this.instance = new ApexSankey(container, mergedOptions);
155
+ this.graph = this.instance.render(this.data);
156
+ }
157
+ /**
158
+ * re-renders the chart with current data
159
+ */
160
+ renderChart() {
161
+ if (!this.instance || !this.containerRef?.nativeElement) {
162
+ return;
163
+ }
164
+ // clear existing content
165
+ if (this.graph?.clear) {
166
+ this.graph.clear();
167
+ }
168
+ // re-render with new data
169
+ this.graph = this.instance.render(this.data);
170
+ }
171
+ /**
172
+ * destroys and recreates the chart with new options
173
+ */
174
+ recreateChart() {
175
+ this.destroyChart();
176
+ this.initChart();
177
+ }
178
+ /**
179
+ * destroys the chart instance
180
+ */
181
+ destroyChart() {
182
+ if (this.graph?.clear) {
183
+ this.graph.clear();
184
+ }
185
+ const container = this.containerRef?.nativeElement;
186
+ if (container) {
187
+ container.innerHTML = '';
188
+ }
189
+ this.graph = null;
190
+ this.instance = null;
191
+ }
192
+ /**
193
+ * merges user options with the node click event emitter
194
+ */
195
+ getMergedOptions() {
196
+ const options = { ...this.options };
197
+ // wrap onNodeClick to also emit the event
198
+ const userCallback = options.onNodeClick;
199
+ options.onNodeClick = (node) => {
200
+ this.nodeClick.emit(node);
201
+ if (userCallback) {
202
+ userCallback(node);
203
+ }
204
+ };
205
+ return options;
206
+ }
207
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
208
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NgxApexsankeyComponent, isStandalone: true, selector: "ngx-apexsankey", inputs: { data: "data", options: "options" }, outputs: { nodeClick: "nodeClick" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `<div #container [style]="containerStyle"></div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
209
+ }
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, decorators: [{
211
+ type: Component,
212
+ args: [{
213
+ selector: 'ngx-apexsankey',
214
+ standalone: true,
215
+ template: `<div #container [style]="containerStyle"></div>`,
216
+ changeDetection: ChangeDetectionStrategy.OnPush,
217
+ }]
218
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
219
+ type: Inject,
220
+ args: [PLATFORM_ID]
221
+ }] }], propDecorators: { data: [{
222
+ type: Input,
223
+ args: [{ required: true }]
224
+ }], options: [{
225
+ type: Input
226
+ }], nodeClick: [{
227
+ type: Output
228
+ }], containerRef: [{
229
+ type: ViewChild,
230
+ args: ['container', { static: true }]
231
+ }] } });
232
+
233
+ // main component
234
+
235
+ /**
236
+ * Generated bundle index. Do not edit.
237
+ */
238
+
239
+ export { NgxApexsankeyComponent, setApexSankeyLicense };
240
+ //# sourceMappingURL=ngx-apexsankey.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-apexsankey.mjs","sources":["../../src/lib/utils.ts","../../src/lib/ngx-apexsankey.component.ts","../../src/public-api.ts","../../src/ngx-apexsankey.ts"],"sourcesContent":["import { ApexSankeyConstructor, ApexSankeyWindow } from './types';\n\n/**\n * gets the ApexSankey constructor from window\n */\nexport function getApexSankeyClass(): ApexSankeyConstructor | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const win = window as ApexSankeyWindow;\n return win.ApexSankey || null;\n}\n\n/**\n * sets the ApexSankey license key globally\n * should be called once at app initialization, before rendering any charts\n *\n * @param licenseKey - the license key string provided by ApexSankey\n *\n * @example\n * ```ts\n * import { setApexSankeyLicense } from 'ngx-apexsankey';\n *\n * // call this in your app.config.ts or main.ts\n * setApexSankeyLicense('your-license-key-here');\n * ```\n */\nexport function setApexSankeyLicense(licenseKey: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const win = window as ApexSankeyWindow;\n\n if (win.ApexSankey) {\n win.ApexSankey.setLicense(licenseKey);\n } else {\n // store license key to be applied when ApexSankey loads\n win.__APEX_SANKEY_LICENSE_KEY__ = licenseKey;\n }\n}\n\n/**\n * applies stored license key if it was set before ApexSankey loaded\n */\nexport function applyStoredLicense(ApexSankey: ApexSankeyConstructor): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const win = window as ApexSankeyWindow;\n\n if (win.__APEX_SANKEY_LICENSE_KEY__) {\n ApexSankey.setLicense(win.__APEX_SANKEY_LICENSE_KEY__);\n }\n}\n","import {\n Component,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ChangeDetectionStrategy,\n PLATFORM_ID,\n Inject,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GraphData,\n SankeyOptions,\n SankeyGraph,\n SankeyNode,\n ApexSankeyInstance,\n} from './types';\nimport { getApexSankeyClass, applyStoredLicense } from './utils';\n\n/**\n * angular wrapper component for ApexSankey\n * renders a sankey diagram using the ApexSankey library\n *\n * @example\n * ```html\n * <ngx-apexsankey\n * [data]=\"sankeyData\"\n * [options]=\"sankeyOptions\"\n * (nodeClick)=\"onNodeClick($event)\">\n * </ngx-apexsankey>\n * ```\n */\n@Component({\n selector: 'ngx-apexsankey',\n standalone: true,\n template: `<div #container [style]=\"containerStyle\"></div>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxApexsankeyComponent implements OnInit, OnDestroy, OnChanges {\n /**\n * sankey diagram data containing nodes and edges\n */\n @Input({ required: true }) data!: GraphData;\n\n /**\n * configuration options for the sankey diagram\n */\n @Input() options: Partial<SankeyOptions> = {};\n\n /**\n * emits when a node is clicked\n */\n @Output() nodeClick = new EventEmitter<SankeyNode>();\n\n /**\n * reference to the container element\n */\n @ViewChild('container', { static: true }) containerRef!: ElementRef<HTMLElement>;\n\n /**\n * the rendered sankey graph instance\n */\n graph: SankeyGraph | null = null;\n\n private instance: ApexSankeyInstance | null = null;\n private isBrowser: boolean;\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n }\n\n /**\n * computed container styles from options\n */\n get containerStyle(): Record<string, string> {\n const style: Record<string, string> = {};\n\n if (this.options?.width) {\n style['width'] =\n typeof this.options.width === 'number'\n ? `${this.options.width}px`\n : this.options.width;\n }\n\n if (this.options?.height) {\n style['height'] =\n typeof this.options.height === 'number'\n ? `${this.options.height}px`\n : this.options.height;\n }\n\n return style;\n }\n\n ngOnInit(): void {\n if (this.isBrowser) {\n this.initChart();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.isBrowser) {\n return;\n }\n\n // if options changed, recreate the chart\n if (changes['options'] && !changes['options'].firstChange) {\n this.recreateChart();\n return;\n }\n\n // if data changed, re-render\n if (changes['data'] && !changes['data'].firstChange) {\n this.renderChart();\n }\n }\n\n ngOnDestroy(): void {\n this.destroyChart();\n }\n\n /**\n * initializes the sankey chart\n */\n private initChart(): void {\n const container = this.containerRef?.nativeElement;\n if (!container) {\n return;\n }\n\n const ApexSankey = getApexSankeyClass();\n\n if (!ApexSankey) {\n throw new Error(\n '[ngx-apexsankey] ApexSankey not found. ' +\n 'Make sure to import apexsankey and @svgdotjs/svg.js before using this component. ' +\n 'See README for installation instructions.'\n );\n }\n\n // apply stored license if set before ApexSankey loaded\n applyStoredLicense(ApexSankey);\n\n // merge options with node click handler\n const mergedOptions = this.getMergedOptions();\n\n // create instance and render\n this.instance = new ApexSankey(container, mergedOptions);\n this.graph = this.instance.render(this.data);\n }\n\n /**\n * re-renders the chart with current data\n */\n private renderChart(): void {\n if (!this.instance || !this.containerRef?.nativeElement) {\n return;\n }\n\n // clear existing content\n if (this.graph?.clear) {\n this.graph.clear();\n }\n\n // re-render with new data\n this.graph = this.instance.render(this.data);\n }\n\n /**\n * destroys and recreates the chart with new options\n */\n private recreateChart(): void {\n this.destroyChart();\n this.initChart();\n }\n\n /**\n * destroys the chart instance\n */\n private destroyChart(): void {\n if (this.graph?.clear) {\n this.graph.clear();\n }\n\n const container = this.containerRef?.nativeElement;\n if (container) {\n container.innerHTML = '';\n }\n\n this.graph = null;\n this.instance = null;\n }\n\n /**\n * merges user options with the node click event emitter\n */\n private getMergedOptions(): Partial<SankeyOptions> {\n const options = { ...this.options };\n\n // wrap onNodeClick to also emit the event\n const userCallback = options.onNodeClick;\n options.onNodeClick = (node: SankeyNode) => {\n this.nodeClick.emit(node);\n if (userCallback) {\n userCallback(node);\n }\n };\n\n return options;\n }\n}\n","// main component\nexport { NgxApexsankeyComponent } from './lib/ngx-apexsankey.component';\n\n// utility functions\nexport { setApexSankeyLicense } from './lib/utils';\n\n// types\nexport type {\n // data types\n SankeyNode,\n SankeyEdge,\n GraphData,\n DataOptions,\n\n // options types\n SankeyOptions,\n CommonOptions,\n NodeOptions,\n EdgeOptions,\n FontOptions,\n TooltipOptions,\n TooltipContent,\n\n // instance types\n SankeyGraph,\n ApexSankeyInstance,\n ApexSankeyConstructor,\n} from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ngx-apexsankey" />
5
+ export * from './public-api';
@@ -0,0 +1,70 @@
1
+ import { ElementRef, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { GraphData, SankeyOptions, SankeyGraph, SankeyNode } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * angular wrapper component for ApexSankey
6
+ * renders a sankey diagram using the ApexSankey library
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <ngx-apexsankey
11
+ * [data]="sankeyData"
12
+ * [options]="sankeyOptions"
13
+ * (nodeClick)="onNodeClick($event)">
14
+ * </ngx-apexsankey>
15
+ * ```
16
+ */
17
+ export declare class NgxApexsankeyComponent implements OnInit, OnDestroy, OnChanges {
18
+ /**
19
+ * sankey diagram data containing nodes and edges
20
+ */
21
+ data: GraphData;
22
+ /**
23
+ * configuration options for the sankey diagram
24
+ */
25
+ options: Partial<SankeyOptions>;
26
+ /**
27
+ * emits when a node is clicked
28
+ */
29
+ nodeClick: EventEmitter<SankeyNode>;
30
+ /**
31
+ * reference to the container element
32
+ */
33
+ containerRef: ElementRef<HTMLElement>;
34
+ /**
35
+ * the rendered sankey graph instance
36
+ */
37
+ graph: SankeyGraph | null;
38
+ private instance;
39
+ private isBrowser;
40
+ constructor(platformId: object);
41
+ /**
42
+ * computed container styles from options
43
+ */
44
+ get containerStyle(): Record<string, string>;
45
+ ngOnInit(): void;
46
+ ngOnChanges(changes: SimpleChanges): void;
47
+ ngOnDestroy(): void;
48
+ /**
49
+ * initializes the sankey chart
50
+ */
51
+ private initChart;
52
+ /**
53
+ * re-renders the chart with current data
54
+ */
55
+ private renderChart;
56
+ /**
57
+ * destroys and recreates the chart with new options
58
+ */
59
+ private recreateChart;
60
+ /**
61
+ * destroys the chart instance
62
+ */
63
+ private destroyChart;
64
+ /**
65
+ * merges user options with the node click event emitter
66
+ */
67
+ private getMergedOptions;
68
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxApexsankeyComponent, never>;
69
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxApexsankeyComponent, "ngx-apexsankey", never, { "data": { "alias": "data"; "required": true; }; "options": { "alias": "options"; "required": false; }; }, { "nodeClick": "nodeClick"; }, never, never, true, never>;
70
+ }