63 lines
2.3 KiB
JavaScript
63 lines
2.3 KiB
JavaScript
/*
|
|
* BulkMoveTasks -- place the "Move tasks in bulk" entry inside the native column menu.
|
|
*
|
|
* Kanboard only exposes the template:board:column:dropdown hook AFTER the column menu
|
|
* <ul>, and its dropdown JS clones just that <ul> when the menu opens. So the hook item
|
|
* cannot reach the menu on its own. The column_dropdown.php template renders the item
|
|
* hidden next to the menu; this script moves each such item into that column's real <ul>
|
|
* so it appears alongside "Hide this column", "Create tasks in bulk", etc.
|
|
*
|
|
* It re-runs when the board is redrawn (AJAX polling / drag-and-drop refresh).
|
|
*/
|
|
(function () {
|
|
"use strict";
|
|
|
|
function relocate() {
|
|
var items = document.querySelectorAll(".bulkmovetasks-menu-item");
|
|
|
|
for (var i = 0; i < items.length; i++) {
|
|
var li = items[i];
|
|
|
|
// Already moved into a menu list: just make sure it is visible.
|
|
if (li.closest("ul")) {
|
|
li.style.display = "";
|
|
continue;
|
|
}
|
|
|
|
// The hook renders the item as a child of the column's dropdown wrapper;
|
|
// its first <ul> is the native menu.
|
|
var menu = li.parentNode ? li.parentNode.querySelector("ul") : null;
|
|
|
|
if (menu) {
|
|
menu.appendChild(li);
|
|
li.style.display = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
function init() {
|
|
var container = document.getElementById("board-container");
|
|
|
|
if (!container) {
|
|
return;
|
|
}
|
|
|
|
relocate();
|
|
|
|
// BoardDragAndDrop.refresh() does $("#board-container").replaceWith(data) on every
|
|
// drag-and-drop and poll refresh, so an observer bound to #board-container would be
|
|
// left watching a detached node and never fire again (the entry vanishes until F5).
|
|
// Observe the stable parent instead: it survives the swap, and its childList mutation
|
|
// fires exactly when the container is replaced, so relocate() re-runs on the new DOM.
|
|
if (window.MutationObserver && container.parentNode) {
|
|
new MutationObserver(relocate).observe(container.parentNode, { childList: true, subtree: true });
|
|
}
|
|
}
|
|
|
|
if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", init);
|
|
} else {
|
|
init();
|
|
}
|
|
})();
|