/* eslint-disable @typescript-eslint/no-explicit-any */ import Container from '@/components/shared/Container' import { DX_CLASSNAMES } from '@/constants/app.constant' import { GridDto, ListFormCustomizationTypeEnum } from '@/proxy/form/models' import { getListFormCustomization, postListFormCustomization, } from '@/services/list-form-customization.service' import { useListFormColumns } from '@/shared/useListFormColumns' import { useListFormCustomDataSource } from '@/shared/useListFormCustomDataSource' import { useLocalization } from '@/utils/hooks/useLocalization' import Chart, { CommonSeriesSettings, Size, Tooltip } from 'devextreme-react/chart' import PivotGrid, { FieldChooser, FieldPanel, HeaderFilter, IStateStoringProps, PivotGridTypes, Scrolling, Search, } from 'devextreme-react/pivot-grid' import CustomStore from 'devextreme/data/custom_store' import PivotGridDataSource, { Field } from 'devextreme/ui/pivot_grid/data_source' import { useCallback, useEffect, useRef, useState } from 'react' import { Helmet } from 'react-helmet' import { GridColumnData } from './GridColumnData' import { addCss, addJs, controlStyleCondition, pivotFieldConvertDataType, setGridPanelColor, } from './Utils' import { useFilters } from './useFilters' import WidgetGroup from '@/components/common/WidgetGroup' import { Button } from '@/components/ui' import { FaCog, FaInfoCircle, FaSyncAlt, FaTimes, FaTrash, FaTrashAlt, FaUndo, } from 'react-icons/fa' import { usePermission } from '@/utils/hooks/usePermission' import { ROUTES_ENUM } from '@/routes/route.constant' import { usePWA } from '@/utils/hooks/usePWA' interface PivotProps { listFormCode: string searchParams?: URLSearchParams isSubForm?: boolean level?: number refreshData?: () => Promise gridDto?: GridDto refreshGridDto: () => Promise } const statedGridPanelColor = 'rgba(50, 200, 200, 0.5)' // kullanici tanimli gridState ile islem gormus gridin paneline ait renk const Pivot = (props: PivotProps) => { const { listFormCode, searchParams, isSubForm, level, gridDto } = props const { translate } = useLocalization() const { checkPermission } = usePermission() const isPwaMode = usePWA() const gridRef = useRef() const chartRef = useRef(null) const refListFormCode = useRef('') const [gridDataSource, setGridDataSource] = useState>() const [columnData, setColumnData] = useState() const { filterToolbarData, ...filterData } = useFilters({ gridDto, gridRef, listFormCode, }) const { createSelectDataSource } = useListFormCustomDataSource({ pivotRef: gridRef }) const { getBandedColumns } = useListFormColumns({ gridDto, listFormCode, isSubForm, }) function onCellPrepared(e: any) { const columnFormats = gridDto?.columnFormats if (!columnFormats) { return } // satir, hucre yada header vb. kisimlara conditional style uygulamak icin for (let indxCol = 0; indxCol < columnFormats.length; indxCol++) { const colFormat = columnFormats[indxCol] for (let indxStyl = 0; indxStyl < colFormat.columnStylingDto.length; indxStyl++) { const colStyle = colFormat.columnStylingDto[indxStyl] // uygulanacak style if (e.rowType == colStyle.rowType) { // header, filter, data, group, summaries ..her birisine style uygulanabilir // style bütün satıra uygulansın olarak seçili ise yada sadece ilgili field üzerinde ise if (colStyle.useRow || e.column?.dataField == colFormat.fieldName) { if ( !colStyle.conditionValue || controlStyleCondition(e.data, colFormat.fieldName, colStyle) ) { // css sınıf ismi var ise uygula if (colStyle.cssClassName) { e.cellElement.addClass(colStyle.cssClassName) } // css inline style var ise uygula if (colStyle.cssStyles) { e.cellElement.attr('style', e.cellElement.attr('style') + ';' + colStyle.cssStyles) } } } } } } } const clearPivotFilters = () => { const grid = gridRef.current?.instance if (!grid) return const ds = grid.getDataSource() if (ds) { const fields = ds.fields() fields.forEach((f: any) => { f.filterValues = undefined f.filterType = undefined }) ds.reload() } } const moveAllFieldsToFilterArea = () => { const grid = gridRef.current?.instance if (!grid) return const ds = grid.getDataSource() if (!ds) return const fields = ds.fields() fields.forEach((field) => { field.area = 'filter' // tüm alanları filtre alanına taşı field.areaIndex = undefined }) ds.fields(fields) ds.reload() // PivotGrid’i yeniden yükle grid.repaint() // UI güncelle } const resetPivotGridState = async () => { const grid = gridRef.current?.instance if (grid) { // kullaniciya ait kayitli grid state i sil customizationData boşalt silinsin. await postListFormCustomization({ listFormCode: listFormCode, customizationType: ListFormCustomizationTypeEnum.GridState, filterName: `pivot-${gridRef.current?.instance.option('stateStoring')?.storageKey ?? ''}`, customizationData: '', }) await props.refreshGridDto() clearPivotFilters() moveAllFieldsToFilterArea() } } const customSaveState = useCallback( (state: any) => postListFormCustomization({ listFormCode: listFormCode, customizationType: ListFormCustomizationTypeEnum.GridState, filterName: `pivot-${gridRef.current?.instance.option('stateStoring')?.storageKey ?? ''}`, customizationData: JSON.stringify(state), }).then(() => { setGridPanelColor(statedGridPanelColor) }), [listFormCode], ) const customLoadState = useCallback( () => getListFormCustomization( listFormCode, ListFormCustomizationTypeEnum.GridState, `pivot-${gridRef.current?.instance.option('stateStoring')?.storageKey ?? ''}`, ).then((response: any) => { setGridPanelColor(statedGridPanelColor) if (response.data?.length > 0) { return JSON.parse(response.data[0].customizationData) } }), [listFormCode], ) useEffect(() => { if (gridRef?.current) { gridRef.current.instance.option('remoteOperations', false) gridRef.current.instance.option('dataSource', undefined) gridRef.current.instance.option('stateStoring', undefined) } }, [listFormCode]) useEffect(() => { if (!gridDto) { return } // Set js and css const grdOpt = gridDto.gridOptions if (grdOpt.customJsSources.length) { for (const js of grdOpt.customJsSources) { addJs(js) } } if (grdOpt.customStyleSources.length) { for (const css of grdOpt.customStyleSources) { addCss(css) } } }, [gridDto]) useEffect(() => { if (!gridDto) { return } // Set columns const cols = getBandedColumns() setColumnData(cols?.filter((a) => a.colData?.pivotSettingsDto.isPivot)) // Set data source const dataSource: CustomStore = createSelectDataSource( gridDto.gridOptions, listFormCode, searchParams, cols, ) setGridDataSource(dataSource) }, [gridDto, searchParams]) useEffect(() => { refListFormCode.current = listFormCode if (!gridRef?.current) { return } const fields: any = columnData?.map((b) => { return { dataField: b.dataField, caption: b.caption, dataType: pivotFieldConvertDataType(b.dataType), area: b.colData?.pivotSettingsDto.area, format: b.colData?.pivotSettingsDto.format, summaryType: b.colData?.pivotSettingsDto.summaryType, groupInterval: b.colData?.pivotSettingsDto.groupInterval, sortOrder: b.colData?.pivotSettingsDto.sortOrder, expanded: b.colData?.pivotSettingsDto.expanded, wordWrapEnabled: b.colData?.pivotSettingsDto.wordWrapEnabled, visible: true, width: b.width, } as Field }) PivotGridDataSource const dataSource: PivotGridTypes.Properties['dataSource'] = { remoteOperations: true, store: gridDataSource, fields, } gridRef.current.instance.option('dataSource', dataSource) gridRef.current.instance.option('state', null) const stateStoring: IStateStoringProps = { enabled: gridDto?.gridOptions.stateStoringDto?.enabled, type: gridDto?.gridOptions.stateStoringDto?.type, savingTimeout: gridDto?.gridOptions.stateStoringDto?.savingTimeout, storageKey: gridDto?.gridOptions.stateStoringDto?.storageKey, } if ( gridDto?.gridOptions.stateStoringDto?.enabled && gridDto?.gridOptions.stateStoringDto?.type === 'custom' ) { stateStoring.customSave = customSaveState stateStoring.customLoad = customLoadState } gridRef.current.instance.option('stateStoring', stateStoring) //chart Integration if (gridRef && chartRef) { gridRef?.current?.instance.bindChart(chartRef?.current?.instance, { dataFieldsDisplayMode: 'splitPanes', alternateDataFields: false, }) } }, [columnData]) return ( <> {!isSubForm && ( )} {gridDto && columnData && (
{checkPermission(gridDto?.gridOptions.permissionDto.u) && ( )}
{gridDto.gridOptions.pivotOptionDto.showChart && ( )}
)}
) } export default Pivot /* 0 || filterToolbarData.length > 0}> {toolbarData.map((item) => ( ))} {filterToolbarData.map((item) => ( ))} +a)} showPageSizeSelector={gridDto.gridOptions.pagerOptionDto?.showPageSizeSelector} showInfo={gridDto.gridOptions.pagerOptionDto?.showInfo} showNavigationButtons={gridDto.gridOptions.pagerOptionDto?.showNavigationButtons} infoText={gridDto.gridOptions.pagerOptionDto?.infoText} displayMode={gridDto.gridOptions.pagerOptionDto?.displayMode} > */