wisemapping-frontend/packages/editor/src/components/index.tsx

158 lines
5.2 KiB
TypeScript
Raw Normal View History

2022-10-08 06:52:39 +02:00
/*
* 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.
*/
2022-10-08 05:22:27 +02:00
import React, { useCallback, useEffect, useRef, useState } from 'react';
import Popover from '@mui/material/Popover';
2022-10-08 22:46:52 +02:00
import Model from '../classes/model/editor';
2022-10-08 05:22:27 +02:00
import { IntlProvider } from 'react-intl';
import {
$notify,
PersistenceManager,
Designer,
DesignerKeyboard,
MindplotWebComponent,
} from '@wisemapping/mindplot';
import I18nMsg from '../classes/i18n-msg';
import Toolbar, { horizontalPosition, configurationBuilder } from './toolbar';
import { theme as defaultEditorTheme } from '../theme';
import ThemeProvider from '@mui/material/styles/ThemeProvider';
import { Theme } from '@mui/material/styles';
2022-10-08 19:12:07 +02:00
import { Notifier } from './warning-dialog/styled';
import WarningDialog from './warning-dialog';
2022-10-08 05:22:27 +02:00
import DefaultWidgetManager from '../classes/default-widget-manager';
import AppBar from './app-bar';
import { EditorOptions, EditorProps } from '..';
2022-10-08 19:12:07 +02:00
import Capability from '../classes/action/capability';
2022-10-08 05:22:27 +02:00
const Editor = ({
mapId,
options,
persistenceManager,
onAction,
theme,
accountConfiguration,
}: EditorProps) => {
const [mindplotComponent, setMindplotComponent]: [MindplotWebComponent | undefined, Function] =
useState();
2022-10-08 22:46:52 +02:00
const [model, setModel]: [MindplotWebComponent | undefined, Function] = useState();
2022-10-08 05:22:27 +02:00
const editorTheme: Theme = theme ? theme : defaultEditorTheme;
const [toolbarsRerenderSwitch, setToolbarsRerenderSwitch] = useState(0);
const toolbarConfiguration = useRef([]);
2022-10-08 22:46:52 +02:00
const [popoverOpen, popoverTarget, widgetManager] = DefaultWidgetManager.create();
2022-10-08 19:12:07 +02:00
// Load mindmap ...
const capability = new Capability(options.mode, options.locked);
2022-10-08 05:22:27 +02:00
const mindplotRef = useCallback((node: MindplotWebComponent) => {
setMindplotComponent(node);
}, []);
useEffect(() => {
2022-10-08 19:12:07 +02:00
if (mindplotComponent === undefined) {
return;
}
2022-10-08 22:46:52 +02:00
// Initialized model ...
const model = new Model(mindplotComponent);
model.loadMindmap(mapId, persistenceManager, widgetManager);
model.registerEvents(setToolbarsRerenderSwitch, capability);
setModel(model);
2022-10-08 05:22:27 +02:00
toolbarConfiguration.current = configurationBuilder.buildToolbarCongiruation(designer);
}, [mindplotComponent !== undefined]);
2022-10-08 22:46:52 +02:00
useEffect(() => {
// Change page title ...
document.title = `${options.mapTitle} | WiseMapping `;
});
2022-10-08 05:22:27 +02:00
useEffect(() => {
if (options.enableKeyboardEvents) {
DesignerKeyboard.resume();
} else {
DesignerKeyboard.pause();
}
}, [options.enableKeyboardEvents]);
const locale = options.locale;
const msg = I18nMsg.loadLocaleData(locale);
2022-10-08 19:12:07 +02:00
2022-10-08 05:22:27 +02:00
const menubarConfiguration = configurationBuilder.buildEditorAppBarConfiguration(
mindplotComponent?.getDesigner(),
options.mapTitle,
2022-10-08 19:12:07 +02:00
capability,
2022-10-08 05:22:27 +02:00
onAction,
2022-10-08 22:46:52 +02:00
accountConfiguration,
2022-10-08 05:22:27 +02:00
() => {
mindplotComponent.save(true);
},
);
2022-10-08 19:12:07 +02:00
2022-10-08 05:22:27 +02:00
// if the Toolbar is not hidden before the variable 'isMobile' is defined, it appears intermittently when the page loads
// if the Toolbar is not rendered, Menu.ts cant find buttons for create event listeners
// so, with this hack the Toolbar is rendered but no visible until the variable 'isMobile' is defined
return (
<ThemeProvider theme={editorTheme}>
<IntlProvider locale={locale} messages={msg}>
<AppBar configurations={menubarConfiguration} />
<Popover
id="popover"
open={popoverOpen}
anchorEl={popoverTarget}
onClose={widgetManager.handleClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
>
{widgetManager.getEditorContent()}
</Popover>
2022-10-08 19:12:07 +02:00
{!capability.isHidden('edition-toolbar') && (
2022-10-08 05:22:27 +02:00
<Toolbar
configurations={toolbarConfiguration.current}
rerender={toolbarsRerenderSwitch}
></Toolbar>
)}
<Toolbar
configurations={configurationBuilder.buildZoomToolbarConfiguration(
2022-10-08 19:12:07 +02:00
capability,
2022-10-08 05:22:27 +02:00
mindplotComponent?.getDesigner(),
)}
position={horizontalPosition}
rerender={toolbarsRerenderSwitch}
></Toolbar>
2022-10-08 22:46:52 +02:00
2022-10-08 05:22:27 +02:00
<mindplot-component
ref={mindplotRef}
id="mindmap-comp"
mode={options.mode}
locale={options.locale}
></mindplot-component>
2022-10-08 22:46:52 +02:00
2022-10-08 05:22:27 +02:00
<Notifier id="headerNotifier"></Notifier>
2022-10-08 22:46:52 +02:00
<WarningDialog
capability={capability}
message={options.locked ? options.lockedMsg : ''}
></WarningDialog>
2022-10-08 05:22:27 +02:00
</IntlProvider>
</ThemeProvider>
);
};
export default Editor;