Skip to content

Commit 8f77020

Browse files
feat: complete QoL UX bundle with safety and touch actions
1 parent ee9f8a6 commit 8f77020

6 files changed

Lines changed: 1305 additions & 52 deletions

File tree

13.9 MB
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1aaa7faf17787f1ec784e712eca0122a62ae72568d683449fb56a53486193fcd folderview.plus-2026.03.08.09.txz

folderview.plus.plg

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@
66
<!ENTITY launch "Settings/FolderViewPlus">
77
<!ENTITY plugdir "/usr/local/emhttp/plugins/&name;">
88
<!ENTITY pluginURL "https://raw.githubusercontent.com/&github;/main/folderview.plus.plg">
9-
<!ENTITY version "2026.03.08.06">
10-
<!ENTITY md5 "9a7c8551c73f86995494c5a99c64ef72">
9+
<!ENTITY version "2026.03.08.09">
10+
<!ENTITY md5 "a63c45b1b49075c44eaee8840fe549eb">
1111
]>
1212

1313
<PLUGIN name="&name;" author="&author;" version="&version;" launch="&launch;" pluginURL="&pluginURL;" icon="folder-icon.png" support="https://github.com/alexphillips-dev/FolderView-Plus/issues" min="7.0.0">
1414
<CHANGES>
1515

16+
###2026.03.08.09
17+
- Maintenance: automated release metadata update.
18+
19+
20+
###2026.03.08.07
21+
- Maintenance: automated release metadata update.
22+
23+
1624
###2026.03.08.06
1725
- Theme compatibility hardening: scoped settings-page focus styling to plugin root container only.
1826
- Theme compatibility hardening: replaced global `body` bottom-padding rule with plugin-root scoped padding.

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/FolderViewPlus.page

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ emitRequestTokenMetaTag();
2222
<div id="fv-settings-root" class="fv-theme-safe">
2323
<div id="fv-settings-topbar"></div>
2424
<div id="fv-update-notes-panel" class="fv-update-notes-panel" style="display:none"></div>
25+
<div id="fv-activity-feed-panel" class="fv-activity-feed-panel" style="display:none;">
26+
<div class="fv-activity-feed-head">
27+
<strong>Recent activity</strong>
28+
<button type="button" onclick="clearActivityFeed()"><i class="fa fa-times"></i> Clear</button>
29+
</div>
30+
<ul id="fv-activity-feed-list" class="fv-activity-feed-list"></ul>
31+
</div>
2532

2633
<div class="fv-customizations-header" data-fv-section-row="1">
2734
<h2 data-i18n="customizations" data-fv-section="customizations">Customizations</h2>
@@ -30,6 +37,13 @@ emitRequestTokenMetaTag();
3037
<button onclick="checkForUpdatesNow()"><i class="fa fa-refresh" aria-hidden="true"></i> Check for updates now</button>
3138
<button onclick="createRollbackCheckpoint()"><i class="fa fa-life-ring" aria-hidden="true"></i> Create rollback checkpoint</button>
3239
<button onclick="rollbackLatestCheckpoint()"><i class="fa fa-undo" aria-hidden="true"></i> Rollback to previous snapshot</button>
40+
<div class="fv-quick-presets">
41+
<span class="fv-quick-presets-title">Quick profile presets</span>
42+
<button type="button" onclick="applyQuickProfilePreset('balanced')"><i class="fa fa-sliders"></i> Balanced</button>
43+
<button type="button" onclick="applyQuickProfilePreset('minimal')"><i class="fa fa-leaf"></i> Minimal</button>
44+
<button type="button" onclick="applyQuickProfilePreset('power')"><i class="fa fa-bolt"></i> Power</button>
45+
<button type="button" onclick="applyQuickProfilePreset('media_stack')"><i class="fa fa-play-circle"></i> Media Stack</button>
46+
</div>
3347
<span id="update-check-status" class="status-line"></span>
3448
<span id="rollback-status" class="status-line"></span>
3549

