From 3556339458f52555220927454c167f39705c8e75 Mon Sep 17 00:00:00 2001 From: Kari Lintulaakso Date: Mon, 16 Feb 2026 16:56:37 +0200 Subject: [PATCH 1/5] fix(locality): preserve age drafts when switching dating method --- .../DetailView/Context/DetailContext.tsx | 4 +- .../components/Locality/Tabs/AgeTab.test.tsx | 166 ++++++++++++++++++ .../src/components/Locality/Tabs/AgeTab.tsx | 86 +++++++-- 3 files changed, 242 insertions(+), 14 deletions(-) create mode 100644 frontend/src/components/Locality/Tabs/AgeTab.test.tsx diff --git a/frontend/src/components/DetailView/Context/DetailContext.tsx b/frontend/src/components/DetailView/Context/DetailContext.tsx index d085a0a4..a8b18cc1 100755 --- a/frontend/src/components/DetailView/Context/DetailContext.tsx +++ b/frontend/src/components/DetailView/Context/DetailContext.tsx @@ -58,7 +58,7 @@ export type DetailContextType = { mode: ModeType setMode: (newMode: ModeOptions) => void editData: EditDataType - setEditData: (editData: EditDataType) => void + setEditData: SetEditDataType textField: (field: keyof EditDataType, options?: TextFieldOptions) => JSX.Element bigTextField: (field: keyof EditDataType) => JSX.Element dropdown: ( @@ -87,6 +87,8 @@ export type DetailContextType = { resetEditData: () => void } +export type SetEditDataType = (editData: EditDataType) => void + export const DetailContext = createContext>(null!) export const makeEditData = (data: T): EditDataType => ({ diff --git a/frontend/src/components/Locality/Tabs/AgeTab.test.tsx b/frontend/src/components/Locality/Tabs/AgeTab.test.tsx new file mode 100644 index 00000000..9f425455 --- /dev/null +++ b/frontend/src/components/Locality/Tabs/AgeTab.test.tsx @@ -0,0 +1,166 @@ +import { describe, expect, it, jest } from '@jest/globals' +import { render, screen } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import { ReactNode, useState } from 'react' +import { AgeTab } from './AgeTab' +import { DetailContext, DetailContextType, modeOptionToMode } from '@/components/DetailView/Context/DetailContext' +import { EditDataType, LocalityDetailsType } from '@/shared/types' +import { DropdownOption } from '@/components/DetailView/common/editingComponents' +import { OptionalRadioSelectionProps, TextFieldOptions } from '@/components/DetailView/DetailView' +import '@testing-library/jest-dom' + +jest.mock('@/redux/timeUnitReducer', () => ({ + useGetTimeUnitDetailsQuery: () => ({ data: undefined, isFetching: false }), +})) + +jest.mock('@/components/TimeUnit/TimeUnitTable', () => ({ + TimeUnitTable: () =>
TimeUnitTable
, +})) + +const toDisplayValue = (option: DropdownOption | string): string => { + if (typeof option === 'string') return option + return option.display +} + +const toRawValue = (option: DropdownOption | string): number | string | boolean => { + if (typeof option === 'string') return option + return option.value +} + +const initialEditData = { + date_meth: 'time_unit', + min_age: 10, + max_age: 20, + bfa_min_abs: '', + bfa_max_abs: '', + bfa_min: 'tu-min-initial', + bfa_max: 'tu-max-initial', + frac_min: '1:2', + frac_max: '2:2', + chron: '', + age_comm: '', +} as unknown as EditDataType + +const toInputValue = (value: unknown): string => { + if (typeof value === 'string' || typeof value === 'number') return String(value) + return '' +} + +const ContextWrapper = ({ children }: { children: ReactNode }) => { + const [editData, setEditData] = useState>(initialEditData) + + const setFieldValue = (field: keyof EditDataType, value: string) => { + setEditData(prev => ({ + ...prev, + [field]: value === '' ? '' : Number.isNaN(Number(value)) ? value : Number(value), + })) + } + + const contextValue: DetailContextType = { + data: initialEditData as unknown as LocalityDetailsType, + mode: modeOptionToMode.edit, + setMode: () => undefined, + editData, + setEditData, + isDirty: false, + resetEditData: () => setEditData(initialEditData), + textField: (field: keyof EditDataType, options?: TextFieldOptions) => ( + setFieldValue(field, event.currentTarget.value)} + /> + ), + bigTextField: (field: keyof EditDataType) => ( +