Fix clearing species comment during edits

This commit is contained in:
Kari Lintulaakso
2025-12-02 11:39:39 +02:00
parent 156089a044
commit e9620eae86
2 changed files with 32 additions and 4 deletions
@@ -118,8 +118,15 @@ export const WriteButton = <T,>({
const convertedEditData = convertSpeciesTaxonomyFields(editData as EditDataType<Species>)
const convertedOriginalData = convertSpeciesTaxonomyFields(data as EditDataType<Species>)
const taxonomyHasChanged = mode.new || hasTaxonomyChanges(convertedEditData, convertedOriginalData)
const sanitizedEditData =
'sp_comment' in convertedEditData
? {
...convertedEditData,
sp_comment: convertedEditData.sp_comment === '' ? null : convertedEditData.sp_comment,
}
: convertedEditData
speciesEditData = convertedEditData
speciesEditData = sanitizedEditData
if (taxonomyHasChanged) {
if (!speciesData) {
@@ -139,7 +146,7 @@ export const WriteButton = <T,>({
}
notify('', undefined, 0)
setEditData(convertedEditData as EditDataType<T>)
setEditData(sanitizedEditData as EditDataType<T>)
if (hasStagingMode) {
setMode(mode.new ? 'staging-new' : 'staging-edit')
@@ -87,10 +87,14 @@ const baseSpecies: Species = {
locomo2: '',
locomo3: '',
sp_author: '',
sp_comment: '',
sp_comment: 'Existing comment',
}
const renderButton = (editData: EditDataType<Species>, onWrite = jest.fn(() => Promise.resolve())) => {
const renderButton = (
editData: EditDataType<Species>,
onWrite = jest.fn(() => Promise.resolve()),
overrides?: Partial<DetailContextType<Species>>
) => {
mockUseDetailContext.mockReturnValue({
data: baseSpecies,
mode: modeEdit,
@@ -105,6 +109,7 @@ const renderButton = (editData: EditDataType<Species>, onWrite = jest.fn(() => P
validator,
fieldsWithErrors: {},
setFieldsWithErrors: jest.fn(),
...overrides,
})
mockUseGetAllSpeciesQuery.mockReturnValue({ data: [baseSpecies] } as never)
@@ -147,4 +152,20 @@ describe('WriteButton taxonomy handling', () => {
expect(onWrite).not.toHaveBeenCalled()
expect(mockNotify).toHaveBeenCalledWith(expect.stringContaining('taxon already exists'), 'error', null)
})
it('converts a cleared comment field to null so it can be persisted', async () => {
const onWrite = jest.fn(() => Promise.resolve())
const setEditData = jest.fn()
renderButton({ ...baseSpecies, sp_comment: '' } as EditDataType<Species>, onWrite, { setEditData })
fireEvent.click(screen.getByRole('button', { name: /save changes/i }))
await waitFor(() => {
expect(onWrite).toHaveBeenCalledTimes(1)
})
expect(onWrite).toHaveBeenCalledWith(expect.objectContaining({ sp_comment: null }), expect.any(Function))
expect(setEditData).toHaveBeenCalledWith(expect.objectContaining({ sp_comment: null }))
})
})