improved styling of event-card

This commit is contained in:
z1glr
2025-01-24 16:30:58 +00:00
parent ea3e4573b3
commit 553928062f
5 changed files with 96 additions and 50 deletions

View File

@@ -26,8 +26,6 @@ export default function Events() {
if (result.ok) { if (result.ok) {
const data = await result.json(); const data = await result.json();
console.debug(data);
return { return {
items: data, items: data,
}; };
@@ -72,14 +70,12 @@ export default function Events() {
<div className="flex flex-wrap justify-center gap-4"> <div className="flex flex-wrap justify-center gap-4">
{events.items.filter(showEvent).map((e) => ( {events.items.filter(showEvent).map((e) => (
<Event key={e.eventID} event={e}> <Event key={e.eventID} event={e}>
<div className="mt-auto"> <AssignmentTable
<AvailabilitySelector highlightUser={user?.userName}
event={e} tasks={e.tasks}
className="mb-2" className="mt-auto"
startSelection={e.availability} />
/> <AvailabilitySelector event={e} startSelection={e.availability} />
<AssignmentTable tasks={e.tasks} />
</div>
</Event> </Event>
))} ))}
</div> </div>

View File

@@ -1,5 +1,13 @@
import { classNames } from "@/lib"; import { classNames } from "@/lib";
import { EventData } from "@/Zustand"; import { EventData } from "@/Zustand";
import {
Table,
TableBody,
TableCell,
TableColumn,
TableHeader,
TableRow,
} from "@heroui/react";
export default function AssignmentTable({ export default function AssignmentTable({
tasks, tasks,
@@ -13,26 +21,42 @@ export default function AssignmentTable({
className?: string; className?: string;
}) { }) {
return ( return (
<table className={className}> <div className={className}>
<tbody> <h4 id="assignmentTableHeader">Tasks</h4>
{tasks.map((task) => ( <Table
<tr aria-labelledby="assignmentTableHeader"
key={task.taskID} hideHeader
className={classNames({ removeWrapper
"text-danger": classNames={{
task.userName === highlightUser || td: "text-base",
task.taskName === highlightTask, }}
})} shadow="none"
> title="Tasks"
<th className="pr-4 text-left">{task.taskName}</th> >
<td> <TableHeader>
{task.userName ?? ( <TableColumn>Task</TableColumn>
<span className="italic text-highlight">missing</span> <TableColumn>Volunteer</TableColumn>
)} </TableHeader>
</td> <TableBody items={tasks}>
</tr> {(task) => (
))} <TableRow
</tbody> key={task.taskID}
</table> className={classNames({
"text-danger":
task.userName === highlightUser ||
task.taskName === highlightTask,
})}
>
<TableCell className="font-bold">{task.taskName}</TableCell>
<TableCell>
{task.userName ?? (
<span className="italic text-highlight">missing</span>
)}
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</div>
); );
} }

View File

@@ -49,10 +49,12 @@ export default function AvailabilitySelector({
return ( return (
<Select <Select
items={availabilities.items} items={availabilities.items}
label="Availability" label={<h4>Availability</h4>}
variant="bordered" variant="bordered"
className={className} className={className}
isMultiline classNames={{ label: "text-base", trigger: "py-4" }}
labelPlacement="outside"
placeholder="Set availability"
renderValue={(availability) => ( renderValue={(availability) => (
<div> <div>
{availability.map((a) => {availability.map((a) =>

View File

@@ -2,7 +2,7 @@
import LocalDate from "../LocalDate"; import LocalDate from "../LocalDate";
import { BaseEvent } from "@/Zustand"; import { BaseEvent } from "@/Zustand";
import { Card, CardBody, CardHeader, Divider, Textarea } from "@heroui/react"; import { Card, CardBody, CardFooter, CardHeader, Divider } from "@heroui/react";
import React from "react"; import React from "react";
export default function Event({ export default function Event({
@@ -10,7 +10,7 @@ export default function Event({
children, children,
}: { }: {
event: BaseEvent; event: BaseEvent;
children?: React.ReactNode; children?: React.ReactNode | [React.ReactNode, React.ReactNode];
}) { }) {
return ( return (
<Card <Card
@@ -34,15 +34,21 @@ export default function Event({
</CardHeader> </CardHeader>
<Divider /> <Divider />
<CardBody> <CardBody>
<Textarea {event.description != "" ? (
isReadOnly <div>
label="Description" <h4>Description</h4>
defaultValue={event.description} <div className="ms-2 mt-2">{event.description}</div>
variant="bordered" </div>
/> ) : null}
{children} {Array.isArray(children) ? children[0] : children}
</CardBody> </CardBody>
{Array.isArray(children) ? (
<>
<Divider />
<CardFooter>{children[1]}</CardFooter>
</>
) : null}
</Card> </Card>
); );
} }

View File

@@ -92,14 +92,32 @@ function prepareBody(
} }
} }
export function classNames(classNames: Record<string, boolean>): string { export function classNames(...classNames: (string | undefined)[]): string;
return Object.entries(classNames) export function classNames(classNames: string[]): string;
.map(([classString, value]) => { export function classNames(classNames: Record<string, boolean>): string;
if (value) { export function classNames(
return classString; classNames: string[] | Record<string, boolean> | string | undefined,
} ...rest: (string | undefined)[]
}) ) {
.join(" "); // if rest isn't undefined, use the rest values
if (rest !== undefined) {
return [classNames, ...rest].join(" ");
// if classnames is undefined too, return an empty string
} else if (classNames === undefined) {
return "";
// if classnames is an array, join it
} else if (Array.isArray(classNames)) {
return classNames.join(" ");
// if classnames is an object, join it based on the value
} else {
return Object.entries(classNames)
.filter(([, value]) => value)
.map(([classString]) => classString)
.join(" ");
}
} }
export class DateFormatter { export class DateFormatter {