diff --git a/www/kanban/inner.js b/www/kanban/inner.js index fb3ed93c1..2b469cb3f 100644 --- a/www/kanban/inner.js +++ b/www/kanban/inner.js @@ -390,6 +390,75 @@ define([ $container.addClass('cp-app-readonly'); }); + var getSelectedElement = function () { + var node = document.getSelection().anchorNode; + return (node.nodeType === 3 ? node.parentNode : node); + }; + var getCursor = function () { + if (!kanban || !kanban.inEditMode) { return; } + try { + var el = getSelectedElement(); + var input = $(el).is('input') ? el : $(el).find('input')[0]; + var $item = $(el).closest('.kanban-item'); + + var pos = kanban.findElementPosition($item[0]); + var board = $item.closest('.kanban-board').attr('data-id'); + var val = ($(input).val && $(input).val()) || ''; + var start = input.selectionStart; + var end = input.selectionEnd; + + var boardEl = kanban.options.boards.find(function (b) { + return b.id === board; + }); + var oldVal = boardEl.item[pos] || {}; + + return { + board: board, + pos: pos, + value: val, + start: start, + end: end, + oldValue: oldVal.title + }; + } catch (e) { + return {}; + } + }; + var restoreCursor = function (data) { + try { + var boardEl = kanban.options.boards.find(function (b) { + return b.id === data.board; + }); + if (!boardEl) { return; } + + // An item was added: add a new item + if (!data.oldValue) { + var $board = $('.kanban-board[data-id="'+data.board+'"'); + $board.find('.kanban-title-button.fa-plus').click(); + var $newInput = $board.find('.kanban-item:last-child input'); + $newInput.val(data.value); + $newInput[0].selectionStart = data.start; + $newInput[0].selectionEnd = data.end; + return; + } + + // An item was edited: click on the correct item + var newVal = boardEl.item[data.pos]; + if (!newVal || newVal.title !== data.oldValue) { return; } + var $el = $('.kanban-board[data-id="' + data.board + '"]') + .find('.kanban-item:nth-child('+(data.pos + 1)+')'); + $el.find('.kanban-item-text').click(); + var $input = $el.find('input'); + if ($input.length) { + $input.val(data.value); + $input[0].selectionStart = data.start; + $input[0].selectionEnd = data.end; + } + } catch (e) { + return; + } + }; + framework.onContentUpdate(function (newContent) { // Init if needed if (!kanban) { @@ -404,11 +473,12 @@ define([ var remoteContent = newContent.content; if (Sortify(currentContent) !== Sortify(remoteContent)) { - // reinit kanban (TODO: optimize to diff only) + var cursor = getCursor(); verbose("Content is different.. Applying content"); kanban.setBoards(remoteContent); kanban.inEditMode = false; addRemoveItemButton(framework, kanban); + restoreCursor(cursor); } });