Fixed update bug

This commit is contained in:
Tom Butcher 2025-11-29 01:21:54 +00:00
parent 11f75cab04
commit 986e5fcff5

View File

@ -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 })
} }
} }