2024-06-07 20:17:03 +03:00
|
|
|
'use client';
|
|
|
|
|
2025-02-10 01:32:16 +03:00
|
|
|
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';
|
2025-02-10 01:32:16 +03:00
|
|
|
import { useAuthSuspense } from '@/features/auth/backend/useAuth';
|
|
|
|
import { useMutatingOss } from '@/features/oss/backend/useMutatingOss';
|
2025-02-12 13:07:26 +03:00
|
|
|
import { useRoleStore } from '@/features/users';
|
2025-02-10 01:32:16 +03:00
|
|
|
import { UserRole } from '@/features/users/models/user';
|
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();
|
2025-01-28 19:45:31 +03:00
|
|
|
const { user, isAnonymous } = useAuthSuspense();
|
2024-06-07 20:17:03 +03:00
|
|
|
|
2025-01-29 14:51:34 +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
|
|
|
|
2025-01-28 19:45:31 +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>
|
|
|
|
|
2025-01-28 19:45:31 +03:00
|
|
|
{!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}
|
|
|
|
|
2025-01-28 19:45:31 +03:00
|
|
|
{!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' />}
|
2025-01-28 19:45:31 +03:00
|
|
|
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' />}
|
2025-01-28 19:45:31 +03:00
|
|
|
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}
|
2025-01-28 19:45:31 +03:00
|
|
|
{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>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-06-26 19:47:05 +03:00
|
|
|
export default MenuOssTabs;
|