From: Aleksander Ɓukasz Date: Wed, 6 Aug 2014 08:41:19 +0000 (+0200) Subject: editor: canvas - enter on an empty last list item creates paragraph after list X-Git-Url: https://git.mdrn.pl/fnpeditor.git/commitdiff_plain/5766035cdc88ebe92caab7af494e5e077235d5e0?hp=85b90b418f5ae3731455f3bdf7f65e7f17406c72 editor: canvas - enter on an empty last list item creates paragraph after list --- diff --git a/src/editor/modules/documentCanvas/canvas/keyboard.js b/src/editor/modules/documentCanvas/canvas/keyboard.js index 6b32da0..7ae6b27 100644 --- a/src/editor/modules/documentCanvas/canvas/keyboard.js +++ b/src/editor/modules/documentCanvas/canvas/keyboard.js @@ -348,6 +348,29 @@ var keyEventHandlers = [ } }, + { + applies: function(e, s) { + var parent = s.element && s.element.wlxmlNode.parent(), + parentIsItem = parent && parent.is('item'), + itemIsOnList = parent && parent.parent() && parent.parent().is('list'); + return s.type === 'caret' && e.key === KEYS.ENTER && s.element.isEmpty() && parentIsItem && itemIsOnList; + }, + run: function(e, s) { + var item = s.element.wlxmlNode.parent(), + list = item.parent(); + e.preventDefault(); + s.canvas.wlxmlDocument.transaction(function() { + var p = list.after({tagName: 'div', attrs: {'class': 'p'}}); + p.append({text: ''}); + item.detach(); + return p; + }, { + success: function(p) { + s.canvas.setCurrentElement(p); + } + }); + } + }, { applies: function(e, s) { return s.type === 'caret' && e.key === KEYS.ENTER && !s.element.parent().isRootElement(); diff --git a/src/editor/plugins/core/core.test.js b/src/editor/plugins/core/core.test.js index 00fc421..f227b67 100644 --- a/src/editor/plugins/core/core.test.js +++ b/src/editor/plugins/core/core.test.js @@ -700,6 +700,29 @@ describe('Keyboard interactions', function() { }); }); + describe('Enter on a list items', function() { + afterEach(removeCanvas); + + it('creates a paragraph after a list if hitting enter on the last and empty list item', function() { + var c = getCanvasFromXML('
item
'), + k = new Keyboard(c); + + k.withCaret('item|').press(K.ENTER).press(K.ENTER); + + var rootContents = c.wlxmlDocument.root.contents(); + expect(rootContents.length).to.equal(2); + expect(rootContents[0].is('list')).to.equal(true); + expect(rootContents[1].is('p')).to.equal(true); + + var list = rootContents[0]; + expect(list.contents().length).to.equal(1); + + var selection = c.getSelection(); + expect(selection.element.wlxmlNode.sameNode(rootContents[1].contents()[0])).to.equal(true); + expect(selection.offset).to.equal(0); + }); + }); + describe('Deleting text from a node', function() { it('deletes last character with backspace', function() { var c = getCanvasFromXML('
a
b
'),