From 531b924f5e991c7e7af3813f545f0d68443ba6e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 28 Sep 2025 21:09:07 +0300 Subject: [PATCH] Chart Series Summary Type eklendi --- .../ListForms/Chart/ChartSeriesDto.cs | 5 ++ .../Queries/ChartSeries.cs | 3 + ui/src/proxy/admin/charts/models.ts | 1 + .../admin/listForm/edit/ChartTabSeries.tsx | 4 +- .../JsonRowOpDialogSeries.tsx | 85 +++++++++---------- ui/src/views/list/Chart.tsx | 60 ++++++++++--- ui/src/views/list/List.tsx | 6 +- 7 files changed, 103 insertions(+), 61 deletions(-) diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/Chart/ChartSeriesDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/Chart/ChartSeriesDto.cs index 21aa88ae..df1fe1c0 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/Chart/ChartSeriesDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/Chart/ChartSeriesDto.cs @@ -91,6 +91,11 @@ public class ChartSeriesDto /// FullStackedBarSeries,BubbleSeries, /// public string ValueField { get; set; } + /// Değer özetleme işlevini belirtir. + /// Accepted Values: 'avg' | 'count' | 'custom' | 'max' | 'min' | 'sum' + /// Default Value: 'sum' + /// + public string SummaryType { get; set; } = "sum"; /// Serinin görünür olup olmayacağını belirtir. /// public bool Visible { get; set; } = true; diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs b/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs index a683e23d..3a716987 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs @@ -40,6 +40,8 @@ public class ChartSeries : ValueObject public string Type { get; private set; } [JsonPropertyName("ValueField")] public string ValueField { get; private set; } + [JsonPropertyName("SummaryType")] + public string SummaryType { get; private set; } [JsonPropertyName("Visible")] public bool Visible { get; private set; } = true; [JsonPropertyName("Width")] @@ -69,6 +71,7 @@ public class ChartSeries : ValueObject yield return ShowInLegend; yield return Type; yield return ValueField; + yield return SummaryType; yield return Visible; yield return Width; yield return Label; diff --git a/ui/src/proxy/admin/charts/models.ts b/ui/src/proxy/admin/charts/models.ts index 47aa7382..1a942af9 100644 --- a/ui/src/proxy/admin/charts/models.ts +++ b/ui/src/proxy/admin/charts/models.ts @@ -316,6 +316,7 @@ export interface ChartSeriesDto { showInLegend: boolean type?: string valueField?: string + summaryType?: string visible: boolean width: number label: ChartLabelDto diff --git a/ui/src/views/admin/listForm/edit/ChartTabSeries.tsx b/ui/src/views/admin/listForm/edit/ChartTabSeries.tsx index a7e01e4c..3dd0cd94 100644 --- a/ui/src/views/admin/listForm/edit/ChartTabSeries.tsx +++ b/ui/src/views/admin/listForm/edit/ChartTabSeries.tsx @@ -157,6 +157,7 @@ function ChartTabSeries(props: FormEditProps & { listFormCode: string }) { Name Argument Field Value Field + Summary Type Pane Axis @@ -207,6 +208,7 @@ function ChartTabSeries(props: FormEditProps & { listFormCode: string }) { {row.name} {row.argumentField} {row.valueField} + {row.summaryType} {row.pane} {row.axis} @@ -215,11 +217,11 @@ function ChartTabSeries(props: FormEditProps & { listFormCode: string }) { diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSeries.tsx b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSeries.tsx index 6c26d079..16d08376 100644 --- a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSeries.tsx +++ b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogSeries.tsx @@ -29,6 +29,7 @@ import { chartSeriesDashStyleOptions, chartSeriesSelectionModeOptions, chartSeriesTypeOptions, + columnSummaryTypeListOptions, } from '../options' import { ChartPanesDto, ChartSeriesDto, ChartValueAxisDto } from '@/proxy/admin/charts/models' import { getListFormFields } from '@/services/admin/list-form-field.service' @@ -41,8 +42,9 @@ const schema = object().shape({ ignoreEmptyPoints: boolean().notRequired(), type: string().notRequired(), name: string().required('Name Required'), - argumentField: string().notRequired(), - valueField: string().notRequired(), + argumentField: string().required('Argument Field Required'), + valueField: string().required('Value Field Required'), + summaryType: string().required('Summary Type Required'), axis: string().notRequired(), pane: string().notRequired(), dashStyle: string().notRequired(), @@ -68,21 +70,20 @@ const schema = object().shape({ }) function JsonRowOpDialogSeries({ - listFormCode, isOpen, setIsOpen, data, setData, + fieldList, }: { - listFormCode: string isOpen: boolean setIsOpen: Dispatch> data: JsonRowDialogData | undefined setData: Dispatch> + fieldList?: SelectBoxOption[] }) { const { translate } = useLocalization() const { setJsonValue } = useStoreActions((a) => a.admin) - const [fieldList, setFieldList] = useState([]) const handleClose = async (e?: any) => { if (e) { @@ -117,44 +118,6 @@ function JsonRowOpDialogSeries({ })) } - 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) { return null } @@ -310,7 +273,7 @@ function JsonRowOpDialogSeries({ form={form} isClearable={true} options={fieldList} - value={fieldList.find( + value={fieldList?.find( (option) => option.value === values.argumentField, )} onChange={(option) => form.setFieldValue(field.name, option?.value)} @@ -334,7 +297,7 @@ function JsonRowOpDialogSeries({ form={form} isClearable={true} options={fieldList} - value={fieldList.find((option) => option.value === values.valueField)} + value={fieldList?.find((option) => option.value === values.valueField)} onChange={(option) => form.setFieldValue(field.name, option?.value)} menuPlacement="auto" maxMenuHeight={150} @@ -343,6 +306,38 @@ function JsonRowOpDialogSeries({ + + + {({ field, form }: FieldProps) => ( +