mirror of
https://github.com/nowcommunity/nowdatabase.git
synced 2026-10-12 19:13:52 +03:00
Add some code for adding new entities, no button yet but url works
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user