'use client'; import fileDownload from 'js-file-download'; import { toast } from 'react-toastify'; import { useConceptNavigation } from '@/app/Navigation/NavigationContext'; import { urls } from '@/app/urls'; import { useAuth } from '@/backend/auth/useAuth'; import { useCstSubstitute } from '@/backend/rsform/useCstSubstitute'; import { useDownloadRSForm } from '@/backend/rsform/useDownloadRSForm'; import { useInlineSynthesis } from '@/backend/rsform/useInlineSynthesis'; import { useIsProcessingRSForm } from '@/backend/rsform/useIsProcessingRSForm'; import { useProduceStructure } from '@/backend/rsform/useProduceStructure'; import { useResetAliases } from '@/backend/rsform/useResetAliases'; import { useRestoreOrder } from '@/backend/rsform/useRestoreOrder'; import { IconAdmin, IconAlert, IconArchive, IconClone, IconDestroy, IconDownload, IconEdit2, IconEditor, IconGenerateNames, IconGenerateStructure, IconInlineSynthesis, IconLibrary, IconMenu, IconNewItem, IconOSS, IconOwner, IconQR, IconReader, IconReplace, IconShare, IconSortList, IconTemplates, IconUpload } from '@/components/Icons'; import Button from '@/components/ui/Button'; import Divider from '@/components/ui/Divider'; import Dropdown from '@/components/ui/Dropdown'; import DropdownButton from '@/components/ui/DropdownButton'; import useDropdown from '@/hooks/useDropdown'; import { AccessPolicy, LocationHead } from '@/models/library'; import { CstType } from '@/models/rsform'; import { UserRole } from '@/models/user'; import { useDialogsStore } from '@/stores/dialogs'; import { useModificationStore } from '@/stores/modification'; import { useRoleStore } from '@/stores/role'; import { EXTEOR_TRS_FILE } from '@/utils/constants'; import { describeAccessMode, information, labelAccessMode, tooltips } from '@/utils/labels'; import { generatePageQR, promptUnsaved, sharePage } from '@/utils/utils'; import { OssTabID } from '../OssPage/OssEditContext'; import { useRSEdit } from './RSEditContext'; function MenuRSTabs() { const controller = useRSEdit(); const router = useConceptNavigation(); const { user } = useAuth(); const role = useRoleStore(state => state.role); const setRole = useRoleStore(state => state.setRole); const { isModified } = useModificationStore(); const isProcessing = useIsProcessingRSForm(); const { resetAliases } = useResetAliases(); const { restoreOrder } = useRestoreOrder(); const { produceStructure } = useProduceStructure(); const { inlineSynthesis } = useInlineSynthesis(); const { cstSubstitute } = useCstSubstitute(); const { download } = useDownloadRSForm(); const showInlineSynthesis = useDialogsStore(state => state.showInlineSynthesis); const showQR = useDialogsStore(state => state.showQR); const showSubstituteCst = useDialogsStore(state => state.showSubstituteCst); const showClone = useDialogsStore(state => state.showCloneLibraryItem); const showUpload = useDialogsStore(state => state.showUploadRSForm); const schemaMenu = useDropdown(); const editMenu = useDropdown(); const accessMenu = useDropdown(); // TODO: move into separate function const canProduceStructure = !!controller.activeCst && !!controller.activeCst.parse.typification && controller.activeCst.cst_type !== CstType.BASE && controller.activeCst.cst_type !== CstType.CONSTANT; function calculateCloneLocation() { const location = controller.schema.location; const head = location.substring(0, 2) as LocationHead; if (head === LocationHead.LIBRARY) { return user?.is_staff ? location : LocationHead.USER; } if (controller.schema.owner === user?.id) { return location; } return head === LocationHead.USER ? LocationHead.USER : location; } function handleDelete() { schemaMenu.hide(); controller.deleteSchema(); } function handleDownload() { schemaMenu.hide(); if (isModified && !promptUnsaved()) { return; } const fileName = (controller.schema.alias ?? 'Schema') + EXTEOR_TRS_FILE; download({ itemID: controller.schema.id, version: controller.schema.version }, (data: Blob) => { try { fileDownload(data, fileName); } catch (error) { console.error(error); } }); } function handleUpload() { schemaMenu.hide(); showUpload({ itemID: controller.schema.id }); } function handleClone() { schemaMenu.hide(); if (isModified && !promptUnsaved()) { return; } showClone({ base: controller.schema, initialLocation: calculateCloneLocation(), selected: controller.selected, totalCount: controller.schema.items.length }); } function handleShare() { schemaMenu.hide(); sharePage(); } function handleShowQR() { schemaMenu.hide(); showQR({ target: generatePageQR() }); } function handleReindex() { editMenu.hide(); resetAliases(controller.schema.id, () => toast.success(information.reindexComplete)); } function handleRestoreOrder() { editMenu.hide(); restoreOrder(controller.schema.id, () => toast.success(information.reorderComplete)); } function handleSubstituteCst() { editMenu.hide(); if (isModified && !promptUnsaved()) { return; } showSubstituteCst({ schema: controller.schema, onSubstitute: data => cstSubstitute( { itemID: controller.schema.id, // data }, () => { controller.setSelected(prev => prev.filter(id => !data.substitutions.find(sub => sub.original === id))); toast.success(information.substituteSingle); } ) }); } function handleTemplates() { editMenu.hide(); controller.promptTemplate(); } function handleProduceStructure() { editMenu.hide(); if (!controller.activeCst) { return; } if (isModified && !promptUnsaved()) { return; } produceStructure( { itemID: controller.schema.id, // data: { target: controller.activeCst.id } }, cstList => { toast.success(information.addedConstituents(cstList.length)); if (cstList.length !== 0) { controller.setSelected(cstList); } } ); } function handleInlineSynthesis() { editMenu.hide(); if (isModified && !promptUnsaved()) { return; } showInlineSynthesis({ receiver: controller.schema, onInlineSynthesis: data => { const oldCount = controller.schema.items.length; inlineSynthesis({ itemID: controller.schema.id, data }, newSchema => { controller.deselectAll(); toast.success(information.addedConstituents(newSchema.items.length - oldCount)); }); } }); } function handleChangeMode(newMode: UserRole) { accessMenu.hide(); setRole(newMode); } function handleCreateNew() { router.push(urls.create_schema); } function handleLogin() { router.push(urls.login); } return (
{!controller.isArchive && user ? (
) : null} router.push(urls.schema(itemID, version), newTab); {controller.isArchive && user ? (
) : null} {!user ? (