similar event update
This commit is contained in:
@@ -64,13 +64,28 @@ const EventDetailsPage = () => {
|
|||||||
<h4 className="font-bold text-large">{event.title}</h4>
|
<h4 className="font-bold text-large">{event.title}</h4>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardBody className="pb-0 pt-2 px-4 flex-col items-start">
|
<CardBody className="pb-0 pt-2 px-4 flex-col items-start">
|
||||||
|
{event.evtPicture && (
|
||||||
|
<div style={{
|
||||||
|
width: '100px',
|
||||||
|
height: '100px',
|
||||||
|
overflow: 'hidden',
|
||||||
|
borderRadius: '8px',
|
||||||
|
position: 'relative'
|
||||||
|
}}>
|
||||||
<img
|
<img
|
||||||
alt={event.title}
|
src={`${config.serverAddress}/events/evtPicture/${event.id}`}
|
||||||
className="object-cover rounded-xl"
|
alt="Event Picture"
|
||||||
src={event.imageUrl}
|
style={{
|
||||||
width="100%"
|
width: '100%',
|
||||||
height={300}
|
height: '100%',
|
||||||
|
objectFit: 'cover',
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<p className="text-gray-600 mt-4">{event.description}</p>
|
<p className="text-gray-600 mt-4">{event.description}</p>
|
||||||
<p className="text-gray-600 mt-2">
|
<p className="text-gray-600 mt-2">
|
||||||
<strong>Date:</strong> {new Date(event.date).toLocaleDateString()}
|
<strong>Date:</strong> {new Date(event.date).toLocaleDateString()}
|
||||||
@@ -114,13 +129,28 @@ const EventDetailsPage = () => {
|
|||||||
<h4 className="font-bold text-large">{similarEvent.title}</h4>
|
<h4 className="font-bold text-large">{similarEvent.title}</h4>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardBody className="pb-0 pt-2 px-4 flex-col items-start">
|
<CardBody className="pb-0 pt-2 px-4 flex-col items-start">
|
||||||
|
{similarEvent.evtPicture && (
|
||||||
|
<div style={{
|
||||||
|
width: '100px',
|
||||||
|
height: '100px',
|
||||||
|
overflow: 'hidden',
|
||||||
|
borderRadius: '8px',
|
||||||
|
position: 'relative'
|
||||||
|
}}>
|
||||||
<img
|
<img
|
||||||
alt={similarEvent.title}
|
src={`${config.serverAddress}/events/evtPicture/${similarEvent.id}`}
|
||||||
className="object-cover rounded-xl"
|
alt="Event Picture"
|
||||||
src={similarEvent.imageUrl}
|
style={{
|
||||||
width="100%"
|
width: '100%',
|
||||||
height={180}
|
height: '100%',
|
||||||
|
objectFit: 'cover',
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</CardBody>
|
</CardBody>
|
||||||
<CardFooter className="flex flex-col items-start p-4">
|
<CardFooter className="flex flex-col items-start p-4">
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Table,
|
Table,
|
||||||
TableHeader,
|
TableHeader,
|
||||||
@@ -6,8 +6,12 @@ import {
|
|||||||
TableBody,
|
TableBody,
|
||||||
TableRow,
|
TableRow,
|
||||||
TableCell,
|
TableCell,
|
||||||
Avatar,
|
|
||||||
Button,
|
Button,
|
||||||
|
Modal,
|
||||||
|
ModalContent,
|
||||||
|
ModalHeader,
|
||||||
|
ModalBody,
|
||||||
|
ModalFooter,
|
||||||
} from "@nextui-org/react";
|
} from "@nextui-org/react";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { PencilSquareIcon, TrashIcon } from "../icons";
|
import { PencilSquareIcon, TrashIcon } from "../icons";
|
||||||
@@ -16,12 +20,13 @@ import config from "../config";
|
|||||||
|
|
||||||
const ManageEventsPage = () => {
|
const ManageEventsPage = () => {
|
||||||
const [events, setEvents] = useState<any[]>([]);
|
const [events, setEvents] = useState<any[]>([]);
|
||||||
|
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
|
||||||
|
const [selectedEventId, setSelectedEventId] = useState<string | null>(null);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const fetchEvents = async () => {
|
const fetchEvents = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await axios.get(config.serverAddress + "/events");
|
const res = await axios.get(config.serverAddress + "/events");
|
||||||
console.log("Fetched events data:", res.data); // Debug log
|
|
||||||
setEvents(res.data);
|
setEvents(res.data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to fetch events:", error);
|
console.error("Failed to fetch events:", error);
|
||||||
@@ -36,10 +41,18 @@ const ManageEventsPage = () => {
|
|||||||
navigate(`editEvent/${id}`);
|
navigate(`editEvent/${id}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDelete = async (id: string) => {
|
const handleDeleteClick = (id: string) => {
|
||||||
|
setSelectedEventId(id);
|
||||||
|
setIsDeleteModalOpen(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const deleteEvent = async () => {
|
||||||
|
if (selectedEventId === null) return;
|
||||||
try {
|
try {
|
||||||
await axios.delete(`${config.serverAddress}/events/${id}`);
|
await axios.delete(`${config.serverAddress}/events/${selectedEventId}`);
|
||||||
setEvents(events.filter((event) => event.id !== id));
|
setEvents(events.filter((event) => event.id !== selectedEventId));
|
||||||
|
setSelectedEventId(null);
|
||||||
|
setIsDeleteModalOpen(false);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to delete event:", error);
|
console.error("Failed to delete event:", error);
|
||||||
}
|
}
|
||||||
@@ -64,6 +77,7 @@ const ManageEventsPage = () => {
|
|||||||
{events.map((event) => (
|
{events.map((event) => (
|
||||||
<TableRow key={event.id}>
|
<TableRow key={event.id}>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
|
<div><span>{event.title}</span></div>
|
||||||
<div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>
|
<div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>
|
||||||
{event.evtPicture && (
|
{event.evtPicture && (
|
||||||
<div style={{
|
<div style={{
|
||||||
@@ -108,7 +122,7 @@ const ManageEventsPage = () => {
|
|||||||
size="sm"
|
size="sm"
|
||||||
variant="flat"
|
variant="flat"
|
||||||
color="danger"
|
color="danger"
|
||||||
onPress={() => handleDelete(event.id)}
|
onPress={() => handleDeleteClick(event.id)}
|
||||||
>
|
>
|
||||||
<TrashIcon />
|
<TrashIcon />
|
||||||
</Button>
|
</Button>
|
||||||
@@ -124,6 +138,33 @@ const ManageEventsPage = () => {
|
|||||||
>
|
>
|
||||||
Add events
|
Add events
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
{/* Delete Confirmation Modal */}
|
||||||
|
<Modal
|
||||||
|
isOpen={isDeleteModalOpen}
|
||||||
|
onOpenChange={setIsDeleteModalOpen}
|
||||||
|
isDismissable={false}
|
||||||
|
isKeyboardDismissDisabled={true}
|
||||||
|
>
|
||||||
|
<ModalContent>
|
||||||
|
{(onClose) => (
|
||||||
|
<>
|
||||||
|
<ModalHeader className="flex flex-col gap-1">Delete Event</ModalHeader>
|
||||||
|
<ModalBody>
|
||||||
|
<p>Are you sure you want to delete this event?</p>
|
||||||
|
</ModalBody>
|
||||||
|
<ModalFooter>
|
||||||
|
<Button onPress={onClose}>
|
||||||
|
Cancel
|
||||||
|
</Button>
|
||||||
|
<Button onPress={() => { deleteEvent(); onClose(); }}>
|
||||||
|
Delete
|
||||||
|
</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</ModalContent>
|
||||||
|
</Modal>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user