Przeglądaj źródła

Merge pull request #151 from crowi/fixed-unexpected-undo-behavior

Fixed unexpected undo behavior (temporary quick fix)
Sotaro KARASAWA 9 lat temu
rodzic
commit
b399a21d2d
1 zmienionych plików z 44 dodań i 6 usunięć
  1. 44 6
      resource/js/crowi-form.js

+ 44 - 6
resource/js/crowi-form.js

@@ -101,6 +101,39 @@ $(function() {
     crowi.clearDraft(pagePath);
   });
 
+  // This is a temporary implementation until porting to React.
+  var insertText = function(start, end, newText, mode) {
+    var editor = document.querySelector('#form-body');
+    mode = mode || 'after';
+
+    switch (mode) {
+    case 'before':
+      editor.setSelectionRange(start, start);
+      break;
+    case 'replace':
+      editor.setSelectionRange(start, end);
+      break;
+    case 'after':
+    default:
+      editor.setSelectionRange(end, end);
+    }
+
+    editor.focus();
+
+    var inserted = false;
+    try {
+      // Chrome, Safari
+      inserted = document.execCommand('insertText', false, newText);
+    } catch (e) {
+      inserted = false;
+    }
+
+    if (!inserted) {
+      // Firefox
+      editor.value = editor.value.substr(0, start) + newText + editor.value.substr(end);
+    }
+  };
+
   var getCurrentLine = function(event) {
     var $target = $(event.target);
 
@@ -220,7 +253,8 @@ $(function() {
           listMark = listMark.replace(/\s*\d+/, indent + (num +1));
         }
       }
-      $target.selection('insert', {text: "\n" + listMark, mode: 'before'});
+      //$target.selection('insert', {text: "\n" + listMark, mode: 'before'});
+      insertText(currentLine.start, currentLine.end, "\n" + listMark, 'after');
     } else if (currentLine.text.match(/^(\s*(?:-|\+|\*|\d+\.) )/)) {
       // remove list
       $target.selection('setPos', {start: currentLine.start, end: currentLine.end});
@@ -241,10 +275,12 @@ $(function() {
       }
       var prevLine = getPrevLine(event);
       if (!prevLine || (!currentLine.text.match(/---/) && !prevLine.text.match(/\|/g))) {
-        $target.selection('insert', {text: "\n" + row.join(' --- ') + "\n" + row.join('  '), mode: 'before'});
+        //$target.selection('insert', {text: "\n" + row.join(' --- ') + "\n" + row.join('  '), mode: 'before'});
+        insertText(currentLine.start, currentLine.end, "\n" + row.join(' --- ') + "\n" + row.join('  '), 'after');
         $target.selection('setPos', {start: currentLine.caret + 6 * row.length - 1, end: currentLine.caret + 6 * row.length - 1});
       } else {
-        $target.selection('insert', {text: "\n" + row.join('  '), mode: 'before'});
+        //$target.selection('insert', {text: "\n" + row.join('  '), mode: 'before'});
+        insertText(currentLine.start, currentLine.end, "\n" + row.join('  '), 'after');
         $target.selection('setPos', {start: currentLine.caret + 3, end: currentLine.caret + 3});
       }
     }
@@ -275,7 +311,8 @@ $(function() {
       var checkMark = (match[3] == ' ') ? 'x' : ' ';
       var replaceTo = match[1] + match[2] + ' [' + checkMark + '] ' + match[4];
       $target.selection('setPos', {start: currentLine.start, end: currentLine.end});
-      $target.selection('replace', {text: replaceTo, mode: 'keep'});
+      //$target.selection('replace', {text: replaceTo, mode: 'keep'});
+      insertText(currentLine.start, currentLine.end, replaceTo, 'replace');
       $target.selection('setPos', {start: currentLine.caret, end: currentLine.caret});
       $target.trigger('input');
     }
@@ -317,9 +354,10 @@ $(function() {
       }
     }
 
-    $target.selection('insert', {text: pasteText, mode: 'after'});
+    //$target.selection('insert', {text: pasteText, mode: 'after'});
+    insertText(currentLine.caret, currentLine.caret, pasteText, 'replace');
 
-    var newPos = currentLine.end + pasteText.length;
+    var newPos = currentLine.caret + pasteText.length;
     $target.selection('setPos', {start: newPos, end: newPos});
 
     return true;