diff --git a/ui/src/views/form/FormButtons.tsx b/ui/src/views/form/FormButtons.tsx index 0bff0f70..c6d41ab2 100644 --- a/ui/src/views/form/FormButtons.tsx +++ b/ui/src/views/form/FormButtons.tsx @@ -94,7 +94,7 @@ const FormButtons = (props: { } toast.push( - {translate('::ListForms.FormBilgileriSilindi')} + {translate('::KayitSilindi')} , { placement: 'top-end', diff --git a/ui/src/views/form/FormNew.tsx b/ui/src/views/form/FormNew.tsx index b6cfd41a..e6e87286 100644 --- a/ui/src/views/form/FormNew.tsx +++ b/ui/src/views/form/FormNew.tsx @@ -4,7 +4,7 @@ import { DataType } from 'devextreme/common' import { SimpleItem } from 'devextreme/ui/form' import { useEffect, useState } from 'react' 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 FormDevExpress from './FormDevExpress' import { FormProps } from './types' @@ -24,8 +24,10 @@ const FormNew = ( const [searchParams] = useSearchParams() const { translate } = useLocalization() const MenuIcon = useCurrentMenuIcon('w-5 h-5') + const navigate = useNavigate() const { + fetchData, setFormData, loading, handleSubmit, @@ -41,7 +43,7 @@ const FormNew = ( listFormCode, level, isSubForm, - onSubmitAction: props?.onActionView, + onSubmitAction: (props?.onActionView), }) const [newParams, setNewParams] = useState(new URLSearchParams()) @@ -59,8 +61,89 @@ const FormNew = ( return } - setFormData(createInitialFormData()) - }, [formItems, newParams]) + // Sadece formData yoksa (ilk yüklemede) initial data oluştur + // 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() { const data: any = {} @@ -80,55 +163,18 @@ const FormNew = ( } if (!gridDto?.columnFormats) { - return + return data } + + // Grid'den gelen columnFormat'ları kullanarak default değerleri set et for (const colFormat of gridDto?.columnFormats) { if (!colFormat.fieldName) { continue } - // Grid'den gelen columnFormat'ları kullanarak default değerleri set et if (colFormat.defaultValue != null) { 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 diff --git a/ui/src/views/form/useGridData.tsx b/ui/src/views/form/useGridData.tsx index 066ecc3a..709c9f00 100644 --- a/ui/src/views/form/useGridData.tsx +++ b/ui/src/views/form/useGridData.tsx @@ -289,7 +289,35 @@ const useGridData = (props: { }) setFormItems(items) 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(() => { if (!gridReady) {