forked from Nova-reward/Nova-Rewards
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexportReport.js
More file actions
59 lines (56 loc) · 1.78 KB
/
Copy pathexportReport.js
File metadata and controls
59 lines (56 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* Converts an array of objects to a CSV string and triggers a download.
* @param {object[]} rows
* @param {string} filename
*/
export function exportCSV(rows, filename = 'analytics.csv') {
if (!rows?.length) return;
const headers = Object.keys(rows[0]);
const csv = [
headers.join(','),
...rows.map((r) => headers.map((h) => JSON.stringify(r[h] ?? '')).join(',')),
].join('\n');
download(new Blob([csv], { type: 'text/csv' }), filename);
}
/**
* Exports all analytics sections as a multi-section CSV.
* @param {object} data Full analytics data object
* @param {string} range Date range label
*/
export function exportAnalyticsReport(data, range) {
if (!data) return;
const sections = [
`Nova Rewards Analytics Report — Range: ${range}`,
'',
'## Summary',
'Metric,Value,Change',
...Object.entries(data.summary).map(
([k, v]) => `${k},${v.value},${v.change > 0 ? '+' : ''}${v.change}%`
),
'',
'## Growth Trends',
Object.keys(data.growth[0] ?? {}).join(','),
...data.growth.map((r) => Object.values(r).join(',')),
'',
'## Engagement',
Object.keys(data.engagement[0] ?? {}).join(','),
...data.engagement.map((r) => Object.values(r).join(',')),
'',
'## Campaign Performance',
Object.keys(data.campaigns[0] ?? {}).join(','),
...data.campaigns.map((r) => Object.values(r).join(',')),
'',
'## Reward Distribution',
'name,value',
...data.distribution.map((r) => `${r.name},${r.value}`),
].join('\n');
download(new Blob([sections], { type: 'text/csv' }), `nova-analytics-${range}.csv`);
}
function download(blob, filename) {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
}