Skip to content

Commit 04c45a4

Browse files
committed
feat: unified tag system with Medium-style UX and admin dashboard
- Extend tag schema with slug, description, and cached postCount - Add tag_merge_suggestions table for AI-powered duplicate detection - Enhance TagInput with autocomplete showing post counts - Add PopularTagsSidebar component for feed filtering - Implement tag filtering in feed via URL params (?tag=javascript) - Create admin dashboard at /admin/tags with: - Searchable/sortable tag table - Tag editing (title, slug, description) - Merge mode for consolidating duplicate tags - AI merge suggestions panel (ready for integration) - Add migration to convert RSS source categories to tags - Add tag.search, tag.getPopular, tag.getOrCreate API endpoints - Add admin endpoints: getAdminStats, update, mergeTags, recalculateCounts
1 parent d8add79 commit 04c45a4

File tree

15 files changed

+7021
-61
lines changed

15 files changed

+7021
-61
lines changed

app/(app)/admin/_client.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
RssIcon,
99
ShieldExclamationIcon,
1010
NewspaperIcon,
11+
TagIcon,
1112
} from "@heroicons/react/24/outline";
1213
import { api } from "@/server/trpc/react";
1314

@@ -205,6 +206,21 @@ const AdminDashboard = () => {
205206
</p>
206207
</div>
207208
</Link>
209+
210+
<Link
211+
href="/admin/tags"
212+
className="flex items-center gap-3 rounded-lg border border-neutral-200 bg-white p-4 transition-colors hover:border-green-300 hover:bg-green-50 dark:border-neutral-700 dark:bg-neutral-800 dark:hover:border-green-700 dark:hover:bg-green-900/20"
213+
>
214+
<TagIcon className="h-6 w-6 text-green-500" />
215+
<div>
216+
<p className="font-medium text-neutral-900 dark:text-white">
217+
Tag Management
218+
</p>
219+
<p className="text-sm text-neutral-500 dark:text-neutral-400">
220+
Merge, curate, and manage tags
221+
</p>
222+
</div>
223+
</Link>
208224
</div>
209225
</div>
210226
</div>

0 commit comments

Comments
 (0)