diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 3e797cb2..0972685b 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -159,14 +159,16 @@ reviews: entries present for the shipped version. - path: ".github/workflows/**" instructions: | - CI and the beta/main release automation: - - ci.yml gates are php -l on every PHP file, xmllint on the .plg, and a - rebuild whose md5 must equal the .plg's . Flag any of - them made non-blocking or reduced to a warning. - - release-beta.yml commits and pushes to beta directly (an irreversible - publish): the BETA_RELEASE_TOKEN pre-flight must stay a hard failure, - TZ must stay Australia/Perth because pkg_build.sh versions from date, - and the archive-exists check must stay exit 1. + CI and the release-PR automation: + - ci.yml gates are php -l on every PHP file, xmllint on the .plg, the + plg_release.py check (CHANGELOG.md must render to the committed + CHANGES block, pluginURL must name the branch, the manifest md5 must + match the served package), and a test build. Flag any of them made + non-blocking or reduced to a warning. + - release.yml is a thin caller of chodeus-ops' unraid-plugin-release + reusable: it must keep passing RELEASE_TOKEN, keep beta_branch: beta, + keep the paths filter (CHANGELOG.md included, or release-PR merges + never trigger) and the plg-release concurrency group. - Enumerate allowed states positively (== 'success' || == 'skipped'), never by negation; pin third-party actions by commit SHA; never interpolate untrusted input (PR title, branch name) into `run:`. @@ -176,7 +178,9 @@ reviews: - pkg_build.sh's guards must stay: filecount >= 10, package >= 1000 bytes, and the post-sed re-read that fails when the .plg version or md5 does not match what was built. Its rm -rf / chmod -R / sed -i - must only touch tmp/, archive/ and folder.view3.plg. + must only touch tmp/, dist/ and folder.view3.plg. The version comes + from --version (the release workflow owns numbering); never + reintroduce date or archive-glob versioning here. - copy_to_git.sh has no set -e, rm -Rf's the plugin source tree before copying, and chmod/chown -R's the WHOLE cwd — flag any change that widens a path or runs it outside the repo root; quote $CWD. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13d3c01a..a6171d6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: [main] + branches: [main, beta] pull_request: workflow_dispatch: @@ -31,15 +31,26 @@ jobs: - name: Validate plugin manifest (XML) run: xmllint --noout folder.view3.plg - - name: Test build + - name: Checkout release scripts + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + repository: chodeus/chodeus-ops + ref: 5c3687a2f488fdd69f89c36c98e790203e603109 # main + path: .ops + sparse-checkout: scripts + + # CHANGELOG.md must render to the committed CHANGES block for this branch's channel, + # pluginURL must point at this branch, and the manifest md5 must match the served package. + - name: Verify changelog, manifest and served package agree run: | - chmod +x pkg_build.sh - bash pkg_build.sh + branch="${GITHUB_BASE_REF:-$GITHUB_REF_NAME}" + channel=stable + [ "$branch" != beta ] || channel=beta + python3 .ops/scripts/plg_release.py check \ + --changelog CHANGELOG.md --plg folder.view3.plg \ + --channel "$channel" --branch "$branch" --verify-asset - - name: Verify manifest MD5 matches package + - name: Test build run: | - ver=$(grep -oP '> $GITHUB_OUTPUT - FILENAME="folder.view3-${VERSION}-x86_64-1.txz" - echo "filename=$FILENAME" >> $GITHUB_OUTPUT - echo "Beta version: $VERSION" - - - name: Verify build - run: | - VERSION="${{ steps.beta.outputs.version }}" - FILENAME="archive/folder.view3-${VERSION}-x86_64-1.txz" - - if [ ! -f "$FILENAME" ]; then - echo "ERROR: Expected $FILENAME not found" - ls -la archive/ - exit 1 - fi - - echo "Package: $FILENAME (plg version $VERSION)" - - # pkg_build writes no changelog — warn if this version has no CHANGES block - if ! grep -q "^###${VERSION}\$" folder.view3.plg; then - echo "::warning::No '###${VERSION}' entry in the .plg CHANGES section — this beta will ship without release notes." - fi - - - name: Commit and push to beta - run: | - git add archive/ folder.view3.plg - git commit -m "Build beta ${{ steps.beta.outputs.version }}" - git push origin beta diff --git a/.github/workflows/release-dispatch.yml b/.github/workflows/release-dispatch.yml deleted file mode 100644 index 9195ee3d..00000000 --- a/.github/workflows/release-dispatch.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Release dispatcher - -# Watches pushes to beta/main for conventional-commit feat:/fix: messages -# and dispatches the corresponding release workflow automatically. -# -# Skipped for bot actors (github-actions, renovate, dependabot) so -# (a) release workflows pushing back via GITHUB_TOKEN never loop, and -# (b) Renovate's fix(deps):/chore(deps): churn doesn't trigger a release -# per dep-bump. Manually run release-beta.yml / release-main.yml if you -# want to bundle dep bumps into a release. - -on: - push: - branches: - - main - - beta - -permissions: - actions: write - contents: read - -jobs: - dispatch: - runs-on: ubuntu-latest - if: >- - github.actor != 'github-actions[bot]' && - github.actor != 'renovate[bot]' && - github.actor != 'dependabot[bot]' - steps: - - name: Check commit message - id: check - env: - MSG: ${{ github.event.head_commit.message }} - run: | - set -euo pipefail - first_line=$(printf '%s\n' "$MSG" | head -n1) - printf 'First line: %s\n' "$first_line" - if printf '%s' "$first_line" | grep -qE '^(feat|fix)(\([^)]+\))?!?:'; then - echo "release=true" >> "$GITHUB_OUTPUT" - echo "Commit qualifies for auto-release" - else - echo "release=false" >> "$GITHUB_OUTPUT" - echo "Not a feat/fix commit — skipping" - fi - - - name: Dispatch release workflow - if: steps.check.outputs.release == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: ${{ github.ref_name }} - REPO: ${{ github.repository }} - run: | - set -euo pipefail - case "$BRANCH" in - beta) WF="release-beta.yml" ;; - main) WF="release-main.yml" ;; - *) echo "::error::Unexpected branch: $BRANCH"; exit 1 ;; - esac - gh workflow run "$WF" --ref "$BRANCH" --repo "$REPO" - echo "::notice::Dispatched $WF on $BRANCH" diff --git a/.github/workflows/release-main.yml b/.github/workflows/release-main.yml deleted file mode 100644 index 77f24a98..00000000 --- a/.github/workflows/release-main.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Release Main - -on: - workflow_dispatch: - -jobs: - release: - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Checkout main - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - ref: main - fetch-depth: 0 - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Remove today's packages to avoid collision detection in pkg_build.sh - - name: Clean existing packages for today - run: | - TODAY=$(date +"%Y.%m.%d") - rm -f archive/folder.view3-${TODAY}*.txz - echo "Cleaned packages for $TODAY" - - - name: Build stable package - run: | - chmod +x pkg_build.sh - bash pkg_build.sh - - - name: Extract stable version - id: version - run: | - VERSION=$(grep -oP '> $GITHUB_OUTPUT - FILENAME="folder.view3-${VERSION}-x86_64-1.txz" - echo "filename=$FILENAME" >> $GITHUB_OUTPUT - echo "Stable version: $VERSION" - - - name: Commit stable release to main - run: | - git add -A - git commit -m "Stable release ${{ steps.version.outputs.version }}" - - - name: Push main - run: git push origin main - - - name: Create GitHub Release - uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3 - with: - tag_name: v${{ steps.version.outputs.version }} - name: v${{ steps.version.outputs.version }} - body: | - ## FolderView3 v${{ steps.version.outputs.version }} - - Install URL: `https://raw.githubusercontent.com/chodeus/folder.view3/main/folder.view3.plg` - - See [CHANGELOG-fixes.md](CHANGELOG-fixes.md) for detailed changes. - files: archive/${{ steps.version.outputs.filename }} - draft: false - prerelease: false diff --git a/.github/workflows/release-stable.yml b/.github/workflows/release-stable.yml deleted file mode 100644 index 2a4de297..00000000 --- a/.github/workflows/release-stable.yml +++ /dev/null @@ -1,143 +0,0 @@ -name: Release Stable - -on: - workflow_dispatch: - -jobs: - release: - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Checkout main - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - ref: main - fetch-depth: 0 - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Normal 3-way merge so REAL code conflicts surface and fail the release - # (old `-X theirs` let beta silently win, clobbering main-only hotfixes). - # Only the plg / archive / changelog are rebuilt afterward, so for those - # (and only those) paths we deterministically take beta's version. - - name: Merge beta into main - run: | - git merge --no-commit --no-ff origin/beta || true - git checkout origin/beta -- folder.view3.plg archive CHANGELOG-fixes.md - git add folder.view3.plg archive CHANGELOG-fixes.md - unresolved=$(git diff --name-only --diff-filter=U) - if [ -n "$unresolved" ]; then - echo "ERROR: unexpected merge conflicts outside plg/archive/changelog:" - echo "$unresolved" - exit 1 - fi - git commit -m "Merge beta into main for stable release" - - # MUST run before build — beta .txz files from beta trigger the - # collision detection in pkg_build.sh, appending .N to the version. - # Beta builds use either legacy "-betaN" or current ".N" hotfix-style - # suffix (e.g. folder.view3-2026.04.30.1.txz). Both must be removed. - # - # Previous attempt used `find -regex '.*\.[0-9]+\.txz'` but that - # silently no-op'd on the GitHub Ubuntu runner — the cleanup printed - # "done" but archives remained, causing collision detection to suffix - # the stable as .2 (bitten on 2026.05.23). Now using explicit bash - # globs which are debuggable: nullglob + listing what was removed. - - name: Remove beta packages from archive - run: | - shopt -s nullglob - - # Legacy "-betaN" naming - legacy=(archive/folder.view3-*-beta*.txz) - # Current ".N" hotfix-style suffix: YYYY.MM.DD.N.txz - # The trailing [0-9]* ensures we only match files WITH the suffix, - # never the stable folder.view3-YYYY.MM.DD.txz itself. - hotfix=(archive/folder.view3-[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9].[0-9]*.txz) - - if [ ${#legacy[@]} -gt 0 ]; then - echo "Removing legacy beta archives:" - printf ' %s\n' "${legacy[@]}" - rm -f "${legacy[@]}" - fi - - if [ ${#hotfix[@]} -gt 0 ]; then - echo "Removing hotfix-suffixed beta archives:" - printf ' %s\n' "${hotfix[@]}" - rm -f "${hotfix[@]}" - fi - - echo "---" - echo "Remaining archives after cleanup:" - remaining=(archive/folder.view3-*.txz) - if [ ${#remaining[@]} -eq 0 ]; then - echo " (none)" - else - printf ' %s\n' "${remaining[@]}" - fi - - # Sanity: today's stable file must NOT exist yet, otherwise - # pkg_build.sh's collision detection will suffix the build. - TODAY=$(date -u +%Y.%m.%d) - if [ -e "archive/folder.view3-${TODAY}.txz" ]; then - echo "ERROR: archive/folder.view3-${TODAY}.txz exists before build — would cause collision suffix" - exit 1 - fi - - # pkg_build.sh with no flags: stable YYYY.MM.DD version, URLs → main - # This overwrites whatever beta version/URLs the merge brought in - - name: Build stable package - run: | - chmod +x pkg_build.sh - bash pkg_build.sh - - - name: Extract stable version - id: version - run: | - VERSION=$(grep -oP '> $GITHUB_OUTPUT - FILENAME="folder.view3-${VERSION}-x86_64-1.txz" - echo "filename=$FILENAME" >> $GITHUB_OUTPUT - echo "Stable version: $VERSION" - - # Rename beta version headers to stable in both changelog files - # e.g. "## Version 2026.02.07-beta2" → "## Version 2026.02.07" - - name: Update changelog — beta headers to stable - run: | - STABLE="${{ steps.version.outputs.version }}" - - # CHANGELOG-fixes.md: section headers and quick reference table - sed -i "s/## Version [0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}-beta[0-9]*/## Version ${STABLE}/" CHANGELOG-fixes.md - sed -i "s/(Version [0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}-beta[0-9]*)/(Version ${STABLE})/" CHANGELOG-fixes.md - - # folder.view3.plg: CHANGES section entries - sed -i "s/###[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}-beta[0-9]*/###${STABLE}/" folder.view3.plg - - echo "Updated version headers to $STABLE" - - - name: Commit stable release to main - run: | - git add -A - git commit -m "Release stable version ${{ steps.version.outputs.version }}" - - - name: Push main - run: git push origin main - - - name: Create GitHub Release - uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3 - with: - tag_name: v${{ steps.version.outputs.version }} - name: v${{ steps.version.outputs.version }} - body: | - ## FolderView3 v${{ steps.version.outputs.version }} - - Install URL: `https://raw.githubusercontent.com/chodeus/folder.view3/main/folder.view3.plg` - - See [CHANGELOG-fixes.md](CHANGELOG-fixes.md) for detailed changes. - files: archive/${{ steps.version.outputs.filename }} - draft: false - prerelease: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..95794650 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,43 @@ +name: Release + +# Pushes touching plugin files on main/beta refresh that channel's release PR; merging it cuts the release. +# Needs the RELEASE_TOKEN secret. Mechanics: chodeus-ops unraid-plugin-release.yml. + +on: + push: + branches: [main, beta] + paths: + - 'src/**' + - 'pkg_build.sh' + - 'folder.view3.plg' + - 'CHANGELOG.md' + workflow_dispatch: + inputs: + mode: + description: 'auto = decide from the pushed commit; pr = refresh the release PR; release = cut a release from this branch' + type: choice + options: [auto, pr, release] + default: auto + dry_run: + description: 'Run everything except pushes, tags and the GitHub release' + type: boolean + default: false + +permissions: + contents: read + +concurrency: + group: plg-release + cancel-in-progress: false + +jobs: + release: + uses: chodeus/chodeus-ops/.github/workflows/unraid-plugin-release.yml@5c3687a2f488fdd69f89c36c98e790203e603109 # main + with: + plg_file: folder.view3.plg + stable_branch: main + beta_branch: beta + mode: ${{ inputs.mode || 'auto' }} + dry_run: ${{ inputs.dry_run || false }} + secrets: + RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} diff --git a/.gitignore b/.gitignore index aff3891b..2ce1d0e4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ AGENTS.md tests/ dev/tests/ .DS_Store +tmp/ +dist/ +.ops/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..fb364926 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,775 @@ +# Changelog + +After updating, hard-refresh your browser (Ctrl/Cmd+Shift+R) and clear its cache if the page doesn't display correctly — before submitting a debug .json. + +## 2026.08.28 + +- Containers assigned by a `folder.view3` Docker label (including Compose services) no longer override a folder you picked explicitly, and can't end up in two folders at once +- The folder editor and Autostart tab now show which folder a container really belongs to, including label and regex matches +- Folder and container/VM order is now written into backups, so importing a backup restores your layout +- Corrupt config files now fail safe instead of silently wiping folders or settings +- Uninstall now also clears leftover Docker/VM sort-order entries, including ones left by folder.view and folder.view2 + +## 2026.08.14 + +- Uninstalling now removes the plugin cleanly after previous version improvements +- Import Everything now accepts a folder.view2 backup file instead of rejecting it as invalid +- Container autostart order fixes + +## 2026.08.01 + +- Full integration of a custom container autostart order. Defined in Plugin settings, now giving the option to override folder position order on the Docker page +- Improved Unraid API integration with native Docker organizer +- Blocked 'root' from being used as a folder name as this is used by Unraid's Docker organizer + +## 2026.07.17 + +- New "Open WebUI" preview context — clicking a container's icon (or Dashboard tile) opens its WebUI in a new tab (#41) +- Containers explicitly assigned to a folder can no longer be captured by another folder's regex (#46) +- A "^" regex folder now works as a catch-all, collecting containers not assigned to or matched by any other folder +- A match-all regex no longer crashes the Dashboard folder render; a failing folder shows an error banner and the rest keep rendering (#47) +- Folder views no longer briefly flash the plain container/VM list before folders appear +- A missing fallback icon no longer causes endless 404 retries (unraid/webgui#2691) +- Editing a regex folder no longer permanently bakes its regex matches into the member list +- A degraded Docker read during a folder save can no longer wipe container autostart settings +- Failed folder-data loads reveal the native list immediately with a single error banner naming any broken folder + +## 2026.07.08 + +- Autostart and config files can no longer be accidentally wiped or corrupted +- Security improvements and hardening +- UI loading, compatibility, error handling/reporting and backup-import improvements +- Package building and install-script improvements + +## 2026.06.25 + +- Folders imported from folder.view2 now restore container/VM rename-tracking automatically on first load (no need to re-save each folder) + +## 2026.06.23 + +- Reverted the Uptime column behaviour from the previous version +- Smoothed the folder-expand and view-toggle animations + +## 2026.06.22 + +- More accurate and consistent live CPU/MEM stats +- Improved Docker table layout, scaling and scroll behaviour (Uptime column now defaults to out of immediate view, scroll to view it) +- Fixed a Firefox-only phantom horizontal scrollbar on the Docker table +- Improved WebUI links and container action buttons +- WebUI globe icon now shows for containers on "container:" network mode (e.g. routed through a VPN sidecar) +- Incognito and mobile popup fixes +- Assorted preview and dashboard fixes +- Enhanced debug logging + +## 2026.06.13 + +- Security hardening for theme management +- More reliable folder previews and live stats on slow or interrupted connections +- Assorted preview, dashboard and compatibility fixes + +## 2026.05.28.1 + +- Fix VM tab crash when a folder is named the same as a VM (folder vanished and the VM was left out of any folder) + +## 2026.05.28 + +- Restart on a Dashboard docker folder now actually restarts containers +- Dashboard folder status icon now turns orange pause when every started container is paused, returns to play on resume +- Same pause-icon aggregation added to Docker tab and VM tab folder rows +- ReferenceError when triggering a custom action on a Dashboard folder configured with "Override default actions" (docker and VM) +- Restart no longer fires on stopped containers +- VM custom-action "Set Restart" mode now reboots running VMs +- Folder context menus now hide actions that wouldn't apply to any child (matches Unraid native per-container menu behaviour) + +## 2026.05.24 + +- Updated German translation (thank you kennymc-c, #36) + +## 2026.05.23 + +- New "Orange folder text on update" toggle for folders on the docker and dashboard page +- Dashboard orange-on-update is now its own pair of global toggles (Settings → Dashboard) +- Defaults page reorganised into Basic / Preview / Behavior sub-sections matching the Folder editor order +- Minor changes to folder settings page wording and order +- Fix: CSS preset accent color no longer overrides orange folder name on update + +## 2026.05.21 + +- Add Advanced Preview popup (CPU/MEM graphs + quick actions) to Docker containers on the Dashboard +- Add Container/VM status indicator (play/square symbol or greyscale-stopped) for Only icon preview mode +- Add Delete folder button to the folder editor +- Defaults page now hides options irrelevant to the chosen Preview mode +- Various tooltip styling, theme-awareness, and reliability fixes + +## 2026.05.15 + +- Fix Reset Order button (was silently broken by FV3's request interceptor) +- Folders now sort alphabetically when no manual order is set +- VM tab Reset Order also fixed + +## 2026.05.07 + +- Fix folder editor failing to load when a container has no Docker labels + +## 2026.05.02 + +- Uptime column now only appears as required +- Other various fixes/cleanup from this implementation + +## 2026.04.30 + +- Docker table column lock and layout stability fixes +- Folder-name pill and chevron polish (Firefox border fix, CSS preset alignment, fluid resize) +- Advanced popup and dashboard toggle consistency +- Folder RAM total now respects per-container `--memory=` limits +- Richer debug JSON export for diagnostics +- Misc bug fixes and cross-plugin robustness + +## 2026.04.17 + +- Minor 7.0.x compatibility fix + +## 2026.04.14 + +- Unraid 7.0.x compatibility fixes +- Mobile advanced preview and tooltip improvements +- Atomic file writes and safer JSON handling +- Extend incognito mode to advanced preview tooltips +- CSS cleanup and layout fixes +- UI polish and bug fixes + +## 2026.04.09 + +- Harden incognito mode: scrub volume paths, image tags, and registry prefixes in expanded rows + +## 2026.04.08 + +- Fix preview clipping hiding containers due to sub-pixel rounding with custom CSS themes +- Fix row separator false row breaks from sub-pixel rounding +- Fix dashboard fullwidth panel row detection tolerance +- Compute VM name column width from actual icon and padding sizes +- Fix VM name column width selector (was targeting non-existent element) +- Fix incognito mode not hiding container registry/image info in "By:" fields +- Fix incognito auto-apply racing with folder creation on page load + +## 2026.04.07 + +- Fix preset accent color overriding orange update-available text + +## 2026.04.06 + +- Fix folder settings page toggles showing wrong state on load + +## 2026.04.05 + +- Incognito mode: scrub volume paths, public IPv6, MACs, disk filenames, non-standard interfaces +- Incognito mode: VM previews now show "VM 1" instead of "Container 1" + +## 2026.04.04 + +- Shared code extraction and CSS consolidation for improved maintainability +- GraphQL API integration with WebSocket stats and automatic PHP fallback +- Settings page modernization with folder defaults and full backup/restore +- CSS Tool with theme manager, presets, variables, and GitHub import +- Incognito mode for screenshot-safe sharing +- Pre-install cleanup for reliable upgrades +- VM detail row positioning fixes in folders +- Mobile and touch improvements + +## 2026.04.01 + +- Sanitize debug exports + +## 2026.03.30.2 + +- Add Folder button relocated next to Add Container/VM + +## 2026.03.30.1 + +- Mobile UI improvements + +## 2026.03.30 + +- Fix preview overflow causing table expansion for users with a large number of containers in a folder + +## 2026.03.28.1 + +- Mobile: auto-scroll default preview to show hidden containers + +## 2026.03.28 + +- Fix preview divider and wrapper vertical alignment +- Fix expand mode containers overlapping on page refresh +- Fix row separator timing on basic/advanced toggle +- Fix default folders wrapping on narrow screens +- Add Firefox scrollbar fallback +- Add expand row separator gap spacing +- Enhanced mobile UI + +## 2026.03.27 + +- Fix multiple JS bugs +- Fix preview divider alignment across all overflow modes +- Smart overflow detection — scroll/expand only applied when content overflows +- Theme-aware custom action dialog +- Deduplicate API requests on page load + +## 2026.03.24 + +- Row separator as configurable folder setting +- Fix containers ejected from folders after rename +- Preview borders adapt to advanced view row height +- Mobile device UI improvements +- Scroll overflow preview centering fix + +## 2026.03.23.3 + +- Fix chevron position shift when expanding/collapsing folders + +## 2026.03.23.2 + +- Dynamic folder name column width — expands/shrinks to fit folder name + +## 2026.03.23.1 + +- More custom CSS support for inset style + +## 2026.03.23 + +- Fix fullwidth panel appearing in wrong row after Started only toggle +- Fix chevron missing position styles after Started only toggle +- Fix dashboard fullwidth panel and chevron positioning after Started only toggle +- Add fv3-* CSS classes to all dashboard folder elements for custom themes +- Add fv3-standalone class for containers/VMs not in folders +- Fix dashboard alignment on narrow screens for inset, embossed, fullwidth layouts +- Fix expanded panel remnant when toggling Started only filter +- Fix chevron position after toggling Started only filter back +- Fix animation firing when disabled in dashboard settings +- Fix fullwidth panel ordering after Started only toggle +- Fix fullwidth chevron positioning to match inset layout +- Restore static chevron positioning for accordion and embossed layouts + +## 2026.03.21 + +- Add Embossed dashboard layout style +- Add expand/collapse animation option for dashboard layouts +- Add CSS custom properties for inset and embossed panel theming + +## 2026.03.20.2 + +- Inset quick collapse tweak + +## 2026.03.20.1 + +- Fix inset panel chevron positioning and SVG border sizing + +## 2026.03.20 + +- Add folder name clipping for inset layout when collapsed +- Fix fullwidth panel pushing non-folder items to wrong row +- Add fullwidth panel reflow on window resize +- Add 20 character warning for folder names to folder settings page + +## 2026.03.19.2 + +- Fix fullwidth panel placement for expanded folders on dashboard + +## 2026.03.19.1 + +- Fix dashboard settings race condition when switching layouts + +## 2026.03.19 + +- Fix folder name/icon not vertically centered on Docker and VM pages +- Reorganize dashboard settings with Docker/VM section headings +- Convert Yes/No settings to Unraid-native On/Off toggle switches +- Fix chevron button alignment on Docker and VM pages +- Add Quick collapse (expand toggle) for non-Classic dashboard layouts +- Add per-folder preview overflow setting (Default / Expand Row / Scroll) +- Add responsive mobile breakpoints for dashboard child tiles +- Auto-width dashboard tiles for folders with 3 or fewer children +- Dynamic NAME column width on VM page +- Inset dashboard style improved + +## 2026.03.17 + +- Add dashboard layout options: Classic, Full-width Panel, Accordion, Inset Panel +- Allow Unicode characters in folder names (CJK, Cyrillic, etc) + +## 2026.03.16 + +- Fix folder editor tooltips +- Export now preserves folder order matching Docker/VM container page +- Add new CSS variables for customizable layout and colors +- Enhanced security: ID validation, JSON safety, file permissions +- Lazy-load libvirt to prevent crashes when VM manager unavailable + +## 2026.03.07 + +- Allow custom CSS to override VM row alternating colors + +## 2026.03.06 + +- Fix VM tab row alternating colors with folders +- Fix Compose Manager compatibility + +## 2026.03.05 + +- Add per-container "Hide Preview" toggle in folder editor +- Center toggle alignment in folder editor table +- Restrict drag cursor to container name content + +## 2026.03.04.1 + +- Fix cached scripts not refreshing after update +- Fix action buttons clipped on settings page on mobile +- Fix VM folder row markup +- Fix settings page button layout overflow + +## 2026.03.04 + +- Minor security improvements to align with Unraid best practices +- Fix empty folder showing "3rd Party" label +- Fix invalid regex pattern in folder name input +- Note: Clear browser cache and refresh if Docker folders are not visible after update + +## 2026.02.26 + +- Fix folder rendering crash for container names containing CSS special characters (e.g. periods, colons) + +## 2026.02.24 + +- Add Docker Compose and 3rd Party container awareness for folders +- Fix false orange update text on Compose/3rd Party containers +- Fix autostart counting and toggle for non-dockerman containers +- Show stacked Compose + 3rd Party labels for mixed folders +- Fix tooltip operator precedence bug for update status +- Fix compose container duplicate on folder settings page +- Fix folder drag-and-drop for compose/3rd-party-only folders +- Improved folder expand button shifting when folder is toggled +- Dashboard folder/container names show orange text when updates available (per folder setting) +- Sort unsorted containers alphabetically on folder settings page + +## 2026.02.19 + +- Fix container autostart with wait timer being disabled on tab switch + +## 2026.02.17.1 + +- Fix folder export triggering Unraid external link warning + +## 2026.02.17 + +- Fix VM folder collapse button not working (hardcoded colspan selector) +- Fix VM folder crash when regex is invalid +- Fix VM folder crash when a deleted VM is still in folder config +- Fix VM context menu crash during folder rebuild +- Fix VM folder action error messages showing boolean instead of text +- Use translated error title for VM folder actions + +## 2026.02.16.1 + +- Fix VM folder column alignment and autostart toggle position + +## 2026.02.16 + +- Rebrand from FolderView2 to FolderView3 +- Docker label changed from folder.view2 to folder.view3 +- Fix plugin settings page table alignment +- Remove deprecated container autostart order indicator + +## 2026.02.15 + +- Fix VM folder image and name missing CSS classes on Dashboard + +## 2026.02.11 + +- Add folder WebUI setting with context menu button +- Clean stale containers from autostart on page load and folder save + +## 2026.02.10 + +- Fix autostart toggle race condition when toggling folder-level autostart +- Sync container autostart order to match folder settings layout +- Fix folders not loading after reordering containers +- Remove commented-out debug code and stale files + +## 2026.02.09.1 + +- Fix dashboard showing wrong containers in folders + +## 2026.02.09 + +- Fix folder autostart toggles showing OFF after plugin update +- Fix color reset button appearing below color swatch +- Change new folder defaults to all toggles OFF + +## 2026.02.08 + +- Fix folder name wrapping in basic view +- Backward-compatible Docker Manager theme CSS for Unraid 6 + +## 2026.02.07 + +- Fix VM folder assignment bug +- Fix CPU/Memory text wrapping in advanced view +- Translation updates for de, es, it, pl, zh + +## 2026.02.05 + +- Fix archive packaging structure + +## 2026.02.04 + +- Split border and vertical bars into separate color pickers +- Border/bars color settings now nested under their toggles +- Fix expanded folder bottom border color + +## 2026.02.03 + +- Fix folder CPU and Memory stats not updating in advanced view +- Fix Docker Compose containers not grouping into folders +- Fix Advanced Preview tooltip for all Unraid themes +- Fix folder settings page layout +- Remove missing Docker Manager CSS reference + +## 2025.04.13 + +- Fix: Ongoing effort to get new verson to CA, renamed folder.view to folder.view2 +- Fix: Merged Fix broken layout of container preview by @JohannesHo + +## 2025.02.24 + +- Fix: removed old file that cuased folder to show in settings. + +## 2025.02.22 + +- Fix for Unraid v7 + +## 2025.01.11.1 + +- Fix with issues + +## 2025.01.11 + +- Add Polish translation +- Fix docker for unraid 7 + +## 2024.10.02 + +- Add french translation + +## 2024.08.11 + +- fix: translation + +## 2024.08.04 + +- fix: handle layout when number of overall columns changes by mtongnz +- Update es.json by elBelgg + +## 2024.07.28 + +- fix: handle non dockerman webui templates +- fix: handle IP parse for containers without NetworkMode set. remove duplicate parsing from previous commit. +- fix: remove duplicate setting of IP +- By: mtongnz + +## 2024.04.30 + +- Update es language. + +## 2024.01.22 + +- Fix undefined request for docker without icons. + +## 2024.01.16 and 2024.01.16.1 + +- Fix for vms. + +## 2024.01.15 + +- Custom action improvements. +- Remove update and force update buttons for non-dockerman containers. +- fix: ct info pulls data from template instead of labels. +- new classes for managed and unmanaged folders. +- small fix to vms. + +## 2023.12.03 + +- Fixed an issue preventing folders from appearing when a container was before a folder. + +## 2023.12.01.1 + +- Fix problem with order not being an array. + +## 2023.12.01 + +- Update German translation. + +## 2023.11.30 + +- Update Chinese translation. +- Small fix for VMs. + +## 2023.11.28 + +- Ability to change the width of the names in the preview (by libook). +- Small fix for VMs. + +## 2023.11.28 + +- Minor css addition. + +## 2023.11.23 + +- Add Chinese translation. + +## 2023.11.04 + +- WebUi and shell values are taken from labels if a template is not available. +- Fixed an issue with tolltipster. + +## 2023.11.01 + +- Update German translation. +- Updated spanish translation. + +## 2023.10.31 + +- Added the ability to translate the text in the plugins tab. +- Added the ability to run custom script in the foreground (sync) + +## 2023.10.21 + +- Updated spanish translation. + +## 2023.10.20.1 + +- HTML IS NOT A PROGRAMMING LANGUAGE. +- Browser not detecting p tag as whole block around a translation. + +## 2023.10.20 + +- Fixed translation not always working on chromium based browsers. + +## 2023.10.19.2 + +- Updated spanish translation. + +## 2023.10.19.1 + +- Added spanish translation. + +## 2023.10.19 + +- Custom action fixes. + +## 2023.10.09.1 + +- Update German translation. + +## 2023.10.09 + +- Fixed autostart icon on Gray and Azure themes. +- Changed autostart order icon. + +## 2023.10.04 + +- Target blan on repo tooltip. +- Fixed import of folder. + +## 2023.10.03 + +- Fixed issue with tooltip not opening. +- Fixed issue with too much ports with advanced view. + +## 2023.09.30.2 + +- Fixed CSS. + +## 2023.09.30.1 + +- Update German translation + fix English typo. + +## 2023.09.30 + +- Added custom events. +- Updated EN and IT translation for the new version. +- Changed the custom CSS import method. +- Added custom scripts event. +- Bringed VM tab to par with docker functionality where possible. +- Updated dev guide and templates. + +## 2023.09.23.1 + +- Update German translation. + +## 2023.09.22.1 + +- Same as 2023.09.22 but also fro wrappers. + +## 2023.09.22 + +- Added classes to describe autostart status (see templates). + +## 2023.09.21 + +- Added Deutsche translation. + +## 2023.09.20 + +- Added autostart class for docker conainers. +- Reordered shortcut icons on dokcer tab. + +## 2023.09.17.1 + +- Same fix of 2023.09.17 but for a specific case. + +## 2023.09.17 + +- Hopefully fixed an issue with template detection and WebUi missing. + +## 2023.09.15.2 + +- Fixed an issue with webui template string not being used right + +## 2023.09.15.1 + +- Fixed an issue with php global variables + +## 2023.09.15 + +- Added an advanced context menu for the docker preview. +- Added support for internationalization(i18n). +- Added a button to open the console in the preview, alongside the button for opening the webui and logs. +- Added the ability to add containers to a folder by using docker labels (folder.view3). +- Added a button in the header to verify the autostart order. +- Fixed plugin giving error when installing without internet. + +## 2023.08.20 + +- Fixed another issue with expanded folders + +## 2023.08.19 + +- Fixed an issue with expanded folders and update column hidden +- Hide update column with vms folder + +## 2023.08.18.1 + +- Fixed an issue with expanded folders + +## 2023.08.18 + +- Updated template for the custom CSS, now vertical divider is present even for the last element +- Backend code cleanup +- Action function reworked + +## 2023.08.17 + +- Added the option to remove the update column +- Fixed the issue where expanded folder weren't remaining open after an action +- Update column rework, now it functions exactly how the normal container does + +## 2023.08.16 + +- Updated the link to folder icon in the folder creation/editing page + +## 2023.08.15 + +- Fixed cpu load bars on docker advanced view + +## 2023.08.11 + +- Added a div insite the folder-name td + +## 2023.08.09.1 + +- Preview vertical bars now follows the color of the preview border + +## 2023.08.09 + +- Fixed caching problem +- Expanded folder bottom border now follows the color of the preview border + +## 2023.08.08 + +- CSS fix + +## 2023.08.07.1 + +- CSS fix + +## 2023.08.07 + +- Custom CSS in the settings +- Added custom classed for the folders +- Added vertical divider in the folder preview +- Now folder load faster +- NEW preview method, the list, it groups container/VM by 2 + +## 2023.08.06 + +- Fixed a bug in the dasboard + +## 2023.08.04.1 + +- Same fix of previous version on VM and Dashboard +- QoL on docker tab + +## 2023.08.04 + +- Fix a small issue with new containers and iterating over the order + +## 2023.08.02 + +- Renamed the pages to the updated plugin name +- Added import, export and clear in the settings +- Folders now remain open when making changes to docker/VM/dashboard, if opened before +- Fixed debug mode parsing error +- Now the border setting is visible even when no preview is selected +- Now the setting reflect the old setting behavior in the docker/Vm pages + +## 2023.08.01 + +- Fixed folder load on the docker tab +- added ability to enable/disable border on the docker/vm tab +- added the ability to change the color of the border on the docker/vm tab +- ability to start, stop, pause, resume, restart, Hibernate and force stop all VMs in a folder +- rework ability to start, stop, pause, resume, restart, update and force update all containers in a folder + +## 2023.07.31.1 + +- hotfix, a call to function was renamed wrongly + +## 2023.07.31 + +- order rework +- ability to start, stop, pause, resume, restart, update and force update all containers in a folder +- added a counter of started container when a folder is marked as started + +## 2023.07.28 + +- Fixed am issue where folder were offsetting index on the grabbing +- A little CSS work, is still really hard +- UX on the folder creation/edit page +- debug mode +- ability to set the folder icon from a docker container or VM + +## 2023.07.27.1 + +- Bug fix +- New container/vm now are counted in the order + +## 2023.07.27 + +- VM now WORK! + +## 2023.07.26.1 + +- Bug fix + +## 2023.07.26 + +- Initial Release diff --git a/folder.view3.plg b/folder.view3.plg index c3c3ade6..ab6f1bae 100644 --- a/folder.view3.plg +++ b/folder.view3.plg @@ -411,7 +411,6 @@ After updating, hard-refresh your browser (Ctrl/Cmd+Shift+R) and clear its cache - fix: remove duplicate setting of IP - By: mtongnz - ###2024.04.30 - Update es language. @@ -658,7 +657,7 @@ After updating, hard-refresh your browser (Ctrl/Cmd+Shift+R) and clear its cache - https://raw.githubusercontent.com/&github;/beta/archive/&pkgname;.txz + https://github.com/&github;/releases/download/v&version;/&pkgname;.txz &md5; diff --git a/pkg_build.sh b/pkg_build.sh index adc65b16..27644a44 100755 --- a/pkg_build.sh +++ b/pkg_build.sh @@ -20,60 +20,29 @@ fi CWD=`pwd` tmpdir="$CWD/tmp/tmp.$((RANDOM % 1000000))" -version=$(date +"%Y.%m.%d") plgfile="$CWD/folder.view3.plg" - -# Auto-detect current git branch, with optional flag override -# Usage: pkg_build.sh [--beta [N] | --develop [N] | --main] -# (no flag) → auto-detect branch from git -# --beta [N] → force beta branch -# --develop [N]→ force develop branch -# --main → force main branch (stable) -GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main") -SUFFIX_NUM="" - -if [ "${1:-}" = "--beta" ]; then - branch="beta" - if [ -n "${2:-}" ] && [ "${2:-}" -eq "${2:-}" ] 2>/dev/null; then SUFFIX_NUM="$2"; fi -elif [ "${1:-}" = "--develop" ]; then - branch="develop" - if [ -n "${2:-}" ] && [ "${2:-}" -eq "${2:-}" ] 2>/dev/null; then SUFFIX_NUM="$2"; fi -elif [ "${1:-}" = "--main" ]; then - branch="main" -else - branch="$GIT_BRANCH" -fi - -# Set version suffix based on branch -if [ "$branch" = "develop" ] || [ "$branch" = "beta" ]; then - if [ -z "$SUFFIX_NUM" ]; then - # Auto-increment: find highest existing hotfix number and add 1 - highest=0 - for f in $CWD/archive/folder.view3-${version}.*-x86_64-1.txz; do - [ -e "$f" ] || continue - num=$(echo "$f" | sed 's/.*\.\([0-9]*\)-x86_64-1\.txz/\1/') - [ -n "$num" ] && [ "$num" -gt "$highest" ] && highest=$num - done - SUFFIX_NUM=$((highest + 1)) - fi - version="${version}.${SUFFIX_NUM}" -elif [ "$branch" != "main" ]; then - echo "Warning: unrecognized branch '$branch', defaulting to main" - branch="main" -fi - -filename="$CWD/archive/folder.view3-$version-x86_64-1.txz" - -# Collision detection for main branch (date-based only) -if [ "$branch" = "main" ]; then - dayversion=$(find "$CWD/archive" -maxdepth 1 -name "folder.view3-$version*-x86_64-1.txz" -type f 2>/dev/null | wc -l | tr -d ' ') - if [ "$dayversion" -gt 0 ]; then - version="$version.$dayversion" - filename="$CWD/archive/folder.view3-$version-x86_64-1.txz" - fi -fi - -mkdir -p $tmpdir +OUT="$CWD/dist" + +# Usage: pkg_build.sh --version YYYY.MM.DD[.N] [--branch main|beta] [--out DIR] +# The release workflow owns version numbering; local test builds pass any version explicitly. +version="" +branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main") +while [ $# -gt 0 ]; do + case "$1" in + --version) version="$2"; shift 2 ;; + --branch) branch="$2"; shift 2 ;; + --out) OUT="$2"; shift 2 ;; + *) echo "ERROR: unknown option '$1'"; exit 1 ;; + esac +done +[ -n "$version" ] || { echo "ERROR: --version is required (e.g. --version 0000.00.00 for a test build)"; exit 1; } +case "$branch" in + main|beta) ;; + *) echo "Warning: unrecognized branch '$branch', pointing pluginURL at main"; branch="main" ;; +esac +filename="$OUT/folder.view3-$version-x86_64-1.txz" + +mkdir -p "$tmpdir" "$OUT" cd "$CWD/src/folder.view3" CP_PARENTS "$tmpdir" @@ -113,9 +82,8 @@ md5=$(MD5CMD "$filename") "${SED_I[@]}" "s///" "$plgfile" "${SED_I[@]}" "s///" "$plgfile" -# Update branch references in plg file (URLs use XML entities like &github;) +# Point pluginURL at this branch (URLs use XML entities like &github;) "${SED_I[@]}" 's|&github;/[a-zA-Z]*/&name;.plg|\&github;/'"$branch"'/\&name;.plg|' "$plgfile" -"${SED_I[@]}" 's|&github;/[a-zA-Z]*/archive/|\&github;/'"$branch"'/archive/|' "$plgfile" # Verify plg was updated correctly plg_version=$(grep 'ENTITY version' "$plgfile" | grep -o '"[^"]*"' | tr -d '"')