Release 2026.09.27.r003: close action menus before opening edit forms
This commit is contained in:
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
4f5ea23abab9a154aaebe8af9a0ed286ae645deb7ab47d5e495b6b343b841b71 urbm-2026.09.27.r003-x86_64-1.txz
|
||||||
Vendored
+6
-2
@@ -2,13 +2,17 @@
|
|||||||
<!DOCTYPE PLUGIN [
|
<!DOCTYPE PLUGIN [
|
||||||
<!ENTITY name "urbm">
|
<!ENTITY name "urbm">
|
||||||
<!ENTITY author "Michael Roll">
|
<!ENTITY author "Michael Roll">
|
||||||
<!ENTITY version "2026.09.27.r002">
|
<!ENTITY version "2026.09.27.r003">
|
||||||
<!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg">
|
<!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg">
|
||||||
<!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz">
|
<!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz">
|
||||||
<!ENTITY packageSHA256 "12bf23238112ee7ad9fe6c1102528cdd7baeb32a89378b7ac17621642b001b87">
|
<!ENTITY packageSHA256 "4f5ea23abab9a154aaebe8af9a0ed286ae645deb7ab47d5e495b6b343b841b71">
|
||||||
]>
|
]>
|
||||||
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png">
|
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png">
|
||||||
<CHANGES>
|
<CHANGES>
|
||||||
|
### 2026.09.27.r003
|
||||||
|
- Close action menus synchronously before opening edit forms or running menu actions.
|
||||||
|
- Prevent delayed menu positioning from reopening closed or detached menus.
|
||||||
|
|
||||||
### 2026.09.27.r002
|
### 2026.09.27.r002
|
||||||
- Collapse run logs by default and retain manually opened logs during refresh.
|
- Collapse run logs by default and retain manually opened logs during refresh.
|
||||||
- Log Rsync sources, destination, comparison and deletion options, execution phases, sample changes, errors and final totals.
|
- Log Rsync sources, destination, comparison and deletion options, execution phases, sample changes, errors and final totals.
|
||||||
|
|||||||
+5
-1
@@ -2,13 +2,17 @@
|
|||||||
<!DOCTYPE PLUGIN [
|
<!DOCTYPE PLUGIN [
|
||||||
<!ENTITY name "urbm">
|
<!ENTITY name "urbm">
|
||||||
<!ENTITY author "Michael Roll">
|
<!ENTITY author "Michael Roll">
|
||||||
<!ENTITY version "2026.09.27.r002">
|
<!ENTITY version "2026.09.27.r003">
|
||||||
<!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg">
|
<!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg">
|
||||||
<!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz">
|
<!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz">
|
||||||
<!ENTITY packageSHA256 "REPLACE_DURING_RELEASE">
|
<!ENTITY packageSHA256 "REPLACE_DURING_RELEASE">
|
||||||
]>
|
]>
|
||||||
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png">
|
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png">
|
||||||
<CHANGES>
|
<CHANGES>
|
||||||
|
### 2026.09.27.r003
|
||||||
|
- Close action menus synchronously before opening edit forms or running menu actions.
|
||||||
|
- Prevent delayed menu positioning from reopening closed or detached menus.
|
||||||
|
|
||||||
### 2026.09.27.r002
|
### 2026.09.27.r002
|
||||||
- Collapse run logs by default and retain manually opened logs during refresh.
|
- Collapse run logs by default and retain manually opened logs during refresh.
|
||||||
- Log Rsync sources, destination, comparison and deletion options, execution phases, sample changes, errors and final totals.
|
- Log Rsync sources, destination, comparison and deletion options, execution phases, sample changes, errors and final totals.
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ Tag="URBM Unraid Restic Backup Manager backup snapshots restore"
|
|||||||
---
|
---
|
||||||
<?php
|
<?php
|
||||||
$pluginRoot = '/plugins/urbm';
|
$pluginRoot = '/plugins/urbm';
|
||||||
$urbmVersion = '2026.09.27.r002';
|
$urbmVersion = '2026.09.27.r003';
|
||||||
$urbmAssetVersion = preg_replace('/[^A-Za-z0-9]/', '', $urbmVersion);
|
$urbmAssetVersion = preg_replace('/[^A-Za-z0-9]/', '', $urbmVersion);
|
||||||
?>
|
?>
|
||||||
<link rel="stylesheet" href="<?= $pluginRoot ?>/assets/urbm.css?v=<?= $urbmAssetVersion ?>">
|
<link rel="stylesheet" href="<?= $pluginRoot ?>/assets/urbm.css?v=<?= $urbmAssetVersion ?>">
|
||||||
|
|||||||
+20
-12
@@ -431,6 +431,7 @@
|
|||||||
|
|
||||||
function render() {
|
function render() {
|
||||||
const views = {dashboard:renderDashboard, jobs:renderJobs, repositories:renderRepositories, snapshots:renderSnapshots, restore:renderRestore, activity:renderActivity, logs:renderLogs, settings:renderSettings};
|
const views = {dashboard:renderDashboard, jobs:renderJobs, repositories:renderRepositories, snapshots:renderSnapshots, restore:renderRestore, activity:renderActivity, logs:renderLogs, settings:renderSettings};
|
||||||
|
document.querySelectorAll('.bu-action-menu[open]').forEach(closeActionMenu);
|
||||||
menuPortal?.replaceChildren();
|
menuPortal?.replaceChildren();
|
||||||
content.innerHTML = views[state.view]();
|
content.innerHTML = views[state.view]();
|
||||||
enhanceTooltips(content);
|
enhanceTooltips(content);
|
||||||
@@ -994,13 +995,26 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
document.querySelector('.bu-tabs').addEventListener('click', e => { const button=e.target.closest('[data-view]'); if(!button)return; state.view=button.dataset.view; document.querySelectorAll('.bu-tabs button').forEach(x=>x.classList.toggle('active',x===button)); render(); if(state.view==='logs'&&!state.logs&&!state.logsLoading)loadLogs(); });
|
document.querySelector('.bu-tabs').addEventListener('click', e => { const button=e.target.closest('[data-view]'); if(!button)return; state.view=button.dataset.view; document.querySelectorAll('.bu-tabs button').forEach(x=>x.classList.toggle('active',x===button)); render(); if(state.view==='logs'&&!state.logs&&!state.logsLoading)loadLogs(); });
|
||||||
|
function closeActionMenu(menu) {
|
||||||
|
if(!menu) return;
|
||||||
|
menu.removeAttribute('open');
|
||||||
|
menu.closest('tr')?.classList.remove('bu-menu-open');
|
||||||
|
const popover=menu._popover;
|
||||||
|
if(popover) {
|
||||||
|
popover.removeAttribute('style');
|
||||||
|
popover.classList.remove('portaled');
|
||||||
|
delete popover._ownerMenu;
|
||||||
|
menu.appendChild(popover);
|
||||||
|
delete menu._popover;
|
||||||
|
}
|
||||||
|
}
|
||||||
function handleActionClick(e) {
|
function handleActionClick(e) {
|
||||||
const target=e.target.closest('[data-action]');
|
const target=e.target.closest('[data-action]');
|
||||||
if(!target) return;
|
if(!target) return;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const popover=target.closest('.bu-action-menu-popover');
|
const popover=target.closest('.bu-action-menu-popover');
|
||||||
const menu=target.closest('.bu-action-menu')||popover?._ownerMenu;
|
const menu=target.closest('.bu-action-menu')||popover?._ownerMenu;
|
||||||
menu?.removeAttribute('open');
|
closeActionMenu(menu);
|
||||||
handle(target.dataset.action,target);
|
handle(target.dataset.action,target);
|
||||||
}
|
}
|
||||||
content.addEventListener('click', handleActionClick);
|
content.addEventListener('click', handleActionClick);
|
||||||
@@ -1015,7 +1029,7 @@
|
|||||||
document.addEventListener('click', e=>{
|
document.addEventListener('click', e=>{
|
||||||
document.querySelectorAll('.bu-action-menu[open]').forEach(menu=>{
|
document.querySelectorAll('.bu-action-menu[open]').forEach(menu=>{
|
||||||
const popover=menu._popover;
|
const popover=menu._popover;
|
||||||
if(!menu.contains(e.target)&&!popover?.contains(e.target)) menu.removeAttribute('open');
|
if(!menu.contains(e.target)&&!popover?.contains(e.target)) closeActionMenu(menu);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
content.addEventListener('toggle', e=>{
|
content.addEventListener('toggle', e=>{
|
||||||
@@ -1024,18 +1038,12 @@
|
|||||||
const row=menu.closest('tr');
|
const row=menu.closest('tr');
|
||||||
row?.classList.toggle('bu-menu-open',menu.open);
|
row?.classList.toggle('bu-menu-open',menu.open);
|
||||||
if(!menu.open) {
|
if(!menu.open) {
|
||||||
const popover=menu._popover;
|
closeActionMenu(menu);
|
||||||
if(popover) {
|
|
||||||
popover.removeAttribute('style');
|
|
||||||
popover.classList.remove('portaled');
|
|
||||||
delete popover._ownerMenu;
|
|
||||||
menu.appendChild(popover);
|
|
||||||
delete menu._popover;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
content.querySelectorAll('.bu-action-menu[open]').forEach(other=>{ if(other!==menu) other.removeAttribute('open'); });
|
content.querySelectorAll('.bu-action-menu[open]').forEach(other=>{ if(other!==menu) closeActionMenu(other); });
|
||||||
requestAnimationFrame(()=>{
|
requestAnimationFrame(()=>{
|
||||||
|
if(!menu.open||!menu.isConnected) return;
|
||||||
const summary=menu.querySelector('summary');
|
const summary=menu.querySelector('summary');
|
||||||
const popover=menu.querySelector('.bu-action-menu-popover');
|
const popover=menu.querySelector('.bu-action-menu-popover');
|
||||||
if(!summary||!popover||!menuPortal) return;
|
if(!summary||!popover||!menuPortal) return;
|
||||||
@@ -1056,7 +1064,7 @@
|
|||||||
Object.assign(popover.style,{left:`${left}px`,right:'auto',top:`${top}px`,bottom:'auto',width:`${width}px`,maxHeight:`${height}px`});
|
Object.assign(popover.style,{left:`${left}px`,right:'auto',top:`${top}px`,bottom:'auto',width:`${width}px`,maxHeight:`${height}px`});
|
||||||
});
|
});
|
||||||
},true);
|
},true);
|
||||||
window.addEventListener('resize',()=>document.querySelectorAll('.bu-action-menu[open]').forEach(menu=>menu.removeAttribute('open')));
|
window.addEventListener('resize',()=>document.querySelectorAll('.bu-action-menu[open]').forEach(closeActionMenu));
|
||||||
content.addEventListener('change', e => {
|
content.addEventListener('change', e => {
|
||||||
if(e.target.id==='bu-dashboard-job') {
|
if(e.target.id==='bu-dashboard-job') {
|
||||||
state.dashboardJobId=e.target.value;
|
state.dashboardJobId=e.target.value;
|
||||||
|
|||||||
Reference in New Issue
Block a user