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(',')) {