ConceptPortal-public/rsconcept/frontend/src/pages/RSFormPage/RSFormCard.tsx

144 lines
5.4 KiB
TypeScript
Raw Normal View History

2023-07-15 17:46:19 +03:00
import { useIntl } from 'react-intl';
import Checkbox from '../../components/Common/Checkbox';
import SubmitButton from '../../components/Common/SubmitButton';
import TextArea from '../../components/Common/TextArea';
import TextInput from '../../components/Common/TextInput';
import { useRSForm } from '../../context/RSFormContext';
2023-07-20 17:11:03 +03:00
import { useCallback, useEffect, useState } from 'react';
2023-07-15 17:46:19 +03:00
import Button from '../../components/Common/Button';
2023-07-16 22:53:22 +03:00
import { CrownIcon, DownloadIcon, DumpBinIcon, ShareIcon } from '../../components/Icons';
2023-07-15 17:46:19 +03:00
import { useUsers } from '../../context/UsersContext';
import { useNavigate } from 'react-router-dom';
import { toast } from 'react-toastify';
2023-07-18 14:55:40 +03:00
import fileDownload from 'js-file-download';
2023-07-16 22:25:23 +03:00
import { AxiosResponse } from 'axios';
2023-07-21 00:09:05 +03:00
import { useAuth } from '../../context/AuthContext';
import { claimOwnershipProc, deleteRSFormProc, shareCurrentURLProc } from '../../utils/procedures';
2023-07-15 17:46:19 +03:00
function RSFormCard() {
const navigate = useNavigate();
const intl = useIntl();
const { getUserLabel } = useUsers();
2023-07-16 22:25:23 +03:00
const { schema, update, download, reload, isEditable, isClaimable, processing, destroy, claim } = useRSForm();
2023-07-21 00:09:05 +03:00
const { user } = useAuth();
2023-07-15 17:46:19 +03:00
const [title, setTitle] = useState('');
const [alias, setAlias] = useState('');
const [comment, setComment] = useState('');
const [common, setCommon] = useState(false);
useEffect(() => {
setTitle(schema!.title)
setAlias(schema!.alias)
setComment(schema!.comment)
setCommon(schema!.is_common)
}, [schema]);
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
2023-07-16 22:25:23 +03:00
const data = {
'title': title,
'alias': alias,
'comment': comment,
'is_common': common,
};
update(data, () => {
toast.success('Изменения сохранены');
reload();
});
2023-07-15 17:46:19 +03:00
};
2023-07-21 00:09:05 +03:00
const handleDelete =
useCallback(() => deleteRSFormProc(destroy, navigate), [destroy, navigate]);
2023-07-15 17:46:19 +03:00
const handleDownload = useCallback(() => {
2023-07-16 22:25:23 +03:00
download((response: AxiosResponse) => {
try {
2023-07-18 14:55:40 +03:00
const fileName = (schema?.alias || 'Schema') + '.trs';
fileDownload(response.data, fileName);
2023-07-16 22:25:23 +03:00
} catch (error: any) {
toast.error(error.message);
}
});
2023-07-18 14:55:40 +03:00
}, [download, schema?.alias]);
2023-07-15 17:46:19 +03:00
return (
2023-07-18 14:55:40 +03:00
<form onSubmit={handleSubmit} className='flex-grow max-w-xl px-4 py-2 border min-w-fit'>
2023-07-15 17:46:19 +03:00
<TextInput id='title' label='Полное название' type='text'
required
value={title}
disabled={!isEditable}
onChange={event => setTitle(event.target.value)}
/>
<TextInput id='alias' label='Сокращение' type='text'
required
value={alias}
disabled={!isEditable}
widthClass='max-w-sm'
onChange={event => setAlias(event.target.value)}
/>
<TextArea id='comment' label='Комментарий'
value={comment}
disabled={!isEditable}
onChange={event => setComment(event.target.value)}
/>
<Checkbox id='common' label='Общедоступная схема'
value={common}
disabled={!isEditable}
onChange={event => setCommon(event.target.checked)}
2023-07-15 17:46:19 +03:00
/>
<div className='flex items-center justify-between gap-1 py-2 mt-2'>
2023-07-16 22:25:23 +03:00
<SubmitButton text='Сохранить изменения' loading={processing} disabled={!isEditable || processing} />
2023-07-15 17:46:19 +03:00
<div className='flex justify-end gap-1'>
2023-07-16 22:53:22 +03:00
<Button
tooltip='Поделиться схемой'
icon={<ShareIcon />}
2023-07-21 00:09:05 +03:00
colorClass='text-primary'
onClick={shareCurrentURLProc}
2023-07-16 22:53:22 +03:00
/>
2023-07-15 17:46:19 +03:00
<Button
2023-07-16 22:25:23 +03:00
disabled={processing}
2023-07-15 17:46:19 +03:00
tooltip='Скачать TRS файл'
icon={<DownloadIcon />}
2023-07-21 00:09:05 +03:00
colorClass='text-primary'
2023-07-15 17:46:19 +03:00
loading={processing}
onClick={handleDownload}
/>
<Button
tooltip={isClaimable ? 'Стать владельцем' : 'Вы уже являетесь владельцем' }
2023-07-21 00:09:05 +03:00
disabled={!isClaimable || processing || !user}
2023-07-15 17:46:19 +03:00
icon={<CrownIcon />}
2023-07-20 17:11:03 +03:00
colorClass='text-green'
2023-07-21 00:09:05 +03:00
onClick={() => claimOwnershipProc(claim, reload)}
2023-07-15 17:46:19 +03:00
/>
<Button
tooltip={ isEditable ? 'Удалить схему' : 'Вы не можете редактировать данную схему'}
2023-07-16 22:25:23 +03:00
disabled={!isEditable || processing}
2023-07-15 17:46:19 +03:00
icon={<DumpBinIcon />}
2023-07-20 17:11:03 +03:00
colorClass='text-red'
2023-07-15 17:46:19 +03:00
loading={processing}
onClick={handleDelete}
/>
</div>
</div>
<div className='flex justify-start mt-2'>
<label className='font-semibold'>Владелец:</label>
<span className='min-w-[200px] ml-2 overflow-ellipsis overflow-hidden whitespace-nowrap'>
{getUserLabel(schema?.owner)}
</span>
</div>
<div className='flex justify-start mt-2'>
<label className='font-semibold'>Дата обновления:</label>
<span className='ml-2'>{new Date(schema!.time_update).toLocaleString(intl.locale)}</span>
</div>
<div className='flex justify-start mt-2'>
<label className='font-semibold'>Дата создания:</label>
<span className='ml-8'>{new Date(schema!.time_create).toLocaleString(intl.locale)}</span>
2023-07-18 14:55:40 +03:00
</div>
2023-07-15 17:46:19 +03:00
</form>
);
}
export default RSFormCard;