edit-order.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /* alt+left/right moves text in prompt */
  2. function keyupEditOrder(event) {
  3. if (!opts.keyedit_move) return;
  4. let target = event.originalTarget || event.composedPath()[0];
  5. if (!target.matches("*:is([id*='_toprow'] [id*='_prompt'], .prompt) textarea")) return;
  6. if (!event.altKey) return;
  7. let isLeft = event.key == "ArrowLeft";
  8. let isRight = event.key == "ArrowRight";
  9. if (!isLeft && !isRight) return;
  10. event.preventDefault();
  11. let selectionStart = target.selectionStart;
  12. let selectionEnd = target.selectionEnd;
  13. let text = target.value;
  14. let items = text.split(",");
  15. let indexStart = (text.slice(0, selectionStart).match(/,/g) || []).length;
  16. let indexEnd = (text.slice(0, selectionEnd).match(/,/g) || []).length;
  17. let range = indexEnd - indexStart + 1;
  18. if (isLeft && indexStart > 0) {
  19. items.splice(indexStart - 1, 0, ...items.splice(indexStart, range));
  20. target.value = items.join();
  21. target.selectionStart = items.slice(0, indexStart - 1).join().length + (indexStart == 1 ? 0 : 1);
  22. target.selectionEnd = items.slice(0, indexEnd).join().length;
  23. } else if (isRight && indexEnd < items.length - 1) {
  24. items.splice(indexStart + 1, 0, ...items.splice(indexStart, range));
  25. target.value = items.join();
  26. target.selectionStart = items.slice(0, indexStart + 1).join().length + 1;
  27. target.selectionEnd = items.slice(0, indexEnd + 2).join().length;
  28. }
  29. event.preventDefault();
  30. updateInput(target);
  31. }
  32. addEventListener('keydown', (event) => {
  33. keyupEditOrder(event);
  34. });