@@ -60,6 +74,14 @@ emitRequestTokenMetaTag();
6074
<span class="sort-hint-chip" title="Use manual mode and the up/down buttons in the first column to set custom order."><i class="fa fa-info-circle"></i> Manual uses up/down in Order column</span>
6175
</div>
6276
<input id="docker-folder-filter" type="text" placeholder="Search Docker folders" oninput="setFilterQuery('folders','docker',this.value)">
77+
<div id="docker-quick-filters" class="folder-quick-filters">
78+
<button type="button" data-filter="all" onclick="setQuickFolderFilter('docker','all')">All</button>
79+
<button type="button" data-filter="pinned" onclick="setQuickFolderFilter('docker','pinned')">Pinned</button>
80+
<button type="button" data-filter="stopped" onclick="setQuickFolderFilter('docker','stopped')">Stopped</button>
81+
<button type="button" data-filter="empty" onclick="setQuickFolderFilter('docker','empty')">Empty</button>
82+
<button type="button" data-filter="no-rules" onclick="setQuickFolderFilter('docker','no-rules')">No rules</button>
83+
<button type="button" data-filter="has-updates" onclick="setQuickFolderFilter('docker','has-updates')">Has updates</button>
84+
</div>
6385
<div class="settings-cards-grid">
6486
<div class="settings-mini-card">
6587
<div class="settings-mini-title">Layout</div>
@@ -166,6 +188,13 @@ emitRequestTokenMetaTag();
166188
<span class="sort-hint-chip" title="Use manual mode and the up/down buttons in the first column to set custom order."><i class="fa fa-info-circle"></i> Manual uses up/down in Order column</span>
167189
</div>
168190
<input id="vm-folder-filter" type="text" placeholder="Search VM folders" oninput="setFilterQuery('folders','vm',this.value)">
191+
<div id="vm-quick-filters" class="folder-quick-filters">
192+
<button type="button" data-filter="all" onclick="setQuickFolderFilter('vm','all')">All</button>
193+
<button type="button" data-filter="pinned" onclick="setQuickFolderFilter('vm','pinned')">Pinned</button>
194+
<button type="button" data-filter="stopped" onclick="setQuickFolderFilter('vm','stopped')">Stopped</button>
195+
<button type="button" data-filter="empty" onclick="setQuickFolderFilter('vm','empty')">Empty</button>
196+
<button type="button" data-filter="no-rules" onclick="setQuickFolderFilter('vm','no-rules')">No rules</button>
197+
</div>
169198
<div class="settings-cards-grid">
170199
<div class="settings-mini-card">
171200
<div class="settings-mini-title">Layout</div>
@@ -277,8 +306,14 @@ emitRequestTokenMetaTag();
277306
<input id="docker-rule-test-label-value" type="text" placeholder="Test label value (optional)">
278307
<input id="docker-rule-test-image" type="text" placeholder="Test image (optional, example: linuxserver/sonarr)">
279308
<input id="docker-rule-test-compose" type="text" placeholder="Test compose project (optional)">
309+
<div class="rule-test-samples">
310+
<button type="button" onclick="applyRuleTestSample('docker','media')"><i class="fa fa-flask"></i> Media sample</button>
311+
<button type="button" onclick="applyRuleTestSample('docker','network')"><i class="fa fa-flask"></i> Network sample</button>
312+
<button type="button" onclick="applyRuleTestSample('docker','database')"><i class="fa fa-flask"></i> Database sample</button>
313+
</div>
280314
<button onclick="testAutoRule('docker')"><i class="fa fa-flask"></i> Test rule priority</button>
281315
<button onclick="runRuleSimulator('docker')"><i class="fa fa-list-alt"></i> Simulate all items</button>
316+
<div id="docker-rule-validation" class="inline-validation-hint"></div>
282317
<div id="docker-rule-test-output" class="rule-test-output"></div>
283318
</div>
284319
<input id="docker-rules-filter" type="text" placeholder="Search Docker rules" oninput="setFilterQuery('rules','docker',this.value)">
@@ -322,8 +357,13 @@ emitRequestTokenMetaTag();
322357
</div>
323358
<div class="rule-tester">
324359
<input id="vm-rule-test-name" type="text" placeholder="Test VM name (example: prod-db)">
360+
<div class="rule-test-samples">
361+
<button type="button" onclick="applyRuleTestSample('vm','production')"><i class="fa fa-flask"></i> Production sample</button>
362+
<button type="button" onclick="applyRuleTestSample('vm','desktop')"><i class="fa fa-flask"></i> Desktop sample</button>
363+
</div>
325364
<button onclick="testAutoRule('vm')"><i class="fa fa-flask"></i> Test rule priority</button>
326365
<button onclick="runRuleSimulator('vm')"><i class="fa fa-list-alt"></i> Simulate all items</button>
366+
<div id="vm-rule-validation" class="inline-validation-hint"></div>
327367
<div id="vm-rule-test-output" class="rule-test-output"></div>
328368
</div>
329369
<input id="vm-rules-filter" type="text" placeholder="Search VM rules" oninput="setFilterQuery('rules','vm',this.value)">
@@ -514,6 +554,7 @@ emitRequestTokenMetaTag();
514554
<input id="docker-template-name" type="text" placeholder="Template name">
515555
<button onclick="createTemplateFromFolder('docker')"><i class="fa fa-save"></i> Save template from folder</button>
516556
</div>
557+
<div id="docker-template-validation" class="inline-validation-hint"></div>
517558
<input id="docker-templates-filter" type="text" placeholder="Search Docker templates" oninput="setFilterQuery('templates','docker',this.value)">
518559
<div class="selection-actions">
519560
<button onclick="bulkTemplateAction('docker','delete')"><i class="fa fa-trash"></i> Delete selected</button>
@@ -542,6 +583,7 @@ emitRequestTokenMetaTag();
542583
<input id="vm-template-name" type="text" placeholder="Template name">
543584
<button onclick="createTemplateFromFolder('vm')"><i class="fa fa-save"></i> Save template from folder</button>
544585
</div>
586+
<div id="vm-template-validation" class="inline-validation-hint"></div>
545587
<input id="vm-templates-filter" type="text" placeholder="Search VM templates" oninput="setFilterQuery('templates','vm',this.value)">
546588
<div class="selection-actions">
547589
<button onclick="bulkTemplateAction('vm','delete')"><i class="fa fa-trash"></i> Delete selected</button>
@@ -658,6 +700,8 @@ emitRequestTokenMetaTag();
658700
</select>
659701
<div id="import-mode-help">Optional dry run: enable preview-only mode if you want to review without applying changes.</div>
660702
<label id="import-dry-run-row"><input id="import-dry-run-only" type="checkbox"> Dry run only (preview changes, do not modify folders)</label>
703+
<label id="import-preview-first-row"><input id="import-preview-first-toggle" type="checkbox" checked> Preview diff first (recommended)</label>
704+
<label id="import-review-ack-row" style="display:none;"><input id="import-review-ack" type="checkbox"> I reviewed the diff and selected operations</label>
661705
</div>
662706
</div>
663707
<div class="import-preview-card">
@@ -701,6 +745,7 @@ emitRequestTokenMetaTag();
701745
<div id="fv-setup-assistant-dialog" style="display:none;" role="dialog" aria-modal="true" aria-labelledby="fv-setup-assistant-title">
702746
<div id="fv-setup-assistant-content"></div>
703747
</div>
748+
<div id="fv-toast-host" class="fv-toast-host" aria-live="polite" aria-atomic="false"></div>
704749

705750
<div id="fv-settings-action-bar"></div>
706751
</div>

0 commit comments

Comments
 (0)