Skip to content

Commit ad2eb59

Browse files
feat: rooms page task overview component (#258)
* feat: rooms overview match hi-fi
1 parent 8b18b59 commit ad2eb59

File tree

4 files changed

+74
-30
lines changed

4 files changed

+74
-30
lines changed

clients/web/src/components/rooms/OverviewCard.tsx

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import type { ReactNode } from "react";
2+
import { UrgentIcon } from "@/icons/urgent";
23
import { cn } from "@/lib/utils";
34

45
export type OverviewCardColumn = {
56
field: string;
67
value: ReactNode;
8+
valueSecondary?: ReactNode;
79
description: string;
10+
urgent?: boolean;
811
};
912

1013
type OverviewCardProps = {
@@ -19,23 +22,53 @@ export function OverviewCard({
1922
className = "",
2023
}: OverviewCardProps) {
2124
return (
22-
<section className={cn("bg-white px-[1vw] py-[1.5vh]", className)}>
23-
<h2 className="text-md font-medium text-text-default">{title}</h2>
25+
<section className={cn("flex w-full min-w-0 flex-col bg-white", className)}>
26+
<h2 className="my-2 shrink-0 text-sm font-medium leading-tight text-neutral-400">
27+
{title}
28+
</h2>
2429

25-
<div className="mt-[1vh] h-[0.125vh] w-full bg-stroke-subtle" />
30+
<div className="h-0.5 w-full shrink-0 bg-stroke-subtle" />
2631

27-
<div className="mt-[1.8vh] grid grid-cols-3 gap-[1.7vw]">
32+
<div className="mt-0 flex flex-wrap items-start justify-between gap-y-2">
2833
{columns.map((col) => (
29-
<div key={col.field} className="flex flex-col gap-[1vw]">
30-
<div className="text-sm font-medium leading-tight text-text-default">
31-
{col.field}
34+
<div
35+
key={col.field}
36+
className="flex min-h-px min-w-px flex-1 flex-col gap-1 p-4"
37+
>
38+
<div className="text-sm leading-tight text-text-default">
39+
{col.urgent ? (
40+
<span className="inline-flex gap-0.5">
41+
<UrgentIcon
42+
className="h-4.5 w-4.5 shrink-0 text-text-default"
43+
aria-hidden
44+
/>
45+
{col.field}
46+
</span>
47+
) : (
48+
col.field
49+
)}
3250
</div>
3351

34-
<div className="text-4xl font-semibold tracking-tight text-text-default">
35-
{col.value}
52+
<div
53+
className={cn(
54+
"inline-flex max-w-full min-w-0 flex-nowrap items-center gap-x-1 leading-[1.4] tracking-[-0.32px]",
55+
col.valueSecondary != null && "whitespace-nowrap",
56+
)}
57+
>
58+
<span className="text-[32px] font-bold text-text-default">
59+
{col.value}
60+
</span>
61+
{col.valueSecondary != null && (
62+
<span className="text-[11px] font-medium tracking-normal text-text-subtle">
63+
{" / "}
64+
{col.valueSecondary}
65+
</span>
66+
)}
3667
</div>
3768

38-
<div className="text-sm text-text-default">{col.description}</div>
69+
<div className="text-sm leading-tight text-neutral-400">
70+
{col.description}
71+
</div>
3972
</div>
4073
))}
4174
</div>

clients/web/src/components/rooms/RoomsOverview.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@ export function RoomsOverview({ rooms }: RoomsOverviewProps) {
2323
const vacantRooms = totalRooms - occupiedRooms;
2424

2525
return (
26-
<aside className="w-1/4 shrink-0 min-h-0 overflow-y-auto bg-white p-[2vw]">
27-
<div className="flex flex-col gap-[2.2vh]">
26+
<aside className="w-1/4 shrink-0 min-h-0 overflow-y-auto px-6">
27+
<div className="flex flex-col">
2828
<OverviewCard
2929
title="Tasks"
3030
columns={[
31-
{ field: "Urgent", value: 0, description: "Tasks" },
31+
{
32+
field: "Urgent",
33+
value: 0,
34+
description: "Tasks",
35+
urgent: true,
36+
},
3237
{
3338
field: "Unassigned",
3439
value: cleaningOnlyRooms,
@@ -43,8 +48,9 @@ export function RoomsOverview({ rooms }: RoomsOverviewProps) {
4348
columns={[
4449
{
4550
field: "Floor Occupancy",
46-
value: vacantRooms,
47-
description: "Rooms left",
51+
value: occupiedRooms,
52+
valueSecondary: totalRooms,
53+
description: "Rooms occupied",
4854
},
4955
{
5056
field: "Expected Arrivals",

clients/web/src/routes/_protected/rooms.index.tsx

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { RoomsHeader } from "@/components/rooms/RoomsHeader";
1010
import { RoomsList } from "@/components/rooms/RoomsList";
1111
import { RoomDetailsDrawer } from "@/components/rooms/RoomDetailsDrawer";
1212
import { GeneratedRequestDrawer } from "@/components/requests/GeneratedRequestDrawer";
13+
import { RoomsOverview } from "@/components/rooms/RoomsOverview";
1314

1415
export const Route = createFileRoute("/_protected/rooms/")({
1516
component: RoomsPage,
@@ -57,25 +58,28 @@ function RoomsPage() {
5758
}
5859
drawerOpen={generatedRequest !== null || selectedRoom !== null}
5960
drawer={drawerContent}
61+
bodyClassName="overflow-hidden"
62+
contentClassName={"h-full pb-26.5"}
6063
>
6164
<SortByContainer ascending={ascending} setAscending={setAscending} />
62-
<RoomsList
63-
rooms={rooms?.items ?? []}
64-
ascending={ascending}
65-
onRoomSelect={(room) => {
66-
setGeneratedRequest(null);
67-
setSelectedRoom(room);
68-
}}
69-
selectedRoomNumber={selectedRoom?.room_number ?? null}
70-
/>
71-
{generatedRequest === null && selectedRoom === null && (
72-
<GlobalTaskInput
73-
onRequestGenerated={(r) => {
74-
setSelectedRoom(null);
75-
setGeneratedRequest(r);
65+
<div className="flex min-h-0 flex-row">
66+
<RoomsList
67+
rooms={rooms?.items ?? []}
68+
ascending={ascending}
69+
onRoomSelect={(room) => {
70+
setGeneratedRequest(null);
71+
setSelectedRoom(room);
7672
}}
73+
selectedRoomNumber={selectedRoom?.room_number ?? null}
7774
/>
78-
)}
75+
<RoomsOverview rooms={rooms?.items ?? []} />
76+
</div>
77+
<GlobalTaskInput
78+
onRequestGenerated={(r) => {
79+
setSelectedRoom(null);
80+
setGeneratedRequest(r);
81+
}}
82+
/>
7983
</PageShell>
8084
);
8185
}

clients/web/src/styles.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
--color-text-subtle: #747474;
5757
--color-text-secondary: #5d5d5d;
5858
--color-bg-selected: #edf5f1;
59+
--color-neutral-400: #808080;
5960
--color-muted: #f0f0f0;
6061
--color-request-pending-secondary: #fcdcd1;
6162
--color-request-pending: #f25118;

0 commit comments

Comments
 (0)