Portal/rsconcept/frontend/src/features/oss/pages/OssPage/MenuOssTabs.tsx

214 lines
6.7 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
'use client';
import { urls, useConceptNavigation } from '@/app';
import { Divider } from '@/components/Container';
import { Button } from '@/components/Control';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
2024-06-07 20:17:03 +03:00
import {
IconAdmin,
IconAlert,
2024-10-28 23:55:12 +03:00
IconChild,
2024-06-07 20:17:03 +03:00
IconDestroy,
IconEdit2,
IconEditor,
IconLibrary,
IconMenu,
IconNewItem,
IconOwner,
IconReader,
IconShare
} from '@/components/Icons';
import { useAuthSuspense } from '@/features/auth';
import { useMutatingOss } from '@/features/oss/backend/useMutatingOss';
2025-02-12 15:12:59 +03:00
import { useRoleStore, UserRole } from '@/features/users';
2025-01-15 23:03:23 +03:00
import { describeAccessMode as describeUserRole, labelAccessMode as labelUserRole } from '@/utils/labels';
2025-01-26 22:24:34 +03:00
import { sharePage } from '@/utils/utils';
2024-06-07 20:17:03 +03:00
import { useOssEdit } from './OssEditContext';
2025-01-26 22:24:34 +03:00
function MenuOssTabs() {
2024-06-07 20:17:03 +03:00
const controller = useOssEdit();
const router = useConceptNavigation();
const { user, isAnonymous } = useAuthSuspense();
2024-06-07 20:17:03 +03:00
const isProcessing = useMutatingOss();
2025-01-26 22:24:34 +03:00
2025-01-15 23:03:23 +03:00
const role = useRoleStore(state => state.role);
const setRole = useRoleStore(state => state.setRole);
2024-06-07 20:17:03 +03:00
const schemaMenu = useDropdown();
const editMenu = useDropdown();
const accessMenu = useDropdown();
function handleDelete() {
schemaMenu.hide();
2025-01-26 22:24:34 +03:00
controller.deleteSchema();
2024-06-07 20:17:03 +03:00
}
function handleShare() {
schemaMenu.hide();
2025-01-26 22:24:34 +03:00
sharePage();
2024-06-07 20:17:03 +03:00
}
2025-01-15 23:03:23 +03:00
function handleChangeRole(newMode: UserRole) {
2024-06-07 20:17:03 +03:00
accessMenu.hide();
2025-01-15 23:03:23 +03:00
setRole(newMode);
2024-06-07 20:17:03 +03:00
}
function handleCreateNew() {
router.push(urls.create_schema);
}
function handleLogin() {
router.push(urls.login);
}
2024-10-28 23:55:12 +03:00
function handleRelocate() {
editMenu.hide();
controller.promptRelocateConstituents(undefined, []);
}
2024-06-07 20:17:03 +03:00
return (
<div className='flex'>
<div ref={schemaMenu.ref}>
<Button
dense
noBorder
noOutline
tabIndex={-1}
title='Меню'
hideTitle={schemaMenu.isOpen}
icon={<IconMenu size='1.25rem' className='clr-text-controls' />}
className='h-full pl-2'
onClick={schemaMenu.toggle}
/>
<Dropdown isOpen={schemaMenu.isOpen}>
<DropdownButton
text='Поделиться'
icon={<IconShare size='1rem' className='icon-primary' />}
onClick={handleShare}
/>
{controller.isMutable ? (
<DropdownButton
text='Удалить схему'
icon={<IconDestroy size='1rem' className='icon-red' />}
2025-01-26 22:24:34 +03:00
disabled={isProcessing || role < UserRole.OWNER}
2024-06-07 20:17:03 +03:00
onClick={handleDelete}
/>
) : null}
2024-09-12 11:16:18 +03:00
2024-12-12 13:17:24 +03:00
<Divider margins='mx-3 my-1' />
2024-09-12 11:16:18 +03:00
{!isAnonymous ? (
2024-06-07 20:17:03 +03:00
<DropdownButton
text='Создать новую схему'
icon={<IconNewItem size='1rem' className='icon-primary' />}
onClick={handleCreateNew}
/>
) : null}
<DropdownButton
text='Библиотека'
icon={<IconLibrary size='1rem' className='icon-primary' />}
onClick={() => router.push(urls.library)}
/>
</Dropdown>
</div>
{!isAnonymous ? (
2024-06-07 20:17:03 +03:00
<div ref={editMenu.ref}>
<Button
dense
noBorder
noOutline
tabIndex={-1}
2024-08-23 22:53:32 +03:00
title='Редактирование'
2024-06-07 20:17:03 +03:00
hideTitle={editMenu.isOpen}
className='h-full px-2'
icon={<IconEdit2 size='1.25rem' className={controller.isMutable ? 'icon-green' : 'icon-red'} />}
onClick={editMenu.toggle}
/>
<Dropdown isOpen={editMenu.isOpen}>
2024-08-17 23:43:15 +03:00
<DropdownButton
2024-10-28 23:55:12 +03:00
text='Конституенты'
2024-10-29 12:05:23 +03:00
titleHtml='Перенос конституент</br>между схемами'
2024-10-28 23:55:12 +03:00
icon={<IconChild size='1rem' className='icon-green' />}
2025-01-26 22:24:34 +03:00
disabled={isProcessing}
2024-10-28 23:55:12 +03:00
onClick={handleRelocate}
2024-08-17 23:43:15 +03:00
/>
2024-06-07 20:17:03 +03:00
</Dropdown>
</div>
) : null}
{!isAnonymous ? (
2024-06-07 20:17:03 +03:00
<div ref={accessMenu.ref}>
<Button
dense
noBorder
noOutline
tabIndex={-1}
2025-01-15 23:03:23 +03:00
title={`Режим ${labelUserRole(role)}`}
2024-06-07 20:17:03 +03:00
hideTitle={accessMenu.isOpen}
className='h-full pr-2'
icon={
2025-01-15 23:03:23 +03:00
role === UserRole.ADMIN ? (
2024-06-07 20:17:03 +03:00
<IconAdmin size='1.25rem' className='icon-primary' />
2025-01-15 23:03:23 +03:00
) : role === UserRole.OWNER ? (
2024-06-07 20:17:03 +03:00
<IconOwner size='1.25rem' className='icon-primary' />
2025-01-15 23:03:23 +03:00
) : role === UserRole.EDITOR ? (
2024-06-07 20:17:03 +03:00
<IconEditor size='1.25rem' className='icon-primary' />
) : (
<IconReader size='1.25rem' className='icon-primary' />
)
}
onClick={accessMenu.toggle}
/>
<Dropdown isOpen={accessMenu.isOpen}>
<DropdownButton
2025-01-15 23:03:23 +03:00
text={labelUserRole(UserRole.READER)}
title={describeUserRole(UserRole.READER)}
2024-06-07 20:17:03 +03:00
icon={<IconReader size='1rem' className='icon-primary' />}
2025-01-15 23:03:23 +03:00
onClick={() => handleChangeRole(UserRole.READER)}
2024-06-07 20:17:03 +03:00
/>
<DropdownButton
2025-01-15 23:03:23 +03:00
text={labelUserRole(UserRole.EDITOR)}
title={describeUserRole(UserRole.EDITOR)}
2024-06-07 20:17:03 +03:00
icon={<IconEditor size='1rem' className='icon-primary' />}
disabled={!controller.isOwned && (!user.id || !controller.schema.editors.includes(user.id))}
2025-01-15 23:03:23 +03:00
onClick={() => handleChangeRole(UserRole.EDITOR)}
2024-06-07 20:17:03 +03:00
/>
<DropdownButton
2025-01-15 23:03:23 +03:00
text={labelUserRole(UserRole.OWNER)}
title={describeUserRole(UserRole.OWNER)}
2024-06-07 20:17:03 +03:00
icon={<IconOwner size='1rem' className='icon-primary' />}
2025-01-23 19:41:31 +03:00
disabled={!controller.isOwned}
2025-01-15 23:03:23 +03:00
onClick={() => handleChangeRole(UserRole.OWNER)}
2024-06-07 20:17:03 +03:00
/>
<DropdownButton
2025-01-15 23:03:23 +03:00
text={labelUserRole(UserRole.ADMIN)}
title={describeUserRole(UserRole.ADMIN)}
2024-06-07 20:17:03 +03:00
icon={<IconAdmin size='1rem' className='icon-primary' />}
disabled={!user.is_staff}
2025-01-15 23:03:23 +03:00
onClick={() => handleChangeRole(UserRole.ADMIN)}
2024-06-07 20:17:03 +03:00
/>
</Dropdown>
</div>
) : null}
{isAnonymous ? (
2024-06-07 20:17:03 +03:00
<Button
dense
noBorder
noOutline
tabIndex={-1}
titleHtml='<b>Анонимный режим</b><br />Войти в Портал'
hideTitle={accessMenu.isOpen}
className='h-full pr-2'
icon={<IconAlert size='1.25rem' className='icon-red' />}
onClick={handleLogin}
/>
) : null}
</div>
);
}
export default MenuOssTabs;