From bf1a732eb0737a6e2a0e52d5b0f78e3fbf7ce645 Mon Sep 17 00:00:00 2001 From: Steyn229 Date: Tue, 14 Jan 2025 00:16:02 +0100 Subject: [PATCH 1/2] added userlist for co workers, changed time and layout of events. --- bin/Debug/net8.0/Web-Development.dll | Bin 198144 -> 198144 bytes bin/Debug/net8.0/Web-Development.pdb | Bin 58376 -> 58496 bytes frontend/clientapp/src/App.tsx | 7 + .../src/components/calendar/events.tsx | 534 ++++-------- .../src/components/shop/Dashboard.tsx | 7 + .../src/components/shop/PointsShop.tsx | 192 ++--- .../src/components/shop/UserDashboard.tsx | 94 +++ .../net8.0/Web-Development.AssemblyInfo.cs | 2 +- ...Development.csproj.CoreCompileInputs.cache | 2 +- ...eb-Development.csproj.FileListAbsolute.txt | 762 +++++++++--------- obj/Debug/net8.0/Web-Development.dll | Bin 198144 -> 198144 bytes .../Web-Development.genruntimeconfig.cache | 2 +- obj/Debug/net8.0/Web-Development.pdb | Bin 58376 -> 58496 bytes .../net8.0/Web-Development.sourcelink.json | 2 +- obj/Debug/net8.0/ref/Web-Development.dll | Bin 47104 -> 47104 bytes obj/Debug/net8.0/refint/Web-Development.dll | Bin 47104 -> 47104 bytes ....buildMultiTargeting.Web-Development.props | 2 +- ...uild.buildTransitive.Web-Development.props | 2 +- 18 files changed, 737 insertions(+), 871 deletions(-) create mode 100644 frontend/clientapp/src/components/shop/UserDashboard.tsx diff --git a/bin/Debug/net8.0/Web-Development.dll b/bin/Debug/net8.0/Web-Development.dll index 510bced27d7cfe06f1b9ed96f8a2cee7e8fbbcf5..52ce399e408f4a9cb23826d972063886716603b9 100644 GIT binary patch delta 452 zcmZqZ;c4jMnb5&9Yn9r$i9IrmW)oM2Gd`Nk$XL&4Gr5tmo=Hr)nTe^LiHUJL6BE<2 zet`&+o!mv|WIY<~G&GKVxhAxI$3!ND01Y!!0}EpdLrb$%%QUm36eHslO9N9Q^JEiq z6C)#Y)8s@$1H&|PL(^@Kn660je)^DioPp6dfQf;DVfyrkznSD&cS|ud?4Hj0he^49 zcH*D8trqV*o8EqXceVB4Oh%w8{m|mnqGJ8xlGMt)jMSW*)V!4Z{GvR4&%Ct!qTIxi z%;ZFcti;43g_82rR0WNc)YKdWBTfDA)Fc$ceo~gcOKMVSx_(}2iG`kl{`9&(OwvYBM@YgP0d%r^>93lj;rdK#xeDVqaY-`+ zodp3ZAhyCpMKNG#O@I7{NozXaU#1(|`TjAvG5eb_m@*hJSTGm^u_1#cgBe3AkW2&8 zNen3rMnLftAm0F}%80?7A(_DhNSXlIAf73Zp9s`t0K{oPz9EC@_Qj0MsZ2~3*4qVH LnBOx_G++k+gYb;N delta 436 zcmZqZ;c4jMnb5(q=uNF(k#bnlvFzaE|0y%K@0iG>5TKEqmY9-kU}9=unrfPomS&J@mYSGiYHprt zXlR;hVPa-tYMyFho|L%l5z`e(-h?On-!L%x1~4%&Fyu{t_?tej&aOMt%z~SPcF?(%_}L6anCIAC{2n9 zPfgNwNi9pw$u9tjml?(6CuPOBq$ZW7$K<7!Sm+s`E72=RNn!~0a5OSCV}M%NQvtS6 z;qNMt`vkP_uN8`$Dtt3|Lit0W<6z*o)btO3n52LKGo9xzlh$<8zf3o$2mEEy*v|Kl z$&J}RnIVlKks*a4nZba;guxU@nlhvUaSBj84aiGnFau(c3R4DiAWUU21VWG+3!r*4 hupW@82~aMHA#wX+M&?u|CIRd1f-KDM87CUB0|3x?kL3UW diff --git a/bin/Debug/net8.0/Web-Development.pdb b/bin/Debug/net8.0/Web-Development.pdb index c8f9da11e8872e979ead9ca1a9d1f8113d93f6f5..3904d94547b311eaf0c31de617deb28b1a0ba23a 100644 GIT binary patch delta 10511 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 WMSqxd8(#r0-ZNMex0mZIp#K9=FAR79 diff --git a/frontend/clientapp/src/App.tsx b/frontend/clientapp/src/App.tsx index 72ee5197..91a0aaa6 100644 --- a/frontend/clientapp/src/App.tsx +++ b/frontend/clientapp/src/App.tsx @@ -11,6 +11,7 @@ import AdminDashboard from './components/shop/Admindashboard'; import UserDetails from './components/auth/Userdetails'; import Achievements from './components/achievements/Achievements'; import Layout from './components/layout/Layout'; +import UserDashboard from './components/shop/UserDashboard'; interface ProtectedRouteProps { children: ReactNode; @@ -72,6 +73,12 @@ function App() { } /> + + + + + } /> diff --git a/frontend/clientapp/src/components/calendar/events.tsx b/frontend/clientapp/src/components/calendar/events.tsx index 561c9bf2..fdd63e63 100644 --- a/frontend/clientapp/src/components/calendar/events.tsx +++ b/frontend/clientapp/src/components/calendar/events.tsx @@ -1,29 +1,30 @@ import React, { useEffect, useState } from "react"; -import { Loader2, CheckCircle, XCircle, ArrowUpDown, ChevronDown, MoreHorizontal, Pencil, Trash2 } from "lucide-react"; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "../../components/ui/dialog" -import { ColumnDef, ColumnFiltersState, SortingState, - VisibilityState, flexRender, getCoreRowModel, - getFilteredRowModel, getPaginationRowModel, getSortedRowModel, - useReactTable -} from "@tanstack/react-table" - -import { Label } from "../../components/ui/label" - -import { Button } from "../../components/ui/button" -import { Input } from "../../components/ui/input" - -import { DropdownMenu, DropdownMenuCheckboxItem, - DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, - DropdownMenuSeparator, DropdownMenuTrigger -} from "../../components/ui/dropdown-menu" - -import { Table, TableBody, TableCell, - TableHead, TableHeader, TableRow -} from "../../components/ui/table" - -import { Textarea } from "../../components/ui/textarea" - -import { Checkbox } from "../../components/ui/checkbox" +import { + Loader2, + CheckCircle, + XCircle, + ArrowUpDown, + ChevronDown, + MoreHorizontal, + Trash2, + Clipboard, + Plus, + Users, +} from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../../components/ui/dialog"; +import { Button } from "../../components/ui/button"; +import { Input } from "../../components/ui/input"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../../components/ui/table"; +import { Checkbox } from "../../components/ui/checkbox"; +import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from "../../components/ui/dropdown-menu"; interface Event { id: string; @@ -35,105 +36,88 @@ interface Event { approval: boolean; } -const EventsDashboard: React.FC = () => { +interface User { + id: string; + role: string; // To check if user is admin +} +const EventsDashboard: React.FC = () => { const [events, setEvents] = useState([]); + const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); + const [isAdmin, setIsAdmin] = useState(false); // Check if the user is an admin const [error, setError] = useState(null); - const [sorting, setSorting] = React.useState([]) - const [columnFilters, setColumnFilters] = React.useState([]) - const [columnVisibility, setColumnVisibility] = React.useState({}) - const [rowSelection, setRowSelection] = React.useState({}) - const [id, setId] = useState(""); - const [title, setTitle] = useState(""); - const [description, setDescription] = useState(""); - const [startTime, setStartTime] = useState(""); - const [endTime, setEndTime] = useState(""); - const [location, setLocation] = useState(""); - const [approval, setApproval] = useState(false); - - const handleUpdateEvent = async (e: React.FormEvent) => { - e.preventDefault(); + useEffect(() => { + const fetchUserData = async () => { + const token = localStorage.getItem("token"); + if (!token) { + alert("User is not logged in"); + return; + } - const updatedEvent = { - Id: id, - Title: title, - Description: description, - StartTime: startTime, - EndTime: endTime, - Location: location, - Approval: approval, + try { + // Fetch user data + const userResponse = await fetch("http://localhost:5001/api/user/fromToken", { + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + }); + + if (!userResponse.ok) throw new Error("Failed to fetch user data"); + + const userData: User = await userResponse.json(); + setUser(userData); + setIsAdmin(userData.role === "Admin"); // Check if user is admin + } catch (err) { + setError("Failed to load user data"); + } }; - try { - const response = await fetch("http://localhost:5001/api/events/update", { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(updatedEvent), - }); - - if (response.ok) { - const updatedEventData = await response.json(); - alert("Event updated successfully!"); - setEvents((prevEvents) => - prevEvents.map((evt) => (evt.id === id ? updatedEventData : evt)) - ); - } else { - throw new Error("Failed to update event."); + const fetchEvents = async () => { + try { + const response = await fetch("http://localhost:5001/api/events/all"); + if (!response.ok) throw new Error("Failed to fetch events."); + const data: Event[] = await response.json(); + setEvents(data); + } catch (err) { + setError("Something went wrong."); + } finally { + setLoading(false); } - } catch (error) { - alert(error); - } - }; - - const handleCreateEvent = async (e: React.FormEvent) => { - e.preventDefault(); - - const newEvent = { - Title: title, - Description: description, - StartTime: startTime, - EndTime: endTime, - Location: location, - Approval: approval, }; - try { - const response = await fetch("http://localhost:5001/api/events/create", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(newEvent), - }); + fetchUserData(); + fetchEvents(); + }, []); - if (!response.ok) { - throw new Error(`Failed to update event: ${response.statusText}`); - } - - const contentType = response.headers.get("content-type"); - if (contentType && contentType.includes("application/json")) { - const data = await response.json(); - alert("Event updated successfully!"); - console.log(data); // Debugging: Check the returned data - } else { - alert("Event updated successfully!"); - } - } catch (error) { - alert(error); - } + const handleJoinEvent = (eventId: string) => { + alert(`You joined event with ID: ${eventId}`); + // Implement join logic here + }; + + const handleCopyEventId = (eventId: string) => { + navigator.clipboard.writeText(eventId); + alert(`Copied Event ID: ${eventId}`); }; const handleDeleteEvent = async (eventId: string) => { + if (!isAdmin) { + alert("Only admins can delete events."); + return; + } + try { const response = await fetch(`http://localhost:5001/api/events/delete/${eventId}`, { method: "DELETE", headers: { "Content-Type": "application/json" }, }); - + if (!response.ok) { - throw new Error(`Failed to delete event: ${response.statusText}`); + throw new Error("Failed to delete event."); } - + alert("Event deleted successfully!"); setEvents((prevEvents) => prevEvents.filter((event) => event.id !== eventId)); } catch (error) { @@ -141,109 +125,6 @@ const EventsDashboard: React.FC = () => { } }; - React.useEffect(() => { - const fetchEvents = async () => { - try { - const response = await fetch("http://localhost:5001/api/events/all"); - if (!response.ok) throw new Error("Failed to fetch events."); - const data: Event[] = await response.json(); - setEvents(data); - } catch (err) { - setError("Something went wrong."); - } finally { - setLoading(false); - } - }; - fetchEvents(); - }, []); - - const columns: ColumnDef[] = [ - { - accessorKey: "id", - header: "ID", - cell: ({ row }) => (
{row.getValue("id")}
) - }, - { - accessorKey: "title", - header: ({ column }) => { - return ( - - ) - }, - cell: ({ row }) =>
{row.getValue("title")}
- }, - { - accessorKey: "description", - header: "Description", - cell: ({ row }) =>
{row.getValue("description")}
- }, - { - accessorKey: "startTime", - header: "Start Time", - cell: ({ row }) =>
{row.getValue("startTime")}
- }, - { - accessorKey: "endTime", - header: "End Time", - cell: ({ row }) =>
{row.getValue("endTime")}
- }, - { - accessorKey: "location", - header: "Location", - cell: ({ row }) =>
{row.getValue("location")}
- }, - { - accessorKey: "approval", - header: "Approval", - cell: ({ row }) =>
{row.getValue("approval") ? : }
- }, - { - id: "actions", - enableHiding: false, - cell: ({ row }) => { - const payment = row.original - - return ( - - - - - - Actions - navigator.clipboard.writeText(payment.id)}>Copy ID - - {handleDeleteEvent(payment.id)}}> Delete Event - - - - ) - }, - }, - ] - - const table = useReactTable({ - data: events, - columns, - onSortingChange: setSorting, - onColumnFiltersChange: setColumnFilters, - getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), - getSortedRowModel: getSortedRowModel(), - getFilteredRowModel: getFilteredRowModel(), - onColumnVisibilityChange: setColumnVisibility, - onRowSelectionChange: setRowSelection, - state: { - sorting, - columnFilters, - columnVisibility, - rowSelection, - }, - }) - if (loading) { return (
@@ -263,190 +144,103 @@ const EventsDashboard: React.FC = () => { return (
- table.getColumn("title")?.setFilterValue(event.target.value)} className="max-w-sm"/> - - - - - - - - Create event - Make changes to your event here. Click save when you're done. - -
-
- -
- - setTitle(e.target.value)} required/> -
- -
- -