2025-11-28 13:31:53 +00:00
|
|
|
|
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'
|
2025-11-07 23:00:51 +00:00
|
|
|
|
import { FaChartArea, FaList, FaSitemap, FaTable, FaTh, FaUser } from 'react-icons/fa'
|
2025-09-23 12:48:54 +00:00
|
|
|
|
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'
|
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'
|
2025-11-07 23:00:51 +00:00
|
|
|
|
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-11-30 16:01:35 +00:00
|
|
|
|
import Card from './Card'
|
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-23 12:48:54 +00:00
|
|
|
|
|
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
|
|
|
|
|
2025-10-02 10:08:48 +00:00
|
|
|
|
const { states } = useStoreState((state) => state.admin.lists)
|
|
|
|
|
|
const { setStates } = useStoreActions((a) => a.admin.lists)
|
2025-09-23 12:48:54 +00:00
|
|
|
|
|
2025-09-27 20:25:21 +00:00
|
|
|
|
// 🔹 Tekrar çağırılabilir metod
|
|
|
|
|
|
const refreshGridDto = async () => {
|
|
|
|
|
|
if (!listFormCode) return
|
|
|
|
|
|
try {
|
2025-09-23 14:05:42 +00:00
|
|
|
|
const response = await getList({ listFormCode })
|
|
|
|
|
|
setGridDto(response.data)
|
2025-09-27 20:25:21 +00:00
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('GridDto refresh error:', error)
|
2025-09-22 14:08:42 +00:00
|
|
|
|
}
|
2025-09-27 20:25:21 +00:00
|
|
|
|
}
|
2025-09-22 14:08:42 +00:00
|
|
|
|
|
2025-09-27 20:25:21 +00:00
|
|
|
|
useEffect(() => {
|
2025-11-07 23:00:51 +00:00
|
|
|
|
refreshGridDto()
|
2025-09-23 14:05:42 +00:00
|
|
|
|
}, [listFormCode])
|
2025-09-22 14:08:42 +00:00
|
|
|
|
|
2025-11-07 23:00:51 +00:00
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
const listFormStates = states.find((a) => a.listFormCode === listFormCode)
|
|
|
|
|
|
|
|
|
|
|
|
if (listFormStates) {
|
|
|
|
|
|
setViewMode(listFormStates.layout)
|
2025-11-08 13:50:20 +00:00
|
|
|
|
return
|
2025-11-07 23:00:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (gridDto) {
|
|
|
|
|
|
setViewMode(gridDto?.gridOptions?.layoutDto.defaultLayout)
|
2025-11-08 13:50:20 +00:00
|
|
|
|
return
|
2025-11-07 23:00:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
}, [gridDto])
|
|
|
|
|
|
|
2025-09-22 14:08:42 +00:00
|
|
|
|
if (!listFormCode) {
|
|
|
|
|
|
return null
|
|
|
|
|
|
}
|
2025-09-20 21:39:53 +00:00
|
|
|
|
|
2025-09-27 20:25:21 +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>
|
2025-09-23 14:05:42 +00:00
|
|
|
|
<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) || ''}
|
2025-09-23 14:05:42 +00:00
|
|
|
|
</h4>
|
2025-09-28 18:09:07 +00:00
|
|
|
|
●
|
|
|
|
|
|
<Badge content={viewMode} />
|
2025-09-23 14:05:42 +00:00
|
|
|
|
</div>
|
2025-09-20 21:39:53 +00:00
|
|
|
|
|
2025-09-23 14:05:42 +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
|
|
|
|
|
2025-09-23 14:05:42 +00:00
|
|
|
|
<div className="flex gap-1">
|
2025-11-07 23:00:51 +00:00
|
|
|
|
{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>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
2025-09-23 14:05:42 +00:00
|
|
|
|
{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
|
|
|
|
|
2025-09-23 14:05: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
|
|
|
|
|
2025-09-23 14:05:42 +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' })
|
|
|
|
|
|
}}
|
2025-09-28 20:22:18 +00:00
|
|
|
|
title="Grafik Görünümü"
|
2025-09-27 11:51:05 +00:00
|
|
|
|
>
|
|
|
|
|
|
<FaChartArea className="w-4 h-4" />
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
)}
|
2025-09-23 14:05:42 +00:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{viewMode === 'pivot' ? (
|
|
|
|
|
|
<Pivot
|
|
|
|
|
|
listFormCode={listFormCode}
|
|
|
|
|
|
searchParams={searchParams}
|
|
|
|
|
|
isSubForm={false}
|
|
|
|
|
|
gridDto={gridDto}
|
2025-09-27 20:25:21 +00:00
|
|
|
|
refreshGridDto={refreshGridDto}
|
2025-09-23 14:05:42 +00:00
|
|
|
|
/>
|
2025-11-07 23:00:51 +00:00
|
|
|
|
) : viewMode === 'tree' ? (
|
|
|
|
|
|
<Tree
|
|
|
|
|
|
listFormCode={listFormCode}
|
|
|
|
|
|
searchParams={searchParams}
|
|
|
|
|
|
isSubForm={false}
|
|
|
|
|
|
gridDto={gridDto}
|
|
|
|
|
|
/>
|
2025-09-23 14:05:42 +00:00
|
|
|
|
) : 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}
|
2025-09-28 20:22:18 +00:00
|
|
|
|
refreshGridDto={refreshGridDto}
|
2025-09-27 11:51:05 +00:00
|
|
|
|
/>
|
2025-09-23 14:05:42 +00:00
|
|
|
|
) : null}
|
2025-05-06 06:45:49 +00:00
|
|
|
|
</Container>
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default List
|