diff --git a/frontend/src/components/admin/seo/ArticleList.tsx b/frontend/src/components/admin/seo/ArticleList.tsx new file mode 100644 index 0000000..822f946 --- /dev/null +++ b/frontend/src/components/admin/seo/ArticleList.tsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; + +interface Article { + id: number; + headline: string; + slug: string; + status: string; + is_published: boolean; + seo_score: number; + target_keyword: string; + campaign: { name: string } | null; + date_created: string; +} + +interface Props { + initialArticles?: Article[]; +} + +export default function ArticleList({ initialArticles = [] }: Props) { + const [articles, setArticles] = useState(initialArticles); + + const getStatusColor = (status: string, isPublished: boolean) => { + if (isPublished) return 'bg-green-600'; + if (status === 'draft') return 'bg-slate-500'; + if (status === 'review') return 'bg-yellow-500'; + return 'bg-blue-500'; + }; + + return ( + + + Generated Articles + + + + + + + Headline + Keyword + Campaign + Status + Score + Actions + + + + {articles.length > 0 ? articles.map((article) => ( + + + {article.headline} +
{article.slug}
+
+ {article.target_keyword} + {article.campaign?.name || '-'} + + + {article.is_published ? 'Published' : article.status} + + + +
80 ? 'text-green-400' : 'text-yellow-400'}`}> + {article.seo_score || 0} +
+
+ + + +
+ )) : ( + + + No articles found. + + + )} +
+
+
+
+ ); +} diff --git a/frontend/src/pages/admin/content-factory.astro b/frontend/src/pages/admin/content-factory.astro index d170070..a393f54 100644 --- a/frontend/src/pages/admin/content-factory.astro +++ b/frontend/src/pages/admin/content-factory.astro @@ -1,16 +1,9 @@ --- import Layout from '@/layouts/AdminLayout.astro'; -import ContentFactoryDashboard from '@/components/admin/cartesian/ContentFactoryDashboard'; +import ContentFactoryDashboard from '@/components/admin/content/ContentFactoryDashboard'; --- - - -
-
-

Cartesian Content Factory

-

Mission Control for High-Volume Content Generation

-
- - - + +
+
diff --git a/frontend/src/pages/admin/seo/articles/index.astro b/frontend/src/pages/admin/seo/articles/index.astro index 18f017e..9c45573 100644 --- a/frontend/src/pages/admin/seo/articles/index.astro +++ b/frontend/src/pages/admin/seo/articles/index.astro @@ -1,10 +1,22 @@ -``` --- import Layout from '@/layouts/AdminLayout.astro'; import ArticleList from '@/components/admin/seo/ArticleList'; +import { getDirectusClient, readItems } from '@/lib/directus/client'; + +const directus = getDirectusClient(); +const articles = await directus.request(readItems('generated_articles', { + fields: ['*', 'campaign.name'], + limit: 50, + sort: ['-date_created'] +})).catch(() => []); --- - +
+
+

Generated Articles

+

Review and manage AI-generated SEO content.

+
+ +
-```