Portal/rsconcept/frontend/src/features/library/components/ToolbarItemCard.tsx

79 lines
2.6 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
'use client';
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
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';
import { useMutatingLibrary } from '../backend/useMutatingLibrary';
2025-03-07 22:04:56 +03:00
import { MiniSelectorOSS } from './MiniSelectorOSS';
interface ToolbarItemCardProps {
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-07 22:04:56 +03:00
export function ToolbarItemCard({ 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-07 22:04:56 +03:00
<div className='cc-tab-tools cc-icons'>
{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
);
}