From 4d1416d5a16de966531831cb0bd0fb7457c1e2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sat, 27 Sep 2025 23:25:21 +0300 Subject: [PATCH] =?UTF-8?q?Pivot=20ve=20Chart=20ile=20ilgili=20de=C4=9Fi?= =?UTF-8?q?=C5=9Fiklikler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GridOptionsDto/GridPivotOptionDto.cs | 1 + .../ListFormCustomizationAppService.cs | 2 +- .../Seeds/SeederData.json | 2 +- ui/src/proxy/form/models.ts | 1 + ui/src/shared/useListFormCustomDataSource.ts | 9 +- .../admin/listForm/edit/ChartTabAnimation.tsx | 2 - .../listForm/edit/ChartTabAnnotations.tsx | 866 +++++++++--------- .../admin/listForm/edit/ChartTabAxis.tsx | 641 ++++++------- .../listForm/edit/ChartTabCommonSettings.tsx | 414 +++++---- .../admin/listForm/edit/ChartTabCrosshair.tsx | 554 +++++------ .../admin/listForm/edit/ChartTabExport.tsx | 2 - .../admin/listForm/edit/ChartTabLegend.tsx | 269 +++--- .../listForm/edit/ChartTabZoomAndPan.tsx | 252 ++--- ui/src/views/admin/listForm/edit/FormEdit.tsx | 10 +- .../admin/listForm/edit/FormTabPivots.tsx | 14 + .../JsonRowOpDialogSeries.tsx | 69 +- ui/src/views/list/Chart.tsx | 22 +- ui/src/views/list/List.tsx | 36 +- ui/src/views/list/Pivot.tsx | 115 ++- ui/src/views/list/useFilters.tsx | 16 +- 20 files changed, 1767 insertions(+), 1530 deletions(-) diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridPivotOptionDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridPivotOptionDto.cs index ca316fa6..5cf86514 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridPivotOptionDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/GridPivotOptionDto.cs @@ -4,6 +4,7 @@ public class GridPivotOptionDto { /// pivot grid için eklenmiş sütunlardır. /// + public bool ColumnChooserEnabled { get; set; } public bool AllowFieldDragging { get; set; } = true; public bool ShowFieldPanel { get; set; } = true; public bool ShowDataFields { get; set; } = true; diff --git a/api/src/Kurs.Platform.Application/ListForms/ListFormCustomizationAppService.cs b/api/src/Kurs.Platform.Application/ListForms/ListFormCustomizationAppService.cs index 4e0a186c..ea576b9f 100644 --- a/api/src/Kurs.Platform.Application/ListForms/ListFormCustomizationAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/ListFormCustomizationAppService.cs @@ -89,7 +89,7 @@ public class ListFormCustomizationAppService : PlatformAppService { throw new BadHttpRequestException("Type UI veya Grid olmalıdır"); } - if (input.CustomizationData.IsNullOrWhiteSpace()) + if (!(input.CustomizationType == ListFormCustomizationTypeEnum.GridState) && input.CustomizationData.IsNullOrWhiteSpace()) { throw new BadHttpRequestException("Filter data boş olamaz"); } diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json index 67060bae..923715af 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json @@ -7526,7 +7526,7 @@ { "key": "admin.chart", "path": "/admin/chart/:listFormCode", - "componentPath": "@/views/chart/Chart", + "componentPath": "@/views/list/Chart", "routeType": "protected", "authority": [] }, diff --git a/ui/src/proxy/form/models.ts b/ui/src/proxy/form/models.ts index cea8c267..77b20468 100644 --- a/ui/src/proxy/form/models.ts +++ b/ui/src/proxy/form/models.ts @@ -358,6 +358,7 @@ export interface GridColumnOptionDto { } export interface GridPivotOptionDto { + columnChooserEnabled: boolean allowFieldDragging: boolean showFieldPanel: boolean showDataFields: boolean diff --git a/ui/src/shared/useListFormCustomDataSource.ts b/ui/src/shared/useListFormCustomDataSource.ts index f55eec3a..ee18d983 100644 --- a/ui/src/shared/useListFormCustomDataSource.ts +++ b/ui/src/shared/useListFormCustomDataSource.ts @@ -1,9 +1,9 @@ import DataGrid from 'devextreme-react/data-grid' import PivotGrid from 'devextreme-react/pivot-grid' import CustomStore from 'devextreme/data/custom_store' -import { MutableRefObject, useCallback, useState } from 'react' +import { MutableRefObject, useCallback } from 'react' import { getLoadOptions, getServiceAddress, setGridPanelColor } from '../views/list/Utils' -import { GridOptionsDto, WidgetGroupDto } from '../proxy/form/models' +import { GridOptionsDto } from '../proxy/form/models' import { GridColumnData } from '../views/list/GridColumnData' import { dynamicFetch } from '../services/form.service' import { MULTIVALUE_DELIMITER } from '../constants/app.constant' @@ -23,6 +23,8 @@ const useListFormCustomDataSource = ({ listFormCode: string, searchParams?: URLSearchParams, cols?: GridColumnData[], + group?: string, + groupSummary?: string ) => { const store: any = new CustomStore({ key: gridOptions.keyFieldName, @@ -32,7 +34,8 @@ const useListFormCustomDataSource = ({ listFormCode, filter: '', createDeleteQuery: searchParams?.get('createDeleteQuery'), - group: '', + group, + groupSummary }) // 1. Default filter'ı al diff --git a/ui/src/views/admin/listForm/edit/ChartTabAnimation.tsx b/ui/src/views/admin/listForm/edit/ChartTabAnimation.tsx index 2df655da..dca26a1b 100644 --- a/ui/src/views/admin/listForm/edit/ChartTabAnimation.tsx +++ b/ui/src/views/admin/listForm/edit/ChartTabAnimation.tsx @@ -29,7 +29,6 @@ function ChartTabAnimation(props: FormEditProps) { {({ touched, errors, resetForm, isSubmitting, values }) => (
- -
diff --git a/ui/src/views/list/Chart.tsx b/ui/src/views/list/Chart.tsx index f34b3a33..54114eda 100644 --- a/ui/src/views/list/Chart.tsx +++ b/ui/src/views/list/Chart.tsx @@ -33,7 +33,19 @@ const Chart = (props: ChartProps) => { useEffect(() => { if (!gridDto) return - const dataSource = createSelectDataSource(gridDto.gridOptions, listFormCode, searchParams) + console.log( + gridDto.gridOptions?.seriesDto?.map((s) => `${s.argumentField} asc false`).join(', '), + ) + console.log(gridDto.gridOptions?.seriesDto?.map((s) => `${s.valueField} count`).join(', ')) + + const dataSource = createSelectDataSource( + gridDto.gridOptions, + listFormCode, + searchParams, + [], + gridDto.gridOptions?.seriesDto?.map((s) => `${s.argumentField} asc false`).join(', '), + gridDto.gridOptions?.seriesDto?.map((s) => `${s.valueField} count`).join(', '), + ) const options = { dataSource: dataSource, @@ -62,8 +74,14 @@ const Chart = (props: ChartProps) => { valueAxis: gridDto.gridOptions.valueAxisDto, tooltip: gridDto.gridOptions.tooltipDto, + series: + gridDto.gridOptions.seriesDto?.length > 0 + ? gridDto.gridOptions.seriesDto.map((s) => ({ + argumentField: 'key', + valueField: 'summary', + })) + : undefined, panes: gridDto.gridOptions.panesDto?.length > 0 ? gridDto.gridOptions.panesDto : undefined, - series: gridDto.gridOptions.seriesDto?.length > 0 ? gridDto.gridOptions.seriesDto : undefined, commonSeriesSettings: gridDto.gridOptions.commonSeriesSettingsDto, commonPaneSettings: gridDto.gridOptions.commonPaneSettingsDto, commonAxisSettings: gridDto.gridOptions.commonAxisSettingsDto, diff --git a/ui/src/views/list/List.tsx b/ui/src/views/list/List.tsx index 5ab988ec..d6d0e676 100644 --- a/ui/src/views/list/List.tsx +++ b/ui/src/views/list/List.tsx @@ -29,32 +29,34 @@ const List = () => { const { states } = useStoreState((state) => state.base.lists) const { setStates } = useStoreActions((a) => a.base.lists) - useEffect(() => { - const initializeGridAsync = async () => { + // 🔹 Tekrar çağırılabilir metod + const refreshGridDto = async () => { + if (!listFormCode) return + try { const response = await getList({ listFormCode }) setGridDto(response.data) + } catch (error) { + console.error('GridDto refresh error:', error) } + } - initializeGridAsync() - .then(() => { - //base içerisine kaydedilen state içerisinden bakılacak - const listFormStates = states.find((a) => a.listFormCode === listFormCode) - if (listFormStates) { - setViewMode(listFormStates.layout || 'grid') - } else { - setViewMode(gridDto?.gridOptions?.layoutDto.defaultLayout || 'grid') - } - }) - .catch((error) => { - console.error('Hata oluştu:', error) - }) + useEffect(() => { + refreshGridDto().then(() => { + //base içerisine kaydedilen state içerisinden bakılacak + const listFormStates = states.find((a) => a.listFormCode === listFormCode) + if (listFormStates) { + setViewMode(listFormStates.layout || 'grid') + } else { + setViewMode(gridDto?.gridOptions?.layoutDto.defaultLayout || 'grid') + } + }) }, [listFormCode]) if (!listFormCode) { return null } - if (!gridDto) { + if (!gridDto) { return null } @@ -109,6 +111,7 @@ const List = () => { )} + {gridDto?.gridOptions?.layoutDto.pivot && ( + + + + {checkPermission(gridDto?.gridOptions.permissionDto.u) && ( + + )} +
+ {gridDto.gridOptions.pivotOptionDto.showChart && ( @@ -260,6 +361,8 @@ const Pivot = (props: GridProps) => { )} +
+ { showFilterFields={gridDto.gridOptions.pivotOptionDto.showFilterFields} /> - + )} diff --git a/ui/src/views/list/useFilters.tsx b/ui/src/views/list/useFilters.tsx index f0e159b5..6c923267 100644 --- a/ui/src/views/list/useFilters.tsx +++ b/ui/src/views/list/useFilters.tsx @@ -103,12 +103,6 @@ const useFilters = ({ const menus = [] - menus.push({ - text: translate('::ListForms.ListForm.Pivots'), - id: 'openPivotGrid', - icon: 'search', - }) - // #region Save/Reset grid state and Filters if (grdOpt.filterRowDto?.allowUserUiFilterSave || grdOpt.stateStoringDto?.enabled) { //Kullanicinin filtre islemi yapmasina izin verilmis ise filtreleme menu elemanlarini ekle @@ -126,7 +120,7 @@ const useFilters = ({ menus.push({ text: translate('::ListForms.ListForm.RemoveFilter'), id: 'clearFilter', - icon: 'clear', + icon: 'close', }) } @@ -135,7 +129,7 @@ const useFilters = ({ menus.push({ text: translate('::ListForms.ListForm.ResetGridState'), id: 'resetGridState', - icon: 'return', + icon: 'refresh', }) } @@ -143,7 +137,7 @@ const useFilters = ({ menus.push({ text: translate('::ListForms.ListForm.Manage'), id: 'openManage', - icon: 'info', + icon: 'preferences', }) } @@ -151,7 +145,7 @@ const useFilters = ({ menus.push({ text: translate('::ListForms.ListForm.ImportManager'), id: 'importManager', - icon: 'import', + icon: 'upload', }) } @@ -183,8 +177,6 @@ const useFilters = ({ } else if (itemData.id === 'deleteFilter') { // Kayitli bir filtreyi silmek icin ilgili ekrani ac setIsDeleteModalOpen(true) - } else if (itemData.id === 'openPivotGrid') { - navigate(ROUTES_ENUM.protected.admin.pivot.replace(':listFormCode', listFormCode)) } else if (itemData.id === 'openManage') { window.open( ROUTES_ENUM.protected.saas.listFormManagement.edit.replace(