Skip to content

Commit e33bae2

Browse files
[PE-92] fix: removing readonly collaborative document editor (#6209)
* fix: removing readonly editor * fix: sync state * fix: indexeddb sync loader added * fix: remove node error fixed * style: page title and checkbox * chore: removing the syncing logic * revert: is editable check removed in display message * fix: editable field optional * fix: editable removed as optional prop * fix: extra options import fix --------- Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
1 parent 580c4b1 commit e33bae2

28 files changed

+214
-459
lines changed

packages/editor/src/core/components/editors/document/collaborative-editor.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const CollaborativeDocumentEditor = (props: ICollaborativeDocumentEditor) => {
1919
containerClassName,
2020
disabledExtensions,
2121
displayConfig = DEFAULT_DISPLAY_CONFIG,
22+
editable,
2223
editorClassName = "",
2324
embedHandler,
2425
fileHandler,
@@ -44,8 +45,8 @@ const CollaborativeDocumentEditor = (props: ICollaborativeDocumentEditor) => {
4445

4546
// use document editor
4647
const { editor, hasServerConnectionFailed, hasServerSynced } = useCollaborativeEditor({
47-
onTransaction,
4848
disabledExtensions,
49+
editable,
4950
editorClassName,
5051
embedHandler,
5152
extensions,
@@ -54,6 +55,7 @@ const CollaborativeDocumentEditor = (props: ICollaborativeDocumentEditor) => {
5455
handleEditorReady,
5556
id,
5657
mentionHandler,
58+
onTransaction,
5759
placeholder,
5860
realtimeConfig,
5961
serverHandler,

packages/editor/src/core/components/editors/document/collaborative-read-only-editor.tsx

Lines changed: 0 additions & 81 deletions
This file was deleted.
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from "./collaborative-editor";
2-
export * from "./collaborative-read-only-editor";
32
export * from "./loader";
43
export * from "./page-renderer";
54
export * from "./read-only-editor";

packages/editor/src/core/components/editors/document/page-renderer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,10 @@ export const PageRenderer = (props: IPageRenderer) => {
140140
>
141141
<EditorContentWrapper editor={editor} id={id} tabIndex={tabIndex} />
142142
{editor.isEditable && (
143-
<>
143+
<div>
144144
<BlockMenu editor={editor} />
145145
<AIFeaturesMenu menu={aiHandler?.menu} />
146-
</>
146+
</div>
147147
)}
148148
</EditorContainer>
149149
</div>

packages/editor/src/core/components/editors/editor-wrapper.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const EditorWrapper: React.FC<Props> = (props) => {
3838
} = props;
3939

4040
const editor = useEditor({
41+
editable: true,
4142
disabledExtensions,
4243
editorClassName,
4344
enableHistory: true,

packages/editor/src/core/extensions/custom-image/components/image-uploader.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export const CustomImageUploader = (props: CustomImageUploaderProps) => {
127127
return "Uploading...";
128128
}
129129

130-
if (draggedInside) {
130+
if (draggedInside && editor.isEditable) {
131131
return "Drop image here";
132132
}
133133

@@ -137,14 +137,16 @@ export const CustomImageUploader = (props: CustomImageUploaderProps) => {
137137
return (
138138
<div
139139
className={cn(
140-
"image-upload-component flex items-center justify-start gap-2 py-3 px-2 rounded-lg text-custom-text-300 hover:text-custom-text-200 bg-custom-background-90 hover:bg-custom-background-80 border border-dashed border-custom-border-300 transition-all duration-200 ease-in-out cursor-default",
140+
"image-upload-component flex items-center justify-start gap-2 py-3 px-2 rounded-lg text-custom-text-300 bg-custom-background-90 border border-dashed border-custom-border-300 transition-all duration-200 ease-in-out cursor-default",
141141
{
142-
"hover:text-custom-text-200 cursor-pointer": editor.isEditable,
143-
"bg-custom-background-80 text-custom-text-200": draggedInside,
144-
"text-custom-primary-200 bg-custom-primary-100/10 hover:bg-custom-primary-100/10 hover:text-custom-primary-200 border-custom-primary-200/10":
145-
selected,
146-
"text-red-500 cursor-default hover:text-red-500": failedToLoadImage,
147-
"bg-red-500/10 hover:bg-red-500/10": failedToLoadImage && selected,
142+
"hover:text-custom-text-200 hover:bg-custom-background-80 cursor-pointer": editor.isEditable,
143+
"bg-custom-background-80 text-custom-text-200": draggedInside && editor.isEditable,
144+
"text-custom-primary-200 bg-custom-primary-100/10 border-custom-primary-200/10 hover:bg-custom-primary-100/10 hover:text-custom-primary-200":
145+
selected && editor.isEditable,
146+
"text-red-500 cursor-default": failedToLoadImage,
147+
"hover:text-red-500": failedToLoadImage && editor.isEditable,
148+
"bg-red-500/10": failedToLoadImage && selected,
149+
"hover:bg-red-500/10": failedToLoadImage && selected && editor.isEditable,
148150
}
149151
)}
150152
onDrop={onDrop}

packages/editor/src/core/extensions/drop.tsx

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,67 @@ import { Extension, Editor } from "@tiptap/core";
22
import { Plugin, PluginKey } from "@tiptap/pm/state";
33
import { EditorView } from "@tiptap/pm/view";
44

5-
export const DropHandlerExtension = () =>
6-
Extension.create({
7-
name: "dropHandler",
8-
priority: 1000,
5+
export const DropHandlerExtension = Extension.create({
6+
name: "dropHandler",
7+
priority: 1000,
98

10-
addProseMirrorPlugins() {
11-
const editor = this.editor;
12-
return [
13-
new Plugin({
14-
key: new PluginKey("drop-handler-plugin"),
15-
props: {
16-
handlePaste: (view: EditorView, event: ClipboardEvent) => {
17-
if (event.clipboardData && event.clipboardData.files && event.clipboardData.files.length > 0) {
18-
event.preventDefault();
19-
const files = Array.from(event.clipboardData.files);
20-
const imageFiles = files.filter((file) => file.type.startsWith("image"));
9+
addProseMirrorPlugins() {
10+
const editor = this.editor;
11+
return [
12+
new Plugin({
13+
key: new PluginKey("drop-handler-plugin"),
14+
props: {
15+
handlePaste: (view: EditorView, event: ClipboardEvent) => {
16+
if (
17+
editor.isEditable &&
18+
event.clipboardData &&
19+
event.clipboardData.files &&
20+
event.clipboardData.files.length > 0
21+
) {
22+
event.preventDefault();
23+
const files = Array.from(event.clipboardData.files);
24+
const imageFiles = files.filter((file) => file.type.startsWith("image"));
2125

22-
if (imageFiles.length > 0) {
23-
const pos = view.state.selection.from;
24-
insertImagesSafely({ editor, files: imageFiles, initialPos: pos, event: "drop" });
25-
}
26-
return true;
26+
if (imageFiles.length > 0) {
27+
const pos = view.state.selection.from;
28+
insertImagesSafely({ editor, files: imageFiles, initialPos: pos, event: "drop" });
2729
}
28-
return false;
29-
},
30-
handleDrop: (view: EditorView, event: DragEvent, _slice: any, moved: boolean) => {
31-
if (!moved && event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files.length > 0) {
32-
event.preventDefault();
33-
const files = Array.from(event.dataTransfer.files);
34-
const imageFiles = files.filter((file) => file.type.startsWith("image"));
30+
return true;
31+
}
32+
return false;
33+
},
34+
handleDrop: (view: EditorView, event: DragEvent, _slice: any, moved: boolean) => {
35+
if (
36+
editor.isEditable &&
37+
!moved &&
38+
event.dataTransfer &&
39+
event.dataTransfer.files &&
40+
event.dataTransfer.files.length > 0
41+
) {
42+
event.preventDefault();
43+
const files = Array.from(event.dataTransfer.files);
44+
const imageFiles = files.filter((file) => file.type.startsWith("image"));
3545

36-
if (imageFiles.length > 0) {
37-
const coordinates = view.posAtCoords({
38-
left: event.clientX,
39-
top: event.clientY,
40-
});
46+
if (imageFiles.length > 0) {
47+
const coordinates = view.posAtCoords({
48+
left: event.clientX,
49+
top: event.clientY,
50+
});
4151

42-
if (coordinates) {
43-
const pos = coordinates.pos;
44-
insertImagesSafely({ editor, files: imageFiles, initialPos: pos, event: "drop" });
45-
}
46-
return true;
52+
if (coordinates) {
53+
const pos = coordinates.pos;
54+
insertImagesSafely({ editor, files: imageFiles, initialPos: pos, event: "drop" });
4755
}
56+
return true;
4857
}
49-
return false;
50-
},
58+
}
59+
return false;
5160
},
52-
}),
53-
];
54-
},
55-
});
56-
61+
},
62+
}),
63+
];
64+
},
65+
});
5766
export const insertImagesSafely = async ({
5867
editor,
5968
files,

packages/editor/src/core/extensions/extensions.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ type TArguments = {
4747
};
4848
placeholder?: string | ((isFocused: boolean, value: string) => string);
4949
tabIndex?: number;
50+
editable: boolean;
5051
};
5152

5253
export const CoreEditorExtensions = (args: TArguments): Extensions => {
53-
const { disabledExtensions, enableHistory, fileHandler, mentionConfig, placeholder, tabIndex } = args;
54+
const { disabledExtensions, enableHistory, fileHandler, mentionConfig, placeholder, tabIndex, editable } = args;
5455

5556
return [
5657
StarterKit.configure({
@@ -89,7 +90,7 @@ export const CoreEditorExtensions = (args: TArguments): Extensions => {
8990
...(enableHistory ? {} : { history: false }),
9091
}),
9192
CustomQuoteExtension,
92-
DropHandlerExtension(),
93+
DropHandlerExtension,
9394
CustomHorizontalRule.configure({
9495
HTMLAttributes: {
9596
class: "py-4 border-custom-border-400",
@@ -137,6 +138,7 @@ export const CoreEditorExtensions = (args: TArguments): Extensions => {
137138
CustomCodeInlineExtension,
138139
Markdown.configure({
139140
html: true,
141+
transformCopiedText: true,
140142
transformPastedText: true,
141143
breaks: true,
142144
}),
@@ -145,12 +147,14 @@ export const CoreEditorExtensions = (args: TArguments): Extensions => {
145147
TableCell,
146148
TableRow,
147149
CustomMention({
148-
mentionSuggestions: mentionConfig.mentionSuggestions,
150+
mentionSuggestions: editable ? mentionConfig.mentionSuggestions : undefined,
149151
mentionHighlights: mentionConfig.mentionHighlights,
150-
readonly: false,
152+
readonly: !editable,
151153
}),
152154
Placeholder.configure({
153155
placeholder: ({ editor, node }) => {
156+
if (!editor.isEditable) return;
157+
154158
if (node.type.name === "heading") return `Heading ${node.attrs.level}`;
155159

156160
if (editor.storage.imageComponent.uploadInProgress) return "";

packages/editor/src/core/extensions/read-only-extensions.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
TableRow,
2121
Table,
2222
CustomMention,
23-
HeadingListExtension,
2423
CustomReadOnlyImageExtension,
2524
CustomTextAlignExtension,
2625
CustomCalloutReadOnlyExtension,
@@ -139,7 +138,6 @@ export const CoreReadOnlyEditorExtensions = (props: Props): Extensions => {
139138
}),
140139
CharacterCount,
141140
CustomColorExtension,
142-
HeadingListExtension,
143141
CustomTextAlignExtension,
144142
CustomCalloutReadOnlyExtension,
145143
...CoreReadOnlyEditorAdditionalExtensions({

packages/editor/src/core/hooks/use-collaborative-editor.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorProps) => {
1515
const {
1616
onTransaction,
1717
disabledExtensions,
18+
editable,
1819
editorClassName,
1920
editorProps = {},
2021
embedHandler,
@@ -75,7 +76,7 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorProps) => {
7576
const editor = useEditor({
7677
disabledExtensions,
7778
id,
78-
onTransaction,
79+
editable,
7980
editorProps,
8081
editorClassName,
8182
enableHistory: false,
@@ -97,9 +98,10 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorProps) => {
9798
}),
9899
],
99100
fileHandler,
100-
handleEditorReady,
101101
forwardedRef,
102+
handleEditorReady,
102103
mentionHandler,
104+
onTransaction,
103105
placeholder,
104106
provider,
105107
tabIndex,

0 commit comments

Comments
 (0)