@@ -46,6 +46,12 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
4646 <label><input id="docker-badge-stopped" type="checkbox" onchange="changeBadgePref('docker', 'stopped', this.checked)"> Stopped</label>
4747 <label><input id="docker-badge-updates" type="checkbox" onchange="changeBadgePref('docker', 'updates', this.checked)"> Updates</label>
4848 </div>
49+ <div class="badge-toggle-row">
50+ <span class="badge-toggle-title">Runtime</span>
51+ <label><input id="docker-live-refresh-enabled" type="checkbox" onchange="changeRuntimePref('docker', 'liveRefreshEnabled', this.checked)"> Live auto-refresh</label>
52+ <label>Interval (sec): <input id="docker-live-refresh-seconds" type="number" min="10" max="300" step="1" onchange="changeRuntimePref('docker', 'liveRefreshSeconds', this.value)"></label>
53+ <label><input id="docker-performance-mode" type="checkbox" onchange="changeRuntimePref('docker', 'performanceMode', this.checked)"> Performance mode</label>
54+ </div>
4955 </div>
5056 </div>
5157 <div class="table-wrap">
@@ -94,6 +100,12 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
94100 <label><input id="vm-badge-running" type="checkbox" onchange="changeBadgePref('vm', 'running', this.checked)"> Running</label>
95101 <label><input id="vm-badge-stopped" type="checkbox" onchange="changeBadgePref('vm', 'stopped', this.checked)"> Stopped</label>
96102 </div>
103+ <div class="badge-toggle-row">
104+ <span class="badge-toggle-title">Runtime</span>
105+ <label><input id="vm-live-refresh-enabled" type="checkbox" onchange="changeRuntimePref('vm', 'liveRefreshEnabled', this.checked)"> Live auto-refresh</label>
106+ <label>Interval (sec): <input id="vm-live-refresh-seconds" type="number" min="10" max="300" step="1" onchange="changeRuntimePref('vm', 'liveRefreshSeconds', this.value)"></label>
107+ <label><input id="vm-performance-mode" type="checkbox" onchange="changeRuntimePref('vm', 'performanceMode', this.checked)"> Performance mode</label>
108+ </div>
97109 </div>
98110 </div>
99111 <div class="table-wrap">
@@ -129,9 +141,17 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
129141 </div>
130142 <div class="rules-editor">
131143 <select id="docker-rule-folder"></select>
144+ <select id="docker-rule-effect">
145+ <option value="include">Include</option>
146+ <option value="exclude">Exclude</option>
147+ </select>
132148 <select id="docker-rule-kind" onchange="toggleRuleKindFields('docker')">
133149 <option value="name_regex">Name regex</option>
134- <option value="label">Docker label</option>
150+ <option value="label">Label equals</option>
151+ <option value="label_contains">Label contains</option>
152+ <option value="label_starts_with">Label starts with</option>
153+ <option value="image_regex">Image regex</option>
154+ <option value="compose_project_regex">Compose project regex</option>
135155 </select>
136156 <input id="docker-rule-pattern" type="text" placeholder="Regex pattern (example: ^media-)">
137157 <input id="docker-rule-label-key" type="text" placeholder="Label key (example: com.example.stack)" style="display:none;">
@@ -142,6 +162,8 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
142162 <input id="docker-rule-test-name" type="text" placeholder="Test name (example: media-server)">
143163 <input id="docker-rule-test-label-key" type="text" placeholder="Test label key (optional)">
144164 <input id="docker-rule-test-label-value" type="text" placeholder="Test label value (optional)">
165+ <input id="docker-rule-test-image" type="text" placeholder="Test image (optional, example: linuxserver/sonarr)">
166+ <input id="docker-rule-test-compose" type="text" placeholder="Test compose project (optional)">
145167 <button onclick="testAutoRule('docker')"><i class="fa fa-flask"></i> Test rule priority</button>
146168 <div id="docker-rule-test-output" class="rule-test-output"></div>
147169 </div>
@@ -165,6 +187,10 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
165187 </div>
166188 <div class="rules-editor">
167189 <select id="vm-rule-folder"></select>
190+ <select id="vm-rule-effect">
191+ <option value="include">Include</option>
192+ <option value="exclude">Exclude</option>
193+ </select>
168194 <select id="vm-rule-kind">
169195 <option value="name_regex">Name regex</option>
170196 </select>
@@ -231,6 +257,12 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
231257 <button onclick="restoreLatestBackup('docker')"><i class="fa fa-history"></i> Restore latest</button>
232258 <button onclick="refreshBackups('docker')"><i class="fa fa-refresh"></i> Refresh list</button>
233259 </div>
260+ <div class="schedule-row">
261+ <label><input id="docker-backup-schedule-enabled" type="checkbox" onchange="changeBackupSchedulePref('docker', 'enabled', this.checked)"> Scheduled backups</label>
262+ <label>Interval (hours): <input id="docker-backup-interval-hours" type="number" min="1" max="168" step="1" onchange="changeBackupSchedulePref('docker', 'intervalHours', this.value)"></label>
263+ <label>Retention: <input id="docker-backup-retention" type="number" min="1" max="200" step="1" onchange="changeBackupSchedulePref('docker', 'retention', this.value)"></label>
264+ <span id="docker-backup-last-run" class="schedule-hint"></span>
265+ </div>
234266 <table class="rules-table">
235267 <thead>
236268 <tr>
@@ -254,6 +286,12 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
254286 <button onclick="restoreLatestBackup('vm')"><i class="fa fa-history"></i> Restore latest</button>
255287 <button onclick="refreshBackups('vm')"><i class="fa fa-refresh"></i> Refresh list</button>
256288 </div>
289+ <div class="schedule-row">
290+ <label><input id="vm-backup-schedule-enabled" type="checkbox" onchange="changeBackupSchedulePref('vm', 'enabled', this.checked)"> Scheduled backups</label>
291+ <label>Interval (hours): <input id="vm-backup-interval-hours" type="number" min="1" max="168" step="1" onchange="changeBackupSchedulePref('vm', 'intervalHours', this.value)"></label>
292+ <label>Retention: <input id="vm-backup-retention" type="number" min="1" max="200" step="1" onchange="changeBackupSchedulePref('vm', 'retention', this.value)"></label>
293+ <span id="vm-backup-last-run" class="schedule-hint"></span>
294+ </div>
257295 <table class="rules-table">
258296 <thead>
259297 <tr>
@@ -269,6 +307,54 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
269307</div>
270308<hr>
271309
310+ <h2>Folder templates</h2>
311+ <div class="template-grid">
312+ <div class="rules-panel">
313+ <div class="rules-header">
314+ <h3>Docker templates</h3>
315+ <span class="rules-help">Save folder look/behavior presets and apply them to any folder.</span>
316+ </div>
317+ <div class="template-controls">
318+ <select id="docker-template-source-folder"></select>
319+ <input id="docker-template-name" type="text" placeholder="Template name">
320+ <button onclick="createTemplateFromFolder('docker')"><i class="fa fa-save"></i> Save template from folder</button>
321+ </div>
322+ <table class="rules-table">
323+ <thead>
324+ <tr>
325+ <th>Name</th>
326+ <th>Updated</th>
327+ <th>Action</th>
328+ </tr>
329+ </thead>
330+ <tbody id="docker-templates"></tbody>
331+ </table>
332+ </div>
333+
334+ <div class="rules-panel">
335+ <div class="rules-header">
336+ <h3>VM templates</h3>
337+ <span class="rules-help">Save VM folder presets and apply them without manual reconfiguration.</span>
338+ </div>
339+ <div class="template-controls">
340+ <select id="vm-template-source-folder"></select>
341+ <input id="vm-template-name" type="text" placeholder="Template name">
342+ <button onclick="createTemplateFromFolder('vm')"><i class="fa fa-save"></i> Save template from folder</button>
343+ </div>
344+ <table class="rules-table">
345+ <thead>
346+ <tr>
347+ <th>Name</th>
348+ <th>Updated</th>
349+ <th>Action</th>
350+ </tr>
351+ </thead>
352+ <tbody id="vm-templates"></tbody>
353+ </table>
354+ </div>
355+ </div>
356+ <hr>
357+
272358<h2>Diagnostics</h2>
273359<div class="rules-panel">
274360 <div class="rules-header">
@@ -279,14 +365,31 @@ require_once('/usr/local/emhttp/plugins/folderview.plus/langs/script.php');
279365 <button onclick="runDiagnostics()"><i class="fa fa-stethoscope"></i> Run health check</button>
280366 <button onclick="repairDiagnostics('sync_docker_order')"><i class="fa fa-sort"></i> Rebuild Docker order index</button>
281367 <button onclick="repairDiagnostics('normalize_prefs')"><i class="fa fa-wrench"></i> Validate and normalize prefs</button>
368+ <button onclick="repairDiagnostics('repair_paths')"><i class="fa fa-folder-open"></i> Repair plugin paths</button>
282369 <button onclick="exportDiagnostics()"><i class="fa fa-download"></i> Export diagnostics JSON</button>
370+ <button onclick="exportSupportBundle()"><i class="fa fa-life-ring"></i> Export support bundle</button>
283371 </div>
284372 <pre id="diagnostics-output" class="diagnostics-output">Run health check to view diagnostics.</pre>
285373</div>
374+ <hr>
375+
376+ <h2>Conflict inspector</h2>
377+ <div class="rules-panel">
378+ <div class="rules-header">
379+ <h3>Folder membership conflict report</h3>
380+ <span class="rules-help">Shows why each item is assigned (manual/regex/label/rule), including overlaps and blocked rules.</span>
381+ </div>
382+ <div class="backup-actions">
383+ <button onclick="runConflictInspector('docker')"><i class="fa fa-search"></i> Scan Docker conflicts</button>
384+ <button onclick="runConflictInspector('vm')"><i class="fa fa-search"></i> Scan VM conflicts</button>
385+ </div>
386+ <pre id="conflict-output" class="diagnostics-output">Run a conflict scan to view results.</pre>
387+ </div>
286388
287389<div id="import-preview-dialog" style="display:none;">
288390 <p><strong>Import summary</strong></p>
289391 <div id="import-preview-meta" class="preview-meta"></div>
392+ <div id="import-preview-result" class="preview-result"></div>
290393 <label for="import-mode-select">Import mode</label>
291394 <select id="import-mode-select">
292395 <option value="merge">Merge</option>
0 commit comments