From 34fe26e87e16bef6a44685862f05a2d68c3bbf4a Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 8 May 2023 20:46:58 +0200 Subject: [PATCH] tuned filters --- .../MeetingsActions/MeetingsActions.tsx | 33 ++++++-- .../MeetingsHeader/MeetingsHeader.tsx | 17 +++- src/containers/MeetingsRow/MeetingsRow.tsx | 82 ++++++------------- src/containers/MeetingsView/MeetingsView.tsx | 58 +++++++------ 4 files changed, 95 insertions(+), 95 deletions(-) diff --git a/src/containers/MeetingsActions/MeetingsActions.tsx b/src/containers/MeetingsActions/MeetingsActions.tsx index f1f9c9b..62ca94c 100644 --- a/src/containers/MeetingsActions/MeetingsActions.tsx +++ b/src/containers/MeetingsActions/MeetingsActions.tsx @@ -16,6 +16,9 @@ type MeetingsActionsProps = { setFilter: (filter: MeetingFilterType) => void; range: DateRange | undefined; setRange: (range: DateRange | undefined) => void; + selectedAll: boolean; + toggleSelectedAll: () => void; + invertSelected: () => void; }; const FilterOptions = ({ filter, setFilter }: Pick) => ( @@ -27,13 +30,15 @@ const FilterOptions = ({ filter, setFilter }: Pick ); -const ActionsOptions = () => ( +const ActionsOptions = ({ + selectedAll, + toggleSelectedAll, + invertSelected, +}: Pick) => ( - Download - Create a Copy - Mark as Draft - Delete - Attend a Workshop + {selectedAll ? Unselect All : 'Select All'} + Invert Selection + Delete Selected ); @@ -44,7 +49,17 @@ const SortOptions = ({ sort, setSort }: Pick ); -export const MeetingsActions = ({ sort, setSort, filter, setFilter, range, setRange }: MeetingsActionsProps) => { +export const MeetingsActions = ({ + sort, + setSort, + filter, + setFilter, + range, + setRange, + selectedAll, + toggleSelectedAll, + invertSelected, +}: MeetingsActionsProps) => { let period = 'Period'; if (range?.from) { if (!range.to) { @@ -78,11 +93,11 @@ export const MeetingsActions = ({ sort, setSort, filter, setFilter, range, setRa } rightIcon={} display={{ base: 'none', md: 'flex' }}> Actions - + } variant="outline" display={{ base: 'flex', md: 'none' }} /> - + diff --git a/src/containers/MeetingsHeader/MeetingsHeader.tsx b/src/containers/MeetingsHeader/MeetingsHeader.tsx index 92970aa..de0a1d6 100644 --- a/src/containers/MeetingsHeader/MeetingsHeader.tsx +++ b/src/containers/MeetingsHeader/MeetingsHeader.tsx @@ -1,9 +1,20 @@ -import { DataListHeader, DataListCell } from "../../components/DataList"; -import React from "react"; +import React from 'react'; -export const MeetingsHeader = () => { +import { Checkbox } from '@chakra-ui/react'; + +import { DataListCell, DataListHeader } from '../../components/DataList'; + +type MeetingsHeaderProps = { + selected: boolean; + toggleSelectedAll: () => void; +}; + +export const MeetingsHeader = ({ selected, toggleSelectedAll }: MeetingsHeaderProps) => { return ( + + toggleSelectedAll()} /> + Name Time diff --git a/src/containers/MeetingsRow/MeetingsRow.tsx b/src/containers/MeetingsRow/MeetingsRow.tsx index 7f50b3b..f1b459e 100644 --- a/src/containers/MeetingsRow/MeetingsRow.tsx +++ b/src/containers/MeetingsRow/MeetingsRow.tsx @@ -1,97 +1,63 @@ -import { DataListCell, DataListRow } from "../../components/DataList"; -import { Meeting, Contact } from "../../types/meetings.types"; -import { - Avatar, - Box, - HStack, - LinkOverlay, - Text, - LinkBox, -} from "@chakra-ui/react"; -import React from "react"; -import { Link } from "react-router-dom"; +import React from 'react'; + +import { Avatar, Box, Checkbox, HStack, Text } from '@chakra-ui/react'; +import { Link } from 'react-router-dom'; + +import { DataListCell, DataListRow } from '../../components/DataList'; +import { Contact, Meeting } from '../../types/meetings.types'; type MeetingsHeaderProps = { meeting: Meeting; contacts: Contact[] | undefined; + selected: boolean; + setSelected: (id: string) => void; }; -export const MeetingsRow = ({ meeting, contacts }: MeetingsHeaderProps) => { +export const MeetingsRow = ({ meeting, contacts, selected, setSelected }: MeetingsHeaderProps) => { const getContactName = (id: string) => { const contact = contacts?.find((contact) => contact.id === id); - return contact?.properties?.firstname + " " + contact?.properties?.lastname; + return contact?.properties?.firstname + ' ' + contact?.properties?.lastname; }; const getContactEmail = (id: string) => { const contact = contacts?.find((contact) => contact.id === id); return contact?.properties?.email; }; return ( - + + + setSelected(meeting.id)} /> + - + {meeting.properties.hs_meeting_title} - + - + {meeting.properties.hs_meeting_start_time} - {!!meeting.createdAt && ( - - {meeting.createdAt} - - )} - {getContactName( - meeting.associations?.contacts?.results[0]?.id || "" - )} + {getContactName(meeting.associations?.contacts?.results[0]?.id || '')} - - {getContactEmail( - meeting.associations?.contacts?.results[0]?.id || "" - )} + + {getContactEmail(meeting.associations?.contacts?.results[0]?.id || '')} - + - {meeting.properties.hs_internal_meeting_notes || - meeting.properties.hs_meeting_outcome} + {meeting.properties.hs_internal_meeting_notes || meeting.properties.hs_meeting_outcome} - - {/* */} - + {/* */} ); }; diff --git a/src/containers/MeetingsView/MeetingsView.tsx b/src/containers/MeetingsView/MeetingsView.tsx index bd43f6a..7aab9a8 100644 --- a/src/containers/MeetingsView/MeetingsView.tsx +++ b/src/containers/MeetingsView/MeetingsView.tsx @@ -1,35 +1,33 @@ -import { DataList } from "../../components/DataList"; -import { - useMeetingList, - sortMeetingList, - filterMeetingList, - rangeMeetingList, -} from "../../services/meetings.service"; -import { MeetingSortType, MeetingFilterType } from "../../types/meetings.types"; -import { MeetingsActions } from "../MeetingsActions/MeetingsActions"; -import { MeetingsFooter } from "../MeetingsFooter/MeetingsFooter"; -import { MeetingsHeader } from "../MeetingsHeader/MeetingsHeader"; -import { MeetingsRow } from "../MeetingsRow/MeetingsRow"; -import { Page, PageContent } from "../Page/Page"; -import { usePaginationFromUrl } from "../Router/Router"; -import { Box, HStack, Heading } from "@chakra-ui/react"; -import React, { useContext, useMemo, useState } from "react"; -import { DateRange } from "react-day-picker"; +import React, { useContext, useMemo, useState } from 'react'; + +import { Box, HStack, Heading } from '@chakra-ui/react'; +import { DateRange } from 'react-day-picker'; + +import { DataList } from '../../components/DataList'; +import { filterMeetingList, rangeMeetingList, sortMeetingList, useMeetingList } from '../../services/meetings.service'; +import { Meeting, MeetingFilterType, MeetingSortType } from '../../types/meetings.types'; +import { MeetingsActions } from '../MeetingsActions/MeetingsActions'; +import { MeetingsFooter } from '../MeetingsFooter/MeetingsFooter'; +import { MeetingsHeader } from '../MeetingsHeader/MeetingsHeader'; +import { MeetingsRow } from '../MeetingsRow/MeetingsRow'; +import { Page, PageContent } from '../Page/Page'; +import { usePaginationFromUrl } from '../Router/Router'; const MeetingsView = () => { const { page, setPage } = usePaginationFromUrl(); - const [sort, setSort] = useState("NEWEST"); - const [filter, setFilter] = useState("ALL"); + const [sort, setSort] = useState('NEWEST'); + const [filter, setFilter] = useState('ALL'); const [range, setRange] = useState(); + const [selected, setSelected] = useState([]); const pageSize = 20; const data = useMeetingList({ page: page - 1, size: pageSize }); const sortedMeetings = sortMeetingList(data?.meetings || [], sort); const filteredMeetings = filterMeetingList(sortedMeetings, filter); const rangedMeetings = rangeMeetingList(filteredMeetings, range); - const pagedMeetings = rangedMeetings.slice( - pageSize * (page - 1), - pageSize * page - ); + const pagedMeetings = rangedMeetings.slice(pageSize * (page - 1), pageSize * page); + const selectedAll = selected.length === rangedMeetings.length; + const toggleSelectedAll = () => (selectedAll ? setSelected([]) : setSelected(rangedMeetings.map((m: Meeting) => m.id))); + const invertSelected = () => setSelected(rangedMeetings.map((m: Meeting) => m.id).filter((id) => !selected.includes(id))); return ( @@ -46,11 +44,21 @@ const MeetingsView = () => { setFilter={setFilter} range={range} setRange={setRange} + selectedAll={selectedAll} + toggleSelectedAll={toggleSelectedAll} + invertSelected={invertSelected} /> - + {pagedMeetings.map((meeting) => ( - + + selected.includes(id) ? setSelected([...selected.filter((i) => i != id)]) : setSelected([id, ...selected]) + } + /> ))}