diff --git a/frontend/src/components/pageEditor/DragDropGrid.tsx b/frontend/src/components/pageEditor/DragDropGrid.tsx index faa51acb2..518fe8cc7 100644 --- a/frontend/src/components/pageEditor/DragDropGrid.tsx +++ b/frontend/src/components/pageEditor/DragDropGrid.tsx @@ -124,9 +124,14 @@ const DragDropGrid = ({ const [dropSide, setDropSide] = useState<'left' | 'right' | null>(null); const lastCursorXRef = useRef(null); - // Configure sensors for dnd-kit + // Configure sensors for dnd-kit with activation constraint + // Require 10px movement before drag starts to allow clicks for selection const sensors = useSensors( - useSensor(PointerSensor) + useSensor(PointerSensor, { + activationConstraint: { + distance: 10, + }, + }) ); // Throttled pointer move handler for drop indicator diff --git a/frontend/src/components/pageEditor/PageEditor.tsx b/frontend/src/components/pageEditor/PageEditor.tsx index fbd6a11fd..d8e46f8a3 100644 --- a/frontend/src/components/pageEditor/PageEditor.tsx +++ b/frontend/src/components/pageEditor/PageEditor.tsx @@ -201,6 +201,11 @@ const PageEditor = ({ // Interface functions for parent component const displayDocument = editedDocument || mergedPdfDocument; + // Derived values for right rail and usePageEditorRightRailButtons (must be after displayDocument) + const totalPages = displayDocument?.pages.length || 0; + const selectedPageCount = selectedPageIds.length; + const activeFileIds = selectedFileIds; + // Utility functions to convert between page IDs and page numbers const getPageNumbersFromIds = useCallback((pageIds: string[]): number[] => { if (!displayDocument) return []; @@ -712,6 +717,44 @@ const PageEditor = ({ setSelectionMode(false); }, [actions]); + // Function to reorder pages based on new file order + const reorderPagesByFileOrder = useCallback((newFileOrder: FileId[]) => { + const docToUpdate = editedDocument || mergedPdfDocument; + if (!docToUpdate) return; + + // Group pages by originalFileId + const pagesByFileId = new Map(); + docToUpdate.pages.forEach(page => { + if (page.originalFileId) { + if (!pagesByFileId.has(page.originalFileId)) { + pagesByFileId.set(page.originalFileId, []); + } + pagesByFileId.get(page.originalFileId)!.push(page); + } + }); + + // Rebuild pages array in new file order + const reorderedPages: PDFPage[] = []; + newFileOrder.forEach(fileId => { + const filePages = pagesByFileId.get(fileId); + if (filePages) { + reorderedPages.push(...filePages); + } + }); + + // Renumber pages + const renumberedPages = reorderedPages.map((page, idx) => ({ + ...page, + pageNumber: idx + 1 + })); + + setEditedDocument({ + ...docToUpdate, + pages: renumberedPages, + totalPages: renumberedPages.length + }); + }, [editedDocument, mergedPdfDocument]); + usePageEditorRightRailButtons({ totalPages, selectedPageCount,