Compare commits

...
Author SHA1 Message Date
Philipinho 7d2a9c7785 add s3 max socket env 2026-08-01 11:43:05 +01:00
Philipinho 6f95c8438c tiptap v3.29.2 2026-08-01 11:34:00 +01:00
Philipinho 24534223be fix placeholder check 2026-08-01 11:33:25 +01:00
Philip Okugbe 70d2ff8685 fix: increase s3 client max socket limit (#2355) 2026-07-21 22:59:25 +01:00
Philipinho 0ba2d78660 chore: update pnpm and axios 2026-07-20 20:46:02 +01:00
Philip Okugbe 3ed505d2be fix: toolbar flicker on navigation (#2352) 2026-07-20 20:36:03 +01:00
11 changed files with 1294 additions and 1233 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
FROM node:26-slim AS base
LABEL org.opencontainers.image.source="https://github.com/docmost/docmost"
RUN npm install -g pnpm@11.13.0
RUN npm install -g pnpm@11.15.1
FROM base AS builder
+1 -1
View File
@@ -36,7 +36,7 @@
"@tanstack/react-table": "8.21.3",
"@tanstack/react-virtual": "3.14.3",
"alfaaz": "1.1.0",
"axios": "1.16.0",
"axios": "1.18.1",
"blueimp-load-image": "5.16.0",
"clsx": "2.1.1",
"file-saver": "2.0.5",
@@ -6,6 +6,7 @@
z-index: 99;
display: flex;
align-items: center;
min-height: 45px;
background: var(--mantine-color-body);
border-bottom: 1px solid
light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-4));
@@ -31,8 +31,6 @@ export const FixedToolbar: FC<FixedToolbarProps> = ({
const workspace = useAtomValue(workspaceAtom);
const isGenerativeAiEnabled = workspace?.settings?.ai?.generative === true;
if (!editor || !state) return null;
return (
<>
<div
@@ -49,22 +47,26 @@ export const FixedToolbar: FC<FixedToolbarProps> = ({
<div className={classes.divider} />
</>
)} */}
<BlockTypeGroup editor={editor} />
<div className={classes.divider} />
<InlineMarksGroup editor={editor} state={state} />
<div className={classes.divider} />
<ColorGroup editor={editor} />
<div className={classes.divider} />
<ListsGroup editor={editor} state={state} />
<div className={classes.divider} />
<AlignmentGroup editor={editor} />
<div className={classes.divider} />
<MediaGroup editor={editor} templateMode={templateMode} />
<div className={classes.divider} />
<QuickInsertsGroup editor={editor} />
<MoreInsertsGroup editor={editor} templateMode={templateMode} />
<div className={classes.divider} />
<HistoryGroup editor={editor} state={state} />
{editor && state && (
<>
<BlockTypeGroup editor={editor} />
<div className={classes.divider} />
<InlineMarksGroup editor={editor} state={state} />
<div className={classes.divider} />
<ColorGroup editor={editor} />
<div className={classes.divider} />
<ListsGroup editor={editor} state={state} />
<div className={classes.divider} />
<AlignmentGroup editor={editor} />
<div className={classes.divider} />
<MediaGroup editor={editor} templateMode={templateMode} />
<div className={classes.divider} />
<QuickInsertsGroup editor={editor} />
<MoreInsertsGroup editor={editor} templateMode={templateMode} />
<div className={classes.divider} />
<HistoryGroup editor={editor} state={state} />
</>
)}
</div>
</div>
<div className={classes.spacer} aria-hidden />
@@ -194,16 +194,18 @@ export const mainExtensions = [
return i18n.t("Toggle title");
}
if (node.type.name === "paragraph") {
const $pos = editor.state.doc.resolve(pos);
const parentName = $pos.parent.type.name;
if (
parentName === "column" ||
parentName === "tableCell" ||
parentName === "tableHeader" ||
parentName === "callout" ||
parentName === "blockquote"
) {
return i18n.t("Write...");
const doc = editor.state.doc;
if (pos >= 0 && pos <= doc.content.size) {
const parentName = doc.resolve(pos).parent.type.name;
if (
parentName === "column" ||
parentName === "tableCell" ||
parentName === "tableHeader" ||
parentName === "callout" ||
parentName === "blockquote"
) {
return i18n.t("Write...");
}
}
return i18n.t('Write anything. Enter "/" for commands');
}
@@ -2,6 +2,7 @@ import "@/features/editor/styles/index.css";
import React, {
useCallback,
useEffect,
useLayoutEffect,
useMemo,
useRef,
useState,
@@ -100,11 +101,13 @@ export default function PageEditor({
const { pageSlug } = useParams();
const slugId = extractPageSlugId(pageSlug);
const [socket] = useState(getCollabSocket);
const hasCollabToken = !!collabQuery?.token;
useEffect(() => {
if (!hasCollabToken) return;
acquireCollabSocket();
return () => releaseCollabSocket();
}, []);
}, [hasCollabToken]);
const handleStateless = ({ payload }: onStatelessParameters) => {
try {
@@ -322,6 +325,16 @@ function CollabPageEditor({
[pageId, editable, extensions],
);
useLayoutEffect(() => {
if (editor && !editor.isDestroyed) {
// @ts-ignore
setEditor(editor);
// @ts-ignore
editor.storage.pageId = pageId;
editorRef.current = editor;
}
}, [editor, pageId, setEditor]);
const editorIsEditable = useEditorState({
editor,
selector: (ctx) => {
@@ -15,13 +15,21 @@ import { getMimeType } from '../../../common/helpers';
import { Upload } from '@aws-sdk/lib-storage';
import { Logger } from '@nestjs/common';
const S3_MAX_SOCKETS = parseInt(process.env.AWS_S3_MAX_SOCKETS) || 200;
export class S3Driver implements StorageDriver {
private readonly s3Client: S3Client;
private readonly config: S3StorageConfig;
constructor(config: S3StorageConfig) {
this.config = config;
this.s3Client = new S3Client(config as any);
this.config = {
...config,
requestHandler: {
httpAgent: { maxSockets: S3_MAX_SOCKETS },
httpsAgent: { maxSockets: S3_MAX_SOCKETS },
},
};
this.s3Client = new S3Client(this.config as any);
}
async upload(filePath: string, file: Buffer | Readable): Promise<void> {
+29 -29
View File
@@ -31,34 +31,34 @@
"@joplin/turndown": "4.0.82",
"@joplin/turndown-plugin-gfm": "1.0.64",
"@sindresorhus/slugify": "3.0.0",
"@tiptap/core": "3.28.0",
"@tiptap/extension-audio": "3.28.0",
"@tiptap/extension-code-block": "3.28.0",
"@tiptap/extension-collaboration": "3.28.0",
"@tiptap/extension-collaboration-caret": "3.28.0",
"@tiptap/extension-color": "3.28.0",
"@tiptap/extension-document": "3.28.0",
"@tiptap/extension-heading": "3.28.0",
"@tiptap/extension-highlight": "3.28.0",
"@tiptap/extension-history": "3.28.0",
"@tiptap/extension-image": "3.28.0",
"@tiptap/extension-link": "3.28.0",
"@tiptap/extension-list": "3.28.0",
"@tiptap/extension-placeholder": "3.28.0",
"@tiptap/extension-subscript": "3.28.0",
"@tiptap/extension-superscript": "3.28.0",
"@tiptap/extension-table": "3.28.0",
"@tiptap/extension-text": "3.28.0",
"@tiptap/extension-text-align": "3.28.0",
"@tiptap/extension-text-style": "3.28.0",
"@tiptap/extension-typography": "3.28.0",
"@tiptap/extension-unique-id": "3.28.0",
"@tiptap/extension-youtube": "3.28.0",
"@tiptap/html": "3.28.0",
"@tiptap/pm": "3.28.0",
"@tiptap/react": "3.28.0",
"@tiptap/starter-kit": "3.28.0",
"@tiptap/suggestion": "3.28.0",
"@tiptap/core": "3.29.2",
"@tiptap/extension-audio": "3.29.2",
"@tiptap/extension-code-block": "3.29.2",
"@tiptap/extension-collaboration": "3.29.2",
"@tiptap/extension-collaboration-caret": "3.29.2",
"@tiptap/extension-color": "3.29.2",
"@tiptap/extension-document": "3.29.2",
"@tiptap/extension-heading": "3.29.2",
"@tiptap/extension-highlight": "3.29.2",
"@tiptap/extension-history": "3.29.2",
"@tiptap/extension-image": "3.29.2",
"@tiptap/extension-link": "3.29.2",
"@tiptap/extension-list": "3.29.2",
"@tiptap/extension-placeholder": "3.29.2",
"@tiptap/extension-subscript": "3.29.2",
"@tiptap/extension-superscript": "3.29.2",
"@tiptap/extension-table": "3.29.2",
"@tiptap/extension-text": "3.29.2",
"@tiptap/extension-text-align": "3.29.2",
"@tiptap/extension-text-style": "3.29.2",
"@tiptap/extension-typography": "3.29.2",
"@tiptap/extension-unique-id": "3.29.2",
"@tiptap/extension-youtube": "3.29.2",
"@tiptap/html": "3.29.2",
"@tiptap/pm": "3.29.2",
"@tiptap/react": "3.29.2",
"@tiptap/starter-kit": "3.29.2",
"@tiptap/suggestion": "3.29.2",
"@tiptap/y-tiptap": "3.0.7",
"bytes": "3.1.2",
"cross-env": "10.1.0",
@@ -95,5 +95,5 @@
"packages/*"
]
},
"packageManager": "pnpm@11.13.0"
"packageManager": "pnpm@11.15.1"
}
+1203 -1168
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -36,7 +36,7 @@ overrides:
brace-expansion@^5: 5.0.6
'@xmldom/xmldom': 0.8.13
handlebars: 4.7.9
axios: 1.16.0
axios: 1.18.1
langsmith: 0.7.0
follow-redirects: 1.16.0
protobufjs: 7.5.8
@@ -54,7 +54,7 @@ overrides:
js-yaml@>=3.0.0 <3.15.0: 3.15.0
js-yaml@>=4.0.0 <=4.1.1: 4.3.0
shamefullyHoist: true
minimumReleaseAge: 5760
minimumReleaseAge: 4320
allowBuilds:
'@swc/core': true
bcrypt: true