Fixed update bug
This commit is contained in:
parent
11f75cab04
commit
986e5fcff5
@ -30,13 +30,15 @@ import { getModelByName } from '../../../database/ObjectModels'
|
|||||||
const ObjectForm = forwardRef(
|
const ObjectForm = forwardRef(
|
||||||
({ id, type, style, children, onEdit, onStateChange }, ref) => {
|
({ id, type, style, children, onEdit, onStateChange }, ref) => {
|
||||||
const [objectData, setObjectData] = useState(null)
|
const [objectData, setObjectData] = useState(null)
|
||||||
const [serverObjectData, setServerObjectData] = useState(null)
|
const serverObjectData = useRef(null)
|
||||||
|
const onStateChangeRef = useRef(onStateChange)
|
||||||
const [fetchLoading, setFetchLoading] = useState(true)
|
const [fetchLoading, setFetchLoading] = useState(true)
|
||||||
const [editLoading, setEditLoading] = useState(false)
|
const [editLoading, setEditLoading] = useState(false)
|
||||||
const [lock, setLock] = useState({})
|
const [lock, setLock] = useState({})
|
||||||
const [initialized, setInitialized] = useState(false)
|
const [initialized, setInitialized] = useState(false)
|
||||||
const [isEditing, setIsEditing] = useState(false)
|
const [isEditing, setIsEditing] = useState(false)
|
||||||
const [formValid, setFormValid] = useState(false)
|
const [formValid, setFormValid] = useState(false)
|
||||||
|
|
||||||
const [form] = Form.useForm()
|
const [form] = Form.useForm()
|
||||||
const formUpdateValues = Form.useWatch([], form)
|
const formUpdateValues = Form.useWatch([], form)
|
||||||
const [messageApi, contextHolder] = message.useMessage()
|
const [messageApi, contextHolder] = message.useMessage()
|
||||||
@ -141,26 +143,32 @@ const ObjectForm = forwardRef(
|
|||||||
// Validate form on change (debounced to avoid heavy work on every keystroke)
|
// Validate form on change (debounced to avoid heavy work on every keystroke)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const timeoutId = setTimeout(() => {
|
const timeoutId = setTimeout(() => {
|
||||||
|
const currentFormValues = form.getFieldsValue()
|
||||||
|
const mergedObjectData = {
|
||||||
|
...serverObjectData.current,
|
||||||
|
...currentFormValues
|
||||||
|
}
|
||||||
|
|
||||||
form
|
form
|
||||||
.validateFields({ validateOnly: true })
|
.validateFields({ validateOnly: true })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
setFormValid(true)
|
setFormValid(true)
|
||||||
onStateChange({
|
onStateChangeRef.current({
|
||||||
formValid: true,
|
formValid: true,
|
||||||
objectData: { ...serverObjectData, ...form.getFieldsValue() }
|
objectData: mergedObjectData
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
setFormValid(false)
|
setFormValid(false)
|
||||||
onStateChange({
|
onStateChangeRef.current({
|
||||||
formValid: false,
|
formValid: false,
|
||||||
objectData: { ...serverObjectData, ...form.getFieldsValue() }
|
objectData: mergedObjectData
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}, 150)
|
}, 150)
|
||||||
|
|
||||||
return () => clearTimeout(timeoutId)
|
return () => clearTimeout(timeoutId)
|
||||||
}, [form, formUpdateValues, onStateChange, serverObjectData])
|
}, [form, formUpdateValues])
|
||||||
|
|
||||||
// Cleanup on unmount
|
// Cleanup on unmount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -185,13 +193,13 @@ const ObjectForm = forwardRef(
|
|||||||
const handleFetchObject = useCallback(async () => {
|
const handleFetchObject = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
setFetchLoading(true)
|
setFetchLoading(true)
|
||||||
onStateChange({ loading: true })
|
onStateChangeRef.current({ loading: true })
|
||||||
const data = await fetchObject(id, type)
|
const data = await fetchObject(id, type)
|
||||||
const lockEvent = await fetchObjectLock(id, type)
|
const lockEvent = await fetchObjectLock(id, type)
|
||||||
setLock(lockEvent)
|
setLock(lockEvent)
|
||||||
onStateChange({ lock: lockEvent })
|
onStateChangeRef.current({ lock: lockEvent })
|
||||||
setObjectData(data)
|
setObjectData(data)
|
||||||
setServerObjectData(data)
|
serverObjectData.current = data
|
||||||
|
|
||||||
// Calculate and set computed values on initial load
|
// Calculate and set computed values on initial load
|
||||||
const computedValues = calculateComputedValues(data, model)
|
const computedValues = calculateComputedValues(data, model)
|
||||||
@ -199,7 +207,7 @@ const ObjectForm = forwardRef(
|
|||||||
|
|
||||||
form.setFieldsValue(initialFormData)
|
form.setFieldsValue(initialFormData)
|
||||||
setFetchLoading(false)
|
setFetchLoading(false)
|
||||||
onStateChange({ loading: false })
|
onStateChangeRef.current({ loading: false })
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
messageApi.error('Failed to fetch object info')
|
messageApi.error('Failed to fetch object info')
|
||||||
@ -218,7 +226,7 @@ const ObjectForm = forwardRef(
|
|||||||
// Update event handler
|
// Update event handler
|
||||||
const updateLockEventHandler = useCallback((value) => {
|
const updateLockEventHandler = useCallback((value) => {
|
||||||
setLock((prev) => {
|
setLock((prev) => {
|
||||||
onStateChange({ lock: { ...prev, ...value } })
|
onStateChangeRef.current({ lock: { ...prev, ...value } })
|
||||||
return { ...prev, ...value }
|
return { ...prev, ...value }
|
||||||
})
|
})
|
||||||
}, [])
|
}, [])
|
||||||
@ -260,29 +268,31 @@ const ObjectForm = forwardRef(
|
|||||||
// Debounce objectData updates sent to parent to limit re-renders
|
// Debounce objectData updates sent to parent to limit re-renders
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const timeoutId = setTimeout(() => {
|
const timeoutId = setTimeout(() => {
|
||||||
onStateChange({ objectData })
|
onStateChangeRef.current({ objectData })
|
||||||
}, 150)
|
}, 150)
|
||||||
|
|
||||||
return () => clearTimeout(timeoutId)
|
return () => clearTimeout(timeoutId)
|
||||||
}, [objectData, onStateChange])
|
}, [objectData])
|
||||||
|
|
||||||
const startEditing = () => {
|
const startEditing = () => {
|
||||||
setIsEditing(true)
|
setIsEditing(true)
|
||||||
onStateChange({ isEditing: true })
|
onStateChangeRef.current({ isEditing: true })
|
||||||
lockObject(id, type)
|
lockObject(id, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
const cancelEditing = () => {
|
const cancelEditing = () => {
|
||||||
if (serverObjectData) {
|
if (serverObjectData.current) {
|
||||||
// Recalculate computed values when canceling
|
// Recalculate computed values when canceling
|
||||||
const computedValues = calculateComputedValues(serverObjectData, model)
|
const computedValues = calculateComputedValues(
|
||||||
const resetFormData = { ...serverObjectData, ...computedValues }
|
serverObjectData.current,
|
||||||
|
model
|
||||||
|
)
|
||||||
|
const resetFormData = { ...serverObjectData.current, ...computedValues }
|
||||||
|
|
||||||
form.setFieldsValue(resetFormData)
|
form.setFieldsValue(resetFormData)
|
||||||
setObjectData(resetFormData)
|
setObjectData(resetFormData)
|
||||||
}
|
}
|
||||||
setIsEditing(false)
|
setIsEditing(false)
|
||||||
onStateChange({ isEditing: false })
|
onStateChangeRef.current({ isEditing: false })
|
||||||
unlockObject(id, type)
|
unlockObject(id, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,11 +300,11 @@ const ObjectForm = forwardRef(
|
|||||||
try {
|
try {
|
||||||
const value = await form.validateFields()
|
const value = await form.validateFields()
|
||||||
setEditLoading(true)
|
setEditLoading(true)
|
||||||
onStateChange({ editLoading: true })
|
onStateChangeRef.current({ editLoading: true })
|
||||||
await updateObject(id, type, value)
|
await updateObject(id, type, value)
|
||||||
setObjectData({ ...objectData, ...value })
|
setObjectData({ ...objectData, ...value })
|
||||||
setIsEditing(false)
|
setIsEditing(false)
|
||||||
onStateChange({ isEditing: false })
|
onStateChangeRef.current({ isEditing: false })
|
||||||
messageApi.success('Information updated successfully')
|
messageApi.success('Information updated successfully')
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
@ -309,7 +319,7 @@ const ObjectForm = forwardRef(
|
|||||||
} finally {
|
} finally {
|
||||||
handleFetchObject()
|
handleFetchObject()
|
||||||
setEditLoading(false)
|
setEditLoading(false)
|
||||||
onStateChange({ editLoading: false })
|
onStateChangeRef.current({ editLoading: false })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user