From 6ec1dc34d541bd70297788234ef7e5d73fdef656 Mon Sep 17 00:00:00 2001 From: cawcenter Date: Mon, 15 Dec 2025 00:16:46 -0500 Subject: [PATCH] feat: UI redesign phase 1 - components + 2 pages (avatars, campaigns) --- src/components/admin/PageHeader.astro | 19 ++ src/components/admin/StatCard.astro | 23 +++ .../admin/collections/campaign-masters.astro | 79 ++++++- .../collections/geo-intelligence-test.astro | 66 ++++++ src/pages/admin/intelligence/avatars.astro | 192 +++++++++--------- 5 files changed, 273 insertions(+), 106 deletions(-) create mode 100644 src/components/admin/PageHeader.astro create mode 100644 src/components/admin/StatCard.astro create mode 100644 src/pages/admin/collections/geo-intelligence-test.astro diff --git a/src/components/admin/PageHeader.astro b/src/components/admin/PageHeader.astro new file mode 100644 index 0000000..5473412 --- /dev/null +++ b/src/components/admin/PageHeader.astro @@ -0,0 +1,19 @@ +--- +interface Props { + icon: string; + title: string; + description: string; +} + +const { icon, title, description } = Astro.props; +--- + +
+
+ {icon} +
+

{title}

+

{description}

+
+
+
diff --git a/src/components/admin/StatCard.astro b/src/components/admin/StatCard.astro new file mode 100644 index 0000000..cfdf0e0 --- /dev/null +++ b/src/components/admin/StatCard.astro @@ -0,0 +1,23 @@ +--- +interface Props { + icon: string; + label: string; + value: string | number; + color?: 'gold' | 'green' | 'blue' | 'red'; +} + +const { icon, label, value, color = 'gold' } = Astro.props; + +const colorClasses = { + gold: 'text-gold-500', + green: 'text-green-400', + blue: 'text-blue-400', + red: 'text-red-400' +}; +--- + +
+
{icon}
+
{value}
+
{label}
+
diff --git a/src/pages/admin/collections/campaign-masters.astro b/src/pages/admin/collections/campaign-masters.astro index f2170f6..dc5d5fb 100644 --- a/src/pages/admin/collections/campaign-masters.astro +++ b/src/pages/admin/collections/campaign-masters.astro @@ -1,13 +1,80 @@ --- import AdminLayout from '../../../layouts/AdminLayout.astro'; -import CollectionTable from '../../../components/admin/CollectionTable'; +import PageHeader from '../../../components/admin/PageHeader.astro'; +import StatCard from '../../../components/admin/StatCard.astro'; + +const endpoint = '/api/collections/campaign_masters'; +const columns = ['name', 'campaign_type', 'status', 'created_at']; --- - + +
+ + + + +
+ +
+
+
+

All Campaigns

+ +
+
+ + + + + {columns.map(col => ( + + ))} + + + + + + + + +
+ {col.replace(/_/g, ' ')} + Actions
Loading...
+
+ +
diff --git a/src/pages/admin/collections/geo-intelligence-test.astro b/src/pages/admin/collections/geo-intelligence-test.astro new file mode 100644 index 0000000..79477d7 --- /dev/null +++ b/src/pages/admin/collections/geo-intelligence-test.astro @@ -0,0 +1,66 @@ +--- +import AdminLayout from '../../../layouts/AdminLayout.astro'; +--- + + +
+

Geo Intelligence - Simple Test

+ +
+

Page Status

+

βœ… Page is loading!

+

If you see this, the Astro page is working.

+
+ +
+

API Test

+ +
+
+ +
+

Manual Data Fetch

+
Loading...
+
+
+ + +
diff --git a/src/pages/admin/intelligence/avatars.astro b/src/pages/admin/intelligence/avatars.astro index 3ca7b13..7e8e8da 100644 --- a/src/pages/admin/intelligence/avatars.astro +++ b/src/pages/admin/intelligence/avatars.astro @@ -1,107 +1,99 @@ -/** - * Avatar Intelligence Management - * Full CRUD for avatar_intelligence collection - */ - --- -import AdminLayout from '@/layouts/AdminLayout.astro'; -import { getDirectusClient } from '@/lib/directus/client'; -import { readItems } from '@/lib/directus/client'; +import PageHeader from '../../../components/admin/PageHeader.astro'; +import StatCard from '../../../components/admin/StatCard.astro'; -const client = getDirectusClient(); - -let avatars = []; -let error = null; - -try { - avatars = await client.request(readItems('avatar_intelligence', { - fields: ['*'], - sort: ['base_name'], - })); -} catch (e) { - console.error('Error fetching avatars:', e); - error = e instanceof Error ? e.message : 'Unknown error'; -} +const endpoint = '/api/collections/avatars'; +const columns = ['name', 'persona_type', 'tone', 'created_at']; --- - -
- -
-
-

Avatar Intelligence

-

Manage persona profiles and variants

-
-
- - - - ✨ New Avatar - -
-
+ + - {error && ( -
- Error: {error} -
- )} - - -
-
-
Total Avatars
-
{avatars.length}
-
-
- - -
- {avatars.map((avatar: any) => ( -
-
-

{avatar.base_name}

- -
- -
-
- Wealth Cluster: - {avatar.wealth_cluster || 'Not set'} -
- - {avatar.business_niches && ( -
- Niches: -
- {avatar.business_niches.slice(0, 3).map((niche: string) => ( - - {niche} - - ))} - {avatar.business_niches.length > 3 && ( - - +{avatar.business_niches.length - 3} more - - )} -
-
- )} -
-
- ))} - - {avatars.length === 0 && !error && ( -
-

No avatars found. Create your first one!

-
- )} -
+ +
+ + +
+ + +
+
+

All Avatars

+
+ + + + + {columns.map(col => ( + + ))} + + + + + + + + +
+ {col.replace(/_/g, ' ')} + Actions
+ Loading data... +
+
+ +