diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7ded1e01..538fb1a2 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -36,16 +36,16 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Initialize CodeQL - uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4 + uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4 with: languages: javascript queries: security-extended,security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4 + uses: github/codeql-action/autobuild@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4 + uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4 - name: Enforce zero open alerts for analyzed commit env: diff --git a/.github/workflows/dependency-vulnerability-scan.yml b/.github/workflows/dependency-vulnerability-scan.yml index 6a7244d6..32983c1a 100644 --- a/.github/workflows/dependency-vulnerability-scan.yml +++ b/.github/workflows/dependency-vulnerability-scan.yml @@ -31,7 +31,7 @@ jobs: - name: Scan generated SBOM against OSV id: scan continue-on-error: true - uses: google/osv-scanner-action/osv-scanner-action@06b2ab4348248b456ee06c9e953637f55e03504f # v2.5.0 + uses: google/osv-scanner-action/osv-scanner-action@ffa0a5f39214d80778c9b494822d94d0d9668458 # v2.5.0 with: scan-args: |- --output=results.json @@ -42,7 +42,7 @@ jobs: id: report if: ${{ !cancelled() }} continue-on-error: true - uses: google/osv-scanner-action/osv-reporter-action@06b2ab4348248b456ee06c9e953637f55e03504f # v2.5.0 + uses: google/osv-scanner-action/osv-reporter-action@ffa0a5f39214d80778c9b494822d94d0d9668458 # v2.5.0 with: scan-args: |- --output=results.sarif @@ -61,7 +61,7 @@ jobs: - name: Upload OSV results to code scanning if: ${{ !cancelled() && hashFiles('results.sarif') != '' }} - uses: github/codeql-action/upload-sarif@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4 + uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4 with: sarif_file: results.sarif diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 76ebf5f5..783fe5ab 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -41,7 +41,7 @@ jobs: publish_results: true - name: Upload Scorecard results to code scanning - uses: github/codeql-action/upload-sarif@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4 + uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4 with: sarif_file: results.sarif diff --git a/archive/folderview.plus-2026.08.18.05.txz b/archive/folderview.plus-2026.08.18.05.txz deleted file mode 100644 index a1faab30..00000000 Binary files a/archive/folderview.plus-2026.08.18.05.txz and /dev/null differ diff --git a/archive/folderview.plus-2026.08.18.05.txz.sha256 b/archive/folderview.plus-2026.08.18.05.txz.sha256 deleted file mode 100644 index c74237f1..00000000 --- a/archive/folderview.plus-2026.08.18.05.txz.sha256 +++ /dev/null @@ -1 +0,0 @@ -b406110abdd91851595019023780312c314da44af8f6da37c7c33c2f7aecda86 folderview.plus-2026.08.18.05.txz diff --git a/archive/folderview.plus-2026.08.28.05.txz b/archive/folderview.plus-2026.08.28.05.txz deleted file mode 100644 index 3a2cd91f..00000000 Binary files a/archive/folderview.plus-2026.08.28.05.txz and /dev/null differ diff --git a/archive/folderview.plus-2026.08.28.05.txz.sha256 b/archive/folderview.plus-2026.08.28.05.txz.sha256 deleted file mode 100644 index 952d2ef3..00000000 --- a/archive/folderview.plus-2026.08.28.05.txz.sha256 +++ /dev/null @@ -1 +0,0 @@ -f71ee236840caadc58c6e22630a311670fa39d39f48293d086182cf0bb4dae88 folderview.plus-2026.08.28.05.txz diff --git a/archive/folderview.plus-2026.09.03.01.txz b/archive/folderview.plus-2026.09.03.01.txz new file mode 100644 index 00000000..15958008 Binary files /dev/null and b/archive/folderview.plus-2026.09.03.01.txz differ diff --git a/archive/folderview.plus-2026.09.03.01.txz.sha256 b/archive/folderview.plus-2026.09.03.01.txz.sha256 new file mode 100644 index 00000000..0c9f7085 --- /dev/null +++ b/archive/folderview.plus-2026.09.03.01.txz.sha256 @@ -0,0 +1 @@ +c9b804d8771c3cd1e492e4a6606e07d3b57546fd43940dba4db225efef5e210b folderview.plus-2026.09.03.01.txz diff --git a/archive/folderview.plus-2026.09.03.02.txz b/archive/folderview.plus-2026.09.03.02.txz new file mode 100644 index 00000000..a1be1799 Binary files /dev/null and b/archive/folderview.plus-2026.09.03.02.txz differ diff --git a/archive/folderview.plus-2026.09.03.02.txz.sha256 b/archive/folderview.plus-2026.09.03.02.txz.sha256 new file mode 100644 index 00000000..808439da --- /dev/null +++ b/archive/folderview.plus-2026.09.03.02.txz.sha256 @@ -0,0 +1 @@ +e5eeddfb6da6b357f5e8f76ef2ff41c601fdb33019f307e85eafee61c3401867 folderview.plus-2026.09.03.02.txz diff --git a/docs/releases/2026.09.03.01.md b/docs/releases/2026.09.03.01.md new file mode 100644 index 00000000..c7357e6c --- /dev/null +++ b/docs/releases/2026.09.03.01.md @@ -0,0 +1,7 @@ +- Fix: Make folder status text inherit the active Unraid theme by default so it remains dark and readable on white themes and light on dark themes across Docker, VM, Dashboard, and multi-row preview surfaces. +- UI/UX: Add a clearly labeled **Theme default** option beside the folder status Text picker; changing the picker creates a custom override, while resetting status colors restores automatic theme behavior. +- Compatibility: Migrate unmarked white status-text values introduced by the previous default to automatic theme text, preserve existing non-white custom colors, and retain deliberately selected white after it is saved with the new explicit override marker. +- Reliability: Prevent **Lock status colors** from forcing white text when the Text color remains automatic, while continuing to lock explicitly selected custom text colors. +- Diagnostics: Report whether folder status text uses the theme or a custom override without exposing folder identities; include the custom color only when an override is active. +- Localization: Translate the Theme default control and updated status-color guidance across all 27 supported locales. +- Test: Add isolated migration, locked-color, CSS token, Dashboard computed-style, editor persistence, localization, and browser fixture coverage for automatic and explicit status-text colors. diff --git a/docs/releases/2026.09.03.02.md b/docs/releases/2026.09.03.02.md new file mode 100644 index 00000000..2aa0dbb7 --- /dev/null +++ b/docs/releases/2026.09.03.02.md @@ -0,0 +1,9 @@ +- Fix: Make folder status text follow the active Unraid theme by default, keeping it dark and readable on white themes and light on dark themes across Docker, VM, Dashboard, and multi-row preview surfaces. +- UI/UX: Add a localized **Theme default** option beside the folder status Text picker. Choosing a Text color creates a custom override; resetting the status palette restores automatic theme behavior. +- Compatibility: Migrate unmarked white status-text values from the previous default to automatic theme text, preserve existing non-white custom colors, and retain deliberately selected white after it is saved with the new explicit override marker. +- Reliability: Prevent **Lock status colors** from forcing white text while Text remains automatic, while continuing to lock explicitly selected custom text colors. +- Diagnostics: Report whether each privacy-safe folder status-text result uses the active theme or a custom override, and include a color value only for an active custom override. +- Localization: Translate the Theme default control and updated status-color guidance across all 27 supported locales. +- Security: Refresh the immutable CodeQL and OSV workflow action revisions used by automated code and dependency scanning. +- Maintenance: Update the OpenCC localization quality tool to 1.4.2. +- Test: Add migration, locked-color, CSS-token, Dashboard computed-style, editor persistence, localization, browser fixture, package, and runtime-performance coverage for automatic and explicit status-text colors. diff --git a/docs/sbom.cdx.json b/docs/sbom.cdx.json index 6a2f0fd5..778a0041 100644 --- a/docs/sbom.cdx.json +++ b/docs/sbom.cdx.json @@ -1,13 +1,13 @@ { "bomFormat": "CycloneDX", "specVersion": "1.5", - "serialNumber": "urn:uuid:e1de95ce-ed49-8928-999c-a260ac5c59c3", + "serialNumber": "urn:uuid:6d3f5b78-7a1e-8b8f-a843-e18cbd36b22e", "version": 1, "metadata": { "component": { "type": "application", "name": "FolderView Plus", - "version": "2026.08.28.05", + "version": "2026.09.03.02", "properties": [ { "name": "folderview-plus:runtime-dependencies", @@ -106,9 +106,9 @@ { "type": "application", "name": "github/codeql-action", - "version": "ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd", + "version": "cdf488f595d80d6e07e03d4674febd5ab45fa938", "scope": "optional", - "purl": "pkg:github/github/codeql-action@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd", + "purl": "pkg:github/github/codeql-action@cdf488f595d80d6e07e03d4674febd5ab45fa938", "properties": [ { "name": "folderview-plus:usage", @@ -119,9 +119,9 @@ { "type": "application", "name": "google/osv-scanner-action", - "version": "06b2ab4348248b456ee06c9e953637f55e03504f", + "version": "ffa0a5f39214d80778c9b494822d94d0d9668458", "scope": "optional", - "purl": "pkg:github/google/osv-scanner-action@06b2ab4348248b456ee06c9e953637f55e03504f", + "purl": "pkg:github/google/osv-scanner-action@ffa0a5f39214d80778c9b494822d94d0d9668458", "properties": [ { "name": "folderview-plus:usage", @@ -1004,7 +1004,7 @@ { "type": "library", "name": "opencc-js", - "version": "1.4.1", + "version": "1.4.2", "scope": "optional", "licenses": [ { @@ -1013,7 +1013,7 @@ } } ], - "purl": "pkg:npm/opencc-js@1.4.1" + "purl": "pkg:npm/opencc-js@1.4.2" }, { "type": "library", diff --git a/folderview.plus.plg b/folderview.plus.plg index 9e179046..5c3ebafb 100644 --- a/folderview.plus.plg +++ b/folderview.plus.plg @@ -6,9 +6,9 @@ - - - + + + @@ -18,22 +18,26 @@ -###2026.08.28.05 -- Feature: Add a fourth **Hide** quick action to Docker folder menus, including nested-branch hiding, a temporary **Show hidden folders** view, **Restore all hidden folders**, and an immediate 10-second **Undo** action without deleting folder configuration or changing Unraid's native Host list. -- Feature: Add reusable custom WebUI profiles to each Docker folder so any number of named profiles can open only the selected running, unpaused container WebUIs, with create, duplicate, reorder, search, unavailable-member, and delete controls in the modern folder editor. -- Fix: Restore reliable container and child-folder context menus across single-row, multi-row, nested, collapsed, Preview Rows 1+, Unlimited, and Unraid Basic or Advanced View layouts, including mouse, right-click, touch, Enter, and Space activation. -- Fix: Show consistent lifecycle progress on single-row and multi-row Docker previews, keep Restart pending through its initial running snapshot, and use the action's destination status color until reconciliation completes. -- UI/UX: Use Unraid's native green started indicator with white status text by default, add a separate **Text** color picker, and apply customized Started, Paused, Stopped, and Text colors consistently across Docker, VM, Dashboard, inherited defaults, and starter templates. -- UI/UX: Make hidden-folder recovery, Undo, and custom WebUI profile controls theme-aware, responsive, and keyboard accessible instead of inheriting Unraid's orange button treatment. -- Reliability: Persist hidden-folder choices through conflict-safe preference updates, preserve profiles through clone, export/import, backup, restore, and unique member renames, and keep folder-specific profiles out of generic settings transfers and defaults that may target unrelated containers. -- Compatibility: Preserve explicitly selected white started indicators while migrating only the old unmodified white default to green, and acknowledge Unraid API v4.37.3 while keeping current legacy Docker behavior and future API capability monitoring bounded and fail-closed. -- Security: Reject malformed non-string folder names and container identifiers without invoking attacker-controlled coercion hooks, strengthen property-based input coverage, and tighten repository security-policy, CodeQL, workflow-permission, package-trust, and release contracts. -- Privacy: Extend sanitized diagnostics with aggregate context-menu, lifecycle, hidden-folder, and WebUI-profile health evidence while withholding folder names, container names, profile names, URLs, selectors, coordinates, and other runtime identities. -- Localization: Translate the new hidden-folder, WebUI-profile, and status-text interfaces across all 27 supported locales and keep dynamic Docker menu labels covered by strict localization validation. -- UX: Improve GitHub bug, support, feature, and translation intake forms with clearer reproduction, version, branch, diagnostics, privacy, compatibility, and testing fields. -- Maintenance: Add proactive Unraid/API compatibility checks, dependency and SBOM vulnerability monitoring, scheduled workflow watchdogs, manual CodeQL recovery checks, exact-tool CodeQL alert filtering, and validated main-to-dev back-merge ordering without introducing live-Unraid automation. -- Compatibility: No manual migration is required. Existing folders, assignments, rules, colors, backups, and imports remain compatible; hidden-folder state is reversible, and custom WebUI profiles remain scoped to their Docker folder. -- Test: Expand isolated browser, mobile, keyboard, theme, localization, fuzz, security, diagnostics, workflow, and large-library performance coverage for every behavior in this release. +###2026.09.03.02 +- Fix: Make folder status text follow the active Unraid theme by default, keeping it dark and readable on white themes and light on dark themes across Docker, VM, Dashboard, and multi-row preview surfaces. +- UI/UX: Add a localized **Theme default** option beside the folder status Text picker. Choosing a Text color creates a custom override; resetting the status palette restores automatic theme behavior. +- Compatibility: Migrate unmarked white status-text values from the previous default to automatic theme text, preserve existing non-white custom colors, and retain deliberately selected white after it is saved with the new explicit override marker. +- Reliability: Prevent **Lock status colors** from forcing white text while Text remains automatic, while continuing to lock explicitly selected custom text colors. +- Diagnostics: Report whether each privacy-safe folder status-text result uses the active theme or a custom override, and include a color value only for an active custom override. +- Localization: Translate the Theme default control and updated status-color guidance across all 27 supported locales. +- Security: Refresh the immutable CodeQL and OSV workflow action revisions used by automated code and dependency scanning. +- Maintenance: Update the OpenCC localization quality tool to 1.4.2. +- Test: Add migration, locked-color, CSS-token, Dashboard computed-style, editor persistence, localization, browser fixture, package, and runtime-performance coverage for automatic and explicit status-text colors. + + +###2026.09.03.01 +- Fix: Make folder status text inherit the active Unraid theme by default so it remains dark and readable on white themes and light on dark themes across Docker, VM, Dashboard, and multi-row preview surfaces. +- UI/UX: Add a clearly labeled **Theme default** option beside the folder status Text picker; changing the picker creates a custom override, while resetting status colors restores automatic theme behavior. +- Compatibility: Migrate unmarked white status-text values introduced by the previous default to automatic theme text, preserve existing non-white custom colors, and retain deliberately selected white after it is saved with the new explicit override marker. +- Reliability: Prevent **Lock status colors** from forcing white text when the Text color remains automatic, while continuing to lock explicitly selected custom text colors. +- Diagnostics: Report whether folder status text uses the theme or a custom override without exposing folder identities; include the custom color only when an override is active. +- Localization: Translate the Theme default control and updated status-color guidance across all 27 supported locales. +- Test: Add isolated migration, locked-color, CSS token, Dashboard computed-style, editor persistence, localization, and browser fixture coverage for automatic and explicit status-text colors. ###2026.08.28.04 diff --git a/folderview.plus.xml b/folderview.plus.xml index 5a7ada84..ba56296d 100644 --- a/folderview.plus.xml +++ b/folderview.plus.xml @@ -10,7 +10,7 @@ FolderView Plus organizes Docker, VM, and Dashboard views into folders in Unraid, with starter setup tools, rules, bulk assignment, recovery, templates, and diagnostics. -2026-08-28 +2026-09-03 7.0.0 folder view docker vm dashboard organization groups sorting import export backup recovery rules templates diagnostics https://forums.unraid.net/topic/197631-plugin-folderview-plus/ diff --git a/package-lock.json b/package-lock.json index ea953161..a2fab62c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "c8": "12.0.0", "fast-check": "4.9.0", "jquery": "3.7.1", - "opencc-js": "1.4.1", + "opencc-js": "1.4.2", "playwright": "1.62.1" } }, @@ -468,9 +468,9 @@ } }, "node_modules/opencc-js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/opencc-js/-/opencc-js-1.4.1.tgz", - "integrity": "sha512-2lPLcrg7cnh1ATSduOxhnk/jq6KlR6w+5Ihl4wF7Z5e5Rva4vxTyugV5rZ7EiUCOZl+EDOLetIix+BhgYDCC+A==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/opencc-js/-/opencc-js-1.4.2.tgz", + "integrity": "sha512-EdcspgdROiCCZDM+jZR6Pa670xW+EW2QhctPBQ8gRjg6lrx4IHEl+2s+kt5izk/TkxVRgdWuFgaGkaEdIUfdaw==", "dev": true, "license": "MIT AND Apache-2.0" }, diff --git a/package.json b/package.json index 47883889..fe3194f2 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "c8": "12.0.0", "fast-check": "4.9.0", "jquery": "3.7.1", - "opencc-js": "1.4.1", + "opencc-js": "1.4.2", "playwright": "1.62.1" } } diff --git a/scripts/fixture_browser_tests.mjs b/scripts/fixture_browser_tests.mjs index 976ccdea..e33d85ce 100644 --- a/scripts/fixture_browser_tests.mjs +++ b/scripts/fixture_browser_tests.mjs @@ -7,7 +7,7 @@ import { createFixtureBrowserServer } from './lib/fixture-browser-server.mjs'; import { runFixtureBrowserSuite } from './lib/fixture-browser-runner.mjs'; import { registerFoundationFixtureCases } from '../tests/browser/cases/foundation.mjs'; import { registerDockerFixtureCases } from '../tests/browser/cases/docker.mjs'; -import { registerDashboardLifecycleFixtureCases } from '../tests/browser/cases/dashboard-lifecycle.mjs'; +import { registerDashboardLifecycleFixtureCases } from '../tests/browser/cases/dashboard-lifecycle.mjs'; import { registerStatusTextThemeFixtureCase } from '../tests/browser/cases/status-text-theme.mjs'; import { registerRuntimeInteractionsFixtureCases } from '../tests/browser/cases/runtime-interactions.mjs'; import { registerDockerHiddenFolderFixtureCases } from '../tests/browser/cases/docker-hidden-folders.mjs'; import { registerSettingsFixtureCases } from '../tests/browser/cases/settings.mjs'; @@ -44,7 +44,7 @@ const test = (name, handler, options = {}) => tests.push({ name, handler, ...opt const caseContext = { test, baseUrl, surfaceKeyFor, germanSurfaceCatalog }; registerFoundationFixtureCases(caseContext); registerDockerFixtureCases(caseContext); -registerDashboardLifecycleFixtureCases(caseContext); +registerDashboardLifecycleFixtureCases(caseContext); registerStatusTextThemeFixtureCase(caseContext); registerRuntimeInteractionsFixtureCases(caseContext); registerDockerHiddenFolderFixtureCases(caseContext); registerSettingsFixtureCases(caseContext); diff --git a/scripts/test_runner_contracts.json b/scripts/test_runner_contracts.json index 1cd3eafe..e5673e68 100644 --- a/scripts/test_runner_contracts.json +++ b/scripts/test_runner_contracts.json @@ -12,6 +12,7 @@ "../tests/browser/cases/foundation.mjs", "../tests/browser/cases/docker.mjs", "../tests/browser/cases/dashboard-lifecycle.mjs", + "../tests/browser/cases/status-text-theme.mjs", "../tests/browser/cases/runtime-interactions.mjs", "../tests/browser/cases/docker-hidden-folders.mjs", "../tests/browser/cases/settings.mjs", @@ -30,6 +31,7 @@ { "file": "tests/browser/cases/foundation.mjs", "limit": 260, "owner": "fixture foundation cases" }, { "file": "tests/browser/cases/docker.mjs", "limit": 220, "owner": "fixture Docker cases" }, { "file": "tests/browser/cases/dashboard-lifecycle.mjs", "limit": 365, "owner": "fixture Dashboard and VM lifecycle cases" }, + { "file": "tests/browser/cases/status-text-theme.mjs", "limit": 18, "owner": "fixture status text theme and explicit override case" }, { "file": "tests/browser/cases/runtime-interactions.mjs", "limit": 155, "owner": "fixture runtime interaction cases" }, { "file": "tests/browser/cases/docker-hidden-folders.mjs", "limit": 27, "owner": "fixture hidden-folder recovery cases" }, { "file": "tests/browser/helpers/docker-hidden-folder-context.mjs", "limit": 32, "owner": "fixture hidden-folder timing and theme assertions" }, @@ -46,6 +48,7 @@ "tests/browser/cases/foundation.mjs", "tests/browser/cases/docker.mjs", "tests/browser/cases/dashboard-lifecycle.mjs", + "tests/browser/cases/status-text-theme.mjs", "tests/browser/cases/runtime-interactions.mjs", "tests/browser/cases/docker-hidden-folders.mjs", "tests/browser/cases/settings.mjs", @@ -62,10 +65,10 @@ "tests/browser/helpers/docker-preview-context.mjs", "tests/browser/helpers/docker-hidden-folder-context.mjs" ], - "testCount": 49, - "assertionCount": 617, + "testCount": 50, + "assertionCount": 619, "pageEvaluateCount": 124, - "orderedTitleSha256": "8d5719c0e640edebabad9e8721447f53f85350e8555b26a4e890cfdab1a5a804" + "orderedTitleSha256": "07bd86e810827798a790c6fba302f7bcfe546a1c1dc08f2ffba50473a02cfe9d" } } } diff --git a/src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/Folder.page b/src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/Folder.page index 9ed132f3..0a6aa8c7 100644 --- a/src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/Folder.page +++ b/src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/Folder.page @@ -903,6 +903,10 @@ try { Text +