From c03260792163497a067ad113136412b412c85812 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 3 Jan 2026 20:32:43 +1100 Subject: [PATCH] Fix for data importer (#11076) * Fix for data importer - Ensure the "progress" stepper updates * Prevent query with invalid PK * Reduce useless API calls - Instantiate column mappings with proper defaults - Ignore duplicate updates - Increase debounce times --- .../importer/ImporterColumnSelector.tsx | 33 +++++++++++++++++-- .../components/importer/ImporterDrawer.tsx | 4 +-- src/frontend/src/hooks/UseImportSession.tsx | 1 + src/frontend/src/hooks/UseInstance.tsx | 2 +- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/components/importer/ImporterColumnSelector.tsx b/src/frontend/src/components/importer/ImporterColumnSelector.tsx index 4036b4f3b5..8031495cac 100644 --- a/src/frontend/src/components/importer/ImporterColumnSelector.tsx +++ b/src/frontend/src/components/importer/ImporterColumnSelector.tsx @@ -84,16 +84,28 @@ function ImporterDefaultField({ }) { const api = useApi(); - const [rawValue, setRawValue] = useState(''); + const [rawValue, setRawValue] = useState(undefined); + + // Initialize raw value with provided default + useEffect(() => { + setRawValue(session.fieldDefaults[fieldName]); + }, [fieldName, session.fieldDefaults]); const fieldType: string = useMemo(() => { return session.availableFields[fieldName]?.type; }, [fieldName, session.availableFields]); - const [value] = useDebouncedValue(rawValue, fieldType == 'string' ? 500 : 10); - const onChange = useCallback( (value: any) => { + if (value === undefined) { + value = session.fieldDefaults[fieldName]; + } + + // No change - do nothing + if (value === session.fieldDefaults[fieldName]) { + return; + } + // Update the default value for the field const defaults = { ...session.fieldDefaults, @@ -114,6 +126,21 @@ function ImporterDefaultField({ [fieldName, session, session.fieldDefaults] ); + const getDebounceTime = (type: string) => { + switch (type) { + case 'string': + return 500; + case 'number': + case 'float': + case 'integer': + return 200; + default: + return 50; + } + }; + + const [value] = useDebouncedValue(rawValue, getDebounceTime(fieldType)); + // Update the default value after the debounced value changes useEffect(() => { onChange(value); diff --git a/src/frontend/src/components/importer/ImporterDrawer.tsx b/src/frontend/src/components/importer/ImporterDrawer.tsx index 2ed836627c..eb5a4343af 100644 --- a/src/frontend/src/components/importer/ImporterDrawer.tsx +++ b/src/frontend/src/components/importer/ImporterDrawer.tsx @@ -42,7 +42,7 @@ function ImportDrawerStepper({ > - + @@ -133,7 +133,7 @@ export default function ImporterDrawer({ ); - }, [session.sessionData]); + }, [currentStep, session.sessionData]); return ( ({ pk == null || pk == undefined || pk.toString().length == 0 || - pk == '-1' + pk.toString() == '-1' ) { setInstance(defaultValue); return defaultValue;