* feat: created custom mention component * feat: added mention suggestions and suggestion highlights * feat: created mention suggestion list for displaying mention suggestions * feat: created custom mention text component, for handling click event * feat: exposed mention component * feat: integrated and exposed `mentions` componenet with `editor-core` * feat: integrated mentions extension with the core editor package * feat: exposed suggestion types from mentions * feat: added `mention-suggestion` parameters in `r-t-e` and `l-t-e` * feat: added `IssueMention` model in apiserver models * chore: updated activities background job and added bs4 in requirements * feat: added mention removal logic in issue_activity * chore: exposed mention types from `r-t-e` and `l-t-e` * feat: integrated mentions in side peek view description form * feat: added mentions in issue modal form * feat: created custom react-hook for editor suggestions * feat: integrated mention suggestions block in RichTextEditor * feat: added `mentions` integration in `lite-text-editor` instances * fix: tailwind loading nodemodules from packages * feat: added styles for the mention suggestion list * fix: update module import to resolve build failure * feat: added mentions as an issue filter * feat: added UI Changes to Implement `mention` filters * feat: added `mentions` as a filter option in the header * feat: added mentions in the filter list options * feat: added mentions in default display filter options * feat: added filters in applied and issue params in store * feat: modified types for adding mentions as a filter option * feat: modified `notification-card` to display message when it exists in object * feat: rewrote user mention management upon the changes made in develop * chore: merged debounce PR with the current PR for tracing changes * fix: mentions_filters updated with the new setup * feat: updated requirements for bs4 * feat: modified `mentions-filter` to remove many to many dependency * feat: implemented list manipulation instead of for loop * feat: added readonly functionality in `read-only` editor core * feat: added UI Changes for read-only mode * feat: added mentions store in web Root Store * chore: renamed `use-editor-suggestions` hook * feat: UI Improvements for conditional highlights w.r.t readonly in mentionNode * fix: removed mentions from `filter_set` parameters * fix: minor merge fixes * fix: package lock updates --------- Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
"use client"
|
|
import * as React from 'react';
|
|
import { EditorContainer, EditorContentWrapper, getEditorClassNames, useEditor } from '@plane/editor-core';
|
|
import { EditorBubbleMenu } from './menus/bubble-menu';
|
|
import { RichTextEditorExtensions } from './extensions';
|
|
|
|
export type UploadImage = (file: File) => Promise<string>;
|
|
export type DeleteImage = (assetUrlWithWorkspaceId: string) => Promise<any>;
|
|
|
|
export type IMentionSuggestion = {
|
|
id: string;
|
|
type: string;
|
|
avatar: string;
|
|
title: string;
|
|
subtitle: string;
|
|
redirect_uri: string;
|
|
}
|
|
|
|
export type IMentionHighlight = string
|
|
|
|
interface IRichTextEditor {
|
|
value: string;
|
|
uploadFile: UploadImage;
|
|
deleteFile: DeleteImage;
|
|
noBorder?: boolean;
|
|
borderOnFocus?: boolean;
|
|
customClassName?: string;
|
|
editorContentCustomClassNames?: string;
|
|
onChange?: (json: any, html: string) => void;
|
|
setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void;
|
|
setShouldShowAlert?: (showAlert: boolean) => void;
|
|
forwardedRef?: any;
|
|
debouncedUpdatesEnabled?: boolean;
|
|
mentionHighlights?: string[];
|
|
mentionSuggestions?: IMentionSuggestion[];
|
|
}
|
|
|
|
interface RichTextEditorProps extends IRichTextEditor {
|
|
forwardedRef?: React.Ref<EditorHandle>;
|
|
}
|
|
|
|
interface EditorHandle {
|
|
clearEditor: () => void;
|
|
setEditorValue: (content: string) => void;
|
|
}
|
|
|
|
const RichTextEditor = ({
|
|
onChange,
|
|
debouncedUpdatesEnabled,
|
|
setIsSubmitting,
|
|
setShouldShowAlert,
|
|
editorContentCustomClassNames,
|
|
value,
|
|
uploadFile,
|
|
deleteFile,
|
|
noBorder,
|
|
borderOnFocus,
|
|
customClassName,
|
|
forwardedRef,
|
|
mentionHighlights,
|
|
mentionSuggestions
|
|
}: RichTextEditorProps) => {
|
|
const editor = useEditor({
|
|
onChange,
|
|
debouncedUpdatesEnabled,
|
|
setIsSubmitting,
|
|
setShouldShowAlert,
|
|
value,
|
|
uploadFile,
|
|
deleteFile,
|
|
forwardedRef,
|
|
extensions: RichTextEditorExtensions(uploadFile, setIsSubmitting),
|
|
mentionHighlights,
|
|
mentionSuggestions
|
|
});
|
|
|
|
const editorClassNames = getEditorClassNames({ noBorder, borderOnFocus, customClassName });
|
|
|
|
if (!editor) return null;
|
|
|
|
return (
|
|
<EditorContainer editor={editor} editorClassNames={editorClassNames}>
|
|
{editor && <EditorBubbleMenu editor={editor} />}
|
|
<div className="flex flex-col">
|
|
<EditorContentWrapper editor={editor} editorContentCustomClassNames={editorContentCustomClassNames} />
|
|
</div>
|
|
</EditorContainer >
|
|
);
|
|
};
|
|
|
|
const RichTextEditorWithRef = React.forwardRef<EditorHandle, IRichTextEditor>((props, ref) => (
|
|
<RichTextEditor {...props} forwardedRef={ref} />
|
|
));
|
|
|
|
RichTextEditorWithRef.displayName = "RichTextEditorWithRef";
|
|
|
|
export { RichTextEditor, RichTextEditorWithRef};
|