feat: add AI Dental Shopping section with sidebar nav and Login Info page

- Add AI Dental Shopping to sidebar with Search/Tag and Login Info sub-pages
- Build full-stack Login Info CRUD: save vendor name, website, username, password per user
- Add ShoppingVendor Prisma model, run db push, regenerate client and Zod schemas
- Add storage layer, REST API at /api/shopping-vendors/, and frontend table with add/edit/delete modal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gitead
2026-05-17 00:35:38 -04:00
parent edec03e893
commit e34140c2b1
217 changed files with 4081 additions and 14 deletions

View File

@@ -30,6 +30,9 @@ import {
Building2,
Timer,
BookOpen,
ShoppingCart,
Search,
KeyRound,
} from "lucide-react";
import { cn } from "@/lib/utils";
import { useMemo, useState, useEffect } from "react";
@@ -62,6 +65,7 @@ export function Sidebar() {
const s = new Set<string>();
if (location.startsWith("/chart")) s.add("/chart");
if (location.startsWith("/settings")) s.add("/settings");
if (location.startsWith("/dental-shopping")) s.add("/dental-shopping");
return s;
});
@@ -72,6 +76,9 @@ export function Sidebar() {
if (location.startsWith("/settings")) {
setExpandedPaths((prev) => new Set([...prev, "/settings"]));
}
if (location.startsWith("/dental-shopping")) {
setExpandedPaths((prev) => new Set([...prev, "/dental-shopping"]));
}
}, [location]);
const togglePath = (path: string) => {
@@ -162,6 +169,23 @@ export function Sidebar() {
path: "/cloud-storage",
icon: <Cloud className="h-5 w-5 text-sky-500" />,
},
{
name: "AI Dental Shopping",
path: "/dental-shopping",
icon: <ShoppingCart className="h-5 w-5 text-cyan-500" />,
children: [
{
name: "Search / Tag",
path: "/dental-shopping/search-tag",
icon: <Search className="h-4 w-4 text-cyan-400" />,
},
{
name: "Login Info",
path: "/dental-shopping/login-info",
icon: <KeyRound className="h-4 w-4 text-cyan-400" />,
},
],
},
{
name: "Database Management",
path: "/database-management",