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}
/> />
<AssignmentTable tasks={e.tasks} /> <AvailabilitySelector event={e} startSelection={e.availability} />
</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,10 +21,25 @@ 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"
hideHeader
removeWrapper
classNames={{
td: "text-base",
}}
shadow="none"
title="Tasks"
>
<TableHeader>
<TableColumn>Task</TableColumn>
<TableColumn>Volunteer</TableColumn>
</TableHeader>
<TableBody items={tasks}>
{(task) => (
<TableRow
key={task.taskID} key={task.taskID}
className={classNames({ className={classNames({
"text-danger": "text-danger":
@@ -24,15 +47,16 @@ export default function AssignmentTable({
task.taskName === highlightTask, task.taskName === highlightTask,
})} })}
> >
<th className="pr-4 text-left">{task.taskName}</th> <TableCell className="font-bold">{task.taskName}</TableCell>
<td> <TableCell>
{task.userName ?? ( {task.userName ?? (
<span className="italic text-highlight">missing</span> <span className="italic text-highlight">missing</span>
)} )}
</td> </TableCell>
</tr> </TableRow>
))} )}
</tbody> </TableBody>
</table> </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;
export function classNames(classNames: string[]): string;
export function classNames(classNames: Record<string, boolean>): string;
export function classNames(
classNames: string[] | Record<string, boolean> | string | undefined,
...rest: (string | undefined)[]
) {
// 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) return Object.entries(classNames)
.map(([classString, value]) => { .filter(([, value]) => value)
if (value) { .map(([classString]) => classString)
return classString;
}
})
.join(" "); .join(" ");
}
} }
export class DateFormatter { export class DateFormatter {