From 9f5c8276da716abc911aae7f6af349e4b83c0131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Wed, 17 Sep 2025 23:50:56 +0300 Subject: [PATCH] =?UTF-8?q?ExtraFilterEditDto=20ve=20Admin=20Taraf=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GridOptionsDto/GridOptionsEditDto.cs | 1 - .../ListForms/ListFormEditTabs.cs | 1 + .../CrudFieldsDefaultValueJsonItemDto.cs | 1 + .../ListFormJsonRowAppService.cs | 10 + .../ListForms/ListFormAutoMapperProfile.cs | 1 + .../Seeds/SeederData.json | 38 +- .../Queries/ExtraFilter.cs | 4 + ui/src/proxy/admin/list-form/models.ts | 3 + ui/src/proxy/form/models.ts | 7 +- ui/src/views/admin/listForm/edit/FormEdit.tsx | 5 + .../listForm/edit/FormTabExtraFilters.tsx | 127 +++++++ .../JsonRowOpDialogExtraFilter.tsx | 341 ++++++++++++++++++ .../edit/json-row-operations/types.ts | 2 + 13 files changed, 538 insertions(+), 3 deletions(-) create mode 100644 ui/src/views/admin/listForm/edit/FormTabExtraFilters.tsx create mode 100644 ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogExtraFilter.tsx diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridOptionsEditDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridOptionsEditDto.cs index aafcab5d..915a8692 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridOptionsEditDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridOptionsEditDto.cs @@ -106,7 +106,6 @@ public class GridOptionsEditDto : GridOptionsDto set { WidgetsJson = JsonSerializer.Serialize(value); } } - [JsonIgnore] public List ExtraFilterEditDto { get diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/ListFormEditTabs.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/ListFormEditTabs.cs index 0fde6a84..e0f5d957 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/ListFormEditTabs.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/ListFormEditTabs.cs @@ -49,4 +49,5 @@ public class ListFormEditTabs public const string WidgetForm = "widget"; public const string Fields = "fields"; public const string Customization = "customization"; + public const string ExtraFilterForm = "extraFilter"; } diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/CrudFieldsDefaultValueJsonItemDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/CrudFieldsDefaultValueJsonItemDto.cs index 55f75c11..5bcca809 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/CrudFieldsDefaultValueJsonItemDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/CrudFieldsDefaultValueJsonItemDto.cs @@ -11,4 +11,5 @@ public class CrudFieldsDefaultValueJsonItemDto public EditingFormDto ItemEditingForm { get; set; } public SubFormDto ItemSubForm { get; set; } public WidgetEditDto ItemWidget { get; set; } + public ExtraFilterEditDto ItemExtraFilter { get; set; } } diff --git a/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs b/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs index d5e86930..976db3ae 100644 --- a/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs @@ -41,6 +41,7 @@ public class ListFormJsonRowAppService : PlatformAppService ListFormEditTabs.CommandColumnsJsonRow => listForm.CommandColumnJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize>(listForm.CommandColumnJson), ListFormEditTabs.SubFormJsonRow => listForm.SubFormsJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize>(listForm.SubFormsJson), ListFormEditTabs.WidgetForm => listForm.WidgetsJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize>(listForm.WidgetsJson), + ListFormEditTabs.ExtraFilterForm => listForm.ExtraFilterJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize>(listForm.ExtraFilterJson), _ => throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]), }; } @@ -77,6 +78,9 @@ public class ListFormJsonRowAppService : PlatformAppService case ListFormEditTabs.WidgetForm: listForm.WidgetsJson = CreateRow(listForm.WidgetsJson, ObjectMapper.Map(model.ItemWidget)); break; + case ListFormEditTabs.ExtraFilterForm: + listForm.ExtraFilterJson = CreateRow(listForm.ExtraFilterJson, ObjectMapper.Map(model.ItemExtraFilter)); + break; default: throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]); } @@ -116,6 +120,9 @@ public class ListFormJsonRowAppService : PlatformAppService case ListFormEditTabs.WidgetForm: listForm.WidgetsJson = UpdateRow(listForm.WidgetsJson, ObjectMapper.Map(model.ItemWidget), model.Index); break; + case ListFormEditTabs.ExtraFilterForm: + listForm.ExtraFilterJson = UpdateRow(listForm.ExtraFilterJson, ObjectMapper.Map(model.ItemExtraFilter), model.Index); + break; default: throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]); } @@ -155,6 +162,9 @@ public class ListFormJsonRowAppService : PlatformAppService case ListFormEditTabs.WidgetForm: listForm.WidgetsJson = DeleteRow(listForm.WidgetsJson, index); break; + case ListFormEditTabs.ExtraFilterForm: + listForm.ExtraFilterJson = DeleteRow(listForm.ExtraFilterJson, index); + break; default: throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]); } diff --git a/api/src/Kurs.Platform.Application/ListForms/ListFormAutoMapperProfile.cs b/api/src/Kurs.Platform.Application/ListForms/ListFormAutoMapperProfile.cs index db8b83a9..4253a888 100644 --- a/api/src/Kurs.Platform.Application/ListForms/ListFormAutoMapperProfile.cs +++ b/api/src/Kurs.Platform.Application/ListForms/ListFormAutoMapperProfile.cs @@ -28,6 +28,7 @@ public class ListFormAutoMapperProfile : Profile CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); CreateMap(); CreateMap(); diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json index d1c644ca..f162253f 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json @@ -6272,7 +6272,7 @@ { "ParentCode": null, "Code": "App.Coordinator", - "DisplayName": "Koordinatör", + "DisplayName": "App.Coordinator", "Order": 500, "Url": null, "Icon": "FcCollaboration", @@ -12256,6 +12256,42 @@ "en": "Data Source Code", "tr": "Veri Kaynağı Kodu" }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.ExtraFilters", + "en": "Extra Filters", + "tr": "Ekstra Filtreler" + }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.ExtraFieldName", + "en": "Field Name", + "tr": "Alan Adı" + }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.ExtraCaption", + "en": "Caption", + "tr": "Başlık" + }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.ExtraOperator", + "en": "Operator", + "tr": "Operatör" + }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.ExtraDefaultValue", + "en": "Default Value", + "tr": "Varsayılan Değer" + }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.ExtraSqlQuery", + "en": "Sql Query", + "tr": "Sql Sorgusu" + }, { "resourceName": "Platform", "key": "ListForms.ListFormEdit.IsTenant", diff --git a/api/src/Kurs.Platform.Domain/Queries/ExtraFilter.cs b/api/src/Kurs.Platform.Domain/Queries/ExtraFilter.cs index 9dfcc871..bbe664be 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ExtraFilter.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ExtraFilter.cs @@ -8,6 +8,8 @@ public class ExtraFilter : ValueObject public string FieldName { get; set; } public string Caption { get; set; } public string Operator { get; set; } + public string DefaultValue { get; set; } + public string SqlQuery { get; set; } public ExtraFilterItems[] Items { get; set; } protected override IEnumerable GetAtomicValues() @@ -15,6 +17,8 @@ public class ExtraFilter : ValueObject yield return FieldName; yield return Caption; yield return Operator; + yield return DefaultValue; + yield return SqlQuery; yield return Items; } } diff --git a/ui/src/proxy/admin/list-form/models.ts b/ui/src/proxy/admin/list-form/models.ts index 9dfd45da..9f4c052a 100644 --- a/ui/src/proxy/admin/list-form/models.ts +++ b/ui/src/proxy/admin/list-form/models.ts @@ -1,6 +1,7 @@ import { CommandColumnDto, EditingFormDto, + ExtraFilterEditDto, FieldsDefaultValueDto, SelectCommandTypeEnum, SubFormDto, @@ -37,6 +38,7 @@ export interface ListFormJsonRowDto { itemEditingForm?: EditingFormDto itemSubForm?: SubFormDto itemWidget?: WidgetEditDto + itemExtraFilter?: ExtraFilterEditDto } export const ListFormEditTabs = { @@ -78,4 +80,5 @@ export const ListFormEditTabs = { Widget: 'widget', Fields: 'fields', Customization: 'customization', + ExtraFilter: 'extraFilter', } as const diff --git a/ui/src/proxy/form/models.ts b/ui/src/proxy/form/models.ts index fb52ec98..d2573ca2 100644 --- a/ui/src/proxy/form/models.ts +++ b/ui/src/proxy/form/models.ts @@ -505,6 +505,7 @@ export interface GridOptionsEditDto extends GridOptionsDto, Record formFieldsDefaultValueDto: FieldsDefaultValueDto[] widgetsJson?: string widgetsDto: WidgetEditDto[] + extraFilterEditDto: ExtraFilterEditDto[] } export interface GridPagerOptionDto { @@ -730,10 +731,14 @@ export interface ExtraFilterDto { caption: string operator: string defaultValue?: string - items: ExtraFilterItemsDto[] + items?: ExtraFilterItemsDto[] } export interface ExtraFilterItemsDto { value: string text: string } + +export interface ExtraFilterEditDto extends ExtraFilterDto { + sqlQuery: string +} diff --git a/ui/src/views/admin/listForm/edit/FormEdit.tsx b/ui/src/views/admin/listForm/edit/FormEdit.tsx index a3620691..b352cba8 100644 --- a/ui/src/views/admin/listForm/edit/FormEdit.tsx +++ b/ui/src/views/admin/listForm/edit/FormEdit.tsx @@ -33,6 +33,7 @@ import { getListFormCustomizations } from '@/services/admin/list-form-customizat import { Container } from '@/components/shared' import { ROUTES_ENUM } from '@/routes/route.constant' import FormTabWidgets from './FormTabWidgets' +import FormTabExtraFilters from './FormTabExtraFilters' export interface FormEditProps { onSubmit: ( @@ -193,6 +194,7 @@ const FormEdit = () => { {translate('::ListForms.ListFormEdit.TabCustomization')} + {translate('::ListForms.ListFormEdit.ExtraFilters')} @@ -253,6 +255,9 @@ const FormEdit = () => { getListFormCustomizations={getCustomizations} > + + + ) : ( diff --git a/ui/src/views/admin/listForm/edit/FormTabExtraFilters.tsx b/ui/src/views/admin/listForm/edit/FormTabExtraFilters.tsx new file mode 100644 index 00000000..dc391cea --- /dev/null +++ b/ui/src/views/admin/listForm/edit/FormTabExtraFilters.tsx @@ -0,0 +1,127 @@ +import { Container } from '@/components/shared' +import { Button, Card, Table } from '@/components/ui' +import TBody from '@/components/ui/Table/TBody' +import THead from '@/components/ui/Table/THead' +import Td from '@/components/ui/Table/Td' +import Th from '@/components/ui/Table/Th' +import Tr from '@/components/ui/Table/Tr' +import { ListFormEditTabs } from '@/proxy/admin/list-form/models' +import { useStoreState } from '@/store' +import { useLocalization } from '@/utils/hooks/useLocalization' +import { useState } from 'react' +import { FaEdit, FaFileMedical, FaTrash } from 'react-icons/fa' +import { JsonRowDialogData } from './json-row-operations/types' +import JsonRowOpDialogExtraFilter from './json-row-operations/JsonRowOpDialogExtraFilter' + +function FormTabExtraFilters(props: { listFormCode: string }) { + const [isJsonRowOpDialogOpen, setIsJsonRowOpDialogOpen] = useState(false) + const [jsonRowOpModalData, setJsonRowOpModalData] = useState() + const { translate } = useLocalization() + + const initialValues = useStoreState((s) => s.admin.listFormValues) + if (!initialValues) { + return null + } + + return ( + + + + + + + + + + + + + + + {initialValues.extraFilterEditDto.map((row, index) => ( + + + + + + + + + ))} + +
+ {translate('::ListForms.ListFormEdit.ExtraFieldName')}{translate('::ListForms.ListFormEdit.ExtraCaption')}{translate('::ListForms.ListFormEdit.ExtraOperator')}{translate('::ListForms.ListFormEdit.ExtraDefaultValue')}{translate('::ListForms.ListFormEdit.ExtraSqlQuery')}
+
+
+
{row.fieldName}{row.caption}{row.operator}{row.defaultValue}{row.sqlQuery}
+
+ +
+ ) +} + +export default FormTabExtraFilters diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogExtraFilter.tsx b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogExtraFilter.tsx new file mode 100644 index 00000000..7e5772fd --- /dev/null +++ b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogExtraFilter.tsx @@ -0,0 +1,341 @@ +import { + Button, + Dialog, + FormContainer, + FormItem, + Input, + Notification, + Select, + toast, +} from '@/components/ui' +import { ListFormJsonRowDto } from '@/proxy/admin/list-form/models' +import { SelectBoxOption } from '@/shared/types' +import { useStoreActions, useStoreState } from '@/store' +import { useLocalization } from '@/utils/hooks/useLocalization' +import { Field, FieldProps, Form, Formik } from 'formik' +import { Dispatch, SetStateAction, useEffect, useState } from 'react' +import { object, string } from 'yup' +import { JsonRowDialogData } from './types' +import { + deleteListFormJsonRow, + getListFormJsonRow, + postListFormJsonRow, + putListFormJsonRow, +} from '@/services/admin/list-form.service' +import { cascadeFilterOperator, colSpanOptions } from '../options' +import CreatableSelect from 'react-select/creatable' +import { getListFormFields } from '@/services/admin/list-form-field.service' +import { groupBy } from 'lodash' + +const schema = object().shape({ + fieldName: string().required('Field Name Required'), + caption: string().required('Caption Required'), + operator: string().required('Operator Required'), + defaultValue: string().required('Value Required'), + sqlQuery: string().required('SQL Query Required'), +}) + +function JsonRowOpDialogExtraFilter({ + listFormCode, + isOpen, + setIsOpen, + data, + setData, +}: { + listFormCode: string + isOpen: boolean + setIsOpen: Dispatch> + data: JsonRowDialogData | undefined + setData: Dispatch> +}) { + const [permissionOptions, setPermissionOptions] = useState([]) + const { translate } = useLocalization() + + const permissions: Record | undefined = useStoreState( + (state) => state.abpConfig.config?.auth.grantedPolicies, + ) + const [fieldList, setFieldList] = useState([]) + + useEffect(() => { + if (permissions) { + setPermissionOptions( + Object.keys(permissions).map((key) => { + return { + value: key, + label: key, + } + }), + ) + } + }, [permissions]) + + const { setJsonValue } = useStoreActions((a) => a.admin) + + const handleClose = async (e?: any) => { + if (e) { + e.preventDefault() + } + + if (data) { + const resp = await getListFormJsonRow(data.id, data.tabName) + setJsonValue({ field: 'extraFilterEditDto', data: resp.data }) + } + + setData(undefined) + setIsOpen(false) + } + + const getFields = async () => { + if (!listFormCode) { + return + } + + try { + const resp = await getListFormFields({ + listFormCode, + sorting: 'ListOrderNo', + maxResultCount: 1000, + }) + if (resp.data?.items) { + const fieldNames = groupBy(resp?.data?.items, 'fieldName') + setFieldList( + Object.keys(fieldNames).map((a) => ({ + value: a, + label: a, + })), + ) + } + } catch (error: any) { + toast.push( + + Alanlar getirilemedi + {error.toString()} + , + { + placement: 'top-end', + }, + ) + } + } + + useEffect(() => { + if (isOpen && data) { + getFields() + } + }, [isOpen, data]) + + if (!data || !fieldList?.length) { + return null + } + + return ( + + {(data.operation === 'create' || data.operation === 'update') && ( + <> +
{data.index === -1 ? 'Add' : 'Update'}
+ { + setSubmitting(true) + try { + const input: ListFormJsonRowDto = { + index: data.index, + fieldName: data.tabName, + itemExtraFilter: values, + } + if (data.index === -1) { + await postListFormJsonRow(data.id, input) + } else { + await putListFormJsonRow(data.id, input) + } + toast.push( + + {data.index === -1 ? 'Kayıt eklendi' : 'Kayıt güncellendi'} + , + { placement: 'top-end' }, + ) + handleClose() + } catch (error: any) { + toast.push( + + Hata + {error} + , + { placement: 'top-end' }, + ) + } finally { + setSubmitting(false) + } + }} + > + {({ touched, errors, values, isSubmitting }) => ( +
+ +
+ + + {({ field, form }: FieldProps) => ( + option.value === values.operator, + )} + onChange={(option) => form.setFieldValue(field.name, option?.value)} + /> + )} + + + + + + + + + + +
+
+ + +
+
+
+ )} +
+ + )} + {data.operation === 'delete' && ( + <> +
Delete
+

Silmek istediğinize emin misiniz?

+ { + setSubmitting(true) + try { + await deleteListFormJsonRow(data.id, data.tabName, values.index) + toast.push(Kayıt silindi , { + placement: 'top-end', + }) + handleClose() + } catch (error: any) { + toast.push( + + Hata + {error} + , + { placement: 'top-end' }, + ) + } finally { + setSubmitting(false) + } + // getListFormJsonRow() + }} + > + {({ isSubmitting }) => ( +
+ +
+ + +
+
+
+ )} +
+ + )} +
+ ) +} + +export default JsonRowOpDialogExtraFilter diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/types.ts b/ui/src/views/admin/listForm/edit/json-row-operations/types.ts index 27eb9e07..48506d27 100644 --- a/ui/src/views/admin/listForm/edit/json-row-operations/types.ts +++ b/ui/src/views/admin/listForm/edit/json-row-operations/types.ts @@ -2,6 +2,7 @@ import { ListFormEditTabs } from '@/proxy/admin/list-form/models' import { CommandColumnDto, EditingFormDto, + ExtraFilterEditDto, FieldsDefaultValueDto, SubFormDto, WidgetEditDto, @@ -20,4 +21,5 @@ export interface JsonRowDialogData { commandValues?: CommandColumnDto subFormValues?: SubFormDto widgetValues?: WidgetEditDto + extraFilterValues?: ExtraFilterEditDto }