@xplortech/insights-elements 0.0.2 → 0.0.3
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 +23 -2
- package/dist/cjs/{apollo-data.esm-by4pfDU4.js → apollo-data.esm-DAW-9Wo3.js} +3 -3
- package/dist/cjs/apollo-data.esm-DAW-9Wo3.js.map +1 -0
- package/dist/cjs/{app-globals-D-MP41KM.js → app-globals-CS8MKc1U.js} +5 -5
- package/dist/cjs/{app-globals-D-MP41KM.js.map → app-globals-CS8MKc1U.js.map} +1 -1
- package/dist/cjs/index-DtrFwwSq.js +8 -0
- package/dist/cjs/insights-elements.cjs.js +2 -2
- package/dist/cjs/insights-line-chart.cjs.entry.js +42 -0
- package/dist/cjs/insights-line-chart.entry.cjs.js.map +1 -0
- package/dist/cjs/insights-scatter-chart.cjs.entry.js +42 -0
- package/dist/cjs/insights-scatter-chart.entry.cjs.js.map +1 -0
- package/dist/cjs/insights-wrapper.cjs.entry.js +1 -1
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +2 -0
- package/dist/collection/components/insights-line-chart/insights-line-chart.css +87 -0
- package/dist/collection/components/insights-line-chart/insights-line-chart.js +51 -0
- package/dist/collection/components/insights-line-chart/insights-line-chart.js.map +1 -0
- package/dist/collection/components/insights-scatter-chart/insights-scatter-chart.css +87 -0
- package/dist/collection/components/insights-scatter-chart/insights-scatter-chart.js +51 -0
- package/dist/collection/components/insights-scatter-chart/insights-scatter-chart.js.map +1 -0
- package/dist/collection/components/insights-wrapper/insights-wrapper.js +1 -1
- package/dist/collection/utils/code-generator.js +19 -4
- package/dist/collection/utils/code-generator.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/insights-line-chart.d.ts +11 -0
- package/dist/components/insights-line-chart.js +73 -0
- package/dist/components/insights-line-chart.js.map +1 -0
- package/dist/components/insights-scatter-chart.d.ts +11 -0
- package/dist/components/insights-scatter-chart.js +73 -0
- package/dist/components/insights-scatter-chart.js.map +1 -0
- package/dist/components/insights-wrapper.js +1 -1
- package/dist/components/{p-DHA6uI9u.js → p-D8NW3xSO.js} +3 -3
- package/dist/components/{p-DHA6uI9u.js.map → p-D8NW3xSO.js.map} +1 -1
- package/dist/esm/{apollo-data.esm-DHA6uI9u.js → apollo-data.esm-D8NW3xSO.js} +3 -3
- package/dist/esm/apollo-data.esm-D8NW3xSO.js.map +1 -0
- package/dist/esm/{app-globals-BtE_P06_.js → app-globals-DL_eG2uK.js} +3 -3
- package/dist/esm/{app-globals-BtE_P06_.js.map → app-globals-DL_eG2uK.js.map} +1 -1
- package/dist/esm/index-BAqvP5--.js +8 -0
- package/dist/esm/insights-elements.js +2 -2
- package/dist/esm/insights-line-chart.entry.js +40 -0
- package/dist/esm/insights-line-chart.entry.js.map +1 -0
- package/dist/esm/insights-scatter-chart.entry.js +40 -0
- package/dist/esm/insights-scatter-chart.entry.js.map +1 -0
- package/dist/esm/insights-wrapper.entry.js +1 -1
- package/dist/esm/loader.js +2 -2
- package/dist/insights-elements/insights-elements.esm.js +1 -1
- package/dist/insights-elements/insights-line-chart.entry.esm.js.map +1 -0
- package/dist/insights-elements/insights-scatter-chart.entry.esm.js.map +1 -0
- package/dist/insights-elements/{p-DE0h_D1B.js → p-4JSq-Alu.js} +2 -2
- package/dist/insights-elements/{p-DE0h_D1B.js.map → p-4JSq-Alu.js.map} +1 -1
- package/dist/insights-elements/p-76038403.entry.js +2 -0
- package/dist/insights-elements/p-76038403.entry.js.map +1 -0
- package/dist/insights-elements/{p-DHA6uI9u.js → p-D8NW3xSO.js} +3 -3
- package/dist/insights-elements/p-D8NW3xSO.js.map +1 -0
- package/dist/insights-elements/{p-29ce0a90.entry.js → p-a8196ab4.entry.js} +2 -2
- package/dist/insights-elements/p-cf44d793.entry.js +2 -0
- package/dist/insights-elements/p-cf44d793.entry.js.map +1 -0
- package/dist/types/components/insights-line-chart/insights-line-chart.d.ts +9 -0
- package/dist/types/components/insights-scatter-chart/insights-scatter-chart.d.ts +9 -0
- package/dist/types/components.d.ts +106 -0
- package/package.json +3 -2
- package/dist/cjs/apollo-data.esm-by4pfDU4.js.map +0 -1
- package/dist/esm/apollo-data.esm-DHA6uI9u.js.map +0 -1
- package/dist/insights-elements/p-DHA6uI9u.js.map +0 -1
- /package/dist/insights-elements/{p-29ce0a90.entry.js.map → p-a8196ab4.entry.js.map} +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.insights-scatter-chart {
|
|
6
|
+
width: 100%;
|
|
7
|
+
height: 100%;
|
|
8
|
+
min-height: 300px;
|
|
9
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.loading-container {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
height: 100%;
|
|
18
|
+
min-height: 300px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.spinner {
|
|
22
|
+
width: 40px;
|
|
23
|
+
height: 40px;
|
|
24
|
+
border: 4px solid #f3f3f3;
|
|
25
|
+
border-top: 4px solid #3498db;
|
|
26
|
+
border-radius: 50%;
|
|
27
|
+
animation: spin 1s linear infinite;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@keyframes spin {
|
|
31
|
+
0% {
|
|
32
|
+
transform: rotate(0deg);
|
|
33
|
+
}
|
|
34
|
+
100% {
|
|
35
|
+
transform: rotate(360deg);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.loading-container p {
|
|
40
|
+
margin-top: 16px;
|
|
41
|
+
color: #666;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.error-container {
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
align-items: center;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
height: 100%;
|
|
50
|
+
min-height: 300px;
|
|
51
|
+
padding: 20px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.error-message {
|
|
55
|
+
color: #e74c3c;
|
|
56
|
+
margin-bottom: 16px;
|
|
57
|
+
text-align: center;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.error-container button {
|
|
61
|
+
padding: 8px 16px;
|
|
62
|
+
background-color: #3498db;
|
|
63
|
+
color: white;
|
|
64
|
+
border: none;
|
|
65
|
+
border-radius: 4px;
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
font-size: 14px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.error-container button:hover {
|
|
71
|
+
background-color: #2980b9;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.chart-container {
|
|
75
|
+
width: 100%;
|
|
76
|
+
height: 100%;
|
|
77
|
+
padding: 20px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.no-data {
|
|
81
|
+
display: flex;
|
|
82
|
+
align-items: center;
|
|
83
|
+
justify-content: center;
|
|
84
|
+
height: 100%;
|
|
85
|
+
min-height: 300px;
|
|
86
|
+
color: #999;
|
|
87
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { h } from "@stencil/core";
|
|
2
|
+
import { InsightsChartBase } from "../insights-chart-base";
|
|
3
|
+
export class InsightsScatterChart extends InsightsChartBase {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
}
|
|
7
|
+
el = null;
|
|
8
|
+
componentWillLoad() {
|
|
9
|
+
this.fetchChartData();
|
|
10
|
+
}
|
|
11
|
+
handlePropsChange() {
|
|
12
|
+
this.fetchChartData();
|
|
13
|
+
}
|
|
14
|
+
renderChart() {
|
|
15
|
+
if (!this.data || this.data.length === 0) {
|
|
16
|
+
return h("div", { class: "no-data" }, "No data available");
|
|
17
|
+
}
|
|
18
|
+
return (h("div", { class: "chart-container" }, h("apollo-data-scatter-chart", { ref: el => {
|
|
19
|
+
if (el) {
|
|
20
|
+
el.adData = this.data;
|
|
21
|
+
el.adSpec = this.spec || {};
|
|
22
|
+
}
|
|
23
|
+
} })));
|
|
24
|
+
}
|
|
25
|
+
render() {
|
|
26
|
+
return (h("div", { key: '61e22e1dc0e3e72587b2d002ed88fdd689204989', class: "insights-scatter-chart" }, this.loading && (h("div", { key: '4cbf8b9c9420f30fca0cd1f636572c096b94da42', class: "loading-container" }, h("div", { key: '58f5c0707fec9ca808da73f019b1e3d0ee03f471', class: "spinner" }), h("p", { key: '8db6aa307e3d18b6fef544b0723856a9b350d8b4' }, "Loading chart data..."))), this.error && (h("div", { key: '41fff6d64f7c2ccd468d57e712a2137d38d8e562', class: "error-container" }, h("p", { key: '8061de8655b178c04a8ba0c7ae70a59ada74d6ab', class: "error-message" }, this.error), h("button", { key: '23f8e2b5759b999ab22e511e861a7a82f06d05e2', onClick: () => this.fetchChartData() }, "Retry"))), !this.loading && !this.error && this.renderChart()));
|
|
27
|
+
}
|
|
28
|
+
static get is() { return "insights-scatter-chart"; }
|
|
29
|
+
static get encapsulation() { return "shadow"; }
|
|
30
|
+
static get originalStyleUrls() {
|
|
31
|
+
return {
|
|
32
|
+
"$": ["insights-scatter-chart.css"]
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
static get styleUrls() {
|
|
36
|
+
return {
|
|
37
|
+
"$": ["insights-scatter-chart.css"]
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
static get elementRef() { return "el"; }
|
|
41
|
+
static get watchers() {
|
|
42
|
+
return [{
|
|
43
|
+
"propName": "reportName",
|
|
44
|
+
"methodName": "handlePropsChange"
|
|
45
|
+
}, {
|
|
46
|
+
"propName": "filters",
|
|
47
|
+
"methodName": "handlePropsChange"
|
|
48
|
+
}];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=insights-scatter-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights-scatter-chart.js","sourceRoot":"","sources":["../../../src/components/insights-scatter-chart/insights-scatter-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,MAAM,OAAO,oBAAqB,SAAQ,iBAAiD;;;;IAC9E,EAAE,GAAgB,IAAI,CAAC;IAElC,iBAAiB;QACf,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAID,iBAAiB;QACf,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,WAAK,KAAK,EAAC,SAAS,wBAAwB,CAAC;QACtD,CAAC;QAED,OAAO,CACL,WAAK,KAAK,EAAC,iBAAiB;YAC1B,iCACE,GAAG,EAAE,EAAE,CAAC,EAAE;oBACR,IAAI,EAAE,EAAE,CAAC;wBACP,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;wBACtB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;oBAC9B,CAAC;gBACH,CAAC,GACD,CACE,CACP,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,CACL,4DAAK,KAAK,EAAC,wBAAwB;YAChC,IAAI,CAAC,OAAO,IAAI,CACf,4DAAK,KAAK,EAAC,mBAAmB;gBAC5B,4DAAK,KAAK,EAAC,SAAS,GAAO;gBAC3B,oFAA4B,CACxB,CACP;YAEA,IAAI,CAAC,KAAK,IAAI,CACb,4DAAK,KAAK,EAAC,iBAAiB;gBAC1B,0DAAG,KAAK,EAAC,eAAe,IAAE,IAAI,CAAC,KAAK,CAAK;gBACzC,+DAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,YAAgB,CACxD,CACP;YAEA,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAC/C,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, h, Watch, Element } from '@stencil/core';\nimport type { ScatterDataItem, ScatterSpec } from '@xplortech/apollo-data/dist/types/components.d.ts';\nimport { InsightsChartBase } from '../insights-chart-base';\n\n@Component({\n tag: 'insights-scatter-chart',\n styleUrl: 'insights-scatter-chart.css',\n shadow: true,\n})\nexport class InsightsScatterChart extends InsightsChartBase<ScatterDataItem[], ScatterSpec> {\n @Element() el: HTMLElement = null;\n\n componentWillLoad() {\n this.fetchChartData();\n }\n\n @Watch('reportName')\n @Watch('filters')\n handlePropsChange() {\n this.fetchChartData();\n }\n\n private renderChart() {\n if (!this.data || this.data.length === 0) {\n return <div class=\"no-data\">No data available</div>;\n }\n\n return (\n <div class=\"chart-container\">\n <apollo-data-scatter-chart\n ref={el => {\n if (el) {\n el.adData = this.data;\n el.adSpec = this.spec || {};\n }\n }}\n />\n </div>\n );\n }\n\n render() {\n return (\n <div class=\"insights-scatter-chart\">\n {this.loading && (\n <div class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading chart data...</p>\n </div>\n )}\n\n {this.error && (\n <div class=\"error-container\">\n <p class=\"error-message\">{this.error}</p>\n <button onClick={() => this.fetchChartData()}>Retry</button>\n </div>\n )}\n\n {!this.loading && !this.error && this.renderChart()}\n </div>\n );\n }\n}\n"]}
|
|
@@ -164,7 +164,7 @@ export class InsightsWrapper {
|
|
|
164
164
|
await this.initializeClient();
|
|
165
165
|
}
|
|
166
166
|
render() {
|
|
167
|
-
return (h("div", { key: '
|
|
167
|
+
return (h("div", { key: '4f6c11053c81a8c42f29b71f1af6e8f3d44ad4a7', class: "insights-wrapper" }, this.initialized && h("slot", { key: '8b69d1c77b9284380c2e455172953fc308e96aa8' }), !this.initialized && h("div", { key: '225e971e3c1b1a21c40b3b616248218c59dc3afd', class: "loading" }, "Initializing Insights...")));
|
|
168
168
|
}
|
|
169
169
|
static get is() { return "insights-wrapper"; }
|
|
170
170
|
static get encapsulation() { return "shadow"; }
|
|
@@ -23,9 +23,18 @@ function toCamelCase(str) {
|
|
|
23
23
|
function buildNormalizeMappingCode(mappings) {
|
|
24
24
|
return (mappings
|
|
25
25
|
?.filter(m => m.outputKey && m.sourceField)
|
|
26
|
-
.map(m =>
|
|
26
|
+
.map(m => {
|
|
27
|
+
if (m.sourceField === '__index__')
|
|
28
|
+
return ` ${m.outputKey}: i + 1`;
|
|
29
|
+
if (m.sourceField.startsWith('literal:'))
|
|
30
|
+
return ` ${m.outputKey}: ${JSON.stringify(m.sourceField.slice('literal:'.length))}`;
|
|
31
|
+
return ` ${m.outputKey}: row['${m.sourceField}']`;
|
|
32
|
+
})
|
|
27
33
|
.join(',\n') || '');
|
|
28
34
|
}
|
|
35
|
+
function normalizeMappingUsesIndex(mappings) {
|
|
36
|
+
return mappings?.some(m => m?.sourceField === '__index__') ?? false;
|
|
37
|
+
}
|
|
29
38
|
/**
|
|
30
39
|
* Build the getQueryByFilters function code with dynamic filter references
|
|
31
40
|
* Values like "filters_location_id" become filters.location_id
|
|
@@ -74,6 +83,8 @@ function buildGetQueryByFiltersCode(props, indent = ' ') {
|
|
|
74
83
|
}
|
|
75
84
|
export function generateReactCode(props) {
|
|
76
85
|
const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);
|
|
86
|
+
const useIndex = normalizeMappingUsesIndex(props.normalizeMapping);
|
|
87
|
+
const mapArg = useIndex ? '(row, i)' : 'row';
|
|
77
88
|
const apiUrl = props.apiUrl || 'http://localhost:3000/v1';
|
|
78
89
|
const filtersStr = JSON.stringify(props.filters || {}, null, 2).replace(/\n/g, '\n ');
|
|
79
90
|
const getQueryCode = buildGetQueryByFiltersCode(props, ' ');
|
|
@@ -88,7 +99,7 @@ function ${functionName}() {
|
|
|
88
99
|
${getQueryCode}
|
|
89
100
|
|
|
90
101
|
const normalizeRawResponse = (response) => {
|
|
91
|
-
return response.getData().map(
|
|
102
|
+
return response.getData().map(${mapArg} => ({
|
|
92
103
|
${normalizeCode}
|
|
93
104
|
}));
|
|
94
105
|
};
|
|
@@ -110,6 +121,8 @@ export default ${functionName};`;
|
|
|
110
121
|
}
|
|
111
122
|
export function generateVueCode(props) {
|
|
112
123
|
const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);
|
|
124
|
+
const useIndex = normalizeMappingUsesIndex(props.normalizeMapping);
|
|
125
|
+
const mapArg = useIndex ? '(row, i)' : 'row';
|
|
113
126
|
const apiUrl = props.apiUrl || 'http://localhost:3000/v1';
|
|
114
127
|
const getQueryCode = buildGetQueryByFiltersCode(props, ' ');
|
|
115
128
|
const componentName = props.componentName || 'insights-donut-chart';
|
|
@@ -138,7 +151,7 @@ const spec = ${JSON.stringify(props.spec)};
|
|
|
138
151
|
${getQueryCode}
|
|
139
152
|
|
|
140
153
|
const normalizeRawResponse = (response) => {
|
|
141
|
-
return response.getData().map(
|
|
154
|
+
return response.getData().map(${mapArg} => ({
|
|
142
155
|
${normalizeCode}
|
|
143
156
|
}));
|
|
144
157
|
};
|
|
@@ -146,6 +159,8 @@ ${normalizeCode}
|
|
|
146
159
|
}
|
|
147
160
|
export function generateWebComponentCode(props) {
|
|
148
161
|
const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);
|
|
162
|
+
const useIndex = normalizeMappingUsesIndex(props.normalizeMapping);
|
|
163
|
+
const mapArg = useIndex ? '(row, i)' : 'row';
|
|
149
164
|
const apiUrl = props.apiUrl || 'http://localhost:3000/v1';
|
|
150
165
|
const getQueryCode = buildGetQueryByFiltersCode(props, ' ');
|
|
151
166
|
const componentName = props.componentName || 'insights-donut-chart';
|
|
@@ -176,7 +191,7 @@ export function generateWebComponentCode(props) {
|
|
|
176
191
|
chart.getQueryByFilters = getQueryByFilters;
|
|
177
192
|
|
|
178
193
|
chart.normalizeRawResponse = (response) => {
|
|
179
|
-
return response.getData().map(
|
|
194
|
+
return response.getData().map(${mapArg} => ({
|
|
180
195
|
${normalizeCode
|
|
181
196
|
.split('\n')
|
|
182
197
|
.map(l => ' ' + l)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../src/utils/code-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACzD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,yBAAyB,CAAC,QAA2D;IAC5F,OAAO,CACL,QAAQ;QACN,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,WAAW,IAAI,CAAC;SACvD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,0BAA0B,CAAC,KAAmB,EAAE,SAAiB,IAAI;IAC5E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC;QAClC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAChC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,MAAM;iBACtB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBACd,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACtD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBACtC,OAAO,WAAW,GAAG,EAAE,CAAC;gBAC1B,CAAC;gBACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC,MAAM,IAAI,EAAE,iBAAiB,CAAC,CAAC,QAAQ,IAAI,QAAQ,eAAe,UAAU,MAAM,KAAK,EAAE,CAAC,CAAC;QACnI,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IACnD,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,0BAA0B,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE/D,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACpE,MAAM,cAAc,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjF,OAAO,6BAA6B,cAAc;;WAEzC,YAAY;oBACH,UAAU;;IAE1B,YAAY;;;;EAId,aAAa;;;;;+BAKgB,MAAM;SAC5B,cAAc;sBACD,KAAK,CAAC,UAAU;;gBAEtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;;;;;;;;iBAQzB,YAAY,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,0BAA0B,CAAC;IAC1D,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7D,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACpE,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAEjD,OAAO;;OAEF,YAAY;;;;;;;;;;;4BAWS,YAAY;;kBAEtB,MAAM;;sBAEF,KAAK,CAAC,UAAU;kBACpB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;eAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;;EAEvC,YAAY;;;;EAIZ,aAAa;;;UAGL,CAAC;AACX,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAmB;IAC1D,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,0BAA0B,CAAC;IAC1D,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEjE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACpE,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAEpE,OAAO;;;;;;;;;+BASsB,MAAM;OAC9B,aAAa;YACR,OAAO;qBACE,KAAK,CAAC,UAAU;SAC5B,aAAa;;;;6CAIuB,OAAO;;sBAE9B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;mBACxE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;;MAEvC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;;;;;EAKzC,aAAa;SACZ,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACpB,IAAI,CAAC,IAAI,CAAC;;;;;QAKL,CAAC;AACT,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAU,EAAE,YAAoB,cAAc;IAChF,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,iBAAiB,CAAC,KAAqB,CAAC,CAAC;QAClD,KAAK,KAAK;YACR,OAAO,eAAe,CAAC,KAAqB,CAAC,CAAC;QAChD,KAAK,cAAc,CAAC;QACpB;YACE,OAAO,wBAAwB,CAAC,KAAqB,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC","sourcesContent":["/**\n * Code generator for insights chart components\n * Generates framework-specific code examples based on current story args\n */\n\nexport interface CodeGenProps {\n reportName: string;\n filters: Record<string, any>;\n columns: string[];\n queryFilters: Array<{ member: string; operator: string; values: any[] }>;\n order: Record<string, 'asc' | 'desc'>;\n totals: Array<{ fn: string; member: string }>;\n limit: number;\n normalizeMapping: Array<{ outputKey: string; sourceField: string }>;\n spec: any;\n apiUrl?: string;\n componentName?: string; // e.g. 'insights-bar-chart', 'insights-donut-chart'\n}\n\n/**\n * Convert kebab-case to PascalCase\n * e.g. 'insights-bar-chart' -> 'InsightsBarChart'\n */\nfunction toPascalCase(str: string): string {\n return str\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\n/**\n * Convert kebab-case to camelCase\n * e.g. 'insights-bar-chart' -> 'insightsBarChart'\n */\nfunction toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction buildNormalizeMappingCode(mappings: Array<{ outputKey: string; sourceField: string }>): string {\n return (\n mappings\n ?.filter(m => m.outputKey && m.sourceField)\n .map(m => ` ${m.outputKey}: row['${m.sourceField}']`)\n .join(',\\n') || ''\n );\n}\n\n/**\n * Build the getQueryByFilters function code with dynamic filter references\n * Values like \"filters_location_id\" become filters.location_id\n */\nfunction buildGetQueryByFiltersCode(props: CodeGenProps, indent: string = ' '): string {\n const lines: string[] = [];\n lines.push(`const getQueryByFilters = (filters) => ({`);\n\n const safeColumns = Array.isArray(props.columns) ? props.columns : [];\n const safeQueryFilters = Array.isArray(props.queryFilters) ? props.queryFilters : [];\n const safeOrder = props.order && typeof props.order === 'object' ? props.order : {};\n const safeTotals = Array.isArray(props.totals) ? props.totals : [];\n\n if (safeColumns.length) {\n lines.push(`${indent}columns: ${JSON.stringify(safeColumns)},`);\n }\n\n if (safeQueryFilters.length) {\n lines.push(`${indent}filters: [`);\n safeQueryFilters.forEach((f, i) => {\n if (!f || typeof f !== 'object') return;\n const values = Array.isArray(f.values) ? f.values : [];\n const valuesCode = values\n .map((v: any) => {\n if (typeof v === 'string' && v.startsWith('filters_')) {\n const key = v.replace('filters_', '');\n return `filters.${key}`;\n }\n return JSON.stringify(v);\n })\n .join(', ');\n const comma = i < safeQueryFilters.length - 1 ? ',' : '';\n lines.push(`${indent} { member: '${f.member || ''}', operator: '${f.operator || 'equals'}', values: [${valuesCode}] }${comma}`);\n });\n lines.push(`${indent}],`);\n }\n\n if (Object.keys(safeOrder).length) {\n lines.push(`${indent}order: ${JSON.stringify(safeOrder)},`);\n }\n\n if (safeTotals.length) {\n lines.push(`${indent}totals: ${JSON.stringify(safeTotals.filter(t => t && t.member))},`);\n }\n\n if (props.limit) {\n lines.push(`${indent}limit: ${props.limit},`);\n }\n\n lines.push(`});`);\n return lines.join('\\n');\n}\n\nexport function generateReactCode(props: CodeGenProps): string {\n const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);\n const apiUrl = props.apiUrl || 'http://localhost:3000/v1';\n const filtersStr = JSON.stringify(props.filters || {}, null, 2).replace(/\\n/g, '\\n ');\n const getQueryCode = buildGetQueryByFiltersCode(props, ' ');\n\n const componentName = props.componentName || 'insights-donut-chart';\n const reactComponent = toPascalCase(componentName);\n const functionName = 'My' + toPascalCase(componentName.replace('insights-', ''));\n\n return `import { InsightsWrapper, ${reactComponent} } from '@xplortech/insights-elements-react';\n\nfunction ${functionName}() {\n const filters = ${filtersStr};\n\n ${getQueryCode}\n\n const normalizeRawResponse = (response) => {\n return response.getData().map(row => ({\n${normalizeCode}\n }));\n };\n\n return (\n <InsightsWrapper apiUrl=\"${apiUrl}\" token=\"YOUR_TOKEN\">\n <${reactComponent}\n reportName=\"${props.reportName}\"\n filters={filters}\n spec={${JSON.stringify(props.spec)}}\n getQueryByFilters={getQueryByFilters}\n normalizeRawResponse={normalizeRawResponse}\n />\n </InsightsWrapper>\n );\n}\n\nexport default ${functionName};`;\n}\n\nexport function generateVueCode(props: CodeGenProps): string {\n const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);\n const apiUrl = props.apiUrl || 'http://localhost:3000/v1';\n const getQueryCode = buildGetQueryByFiltersCode(props, ' ');\n\n const componentName = props.componentName || 'insights-donut-chart';\n const vueComponent = toPascalCase(componentName);\n\n return `<template>\n <InsightsWrapper :api-url=\"apiUrl\" :token=\"token\">\n <${vueComponent}\n :report-name=\"reportName\"\n :filters=\"filters\"\n :spec=\"spec\"\n :get-query-by-filters=\"getQueryByFilters\"\n :normalize-raw-response=\"normalizeRawResponse\"\n />\n </InsightsWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport { InsightsWrapper, ${vueComponent} } from '@xplortech/insights-elements-vue';\n\nconst apiUrl = '${apiUrl}';\nconst token = 'YOUR_TOKEN';\nconst reportName = '${props.reportName}';\nconst filters = ${JSON.stringify(props.filters || {}, null, 2)};\nconst spec = ${JSON.stringify(props.spec)};\n\n${getQueryCode}\n\nconst normalizeRawResponse = (response) => {\n return response.getData().map(row => ({\n${normalizeCode}\n }));\n};\n</script>`;\n}\n\nexport function generateWebComponentCode(props: CodeGenProps): string {\n const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);\n const apiUrl = props.apiUrl || 'http://localhost:3000/v1';\n const getQueryCode = buildGetQueryByFiltersCode(props, ' ');\n\n const componentName = props.componentName || 'insights-donut-chart';\n const chartId = toCamelCase(componentName.replace('insights-', ''));\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <script type=\"module\">\n import { defineCustomElements } from '@xplortech/insights-elements/loader';\n defineCustomElements();\n </script>\n</head>\n<body>\n <insights-wrapper api-url=\"${apiUrl}\" token=\"YOUR_TOKEN\">\n <${componentName} \n id=\"${chartId}\"\n report-name=\"${props.reportName}\"\n ></${componentName}>\n </insights-wrapper>\n\n <script>\n const chart = document.getElementById('${chartId}');\n \n chart.filters = ${JSON.stringify(props.filters || {}, null, 2).replace(/\\n/g, '\\n ')};\n chart.spec = ${JSON.stringify(props.spec)};\n \n ${getQueryCode.replace(/\\n/g, '\\n ')}\n chart.getQueryByFilters = getQueryByFilters;\n \n chart.normalizeRawResponse = (response) => {\n return response.getData().map(row => ({\n${normalizeCode\n .split('\\n')\n .map(l => ' ' + l)\n .join('\\n')}\n }));\n };\n </script>\n</body>\n</html>`;\n}\n\nexport function getCodeForFramework(props: any, framework: string = 'webcomponent'): string {\n switch (framework) {\n case 'react':\n return generateReactCode(props as CodeGenProps);\n case 'vue':\n return generateVueCode(props as CodeGenProps);\n case 'webcomponent':\n default:\n return generateWebComponentCode(props as CodeGenProps);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../src/utils/code-generator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Code generator for insights chart components\n * Generates framework-specific code examples based on current story args\n */\n\nexport interface CodeGenProps {\n reportName: string;\n filters: Record<string, any>;\n columns: string[];\n queryFilters: Array<{ member: string; operator: string; values: any[] }>;\n order: Record<string, 'asc' | 'desc'>;\n totals: Array<{ fn: string; member: string }>;\n limit: number;\n normalizeMapping: Array<{ outputKey: string; sourceField: string }>;\n spec: any;\n apiUrl?: string;\n componentName?: string; // e.g. 'insights-bar-chart', 'insights-donut-chart'\n}\n\n/**\n * Convert kebab-case to PascalCase\n * e.g. 'insights-bar-chart' -> 'InsightsBarChart'\n */\nfunction toPascalCase(str: string): string {\n return str\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\n/**\n * Convert kebab-case to camelCase\n * e.g. 'insights-bar-chart' -> 'insightsBarChart'\n */\nfunction toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction buildNormalizeMappingCode(mappings: Array<{ outputKey: string; sourceField: string }>): string {\n return (\n mappings\n ?.filter(m => m.outputKey && m.sourceField)\n .map(m => {\n if (m.sourceField === '__index__') return ` ${m.outputKey}: i + 1`;\n if (m.sourceField.startsWith('literal:')) return ` ${m.outputKey}: ${JSON.stringify(m.sourceField.slice('literal:'.length))}`;\n return ` ${m.outputKey}: row['${m.sourceField}']`;\n })\n .join(',\\n') || ''\n );\n}\n\nfunction normalizeMappingUsesIndex(mappings: Array<{ outputKey: string; sourceField: string }> | undefined): boolean {\n return mappings?.some(m => m?.sourceField === '__index__') ?? false;\n}\n\n/**\n * Build the getQueryByFilters function code with dynamic filter references\n * Values like \"filters_location_id\" become filters.location_id\n */\nfunction buildGetQueryByFiltersCode(props: CodeGenProps, indent: string = ' '): string {\n const lines: string[] = [];\n lines.push(`const getQueryByFilters = (filters) => ({`);\n\n const safeColumns = Array.isArray(props.columns) ? props.columns : [];\n const safeQueryFilters = Array.isArray(props.queryFilters) ? props.queryFilters : [];\n const safeOrder = props.order && typeof props.order === 'object' ? props.order : {};\n const safeTotals = Array.isArray(props.totals) ? props.totals : [];\n\n if (safeColumns.length) {\n lines.push(`${indent}columns: ${JSON.stringify(safeColumns)},`);\n }\n\n if (safeQueryFilters.length) {\n lines.push(`${indent}filters: [`);\n safeQueryFilters.forEach((f, i) => {\n if (!f || typeof f !== 'object') return;\n const values = Array.isArray(f.values) ? f.values : [];\n const valuesCode = values\n .map((v: any) => {\n if (typeof v === 'string' && v.startsWith('filters_')) {\n const key = v.replace('filters_', '');\n return `filters.${key}`;\n }\n return JSON.stringify(v);\n })\n .join(', ');\n const comma = i < safeQueryFilters.length - 1 ? ',' : '';\n lines.push(`${indent} { member: '${f.member || ''}', operator: '${f.operator || 'equals'}', values: [${valuesCode}] }${comma}`);\n });\n lines.push(`${indent}],`);\n }\n\n if (Object.keys(safeOrder).length) {\n lines.push(`${indent}order: ${JSON.stringify(safeOrder)},`);\n }\n\n if (safeTotals.length) {\n lines.push(`${indent}totals: ${JSON.stringify(safeTotals.filter(t => t && t.member))},`);\n }\n\n if (props.limit) {\n lines.push(`${indent}limit: ${props.limit},`);\n }\n\n lines.push(`});`);\n return lines.join('\\n');\n}\n\nexport function generateReactCode(props: CodeGenProps): string {\n const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);\n const useIndex = normalizeMappingUsesIndex(props.normalizeMapping);\n const mapArg = useIndex ? '(row, i)' : 'row';\n const apiUrl = props.apiUrl || 'http://localhost:3000/v1';\n const filtersStr = JSON.stringify(props.filters || {}, null, 2).replace(/\\n/g, '\\n ');\n const getQueryCode = buildGetQueryByFiltersCode(props, ' ');\n\n const componentName = props.componentName || 'insights-donut-chart';\n const reactComponent = toPascalCase(componentName);\n const functionName = 'My' + toPascalCase(componentName.replace('insights-', ''));\n\n return `import { InsightsWrapper, ${reactComponent} } from '@xplortech/insights-elements-react';\n\nfunction ${functionName}() {\n const filters = ${filtersStr};\n\n ${getQueryCode}\n\n const normalizeRawResponse = (response) => {\n return response.getData().map(${mapArg} => ({\n${normalizeCode}\n }));\n };\n\n return (\n <InsightsWrapper apiUrl=\"${apiUrl}\" token=\"YOUR_TOKEN\">\n <${reactComponent}\n reportName=\"${props.reportName}\"\n filters={filters}\n spec={${JSON.stringify(props.spec)}}\n getQueryByFilters={getQueryByFilters}\n normalizeRawResponse={normalizeRawResponse}\n />\n </InsightsWrapper>\n );\n}\n\nexport default ${functionName};`;\n}\n\nexport function generateVueCode(props: CodeGenProps): string {\n const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);\n const useIndex = normalizeMappingUsesIndex(props.normalizeMapping);\n const mapArg = useIndex ? '(row, i)' : 'row';\n const apiUrl = props.apiUrl || 'http://localhost:3000/v1';\n const getQueryCode = buildGetQueryByFiltersCode(props, ' ');\n\n const componentName = props.componentName || 'insights-donut-chart';\n const vueComponent = toPascalCase(componentName);\n\n return `<template>\n <InsightsWrapper :api-url=\"apiUrl\" :token=\"token\">\n <${vueComponent}\n :report-name=\"reportName\"\n :filters=\"filters\"\n :spec=\"spec\"\n :get-query-by-filters=\"getQueryByFilters\"\n :normalize-raw-response=\"normalizeRawResponse\"\n />\n </InsightsWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport { InsightsWrapper, ${vueComponent} } from '@xplortech/insights-elements-vue';\n\nconst apiUrl = '${apiUrl}';\nconst token = 'YOUR_TOKEN';\nconst reportName = '${props.reportName}';\nconst filters = ${JSON.stringify(props.filters || {}, null, 2)};\nconst spec = ${JSON.stringify(props.spec)};\n\n${getQueryCode}\n\nconst normalizeRawResponse = (response) => {\n return response.getData().map(${mapArg} => ({\n${normalizeCode}\n }));\n};\n</script>`;\n}\n\nexport function generateWebComponentCode(props: CodeGenProps): string {\n const normalizeCode = buildNormalizeMappingCode(props.normalizeMapping);\n const useIndex = normalizeMappingUsesIndex(props.normalizeMapping);\n const mapArg = useIndex ? '(row, i)' : 'row';\n const apiUrl = props.apiUrl || 'http://localhost:3000/v1';\n const getQueryCode = buildGetQueryByFiltersCode(props, ' ');\n\n const componentName = props.componentName || 'insights-donut-chart';\n const chartId = toCamelCase(componentName.replace('insights-', ''));\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <script type=\"module\">\n import { defineCustomElements } from '@xplortech/insights-elements/loader';\n defineCustomElements();\n </script>\n</head>\n<body>\n <insights-wrapper api-url=\"${apiUrl}\" token=\"YOUR_TOKEN\">\n <${componentName} \n id=\"${chartId}\"\n report-name=\"${props.reportName}\"\n ></${componentName}>\n </insights-wrapper>\n\n <script>\n const chart = document.getElementById('${chartId}');\n \n chart.filters = ${JSON.stringify(props.filters || {}, null, 2).replace(/\\n/g, '\\n ')};\n chart.spec = ${JSON.stringify(props.spec)};\n \n ${getQueryCode.replace(/\\n/g, '\\n ')}\n chart.getQueryByFilters = getQueryByFilters;\n \n chart.normalizeRawResponse = (response) => {\n return response.getData().map(${mapArg} => ({\n${normalizeCode\n .split('\\n')\n .map(l => ' ' + l)\n .join('\\n')}\n }));\n };\n </script>\n</body>\n</html>`;\n}\n\nexport function getCodeForFramework(props: any, framework: string = 'webcomponent'): string {\n switch (framework) {\n case 'react':\n return generateReactCode(props as CodeGenProps);\n case 'vue':\n return generateVueCode(props as CodeGenProps);\n case 'webcomponent':\n default:\n return generateWebComponentCode(props as CodeGenProps);\n }\n}\n"]}
|
package/dist/components/index.js
CHANGED
|
@@ -28,7 +28,7 @@ var appGlobalScript = async () => {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
// Fallback: Import from npm package (for bundlers that handle this)
|
|
31
|
-
await import('./p-
|
|
31
|
+
await import('./p-D8NW3xSO.js');
|
|
32
32
|
console.log('✓ apollo-data loaded from npm package');
|
|
33
33
|
}
|
|
34
34
|
catch (error) {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Components, JSX } from "../types/components";
|
|
2
|
+
|
|
3
|
+
interface InsightsLineChart extends Components.InsightsLineChart, HTMLElement {}
|
|
4
|
+
export const InsightsLineChart: {
|
|
5
|
+
prototype: InsightsLineChart;
|
|
6
|
+
new (): InsightsLineChart;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Used to define this component and all nested components recursively.
|
|
10
|
+
*/
|
|
11
|
+
export const defineCustomElement: () => void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { p as proxyCustomElement, h } from './p-DFvs3VMW.js';
|
|
2
|
+
import { I as InsightsChartBase } from './p-Dv82-c17.js';
|
|
3
|
+
|
|
4
|
+
const insightsLineChartCss = ":host{display:block}.insights-line-chart{width:100%;height:100%;min-height:300px;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px}.spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.loading-container p{margin-top:16px;color:#666}.error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px;padding:20px}.error-message{color:#e74c3c;margin-bottom:16px;text-align:center}.error-container button{padding:8px 16px;background-color:#3498db;color:white;border:none;border-radius:4px;cursor:pointer;font-size:14px}.error-container button:hover{background-color:#2980b9}.chart-container{width:100%;height:100%;padding:20px}.no-data{display:flex;align-items:center;justify-content:center;height:100%;min-height:300px;color:#999}";
|
|
5
|
+
|
|
6
|
+
const InsightsLineChart$1 = /*@__PURE__*/ proxyCustomElement(class InsightsLineChart extends InsightsChartBase {
|
|
7
|
+
constructor(registerHost) {
|
|
8
|
+
super(false);
|
|
9
|
+
if (registerHost !== false) {
|
|
10
|
+
this.__registerHost();
|
|
11
|
+
}
|
|
12
|
+
this.__attachShadow();
|
|
13
|
+
}
|
|
14
|
+
get el() { return this; }
|
|
15
|
+
componentWillLoad() {
|
|
16
|
+
this.fetchChartData();
|
|
17
|
+
}
|
|
18
|
+
handlePropsChange() {
|
|
19
|
+
this.fetchChartData();
|
|
20
|
+
}
|
|
21
|
+
renderChart() {
|
|
22
|
+
if (!this.data || this.data.length === 0) {
|
|
23
|
+
return h("div", { class: "no-data" }, "No data available");
|
|
24
|
+
}
|
|
25
|
+
return (h("div", { class: "chart-container" }, h("apollo-data-line-chart", { ref: el => {
|
|
26
|
+
if (el) {
|
|
27
|
+
el.adData = this.data;
|
|
28
|
+
el.adSpec = this.spec || {};
|
|
29
|
+
}
|
|
30
|
+
} })));
|
|
31
|
+
}
|
|
32
|
+
render() {
|
|
33
|
+
return (h("div", { key: '6a93d01a4dc0d8915d60947c74f74394e2d07b16', class: "insights-line-chart" }, this.loading && (h("div", { key: 'b83bdd09b3a18b81fc474975736257e6f0f4267c', class: "loading-container" }, h("div", { key: '1a322c2d878bd8bcd09fcaa5717ccde5626ebf11', class: "spinner" }), h("p", { key: 'feaacab99224916b514f9a2a05d9a0555f997466' }, "Loading chart data..."))), this.error && (h("div", { key: '2b316b99fa88bf5117c85796de840f0adb682a27', class: "error-container" }, h("p", { key: 'c5f0a0d964f8c523804a50fe1f94b17c706ab7db', class: "error-message" }, this.error), h("button", { key: 'efc40ed7a3e72167ff1d9a75ba93adcfb673b7d6', onClick: () => this.fetchChartData() }, "Retry"))), !this.loading && !this.error && this.renderChart()));
|
|
34
|
+
}
|
|
35
|
+
static get watchers() { return {
|
|
36
|
+
"reportName": ["handlePropsChange"],
|
|
37
|
+
"filters": ["handlePropsChange"]
|
|
38
|
+
}; }
|
|
39
|
+
static get style() { return insightsLineChartCss; }
|
|
40
|
+
}, [769, "insights-line-chart", {
|
|
41
|
+
"reportName": [1, "report-name"],
|
|
42
|
+
"filters": [16],
|
|
43
|
+
"getQueryByFilters": [16],
|
|
44
|
+
"normalizeRawResponse": [16],
|
|
45
|
+
"spec": [16],
|
|
46
|
+
"loading": [32],
|
|
47
|
+
"data": [32],
|
|
48
|
+
"error": [32]
|
|
49
|
+
}, undefined, {
|
|
50
|
+
"reportName": ["handlePropsChange"],
|
|
51
|
+
"filters": ["handlePropsChange"]
|
|
52
|
+
}]);
|
|
53
|
+
function defineCustomElement$1() {
|
|
54
|
+
if (typeof customElements === "undefined") {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const components = ["insights-line-chart"];
|
|
58
|
+
components.forEach(tagName => { switch (tagName) {
|
|
59
|
+
case "insights-line-chart":
|
|
60
|
+
if (!customElements.get(tagName)) {
|
|
61
|
+
customElements.define(tagName, InsightsLineChart$1);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
} });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const InsightsLineChart = InsightsLineChart$1;
|
|
68
|
+
const defineCustomElement = defineCustomElement$1;
|
|
69
|
+
|
|
70
|
+
export { InsightsLineChart, defineCustomElement };
|
|
71
|
+
//# sourceMappingURL=insights-line-chart.js.map
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=insights-line-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"insights-line-chart.js","mappings":";;;AAAA,MAAM,oBAAoB,GAAG,ypCAAypC;;MCSzqCA,mBAAkB,iBAAAC,kBAAA,CAAA,MAAA,iBAAA,SAAQ,iBAA2C,CAAA;;;;;;;;;IAGhF,iBAAiB,GAAA;QACf,IAAI,CAAC,cAAc,EAAE;;IAKvB,iBAAiB,GAAA;QACf,IAAI,CAAC,cAAc,EAAE;;IAGf,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,YAAA,OAAO,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,SAAS,wBAAwB;;QAGrD,QACE,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,iBAAiB,EAAA,EAC1B,CAAA,CAAA,wBAAA,EAAA,EACE,GAAG,EAAE,EAAE,IAAG;gBACR,IAAI,EAAE,EAAE;AACN,oBAAA,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI;oBACrB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;;AAE/B,aAAC,EAAA,CACD,CACE;;IAIV,MAAM,GAAA;AACJ,QAAA,QACE,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,qBAAqB,EAAA,EAC7B,IAAI,CAAC,OAAO,KACX,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,mBAAmB,EAAA,EAC5B,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,SAAS,EAAO,CAAA,EAC3B,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EAAA,uBAAA,CAA4B,CACxB,CACP,EAEA,IAAI,CAAC,KAAK,KACT,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,iBAAiB,EAAA,EAC1B,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAG,KAAK,EAAC,eAAe,IAAE,IAAI,CAAC,KAAK,CAAK,EACzC,CAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,OAAO,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,EAAgB,EAAA,OAAA,CAAA,CACxD,CACP,EAEA,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["InsightsLineChart","__stencil_proxyCustomElement"],"sources":["src/components/insights-line-chart/insights-line-chart.css?tag=insights-line-chart&encapsulation=shadow","src/components/insights-line-chart/insights-line-chart.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.insights-line-chart {\n width: 100%;\n height: 100%;\n min-height: 300px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n}\n\n.spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.loading-container p {\n margin-top: 16px;\n color: #666;\n}\n\n.error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n padding: 20px;\n}\n\n.error-message {\n color: #e74c3c;\n margin-bottom: 16px;\n text-align: center;\n}\n\n.error-container button {\n padding: 8px 16px;\n background-color: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.error-container button:hover {\n background-color: #2980b9;\n}\n\n.chart-container {\n width: 100%;\n height: 100%;\n padding: 20px;\n}\n\n.no-data {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n color: #999;\n}\n","import { Component, h, Watch, Element } from '@stencil/core';\nimport type { LineDataItem, LineSpec } from '@xplortech/apollo-data/dist/types/components.d.ts';\nimport { InsightsChartBase } from '../insights-chart-base';\n\n@Component({\n tag: 'insights-line-chart',\n styleUrl: 'insights-line-chart.css',\n shadow: true,\n})\nexport class InsightsLineChart extends InsightsChartBase<LineDataItem[], LineSpec> {\n @Element() el: HTMLElement = null;\n\n componentWillLoad() {\n this.fetchChartData();\n }\n\n @Watch('reportName')\n @Watch('filters')\n handlePropsChange() {\n this.fetchChartData();\n }\n\n private renderChart() {\n if (!this.data || this.data.length === 0) {\n return <div class=\"no-data\">No data available</div>;\n }\n\n return (\n <div class=\"chart-container\">\n <apollo-data-line-chart\n ref={el => {\n if (el) {\n el.adData = this.data;\n el.adSpec = this.spec || {};\n }\n }}\n />\n </div>\n );\n }\n\n render() {\n return (\n <div class=\"insights-line-chart\">\n {this.loading && (\n <div class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading chart data...</p>\n </div>\n )}\n\n {this.error && (\n <div class=\"error-container\">\n <p class=\"error-message\">{this.error}</p>\n <button onClick={() => this.fetchChartData()}>Retry</button>\n </div>\n )}\n\n {!this.loading && !this.error && this.renderChart()}\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Components, JSX } from "../types/components";
|
|
2
|
+
|
|
3
|
+
interface InsightsScatterChart extends Components.InsightsScatterChart, HTMLElement {}
|
|
4
|
+
export const InsightsScatterChart: {
|
|
5
|
+
prototype: InsightsScatterChart;
|
|
6
|
+
new (): InsightsScatterChart;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Used to define this component and all nested components recursively.
|
|
10
|
+
*/
|
|
11
|
+
export const defineCustomElement: () => void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { p as proxyCustomElement, h } from './p-DFvs3VMW.js';
|
|
2
|
+
import { I as InsightsChartBase } from './p-Dv82-c17.js';
|
|
3
|
+
|
|
4
|
+
const insightsScatterChartCss = ":host{display:block}.insights-scatter-chart{width:100%;height:100%;min-height:300px;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px}.spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.loading-container p{margin-top:16px;color:#666}.error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px;padding:20px}.error-message{color:#e74c3c;margin-bottom:16px;text-align:center}.error-container button{padding:8px 16px;background-color:#3498db;color:white;border:none;border-radius:4px;cursor:pointer;font-size:14px}.error-container button:hover{background-color:#2980b9}.chart-container{width:100%;height:100%;padding:20px}.no-data{display:flex;align-items:center;justify-content:center;height:100%;min-height:300px;color:#999}";
|
|
5
|
+
|
|
6
|
+
const InsightsScatterChart$1 = /*@__PURE__*/ proxyCustomElement(class InsightsScatterChart extends InsightsChartBase {
|
|
7
|
+
constructor(registerHost) {
|
|
8
|
+
super(false);
|
|
9
|
+
if (registerHost !== false) {
|
|
10
|
+
this.__registerHost();
|
|
11
|
+
}
|
|
12
|
+
this.__attachShadow();
|
|
13
|
+
}
|
|
14
|
+
get el() { return this; }
|
|
15
|
+
componentWillLoad() {
|
|
16
|
+
this.fetchChartData();
|
|
17
|
+
}
|
|
18
|
+
handlePropsChange() {
|
|
19
|
+
this.fetchChartData();
|
|
20
|
+
}
|
|
21
|
+
renderChart() {
|
|
22
|
+
if (!this.data || this.data.length === 0) {
|
|
23
|
+
return h("div", { class: "no-data" }, "No data available");
|
|
24
|
+
}
|
|
25
|
+
return (h("div", { class: "chart-container" }, h("apollo-data-scatter-chart", { ref: el => {
|
|
26
|
+
if (el) {
|
|
27
|
+
el.adData = this.data;
|
|
28
|
+
el.adSpec = this.spec || {};
|
|
29
|
+
}
|
|
30
|
+
} })));
|
|
31
|
+
}
|
|
32
|
+
render() {
|
|
33
|
+
return (h("div", { key: '61e22e1dc0e3e72587b2d002ed88fdd689204989', class: "insights-scatter-chart" }, this.loading && (h("div", { key: '4cbf8b9c9420f30fca0cd1f636572c096b94da42', class: "loading-container" }, h("div", { key: '58f5c0707fec9ca808da73f019b1e3d0ee03f471', class: "spinner" }), h("p", { key: '8db6aa307e3d18b6fef544b0723856a9b350d8b4' }, "Loading chart data..."))), this.error && (h("div", { key: '41fff6d64f7c2ccd468d57e712a2137d38d8e562', class: "error-container" }, h("p", { key: '8061de8655b178c04a8ba0c7ae70a59ada74d6ab', class: "error-message" }, this.error), h("button", { key: '23f8e2b5759b999ab22e511e861a7a82f06d05e2', onClick: () => this.fetchChartData() }, "Retry"))), !this.loading && !this.error && this.renderChart()));
|
|
34
|
+
}
|
|
35
|
+
static get watchers() { return {
|
|
36
|
+
"reportName": ["handlePropsChange"],
|
|
37
|
+
"filters": ["handlePropsChange"]
|
|
38
|
+
}; }
|
|
39
|
+
static get style() { return insightsScatterChartCss; }
|
|
40
|
+
}, [769, "insights-scatter-chart", {
|
|
41
|
+
"reportName": [1, "report-name"],
|
|
42
|
+
"filters": [16],
|
|
43
|
+
"getQueryByFilters": [16],
|
|
44
|
+
"normalizeRawResponse": [16],
|
|
45
|
+
"spec": [16],
|
|
46
|
+
"loading": [32],
|
|
47
|
+
"data": [32],
|
|
48
|
+
"error": [32]
|
|
49
|
+
}, undefined, {
|
|
50
|
+
"reportName": ["handlePropsChange"],
|
|
51
|
+
"filters": ["handlePropsChange"]
|
|
52
|
+
}]);
|
|
53
|
+
function defineCustomElement$1() {
|
|
54
|
+
if (typeof customElements === "undefined") {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const components = ["insights-scatter-chart"];
|
|
58
|
+
components.forEach(tagName => { switch (tagName) {
|
|
59
|
+
case "insights-scatter-chart":
|
|
60
|
+
if (!customElements.get(tagName)) {
|
|
61
|
+
customElements.define(tagName, InsightsScatterChart$1);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
} });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const InsightsScatterChart = InsightsScatterChart$1;
|
|
68
|
+
const defineCustomElement = defineCustomElement$1;
|
|
69
|
+
|
|
70
|
+
export { InsightsScatterChart, defineCustomElement };
|
|
71
|
+
//# sourceMappingURL=insights-scatter-chart.js.map
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=insights-scatter-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"insights-scatter-chart.js","mappings":";;;AAAA,MAAM,uBAAuB,GAAG,4pCAA4pC;;MCS/qCA,sBAAqB,iBAAAC,kBAAA,CAAA,MAAA,oBAAA,SAAQ,iBAAiD,CAAA;;;;;;;;;IAGzF,iBAAiB,GAAA;QACf,IAAI,CAAC,cAAc,EAAE;;IAKvB,iBAAiB,GAAA;QACf,IAAI,CAAC,cAAc,EAAE;;IAGf,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,YAAA,OAAO,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,SAAS,wBAAwB;;QAGrD,QACE,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,iBAAiB,EAAA,EAC1B,CAAA,CAAA,2BAAA,EAAA,EACE,GAAG,EAAE,EAAE,IAAG;gBACR,IAAI,EAAE,EAAE;AACN,oBAAA,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI;oBACrB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;;AAE/B,aAAC,EAAA,CACD,CACE;;IAIV,MAAM,GAAA;AACJ,QAAA,QACE,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,wBAAwB,EAAA,EAChC,IAAI,CAAC,OAAO,KACX,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,mBAAmB,EAAA,EAC5B,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,SAAS,EAAO,CAAA,EAC3B,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EAAA,uBAAA,CAA4B,CACxB,CACP,EAEA,IAAI,CAAC,KAAK,KACT,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,iBAAiB,EAAA,EAC1B,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAG,KAAK,EAAC,eAAe,IAAE,IAAI,CAAC,KAAK,CAAK,EACzC,CAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,OAAO,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,EAAgB,EAAA,OAAA,CAAA,CACxD,CACP,EAEA,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["InsightsScatterChart","__stencil_proxyCustomElement"],"sources":["src/components/insights-scatter-chart/insights-scatter-chart.css?tag=insights-scatter-chart&encapsulation=shadow","src/components/insights-scatter-chart/insights-scatter-chart.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.insights-scatter-chart {\n width: 100%;\n height: 100%;\n min-height: 300px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n}\n\n.spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.loading-container p {\n margin-top: 16px;\n color: #666;\n}\n\n.error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n padding: 20px;\n}\n\n.error-message {\n color: #e74c3c;\n margin-bottom: 16px;\n text-align: center;\n}\n\n.error-container button {\n padding: 8px 16px;\n background-color: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.error-container button:hover {\n background-color: #2980b9;\n}\n\n.chart-container {\n width: 100%;\n height: 100%;\n padding: 20px;\n}\n\n.no-data {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n color: #999;\n}\n","import { Component, h, Watch, Element } from '@stencil/core';\nimport type { ScatterDataItem, ScatterSpec } from '@xplortech/apollo-data/dist/types/components.d.ts';\nimport { InsightsChartBase } from '../insights-chart-base';\n\n@Component({\n tag: 'insights-scatter-chart',\n styleUrl: 'insights-scatter-chart.css',\n shadow: true,\n})\nexport class InsightsScatterChart extends InsightsChartBase<ScatterDataItem[], ScatterSpec> {\n @Element() el: HTMLElement = null;\n\n componentWillLoad() {\n this.fetchChartData();\n }\n\n @Watch('reportName')\n @Watch('filters')\n handlePropsChange() {\n this.fetchChartData();\n }\n\n private renderChart() {\n if (!this.data || this.data.length === 0) {\n return <div class=\"no-data\">No data available</div>;\n }\n\n return (\n <div class=\"chart-container\">\n <apollo-data-scatter-chart\n ref={el => {\n if (el) {\n el.adData = this.data;\n el.adSpec = this.spec || {};\n }\n }}\n />\n </div>\n );\n }\n\n render() {\n return (\n <div class=\"insights-scatter-chart\">\n {this.loading && (\n <div class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading chart data...</p>\n </div>\n )}\n\n {this.error && (\n <div class=\"error-container\">\n <p class=\"error-message\">{this.error}</p>\n <button onClick={() => this.fetchChartData()}>Retry</button>\n </div>\n )}\n\n {!this.loading && !this.error && this.renderChart()}\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -1073,7 +1073,7 @@ const InsightsWrapper$1 = /*@__PURE__*/ proxyCustomElement(class InsightsWrapper
|
|
|
1073
1073
|
await this.initializeClient();
|
|
1074
1074
|
}
|
|
1075
1075
|
render() {
|
|
1076
|
-
return (h$1("div", { key: '
|
|
1076
|
+
return (h$1("div", { key: '4f6c11053c81a8c42f29b71f1af6e8f3d44ad4a7', class: "insights-wrapper" }, this.initialized && h$1("slot", { key: '8b69d1c77b9284380c2e455172953fc308e96aa8' }), !this.initialized && h$1("div", { key: '225e971e3c1b1a21c40b3b616248218c59dc3afd', class: "loading" }, "Initializing Insights...")));
|
|
1077
1077
|
}
|
|
1078
1078
|
static get watchers() { return {
|
|
1079
1079
|
"configName": ["handlePropsChange"],
|
|
@@ -3,7 +3,7 @@ var t,n=t=>{if(t.__stencil__getHostRef)return t.__stencil__getHostRef()},l=(t,e)
|
|
|
3
3
|
|
|
4
4
|
const o=()=>{};
|
|
5
5
|
|
|
6
|
-
(()=>{const t=import.meta.url,
|
|
7
|
-
//# sourceMappingURL=p-
|
|
6
|
+
(()=>{const t=import.meta.url,d={};return ""!==t&&(d.resourcesUrl=new URL(".",t).href),c(d)})().then((async a=>(await o(),X([["p-e518baac",[[513,"apollo-data-line-chart",{adData:[1,"ad-data"],adSpec:[1,"ad-spec"]}],[513,"apollo-data-scatter-chart",{adData:[1,"ad-data"],adSpec:[1,"ad-spec"]}]]],["p-4ac3c97c",[[513,"apollo-data-bar-chart",{adData:[1,"ad-data"],adSpec:[1,"ad-spec"]}]]],["p-b7471c12",[[513,"apollo-data-donut-chart",{adData:[1,"ad-data"],adSpec:[1,"ad-spec"]}]]]],a))));
|
|
7
|
+
//# sourceMappingURL=p-D8NW3xSO.js.map
|
|
8
8
|
|
|
9
|
-
//# sourceMappingURL=p-
|
|
9
|
+
//# sourceMappingURL=p-D8NW3xSO.js.map
|