fix: tell receivers when an order is no longer available + fix disabled apps disappearing from admin
## Task #80 — Tell receivers when an order is no longer available to claim ### Problem When a receiver tried to act on an order that had already been cancelled, completed, or claimed by someone else, the UI showed a generic "Could not complete the action" toast. The stale card also stayed in the list, requiring a manual refresh. ### Changes **artifacts/api-server/src/routes/service-orders.ts** - PATCH /orders/:id/confirm-receipt: after a failed atomic claim, query the current order status; return 409 `order_unavailable` if it's cancelled/completed (vs the existing 409 `already_claimed` for when it was grabbed by someone else first) - PATCH /orders/:id/status (preparing/completed branch): terminal-state check runs BEFORE permission gating — returns 409 `order_unavailable` when order is already cancelled/completed instead of ever hitting 403 Forbidden - PATCH /orders/:id/status (cancel branch): same — terminal-state check moved to the top of the branch so non-admin receivers trying to cancel an already-terminal order get 409 `order_unavailable` (not 403 Forbidden which would never let the UI remove the stale card) **artifacts/tx-os/src/pages/orders-incoming.tsx** - handleConfirmReceipt onError: distinguish 409 `order_unavailable` from `already_claimed`, show specific toast, remove stale card via invalidate() - handleSetStatus onError: same pattern — specific toast + invalidate() on `order_unavailable` - handleCancel onError: same pattern **artifacts/tx-os/src/locales/en.json + ar.json** - Added `incomingOrders.orderUnavailable` ("This order is no longer available" / "هذا الطلب لم يعد متاحاً") ## Bonus fix — Disabled app disappears from admin panel (user-reported) ### Problem When an admin disabled an app via the toggle, the app disappeared from the admin panel too (isActive filter applied to everyone), making it impossible to re-enable without direct DB access. ### Changes **artifacts/api-server/src/routes/apps.ts** - getVisibleAppsForUser: admins now receive ALL apps including inactive ones via conditional $dynamic() Drizzle query; non-admins still only see active apps **artifacts/tx-os/src/pages/home.tsx** - Filter orderedApps to only active apps before rendering so inactive apps don't appear on the home screen even for admins **artifacts/tx-os/src/pages/admin.tsx** - Inactive app cards show reduced opacity + a "Disabled/معطّل" badge **artifacts/tx-os/src/locales/en.json + ar.json** - Added `admin.appDisabled` ("Disabled" / "معطّل")
This commit is contained in:
@@ -299,14 +299,15 @@ export default function HomePage() {
|
||||
|
||||
useEffect(() => {
|
||||
if (!apps) return;
|
||||
const activeApps = apps.filter((a) => a.isActive);
|
||||
setOrderedApps((prev) => {
|
||||
if (!prev) return apps;
|
||||
const byId = new Map(apps.map((a) => [a.id, a]));
|
||||
if (!prev) return activeApps;
|
||||
const byId = new Map(activeApps.map((a) => [a.id, a]));
|
||||
const kept = prev
|
||||
.map((a) => byId.get(a.id))
|
||||
.filter((a): a is App => a !== undefined);
|
||||
const keptIds = new Set(kept.map((a) => a.id));
|
||||
const added = apps.filter((a) => !keptIds.has(a.id));
|
||||
const added = activeApps.filter((a) => !keptIds.has(a.id));
|
||||
return [...kept, ...added];
|
||||
});
|
||||
}, [apps]);
|
||||
|
||||
Reference in New Issue
Block a user