2023-08-24 11:10:04 +03:00
|
|
|
|
import { useNavigate } from 'react-router-dom';
|
2023-07-25 20:27:29 +03:00
|
|
|
|
|
2023-10-16 01:22:08 +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';
|
|
|
|
|
import { CloneIcon, CrownIcon, DownloadIcon, DumpBinIcon, EyeIcon, EyeOffIcon, MenuIcon, PenIcon, PlusIcon, ShareIcon, 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
|
2023-08-11 19:28:12 +03:00
|
|
|
|
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-08-26 17:26:49 +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() {
|
2023-07-21 18:44:14 +03:00
|
|
|
|
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() {
|
2023-07-21 18:44:14 +03:00
|
|
|
|
schemaMenu.hide();
|
2023-08-11 19:28:12 +03:00
|
|
|
|
onDestroy();
|
2023-08-25 22:51:20 +03:00
|
|
|
|
}
|
2023-07-21 18:44:14 +03:00
|
|
|
|
|
2023-08-25 22:51:20 +03:00
|
|
|
|
function handleDownload () {
|
2023-07-21 18:44:14 +03:00
|
|
|
|
schemaMenu.hide();
|
2023-08-25 22:51:20 +03:00
|
|
|
|
onDownload();
|
|
|
|
|
}
|
2023-07-21 18:44:14 +03:00
|
|
|
|
|
2023-08-25 22:51:20 +03:00
|
|
|
|
function handleUpload() {
|
2023-07-21 18:44:14 +03:00
|
|
|
|
schemaMenu.hide();
|
2023-07-28 18:23:37 +03:00
|
|
|
|
showUploadDialog();
|
2023-08-25 22:51:20 +03:00
|
|
|
|
}
|
2023-07-21 18:44:14 +03:00
|
|
|
|
|
2023-08-25 22:51:20 +03:00
|
|
|
|
function handleClone() {
|
2023-07-21 18:44:14 +03:00
|
|
|
|
schemaMenu.hide();
|
2023-07-28 18:23:37 +03:00
|
|
|
|
showCloneDialog();
|
2023-08-25 22:51:20 +03:00
|
|
|
|
}
|
2023-07-21 18:44:14 +03:00
|
|
|
|
|
2023-08-24 11:10:04 +03:00
|
|
|
|
function handleShare() {
|
2023-07-21 18:44:14 +03:00
|
|
|
|
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 (
|
2023-09-03 18:26:50 +03:00
|
|
|
|
<div className='flex items-stretch h-full w-fit'>
|
2023-07-20 17:11:03 +03:00
|
|
|
|
<div ref={schemaMenu.ref}>
|
|
|
|
|
<Button
|
|
|
|
|
tooltip='Действия'
|
2023-09-09 20:36:55 +03:00
|
|
|
|
icon={<MenuIcon color='text-controls' size={5}/>}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
borderClass=''
|
2023-09-15 23:29:52 +03:00
|
|
|
|
dimensions='h-full w-fit'
|
2023-09-09 20:36:55 +03:00
|
|
|
|
style={{outlineColor: 'transparent'}}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
dense
|
2023-07-25 20:27:29 +03:00
|
|
|
|
onClick={schemaMenu.toggle}
|
2023-09-04 19:12:27 +03:00
|
|
|
|
tabIndex={-1}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
/>
|
|
|
|
|
{ schemaMenu.isActive &&
|
|
|
|
|
<Dropdown>
|
2023-07-25 20:27:29 +03:00
|
|
|
|
<DropdownButton onClick={handleShare}>
|
2023-07-24 22:34:03 +03:00
|
|
|
|
<div className='inline-flex items-center justify-start gap-2'>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
<ShareIcon color='text-primary' size={4}/>
|
|
|
|
|
<p>Поделиться</p>
|
|
|
|
|
</div>
|
|
|
|
|
</DropdownButton>
|
2023-07-28 00:10:26 +03:00
|
|
|
|
<DropdownButton onClick={handleClone} disabled={!user} >
|
2023-07-24 22:34:03 +03:00
|
|
|
|
<div className='inline-flex items-center justify-start gap-2'>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
<CloneIcon color='text-primary' size={4}/>
|
|
|
|
|
<p>Клонировать</p>
|
|
|
|
|
</div>
|
|
|
|
|
</DropdownButton>
|
2023-07-25 20:27:29 +03:00
|
|
|
|
<DropdownButton onClick={handleDownload}>
|
2023-07-24 22:34:03 +03:00
|
|
|
|
<div className='inline-flex items-center justify-start gap-2'>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
<DownloadIcon color='text-primary' size={4}/>
|
2023-07-31 22:38:58 +03:00
|
|
|
|
<p>Выгрузить в Экстеор</p>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
</div>
|
|
|
|
|
</DropdownButton>
|
|
|
|
|
<DropdownButton disabled={!isEditable} onClick={handleUpload}>
|
2023-07-24 22:34:03 +03:00
|
|
|
|
<div className='inline-flex items-center justify-start gap-2'>
|
2023-09-03 18:26:50 +03:00
|
|
|
|
<UploadIcon color={isEditable ? 'text-warning' : ''} size={4}/>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
<p>Загрузить из Экстеора</p>
|
|
|
|
|
</div>
|
|
|
|
|
</DropdownButton>
|
2023-07-21 01:50:57 +03:00
|
|
|
|
<DropdownButton disabled={!isEditable} onClick={handleDelete}>
|
2023-07-24 22:34:03 +03:00
|
|
|
|
<span className='inline-flex items-center justify-start gap-2'>
|
2023-09-03 18:26:50 +03:00
|
|
|
|
<DumpBinIcon color={isEditable ? 'text-warning' : ''} size={4} />
|
2023-07-21 00:09:05 +03:00
|
|
|
|
<p>Удалить схему</p>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
</span>
|
2023-07-21 00:09:05 +03:00
|
|
|
|
</DropdownButton>
|
2023-08-24 11:10:04 +03:00
|
|
|
|
<DropdownButton onClick={handleCreateNew}>
|
|
|
|
|
<span className='inline-flex items-center justify-start gap-2'>
|
|
|
|
|
<PlusIcon color='text-url' size={4} />
|
|
|
|
|
<p>Создать новую схему</p>
|
|
|
|
|
</span>
|
|
|
|
|
</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-09-15 23:29:52 +03:00
|
|
|
|
dimensions='h-full w-fit'
|
2023-09-09 20:36:55 +03:00
|
|
|
|
style={{outlineColor: 'transparent'}}
|
2023-09-03 18:26:50 +03:00
|
|
|
|
icon={<PenIcon size={5} color={isEditable ? 'text-success' : 'text-warning'}/>}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
dense
|
2023-07-25 20:27:29 +03:00
|
|
|
|
onClick={editMenu.toggle}
|
2023-09-04 19:12:27 +03:00
|
|
|
|
tabIndex={-1}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
/>
|
|
|
|
|
{ editMenu.isActive &&
|
|
|
|
|
<Dropdown>
|
2023-08-26 17:26:49 +03:00
|
|
|
|
<DropdownButton
|
|
|
|
|
disabled={!user || !isClaimable}
|
|
|
|
|
onClick={!isOwned ? handleClaimOwner : undefined}
|
2023-09-02 01:11:27 +03:00
|
|
|
|
tooltip={!user || !isClaimable ? 'Стать владельцем можно только для общей изменяемой схемы' : ''}
|
2023-08-26 17:26:49 +03:00
|
|
|
|
>
|
2023-07-21 00:09:05 +03:00
|
|
|
|
<div className='inline-flex items-center gap-1 justify-normal'>
|
2023-09-09 20:36:55 +03:00
|
|
|
|
<span><CrownIcon size={4} color={isOwned ? 'text-success' : 'text-controls'} /></span>
|
2023-07-21 00:09:05 +03:00
|
|
|
|
<p>
|
|
|
|
|
{ isOwned && <b>Владелец схемы</b> }
|
|
|
|
|
{ !isOwned && <b>Стать владельцем</b> }
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
</DropdownButton>
|
2023-07-31 22:38:58 +03:00
|
|
|
|
{(isOwned || user?.is_staff) &&
|
2023-09-02 01:11:27 +03:00
|
|
|
|
<DropdownCheckbox
|
|
|
|
|
value={isReadonly}
|
2023-09-07 16:30:43 +03:00
|
|
|
|
setValue={toggleReadonly}
|
2023-09-02 01:11:27 +03:00
|
|
|
|
label='Я — читатель!'
|
|
|
|
|
tooltip='Режим чтения'
|
|
|
|
|
/>}
|
2023-07-21 00:09:05 +03:00
|
|
|
|
{user?.is_staff &&
|
2023-09-02 01:11:27 +03:00
|
|
|
|
<DropdownCheckbox
|
|
|
|
|
value={isForceAdmin}
|
2023-09-07 16:30:43 +03:00
|
|
|
|
setValue={toggleForceAdmin}
|
2023-09-05 23:18:21 +03:00
|
|
|
|
label='Я — администратор!'
|
|
|
|
|
tooltip='Режим редактирования для администраторов'
|
2023-09-02 01:11:27 +03:00
|
|
|
|
/>}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
</Dropdown>}
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<Button
|
2023-07-25 20:27:29 +03:00
|
|
|
|
tooltip={'отслеживание: ' + (isTracking ? '[включено]' : '[выключено]')}
|
2023-08-26 17:26:49 +03:00
|
|
|
|
disabled={processing}
|
2023-07-25 20:27:29 +03:00
|
|
|
|
icon={isTracking
|
|
|
|
|
? <EyeIcon color='text-primary' size={5}/>
|
2023-09-09 20:36:55 +03:00
|
|
|
|
: <EyeOffIcon color='text-controls' size={5}/>
|
2023-07-21 18:44:14 +03:00
|
|
|
|
}
|
2023-09-15 23:29:52 +03:00
|
|
|
|
dimensions='h-full w-fit'
|
2023-07-20 17:11:03 +03:00
|
|
|
|
borderClass=''
|
2023-09-09 20:36:55 +03:00
|
|
|
|
style={{outlineColor: 'transparent'}}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
dense
|
2023-08-26 17:26:49 +03:00
|
|
|
|
onClick={onToggleSubscribe}
|
2023-09-04 19:12:27 +03:00
|
|
|
|
tabIndex={-1}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-27 22:04:25 +03:00
|
|
|
|
export default RSTabsMenu
|