@object-ui/plugin-charts 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +20 -0
- package/dist/AdvancedChartImpl-DcIHnCct.js +4529 -0
- package/dist/{BarChart-RKJxvg5Y.js → BarChart-C_I0OFbj.js} +6033 -5763
- package/dist/ChartImpl-CU5lEzui.js +79 -0
- package/dist/index-DgxI83zT.js +478 -0
- package/dist/index.js +5 -6
- package/dist/index.umd.cjs +22 -22
- package/dist/src/AdvancedChartImpl.d.ts +1 -1
- package/dist/src/ChartRenderer.d.ts +35 -0
- package/dist/src/ObjectChart.d.ts +1 -0
- package/dist/src/index.d.ts +5 -39
- package/dist/src/types.d.ts +1 -1
- package/examples/chart-examples.ts +54 -0
- package/package.json +7 -7
- package/src/AdvancedChartImpl.tsx +94 -18
- package/src/ChartRenderer.tsx +112 -0
- package/src/ObjectChart.tsx +74 -0
- package/src/index.test.ts +1 -1
- package/src/index.tsx +70 -120
- package/src/registration.test.tsx +22 -0
- package/vite.config.ts +13 -0
- package/vitest.config.ts +13 -0
- package/vitest.setup.ts +1 -0
- package/dist/AdvancedChartImpl-DJcN3TPx.js +0 -2530
- package/dist/ChartImpl-CE1UGkNR.js +0 -275
- package/dist/index-CTfEtwhn.js +0 -387
package/src/index.tsx
CHANGED
|
@@ -6,49 +6,19 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import React, { Suspense } from 'react';
|
|
10
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
10
|
+
import { ChartBarRenderer, ChartRenderer } from './ChartRenderer';
|
|
11
|
+
import './ObjectChart'; // Import for side-effects (registration of object-chart)
|
|
13
12
|
|
|
14
13
|
// Export types for external use
|
|
15
14
|
export type { BarChartSchema } from './types';
|
|
15
|
+
export { ChartBarRenderer, ChartRenderer };
|
|
16
|
+
export { ObjectChart } from './ObjectChart';
|
|
16
17
|
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export interface ChartBarRendererProps {
|
|
23
|
-
schema: {
|
|
24
|
-
type: string;
|
|
25
|
-
id?: string;
|
|
26
|
-
className?: string;
|
|
27
|
-
data?: Array<Record<string, any>>;
|
|
28
|
-
dataKey?: string;
|
|
29
|
-
xAxisKey?: string;
|
|
30
|
-
height?: number;
|
|
31
|
-
color?: string;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* ChartBarRenderer - The public API for the bar chart component
|
|
37
|
-
* This wrapper handles lazy loading internally using React.Suspense
|
|
38
|
-
*/
|
|
39
|
-
export const ChartBarRenderer: React.FC<ChartBarRendererProps> = ({ schema }) => {
|
|
40
|
-
return (
|
|
41
|
-
<Suspense fallback={<Skeleton className="w-full h-[400px]" />}>
|
|
42
|
-
<LazyChart
|
|
43
|
-
data={schema.data}
|
|
44
|
-
dataKey={schema.dataKey}
|
|
45
|
-
xAxisKey={schema.xAxisKey}
|
|
46
|
-
height={schema.height}
|
|
47
|
-
className={schema.className}
|
|
48
|
-
color={schema.color}
|
|
49
|
-
/>
|
|
50
|
-
</Suspense>
|
|
51
|
-
);
|
|
18
|
+
// Standard Export Protocol - for manual integration
|
|
19
|
+
export const chartComponents = {
|
|
20
|
+
'bar-chart': ChartBarRenderer,
|
|
21
|
+
'chart': ChartRenderer,
|
|
52
22
|
};
|
|
53
23
|
|
|
54
24
|
// Register the component with the ComponentRegistry
|
|
@@ -56,6 +26,7 @@ ComponentRegistry.register(
|
|
|
56
26
|
'bar-chart',
|
|
57
27
|
ChartBarRenderer,
|
|
58
28
|
{
|
|
29
|
+
namespace: 'plugin-charts',
|
|
59
30
|
label: 'Bar Chart',
|
|
60
31
|
category: 'plugin',
|
|
61
32
|
inputs: [
|
|
@@ -81,87 +52,12 @@ ComponentRegistry.register(
|
|
|
81
52
|
}
|
|
82
53
|
);
|
|
83
54
|
|
|
84
|
-
// Advanced Chart Renderer with multiple chart types
|
|
85
|
-
export interface ChartRendererProps {
|
|
86
|
-
schema: {
|
|
87
|
-
type: string;
|
|
88
|
-
id?: string;
|
|
89
|
-
className?: string;
|
|
90
|
-
chartType?: 'bar' | 'line' | 'area';
|
|
91
|
-
data?: Array<Record<string, any>>;
|
|
92
|
-
config?: Record<string, any>;
|
|
93
|
-
xAxisKey?: string;
|
|
94
|
-
series?: Array<{ dataKey: string }>;
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* ChartRenderer - The public API for the advanced chart component
|
|
100
|
-
* Supports multiple chart types (bar, line, area) with full configuration
|
|
101
|
-
*/
|
|
102
|
-
export const ChartRenderer: React.FC<ChartRendererProps> = ({ schema }) => {
|
|
103
|
-
// ⚡️ Adapter: Normalize JSON schema to Recharts Props
|
|
104
|
-
const props = React.useMemo(() => {
|
|
105
|
-
// 1. Defaults
|
|
106
|
-
let series = schema.series;
|
|
107
|
-
let xAxisKey = schema.xAxisKey;
|
|
108
|
-
let config = schema.config;
|
|
109
|
-
|
|
110
|
-
// 2. Adapt Tremor/Simple format (categories -> series, index -> xAxisKey)
|
|
111
|
-
if (!xAxisKey) {
|
|
112
|
-
if ((schema as any).index) xAxisKey = (schema as any).index;
|
|
113
|
-
else if ((schema as any).category) xAxisKey = (schema as any).category; // Support Pie/Donut category
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (!series) {
|
|
117
|
-
if ((schema as any).categories) {
|
|
118
|
-
series = (schema as any).categories.map((cat: string) => ({ dataKey: cat }));
|
|
119
|
-
} else if ((schema as any).value) {
|
|
120
|
-
// Single value adapter (for Pie/Simple charts)
|
|
121
|
-
series = [{ dataKey: (schema as any).value }];
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// 3. Auto-generate config/colors if missing
|
|
126
|
-
if (!config && series) {
|
|
127
|
-
const colors = (schema as any).colors || ['hsl(var(--chart-1))', 'hsl(var(--chart-2))', 'hsl(var(--chart-3))'];
|
|
128
|
-
const newConfig: ChartConfig = {};
|
|
129
|
-
series.forEach((s: any, idx: number) => {
|
|
130
|
-
newConfig[s.dataKey] = { label: s.dataKey, color: colors[idx % colors.length] };
|
|
131
|
-
});
|
|
132
|
-
config = newConfig;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
chartType: schema.chartType,
|
|
137
|
-
data: schema.data,
|
|
138
|
-
config,
|
|
139
|
-
xAxisKey,
|
|
140
|
-
series,
|
|
141
|
-
className: schema.className
|
|
142
|
-
};
|
|
143
|
-
}, [schema]);
|
|
144
|
-
|
|
145
|
-
return (
|
|
146
|
-
<Suspense fallback={<Skeleton className="w-full h-[400px]" />}>
|
|
147
|
-
<LazyAdvancedChart
|
|
148
|
-
// Pass adapted props
|
|
149
|
-
chartType={props.chartType}
|
|
150
|
-
data={props.data}
|
|
151
|
-
config={props.config}
|
|
152
|
-
xAxisKey={props.xAxisKey}
|
|
153
|
-
series={props.series}
|
|
154
|
-
className={props.className}
|
|
155
|
-
/>
|
|
156
|
-
</Suspense>
|
|
157
|
-
);
|
|
158
|
-
};
|
|
159
|
-
|
|
160
55
|
// Register the advanced chart component
|
|
161
56
|
ComponentRegistry.register(
|
|
162
57
|
'chart',
|
|
163
58
|
ChartRenderer,
|
|
164
59
|
{
|
|
60
|
+
namespace: 'plugin-charts',
|
|
165
61
|
label: 'Chart',
|
|
166
62
|
category: 'plugin',
|
|
167
63
|
inputs: [
|
|
@@ -172,7 +68,11 @@ ComponentRegistry.register(
|
|
|
172
68
|
enum: [
|
|
173
69
|
{ label: 'Bar', value: 'bar' },
|
|
174
70
|
{ label: 'Line', value: 'line' },
|
|
175
|
-
{ label: 'Area', value: 'area' }
|
|
71
|
+
{ label: 'Area', value: 'area' },
|
|
72
|
+
{ label: 'Pie', value: 'pie' },
|
|
73
|
+
{ label: 'Donut', value: 'donut' },
|
|
74
|
+
{ label: 'Radar', value: 'radar' },
|
|
75
|
+
{ label: 'Scatter', value: 'scatter' }
|
|
176
76
|
],
|
|
177
77
|
defaultValue: 'bar'
|
|
178
78
|
},
|
|
@@ -204,8 +104,58 @@ ComponentRegistry.register(
|
|
|
204
104
|
}
|
|
205
105
|
);
|
|
206
106
|
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
'bar
|
|
210
|
-
|
|
211
|
-
|
|
107
|
+
// Alias for CRM App compatibility
|
|
108
|
+
ComponentRegistry.register(
|
|
109
|
+
'chart:bar',
|
|
110
|
+
ChartRenderer,
|
|
111
|
+
{
|
|
112
|
+
namespace: 'plugin-charts',
|
|
113
|
+
label: 'Bar Chart (Alias)',
|
|
114
|
+
category: 'plugin',
|
|
115
|
+
defaultProps: { chartType: 'bar' }
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
ComponentRegistry.register(
|
|
120
|
+
'pie-chart',
|
|
121
|
+
ChartRenderer,
|
|
122
|
+
{
|
|
123
|
+
namespace: 'plugin-charts',
|
|
124
|
+
label: 'Pie Chart',
|
|
125
|
+
category: 'plugin',
|
|
126
|
+
defaultProps: { chartType: 'pie' }
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
ComponentRegistry.register(
|
|
131
|
+
'donut-chart',
|
|
132
|
+
ChartRenderer,
|
|
133
|
+
{
|
|
134
|
+
namespace: 'plugin-charts',
|
|
135
|
+
label: 'Donut Chart',
|
|
136
|
+
category: 'plugin',
|
|
137
|
+
defaultProps: { chartType: 'donut' }
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
ComponentRegistry.register(
|
|
142
|
+
'radar-chart',
|
|
143
|
+
ChartRenderer,
|
|
144
|
+
{
|
|
145
|
+
namespace: 'plugin-charts',
|
|
146
|
+
label: 'Radar Chart',
|
|
147
|
+
category: 'plugin',
|
|
148
|
+
defaultProps: { chartType: 'radar' }
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
ComponentRegistry.register(
|
|
153
|
+
'scatter-chart',
|
|
154
|
+
ChartRenderer,
|
|
155
|
+
{
|
|
156
|
+
namespace: 'plugin-charts',
|
|
157
|
+
label: 'Scatter Chart',
|
|
158
|
+
category: 'plugin',
|
|
159
|
+
defaultProps: { chartType: 'scatter' }
|
|
160
|
+
}
|
|
161
|
+
);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import { describe, it, expect, vi, beforeAll } from 'vitest';
|
|
4
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
5
|
+
|
|
6
|
+
describe('Plugin Charts Registration', () => {
|
|
7
|
+
beforeAll(async () => {
|
|
8
|
+
await import('./index');
|
|
9
|
+
}, 30000);
|
|
10
|
+
|
|
11
|
+
it('registers bar-chart component', () => {
|
|
12
|
+
const config = ComponentRegistry.get('bar-chart');
|
|
13
|
+
expect(config).toBeDefined();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('registers chart component types', () => {
|
|
17
|
+
expect(ComponentRegistry.get('chart')).toBeDefined(); // Assuming base
|
|
18
|
+
// Verify aliases if they exist
|
|
19
|
+
expect(ComponentRegistry.get('pie-chart')).toBeDefined();
|
|
20
|
+
expect(ComponentRegistry.get('donut-chart')).toBeDefined();
|
|
21
|
+
});
|
|
22
|
+
});
|
package/vite.config.ts
CHANGED
|
@@ -24,6 +24,13 @@ export default defineConfig({
|
|
|
24
24
|
resolve: {
|
|
25
25
|
alias: {
|
|
26
26
|
'@': resolve(__dirname, './src'),
|
|
27
|
+
'@object-ui/core': resolve(__dirname, '../core/src'),
|
|
28
|
+
'@object-ui/types': resolve(__dirname, '../types/src'),
|
|
29
|
+
'@object-ui/react': resolve(__dirname, '../react/src'),
|
|
30
|
+
'@object-ui/components': resolve(__dirname, '../components/src'),
|
|
31
|
+
'@object-ui/fields': resolve(__dirname, '../fields/src'),
|
|
32
|
+
'@object-ui/plugin-dashboard': resolve(__dirname, '../plugin-dashboard/src'),
|
|
33
|
+
'@object-ui/plugin-grid': resolve(__dirname, '../plugin-grid/src'),
|
|
27
34
|
},
|
|
28
35
|
},
|
|
29
36
|
build: {
|
|
@@ -45,4 +52,10 @@ export default defineConfig({
|
|
|
45
52
|
},
|
|
46
53
|
},
|
|
47
54
|
},
|
|
55
|
+
test: {
|
|
56
|
+
globals: true,
|
|
57
|
+
environment: 'happy-dom',
|
|
58
|
+
setupFiles: ['../../vitest.setup.tsx'],
|
|
59
|
+
passWithNoTests: true,
|
|
60
|
+
},
|
|
48
61
|
});
|
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="vitest" />
|
|
2
|
+
import { defineConfig } from 'vite';
|
|
3
|
+
import react from '@vitejs/plugin-react';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [react()],
|
|
8
|
+
test: {
|
|
9
|
+
environment: 'happy-dom',
|
|
10
|
+
globals: true,
|
|
11
|
+
setupFiles: ['./vitest.setup.ts'],
|
|
12
|
+
},
|
|
13
|
+
});
|
package/vitest.setup.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|