48 lines
1.8 KiB
JavaScript
48 lines
1.8 KiB
JavaScript
import editorSvc from '../editorSvc';
|
|
import store from '../../store';
|
|
|
|
editorSvc.$on('inited', () => {
|
|
const getPreviewOffset = (elt) => {
|
|
let offset = 0;
|
|
if (!elt || elt === editorSvc.previewElt) {
|
|
return offset;
|
|
}
|
|
let { previousSibling } = elt;
|
|
while (previousSibling) {
|
|
offset += previousSibling.textContent.length;
|
|
({ previousSibling } = previousSibling);
|
|
}
|
|
return offset + getPreviewOffset(elt.parentNode);
|
|
};
|
|
|
|
editorSvc.previewElt.addEventListener('click', (evt) => {
|
|
if (evt.target.classList.contains('task-list-item-checkbox')) {
|
|
evt.preventDefault();
|
|
if (store.getters['content/isCurrentEditable']) {
|
|
const editorContent = editorSvc.clEditor.getContent();
|
|
// Use setTimeout to ensure evt.target.checked has the old value
|
|
setTimeout(() => {
|
|
// Make sure content has not changed
|
|
if (editorContent === editorSvc.clEditor.getContent()) {
|
|
const previewOffset = getPreviewOffset(evt.target);
|
|
const endOffset = editorSvc.getEditorOffset(previewOffset + 1);
|
|
if (endOffset != null) {
|
|
const startOffset = editorContent.lastIndexOf('\n', endOffset) + 1;
|
|
const line = editorContent.slice(startOffset, endOffset);
|
|
const match = line.match(/^([ \t]*(?:[*+-]|\d+\.)[ \t]+\[)[ xX](\] .*)/);
|
|
if (match) {
|
|
let newContent = editorContent.slice(0, startOffset);
|
|
newContent += match[1];
|
|
newContent += evt.target.checked ? ' ' : 'x';
|
|
newContent += match[2];
|
|
newContent += editorContent.slice(endOffset);
|
|
editorSvc.clEditor.setContent(newContent, true);
|
|
}
|
|
}
|
|
}
|
|
}, 10);
|
|
}
|
|
}
|
|
});
|
|
});
|