diff --git a/Plugin/unraid/pages/rsync.php b/Plugin/unraid/pages/rsync.php
index a4d88e2..86a3a9d 100644
--- a/Plugin/unraid/pages/rsync.php
+++ b/Plugin/unraid/pages/rsync.php
@@ -591,6 +591,18 @@ function _dur(s) {
return sec + 's';
}
+// Escapes text going INSIDE a double-quoted HTML attribute. A bare " there ends the attribute
+// early and silently destroys everything after it — an onclick built by string concatenation
+// becomes a syntax error and the element simply stops responding, with nothing logged.
+//
+// Duplicated from scheduler.php rather than shared: js/varaverk.js is loaded after the page
+// partials, so a page cannot rely on it during its own setup. Four lines in two places beats a
+// load-order bug that only shows up on a slow load.
+function vvRyEscAttr(s) {
+ return String(s).replace(/&/g,'&').replace(/"/g,'"')
+ .replace(//g,'>');
+}
+
// ── Status + active card ──────────────────────────────────────────────────────
function _statusCard(data) {
const en = data.enabled;
@@ -1207,14 +1219,14 @@ function vvRyEBrowse(key) {
let h = '';
if (d.parent) {
const pn = d.parent === '/' ? '/' : (d.parent.replace(/^.*\//,'') || d.parent) + '/';
- h += `
↑ ${pn}
`;
+ h += `
↑ ${pn}
`;
}
if (!d.dirs.length) {
h += '
— empty —
';
} else {
for (const dir of d.dirs) {
const name = dir.replace(/^.*\//,'') || dir;
- h += `
`;
}
if (!dirs.length) {
@@ -1661,7 +1673,7 @@ function _vvMsRenderDirs(dirsElId, dirs, parent, navFn) {
} else {
for (const d of dirs) {
const name = d.replace(/^.*\//, '') || d;
- html += `