Răsfoiți Sursa

Merge pull request #19547 from overleaf/jpa-move-v2-doc-versions

[overleaf-editor-core] keep v2DocVersions in-sync with fileMap

GitOrigin-RevId: 23491dfe51b71561837c96b8c550f75b0835a176
Jakob Ackermann 2 ani în urmă
părinte
comite
e43491a04f

+ 1 - 0
libraries/overleaf-editor-core/lib/snapshot.js

@@ -133,6 +133,7 @@ class Snapshot {
    */
   moveFile(pathname, newPathname) {
     this.fileMap.moveFile(pathname, newPathname)
+    if (this.v2DocVersions) this.v2DocVersions.moveFile(pathname, newPathname)
   }
 
   /**

+ 17 - 0
libraries/overleaf-editor-core/lib/v2_doc_versions.js

@@ -50,6 +50,23 @@ class V2DocVersions {
       _.assign(snapshot.v2DocVersions.data, this.data)
     }
   }
+
+  /**
+   * Move or remove a doc.
+   * Must be called after FileMap#moveFile, which validates the paths.
+   */
+  moveFile(pathname, newPathname) {
+    for (const [id, v] of Object.entries(this.data)) {
+      if (v.pathname !== pathname) continue
+
+      if (newPathname === '') {
+        delete this.data[id]
+      } else {
+        v.pathname = newPathname
+      }
+      break
+    }
+  }
 }
 
 module.exports = V2DocVersions

+ 22 - 0
libraries/overleaf-editor-core/test/move_file_operation.test.js

@@ -5,6 +5,9 @@ const ot = require('..')
 const File = ot.File
 const MoveFileOperation = ot.MoveFileOperation
 const Snapshot = ot.Snapshot
+const Operation = ot.Operation
+const V2DocVersions = ot.V2DocVersions
+const TextOperation = ot.TextOperation
 
 describe('MoveFileOperation', function () {
   function makeEmptySnapshot() {
@@ -39,4 +42,23 @@ describe('MoveFileOperation', function () {
     expect(snapshot.getFile('a').getContent()).to.equal('test: foo')
     expect(snapshot.getFile('bar').getContent()).to.equal('test: bar')
   })
+
+  it('should keep v2DocVersions in-sync', function () {
+    const snapshot = makeTwoFileSnapshot()
+    snapshot.setV2DocVersions(
+      V2DocVersions.fromRaw({
+        id1: { pathname: 'foo', v: 1 },
+        id2: { pathname: 'bar', v: 1 },
+      })
+    )
+    Operation.moveFile('foo', 'foo-after').applyTo(snapshot)
+    Operation.editFile(
+      'foo-after',
+      TextOperation.fromJSON({ textOperation: [9, 'edit'] })
+    ).applyTo(snapshot)
+    Operation.removeFile('bar').applyTo(snapshot)
+    expect(snapshot.getV2DocVersions().toRaw()).to.deep.equal({
+      id1: { pathname: 'foo-after', v: 1 },
+    })
+  })
 })