a6f1059ddf
Uniform stock management for healthcare linen rooms: the coordinator app, the phone counter and the staff app, for your own server. Built from a113353 on 2026-09-15. Licensed under the Functional Source License (FSL-1.1-ALv2).
44 lines
2.2 KiB
TypeScript
44 lines
2.2 KiB
TypeScript
"use client";
|
|
/* Everything else the app does.
|
|
*
|
|
* There used to be an "On the desktop" section here listing five things the phone couldn't do —
|
|
* greyed out, untappable, and so just a list of disappointments in the middle of a menu. A menu
|
|
* should be things you can do. The catalogue moved onto the phone rather than staying on that
|
|
* list; the rest are simply not advertised here any more. */
|
|
import { useMemo } from "react";
|
|
import { useSnap } from "@/lib/client";
|
|
import { OPEN_STATUSES } from "@/lib/compute";
|
|
import { MBody, MNav, MRow, MRule, MSection, MTop } from "@/components/m";
|
|
|
|
export default function MMore() {
|
|
const { s } = useSnap();
|
|
|
|
const activeItems = useMemo(() => s.catalog.filter((i) => !i.archived).length, [s.catalog]);
|
|
|
|
const counts = useMemo(() => {
|
|
const waiting = s.pickups.filter((p) => !p.pickedUp).length;
|
|
const incoming = s.orders.filter((o) => OPEN_STATUSES.includes(o.status) && o.status !== "Draft").length;
|
|
const rounds = s.pickups.filter((p) => !p.pickedUp && p.deliveredTo).length;
|
|
return { waiting, incoming, rounds };
|
|
}, [s]);
|
|
|
|
return (
|
|
<>
|
|
<MTop title="More" />
|
|
<MRule />
|
|
<MBody>
|
|
<MSection label="Everything else" />
|
|
<MRow href="/m/receive" mark="ink" title="Receive a delivery" sub={counts.incoming ? `${counts.incoming} order${counts.incoming === 1 ? "" : "s"} on their way` : "Nothing on order"} />
|
|
<MRow href="/m/pickups" mark={counts.waiting ? "accent" : "ink"} attention={counts.waiting > 0} title="Pickup call list" sub={counts.waiting ? `${counts.waiting} waiting to be collected` : "Nobody waiting"} />
|
|
<MRow href="/m/rounds" mark="ink" title="Delivery round" sub={counts.rounds ? `${counts.rounds} to drop off` : "Nothing loaded"} />
|
|
<MRow href="/m/label" mark="ink" title="Reprint a label" sub="For a barcode that has worn off" />
|
|
<MRow href="/m/variance" mark="ink" title="Variance over time" sub="What keeps going missing" />
|
|
<MRow href="/m/catalogue" mark="ink" title="Catalogue" sub={`${activeItems} garment${activeItems === 1 ? "" : "s"}, sizes and pricing`} />
|
|
<MRow href="/m/settings" mark="ink" title="Settings" sub={s.session.name} />
|
|
|
|
</MBody>
|
|
<MNav />
|
|
</>
|
|
);
|
|
}
|