mirror of
https://bitbucket.org/wisemapping/wisemapping-frontend.git
synced 2025-04-03 11:43:20 +02:00
96 lines
3.2 KiB
TypeScript
96 lines
3.2 KiB
TypeScript
/* eslint-disable react-hooks/rules-of-hooks */
|
|
/*
|
|
* 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, { useRef, useState } from 'react';
|
|
import { WidgetManager, Topic } from '@wisemapping/mindplot';
|
|
import { linkContent, noteContent } from './react-component';
|
|
|
|
export class DefaultWidgetManager extends WidgetManager {
|
|
private editorOpen: boolean;
|
|
private editorContent: React.ReactElement;
|
|
private editorTitle: string;
|
|
private setPopoverOpen: (value: boolean) => void;
|
|
private setPopoverTarget: (target: Element) => void;
|
|
|
|
constructor(
|
|
setPopoverOpen: (open: boolean) => void,
|
|
setPopoverTarget: (target: Element) => void,
|
|
) {
|
|
super();
|
|
this.setPopoverOpen = setPopoverOpen;
|
|
this.setPopoverTarget = setPopoverTarget;
|
|
}
|
|
|
|
showEditorForLink(topic: Topic): void {
|
|
const model = {
|
|
getValue: () => topic.getLinkValue(),
|
|
setValue: (value: string) => topic.setLinkValue(value),
|
|
};
|
|
this.editorContent = linkContent(model, () => this.setPopoverOpen(false));
|
|
this.setPopoverTarget(topic.getOuterShape().peer._native);
|
|
this.setPopoverOpen(true);
|
|
this.editorTitle = 'editor-panel.link-panel-title';
|
|
topic.closeEditors();
|
|
}
|
|
|
|
isEditorOpen(): boolean {
|
|
return this.editorOpen;
|
|
}
|
|
|
|
getEditorContent(): React.ReactElement {
|
|
return this.editorContent;
|
|
}
|
|
|
|
handleClose: (event, reason: 'backdropClick' | 'escapeKeyDown') => void = () => {
|
|
this.setPopoverOpen(false);
|
|
this.editorContent = undefined;
|
|
this.setPopoverTarget(undefined);
|
|
};
|
|
|
|
showEditorForNote(topic: Topic): void {
|
|
const model = {
|
|
getValue(): string {
|
|
return topic.getNoteValue();
|
|
},
|
|
setValue(value: string) {
|
|
const note = value && value.trim() !== '' ? value : undefined;
|
|
topic.setNoteValue(note);
|
|
},
|
|
};
|
|
this.editorContent = noteContent(model, () => this.setPopoverOpen(false));
|
|
this.setPopoverTarget(topic.getOuterShape().peer._native);
|
|
this.setPopoverOpen(true);
|
|
this.editorTitle = 'editor-panel.note-panel-title';
|
|
topic.closeEditors();
|
|
}
|
|
|
|
static useCreate(): [boolean, (boolean) => void, Element | undefined, DefaultWidgetManager] {
|
|
const [popoverOpen, setPopoverOpen] = useState(false);
|
|
const [popoverTarget, setPopoverTarget] = useState(undefined);
|
|
const widgetManager = useRef(new DefaultWidgetManager(setPopoverOpen, setPopoverTarget));
|
|
|
|
return [popoverOpen, setPopoverOpen, popoverTarget, widgetManager.current];
|
|
}
|
|
|
|
getEditorTile(): string {
|
|
return this.editorTitle;
|
|
}
|
|
}
|
|
|
|
export default DefaultWidgetManager;
|