Browse Source

Disable delete on exception start.

Maciej Gołaszewski 6 years ago
parent
commit
2a23e426ca

+ 17 - 2
packages/ckeditor5-restricted-editing/src/restrictededitingediting.js

@@ -75,7 +75,7 @@ export default class RestrictedEditingEditing extends Plugin {
 			const marker = this._getMarker( editor, selection );
 
 			if ( isSelectionInExceptionMarker( marker, selection ) ) {
-				this._enableCommands();
+				this._enableCommands( marker );
 			} else {
 				this._disableCommands();
 			}
@@ -94,16 +94,31 @@ export default class RestrictedEditingEditing extends Plugin {
 		}
 	}
 
-	_enableCommands() {
+	_enableCommands( marker ) {
 		const editor = this.editor;
 
+		const exceptionDisable = [];
+
 		const commands = this._getCommandNamesToToggle( editor, this._allowedInException )
 			.filter( name => this._allowedInException.has( name ) )
+			.filter( name => {
+				if ( name == 'delete' && marker.getRange().start.isEqual( editor.model.document.selection.focus ) ) {
+					exceptionDisable.push( name );
+
+					return false;
+				}
+
+				return true;
+			} )
 			.map( name => editor.commands.get( name ) );
 
 		for ( const command of commands ) {
 			command.clearForceDisabled( 'RestrictedMode' );
 		}
+
+		for ( const command of exceptionDisable.map( name => editor.commands.get( name ) ) ) {
+			command.forceDisabled( 'RestrictedMode' );
+		}
 	}
 
 	_disableCommands() {

+ 93 - 0
packages/ckeditor5-restricted-editing/tests/restrictededitingediting.js

@@ -369,6 +369,99 @@ describe( 'RestrictedEditingEditing', () => {
 			} );
 		}
 
+		describe( 'delete', () => {
+			beforeEach( () => {
+				editor.commands.add( 'delete', buildFakeCommand( editor ) );
+			} );
+
+			it( 'should be disabled when caret is outside exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 1 );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.false;
+			} );
+
+			it( 'should be enabled when caret is inside exception marker (not touching boundaries)', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 5 );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be disabled when caret is inside exception marker (start boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 4 );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.false;
+			} );
+
+			it( 'should be enabled when caret is inside exception marker (end boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 7 );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be disabled for non-collapsed selection that expands over exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 0 ),
+						writer.createPositionAt( firstParagraph, 5 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.false;
+			} );
+
+			it( 'should be enabled for non-collapsed selection that is fully contained inside exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 5 ),
+						writer.createPositionAt( firstParagraph, 6 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled for non-collapsed selection inside exception marker (start position on marker boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 4 ),
+						writer.createPositionAt( firstParagraph, 6 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled for non-collapsed selection inside exception marker (end position on marker boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 5 ),
+						writer.createPositionAt( firstParagraph, 7 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled for non-collapsed selection is equal to exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 4 ),
+						writer.createPositionAt( firstParagraph, 7 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'delete' ).isEnabled ).to.be.true;
+			} );
+		} );
+
 		describe( 'other', () => {
 			beforeEach( () => {
 				editor.commands.add( 'other', buildFakeCommand( editor ) );