X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=view%2Fjs%2Fmain.js;h=d029ec13bcefd9719225c4d37f8f48428ac67135;hb=ccf92fc9220bffdb91a01fb8ef7e8fe0786f3b45;hp=37975dd3385b57db1d3692cefe56a5e7738d6a81;hpb=9c9b4d1967413a19b93fc8bce38f08f901d212d1;p=friendica.git diff --git a/view/js/main.js b/view/js/main.js index 37975dd338..d029ec13bc 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -33,6 +33,41 @@ function _resizeIframe(obj, desth) { setTimeout(_resizeIframe, 100, obj, ch); } +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 { + elInf.style.display = "none"; + elDef.style.display = "block"; + } +} + +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) { @@ -69,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; @@ -85,6 +134,7 @@ 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; @@ -125,21 +175,15 @@ $(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"); - }); + $(".comment-edit-wrapper textarea, .wall-item-comment-wrapper textarea") + .editor_autocomplete(baseurl + '/search/acl') + .bbco_autocomplete('bbcode'); - $(".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); + // Ensures asynchronously-added comment forms recognize mentions, tags and BBCodes as well + document.addEventListener("postprocess_liveupdate", function() { + $(".comment-edit-wrapper textarea, .wall-item-comment-wrapper textarea") + .editor_autocomplete(baseurl + '/search/acl') + .bbco_autocomplete('bbcode'); }); /* popup menus */ @@ -210,7 +254,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 = ''; @@ -264,19 +315,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); @@ -314,7 +365,7 @@ $(function() { }); } - var notif = data['notify']; + var notif = data['notification']; if (notif > 0) { $("#nav-notifications-linkmenu").addClass("on"); } else { @@ -463,7 +514,7 @@ function insertBBCodeInTextarea(BBCode, textarea) { 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 @@ -493,7 +544,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('min_id') + || getUrlParameter('page') === '1' + ) + ) { $('#' + prev).after($(this)); // Replace already existing thread. @@ -522,10 +579,6 @@ function updateConvItems(data) { commentBusy = false; $('body').css('cursor', 'auto'); } - /* autocomplete @nicknames */ - $(".comment-edit-form textarea").editor_autocomplete(baseurl + '/search/acl'); - /* autocomplete bbcode */ - $(".comment-edit-form textarea").bbco_autocomplete('bbcode'); } function liveUpdate(src) { @@ -548,20 +601,36 @@ 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('min_id')) { + update_url += '&min_id=' + getUrlParameter('min_id'); + } + if (getUrlParameter('max_id')) { + update_url += '&max_id=' + getUrlParameter('max_id'); + } + + $.get(update_url, function(data) { + in_progress = false; update_item = 0; + if ($('.wall-item-body', data).length == 0) { + return; + } + $('.wall-item-body', data).imagesLoaded(function() { updateConvItems(data); @@ -591,65 +660,83 @@ function imgdull(node) { // trickery. This still could cause confusion if the "like" ajax call // is delayed and NavUpdate runs before it completes. -function dolike(ident,verb) { +/** + * @param {int} ident The id of the relevant item + * @param {string} verb The verb of the action + * @param {boolean} un Whether to perform an activity removal instead of creation + */ +function doActivityItem(ident, verb, un) { unpause(); $('#like-rotator-' + ident.toString()).show(); - $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate); + verb = un ? 'un' + verb : verb; + $.post('item/' + ident.toString() + '/activity/' + verb, NavUpdate); liking = 1; force_update = true; update_item = ident.toString(); } -function dosubthread(ident) { +function doFollowThread(ident) { unpause(); $('#like-rotator-' + ident.toString()).show(); - $.get('subthread/' + ident.toString(), NavUpdate); + $.post('item/' + ident.toString() + '/follow', NavUpdate); liking = 1; + force_update = true; + update_item = ident.toString(); } -function dostar(ident) { +function doStar(ident) { ident = ident.toString(); $('#like-rotator-' + ident).show(); - $.get('starred/' + ident, function(data) { - if (data.match(/1/)) { - $('#starred-' + ident).addClass('starred'); - $('#starred-' + ident).removeClass('unstarred'); + $.post('item/' + ident + '/star') + .then(function(data) { + if (data.state === 1) { + $('#starred-' + ident) + .addClass('starred') + .removeClass('unstarred'); $('#star-' + ident).addClass('hidden'); $('#unstar-' + ident).removeClass('hidden'); } else { - $('#starred-' + ident).addClass('unstarred'); - $('#starred-' + ident).removeClass('starred'); + $('#starred-' + ident) + .addClass('unstarred') + .removeClass('starred'); $('#star-' + ident).removeClass('hidden'); $('#unstar-' + ident).addClass('hidden'); } + }) + .always(function () { $('#like-rotator-' + ident).hide(); }); } -function dopin(ident) { +function doPin(ident) { ident = ident.toString(); $('#like-rotator-' + ident).show(); - $.get('pinned/' + ident, function(data) { - if (data.match(/1/)) { - $('#pinned-' + ident).addClass('pinned'); - $('#pinned-' + ident).removeClass('unpinned'); + $.post('item/' + ident + '/pin') + .then(function(data) { + if (data.state === 1) { + $('#pinned-' + ident) + .addClass('pinned') + .removeClass('unpinned'); $('#pin-' + ident).addClass('hidden'); $('#unpin-' + ident).removeClass('hidden'); } else { - $('#pinned-' + ident).addClass('unpinned'); - $('#pinned-' + ident).removeClass('pinned'); + $('#pinned-' + ident) + .addClass('unpinned') + .removeClass('pinned'); $('#pin-' + ident).removeClass('hidden'); $('#unpin-' + ident).addClass('hidden'); } + }) + .always(function () { $('#like-rotator-' + ident).hide(); }); } -function doignore(ident) { +function doIgnoreThread(ident) { ident = ident.toString(); $('#like-rotator-' + ident).show(); - $.get('item/ignore/' + ident, function(data) { - if (data === 1) { + $.post('item/' + ident + '/ignore', function(data) { + if (data.state === 1) { $('#ignored-' + ident) .addClass('ignored') .removeClass('unignored'); @@ -686,26 +773,23 @@ function getPosition(e) { var lockvisible = false; -function lockview(event,id) { +function lockview(event, type, id) { event = event || window.event; cursor = getPosition(event); if (lockvisible) { - lockviewhide(); + lockvisible = false; + $('#panel').hide(); } else { lockvisible = true; - $.get('lockview/' + id, function(data) { - $('#panel').html(data); - $('#panel').css({'left': cursor.x + 5 , 'top': cursor.y + 5}); - $('#panel').show(); + $.get('permission/tooltip/' + type + '/' + id, function(data) { + $('#panel') + .html(data) + .css({'left': cursor.x + 5 , 'top': cursor.y + 5}) + .show(); }); } } -function lockviewhide() { - lockvisible = false; - $('#panel').hide(); -} - function post_comment(id) { unpause(); commentBusy = true; @@ -798,10 +882,6 @@ function loadScrollContent() { $("#scroll-loader").fadeIn('normal'); - // the page number to load is one higher than the actual - // page number - infinite_scroll.pageno+=1; - match = $("span.received").last(); if (match.length > 0) { received = match[0].innerHTML; @@ -823,25 +903,38 @@ function loadScrollContent() { commented = "0000-00-00 00:00:00"; } - match = $("span.id").last(); + match = $("span.uriid").last(); if (match.length > 0) { - id = match[0].innerHTML; + uriid = match[0].innerHTML; } else { - id = "0"; + uriid = "0"; } // get the raw content from the next page and insert this content // right before "#conversation-end" - $.get(infinite_scroll.reload_uri + '&mode=raw&last_received=' + received + '&last_commented=' + commented + '&last_created=' + created + '&last_id=' + id + '&page=' + infinite_scroll.pageno, function(data) { + $.get({ + url: infinite_scroll.reload_uri, + data: { + 'mode' : 'raw', + 'last_received' : received, + 'last_commented': commented, + 'last_created' : created, + 'last_uriid' : uriid + } + }) + .done(function(data) { $("#scroll-loader").hide(); if ($(data).length > 0) { $(data).insertBefore('#conversation-end'); - lockLoadContent = false; } else { $("#scroll-end").fadeIn('normal'); } document.dispatchEvent(new Event('postprocess_liveupdate')); + }) + .always(function () { + $("#scroll-loader").hide(); + lockLoadContent = false; }); } @@ -876,14 +969,6 @@ function groupChangeMember(gid, cid, sec_token) { }); } -function profChangeMember(gid,cid) { - $('body .fakelink').css('cursor', 'wait'); - $.get('profperm/' + gid + '/' + cid, function(data) { - $('#prof-update-wrapper').html(data); - $('body .fakelink').css('cursor', 'auto'); - }); -} - function contactgroupChangeMember(checkbox, gid, cid) { let url; // checkbox.checked is the checkbox state after the click @@ -913,8 +998,8 @@ function checkboxhighlight(box) { } } -function notifyMarkAll() { - $.get('notify/mark/all', function(data) { +function notificationMarkAll() { + $.get('notification/mark/all', function(data) { if (timer) { clearTimeout(timer); } @@ -945,7 +1030,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('