Merge pull request #18305 from overleaf/mj-add-comment-invert

[overleaf-editor-core] Make AddCommentOperation inversion restore state

GitOrigin-RevId: 5a47a2463e3650ba7a6b0a0f53c895fa6ec1b54c
This commit is contained in:
Mathias Jakobsen 2024-05-15 10:14:02 +01:00 committed by Copybot
parent 37bf30be2c
commit 478a6157cc
2 changed files with 89 additions and 18 deletions

View file

@ -55,11 +55,21 @@ class AddCommentOperation extends EditOperation {
}
/**
*
* @returns {DeleteCommentOperation}
* @inheritdoc
* @param {StringFileData} previousState
* @returns {EditOperation}
*/
invert() {
return new core.DeleteCommentOperation(this.commentId)
invert(previousState) {
const comment = previousState.comments.getComment(this.commentId)
if (!comment) {
return new core.DeleteCommentOperation(this.commentId)
}
return new core.AddCommentOperation(
comment.id,
comment.ranges.slice(),
comment.resolved
)
}
/**

View file

@ -44,21 +44,82 @@ describe('AddCommentOperation', function () {
])
})
it('should invert operation', function () {
const fileData = new StringFileData('abc')
const op = new AddCommentOperation('123', [new Range(0, 1)])
op.apply(fileData)
expect(fileData.getComments().toRaw()).to.eql([
{
id: '123',
ranges: [{ pos: 0, length: 1 }],
resolved: false,
},
])
describe('invert', function () {
it('should delete added comment', function () {
const initialFileData = new StringFileData('abc')
const fileData = StringFileData.fromRaw(initialFileData.toRaw())
const op = new AddCommentOperation('123', [new Range(0, 1)])
op.apply(fileData)
expect(fileData.getComments().toRaw()).to.eql([
{
id: '123',
ranges: [{ pos: 0, length: 1 }],
resolved: false,
},
])
const invertedOp = op.invert()
invertedOp.apply(fileData)
expect(fileData.getComments().toRaw()).to.eql([])
const invertedOp = op.invert(initialFileData)
invertedOp.apply(fileData)
expect(fileData.getComments().toRaw()).to.eql([])
})
it('should restore previous comment ranges', function () {
const initialComments = [
{
id: '123',
ranges: [{ pos: 0, length: 1 }],
resolved: false,
},
]
const initialFileData = new StringFileData(
'the quick brown fox jumps over the lazy dog',
initialComments
)
const fileData = StringFileData.fromRaw(initialFileData.toRaw())
const op = new AddCommentOperation('123', [new Range(12, 7)], true)
op.apply(fileData)
expect(fileData.getComments().toRaw()).to.eql([
{
id: '123',
ranges: [{ pos: 12, length: 7 }],
resolved: true,
},
])
const invertedOp = op.invert(initialFileData)
invertedOp.apply(fileData)
expect(fileData.getComments().toRaw()).to.deep.equal(initialComments)
})
it('should restore previous comment resolution status', function () {
const initialComments = [
{
id: '123',
ranges: [{ pos: 0, length: 1 }],
resolved: false,
},
]
const initialFileData = new StringFileData(
'the quick brown fox jumps over the lazy dog',
initialComments
)
const fileData = StringFileData.fromRaw(initialFileData.toRaw())
const op = new AddCommentOperation('123', [new Range(0, 1)], true)
op.apply(fileData)
expect(fileData.getComments().toRaw()).to.eql([
{
id: '123',
ranges: [{ pos: 0, length: 1 }],
resolved: true,
},
])
const invertedOp = op.invert(initialFileData)
invertedOp.apply(fileData)
expect(fileData.getComments().toRaw()).to.deep.equal(initialComments)
})
})
it('should compose with DeleteCommentOperation', function () {