Security recovery: hold sweep, dashboard updates, and admin fixes.

This commit is contained in:
Michilis
2026-07-01 05:51:38 +00:00
parent 38526f17b5
commit cacc52ec24
45 changed files with 1452 additions and 474 deletions
@@ -22,6 +22,7 @@ import {
groupByBooking,
isUnpaid,
isAwaitingApproval,
isOnHold,
ticketAmount,
shareTicket,
isToday,
@@ -57,11 +58,12 @@ export default function OverviewTab({
// awaiting approval), ordered by soonest event.
const attentionTicket = useMemo(() => {
const candidates = activeTickets.filter(
(t) => isUnpaid(t) || isAwaitingApproval(t)
(t) => isUnpaid(t) || isOnHold(t) || isAwaitingApproval(t)
);
const priority = (t: UserTicket) => (isUnpaid(t) ? 0 : isOnHold(t) ? 1 : 2);
candidates.sort((a, b) => {
const aUnpaid = isUnpaid(a) ? 0 : 1;
const bUnpaid = isUnpaid(b) ? 0 : 1;
const aUnpaid = priority(a);
const bUnpaid = priority(b);
if (aUnpaid !== bUnpaid) return aUnpaid - bUnpaid;
const aStart = a.event?.startDatetime
? parseDate(a.event.startDatetime).getTime()
@@ -190,7 +192,19 @@ export default function OverviewTab({
</div>
<div className="flex items-center gap-3">
<StatusPill status={status} locale={locale} />
{isUnpaid(t) ? (
{isOnHold(t) ? (
<PayActions
ticketId={t.id}
amount={amount}
currency={currency}
destination={title}
locale={locale}
onPaid={onChange}
layout="inline"
size="sm"
onHold
/>
) : isUnpaid(t) ? (
<PayActions
ticketId={t.id}
amount={amount}
@@ -346,7 +360,19 @@ function HeroCard({
)}
{/* Smart primary action. */}
{isUnpaid(ticket) ? (
{isOnHold(ticket) ? (
<PayActions
ticketId={ticket.id}
amount={amount}
currency={currency}
destination={title}
locale={locale}
onPaid={onChange}
layout="inline"
size="md"
onHold
/>
) : isUnpaid(ticket) ? (
<PayActions
ticketId={ticket.id}
amount={amount}