Добавлено отключение кнопок согласования/отклонения при отсутствии файла

This commit is contained in:
Александр Сироткин 2022-02-24 15:39:30 +05:00
parent bddd67fd00
commit 6eb6f0f4c2

View File

@ -1,22 +1,23 @@
import { memo, useCallback, useState } from 'react' import { memo, useCallback, useState } from 'react'
import { Button, Input, Popconfirm, Form } from 'antd' import { Button, Input, Popconfirm, Form } from 'antd'
import { import {
ClearOutlined, DeleteOutlined,
SettingOutlined, EditOutlined,
TableOutlined, TableOutlined,
} from '@ant-design/icons' } from '@ant-design/icons'
import { formatDate } from '@utils' import Poprompt from '@components/Poprompt'
import { DrillingProgramService } from '@api'
import { formatBytes, invokeWebApiWrapperAsync, notify } from '@components/factory'
import { UploadForm } from '@components/UploadForm'
import DownloadLink from '@components/DownloadLink'
import { UserView } from '@components/views' import { UserView } from '@components/views'
import UploadForm from '@components/UploadForm'
import DownloadLink from '@components/DownloadLink'
import { formatBytes, invokeWebApiWrapperAsync, notify } from '@components/factory'
import { DrillingProgramService } from '@api'
import { formatDate } from '@utils'
import MarksCard from './MarksCard' import MarksCard from './MarksCard'
import '@styles/drilling_program.less' import '@styles/drilling_program.less'
import Poprompt from '@asb/components/Poprompt' import LoaderPortal from '@asb/components/LoaderPortal'
const CommentPrompt = memo((props) => ( const CommentPrompt = memo((props) => (
<Poprompt <Poprompt
@ -37,13 +38,15 @@ export const CategoryRender = memo(({ idWell, partData, onUpdate, onEdit, onHist
const { const {
idFileCategory, idFileCategory,
name: title, // Название категории name: title, // Название категории
idState, // Состояние категории
approvers, // Полный список согласовантов approvers, // Полный список согласовантов
permissionToApprove, // Наличие прав на согласование/отклонение документа permissionToApprove, // Наличие прав на согласование/отклонение документа
permissionToUpload, // Наличие прав на загрузку нового файла permissionToUpload, // Наличие прав на загрузку нового файла
// permissionToEdit, // Наличие прав на редактирование/удаление категории
file // Информация о файле file // Информация о файле
} = partData ?? {} } = partData ?? {}
const permissionToEdit = true
const uploadUrl = `/api/well/${idWell}/drillingProgram/part/${idFileCategory}` const uploadUrl = `/api/well/${idWell}/drillingProgram/part/${idFileCategory}`
const [isUploading, setIsUploading] = useState(false) const [isUploading, setIsUploading] = useState(false)
@ -75,83 +78,79 @@ export const CategoryRender = memo(({ idWell, partData, onUpdate, onEdit, onHist
), [idWell, idFileCategory, onUpdate, title]) ), [idWell, idFileCategory, onUpdate, title])
return ( return (
<div className={'drilling_category'} {...other}> <LoaderPortal show={isUploading}>
<div className={'category_header'}> <div className={'drilling_category'} {...other}>
<h3>{title}</h3> <div className={'category_header'}>
<div> <h3>{title}</h3>
<Button icon={<SettingOutlined />} onClick={() => onEdit?.(idFileCategory)}>Редактировать</Button> {permissionToEdit && (
<Popconfirm <div>
onConfirm={onRemoveClick} <Button icon={<EditOutlined />} onClick={() => onEdit?.(idFileCategory)}>Редактировать</Button>
title={<>Вы уверены, что хотите удалить категорию<br/>"{title}"?</>} <Popconfirm
> onConfirm={onRemoveClick}
<Button loading={isDeleting} icon={<ClearOutlined />}>Удалить</Button> title={<>Вы уверены, что хотите удалить категорию<br/>"{title}"?</>}
</Popconfirm> >
<Button loading={isDeleting} icon={<DeleteOutlined />}>Удалить</Button>
</Popconfirm>
</div>
)}
</div> </div>
</div> <div className={'category_content'}>
<div className={'category_content'}> <div className={'file_column'}>
<div className={'file_column'}> <div className={'file_info'}>
<div className={'file_info'}> {file ? (
{file ? ( <>
<> <DownloadLink file={file} />
<DownloadLink file={file} /> <div className={'ml-15'}>Автор: <UserView user={file.author ?? '-'}/></div>
<div className={'ml-15'}>Автор: <UserView user={file.author ?? '-'}/></div> <div className={'ml-15'}>Размер: {file.size ? formatBytes(file.size) : '-'}</div>
<div className={'ml-15'}>Размер: {file.size ? formatBytes(file.size) : '-'}</div> <div className={'ml-15'}>Загружен: {formatDate(file.uploadDate) ?? '-'}</div>
<div className={'ml-15'}>Загружен: {formatDate(file.uploadDate) ?? '-'}</div> </>
</> ) : (
) : ( <div>Нет загруженных файлов</div>
<div>Нет загруженных файлов</div> )}
)} </div>
</div> <div className={'file_actions'}>
<div className={'file_actions'}> <UploadForm
<UploadForm url={uploadUrl}
url={uploadUrl} disabled={!permissionToUpload}
disabled={!permissionToUpload} style={{ margin: '5px 0 10px 0' }}
style={{ margin: '5px 0 10px 0' }} onUploadStart={() => setIsUploading(true)}
onUploadStart={() => setIsUploading(true)} onUploadComplete={() => onUpdate?.(idFileCategory)}
onUploadComplete={() => onUpdate?.(idFileCategory)} onUploadError={(e) => notify(e?.message ?? 'Ошибка загрузки файла', 'error')}
onUploadError={(e) => notify(e?.message ?? 'Ошибка загрузки файла', 'error')}
/>
<Button
disabled={!file}
title={'История'}
icon={<TableOutlined />}
onClick={() => onHistory?.(idFileCategory)}
>
История
</Button>
</div>
</div>
<div className={'approve_column'}>
<div className={'user_list'}>
{approvers.map((user, i) => (
<span key={i}>
<UserView user={user} />
</span>
))}
</div>
<div className={'approve_list'}>
{permissionToApprove && (
<CommentPrompt
text={'Согласовать'}
title={'Согласование документа'}
onDone={onApprove(true)}
/> />
)} <Button
<MarksCard title={'Согласовано'} className={'approve_panel'} marks={file?.fileMarks?.filter((mark) => mark.idMarkType === 1)} /> disabled={!file}
title={'История'}
icon={<TableOutlined />}
onClick={() => onHistory?.(idFileCategory)}
>
История
</Button>
</div>
</div> </div>
<div className={'reject_list'}> <div className={'approve_column'}>
{permissionToApprove && ( <div className={'user_list'}>
<CommentPrompt {approvers.map((user, i) => (
text={'Отклонить'} <span key={i}>
title={'Отклонение документа'} <UserView user={user} />
onDone={onApprove(false)} </span>
/> ))}
)} </div>
<MarksCard title={'Отклонено'} className={'reject_panel'} marks={file?.fileMarks?.filter((mark) => mark.idMarkType === 0)} /> <div className={'approve_list'}>
{permissionToApprove && file && (
<CommentPrompt text={'Согласовать'} title={'Согласование документа'} onDone={onApprove(true)} />
)}
<MarksCard title={'Согласовано'} className={'approve_panel'} marks={file?.fileMarks?.filter((mark) => mark.idMarkType === 1)} />
</div>
<div className={'reject_list'}>
{permissionToApprove && file && (
<CommentPrompt text={'Отклонить'} title={'Отклонение документа'} onDone={onApprove(false)} />
)}
<MarksCard title={'Отклонено'} className={'reject_panel'} marks={file?.fileMarks?.filter((mark) => mark.idMarkType === 0)} />
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </LoaderPortal>
) )
}) })