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

180 lines
6.1 KiB
TypeScript
Raw Normal View History

2023-08-24 11:10:04 +03:00
import { useNavigate } from 'react-router-dom';
2023-07-25 20:27:29 +03:00
import Button from '../../components/Common/Button';
import Dropdown from '../../components/Common/Dropdown';
import DropdownButton from '../../components/Common/DropdownButton';
import DropdownCheckbox from '../../components/Common/DropdownCheckbox';
2023-10-16 02:17:31 +03:00
import {
2023-11-10 15:34:59 +03:00
CloneIcon, DownloadIcon, DumpBinIcon, EditIcon, MenuIcon, NotSubscribedIcon,
2023-10-23 18:22:55 +03:00
OwnerIcon, ShareIcon, SmallPlusIcon, SubscribedIcon, UploadIcon
} from '../../components/Icons';
import { useAuth } from '../../context/AuthContext';
import { useRSForm } from '../../context/RSFormContext';
import useDropdown from '../../hooks/useDropdown';
2023-07-20 17:11:03 +03:00
2023-07-28 18:23:37 +03:00
interface RSTabsMenuProps {
showUploadDialog: () => void
showCloneDialog: () => void
onDestroy: () => void
2023-08-25 22:51:20 +03:00
onClaim: () => void
onShare: () => void
onDownload: () => void
2023-08-26 17:26:49 +03:00
onToggleSubscribe: () => void
2023-07-28 18:23:37 +03:00
}
2023-08-25 22:51:20 +03:00
function RSTabsMenu({
showUploadDialog, showCloneDialog,
2023-11-10 15:34:59 +03:00
onDestroy, onShare, onDownload, onClaim, onToggleSubscribe
2023-08-25 22:51:20 +03:00
}: RSTabsMenuProps) {
2023-08-24 11:10:04 +03:00
const navigate = useNavigate();
2023-07-25 20:27:29 +03:00
const { user } = useAuth();
const {
2023-08-26 17:26:49 +03:00
isOwned, isEditable, isTracking, isReadonly, isClaimable, isForceAdmin,
toggleForceAdmin, toggleReadonly, processing
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-21 00:09:05 +03:00
2023-08-25 22:51:20 +03:00
function handleClaimOwner() {
editMenu.hide();
2023-08-25 22:51:20 +03:00
onClaim();
}
2023-07-21 00:09:05 +03:00
2023-08-25 22:51:20 +03:00
function handleDelete() {
schemaMenu.hide();
onDestroy();
2023-08-25 22:51:20 +03:00
}
2023-08-25 22:51:20 +03:00
function handleDownload () {
schemaMenu.hide();
2023-08-25 22:51:20 +03:00
onDownload();
}
2023-08-25 22:51:20 +03:00
function handleUpload() {
schemaMenu.hide();
2023-07-28 18:23:37 +03:00
showUploadDialog();
2023-08-25 22:51:20 +03:00
}
2023-08-25 22:51:20 +03:00
function handleClone() {
schemaMenu.hide();
2023-07-28 18:23:37 +03:00
showCloneDialog();
2023-08-25 22:51:20 +03:00
}
2023-08-24 11:10:04 +03:00
function handleShare() {
schemaMenu.hide();
2023-08-25 22:51:20 +03:00
onShare();
2023-08-24 11:10:04 +03:00
}
function handleCreateNew() {
navigate('/rsform-create');
}
2023-07-25 20:27:29 +03:00
2023-07-28 18:23:37 +03:00
return (
<div className='flex items-stretch h-full w-fit'>
<div ref={schemaMenu.ref}>
<Button noBorder dense tabIndex={-1}
tooltip='Действия'
icon={<MenuIcon color='text-controls' size={5}/>}
dimensions='h-full w-fit pl-2'
style={{outlineColor: 'transparent'}}
onClick={schemaMenu.toggle}
/>
{schemaMenu.isActive ?
<Dropdown>
<DropdownButton onClick={handleShare}>
<div className='inline-flex items-center justify-start gap-2'>
<ShareIcon color='text-primary' size={4}/>
<p>Поделиться</p>
</div>
</DropdownButton>
<DropdownButton onClick={handleClone} disabled={!user} >
<div className='inline-flex items-center justify-start gap-2'>
<CloneIcon color='text-primary' size={4}/>
<p>Клонировать</p>
</div>
</DropdownButton>
<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-warning' : ''} 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-warning' : ''} size={4} />
<p>Удалить схему</p>
</span>
</DropdownButton>
<DropdownButton onClick={handleCreateNew}>
<span className='inline-flex items-center justify-start gap-2'>
<SmallPlusIcon color='text-url' size={4} />
<p>Создать новую схему</p>
</span>
</DropdownButton>
</Dropdown> : null}
</div>
<div ref={editMenu.ref}>
<Button dense noBorder tabIndex={-1}
tooltip={'измнение: ' + (isEditable ? '[доступно]' : '[запрещено]')}
dimensions='h-full w-fit'
style={{outlineColor: 'transparent'}}
icon={<EditIcon size={5} color={isEditable ? 'text-success' : 'text-warning'}/>}
onClick={editMenu.toggle}
/>
{editMenu.isActive ?
<Dropdown>
<DropdownButton
disabled={!user || !isClaimable}
onClick={!isOwned ? handleClaimOwner : undefined}
2023-11-10 15:34:59 +03:00
tooltip={!user || !isClaimable ? 'Взять во владение можно общую изменяемую схему' : ''}
>
<div className='flex items-center gap-2 pl-1'>
<span>
<OwnerIcon size={5} color={isOwned ? 'text-success' : 'text-controls'} />
</span>
<p>
{isOwned ? <b>Владелец схемы</b> : null}
{!isOwned ? <b>Стать владельцем</b> : null}
</p>
</div>
</DropdownButton>
{(isOwned || user?.is_staff) ?
<DropdownCheckbox
value={isReadonly}
setValue={toggleReadonly}
label='Я — читатель!'
tooltip='Режим чтения'
/> : null}
{user?.is_staff ?
<DropdownCheckbox
value={isForceAdmin}
setValue={toggleForceAdmin}
label='Я — администратор!'
tooltip='Режим редактирования для администраторов'
/> : null}
</Dropdown>: null}
</div>
<div>
<Button dense noBorder tabIndex={-1}
tooltip={'отслеживание: ' + (isTracking ? '[включено]' : '[выключено]')}
disabled={processing}
icon={isTracking
? <SubscribedIcon color='text-primary' size={5}/>
: <NotSubscribedIcon color='text-controls' size={5}/>
}
dimensions='h-full w-fit pr-2'
style={{outlineColor: 'transparent'}}
onClick={onToggleSubscribe}
2023-07-20 17:11:03 +03:00
/>
</div>
</div>);
2023-07-20 17:11:03 +03:00
}
export default RSTabsMenu;