Portal/rsconcept/frontend/src/features/library/components/toolbar-item-card.tsx

82 lines
2.7 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
'use client';
2025-03-11 12:47:00 +03:00
import clsx from 'clsx';
import { urls, useConceptNavigation } from '@/app';
2025-02-26 00:16:22 +03:00
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
2025-03-07 22:04:56 +03:00
import { type IRSForm } from '@/features/rsform';
2025-02-12 15:12:59 +03:00
import { useRoleStore, UserRole } from '@/features/users';
2025-02-12 21:36:03 +03:00
2025-03-12 12:04:23 +03:00
import { MiniButton } from '@/components/control';
import { IconDestroy, IconSave, IconShare } from '@/components/icons';
2025-01-26 22:24:34 +03:00
import { useModificationStore } from '@/stores/modification';
import { tooltipText } from '@/utils/labels';
2025-02-12 15:12:59 +03:00
import { prepareTooltip, sharePage } from '@/utils/utils';
2024-06-07 20:17:03 +03:00
2025-03-07 22:04:56 +03:00
import { AccessPolicy, type ILibraryItem, LibraryItemType } from '../backend/types';
2025-03-12 11:54:32 +03:00
import { useMutatingLibrary } from '../backend/use-mutating-library';
2025-03-12 11:54:32 +03:00
import { MiniSelectorOSS } from './mini-selector-oss';
2025-03-07 22:04:56 +03:00
interface ToolbarItemCardProps {
2025-03-11 12:47:00 +03:00
className?: string;
2024-06-07 20:17:03 +03:00
onSubmit: () => void;
isMutable: boolean;
schema: ILibraryItem;
deleteSchema: () => void;
2024-06-07 20:17:03 +03:00
}
2025-03-11 12:47:00 +03:00
export function ToolbarItemCard({ className, schema, onSubmit, isMutable, deleteSchema }: ToolbarItemCardProps) {
2025-01-15 23:03:23 +03:00
const role = useRoleStore(state => state.role);
const router = useConceptNavigation();
2025-01-26 22:24:34 +03:00
const { isModified } = useModificationStore();
const isProcessing = useMutatingLibrary();
2025-01-26 22:24:34 +03:00
const canSave = isModified && !isProcessing;
const ossSelector = (() => {
if (schema.item_type !== LibraryItemType.RSFORM) {
return null;
}
const rsSchema = schema as IRSForm;
if (rsSchema.oss.length <= 0) {
return null;
}
return (
<MiniSelectorOSS
items={rsSchema.oss}
onSelect={(event, value) => router.push({ path: urls.oss(value.id), newTab: event.ctrlKey || event.metaKey })}
/>
);
})();
2024-06-07 20:17:03 +03:00
return (
2025-03-11 12:47:00 +03:00
<div className={clsx('cc-icons', className)}>
{ossSelector}
{isMutable || isModified ? (
2024-06-07 20:17:03 +03:00
<MiniButton
titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')}
disabled={!canSave}
icon={<IconSave size='1.25rem' className='icon-primary' />}
onClick={onSubmit}
/>
) : null}
<MiniButton
titleHtml={tooltipText.shareItem(schema.access_policy === AccessPolicy.PUBLIC)}
2024-06-07 20:17:03 +03:00
icon={<IconShare size='1.25rem' className='icon-primary' />}
2025-01-26 22:24:34 +03:00
onClick={sharePage}
disabled={schema.access_policy !== AccessPolicy.PUBLIC}
2024-06-07 20:17:03 +03:00
/>
{isMutable ? (
2024-06-07 20:17:03 +03:00
<MiniButton
title='Удалить схему'
icon={<IconDestroy size='1.25rem' className='icon-red' />}
disabled={!isMutable || isProcessing || role < UserRole.OWNER}
onClick={deleteSchema}
2024-06-07 20:17:03 +03:00
/>
) : null}
2025-03-07 22:04:56 +03:00
<BadgeHelp topic={HelpTopic.UI_RS_CARD} offset={4} />
</div>
2024-06-07 20:17:03 +03:00
);
}