Compare commits

..

7 Commits
0.25 ... master

Author SHA1 Message Date
abuyoyo
00ab82a35d 0.27
Some checks failed
Create Release / Create Release (push) Has been cancelled
2024-09-07 08:05:22 +03:00
abuyoyo
51cfce0071 0.27 - version bump + changelog 2024-09-07 08:04:22 +03:00
abuyoyo
416039449f composer.json - prepend-autoloader: false
Local vendor/autoload should not prepend if required locally.
Give precedence to main composer installation if available.
2024-09-07 00:44:37 +03:00
abuyoyo
e548158c15 0.26
Some checks failed
Create Release / Create Release (push) Has been cancelled
2024-09-01 08:04:08 +03:00
abuyoyo
41a42d3a2a 0.26 - version bump + changelog 2024-09-01 08:03:34 +03:00
abuyoyo
b6aca366b2 Mutation Observer replaces DOMNodeRemoved event 2024-09-01 07:48:58 +03:00
abuyoyo
7cc5b6de5a NoticeManager.bootstrap - refactor + modernize 2024-09-01 07:48:58 +03:00
4 changed files with 156 additions and 140 deletions

View File

@ -1,5 +1,22 @@
# Notice Manager Changelog
## 0.27
Release date: Sep 7 2024
### Dependencies
- Composer config: `prepend-autoloader: false` - Give precedence to other composer installations if present.
## 0.26
Release date: Sep 1 2024
### Changed
- Use Mutation Observer instead of deprecated `DOMNodeRemoved` event.
### Added
- Add method `NoticeManager.bootstrap()` to initialize Notice manager.
## 0.25
Release date: Feb 18 2024

View File

@ -2,7 +2,7 @@
"name": "abuyoyo/notice-manager",
"description": "Manage notices on WordPress admin pages. Adds 'Notices' screen-meta-link.",
"type": "wordpress-plugin",
"version": "0.25",
"version": "0.27",
"repositories": [
{
"type": "vcs",
@ -13,5 +13,8 @@
"abuyoyo/screen-meta-links": "~0.13",
"abuyoyo/plugincore": "~0.27",
"abuyoyo/adminmenupage": "~0.29"
},
"config": {
"prepend-autoloader": false
}
}

View File

