feat(13-03): add aiPlacementKey prop to FieldPlacer and thread through PdfViewerWrapper/PdfViewer
- Add aiPlacementKey?: number to FieldPlacerProps interface - Add aiPlacementKey to loadFields useEffect dependency array for re-fetch on AI placement - Thread aiPlacementKey through PdfViewer and PdfViewerWrapper prop chains
This commit is contained in:
@@ -163,9 +163,10 @@ interface FieldPlacerProps {
|
|||||||
textFillData?: Record<string, string>;
|
textFillData?: Record<string, string>;
|
||||||
onFieldSelect?: (fieldId: string | null) => void;
|
onFieldSelect?: (fieldId: string | null) => void;
|
||||||
onFieldValueChange?: (fieldId: string, value: string) => void;
|
onFieldValueChange?: (fieldId: string, value: string) => void;
|
||||||
|
aiPlacementKey?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function FieldPlacer({ docId, pageInfo, currentPage, children, readOnly = false, onFieldsChanged, selectedFieldId, textFillData, onFieldSelect, onFieldValueChange }: FieldPlacerProps) {
|
export function FieldPlacer({ docId, pageInfo, currentPage, children, readOnly = false, onFieldsChanged, selectedFieldId, textFillData, onFieldSelect, onFieldValueChange, aiPlacementKey = 0 }: FieldPlacerProps) {
|
||||||
const [fields, setFields] = useState<SignatureFieldData[]>([]);
|
const [fields, setFields] = useState<SignatureFieldData[]>([]);
|
||||||
const [isDraggingToken, setIsDraggingToken] = useState<string | null>(null);
|
const [isDraggingToken, setIsDraggingToken] = useState<string | null>(null);
|
||||||
const containerRef = useRef<HTMLDivElement | null>(null);
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
||||||
@@ -198,7 +199,8 @@ export function FieldPlacer({ docId, pageInfo, currentPage, children, readOnly =
|
|||||||
useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 5 } }),
|
useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 5 } }),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Load existing fields from server on mount
|
// Load existing fields from server on mount and whenever aiPlacementKey changes
|
||||||
|
// aiPlacementKey increments after AI placement so this re-fetches AI-placed fields from DB
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function loadFields() {
|
async function loadFields() {
|
||||||
try {
|
try {
|
||||||
@@ -212,7 +214,7 @@ export function FieldPlacer({ docId, pageInfo, currentPage, children, readOnly =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
loadFields();
|
loadFields();
|
||||||
}, [docId]);
|
}, [docId, aiPlacementKey]);
|
||||||
|
|
||||||
// Update containerSize whenever pageInfo changes (page load or zoom change)
|
// Update containerSize whenever pageInfo changes (page load or zoom change)
|
||||||
// Use pageInfo.width/height (from react-pdf canvas) as the authoritative rendered size.
|
// Use pageInfo.width/height (from react-pdf canvas) as the authoritative rendered size.
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export function PdfViewer({
|
|||||||
textFillData,
|
textFillData,
|
||||||
onFieldSelect,
|
onFieldSelect,
|
||||||
onFieldValueChange,
|
onFieldValueChange,
|
||||||
|
aiPlacementKey,
|
||||||
}: {
|
}: {
|
||||||
docId: string;
|
docId: string;
|
||||||
docStatus?: string;
|
docStatus?: string;
|
||||||
@@ -35,6 +36,7 @@ export function PdfViewer({
|
|||||||
textFillData?: Record<string, string>;
|
textFillData?: Record<string, string>;
|
||||||
onFieldSelect?: (fieldId: string | null) => void;
|
onFieldSelect?: (fieldId: string | null) => void;
|
||||||
onFieldValueChange?: (fieldId: string, value: string) => void;
|
onFieldValueChange?: (fieldId: string, value: string) => void;
|
||||||
|
aiPlacementKey?: number;
|
||||||
}) {
|
}) {
|
||||||
const [numPages, setNumPages] = useState(0);
|
const [numPages, setNumPages] = useState(0);
|
||||||
const [pageNumber, setPageNumber] = useState(1);
|
const [pageNumber, setPageNumber] = useState(1);
|
||||||
@@ -95,6 +97,7 @@ export function PdfViewer({
|
|||||||
textFillData={textFillData}
|
textFillData={textFillData}
|
||||||
onFieldSelect={onFieldSelect}
|
onFieldSelect={onFieldSelect}
|
||||||
onFieldValueChange={onFieldValueChange}
|
onFieldValueChange={onFieldValueChange}
|
||||||
|
aiPlacementKey={aiPlacementKey}
|
||||||
>
|
>
|
||||||
<Document
|
<Document
|
||||||
file={`/api/documents/${docId}/file`}
|
file={`/api/documents/${docId}/file`}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export function PdfViewerWrapper({
|
|||||||
textFillData,
|
textFillData,
|
||||||
onFieldSelect,
|
onFieldSelect,
|
||||||
onFieldValueChange,
|
onFieldValueChange,
|
||||||
|
aiPlacementKey,
|
||||||
}: {
|
}: {
|
||||||
docId: string;
|
docId: string;
|
||||||
docStatus?: string;
|
docStatus?: string;
|
||||||
@@ -19,6 +20,7 @@ export function PdfViewerWrapper({
|
|||||||
textFillData?: Record<string, string>;
|
textFillData?: Record<string, string>;
|
||||||
onFieldSelect?: (fieldId: string | null) => void;
|
onFieldSelect?: (fieldId: string | null) => void;
|
||||||
onFieldValueChange?: (fieldId: string, value: string) => void;
|
onFieldValueChange?: (fieldId: string, value: string) => void;
|
||||||
|
aiPlacementKey?: number;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<PdfViewer
|
<PdfViewer
|
||||||
@@ -29,6 +31,7 @@ export function PdfViewerWrapper({
|
|||||||
textFillData={textFillData}
|
textFillData={textFillData}
|
||||||
onFieldSelect={onFieldSelect}
|
onFieldSelect={onFieldSelect}
|
||||||
onFieldValueChange={onFieldValueChange}
|
onFieldValueChange={onFieldValueChange}
|
||||||
|
aiPlacementKey={aiPlacementKey}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user