"use client" import { useEffect, useMemo, useState } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { DRIVE_BTN_GHOST, DRIVE_BTN_PRIMARY, DRIVE_DIALOG_CONTENT, DRIVE_DIALOG_FOOTER, DRIVE_DIALOG_OVERLAY, DRIVE_TEXT_SECONDARY, DRIVE_TEXT_TITLE, } from "@/lib/drive/drive-dialog-styles" import { buildPageSetupFromDraft, draftFromPageSetup, formatPaperSizeLabel, type DocPageSetup, type PageSetupDraft, } from "@/lib/drive/doc-page-setup" import { pageSetupDraftsEqual, readUserPageSetupDefaults, saveUserPageSetupDefaults, } from "@/lib/drive/docs-page-defaults" import { PAGE_FORMATS, type PageFormatId } from "@/lib/drive/page-formats" import { cn } from "@/lib/utils" type MarginSide = keyof PageSetupDraft["marginsCm"] const MARGIN_FIELDS: { key: MarginSide; label: string }[] = [ { key: "top", label: "Haut" }, { key: "bottom", label: "Bas" }, { key: "left", label: "Gauche" }, { key: "right", label: "Droite" }, ] const FIELD_LABEL = "text-xs font-medium text-muted-foreground" const FIELD_CONTROL = "h-9" function parseMarginInput(raw: string): number { const normalized = raw.replace(",", ".").trim() if (!normalized) return 0 const value = Number.parseFloat(normalized) return Number.isFinite(value) ? value : 0 } export function DocsPageSetupDialog({ open, onOpenChange, pageSetup, fallbackFormatId, onApply, }: { open: boolean onOpenChange: (open: boolean) => void pageSetup: DocPageSetup | null fallbackFormatId: PageFormatId onApply: (setup: DocPageSetup) => void }) { const [draft, setDraft] = useState(() => draftFromPageSetup(pageSetup, fallbackFormatId) ) const [savedDefaults, setSavedDefaults] = useState(() => readUserPageSetupDefaults(fallbackFormatId) ) useEffect(() => { if (open) { setDraft(draftFromPageSetup(pageSetup, fallbackFormatId)) setSavedDefaults(readUserPageSetupDefaults(fallbackFormatId)) } }, [open, pageSetup, fallbackFormatId]) const matchesSavedDefaults = useMemo( () => pageSetupDraftsEqual(draft, savedDefaults), [draft, savedDefaults] ) const handleApply = () => { onApply(buildPageSetupFromDraft(draft, pageSetup)) onOpenChange(false) } const handleSaveDefaults = () => { saveUserPageSetupDefaults(draft) setSavedDefaults({ ...draft }) } const updateMargin = (key: MarginSide, raw: string) => { setDraft((prev) => ({ ...prev, marginsCm: { ...prev.marginsCm, [key]: parseMarginInput(raw) }, })) } return ( Configuration de la page Format, orientation, couleur et marges du document.
Pages Sans pages
setDraft((prev) => ({ ...prev, orientation: value })) } className="flex h-9 items-center gap-5" >
{MARGIN_FIELDS.map(({ key, label }) => (
updateMargin(key, event.target.value)} />
))}
{matchesSavedDefaults ? ( Valeurs par défaut enregistrées ) : ( )}
) }