From d66bda656d64c2a8eb5ae5178769d8e1dc7c8841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Tue, 11 Nov 2025 15:00:52 +0300 Subject: [PATCH] =?UTF-8?q?Card=20formundaki=20Cascading=20s=C3=BCtunlar?= =?UTF-8?q?=C4=B1n=20d=C3=BCzenlemesi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/views/form/FormDevExpress.tsx | 45 ++++++++++++++++++++++-- ui/src/views/form/useFormData.tsx | 8 +++-- ui/src/views/form/useLookupDataSource.ts | 7 ++-- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/ui/src/views/form/FormDevExpress.tsx b/ui/src/views/form/FormDevExpress.tsx index 716c8c46..f309888f 100644 --- a/ui/src/views/form/FormDevExpress.tsx +++ b/ui/src/views/form/FormDevExpress.tsx @@ -24,20 +24,61 @@ const FormDevExpress = (props: { const { listFormCode, isSubForm, mode, refForm, formData, formItems, setFormData } = props const formDataRef = useRef(formData) + const formItemsRef = useRef(formItems) + useEffect(() => { formDataRef.current = formData }, [formData]) + useEffect(() => { + formItemsRef.current = formItems + }, [formItems]) + + // formItems değiştiğinde (özellikle cascading alanlar için) editörlerin dataSource'larını güncelle + useEffect(() => { + if (!refForm.current?.instance) return + + const allItems = formItems.flatMap((group) => (group.items as SimpleItemWithColData[]) || []) + + allItems.forEach((item) => { + if (item.colData?.lookupDto?.dataSourceType && item.editorOptions?.dataSource) { + try { + const editor = refForm.current?.instance.getEditor(item.dataField!) + if (editor) { + editor.option('dataSource', item.editorOptions.dataSource) + } + } catch (err) { + // Editor henüz oluşmamış olabilir, sessizce devam et + console.debug('Editor update skipped for', item.dataField, err) + } + } + }) + }, [formItems]) + return (
{ - setFormData({ ...formData, [e.dataField!]: e.value }) + const newFormData = { ...formData, [e.dataField!]: e.value } + + // Cascading child field'leri temizle (parent field değiştiğinde) + const allItems = formItemsRef.current.flatMap((group) => (group.items as SimpleItemWithColData[]) || []) + const cascadingChildren = allItems.filter((item) => { + const parentFields = item.colData?.lookupDto?.cascadeParentFields?.split(',') || [] + return parentFields.some(field => field.trim() === e.dataField) + }) + + // Parent field değiştiğinde child field'leri temizle + cascadingChildren.forEach((child) => { + newFormData[child.dataField!] = null + }) + + setFormData(newFormData) //Dinamik script - const changeItem = formItems + const changeItem = formItemsRef.current .flatMap((group) => (group.items as SimpleItemWithColData[]) || []) .find((i: SimpleItemWithColData) => i.dataField === e.dataField) diff --git a/ui/src/views/form/useFormData.tsx b/ui/src/views/form/useFormData.tsx index 29cef6b6..0cd4cc8d 100644 --- a/ui/src/views/form/useFormData.tsx +++ b/ui/src/views/form/useFormData.tsx @@ -295,10 +295,11 @@ const useGridData = (props: { // formData değiştiğinde sadece lookup datasource'ları güncelle useEffect(() => { - if (!gridDto || !formData || !formItems.length) { + if (!gridDto || !formItems.length) { return } + // View mode'da formData olsa da olmasa da cascading alanlar için dataSource oluşturulmalı const updatedItems = formItems.map((groupItem) => ({ ...groupItem, items: (groupItem.items as SimpleItemWithColData[])?.map((item) => { @@ -308,7 +309,8 @@ const useGridData = (props: { ...item, editorOptions: { ...item.editorOptions, - dataSource: getLookupDataSource(colData?.editorOptions, colData, formData), + // formData null bile olsa getLookupDataSource çağrılmalı (null parametrelerle API çağrısı yapılacak) + dataSource: getLookupDataSource(colData?.editorOptions, colData, formData || null), valueExpr: colData?.lookupDto?.valueExpr?.toLowerCase(), displayExpr: colData?.lookupDto?.displayExpr?.toLowerCase(), }, @@ -319,7 +321,7 @@ const useGridData = (props: { })) setFormItems(updatedItems) - }, [formData]) + }, [formData, gridDto]) useEffect(() => { if (!gridReady) { diff --git a/ui/src/views/form/useLookupDataSource.ts b/ui/src/views/form/useLookupDataSource.ts index d1a6bcab..31191df8 100644 --- a/ui/src/views/form/useLookupDataSource.ts +++ b/ui/src/views/form/useLookupDataSource.ts @@ -138,16 +138,13 @@ export const useLookupDataSource = ({ const { lookupDto } = colData const filters: any[] = [] - // Eğer cascadeParentFields varsa ve row verisi (data) yoksa boş döneriz - if (lookupDto.cascadeParentFields && !data) { - return { store: [] } - } + // Cascading field'ler için - data yoksa veya parent field değeri yoksa null parametreler ile API çağrısı yap if (lookupDto.cascadeParentFields) { if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.StaticData) { filters.push([ lookupDto?.cascadeRelationField, lookupDto?.cascadeFilterOperator, - options?.data[lookupDto?.cascadeParentField], + options?.data?.[lookupDto?.cascadeParentField] ?? null, ]) } else { for (const cascadeParentField of lookupDto.cascadeParentFields.split(',')) {