asb_cloud_front/src/pages/Documents/DocumentsTemplate.jsx

182 lines
5.5 KiB
React
Raw Normal View History

import moment from 'moment'
import { useState, useEffect } from 'react'
import { DatePicker, Button, Input } from 'antd'
import { FileService } from '@api'
import { hasPermission } from '@utils/permissions'
import LoaderPortal from '@components/LoaderPortal'
import { UploadForm } from '@components/UploadForm'
import { CompanyView, UserView } from '@components/views'
import { EditableTable, makePaginationObject } from '@components/Table'
import { invokeWebApiWrapperAsync, downloadFile, formatBytes } from '@components/factory'
2021-08-17 10:46:28 +05:00
const pageSize = 12
2021-08-17 16:46:46 +05:00
const { RangePicker } = DatePicker
const { Search } = Input
2021-08-17 10:46:28 +05:00
const columns = [
{
title: 'Документ',
key: 'document',
dataIndex: 'name',
render: (name, row) => (
<Button type={'link'} onClick={() => downloadFile(row)} download={name}>
{name}
</Button>
),
}, {
title: 'Дата загрузки',
key: 'uploadDate',
dataIndex: 'uploadDate',
render: item => moment.utc(item).local().format('DD MMM YYYY, HH:mm:ss'),
}, {
title: 'Размер',
key: 'size',
dataIndex: 'size',
render: item => formatBytes(item)
}, {
title: 'Автор',
key: 'author',
dataIndex: 'author',
render: item => <UserView user={item}/>
}, {
title: 'Компания',
key: 'company',
render: (_, record) => <CompanyView company={record?.author?.company}/>
}
]
export const DocumentsTemplate = ({ idCategory, idWell, accept, headerChild, customColumns, beforeTable, onChange}) => {
2021-08-17 10:46:28 +05:00
const [page, setPage] = useState(1)
2021-08-17 17:01:19 +05:00
const [filterDataRange, setFilterDataRange] = useState([])
const [filterCompanyName, setFilterCompanyName] = useState([])
2021-08-17 17:01:19 +05:00
const [filterFileName, setFilterFileName] = useState('')
2021-08-17 10:46:28 +05:00
const [pagination, setPagination] = useState(null)
const [files, setFiles] = useState([])
const [showLoader, setShowLoader] = useState(false)
const uploadUrl = `/api/well/${idWell}/files/?idCategory=${idCategory}`
2021-08-17 10:46:28 +05:00
const handleUploadComplete = () => update()
2021-08-17 16:46:46 +05:00
2021-08-20 15:28:13 +05:00
const handleFileDelete = async (file) => {
await FileService.delete(idWell, file.id)
2021-08-17 16:46:46 +05:00
update()
}
const hanleCompanySearch = (value, _) => setFilterCompanyName(value)
const hanleFileNameSearch = (value, _) => setFilterFileName(value)
2021-08-17 16:46:46 +05:00
const mergedColumns = [...columns, ...(customColumns ?? [])]
2021-08-17 10:46:28 +05:00
2021-08-17 16:46:46 +05:00
const update = () => {
2021-08-17 10:46:28 +05:00
let begin = null
let end = null
2021-08-17 17:01:19 +05:00
if (filterDataRange?.length > 1) {
begin = filterDataRange[0].toISOString()
end = filterDataRange[1].toISOString()
2021-08-17 10:46:28 +05:00
}
invokeWebApiWrapperAsync(
2021-08-17 16:46:46 +05:00
async () => {
2021-08-17 10:46:28 +05:00
const paginatedFiles = await FileService.getFilesInfo(
idWell,
2021-08-17 10:46:28 +05:00
idCategory,
filterCompanyName,
2021-08-31 12:30:44 +05:00
filterFileName,
2021-08-17 10:46:28 +05:00
begin,
2021-08-31 12:30:44 +05:00
end,
(page - 1) * pageSize,
pageSize,
2021-08-17 16:46:46 +05:00
)
if (!paginatedFiles) return
const filesInfos = paginatedFiles.items ?? []
setFiles(filesInfos)
2021-08-17 10:46:28 +05:00
const newPagination = makePaginationObject(paginatedFiles)
setPagination(newPagination)
},
setShowLoader,
`Не удалось загрузить файлы по скважине "${idWell}"`,
'Загрузка файла по скважине'
2021-08-17 16:46:46 +05:00
)
}
useEffect(update, [idWell, idCategory, page, filterDataRange, filterCompanyName, filterFileName])
useEffect(() => onChange?.(files), [files, onChange])
2021-08-17 17:01:19 +05:00
const companies = [...new Set(files.map(file => file.company))].filter(company => company)
const filenames = [...new Set(files.map(file => file.name))].filter(name => name)
2021-08-17 16:46:46 +05:00
return (
2021-08-17 10:46:28 +05:00
<LoaderPortal show={showLoader}>
<div style={{ margin: 16, display: 'flex' }}>
2021-08-17 16:46:46 +05:00
<div>
<span>Фильтр по дате</span>
<div>
2021-08-17 17:01:19 +05:00
<RangePicker showTime onChange={setFilterDataRange} />
2021-08-17 16:46:46 +05:00
</div>
</div>
2021-08-17 16:46:46 +05:00
&nbsp;
<div>
<span>Фильтр по компании</span>
<Search
list={'listCompanies'}
placeholder={'Фильтр по компании'}
onSearch={hanleCompanySearch}
/>
<datalist id={'listCompanies'}>
{companies.map((company) => (
<option key={company} value={company}>{company}</option>
))}
</datalist>
</div>
2021-08-17 17:01:19 +05:00
&nbsp;
<div>
<span>Фильтр по имени файла</span>
<Search
list={'listFileNames'}
placeholder={'Фильтр по имени файла'}
onSearch={hanleFileNameSearch}
/>
<datalist id={'listFileNames'}>
{filenames.map((name) => (
<option key={name} value={name}>{name}</option>
))}
</datalist>
2021-08-17 16:46:46 +05:00
</div>
&nbsp;&nbsp;
{hasPermission(`File.edit${idCategory}`) && (
<div>
<span>Загрузка</span>
<UploadForm
url={uploadUrl}
accept={accept}
onUploadStart={() => setShowLoader(true)}
onUploadComplete={handleUploadComplete}
/>
</div>
)}
&nbsp;&nbsp;
{headerChild}
2021-08-17 16:46:46 +05:00
</div>
{beforeTable}
2021-08-17 16:46:46 +05:00
<EditableTable
columns={mergedColumns}
2021-08-17 10:46:28 +05:00
dataSource={files}
size={'small'}
2021-08-17 10:46:28 +05:00
pagination={{
...pagination,
showSizeChanger: false,
2021-08-17 16:46:46 +05:00
onChange: (page) => setPage(page),
}}
onRowDelete={hasPermission(`File.edit${idCategory}`) && handleFileDelete}
2021-08-17 10:46:28 +05:00
rowKey={(record) => record.id}
/>
2021-08-17 16:46:46 +05:00
</LoaderPortal>
)
}
export default DocumentsTemplate