/* * Copyright [2021] [wisemapping] * * Licensed under WiseMapping Public License, Version 1.0 (the "License"). * It is basically the Apache License, Version 2.0 (the "License") plus the * "powered by wisemapping" text requirement on every single page; * you may not use this file except in compliance with the License. * You may obtain a copy of the license at * * http://www.wisemapping.org/license * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import React 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 SentimentSatisfiedAltIcon from '@mui/icons-material/SentimentSatisfiedAlt'; 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 PolylineOutlined from '@mui/icons-material/PolylineOutlined'; import GestureOutlined from '@mui/icons-material/GestureOutlined'; import TimelineOutined from '@mui/icons-material/TimelineOutlined'; import ShareOutlined from '@mui/icons-material/ShareOutlined'; import Palette from '@mui/icons-material/Square'; import SquareOutlined from '@mui/icons-material/SquareOutlined'; import ActionConfig from '../../classes/action/action-config'; import { SwitchValueDirection } from '../toolbar/ToolbarValueModelBuilder'; import NodePropertyValueModelBuilder from '../../classes/model/node-property-builder'; import ColorPicker from '../action-widget/pane/color-picker'; import TopicLink from '../action-widget/pane/topic-link'; import TopicNote from '../action-widget/pane/topic-note'; import IconPicker from '../action-widget/pane/icon-picker'; import FontFamilySelector from '../action-widget/button/font-family-selector'; import Editor from '../../classes/model/editor'; import { IntlShape } from 'react-intl'; import { LineType } from '@wisemapping/mindplot/src/components/ConnectionLine'; const keyTooltip = (msg: string, key: string): string => { const isMac = window.navigator.platform.toUpperCase().indexOf('MAC') >= 0; return `${msg} (${isMac ? '⌘' : 'Ctrl'} + ${key})`; }; export function buildEditorPanelConfig(model: Editor, intl: IntlShape): ActionConfig[] { const valueBulder = new NodePropertyValueModelBuilder(model.getDesigner()); // eslint-disable-next-line react-hooks/rules-of-hooks const colorAndShapeToolbarConfiguration: ActionConfig = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-style', defaultMessage: 'Topic Style', }), options: [ { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-share-rectangle', defaultMessage: 'Rectangle shape', }), onClick: () => valueBulder.getTopicShapeModel().setValue('rectangle'), selected: () => valueBulder.getTopicShapeModel().getValue() === 'rectangle', }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-share-rounded', defaultMessage: 'Rounded shape', }), onClick: () => valueBulder.getTopicShapeModel().setValue('rounded rectangle'), selected: () => valueBulder.getTopicShapeModel().getValue() === 'rounded rectangle', }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-share-line', defaultMessage: 'Line shape', }), onClick: () => valueBulder.getTopicShapeModel().setValue('line'), selected: () => valueBulder.getTopicShapeModel().getValue() === 'line', }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-share-ellipse', defaultMessage: 'Ellipse shape', }), onClick: () => valueBulder.getTopicShapeModel().setValue('elipse'), selected: () => valueBulder.getTopicShapeModel().getValue() === 'elipse', }, null, { icon: () => ( ), tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-fill-color', defaultMessage: 'Fill color', }), options: [ { render: (closeModal) => { return ( ); }, }, ], }, { icon: () => ( ), tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-border-color', defaultMessage: 'Border color', }), options: [ { render: (closeModal) => { return ( ); }, }, ], }, ], disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; const connectionStyleConfiguration: ActionConfig = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-connection-style', defaultMessage: 'Connection Style', }), options: [ { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-connection-style-curved-thin', defaultMessage: 'Thin Curved', }), onClick: () => valueBulder.getConnectionStyleModel().setValue(LineType.THICK_CURVED), selected: () => valueBulder.getConnectionStyleModel().getValue() === LineType.THICK_CURVED, }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-connection-style-curved-thick', defaultMessage: 'Thick Curved', }), onClick: () => valueBulder.getConnectionStyleModel().setValue(LineType.THICK_CURVED), selected: () => valueBulder.getConnectionStyleModel().getValue() === LineType.THICK_CURVED, }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-connection-style-polyline', defaultMessage: 'Simple Polyline', }), onClick: () => valueBulder.getConnectionStyleModel().setValue(LineType.POLYLINE_MIDDLE), selected: () => valueBulder.getConnectionStyleModel().getValue() === LineType.POLYLINE_MIDDLE, }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-connection-style-polyline-curved', defaultMessage: 'Curved Polyline', }), onClick: () => valueBulder.getConnectionStyleModel().setValue(LineType.POLYLINE_CURVED), selected: () => valueBulder.getConnectionStyleModel().getValue() === LineType.POLYLINE_CURVED, }, // null, // { // icon: () => , // tooltip: intl.formatMessage({ // id: 'editor-panel.tooltip-connection-style-color', // defaultMessage: 'Color', // }), // options: [ // { // render: (closeModal) => { // return ( // // ); // }, // }, // ], // }, ], disabled: () => { const selected = model.getDesignerModel().filterSelectedTopics(); return selected.length === 0 || (selected.length === 1 && selected[0].isCentralTopic()); }, }; /** * submenu to manipulate node font */ const fontFormatToolbarConfiguration: ActionConfig = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-font-style', defaultMessage: 'Font Style', }), options: [ { render: () => , }, null, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-font-bigger', defaultMessage: 'Bigger', }), onClick: () => valueBulder.getFontSizeModel().switchValue(SwitchValueDirection.up), }, { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-font-smaller', defaultMessage: 'Smaller', }), onClick: () => valueBulder.getFontSizeModel().switchValue(SwitchValueDirection.down), }, null, { icon: , tooltip: keyTooltip( intl.formatMessage({ id: 'editor-panel.tooltip-topic-font-bold', defaultMessage: 'Bold', }), 'B', ), onClick: valueBulder.fontWeigthModel().switchValue, selected: () => valueBulder.fontWeigthModel().getValue() === 'bold', }, { icon: , tooltip: keyTooltip( intl.formatMessage({ id: 'editor-panel.tooltip-topic-font-italic', defaultMessage: 'Italic', }), 'I', ), onClick: valueBulder.getFontStyleModel().switchValue, selected: () => valueBulder.getFontStyleModel().getValue() === 'italic', }, { icon: () => , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-topic-font-color', defaultMessage: 'Color', }), options: [ { render: (closeModal) => { return ( ); }, }, ], }, ], disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; /** * button to show relation pivot */ const addRelationConfiguration: ActionConfig = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-add-relationship', defaultMessage: 'Add Relationship', }), onClick: (e) => { model.getDesigner().showRelPivot(e); }, disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; /** * tool for node link edition */ const editLinkUrlConfiguration: ActionConfig = { icon: , tooltip: keyTooltip( intl.formatMessage({ id: 'editor-panel.tooltip-add-link', defaultMessage: 'Add Link' }), 'L', ), useClickToClose: true, options: [ { render: (closeModal) => ( ), }, ], disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; /** * tool for node note edition */ const editNoteConfiguration: ActionConfig = { icon: , tooltip: keyTooltip( intl.formatMessage({ id: 'editor-panel.tooltip-add-note', defaultMessage: 'Add Note' }), 'K', ), useClickToClose: true, options: [ { tooltip: 'Node note', render: (closeModal) => ( ), }, ], disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; /** * tool for emoji selection */ const editIconConfiguration: ActionConfig = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-add-icon', defaultMessage: 'Add Icon', }), useClickToClose: true, options: [ { tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-add-icon', defaultMessage: 'Add Icon', }), render: (closeModal) => ( ), }, ], disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; const addNodeToolbarConfiguration = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-add-topic', defaultMessage: 'Add Topic' }) + ' (Enter)', onClick: () => model.getDesigner().createSiblingForSelectedNode(), disabled: () => model.getDesignerModel().filterSelectedTopics().length === 0, }; const deleteNodeToolbarConfiguration = { icon: , tooltip: intl.formatMessage({ id: 'editor-panel.tooltip-delete-topic', defaultMessage: 'Delete Topic', }) + ' (Delete)', onClick: () => model.getDesigner().deleteSelectedEntities(), disabled: () => model.getDesigner().getModel().filterSelectedTopics().length === 0, }; return [ addNodeToolbarConfiguration, deleteNodeToolbarConfiguration, colorAndShapeToolbarConfiguration, fontFormatToolbarConfiguration, editIconConfiguration, editNoteConfiguration, editLinkUrlConfiguration, connectionStyleConfiguration, addRelationConfiguration, ]; }