2023-12-13 14:32:57 +03:00
|
|
|
|
'use client';
|
2023-07-25 20:27:29 +03:00
|
|
|
|
|
2023-12-17 20:19:28 +03:00
|
|
|
|
import { BiAnalyse, BiDiamond, BiDownload, BiDuplicate, BiMenu, BiMeteor, BiPlusCircle, BiShareAlt, BiTrash, BiUpload } from 'react-icons/bi';
|
2023-12-16 19:20:26 +03:00
|
|
|
|
import { FiEdit } from 'react-icons/fi';
|
|
|
|
|
import { LuCrown, LuGlasses } from 'react-icons/lu';
|
|
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
|
import Button from '@/components/Common/Button';
|
|
|
|
|
import Dropdown from '@/components/Common/Dropdown';
|
|
|
|
|
import DropdownButton from '@/components/Common/DropdownButton';
|
2023-12-16 19:20:26 +03:00
|
|
|
|
import { useAccessMode } from '@/context/AccessModeContext';
|
2023-12-13 14:32:57 +03:00
|
|
|
|
import { useAuth } from '@/context/AuthContext';
|
2023-12-26 14:23:51 +03:00
|
|
|
|
import { useConceptNavigation } from '@/context/NavigationContext';
|
2023-12-13 14:32:57 +03:00
|
|
|
|
import { useRSForm } from '@/context/RSFormContext';
|
|
|
|
|
import useDropdown from '@/hooks/useDropdown';
|
2023-12-26 14:23:51 +03:00
|
|
|
|
import { UserAccessMode } from '@/models/miscellaneous';
|
2023-12-16 19:20:26 +03:00
|
|
|
|
import { describeAccessMode, labelAccessMode } from '@/utils/labels';
|
2023-07-20 17:11:03 +03:00
|
|
|
|
|
2023-07-28 18:23:37 +03:00
|
|
|
|
interface RSTabsMenuProps {
|
2023-12-16 19:20:26 +03:00
|
|
|
|
isMutable: boolean
|
|
|
|
|
|
2023-07-28 18:23:37 +03:00
|
|
|
|
showUploadDialog: () => void
|
|
|
|
|
showCloneDialog: () => void
|
2023-11-27 18:27:23 +03:00
|
|
|
|
|
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-12-16 19:20:26 +03:00
|
|
|
|
onReindex: () => void
|
|
|
|
|
onTemplates: () => void
|
2023-07-28 18:23:37 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-25 22:51:20 +03:00
|
|
|
|
function RSTabsMenu({
|
2023-12-16 19:20:26 +03:00
|
|
|
|
isMutable,
|
2023-08-25 22:51:20 +03:00
|
|
|
|
showUploadDialog, showCloneDialog,
|
2023-12-16 19:20:26 +03:00
|
|
|
|
onDestroy, onShare, onDownload,
|
|
|
|
|
onClaim, onReindex, onTemplates
|
2023-08-25 22:51:20 +03:00
|
|
|
|
}: RSTabsMenuProps) {
|
2023-12-13 14:32:57 +03:00
|
|
|
|
const router = useConceptNavigation();
|
2023-07-25 20:27:29 +03:00
|
|
|
|
const { user } = useAuth();
|
2023-12-16 19:20:26 +03:00
|
|
|
|
const { isOwned, isClaimable } = useRSForm();
|
|
|
|
|
|
|
|
|
|
const { mode, setMode } = useAccessMode();
|
|
|
|
|
|
2023-07-20 17:11:03 +03:00
|
|
|
|
const schemaMenu = useDropdown();
|
|
|
|
|
const editMenu = useDropdown();
|
2023-12-16 19:20:26 +03:00
|
|
|
|
const accessMenu = 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
|
|
|
|
}
|
|
|
|
|
|
2023-12-16 19:20:26 +03:00
|
|
|
|
function handleReindex() {
|
|
|
|
|
editMenu.hide();
|
|
|
|
|
onReindex();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleTemplates() {
|
|
|
|
|
editMenu.hide();
|
|
|
|
|
onTemplates();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleChangeMode(newMode: UserAccessMode) {
|
|
|
|
|
accessMenu.hide();
|
|
|
|
|
setMode(newMode);
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-24 11:10:04 +03:00
|
|
|
|
function handleCreateNew() {
|
2023-12-19 19:40:42 +03:00
|
|
|
|
router.push('/library/create');
|
2023-08-24 11:10:04 +03:00
|
|
|
|
}
|
2023-07-25 20:27:29 +03:00
|
|
|
|
|
2023-07-28 18:23:37 +03:00
|
|
|
|
return (
|
2023-12-18 12:25:39 +03:00
|
|
|
|
<div className='flex'>
|
2023-10-25 21:21:43 +03:00
|
|
|
|
<div ref={schemaMenu.ref}>
|
2023-11-27 11:33:34 +03:00
|
|
|
|
<Button noBorder dense tabIndex={-1}
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title='Меню'
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<BiMenu size='1.25rem' className='clr-text-controls' />}
|
2023-12-18 12:25:39 +03:00
|
|
|
|
className='h-full pl-2'
|
2023-10-25 21:21:43 +03:00
|
|
|
|
style={{outlineColor: 'transparent'}}
|
|
|
|
|
onClick={schemaMenu.toggle}
|
|
|
|
|
/>
|
2023-12-25 16:53:27 +03:00
|
|
|
|
<Dropdown isOpen={schemaMenu.isOpen}>
|
|
|
|
|
<DropdownButton disabled={(!user || !isClaimable) && !isOwned}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
text={isOwned ? 'Вы — владелец' : 'Стать владельцем'}
|
2023-12-25 16:53:27 +03:00
|
|
|
|
icon={<LuCrown size='1rem' className={isOwned ? 'clr-text-success' : ''} />}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
onClick={(!isOwned && user && isClaimable) ? handleClaimOwner : undefined}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton
|
|
|
|
|
text='Поделиться'
|
2023-12-17 20:19:28 +03:00
|
|
|
|
icon={<BiShareAlt size='1rem' className='clr-text-primary' />}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
onClick={handleShare}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton disabled={!user}
|
|
|
|
|
text='Клонировать'
|
|
|
|
|
icon={<BiDuplicate size='1rem' className='clr-text-primary' />}
|
|
|
|
|
onClick={handleClone}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton
|
|
|
|
|
text='Выгрузить в Экстеор'
|
|
|
|
|
icon={<BiDownload size='1rem' className='clr-text-primary'/>}
|
|
|
|
|
onClick={handleDownload}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton disabled={!isMutable}
|
|
|
|
|
text='Загрузить из Экстеора'
|
|
|
|
|
icon={<BiUpload size='1rem' className={isMutable ? 'clr-text-warning' : ''} />}
|
|
|
|
|
onClick={handleUpload}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton disabled={!isMutable}
|
|
|
|
|
text='Удалить схему'
|
|
|
|
|
icon={<BiTrash size='1rem' className={isMutable ? 'clr-text-warning' : ''} />}
|
|
|
|
|
onClick={handleDelete}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton
|
|
|
|
|
text='Создать новую схему'
|
|
|
|
|
icon={<BiPlusCircle size='1rem' className='clr-text-url' />}
|
|
|
|
|
onClick={handleCreateNew}
|
|
|
|
|
/>
|
2023-12-25 16:53:27 +03:00
|
|
|
|
</Dropdown>
|
2023-10-25 21:21:43 +03:00
|
|
|
|
</div>
|
2023-12-16 19:20:26 +03:00
|
|
|
|
|
2023-10-25 21:21:43 +03:00
|
|
|
|
<div ref={editMenu.ref}>
|
2023-11-27 11:33:34 +03:00
|
|
|
|
<Button dense noBorder tabIndex={-1}
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title={'Редактирование'}
|
2023-12-18 12:25:39 +03:00
|
|
|
|
className='h-full'
|
2023-10-25 21:21:43 +03:00
|
|
|
|
style={{outlineColor: 'transparent'}}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<FiEdit size='1.25rem' className={isMutable ? 'clr-text-success' : 'clr-text-warning'}/>}
|
2023-10-25 21:21:43 +03:00
|
|
|
|
onClick={editMenu.toggle}
|
|
|
|
|
/>
|
2023-12-25 16:53:27 +03:00
|
|
|
|
<Dropdown isOpen={editMenu.isOpen}>
|
2023-12-16 19:20:26 +03:00
|
|
|
|
<DropdownButton disabled={!isMutable}
|
|
|
|
|
text='Сброс имён'
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title='Присвоить порядковые имена и обновить выражения'
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<BiAnalyse size='1rem' className={isMutable ? 'clr-text-primary': ''} />}
|
|
|
|
|
onClick={handleReindex}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton disabled={!isMutable}
|
|
|
|
|
text='Банк выражений'
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title='Создать конституенту из шаблона'
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<BiDiamond size='1rem' className={isMutable ? 'clr-text-success': ''} />}
|
|
|
|
|
onClick={handleTemplates}
|
|
|
|
|
/>
|
2023-12-25 16:53:27 +03:00
|
|
|
|
</Dropdown>
|
2023-10-25 21:21:43 +03:00
|
|
|
|
</div>
|
2023-12-16 19:20:26 +03:00
|
|
|
|
|
|
|
|
|
<div ref={accessMenu.ref}>
|
2023-11-27 11:33:34 +03:00
|
|
|
|
<Button dense noBorder tabIndex={-1}
|
2023-12-21 00:12:24 +03:00
|
|
|
|
title={`Режим ${labelAccessMode(mode)}`}
|
2023-12-18 12:25:39 +03:00
|
|
|
|
className='h-full pr-2'
|
2023-10-25 21:21:43 +03:00
|
|
|
|
style={{outlineColor: 'transparent'}}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={
|
|
|
|
|
mode === UserAccessMode.ADMIN ? <BiMeteor size='1.25rem' className='clr-text-primary'/>
|
|
|
|
|
: mode === UserAccessMode.OWNER ? <LuCrown size='1.25rem' className='clr-text-primary'/>
|
|
|
|
|
: <LuGlasses size='1.25rem' className='clr-text-primary'/>
|
|
|
|
|
}
|
|
|
|
|
onClick={accessMenu.toggle}
|
|
|
|
|
/>
|
2023-12-25 16:53:27 +03:00
|
|
|
|
<Dropdown isOpen={accessMenu.isOpen}>
|
2023-12-16 19:20:26 +03:00
|
|
|
|
<DropdownButton
|
|
|
|
|
text={labelAccessMode(UserAccessMode.READER)}
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title={describeAccessMode(UserAccessMode.READER)}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<LuGlasses size='1rem' className='clr-text-primary' />}
|
|
|
|
|
onClick={() => handleChangeMode(UserAccessMode.READER)}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
/>
|
2023-12-16 19:20:26 +03:00
|
|
|
|
<DropdownButton disabled={!isOwned}
|
|
|
|
|
text={labelAccessMode(UserAccessMode.OWNER)}
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title={describeAccessMode(UserAccessMode.OWNER)}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<LuCrown size='1rem' className={isOwned ? 'clr-text-primary': ''} />}
|
|
|
|
|
onClick={() => handleChangeMode(UserAccessMode.OWNER)}
|
|
|
|
|
/>
|
|
|
|
|
<DropdownButton disabled={!user?.is_staff}
|
|
|
|
|
text={labelAccessMode(UserAccessMode.ADMIN)}
|
2023-12-18 19:42:27 +03:00
|
|
|
|
title={describeAccessMode(UserAccessMode.ADMIN)}
|
2023-12-16 19:20:26 +03:00
|
|
|
|
icon={<BiMeteor size='1rem' className={user?.is_staff ? 'clr-text-primary': ''} />}
|
|
|
|
|
onClick={() => handleChangeMode(UserAccessMode.ADMIN)}
|
|
|
|
|
/>
|
2023-12-25 16:53:27 +03:00
|
|
|
|
</Dropdown>
|
2023-07-20 17:11:03 +03:00
|
|
|
|
</div>
|
2023-10-25 21:21:43 +03:00
|
|
|
|
</div>);
|
2023-07-20 17:11:03 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-10-25 21:21:43 +03:00
|
|
|
|
export default RSTabsMenu;
|