X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=view%2Fjs%2Fmain.js;h=af2f8522c8e76341b360447b3b3688480a631225;hb=2d217129b9fb2e4379b728b01ec73fc0be8c58ff;hp=f81d7a42352125231972f63e08518ab12525e513;hpb=173a17d0e0196e8c3d43e4bd5079d0fb0209ec41;p=friendica.git diff --git a/view/js/main.js b/view/js/main.js index f81d7a4235..af2f8522c8 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -1,4 +1,21 @@ // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPLv3-or-later + +// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} + function resizeIframe(obj) { _resizeIframe(obj, 0); } @@ -16,26 +33,66 @@ function _resizeIframe(obj, desth) { setTimeout(_resizeIframe, 100, obj, ch); } -function openClose(theID) { - if (document.getElementById(theID).style.display == "block") { - document.getElementById(theID).style.display = "none" +function initWidget(inflated, deflated) { + var elInf = document.getElementById(inflated); + var elDef = document.getElementById(deflated); + + if (!elInf || !elDef) { + return; + } + if (localStorage.getItem(window.location.pathname.split("/")[1] + ":" + inflated) != "none") { + elInf.style.display = "block"; + elDef.style.display = "none"; } else { - document.getElementById(theID).style.display = "block" + elInf.style.display = "none"; + elDef.style.display = "block"; } } -function openMenu(theID) { +function openCloseWidget(inflated, deflated) { + var elInf = document.getElementById(inflated); + var elDef = document.getElementById(deflated); + + if (!elInf || !elDef) { + return; + } + + if (window.getComputedStyle(elInf).display === "none") { + elInf.style.display = "block"; + elDef.style.display = "none"; + localStorage.setItem(window.location.pathname.split("/")[1] + ":" + inflated, "block"); + } else { + elInf.style.display = "none"; + elDef.style.display = "block"; + localStorage.setItem(window.location.pathname.split("/")[1] + ":" + inflated, "none"); + } +} + +function openClose(theID) { var el = document.getElementById(theID); + if (el) { + if (window.getComputedStyle(el).display === "none") { + openMenu(theID); + } else { + closeMenu(theID); + } + } +} +function openMenu(theID) { + var el = document.getElementById(theID); if (el) { - el.style.display = "block"; + if (!el.dataset.display) { + el.dataset.display = 'block'; + } + el.style.display = el.dataset.display; } } function closeMenu(theID) { - var el = document.getElementById(theID) - + var el = document.getElementById(theID); if (el) { + el.dataset.display = window.getComputedStyle(el).display; el.style.display = "none"; } } @@ -47,6 +104,20 @@ function decodeHtml(html) { return txt.value; } +/** + * Retrieves a single named query string parameter + * + * @param {string} name + * @returns {string} + * @see https://davidwalsh.name/query-string-javascript + */ +function getUrlParameter(name) { + name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); + var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); + var results = regex.exec(location.search); + return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); +}; + var src = null; var prev = null; var livetime = null; @@ -63,6 +134,9 @@ var commentBusy = false; var last_popup_menu = null; var last_popup_button = null; var lockLoadContent = false; +var originalTitle = document.title; + +const urlRegex = /^(?:https?:\/\/|\s)[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})(?:\/+[a-z0-9_.:;-]*)*(?:\?[&%|+a-z0-9_=,.:;-]*)?(?:[&%|+&a-z0-9_=,:;.-]*)(?:[!#\/&%|+a-z0-9_=,:;.-]*)}*$/i; $(function() { $.ajaxSetup({cache: false}); @@ -101,23 +175,6 @@ $(function() { $(textarea).trigger('change'); }); - /* setup onoff widgets */ - $(".onoff input").each(function() { - val = $(this).val(); - id = $(this).attr("id"); - $("#"+id+"_onoff ." + (val == 0 ? "on":"off")).addClass("hidden"); - }); - - $(".onoff > a").click(function(event) { - event.preventDefault(); - var input = $(this).siblings("input"); - var val = 1-input.val(); - var id = input.attr("id"); - $("#"+id+"_onoff ." + (val == 0 ? "on":"off")).addClass("hidden"); - $("#"+id+"_onoff ." + (val == 1 ? "on":"off")).removeClass("hidden"); - input.val(val); - }); - /* popup menus */ function close_last_popup_menu() { if (last_popup_menu) { @@ -186,7 +243,14 @@ $(function() { window.location.href=window.location.href } - ['net', 'home', 'intro', 'mail', 'events', 'birthdays', 'notify'].forEach(function(type) { + let tabNotifications = data.mail + data.notification; + if (tabNotifications > 0) { + document.title = '(' + tabNotifications + ') ' + originalTitle; + } else { + document.title = originalTitle; + } + + ['net', 'home', 'intro', 'mail', 'events', 'birthdays', 'notification'].forEach(function(type) { var number = data[type]; if (number == 0) { number = ''; @@ -240,19 +304,19 @@ $(function() { var notification_id = 0; // Insert notifs into the notifications-menu - $(data.notifications).each(function(key, notif) { - var text = notif.message.format('' + notif.name + ''); - var contact = ('' + notif.name + ''); - var seenclass = (notif.seen == 1) ? "notify-seen" : "notify-unseen"; + $(data.notifications).each(function(key, notification) { + var text = notification.message.format('' + notification.name + ''); + var contact = ('' + notification.name + ''); + var seenclass = (notification.seen == 1) ? "notification-seen" : "notification-unseen"; var html = notifications_tpl.format( - notif.href, // {0} // link to the source - notif.photo, // {1} // photo of the contact + notification.href, // {0} // link to the source + notification.photo, // {1} // photo of the contact text, // {2} // preformatted text (autor + text) - notif.date, // {3} // date of notification (time ago) + notification.date, // {3} // date of notification (time ago) seenclass, // {4} // visited status of the notification - new Date(notif.timestamp*1000), // {5} // date of notification - notif.url, // {6} // profile url of the contact - notif.message.format(contact), // {7} // preformatted html (text including author profile url) + new Date(notification.timestamp*1000), // {5} // date of notification + notification.url, // {6} // profile url of the contact + notification.message.format(contact), // {7} // preformatted html (text including author profile url) '' // {8} // Deprecated ); nnm.append(html); @@ -290,7 +354,7 @@ $(function() { }); } - var notif = data['notify']; + var notif = data['notification']; if (notif > 0) { $("#nav-notifications-linkmenu").addClass("on"); } else { @@ -382,9 +446,64 @@ $(function() { } }); +/** + * Inserts a BBCode tag in the comment textarea identified by id + * + * @param {string} BBCode + * @param {int} id + * @returns {boolean} + */ +function insertFormatting(BBCode, id) { + let textarea = document.getElementById('comment-edit-text-' + id); + + if (textarea.value === '') { + $(textarea) + .addClass("comment-edit-text-full") + .removeClass("comment-edit-text-empty"); + closeMenu("comment-fake-form-" + id); + openMenu("item-comments-" + id); + } + + insertBBCodeInTextarea(BBCode, textarea); + + return true; +} + +/** + * Inserts a BBCode tag in the provided textarea element, wrapping the currently selected text. + * For URL BBCode, it discriminates between link text and non-link text to determine where to insert the selected text. + * + * @param {string} BBCode + * @param {HTMLTextAreaElement} textarea + */ +function insertBBCodeInTextarea(BBCode, textarea) { + let selectionStart = textarea.selectionStart; + let selectionEnd = textarea.selectionEnd; + let selectedText = textarea.value.substring(selectionStart, selectionEnd); + let openingTag = '[' + BBCode + ']'; + let closingTag = '[/' + BBCode + ']'; + let cursorPosition = selectionStart + openingTag.length + selectedText.length; + + if (BBCode === 'url') { + if (urlRegex.test(selectedText)) { + openingTag = '[' + BBCode + '=' + selectedText + ']'; + selectedText = ''; + cursorPosition = selectionStart + openingTag.length; + } else { + openingTag = '[' + BBCode + '=]'; + cursorPosition = selectionStart + openingTag.length - 1; + } + } + + textarea.value = textarea.value.substring(0, selectionStart) + openingTag + selectedText + closingTag + textarea.value.substring(selectionEnd, textarea.value.length); + textarea.setSelectionRange(cursorPosition, cursorPosition); + textarea.dispatchEvent(new Event('change')); + textarea.focus(); +} + function NavUpdate() { if (!stopped) { - var pingCmd = 'ping?format=json' + ((localUser != 0) ? '&f=&uid=' + localUser : ''); + var pingCmd = 'ping?format=json' + ((localUser != 0) ? '&uid=' + localUser : ''); $.get(pingCmd, function(data) { if (data.result) { // send nav-update event @@ -414,7 +533,13 @@ function updateConvItems(data) { var ident = $(this).attr('id'); // Add new top-level item. - if ($('#' + ident).length == 0 && profile_page == 1) { + if ($('#' + ident).length === 0 + && (!getUrlParameter('page') + && !getUrlParameter('max_id') + && !getUrlParameter('since_id') + || getUrlParameter('page') === '1' + ) + ) { $('#' + prev).after($(this)); // Replace already existing thread. @@ -444,7 +569,7 @@ function updateConvItems(data) { $('body').css('cursor', 'auto'); } /* autocomplete @nicknames */ - $(".comment-edit-form textarea").editor_autocomplete(baseurl+"/acl"); + $(".comment-edit-form textarea").editor_autocomplete(baseurl + '/search/acl'); /* autocomplete bbcode */ $(".comment-edit-form textarea").bbco_autocomplete('bbcode'); } @@ -469,18 +594,30 @@ function liveUpdate(src) { in_progress = true; - if ($(document).scrollTop() == 0) { - force_update = true; - } + let force = force_update || $(document).scrollTop() === 0; var orgHeight = $("section").height(); var udargs = ((netargs.length) ? '/' + netargs : ''); - var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&force=' + ((force_update) ? 1 : 0) + '&item=' + update_item; - $.get(update_url,function(data) { - in_progress = false; + var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&force=' + (force ? 1 : 0) + '&item=' + update_item; + + if (force_update) { force_update = false; + } + + if (getUrlParameter('page')) { + update_url += '&page=' + getUrlParameter('page'); + } + if (getUrlParameter('since_id')) { + update_url += '&since_id=' + getUrlParameter('since_id'); + } + if (getUrlParameter('max_id')) { + update_url += '&max_id=' + getUrlParameter('max_id'); + } + + $.get(update_url, function(data) { + in_progress = false; update_item = 0; $('.wall-item-body', data).imagesLoaded(function() { @@ -547,18 +684,39 @@ function dostar(ident) { }); } -function doignore(ident) { +function dopin(ident) { ident = ident.toString(); $('#like-rotator-' + ident).show(); - $.get('ignored/' + ident, function(data) { + $.get('pinned/' + ident, function(data) { if (data.match(/1/)) { - $('#ignored-' + ident).addClass('ignored'); - $('#ignored-' + ident).removeClass('unignored'); + $('#pinned-' + ident).addClass('pinned'); + $('#pinned-' + ident).removeClass('unpinned'); + $('#pin-' + ident).addClass('hidden'); + $('#unpin-' + ident).removeClass('hidden'); + } else { + $('#pinned-' + ident).addClass('unpinned'); + $('#pinned-' + ident).removeClass('pinned'); + $('#pin-' + ident).removeClass('hidden'); + $('#unpin-' + ident).addClass('hidden'); + } + $('#like-rotator-' + ident).hide(); + }); +} + +function doignore(ident) { + ident = ident.toString(); + $('#like-rotator-' + ident).show(); + $.get('item/ignore/' + ident, function(data) { + if (data === 1) { + $('#ignored-' + ident) + .addClass('ignored') + .removeClass('unignored'); $('#ignore-' + ident).addClass('hidden'); $('#unignore-' + ident).removeClass('hidden'); } else { - $('#ignored-' + ident).addClass('unignored'); - $('#ignored-' + ident).removeClass('ignored'); + $('#ignored-' + ident) + .addClass('unignored') + .removeClass('ignored'); $('#ignore-' + ident).removeClass('hidden'); $('#unignore-' + ident).addClass('hidden'); } @@ -610,7 +768,6 @@ function post_comment(id) { unpause(); commentBusy = true; $('body').css('cursor', 'wait'); - $("#comment-preview-inp-" + id).val("0"); $.post( "item", $("#comment-edit-form-" + id).serialize(), @@ -639,11 +796,10 @@ function post_comment(id) { } function preview_comment(id) { - $("#comment-preview-inp-" + id).val("1"); $("#comment-edit-preview-" + id).show(); $.post( "item", - $("#comment-edit-form-" + id).serialize(), + $("#comment-edit-form-" + id).serialize() + '&preview=1', function(data) { if (data.preview) { $("#comment-edit-preview-" + id).html(data.preview); @@ -656,21 +812,22 @@ function preview_comment(id) { } function showHideComments(id) { - if ($("#collapsed-comments-" + id).is(":visible")) { - $("#collapsed-comments-" + id).hide(); - $("#hide-comments-" + id).html(window.showMore); + if ($('#collapsed-comments-' + id).is(':visible')) { + $('#collapsed-comments-' + id).slideUp(); + $('#hide-comments-' + id).hide(); + $('#hide-comments-total-' + id).show(); } else { - $("#collapsed-comments-" + id).show(); - $("#hide-comments-" + id).html(window.showFewer); + $('#collapsed-comments-' + id).slideDown(); + $('#hide-comments-' + id).show(); + $('#hide-comments-total-' + id).hide(); } } function preview_post() { - $("#jot-preview").val("1"); $("#jot-preview-content").show(); $.post( "item", - $("#profile-jot-form").serialize(), + $("#profile-jot-form").serialize() + '&preview=1', function(data) { if (data.preview) { $("#jot-preview-content").html(data.preview); @@ -680,7 +837,6 @@ function preview_post() { }, "json" ); - $("#jot-preview").val("0"); return true; } @@ -786,11 +942,25 @@ function profChangeMember(gid,cid) { }); } -function contactgroupChangeMember(gid,cid) { +function contactgroupChangeMember(checkbox, gid, cid) { + let url; + // checkbox.checked is the checkbox state after the click + if (checkbox.checked) { + url = 'group/' + gid + '/add/' + cid; + } else { + url = 'group/' + gid + '/remove/' + cid; + } $('body').css('cursor', 'wait'); - $.get('contactgroup/' + gid + '/' + cid, function(data) { - $('body').css('cursor', 'auto'); + $.post(url) + .error(function () { + // Restores previous state in case of error + checkbox.checked = !checkbox.checked; + }) + .always(function() { + $('body').css('cursor', 'auto'); }); + + return true; } function checkboxhighlight(box) { @@ -801,8 +971,8 @@ function checkboxhighlight(box) { } } -function notifyMarkAll() { - $.get('notify/mark/all', function(data) { +function notificationMarkAll() { + $.get('notification/mark/all', function(data) { if (timer) { clearTimeout(timer); } @@ -833,7 +1003,7 @@ Array.prototype.remove = function(item) { function previewTheme(elm) { theme = $(elm).val(); - $.getJSON('pretheme?f=&theme=' + theme,function(data) { + $.getJSON('pretheme?theme=' + theme,function(data) { $('#theme-preview').html('
' + data.desc + '
' + data.version + '
' + data.credits + '
' + theme + ''); });