From 3aec109510a925af81048a42a3e42bed58c24f93 Mon Sep 17 00:00:00 2001 From: Tony Piper Date: Sat, 11 Apr 2026 08:33:31 +0100 Subject: [PATCH 1/3] fix: default destination page to match source on single page import Previously the destination page always defaulted to page 1, meaning users importing a page export (e.g. page 21) would need to manually change the destination, risking accidentally overwriting the wrong page. Co-Authored-By: Claude Sonnet 4.6 --- webui/src/ImportExport/Import/Page.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webui/src/ImportExport/Import/Page.tsx b/webui/src/ImportExport/Import/Page.tsx index fbea7cb58e..e235463eb7 100644 --- a/webui/src/ImportExport/Import/Page.tsx +++ b/webui/src/ImportExport/Import/Page.tsx @@ -66,13 +66,15 @@ export const ImportPageWizard = observer(function ImportPageWizard({ } }, [snapshot.pages, snapshot.page, isSinglePage]) - const { pageNumber, setPageNumber, changePage } = usePagePicker(pages.data.length, 1) const { pageNumber: importPageNumber, setPageNumber: setImportPageNumber, changePage: changeImportPage, } = usePagePicker(pageCount, 1) + const defaultDestinationPage = isSinglePage ? (snapshot.oldPageNumber ?? 1) : importPageNumber + const { pageNumber, setPageNumber, changePage } = usePagePicker(pages.data.length, defaultDestinationPage) + const setConnectionRemap2 = useCallback( (fromId: string, toId: string) => { setConnectionRemap((oldRemap) => ({ From 874e6f9caf95dd3321c2ea4a0c2ccfdf5950427a Mon Sep 17 00:00:00 2001 From: Tony Piper Date: Sat, 11 Apr 2026 08:42:06 +0100 Subject: [PATCH 2/3] fix: clamp default destination page to valid range If snapshot.oldPageNumber is out of range for the destination system, default to new page (-1) rather than an invalid page number. Co-Authored-By: Claude Sonnet 4.6 --- webui/src/ImportExport/Import/Page.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/webui/src/ImportExport/Import/Page.tsx b/webui/src/ImportExport/Import/Page.tsx index e235463eb7..1935c087d2 100644 --- a/webui/src/ImportExport/Import/Page.tsx +++ b/webui/src/ImportExport/Import/Page.tsx @@ -72,7 +72,14 @@ export const ImportPageWizard = observer(function ImportPageWizard({ changePage: changeImportPage, } = usePagePicker(pageCount, 1) - const defaultDestinationPage = isSinglePage ? (snapshot.oldPageNumber ?? 1) : importPageNumber + const defaultDestinationPage = useMemo(() => { + if (!isSinglePage) return importPageNumber + const oldPage = snapshot.oldPageNumber + if (typeof oldPage === 'number' && Number.isInteger(oldPage) && oldPage >= 1 && oldPage <= pages.data.length) { + return oldPage + } + return -1 + }, [isSinglePage, importPageNumber, snapshot.oldPageNumber, pages.data.length]) const { pageNumber, setPageNumber, changePage } = usePagePicker(pages.data.length, defaultDestinationPage) const setConnectionRemap2 = useCallback( From c01c9e5bcd715aa989a5fb42a2ff5ae822ac8bbb Mon Sep 17 00:00:00 2001 From: Tony Piper Date: Mon, 13 Apr 2026 14:18:40 +0100 Subject: [PATCH 3/3] refactor: rename import page vars to sourcePage and sync destination Address PR review feedback: - Rename importPageNumber/setImportPageNumber/changeImportPage to sourcePageNumber/setSourcePageNumber/changeSourcePage for clarity - Remove useMemo and isSinglePage guard from defaultDestinationPage - Sync destination page to follow source page changes on full imports - Default to new page (-1) when source page doesn't exist in destination Co-Authored-By: Claude Opus 4.6 (1M context) --- webui/src/ImportExport/Import/Page.tsx | 42 ++++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/webui/src/ImportExport/Import/Page.tsx b/webui/src/ImportExport/Import/Page.tsx index 1935c087d2..11d82eca43 100644 --- a/webui/src/ImportExport/Import/Page.tsx +++ b/webui/src/ImportExport/Import/Page.tsx @@ -1,4 +1,4 @@ -import { useCallback, useContext, useMemo, useRef } from 'react' +import { useCallback, useContext, useEffect, useMemo, useRef } from 'react' import { CButton, CCol, CRow, CFormSelect, CCallout } from '@coreui/react' import { MyErrorBoundary } from '~/Resources/Error' import { ButtonGridHeader, PageNumberPicker, type PageNumberOption } from '~/Buttons/ButtonGridHeader.js' @@ -27,7 +27,7 @@ interface ImportPageWizardProps { snapshot: ClientImportObject connectionRemap: Record setConnectionRemap: React.Dispatch>> - doImport: (importPageNumber: number, pageNumber: number, connectionRemap: Record) => void + doImport: (sourcePageNumber: number, pageNumber: number, connectionRemap: Record) => void } export const ImportPageWizard = observer(function ImportPageWizard({ @@ -67,21 +67,23 @@ export const ImportPageWizard = observer(function ImportPageWizard({ }, [snapshot.pages, snapshot.page, isSinglePage]) const { - pageNumber: importPageNumber, - setPageNumber: setImportPageNumber, - changePage: changeImportPage, + pageNumber: sourcePageNumber, + setPageNumber: setSourcePageNumber, + changePage: changeSourcePage, } = usePagePicker(pageCount, 1) - const defaultDestinationPage = useMemo(() => { - if (!isSinglePage) return importPageNumber - const oldPage = snapshot.oldPageNumber - if (typeof oldPage === 'number' && Number.isInteger(oldPage) && oldPage >= 1 && oldPage <= pages.data.length) { - return oldPage - } - return -1 - }, [isSinglePage, importPageNumber, snapshot.oldPageNumber, pages.data.length]) + const pageOrNew = (page: number | undefined): number => + typeof page === 'number' && Number.isInteger(page) && page >= 1 && page <= pages.data.length ? page : -1 + + const validOldPage = pageOrNew(snapshot.oldPageNumber) + const defaultDestinationPage = validOldPage !== -1 ? validOldPage : pageOrNew(sourcePageNumber) const { pageNumber, setPageNumber, changePage } = usePagePicker(pages.data.length, defaultDestinationPage) + useEffect(() => { + if (isSinglePage) return + setPageNumber(pageOrNew(sourcePageNumber)) + }, [sourcePageNumber, pages.data.length, setPageNumber, isSinglePage]) + const setConnectionRemap2 = useCallback( (fromId: string, toId: string) => { setConnectionRemap((oldRemap) => ({ @@ -93,8 +95,8 @@ export const ImportPageWizard = observer(function ImportPageWizard({ ) const doImport2 = useCallback(() => { - doImport(importPageNumber, pageNumber, connectionRemap) - }, [doImport, importPageNumber, pageNumber, connectionRemap]) + doImport(sourcePageNumber, pageNumber, connectionRemap) + }, [doImport, sourcePageNumber, pageNumber, connectionRemap]) const destinationGridSize = userConfig.properties?.gridSize @@ -110,7 +112,7 @@ export const ImportPageWizard = observer(function ImportPageWizard({ const isRunning = false - const sourcePageInfo = isSinglePage ? snapshot.page : snapshot.pages?.[importPageNumber] + const sourcePageInfo = isSinglePage ? snapshot.page : snapshot.pages?.[sourcePageNumber] const sourceGridSize = sourcePageInfo?.gridSize ?? destinationGridSize const [hasBeenRendered, hasBeenRenderedRef] = useHasBeenRendered() @@ -130,9 +132,9 @@ export const ImportPageWizard = observer(function ImportPageWizard({ <> @@ -144,7 +146,7 @@ export const ImportPageWizard = observer(function ImportPageWizard({ {hasBeenRendered && sourceGridSize && (