@ -2,27 +2,26 @@
* NoticeManager class/module
*
*/
var NoticeManager = (function ($, document) {
let options = window.notice_manager_options
const NoticeManager = function ($) {
let selectors_notice = [
const selectors_notice = [
"div.notice",
"div.updated",
]
let selectors_warning = [
const selectors_warning = [
"div.notice-warning",
"div.update-nag",
]
let selectors_error = [
const selectors_error = [
"div.error",
"div.notice-error",
]
let selectors_all = selectors_notice.concat(selectors_warning, selectors_error)
const selectors_all = selectors_notice.concat(selectors_warning, selectors_error)
let selectors_skip = [
const selectors_skip = [
".inline",
".below-h2",
".theme-info .notice",
@ -30,29 +29,44 @@ var NoticeManager = (function ($, document) {
]
// wait function used with autoCollapse
let wait = function (ms) {
const wait = function (ms) {
var dfd = $.Deferred()
setTimeout(dfd.resolve, ms) //callback, timeout till callback
return dfd.promise()
}
const options = window.notice_manager_options
let notices
let button
let panel
let haveClosed // set to true on first close/collect
let dismissNoticesButton
// bootstrap
// some of these need to run BEFORE document.ready - don't know why really
let haveClosed // set to true on first close/collect
let panelObserver
return {
bootstrap: () => {
// Init selectors
button = $("#meta-link-notices")
panel = $("#meta-link-notices-wrap")
haveClosed = false
dismissNoticesButton = $("#meta-link-notices-wrap button.notice-dismiss")
// bootstrap notices
// get all notices that are not explicitly marked as `.inline` or `.below-h2`
// we add .update-nag.inline for WordPress Update notice
notices = $(selectors_all.join(', '))
.not(selectors_skip.join(', '))
.add("div.update-nag")
// Set state
haveClosed = false
dismissNoticesButton.on("click", () => {
screenMeta.close(panel, button)
if (! haveClosed){
if (!haveClosed) {
NoticeManager.collectNotices()
}
NoticeManager.addCounter()
@ -83,21 +97,20 @@ var NoticeManager = (function ($, document) {
}
})
// prevent jumpy scrollRestoration on reload page
// fixed below on 'beforeunload'
// if (history.scrollRestoration) {
// history.scrollRestoration = 'manual'
//}
/**
* document.on.ready
* Set history.scrollTop to prevent jump on page refresh when scrollRestoration = auto
*/
$(() => {
console.log("NoticeManager.on.ready")
console.log("options")
console.log(options)
// bootstrap notices
// get all notices that are not explicitly marked as `.inline` or `.below-h2`
// we add .update-nag.inline for WordPress Update notice
notices = $( selectors_all.join(', ') )
.not(selectors_skip.join(', '))
.add("div.update-nag")
$(window).on('beforeunload', () => history.pushState(
{ scrollTop: document.body.scrollTop },
document.title,
document.location.pathname
)
)
/**
* Remove panel if there are no notices on this page
@ -117,7 +130,7 @@ var NoticeManager = (function ($, document) {
/**
* auto-open notices panel
*/
if (button.length && ! options.distraction_free) {
if (button.length && !options.distraction_free) {
panel.toggle()
button.addClass("screen-meta-active")
screenMeta.open(panel, button)
@ -128,7 +141,7 @@ var NoticeManager = (function ($, document) {
* only auto-close if we have collected notices previously
* only auto-close if no error messages
*/
if (options.auto_collapse && ! options.distraction_free) {
if (options.auto_collapse && !options.distraction_free) {
wait(4000).then(() => {
if (haveClosed && NoticeManager.getNoticesTopPriority() != 'error') {
screenMeta.close(panel, button)
@ -141,25 +154,8 @@ var NoticeManager = (function ($, document) {
NoticeManager.addCounterWhenClosed()
}
}) // end document.on.ready
},
// prevent jumpy scrollRestoration on reload page
// fixed below on 'beforeunload'
// if (history.scrollRestoration) {
// history.scrollRestoration = 'manual'
//}
/**
* Set history.scrollTop to prevent jump on page refresh when scrollRestoration = auto
*/
$(window).on("beforeunload", () => {
history.pushState(
{ scrollTop: document.body.scrollTop },
document.title,
document.location.pathname
)
})
return {
getNotices: () => notices,
getNoticesTopPriority: () => {
@ -197,20 +193,18 @@ var NoticeManager = (function ($, document) {
* When dismissible notices are dismissed, check if any notices are left on page.
* If no notices are left - remove Notice Panel entirely
*/
$(document).on(
"DOMNodeRemoved",
"#meta-link-notices-wrap div.notice",
() => {
panelObserver = new MutationObserver(() => {
notices = panel
.find(selectors_all.join(", "))
.filter(":visible")
NoticeManager.maybeRemoveNoticesPanel()
}
)
});
panelObserver.observe(panel.get(0), { childList: true, subtree: true }); // only run once
},
addCounter: () => {
if (!button.children('.plugin-count').length){
if (!button.children('.plugin-count').length) {
button.append(
$("<span/>").text(notices.filter(":visible").length).attr({
class: "plugin-count",
@ -223,7 +217,7 @@ var NoticeManager = (function ($, document) {
* cannot rely on filter(:visible)
*/
addCounterWhenClosed: () => {
if (!button.children('.plugin-count').length){
if (!button.children('.plugin-count').length) {
button.append(
$("<span/>").text(notices.length).attr({
class: "plugin-count",
@ -247,7 +241,7 @@ var NoticeManager = (function ($, document) {
$("#meta-link-notices-link-wrap").detach()
$("#meta-link-notices-wrap").detach()
if ($("#screen-meta-links").children().length == 0){
if ($("#screen-meta-links").children().length == 0) {
$("#screen-meta-links").detach()
}
}
@ -262,4 +256,6 @@ var NoticeManager = (function ($, document) {
notices.insertBefore(".wrap:first")
},
}
}(jQuery,document) )
}(jQuery);
jQuery(NoticeManager.bootstrap);

View File

@ -2,7 +2,7 @@
/**
* Plugin Name: Notice Manager
* Description: Manage notices on WordPress admin pages. Adds 'Notices' screen-meta-link panel to collect notices from page.
* Version: 0.25
* Version: 0.27
* Author: abuyoyo
* Author URI: https://github.com/abuyoyo/
* Plugin URI: https://github.com/abuyoyo/notice-manager