feat: integrate landing page with real API and add CMS to backoffice

Landing page:
- Events page now fetches from /v1/landing/cms/events (was hardcoded JSON)
- Testimonials section and page fetch from /v1/landing/cms/testimonials
- Removed dummy data, uses ISR with 60s revalidation
- Replaced thumbnail images with text-based cards (API has no thumbnails)
- Avatar initials for testimonials instead of placeholder images

Backoffice CMS:
- Added Events management page (/cms-events) with full CRUD
- Added Testimonials management page (/cms-testimonials) with full CRUD
- Both follow existing backoffice patterns (DataTable, modals, search, pagination)
- Added CMS section to sidebar navigation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
maulanasdqn
2026-04-10 14:42:24 +07:00
co-authored by Claude Opus 4.6
parent 414e4d19b8
commit 2cba806cd5
14 changed files with 1697 additions and 112 deletions
@@ -2,10 +2,12 @@ import {
AppstoreOutlined,
AuditOutlined,
BookOutlined,
CalendarOutlined,
CommentOutlined,
DownOutlined,
InboxOutlined,
LogoutOutlined,
MessageOutlined,
ReadOutlined,
ReloadOutlined,
RightOutlined,
@@ -118,6 +120,22 @@ const MENUS: MenuItem[] = [
},
],
},
{
label: 'CMS',
icon: <BookOutlined className="text-[20px]" />,
children: [
{
label: 'Events',
href: '/cms-events',
icon: <CalendarOutlined className="text-[20px]" />,
},
{
label: 'Testimonials',
href: '/cms-testimonials',
icon: <MessageOutlined className="text-[20px]" />,
},
],
},
{
label: 'Permissions',
href: '/permissions',