diff --git a/src/components/Accounts/AccountsPage.tsx b/src/components/Accounts/AccountsPage.tsx index 6c02e50..fd6e242 100644 --- a/src/components/Accounts/AccountsPage.tsx +++ b/src/components/Accounts/AccountsPage.tsx @@ -1,5 +1,5 @@ -import { useContext, useState, useEffect } from 'react'; -import { IconPlus, IconSearch, IconTrash, IconEdit, IconChevronDown } from '@tabler/icons-react'; +import { useContext, useState, useEffect, useRef, useMemo } from 'react'; +import { IconPlus, IconSearch, IconTrash, IconEdit, IconChevronDown, IconLayoutGrid, IconLayoutList } from '@tabler/icons-react'; import { checkIfLoggedIn, @@ -63,20 +63,18 @@ export default function AccountsPage() { const [filter, setFilter] = useState(''); const [events, setEvents] = useState(); const [hasDeletedEvent, setHasDeletedEvent] = useState(false); - const [sortBy, setSortBy] = useState<'dateCreated' | 'lastModified'>( - 'lastModified' - ); + const [sortBy, setSortBy] = useState<'dateCreated' | 'lastModified' | ''>(''); const [selectedEventToDelete, setSelectedEventToDelete] = useState(null); const [dontAskAgain, setDontAskAgain] = useState(false); + const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); + const [roleFilter, setRoleFilter] = useState<'all' | 'admin' | 'participant'>('all'); const handleInputChange = (e: any) => { setFilter(e.target.value.toLowerCase()); }; const getSortedEvents = (events: AccountsPageEvent[]) => { - // return events; // remove later - console.log(events); return [...events].sort((a, b) => { @@ -95,6 +93,36 @@ export default function AccountsPage() { }); }; + const filledOutRef = useRef(null); + + const createdCount = useMemo(() => + getSortedEvents(events ?? []).filter(e => + e.iAmCreator && + (e.id.toLowerCase().includes(filter) || e.name.toLowerCase().includes(filter)) + ).length + , [events, filter, sortBy]); + + const filledCount = useMemo(() => + getSortedEvents(events ?? []).filter(e => + !e.iAmCreator && + (e.id.toLowerCase().includes(filter) || e.name.toLowerCase().includes(filter)) + ).length + , [events, filter, sortBy]); + + const flatFilteredEvents = useMemo(() => + getSortedEvents(events ?? []).filter(e => { + const matchesSearch = e.id.toLowerCase().includes(filter) || e.name.toLowerCase().includes(filter); + const matchesRole = + roleFilter === 'all' || + (roleFilter === 'admin' && e.iAmCreator) || + (roleFilter === 'participant' && !e.iAmCreator); + return matchesSearch && matchesRole; + }) + , [events, filter, sortBy, roleFilter]); + + const showCreated = roleFilter === 'all' || roleFilter === 'admin'; + const showFilled = roleFilter === 'all' || roleFilter === 'participant'; + return (
- {/* Sort Dropdown */}
@@ -175,6 +203,39 @@ export default function AccountsPage() {
+
+ {(['all', 'admin', 'participant'] as const).map((role) => ( + + ))} +
+ +
+ + +
+ - - + + {events && events.length !== 0 ? ( + <> + {viewMode === 'list' ? ( +
+ + + + + + + + + + {flatFilteredEvents.length === 0 ? ( + + + + ) : flatFilteredEvents.map((event) => ( + + + + + + ))} + +
NameRoleActions
+ No events match your search or filter. +
+ {event.name} + + + + {event.iAmCreator ? 'Admin' : 'Participant'} + + +
+ + + {event.iAmCreator && ( + <> + + + + )} +
+
+
+ ) : ( + /* Existing grid view — unchanged except roleFilter gates each section */ +
+ + {showCreated && ( +
+
+
+
+

Created by You

+ + ({createdCount}) + +
+ {showFilled && ( + )}
+ {createdCount === 0 ? ( +

No created events match your search.

+ ) : ( +
+ {getSortedEvents(events) + .filter(e => + e.iAmCreator && + (e.id.toLowerCase().includes(filter) || e.name.toLowerCase().includes(filter)) + ) + .map((event) => ( +
+
+
+

+ {event.name} +

+ {event.iAmCreator && ( +
+ + +
+ )} +
+
+ + +
+
+
+ ))} +
+ )} +
+ )} -
- + {showCreated && showFilled && ( +
+ )} - + {showFilled && ( +
+
+
+

Filled Out by You

+ + ({filledCount}) +
+ {filledCount === 0 ? ( +

No filled out events match your search.

+ ) : ( +
+ {getSortedEvents(events) + .filter(e => + !e.iAmCreator && + (e.id.toLowerCase().includes(filter) || e.name.toLowerCase().includes(filter)) + ) + .map((event) => ( +
+
+
+

+ {event.name} +

+
+
+ + +
+
+
+ ))} +
+ )}
-
- ))} -
+ )} + +
+ )} + ) : events !== undefined ? ( getAccountId() === '' ? (
@@ -274,22 +502,7 @@ export default function AccountsPage() { ) ) : undefined} -
- {checkIfLoggedIn() ? ( - - ) : ( - - )} -
); -} +} \ No newline at end of file