FormNew deki hatalar düzeltildi.

This commit is contained in:
Sedat Öztürk 2025-10-22 23:18:03 +03:00
parent ea37ef0682
commit 83855034df
3 changed files with 120 additions and 46 deletions

View file

@ -94,7 +94,7 @@ const FormButtons = (props: {
} }
toast.push( toast.push(
<Notification type="success" duration={2000}> <Notification type="success" duration={2000}>
{translate('::ListForms.FormBilgileriSilindi')} {translate('::KayitSilindi')}
</Notification>, </Notification>,
{ {
placement: 'top-end', placement: 'top-end',

View file

@ -4,7 +4,7 @@ import { DataType } from 'devextreme/common'
import { SimpleItem } from 'devextreme/ui/form' import { SimpleItem } from 'devextreme/ui/form'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { Helmet } from 'react-helmet' import { Helmet } from 'react-helmet'
import { useParams, useSearchParams } from 'react-router-dom' import { useNavigate, useParams, useSearchParams } from 'react-router-dom'
import FormButtons from './FormButtons' import FormButtons from './FormButtons'
import FormDevExpress from './FormDevExpress' import FormDevExpress from './FormDevExpress'
import { FormProps } from './types' import { FormProps } from './types'
@ -24,8 +24,10 @@ const FormNew = (
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const { translate } = useLocalization() const { translate } = useLocalization()
const MenuIcon = useCurrentMenuIcon('w-5 h-5') const MenuIcon = useCurrentMenuIcon('w-5 h-5')
const navigate = useNavigate()
const { const {
fetchData,
setFormData, setFormData,
loading, loading,
handleSubmit, handleSubmit,
@ -41,7 +43,7 @@ const FormNew = (
listFormCode, listFormCode,
level, level,
isSubForm, isSubForm,
onSubmitAction: props?.onActionView, onSubmitAction: (props?.onActionView),
}) })
const [newParams, setNewParams] = useState<URLSearchParams>(new URLSearchParams()) const [newParams, setNewParams] = useState<URLSearchParams>(new URLSearchParams())
@ -59,8 +61,89 @@ const FormNew = (
return return
} }
setFormData(createInitialFormData()) // Sadece formData yoksa (ilk yüklemede) initial data oluştur
}, [formItems, newParams]) // Kullanıcının girdiği bilgileri korumak için mevcut formData varsa setleme
if (!formData) {
setFormData(createInitialFormData())
}
}, [formItems])
// newParams değiştiğinde sadece newParams'tan gelen alanları güncelle
useEffect(() => {
if (!formItems || !formData || !gridDto?.columnFormats) {
return
}
const updatedData = { ...formData }
let hasChanges = false
for (const colFormat of gridDto.columnFormats) {
if (!colFormat.fieldName || !newParams.has(colFormat.fieldName)) {
continue
}
const dType = colFormat.dataType as DataType
let newValue: any
switch (dType) {
case 'date':
case 'datetime':
newValue = new Date(newParams.get(colFormat.fieldName)!)
break
case 'number':
newValue = Number(newParams.get(colFormat.fieldName))
break
case 'boolean':
if (newParams.get(colFormat.fieldName) === 'true') {
newValue = true
} else if (newParams.get(colFormat.fieldName) === 'false') {
newValue = false
}
break
case 'object':
try {
newValue = JSON.parse(newParams.get(colFormat.fieldName) as string)
} catch (error) {
newValue = updatedData[colFormat.fieldName]
}
break
default:
newValue = newParams.get(colFormat.fieldName)
break
}
if (updatedData[colFormat.fieldName] !== newValue) {
updatedData[colFormat.fieldName] = newValue
hasChanges = true
}
}
if (hasChanges) {
setFormData(updatedData)
}
}, [newParams, gridDto?.columnFormats])
// newParams'tan gelen alanları readonly yap
useEffect(() => {
if (!formItems || !gridDto?.columnFormats || !newParams) {
return
}
for (const colFormat of gridDto.columnFormats) {
if (!colFormat.fieldName || !newParams.has(colFormat.fieldName)) {
continue
}
// Eğer URL'den değer geliyorsa, bu editörü readonly yapıyoruz
formItems.forEach((form) => {
form?.items?.forEach((item: SimpleItem) => {
if (item.dataField === colFormat.fieldName) {
item.editorOptions = { ...item.editorOptions, readOnly: true }
}
})
})
}
}, [formItems, newParams, gridDto?.columnFormats])
function createInitialFormData() { function createInitialFormData() {
const data: any = {} const data: any = {}
@ -80,55 +163,18 @@ const FormNew = (
} }
if (!gridDto?.columnFormats) { if (!gridDto?.columnFormats) {
return return data
} }
// Grid'den gelen columnFormat'ları kullanarak default değerleri set et
for (const colFormat of gridDto?.columnFormats) { for (const colFormat of gridDto?.columnFormats) {
if (!colFormat.fieldName) { if (!colFormat.fieldName) {
continue continue
} }
// Grid'den gelen columnFormat'ları kullanarak default değerleri set et
if (colFormat.defaultValue != null) { if (colFormat.defaultValue != null) {
data[colFormat.fieldName] = colFormat.defaultValue data[colFormat.fieldName] = colFormat.defaultValue
} }
// URL'den veya Component Prop'dan gelen parametreleri set et
if (newParams.has(colFormat.fieldName)) {
const dType = colFormat.dataType as DataType
switch (dType) {
case 'date':
case 'datetime':
data[colFormat.fieldName] = new Date(newParams.get(colFormat.fieldName)!)
break
case 'number':
data[colFormat.fieldName] = Number(newParams.get(colFormat.fieldName))
break
case 'boolean':
if (newParams.get(colFormat.fieldName) === 'true') {
data[colFormat.fieldName] = true
} else if (newParams.get(colFormat.fieldName) === 'false') {
data[colFormat.fieldName] = false
}
break
case 'object':
try {
data[colFormat.fieldName] = JSON.parse(newParams.get(colFormat.fieldName) as string)
} catch (error) {}
break
default:
data[colFormat.fieldName] = newParams.get(colFormat.fieldName)
break
}
// Eğer default value varsa, bu editörü readonly yapıyoruz
formItems.forEach((form) => {
form?.items?.forEach((item: SimpleItem) => {
if (item.dataField === colFormat.fieldName) {
item.editorOptions = { ...item.editorOptions, readOnly: true }
}
})
})
}
} }
return data return data

View file

@ -289,7 +289,35 @@ const useGridData = (props: {
}) })
setFormItems(items) setFormItems(items)
setGridReady(true) setGridReady(true)
}, [gridDto, formData]) }, [gridDto])
// formData değiştiğinde sadece lookup datasource'ları güncelle
useEffect(() => {
if (!gridDto || !formData || !formItems.length) {
return
}
const updatedItems = formItems.map((groupItem) => ({
...groupItem,
items: (groupItem.items as SimpleItemWithColData[])?.map((item) => {
const colData = gridDto.columnFormats.find((x) => x.fieldName === item.dataField)
if (colData?.lookupDto?.dataSourceType) {
return {
...item,
editorOptions: {
...item.editorOptions,
dataSource: getLookupDataSource(colData?.editorOptions, colData, formData),
valueExpr: colData?.lookupDto?.valueExpr?.toLowerCase(),
displayExpr: colData?.lookupDto?.displayExpr?.toLowerCase(),
},
}
}
return item
}),
}))
setFormItems(updatedItems)
}, [formData])
useEffect(() => { useEffect(() => {
if (!gridReady) { if (!gridReady) {