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
co-authored by Claude Sonnet 4.6
parent edec03e893
commit e34140c2b1
217 changed files with 4081 additions and 14 deletions
@@ -9,6 +9,7 @@ import { StaffUncheckedUpdateManyWithoutUserNestedInputObjectSchema as StaffUnch
import { NpiProviderUncheckedUpdateManyWithoutUserNestedInputObjectSchema as NpiProviderUncheckedUpdateManyWithoutUserNestedInputObjectSchema } from './NpiProviderUncheckedUpdateManyWithoutUserNestedInput.schema';
import { ClaimUncheckedUpdateManyWithoutUserNestedInputObjectSchema as ClaimUncheckedUpdateManyWithoutUserNestedInputObjectSchema } from './ClaimUncheckedUpdateManyWithoutUserNestedInput.schema';
import { InsuranceCredentialUncheckedUpdateManyWithoutUserNestedInputObjectSchema as InsuranceCredentialUncheckedUpdateManyWithoutUserNestedInputObjectSchema } from './InsuranceCredentialUncheckedUpdateManyWithoutUserNestedInput.schema';
import { ShoppingVendorUncheckedUpdateManyWithoutUserNestedInputObjectSchema as ShoppingVendorUncheckedUpdateManyWithoutUserNestedInputObjectSchema } from './ShoppingVendorUncheckedUpdateManyWithoutUserNestedInput.schema';
import { PaymentUncheckedUpdateManyWithoutUpdatedByNestedInputObjectSchema as PaymentUncheckedUpdateManyWithoutUpdatedByNestedInputObjectSchema } from './PaymentUncheckedUpdateManyWithoutUpdatedByNestedInput.schema';
import { DatabaseBackupUncheckedUpdateManyWithoutUserNestedInputObjectSchema as DatabaseBackupUncheckedUpdateManyWithoutUserNestedInputObjectSchema } from './DatabaseBackupUncheckedUpdateManyWithoutUserNestedInput.schema';
import { BackupDestinationUncheckedUpdateManyWithoutUserNestedInputObjectSchema as BackupDestinationUncheckedUpdateManyWithoutUserNestedInputObjectSchema } from './BackupDestinationUncheckedUpdateManyWithoutUserNestedInput.schema';
@@ -35,6 +36,7 @@ const makeSchema = () => z.object({
npiProviders: z.lazy(() => NpiProviderUncheckedUpdateManyWithoutUserNestedInputObjectSchema).optional(),
claims: z.lazy(() => ClaimUncheckedUpdateManyWithoutUserNestedInputObjectSchema).optional(),
insuranceCredentials: z.lazy(() => InsuranceCredentialUncheckedUpdateManyWithoutUserNestedInputObjectSchema).optional(),
shoppingVendors: z.lazy(() => ShoppingVendorUncheckedUpdateManyWithoutUserNestedInputObjectSchema).optional(),
updatedPayments: z.lazy(() => PaymentUncheckedUpdateManyWithoutUpdatedByNestedInputObjectSchema).optional(),
backups: z.lazy(() => DatabaseBackupUncheckedUpdateManyWithoutUserNestedInputObjectSchema).optional(),
backupDestinations: z.lazy(() => BackupDestinationUncheckedUpdateManyWithoutUserNestedInputObjectSchema).optional(),