Add some code for adding new entities, no button yet but url works

This commit is contained in:
arttu
2024-07-03 12:05:00 +03:00
committed by ShootingStar91
parent 220adf2063
commit fab6b4ff64
8 changed files with 139 additions and 19 deletions
+1 -3
View File
@@ -98,11 +98,9 @@ export const validateEntireLocality = (editedFields: EditDataType<Prisma.now_loc
}
export const processLocalityForEdit = async (editedLocality: EditDataType<LocalityDetailsType>) => {
const fixedEditedLocality = fixEditedLocality(editedLocality)
const oldLocality = await getLocalityDetails(fixedEditedLocality.lid!)
const validationErrors = validateEntireLocality(editedLocality)
if (validationErrors.length > 0) return { validationErrors }
const result = await write(editedLocality, 'now_loc', oldLocality!)
const result = await write(editedLocality, 'now_loc')
return { result }
}
+7 -6
View File
@@ -53,8 +53,6 @@ const getFindFunction = (tableName: string, newItem: any) => (item: any) => {
return !ids[tableName].find(f => newItem[f] !== item[f])
}
// TODO change ignored fields to allowed fields. form those by taking prisma.model.fields, and adding the accepted relation fields.
const ignoredFields = ['now_lau']
const allowedFields = {}
const addFieldsToAllowed = fields =>
fields.forEach(f => {
@@ -112,7 +110,7 @@ export const write: WriteFunction = async (data, tableName) => {
if (ids[tableName].length === 1) whereObject = { [ids[tableName][0]]: obj[ids[tableName][0]] }
debugLog(`ids: ${ids[tableName]}, where: ${printJSON(where)}`)
const oldObj =
ids[tableName] && Object.keys(where).length === ids[tableName].length
ids[tableName] && obj[ids[tableName][0]] && Object.keys(where).length === ids[tableName].length
? await nowDb[tableName].findUnique({
where: whereObject,
})
@@ -130,10 +128,13 @@ export const write: WriteFunction = async (data, tableName) => {
const relationIds = {}
for (const objectField of objectFields) {
const newId = await writeTable(obj[objectField], objectField)
relationIds[ids[objectField][1]] = newId
debugLog(`Processed objectField ${objectField} and assigned id ${newId} to ${ids[objectField][1]}`)
const lastItem = ids[objectField].length - 1
relationIds[ids[objectField][lastItem]] = newId
debugLog(`Processed objectField ${objectField} and assigned id ${newId} to ${ids[objectField][lastItem]}`)
}
basicFields.push(...Object.keys(relationIds))
Object.keys(relationIds).forEach(rId => {
if (!basicFields.includes(rId) && rId !== undefined) basicFields.push(rId)
})
debugLog(`basicFields: ${printJSON(basicFields)}`)
for (const field of basicFields) {
const isRelationField = !!relationIds[field]
@@ -43,7 +43,7 @@ export const modeOptionToMode: Record<ModeOptions, ModeType> = {
'staging-new': {
read: false,
staging: true,
new: false,
new: true,
option: 'staging-new',
},
}
@@ -33,11 +33,13 @@ export const DetailView = <T extends object>({
data,
onWrite,
validator,
isNew,
}: {
tabs: TabType[]
data: T
data: T | object
onWrite: (editData: EditDataType<T>) => Promise<void>
validator: (editData: EditDataType<T>, field: keyof EditDataType<T>) => ValidationObject
isNew: boolean
}) => {
const [searchParams, setSearchParams] = useSearchParams()
@@ -47,7 +49,7 @@ export const DetailView = <T extends object>({
return parseInt(tabFromUrl)
}
const [mode, setModeState] = useState<ModeType>(modeOptionToMode['read'])
const [mode, setModeState] = useState<ModeType>(isNew ? modeOptionToMode['new'] : modeOptionToMode['read'])
const [tab, setTab] = useState(getUrl())
useEffect(() => {
@@ -131,7 +133,7 @@ export const DetailView = <T extends object>({
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignContent: 'center', marginTop: 'auto' }}>
<Box sx={{ display: 'flex' }} gap={10}>
<ReturnButton />
{!mode.staging && (
{!mode.staging && !initialState.mode.new && (
<Button
onClick={() => setMode(!mode.read ? 'read' : 'edit')}
variant={mode.read ? 'contained' : 'outlined'}
@@ -140,7 +142,7 @@ export const DetailView = <T extends object>({
<EditIcon style={{ marginRight: '0.5em' }} /> {mode.read ? 'Edit' : 'Cancel edit'}
</Button>
)}
{!mode.read && onWrite && <WriteButton onWrite={onWrite} />}
{(!mode.read || initialState.mode.new) && onWrite && <WriteButton onWrite={onWrite} />}
</Box>
<Box sx={{ marginRight: '3em' }}>
<DetailBrowser<T> />
@@ -10,6 +10,7 @@ import { useState } from 'react'
export const WriteButton = <T,>({ onWrite }: { onWrite: (editData: EditDataType<T>) => Promise<void> }) => {
const { editData, mode, setMode } = useDetailContext<T>()
const [loading, setLoading] = useState(false)
const getButtonText = () => {
if (mode.staging) return 'Finalize entry'
return 'Complete and save'
@@ -19,7 +20,7 @@ export const WriteButton = <T,>({ onWrite }: { onWrite: (editData: EditDataType<
sx={{ width: '20em' }}
onClick={() => {
if (!mode.staging) {
setMode(mode.new ? 'staging-edit' : 'staging-new')
setMode(mode.new ? 'staging-new' : 'staging-edit')
return
}
setLoading(true)
@@ -44,11 +45,13 @@ export const ReturnButton = () => {
const navigate = useNavigate()
const { tableUrl } = usePageContext()
const { mode, setMode } = useDetailContext()
if (mode.staging) {
return (
<Button
onClick={() => {
setMode('edit')
if (mode.new) setMode('new')
else setMode('edit')
}}
>
<ArrowBackIcon color="primary" style={{ marginRight: '0.2em' }} />
@@ -0,0 +1,106 @@
export const emptyLocality = {
bfa_max: '',
bfa_min: '',
loc_name: '',
date_meth: '',
max_age: null,
min_age: null,
bfa_max_abs: '',
bfa_min_abs: '',
frac_max: '',
frac_min: '',
chron: '',
age_comm: '',
basin: '',
subbasin: null,
dms_lat: '',
dms_long: '',
dec_lat: null,
dec_long: null,
approx_coord: null,
altitude: null,
country: '',
state: '',
county: '',
site_area: '',
gen_loc: '',
plate: '',
loc_detail: '',
lgroup: '',
formation: '',
member: '',
bed: '',
datum_plane: '',
tos: null,
bos: null,
rock_type: '',
rt_adj: '',
lith_comm: '',
depo_context1: '',
depo_context2: '',
depo_context3: '',
depo_context4: '',
depo_comm: '',
sed_env_1: '',
sed_env_2: '',
event_circum: '',
se_comm: '',
climate_type: '',
biome: '',
v_ht: '',
v_struct: '',
v_envi_det: '',
disturb: '',
nutrients: '',
water: '',
seasonality: '',
seas_intens: '',
pri_prod: '',
moisture: '',
temperature: '',
assem_fm: '',
transport: '',
trans_mod: '',
weath_trmp: '',
pt_conc: '',
size_type: '',
vert_pres: '',
plant_pres: '',
invert_pres: '',
time_rep: '',
appr_num_spm: null,
num_spm: null,
true_quant: '',
complete: '',
num_quad: null,
taph_comm: '',
tax_comm: '',
loc_status: true,
estimate_precip: null,
estimate_temp: null,
estimate_npp: null,
pers_woody_cover: null,
pers_pollen_ap: null,
pers_pollen_nap: null,
pers_pollen_other: null,
hominin_skeletal_remains: false,
bipedal_footprints: false,
stone_tool_technology: false,
stone_tool_cut_marks_on_bones: false,
technological_mode_1: null,
technological_mode_2: null,
technological_mode_3: null,
cultural_stage_1: null,
cultural_stage_2: null,
cultural_stage_3: null,
regional_culture_1: null,
regional_culture_2: null,
regional_culture_3: null,
now_mus: [],
now_ls: [],
now_syn_loc: [],
now_ss: [],
now_coll_meth: [],
now_plr: [],
now_lau: [],
}
@@ -15,13 +15,14 @@ import { TaphonomyTab } from './Tabs/TaphonomyTab'
import { EditDataType, LocalityDetailsType } from '@/backendTypes'
import { validateLocality } from '@/validators/locality'
import { UpdateTab } from '../DetailView/common/UpdateTab'
import { emptyLocality } from '../DetailView/defaultValues/locality'
export const LocalityDetails = () => {
const { id } = useParams()
const { isLoading, isFetching, isError, data } = useGetLocalityDetailsQuery(id!)
const { isLoading, isFetching, isError, data } = useGetLocalityDetailsQuery(id!, { skip: id === 'new' })
const [editLocalityRequest] = useEditLocalityMutation()
if (isError) return <div>Error loading data</div>
if (isLoading || isFetching || !data) return <CircularProgress />
if (isLoading || isFetching || (!data && id !== 'new')) return <CircularProgress />
const onWrite = async (editData: EditDataType<LocalityDetailsType>) => {
await editLocalityRequest(editData)
@@ -74,5 +75,13 @@ export const LocalityDetails = () => {
},
]
return <DetailView tabs={tabs} data={data} onWrite={onWrite} validator={validateLocality} />
return (
<DetailView<LocalityDetailsType>
tabs={tabs}
data={id === 'new' ? emptyLocality : data!}
isNew={id === 'new'}
onWrite={onWrite}
validator={validateLocality}
/>
)
}
@@ -7,6 +7,7 @@ import { TimeUnitTable } from '@/components/TimeUnit/TimeUnitTable'
export const AgeTab = () => {
const { textField, radioSelection, dropdown, bigTextField, editData } = useDetailContext<LocalityDetailsType>()
const fracOptions = [
emptyOption,
'Early half 1:2',