drizzle-cube 0.1.41 → 0.1.43
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/dist/adapters/{compiler-CkjmApqo.js → compiler-B57cLx38.js} +1148 -1118
- package/dist/adapters/express/index.js +1 -1
- package/dist/adapters/fastify/index.js +1 -1
- package/dist/adapters/hono/index.js +1 -1
- package/dist/adapters/nextjs/index.js +1 -1
- package/dist/client/charts.js +1 -1
- package/dist/client/chunks/{charts-VcPFhxyE.js → charts-DgmZAw3A.js} +2 -2
- package/dist/client/chunks/{charts-VcPFhxyE.js.map → charts-DgmZAw3A.js.map} +1 -1
- package/dist/client/chunks/{components-DnCh4Y4N.js → components-BI1Xc4js.js} +8972 -8015
- package/dist/client/chunks/components-BI1Xc4js.js.map +1 -0
- package/dist/client/chunks/{icons-MNJ50ahP.js → icons-oifcbJCc.js} +309 -255
- package/dist/client/chunks/icons-oifcbJCc.js.map +1 -0
- package/dist/client/chunks/{providers-DwDirAYo.js → providers-ChcxFwXu.js} +66 -64
- package/dist/client/chunks/providers-ChcxFwXu.js.map +1 -0
- package/dist/client/components/AnalyticsDashboard.d.ts +1 -1
- package/dist/client/components/DashboardFilterPanel.d.ts +15 -0
- package/dist/client/components/DashboardGrid.d.ts +5 -2
- package/dist/client/components/PortletFilterConfigModal.d.ts +11 -0
- package/dist/client/components.js +2 -2
- package/dist/client/hooks.js +17 -17
- package/dist/client/hooks.js.map +1 -1
- package/dist/client/index.js +3 -3
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +12 -0
- package/dist/client/utils/filterUtils.d.ts +40 -0
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +854 -824
- package/package.json +1 -1
- package/dist/client/chunks/components-DnCh4Y4N.js.map +0 -1
- package/dist/client/chunks/icons-MNJ50ahP.js.map +0 -1
- package/dist/client/chunks/providers-DwDirAYo.js.map +0 -1
|
@@ -10,33 +10,35 @@ class D {
|
|
|
10
10
|
}, t && (this.headers.Authorization = t);
|
|
11
11
|
}
|
|
12
12
|
async load(t) {
|
|
13
|
-
const r =
|
|
13
|
+
const r = JSON.stringify(t);
|
|
14
|
+
console.log("CubeClient.load - Query being sent to API:", r);
|
|
15
|
+
const e = encodeURIComponent(r), s = `${this.apiUrl}/load?query=${e}`, n = await fetch(s, {
|
|
14
16
|
method: "GET",
|
|
15
17
|
headers: {
|
|
16
18
|
// Remove Content-Type for GET request
|
|
17
19
|
...Object.fromEntries(
|
|
18
|
-
Object.entries(this.headers).filter(([
|
|
20
|
+
Object.entries(this.headers).filter(([l]) => l !== "Content-Type")
|
|
19
21
|
)
|
|
20
22
|
},
|
|
21
23
|
credentials: "include"
|
|
22
24
|
// Include cookies for session auth
|
|
23
25
|
});
|
|
24
|
-
if (!
|
|
25
|
-
let
|
|
26
|
+
if (!n.ok) {
|
|
27
|
+
let l = `Cube query failed: ${n.status}`;
|
|
26
28
|
try {
|
|
27
|
-
const
|
|
29
|
+
const o = await n.text();
|
|
28
30
|
try {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
+
const u = JSON.parse(o);
|
|
32
|
+
u.error ? l = u.error : l += ` ${o}`;
|
|
31
33
|
} catch {
|
|
32
|
-
|
|
34
|
+
l += ` ${o}`;
|
|
33
35
|
}
|
|
34
36
|
} catch {
|
|
35
37
|
}
|
|
36
|
-
throw new Error(
|
|
38
|
+
throw new Error(l);
|
|
37
39
|
}
|
|
38
|
-
const
|
|
39
|
-
return new T(
|
|
40
|
+
const c = await n.json();
|
|
41
|
+
return new T(c);
|
|
40
42
|
}
|
|
41
43
|
async meta() {
|
|
42
44
|
const t = `${this.apiUrl}/meta`, r = await fetch(t, {
|
|
@@ -49,19 +51,19 @@ class D {
|
|
|
49
51
|
return r.json();
|
|
50
52
|
}
|
|
51
53
|
async sql(t) {
|
|
52
|
-
const r = encodeURIComponent(JSON.stringify(t)), e = `${this.apiUrl}/sql?query=${r}`,
|
|
54
|
+
const r = encodeURIComponent(JSON.stringify(t)), e = `${this.apiUrl}/sql?query=${r}`, s = await fetch(e, {
|
|
53
55
|
method: "GET",
|
|
54
56
|
headers: {
|
|
55
57
|
// Remove Content-Type for GET request
|
|
56
58
|
...Object.fromEntries(
|
|
57
|
-
Object.entries(this.headers).filter(([
|
|
59
|
+
Object.entries(this.headers).filter(([n]) => n !== "Content-Type")
|
|
58
60
|
)
|
|
59
61
|
},
|
|
60
62
|
credentials: "include"
|
|
61
63
|
});
|
|
62
|
-
if (!
|
|
63
|
-
throw new Error(`SQL generation failed: ${
|
|
64
|
-
return
|
|
64
|
+
if (!s.ok)
|
|
65
|
+
throw new Error(`SQL generation failed: ${s.status}`);
|
|
66
|
+
return s.json();
|
|
65
67
|
}
|
|
66
68
|
async dryRun(t) {
|
|
67
69
|
const r = `${this.apiUrl}/dry-run`, e = await fetch(r, {
|
|
@@ -71,18 +73,18 @@ class D {
|
|
|
71
73
|
body: JSON.stringify({ query: t })
|
|
72
74
|
});
|
|
73
75
|
if (!e.ok) {
|
|
74
|
-
let
|
|
76
|
+
let s = `Dry run failed: ${e.status}`;
|
|
75
77
|
try {
|
|
76
|
-
const
|
|
78
|
+
const n = await e.text();
|
|
77
79
|
try {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
+
const c = JSON.parse(n);
|
|
81
|
+
c.error ? s = c.error : s += ` ${n}`;
|
|
80
82
|
} catch {
|
|
81
|
-
|
|
83
|
+
s += ` ${n}`;
|
|
82
84
|
}
|
|
83
85
|
} catch {
|
|
84
86
|
}
|
|
85
|
-
throw new Error(
|
|
87
|
+
throw new Error(s);
|
|
86
88
|
}
|
|
87
89
|
return e.json();
|
|
88
90
|
}
|
|
@@ -105,14 +107,14 @@ class T {
|
|
|
105
107
|
return this.loadResponse.results && this.loadResponse.results[0] ? this.loadResponse.results[0].annotation || {} : this.loadResponse.annotation || {};
|
|
106
108
|
}
|
|
107
109
|
}
|
|
108
|
-
function U(
|
|
109
|
-
return new D(
|
|
110
|
+
function U(a, t = {}) {
|
|
111
|
+
return new D(a, t);
|
|
110
112
|
}
|
|
111
113
|
const S = 900 * 1e3;
|
|
112
114
|
let h = null;
|
|
113
|
-
function
|
|
115
|
+
function q(a) {
|
|
114
116
|
const t = {};
|
|
115
|
-
return
|
|
117
|
+
return a.cubes.forEach((r) => {
|
|
116
118
|
r.measures.forEach((e) => {
|
|
117
119
|
t[e.name] = e.title || e.shortTitle || e.name;
|
|
118
120
|
}), r.dimensions.forEach((e) => {
|
|
@@ -122,87 +124,87 @@ function L(s) {
|
|
|
122
124
|
});
|
|
123
125
|
}), t;
|
|
124
126
|
}
|
|
125
|
-
function
|
|
127
|
+
function L() {
|
|
126
128
|
return h ? Date.now() - h.timestamp < S : !1;
|
|
127
129
|
}
|
|
128
|
-
function
|
|
129
|
-
const [t, r] = f(null), [e,
|
|
130
|
-
if (
|
|
131
|
-
r(h.data),
|
|
130
|
+
function P(a) {
|
|
131
|
+
const [t, r] = f(null), [e, s] = f({}), [n, c] = f(!0), [l, o] = f(null), u = b(async () => {
|
|
132
|
+
if (L() && h) {
|
|
133
|
+
r(h.data), s(h.labelMap), c(!1), o(null);
|
|
132
134
|
return;
|
|
133
135
|
}
|
|
134
136
|
try {
|
|
135
|
-
|
|
136
|
-
const
|
|
137
|
+
c(!0), o(null);
|
|
138
|
+
const i = await a.meta(), d = q(i);
|
|
137
139
|
h = {
|
|
138
|
-
data:
|
|
140
|
+
data: i,
|
|
139
141
|
labelMap: d,
|
|
140
142
|
timestamp: Date.now()
|
|
141
|
-
}, r(
|
|
142
|
-
} catch (
|
|
143
|
-
const d =
|
|
144
|
-
|
|
143
|
+
}, r(i), s(d);
|
|
144
|
+
} catch (i) {
|
|
145
|
+
const d = i instanceof Error ? i.message : "Failed to fetch metadata";
|
|
146
|
+
o(d), console.error("Failed to fetch cube metadata:", i);
|
|
145
147
|
} finally {
|
|
146
|
-
|
|
148
|
+
c(!1);
|
|
147
149
|
}
|
|
148
|
-
}, [
|
|
150
|
+
}, [a]);
|
|
149
151
|
O(() => {
|
|
150
152
|
u();
|
|
151
153
|
}, [u]);
|
|
152
|
-
const p = b((
|
|
154
|
+
const p = b((i) => e[i] || i, [e]), m = b(() => {
|
|
153
155
|
h = null, u();
|
|
154
156
|
}, [u]);
|
|
155
157
|
return {
|
|
156
158
|
meta: t,
|
|
157
159
|
labelMap: e,
|
|
158
|
-
loading:
|
|
160
|
+
loading: n,
|
|
159
161
|
error: l,
|
|
160
162
|
refetch: m,
|
|
161
163
|
getFieldLabel: p
|
|
162
164
|
};
|
|
163
165
|
}
|
|
164
|
-
const
|
|
165
|
-
function
|
|
166
|
-
cubeApi:
|
|
166
|
+
const C = x(null);
|
|
167
|
+
function I({
|
|
168
|
+
cubeApi: a,
|
|
167
169
|
apiOptions: t,
|
|
168
170
|
token: r,
|
|
169
171
|
options: e = {},
|
|
170
|
-
features:
|
|
172
|
+
features: s = { enableAI: !0, aiEndpoint: "/api/ai/generate" },
|
|
171
173
|
// Default to AI enabled for backward compatibility
|
|
172
|
-
children:
|
|
174
|
+
children: n
|
|
173
175
|
}) {
|
|
174
|
-
const [
|
|
176
|
+
const [c, l] = f(null), o = c || {
|
|
175
177
|
apiOptions: t || { apiUrl: "/cubejs-api/v1" },
|
|
176
178
|
token: r
|
|
177
|
-
}, u = j(() =>
|
|
179
|
+
}, u = j(() => a && !t && !r ? a : U(o.token, o.apiOptions), [a, t, r, o.apiOptions, o.token]), { meta: p, labelMap: m, loading: i, error: d, getFieldLabel: y, refetch: w } = P(u), g = {
|
|
178
180
|
cubeApi: u,
|
|
179
181
|
options: e,
|
|
180
182
|
meta: p,
|
|
181
183
|
labelMap: m,
|
|
182
|
-
metaLoading:
|
|
184
|
+
metaLoading: i,
|
|
183
185
|
metaError: d,
|
|
184
|
-
getFieldLabel:
|
|
185
|
-
refetchMeta:
|
|
186
|
-
updateApiConfig: (
|
|
186
|
+
getFieldLabel: y,
|
|
187
|
+
refetchMeta: w,
|
|
188
|
+
updateApiConfig: (E, M) => {
|
|
187
189
|
l({
|
|
188
|
-
apiOptions:
|
|
190
|
+
apiOptions: E,
|
|
189
191
|
token: M
|
|
190
192
|
});
|
|
191
193
|
},
|
|
192
|
-
features:
|
|
194
|
+
features: s
|
|
193
195
|
};
|
|
194
|
-
return /* @__PURE__ */ R(
|
|
196
|
+
return /* @__PURE__ */ R(C.Provider, { value: g, children: n });
|
|
195
197
|
}
|
|
196
|
-
function
|
|
197
|
-
const
|
|
198
|
-
if (!
|
|
198
|
+
function J() {
|
|
199
|
+
const a = $(C);
|
|
200
|
+
if (!a)
|
|
199
201
|
throw new Error("useCubeContext must be used within a CubeProvider");
|
|
200
|
-
return
|
|
202
|
+
return a;
|
|
201
203
|
}
|
|
202
204
|
export {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
+
I as C,
|
|
206
|
+
P as a,
|
|
205
207
|
U as c,
|
|
206
|
-
|
|
208
|
+
J as u
|
|
207
209
|
};
|
|
208
|
-
//# sourceMappingURL=providers-
|
|
210
|
+
//# sourceMappingURL=providers-ChcxFwXu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers-ChcxFwXu.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/hooks/useCubeMeta.ts","../../../src/client/providers/CubeProvider.tsx"],"sourcesContent":["/**\n * Minimal Cube client implementation\n * Replaces @cubejs-client/core with lighter implementation\n */\n\nimport type { CubeQuery, CubeApiOptions, CubeResultSet } from '../types'\n\nexport class CubeClient {\n private apiUrl: string\n private headers: Record<string, string>\n\n constructor(token?: string, options: CubeApiOptions = {}) {\n this.apiUrl = options.apiUrl || '/cubejs-api/v1'\n this.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n \n if (token) {\n this.headers['Authorization'] = token\n }\n }\n\n async load(query: CubeQuery): Promise<CubeResultSet> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryString = JSON.stringify(query)\n console.log('CubeClient.load - Query being sent to API:', queryString)\n\n const queryParam = encodeURIComponent(queryString)\n const url = `${this.apiUrl}/load?query=${queryParam}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: 'include' // Include cookies for session auth\n })\n\n if (!response.ok) {\n let errorMessage = `Cube query failed: ${response.status}`\n try {\n const errorText = await response.text()\n // Try to parse as JSON first to get structured error\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If not JSON, use the raw text\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return new ResultSet(result)\n }\n\n async meta(): Promise<any> {\n const url = `${this.apiUrl}/meta`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.headers,\n credentials: 'include'\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch meta: ${response.status}`)\n }\n\n return response.json()\n }\n\n async sql(query: CubeQuery): Promise<any> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/sql?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: 'include'\n })\n\n if (!response.ok) {\n throw new Error(`SQL generation failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async dryRun(query: CubeQuery): Promise<any> {\n const url = `${this.apiUrl}/dry-run`\n \n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: 'include',\n body: JSON.stringify({ query })\n })\n\n if (!response.ok) {\n let errorMessage = `Dry run failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n}\n\n/**\n * Simple ResultSet implementation\n */\nclass ResultSet implements CubeResultSet {\n public loadResponse: any\n\n constructor(loadResponse: any) {\n this.loadResponse = loadResponse\n }\n\n rawData(): any[] {\n // Handle new nested structure: loadResponse.results[0].data\n // Keep backward compatibility with old structure: loadResponse.data\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].data || []\n }\n return this.loadResponse.data || []\n }\n\n tablePivot(): any[] {\n // For pie charts and tables, return the raw data\n return this.rawData()\n }\n\n series(): any[] {\n // Simple series implementation\n return this.rawData()\n }\n\n annotation(): any {\n // Handle new nested structure: loadResponse.results[0].annotation\n // Keep backward compatibility with old structure: loadResponse.annotation\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].annotation || {}\n }\n return this.loadResponse.annotation || {}\n }\n}\n\n/**\n * Factory function to create a cube client\n */\nexport function createCubeClient(token?: string, options: CubeApiOptions = {}): CubeClient {\n return new CubeClient(token, options)\n}\n\n// Legacy compatibility export\nexport function cube(token?: string, options: CubeApiOptions = {}): CubeClient {\n return createCubeClient(token, options)\n}","import { useState, useEffect, useCallback } from 'react'\nimport type { CubeClient } from '../client/CubeClient'\n\nexport interface CubeMetaField {\n name: string\n title: string\n shortTitle: string\n type: string\n}\n\nexport interface CubeMetaRelationship {\n targetCube: string\n relationship: 'belongsTo' | 'hasOne' | 'hasMany'\n joinFields: Array<{\n sourceField: string\n targetField: string\n }>\n}\n\nexport interface CubeMetaCube {\n name: string\n title: string\n description?: string\n measures: CubeMetaField[]\n dimensions: CubeMetaField[]\n segments: CubeMetaField[]\n relationships?: CubeMetaRelationship[]\n}\n\nexport interface CubeMeta {\n cubes: CubeMetaCube[]\n}\n\nexport type FieldLabelMap = Record<string, string>\n\ninterface CachedMeta {\n data: CubeMeta\n labelMap: FieldLabelMap\n timestamp: number\n}\n\ninterface UseCubeMetaResult {\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n loading: boolean\n error: string | null\n refetch: () => void\n getFieldLabel: (fieldName: string) => string\n}\n\n// Cache duration: 15 minutes\nconst CACHE_DURATION = 15 * 60 * 1000\n\n// In-memory cache\nlet cachedMeta: CachedMeta | null = null\n\nfunction buildLabelMap(meta: CubeMeta): FieldLabelMap {\n const labelMap: FieldLabelMap = {}\n \n meta.cubes.forEach(cube => {\n // Add measures\n cube.measures.forEach(measure => {\n labelMap[measure.name] = measure.title || measure.shortTitle || measure.name\n })\n \n // Add dimensions\n cube.dimensions.forEach(dimension => {\n labelMap[dimension.name] = dimension.title || dimension.shortTitle || dimension.name\n })\n \n // Add segments\n cube.segments.forEach(segment => {\n labelMap[segment.name] = segment.title || segment.shortTitle || segment.name\n })\n })\n \n return labelMap\n}\n\nfunction isCacheValid(): boolean {\n if (!cachedMeta) return false\n const now = Date.now()\n return (now - cachedMeta.timestamp) < CACHE_DURATION\n}\n\n// Export cache clearing function for tests\nexport function clearMetaCache() {\n cachedMeta = null\n}\n\nexport function useCubeMeta(cubeApi: CubeClient): UseCubeMetaResult {\n const [meta, setMeta] = useState<CubeMeta | null>(null)\n const [labelMap, setLabelMap] = useState<FieldLabelMap>({})\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchMeta = useCallback(async () => {\n // Check cache first\n if (isCacheValid() && cachedMeta) {\n setMeta(cachedMeta.data)\n setLabelMap(cachedMeta.labelMap)\n setLoading(false)\n setError(null)\n return\n }\n\n try {\n setLoading(true)\n setError(null)\n \n const metaData: CubeMeta = await cubeApi.meta()\n const newLabelMap = buildLabelMap(metaData)\n \n // Cache the result\n cachedMeta = {\n data: metaData,\n labelMap: newLabelMap,\n timestamp: Date.now()\n }\n \n setMeta(metaData)\n setLabelMap(newLabelMap)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch metadata'\n setError(errorMessage)\n console.error('Failed to fetch cube metadata:', err)\n } finally {\n setLoading(false)\n }\n }, [cubeApi])\n\n useEffect(() => {\n fetchMeta()\n }, [fetchMeta])\n\n const getFieldLabel = useCallback((fieldName: string): string => {\n return labelMap[fieldName] || fieldName\n }, [labelMap])\n\n const refetch = useCallback(() => {\n // Clear cache and refetch\n cachedMeta = null\n fetchMeta()\n }, [fetchMeta])\n\n return {\n meta,\n labelMap,\n loading,\n error,\n refetch,\n getFieldLabel\n }\n}","/**\n * Lightweight CubeProvider implementation\n * Replaces @cubejs-client/react provider\n */\n\nimport React, { createContext, useContext, useMemo, useState } from 'react'\nimport { createCubeClient, type CubeClient } from '../client/CubeClient'\nimport type { CubeQueryOptions, CubeApiOptions, FeaturesConfig } from '../types'\nimport { useCubeMeta, type CubeMeta, type FieldLabelMap } from '../hooks/useCubeMeta'\n\ninterface CubeContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n features: FeaturesConfig\n}\n\nconst CubeContext = createContext<CubeContextValue | null>(null)\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n features?: FeaturesConfig\n children: React.ReactNode\n}\n\nexport function CubeProvider({ \n cubeApi: initialCubeApi, \n apiOptions: initialApiOptions,\n token: initialToken,\n options = {},\n features = { enableAI: true, aiEndpoint: '/api/ai/generate' }, // Default to AI enabled for backward compatibility\n children \n}: CubeProviderProps) {\n // State for dynamic API configuration (only for updates via updateApiConfig)\n const [dynamicConfig, setDynamicConfig] = useState<{ apiOptions: CubeApiOptions; token?: string } | null>(null)\n\n // Determine current config: dynamic config takes precedence over props\n const currentConfig = dynamicConfig || {\n apiOptions: initialApiOptions || { apiUrl: '/cubejs-api/v1' },\n token: initialToken\n }\n\n // Create or use the provided CubeClient, recreating when config changes\n const cubeApi = useMemo(() => {\n if (initialCubeApi && !initialApiOptions && !initialToken) {\n // Use provided client if no initial config specified\n return initialCubeApi\n }\n \n // Create client with current config\n return createCubeClient(currentConfig.token, currentConfig.apiOptions)\n }, [initialCubeApi, initialApiOptions, initialToken, currentConfig.apiOptions, currentConfig.token])\n\n const { meta, labelMap, loading: metaLoading, error: metaError, getFieldLabel, refetch: refetchMeta } = useCubeMeta(cubeApi)\n \n const updateApiConfig = (newApiOptions: CubeApiOptions, newToken?: string) => {\n setDynamicConfig({\n apiOptions: newApiOptions,\n token: newToken\n })\n }\n \n const contextValue = { \n cubeApi, \n options, \n meta, \n labelMap, \n metaLoading, \n metaError, \n getFieldLabel, \n refetchMeta,\n updateApiConfig,\n features\n }\n \n return (\n <CubeContext.Provider value={contextValue}>\n {children}\n </CubeContext.Provider>\n )\n}\n\nexport function useCubeContext() {\n const context = useContext(CubeContext)\n \n if (!context) {\n throw new Error('useCubeContext must be used within a CubeProvider')\n }\n return context\n}"],"names":["CubeClient","token","options","query","queryString","queryParam","url","response","key","errorMessage","errorText","errorData","result","ResultSet","loadResponse","createCubeClient","CACHE_DURATION","cachedMeta","buildLabelMap","meta","labelMap","cube","measure","dimension","segment","isCacheValid","useCubeMeta","cubeApi","setMeta","useState","setLabelMap","loading","setLoading","error","setError","fetchMeta","useCallback","metaData","newLabelMap","err","useEffect","getFieldLabel","fieldName","refetch","CubeContext","createContext","CubeProvider","initialCubeApi","initialApiOptions","initialToken","features","children","dynamicConfig","setDynamicConfig","currentConfig","useMemo","metaLoading","metaError","refetchMeta","contextValue","newApiOptions","newToken","useCubeContext","context","useContext"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { AnalyticsDashboardProps } from '../types';
|
|
2
|
-
export default function AnalyticsDashboard({ config, editable, onConfigChange, onSave, onDirtyStateChange }: AnalyticsDashboardProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export default function AnalyticsDashboard({ config, editable, dashboardFilters: propDashboardFilters, onConfigChange, onSave, onDirtyStateChange }: AnalyticsDashboardProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { DashboardFilter, CubeMeta, DashboardConfig } from '../types';
|
|
3
|
+
interface DashboardFilterPanelProps {
|
|
4
|
+
dashboardFilters: DashboardFilter[];
|
|
5
|
+
editable: boolean;
|
|
6
|
+
schema: CubeMeta | null;
|
|
7
|
+
dashboardConfig: DashboardConfig;
|
|
8
|
+
onDashboardFiltersChange: (filters: DashboardFilter[]) => void;
|
|
9
|
+
onSaveFilters?: () => void | Promise<void>;
|
|
10
|
+
selectedFilterId?: string | null;
|
|
11
|
+
onFilterSelect?: (filterId: string) => void;
|
|
12
|
+
isEditMode?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare const DashboardFilterPanel: React.FC<DashboardFilterPanelProps>;
|
|
15
|
+
export default DashboardFilterPanel;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { ColorPalette } from '../utils/colorPalettes';
|
|
2
|
-
import { DashboardConfig } from '../types';
|
|
2
|
+
import { DashboardConfig, DashboardFilter, CubeMeta } from '../types';
|
|
3
3
|
interface DashboardGridProps {
|
|
4
4
|
config: DashboardConfig;
|
|
5
5
|
editable?: boolean;
|
|
6
|
+
dashboardFilters?: DashboardFilter[];
|
|
6
7
|
onConfigChange?: (config: DashboardConfig) => void;
|
|
7
8
|
onPortletRefresh?: (portletId: string) => void;
|
|
8
9
|
onSave?: (config: DashboardConfig) => Promise<void> | void;
|
|
9
10
|
colorPalette?: ColorPalette;
|
|
11
|
+
schema?: CubeMeta | null;
|
|
12
|
+
onDashboardFiltersChange?: (filters: DashboardFilter[]) => void;
|
|
10
13
|
}
|
|
11
|
-
export default function DashboardGrid({ config, editable, onConfigChange, onPortletRefresh, onSave, colorPalette }: DashboardGridProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export default function DashboardGrid({ config, editable, dashboardFilters, onConfigChange, onPortletRefresh, onSave, colorPalette, schema, onDashboardFiltersChange }: DashboardGridProps): import("react/jsx-runtime").JSX.Element;
|
|
12
15
|
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DashboardFilter } from '../types';
|
|
2
|
+
interface PortletFilterConfigModalProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
dashboardFilters: DashboardFilter[];
|
|
6
|
+
currentMapping: string[];
|
|
7
|
+
onSave: (mapping: string[]) => void;
|
|
8
|
+
portletTitle: string;
|
|
9
|
+
}
|
|
10
|
+
export default function PortletFilterConfigModal({ isOpen, onClose, dashboardFilters, currentMapping, onSave, portletTitle }: PortletFilterConfigModalProps): import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as t, A as s, c as o, D as r, M as d, P as l, b as i, Q as n } from "./chunks/components-
|
|
2
|
-
import { c as P, E as b, y as c, x as u, w as D, z as h } from "./chunks/charts-
|
|
1
|
+
import { a as t, A as s, c as o, D as r, M as d, P as l, b as i, Q as n } from "./chunks/components-BI1Xc4js.js";
|
|
2
|
+
import { c as P, E as b, y as c, x as u, w as D, z as h } from "./chunks/charts-DgmZAw3A.js";
|
|
3
3
|
export {
|
|
4
4
|
t as AnalyticsDashboard,
|
|
5
5
|
s as AnalyticsPortlet,
|
package/dist/client/hooks.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { useState as h, useRef as
|
|
2
|
-
import { u as
|
|
3
|
-
import { a as
|
|
4
|
-
function
|
|
5
|
-
const { cubeApi: i } =
|
|
1
|
+
import { useState as h, useRef as V, useEffect as C, useCallback as b } from "react";
|
|
2
|
+
import { u as x } from "./chunks/providers-ChcxFwXu.js";
|
|
3
|
+
import { a as D } from "./chunks/providers-ChcxFwXu.js";
|
|
4
|
+
function O(r, t = {}) {
|
|
5
|
+
const { cubeApi: i } = x(), [o, c] = h({
|
|
6
6
|
resultSet: null,
|
|
7
7
|
isLoading: !1,
|
|
8
8
|
error: null,
|
|
9
9
|
queryId: null
|
|
10
|
-
}), a =
|
|
10
|
+
}), a = V("");
|
|
11
11
|
return C(() => {
|
|
12
12
|
if (!r || t.skip)
|
|
13
13
|
return;
|
|
@@ -21,7 +21,7 @@ function L(r, t = {}) {
|
|
|
21
21
|
isLoading: !0,
|
|
22
22
|
error: null,
|
|
23
23
|
queryId: u
|
|
24
|
-
})), i.load(r).then((n) => {
|
|
24
|
+
})), console.log("useCubeQuery - Sending query to API:", JSON.stringify(r, null, 2)), i.load(r).then((n) => {
|
|
25
25
|
c((s) => s.queryId === u ? {
|
|
26
26
|
resultSet: n,
|
|
27
27
|
isLoading: !1,
|
|
@@ -39,22 +39,22 @@ function L(r, t = {}) {
|
|
|
39
39
|
}, [r, i, t.skip, t.resetResultSetOnChange]), o;
|
|
40
40
|
}
|
|
41
41
|
function m(r, t = !0) {
|
|
42
|
-
const [i, o] = h([]), [c, a] = h(null), f =
|
|
42
|
+
const [i, o] = h([]), [c, a] = h(null), f = V(null), u = V(""), {
|
|
43
43
|
resultSet: n,
|
|
44
44
|
isLoading: s,
|
|
45
45
|
error: g,
|
|
46
46
|
queryId: y
|
|
47
|
-
} =
|
|
47
|
+
} = O(c, {
|
|
48
48
|
skip: !c || !t,
|
|
49
49
|
resetResultSetOnChange: !0
|
|
50
50
|
// Clear old results when query changes
|
|
51
|
-
}), q =
|
|
51
|
+
}), q = b((e) => {
|
|
52
52
|
if (!e || !r)
|
|
53
53
|
return [];
|
|
54
54
|
try {
|
|
55
55
|
const S = e.tablePivot(), l = /* @__PURE__ */ new Set();
|
|
56
|
-
return S.forEach((
|
|
57
|
-
const d =
|
|
56
|
+
return S.forEach((R) => {
|
|
57
|
+
const d = R[r];
|
|
58
58
|
d != null && d !== "" && l.add(d);
|
|
59
59
|
}), Array.from(l);
|
|
60
60
|
} catch (S) {
|
|
@@ -73,7 +73,7 @@ function m(r, t = !0) {
|
|
|
73
73
|
}, [n, s, g, y, q]), C(() => {
|
|
74
74
|
(!r || !t) && (o([]), a(null), f.current = null, u.current = "");
|
|
75
75
|
}, [r, t]);
|
|
76
|
-
const E =
|
|
76
|
+
const E = b(() => {
|
|
77
77
|
if (r) {
|
|
78
78
|
u.current = "";
|
|
79
79
|
try {
|
|
@@ -87,7 +87,7 @@ function m(r, t = !0) {
|
|
|
87
87
|
console.error("Error creating query:", e);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
}, [r]),
|
|
90
|
+
}, [r]), I = b((e, S = !1) => {
|
|
91
91
|
if (r && !(!S && e === u.current)) {
|
|
92
92
|
u.current = e;
|
|
93
93
|
try {
|
|
@@ -111,7 +111,7 @@ function m(r, t = !0) {
|
|
|
111
111
|
loading: s,
|
|
112
112
|
error: g ? g instanceof Error ? g.message : String(g) : null,
|
|
113
113
|
refetch: E,
|
|
114
|
-
searchValues:
|
|
114
|
+
searchValues: I
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
function p(r, t) {
|
|
@@ -126,8 +126,8 @@ function p(r, t) {
|
|
|
126
126
|
}, [r, t]), i;
|
|
127
127
|
}
|
|
128
128
|
export {
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
D as useCubeMeta,
|
|
130
|
+
O as useCubeQuery,
|
|
131
131
|
p as useDebounce,
|
|
132
132
|
m as useFilterValues
|
|
133
133
|
};
|
package/dist/client/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../src/client/hooks/useCubeQuery.ts","../../src/client/hooks/useFilterValues.ts","../../src/client/hooks/useDebounce.ts"],"sourcesContent":["/**\n * React hook for executing Cube queries\n * Replaces @cubejs-client/react useCubeQuery\n */\n\nimport { useState, useEffect, useRef } from 'react'\nimport { useCubeContext } from '../providers/CubeProvider'\nimport type { CubeQuery, CubeQueryOptions, CubeResultSet } from '../types'\n\ninterface UseCubeQueryResult {\n resultSet: CubeResultSet | null\n isLoading: boolean\n error: Error | null\n queryId: string | null\n}\n\nexport function useCubeQuery(\n query: CubeQuery | null, \n options: CubeQueryOptions = {}\n): UseCubeQueryResult {\n const { cubeApi } = useCubeContext()\n \n // Use a single state object to ensure atomic updates\n const [state, setState] = useState<UseCubeQueryResult>({\n resultSet: null,\n isLoading: false,\n error: null,\n queryId: null\n })\n \n // Track the last query to avoid unnecessary re-fetches\n const lastQueryRef = useRef<string>('')\n \n useEffect(() => {\n // Skip if query is null or skip option is true\n if (!query || options.skip) {\n return\n }\n\n // Create a stable query string for comparison\n const queryString = JSON.stringify(query)\n \n // Skip if query hasn't changed (unless resetResultSetOnChange is true)\n if (queryString === lastQueryRef.current && !options.resetResultSetOnChange) {\n return\n }\n\n lastQueryRef.current = queryString\n \n // Create a unique ID for this query execution\n const queryId = `${Date.now()}_${Math.random().toString(36).substring(7)}`\n\n // Update state atomically with new query ID and loading state\n setState(prevState => ({\n resultSet: options.resetResultSetOnChange ? null : prevState.resultSet,\n isLoading: true,\n error: null,\n queryId\n }))\n\n cubeApi.load(query)\n .then((result) => {\n setState(prevState => {\n // Only update if this is still the current query\n if (prevState.queryId === queryId) {\n return {\n resultSet: result,\n isLoading: false,\n error: null,\n queryId\n }\n }\n return prevState\n })\n })\n .catch((err) => {\n setState(prevState => {\n // Only update if this is still the current query\n if (prevState.queryId === queryId) {\n return {\n resultSet: null,\n isLoading: false,\n error: err instanceof Error ? err : new Error(String(err)),\n queryId\n }\n }\n return prevState\n })\n })\n }, [query, cubeApi, options.skip, options.resetResultSetOnChange])\n\n return state\n}","/**\n * Hook for fetching distinct field values for filter dropdowns\n * Uses the /load API to get actual data values\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport { useCubeQuery } from '../hooks/useCubeQuery'\nimport type { CubeQuery } from '../types'\n\ninterface UseFilterValuesResult {\n values: any[]\n loading: boolean\n error: string | null\n refetch: () => void\n searchValues: (searchTerm: string, force?: boolean) => void\n}\n\n/**\n * Custom hook to fetch distinct values for a field\n */\nexport function useFilterValues(\n fieldName: string | null, \n enabled: boolean = true\n): UseFilterValuesResult {\n const [values, setValues] = useState<any[]>([])\n const [currentQuery, setCurrentQuery] = useState<CubeQuery | null>(null)\n const lastProcessedQueryId = useRef<string | null>(null)\n const lastSearchTerm = useRef<string>('')\n \n // Use cube query hook for actual data fetching\n const { \n resultSet, \n isLoading,\n error: queryError,\n queryId\n } = useCubeQuery(currentQuery, {\n skip: !currentQuery || !enabled,\n resetResultSetOnChange: true // Clear old results when query changes\n })\n \n // Extract unique values from result set\n const extractValuesFromResultSet = useCallback((rs: any): any[] => {\n if (!rs || !fieldName) {\n return []\n }\n \n try {\n const data = rs.tablePivot()\n \n const uniqueValues = new Set<any>()\n \n data.forEach((row: any) => {\n const value = row[fieldName]\n if (value !== null && value !== undefined && value !== '') {\n uniqueValues.add(value)\n }\n })\n \n // Convert to array - already sorted by query\n const sortedValues = Array.from(uniqueValues)\n \n return sortedValues\n } catch (err) {\n console.error('Error extracting values from result set:', err)\n return []\n }\n }, [fieldName])\n \n // Process results only when we have a new matching query result\n useEffect(() => {\n // Skip if no query ID\n if (!queryId) {\n return\n }\n \n // Skip if we've already processed this query\n if (queryId === lastProcessedQueryId.current) {\n return\n }\n \n // Skip if still loading\n if (isLoading) {\n return\n }\n \n // Mark as processed\n lastProcessedQueryId.current = queryId\n \n if (queryError) {\n setValues([])\n } else if (resultSet) {\n const extractedValues = extractValuesFromResultSet(resultSet)\n setValues(extractedValues)\n } else {\n setValues([])\n }\n }, [resultSet, isLoading, queryError, queryId, extractValuesFromResultSet])\n \n // Reset values when fieldName becomes null or enabled changes\n useEffect(() => {\n if (!fieldName || !enabled) {\n setValues([])\n setCurrentQuery(null)\n lastProcessedQueryId.current = null\n lastSearchTerm.current = ''\n }\n }, [fieldName, enabled])\n \n // Refetch function\n const refetch = useCallback(() => {\n if (!fieldName) return\n \n lastSearchTerm.current = ''\n \n try {\n const query: CubeQuery = {\n dimensions: [fieldName], \n limit: 25,\n order: { [fieldName]: 'asc' }\n }\n setCurrentQuery(query)\n } catch (err) {\n console.error('Error creating query:', err)\n }\n }, [fieldName])\n\n // Search function for server-side filtering\n const searchValues = useCallback((searchTerm: string, force: boolean = false) => {\n if (!fieldName) {\n return\n }\n \n // Don't create a new query if the search term hasn't changed (unless forced)\n if (!force && searchTerm === lastSearchTerm.current) {\n return\n }\n \n lastSearchTerm.current = searchTerm\n \n try {\n // Create query inline to avoid dependency issues\n const query: CubeQuery = {\n dimensions: [fieldName], \n limit: 25,\n order: { [fieldName]: 'asc' }\n }\n \n if (searchTerm && searchTerm.trim()) {\n query.filters = [{\n member: fieldName,\n operator: 'contains',\n values: [searchTerm.trim()]\n }]\n }\n \n setCurrentQuery(query)\n } catch (err) {\n console.error('Error creating search query:', err)\n }\n }, [fieldName])\n \n return {\n values,\n loading: isLoading,\n error: queryError ? (queryError instanceof Error ? queryError.message : String(queryError)) : null,\n refetch,\n searchValues\n }\n}","/**\n * Custom hook for debouncing values\n * Delays updating the value until after the specified delay has passed\n * since the last change\n */\n\nimport { useState, useEffect } from 'react'\n\n/**\n * Debounces a value by the specified delay\n * @param value The value to debounce\n * @param delay The delay in milliseconds\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n // Set up a timer to update the debounced value after the delay\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n // Clean up the timer if the value changes before the delay\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}"],"names":["useCubeQuery","query","options","cubeApi","useCubeContext","state","setState","useState","lastQueryRef","useRef","useEffect","queryString","queryId","prevState","result","err","useFilterValues","fieldName","enabled","values","setValues","currentQuery","setCurrentQuery","lastProcessedQueryId","lastSearchTerm","resultSet","isLoading","queryError","extractValuesFromResultSet","useCallback","rs","data","uniqueValues","row","value","extractedValues","refetch","searchValues","searchTerm","force","useDebounce","delay","debouncedValue","setDebouncedValue","handler"],"mappings":";;;AAgBO,SAASA,EACdC,GACAC,IAA4B,IACR;AACpB,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAGd,CAACC,GAAOC,CAAQ,IAAIC,EAA6B;AAAA,IACrD,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,CACV,GAGKC,IAAeC,EAAe,EAAE;AAEtC,SAAAC,EAAU,MAAM;AAEd,QAAI,CAACT,KAASC,EAAQ;AACpB;AAIF,UAAMS,IAAc,KAAK,UAAUV,CAAK;AAGxC,QAAIU,MAAgBH,EAAa,WAAW,CAACN,EAAQ;AACnD;AAGF,IAAAM,EAAa,UAAUG;AAGvB,UAAMC,IAAU,GAAG,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAGxE,IAAAN,EAAS,CAAAO,OAAc;AAAA,MACrB,WAAWX,EAAQ,yBAAyB,OAAOW,EAAU;AAAA,MAC7D,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAAD;AAAA,IAAA,EACA,GAEFT,EAAQ,KAAKF,CAAK,EACf,KAAK,CAACa,MAAW;AAChB,MAAAR,EAAS,CAAAO,MAEHA,EAAU,YAAYD,IACjB;AAAA,QACL,WAAWE;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAAF;AAAA,MAAA,IAGGC,CACR;AAAA,IACH,CAAC,EACA,MAAM,CAACE,MAAQ;AACd,MAAAT,EAAS,CAAAO,MAEHA,EAAU,YAAYD,IACjB;AAAA,QACL,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAOG,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAAA,QACzD,SAAAH;AAAA,MAAA,IAGGC,CACR;AAAA,IACH,CAAC;AAAA,EACL,GAAG,CAACZ,GAAOE,GAASD,EAAQ,MAAMA,EAAQ,sBAAsB,CAAC,GAE1DG;AACT;ACxEO,SAASW,EACdC,GACAC,IAAmB,IACI;AACvB,QAAM,CAACC,GAAQC,CAAS,IAAIb,EAAgB,CAAA,CAAE,GACxC,CAACc,GAAcC,CAAe,IAAIf,EAA2B,IAAI,GACjEgB,IAAuBd,EAAsB,IAAI,GACjDe,IAAiBf,EAAe,EAAE,GAGlC;AAAA,IACJ,WAAAgB;AAAA,IACA,WAAAC;AAAA,IACA,OAAOC;AAAA,IACP,SAAAf;AAAA,EAAA,IACEZ,EAAaqB,GAAc;AAAA,IAC7B,MAAM,CAACA,KAAgB,CAACH;AAAA,IACxB,wBAAwB;AAAA;AAAA,EAAA,CACzB,GAGKU,IAA6BC,EAAY,CAACC,MAAmB;AACjE,QAAI,CAACA,KAAM,CAACb;AACV,aAAO,CAAA;AAGT,QAAI;AACF,YAAMc,IAAOD,EAAG,WAAA,GAEVE,wBAAmB,IAAA;AAEzB,aAAAD,EAAK,QAAQ,CAACE,MAAa;AACzB,cAAMC,IAAQD,EAAIhB,CAAS;AAC3B,QAAIiB,KAAU,QAA+BA,MAAU,MACrDF,EAAa,IAAIE,CAAK;AAAA,MAE1B,CAAC,GAGoB,MAAM,KAAKF,CAAY;AAAA,IAG9C,SAASjB,GAAK;AACZ,qBAAQ,MAAM,4CAA4CA,CAAG,GACtD,CAAA;AAAA,IACT;AAAA,EACF,GAAG,CAACE,CAAS,CAAC;AAGd,EAAAP,EAAU,MAAM;AAEd,QAAKE,KAKDA,MAAYW,EAAqB,WAKjC,CAAAG;AAOJ,UAFAH,EAAqB,UAAUX,GAE3Be;AACF,QAAAP,EAAU,CAAA,CAAE;AAAA,eACHK,GAAW;AACpB,cAAMU,IAAkBP,EAA2BH,CAAS;AAC5D,QAAAL,EAAUe,CAAe;AAAA,MAC3B;AACE,QAAAf,EAAU,CAAA,CAAE;AAAA,EAEhB,GAAG,CAACK,GAAWC,GAAWC,GAAYf,GAASgB,CAA0B,CAAC,GAG1ElB,EAAU,MAAM;AACd,KAAI,CAACO,KAAa,CAACC,OACjBE,EAAU,CAAA,CAAE,GACZE,EAAgB,IAAI,GACpBC,EAAqB,UAAU,MAC/BC,EAAe,UAAU;AAAA,EAE7B,GAAG,CAACP,GAAWC,CAAO,CAAC;AAGvB,QAAMkB,IAAUP,EAAY,MAAM;AAChC,QAAKZ,GAEL;AAAA,MAAAO,EAAe,UAAU;AAEzB,UAAI;AACF,cAAMvB,IAAmB;AAAA,UACvB,YAAY,CAACgB,CAAS;AAAA,UACtB,OAAO;AAAA,UACP,OAAO,EAAE,CAACA,CAAS,GAAG,MAAA;AAAA,QAAM;AAE9B,QAAAK,EAAgBrB,CAAK;AAAA,MACvB,SAASc,GAAK;AACZ,gBAAQ,MAAM,yBAAyBA,CAAG;AAAA,MAC5C;AAAA;AAAA,EACF,GAAG,CAACE,CAAS,CAAC,GAGRoB,IAAeR,EAAY,CAACS,GAAoBC,IAAiB,OAAU;AAC/E,QAAKtB,KAKD,GAACsB,KAASD,MAAed,EAAe,UAI5C;AAAA,MAAAA,EAAe,UAAUc;AAEzB,UAAI;AAEF,cAAMrC,IAAmB;AAAA,UACvB,YAAY,CAACgB,CAAS;AAAA,UACtB,OAAO;AAAA,UACP,OAAO,EAAE,CAACA,CAAS,GAAG,MAAA;AAAA,QAAM;AAG9B,QAAIqB,KAAcA,EAAW,WAC3BrC,EAAM,UAAU,CAAC;AAAA,UACf,QAAQgB;AAAA,UACR,UAAU;AAAA,UACV,QAAQ,CAACqB,EAAW,KAAA,CAAM;AAAA,QAAA,CAC3B,IAGHhB,EAAgBrB,CAAK;AAAA,MACvB,SAASc,GAAK;AACZ,gBAAQ,MAAM,gCAAgCA,CAAG;AAAA,MACnD;AAAA;AAAA,EACF,GAAG,CAACE,CAAS,CAAC;AAEd,SAAO;AAAA,IACL,QAAAE;AAAA,IACA,SAASO;AAAA,IACT,OAAOC,IAAcA,aAAsB,QAAQA,EAAW,UAAU,OAAOA,CAAU,IAAK;AAAA,IAC9F,SAAAS;AAAA,IACA,cAAAC;AAAA,EAAA;AAEJ;AC1JO,SAASG,EAAeN,GAAUO,GAAkB;AACzD,QAAM,CAACC,GAAgBC,CAAiB,IAAIpC,EAAS2B,CAAK;AAE1D,SAAAxB,EAAU,MAAM;AAEd,UAAMkC,IAAU,WAAW,MAAM;AAC/B,MAAAD,EAAkBT,CAAK;AAAA,IACzB,GAAGO,CAAK;AAGR,WAAO,MAAM;AACX,mBAAaG,CAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAACV,GAAOO,CAAK,CAAC,GAEVC;AACT;"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../src/client/hooks/useCubeQuery.ts","../../src/client/hooks/useFilterValues.ts","../../src/client/hooks/useDebounce.ts"],"sourcesContent":["/**\n * React hook for executing Cube queries\n * Replaces @cubejs-client/react useCubeQuery\n */\n\nimport { useState, useEffect, useRef } from 'react'\nimport { useCubeContext } from '../providers/CubeProvider'\nimport type { CubeQuery, CubeQueryOptions, CubeResultSet } from '../types'\n\ninterface UseCubeQueryResult {\n resultSet: CubeResultSet | null\n isLoading: boolean\n error: Error | null\n queryId: string | null\n}\n\nexport function useCubeQuery(\n query: CubeQuery | null, \n options: CubeQueryOptions = {}\n): UseCubeQueryResult {\n const { cubeApi } = useCubeContext()\n \n // Use a single state object to ensure atomic updates\n const [state, setState] = useState<UseCubeQueryResult>({\n resultSet: null,\n isLoading: false,\n error: null,\n queryId: null\n })\n \n // Track the last query to avoid unnecessary re-fetches\n const lastQueryRef = useRef<string>('')\n \n useEffect(() => {\n // Skip if query is null or skip option is true\n if (!query || options.skip) {\n return\n }\n\n // Create a stable query string for comparison\n const queryString = JSON.stringify(query)\n \n // Skip if query hasn't changed (unless resetResultSetOnChange is true)\n if (queryString === lastQueryRef.current && !options.resetResultSetOnChange) {\n return\n }\n\n lastQueryRef.current = queryString\n \n // Create a unique ID for this query execution\n const queryId = `${Date.now()}_${Math.random().toString(36).substring(7)}`\n\n // Update state atomically with new query ID and loading state\n setState(prevState => ({\n resultSet: options.resetResultSetOnChange ? null : prevState.resultSet,\n isLoading: true,\n error: null,\n queryId\n }))\n\n console.log('useCubeQuery - Sending query to API:', JSON.stringify(query, null, 2))\n\n cubeApi.load(query)\n .then((result) => {\n setState(prevState => {\n // Only update if this is still the current query\n if (prevState.queryId === queryId) {\n return {\n resultSet: result,\n isLoading: false,\n error: null,\n queryId\n }\n }\n return prevState\n })\n })\n .catch((err) => {\n setState(prevState => {\n // Only update if this is still the current query\n if (prevState.queryId === queryId) {\n return {\n resultSet: null,\n isLoading: false,\n error: err instanceof Error ? err : new Error(String(err)),\n queryId\n }\n }\n return prevState\n })\n })\n }, [query, cubeApi, options.skip, options.resetResultSetOnChange])\n\n return state\n}","/**\n * Hook for fetching distinct field values for filter dropdowns\n * Uses the /load API to get actual data values\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport { useCubeQuery } from '../hooks/useCubeQuery'\nimport type { CubeQuery } from '../types'\n\ninterface UseFilterValuesResult {\n values: any[]\n loading: boolean\n error: string | null\n refetch: () => void\n searchValues: (searchTerm: string, force?: boolean) => void\n}\n\n/**\n * Custom hook to fetch distinct values for a field\n */\nexport function useFilterValues(\n fieldName: string | null, \n enabled: boolean = true\n): UseFilterValuesResult {\n const [values, setValues] = useState<any[]>([])\n const [currentQuery, setCurrentQuery] = useState<CubeQuery | null>(null)\n const lastProcessedQueryId = useRef<string | null>(null)\n const lastSearchTerm = useRef<string>('')\n \n // Use cube query hook for actual data fetching\n const { \n resultSet, \n isLoading,\n error: queryError,\n queryId\n } = useCubeQuery(currentQuery, {\n skip: !currentQuery || !enabled,\n resetResultSetOnChange: true // Clear old results when query changes\n })\n \n // Extract unique values from result set\n const extractValuesFromResultSet = useCallback((rs: any): any[] => {\n if (!rs || !fieldName) {\n return []\n }\n \n try {\n const data = rs.tablePivot()\n \n const uniqueValues = new Set<any>()\n \n data.forEach((row: any) => {\n const value = row[fieldName]\n if (value !== null && value !== undefined && value !== '') {\n uniqueValues.add(value)\n }\n })\n \n // Convert to array - already sorted by query\n const sortedValues = Array.from(uniqueValues)\n \n return sortedValues\n } catch (err) {\n console.error('Error extracting values from result set:', err)\n return []\n }\n }, [fieldName])\n \n // Process results only when we have a new matching query result\n useEffect(() => {\n // Skip if no query ID\n if (!queryId) {\n return\n }\n \n // Skip if we've already processed this query\n if (queryId === lastProcessedQueryId.current) {\n return\n }\n \n // Skip if still loading\n if (isLoading) {\n return\n }\n \n // Mark as processed\n lastProcessedQueryId.current = queryId\n \n if (queryError) {\n setValues([])\n } else if (resultSet) {\n const extractedValues = extractValuesFromResultSet(resultSet)\n setValues(extractedValues)\n } else {\n setValues([])\n }\n }, [resultSet, isLoading, queryError, queryId, extractValuesFromResultSet])\n \n // Reset values when fieldName becomes null or enabled changes\n useEffect(() => {\n if (!fieldName || !enabled) {\n setValues([])\n setCurrentQuery(null)\n lastProcessedQueryId.current = null\n lastSearchTerm.current = ''\n }\n }, [fieldName, enabled])\n \n // Refetch function\n const refetch = useCallback(() => {\n if (!fieldName) return\n \n lastSearchTerm.current = ''\n \n try {\n const query: CubeQuery = {\n dimensions: [fieldName], \n limit: 25,\n order: { [fieldName]: 'asc' }\n }\n setCurrentQuery(query)\n } catch (err) {\n console.error('Error creating query:', err)\n }\n }, [fieldName])\n\n // Search function for server-side filtering\n const searchValues = useCallback((searchTerm: string, force: boolean = false) => {\n if (!fieldName) {\n return\n }\n \n // Don't create a new query if the search term hasn't changed (unless forced)\n if (!force && searchTerm === lastSearchTerm.current) {\n return\n }\n \n lastSearchTerm.current = searchTerm\n \n try {\n // Create query inline to avoid dependency issues\n const query: CubeQuery = {\n dimensions: [fieldName], \n limit: 25,\n order: { [fieldName]: 'asc' }\n }\n \n if (searchTerm && searchTerm.trim()) {\n query.filters = [{\n member: fieldName,\n operator: 'contains',\n values: [searchTerm.trim()]\n }]\n }\n \n setCurrentQuery(query)\n } catch (err) {\n console.error('Error creating search query:', err)\n }\n }, [fieldName])\n \n return {\n values,\n loading: isLoading,\n error: queryError ? (queryError instanceof Error ? queryError.message : String(queryError)) : null,\n refetch,\n searchValues\n }\n}","/**\n * Custom hook for debouncing values\n * Delays updating the value until after the specified delay has passed\n * since the last change\n */\n\nimport { useState, useEffect } from 'react'\n\n/**\n * Debounces a value by the specified delay\n * @param value The value to debounce\n * @param delay The delay in milliseconds\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n // Set up a timer to update the debounced value after the delay\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n // Clean up the timer if the value changes before the delay\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}"],"names":["useCubeQuery","query","options","cubeApi","useCubeContext","state","setState","useState","lastQueryRef","useRef","useEffect","queryString","queryId","prevState","result","err","useFilterValues","fieldName","enabled","values","setValues","currentQuery","setCurrentQuery","lastProcessedQueryId","lastSearchTerm","resultSet","isLoading","queryError","extractValuesFromResultSet","useCallback","rs","data","uniqueValues","row","value","extractedValues","refetch","searchValues","searchTerm","force","useDebounce","delay","debouncedValue","setDebouncedValue","handler"],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as r, A as s, c as t, D as h, M as o, P as C, b as c, Q as d, T as i, d as l, e as T, g as b, i as m, r as R, f as u, s as D, w as n } from "./chunks/components-
|
|
2
|
-
import { C as f, c as p, u as M } from "./chunks/providers-
|
|
1
|
+
import { a as r, A as s, c as t, D as h, M as o, P as C, b as c, Q as d, T as i, d as l, e as T, g as b, i as m, r as R, f as u, s as D, w as n } from "./chunks/components-BI1Xc4js.js";
|
|
2
|
+
import { C as f, c as p, u as M } from "./chunks/providers-ChcxFwXu.js";
|
|
3
3
|
import { useCubeQuery as E } from "./hooks.js";
|
|
4
|
-
import { D as A, A as g, B, L as S, P as L, R as Q, a as w, S as V, T as k, c as v, f as G } from "./chunks/charts-
|
|
4
|
+
import { D as A, A as g, B, L as S, P as L, R as Q, a as w, S as V, T as k, c as v, f as G } from "./chunks/charts-DgmZAw3A.js";
|
|
5
5
|
export {
|
|
6
6
|
r as AnalyticsDashboard,
|
|
7
7
|
s as AnalyticsPortlet,
|
package/dist/client/providers.js
CHANGED