X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=view%2Fjs%2Fmain.js;h=d029ec13bcefd9719225c4d37f8f48428ac67135;hb=ccf92fc9220bffdb91a01fb8ef7e8fe0786f3b45;hp=c12156e4f8162aadeee3615fc74ff365a8430ad9;hpb=0f932ae723c8b97a1889b9d77a52da3fe7f8b2b3;p=friendica.git
diff --git a/view/js/main.js b/view/js/main.js
index c12156e4f8..d029ec13bc 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -104,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;
@@ -120,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;
@@ -160,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 */
@@ -245,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 = '';
@@ -299,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);
@@ -349,7 +365,7 @@ $(function() {
});
}
- var notif = data['notify'];
+ var notif = data['notification'];
if (notif > 0) {
$("#nav-notifications-linkmenu").addClass("on");
} else {
@@ -528,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.
@@ -557,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) {
@@ -583,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);
@@ -626,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');
@@ -721,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;
@@ -833,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;
@@ -858,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;
});
}
@@ -911,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
@@ -948,7 +998,7 @@ function checkboxhighlight(box) {
}
}
-function notifyMarkAll() {
+function notificationMarkAll() {
$.get('notification/mark/all', function(data) {
if (timer) {
clearTimeout(timer);