From dd3eded4a1f5e8bc924fa21464f57c9adb892f33 Mon Sep 17 00:00:00 2001 From: Ojakoo Date: Sun, 6 Nov 2022 14:25:07 +0200 Subject: [PATCH] add filter and sort functionality to admin pages --- src/components/Select.tsx | 12 ++++ src/pages/admin/events/index.tsx | 96 +++++++++++++------------------ src/pages/admin/feed/index.tsx | 71 +++++++++++++++-------- src/pages/admin/signups/index.tsx | 60 ++++++++++++++++++- 4 files changed, 159 insertions(+), 80 deletions(-) create mode 100644 src/components/Select.tsx diff --git a/src/components/Select.tsx b/src/components/Select.tsx new file mode 100644 index 0000000..5d5dec1 --- /dev/null +++ b/src/components/Select.tsx @@ -0,0 +1,12 @@ +import styled from "styled-components"; + +const StyledSelect = styled.select` + padding: 0.25rem; + margin: 0.5rem; +`; + +const SelectWrapper = styled.div` + padding: 0.5rem; +`; + +export { StyledSelect, SelectWrapper }; diff --git a/src/pages/admin/events/index.tsx b/src/pages/admin/events/index.tsx index 80b135f..46e7579 100644 --- a/src/pages/admin/events/index.tsx +++ b/src/pages/admin/events/index.tsx @@ -10,6 +10,7 @@ import AddLink from "@components/AddLink"; import Event from "@models/Event"; import EventApi from "@api/eventApi"; import { fetcher, APIPath, API } from "@api/backend"; +import { StyledSelect, SelectWrapper } from "@components/Select"; const URL = "/admin/events"; @@ -21,15 +22,6 @@ const StyledButton = styled(Button) <{ $colorOverride: "red" }>` font-weight: bold; `; -const StyledSelect = styled.select` - padding: 0.25rem; - margin: 0.5rem; -`; - -const SelectWrapper = styled.div` - padding: 0.5rem; -`; - const confirmDelete = async (event: Event) => { if (window.confirm(`Delete: ${event.id}: ${event.title_fi}/${event.title_en}; Are you sure?`) === true) { try { @@ -50,41 +42,36 @@ const Renderer: React.FC = () => { const [order, setOrder] = useState("descending"); const [filter, setFilter] = useState("all"); - const [processedEvents, setProcessedEvents] = useState([]); + const eventSort = (a, b) => { + let result = 0; + if (order === "descending") { + if (["start_time", "end_time"].includes(sort)) { + result = new Date(b[sort]).getTime() - new Date(a[sort]).getTime(); + } else if (sort === "id") { + result = b[sort] - a[sort]; + } + } else if (order === "ascending") { + if (["start_time", "end_time"].includes(sort)) { + result = new Date(a[sort]).getTime() - new Date(b[sort]).getTime(); + } else if (sort === "id") { + result = a[sort] - b[sort]; + } + } + return result; + }; + + const dateFilter = (a) => { + let result = true; + + if (filter === "upcoming") { + result = new Date(a.end_time).getTime() > Date.now(); + } else if (filter === "past") { + result = new Date(a.end_time).getTime() < Date.now(); + } + return result; + }; useEffect(() => { - const eventSort = (a, b) => { - let result = 0; - if (order === "descending") { - if (["start_time", "end_time"].includes(sort)) { - result = new Date(b[sort]).getTime() - new Date(a[sort]).getTime(); - } else if (sort === "id") { - result = b[sort] - a[sort]; - } - } else if (order === "ascending") { - if (["start_time", "end_time"].includes(sort)) { - result = new Date(a[sort]).getTime() - new Date(b[sort]).getTime(); - } else if (sort === "id") { - result = a[sort] - b[sort]; - } - } - return result; - }; - - const checkDate = (a) => { - let result = true; - - if (filter === "upcoming") { - result = new Date(a.end_time).getTime() > Date.now(); - } else if (filter === "past") { - result = new Date(a.end_time).getTime() < Date.now(); - } - return result; - }; - - if (events) { - setProcessedEvents(events.sort(eventSort).filter(checkDate)); - } }, [sort, order, filter, events]); if (error) { @@ -130,19 +117,18 @@ const Renderer: React.FC = () => { - {processedEvents - .map((event) => ( - - {event.title_fi} - {formatRelative(new Date(event.start_time), new Date())} - {formatRelative(new Date(event.end_time), new Date())} - - confirmDelete(event)}> - Delete - - - - ))} + {events.sort(eventSort).filter(dateFilter).map((event) => ( + + {event.title_fi} + {formatRelative(new Date(event.start_time), new Date())} + {formatRelative(new Date(event.end_time), new Date())} + + confirmDelete(event)}> + Delete + + + + ))} diff --git a/src/pages/admin/feed/index.tsx b/src/pages/admin/feed/index.tsx index 07bfc8d..140ba28 100644 --- a/src/pages/admin/feed/index.tsx +++ b/src/pages/admin/feed/index.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import { NextPage } from "next"; import useSWR from "swr"; import { formatRelative } from "date-fns"; @@ -10,6 +10,7 @@ import AddLink from "@components/AddLink"; import Post from "@models/Feed"; import PostApi from "@api/feedApi"; import { fetcher, APIPath, API } from "@api/backend"; +import { SelectWrapper, StyledSelect } from "@components/Select"; const URL = "/admin/feed"; @@ -37,6 +38,21 @@ const Renderer: React.FC = () => { const api: API = { path: APIPath.FEED, authenticated: true }; const { data: feed, error } = useSWR(api, fetcher); + const [order, setOrder] = useState("descending"); + + const feedSort = (a, b) => { + let result = 0; + if (order === "descending") { + result = new Date(b.publish_time).getTime() - new Date(a.publish_time).getTime(); + } else if (order === "ascending") { + result = new Date(a.publish_time).getTime() - new Date(b.publish_time).getTime(); + } + return result; + }; + + useEffect(() => { + }, [order, feed]); + if (error) { console.error(error); return ( @@ -52,29 +68,38 @@ const Renderer: React.FC = () => { } return ( - - - - - - - - - - {feed.map((post) => ( - - - - - +
+ + Order: + setOrder(e.target.value)}> + + + + +
TitleDescriptionPublish time
{post.title_fi}{post.description_fi}{formatRelative(new Date(post.publish_time), new Date())} - confirmDelete(post)}> - Delete - -
+ + + + + - ))} - -
TitleDescriptionPublish time
+ + + {feed.sort(feedSort).map((post) => ( + + {post.title_fi} + {post.description_fi} + {formatRelative(new Date(post.publish_time), new Date())} + + confirmDelete(post)}> + Delete + + + + ))} + + + ); }; diff --git a/src/pages/admin/signups/index.tsx b/src/pages/admin/signups/index.tsx index fc4dc96..703610b 100644 --- a/src/pages/admin/signups/index.tsx +++ b/src/pages/admin/signups/index.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import { NextPage } from "next"; import useSWR from "swr"; import { formatRelative } from "date-fns"; @@ -10,6 +10,7 @@ import AddLink from "@components/AddLink"; import { SignupForm } from "@models/Signup"; import SignupApi from "@api/signupApi"; import { fetcher, APIPath, API } from "@api/backend"; +import { SelectWrapper, StyledSelect } from "@components/Select"; const URL = "/admin/signups"; @@ -37,6 +38,42 @@ const Renderer: React.FC = () => { const api: API = { path: APIPath.SIGNUP_FORMS, authenticated: true }; const { data: signupForms, error } = useSWR(api, fetcher); + const [sort, setSort] = useState("start_time"); + const [order, setOrder] = useState("descending"); + const [filter, setFilter] = useState("all"); + + const signupFormSort = (a, b) => { + let result = 0; + if (order === "descending") { + if (["start_time", "end_time"].includes(sort)) { + result = new Date(b[sort]).getTime() - new Date(a[sort]).getTime(); + } else if (sort === "id") { + result = b[sort] - a[sort]; + } + } else if (order === "ascending") { + if (["start_time", "end_time"].includes(sort)) { + result = new Date(a[sort]).getTime() - new Date(b[sort]).getTime(); + } else if (sort === "id") { + result = a[sort] - b[sort]; + } + } + return result; + }; + + const dateFilter = (a) => { + let result = true; + + if (filter === "upcoming") { + result = new Date(a.end_time).getTime() > Date.now(); + } else if (filter === "past") { + result = new Date(a.end_time).getTime() < Date.now(); + } + return result; + }; + + useEffect(() => { + }, [sort, order, filter, signupForms]); + if (error) { console.error(error); return ( @@ -52,6 +89,25 @@ const Renderer: React.FC = () => { return (
+ + Sort by: + setSort(e.target.value)}> + + + + + Order: + setOrder(e.target.value)}> + + + + Filter: + setFilter(e.target.value)}> + + + + + @@ -63,7 +119,7 @@ const Renderer: React.FC = () => { - {signupForms.map((signupForm) => ( + {signupForms.sort(signupFormSort).filter(dateFilter).map((signupForm) => (
{signupForm.title_fi} {formatRelative(new Date(signupForm.start_time), new Date())}