From 8e5cd96755ccae86be18afce205df08cb94334c0 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Sat, 5 Dec 2020 17:45:51 +0200 Subject: [PATCH] CSV generation button on SignupListPage --- package-lock.json | 14 +++++++++++ package.json | 2 ++ src/pages/admin/SignupListPage.tsx | 40 +++++++++++++++++++++++------- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c65d04..6eb7a90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -976,6 +976,15 @@ "csstype": "^2.2.0" } }, + "@types/react-csv": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/react-csv/-/react-csv-1.1.1.tgz", + "integrity": "sha512-sP8AxGrFJ/kb7ygFpGkssdD/vKSTqdZDJbw3pJKTCa1C0UoT+0+rdUWy2fZqvhvvdpHG+OCJ4G8O7OZqVIa+BA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-dom": { "version": "16.8.4", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", @@ -14999,6 +15008,11 @@ "tiny-invariant": "^1.0.4" } }, + "react-csv": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-csv/-/react-csv-2.0.3.tgz", + "integrity": "sha512-exyAdFLAxtuM4wNwLYrlKyPYLiJ7e0mv9tqPAd3kq+k1CiJFtznevR3yP0icv5q/y200w+lzNgi7TQn1Wrhu0w==" + }, "react-dom": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", diff --git a/package.json b/package.json index 412437c..d121eb4 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@types/js-cookie": "2.2.4", "@types/node": "10.14.7", "@types/react": "16.8.18", + "@types/react-csv": "1.1.1", "@types/react-dom": "16.8.4", "@types/react-helmet": "6.0.0", "@types/react-jsonschema-form": "1.7.3", @@ -122,6 +123,7 @@ "normalize.css": "8.0.1", "query-string": "6.5.0", "react-beautiful-dnd": "10.1.1", + "react-csv": "2.0.3", "react-helmet": "5.2.1", "react-jsonschema-form": "^1.8.1", "react-markdown": "4.3.1", diff --git a/src/pages/admin/SignupListPage.tsx b/src/pages/admin/SignupListPage.tsx index 186bed7..0354b95 100644 --- a/src/pages/admin/SignupListPage.tsx +++ b/src/pages/admin/SignupListPage.tsx @@ -1,9 +1,12 @@ import React, { useEffect, useState } from "react"; import { Helmet } from "react-helmet"; import { RouteComponentProps } from "react-router-dom"; +import styled from "styled-components"; +import { CSVLink } from "react-csv"; import AdminListCommon from "@views/admin/AdminListCommon"; import { SignupForm, getForm, getSignups } from "@models/SignupForm"; import { Signup, deleteSignup } from "@models/Signup"; +import { Button } from "@components/index"; interface MatchParams { id?: string; @@ -11,6 +14,9 @@ interface MatchParams { type SignupEmailPageProps = RouteComponentProps; +const StyledButton = styled(Button)<{ colorOverride: "red" | "green" }>` + background-color: ${(p: any) => p.colorOverride}; +`; const SignupEmailPage: React.FC = ({ match: { params: { id } } }) => { const [signupForm, setSignupForm] = useState(null); @@ -24,13 +30,6 @@ const SignupEmailPage: React.FC = ({ match: { params: { id }, [id]); - const questions = signupForm ? signupForm.questions.map(q => ({ - title: q.name, - id: q.id - })) : []; - - const title = signupForm ? signupForm.title_fi : "Loading..."; - const confirmDelete = async (signup: Signup, question: any) => { if(confirm(`Delete: ${signup.id}: ${signup.answer[question.id]}; Are you sure?`) === true) { try { @@ -42,6 +41,21 @@ const SignupEmailPage: React.FC = ({ match: { params: { id } } + + const title = signupForm ? signupForm.title_fi : "Loading..."; + + const questions = signupForm ? signupForm.questions.map(q => ({ + title: q.name, + id: q.id + })) : []; + + // Generate 2-dimensional array where rows are signups and columns are answers to questions. + const CSVData = signups.map((s) => questions.map(q => s.answer[q.id])); + // Add reserve signup "header" + if (signupForm?.quota) { + CSVData.splice(signupForm.quota, 0, ["RESERVE-SIGNUPS"]); + } + return ( @@ -54,8 +68,16 @@ const SignupEmailPage: React.FC = ({ match: { params: { id {questions.map(q => ( {q.title} ))} + + q.title)} separator=";"> + + Download CSV + + + + {signups.map(s => ( @@ -65,9 +87,9 @@ const SignupEmailPage: React.FC = ({ match: { params: { id ))} - + ))}