Open Event server had a bug wherein clicking on the notification of an invitation caused a server error. When invitations for a role in an event were sent, they showed up in the notifications header. Clicking on the notification there took the user to the notification page where there were options to Accept or Decline the invitation. The bug was that when the user clicked on either of the Accept/Decline button, the notification was not being marked read which semantically it should have been. Since the invite link expires after acceptance/decline, due to the persistence of the invitation in the notifications page, when the user clicked on the Accept/Decline button, it ran into a 404 error.
The Accept/Decline buttons already have a href attached to each one of them which triggered functions of invitation manager class. The aim here was to add one other thing to happen when any of these buttons was clicked. This bug was resolved by adding a wrapper around these buttons and adding the same functionality to this as that of the ‘Mark as Read’ button.
Adding a class to both the buttons
<a href='{accept_link}' class='btn btn-success btn-sm invite'>Accept</a> <a href='{decline_link}' class='btn btn-danger btn-sm invite'>Decline</a>
Adding JavaScript to the invite button
if ($(e.target).is('.invite')) { var read_button = $(e.target).parents(".notification").find('a.read-btn'); $.getJSON(read_button.attr('href'), function (data) { read_button.parents('.notification').removeClass('info'); // show notification as read read_button.remove(); // delete mark as read button });
Using parseInt() with Radix
Another error [comment] in the same issue was that sometimes the notification count went in negatives. This was resolved by adding a simple clause to check when notification count is greater than 0.
notif_count = ((notif_count - 1) > 0 ) ? (notif_count - 1) : 0;
To set count as the innerHTML of a div, which in this case was the notification count bubble, one uses parseInt();
div.innerHTML = parseInt(notif_count);
This might work but codacy gives an error. The error here is because of a radix not being passed to the parseInt() function.
What is a radix?
Radix simply denotes the integer value of the base of the numeration system. It is basically the value of a single digit in a given number.
For example, numbers written in binary notation have radix 2 while those written in octal notation have radix 8.
Passing radix to the parseInt() function specifies the number system in which the input is to be parsed. Though the radix can be hinted at by other means too, it is always a good practice to pass the radix explicitly.
// leading 0 => radix 8 (octal) var number = parseInt('0101'); // leading ‘0x’ => radix 16 (hexadecimal) var number = parseInt('0x0101'); // Numbers starting with anything else assumes a radix of 10 var number = parseInt('101'); // specifying the radix explicitly, here radix of 2 => (binary) var number = parseInt('0101', 2);
If you ignore this argument, parseInt() will try to choose the most proper numeral system, but this can back-fire due to browser inconsistencies. For example:
parseInt("023"); // 23 in one browser (radix = 10) parseInt("023"); // 19 in other browser (radix = 8)
Providing the radix is vital if you are to guarantee accuracy with variable input (basic range, binary, etc). This can be ensured by using a JavaScript linter for your code, which will throw an error for unintended results.
Issues :
Error on clicking on notification
Pull Request :
Fix error on clicking on notification
Additional Resources: