Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stop operation in change()

Tags:

ckeditor5

Is there a way to stop an remove operation in model.document.on('change') ?

I listen to change with this code:

model.document.on('change',(eventInfo,batch) => {
// My code here.
}

And it works fine, in so far as I do get and can inspect all changes. But there does not appear to be any way to reject the change.

I tried to call eventInfo.stop() and reset() on the differ. Both of these methods does stop the change, but always later results in a model-nodelist-offset-out-of-bounds: exception if I try to stop a remove operation.

What I am trying to do is to change how text delete works, so when the user delete text, instead of really deleting the text from the editor, I create a marker which marks which text have been "deleted" by the user. (For optional change control).

like image 391
MTilsted Avatar asked Nov 30 '18 02:11

MTilsted


Video Answer


1 Answers

An operation that was already applied (and the change event is fired after operations are applied) cannot be silently removed. They need to be either reverted (by applying new operations which will revert the state of the model to the previous one) or prevented before they actually get applied.

Reverting operations

The most obvious but extremely poorly performing solution is to use setData(). That will, however, reset the selection and may cause other issues.

A far more optimal solution is to apply reversed operations for each applied operation that you want to revert. Think like in git – you cannot remove a commit (ok, you can, but you'd have to do a force push, so you don't). Instead, you apply a reversed commit.

CKEditor 5's operations allow getting their reversed conterparts. You can then apply those. However, you need to make sure that the state of the model is correct after you do that – this is tricky because when working on such a low level, you lose the normalization logic which is implemented in the model writer.

Another disadvantage of this solution is that you will end up with empty undo steps. Undo steps are defined by batches. If you'll add to a batch operations which revert those which are already in it, that batch will be an empty undo step. Currently, I don't know of a mechanism which would allow removing it from the history.

Therefore, while reverting operations is doable, it's tricky and may not work flawlessly at the moment.

Preventing applying operations

This is a solution that I'd recommend. Instead of fixing an already changed model, make sure that it doesn't change at all.

CKEditor 5 features are implemented in the form of commands. Commands have their isEnabled state. If a command is disabled, it cannot be executed.

In CKEditor 5 even features such as support for typing are implemented in the form of commands (input, delete and forwardDelete). Hence, preventing typing can be achieved by disabling these commands.

like image 128
Reinmar Avatar answered Sep 19 '22 18:09

Reinmar