diff --git a/pages/stackers/[sub]/[when].js b/pages/stackers/[sub]/[when].js
index eec02af076..6334f08264 100644
--- a/pages/stackers/[sub]/[when].js
+++ b/pages/stackers/[sub]/[when].js
@@ -1,6 +1,9 @@
import { gql, useQuery } from '@apollo/client'
import { getGetServerSideProps } from '@/api/ssrApollo'
import Layout from '@/components/layout'
+import Button from 'react-bootstrap/Button';
+import Dropdown from 'react-bootstrap/Dropdown';
+import DropdownButton from 'react-bootstrap/DropdownButton';
import Col from 'react-bootstrap/Col'
import Row from 'react-bootstrap/Row'
import { SubAnalyticsHeader } from '@/components/sub-analytics-header'
@@ -90,6 +93,40 @@ export default function Growth ({ ssrData }) {
const { data } = useQuery(GROWTH_QUERY, { variables: { when, from, to, sub, subSelect: sub !== 'all' } })
if (!data && !ssrData) return
+ const downloadLinkStyle = { textDecoration: "inherit", color: "inherit" };
+
+ const genHrefDownloadBlobJSON = (data) => {
+ const blob = new Blob([
+ JSON.stringify(data, null, 2),
+ ], {
+ type: 'text/plain;charset=utf-8;'
+ });
+ return URL.createObjectURL(blob);
+ };
+
+ const genHrefDownloadBlobCSV = (data) => {
+ if (data.length > 0) {
+ data = flattenTimeDataForCsv(data);
+ const headers = Object.keys(data[0]);
+ const rows = data.map((item) => headers.map((header) => item[header]));
+ const csvStr = [headers.join(","), ...rows.map((row) => row.join(","))].join("\n");
+ const blob = new Blob([csvStr,], {type: 'text/csv;charset=utf-8;'});
+ return URL.createObjectURL(blob);
+ }
+ return ""
+ };
+
+ const flattenTimeDataForCsv = (timeData) => {
+ let rows = [];
+ for (const timeI in timeData) {
+ let flattened = {};
+ flattened.time = timeData[timeI].time;
+ timeData[timeI].data.forEach(kv => {flattened[kv.name] = kv.value;});
+ rows.push(flattened);
+ }
+ return rows;
+ };
+
const {
registrationGrowth,
itemGrowth,
@@ -104,7 +141,101 @@ export default function Growth ({ ssrData }) {
if (sub === 'all') {
return (
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
stackers
@@ -140,7 +271,45 @@ export default function Growth ({ ssrData }) {
} else {
return (
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
items