met CSS-klassen, en de link zelf via de closure hieronder.
var content = ['
'];
$.each(shareActions, function (_, shareAction) {
var target = shareAction.label === 'Email' ? '' : ' target="_blank" rel="noopener noreferrer"';
content.push(
'
' +
'' +
''
);
});
content.push(
'
' +
'' +
''
);
content.push('
');
return content.join('');
}
function copyTextToClipboard(text, onSuccess, onError) {
if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
navigator.clipboard.writeText(text).then(onSuccess).catch(onError);
return;
}
var temporaryTextArea = $('
');
temporaryTextArea.css({
position: 'absolute',
left: '-9999px',
top: '0'
});
temporaryTextArea.val(text);
$('body').append(temporaryTextArea);
temporaryTextArea[0].select();
temporaryTextArea[0].setSelectionRange(0, 99999);
try {
var copySucceeded = document.execCommand('copy');
temporaryTextArea.remove();
if (copySucceeded) {
onSuccess();
} else {
onError();
}
} catch (error) {
temporaryTextArea.remove();
onError();
}
}
function showCopyFeedback($element, message) {
// Bewaar de hover-titel: Bootstrap verhuist "title" naar "data-original-title"
// en geeft die voorrang op de title-optie, waardoor de melding anders niet zichtbaar wordt.
var originalTitle = $element.attr('data-original-title') || $element.attr('title') || '';
$element.tooltip('destroy');
$element.tooltip({
title: message,
trigger: 'manual',
placement: 'bottom',
container: 'body'
});
$element.attr('data-original-title', message);
$element.tooltip('show');
setTimeout(function () {
$element.tooltip('hide');
$element.tooltip('destroy');
$element.removeAttr('data-original-title');
if (originalTitle) {
$element.attr('title', originalTitle);
}
}, 1000);
}
function enrichPrivateMessageForm(replyToId) {
var form = $('form[name="private_message"]');
$(form).find('input[name="replyToId"]').remove();
$(form).append('
');
}
/**
* Report a message
* @param element
* @param messageid
* @param reason
* @param event
*/
function reportMessage(element, messageid, reason, event) {
event.preventDefault();
if (sendReport == false) {
$.ajax({
url: $(element).attr("href"),
success: function (data) {
$(element).append('
Ok, gerapporteerd!');
}
});
}
sendReport = true;
}
/**
* Report a message
* @param element
* @param messageid
* @param reason
* @param event
*/
function reportMessageForWiki(element, messageid, event) {
event.preventDefault();
$.ajax({
url: $(element).attr("href"),
success: function (data) {
$(element).html("
OK, genomineerd");
$(element).addClass("disabled");
}
});
}
function renderThankButtonContent(thanked, count) {
var icon = "
";
if (thanked) {
return icon + " " + count;
}
return icon + "
Waardevol!";
}
/*
* Poll handlers. Top-level functions called from inline onclick= attributes, like every
* other action in this template -- NOT $(document).on(...) delegation: the desktop path
* re-injects this whole template with content.html(data) on every message you open, so a
* delegated handler would stack up and fire once per message you had already viewed.
*/
function pollChosenOptionIds($poll) {
return $poll.find('.poll-input:checked').map(function () {
return parseInt($(this).val(), 10);
}).get();
}
function sendPollVote($poll, $trigger, optionIds) {
if ($poll.attr('data-loading') === '1' || $poll.attr('data-closed') === '1') {
return;
}
$poll.attr('data-loading', '1');
$.ajax({
url: $poll.attr('data-vote-url'),
type: 'POST',
data: {optionIds: JSON.stringify(optionIds)},
success: function (data) {
renderPollResults($poll, data);
},
error: function (xhr) {
var message = (xhr.responseJSON && xhr.responseJSON.error) || 'Stemmen mislukt';
showCopyFeedback($trigger, message);
},
complete: function () {
$poll.attr('data-loading', '0');
}
});
}
function submitPollVote(element, event) {
event.preventDefault();
var $poll = $(element).closest('.poll');
var optionIds = pollChosenOptionIds($poll);
if (optionIds.length === 0) {
showCopyFeedback($(element), 'Kies eerst een antwoord');
return;
}
sendPollVote($poll, $(element), optionIds);
}
function withdrawPollVote(element, event) {
event.preventDefault();
// An empty set is how the endpoint spells "withdraw".
sendPollVote($(element).closest('.poll'), $(element), []);
}
function togglePollResults(element, event) {
event.preventDefault();
var $poll = $(element).closest('.poll');
$poll.toggleClass('poll--results').toggleClass('poll--voting');
setPollInputsEnabled($poll);
}
// The ballot is only live in the voting state. Leaving the radios clickable while the
// results are on screen looks like the poll is broken: the dot moves, nothing happens.
function setPollInputsEnabled($poll) {
var frozen = $poll.hasClass('poll--results') || $poll.attr('data-closed') === '1';
$poll.find('.poll-input').prop('disabled', frozen);
}
// No optimistic update here, unlike the thank button: one vote moves every percentage at
// once, and predicting that client-side costs more code than the latency is worth.
function renderPollResults($poll, data) {
$poll.attr('data-closed', data.closed ? '1' : '0');
$poll.removeClass('poll--voting').addClass('poll--results');
$.each(data.results, function (index, option) {
var $option = $poll.find('.poll-option[data-option-id="' + option.id + '"]');
$option.find('.poll-bar').css('width', option.percentage + '%');
$option.find('.poll-count').text(option.votes);
$option.find('.poll-percentage').text(option.percentage.toFixed(1).replace('.', ',') + '%');
$option.find('.poll-input').prop('checked', option.chosen);
$option.toggleClass('poll-option--chosen', option.chosen);
});
$poll.find('.poll-total').text(data.total);
setPollInputsEnabled($poll);
}
function thankUserForMessage(element, event) {
event.preventDefault();
var $button = $(element);
if ($button.hasClass('disabled') && $button.attr('data-loading') !== '1') {
return;
}
if ($button.attr('data-loading') === '1') {
return;
}
var wasDisabledBeforeRequest = $button.hasClass('disabled');
var previousThanked = parseInt($button.attr('data-thanked'), 10) === 1;
var previousCount = parseInt($button.attr('data-count'), 10);
if (isNaN(previousCount)) {
previousCount = 0;
}
var optimisticThanked = !previousThanked;
var optimisticCount = optimisticThanked ? previousCount + 1 : Math.max(0, previousCount - 1);
$button.attr('data-loading', '1');
$button.attr('aria-busy', 'true');
$button.addClass('disabled');
$button.attr('data-thanked', optimisticThanked ? '1' : '0');
$button.attr('data-count', optimisticCount);
$button.html(renderThankButtonContent(optimisticThanked, optimisticCount));
$.ajax({
url: $button.attr("href"),
success: function (data) {
var serverThanked = !data.undo;
var serverCount = parseInt(data.registered, 10);
if (isNaN(serverCount)) {
serverCount = optimisticCount;
}
$button.attr('data-thanked', serverThanked ? '1' : '0');
$button.attr('data-count', serverCount);
$button.html(renderThankButtonContent(serverThanked, serverCount));
},
error: function () {
$button.attr('data-thanked', previousThanked ? '1' : '0');
$button.attr('data-count', previousCount);
$button.html(renderThankButtonContent(previousThanked, previousCount));
showCopyFeedback($button, 'Opslaan mislukt');
},
complete: function () {
$button.attr('data-loading', '0');
$button.removeAttr('aria-busy');
if (!wasDisabledBeforeRequest) {
$button.removeClass('disabled');
}
}
});
}
/**
* @param element
* @param event
*/
function subscribeToThread(element, event) {
event.preventDefault();
$.ajax({
url: $(element).attr("href"),
success: function (data) {
//noinspection JSUnresolvedVariable
if (data.subscribed) {
$(element).html("
Abonnement stoppen");
} else {
$(element).html("
Abonneer");
}
}
});
}
/**
* @param element
* @param event
*/
function addMessageAsFavorite(element, event) {
event.preventDefault();
$.ajax({
url: $(element).attr("href"),
success: function (data) {
//noinspection JSUnresolvedVariable
if (data.added) {
$(element).html('
Favoriet');
$(element).addClass('disabled');
}
}
});
}
function getSelectedText() {
if (window.getSelection) {
return window.getSelection();
} else if (document.getSelection) {
return document.getSelection();
} else {
var selection = document.selection && document.selection.createRange();
if (selection.text) {
return selection.text;
}
return false;
}
return false;
}
$(document).ready(function () {
// Initialize clipboard on each DOM element having the 'clipboard-btn' class
var clipboard = new Clipboard('.clipboard-btn');
clipboard.on('success', function (e) {
$(e.trigger).tooltip({
delay: {show: 50, hide: 500},
title: 'URL gekopieerd',
});
$(e.trigger).tooltip('show');
});
$('#message-content').mouseup(function (event) {
var selection = getSelectedText();
if (selection && selection != '') {
var x = event.clientX;
var y = event.clientY;
$('#quote-message-div').css({
'position': 'fixed',
'left': (x - 20) + 'px',
'top': (y + 20) + 'px',
'z-index': '999'
}).show();
selectedText = selection;
} else {
$('#quote-message-div').hide();
}
});
var shareUrl = 'https\u003A\/\/www.weerwoord.be\/m\/71464';
var shareTitle = 'Re\u0020\u003A\u0020regen\u0020en\u0020sneeuw';
var $shareButton = $('#toggleSharePopover');
$shareButton.popover({
html: true,
placement: 'top',
trigger: 'manual',
container: 'body',
content: function () {
return getSharePopoverContent(shareUrl, shareTitle);
}
});
$shareButton.on('click', function (event) {
event.preventDefault();
event.stopPropagation();
if ($shareButton.attr('aria-describedby')) {
$shareButton.popover('hide');
return;
}
if (navigator.share && typeof navigator.share === 'function') {
navigator.share({
title: shareTitle,
text: shareTitle,
url: shareUrl
}).catch(function (error) {
if (error && (error.name === 'AbortError' || error.name === 'NotAllowedError')) {
return;
}
$shareButton.popover('show');
});
return;
}
$shareButton.popover('show');
});
$(document).on('click', '.share-copy-link', function (event) {
event.preventDefault();
event.stopPropagation();
var $copyButton = $(this);
copyTextToClipboard(shareUrl, function () {
showCopyFeedback($copyButton, 'URL gekopieerd');
}, function () {
showCopyFeedback($copyButton, 'Kopiƫren mislukt');
});
});
$(document).on('click', function (event) {
if ($(event.target).closest('#toggleSharePopover, .popover').length === 0) {
$shareButton.popover('hide');
}
});
$(document).on('click', '.popover', function (event) {
event.stopPropagation();
});
$('#scrollbottom').show();
});
function quoteMessageWithSelectedText() {
// Hide the quoted text button
$('#quote-message-div').hide();
// Go!!
var url = '/quotetext/id/71464';
var form = $('
');
$('body').append(form);
form.submit();
}
$(document).on('click', '.dropdown-menu', function (e) {
e.stopPropagation();
});