Skip to content

Commit e340463

Browse files
committed
🐛(frontend) fix versioning conflict
We switching from one version to the other, depending on the blocks inside, the version editor could crash due to conflicts between the different versions. We now reset the previous content when switching version to avoid these conflicts.
1 parent 344e9a8 commit e340463

File tree

4 files changed

+62
-15
lines changed

4 files changed

+62
-15
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ and this project adheres to
2626

2727
- 🐛(frontend) paste content with comments from another document #1732
2828
- 🐛(frontend) Select text + Go back one page crash the app #1733
29+
- 🐛(frontend) fix versioning conflict #1742
2930

3031

3132
## [4.1.0] - 2025-12-09

src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
mockedDocument,
77
verifyDocName,
88
} from './utils-common';
9+
import { openSuggestionMenu, writeInEditor } from './utils-editor';
910

1011
test.beforeEach(async ({ page }) => {
1112
await page.goto('/');
@@ -17,6 +18,7 @@ test.describe('Doc Version', () => {
1718

1819
await verifyDocName(page, randomDoc);
1920

21+
// Initially, there is no version
2022
await page.getByLabel('Open the document options').click();
2123
await page.getByRole('menuitem', { name: 'Version history' }).click();
2224
await expect(page.getByText('History', { exact: true })).toBeVisible();
@@ -26,31 +28,49 @@ test.describe('Doc Version', () => {
2628
await expect(panel).toBeVisible();
2729
await expect(modal.getByText('No versions')).toBeVisible();
2830

29-
const editor = page.locator('.ProseMirror');
3031
await modal.getByRole('button', { name: 'close' }).click();
31-
await editor.click();
32-
await page.keyboard.type('# Hello World');
3332

33+
await writeInEditor({ page, text: 'Hello World' });
34+
35+
// It will trigger a save, no version created yet (initial version is not counted)
3436
await goToGridDoc(page, {
3537
title: randomDoc,
3638
});
3739

38-
await expect(
39-
page.getByRole('heading', { name: 'Hello World' }),
40-
).toBeVisible();
40+
await expect(page.getByText('Hello World')).toBeVisible();
41+
42+
// Write more
43+
await writeInEditor({ page, text: 'It will create a version' });
44+
45+
await openSuggestionMenu({ page });
46+
await page.getByText('Add a callout block').click();
47+
48+
const calloutBlock = page
49+
.locator('div[data-content-type="callout"]')
50+
.first();
4151

42-
await page
43-
.locator('.ProseMirror .bn-block')
44-
.getByRole('heading', { name: 'Hello World' })
45-
.fill('It will create a version');
52+
await expect(calloutBlock).toBeVisible();
4653

54+
// It will trigger a save and create a version this time
4755
await goToGridDoc(page, {
4856
title: randomDoc,
4957
});
5058

5159
await expect(page.getByText('Hello World')).toBeHidden();
60+
await expect(page.getByText('It will create a version')).toBeVisible();
61+
62+
await expect(calloutBlock).toBeVisible();
63+
64+
// Write more
65+
await writeInEditor({ page, text: 'It will create a second version' });
66+
67+
// It will trigger a save and create a second version
68+
await goToGridDoc(page, {
69+
title: randomDoc,
70+
});
71+
5272
await expect(
53-
page.getByRole('heading', { name: 'It will create a version' }),
73+
page.getByText('It will create a second version'),
5474
).toBeVisible();
5575

5676
await page.getByLabel('Open the document options').click();
@@ -60,11 +80,33 @@ test.describe('Doc Version', () => {
6080
await expect(page.getByText('History', { exact: true })).toBeVisible();
6181
await expect(page.getByRole('status')).toBeHidden();
6282
const items = await panel.locator('.version-item').all();
63-
expect(items.length).toBe(1);
83+
expect(items.length).toBe(2);
84+
await items[1].click();
85+
86+
await expect(modal.getByText('Hello World')).toBeVisible();
87+
await expect(modal.getByText('It will create a version')).toBeHidden();
88+
await expect(
89+
modal.locator('div[data-content-type="callout"]').first(),
90+
).toBeHidden();
91+
6492
await items[0].click();
6593

94+
await expect(modal.getByText('Hello World')).toBeVisible();
95+
await expect(modal.getByText('It will create a version')).toBeVisible();
96+
await expect(
97+
modal.locator('div[data-content-type="callout"]').first(),
98+
).toBeVisible();
99+
await expect(
100+
modal.getByText('It will create a second version'),
101+
).toBeHidden();
102+
103+
await items[1].click();
104+
66105
await expect(modal.getByText('Hello World')).toBeVisible();
67106
await expect(modal.getByText('It will create a version')).toBeHidden();
107+
await expect(
108+
modal.locator('div[data-content-type="callout"]').first(),
109+
).toBeHidden();
68110
});
69111

70112
test('it does not display the doc versions if not allowed', async ({

src/frontend/apps/impress/src/features/docs/doc-versioning/api/useDocVersions.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ export function useDocVersionsInfiniteQuery(
7777
getNextPageParam(lastPage) {
7878
return lastPage.next_version_id_marker || undefined;
7979
},
80-
8180
...queryConfig,
8281
});
8382
}

src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,18 @@ export const DocVersionEditor = ({
3232
const { replace } = useRouter();
3333
const [initialContent, setInitialContent] = useState<Y.XmlFragment>();
3434

35+
// Reset initialContent when versionId changes to avoid conflicts between versions
3536
useEffect(() => {
36-
if (!version?.content) {
37+
setInitialContent(undefined);
38+
}, [versionId]);
39+
40+
useEffect(() => {
41+
if (!version?.content || isLoading || initialContent) {
3742
return;
3843
}
3944

4045
setInitialContent(base64ToBlocknoteXmlFragment(version.content));
41-
}, [version?.content]);
46+
}, [versionId, version?.content, isLoading, initialContent]);
4247

4348
if (isError && error) {
4449
if (error.status === 404) {

0 commit comments

Comments
 (0)