import React, { useEffect, useState } from 'react'; import BrushOutlinedIcon from '@mui/icons-material/BrushOutlined'; import FontDownloadOutlinedIcon from '@mui/icons-material/FontDownloadOutlined'; import TextIncreaseOutlinedIcon from '@mui/icons-material/TextIncreaseOutlined'; import TextDecreaseOutlinedIcon from '@mui/icons-material/TextDecreaseOutlined'; import FormatBoldOutlinedIcon from '@mui/icons-material/FormatBoldOutlined'; import SettingsEthernetIcon from '@mui/icons-material/SettingsEthernet'; import FormatItalicIcon from '@mui/icons-material/FormatItalic'; import NoteOutlinedIcon from '@mui/icons-material/NoteOutlined'; import LinkOutlinedIcon from '@mui/icons-material/LinkOutlined'; import ZoomOutOutlinedIcon from '@mui/icons-material/ZoomOutOutlined'; import ZoomInOutlinedIcon from '@mui/icons-material/ZoomInOutlined'; import CenterFocusStrongOutlinedIcon from '@mui/icons-material/CenterFocusStrongOutlined'; import SentimentSatisfiedAltIcon from '@mui/icons-material/SentimentSatisfiedAlt'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import RedoOutlinedIcon from '@mui/icons-material/RedoOutlined'; import RestoreOutlinedIcon from '@mui/icons-material/RestoreOutlined'; import SaveOutlinedIcon from '@mui/icons-material/SaveOutlined'; import PrintOutlinedIcon from '@mui/icons-material/PrintOutlined'; import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; import HelpOutlineOutlinedIcon from '@mui/icons-material/InfoOutlined'; import ArrowBackIosNewOutlinedIcon from '@mui/icons-material/ArrowBackIosNewOutlined'; import CircleOutlinedIcon from '@mui/icons-material/CircleOutlined'; import SquareOutlinedIcon from '@mui/icons-material/SquareOutlined'; import CheckBoxOutlineBlankOutlinedIcon from '@mui/icons-material/CheckBoxOutlineBlankOutlined'; import HorizontalRuleOutlinedIcon from '@mui/icons-material/HorizontalRuleOutlined'; import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; import AddCircleOutlineOutlinedIcon from '@mui/icons-material/AddCircleOutlineOutlined'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import LogoTextBlackSvg from '../../../images/logo-text-black.svg'; import Palette from '@mui/icons-material/Square'; import SquareOutlined from '@mui/icons-material/SquareOutlined'; import { $msg, Designer } from '@wisemapping/mindplot'; import ActionConfig from '../../classes/actions-config'; import { SwitchValueDirection, NodePropertyValueModelBuilder } from './ToolbarValueModelBuilder'; import { ColorPicker, FontFamilySelect, KeyboardShorcutsHelp, NoteForm, ToolbarEmojiPcker, UndoAndRedoButton, UrlForm, } from './toolbarCustomComponents'; import Typography from '@mui/material/Typography'; import { ToolbarActionType } from '.'; import KeyboardOutlined from '@mui/icons-material/KeyboardOutlined'; import Tooltip from '@mui/material/Tooltip'; /** * * @param designer designer to aply changes * @returns configuration for @wisemapping/editor primary toolbar */ export function buildToolbarCongiruation(designer: Designer): ActionConfig[] { if (!designer) return []; /** * model builder */ const toolbarValueModelBuilder = new NodePropertyValueModelBuilder(designer); //
Rectangle
//
Rounded Rectangle
//
Line
//
`; /** * submenu to manipulate node color and shape */ const colorAndShapeToolbarConfiguration: ActionConfig = { icon: , tooltip: $msg('TOPIC_SHAPE'), options: [ { icon: , tooltip: $msg('TOPIC_SHAPE_RECTANGLE'), onClick: () => toolbarValueModelBuilder.getTopicShapeModel().setValue('rectagle'), selected: () => toolbarValueModelBuilder.getTopicShapeModel().getValue() === 'rectagle', }, { icon: , tooltip: $msg('TOPIC_SHAPE_ROUNDED'), onClick: () => toolbarValueModelBuilder.getTopicShapeModel().setValue('rounded rectagle'), selected: () => toolbarValueModelBuilder.getTopicShapeModel().getValue() === 'rounded rectagle', }, { icon: , tooltip: $msg('TOPIC_SHAPE_LINE'), onClick: () => toolbarValueModelBuilder.getTopicShapeModel().setValue('line'), selected: () => toolbarValueModelBuilder.getTopicShapeModel().getValue() === 'line', }, { icon: , tooltip: $msg('TOPIC_SHAPE_ELLIPSE'), onClick: () => toolbarValueModelBuilder.getTopicShapeModel().setValue('elipse'), selected: () => toolbarValueModelBuilder.getTopicShapeModel().getValue() === 'elipse', }, null, { icon: () => ( ), tooltip: $msg('TOPIC_COLOR'), options: [ { render: (closeModal) => { return ( ); }, }, ], }, { icon: () => ( ), tooltip: $msg('TOPIC_BORDER_COLOR'), options: [ { render: (closeModal) => { return ( ); }, }, ], }, ], disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; /** * submenu to manipulate node font */ const fontFormatToolbarConfiguration: ActionConfig = { icon: , tooltip: $msg('FONT_FORMAT'), options: [ { render: () => ( ), }, null, { icon: , tooltip: $msg('FONT_INCREASE'), onClick: () => toolbarValueModelBuilder.getFontSizeModel().switchValue(SwitchValueDirection.up), }, { icon: , tooltip: $msg('FONT_DECREASE'), onClick: () => toolbarValueModelBuilder.getFontSizeModel().switchValue(SwitchValueDirection.down), }, null, { icon: , tooltip: $msg('FONT_BOLD') + ' (' + $msg('CTRL') + ' + B)', onClick: toolbarValueModelBuilder.fontWeigthModel().switchValue, selected: () => toolbarValueModelBuilder.fontWeigthModel().getValue() === 'bold', }, { icon: , tooltip: $msg('FONT_ITALIC') + ' (' + $msg('CTRL') + ' + I)', onClick: toolbarValueModelBuilder.getFontStyleModel().switchValue, selected: () => toolbarValueModelBuilder.getFontStyleModel().getValue() === 'italic', }, { icon: () => ( ), tooltip: $msg('FONT_COLOR'), options: [ { render: (closeModal) => { return ( ); }, }, ], }, ], disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; /** * button to show relation pivot */ const addRelationConfiguration: ActionConfig = { icon: , tooltip: $msg('TOPIC_RELATIONSHIP'), onClick: (e) => { designer.showRelPivot(e); }, disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; /** * tool for node link edition */ const editLinkUrlConfiguration: ActionConfig = { icon: , tooltip: $msg('TOPIC_LINK'), useClickToClose: true, options: [ { render: (closeModal) => ( ), }, ], disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; /** * tool for node note edition */ const editNoteConfiguration: ActionConfig = { icon: , tooltip: $msg('TOPIC_NOTE'), useClickToClose: true, options: [ { tooltip: 'Node note', render: (closeModal) => ( ), }, ], disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; /** * tool for emoji selection */ const editIconConfiguration: ActionConfig = { icon: , tooltip: $msg('TOPIC_ICON'), options: [ { tooltip: 'Node icon', render: (closeModal) => ( ), }, ], disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; const addNodeToolbarConfiguration = { icon: , tooltip: $msg('TOPIC_ADD'), onClick: () => designer.createSiblingForSelectedNode(), disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; const deleteNodeToolbarConfiguration = { icon: , tooltip: $msg('TOPIC_DELETE'), onClick: () => designer.deleteSelectedEntities(), disabled: () => designer.getModel().filterSelectedTopics().length === 0, }; return [ addNodeToolbarConfiguration, deleteNodeToolbarConfiguration, colorAndShapeToolbarConfiguration, fontFormatToolbarConfiguration, editIconConfiguration, editNoteConfiguration, editLinkUrlConfiguration, addRelationConfiguration, ]; } export function buildZoomToolbarConfiguration(isMobile: boolean, designer: Designer) { if (!designer) return []; return [ { icon: , tooltip: $msg('KEYBOARD_SHOTCUTS'), visible: !isMobile, options: [ { render: () => , }, ], }, { // zoom value candidate, neds to fixit render: () => ( %{Math.floor((1 / designer.getWorkSpace()?.getZoom()) * 100)} ), }, { icon: , tooltip: $msg('ZOOM_IN'), onClick: (e) => { designer.zoomIn(); }, }, { icon: , tooltip: $msg('ZOOM_OUT'), onClick: (e) => { designer.zoomOut(); }, }, { icon: , tooltip: $msg('CENTER_POSITION'), onClick: (e) => { designer.zoomToFit(); }, }, ]; } export function buildEditorAppBarConfiguration( designer: Designer, onAction: (type: ToolbarActionType) => void, save: () => void, showOnlyCommonActions: boolean, showAccessChangeActions: boolean, showMapEntityActions: boolean, showMindMapNodesActions: boolean, showPersistenceActions: boolean, ): ActionConfig[] { if (!designer) return []; let commonConfiguration = [ { icon: , tooltip: $msg('BACK_TO_MAP_LIST'), onClick: () => history.back(), }, { render: () => , }, { render: () => ( {designer.getMindmap().getDescription()} ), }, ]; const exportConfiguration: ActionConfig = { icon: , tooltip: $msg('EXPORT'), onClick: () => onAction('export'), }; const helpConfiguration: ActionConfig = { icon: , onClick: () => onAction('info'), tooltip: $msg('MAP_INFO'), }; const appBarDivisor = { render: () => , }; if (showOnlyCommonActions) { return [...commonConfiguration, appBarDivisor, exportConfiguration]; } return [ ...commonConfiguration, null, { render: () => ( , tooltip: $msg('UNDO') + ' (' + $msg('CTRL') + ' + Z)', onClick: () => designer.undo(), }} disabledCondition={(event) => event.undoSteps > 0} > ), visible: showMindMapNodesActions, }, { render: () => ( , tooltip: $msg('REDO') + ' (' + $msg('CTRL') + ' + Shift + Z)', onClick: () => designer.redo(), }} disabledCondition={(event) => event.redoSteps > 0} > ), visible: showMindMapNodesActions, }, null, { icon: , tooltip: $msg('HISTORY'), onClick: () => onAction('history'), visible: showPersistenceActions, }, { icon: , tooltip: $msg('SAVE') + ' (' + $msg('CTRL') + ' + S)', onClick: save, visible: showPersistenceActions, }, appBarDivisor, { icon: , tooltip: $msg('PRINT'), onClick: () => onAction('print'), visible: showMapEntityActions, }, exportConfiguration, { icon: , onClick: () => onAction('publish'), tooltip: $msg('PUBLISH'), disabled: () => !showAccessChangeActions, }, { render: () => ( ), }, helpConfiguration, ]; }