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

210 lines
7.0 KiB
TypeScript
Raw Normal View History

'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';
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';
import { useAuth } from '@/context/AuthContext';
import { useConceptNavigation } from '@/context/NagivationContext';
import { useRSForm } from '@/context/RSFormContext';
import useDropdown from '@/hooks/useDropdown';
2023-12-16 19:20:26 +03:00
import { UserAccessMode } from '@/models/miscelanious';
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
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) {
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() {
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
}
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() {
router.push('/rsform-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 (
<div className='flex items-stretch h-full w-fit'>
<div ref={schemaMenu.ref}>
<Button noBorder dense tabIndex={-1}
2023-12-16 19:20:26 +03:00
tooltip='Меню'
icon={<BiMenu size='1.25rem' className='clr-text-controls' />}
dimensions='h-full w-fit pl-2'
style={{outlineColor: 'transparent'}}
onClick={schemaMenu.toggle}
/>
{schemaMenu.isActive ?
<Dropdown>
2023-12-16 19:20:26 +03:00
<DropdownButton
text={isOwned ? 'Вы — владелец' : 'Стать владельцем'}
tooltip={!user || !isClaimable ? 'Взять во владение можно общую изменяемую схему' : ''}
icon={<LuCrown size='1rem' className={isOwned ? 'clr-text-success' : 'clr-text-controls'} />}
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}
/>
</Dropdown> : null}
</div>
2023-12-16 19:20:26 +03:00
<div ref={editMenu.ref}>
<Button dense noBorder tabIndex={-1}
2023-12-16 19:20:26 +03:00
tooltip={'Редактирование'}
dimensions='h-full w-fit'
style={{outlineColor: 'transparent'}}
2023-12-16 19:20:26 +03:00
icon={<FiEdit size='1.25rem' className={isMutable ? 'clr-text-success' : 'clr-text-warning'}/>}
onClick={editMenu.toggle}
/>
{editMenu.isActive ?
<Dropdown>
2023-12-16 19:20:26 +03:00
<DropdownButton disabled={!isMutable}
text='Сброс имён'
tooltip='Присвоить порядковые имена и обновить выражения'
icon={<BiAnalyse size='1rem' className={isMutable ? 'clr-text-primary': ''} />}
onClick={handleReindex}
/>
<DropdownButton disabled={!isMutable}
text='Банк выражений'
tooltip='Создать конституенту из шаблона'
icon={<BiDiamond size='1rem' className={isMutable ? 'clr-text-success': ''} />}
onClick={handleTemplates}
/>
</Dropdown>: null}
</div>
2023-12-16 19:20:26 +03:00
<div ref={accessMenu.ref}>
<Button dense noBorder tabIndex={-1}
2023-12-16 19:20:26 +03:00
tooltip={`режим ${labelAccessMode(mode)}`}
dimensions='h-full w-fit pr-2'
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}
/>
{accessMenu.isActive ?
<Dropdown>
<DropdownButton
text={labelAccessMode(UserAccessMode.READER)}
tooltip={describeAccessMode(UserAccessMode.READER)}
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)}
tooltip={describeAccessMode(UserAccessMode.OWNER)}
icon={<LuCrown size='1rem' className={isOwned ? 'clr-text-primary': ''} />}
onClick={() => handleChangeMode(UserAccessMode.OWNER)}
/>
<DropdownButton disabled={!user?.is_staff}
text={labelAccessMode(UserAccessMode.ADMIN)}
tooltip={describeAccessMode(UserAccessMode.ADMIN)}
icon={<BiMeteor size='1rem' className={user?.is_staff ? 'clr-text-primary': ''} />}
onClick={() => handleChangeMode(UserAccessMode.ADMIN)}
/>
</Dropdown>: null}
2023-07-20 17:11:03 +03:00
</div>
</div>);
2023-07-20 17:11:03 +03:00
}
export default RSTabsMenu;