erp-platform/ui/src/views/list/List.tsx

213 lines
6.3 KiB
TypeScript
Raw Normal View History

import { useParams, useSearchParams } from 'react-router-dom'
2025-09-22 14:08:42 +00:00
import { useEffect, useState } from 'react'
2025-09-20 21:39:53 +00:00
import Container from '@/components/shared/Container'
2025-05-06 06:45:49 +00:00
import Grid from './Grid'
import { FaChartArea, FaList, FaSitemap, FaTable, FaTh, FaUser } from 'react-icons/fa'
import { useStoreActions, useStoreState } from '@/store/store'
2025-09-20 21:39:53 +00:00
import classNames from 'classnames'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { GridDto } from '@/proxy/form/models'
import Card from './Card'
2025-09-28 18:09:07 +00:00
import { Badge, Button } from '@/components/ui'
2025-09-22 14:08:42 +00:00
import Pivot from './Pivot'
import Tree from './Tree'
2025-09-22 14:08:42 +00:00
import { getList } from '@/services/form.service'
2025-09-23 10:30:57 +00:00
import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon'
2025-09-27 11:51:05 +00:00
import { ListViewLayoutType } from '../admin/listForm/edit/types'
import Chart from './Chart'
2025-05-06 06:45:49 +00:00
2025-09-20 21:39:53 +00:00
const List = () => {
2025-05-06 06:45:49 +00:00
const params = useParams()
2025-09-20 21:39:53 +00:00
const { translate } = useLocalization()
2025-05-06 06:45:49 +00:00
const [searchParams] = useSearchParams()
2025-09-20 21:39:53 +00:00
const listFormCode = params?.listFormCode ?? ''
const mode = useStoreState((state) => state.theme.mode)
2025-09-27 11:51:05 +00:00
const [viewMode, setViewMode] = useState<ListViewLayoutType>()
2025-09-20 21:39:53 +00:00
const [gridDto, setGridDto] = useState<GridDto>()
2025-09-23 10:30:57 +00:00
const MenuIcon = useCurrentMenuIcon('w-5 h-5')
2025-05-06 06:45:49 +00:00
const { states } = useStoreState((state) => state.admin.lists)
const { setStates } = useStoreActions((a) => a.admin.lists)
// 🔹 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)
2025-09-22 14:08:42 +00:00
}
}
2025-09-22 14:08:42 +00:00
useEffect(() => {
refreshGridDto()
}, [listFormCode])
2025-09-22 14:08:42 +00:00
useEffect(() => {
const listFormStates = states.find((a) => a.listFormCode === listFormCode)
if (listFormStates) {
setViewMode(listFormStates.layout)
return
}
if (gridDto) {
setViewMode(gridDto?.gridOptions?.layoutDto.defaultLayout)
return
}
}, [gridDto])
2025-09-22 14:08:42 +00:00
if (!listFormCode) {
return null
}
2025-09-20 21:39:53 +00:00
if (!gridDto) {
2025-09-23 19:52:08 +00:00
return null
}
2025-09-20 21:39:53 +00:00
return (
2025-05-06 06:45:49 +00:00
<Container>
<div
className={classNames('flex items-center border-solid gap-1 pb-1', {
'border-gray-100': mode === 'light',
'border-neutral-700': mode === 'dark',
})}
>
<div className="flex items-center gap-2">
{MenuIcon}
<h4 className="text-slate-700 text-sm font-medium leading-none">
2025-09-23 19:52:08 +00:00
{translate('::' + gridDto?.gridOptions?.title) || ''}
</h4>
2025-09-28 18:09:07 +00:00
<Badge content={viewMode} />
</div>
2025-09-20 21:39:53 +00:00
{gridDto?.gridOptions?.description === gridDto?.gridOptions?.title ? (
<p className="mr-auto"></p>
) : (
<p className="text-slate-500 text-xs mr-auto ml-2 leading-none">
{translate('::' + gridDto?.gridOptions?.description)}
</p>
)}
2025-09-20 21:39:53 +00:00
<div className="flex gap-1">
{gridDto?.gridOptions?.layoutDto.tree &&
gridDto?.gridOptions?.treeOptionDto?.parentIdExpr && (
<Button
size="xs"
variant={viewMode === 'tree' ? 'solid' : 'default'}
onClick={() => {
setViewMode('tree')
setStates({ listFormCode, layout: 'tree' })
}}
title="TreeList Görünümü"
>
<FaSitemap className="w-4 h-4" />
</Button>
)}
{gridDto?.gridOptions?.layoutDto.grid && (
<Button
size="xs"
variant={viewMode === 'grid' ? 'solid' : 'default'}
onClick={() => {
setViewMode('grid')
setStates({ listFormCode, layout: 'grid' })
}}
title="Grid Görünümü"
>
<FaList className="w-4 h-4" />
</Button>
)}
2025-09-22 14:08:42 +00:00
{gridDto?.gridOptions?.layoutDto.card && (
<Button
size="xs"
variant={viewMode === 'card' ? 'solid' : 'default'}
onClick={() => {
setViewMode('card')
setStates({ listFormCode, layout: 'card' })
}}
title="Kart Görünümü"
>
<FaTh className="w-4 h-4" />
</Button>
)}
2025-09-28 18:09:07 +00:00
{gridDto?.gridOptions?.layoutDto.pivot && (
<Button
size="xs"
variant={viewMode === 'pivot' ? 'solid' : 'default'}
onClick={() => {
setViewMode('pivot')
setStates({ listFormCode, layout: 'pivot' })
}}
title="Pivot Görünümü"
>
<FaTable className="w-4 h-4" />
</Button>
2025-09-22 14:08:42 +00:00
)}
2025-09-27 11:51:05 +00:00
{gridDto?.gridOptions?.layoutDto.chart && (
<Button
size="xs"
variant={viewMode === 'chart' ? 'solid' : 'default'}
onClick={() => {
setViewMode('chart')
setStates({ listFormCode, layout: 'chart' })
}}
title="Grafik Görünümü"
2025-09-27 11:51:05 +00:00
>
<FaChartArea className="w-4 h-4" />
</Button>
)}
</div>
</div>
{viewMode === 'pivot' ? (
<Pivot
listFormCode={listFormCode}
searchParams={searchParams}
isSubForm={false}
gridDto={gridDto}
refreshGridDto={refreshGridDto}
/>
) : viewMode === 'tree' ? (
<Tree
listFormCode={listFormCode}
searchParams={searchParams}
isSubForm={false}
gridDto={gridDto}
/>
) : viewMode === 'card' ? (
<Card
listFormCode={listFormCode}
searchParams={searchParams}
isSubForm={false}
gridDto={gridDto}
/>
) : viewMode === 'grid' ? (
<Grid
listFormCode={listFormCode}
searchParams={searchParams}
isSubForm={false}
gridDto={gridDto}
/>
2025-09-27 11:51:05 +00:00
) : viewMode === 'chart' ? (
<Chart
2025-09-30 13:11:23 +00:00
id={gridDto?.gridOptions.id!}
2025-09-27 11:51:05 +00:00
listFormCode={listFormCode}
filter={searchParams.toString()}
isSubForm={true}
gridDto={gridDto}
refreshGridDto={refreshGridDto}
2025-09-27 11:51:05 +00:00
/>
) : null}
2025-05-06 06:45:49 +00:00
</Container>
)
}
export default List