|
|
|
@ -466,67 +466,67 @@ define('forum/topic/postTools', [
|
|
|
|
|
warning.modal();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const selectionChangeFn = utils.debounce(selectionChange, 100);
|
|
|
|
|
|
|
|
|
|
function handleSelectionTooltip() {
|
|
|
|
|
hooks.onPage('action:posts.loaded', delayedTooltip);
|
|
|
|
|
|
|
|
|
|
$(document).off('mouseup', delayedTooltip).on('mouseup', delayedTooltip);
|
|
|
|
|
$(document).off('selectionchange', selectionChange).on('selectionchange', selectionChange);
|
|
|
|
|
$(document).off('selectionchange', selectionChangeFn).on('selectionchange', selectionChangeFn);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let selectionEmpty = true;
|
|
|
|
|
function selectionChange() {
|
|
|
|
|
selectionEmpty = window.getSelection().toString() === '';
|
|
|
|
|
const selectionEmpty = window.getSelection().toString() === '';
|
|
|
|
|
if (selectionEmpty) {
|
|
|
|
|
$('[component="selection/tooltip"]').addClass('hidden');
|
|
|
|
|
} else {
|
|
|
|
|
delayedTooltip();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function delayedTooltip() {
|
|
|
|
|
setTimeout(async function () {
|
|
|
|
|
let selectionTooltip = $('[component="selection/tooltip"]');
|
|
|
|
|
selectionTooltip.addClass('hidden');
|
|
|
|
|
if (selectionTooltip.attr('data-ajaxify') === '1') {
|
|
|
|
|
selectionTooltip.remove();
|
|
|
|
|
async function delayedTooltip() {
|
|
|
|
|
let selectionTooltip = $('[component="selection/tooltip"]');
|
|
|
|
|
selectionTooltip.addClass('hidden');
|
|
|
|
|
if (selectionTooltip.attr('data-ajaxify') === '1') {
|
|
|
|
|
selectionTooltip.remove();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const selection = window.getSelection();
|
|
|
|
|
if (selection.focusNode && selection.type === 'Range' && ajaxify.data.template.topic) {
|
|
|
|
|
const focusNode = $(selection.focusNode);
|
|
|
|
|
const anchorNode = $(selection.anchorNode);
|
|
|
|
|
const firstPid = anchorNode.parents('[data-pid]').attr('data-pid');
|
|
|
|
|
const lastPid = focusNode.parents('[data-pid]').attr('data-pid');
|
|
|
|
|
if (firstPid !== lastPid || !focusNode.parents('[component="post/content"]').length || !anchorNode.parents('[component="post/content"]').length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const postEl = focusNode.parents('[data-pid]');
|
|
|
|
|
const selectionRange = selection.getRangeAt(0);
|
|
|
|
|
if (!postEl.length || selectionRange.collapsed) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const rects = selectionRange.getClientRects();
|
|
|
|
|
const lastRect = rects[rects.length - 1];
|
|
|
|
|
|
|
|
|
|
const selection = window.getSelection();
|
|
|
|
|
if (selection.focusNode && selection.type === 'Range' && ajaxify.data.template.topic && !selectionEmpty) {
|
|
|
|
|
const focusNode = $(selection.focusNode);
|
|
|
|
|
const anchorNode = $(selection.anchorNode);
|
|
|
|
|
const firstPid = anchorNode.parents('[data-pid]').attr('data-pid');
|
|
|
|
|
const lastPid = focusNode.parents('[data-pid]').attr('data-pid');
|
|
|
|
|
if (firstPid !== lastPid || !focusNode.parents('[component="post/content"]').length || !anchorNode.parents('[component="post/content"]').length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const postEl = focusNode.parents('[data-pid]');
|
|
|
|
|
const selectionRange = selection.getRangeAt(0);
|
|
|
|
|
if (!postEl.length || selectionRange.collapsed) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const rects = selectionRange.getClientRects();
|
|
|
|
|
const lastRect = rects[rects.length - 1];
|
|
|
|
|
|
|
|
|
|
if (!selectionTooltip.length) {
|
|
|
|
|
selectionTooltip = await app.parseAndTranslate('partials/topic/selection-tooltip', ajaxify.data);
|
|
|
|
|
selectionTooltip.addClass('hidden').appendTo('body');
|
|
|
|
|
}
|
|
|
|
|
selectionTooltip.off('click').on('click', '[component="selection/tooltip/quote"]', function () {
|
|
|
|
|
selectionTooltip.addClass('hidden');
|
|
|
|
|
onQuoteClicked(postEl.find('[component="post/quote"]'), ajaxify.data.tid);
|
|
|
|
|
});
|
|
|
|
|
selectionTooltip.removeClass('hidden');
|
|
|
|
|
$(window).one('action:ajaxify.start', function () {
|
|
|
|
|
selectionTooltip.attr('data-ajaxify', 1).addClass('hidden');
|
|
|
|
|
$(document).off('selectionchange', selectionChange);
|
|
|
|
|
});
|
|
|
|
|
const tooltipWidth = selectionTooltip.outerWidth(true);
|
|
|
|
|
selectionTooltip.css({
|
|
|
|
|
top: lastRect.bottom + $(window).scrollTop(),
|
|
|
|
|
left: tooltipWidth > lastRect.width ? lastRect.left : lastRect.left + lastRect.width - tooltipWidth,
|
|
|
|
|
});
|
|
|
|
|
if (!selectionTooltip.length) {
|
|
|
|
|
selectionTooltip = await app.parseAndTranslate('partials/topic/selection-tooltip', ajaxify.data);
|
|
|
|
|
selectionTooltip.addClass('hidden').appendTo('body');
|
|
|
|
|
}
|
|
|
|
|
}, 0);
|
|
|
|
|
selectionTooltip.off('click').on('click', '[component="selection/tooltip/quote"]', function () {
|
|
|
|
|
selectionTooltip.addClass('hidden');
|
|
|
|
|
onQuoteClicked(postEl.find('[component="post/quote"]'), ajaxify.data.tid);
|
|
|
|
|
});
|
|
|
|
|
selectionTooltip.removeClass('hidden');
|
|
|
|
|
$(window).one('action:ajaxify.start', function () {
|
|
|
|
|
selectionTooltip.attr('data-ajaxify', 1).addClass('hidden');
|
|
|
|
|
$(document).off('selectionchange', selectionChangeFn);
|
|
|
|
|
});
|
|
|
|
|
const tooltipWidth = selectionTooltip.outerWidth(true);
|
|
|
|
|
selectionTooltip.css({
|
|
|
|
|
top: lastRect.bottom + $(window).scrollTop(),
|
|
|
|
|
left: tooltipWidth > lastRect.width ? lastRect.left : lastRect.left + lastRect.width - tooltipWidth,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return PostTools;
|
|
|
|
|