@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.
Files changed (65) hide show
  1. package/README.md +23 -2
  2. package/dist/cjs/{apollo-data.esm-by4pfDU4.js → apollo-data.esm-DAW-9Wo3.js} +3 -3
  3. package/dist/cjs/apollo-data.esm-DAW-9Wo3.js.map +1 -0
  4. package/dist/cjs/{app-globals-D-MP41KM.js → app-globals-CS8MKc1U.js} +5 -5
  5. package/dist/cjs/{app-globals-D-MP41KM.js.map → app-globals-CS8MKc1U.js.map} +1 -1
  6. package/dist/cjs/index-DtrFwwSq.js +8 -0
  7. package/dist/cjs/insights-elements.cjs.js +2 -2
  8. package/dist/cjs/insights-line-chart.cjs.entry.js +42 -0
  9. package/dist/cjs/insights-line-chart.entry.cjs.js.map +1 -0
  10. package/dist/cjs/insights-scatter-chart.cjs.entry.js +42 -0
  11. package/dist/cjs/insights-scatter-chart.entry.cjs.js.map +1 -0
  12. package/dist/cjs/insights-wrapper.cjs.entry.js +1 -1
  13. package/dist/cjs/loader.cjs.js +2 -2
  14. package/dist/collection/collection-manifest.json +2 -0
  15. package/dist/collection/components/insights-line-chart/insights-line-chart.css +87 -0
  16. package/dist/collection/components/insights-line-chart/insights-line-chart.js +51 -0
  17. package/dist/collection/components/insights-line-chart/insights-line-chart.js.map +1 -0
  18. package/dist/collection/components/insights-scatter-chart/insights-scatter-chart.css +87 -0
  19. package/dist/collection/components/insights-scatter-chart/insights-scatter-chart.js +51 -0
  20. package/dist/collection/components/insights-scatter-chart/insights-scatter-chart.js.map +1 -0
  21. package/dist/collection/components/insights-wrapper/insights-wrapper.js +1 -1
  22. package/dist/collection/utils/code-generator.js +19 -4
  23. package/dist/collection/utils/code-generator.js.map +1 -1
  24. package/dist/components/index.js +1 -1
  25. package/dist/components/insights-line-chart.d.ts +11 -0
  26. package/dist/components/insights-line-chart.js +73 -0
  27. package/dist/components/insights-line-chart.js.map +1 -0
  28. package/dist/components/insights-scatter-chart.d.ts +11 -0
  29. package/dist/components/insights-scatter-chart.js +73 -0
  30. package/dist/components/insights-scatter-chart.js.map +1 -0
  31. package/dist/components/insights-wrapper.js +1 -1
  32. package/dist/components/{p-DHA6uI9u.js → p-D8NW3xSO.js} +3 -3
  33. package/dist/components/{p-DHA6uI9u.js.map → p-D8NW3xSO.js.map} +1 -1
  34. package/dist/esm/{apollo-data.esm-DHA6uI9u.js → apollo-data.esm-D8NW3xSO.js} +3 -3
  35. package/dist/esm/apollo-data.esm-D8NW3xSO.js.map +1 -0
  36. package/dist/esm/{app-globals-BtE_P06_.js → app-globals-DL_eG2uK.js} +3 -3
  37. package/dist/esm/{app-globals-BtE_P06_.js.map → app-globals-DL_eG2uK.js.map} +1 -1
  38. package/dist/esm/index-BAqvP5--.js +8 -0
  39. package/dist/esm/insights-elements.js +2 -2
  40. package/dist/esm/insights-line-chart.entry.js +40 -0
  41. package/dist/esm/insights-line-chart.entry.js.map +1 -0
  42. package/dist/esm/insights-scatter-chart.entry.js +40 -0
  43. package/dist/esm/insights-scatter-chart.entry.js.map +1 -0
  44. package/dist/esm/insights-wrapper.entry.js +1 -1
  45. package/dist/esm/loader.js +2 -2
  46. package/dist/insights-elements/insights-elements.esm.js +1 -1
  47. package/dist/insights-elements/insights-line-chart.entry.esm.js.map +1 -0
  48. package/dist/insights-elements/insights-scatter-chart.entry.esm.js.map +1 -0
  49. package/dist/insights-elements/{p-DE0h_D1B.js → p-4JSq-Alu.js} +2 -2
  50. package/dist/insights-elements/{p-DE0h_D1B.js.map → p-4JSq-Alu.js.map} +1 -1
  51. package/dist/insights-elements/p-76038403.entry.js +2 -0
  52. package/dist/insights-elements/p-76038403.entry.js.map +1 -0
  53. package/dist/insights-elements/{p-DHA6uI9u.js → p-D8NW3xSO.js} +3 -3
  54. package/dist/insights-elements/p-D8NW3xSO.js.map +1 -0
  55. package/dist/insights-elements/{p-29ce0a90.entry.js → p-a8196ab4.entry.js} +2 -2
  56. package/dist/insights-elements/p-cf44d793.entry.js +2 -0
  57. package/dist/insights-elements/p-cf44d793.entry.js.map +1 -0
  58. package/dist/types/components/insights-line-chart/insights-line-chart.d.ts +9 -0
  59. package/dist/types/components/insights-scatter-chart/insights-scatter-chart.d.ts +9 -0
  60. package/dist/types/components.d.ts +106 -0
  61. package/package.json +3 -2
  62. package/dist/cjs/apollo-data.esm-by4pfDU4.js.map +0 -1
  63. package/dist/esm/apollo-data.esm-DHA6uI9u.js.map +0 -1
  64. package/dist/insights-elements/p-DHA6uI9u.js.map +0 -1
  65. /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: '8a00c399458b7dff7dff0ac7e50a6217d7c2ad3d', class: "insights-wrapper" }, this.initialized && h("slot", { key: '85f26cab746e109f97ef29288b57377c449b7429' }), !this.initialized && h("div", { key: 'a59a48e70a8ff0258d5112aafeca6bc5a4a620ac', class: "loading" }, "Initializing Insights...")));
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 => ` ${m.outputKey}: row['${m.sourceField}']`)
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(row => ({
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(row => ({
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(row => ({
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":"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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 => ` ${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"]}
@@ -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-DHA6uI9u.js');
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: '8a00c399458b7dff7dff0ac7e50a6217d7c2ad3d', class: "insights-wrapper" }, this.initialized && h$1("slot", { key: '85f26cab746e109f97ef29288b57377c449b7429' }), !this.initialized && h$1("div", { key: 'a59a48e70a8ff0258d5112aafeca6bc5a4a620ac', class: "loading" }, "Initializing Insights...")));
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,p={};return ""!==t&&(p.resourcesUrl=new URL(".",t).href),c(p)})().then((async a=>(await o(),X([["p-e6584598",[[513,"apollo-data-bar-chart",{adData:[1,"ad-data"],adSpec:[1,"ad-spec"]}],[513,"apollo-data-donut-chart",{adData:[1,"ad-data"],adSpec:[1,"ad-spec"]}]]]],a))));
7
- //# sourceMappingURL=p-DHA6uI9u.js.map
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-DHA6uI9u.js.map
9
+ //# sourceMappingURL=p-D8NW3xSO.js.map