List teki Card üzerinde önemli düzenleme
This commit is contained in:
parent
4dc8ac1e47
commit
a913220999
5 changed files with 146 additions and 28 deletions
|
|
@ -13,13 +13,14 @@ import { RowMode, SimpleItemWithColData } from './types'
|
||||||
import { PlatformEditorTypes } from '@/proxy/form/models'
|
import { PlatformEditorTypes } from '@/proxy/form/models'
|
||||||
|
|
||||||
const FormDevExpress = (props: {
|
const FormDevExpress = (props: {
|
||||||
|
isSubForm?: boolean
|
||||||
mode: RowMode
|
mode: RowMode
|
||||||
refForm: RefObject<FormDx>
|
refForm: RefObject<FormDx>
|
||||||
formData: any
|
formData: any
|
||||||
formItems: GroupItem[]
|
formItems: GroupItem[]
|
||||||
setFormData: Dispatch<any>
|
setFormData: Dispatch<any>
|
||||||
}) => {
|
}) => {
|
||||||
const { mode, refForm, formData, formItems, setFormData } = props
|
const { isSubForm, mode, refForm, formData, formItems, setFormData } = props
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form className={`${DX_CLASSNAMES} p-2`}>
|
<form className={`${DX_CLASSNAMES} p-2`}>
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ const FormView = (
|
||||||
const params = useParams()
|
const params = useParams()
|
||||||
const listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
|
const listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
|
||||||
const id = props?.id ?? params?.id ?? ''
|
const id = props?.id ?? params?.id ?? ''
|
||||||
// const refListFormCode = useRef('') //Şimdilik kalsın
|
|
||||||
const { translate } = useLocalization()
|
const { translate } = useLocalization()
|
||||||
const {
|
const {
|
||||||
loading,
|
loading,
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ export type PermissionResults = {
|
||||||
u: boolean
|
u: boolean
|
||||||
d: boolean
|
d: boolean
|
||||||
e: boolean
|
e: boolean
|
||||||
|
i: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FormProps extends Meta {
|
export interface FormProps extends Meta {
|
||||||
|
|
|
||||||
|
|
@ -183,6 +183,7 @@ const useGridData = (props: {
|
||||||
gridDto?.gridOptions.editingOptionDto.allowDeleting === true &&
|
gridDto?.gridOptions.editingOptionDto.allowDeleting === true &&
|
||||||
checkPermission(gridDto?.gridOptions.permissionDto.d),
|
checkPermission(gridDto?.gridOptions.permissionDto.d),
|
||||||
e: checkPermission(gridDto?.gridOptions.permissionDto.e),
|
e: checkPermission(gridDto?.gridOptions.permissionDto.e),
|
||||||
|
i: checkPermission(gridDto?.gridOptions.permissionDto.i),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Set js and css
|
// Set js and css
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,21 @@
|
||||||
import { useCallback, useEffect, useState } from 'react'
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
||||||
import { GridDto } from '@/proxy/form/models'
|
import { GridDto } from '@/proxy/form/models'
|
||||||
|
import { captionize } from 'devextreme/core/utils/inflector'
|
||||||
import { useListFormCustomDataSource } from '@/shared/useListFormCustomDataSource'
|
import { useListFormCustomDataSource } from '@/shared/useListFormCustomDataSource'
|
||||||
import { Pagination, Select } from '@/components/ui'
|
import { Pagination, Select } from '@/components/ui'
|
||||||
import classNames from 'classnames'
|
import classNames from 'classnames'
|
||||||
import { getList } from '@/services/form.service'
|
import { getList } from '@/services/form.service'
|
||||||
import { FaInbox } from 'react-icons/fa'
|
import { FaInbox } from 'react-icons/fa'
|
||||||
import FormView from '../form/FormView'
|
import FormDevExpress from '../form/FormDevExpress'
|
||||||
|
import { GroupItem, SimpleItem } from 'devextreme/ui/form'
|
||||||
|
import { Form as FormDx } from 'devextreme-react/form'
|
||||||
|
import FormButtons from '../form/FormButtons'
|
||||||
|
import { useNavigate } from 'react-router-dom'
|
||||||
|
import { ROUTES_ENUM } from '@/routes/route.constant'
|
||||||
|
import CustomStore from 'devextreme/data/custom_store'
|
||||||
|
import { PermissionResults } from '../form/types'
|
||||||
|
import { usePermission } from '@/utils/hooks/usePermission'
|
||||||
|
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||||||
|
|
||||||
interface CardProps {
|
interface CardProps {
|
||||||
listFormCode: string
|
listFormCode: string
|
||||||
|
|
@ -18,21 +28,109 @@ type Option = {
|
||||||
}
|
}
|
||||||
|
|
||||||
const CardItem = ({
|
const CardItem = ({
|
||||||
|
isSubForm,
|
||||||
row,
|
row,
|
||||||
gridDto,
|
gridDto,
|
||||||
listFormCode,
|
listFormCode,
|
||||||
|
dataSource,
|
||||||
|
refreshData,
|
||||||
}: {
|
}: {
|
||||||
|
isSubForm?: boolean
|
||||||
row: any
|
row: any
|
||||||
gridDto: GridDto
|
gridDto: GridDto
|
||||||
listFormCode: string
|
listFormCode: string
|
||||||
|
dataSource: CustomStore
|
||||||
|
refreshData: () => void
|
||||||
}) => {
|
}) => {
|
||||||
|
const [formData, setFormData] = useState(row)
|
||||||
|
const refForm = useRef<FormDx>(null)
|
||||||
|
const navigate = useNavigate()
|
||||||
|
const { checkPermission } = usePermission()
|
||||||
|
const { translate } = useLocalization()
|
||||||
|
|
||||||
const keyField = gridDto.gridOptions.keyFieldName
|
const keyField = gridDto.gridOptions.keyFieldName
|
||||||
const rowId = row[keyField!]
|
const rowId = row[keyField!]
|
||||||
|
|
||||||
|
const formItems: GroupItem[] = useMemo(() => {
|
||||||
|
if (!gridDto) return []
|
||||||
|
|
||||||
|
const items: SimpleItem[] = gridDto.columnFormats
|
||||||
|
.filter((col) => col.visible && col.listOrderNo > 0)
|
||||||
|
.sort((a, b) => a.listOrderNo - b.listOrderNo)
|
||||||
|
.slice(0, 10)
|
||||||
|
.map((col) => ({
|
||||||
|
dataField: col.fieldName,
|
||||||
|
label: { text: captionize(col.captionName || col.fieldName!) },
|
||||||
|
}))
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
itemType: 'group',
|
||||||
|
colCount: 1,
|
||||||
|
items: items,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}, [gridDto])
|
||||||
|
|
||||||
|
const permissionResults: PermissionResults = {
|
||||||
|
c:
|
||||||
|
gridDto?.gridOptions.editingOptionDto.allowAdding === true &&
|
||||||
|
checkPermission(gridDto?.gridOptions.permissionDto.c),
|
||||||
|
r: checkPermission(gridDto?.gridOptions.permissionDto.r),
|
||||||
|
u:
|
||||||
|
gridDto?.gridOptions.editingOptionDto.allowUpdating === true &&
|
||||||
|
checkPermission(gridDto?.gridOptions.permissionDto.u),
|
||||||
|
d:
|
||||||
|
gridDto?.gridOptions.editingOptionDto.allowDeleting === true &&
|
||||||
|
checkPermission(gridDto?.gridOptions.permissionDto.d),
|
||||||
|
e: checkPermission(gridDto?.gridOptions.permissionDto.e),
|
||||||
|
i: checkPermission(gridDto?.gridOptions.permissionDto.i),
|
||||||
|
}
|
||||||
|
|
||||||
|
const onActionEdit = () => {
|
||||||
|
navigate(
|
||||||
|
ROUTES_ENUM.protected.admin.formEdit
|
||||||
|
.replace(':listFormCode', listFormCode)
|
||||||
|
.replace(':id', rowId!),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const onActionNew = () => {
|
||||||
|
navigate(ROUTES_ENUM.protected.admin.formNew.replace(':listFormCode', listFormCode))
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-white dark:bg-neutral-800 border dark:border-neutral-700 flex flex-col p-4">
|
<div className="bg-white dark:bg-neutral-800 border dark:border-neutral-700 flex flex-col groupp p-2">
|
||||||
|
<div className={`flex items-center mb-2 ${isSubForm ? 'justify-center' : 'justify-between'}`}>
|
||||||
|
{!isSubForm && <h3>{translate('::' + gridDto?.gridOptions.title)}</h3>}
|
||||||
|
{permissionResults && (
|
||||||
|
<FormButtons
|
||||||
|
isSubForm={true}
|
||||||
|
mode="view"
|
||||||
|
listFormCode={listFormCode}
|
||||||
|
id={rowId}
|
||||||
|
gridDto={gridDto}
|
||||||
|
commandColumnData={{ buttons: [] }}
|
||||||
|
dataSource={dataSource}
|
||||||
|
permissions={permissionResults}
|
||||||
|
handleSubmit={() => ({})}
|
||||||
|
refreshData={refreshData}
|
||||||
|
getSelectedRowKeys={() => [rowId]}
|
||||||
|
getSelectedRowsData={() => [row]}
|
||||||
|
getFilter={() => null}
|
||||||
|
onActionEdit={onActionEdit}
|
||||||
|
onActionNew={onActionNew}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div className="flex-grow">
|
<div className="flex-grow">
|
||||||
<FormView listFormCode={listFormCode} id={rowId} isSubForm={true} />
|
<FormDevExpress
|
||||||
|
mode="view"
|
||||||
|
refForm={refForm}
|
||||||
|
formData={formData}
|
||||||
|
formItems={formItems}
|
||||||
|
setFormData={setFormData}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
@ -46,6 +144,7 @@ const Card = ({ listFormCode, searchParams }: CardProps) => {
|
||||||
const [currentPage, setCurrentPage] = useState(1)
|
const [currentPage, setCurrentPage] = useState(1)
|
||||||
const [pageSize, setPageSize] = useState(20)
|
const [pageSize, setPageSize] = useState(20)
|
||||||
const [pageSizeOptions, setPageSizeOptions] = useState<Option[]>([])
|
const [pageSizeOptions, setPageSizeOptions] = useState<Option[]>([])
|
||||||
|
const [dataSource, setDataSource] = useState<CustomStore>()
|
||||||
|
|
||||||
const onPageSizeSelect = ({ value }: Option) => {
|
const onPageSizeSelect = ({ value }: Option) => {
|
||||||
setPageSize(value)
|
setPageSize(value)
|
||||||
|
|
@ -56,10 +155,19 @@ const Card = ({ listFormCode, searchParams }: CardProps) => {
|
||||||
setCurrentPage(page)
|
setCurrentPage(page)
|
||||||
}
|
}
|
||||||
|
|
||||||
const loadData = useCallback(() => {
|
useEffect(() => {
|
||||||
if (!gridDto) return
|
getList({ listFormCode }).then((res: any) => setGridDto(res.data))
|
||||||
|
}, [listFormCode])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (gridDto) {
|
||||||
const store = createSelectDataSource(gridDto.gridOptions, listFormCode, searchParams)
|
const store = createSelectDataSource(gridDto.gridOptions, listFormCode, searchParams)
|
||||||
|
setDataSource(store)
|
||||||
|
}
|
||||||
|
}, [gridDto, listFormCode, searchParams, createSelectDataSource])
|
||||||
|
|
||||||
|
const loadData = useCallback(() => {
|
||||||
|
if (!dataSource) return
|
||||||
|
|
||||||
const loadOptions = {
|
const loadOptions = {
|
||||||
skip: (currentPage - 1) * pageSize,
|
skip: (currentPage - 1) * pageSize,
|
||||||
|
|
@ -67,22 +175,23 @@ const Card = ({ listFormCode, searchParams }: CardProps) => {
|
||||||
requireTotalCount: true,
|
requireTotalCount: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
store.load(loadOptions).then((res: any) => {
|
dataSource.load(loadOptions).then((res: any) => {
|
||||||
setData(res.data)
|
setData(res.data)
|
||||||
setTotalCount(res.totalCount || 0)
|
setTotalCount(res.totalCount || 0)
|
||||||
})
|
})
|
||||||
}, [gridDto, listFormCode, searchParams, currentPage, pageSize])
|
}, [dataSource, currentPage, pageSize])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getList({ listFormCode }).then((res: any) => setGridDto(res.data))
|
if (dataSource) {
|
||||||
}, [listFormCode])
|
loadData()
|
||||||
|
}
|
||||||
|
}, [dataSource, loadData])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!gridDto) return
|
if (!gridDto) return
|
||||||
|
|
||||||
const pagerOptions = gridDto.gridOptions.pagerOptionDto
|
const pagerOptions = gridDto.gridOptions.pagerOptionDto
|
||||||
const allowedSizes =
|
const allowedSizes = pagerOptions?.allowedPageSizes
|
||||||
pagerOptions?.allowedPageSizes
|
|
||||||
?.split(',')
|
?.split(',')
|
||||||
.map((s) => Number(s.trim()))
|
.map((s) => Number(s.trim()))
|
||||||
.filter((n) => !isNaN(n) && n > 0) || [20, 50, 100]
|
.filter((n) => !isNaN(n) && n > 0) || [20, 50, 100]
|
||||||
|
|
@ -90,10 +199,6 @@ const Card = ({ listFormCode, searchParams }: CardProps) => {
|
||||||
setPageSizeOptions(allowedSizes.map((size) => ({ value: size, label: `${size} page` })))
|
setPageSizeOptions(allowedSizes.map((size) => ({ value: size, label: `${size} page` })))
|
||||||
}, [gridDto, listFormCode, searchParams])
|
}, [gridDto, listFormCode, searchParams])
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
loadData()
|
|
||||||
}, [loadData])
|
|
||||||
|
|
||||||
if (!gridDto) return null
|
if (!gridDto) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -112,11 +217,22 @@ const Card = ({ listFormCode, searchParams }: CardProps) => {
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-4 gap-4">
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-4 gap-4">
|
||||||
{data.map((row, idx) => {
|
{dataSource &&
|
||||||
|
data.map((row, idx) => {
|
||||||
const keyField = gridDto.gridOptions.keyFieldName
|
const keyField = gridDto.gridOptions.keyFieldName
|
||||||
const rowId = row[keyField!]
|
const rowId = row[keyField!]
|
||||||
|
|
||||||
return <CardItem key={rowId || idx} row={row} gridDto={gridDto} listFormCode={listFormCode} />
|
return (
|
||||||
|
<CardItem
|
||||||
|
isSubForm={true}
|
||||||
|
key={rowId || idx}
|
||||||
|
row={row}
|
||||||
|
gridDto={gridDto}
|
||||||
|
listFormCode={listFormCode}
|
||||||
|
dataSource={dataSource}
|
||||||
|
refreshData={loadData}
|
||||||
|
/>
|
||||||
|
)
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue