From 96cd6dfd807941929b425bbf6849c05c1a1d1cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Wed, 27 May 2026 19:32:23 +0300 Subject: [PATCH] =?UTF-8?q?ListForm=20SubFormDialog=20g=C3=BCncellemeleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/services/admin/list-form.service.ts | 8 + .../JsonRowOpDialogSubForm.tsx | 187 +++++++++++++++--- .../JsonRowOpDialogWidget.tsx | 4 +- 3 files changed, 174 insertions(+), 25 deletions(-) diff --git a/ui/src/services/admin/list-form.service.ts b/ui/src/services/admin/list-form.service.ts index c11f23d..c076dfb 100644 --- a/ui/src/services/admin/list-form.service.ts +++ b/ui/src/services/admin/list-form.service.ts @@ -1,7 +1,15 @@ import { ListFormJsonRowDto } from '../../proxy/admin/list-form/models' +import { PagedAndSortedResultRequestDto, PagedResultDto } from '../../proxy' import { FieldsDefaultValueDto, GridOptionsEditDto } from '../../proxy/form/models' import apiService from '../api.service' +export const getListForms = (input: PagedAndSortedResultRequestDto) => + apiService.fetchData>({ + method: 'GET', + url: `/api/admin/list-forms`, + params: input, + }) + export const getListFormByCode = (listFormCode: string) => apiService.fetchData({ method: 'GET', diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSubForm.tsx b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSubForm.tsx index 12ba599..5030107 100644 --- a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSubForm.tsx +++ b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSubForm.tsx @@ -10,21 +10,24 @@ import { } from '@/components/ui' import { ListFormJsonRowDto } from '@/proxy/admin/list-form/models' import { SelectBoxOption } from '@/types/shared' -import { useStoreActions } from '@/store' +import { useStoreActions, useStoreState } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' import { Field, FieldArray, FieldProps, Form, Formik } from 'formik' -import { Dispatch, SetStateAction } from 'react' +import { Dispatch, SetStateAction, useEffect, useState } from 'react' import { FaCalendarPlus, FaCalendarMinus } from 'react-icons/fa' import { boolean, object, string } from 'yup' import { dbSourceTypeOptions, tabTypeOptions } from '../options' import { JsonRowDialogData } from './types' import { deleteListFormJsonRow, + getListForms, getListFormJsonRow, postListFormJsonRow, putListFormJsonRow, } from '@/services/admin/list-form.service' import { SubFormDto, SubFormRelationDto } from '@/proxy/form/models' +import { ColumnFormatEditDto } from '@/proxy/admin/list-form-field/models' +import { getListFormFields } from '@/services/admin/list-form-field.service' const schema = object().shape({ tabTitle: string().required(), @@ -45,7 +48,87 @@ function JsonRowOpDialogSubForm({ setData: Dispatch> }) { const { setJsonValue } = useStoreActions((a) => a.admin.lists) + const listFormValues = useStoreState((s) => s.admin.lists.values) const { translate } = useLocalization() + const [listFormOptions, setListFormOptions] = useState([]) + const [parentFields, setParentFields] = useState([]) + const [childFields, setChildFields] = useState([]) + const [isLoadingListForms, setIsLoadingListForms] = useState(false) + const [isLoadingChildFields, setIsLoadingChildFields] = useState(false) + + const parentFieldOptions = parentFields.map((field) => ({ + value: field.fieldName, + label: `${field.fieldName} (${dbSourceTypeOptions.find((option) => option.value === field.sourceDbType)?.label ?? field.sourceDbType})`, + })) + + const childFieldOptions = childFields.map((field) => ({ + value: field.fieldName, + label: field.fieldName, + })) + + const loadChildFields = async (listFormCode?: string) => { + if (!listFormCode) { + setChildFields([]) + return + } + + setIsLoadingChildFields(true) + try { + const resp = await getListFormFields({ + listFormCode, + sorting: 'ListOrderNo', + maxResultCount: 1000, + }) + setChildFields(resp.data?.items ?? []) + } catch { + setChildFields([]) + } finally { + setIsLoadingChildFields(false) + } + } + + useEffect(() => { + if (!isOpen || !listFormValues?.listFormCode) { + return + } + + const loadData = async () => { + setIsLoadingListForms(true) + try { + const [listFormsResp, parentFieldsResp] = await Promise.all([ + getListForms({ sorting: 'ListFormCode', maxResultCount: 1000 }), + getListFormFields({ + listFormCode: listFormValues.listFormCode!, + sorting: 'ListOrderNo', + maxResultCount: 1000, + }), + ]) + + setListFormOptions( + (listFormsResp.data?.items ?? []) + .filter((item) => item.listFormCode) + .map((item) => ({ + value: item.listFormCode, + label: `${item.listFormCode}${item.title ? ` - ${translate(`::${item.title}`)}` : ''}`, + })), + ) + setParentFields(parentFieldsResp.data?.items ?? []) + } catch { + setListFormOptions([]) + setParentFields([]) + } finally { + setIsLoadingListForms(false) + } + } + + loadData() + }, [isOpen, listFormValues?.listFormCode]) + + useEffect(() => { + if (isOpen) { + loadChildFields(data?.subFormValues?.code) + } + }, [isOpen, data?.subFormValues?.code]) const handleClose = async (e?: any) => { if (e) { @@ -76,7 +159,7 @@ function JsonRowOpDialogSubForm({ onRequestClose={handleClose} > {(data.operation === 'create' || data.operation === 'update') && ( - + + + {({ field, form }: FieldProps) => ( + option.value === item?.parentFieldName, + )} + onChange={(option) => { + const selectedField = parentFields.find( + (parentField) => parentField.fieldName === option?.value, + ) + + form.setFieldValue(field.name, option?.value ?? '') + form.setFieldValue( + `relation.${index}.dbType`, + selectedField?.sourceDbType ?? '', + ) + }} + /> + )} +
@@ -214,9 +331,24 @@ function JsonRowOpDialogSubForm({ type="text" autoComplete="off" name={`relation.${index}.childFieldName`} - component={Input} placeholder={translate('::ListForms.ListFormEdit.SubFormsRelation.ChildFieldName')} - /> + > + {({ field, form }: FieldProps) => ( +