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

83 lines
2.8 KiB
TypeScript
Raw Normal View History

'use client';
import { urls, useConceptNavigation } from '@/app';
2025-02-26 00:16:41 +03:00
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
2025-03-07 22:05:12 +03:00
import { type IRSForm } from '@/features/rsform';
2025-02-12 15:13:37 +03:00
import { useRoleStore, UserRole } from '@/features/users';
2025-02-12 21:36:25 +03:00
2025-03-12 12:04:50 +03:00
import { MiniButton } from '@/components/control';
import { IconDestroy, IconSave, IconShare } from '@/components/icons';
import { cn } from '@/components/utils';
import { useModificationStore } from '@/stores/modification';
import { tooltipText } from '@/utils/labels';
2025-02-12 15:13:37 +03:00
import { prepareTooltip, sharePage } from '@/utils/utils';
2023-11-30 02:14:24 +03:00
2025-03-07 22:05:12 +03:00
import { AccessPolicy, type ILibraryItem, LibraryItemType } from '../backend/types';
2025-03-12 11:55:43 +03:00
import { useMutatingLibrary } from '../backend/use-mutating-library';
2025-03-12 11:55:43 +03:00
import { MiniSelectorOSS } from './mini-selector-oss';
2025-03-07 22:05:12 +03:00
interface ToolbarItemCardProps {
2025-03-11 12:47:15 +03:00
className?: string;
onSubmit: () => void;
isMutable: boolean;
schema: ILibraryItem;
deleteSchema: () => void;
2023-11-30 02:14:24 +03:00
}
2025-03-11 12:47:15 +03:00
export function ToolbarItemCard({ className, schema, onSubmit, isMutable, deleteSchema }: ToolbarItemCardProps) {
2025-01-15 23:03:35 +03:00
const role = useRoleStore(state => state.role);
const router = useConceptNavigation();
const { isModified } = useModificationStore();
const isProcessing = useMutatingLibrary();
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 })}
/>
);
})();
return (
<div className={cn('cc-icons', className)}>
{ossSelector}
{isMutable || isModified ? (
<MiniButton
2024-03-09 16:40:10 +03:00
titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')}
2025-03-20 11:33:42 +03:00
aria-label='Сохранить изменения'
icon={<IconSave size='1.25rem' className='icon-primary' />}
onClick={onSubmit}
2025-03-20 11:33:42 +03:00
disabled={!canSave}
/>
) : null}
<MiniButton
titleHtml={tooltipText.shareItem(schema.access_policy === AccessPolicy.PUBLIC)}
2025-03-20 11:33:42 +03:00
aria-label='Поделиться схемой'
icon={<IconShare size='1.25rem' className='icon-primary' />}
onClick={sharePage}
disabled={schema.access_policy !== AccessPolicy.PUBLIC}
/>
{isMutable ? (
<MiniButton
title='Удалить схему'
icon={<IconDestroy size='1.25rem' className='icon-red' />}
onClick={deleteSchema}
2025-03-20 11:33:42 +03:00
disabled={!isMutable || isProcessing || role < UserRole.OWNER}
/>
) : null}
2025-03-07 22:05:12 +03:00
<BadgeHelp topic={HelpTopic.UI_RS_CARD} offset={4} />
</div>
);
2023-11-30 02:14:24 +03:00
}