Skip to content

Commit

Permalink
luci-base: ui: extend addNotification to handle a user-provided timeout
Browse files Browse the repository at this point in the history
A millisecond value after which the notification will disappear
automatically. If omitted, the notification will remain until it
receives the click event.

Existing calls are unaffected.

Signed-off-by: Paul Donald <newtwen+github@gmail.com>
  • Loading branch information
systemcrash committed Nov 21, 2024
1 parent b9496f2 commit 53e36e3
Showing 1 changed file with 29 additions and 4 deletions.
33 changes: 29 additions & 4 deletions modules/luci-base/htdocs/luci-static/resources/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -3719,6 +3719,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
* node or a document fragment in most cases. The value is passed as-is
* to the `dom.content()` function - refer to its documentation for
* applicable values.
*
* @param {int} [timeout]
* A millisecond value after which the notification will disappear
* automatically. If omitted, the notification will remain until it receives
* the click event.
*
* @param {...string} [classes]
* A number of extra CSS class names which are set on the notification
Expand All @@ -3727,7 +3732,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
* @returns {Node}
* Returns a DOM Node representing the notification banner element.
*/
addNotification: function(title, children /*, ... */) {
addNotification: function(title, children, timeout, ...classes) {
var mc = document.querySelector('#maincontent') || document.body;
var msg = E('div', {
'class': 'alert-message fade-in',
Expand All @@ -3744,7 +3749,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
'class': 'btn',
'style': 'margin-left:auto; margin-top:auto',
'click': function(ev) {
dom.parent(ev.target, '.alert-message').classList.add('fade-out');
fadeOutNotification(ev.target);
},

}, [ _('Dismiss') ])
Expand All @@ -3756,11 +3761,31 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {

dom.append(msg.firstElementChild, children);

for (var i = 2; i < arguments.length; i++)
msg.classList.add(arguments[i]);
classes.forEach(cls => msg.classList.add(cls));

mc.insertBefore(msg, mc.firstElementChild);

function fadeOutNotification(element) {
var notification = dom.parent(element, '.alert-message');
if (notification) {
notification.classList.add('fade-out');
notification.classList.remove('fade-in');
setTimeout(() => {
if (notification.parentNode) {
notification.parentNode.removeChild(notification);
}
});
}
}

if (typeof timeout === 'number' && timeout > 0) {
setTimeout(function() {
if (msg && msg.parentNode) {
fadeOutNotification(msg);
}
}, timeout);
}

return msg;
},

Expand Down

1 comment on commit 53e36e3

@stokito
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does anyone requested and use the feature? Which value to select? Maybe we can just make a default value? Do we have so many notifications so that a user is annoyed?

Please sign in to comment.