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

156 lines
5.7 KiB
TypeScript
Raw Normal View History

2023-07-27 22:04:25 +03:00
import { useCallback, useState } from 'react';
2023-07-25 20:27:29 +03:00
import { useNavigate } from 'react-router-dom';
import { toast } from 'react-toastify';
2023-07-20 17:11:03 +03:00
import Button from '../../components/Common/Button';
2023-07-25 20:27:29 +03:00
import Checkbox from '../../components/Common/Checkbox';
2023-07-20 17:11:03 +03:00
import Dropdown from '../../components/Common/Dropdown';
2023-07-25 20:27:29 +03:00
import DropdownButton from '../../components/Common/DropdownButton';
import { CloneIcon, CrownIcon, DownloadIcon, DumpBinIcon, EyeIcon, EyeOffIcon, MenuIcon, PenIcon, ShareIcon, UploadIcon } from '../../components/Icons';
2023-07-25 20:27:29 +03:00
import { useAuth } from '../../context/AuthContext';
2023-07-20 17:11:03 +03:00
import { useRSForm } from '../../context/RSFormContext';
import useDropdown from '../../hooks/useDropdown';
import { claimOwnershipProc, deleteRSFormProc, downloadRSFormProc, shareCurrentURLProc } from '../../utils/procedures';
2023-07-28 00:03:37 +03:00
import DlgUploadRSForm from './DlgUploadRSForm';
2023-07-20 17:11:03 +03:00
2023-07-27 22:04:25 +03:00
function RSTabsMenu() {
2023-07-21 00:09:05 +03:00
const navigate = useNavigate();
2023-07-25 20:27:29 +03:00
const { user } = useAuth();
const {
schema,
isOwned, isEditable, isTracking, isReadonly: readonly, isForceAdmin: forceAdmin,
2023-07-21 00:09:05 +03:00
toggleTracking, toggleForceAdmin, toggleReadonly,
claim, destroy, download
2023-07-21 00:09:05 +03:00
} = useRSForm();
2023-07-20 17:11:03 +03:00
const schemaMenu = useDropdown();
const editMenu = useDropdown();
2023-07-27 22:04:25 +03:00
const [showUploadModal, setShowUploadModal] = useState(false);
2023-07-21 00:09:05 +03:00
const handleClaimOwner = useCallback(() => {
editMenu.hide();
2023-07-25 20:27:29 +03:00
claimOwnershipProc(claim)
}, [claim, editMenu]);
2023-07-21 00:09:05 +03:00
const handleDelete = useCallback(() => {
schemaMenu.hide();
deleteRSFormProc(destroy, navigate);
}, [destroy, navigate, schemaMenu]);
const handleDownload = useCallback(() => {
schemaMenu.hide();
2023-07-25 20:27:29 +03:00
const fileName = (schema?.alias ?? 'Schema') + '.trs';
downloadRSFormProc(download, fileName);
}, [schemaMenu, download, schema?.alias]);
const handleUpload = useCallback(() => {
schemaMenu.hide();
2023-07-27 22:04:25 +03:00
setShowUploadModal(true);
}, [schemaMenu]);
const handleClone = useCallback(() => {
// TODO: implement
schemaMenu.hide();
toast.info('Клонирование РС-формы');
}, [schemaMenu]);
const handleShare = useCallback(() => {
schemaMenu.hide();
shareCurrentURLProc();
}, [schemaMenu]);
2023-07-25 20:27:29 +03:00
2023-07-20 17:11:03 +03:00
return (
2023-07-27 22:04:25 +03:00
<>
2023-07-28 00:03:37 +03:00
<DlgUploadRSForm
2023-07-27 22:04:25 +03:00
show={showUploadModal}
hideWindow={() => { setShowUploadModal(false); }}
/>
2023-07-20 17:11:03 +03:00
<div className='flex items-center w-fit'>
<div ref={schemaMenu.ref}>
<Button
tooltip='Действия'
icon={<MenuIcon size={5}/>}
borderClass=''
dense
2023-07-25 20:27:29 +03:00
onClick={schemaMenu.toggle}
2023-07-20 17:11:03 +03:00
/>
{ schemaMenu.isActive &&
<Dropdown>
2023-07-25 20:27:29 +03:00
<DropdownButton onClick={handleShare}>
<div className='inline-flex items-center justify-start gap-2'>
<ShareIcon color='text-primary' size={4}/>
<p>Поделиться</p>
</div>
</DropdownButton>
2023-07-25 20:27:29 +03:00
<DropdownButton onClick={handleClone}>
<div className='inline-flex items-center justify-start gap-2'>
<CloneIcon color='text-primary' size={4}/>
<p>Клонировать</p>
</div>
</DropdownButton>
2023-07-25 20:27:29 +03:00
<DropdownButton onClick={handleDownload}>
<div className='inline-flex items-center justify-start gap-2'>
<DownloadIcon color='text-primary' size={4}/>
<p>Выгрузить файл Экстеор</p>
</div>
</DropdownButton>
<DropdownButton disabled={!isEditable} onClick={handleUpload}>
<div className='inline-flex items-center justify-start gap-2'>
<UploadIcon color={isEditable ? 'text-red' : ''} size={4}/>
<p>Загрузить из Экстеора</p>
</div>
</DropdownButton>
<DropdownButton disabled={!isEditable} onClick={handleDelete}>
<span className='inline-flex items-center justify-start gap-2'>
<DumpBinIcon color={isEditable ? 'text-red' : ''} size={4} />
2023-07-21 00:09:05 +03:00
<p>Удалить схему</p>
</span>
2023-07-21 00:09:05 +03:00
</DropdownButton>
2023-07-20 17:11:03 +03:00
</Dropdown>}
</div>
<div ref={editMenu.ref}>
<Button
2023-07-25 20:27:29 +03:00
tooltip={'измнение: ' + (isEditable ? '[доступно]' : '[запрещено]')}
2023-07-20 17:11:03 +03:00
borderClass=''
2023-07-25 20:27:29 +03:00
icon={<PenIcon size={5} color={isEditable ? 'text-green' : 'text-red'}/>}
2023-07-20 17:11:03 +03:00
dense
2023-07-25 20:27:29 +03:00
onClick={editMenu.toggle}
2023-07-20 17:11:03 +03:00
/>
{ editMenu.isActive &&
<Dropdown>
2023-07-21 00:09:05 +03:00
<DropdownButton disabled={!user} onClick={!isOwned ? handleClaimOwner : undefined}>
<div className='inline-flex items-center gap-1 justify-normal'>
<span className={isOwned ? 'text-green' : ''}><CrownIcon size={4} /></span>
<p>
{ isOwned && <b>Владелец схемы</b> }
{ !isOwned && <b>Стать владельцем</b> }
</p>
</div>
</DropdownButton>
<DropdownButton onClick={toggleReadonly}>
<Checkbox value={readonly} label='только чтение'/>
</DropdownButton>
{user?.is_staff &&
<DropdownButton onClick={toggleForceAdmin}>
<Checkbox value={forceAdmin} label='режим администратора'/>
</DropdownButton>}
2023-07-20 17:11:03 +03:00
</Dropdown>}
</div>
<div>
<Button
2023-07-25 20:27:29 +03:00
tooltip={'отслеживание: ' + (isTracking ? '[включено]' : '[выключено]')}
icon={isTracking
? <EyeIcon color='text-primary' size={5}/>
: <EyeOffIcon size={5}/>
}
2023-07-20 17:11:03 +03:00
borderClass=''
dense
2023-07-25 20:27:29 +03:00
onClick={toggleTracking}
2023-07-20 17:11:03 +03:00
/>
</div>
</div>
2023-07-27 22:04:25 +03:00
</>
2023-07-20 17:11:03 +03:00
);
}
2023-07-27 22:04:25 +03:00
export default RSTabsMenu