import * as React from "react"; import Dropdown, { DropdownItem } from "../dropdown"; import { usePoll } from "../use-poll"; import Pencil from "@/components/icons/pencil-alt.svg"; import Table from "@/components/icons/table.svg"; import Save from "@/components/icons/save.svg"; import Cog from "@/components/icons/cog.svg"; import LockOpen from "@/components/icons/lock-open.svg"; import LockClosed from "@/components/icons/lock-closed.svg"; import { useTranslation } from "next-i18next"; import { format } from "date-fns"; import { decodeDateOption, encodeDateOption } from "utils/date-time-utils"; import { useModal } from "../modal"; import { useUpdatePollMutation } from "./mutations"; import { PollDetailsForm } from "../forms"; import Button from "@/components/button"; import { Placement } from "@popperjs/core"; const PollOptionsForm = React.lazy(() => import("../forms/poll-options-form")); const ManagePoll: React.VoidFunctionComponent<{ targetTimeZone: string; placement?: Placement; }> = ({ targetTimeZone, placement }) => { const { t } = useTranslation("app"); const poll = usePoll(); const { mutate: updatePollMutation, isLoading: isUpdating } = useUpdatePollMutation(); const [ changeOptionsModalContextHolder, openChangeOptionsModal, closeChangeOptionsModal, ] = useModal({ okText: "Save", okButtonProps: { form: "pollOptions", htmlType: "submit", loading: isUpdating, }, cancelText: "Cancel", content: ( { const [start, end] = option.value.split("/"); return end ? { type: "timeSlot", start, end, } : { type: "date", date: start.indexOf("T") === -1 ? start : // legacy polls new Date(start).toISOString().substring(0, 10), }; }), timeZone: poll.timeZone ?? "", }} onSubmit={(data) => { const encodedOptions = data.options.map(encodeDateOption); const optionsToDelete = poll.options .filter((option) => { return !encodedOptions.includes(option.value); }) .map((option) => option.id); const optionsToAdd = encodedOptions.filter( (encodedOption) => !poll.options.find((o) => o.value === encodedOption), ); updatePollMutation( { timeZone: data.timeZone, optionsToDelete, optionsToAdd, }, { onSuccess: () => closeChangeOptionsModal(), }, ); }} /> ), }); const [ changePollDetailsModalContextHolder, openChangePollDetailsModa, closePollDetailsModal, ] = useModal({ okText: "Save changes", okButtonProps: { form: "updateDetails", loading: isUpdating, htmlType: "submit", }, cancelText: "Cancel", content: ( { //submit updatePollMutation(data, { onSuccess: closePollDetailsModal }); }} /> ), }); return ( <> {changeOptionsModalContextHolder} {changePollDetailsModalContextHolder} }>Manage} > { const header = [ t("participantCount", { count: poll.participants.length, }), ...poll.options.map((option) => { const decodedOption = decodeDateOption( option.value, poll.timeZone, targetTimeZone, ); const day = `${decodedOption.dow} ${decodedOption.day} ${decodedOption.month}`; return decodedOption.type === "date" ? day : `${day} ${decodedOption.startTime} - ${decodedOption.endTime}`; }), ].join(","); const rows = poll.participants.map((participant) => { return [ participant.name, ...poll.options.map((option) => { if ( participant.votes.some((vote) => { return vote.optionId === option.id; }) ) { return "Yes"; } return "No"; }), ].join(","); }); const csv = `data:text/csv;charset=utf-8,${[header, ...rows].join( "\r\n", )}`; const encodedCsv = encodeURI(csv); var link = document.createElement("a"); link.setAttribute("href", encodedCsv); link.setAttribute( "download", `${poll.title.replace(/\s/g, "_")}-${format( Date.now(), "yyyyMMddhhmm", )}`, ); document.body.appendChild(link); link.click(); document.body.removeChild(link); }} /> {poll.closed ? ( updatePollMutation({ closed: false })} /> ) : ( updatePollMutation({ closed: true })} /> )} ); }; export default ManagePoll;