ngx-apexsankey 1.0.0 → 1.0.2
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/README.md +143 -145
- package/esm2022/lib/ngx-apexsankey.component.mjs +169 -0
- package/esm2022/lib/types.mjs +7 -0
- package/{dist/esm2022 → esm2022}/public-api.mjs +1 -1
- package/{dist/fesm2022 → fesm2022}/ngx-apexsankey.mjs +17 -30
- package/fesm2022/ngx-apexsankey.mjs.map +1 -0
- package/{dist/lib → lib}/ngx-apexsankey.component.d.ts +3 -4
- package/{dist/lib → lib}/types.d.ts +36 -96
- package/package.json +18 -18
- package/{dist/public-api.d.ts → public-api.d.ts} +1 -1
- package/dist/LICENSE +0 -80
- package/dist/README.md +0 -230
- package/dist/esm2022/lib/ngx-apexsankey.component.mjs +0 -182
- package/dist/esm2022/lib/types.mjs +0 -2
- package/dist/fesm2022/ngx-apexsankey.mjs.map +0 -1
- /package/{dist/esm2022 → esm2022}/lib/utils.mjs +0 -0
- /package/{dist/esm2022 → esm2022}/ngx-apexsankey.mjs +0 -0
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/lib → lib}/utils.d.ts +0 -0
package/README.md
CHANGED
|
@@ -1,94 +1,62 @@
|
|
|
1
1
|
# ngx-apexsankey
|
|
2
2
|
|
|
3
|
-
Angular wrapper for [ApexSankey](https://github.com/apexcharts/apexsankey)
|
|
3
|
+
Angular wrapper for [ApexSankey](https://github.com/apexcharts/apexsankey) — a JavaScript library for creating Sankey diagrams.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install ngx-apexsankey apexsankey
|
|
8
|
+
npm install ngx-apexsankey apexsankey
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
> **Note:** `apexsankey` is a peer dependency and must be installed alongside `ngx-apexsankey`.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
### Option 1: CDN Script Tags (Recommended)
|
|
16
|
-
|
|
17
|
-
Add the scripts to your `index.html`:
|
|
18
|
-
|
|
19
|
-
```html
|
|
20
|
-
<!DOCTYPE html>
|
|
21
|
-
<html>
|
|
22
|
-
<head>
|
|
23
|
-
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js"></script>
|
|
24
|
-
<script src="https://cdn.jsdelivr.net/npm/apexsankey/apexsankey.min.js"></script>
|
|
25
|
-
</head>
|
|
26
|
-
<body>
|
|
27
|
-
<app-root></app-root>
|
|
28
|
-
</body>
|
|
29
|
-
</html>
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Option 2: Angular.json Scripts
|
|
33
|
-
|
|
34
|
-
Add to the `scripts` array in your `angular.json`:
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
{
|
|
38
|
-
"architect": {
|
|
39
|
-
"build": {
|
|
40
|
-
"options": {
|
|
41
|
-
"scripts": [
|
|
42
|
-
"node_modules/@svgdotjs/svg.js/dist/svg.min.js",
|
|
43
|
-
"node_modules/apexsankey/apexsankey.min.js"
|
|
44
|
-
]
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Quick Start
|
|
13
|
+
## Basic Usage
|
|
52
14
|
|
|
53
15
|
```typescript
|
|
54
|
-
import { Component } from
|
|
55
|
-
import {
|
|
16
|
+
import { Component } from "@angular/core";
|
|
17
|
+
import {
|
|
18
|
+
NgxApexsankeyComponent,
|
|
19
|
+
GraphData,
|
|
20
|
+
SankeyOptions,
|
|
21
|
+
} from "ngx-apexsankey";
|
|
56
22
|
|
|
57
23
|
@Component({
|
|
58
|
-
selector:
|
|
24
|
+
selector: "app-example",
|
|
59
25
|
standalone: true,
|
|
60
26
|
imports: [NgxApexsankeyComponent],
|
|
61
27
|
template: `
|
|
62
28
|
<ngx-apexsankey
|
|
63
29
|
[data]="data"
|
|
64
30
|
[options]="options"
|
|
65
|
-
(nodeClick)="onNodeClick($event)"
|
|
66
|
-
|
|
67
|
-
|
|
31
|
+
(nodeClick)="onNodeClick($event)"
|
|
32
|
+
></ngx-apexsankey>
|
|
33
|
+
`,
|
|
68
34
|
})
|
|
69
35
|
export class ExampleComponent {
|
|
70
36
|
data: GraphData = {
|
|
71
37
|
nodes: [
|
|
72
|
-
{ id:
|
|
73
|
-
{ id:
|
|
74
|
-
{ id:
|
|
75
|
-
{ id:
|
|
38
|
+
{ id: "oil", title: "Oil" },
|
|
39
|
+
{ id: "gas", title: "Natural Gas" },
|
|
40
|
+
{ id: "coal", title: "Coal" },
|
|
41
|
+
{ id: "fossil", title: "Fossil Fuels" },
|
|
42
|
+
{ id: "energy", title: "Energy" },
|
|
76
43
|
],
|
|
77
44
|
edges: [
|
|
78
|
-
{ source:
|
|
79
|
-
{ source:
|
|
80
|
-
{ source:
|
|
81
|
-
|
|
45
|
+
{ source: "oil", target: "fossil", value: 15, type: "flow" },
|
|
46
|
+
{ source: "gas", target: "fossil", value: 20, type: "flow" },
|
|
47
|
+
{ source: "coal", target: "fossil", value: 25, type: "flow" },
|
|
48
|
+
{ source: "fossil", target: "energy", value: 60, type: "flow" },
|
|
49
|
+
],
|
|
82
50
|
};
|
|
83
51
|
|
|
84
52
|
options: Partial<SankeyOptions> = {
|
|
85
53
|
width: 800,
|
|
86
|
-
height:
|
|
87
|
-
nodeWidth: 20
|
|
54
|
+
height: 500,
|
|
55
|
+
nodeWidth: 20,
|
|
88
56
|
};
|
|
89
57
|
|
|
90
|
-
onNodeClick(node:
|
|
91
|
-
console.log(
|
|
58
|
+
onNodeClick(node: unknown) {
|
|
59
|
+
console.log("Node clicked:", node);
|
|
92
60
|
}
|
|
93
61
|
}
|
|
94
62
|
```
|
|
@@ -98,93 +66,122 @@ export class ExampleComponent {
|
|
|
98
66
|
If you have a commercial license, set it once at app initialization:
|
|
99
67
|
|
|
100
68
|
```typescript
|
|
101
|
-
//
|
|
102
|
-
import { setApexSankeyLicense } from
|
|
69
|
+
// main.ts
|
|
70
|
+
import { setApexSankeyLicense } from "ngx-apexsankey";
|
|
103
71
|
|
|
104
|
-
setApexSankeyLicense(
|
|
72
|
+
setApexSankeyLicense("your-license-key-here");
|
|
105
73
|
|
|
106
|
-
|
|
107
|
-
providers: []
|
|
108
|
-
};
|
|
74
|
+
bootstrapApplication(AppComponent, appConfig);
|
|
109
75
|
```
|
|
110
76
|
|
|
111
77
|
## Inputs
|
|
112
78
|
|
|
113
|
-
| Input | Type | Required | Description
|
|
114
|
-
| --------- | ------------------------ | -------- |
|
|
115
|
-
| `data` | `GraphData` | Yes | Sankey
|
|
116
|
-
| `options` | `Partial<SankeyOptions>` | No |
|
|
79
|
+
| Input | Type | Required | Description |
|
|
80
|
+
| --------- | ------------------------ | -------- | --------------------------------- |
|
|
81
|
+
| `data` | `GraphData` | Yes | Sankey data (nodes and edges) |
|
|
82
|
+
| `options` | `Partial<SankeyOptions>` | No | Sankey configuration (see below) |
|
|
117
83
|
|
|
118
84
|
## Outputs
|
|
119
85
|
|
|
120
|
-
| Output | Type
|
|
121
|
-
| ----------- |
|
|
122
|
-
| `nodeClick` | `EventEmitter<SankeyNode>`
|
|
123
|
-
|
|
124
|
-
##
|
|
125
|
-
|
|
126
|
-
|
|
86
|
+
| Output | Type | Description |
|
|
87
|
+
| ----------- | ----------------------------- | ---------------------------- |
|
|
88
|
+
| `nodeClick` | `EventEmitter<SankeyNode>` | Emits when a node is clicked |
|
|
89
|
+
|
|
90
|
+
## SankeyOptions
|
|
91
|
+
|
|
92
|
+
All Sankey configuration is passed through the `options` input. `SankeyOptions` is an intersection of the sub-interfaces below — pass a partial; any omitted field falls back to its default.
|
|
93
|
+
|
|
94
|
+
#### Canvas & layout
|
|
95
|
+
|
|
96
|
+
| Option | Type | Default | Description |
|
|
97
|
+
| ---------------- | ------------------ | -------- | ------------------------------------------------------------------- |
|
|
98
|
+
| `width` | `number \| string` | `'100%'` | Canvas width (pixel number or CSS percentage) |
|
|
99
|
+
| `height` | `number \| string` | `'auto'` | Canvas height. `'auto'` derives from width at 1.6:1 |
|
|
100
|
+
| `spacing` | `number` | `20` | Horizontal spacing between node columns in pixels |
|
|
101
|
+
| `viewPortWidth` | `number` | `800` | Internal SVG viewport width |
|
|
102
|
+
| `viewPortHeight` | `number` | `500` | Internal SVG viewport height |
|
|
103
|
+
| `whitespace` | `number` | `0.18` | Fraction of vertical space used as margins between nodes (0–1) |
|
|
104
|
+
| `canvasStyle` | `string` | `''` | Arbitrary CSS injected onto the SVG root container |
|
|
105
|
+
| `enableToolbar` | `boolean` | `true` | Show the zoom/pan/export toolbar |
|
|
106
|
+
|
|
107
|
+
#### Nodes
|
|
108
|
+
|
|
109
|
+
| Option | Type | Default | Description |
|
|
110
|
+
| ----------------- | --------------------------------- | ------- | ---------------------------------------------------------- |
|
|
111
|
+
| `nodeWidth` | `number` | `20` | Width of each node rectangle in pixels |
|
|
112
|
+
| `nodeBorderWidth` | `number` | `1` | Border width of each node in pixels |
|
|
113
|
+
| `nodeBorderColor` | `string \| null` | `null` | Node border color |
|
|
114
|
+
| `onNodeClick` | `(node: SankeyNode) => void` | - | Callback fired when a node is clicked (prefer `nodeClick` output) |
|
|
115
|
+
|
|
116
|
+
#### Edges
|
|
117
|
+
|
|
118
|
+
| Option | Type | Default | Description |
|
|
119
|
+
| ------------------ | --------- | ------- | --------------------------------------------------------------- |
|
|
120
|
+
| `edgeOpacity` | `number` | `0.4` | Opacity of edges (0–1) |
|
|
121
|
+
| `edgeGradientFill` | `boolean` | `true` | Fill edges with a gradient between source and target colors |
|
|
122
|
+
| `edgeGap` | `number` | `2` | Gap in pixels between adjacent edges at their connection points |
|
|
123
|
+
|
|
124
|
+
#### Font
|
|
125
|
+
|
|
126
|
+
| Option | Type | Default | Description |
|
|
127
|
+
| ------------ | -------- | ----------- | -------------------------------- |
|
|
128
|
+
| `fontSize` | `string` | `'14px'` | CSS font-size for node labels |
|
|
129
|
+
| `fontFamily` | `string` | `''` | CSS font-family for node labels |
|
|
130
|
+
| `fontWeight` | `string` | `'400'` | CSS font-weight for node labels |
|
|
131
|
+
| `fontColor` | `string` | `'#212121'` | CSS color for node labels |
|
|
132
|
+
|
|
133
|
+
#### Tooltip
|
|
134
|
+
|
|
135
|
+
| Option | Type | Default | Description |
|
|
136
|
+
| --------------------- | --------------------------------------------- | -------------------------------- | -------------------------------------------- |
|
|
137
|
+
| `enableTooltip` | `boolean` | `true` | Show edge tooltips on hover |
|
|
138
|
+
| `tooltipTheme` | `'light' \| 'dark'` | - | Shortcut for dark/light color presets |
|
|
139
|
+
| `tooltipBGColor` | `string` | `'#FFFFFF'` | Tooltip background color |
|
|
140
|
+
| `tooltipBorderColor` | `string` | `'#E2E8F0'` | Tooltip border color |
|
|
141
|
+
| `tooltipFontColor` | `string` | `'#1a1a1a'` | Tooltip font color |
|
|
142
|
+
| `tooltipId` | `string` | `'apexsankey-tooltip-container'` | HTML `id` for the tooltip container |
|
|
143
|
+
| `tooltipTemplate` | `(content: TooltipContent) => string` | - | Custom edge (source→target) tooltip HTML |
|
|
144
|
+
| `nodeTooltipTemplate` | `(content: NodeTooltipContent) => string` | - | Custom per-node tooltip HTML |
|
|
145
|
+
|
|
146
|
+
#### Interaction & animation
|
|
147
|
+
|
|
148
|
+
| Option | Type | Default | Description |
|
|
149
|
+
| ------------------------ | --------- | ------- | -------------------------------------------------------------- |
|
|
150
|
+
| `highlightConnectedPath` | `boolean` | `true` | Highlight the connected flow path on hover |
|
|
151
|
+
| `dimOpacity` | `number` | `0.15` | Opacity for dimmed (unrelated) elements during highlighting |
|
|
152
|
+
| `animation.enabled` | `boolean` | `true` | Play entrance animation (disabled if `prefers-reduced-motion`) |
|
|
153
|
+
| `animation.duration` | `number` | `800` | Entrance animation duration in ms |
|
|
154
|
+
|
|
155
|
+
#### Accessibility
|
|
156
|
+
|
|
157
|
+
| Option | Type | Default | Description |
|
|
158
|
+
| -------------------- | --------- | ------- | ------------------------------------------------------------ |
|
|
159
|
+
| `a11y.enabled` | `boolean` | `true` | Enable WCAG 2.1 AA accessibility features |
|
|
160
|
+
| `a11y.diagramLabel` | `string` | - | Override the auto-generated aria-label on the SVG root |
|
|
161
|
+
| `a11y.description` | `string` | - | Populates the `<desc>` element for a longer description |
|
|
162
|
+
|
|
163
|
+
## Data Structure
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
interface GraphData {
|
|
167
|
+
nodes: SankeyNode[];
|
|
168
|
+
edges: SankeyEdge[];
|
|
169
|
+
}
|
|
127
170
|
|
|
128
|
-
```typescript
|
|
129
171
|
interface SankeyNode {
|
|
130
|
-
id: string;
|
|
131
|
-
title: string;
|
|
132
|
-
color?: string;
|
|
172
|
+
id: string; // unique identifier
|
|
173
|
+
title: string; // display label
|
|
174
|
+
color?: string; // override auto-assigned palette color
|
|
133
175
|
}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### Edges
|
|
137
176
|
|
|
138
|
-
```typescript
|
|
139
177
|
interface SankeyEdge {
|
|
140
|
-
source: string;
|
|
141
|
-
target: string;
|
|
142
|
-
value: number;
|
|
143
|
-
type
|
|
144
|
-
color?: string; // optional custom color
|
|
178
|
+
source: string; // id of upstream node
|
|
179
|
+
target: string; // id of downstream node
|
|
180
|
+
value: number; // flow value — determines edge band width
|
|
181
|
+
type: string; // category label (used for grouping and tooltip)
|
|
145
182
|
}
|
|
146
183
|
```
|
|
147
184
|
|
|
148
|
-
## Options
|
|
149
|
-
|
|
150
|
-
| Option | Type | Default | Description |
|
|
151
|
-
| ------------------ | ---------------------- | ---------------------------- | -------------------------------------------- |
|
|
152
|
-
| `width` | `number \| string` | `800` | Width of graph container |
|
|
153
|
-
| `height` | `number \| string` | `800` | Height of graph container |
|
|
154
|
-
| `canvasStyle` | `string` | `""` | CSS styles for canvas root container |
|
|
155
|
-
| `spacing` | `number` | `100` | Spacing from top and left of graph container |
|
|
156
|
-
| `nodeWidth` | `number` | `20` | Width of graph nodes |
|
|
157
|
-
| `nodeBorderWidth` | `number` | `1` | Border width of nodes in pixels |
|
|
158
|
-
| `nodeBorderColor` | `string` | `""` | Border color of nodes |
|
|
159
|
-
| `onNodeClick` | `(node) => void` | `undefined` | Callback function for node click |
|
|
160
|
-
| `edgeOpacity` | `number` | `0.4` | Opacity value for edges (0 to 1) |
|
|
161
|
-
| `edgeGradientFill` | `boolean` | `true` | Enable gradient fill based on node colors |
|
|
162
|
-
| `enableTooltip` | `boolean` | `false` | Enable tooltip on hover |
|
|
163
|
-
| `enableToolbar` | `boolean` | `false` | Enable/disable graph toolbar |
|
|
164
|
-
| `tooltipId` | `string` | `"sankey-tooltip-container"` | Tooltip HTML element id |
|
|
165
|
-
| `tooltipTemplate` | `(content) => string` | default template | HTML template for tooltip |
|
|
166
|
-
| `tooltipBorderColor` | `string` | `"#BCBCBC"` | Border color of tooltip |
|
|
167
|
-
| `tooltipBGColor` | `string` | `"#FFFFFF"` | Background color of tooltip |
|
|
168
|
-
| `fontSize` | `string` | `"14px"` | Font size of node labels |
|
|
169
|
-
| `fontFamily` | `string` | `""` | Font family of node labels |
|
|
170
|
-
| `fontWeight` | `string` | `"400"` | Font weight of node labels |
|
|
171
|
-
| `fontColor` | `string` | `"#000000"` | Font color of node labels |
|
|
172
|
-
|
|
173
|
-
## Custom Node Ordering
|
|
174
|
-
|
|
175
|
-
```typescript
|
|
176
|
-
const data: GraphData = {
|
|
177
|
-
nodes: [...],
|
|
178
|
-
edges: [...],
|
|
179
|
-
options: {
|
|
180
|
-
order: [
|
|
181
|
-
[['a', 'b']], // first layer
|
|
182
|
-
[['c']] // second layer
|
|
183
|
-
]
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
```
|
|
187
|
-
|
|
188
185
|
## Custom Tooltip
|
|
189
186
|
|
|
190
187
|
```typescript
|
|
@@ -192,39 +189,40 @@ const options: Partial<SankeyOptions> = {
|
|
|
192
189
|
enableTooltip: true,
|
|
193
190
|
tooltipTemplate: ({ source, target, value }) => `
|
|
194
191
|
<div style="padding: 8px;">
|
|
195
|
-
<strong>${source
|
|
192
|
+
<strong>${source?.title}</strong> → <strong>${target?.title}</strong>
|
|
196
193
|
<br />Value: ${value}
|
|
197
194
|
</div>
|
|
198
|
-
|
|
195
|
+
`,
|
|
199
196
|
};
|
|
200
197
|
```
|
|
201
198
|
|
|
202
|
-
## TypeScript
|
|
203
|
-
|
|
204
|
-
All types are exported:
|
|
199
|
+
## TypeScript Support
|
|
205
200
|
|
|
206
201
|
```typescript
|
|
207
202
|
import {
|
|
208
203
|
NgxApexsankeyComponent,
|
|
204
|
+
setApexSankeyLicense,
|
|
205
|
+
} from "ngx-apexsankey";
|
|
206
|
+
|
|
207
|
+
import type {
|
|
209
208
|
GraphData,
|
|
210
209
|
SankeyNode,
|
|
211
210
|
SankeyEdge,
|
|
212
211
|
SankeyOptions,
|
|
213
212
|
SankeyGraph,
|
|
214
|
-
|
|
215
|
-
} from
|
|
213
|
+
TooltipContent,
|
|
214
|
+
} from "ngx-apexsankey";
|
|
216
215
|
```
|
|
217
216
|
|
|
218
|
-
## Browser Support
|
|
219
|
-
|
|
220
|
-
- Angular 17+
|
|
221
|
-
- Modern browsers (Chrome, Firefox, Safari, Edge)
|
|
222
|
-
|
|
223
217
|
## License
|
|
224
218
|
|
|
225
|
-
See [LICENSE](./LICENSE)
|
|
219
|
+
ngx-apexsankey uses the same dual-license model as ApexCharts. See [LICENSE](./LICENSE) for details.
|
|
220
|
+
|
|
221
|
+
- **Free** for individuals, non-profits, and small businesses (< $2M revenue)
|
|
222
|
+
- **Commercial license** required for larger organizations
|
|
226
223
|
|
|
227
224
|
## Links
|
|
228
225
|
|
|
229
|
-
- [ApexSankey Documentation](https://
|
|
230
|
-
- [
|
|
226
|
+
- [ApexSankey Documentation](https://github.com/apexcharts/apexsankey)
|
|
227
|
+
- [ApexCharts](https://apexcharts.com)
|
|
228
|
+
- [License Information](https://apexcharts.com/license)
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, } from "@angular/core";
|
|
2
|
+
import { getApexSankeyClass, applyStoredLicense } from "./utils";
|
|
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 class NgxApexsankeyComponent {
|
|
18
|
+
/**
|
|
19
|
+
* sankey diagram data containing nodes and edges
|
|
20
|
+
*/
|
|
21
|
+
data;
|
|
22
|
+
/**
|
|
23
|
+
* configuration options for the sankey diagram
|
|
24
|
+
*/
|
|
25
|
+
options = {};
|
|
26
|
+
/**
|
|
27
|
+
* emits when a node is clicked
|
|
28
|
+
*/
|
|
29
|
+
nodeClick = new EventEmitter();
|
|
30
|
+
/**
|
|
31
|
+
* reference to the container element
|
|
32
|
+
*/
|
|
33
|
+
containerRef;
|
|
34
|
+
/**
|
|
35
|
+
* the rendered sankey graph instance
|
|
36
|
+
*/
|
|
37
|
+
graph = null;
|
|
38
|
+
instance = null;
|
|
39
|
+
isBrowser = typeof window !== "undefined";
|
|
40
|
+
/**
|
|
41
|
+
* computed container styles from options
|
|
42
|
+
*/
|
|
43
|
+
get containerStyle() {
|
|
44
|
+
const style = {};
|
|
45
|
+
if (this.options?.width) {
|
|
46
|
+
style["width"] =
|
|
47
|
+
typeof this.options.width === "number"
|
|
48
|
+
? `${this.options.width}px`
|
|
49
|
+
: this.options.width;
|
|
50
|
+
}
|
|
51
|
+
if (this.options?.height) {
|
|
52
|
+
style["height"] =
|
|
53
|
+
typeof this.options.height === "number"
|
|
54
|
+
? `${this.options.height}px`
|
|
55
|
+
: this.options.height;
|
|
56
|
+
}
|
|
57
|
+
return style;
|
|
58
|
+
}
|
|
59
|
+
ngOnInit() {
|
|
60
|
+
if (this.isBrowser) {
|
|
61
|
+
this.initChart();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
ngOnChanges(changes) {
|
|
65
|
+
if (!this.isBrowser) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// if options changed, recreate the chart
|
|
69
|
+
if (changes["options"] && !changes["options"].firstChange) {
|
|
70
|
+
this.recreateChart();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// if data changed, re-render
|
|
74
|
+
if (changes["data"] && !changes["data"].firstChange) {
|
|
75
|
+
this.renderChart();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
ngOnDestroy() {
|
|
79
|
+
this.destroyChart();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* initializes the sankey chart
|
|
83
|
+
*/
|
|
84
|
+
initChart() {
|
|
85
|
+
const container = this.containerRef?.nativeElement;
|
|
86
|
+
if (!container) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const ApexSankey = getApexSankeyClass();
|
|
90
|
+
if (!ApexSankey) {
|
|
91
|
+
throw new Error("[ngx-apexsankey] ApexSankey not found. " +
|
|
92
|
+
"Make sure to import apexsankey and @svgdotjs/svg.js before using this component. " +
|
|
93
|
+
"See README for installation instructions.");
|
|
94
|
+
}
|
|
95
|
+
// apply stored license if set before ApexSankey loaded
|
|
96
|
+
applyStoredLicense(ApexSankey);
|
|
97
|
+
// merge options with node click handler
|
|
98
|
+
const mergedOptions = this.getMergedOptions();
|
|
99
|
+
// create instance and render
|
|
100
|
+
this.instance = new ApexSankey(container, mergedOptions);
|
|
101
|
+
this.graph = this.instance.render(this.data);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* re-renders the chart with current data
|
|
105
|
+
*/
|
|
106
|
+
renderChart() {
|
|
107
|
+
if (!this.instance || !this.containerRef?.nativeElement) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// clear existing content
|
|
111
|
+
if (this.graph?.clear) {
|
|
112
|
+
this.graph.clear();
|
|
113
|
+
}
|
|
114
|
+
// re-render with new data
|
|
115
|
+
this.graph = this.instance.render(this.data);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* destroys and recreates the chart with new options
|
|
119
|
+
*/
|
|
120
|
+
recreateChart() {
|
|
121
|
+
this.destroyChart();
|
|
122
|
+
this.initChart();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* destroys the chart instance via the core destroy() API
|
|
126
|
+
*/
|
|
127
|
+
destroyChart() {
|
|
128
|
+
this.instance?.destroy();
|
|
129
|
+
this.graph = null;
|
|
130
|
+
this.instance = null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* merges user options with the node click event emitter
|
|
134
|
+
*/
|
|
135
|
+
getMergedOptions() {
|
|
136
|
+
const options = { ...this.options };
|
|
137
|
+
// wrap onNodeClick to also emit the event
|
|
138
|
+
const userCallback = options.onNodeClick;
|
|
139
|
+
options.onNodeClick = (node) => {
|
|
140
|
+
this.nodeClick.emit(node);
|
|
141
|
+
if (userCallback) {
|
|
142
|
+
userCallback(node);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
return options;
|
|
146
|
+
}
|
|
147
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
148
|
+
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 });
|
|
149
|
+
}
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, decorators: [{
|
|
151
|
+
type: Component,
|
|
152
|
+
args: [{
|
|
153
|
+
selector: "ngx-apexsankey",
|
|
154
|
+
standalone: true,
|
|
155
|
+
template: `<div #container [style]="containerStyle"></div>`,
|
|
156
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
157
|
+
}]
|
|
158
|
+
}], propDecorators: { data: [{
|
|
159
|
+
type: Input,
|
|
160
|
+
args: [{ required: true }]
|
|
161
|
+
}], options: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], nodeClick: [{
|
|
164
|
+
type: Output
|
|
165
|
+
}], containerRef: [{
|
|
166
|
+
type: ViewChild,
|
|
167
|
+
args: ["container", { static: true }]
|
|
168
|
+
}] } });
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFwZXhzYW5rZXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFLWixTQUFTLEVBQ1QsdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBUXZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFakU7Ozs7Ozs7Ozs7OztHQVlHO0FBT0gsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQzs7T0FFRztJQUN3QixJQUFJLENBQWE7SUFFNUM7O09BRUc7SUFDTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUU5Qzs7T0FFRztJQUNPLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBRXJEOztPQUVHO0lBRUgsWUFBWSxDQUEyQjtJQUV2Qzs7T0FFRztJQUNILEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBRXpCLFFBQVEsR0FBOEIsSUFBSSxDQUFDO0lBQzNDLFNBQVMsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7SUFFbEQ7O09BRUc7SUFDSCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxLQUFLLEdBQTJCLEVBQUUsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFO1lBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRO29CQUNwQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSTtvQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0s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LE1BQU0sT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFcEMsMENBQTBDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDekMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzt3R0FoS1Usc0JBQXNCOzRGQUF0QixzQkFBc0IsMlNBSHZCLGlEQUFpRDs7NEZBR2hELHNCQUFzQjtrQkFObEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGlEQUFpRDtvQkFDM0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzhCQUs0QixJQUFJO3NCQUE5QixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFLaEIsT0FBTztzQkFBZixLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU07Z0JBTVAsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIEdyYXBoRGF0YSxcbiAgU2Fua2V5T3B0aW9ucyxcbiAgU2Fua2V5R3JhcGgsXG4gIFNhbmtleU5vZGUsXG4gIEFwZXhTYW5rZXlJbnN0YW5jZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldEFwZXhTYW5rZXlDbGFzcywgYXBwbHlTdG9yZWRMaWNlbnNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBhbmd1bGFyIHdyYXBwZXIgY29tcG9uZW50IGZvciBBcGV4U2Fua2V5XG4gKiByZW5kZXJzIGEgc2Fua2V5IGRpYWdyYW0gdXNpbmcgdGhlIEFwZXhTYW5rZXkgbGlicmFyeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8bmd4LWFwZXhzYW5rZXlcbiAqICAgW2RhdGFdPVwic2Fua2V5RGF0YVwiXG4gKiAgIFtvcHRpb25zXT1cInNhbmtleU9wdGlvbnNcIlxuICogICAobm9kZUNsaWNrKT1cIm9uTm9kZUNsaWNrKCRldmVudClcIj5cbiAqIDwvbmd4LWFwZXhzYW5rZXk+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm5neC1hcGV4c2Fua2V5XCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgPGRpdiAjY29udGFpbmVyIFtzdHlsZV09XCJjb250YWluZXJTdHlsZVwiPjwvZGl2PmAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hBcGV4c2Fua2V5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBzYW5rZXkgZGlhZ3JhbSBkYXRhIGNvbnRhaW5pbmcgbm9kZXMgYW5kIGVkZ2VzXG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBkYXRhITogR3JhcGhEYXRhO1xuXG4gIC8qKlxuICAgKiBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzYW5rZXkgZGlhZ3JhbVxuICAgKi9cbiAgQElucHV0KCkgb3B0aW9uczogUGFydGlhbDxTYW5rZXlPcHRpb25zPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBlbWl0cyB3aGVuIGEgbm9kZSBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgbm9kZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxTYW5rZXlOb2RlPigpO1xuXG4gIC8qKlxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50XG4gICAqL1xuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiB0aGUgcmVuZGVyZWQgc2Fua2V5IGdyYXBoIGluc3RhbmNlXG4gICAqL1xuICBncmFwaDogU2Fua2V5R3JhcGggfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGluc3RhbmNlOiBBcGV4U2Fua2V5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIC8qKlxuICAgKiBjb21wdXRlZCBjb250YWluZXIgc3R5bGVzIGZyb20gb3B0aW9uc1xuICAgKi9cbiAgZ2V0IGNvbnRhaW5lclN0eWxlKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy53aWR0aCkge1xuICAgICAgc3R5bGVbXCJ3aWR0aFwiXSA9XG4gICAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMud2lkdGggPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy53aWR0aH1weGBcbiAgICAgICAgICA6IHRoaXMub3B0aW9ucy53aWR0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5oZWlnaHQpIHtcbiAgICAgIHN0eWxlW1wiaGVpZ2h0XCJdID1cbiAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucy5oZWlnaHQgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5oZWlnaHR9cHhgXG4gICAgICAgICAgOiB0aGlzLm9wdGlvbnMuaGVpZ2h0O1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgdGhpcy5pbml0Q2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG9wdGlvbnMgY2hhbmdlZCwgcmVjcmVhdGUgdGhlIGNoYXJ0XG4gICAgaWYgKGNoYW5nZXNbXCJvcHRpb25zXCJdICYmICFjaGFuZ2VzW1wib3B0aW9uc1wiXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUNoYXJ0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgZGF0YSBjaGFuZ2VkLCByZS1yZW5kZXJcbiAgICBpZiAoY2hhbmdlc1tcImRhdGFcIl0gJiYgIWNoYW5nZXNbXCJkYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnJlbmRlckNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95Q2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplcyB0aGUgc2Fua2V5IGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIGluaXRDaGFydCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IEFwZXhTYW5rZXkgPSBnZXRBcGV4U2Fua2V5Q2xhc3MoKTtcblxuICAgIGlmICghQXBleFNhbmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIltuZ3gtYXBleHNhbmtleV0gQXBleFNhbmtleSBub3QgZm91bmQuIFwiICtcbiAgICAgICAgICBcIk1ha2Ugc3VyZSB0byBpbXBvcnQgYXBleHNhbmtleSBhbmQgQHN2Z2RvdGpzL3N2Zy5qcyBiZWZvcmUgdXNpbmcgdGhpcyBjb21wb25lbnQuIFwiICtcbiAgICAgICAgICBcIlNlZSBSRUFETUUgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHN0b3JlZCBsaWNlbnNlIGlmIHNldCBiZWZvcmUgQXBleFNhbmtleSBsb2FkZWRcbiAgICBhcHBseVN0b3JlZExpY2Vuc2UoQXBleFNhbmtleSk7XG5cbiAgICAvLyBtZXJnZSBvcHRpb25zIHdpdGggbm9kZSBjbGljayBoYW5kbGVyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHRoaXMuZ2V0TWVyZ2VkT3B0aW9ucygpO1xuXG4gICAgLy8gY3JlYXRlIGluc3RhbmNlIGFuZCByZW5kZXJcbiAgICB0aGlzLmluc3RhbmNlID0gbmV3IEFwZXhTYW5rZXkoY29udGFpbmVyLCBtZXJnZWRPcHRpb25zKTtcbiAgICB0aGlzLmdyYXBoID0gdGhpcy5pbnN0YW5jZS5yZW5kZXIodGhpcy5kYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZS1yZW5kZXJzIHRoZSBjaGFydCB3aXRoIGN1cnJlbnQgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UgfHwgIXRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgZXhpc3RpbmcgY29udGVudFxuICAgIGlmICh0aGlzLmdyYXBoPy5jbGVhcikge1xuICAgICAgdGhpcy5ncmFwaC5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIHJlLXJlbmRlciB3aXRoIG5ldyBkYXRhXG4gICAgdGhpcy5ncmFwaCA9IHRoaXMuaW5zdGFuY2UucmVuZGVyKHRoaXMuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogZGVzdHJveXMgYW5kIHJlY3JlYXRlcyB0aGUgY2hhcnQgd2l0aCBuZXcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSByZWNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUNoYXJ0KCk7XG4gICAgdGhpcy5pbml0Q2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXN0cm95cyB0aGUgY2hhcnQgaW5zdGFuY2UgdmlhIHRoZSBjb3JlIGRlc3Ryb3koKSBBUElcbiAgICovXG4gIHByaXZhdGUgZGVzdHJveUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmdyYXBoID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZXMgdXNlciBvcHRpb25zIHdpdGggdGhlIG5vZGUgY2xpY2sgZXZlbnQgZW1pdHRlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNZXJnZWRPcHRpb25zKCk6IFBhcnRpYWw8U2Fua2V5T3B0aW9ucz4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuXG4gICAgLy8gd3JhcCBvbk5vZGVDbGljayB0byBhbHNvIGVtaXQgdGhlIGV2ZW50XG4gICAgY29uc3QgdXNlckNhbGxiYWNrID0gb3B0aW9ucy5vbk5vZGVDbGljaztcbiAgICBvcHRpb25zLm9uTm9kZUNsaWNrID0gKG5vZGU6IFNhbmtleU5vZGUpID0+IHtcbiAgICAgIHRoaXMubm9kZUNsaWNrLmVtaXQobm9kZSk7XG4gICAgICBpZiAodXNlckNhbGxiYWNrKSB7XG4gICAgICAgIHVzZXJDYWxsYmFjayhub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Core data types — kept here because ngx-apexsankey loads ApexSankey via
|
|
3
|
+
// the global window object (CDN pattern) and cannot import types from
|
|
4
|
+
// 'apexsankey' at build time without it being a devDependency.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLCtEQUErRDtBQUMvRCw4RUFBOEUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvcmUgZGF0YSB0eXBlcyDigJQga2VwdCBoZXJlIGJlY2F1c2Ugbmd4LWFwZXhzYW5rZXkgbG9hZHMgQXBleFNhbmtleSB2aWFcbi8vIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdCAoQ0ROIHBhdHRlcm4pIGFuZCBjYW5ub3QgaW1wb3J0IHR5cGVzIGZyb21cbi8vICdhcGV4c2Fua2V5JyBhdCBidWlsZCB0aW1lIHdpdGhvdXQgaXQgYmVpbmcgYSBkZXZEZXBlbmRlbmN5LlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogbm9kZSBkZWZpbml0aW9uIGZvciBzYW5rZXkgZGlhZ3JhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmtleU5vZGUge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBlZGdlIGRlZmluaXRpb24gY29ubmVjdGluZyB0d28gbm9kZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlFZGdlIHtcbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBkYXRhIG9wdGlvbnMgZm9yIGN1c3RvbSBvcmRlcmluZyBhbmQgbGluayBhbGlnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG9yZGVyPzogc3RyaW5nW11bXVtdO1xuICByZWFkb25seSBhbGlnbkxpbmtUeXBlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogY29tcGxldGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNhbmtleSBkaWFncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhEYXRhIHtcbiAgcmVhZG9ubHkgbm9kZXM6IFNhbmtleU5vZGVbXTtcbiAgcmVhZG9ubHkgZWRnZXM6IFNhbmtleUVkZ2VbXTtcbiAgcmVhZG9ubHkgb3B0aW9ucz86IERhdGFPcHRpb25zO1xufVxuXG4vKipcbiAqIGNvbnRlbnQgcGFzc2VkIHRvIHRvb2x0aXAgdGVtcGxhdGUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sdGlwQ29udGVudCB7XG4gIHNvdXJjZTogU2Fua2V5Tm9kZTtcbiAgdGFyZ2V0OiBTYW5rZXlOb2RlO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIGNvbWJpbmVkIHNhbmtleSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBNaXJyb3JzIHRoZSBTYW5rZXlPcHRpb25zIGludGVyc2VjdGlvbiB0eXBlIGluIGNvcmUgYXBleHNhbmtleS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlPcHRpb25zIHtcbiAgLy8gY2FudmFzIC8gbGF5b3V0XG4gIHJlYWRvbmx5IGNhbnZhc1N0eWxlPzogc3RyaW5nO1xuICByZWFkb25seSBlbmFibGVUb29sYmFyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICByZWFkb25seSBzcGFjaW5nPzogbnVtYmVyO1xuICByZWFkb25seSB2aWV3UG9ydEhlaWdodD86IG51bWJlcjtcbiAgcmVhZG9ubHkgdmlld1BvcnRXaWR0aD86IG51bWJlcjtcbiAgcmVhZG9ubHkgd2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8vIG5vZGVcbiAgcmVhZG9ubHkgbm9kZUJvcmRlckNvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSBub2RlQm9yZGVyV2lkdGg/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG5vZGVXaWR0aD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb25Ob2RlQ2xpY2s/OiAobm9kZTogU2Fua2V5Tm9kZSkgPT4gdm9pZDtcbiAgLy8gZWRnZVxuICByZWFkb25seSBlZGdlR3JhZGllbnRGaWxsPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZWRnZU9wYWNpdHk/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVkZ2VHYXA/OiBudW1iZXI7XG4gIC8vIGZvbnRcbiAgcmVhZG9ubHkgZm9udENvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSBmb250RmFtaWx5Pzogc3RyaW5nO1xuICByZWFkb25seSBmb250U2l6ZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZm9udFdlaWdodD86IHN0cmluZztcbiAgLy8gdG9vbHRpcFxuICByZWFkb25seSBlbmFibGVUb29sdGlwPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdG9vbHRpcEJHQ29sb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRvb2x0aXBCb3JkZXJDb2xvcj86IHN0cmluZztcbiAgcmVhZG9ubHkgdG9vbHRpcElkPzogc3RyaW5nO1xuICByZWFkb25seSB0b29sdGlwVGVtcGxhdGU/OiAoY29udGVudDogVG9vbHRpcENvbnRlbnQpID0+IHN0cmluZztcbiAgLy8gaW50ZXJhY3Rpb25cbiAgcmVhZG9ubHkgaGlnaGxpZ2h0T25Ib3Zlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRpbU9uSG92ZXI/OiBib29sZWFuO1xuICAvLyBhbmltYXRpb25cbiAgcmVhZG9ubHkgZW5hYmxlQW5pbWF0aW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYW5pbWF0aW9uRHVyYXRpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogc2Fua2V5IGdyYXBoIGluc3RhbmNlIHJldHVybmVkIGJ5IEFwZXhTYW5rZXkucmVuZGVyKClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlHcmFwaCB7XG4gIGdyYXBoOiB1bmtub3duO1xuICBtYXhSYW5rOiBudW1iZXI7XG4gIHJlbmRlcihvcHRpb25zPzogeyBrZWVwT2xkUG9zaXRpb24/OiBib29sZWFuIH0pOiB2b2lkO1xuICBjbGVhcj86ICgpID0+IHZvaWQ7XG4gIGV4cG9ydFRvU3ZnPzogKCkgPT4gdm9pZDtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIHNwYWNpbmc6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBhcGV4c2Fua2V5IGNvbnN0cnVjdG9yIHR5cGUgKGxvYWRlZCB2aWEgd2luZG93IGdsb2JhbClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGV4U2Fua2V5Q29uc3RydWN0b3Ige1xuICBuZXcgKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogUGFydGlhbDxTYW5rZXlPcHRpb25zPik6IEFwZXhTYW5rZXlJbnN0YW5jZTtcbiAgc2V0TGljZW5zZTogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIGFwZXhzYW5rZXkgaW5zdGFuY2UgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwZXhTYW5rZXlJbnN0YW5jZSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBvcHRpb25zOiBTYW5rZXlPcHRpb25zO1xuICBncmFwaDogU2Fua2V5R3JhcGg7XG4gIHJlbmRlcjogKGRhdGE6IEdyYXBoRGF0YSkgPT4gU2Fua2V5R3JhcGg7XG4gIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogZXh0ZW5kZWQgd2luZG93IGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIEFwZXhTYW5rZXkgZ2xvYmFsbHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGV4U2Fua2V5V2luZG93IGV4dGVuZHMgV2luZG93IHtcbiAgQXBleFNhbmtleT86IEFwZXhTYW5rZXlDb25zdHJ1Y3RvcjtcbiAgX19BUEVYX1NBTktFWV9MSUNFTlNFX0tFWV9fPzogc3RyaW5nO1xufVxuIl19
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
export { NgxApexsankeyComponent } from './lib/ngx-apexsankey.component';
|
|
3
3
|
// utility functions
|
|
4
4
|
export { setApexSankeyLicense } from './lib/utils';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbWFpbiBjb21wb25lbnRcbmV4cG9ydCB7IE5neEFwZXhzYW5rZXlDb21wb25lbnQgfSBmcm9tICcuL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQnO1xuXG4vLyB1dGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IHsgc2V0QXBleFNhbmtleUxpY2Vuc2UgfSBmcm9tICcuL2xpYi91dGlscyc7XG5cbi8vIHR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIC8vIGRhdGEgdHlwZXNcbiAgU2Fua2V5Tm9kZSxcbiAgU2Fua2V5RWRnZSxcbiAgR3JhcGhEYXRhLFxuICBEYXRhT3B0aW9ucyxcblxuICAvLyBvcHRpb25zIHR5cGVzXG4gIFNhbmtleU9wdGlvbnMsXG4gIFRvb2x0aXBDb250ZW50LFxuXG4gIC8vIGluc3RhbmNlIHR5cGVzXG4gIFNhbmtleUdyYXBoLFxuICBBcGV4U2Fua2V5SW5zdGFuY2UsXG4gIEFwZXhTYW5rZXlDb25zdHJ1Y3Rvcixcbn0gZnJvbSAnLi9saWIvdHlwZXMnO1xuIl19
|