@contractspec/example.analytics-dashboard 1.46.0 → 1.47.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/dist/dashboard/dashboard.operation.d.ts +5 -5
- package/dist/dashboard/dashboard.presentation.d.ts +4 -4
- package/dist/dashboard/dashboard.presentation.d.ts.map +1 -1
- package/dist/dashboard/dashboard.presentation.js +7 -7
- package/dist/dashboard/dashboard.presentation.js.map +1 -1
- package/dist/dashboard/dashboard.test-spec.d.ts +10 -0
- package/dist/dashboard/dashboard.test-spec.d.ts.map +1 -0
- package/dist/dashboard/dashboard.test-spec.js +233 -0
- package/dist/dashboard/dashboard.test-spec.js.map +1 -0
- package/dist/dashboard.feature.d.ts +11 -2
- package/dist/dashboard.feature.d.ts.map +1 -1
- package/dist/dashboard.feature.js +13 -2
- package/dist/dashboard.feature.js.map +1 -1
- package/dist/events.d.ts +1 -1
- package/dist/events.js +1 -1
- package/dist/example.d.ts +2 -2
- package/dist/example.d.ts.map +1 -1
- package/dist/example.js +4 -2
- package/dist/example.js.map +1 -1
- package/dist/handlers/analytics.handlers.d.ts +122 -0
- package/dist/handlers/analytics.handlers.d.ts.map +1 -0
- package/dist/handlers/analytics.handlers.js +310 -0
- package/dist/handlers/analytics.handlers.js.map +1 -0
- package/dist/handlers/index.d.ts +2 -0
- package/dist/handlers/index.js +3 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +6 -1
- package/dist/query/query.operation.d.ts +3 -3
- package/dist/query/query.operation.d.ts.map +1 -1
- package/dist/query/query.presentation.d.ts +3 -3
- package/dist/query/query.presentation.d.ts.map +1 -1
- package/dist/query/query.presentation.js +5 -5
- package/dist/query/query.presentation.js.map +1 -1
- package/dist/query/query.test-spec.d.ts +8 -0
- package/dist/query/query.test-spec.d.ts.map +1 -0
- package/dist/query/query.test-spec.js +124 -0
- package/dist/query/query.test-spec.js.map +1 -0
- package/dist/query-engine/index.d.ts.map +1 -1
- package/dist/query-engine/index.js.map +1 -1
- package/dist/seeders/index.d.ts +10 -0
- package/dist/seeders/index.d.ts.map +1 -0
- package/dist/seeders/index.js +19 -0
- package/dist/seeders/index.js.map +1 -0
- package/dist/ui/AnalyticsDashboard.d.ts +7 -0
- package/dist/ui/AnalyticsDashboard.d.ts.map +1 -0
- package/dist/ui/AnalyticsDashboard.js +265 -0
- package/dist/ui/AnalyticsDashboard.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +2 -0
- package/dist/ui/hooks/index.js +5 -0
- package/dist/ui/hooks/useAnalyticsData.d.ts +23 -0
- package/dist/ui/hooks/useAnalyticsData.d.ts.map +1 -0
- package/dist/ui/hooks/useAnalyticsData.js +73 -0
- package/dist/ui/hooks/useAnalyticsData.js.map +1 -0
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +6 -0
- package/dist/ui/renderers/analytics.markdown.d.ts +28 -0
- package/dist/ui/renderers/analytics.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/analytics.markdown.js +264 -0
- package/dist/ui/renderers/analytics.markdown.js.map +1 -0
- package/dist/ui/renderers/index.d.ts +2 -0
- package/dist/ui/renderers/index.js +3 -0
- package/package.json +24 -8
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/hooks/useAnalyticsData.ts
|
|
7
|
+
function useAnalyticsData(projectId = "local-project") {
|
|
8
|
+
const { handlers } = useTemplateRuntime();
|
|
9
|
+
const analytics = handlers.analytics;
|
|
10
|
+
const [dashboards, setDashboards] = useState([]);
|
|
11
|
+
const [queries, setQueries] = useState([]);
|
|
12
|
+
const [selectedDashboard, setSelectedDashboard] = useState(null);
|
|
13
|
+
const [widgets, setWidgets] = useState([]);
|
|
14
|
+
const [loading, setLoading] = useState(true);
|
|
15
|
+
const [error, setError] = useState(null);
|
|
16
|
+
const fetchData = useCallback(async () => {
|
|
17
|
+
try {
|
|
18
|
+
setLoading(true);
|
|
19
|
+
setError(null);
|
|
20
|
+
const [dashResult, queryResult] = await Promise.all([analytics.listDashboards({
|
|
21
|
+
projectId,
|
|
22
|
+
limit: 100
|
|
23
|
+
}), analytics.listQueries({
|
|
24
|
+
projectId,
|
|
25
|
+
limit: 100
|
|
26
|
+
})]);
|
|
27
|
+
setDashboards(dashResult.dashboards);
|
|
28
|
+
setQueries(queryResult.queries);
|
|
29
|
+
if (dashResult.dashboards.length > 0 && !selectedDashboard) {
|
|
30
|
+
const first = dashResult.dashboards[0];
|
|
31
|
+
if (first) {
|
|
32
|
+
setSelectedDashboard(first);
|
|
33
|
+
setWidgets(await analytics.getWidgets(first.id));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch (err) {
|
|
37
|
+
setError(err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to load analytics"));
|
|
38
|
+
} finally {
|
|
39
|
+
setLoading(false);
|
|
40
|
+
}
|
|
41
|
+
}, [
|
|
42
|
+
analytics,
|
|
43
|
+
projectId,
|
|
44
|
+
selectedDashboard
|
|
45
|
+
]);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
fetchData();
|
|
48
|
+
}, [fetchData]);
|
|
49
|
+
const selectDashboard = useCallback(async (dashboard) => {
|
|
50
|
+
setSelectedDashboard(dashboard);
|
|
51
|
+
setWidgets(await analytics.getWidgets(dashboard.id));
|
|
52
|
+
}, [analytics]);
|
|
53
|
+
return {
|
|
54
|
+
dashboards,
|
|
55
|
+
queries,
|
|
56
|
+
selectedDashboard,
|
|
57
|
+
widgets,
|
|
58
|
+
loading,
|
|
59
|
+
error,
|
|
60
|
+
stats: {
|
|
61
|
+
totalDashboards: dashboards.length,
|
|
62
|
+
publishedDashboards: dashboards.filter((d) => d.status === "PUBLISHED").length,
|
|
63
|
+
totalQueries: queries.length,
|
|
64
|
+
sharedQueries: queries.filter((q) => q.isShared).length
|
|
65
|
+
},
|
|
66
|
+
refetch: fetchData,
|
|
67
|
+
selectDashboard
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { useAnalyticsData };
|
|
73
|
+
//# sourceMappingURL=useAnalyticsData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnalyticsData.js","names":[],"sources":["../../../src/ui/hooks/useAnalyticsData.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport type {\n AnalyticsHandlers,\n Dashboard,\n Query,\n Widget,\n} from '../../handlers/analytics.handlers';\nimport { useTemplateRuntime } from '@contractspec/lib.example-shared-ui';\n\nexport interface AnalyticsStats {\n totalDashboards: number;\n publishedDashboards: number;\n totalQueries: number;\n sharedQueries: number;\n}\n\nexport function useAnalyticsData(projectId = 'local-project') {\n const { handlers } = useTemplateRuntime<{ analytics: AnalyticsHandlers }>();\n const analytics = handlers.analytics;\n const [dashboards, setDashboards] = useState<Dashboard[]>([]);\n const [queries, setQueries] = useState<Query[]>([]);\n const [selectedDashboard, setSelectedDashboard] = useState<Dashboard | null>(\n null\n );\n const [widgets, setWidgets] = useState<Widget[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n\n const [dashResult, queryResult] = await Promise.all([\n analytics.listDashboards({ projectId, limit: 100 }),\n analytics.listQueries({ projectId, limit: 100 }),\n ]);\n\n setDashboards(dashResult.dashboards);\n setQueries(queryResult.queries);\n\n // Select first dashboard if available\n if (dashResult.dashboards.length > 0 && !selectedDashboard) {\n const first = dashResult.dashboards[0];\n if (first) {\n setSelectedDashboard(first);\n const dashboardWidgets = await analytics.getWidgets(first.id);\n setWidgets(dashboardWidgets);\n }\n }\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to load analytics')\n );\n } finally {\n setLoading(false);\n }\n }, [analytics, projectId, selectedDashboard]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n const selectDashboard = useCallback(\n async (dashboard: Dashboard) => {\n setSelectedDashboard(dashboard);\n const dashboardWidgets = await analytics.getWidgets(dashboard.id);\n setWidgets(dashboardWidgets);\n },\n [analytics]\n );\n\n const stats: AnalyticsStats = {\n totalDashboards: dashboards.length,\n publishedDashboards: dashboards.filter((d) => d.status === 'PUBLISHED')\n .length,\n totalQueries: queries.length,\n sharedQueries: queries.filter((q) => q.isShared).length,\n };\n\n return {\n dashboards,\n queries,\n selectedDashboard,\n widgets,\n loading,\n error,\n stats,\n refetch: fetchData,\n selectDashboard,\n };\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,iBAAiB,YAAY,iBAAiB;CAC5D,MAAM,EAAE,aAAa,oBAAsD;CAC3E,MAAM,YAAY,SAAS;CAC3B,MAAM,CAAC,YAAY,iBAAiB,SAAsB,EAAE,CAAC;CAC7D,MAAM,CAAC,SAAS,cAAc,SAAkB,EAAE,CAAC;CACnD,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,KACD;CACD,MAAM,CAAC,SAAS,cAAc,SAAmB,EAAE,CAAC;CACpD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAuB,KAAK;CAEtD,MAAM,YAAY,YAAY,YAAY;AACxC,MAAI;AACF,cAAW,KAAK;AAChB,YAAS,KAAK;GAEd,MAAM,CAAC,YAAY,eAAe,MAAM,QAAQ,IAAI,CAClD,UAAU,eAAe;IAAE;IAAW,OAAO;IAAK,CAAC,EACnD,UAAU,YAAY;IAAE;IAAW,OAAO;IAAK,CAAC,CACjD,CAAC;AAEF,iBAAc,WAAW,WAAW;AACpC,cAAW,YAAY,QAAQ;AAG/B,OAAI,WAAW,WAAW,SAAS,KAAK,CAAC,mBAAmB;IAC1D,MAAM,QAAQ,WAAW,WAAW;AACpC,QAAI,OAAO;AACT,0BAAqB,MAAM;AAE3B,gBADyB,MAAM,UAAU,WAAW,MAAM,GAAG,CACjC;;;WAGzB,KAAK;AACZ,YACE,eAAe,QAAQ,sBAAM,IAAI,MAAM,2BAA2B,CACnE;YACO;AACR,cAAW,MAAM;;IAElB;EAAC;EAAW;EAAW;EAAkB,CAAC;AAE7C,iBAAgB;AACd,aAAW;IACV,CAAC,UAAU,CAAC;CAEf,MAAM,kBAAkB,YACtB,OAAO,cAAyB;AAC9B,uBAAqB,UAAU;AAE/B,aADyB,MAAM,UAAU,WAAW,UAAU,GAAG,CACrC;IAE9B,CAAC,UAAU,CACZ;AAUD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,OAf4B;GAC5B,iBAAiB,WAAW;GAC5B,qBAAqB,WAAW,QAAQ,MAAM,EAAE,WAAW,YAAY,CACpE;GACH,cAAc,QAAQ;GACtB,eAAe,QAAQ,QAAQ,MAAM,EAAE,SAAS,CAAC;GAClD;EAUC,SAAS;EACT;EACD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer } from "./renderers/analytics.markdown.js";
|
|
2
|
+
import "./renderers/index.js";
|
|
3
|
+
import { AnalyticsDashboard } from "./AnalyticsDashboard.js";
|
|
4
|
+
import { AnalyticsStats, useAnalyticsData } from "./hooks/useAnalyticsData.js";
|
|
5
|
+
import "./hooks/index.js";
|
|
6
|
+
export { AnalyticsDashboard, AnalyticsStats, analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer, useAnalyticsData };
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer } from "./renderers/analytics.markdown.js";
|
|
2
|
+
import { useAnalyticsData } from "./hooks/useAnalyticsData.js";
|
|
3
|
+
import { AnalyticsDashboard } from "./AnalyticsDashboard.js";
|
|
4
|
+
import "./hooks/index.js";
|
|
5
|
+
|
|
6
|
+
export { AnalyticsDashboard, analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer, useAnalyticsData };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PresentationRenderer } from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
3
|
+
//#region src/ui/renderers/analytics.markdown.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Markdown renderer for Analytics Dashboard Overview
|
|
7
|
+
*/
|
|
8
|
+
declare const analyticsDashboardMarkdownRenderer: PresentationRenderer<{
|
|
9
|
+
mimeType: string;
|
|
10
|
+
body: string;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Markdown renderer for Dashboard List
|
|
14
|
+
*/
|
|
15
|
+
declare const dashboardListMarkdownRenderer: PresentationRenderer<{
|
|
16
|
+
mimeType: string;
|
|
17
|
+
body: string;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Markdown renderer for Query Builder
|
|
21
|
+
*/
|
|
22
|
+
declare const queryBuilderMarkdownRenderer: PresentationRenderer<{
|
|
23
|
+
mimeType: string;
|
|
24
|
+
body: string;
|
|
25
|
+
}>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer };
|
|
28
|
+
//# sourceMappingURL=analytics.markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.markdown.d.ts","names":[],"sources":["../../../src/ui/renderers/analytics.markdown.ts"],"sourcesContent":[],"mappings":";;;;AAuOA;AAmDA;;cA3Ia,oCAAoC;;;;;;;cAwFpC,+BAA+B;;;;;;;cAmD/B,8BAA8B"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
//#region src/ui/renderers/analytics.markdown.ts
|
|
2
|
+
const mockDashboards = [
|
|
3
|
+
{
|
|
4
|
+
id: "dash-1",
|
|
5
|
+
name: "Sales Overview",
|
|
6
|
+
slug: "sales-overview",
|
|
7
|
+
status: "PUBLISHED",
|
|
8
|
+
widgetCount: 8,
|
|
9
|
+
viewCount: 1250,
|
|
10
|
+
lastViewedAt: "2024-01-16T12:00:00Z"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "dash-2",
|
|
14
|
+
name: "User Engagement",
|
|
15
|
+
slug: "user-engagement",
|
|
16
|
+
status: "PUBLISHED",
|
|
17
|
+
widgetCount: 6,
|
|
18
|
+
viewCount: 890,
|
|
19
|
+
lastViewedAt: "2024-01-16T10:00:00Z"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "dash-3",
|
|
23
|
+
name: "Product Analytics",
|
|
24
|
+
slug: "product-analytics",
|
|
25
|
+
status: "PUBLISHED",
|
|
26
|
+
widgetCount: 10,
|
|
27
|
+
viewCount: 560,
|
|
28
|
+
lastViewedAt: "2024-01-15T14:00:00Z"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "dash-4",
|
|
32
|
+
name: "Finance Report",
|
|
33
|
+
slug: "finance-report",
|
|
34
|
+
status: "DRAFT",
|
|
35
|
+
widgetCount: 4,
|
|
36
|
+
viewCount: 0,
|
|
37
|
+
lastViewedAt: null
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
const mockWidgets = [
|
|
41
|
+
{
|
|
42
|
+
id: "w-1",
|
|
43
|
+
dashboardId: "dash-1",
|
|
44
|
+
name: "Total Revenue",
|
|
45
|
+
type: "METRIC",
|
|
46
|
+
value: 125e3,
|
|
47
|
+
change: 12.5
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "w-2",
|
|
51
|
+
dashboardId: "dash-1",
|
|
52
|
+
name: "Active Users",
|
|
53
|
+
type: "METRIC",
|
|
54
|
+
value: 4500,
|
|
55
|
+
change: 8.2
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "w-3",
|
|
59
|
+
dashboardId: "dash-1",
|
|
60
|
+
name: "Revenue Trend",
|
|
61
|
+
type: "LINE_CHART",
|
|
62
|
+
dataPoints: 30
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "w-4",
|
|
66
|
+
dashboardId: "dash-1",
|
|
67
|
+
name: "Top Products",
|
|
68
|
+
type: "BAR_CHART",
|
|
69
|
+
dataPoints: 10
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "w-5",
|
|
73
|
+
dashboardId: "dash-2",
|
|
74
|
+
name: "Daily Active Users",
|
|
75
|
+
type: "LINE_CHART",
|
|
76
|
+
dataPoints: 30
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: "w-6",
|
|
80
|
+
dashboardId: "dash-2",
|
|
81
|
+
name: "Session Duration",
|
|
82
|
+
type: "METRIC",
|
|
83
|
+
value: 245,
|
|
84
|
+
change: -3.1
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
const mockQueries = [
|
|
88
|
+
{
|
|
89
|
+
id: "q-1",
|
|
90
|
+
name: "Monthly Revenue",
|
|
91
|
+
type: "AGGREGATION",
|
|
92
|
+
isShared: true,
|
|
93
|
+
executionCount: 1500
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: "q-2",
|
|
97
|
+
name: "User Growth",
|
|
98
|
+
type: "METRIC",
|
|
99
|
+
isShared: true,
|
|
100
|
+
executionCount: 890
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "q-3",
|
|
104
|
+
name: "Product Sales",
|
|
105
|
+
type: "SQL",
|
|
106
|
+
isShared: false,
|
|
107
|
+
executionCount: 340
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "q-4",
|
|
111
|
+
name: "Conversion Funnel",
|
|
112
|
+
type: "AGGREGATION",
|
|
113
|
+
isShared: true,
|
|
114
|
+
executionCount: 450
|
|
115
|
+
}
|
|
116
|
+
];
|
|
117
|
+
function formatNumber(value) {
|
|
118
|
+
if (value >= 1e6) return `${(value / 1e6).toFixed(1)}M`;
|
|
119
|
+
if (value >= 1e3) return `${(value / 1e3).toFixed(1)}K`;
|
|
120
|
+
return value.toString();
|
|
121
|
+
}
|
|
122
|
+
function formatChange(change) {
|
|
123
|
+
return `${change >= 0 ? "📈" : "📉"} ${change >= 0 ? "+" : ""}${change.toFixed(1)}%`;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Markdown renderer for Analytics Dashboard Overview
|
|
127
|
+
*/
|
|
128
|
+
const analyticsDashboardMarkdownRenderer = {
|
|
129
|
+
target: "markdown",
|
|
130
|
+
render: async (desc) => {
|
|
131
|
+
if (desc.source.type !== "component" || desc.source.componentKey !== "AnalyticsDashboard") throw new Error("analyticsDashboardMarkdownRenderer: not AnalyticsDashboard");
|
|
132
|
+
const dashboards = mockDashboards;
|
|
133
|
+
const widgets = mockWidgets;
|
|
134
|
+
const queries = mockQueries;
|
|
135
|
+
const dashboard = dashboards[0];
|
|
136
|
+
if (!dashboard) return {
|
|
137
|
+
mimeType: "text/markdown",
|
|
138
|
+
body: "# No Dashboards\n\nNo dashboards available."
|
|
139
|
+
};
|
|
140
|
+
const dashboardWidgets = widgets.filter((w) => w.dashboardId === dashboard.id);
|
|
141
|
+
const publishedDashboards = dashboards.filter((d) => d.status === "PUBLISHED");
|
|
142
|
+
const totalViews = dashboards.reduce((sum, d) => sum + d.viewCount, 0);
|
|
143
|
+
const sharedQueries = queries.filter((q) => q.isShared);
|
|
144
|
+
const lines = [
|
|
145
|
+
`# ${dashboard.name}`,
|
|
146
|
+
"",
|
|
147
|
+
"> Analytics dashboard overview",
|
|
148
|
+
"",
|
|
149
|
+
"## Key Metrics",
|
|
150
|
+
""
|
|
151
|
+
];
|
|
152
|
+
const metricWidgets = dashboardWidgets.filter((w) => w.type === "METRIC");
|
|
153
|
+
for (const widget of metricWidgets) {
|
|
154
|
+
const w = widget;
|
|
155
|
+
lines.push(`### ${w.name}`);
|
|
156
|
+
lines.push(`**${formatNumber(w.value)}** ${formatChange(w.change)}`);
|
|
157
|
+
lines.push("");
|
|
158
|
+
}
|
|
159
|
+
lines.push("## Visualizations");
|
|
160
|
+
lines.push("");
|
|
161
|
+
const chartWidgets = dashboardWidgets.filter((w) => w.type !== "METRIC");
|
|
162
|
+
for (const widget of chartWidgets) {
|
|
163
|
+
const w = widget;
|
|
164
|
+
lines.push(`- **${w.name}** (${w.type.replace("_", " ")}) - ${w.dataPoints} data points`);
|
|
165
|
+
}
|
|
166
|
+
lines.push("");
|
|
167
|
+
lines.push("## Dashboard Stats");
|
|
168
|
+
lines.push("");
|
|
169
|
+
lines.push("| Metric | Value |");
|
|
170
|
+
lines.push("|--------|-------|");
|
|
171
|
+
lines.push(`| Total Dashboards | ${dashboards.length} |`);
|
|
172
|
+
lines.push(`| Published | ${publishedDashboards.length} |`);
|
|
173
|
+
lines.push(`| Total Views | ${totalViews.toLocaleString()} |`);
|
|
174
|
+
lines.push(`| Shared Queries | ${sharedQueries.length} |`);
|
|
175
|
+
return {
|
|
176
|
+
mimeType: "text/markdown",
|
|
177
|
+
body: lines.join("\n")
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Markdown renderer for Dashboard List
|
|
183
|
+
*/
|
|
184
|
+
const dashboardListMarkdownRenderer = {
|
|
185
|
+
target: "markdown",
|
|
186
|
+
render: async (desc) => {
|
|
187
|
+
if (desc.source.type !== "component" || desc.source.componentKey !== "DashboardList") throw new Error("dashboardListMarkdownRenderer: not DashboardList");
|
|
188
|
+
const dashboards = mockDashboards;
|
|
189
|
+
const lines = [
|
|
190
|
+
"# Dashboards",
|
|
191
|
+
"",
|
|
192
|
+
"> Browse and manage analytics dashboards",
|
|
193
|
+
"",
|
|
194
|
+
"| Dashboard | Widgets | Views | Status | Last Viewed |",
|
|
195
|
+
"|-----------|---------|-------|--------|-------------|"
|
|
196
|
+
];
|
|
197
|
+
for (const dashboard of dashboards) {
|
|
198
|
+
const lastViewed = dashboard.lastViewedAt ? new Date(dashboard.lastViewedAt).toLocaleDateString() : "Never";
|
|
199
|
+
const statusIcon = dashboard.status === "PUBLISHED" ? "🟢" : "⚫";
|
|
200
|
+
lines.push(`| [${dashboard.name}](/dashboards/${dashboard.slug}) | ${dashboard.widgetCount} | ${dashboard.viewCount.toLocaleString()} | ${statusIcon} ${dashboard.status} | ${lastViewed} |`);
|
|
201
|
+
}
|
|
202
|
+
lines.push("");
|
|
203
|
+
lines.push("## Quick Actions");
|
|
204
|
+
lines.push("");
|
|
205
|
+
lines.push("- **Create Dashboard** - Start with a blank canvas");
|
|
206
|
+
lines.push("- **Import Template** - Use a pre-built template");
|
|
207
|
+
lines.push("- **Clone Dashboard** - Duplicate an existing dashboard");
|
|
208
|
+
return {
|
|
209
|
+
mimeType: "text/markdown",
|
|
210
|
+
body: lines.join("\n")
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Markdown renderer for Query Builder
|
|
216
|
+
*/
|
|
217
|
+
const queryBuilderMarkdownRenderer = {
|
|
218
|
+
target: "markdown",
|
|
219
|
+
render: async (desc) => {
|
|
220
|
+
if (desc.source.type !== "component" || desc.source.componentKey !== "QueryBuilder") throw new Error("queryBuilderMarkdownRenderer: not QueryBuilder");
|
|
221
|
+
const queries = mockQueries;
|
|
222
|
+
const lines = [
|
|
223
|
+
"# Query Builder",
|
|
224
|
+
"",
|
|
225
|
+
"> Create and manage data queries",
|
|
226
|
+
"",
|
|
227
|
+
"## Saved Queries",
|
|
228
|
+
"",
|
|
229
|
+
"| Query | Type | Shared | Executions |",
|
|
230
|
+
"|-------|------|--------|------------|"
|
|
231
|
+
];
|
|
232
|
+
for (const query of queries) {
|
|
233
|
+
const sharedIcon = query.isShared ? "🌐" : "🔒";
|
|
234
|
+
lines.push(`| ${query.name} | ${query.type} | ${sharedIcon} | ${query.executionCount.toLocaleString()} |`);
|
|
235
|
+
}
|
|
236
|
+
lines.push("");
|
|
237
|
+
lines.push("## Query Types");
|
|
238
|
+
lines.push("");
|
|
239
|
+
lines.push("### METRIC");
|
|
240
|
+
lines.push("Query usage metrics from the metering system.");
|
|
241
|
+
lines.push("");
|
|
242
|
+
lines.push("### AGGREGATION");
|
|
243
|
+
lines.push("Build aggregations with measures and dimensions without writing SQL.");
|
|
244
|
+
lines.push("");
|
|
245
|
+
lines.push("### SQL");
|
|
246
|
+
lines.push("Write custom SQL queries for advanced analysis.");
|
|
247
|
+
lines.push("");
|
|
248
|
+
lines.push("## Features");
|
|
249
|
+
lines.push("");
|
|
250
|
+
lines.push("- Visual query builder");
|
|
251
|
+
lines.push("- Auto-complete for fields and functions");
|
|
252
|
+
lines.push("- Query validation and optimization");
|
|
253
|
+
lines.push("- Result caching");
|
|
254
|
+
lines.push("- Query sharing and collaboration");
|
|
255
|
+
return {
|
|
256
|
+
mimeType: "text/markdown",
|
|
257
|
+
body: lines.join("\n")
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
//#endregion
|
|
263
|
+
export { analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer };
|
|
264
|
+
//# sourceMappingURL=analytics.markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.markdown.js","names":[],"sources":["../../../src/ui/renderers/analytics.markdown.ts"],"sourcesContent":["/**\n * Markdown renderers for Analytics Dashboard presentations\n */\nimport type { PresentationRenderer } from '@contractspec/lib.contracts';\n\n// Mock data for analytics rendering\nconst mockDashboards = [\n {\n id: 'dash-1',\n name: 'Sales Overview',\n slug: 'sales-overview',\n status: 'PUBLISHED',\n widgetCount: 8,\n viewCount: 1250,\n lastViewedAt: '2024-01-16T12:00:00Z',\n },\n {\n id: 'dash-2',\n name: 'User Engagement',\n slug: 'user-engagement',\n status: 'PUBLISHED',\n widgetCount: 6,\n viewCount: 890,\n lastViewedAt: '2024-01-16T10:00:00Z',\n },\n {\n id: 'dash-3',\n name: 'Product Analytics',\n slug: 'product-analytics',\n status: 'PUBLISHED',\n widgetCount: 10,\n viewCount: 560,\n lastViewedAt: '2024-01-15T14:00:00Z',\n },\n {\n id: 'dash-4',\n name: 'Finance Report',\n slug: 'finance-report',\n status: 'DRAFT',\n widgetCount: 4,\n viewCount: 0,\n lastViewedAt: null,\n },\n];\n\nconst mockWidgets = [\n {\n id: 'w-1',\n dashboardId: 'dash-1',\n name: 'Total Revenue',\n type: 'METRIC',\n value: 125000,\n change: 12.5,\n },\n {\n id: 'w-2',\n dashboardId: 'dash-1',\n name: 'Active Users',\n type: 'METRIC',\n value: 4500,\n change: 8.2,\n },\n {\n id: 'w-3',\n dashboardId: 'dash-1',\n name: 'Revenue Trend',\n type: 'LINE_CHART',\n dataPoints: 30,\n },\n {\n id: 'w-4',\n dashboardId: 'dash-1',\n name: 'Top Products',\n type: 'BAR_CHART',\n dataPoints: 10,\n },\n {\n id: 'w-5',\n dashboardId: 'dash-2',\n name: 'Daily Active Users',\n type: 'LINE_CHART',\n dataPoints: 30,\n },\n {\n id: 'w-6',\n dashboardId: 'dash-2',\n name: 'Session Duration',\n type: 'METRIC',\n value: 245,\n change: -3.1,\n },\n];\n\nconst mockQueries = [\n {\n id: 'q-1',\n name: 'Monthly Revenue',\n type: 'AGGREGATION',\n isShared: true,\n executionCount: 1500,\n },\n {\n id: 'q-2',\n name: 'User Growth',\n type: 'METRIC',\n isShared: true,\n executionCount: 890,\n },\n {\n id: 'q-3',\n name: 'Product Sales',\n type: 'SQL',\n isShared: false,\n executionCount: 340,\n },\n {\n id: 'q-4',\n name: 'Conversion Funnel',\n type: 'AGGREGATION',\n isShared: true,\n executionCount: 450,\n },\n];\n\nfunction formatNumber(value: number): string {\n if (value >= 1000000) {\n return `${(value / 1000000).toFixed(1)}M`;\n }\n if (value >= 1000) {\n return `${(value / 1000).toFixed(1)}K`;\n }\n return value.toString();\n}\n\nfunction formatChange(change: number): string {\n const icon = change >= 0 ? '📈' : '📉';\n const sign = change >= 0 ? '+' : '';\n return `${icon} ${sign}${change.toFixed(1)}%`;\n}\n\n/**\n * Markdown renderer for Analytics Dashboard Overview\n */\nexport const analyticsDashboardMarkdownRenderer: PresentationRenderer<{\n mimeType: string;\n body: string;\n}> = {\n target: 'markdown',\n render: async (desc) => {\n if (\n desc.source.type !== 'component' ||\n desc.source.componentKey !== 'AnalyticsDashboard'\n ) {\n throw new Error(\n 'analyticsDashboardMarkdownRenderer: not AnalyticsDashboard'\n );\n }\n\n const dashboards = mockDashboards;\n const widgets = mockWidgets;\n const queries = mockQueries;\n\n // Get the first dashboard for detailed view\n const dashboard = dashboards[0];\n if (!dashboard) {\n return {\n mimeType: 'text/markdown',\n body: '# No Dashboards\\n\\nNo dashboards available.',\n };\n }\n const dashboardWidgets = widgets.filter(\n (w) => w.dashboardId === dashboard.id\n );\n\n // Calculate stats\n const publishedDashboards = dashboards.filter(\n (d) => d.status === 'PUBLISHED'\n );\n const totalViews = dashboards.reduce((sum, d) => sum + d.viewCount, 0);\n const sharedQueries = queries.filter((q) => q.isShared);\n\n const lines: string[] = [\n `# ${dashboard.name}`,\n '',\n '> Analytics dashboard overview',\n '',\n '## Key Metrics',\n '',\n ];\n\n // Show metric widgets\n const metricWidgets = dashboardWidgets.filter((w) => w.type === 'METRIC');\n for (const widget of metricWidgets) {\n const w = widget as { name: string; value: number; change: number };\n lines.push(`### ${w.name}`);\n lines.push(`**${formatNumber(w.value)}** ${formatChange(w.change)}`);\n lines.push('');\n }\n\n lines.push('## Visualizations');\n lines.push('');\n\n // List chart widgets\n const chartWidgets = dashboardWidgets.filter((w) => w.type !== 'METRIC');\n for (const widget of chartWidgets) {\n const w = widget as { name: string; type: string; dataPoints: number };\n lines.push(\n `- **${w.name}** (${w.type.replace('_', ' ')}) - ${w.dataPoints} data points`\n );\n }\n\n lines.push('');\n lines.push('## Dashboard Stats');\n lines.push('');\n lines.push('| Metric | Value |');\n lines.push('|--------|-------|');\n lines.push(`| Total Dashboards | ${dashboards.length} |`);\n lines.push(`| Published | ${publishedDashboards.length} |`);\n lines.push(`| Total Views | ${totalViews.toLocaleString()} |`);\n lines.push(`| Shared Queries | ${sharedQueries.length} |`);\n\n return {\n mimeType: 'text/markdown',\n body: lines.join('\\n'),\n };\n },\n};\n\n/**\n * Markdown renderer for Dashboard List\n */\nexport const dashboardListMarkdownRenderer: PresentationRenderer<{\n mimeType: string;\n body: string;\n}> = {\n target: 'markdown',\n render: async (desc) => {\n if (\n desc.source.type !== 'component' ||\n desc.source.componentKey !== 'DashboardList'\n ) {\n throw new Error('dashboardListMarkdownRenderer: not DashboardList');\n }\n\n const dashboards = mockDashboards;\n\n const lines: string[] = [\n '# Dashboards',\n '',\n '> Browse and manage analytics dashboards',\n '',\n '| Dashboard | Widgets | Views | Status | Last Viewed |',\n '|-----------|---------|-------|--------|-------------|',\n ];\n\n for (const dashboard of dashboards) {\n const lastViewed = dashboard.lastViewedAt\n ? new Date(dashboard.lastViewedAt).toLocaleDateString()\n : 'Never';\n const statusIcon = dashboard.status === 'PUBLISHED' ? '🟢' : '⚫';\n lines.push(\n `| [${dashboard.name}](/dashboards/${dashboard.slug}) | ${dashboard.widgetCount} | ${dashboard.viewCount.toLocaleString()} | ${statusIcon} ${dashboard.status} | ${lastViewed} |`\n );\n }\n\n lines.push('');\n lines.push('## Quick Actions');\n lines.push('');\n lines.push('- **Create Dashboard** - Start with a blank canvas');\n lines.push('- **Import Template** - Use a pre-built template');\n lines.push('- **Clone Dashboard** - Duplicate an existing dashboard');\n\n return {\n mimeType: 'text/markdown',\n body: lines.join('\\n'),\n };\n },\n};\n\n/**\n * Markdown renderer for Query Builder\n */\nexport const queryBuilderMarkdownRenderer: PresentationRenderer<{\n mimeType: string;\n body: string;\n}> = {\n target: 'markdown',\n render: async (desc) => {\n if (\n desc.source.type !== 'component' ||\n desc.source.componentKey !== 'QueryBuilder'\n ) {\n throw new Error('queryBuilderMarkdownRenderer: not QueryBuilder');\n }\n\n const queries = mockQueries;\n\n const lines: string[] = [\n '# Query Builder',\n '',\n '> Create and manage data queries',\n '',\n '## Saved Queries',\n '',\n '| Query | Type | Shared | Executions |',\n '|-------|------|--------|------------|',\n ];\n\n for (const query of queries) {\n const sharedIcon = query.isShared ? '🌐' : '🔒';\n lines.push(\n `| ${query.name} | ${query.type} | ${sharedIcon} | ${query.executionCount.toLocaleString()} |`\n );\n }\n\n lines.push('');\n lines.push('## Query Types');\n lines.push('');\n lines.push('### METRIC');\n lines.push('Query usage metrics from the metering system.');\n lines.push('');\n lines.push('### AGGREGATION');\n lines.push(\n 'Build aggregations with measures and dimensions without writing SQL.'\n );\n lines.push('');\n lines.push('### SQL');\n lines.push('Write custom SQL queries for advanced analysis.');\n lines.push('');\n lines.push('## Features');\n lines.push('');\n lines.push('- Visual query builder');\n lines.push('- Auto-complete for fields and functions');\n lines.push('- Query validation and optimization');\n lines.push('- Result caching');\n lines.push('- Query sharing and collaboration');\n\n return {\n mimeType: 'text/markdown',\n body: lines.join('\\n'),\n };\n },\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/example.analytics-dashboard",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.47.0",
|
|
4
4
|
"description": "Analytics Dashboard example with widgets and query engine for ContractSpec",
|
|
5
|
-
"main": "./dist/index.js",
|
|
6
5
|
"types": "./dist/index.d.ts",
|
|
7
6
|
"type": "module",
|
|
8
7
|
"scripts": {
|
|
@@ -18,13 +17,20 @@
|
|
|
18
17
|
"lint:check": "eslint src"
|
|
19
18
|
},
|
|
20
19
|
"dependencies": {
|
|
21
|
-
"@contractspec/lib.schema": "1.
|
|
22
|
-
"@contractspec/lib.contracts": "1.
|
|
20
|
+
"@contractspec/lib.schema": "1.47.0",
|
|
21
|
+
"@contractspec/lib.contracts": "1.47.0",
|
|
22
|
+
"@contractspec/lib.example-shared-ui": "1.1.0",
|
|
23
|
+
"@contractspec/lib.design-system": "1.47.0",
|
|
24
|
+
"@contractspec/lib.runtime-sandbox": "0.2.0",
|
|
25
|
+
"react": "19.2.3",
|
|
26
|
+
"react-dom": "19.2.3"
|
|
23
27
|
},
|
|
24
28
|
"devDependencies": {
|
|
25
|
-
"@contractspec/tool.typescript": "1.
|
|
26
|
-
"@contractspec/tool.tsdown": "1.
|
|
27
|
-
"typescript": "^5.9.3"
|
|
29
|
+
"@contractspec/tool.typescript": "1.47.0",
|
|
30
|
+
"@contractspec/tool.tsdown": "1.47.0",
|
|
31
|
+
"typescript": "^5.9.3",
|
|
32
|
+
"@types/react": "^19.2.8",
|
|
33
|
+
"@types/react-dom": "^19.2.2"
|
|
28
34
|
},
|
|
29
35
|
"exports": {
|
|
30
36
|
".": "./dist/index.js",
|
|
@@ -34,19 +40,29 @@
|
|
|
34
40
|
"./dashboard/dashboard.operation": "./dist/dashboard/dashboard.operation.js",
|
|
35
41
|
"./dashboard/dashboard.presentation": "./dist/dashboard/dashboard.presentation.js",
|
|
36
42
|
"./dashboard/dashboard.schema": "./dist/dashboard/dashboard.schema.js",
|
|
43
|
+
"./dashboard/dashboard.test-spec": "./dist/dashboard/dashboard.test-spec.js",
|
|
37
44
|
"./docs": "./dist/docs/index.js",
|
|
38
45
|
"./docs/analytics-dashboard.docblock": "./dist/docs/analytics-dashboard.docblock.js",
|
|
39
46
|
"./events": "./dist/events.js",
|
|
40
47
|
"./example": "./dist/example.js",
|
|
48
|
+
"./handlers": "./dist/handlers/index.js",
|
|
49
|
+
"./handlers/analytics.handlers": "./dist/handlers/analytics.handlers.js",
|
|
41
50
|
"./query": "./dist/query/index.js",
|
|
42
51
|
"./query-engine": "./dist/query-engine/index.js",
|
|
43
52
|
"./query/query.enum": "./dist/query/query.enum.js",
|
|
44
53
|
"./query/query.operation": "./dist/query/query.operation.js",
|
|
45
54
|
"./query/query.presentation": "./dist/query/query.presentation.js",
|
|
46
55
|
"./query/query.schema": "./dist/query/query.schema.js",
|
|
56
|
+
"./query/query.test-spec": "./dist/query/query.test-spec.js",
|
|
57
|
+
"./seeders": "./dist/seeders/index.js",
|
|
58
|
+
"./ui": "./dist/ui/index.js",
|
|
59
|
+
"./ui/AnalyticsDashboard": "./dist/ui/AnalyticsDashboard.js",
|
|
60
|
+
"./ui/hooks": "./dist/ui/hooks/index.js",
|
|
61
|
+
"./ui/hooks/useAnalyticsData": "./dist/ui/hooks/useAnalyticsData.js",
|
|
62
|
+
"./ui/renderers": "./dist/ui/renderers/index.js",
|
|
63
|
+
"./ui/renderers/analytics.markdown": "./dist/ui/renderers/analytics.markdown.js",
|
|
47
64
|
"./*": "./*"
|
|
48
65
|
},
|
|
49
|
-
"module": "./dist/index.js",
|
|
50
66
|
"files": [
|
|
51
67
|
"dist",
|
|
52
68
|
"README.md"
|