feat(admin): pages Marketing et Statistiques (sans envoi)
Ajoute deux entrées au menu d’administration. Les campagnes s’affichent dans un tableau vide honnête. Les statistiques disent clairement qu’aucune mesure n’est encore branchée, sans afficher de zéro trompeur.
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
'use client'
|
||||
|
||||
import { Mail } from 'lucide-react'
|
||||
import { useLanguage } from '@/lib/i18n'
|
||||
|
||||
const COLUMN_KEYS = [
|
||||
'name',
|
||||
'goal',
|
||||
'audience',
|
||||
'language',
|
||||
'offer',
|
||||
'status',
|
||||
'scheduledAt',
|
||||
'accepted',
|
||||
'delivered',
|
||||
'paidConversions',
|
||||
] as const
|
||||
|
||||
export function MarketingAdminClient() {
|
||||
const { t } = useLanguage()
|
||||
|
||||
return (
|
||||
<div className="space-y-6" dir="auto">
|
||||
<div className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
|
||||
<div className="min-w-0">
|
||||
<div className="flex items-center gap-2">
|
||||
<Mail size={20} className="shrink-0 text-brand-accent" aria-hidden />
|
||||
<h1 className="text-2xl font-bold tracking-tight text-foreground">
|
||||
{t('admin.marketing.title')}
|
||||
</h1>
|
||||
</div>
|
||||
<p className="mt-1 max-w-2xl text-sm text-muted-foreground">
|
||||
{t('admin.marketing.description')}
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
disabled
|
||||
title={t('admin.marketing.createDisabledHint')}
|
||||
className="inline-flex h-10 items-center justify-center rounded-xl border border-border bg-muted/40 px-4 text-sm font-medium text-muted-foreground opacity-70"
|
||||
>
|
||||
{t('admin.marketing.createCampaign')}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="overflow-x-auto rounded-xl border border-border bg-card">
|
||||
<table className="w-full min-w-[56rem] border-collapse text-start text-[13px]">
|
||||
<caption className="sr-only">{t('admin.marketing.title')}</caption>
|
||||
<thead>
|
||||
<tr className="border-b border-border bg-muted/30">
|
||||
{COLUMN_KEYS.map((key) => (
|
||||
<th
|
||||
key={key}
|
||||
scope="col"
|
||||
className="whitespace-nowrap px-3 py-2.5 font-semibold text-foreground"
|
||||
>
|
||||
{t(`admin.marketing.columns.${key}`)}
|
||||
</th>
|
||||
))}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colSpan={COLUMN_KEYS.length} className="px-3 py-12 text-center">
|
||||
<p className="font-medium text-foreground">{t('admin.marketing.emptyTitle')}</p>
|
||||
<p className="mx-auto mt-1 max-w-lg text-sm text-muted-foreground">
|
||||
{t('admin.marketing.emptyBody')}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
7
memento-note/app/(admin)/admin/marketing/page.tsx
Normal file
7
memento-note/app/(admin)/admin/marketing/page.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
import { MarketingAdminClient } from './marketing-admin-client'
|
||||
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
export default function AdminMarketingPage() {
|
||||
return <MarketingAdminClient />
|
||||
}
|
||||
Reference in New Issue
Block a user