feat(admin): marketplace console + analytics degraded banners
Deploy / release (push) Skipped
Deploy / deploy (push) Successful in 1m40s

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-07-22 19:06:54 +02:00
1 parent f150aea8b9
commit 025af147cd
9 files changed
+373 -57

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
"use server";
import { revalidatePath } from "next/cache";
import { requirePermissionRateLimited } from "@/lib/admin/guard";
import { PERMS } from "@/lib/permissions";
import { prisma } from "@/lib/prisma";
import { logStaffActivity } from "@/lib/services/staff-activity";
/** Cancel an active marketplace listing (state 1 → 0). */
export async function cancelMarketplaceListing(
formData: FormData,
): Promise<void> {
const staff = await requirePermissionRateLimited(PERMS.SHOP_EDIT);
const id = Number(formData.get("id"));
if (!(id > 0)) return;
const listing = await prisma.marketplaceItems.findUnique({
where: { id },
select: { id: true, state: true, userId: true, itemId: true, price: true },
});
if (listing?.state !== 1) return;
await prisma.marketplaceItems.update({
where: { id },
data: { state: 0 },
});
await logStaffActivity({
staffId: staff.id,
action: "marketplace_cancel",
description: `Cancelled marketplace listing #${id} (item ${listing.itemId}, user ${listing.userId}, price ${listing.price})`,
targetType: "marketplace",
targetId: id,
});
revalidatePath("/admin/marketplace");
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+4 -1
View File
@@ -6,18 +6,21 @@ export function AdminSimplePager({
lastPage,
total,
basePath,
params,
label,
}: {
page: number;
lastPage: number;
total: number;
basePath: string;
/** Extra query params preserved across pages (e.g. filter=sold). */
params?: Record<string, string>;
label?: string;
}) {
if (lastPage <= 1) return null;
const href = (p: number) => {
const u = new URLSearchParams();
const u = new URLSearchParams(params);
u.set("page", String(p));
return `${basePath}?${u.toString()}`;
};
+6
View File
@@ -457,6 +457,12 @@ export const ADMIN_NAV_GROUPS: AdminNavGroup[] = [
icon: ShoppingCart,
permission: PERMS.SHOP_VIEW,
},
{
href: "/admin/marketplace",
labelKey: "marketplace",
icon: Store,
permission: PERMS.SHOP_VIEW,
},
{
href: "/admin/transactions",
labelKey: "transactions",
+19
View File
@@ -1041,6 +1041,7 @@
"hubShop": "Shop & payments",
"catalog": "Catalog",
"shop": "Shop",
"marketplace": "Marketplace",
"transactions": "Transactions",
"vouchers": "Vouchers",
"subscriptions": "Subscriptions",
@@ -1796,6 +1797,24 @@
"cancel": "Cancel"
}
},
"marketplace": {
"title": "Marketplace",
"subtitle": "Hotel marketplace listings",
"activeListings": "Active listings",
"soldListings": "Sold",
"filterActive": "Active",
"filterSold": "Sold",
"empty": "No marketplace listings to show.",
"loadError": "Could not load marketplace data (database unavailable).",
"cancel": "Cancel listing",
"colId": "ID",
"colItem": "Item ID",
"colSeller": "Seller",
"colPrice": "Price",
"colListed": "Listed",
"colSold": "Sold at",
"colActions": "Actions"
},
"transactions": {
"title": "Transactions",
"subtitle": "PayPal payment log",
+19
View File
@@ -971,6 +971,7 @@
"economy": "Economia",
"catalog": "Catalogo",
"shop": "Negozio",
"marketplace": "Marketplace",
"transactions": "Transazioni",
"vouchers": "Buoni",
"subscriptions": "Abbonamenti",
@@ -1734,6 +1735,24 @@
"cancel": "Annulla"
}
},
"marketplace": {
"title": "Marketplace",
"subtitle": "Annunci marketplace hotel",
"activeListings": "Annunci attivi",
"soldListings": "Venduti",
"filterActive": "Attivi",
"filterSold": "Venduti",
"empty": "Nessun annuncio marketplace da mostrare.",
"loadError": "Impossibile caricare i dati marketplace (database non disponibile).",
"cancel": "Annulla annuncio",
"colId": "ID",
"colItem": "Item ID",
"colSeller": "Venditore",
"colPrice": "Prezzo",
"colListed": "Pubblicato",
"colSold": "Venduto il",
"colActions": "Azioni"
},
"transactions": {
"title": "Transazioni",
"subtitle": "Registro pagamenti PayPal",
+19
View File
@@ -1016,6 +1016,7 @@
"economy": "Economie",
"catalog": "Catalogus",
"shop": "Winkel",
"marketplace": "Marketplace",
"transactions": "Transacties",
"vouchers": "Vouchers",
"subscriptions": "Abonnementen",
@@ -1710,6 +1711,24 @@
"cancel": "Annuleren"
}
},
"marketplace": {
"title": "Marketplace",
"subtitle": "Hotel marketplace-aanbiedingen",
"activeListings": "Actieve listings",
"soldListings": "Verkocht",
"filterActive": "Actief",
"filterSold": "Verkocht",
"empty": "Geen marketplace-listings om te tonen.",
"loadError": "Kon marketplace-gegevens niet laden (database niet beschikbaar).",
"cancel": "Listing annuleren",
"colId": "ID",
"colItem": "Item-ID",
"colSeller": "Verkoper",
"colPrice": "Prijs",
"colListed": "Geplaatst",
"colSold": "Verkocht op",
"colActions": "Acties"
},
"transactions": {
"title": "Transacties",
"subtitle": "PayPal betalingslogboek",