|
|
@ -145,6 +145,15 @@ define([
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Seletc all text of a contenteditable element
|
|
|
|
|
|
|
|
var selectAll = function (element) {
|
|
|
|
|
|
|
|
var selection = window.getSelection();
|
|
|
|
|
|
|
|
var range = document.createRange();
|
|
|
|
|
|
|
|
range.selectNodeContents(element);
|
|
|
|
|
|
|
|
selection.removeAllRanges();
|
|
|
|
|
|
|
|
selection.addRange(range);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Messages.comments_deleted = "Comment deleted by its author"; // XXX
|
|
|
|
Messages.comments_deleted = "Comment deleted by its author"; // XXX
|
|
|
|
Messages.comments_edited = "Edited"; // XXX
|
|
|
|
Messages.comments_edited = "Edited"; // XXX
|
|
|
|
Messages.comments_submit = "Submit"; // XXX
|
|
|
|
Messages.comments_submit = "Submit"; // XXX
|
|
|
@ -273,10 +282,11 @@ define([
|
|
|
|
|
|
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
setTimeout(function () {
|
|
|
|
$(textarea).focus();
|
|
|
|
$(textarea).focus();
|
|
|
|
|
|
|
|
selectAll(textarea);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return h('div.cp-comment-form' + (reply ? '.cp-comment-reply' : ''), {
|
|
|
|
return h('div.cp-comment-form' + (reply ? '.cp-comment-reply' : ''), {
|
|
|
|
'data-uid': reply || undefined
|
|
|
|
'data-uid': reply || ''
|
|
|
|
}, [
|
|
|
|
}, [
|
|
|
|
h('div.cp-comment-form-input', [
|
|
|
|
h('div.cp-comment-form-input', [
|
|
|
|
avatar,
|
|
|
|
avatar,
|
|
|
@ -290,12 +300,30 @@ define([
|
|
|
|
]);
|
|
|
|
]);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var isVisible = function (el, $container) {
|
|
|
|
|
|
|
|
var size = $container.outerHeight();
|
|
|
|
|
|
|
|
var pos = el.getBoundingClientRect();
|
|
|
|
|
|
|
|
return (pos.bottom < size) && (pos.y > 0);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var redrawComments = function (Env) {
|
|
|
|
var redrawComments = function (Env) {
|
|
|
|
// Don't redraw if there were no change
|
|
|
|
// Don't redraw if there were no change
|
|
|
|
var str = Sortify(Env.comments || {});
|
|
|
|
var str = Sortify(Env.comments || {});
|
|
|
|
if (str === Env.oldComments) { return; }
|
|
|
|
if (str === Env.oldComments) { return; }
|
|
|
|
Env.oldComments = str;
|
|
|
|
Env.oldComments = str;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Store the cursor position if it's located in this form
|
|
|
|
|
|
|
|
var oldSelection = window.getSelection();
|
|
|
|
|
|
|
|
var oldRangeObj;
|
|
|
|
|
|
|
|
if ($(oldSelection.anchorNode).closest('.cp-comment-form').length) {
|
|
|
|
|
|
|
|
oldRange = oldSelection.getRangeAt && oldSelection.getRangeAt(0);
|
|
|
|
|
|
|
|
oldRangeObj = {
|
|
|
|
|
|
|
|
start: oldRange.startContainer,
|
|
|
|
|
|
|
|
startO: oldRange.startOffset,
|
|
|
|
|
|
|
|
end: oldRange.endContainer,
|
|
|
|
|
|
|
|
endO: oldRange.endOffset
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
// Store existing input form in memory
|
|
|
|
// Store existing input form in memory
|
|
|
|
var $oldInput = Env.$container.find('.cp-comment-form').detach();
|
|
|
|
var $oldInput = Env.$container.find('.cp-comment-form').detach();
|
|
|
|
if ($oldInput.length !== 1) { $oldInput = undefined; }
|
|
|
|
if ($oldInput.length !== 1) { $oldInput = undefined; }
|
|
|
@ -562,21 +590,24 @@ define([
|
|
|
|
|
|
|
|
|
|
|
|
// Scroll into view
|
|
|
|
// Scroll into view
|
|
|
|
if (!$last.length) { return; }
|
|
|
|
if (!$last.length) { return; }
|
|
|
|
var size = Env.$inner.outerHeight();
|
|
|
|
var visible = isVisible($last[0], Env.$inner);
|
|
|
|
var pos = $last[0].getBoundingClientRect();
|
|
|
|
|
|
|
|
var visible = (pos.y + pos.height) < size;
|
|
|
|
|
|
|
|
if (!visible) { $last[0].scrollIntoView(); }
|
|
|
|
if (!visible) { $last[0].scrollIntoView(); }
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
$div.on('click focus', function (e) {
|
|
|
|
$div.on('click focus', function (e) {
|
|
|
|
|
|
|
|
// Prevent the click event to propagate if we're already selected
|
|
|
|
|
|
|
|
// The propagation to #cp-app-pad-inner would trigger the "unselect" handler
|
|
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
if ($div.hasClass('cp-comment-active')) { return; }
|
|
|
|
if ($div.hasClass('cp-comment-active')) { return; }
|
|
|
|
Env.$container.find('.cp-comment-active').removeClass('cp-comment-active');
|
|
|
|
Env.$container.find('.cp-comment-active').removeClass('cp-comment-active');
|
|
|
|
$div.addClass('cp-comment-active');
|
|
|
|
$div.addClass('cp-comment-active');
|
|
|
|
div.scrollIntoView();
|
|
|
|
|
|
|
|
$actions.css('display', '');
|
|
|
|
$actions.css('display', '');
|
|
|
|
Env.$container.find('.cp-comment-form').remove();
|
|
|
|
Env.$container.find('.cp-comment-form').remove();
|
|
|
|
|
|
|
|
|
|
|
|
focusContent();
|
|
|
|
focusContent();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var visible = isVisible(div, Env.$container);
|
|
|
|
|
|
|
|
if (!visible) { div.scrollIntoView(); }
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if ($oldInput && $oldInput.attr('data-uid') === key) {
|
|
|
|
if ($oldInput && $oldInput.attr('data-uid') === key) {
|
|
|
@ -588,6 +619,19 @@ define([
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Restore selection
|
|
|
|
|
|
|
|
if (oldRangeObj) {
|
|
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
|
|
if (!oldRangeObj) { return; }
|
|
|
|
|
|
|
|
var range = document.createRange();
|
|
|
|
|
|
|
|
range.setStart(oldRangeObj.start, oldRangeObj.startO);
|
|
|
|
|
|
|
|
range.setEnd(oldRangeObj.end, oldRangeObj.endO);
|
|
|
|
|
|
|
|
var sel = window.getSelection();
|
|
|
|
|
|
|
|
sel.removeAllRanges();
|
|
|
|
|
|
|
|
sel.addRange(range);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (show) {
|
|
|
|
if (show) {
|
|
|
|
Env.$container.show();
|
|
|
|
Env.$container.show();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -835,9 +879,11 @@ define([
|
|
|
|
|
|
|
|
|
|
|
|
// Unselect comment when clicking outside
|
|
|
|
// Unselect comment when clicking outside
|
|
|
|
$(window).click(function (e) {
|
|
|
|
$(window).click(function (e) {
|
|
|
|
if ($(e.target).closest('.cp-comment-container').length) {
|
|
|
|
var $target = $(e.target);
|
|
|
|
return;
|
|
|
|
if (!$target.length) { return; }
|
|
|
|
}
|
|
|
|
if ($target.is('.cp-comment-container')) { return; }
|
|
|
|
|
|
|
|
if ($target.closest('.cp-comment-container').length) { return; }
|
|
|
|
|
|
|
|
if ($target.closest('.ui-autocomplete').length) { return; }
|
|
|
|
// Add comment button? don't remove anything because this handler is called after
|
|
|
|
// Add comment button? don't remove anything because this handler is called after
|
|
|
|
// the button action
|
|
|
|
// the button action
|
|
|
|
if (e.target.classList.contains('cke_button__comment_icon')) { return; }
|
|
|
|
if (e.target.classList.contains('cke_button__comment_icon')) { return; }
|
|
|
|