diff --git a/.vscode/launch.json b/.vscode/launch.json index 19b7ded133..ff8799e72d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -153,7 +153,7 @@ "type": "node", "request": "launch", "args": [ - "src/index.ts" + "src/__start.ts" ], "env": { "SECRET": "secret", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 5f5e5c231a..f8929aaf1e 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -295,7 +295,7 @@ specifiers: mime-types: ~2.1.34 mini-css-extract-plugin: ^2.2.0 minio: ^7.0.26 - mongodb: ^4.9.0 + mongodb: ^4.11.0 pdfkit: ~0.13.0 postcss: ^8.3.4 postcss-load-config: ^3.1.0 @@ -332,6 +332,7 @@ specifiers: webpack-dev-server: ^4.7.4 ws: ^8.10.0 xml2js: ~0.4.23 + y-prosemirror: 1.0.20 y-protocols: ~1.0.5 y-websocket: ^1.4.5 yjs: ^13.5.42 @@ -668,6 +669,7 @@ dependencies: webpack-dev-server: 4.11.1_78c1cd1c404fc7ed0a3af68b1f6f4aa1 ws: 8.11.0 xml2js: 0.4.23 + y-prosemirror: 1.0.20_3b523a098b7386dd759c4c2b4e06fb42 y-protocols: 1.0.5 y-websocket: 1.4.5_yjs@13.5.42 yjs: 13.5.42 @@ -11137,7 +11139,7 @@ packages: dev: false file:projects/account.tgz: - resolution: {integrity: sha512-8yjt4NrdmP1f+lfABJvi/UMWdJyh7o5ozzLsBxAOoNPPJdv2hfWGkQRlaix24WJY69UMXug587gbLi8kvl1JDQ==, tarball: file:projects/account.tgz} + resolution: {integrity: sha512-eATySKTuYgYy7bhtyRcIqpHJwH5XNAhrGqfb7xytdE+Mou2AEV6I7s8LtFWLFGnXUJQEakfNk3sPTLtORivw+w==, tarball: file:projects/account.tgz} name: '@rush-temp/account' version: 0.0.0 dependencies: @@ -11818,7 +11820,7 @@ packages: dev: false file:projects/dev-account.tgz: - resolution: {integrity: sha512-hwScHxHPdx48SHu+nFqc3XRvNabSYK6jL9xUc8uXxgRjkxI5jwqe6EAPczHdFo0KzPSivFP0WEpjaMkUDzH4WQ==, tarball: file:projects/dev-account.tgz} + resolution: {integrity: sha512-wgzK5UaTPJua2WnS9J1gbpsCPZcR+OZn+1Lotkjc8fojELP8HbT8MHwNHTYEx14nPO8cYUFGgMwSKMLYeIOkRA==, tarball: file:projects/dev-account.tgz} name: '@rush-temp/dev-account' version: 0.0.0 dependencies: @@ -12064,7 +12066,7 @@ packages: dev: false file:projects/front.tgz: - resolution: {integrity: sha512-leV9tNxFFE/Z/vwbqsNGdp5OE8DaditWbMLnToMBAinA9vFc3qQi4y8zx2MX4Ohn0D/D0Xymha3xE/9mvXeUTw==, tarball: file:projects/front.tgz} + resolution: {integrity: sha512-hjAySYAWM8LKqnfBRXxesUumH6MmZEbazSbEYp4s67um6rGUATr9kUAppfHm2VCuI2WWTmSn52catVFQhRNCqg==, tarball: file:projects/front.tgz} name: '@rush-temp/front' version: 0.0.0 dependencies: @@ -12105,7 +12107,7 @@ packages: dev: false file:projects/generator.tgz: - resolution: {integrity: sha512-knz6FRYXSNtm1MU/tTKpG1PwQvePi1uaNqNwKmWRURDg/59PESdFMQadueRbIdgJJ15tlJU4ki8yCHmO6l+n0Q==, tarball: file:projects/generator.tgz} + resolution: {integrity: sha512-GBIEqPVyMK0nBCG6rFfwmnXuusGg+6R1xHEUp4Q/6aweSkb1mjz5FeycHN2zGs9j45RYwisAwmZCkFICUOaaNQ==, tarball: file:projects/generator.tgz} name: '@rush-temp/generator' version: 0.0.0 dependencies: @@ -12638,7 +12640,7 @@ packages: dev: false file:projects/minio.tgz: - resolution: {integrity: sha512-VoxVx9EB3UAH22AGrPedW7GCOMvELT35uTIjYoJM91wAg2AeN2yJBTpgoStYCZVIWT9kmCbgGE6+L2Vi0PT7fA==, tarball: file:projects/minio.tgz} + resolution: {integrity: sha512-Q7+heaBlBIIsy/JvFJpRnEjwq5dmItX2YK/ID98hd6C/Vaix0DUvwc5VuSadDNC/ugonds1KIfkGqm16mPgiCA==, tarball: file:projects/minio.tgz} name: '@rush-temp/minio' version: 0.0.0 dependencies: @@ -13633,7 +13635,7 @@ packages: dev: false file:projects/mongo.tgz: - resolution: {integrity: sha512-b5/QncRlKkm/JFot8N/JPXLYjKjKTkBIh8g0tS4PWkA/ENdCIDulcpmvi1Q6UM+ZhP6uSGr08JHnVpPmPPj46g==, tarball: file:projects/mongo.tgz} + resolution: {integrity: sha512-Td9qjRbNnbet8a7jMYOTEgaHPL5B6L01ny0wolWKPXtGJMcOD9vkWdC+UJuCJ1OSbMv6vo7hOqXdQXocn5G4Cw==, tarball: file:projects/mongo.tgz} name: '@rush-temp/mongo' version: 0.0.0 dependencies: @@ -13831,7 +13833,7 @@ packages: dev: false file:projects/pod-account.tgz: - resolution: {integrity: sha512-n507oMGA9w0oyJHDG4Ct65c2q/reFMbeOYkqd8GLrV15ggrNObeMt21vKuGmNzcoa275qIUeUdOY5xbDuR4FQg==, tarball: file:projects/pod-account.tgz} + resolution: {integrity: sha512-57U5JccEZbAk81q+pwaLqNK7VJAF+soBtVsIVRdKgnlgSuI/zjSVEXyKJT7OyXCQPsrJ4fR/TpP8c+JoLaenDg==, tarball: file:projects/pod-account.tgz} name: '@rush-temp/pod-account' version: 0.0.0 dependencies: @@ -13867,7 +13869,7 @@ packages: dev: false file:projects/pod-backup.tgz: - resolution: {integrity: sha512-lNuroyMRN27WmKY8SOxXDi4crPhzNhS10u4XL6D3LHtip2b3tebu04AdGVloiUOHdKjufcVzGqGQ33ZL/976QA==, tarball: file:projects/pod-backup.tgz} + resolution: {integrity: sha512-Olz5vF5waH9Hbb3l39zF4DvevJeCxykLR41PzrVb2CYmfvrF8i34V7HvJ2dXzxUXm+EClkbj31S02adwyfT7kA==, tarball: file:projects/pod-backup.tgz} name: '@rush-temp/pod-backup' version: 0.0.0 dependencies: @@ -13899,7 +13901,7 @@ packages: dev: false file:projects/pod-collaborator.tgz: - resolution: {integrity: sha512-WF2SZB/a+C7SK3N3gC0rKcFvdEy6NSFYTUnY1Xv8fjanS/d0VEjpmEjpgyCBvRy7B9fKSMIN90yrkhf6F1p/uA==, tarball: file:projects/pod-collaborator.tgz} + resolution: {integrity: sha512-FM+/tmFMqqJpRV8nfJ3f2Cuz7sLrApZ7I9fpIjB3yPcLwA/UawwR6ew/zBQMEdazCbe6s/NjNBETquptO8f7lg==, tarball: file:projects/pod-collaborator.tgz} name: '@rush-temp/pod-collaborator' version: 0.0.0 dependencies: @@ -13935,7 +13937,7 @@ packages: dev: false file:projects/pod-front.tgz: - resolution: {integrity: sha512-QDIGhzVOhCUdd122OEVtsi7ELilODbEDWKSr78OTdHelqV8CcsgWIWU8RsYBIqAAIIMRoyu1rXQqDzEgwYfSpw==, tarball: file:projects/pod-front.tgz} + resolution: {integrity: sha512-oxfotaMR88yF2NtkdbtsEvYVCe+GdtuaqvKrEtDMZlk2gcEMCZge1tWTES+HSIxHtWB4pIH1kfzirk+v7eB5Jw==, tarball: file:projects/pod-front.tgz} name: '@rush-temp/pod-front' version: 0.0.0 dependencies: @@ -13977,7 +13979,7 @@ packages: dev: false file:projects/pod-server.tgz: - resolution: {integrity: sha512-IpXQo5LRXdiCB4ir/T+i+qWMhCaYaHSiGnrE+w7QYf85tS1NmhNS2PWEvU0CTwQYlTiD5e7PNgok6orsU8pexQ==, tarball: file:projects/pod-server.tgz} + resolution: {integrity: sha512-rfkv0eygy8Jmv8uw2KEdIfuP0TrGIgXAIUv6Y/uUn/lvPQR9FBCuDfZ9/sEJW1d7MRaBLeFkmVr0xzivBYZHZA==, tarball: file:projects/pod-server.tgz} name: '@rush-temp/pod-server' version: 0.0.0 dependencies: @@ -14295,7 +14297,7 @@ packages: dev: false file:projects/server-backup.tgz: - resolution: {integrity: sha512-snkRz4+41T/IJEpLmAnc9lUqo+K1xa0jkpcB5wdg1YSG+XQupGOuJ4Lu6V63+KrHEbWpircaTNL9gFEHQsWl5w==, tarball: file:projects/server-backup.tgz} + resolution: {integrity: sha512-RCwlP7QyaEr5W6rpqf8/cTOR7cH56704M5+w5ZRbX28SrTWoeFssfEmYMEuqLVxQvVcwSySq5wGegV/VHrwSVQ==, tarball: file:projects/server-backup.tgz} name: '@rush-temp/server-backup' version: 0.0.0 dependencies: @@ -14402,7 +14404,7 @@ packages: dev: false file:projects/server-contact-resources.tgz: - resolution: {integrity: sha512-RmqLUSQSZYSc1UFyU0RmZ7b7IBMT0rrbF3B1KpGcnFbu+sduTPW5byef5DnRLIDX2YlNvejYsfXssBCNk0LU/w==, tarball: file:projects/server-contact-resources.tgz} + resolution: {integrity: sha512-kqkkjCxfo3L3lB6yzXWlGedWYGyi31TQcKR0ZIqYxZxakeB7zUTxSfayEGIxxRvIeJ8K2fXtnkwjk5AbaRKi7Q==, tarball: file:projects/server-contact-resources.tgz} name: '@rush-temp/server-contact-resources' version: 0.0.0 dependencies: @@ -14443,7 +14445,7 @@ packages: dev: false file:projects/server-core.tgz: - resolution: {integrity: sha512-CihDLjYbiz3luqKzAoF181km4CZxkxqVzQoxaJ24YPgvv4Fw0ztT3o1fw3f/68mNya4DbE9lrKvETKL3jeLpmw==, tarball: file:projects/server-core.tgz} + resolution: {integrity: sha512-dBZNtVbslOApBtMTuf+X50jpjLsCoLmPje51lAr6UgKIaeL9kjhaVWz9AjNA6bCQgBBM+MYe6fbRIPaXCCfmEA==, tarball: file:projects/server-core.tgz} name: '@rush-temp/server-core' version: 0.0.0 dependencies: @@ -14897,7 +14899,7 @@ packages: dev: false file:projects/server-token.tgz: - resolution: {integrity: sha512-2obpSEchu1xIse/mgmk2GLor2XtUmF+1CULwme1I1T1ZU50nPcpu8AZrOO7cGK9d34CTJonLDk+wscGA4pt4hQ==, tarball: file:projects/server-token.tgz} + resolution: {integrity: sha512-8KGPm5Wes48jUlz/RyGE3rIsQ8nd8S4otlVnZvUB8x1hSRtMngc1DNQVmgCy3iUwNYuyN9w7r0zZN7c3F+Vn5Q==, tarball: file:projects/server-token.tgz} name: '@rush-temp/server-token' version: 0.0.0 dependencies: @@ -14921,7 +14923,7 @@ packages: dev: false file:projects/server-tool.tgz: - resolution: {integrity: sha512-VxPpII/+/u5gj40wFyU/wiV9EevgwadwNF3FFZGsnG4SJmWf34aSvvH4Cz8WilEAzeA4LXlUS20stY+9hFFycg==, tarball: file:projects/server-tool.tgz} + resolution: {integrity: sha512-Xm9jJEzgWPgN4FefhPDKMv6MYMW7vAfW74FQ1E3xyli3zNW6UiZje+y46ooDu1MREOFyfTYyIAJkhAx7r1lBdw==, tarball: file:projects/server-tool.tgz} name: '@rush-temp/server-tool' version: 0.0.0 dependencies: @@ -15015,7 +15017,7 @@ packages: dev: false file:projects/server.tgz: - resolution: {integrity: sha512-1BkV1SV80DpRxzAKpNIcL0yHhybay4GRjjaMU8QGD4PipOn6rO3u0x/iELRA8hHnPJzFDZQcqI2/+hm5h5buGQ==, tarball: file:projects/server.tgz} + resolution: {integrity: sha512-L3P1x5JppF1RTeUhn+oM9/8Udx33+C5rKVu3he3DWjbXd5XTvfY8XsiSkZwoBTsYlXsevTZnd5aYA8ZjqPmGRQ==, tarball: file:projects/server.tgz} name: '@rush-temp/server' version: 0.0.0 dependencies: @@ -15451,7 +15453,7 @@ packages: dev: false file:projects/text-editor.tgz_89204ec304a9fe9c91bbfc5394a172bd: - resolution: {integrity: sha512-jGIekdEoT82BTFc4UVhbLOuQZJkVp4NSb7P3DOw5JJwJ0KvuU0mQZcA7AGKTI7eAuPBG6xjtFR2f4ykt+QcjmA==, tarball: file:projects/text-editor.tgz} + resolution: {integrity: sha512-y/a6ITp7adtktGttSf9Fqvxz60+EN3SPpWK/KLeezMmTVdeejIBiNYSsMnJGjWhuJ8PV3WDQVLsbXSRZBwAwLA==, tarball: file:projects/text-editor.tgz} id: file:projects/text-editor.tgz name: '@rush-temp/text-editor' version: 0.0.0 @@ -15501,6 +15503,7 @@ packages: svelte-loader: 3.1.4_svelte@3.53.1 svelte-preprocess: 4.10.7_1cd24d71cb02643c0a6ca17ff2edd158 typescript: 4.8.4 + y-prosemirror: 1.0.20_3b523a098b7386dd759c4c2b4e06fb42 y-websocket: 1.4.5_yjs@13.5.42 yjs: 13.5.42 transitivePeerDependencies: @@ -15553,7 +15556,7 @@ packages: dev: false file:projects/tool.tgz: - resolution: {integrity: sha512-lPQdPlcd6ajld4cEO1nodKIc4avevkjqB1qAYMfrLfN9X+F7WWv+bf3r0OLkDpXurUiufMgCo/KAMhypIeLdJw==, tarball: file:projects/tool.tgz} + resolution: {integrity: sha512-zhdyLwe6Bv8T3Pnby/tdJxQZljdHmJqT6w5qBnF+TyoOEPknKxbheB/I/u6IOSq3IJn5ti12Nz02IBReeEsnWQ==, tarball: file:projects/tool.tgz} name: '@rush-temp/tool' version: 0.0.0 dependencies: @@ -15621,7 +15624,7 @@ packages: dev: false file:projects/tracker-resources.tgz_49b4785992daa3b61a639b2b31601e76: - resolution: {integrity: sha512-mAMoLXcGbvCBFiy0w3I2qDd//xQHlzzNsjkDY9h/xREiAzkdzgusZNu6J/tlYEK0gJGKKXki46a1sH9dBNgIzQ==, tarball: file:projects/tracker-resources.tgz} + resolution: {integrity: sha512-ZY4HQHk3DoAHrswKl30DwbWhgun3qmqwN4L4fiG/iu7P0hnKNQpFO9XGgyZrarteHamCj2LayFuhQM/eTU5IQw==, tarball: file:projects/tracker-resources.tgz} id: file:projects/tracker-resources.tgz name: '@rush-temp/tracker-resources' version: 0.0.0 diff --git a/packages/panel/src/components/Panel.svelte b/packages/panel/src/components/Panel.svelte index facc6119bd..4e6259e40a 100644 --- a/packages/panel/src/components/Panel.svelte +++ b/packages/panel/src/components/Panel.svelte @@ -35,6 +35,7 @@ export let isAside: boolean = true export let isCustomAttr: boolean = true export let floatAside = false + export let allowClose = true diff --git a/packages/text-editor/package.json b/packages/text-editor/package.json index 822a84a8be..993718df6b 100644 --- a/packages/text-editor/package.json +++ b/packages/text-editor/package.json @@ -55,6 +55,7 @@ "prosemirror-transform": "~1.7.0", "yjs": "^13.5.42", "y-websocket": "^1.4.5", + "y-prosemirror": "1.0.20", "prosemirror-changeset": "~2.2.0", "prosemirror-model": "~1.18.1", "prosemirror-view": "~1.29.0", diff --git a/packages/text-editor/src/components/Collaboration.svelte b/packages/text-editor/src/components/Collaboration.svelte new file mode 100644 index 0000000000..d34843d842 --- /dev/null +++ b/packages/text-editor/src/components/Collaboration.svelte @@ -0,0 +1,61 @@ + + + +{#key _documentId} + +{/key} diff --git a/packages/text-editor/src/components/CollaborationDiffViewer.svelte b/packages/text-editor/src/components/CollaborationDiffViewer.svelte index 2358b89048..eeacc16076 100644 --- a/packages/text-editor/src/components/CollaborationDiffViewer.svelte +++ b/packages/text-editor/src/components/CollaborationDiffViewer.svelte @@ -124,7 +124,8 @@ .ProseMirror { flex-grow: 1; overflow: auto; - max-height: 60vh; + min-height: 3rem; + max-height: inherit !important; outline: none; line-height: 150%; color: var(--accent-color); diff --git a/packages/text-editor/src/components/CollaboratorEditor.svelte b/packages/text-editor/src/components/CollaboratorEditor.svelte index b73c326714..994fcbb646 100644 --- a/packages/text-editor/src/components/CollaboratorEditor.svelte +++ b/packages/text-editor/src/components/CollaboratorEditor.svelte @@ -37,7 +37,7 @@ import { DecorationSet } from 'prosemirror-view' import textEditorPlugin from '../plugin' - import { FormatMode, FORMAT_MODES } from '../types' + import { CollaborationIds, FormatMode, FORMAT_MODES } from '../types' import Bold from './icons/Bold.svelte' import Code from './icons/Code.svelte' import CodeBlock from './icons/CodeBlock.svelte' @@ -61,32 +61,41 @@ import DeleteRow from './icons/table/DeleteRow.svelte' import DeleteCol from './icons/table/DeleteCol.svelte' import DeleteTable from './icons/table/DeleteTable.svelte' + import { getContext } from 'svelte' export let documentId: string export let readonly = false export let token: string export let collaboratorURL: string + export let isFormatting = true export let buttonSize: IconSize = 'small' export let focusable: boolean = false export let placeholder: IntlString = textEditorPlugin.string.EditorPlaceholder export let initialContentId: string | undefined = undefined - export let suggestMode = false - export let comparedVersion: Markup | undefined = undefined + // export let suggestMode = false + export let comparedVersion: Markup | ArrayBuffer | undefined = undefined - const ydoc = new Y.Doc() - const wsProvider = new WebsocketProvider(collaboratorURL, documentId, ydoc, { - params: { - token, - documentId, - initialContentId: initialContentId ?? '' - } - }) + export let field: string | undefined = undefined - wsProvider.on('status', (event: any) => { - console.log(documentId, event.status) // logs "connected" or "disconnected" - }) + const ydoc = (getContext(CollaborationIds.Doc) as Y.Doc | undefined) ?? new Y.Doc() + const contextProvider = getContext(CollaborationIds.Provider) as WebsocketProvider | undefined + const wsProvider = + contextProvider ?? + new WebsocketProvider(collaboratorURL, documentId, ydoc, { + params: { + token, + documentId, + initialContentId: initialContentId ?? '' + } + }) + + if (contextProvider === undefined) { + wsProvider?.on('status', (event: any) => { + console.log(documentId, event.status) // logs "connected" or "disconnected" + }) + } const currentUser = getCurrentAccount() as EmployeeAccount @@ -173,8 +182,8 @@ let _decoration = DecorationSet.empty let oldContent = '' - function updateEditor (editor?: Editor, comparedVersion?: Markup): void { - const r = calculateDecorations(editor, oldContent, comparedVersion) + function updateEditor (editor?: Editor, field?: string, comparedVersion?: Markup | ArrayBuffer): void { + const r = calculateDecorations(editor, oldContent, field, comparedVersion) if (r !== undefined) { oldContent = r.oldContent _decoration = r.decorations @@ -183,7 +192,7 @@ const updateDecorations = () => { if (editor && editor.schema) { - updateEditor(editor, comparedVersion) + updateEditor(editor, field, comparedVersion) } } @@ -206,7 +215,7 @@ } }) - $: updateEditor(editor, comparedVersion) + $: updateEditor(editor, field, comparedVersion) onMount(() => { ph.then(() => { @@ -219,7 +228,8 @@ Placeholder.configure({ placeholder: placeHolderStr }), Collaboration.configure({ - document: ydoc + document: ydoc, + field }), CollaborationCursor.configure({ provider: wsProvider, @@ -256,8 +266,12 @@ onDestroy(() => { if (editor) { - editor.destroy() - wsProvider.disconnect() + try { + editor.destroy() + } catch (err: any) {} + if (contextProvider === undefined) { + wsProvider.disconnect() + } } }) @@ -573,8 +587,8 @@