Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion client/src/components/EventCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export interface EventCardProps {
onUnarchive?: () => void;
isUnarchiving?: boolean;
onEdit?: () => void;
editDisabled?: boolean;
canDelete?: boolean;
className?: string;
allowCancellation?: boolean;
Expand Down Expand Up @@ -205,6 +206,7 @@ export default function EventCard({
onUnarchive,
isUnarchiving = false,
onEdit,
editDisabled = false,
canDelete = false,
status,
className,
Expand Down Expand Up @@ -1069,6 +1071,7 @@ export default function EventCard({
<Button
className="flex-1 order-2"
onClick={() => onEdit()}
disabled={editDisabled}
data-testid={`button-edit-${id}`}
>
<Edit className="h-4 w-4 mr-1" />
Expand Down Expand Up @@ -1897,7 +1900,7 @@ export default function EventCard({
e.preventDefault();
executeCancellation();
}}
className="bg-red-600 hover:bg-red-700 text-white"
className="bg-red-600 hover:bg-red-700 text-white focus-visible:ring-0 border-0"
>
{isCanceling ? "Canceling..." : "Yes, Cancel"}
</AlertDialogAction>
Expand Down
17 changes: 15 additions & 2 deletions client/src/components/EventsDetailsDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,29 @@ export default function EventDetailsDialog({
});
};

const formatStringTime = (timeStr?: string) => {
if (!timeStr) return null;
if (/^\d{1,2}:\d{2}$/.test(timeStr)) {
const [hoursStr, minutesStr] = timeStr.split(":");
let hours = parseInt(hoursStr, 10);
const suffix = hours >= 12 ? "PM" : "AM";
hours = hours % 12;
hours = hours ? hours : 12;
return `${hours}:${minutesStr} ${suffix}`;
}
return timeStr;
};

const startTime =
event.startTime ||
formatStringTime(event.startTime) ||
(event.startDate
? new Date(event.startDate).toLocaleTimeString("en-US", {
hour: "2-digit",
minute: "2-digit",
})
: null);
const endTime =
event.endTime ||
formatStringTime(event.endTime) ||
(event.endDate
? new Date(event.endDate).toLocaleTimeString("en-US", {
hour: "2-digit",
Expand Down
70 changes: 68 additions & 2 deletions client/src/pages/EventsOfficeDashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1433,6 +1433,32 @@ export default function EventsOfficeDashboard() {
eventEndDate &&
eventEndDate.getTime() < now.getTime();

// Check if event has started (for disabling edit)
let isStarted = false;
if (event.eventType === "trip" && event.startDate) {
const tripStartDate = new Date(event.startDate);
if (tripStartDate <= now) {
isStarted = true;
}
} else if (
event.eventType === "bazaar" &&
event.startDate
) {
const bazaarStart = new Date(event.startDate);
if (
event.startTime &&
/^\d{1,2}:\d{2}$/.test(event.startTime)
) {
const [h, m] = event.startTime
.split(":")
.map(Number);
bazaarStart.setHours(h, m, 0, 0);
}
if (bazaarStart <= now) {
isStarted = true;
}
}

return (
<div key={event._id || index} className="h-full">
<EventCard
Expand Down Expand Up @@ -1514,6 +1540,7 @@ export default function EventsOfficeDashboard() {
onDelete={() => handleDeleteEvent(event._id)}
hideRegisterButton={true}
onViewDetails={() => handleCardClick(event._id)}
editDisabled={isStarted}
{...(isPastEvent
? {
onArchive: () =>
Expand All @@ -1525,7 +1552,8 @@ export default function EventsOfficeDashboard() {
"conference",
"bazaar",
"workshop",
].includes(event.eventType)
].includes(event.eventType) &&
userRole === "events_office"
? {
onEdit: () => {
if (event.eventType === "workshop") {
Expand Down Expand Up @@ -1554,13 +1582,51 @@ export default function EventsOfficeDashboard() {
setLocation(
`/events-office/events/trip/edit/${event._id}`
);
} else if (
event.eventType === "bazaar"
) {
if (event.startDate) {
const now = new Date();
const bazaarStart = new Date(
event.startDate
);

if (
event.startTime &&
/^\d{1,2}:\d{2}$/.test(
event.startTime
)
) {
const [h, m] = event.startTime
.split(":")
.map(Number);
bazaarStart.setHours(
h,
m,
0,
0
);
}

if (bazaarStart <= now) {
toast({
title: "Cannot Edit Bazaar",
description:
"Cannot edit a bazaar that has already started.",
variant: "destructive",
});
return;
}
}
setLocation(
`/create/bazaar?id=${event._id}`
);
} else {
const editRoutes: Record<
string,
string
> = {
conference: `/events-office/events/conference/edit/${event._id}`,
bazaar: `/create/bazaar?id=${event._id}`,
};
const route =
editRoutes[event.eventType];
Expand Down
17 changes: 15 additions & 2 deletions client/src/pages/WorkshopApprovals.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -326,14 +326,27 @@ export default function WorkshopApprovals() {
const endDateStr = selectedWorkshop
? formatWorkshopDate(selectedWorkshop.endDate)
: "";
const formatStringTime = (timeStr?: string) => {
if (!timeStr) return null;
if (/^\d{1,2}:\d{2}$/.test(timeStr)) {
const [hoursStr, minutesStr] = timeStr.split(":");
let hours = parseInt(hoursStr, 10);
const suffix = hours >= 12 ? "PM" : "AM";
hours = hours % 12;
hours = hours ? hours : 12;
return `${hours}:${minutesStr} ${suffix}`;
}
return timeStr;
};

const startTimeStr = selectedWorkshop
? selectedWorkshop.startTime ||
? formatStringTime(selectedWorkshop.startTime) ||
(selectedWorkshop.startDate
? formatWorkshopTime(selectedWorkshop.startDate)
: "")
: "";
const endTimeStr = selectedWorkshop
? selectedWorkshop.endTime ||
? formatStringTime(selectedWorkshop.endTime) ||
(selectedWorkshop.endDate
? formatWorkshopTime(selectedWorkshop.endDate)
: "")
Expand Down
Loading