import React, { Suspense, startTransition, useCallback, useEffect, useMemo, useState } from 'react' import { useParams, useSearchParams } from 'react-router-dom' import classNames from 'classnames' import Container from '@/components/shared/Container' import { Badge, Button } from '@/components/ui' import { useLocalization } from '@/utils/hooks/useLocalization' import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon' import { useStoreActions, useStoreState } from '@/store/store' import { GridDto } from '@/proxy/form/models' import { getList } from '@/services/form.service' import { ListViewLayoutType } from '../admin/listForm/edit/types' import { FaChartArea, FaList, FaSitemap, FaTable, FaCalendarAlt, FaProjectDiagram, } from 'react-icons/fa' /* ======================= 🔥 LAZY VIEW IMPORTS ======================= */ const Grid = React.lazy(() => import('./Grid')) const Pivot = React.lazy(() => import('./Pivot')) const Tree = React.lazy(() => import('./Tree')) const Chart = React.lazy(() => import('./Chart')) const GanttView = React.lazy(() => import('./GanttView')) const SchedulerView = React.lazy(() => import('./SchedulerView')) const List: React.FC = () => { const { listFormCode = '' } = useParams() const [searchParams] = useSearchParams() const { translate } = useLocalization() const mode = useStoreState((state) => state.theme.mode) const MenuIcon = useCurrentMenuIcon('w-5 h-5') const { states } = useStoreState((state) => state.admin.lists) const { setStates } = useStoreActions((a) => a.admin.lists) const [gridDto, setGridDto] = useState(null) const [viewMode, setViewMode] = useState() /* ======================= 🔹 GRID DTO FETCH ======================= */ const refreshGridDto = useCallback(async () => { if (!listFormCode) return try { const response = await getList({ listFormCode }) setGridDto(response.data) } catch (err) { console.error('GridDto load error:', err) } }, [listFormCode]) useEffect(() => { refreshGridDto() }, [refreshGridDto]) /* ======================= 🔹 INITIAL VIEW MODE ======================= */ useEffect(() => { if (!gridDto) return const savedLayout = states.find((s) => s.listFormCode === listFormCode)?.layout const defaultLayout = gridDto.gridOptions?.layoutDto?.defaultLayout setViewMode(savedLayout ?? defaultLayout) }, [gridDto, states, listFormCode]) /* ======================= 🔹 VIEW SWITCH HANDLER ======================= */ const setLayout = useCallback( (layout: ListViewLayoutType) => { startTransition(() => { setViewMode(layout) }) setStates({ listFormCode, layout }) }, [listFormCode, setStates], ) /* ======================= 🔹 PRELOAD MAP (HOVER) ======================= */ const preload = useMemo( () => ({ grid: () => import('./Grid'), pivot: () => import('./Pivot'), tree: () => import('./Tree'), chart: () => import('./Chart'), gantt: () => import('./GanttView'), scheduler: () => import('./SchedulerView'), }), [], ) if (!listFormCode || !gridDto || !viewMode) { return null } return ( {/* ======================= HEADER ======================= */}
{MenuIcon}

{translate('::' + gridDto.gridOptions.title)}

{/* ======================= VIEW BUTTONS ======================= */}
{gridDto?.gridOptions?.layoutDto.scheduler && gridDto?.gridOptions?.schedulerOptionDto?.textExpr && gridDto?.gridOptions?.schedulerOptionDto?.startDateExpr && ( )} {gridDto?.gridOptions?.layoutDto.gantt && gridDto?.gridOptions?.ganttOptionDto?.parentIdExpr && gridDto?.gridOptions?.ganttOptionDto?.titleExpr && ( )} {gridDto?.gridOptions?.layoutDto.tree && gridDto?.gridOptions?.treeOptionDto?.parentIdExpr && ( )} {gridDto.gridOptions.layoutDto.pivot && ( )} {gridDto.gridOptions.layoutDto.chart && ( )}
{/* ======================= VIEW RENDER ======================= */} Yükleniyor...}> {viewMode === 'grid' && ( )} {viewMode === 'pivot' && ( )} {viewMode === 'tree' && ( )} {viewMode === 'scheduler' && ( )} {viewMode === 'gantt' && ( )} {viewMode === 'chart' && ( )}
) } export default List