validate species immediately when adding it in locality -> species tab, and refactor null value fix

This commit is contained in:
juhanikat
2025-09-08 10:57:46 +03:00
parent dcca0aefcd
commit 6a0b1a288f
3 changed files with 38 additions and 15 deletions
@@ -1,4 +1,11 @@
import { Editable, LocalityDetailsType, LocalitySpecies, Species, SpeciesDetailsType } from '@/shared/types'
import {
Editable,
EditDataType,
LocalityDetailsType,
LocalitySpecies,
Species,
SpeciesDetailsType,
} from '@/shared/types'
import { EditableTable } from '@/components/DetailView/common/EditableTable'
import { EditingForm } from '@/components/DetailView/common/EditingForm'
import { SelectingTable } from '@/components/DetailView/common/SelectingTable'
@@ -8,8 +15,9 @@ import { useGetAllSpeciesQuery } from '@/redux/speciesReducer'
import { Box, CircularProgress } from '@mui/material'
import { skipToken } from '@reduxjs/toolkit/query'
import { MRT_ColumnDef } from 'material-react-table'
import { checkTaxonomy, convertTaxonomyFields } from '@/util/taxonomyFunctions'
import { checkTaxonomy, convertTaxonomyFields, fixNullValuesInTaxonomyFields } from '@/util/taxonomyFunctions'
import { useNotify } from '@/hooks/notification'
import { validateSpecies } from '@/shared/validators/species'
export const SpeciesTab = () => {
const { mode, editData, setEditData } = useDetailContext<LocalityDetailsType>()
@@ -105,6 +113,20 @@ export const SpeciesTab = () => {
buttonText="Add new Species"
formFields={formFields}
editAction={(newSpecies: Species) => {
const errors = []
for (const field in newSpecies) {
const errorObject = validateSpecies(
newSpecies as unknown as EditDataType<SpeciesDetailsType>,
field as unknown as keyof EditDataType<SpeciesDetailsType>
)
const { error } = errorObject
if (error) errors.push(errorObject)
}
if (errors.length > 0) {
notify('Following validators failed: \n' + errors.map(e => `${e.name}: ${e.error}`).join('\n'), 'error')
return
}
const convertedSpecies = convertTaxonomyFields(newSpecies)
const allSpecies = editData.now_ls.map(ls => ls.com_species) as unknown as Editable<Species>[]
const filteredSpecies = allSpecies.filter(species => species.rowState === 'new')
@@ -145,12 +167,7 @@ export const SpeciesTab = () => {
lid: editData.lid,
species_id: newSpecies.species_id,
com_species: {
...(newSpecies as unknown as SpeciesDetailsType),
// changes subclass, suborder, and subfamily from null to empty string to make validators work
// this should be removed if validators are improved in the future
subclass_or_superorder_name: newSpecies.subclass_or_superorder_name ?? '',
suborder_or_superfamily_name: newSpecies.suborder_or_superfamily_name ?? '',
subfamily_name: newSpecies.subfamily_name ?? '',
...(fixNullValuesInTaxonomyFields(newSpecies) as SpeciesDetailsType),
},
rowState: 'new',
},
@@ -16,6 +16,7 @@ import { validateSpecies } from '@/shared/validators/species'
import { emptySpecies } from '../DetailView/common/defaultValues'
import { useNotify } from '@/hooks/notification'
import { useEffect, useState } from 'react'
import { fixNullValuesInTaxonomyFields } from '@/util/taxonomyFunctions'
export const SpeciesDetails = () => {
const { id } = useParams()
@@ -43,12 +44,8 @@ export const SpeciesDetails = () => {
// changes subclass, suborder, and subfamily from null to empty string to make validators work
// this should be removed if validators are improved in the future
if (data) {
setModifiedData({
...data,
subclass_or_superorder_name: data.subclass_or_superorder_name ?? '',
suborder_or_superfamily_name: data.suborder_or_superfamily_name ?? '',
subfamily_name: data.subfamily_name ?? '',
})
const fixedSpeciesData = fixNullValuesInTaxonomyFields(data)
setModifiedData(fixedSpeciesData as SpeciesDetailsType)
}
}, [data])
+10 -1
View File
@@ -1,4 +1,4 @@
import { EditDataType, Species, SpeciesSynonym } from '@/shared/types'
import { EditDataType, Species, SpeciesDetailsType, SpeciesSynonym } from '@/shared/types'
const generateMultipleParentsError = (
invalidField: string,
@@ -339,3 +339,12 @@ export const convertTaxonomyFields = (species: EditDataType<Species>) => {
}
return convertedSpecies as EditDataType<Species>
}
export const fixNullValuesInTaxonomyFields = (species: EditDataType<Species> | SpeciesDetailsType) => {
return {
...species,
subclass_or_superorder_name: species.subclass_or_superorder_name ?? '',
suborder_or_superfamily_name: species.suborder_or_superfamily_name ?? '',
subfamily_name: species.subfamily_name ?? '',
}
}