import Container from '@/components/shared/Container' import { DX_CLASSNAMES } from '@/constants/app.constant' import { GridDto } from '@/proxy/form/models' import { useLocalization } from '@/utils/hooks/useLocalization' import Gantt, { Column, ContextMenu, Editing, FilterRow, GanttRef, HeaderFilter, Item, Sorting, Tasks, Toolbar, Validation, } from 'devextreme-react/gantt' import { useCallback, useEffect, useRef, useState } from 'react' import { Helmet } from 'react-helmet' import { getList } from '@/services/form.service' import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { addCss, addJs } from './Utils' import { layoutTypes } from '../admin/listForm/edit/types' import WidgetGroup from '@/components/ui/Widget/WidgetGroup' import { ROUTES_ENUM } from '@/routes/route.constant' import { usePWA } from '@/utils/hooks/usePWA' import { GanttScaleType } from 'devextreme/ui/gantt' import { useListFormColumns } from './useListFormColumns' import CustomStore from 'devextreme/data/custom_store' import { GridColumnData } from './GridColumnData' import { Loading } from '@/components/shared' interface GanttViewProps { listFormCode: string searchParams?: URLSearchParams isSubForm?: boolean level?: number refreshData?: () => Promise gridDto?: GridDto } const GanttView = (props: GanttViewProps) => { const { listFormCode, searchParams, isSubForm, level, gridDto: extGridDto } = props const { translate } = useLocalization() const isPwaMode = usePWA() const gridRef = useRef() const refListFormCode = useRef('') const widgetGroupRef = useRef(null) const [ganttDataSource, setGanttDataSource] = useState>() const [columnData, setColumnData] = useState() const [gridDto, setGridDto] = useState() const [widgetGroupHeight, setWidgetGroupHeight] = useState(0) const [scaleType, setScaleType] = useState('weeks') const layout = layoutTypes.gantt || 'gantt' useEffect(() => { const initializeGantt = async () => { const response = await getList({ listFormCode }) setGridDto(response.data) } if (extGridDto === undefined) { initializeGantt() } else { setGridDto(extGridDto) } setScaleType(extGridDto?.gridOptions.ganttOptionDto?.scaleType || 'weeks') }, [listFormCode, extGridDto]) useEffect(() => { if (gridRef?.current) { const instance = gridRef?.current?.instance() if (instance) { instance.option('dataSource', undefined) } } if (refListFormCode.current !== listFormCode) { // Reset state if needed } }, [listFormCode]) const { createSelectDataSource } = useListFormCustomDataSource({ gridRef }) const { getBandedColumns } = useListFormColumns({ gridDto, listFormCode, isSubForm, gridRef, }) 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 const cols = getBandedColumns() setColumnData(cols) const dataSource = createSelectDataSource( gridDto.gridOptions, listFormCode, searchParams, layout, undefined, ) setGanttDataSource(dataSource) }, [gridDto, searchParams, createSelectDataSource]) useEffect(() => { refListFormCode.current = listFormCode }, [listFormCode]) // WidgetGroup yüksekliğini hesapla useEffect(() => { const calculateWidgetHeight = () => { if (widgetGroupRef.current) { const height = widgetGroupRef.current.offsetHeight setWidgetGroupHeight(height) } } calculateWidgetHeight() const resizeObserver = new ResizeObserver(calculateWidgetHeight) if (widgetGroupRef.current) { resizeObserver.observe(widgetGroupRef.current) } return () => { resizeObserver.disconnect() } }, [gridDto?.widgets]) const settingButtonClick = useCallback(() => { window.open( ROUTES_ENUM.protected.saas.listFormManagement.edit.replace(':listFormCode', listFormCode), isPwaMode ? '_self' : '_blank', ) }, []) const getSettingButtonOptions = useCallback( () => ({ icon: 'preferences', stylingMode: 'icon', onClick: () => { settingButtonClick() }, }), [settingButtonClick], ) const getRefreshButtonOptions = useCallback( () => ({ icon: 'refresh', text: translate('::ListForms.ListForm.Refresh'), stylingMode: 'icon', onClick: () => { gridRef.current?.instance()?.refresh() }, }), [settingButtonClick], ) return ( <>
{!isSubForm && ( )} {!gridDto && (
Loading gantt configuration...
)} {gridDto && !ganttDataSource && (
Loading data source...
)} {gridDto && columnData && ganttDataSource && ( <>
0 ? gridDto.gridOptions.height : gridDto.gridOptions.fullHeight ? `calc(100vh - ${170 + widgetGroupHeight}px)` : undefined } > {/* */} {/* */} {/* */} {/* */} {/* */} {/* */} setScaleType(e.value), }} /> {columnData .filter((col) => col.type != 'buttons') .map((col: any) => ( ))}
)}
) } export default GanttView