Skip to content

feat(web): add path autocomplete to set location dialog - #1432

Merged
s0up4200 merged 4 commits into
autobrr:developfrom
nitrobass24:fix/857-autocomplete-existing-torrent-location
Mar 8, 2026
Merged

feat(web): add path autocomplete to set location dialog#1432
s0up4200 merged 4 commits into
autobrr:developfrom
nitrobass24:fix/857-autocomplete-existing-torrent-location

Conversation

@nitrobass24

@nitrobass24 nitrobass24 commented Feb 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Wires up the existing usePathAutocomplete hook in the SetLocationDialog so that existing torrents get the same directory autocomplete dropdown available when adding new torrents
  • Adds a handleBlur callback to usePathAutocomplete to dismiss the dropdown when clicking outside the input
  • Updates all three call sites (TorrentTableOptimized, TorrentManagementBar, TorrentCardsMobile) to pass instanceId and capabilities to SetLocationDialog

Note: This PR depends on PR #1431 which adds the trailing slash auto-append behavior to usePathAutocomplete. That PR should be merged first.

Fixes #857

Test plan

  • Select one or more existing torrents and open the "Set Location" dialog
  • Type a path and verify the autocomplete dropdown appears with directory suggestions
  • Select a directory and verify / is appended and subdirectories load
  • Click outside the input and verify the dropdown dismisses
  • Press Escape and verify the dropdown dismisses
  • Verify keyboard navigation (Arrow keys, Enter, Tab) works in the dropdown
  • Verify the "Set Location" button submits the selected path correctly
  • Verify autocomplete works from the management bar, context menu, and mobile card views

Summary by CodeRabbit

  • New Features

    • Path autocomplete in location dialogs with inline, clickable directory suggestions and continued navigation into subfolders.
    • Location dialog provides contextual, instance-aware suggestions for more relevant results.
  • Bug Fixes / Behavior

    • Selecting a suggestion appends a trailing slash and keeps focus for further navigation.
    • Losing focus cleanly dismisses suggestions; keyboard interactions route through autocomplete for expected behavior.

@coderabbitai

coderabbitai Bot commented Feb 8, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

SetLocationDialog is extended with optional instanceId and capabilities props and wired to usePathAutocomplete; callers in several torrent UI components now pass these props. Autocomplete state, selection, and blur handling are integrated into the dialog.

Changes

Cohort / File(s) Summary
SetLocationDialog (autocomplete integration)
web/src/components/torrents/TorrentDialogs.tsx
Adds optional instanceId?: number and `capabilities?: InstanceCapabilities
Prop propagation to callers
web/src/components/torrents/TorrentCardsMobile.tsx, web/src/components/torrents/TorrentManagementBar.tsx, web/src/components/torrents/TorrentTableOptimized.tsx
Passes instanceId and capabilities through to SetLocationDialog invocations so the dialog can enable instance-aware path autocomplete.
Autocomplete hook update
web/src/hooks/usePathAutocomplete.ts
Modifies selectSuggestion to append trailing slash and keep dropdown open for subdirectory navigation, exposes handleBlur to dismiss dropdown on input blur, and tweaks focus behavior after selection.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SetLocationDialog
    participant usePathAutocomplete
    participant FilesystemAPI

    User->>SetLocationDialog: open (includes instanceId, capabilities)
    SetLocationDialog->>usePathAutocomplete: init/sync(instanceId, capabilities)
    usePathAutocomplete->>FilesystemAPI: request suggestions for path
    FilesystemAPI-->>usePathAutocomplete: return suggestions
    usePathAutocomplete-->>SetLocationDialog: provide suggestions
    SetLocationDialog-->>User: render suggestions dropdown
    User->>SetLocationDialog: type / arrow / click suggestion
    SetLocationDialog->>usePathAutocomplete: handleAutocompleteChange / handleSelect / handleAutocompleteKeyDown
    usePathAutocomplete->>FilesystemAPI: fetch deeper suggestions (if needed)
    FilesystemAPI-->>usePathAutocomplete: return updated suggestions
    usePathAutocomplete-->>SetLocationDialog: update suggestions (keeps open)
    User->>SetLocationDialog: blur input
    SetLocationDialog->>usePathAutocomplete: handleBlur -> dismiss suggestions
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

enhancement, web, torrent

Suggested reviewers

  • s0up4200

Poem

🐇 I hop through folders, nudging paths to show,

I add a slash and let the suggestions flow.
Dropdown stays open, I guide each little click,
Type, select, or blur — I'll help you pick.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding path autocomplete functionality to the set location dialog for existing torrents.
Linked Issues check ✅ Passed All code requirements from issue #857 are met: path autocomplete integrated into SetLocationDialog, reusing usePathAutocomplete hook, and propagated across all call sites.
Out of Scope Changes check ✅ Passed All changes directly support the stated objective of enabling autocomplete for existing torrent location dialogs; no unrelated modifications detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@web/src/components/torrents/TorrentDialogs.tsx`:
- Around line 628-636: In handleKeyDown, prevent submitting when the
autocomplete handler already handled the Enter key: after calling
handleAutocompleteKeyDown (when supportsPathAutocomplete is true), check
e.defaultPrevented (or e.defaultPrevented === true) before running the
Enter-to-submit branch; if default is prevented, do not call handleConfirm.
Update the logic in the handleKeyDown callback (which references
supportsPathAutocomplete, handleAutocompleteKeyDown, location, isPending, and
handleConfirm) so Enter presses consumed by autocomplete won't fall through and
submit the stale location.

Comment thread web/src/components/torrents/TorrentDialogs.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@web/src/components/torrents/TorrentDialogs.tsx`:
- Around line 668-692: The dropdown uses a non-existent Tailwind class
"max-h-55" which is dropped by the CSS build; replace "max-h-55" with a valid
utility like "max-h-56" or an arbitrary value "max-h-[13.75rem]" in the
component rendering the suggestions (look for the div containing "max-h-55
overflow-y-auto py-1" inside TorrentDialogs's suggestions map and update the
class there), and apply the same fix for the two other occurrences in
TorrentCreatorDialog.tsx and AddTorrentDialog.tsx.
🧹 Nitpick comments (1)
web/src/components/torrents/TorrentDialogs.tsx (1)

604-614: effectiveInputRef in the dependency array is a ref object — harmless but unnecessary.

Ref objects have a stable identity across renders, so including effectiveInputRef in the dep array won't cause re-runs but adds noise. Not a blocking issue.

Comment on lines +668 to +692
{supportsPathAutocomplete && showSuggestions && suggestions.length > 0 && (
<div className="relative">
<div className="absolute z-50 mt-1 left-0 right-0 rounded-md border bg-popover text-popover-foreground shadow-md">
<div className="max-h-55 overflow-y-auto py-1">
{suggestions.map((entry, idx) => (
<button
key={entry}
type="button"
title={entry}
className={cn(
"w-full px-3 py-2 text-sm hover:bg-accent hover:text-accent-foreground",
highlightedIndex === idx
? "bg-accent text-accent-foreground"
: "hover:bg-accent/70",
)}
onMouseDown={(e) => e.preventDefault()}
onClick={() => handleSelect(entry)}
>
<span className="block truncate text-left">{entry}</span>
</button>
))}
</div>
</div>
</div>
)}

@coderabbitai coderabbitai Bot Feb 8, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

echo "=== Checking Tailwind version ==="
if [ -f "package.json" ]; then
  cat package.json | grep -A 2 -B 2 "tailwind" || echo "No tailwind found in package.json"
fi

echo -e "\n=== Checking for Tailwind config files ==="
fd "tailwind.config" --type f

echo -e "\n=== Checking TailwindCSS content in project ==="
find . -maxdepth 3 -name "tailwind.config.*" -type f -exec cat {} \;

echo -e "\n=== Searching for max-h-55 usage ==="
rg "max-h-55" --type tsx --type ts --type jsx --type js -n

echo -e "\n=== Checking standard Tailwind spacing scale documentation ==="
rg "max-h-5[0-9]" --type tsx --type ts -n | head -20

Repository: autobrr/qui

Length of output: 356


🏁 Script executed:

#!/bin/bash

echo "=== Checking package.json for Tailwind ==="
cat package.json | grep -i "tail\|css"

echo -e "\n=== Searching for max-h-55 without file type filter ==="
rg "max-h-55" 2>/dev/null || echo "max-h-55 not found"

echo -e "\n=== Looking for TorrentDialogs.tsx ==="
fd "TorrentDialogs.tsx" --type f

echo -e "\n=== Checking lines around 671 in TorrentDialogs.tsx ==="
fd "TorrentDialogs.tsx" --type f -exec sed -n '665,675p' {} \;

echo -e "\n=== Searching for tailwind config ==="
find . -name "tailwind*" -o -name "postcss*" | grep -v node_modules | head -10

echo -e "\n=== Checking for any max-h- classes ==="
rg "max-h-" 2>/dev/null | head -20

Repository: autobrr/qui

Length of output: 4089


🏁 Script executed:

#!/bin/bash

echo "=== Checking postcss.config.js ==="
cat ./documentation/postcss.config.js

echo -e "\n=== Looking for globals or CSS files that might define max-h-55 ==="
fd "\.(css|scss)$" --type f | head -20

echo -e "\n=== Checking if there's a tailwind.config in root or app directories ==="
find . -maxdepth 2 -type f \( -name "tailwind.config.*" -o -name "vite.config.*" \)

echo -e "\n=== Checking what build tool is used ==="
ls -la | grep -E "vite|webpack|next"

echo -e "\n=== Looking for CSS files in src ==="
find ./web/src -name "*.css" | head -20

Repository: autobrr/qui

Length of output: 1015


🏁 Script executed:

#!/bin/bash

echo "=== Checking Tailwind version in lock files ==="
grep -i "tailwind\|@tailwindcss" package-lock.json 2>/dev/null | head -10 || echo "No package-lock.json"
grep -i "tailwind\|@tailwindcss" pnpm-lock.yaml 2>/dev/null | head -10 || echo "No pnpm-lock.yaml"
grep -i "tailwind\|@tailwindcss" yarn.lock 2>/dev/null | head -10 || echo "No yarn.lock"

echo -e "\n=== Checking web directory structure ==="
ls -la web/ | grep -E "package|tsconfig|tailwind"

echo -e "\n=== Checking web/package.json for dependencies ==="
cat web/package.json 2>/dev/null | grep -A 20 '"dependencies"' | grep -i "tailwind\|css"

echo -e "\n=== Checking web/package.json full ==="
cat web/package.json 2>/dev/null | head -50

echo -e "\n=== Checking for any tailwind config in web/ ==="
find ./web -maxdepth 2 -type f \( -name "tailwind.config.*" -o -name ".tw*" \)

echo -e "\n=== Checking web/src/index.css for Tailwind imports ==="
head -20 web/src/index.css

Repository: autobrr/qui

Length of output: 3138


🏁 Script executed:

#!/bin/bash

echo "=== Checking for Tailwind package in dependencies ==="
cat web/package.json | grep -E "@tailwindcss|tailwindcss"

echo -e "\n=== Checking root package.json if exists ==="
if [ -f "package.json" ]; then
  cat package.json | head -100
fi

echo -e "\n=== Checking pnpm-lock.yaml or yarn.lock for Tailwind version ==="
if [ -f "pnpm-lock.yaml" ]; then
  grep -A 5 "@tailwindcss/postcss" pnpm-lock.yaml | head -20
elif [ -f "yarn.lock" ]; then
  grep -A 5 "@tailwindcss/postcss" yarn.lock | head -20
fi

echo -e "\n=== Checking if max-h-55 is actually rendered/used in styles ==="
# Check if there's any CSS preprocessing that might handle max-h-55
rg "55|max-height.*55" web/src/themes/ | head -10

echo -e "\n=== Looking at Tailwind v4 arbitrary value documentation - checking if max-h-55 works ==="
# Let's check if there's any indication in comments or docs about Tailwind v4
rg -i "tailwind.*v4|arbitrary" web/ | head -10

Repository: autobrr/qui

Length of output: 1206


🏁 Script executed:

#!/bin/bash

echo "=== Checking Tailwind v4 spacing scale and max-h utilities ==="
# In Tailwind v4, check what max-h utilities would be generated
# Standard scale: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 80, 96
# max-h-55 is not in this standard scale
echo "Standard Tailwind spacing scale does NOT include 55"
echo "It goes: ..., max-h-52 (13rem), max-h-56 (14rem), ..."
echo "max-h-55 would be 13.75rem"

echo -e "\n=== Checking if there's any custom Tailwind configuration ==="
find ./web -type f -name "tailwind.config.*" -o -name "tailwind.json"

echo -e "\n=== Checking vite.config for Tailwind plugin config ==="
cat ./web/vite.config.ts | head -50

echo -e "\n=== Checking if max-h-55 is defined in any CSS file ==="
rg "max-h-55" web/src/ --type css || echo "Not found in CSS files"

echo -e "\n=== Verifying the actual line in TorrentDialogs.tsx ==="
sed -n '668,675p' web/src/components/torrents/TorrentDialogs.tsx

Repository: autobrr/qui

Length of output: 2992


🏁 Script executed:

#!/bin/bash

echo "=== Testing if Tailwind v4 auto-arbitrary would handle max-h-55 ==="
# In Tailwind v4, arbitrary values require bracket notation
# max-h-55 as a plain utility class is NOT automatically generated
# It would need to be: max-h-[13.75rem]

echo "Tailwind v4 automatic value support requires bracket notation like max-h-[13.75rem]"
echo "Plain max-h-55 without a matching spacing scale entry will NOT work"

echo -e "\n=== Checking what happens with max-h classes in practice ==="
rg "max-h-\[" web/src/ --type tsx | head -5
rg "max-h-[0-9]+" web/src/ --type tsx | grep -v "max-h-\[" | head -10

Repository: autobrr/qui

Length of output: 409


🏁 Script executed:

#!/bin/bash

echo "=== Checking max-h usage patterns ==="
rg "max-h-" web/src/components/torrents/ | head -20

echo -e "\n=== Verifying what max-h utilities exist in standard Tailwind ==="
# Check the actual behavior - list all max-h uses
rg "max-h-" web/src/ | grep -E "max-h-[0-9]+" | cut -d: -f2 | sort | uniq

echo -e "\n=== Double checking: are there any custom height definitions? ==="
rg "heights|spacing" web/ --type json || echo "No custom heights config found"

Repository: autobrr/qui

Length of output: 5111


max-h-55 is not a valid Tailwind utility and will be silently ignored.

Line 671 uses max-h-55, which is not in Tailwind's default spacing scale (which includes max-h-52 and max-h-56 but skips 53-55). In Tailwind v4.1.17 with no custom height config, this class will be dropped during CSS generation, leaving the dropdown without a height constraint.

Use max-h-56 (14rem) or the arbitrary value max-h-[13.75rem] for the intended height. This issue also appears in TorrentCreatorDialog.tsx and AddTorrentDialog.tsx (2 instances).

🤖 Prompt for AI Agents
In `@web/src/components/torrents/TorrentDialogs.tsx` around lines 668 - 692, The
dropdown uses a non-existent Tailwind class "max-h-55" which is dropped by the
CSS build; replace "max-h-55" with a valid utility like "max-h-56" or an
arbitrary value "max-h-[13.75rem]" in the component rendering the suggestions
(look for the div containing "max-h-55 overflow-y-auto py-1" inside
TorrentDialogs's suggestions map and update the class there), and apply the same
fix for the two other occurrences in TorrentCreatorDialog.tsx and
AddTorrentDialog.tsx.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeRabbit's max-h-55 finding — this class is already used in AddTorrentDialog.tsx (2 instances) and TorrentCreatorDialog.tsx (1 instance). I matched the existing pattern for consistency. Happy to update all 4 occurrences to max-h-56 if preferred, but that felt out of scope for this PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify the existing usage of max-h-55 in the codebase
echo "=== Checking for max-h-55 usage in AddTorrentDialog.tsx ==="
rg "max-h-55" web/src/components/torrents/AddTorrentDialog.tsx -n -C 2

echo -e "\n=== Checking for max-h-55 usage in TorrentCreatorDialog.tsx ==="
rg "max-h-55" web/src/components/torrents/TorrentCreatorDialog.tsx -n -C 2

echo -e "\n=== Checking for max-h-55 usage in TorrentDialogs.tsx ==="
rg "max-h-55" web/src/components/torrents/TorrentDialogs.tsx -n -C 2

echo -e "\n=== Total count of max-h-55 usage in the codebase ==="
rg "max-h-55" web/src/ --count-matches

Length of output: 2011


@nitrobass24, you're absolutely right—I've confirmed max-h-55 appears in:

  • AddTorrentDialog.tsx (lines 1332, 1410)
  • TorrentCreatorDialog.tsx (line 67)
  • TorrentDialogs.tsx (line 671 - your addition)

Following the existing pattern for consistency makes sense. Since this is pre-existing technical debt across multiple files, fixing all 4 occurrences together (either in this PR or a follow-up) would be cleaner than addressing just one. If you'd prefer to keep this PR focused and tackle it separately, I can help open a follow-up issue. Either approach works—your call!


🧬 Code Graph Analysis Results
  • File: web/src/components/torrents/TorrentDialogs.tsx, approximate lines 120-136
    • Snippet (relevant portion):
      <div className="relative">
        <div className="absolute z-50 mt-1 left-0 right-0 rounded-md border bg-popover text-popover-foreground shadow-md">
          <div className="max-h-55 overflow-y-auto py-1">
            {suggestions.map((entry, idx) => (
              <button
                key={entry}
                type="button"
                title={entry}
                className={cn(
                  "w-full px-3 py-2 text-sm hover:bg-accent hover:text-accent-foreground",
                  highlightedIndex === idx
                    ? "bg-accent text-accent-foreground"
                    : "hover:bg-accent/70",
                )}
                onMouseDown={(e) => e.preventDefault()}
                onClick={() => handleSelect(entry)}
              >
                <span className="block truncate text-left">{entry}</span>
              </button>
            ))}
          </div>
        </div>
      </div>
      
    • Context: This is the autocomplete suggestion dropdown for Set Location (path autocomplete), where the container uses max-h-55 to cap height.

🧠 Learnings used
Learnt from: finevan
Repo: autobrr/qui PR: 677
File: web/src/components/torrents/AddTorrentDialog.tsx:496-504
Timestamp: 2025-12-03T18:11:08.682Z
Learning: In the AddTorrentDialog component (web/src/components/torrents/AddTorrentDialog.tsx), temporary path settings (useDownloadPath/downloadPath) should be applied per-torrent rather than updating global instance preferences. The UI/UX is designed to suggest that these options apply to the individual torrent being added.

@nitrobass24
nitrobass24 deleted the fix/857-autocomplete-existing-torrent-location branch February 24, 2026 15:13
@nitrobass24
nitrobass24 restored the fix/857-autocomplete-existing-torrent-location branch February 24, 2026 19:37
@nitrobass24 nitrobass24 reopened this Feb 24, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
web/src/components/torrents/TorrentManagementBar.tsx (1)

808-817: ⚠️ Potential issue | 🔴 Critical

Fix undefined safeInstanceId (build break)

safeInstanceId isn’t declared in this component, matching the TS2552 failure. Use an in-scope value such as actionInstanceId (or metadataInstanceId if that’s the intended semantics).

💡 Suggested fix
-        instanceId={safeInstanceId}
+        instanceId={actionInstanceId}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/src/components/torrents/TorrentManagementBar.tsx` around lines 808 - 817,
The prop instanceId passed to <SetLocationDialog> is using an undefined
identifier safeInstanceId causing the build error; replace safeInstanceId with
an in-scope identifier (e.g. actionInstanceId or metadataInstanceId depending on
intended semantics) used elsewhere in TorrentManagementBar so the instanceId
prop is defined; locate the <SetLocationDialog ... instanceId={safeInstanceId}
/> usage and change instanceId to actionInstanceId (or metadataInstanceId if you
need metadata context) and ensure any related handlers like
handleSetLocationWrapper and getCommonSavePath(selectedTorrents) still work with
the chosen instance id.
♻️ Duplicate comments (1)
web/src/components/torrents/TorrentDialogs.tsx (1)

628-636: Enter submission now respects autocomplete handling

Good guard against submitting when autocomplete consumes Enter.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/src/components/torrents/TorrentDialogs.tsx` around lines 628 - 636, You
correctly moved autocomplete handling before Enter-submit, but ensure
handleAutocompleteKeyDown actually prevents default when it consumes the Enter
key so the !e.defaultPrevented guard works; update the implementation of
handleAutocompleteKeyDown (and confirm it is memoized with useCallback) to call
e.preventDefault() or otherwise mark the event when autocomplete handles the
key, leaving the handleKeyDown logic (which checks supportsPathAutocomplete,
calls handleAutocompleteKeyDown(e), then checks e.key === "Enter" &&
!e.defaultPrevented && !isPending && location.trim()) as-is.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@web/src/components/torrents/TorrentManagementBar.tsx`:
- Around line 808-817: The prop instanceId passed to <SetLocationDialog> is
using an undefined identifier safeInstanceId causing the build error; replace
safeInstanceId with an in-scope identifier (e.g. actionInstanceId or
metadataInstanceId depending on intended semantics) used elsewhere in
TorrentManagementBar so the instanceId prop is defined; locate the
<SetLocationDialog ... instanceId={safeInstanceId} /> usage and change
instanceId to actionInstanceId (or metadataInstanceId if you need metadata
context) and ensure any related handlers like handleSetLocationWrapper and
getCommonSavePath(selectedTorrents) still work with the chosen instance id.

---

Duplicate comments:
In `@web/src/components/torrents/TorrentDialogs.tsx`:
- Around line 628-636: You correctly moved autocomplete handling before
Enter-submit, but ensure handleAutocompleteKeyDown actually prevents default
when it consumes the Enter key so the !e.defaultPrevented guard works; update
the implementation of handleAutocompleteKeyDown (and confirm it is memoized with
useCallback) to call e.preventDefault() or otherwise mark the event when
autocomplete handles the key, leaving the handleKeyDown logic (which checks
supportsPathAutocomplete, calls handleAutocompleteKeyDown(e), then checks e.key
=== "Enter" && !e.defaultPrevented && !isPending && location.trim()) as-is.

ℹ️ Review info

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 479b5b6 and b310631.

📒 Files selected for processing (5)
  • web/src/components/torrents/TorrentCardsMobile.tsx
  • web/src/components/torrents/TorrentDialogs.tsx
  • web/src/components/torrents/TorrentManagementBar.tsx
  • web/src/components/torrents/TorrentTableOptimized.tsx
  • web/src/hooks/usePathAutocomplete.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • web/src/components/torrents/TorrentCardsMobile.tsx

Wire up the existing usePathAutocomplete hook in the SetLocationDialog
so that existing torrents get the same directory autocomplete dropdown
available when adding new torrents. Also adds a blur handler to dismiss
the dropdown when clicking outside the input.

Depends on PR #1431

Fixes Issue #857
…ction

Check e.defaultPrevented before handling Enter in the SetLocationDialog
so that Enter presses consumed by the autocomplete dropdown don't fall
through and submit the form with a stale path.
@nitrobass24

Copy link
Copy Markdown
Contributor Author

@s0up4200
Conflicts resolved. The only conflict was in usePathAutocomplete.ts — PR #1431 (already merged to develop, which this builds on top of) added Windows path separator support in selectSuggestion, while this PR had the simpler slash-only version. I kept develop's version with the separator detection logic.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@web/src/components/torrents/TorrentManagementBar.tsx`:
- Around line 815-816: The prop instanceId is currently using an undefined
identifier safeInstanceId which will throw; replace safeInstanceId with the
already-defined metadataInstanceId where SetLocationDialog (or the component
rendered at the snippet using instanceId and capabilities) is invoked so the
instance passed matches the source used to fetch capabilities
(metadataInstanceId) and avoid the ReferenceError.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 6a801c8a-1dec-4d62-9205-5547ebe50be0

📥 Commits

Reviewing files that changed from the base of the PR and between b310631 and f77ed82.

📒 Files selected for processing (5)
  • web/src/components/torrents/TorrentCardsMobile.tsx
  • web/src/components/torrents/TorrentDialogs.tsx
  • web/src/components/torrents/TorrentManagementBar.tsx
  • web/src/components/torrents/TorrentTableOptimized.tsx
  • web/src/hooks/usePathAutocomplete.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • web/src/components/torrents/TorrentCardsMobile.tsx
  • web/src/components/torrents/TorrentTableOptimized.tsx
  • web/src/hooks/usePathAutocomplete.ts

Comment thread web/src/components/torrents/TorrentManagementBar.tsx Outdated
safeInstanceId was undefined — replace with metadataInstanceId which is
already used to fetch capabilities in the same component.
@nitrobass24

Copy link
Copy Markdown
Contributor Author

Fixed ReferenceError in TorrentManagementBar.tsxinstanceId={safeInstanceId} referenced an undefined variable. Replaced with metadataInstanceId, which is already used to fetch capabilities in the same component.

@s0up4200
s0up4200 merged commit 7aadde7 into autobrr:develop Mar 8, 2026
15 checks passed
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Mar 20, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/autobrr/qui](https://github.com/autobrr/qui) | minor | `v1.14.1` → `v1.15.0` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/2) for more information.

---

### Release Notes

<details>
<summary>autobrr/qui (ghcr.io/autobrr/qui)</summary>

### [`v1.15.0`](https://github.com/autobrr/qui/releases/tag/v1.15.0)

[Compare Source](autobrr/qui@v1.14.1...v1.15.0)

#### Changelog

##### Breaking change

CORS is disabled by default; enable by setting QUI\_\_CORS\_ALLOWED\_ORIGINS with explicit origins (http(s)://host\[:port]). See <https://getqui.com/docs/advanced/sso-proxy-cors>

##### New Features

- [`93786a2`](autobrr/qui@93786a2): feat(automations): add configurable processing priority/sorting ([#&#8203;1235](autobrr/qui#1235)) ([@&#8203;Oscariremma](https://github.com/Oscariremma))
- [`45eaf1f`](autobrr/qui@45eaf1f): feat(database): add postgres and sqlite migration CLI ([#&#8203;1530](autobrr/qui#1530)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`430f5d1`](autobrr/qui@430f5d1): feat(torrents): mediaInfo dialog ([#&#8203;1537](autobrr/qui#1537)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8eb8903`](autobrr/qui@8eb8903): feat(web): Add persistence to unified instance filter in sidebar ([#&#8203;1560](autobrr/qui#1560)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`7aadde7`](autobrr/qui@7aadde7): feat(web): add path autocomplete to set location dialog ([#&#8203;1432](autobrr/qui#1432)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`077f32c`](autobrr/qui@077f32c): feat: add mediainfo api endpoint ([#&#8203;1545](autobrr/qui#1545)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`99cf695`](autobrr/qui@99cf695): feat: endpoint to trigger directory scans from external tools ([#&#8203;1559](autobrr/qui#1559)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8956f9b`](autobrr/qui@8956f9b): feat: unify bulk tag editor ([#&#8203;1571](autobrr/qui#1571)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Bug Fixes

- [`552d617`](autobrr/qui@552d617): fix(api): align add torrent OpenAPI field ([#&#8203;1617](autobrr/qui#1617)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`424f7a0`](autobrr/qui@424f7a0): fix(api): restrict CORS to explicit allowlist ([#&#8203;1551](autobrr/qui#1551)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`38991d8`](autobrr/qui@38991d8): fix(auth): allow loopback health probes ([#&#8203;1621](autobrr/qui#1621)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4ae88c9`](autobrr/qui@4ae88c9): fix(automations): align include-cross-seeds category apply ([#&#8203;1517](autobrr/qui#1517)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6a127a8`](autobrr/qui@6a127a8): fix(automations): scope skipWithin to only deleted action ([#&#8203;1538](autobrr/qui#1538)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`c776189`](autobrr/qui@c776189): fix(crossseed): avoid completion timeout misses on non-Gazelle torrents ([#&#8203;1536](autobrr/qui#1536)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b1338a7`](autobrr/qui@b1338a7): fix(crossseed): handle missing webhook collection tags ([#&#8203;1610](autobrr/qui#1610)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eacbb68`](autobrr/qui@eacbb68): fix(crossseed): normalize hdr aliases ([#&#8203;1572](autobrr/qui#1572)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`537ad46`](autobrr/qui@537ad46): fix(crossseed): queue completion searches and retry rate-limit waits ([#&#8203;1523](autobrr/qui#1523)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4fc550f`](autobrr/qui@4fc550f): fix(crossseed): use autobrr indexer ids for webhooks ([#&#8203;1614](autobrr/qui#1614)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`08029ad`](autobrr/qui@08029ad): fix(crossseed): valid partial matches being rejected ([#&#8203;1291](autobrr/qui#1291)) ([@&#8203;rybertm](https://github.com/rybertm))
- [`77eedd9`](autobrr/qui@77eedd9): fix(database): avoid postgres temp-table statement caching ([#&#8203;1581](autobrr/qui#1581)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`25daa17`](autobrr/qui@25daa17): fix(dirscan): honor canceled queued webhook runs ([#&#8203;1612](autobrr/qui#1612)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`56995f1`](autobrr/qui@56995f1): fix(dirscan): queue webhook scans and tighten age filtering ([#&#8203;1603](autobrr/qui#1603)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`444d07b`](autobrr/qui@444d07b): fix(dirscan): select concrete hardlink base dir ([#&#8203;1606](autobrr/qui#1606)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c35bea0`](autobrr/qui@c35bea0): fix(instances): improve settings dialog scrolling ([#&#8203;1569](autobrr/qui#1569)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`dc501a0`](autobrr/qui@dc501a0): fix(proxy): reauth qbit passthrough requests ([#&#8203;1582](autobrr/qui#1582)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7950d1d`](autobrr/qui@7950d1d): fix(proxy): search endpoint handling ([#&#8203;1524](autobrr/qui#1524)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`1076eea`](autobrr/qui@1076eea): fix(qbit): prune empty managed dirs after delete\_with\_files ([#&#8203;1604](autobrr/qui#1604)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5a3114b`](autobrr/qui@5a3114b): fix(qbittorrent): stop reboot torrent\_completed spam ([#&#8203;1515](autobrr/qui#1515)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1d02e6c`](autobrr/qui@1d02e6c): fix(settings): contain settings tab scrolling ([#&#8203;1567](autobrr/qui#1567)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`f5d69f3`](autobrr/qui@f5d69f3): fix(settings): smoother gradient ([#&#8203;1570](autobrr/qui#1570)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`1c0c3bc`](autobrr/qui@1c0c3bc): fix(torrents): copy MediaInfo summary without brackets ([#&#8203;1540](autobrr/qui#1540)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3ec913a`](autobrr/qui@3ec913a): fix(web): auto-append slash on path autocomplete selection ([#&#8203;1431](autobrr/qui#1431)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`aa2f3da`](autobrr/qui@aa2f3da): fix(web): check field.state.value type in AddTorrentDialog ([#&#8203;1613](autobrr/qui#1613)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1abfc5e`](autobrr/qui@1abfc5e): fix(web): handle SSO proxy redirect to /index.html ([#&#8203;1600](autobrr/qui#1600)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1991f90`](autobrr/qui@1991f90): fix(web): warn before enabling reannounce ([#&#8203;1583](autobrr/qui#1583)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`4069492`](autobrr/qui@4069492): chore(deps): bump the github group with 3 updates ([#&#8203;1535](autobrr/qui#1535)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`a02e9e8`](autobrr/qui@a02e9e8): chore(deps): bump the github group with 7 updates ([#&#8203;1558](autobrr/qui#1558)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`8713667`](autobrr/qui@8713667): chore(deps): bump the golang group with 15 updates ([#&#8203;1543](autobrr/qui#1543)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`420607e`](autobrr/qui@420607e): chore(go,ci): adopt go fix, bump to 1.26, and speed up PR checks ([#&#8203;1480](autobrr/qui#1480)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0d0df45`](autobrr/qui@0d0df45): docs: add password reset section to CLI commands ([#&#8203;1598](autobrr/qui#1598)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9ef56a2`](autobrr/qui@9ef56a2): refactor(makefile): windows support ([#&#8203;1546](autobrr/qui#1546)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7899cc8`](autobrr/qui@7899cc8): refactor(reflinking): add windows ReFS filesystem support ([#&#8203;1576](autobrr/qui#1576)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`51d34ab`](autobrr/qui@51d34ab): refactor(releases): share hdr normalization helpers ([#&#8203;1586](autobrr/qui#1586)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c7f4e3d`](autobrr/qui@c7f4e3d): refactor(web): tighten unified scope navigation ([#&#8203;1618](autobrr/qui#1618)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4b05177`](autobrr/qui@4b05177): test(handlers): cover tag baseline field requests ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.14.1...v1.15.0>

#### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.15.0`
- `docker pull ghcr.io/autobrr/qui:latest`

#### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4884
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
@nitrobass24
nitrobass24 deleted the fix/857-autocomplete-existing-torrent-location branch March 31, 2026 19:18
hbjydev pushed a commit to hbjydev/phoebe that referenced this pull request May 29, 2026
… ) (#12)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/autobrr/qui](https://github.com/autobrr/qui) | minor | `v1.14.1` → `v1.19.0` |

---

### Release Notes

<details>
<summary>autobrr/qui (ghcr.io/autobrr/qui)</summary>

### [`v1.19.0`](https://github.com/autobrr/qui/releases/tag/v1.19.0)

[Compare Source](autobrr/qui@v1.18.0...v1.19.0)

##### Changelog

##### New Features

- [`e26bd6b`](autobrr/qui@e26bd6b): feat(actions): include web-dist in release artifacts ([#&#8203;1801](autobrr/qui#1801)) ([@&#8203;turtletowerz](https://github.com/turtletowerz))
- [`2fabce1`](autobrr/qui@2fabce1): feat(automations): add export to instance action ([#&#8203;1736](autobrr/qui#1736)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`3fca808`](autobrr/qui@3fca808): feat(instances): api key authentication ([#&#8203;1854](autobrr/qui#1854)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`4ab1a75`](autobrr/qui@4ab1a75): feat(qbittorrent): show process uptime ([#&#8203;1849](autobrr/qui#1849)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`292ef70`](autobrr/qui@292ef70): feat(torrents): hide filter icon when not active or hovering over ([#&#8203;1869](autobrr/qui#1869)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`3c5cf3b`](autobrr/qui@3c5cf3b): feat(torrents): implement auto-fit width for columns on double-click ([#&#8203;1867](autobrr/qui#1867)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`5a9c538`](autobrr/qui@5a9c538): feat(torrents): set comment ([#&#8203;1928](autobrr/qui#1928)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`754f642`](autobrr/qui@754f642): feat(torrents): support new share limit parameters ([#&#8203;1872](autobrr/qui#1872)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`06a5fb6`](autobrr/qui@06a5fb6): feat(torrents): update AddTorrent methods for qbit 5.2.x support ([#&#8203;1902](autobrr/qui#1902)) ([@&#8203;zze0s](https://github.com/zze0s))
- [`45e3adc`](autobrr/qui@45e3adc): feat: add support for monitored folders ([#&#8203;1847](autobrr/qui#1847)) ([@&#8203;martylukyy](https://github.com/martylukyy))

##### Bug Fixes

- [`77c7ae8`](autobrr/qui@77c7ae8): fix(automations): discard add torrent response ([#&#8203;1904](autobrr/qui#1904)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7a368f1`](autobrr/qui@7a368f1): fix(ci): repair docs and release builds ([#&#8203;1932](autobrr/qui#1932)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8bd114e`](autobrr/qui@8bd114e): fix(crossseed): normalize empty qbit metadata ([#&#8203;1887](autobrr/qui#1887)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`92d66f9`](autobrr/qui@92d66f9): fix(crossseed): reuse shared string normalizer to stop goroutine leak ([#&#8203;1909](autobrr/qui#1909)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3c5d32a`](autobrr/qui@3c5d32a): fix(crossseed): run external programs after link-mode injection ([#&#8203;1874](autobrr/qui#1874)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b02d2a9`](autobrr/qui@b02d2a9): fix(qbittorrent): handle forced subcategories ([#&#8203;1863](autobrr/qui#1863)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`83cdb01`](autobrr/qui@83cdb01): fix(qbittorrent): handle new tracker statuses ([#&#8203;1879](autobrr/qui#1879)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b358ab4`](autobrr/qui@b358ab4): fix(rss): mirror torrentParams to legacy flat fields for qBit < 5.0 compat ([#&#8203;1846](autobrr/qui#1846)) ([@&#8203;frrad](https://github.com/frrad))
- [`5bcf648`](autobrr/qui@5bcf648): fix(seasonpacker): windows path handling ([#&#8203;1910](autobrr/qui#1910)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7de10c4`](autobrr/qui@7de10c4): fix(torrents): clear filters in unified-view empty state ([#&#8203;1898](autobrr/qui#1898)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`38f7bd3`](autobrr/qui@38f7bd3): fix(web): Show collapsed folders when searching torrent contents ([#&#8203;1850](autobrr/qui#1850)) ([@&#8203;ewenjo](https://github.com/ewenjo))
- [`d70d0bb`](autobrr/qui@d70d0bb): fix(web): keep showing torrent column filter icons on touch devices ([#&#8203;1881](autobrr/qui#1881)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`cecbad7`](autobrr/qui@cecbad7): fix(web): select-all bulk actions delete more torrents than visible when filters are stacked ([#&#8203;1926](autobrr/qui#1926)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`780c4aa`](autobrr/qui@780c4aa): fix(web): sidebar element collisions ([#&#8203;1876](autobrr/qui#1876)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`b621973`](autobrr/qui@b621973): fix(web): use unique keys for duplicate search results ([#&#8203;1886](autobrr/qui#1886)) ([@&#8203;GtwoK](https://github.com/GtwoK))

##### Other Changes

- [`ffda071`](autobrr/qui@ffda071): chore(deps): bump [@&#8203;babel/plugin-transform-modules-systemjs](https://github.com/babel/plugin-transform-modules-systemjs) from 7.28.5 to 7.29.4 in /documentation ([#&#8203;1889](autobrr/qui#1889)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`89ab1c8`](autobrr/qui@89ab1c8): chore(deps): bump [@&#8203;babel/plugin-transform-modules-systemjs](https://github.com/babel/plugin-transform-modules-systemjs) from 7.29.0 to 7.29.4 in /web ([#&#8203;1888](autobrr/qui#1888)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`c420bb2`](autobrr/qui@c420bb2): chore(deps): bump follow-redirects from 1.15.11 to 1.16.0 in /documentation ([#&#8203;1903](autobrr/qui#1903)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`28e4bf9`](autobrr/qui@28e4bf9): chore(deps): bump the github group with 2 updates ([#&#8203;1894](autobrr/qui#1894)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`9b241de`](autobrr/qui@9b241de): chore(deps): bump the github group with 3 updates ([#&#8203;1861](autobrr/qui#1861)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4872577`](autobrr/qui@4872577): chore(deps): bump webpack-dev-server from 5.2.2 to 5.2.4 in /documentation ([#&#8203;1908](autobrr/qui#1908)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`3e3ec8b`](autobrr/qui@3e3ec8b): chore(deps): bump ws from 8.18.3 to 8.20.1 in /documentation ([#&#8203;1907](autobrr/qui#1907)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`25cf511`](autobrr/qui@25cf511): chore(web): migrate to pnpm 11 ([#&#8203;1883](autobrr/qui#1883)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`4b6dce1`](autobrr/qui@4b6dce1): docs: add shared agent instructions symlink ([#&#8203;1911](autobrr/qui#1911)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`97df42c`](autobrr/qui@97df42c): other(docs): resolve 5 Dependabot security alerts on Docs Site ([#&#8203;1906](autobrr/qui#1906)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`5068a4d`](autobrr/qui@5068a4d): refactor(crossseed): gather all results for matching and refine TV based searching ([#&#8203;1871](autobrr/qui#1871)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`9d3e245`](autobrr/qui@9d3e245): refactor(crossseed): improve anime/AKA handling ([#&#8203;1882](autobrr/qui#1882)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`6f2b94c`](autobrr/qui@6f2b94c): refactor(torrents): drop unused rename props from TorrentContextMenu ([#&#8203;1900](autobrr/qui#1900)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`3ec0605`](autobrr/qui@3ec0605): refactor(web): clean up 180 multiline-ternary warnings repo-wide ([#&#8203;1905](autobrr/qui#1905)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))

**Full Changelog**: <autobrr/qui@v1.18.0...v1.19.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.19.0`
- `docker pull ghcr.io/autobrr/qui:latest`

##### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

### [`v1.18.0`](https://github.com/autobrr/qui/releases/tag/v1.18.0)

[Compare Source](autobrr/qui@v1.17.0...v1.18.0)

##### Changelog

##### New Features

- [`b708bc8`](autobrr/qui@b708bc8): feat(automations): add UPLOADED\_OVER\_SIZE condition field ([#&#8203;1830](autobrr/qui#1830)) ([@&#8203;com6056](https://github.com/com6056))
- [`565731e`](autobrr/qui@565731e): feat(automations): cross-instance HARDLINK\_SCOPE\_CROSS ([#&#8203;1810](autobrr/qui#1810)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`a284860`](autobrr/qui@a284860): feat(dirscan): add webhook download client filters ([#&#8203;1751](autobrr/qui#1751)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fd54124`](autobrr/qui@fd54124): feat(web): Add option to copy magnet link from the context menu ([#&#8203;1835](autobrr/qui#1835)) ([@&#8203;pietrocaselani](https://github.com/pietrocaselani))

##### Bug Fixes

- [`ea33304`](autobrr/qui@ea33304): fix(crossseed): broaden TV/movie torznab categories and skip year on TV ([#&#8203;1822](autobrr/qui#1822)) ([@&#8203;imSp4rky](https://github.com/imSp4rky))
- [`3c3f944`](autobrr/qui@3c3f944): fix(license): unblock stale polar license migration ([#&#8203;1799](autobrr/qui#1799)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`941cf42`](autobrr/qui@941cf42): fix(qbit): stop serving stale maindata to the status bar ([#&#8203;1785](autobrr/qui#1785)) ([@&#8203;Zariel](https://github.com/Zariel))
- [`ca7590a`](autobrr/qui@ca7590a): fix(rss): populate legacy assignedCategory for qBittorrent < 5.0 comp… ([#&#8203;1836](autobrr/qui#1836)) ([@&#8203;frrad](https://github.com/frrad))
- [`278441a`](autobrr/qui@278441a): fix(settings): explain disabled API keys ([#&#8203;1826](autobrr/qui#1826)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0f4eb52`](autobrr/qui@0f4eb52): fix(web): remove deprecated tsconfig baseUrl ([#&#8203;1840](autobrr/qui#1840)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`c6dbf9a`](autobrr/qui@c6dbf9a): chore(deps): bump postcss from 8.5.6 to 8.5.10 in /documentation ([#&#8203;1837](autobrr/qui#1837)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`053c171`](autobrr/qui@053c171): chore(deps): bump the github group across 1 directory with 3 updates ([#&#8203;1834](autobrr/qui#1834)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4cbedac`](autobrr/qui@4cbedac): chore(deps): bump the golang group with 15 updates ([#&#8203;1832](autobrr/qui#1832)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`dd661e8`](autobrr/qui@dd661e8): chore(deps): bump the npm group in /web with 20 updates ([#&#8203;1833](autobrr/qui#1833)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`82029d6`](autobrr/qui@82029d6): chore(deps): update go-qbittorrent for new qbt 5.2.x webAPI version ([#&#8203;1841](autobrr/qui#1841)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`6b5b82e`](autobrr/qui@6b5b82e): refactor(time): use seconds and cleanup ([#&#8203;1823](autobrr/qui#1823)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`f5cb0c1`](autobrr/qui@f5cb0c1): refactor: O(n²) cross-seed lookups in automations preview and execution paths ([#&#8203;1829](autobrr/qui#1829)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))

**Full Changelog**: <autobrr/qui@v1.17.0...v1.18.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.18.0`
- `docker pull ghcr.io/autobrr/qui:latest`

##### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

### [`v1.17.0`](https://github.com/autobrr/qui/releases/tag/v1.17.0)

[Compare Source](autobrr/qui@v1.16.1...v1.17.0)

##### Changelog

##### Bug Fixes

- [`52c5e73`](autobrr/qui@52c5e73): fix(automations): clarify cross-seed condition labels ([#&#8203;1763](autobrr/qui#1763)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`70e0032`](autobrr/qui@70e0032): fix(crossseed): skip link-mode category path warnings ([#&#8203;1753](autobrr/qui#1753)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`85df3e7`](autobrr/qui@85df3e7): fix(orphanscan): align content path root detection ([#&#8203;1771](autobrr/qui#1771)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`117d617`](autobrr/qui@117d617): fix(orphanscan): ignore qBittorrent incomplete files ([#&#8203;1761](autobrr/qui#1761)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`388415e`](autobrr/qui@388415e): fix(web): fix add torrent/magnet urls ([#&#8203;1762](autobrr/qui#1762)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))

##### Other Changes

- [`845599a`](autobrr/qui@845599a): chore(ci): speed up CI pipeline (9.3 min → 4.3 min for PRs) ([#&#8203;1750](autobrr/qui#1750)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`2b09cf3`](autobrr/qui@2b09cf3): chore: trim embedded web assets and Docker build context ([#&#8203;1723](autobrr/qui#1723)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`5262f7c`](autobrr/qui@5262f7c): docs: add migration PR guidance ([#&#8203;1748](autobrr/qui#1748)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`65c7046`](autobrr/qui@65c7046): refactor(search): table & cards cleanup ([#&#8203;1768](autobrr/qui#1768)) ([@&#8203;nuxencs](https://github.com/nuxencs))

**Full Changelog**: <autobrr/qui@v1.16.1...v1.17.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.17.0`
- `docker pull ghcr.io/autobrr/qui:latest`

##### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

### [`v1.16.1`](https://github.com/autobrr/qui/releases/tag/v1.16.1)

[Compare Source](autobrr/qui@v1.16.0...v1.16.1)

##### Changelog

##### Bug Fixes

- [`e177ad9`](autobrr/qui@e177ad9): fix(auth): harden OIDC PKCE flow ([#&#8203;1746](autobrr/qui#1746)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`393e2b7`](autobrr/qui@393e2b7): fix(dirscan): tighten flexible matching and improve diagnostics ([#&#8203;1742](autobrr/qui#1742)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.16.0...v1.16.1>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.16.1`
- `docker pull ghcr.io/autobrr/qui:latest`

##### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

### [`v1.16.0`](https://github.com/autobrr/qui/releases/tag/v1.16.0)

[Compare Source](autobrr/qui@v1.15.0...v1.16.0)

##### Changelog

##### Highlights

- Automations got a major upgrade: rules can now match across instances, use system time, control AutoTMM, and opt out of notifications per workflow.
- Cross-seed is more reliable during state changes. Completion searches now wait for torrents to finish checking or moving, disabled instances are skipped cleanly, and hardlink/reflink save-path handling is more accurate.
- Dir Scan works better with real media libraries, with improved partial season-pack handling in link-tree mode, support for downloading missing files when needed, and better progress retention across restarts.
- Managing torrents in the unified view is smoother, with more accurate tracker health, quicker instance-level actions, and more stable category and tag editing dialogs.
- OIDC and backups both got practical quality-of-life improvements: OIDC now supports PKCE, backup settings can be applied across instances, and backup export handling is safer for tricky torrent layouts.

##### New Features

- [`2b92c7b`](autobrr/qui@2b92c7b): feat(auth): add PKCE support to OIDC implementation ([#&#8203;1737](autobrr/qui#1737)) ([@&#8203;oynqr](https://github.com/oynqr))
- [`ba3d5d9`](autobrr/qui@ba3d5d9): feat(automations): add AutoTMM condition and action ([#&#8203;1698](autobrr/qui#1698)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`702e808`](autobrr/qui@702e808): feat(automations): add system time to query builder ([#&#8203;1677](autobrr/qui#1677)) ([@&#8203;wastaken7](https://github.com/wastaken7))
- [`e6493b3`](autobrr/qui@e6493b3): feat(automations): allow disable of notifications ([#&#8203;1652](autobrr/qui#1652)) ([@&#8203;heathlarsen](https://github.com/heathlarsen))
- [`565ac2d`](autobrr/qui@565ac2d): feat(automations): cross instance condition ([#&#8203;1648](autobrr/qui#1648)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`7e12a02`](autobrr/qui@7e12a02): feat(update): verify self-updates with signed release checksums ([#&#8203;1665](autobrr/qui#1665)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3778c7b`](autobrr/qui@3778c7b): feat(web): Add action buttons to unified instance. ([#&#8203;1637](autobrr/qui#1637)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`bf9eaba`](autobrr/qui@bf9eaba): feat(web): Clarify dashboard quick links ([#&#8203;1636](autobrr/qui#1636)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`b930530`](autobrr/qui@b930530): feat(web): add "Save changes to all instances" button to backup settings ([#&#8203;1651](autobrr/qui#1651)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`5975c34`](autobrr/qui@5975c34): feat(web): add Discord perk section to license manager ([#&#8203;1656](autobrr/qui#1656)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d8ad0d6`](autobrr/qui@d8ad0d6): feat(web): unify tab styling and animations ([#&#8203;1632](autobrr/qui#1632)) ([@&#8203;nuxencs](https://github.com/nuxencs))

##### Bug Fixes

- [`44596b9`](autobrr/qui@44596b9): fix(automations): add AutoTMM to condition validation ([#&#8203;1726](autobrr/qui#1726)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8f757b2`](autobrr/qui@8f757b2): fix(automations): hardlink signature grouping ([#&#8203;1670](autobrr/qui#1670)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`d242f0c`](autobrr/qui@d242f0c): fix(automations): include AutoManagement in delete standalone check ([#&#8203;1731](autobrr/qui#1731)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`744bdb8`](autobrr/qui@744bdb8): fix(backups): adaptive export throttle ([#&#8203;1630](autobrr/qui#1630)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d1dbb81`](autobrr/qui@d1dbb81): fix(backups): gate bulk save on resolved instance capabilities ([#&#8203;1682](autobrr/qui#1682)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2eea961`](autobrr/qui@2eea961): fix(backups): skip live export for hybrid torrents ([#&#8203;1669](autobrr/qui#1669)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2cac32d`](autobrr/qui@2cac32d): fix(crossseed): skip disabled instances ([#&#8203;1635](autobrr/qui#1635)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ebbba8e`](autobrr/qui@ebbba8e): fix(crossseed): tone down async cache reuse log ([#&#8203;1686](autobrr/qui#1686)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fd382b7`](autobrr/qui@fd382b7): fix(dirscan): link plan size tolerance + partial season pack injection in link tree mode ([#&#8203;1695](autobrr/qui#1695)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5131092`](autobrr/qui@5131092): fix(dirscan): retain recent runs and clarify restart behavior ([#&#8203;1564](autobrr/qui#1564)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3fbcc7a`](autobrr/qui@3fbcc7a): fix(openapi): document dirscan downloadMissingFiles ([#&#8203;1727](autobrr/qui#1727)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d16fee2`](autobrr/qui@d16fee2): fix(orphanscan): use content\_path to prevent false positives when Auto TMM changes save\_path ([#&#8203;1712](autobrr/qui#1712)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`e74bf02`](autobrr/qui@e74bf02): fix(qbittorrent): avoid tracker health URL false positives ([#&#8203;1738](autobrr/qui#1738)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`632fc54`](autobrr/qui@632fc54): fix(torrents): honor tracker health in unified view ([#&#8203;1668](autobrr/qui#1668)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`76fddc4`](autobrr/qui@76fddc4): fix(torrents): stabilize tag and category dialogs ([#&#8203;1638](autobrr/qui#1638)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c758b6d`](autobrr/qui@c758b6d): fix(torrents): validate creator output path ([#&#8203;1739](autobrr/qui#1739)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6c23f0e`](autobrr/qui@6c23f0e): fix(web): cross-seed warning in unified view ([#&#8203;1692](autobrr/qui#1692)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`57822c0`](autobrr/qui@57822c0): fix(web): improve duplicate torrent state and check another field.state.value type in AddTorrentDialog ([#&#8203;1679](autobrr/qui#1679)) ([@&#8203;keatonhasse](https://github.com/keatonhasse))
- [`246c8f6`](autobrr/qui@246c8f6): fix(web): migrate vite chunk splitting config ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`263b0bd`](autobrr/qui@263b0bd): build(deps): add cooldown to dependabot config ([#&#8203;1691](autobrr/qui#1691)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a394157`](autobrr/qui@a394157): chore(deps): bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 ([#&#8203;1713](autobrr/qui#1713)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`10612a7`](autobrr/qui@10612a7): chore(deps): bump golang.org/x/image from 0.36.0 to 0.38.0 ([#&#8203;1685](autobrr/qui#1685)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`16019dd`](autobrr/qui@16019dd): chore(deps): bump pnpm/action-setup from 4 to 5 in the github group ([#&#8203;1634](autobrr/qui#1634)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`fbb25fc`](autobrr/qui@fbb25fc): chore(deps): bump the golang group with 11 updates ([#&#8203;1693](autobrr/qui#1693)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`cbb9594`](autobrr/qui@cbb9594): chore(deps): bump the golang group with 3 updates ([#&#8203;1701](autobrr/qui#1701)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`805ab74`](autobrr/qui@805ab74): chore(deps): bump the npm group in /web with 25 updates ([#&#8203;1694](autobrr/qui#1694)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e3f839c`](autobrr/qui@e3f839c): chore(deps): bump the npm group in /web with 5 updates ([#&#8203;1702](autobrr/qui#1702)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`b076ad4`](autobrr/qui@b076ad4): docs(dirscan): clarify re-identification after torrent removal ([#&#8203;1720](autobrr/qui#1720)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`340f343`](autobrr/qui@340f343): docs: add license management page with deactivation guide ([#&#8203;1706](autobrr/qui#1706)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5d148be`](autobrr/qui@5d148be): docs: fix link in issue triage template ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0b64237`](autobrr/qui@0b64237): docs: update release follow-up docs ([#&#8203;1741](autobrr/qui#1741)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.15.0...v1.16.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.16.0`
- `docker pull ghcr.io/autobrr/qui:latest`

##### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

### [`v1.15.0`](https://github.com/autobrr/qui/releases/tag/v1.15.0)

[Compare Source](autobrr/qui@v1.14.1...v1.15.0)

##### Changelog

##### Breaking change

CORS is disabled by default; enable by setting QUI\_\_CORS\_ALLOWED\_ORIGINS with explicit origins (http(s)://host\[:port]). See <https://getqui.com/docs/advanced/sso-proxy-cors>

##### New Features

- [`93786a2`](autobrr/qui@93786a2): feat(automations): add configurable processing priority/sorting ([#&#8203;1235](autobrr/qui#1235)) ([@&#8203;Oscariremma](https://github.com/Oscariremma))
- [`45eaf1f`](autobrr/qui@45eaf1f): feat(database): add postgres and sqlite migration CLI ([#&#8203;1530](autobrr/qui#1530)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`430f5d1`](autobrr/qui@430f5d1): feat(torrents): mediaInfo dialog ([#&#8203;1537](autobrr/qui#1537)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8eb8903`](autobrr/qui@8eb8903): feat(web): Add persistence to unified instance filter in sidebar ([#&#8203;1560](autobrr/qui#1560)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`7aadde7`](autobrr/qui@7aadde7): feat(web): add path autocomplete to set location dialog ([#&#8203;1432](autobrr/qui#1432)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`077f32c`](autobrr/qui@077f32c): feat: add mediainfo api endpoint ([#&#8203;1545](autobrr/qui#1545)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`99cf695`](autobrr/qui@99cf695): feat: endpoint to trigger directory scans from external tools ([#&#8203;1559](autobrr/qui#1559)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8956f9b`](autobrr/qui@8956f9b): feat: unify bulk tag editor ([#&#8203;1571](autobrr/qui#1571)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Bug Fixes

- [`552d617`](autobrr/qui@552d617): fix(api): align add torrent OpenAPI field ([#&#8203;1617](autobrr/qui#1617)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`424f7a0`](autobrr/qui@424f7a0): fix(api): restrict CORS to explicit allowlist ([#&#8203;1551](autobrr/qui#1551)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`38991d8`](autobrr/qui@38991d8): fix(auth): allow loopback health probes ([#&#8203;1621](autobrr/qui#1621)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4ae88c9`](autobrr/qui@4ae88c9): fix(automations): align include-cross-seeds category apply ([#&#8203;1517](autobrr/qui#1517)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6a127a8`](autobrr/qui@6a127a8): fix(automations): scope skipWithin to only deleted action ([#&#8203;1538](autobrr/qui#1538)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`c776189`](autobrr/qui@c776189): fix(crossseed): avoid completion timeout misses on non-Gazelle torrents ([#&#8203;1536](autobrr/qui#1536)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b1338a7`](autobrr/qui@b1338a7): fix(crossseed): handle missing webhook collection tags ([#&#8203;1610](autobrr/qui#1610)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eacbb68`](autobrr/qui@eacbb68): fix(crossseed): normalize hdr aliases ([#&#8203;1572](autobrr/qui#1572)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`537ad46`](autobrr/qui@537ad46): fix(crossseed): queue completion searches and retry rate-limit waits ([#&#8203;1523](autobrr/qui#1523)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4fc550f`](autobrr/qui@4fc550f): fix(crossseed): use autobrr indexer ids for webhooks ([#&#8203;1614](autobrr/qui#1614)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`08029ad`](autobrr/qui@08029ad): fix(crossseed): valid partial matches being rejected ([#&#8203;1291](autobrr/qui#1291)) ([@&#8203;rybertm](https://github.com/rybertm))
- [`77eedd9`](autobrr/qui@77eedd9): fix(database): avoid postgres temp-table statement caching ([#&#8203;1581](autobrr/qui#1581)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`25daa17`](autobrr/qui@25daa17): fix(dirscan): honor canceled queued webhook runs ([#&#8203;1612](autobrr/qui#1612)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`56995f1`](autobrr/qui@56995f1): fix(dirscan): queue webhook scans and tighten age filtering ([#&#8203;1603](autobrr/qui#1603)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`444d07b`](autobrr/qui@444d07b): fix(dirscan): select concrete hardlink base dir ([#&#8203;1606](autobrr/qui#1606)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c35bea0`](autobrr/qui@c35bea0): fix(instances): improve settings dialog scrolling ([#&#8203;1569](autobrr/qui#1569)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`dc501a0`](autobrr/qui@dc501a0): fix(proxy): reauth qbit passthrough requests ([#&#8203;1582](autobrr/qui#1582)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7950d1d`](autobrr/qui@7950d1d): fix(proxy): search endpoint handling ([#&#8203;1524](autobrr/qui#1524)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`1076eea`](autobrr/qui@1076eea): fix(qbit): prune empty managed dirs after delete\_with\_files ([#&#8203;1604](autobrr/qui#1604)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5a3114b`](autobrr/qui@5a3114b): fix(qbittorrent): stop reboot torrent\_completed spam ([#&#8203;1515](autobrr/qui#1515)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1d02e6c`](autobrr/qui@1d02e6c): fix(settings): contain settings tab scrolling ([#&#8203;1567](autobrr/qui#1567)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`f5d69f3`](autobrr/qui@f5d69f3): fix(settings): smoother gradient ([#&#8203;1570](autobrr/qui#1570)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`1c0c3bc`](autobrr/qui@1c0c3bc): fix(torrents): copy MediaInfo summary without brackets ([#&#8203;1540](autobrr/qui#1540)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3ec913a`](autobrr/qui@3ec913a): fix(web): auto-append slash on path autocomplete selection ([#&#8203;1431](autobrr/qui#1431)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`aa2f3da`](autobrr/qui@aa2f3da): fix(web): check field.state.value type in AddTorrentDialog ([#&#8203;1613](autobrr/qui#1613)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1abfc5e`](autobrr/qui@1abfc5e): fix(web): handle SSO proxy redirect to /index.html ([#&#8203;1600](autobrr/qui#1600)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1991f90`](autobrr/qui@1991f90): fix(web): warn before enabling reannounce ([#&#8203;1583](autobrr/qui#1583)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`4069492`](autobrr/qui@4069492): chore(deps): bump the github group with 3 updates ([#&#8203;1535](autobrr/qui#1535)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`a02e9e8`](autobrr/qui@a02e9e8): chore(deps): bump the github group with 7 updates ([#&#8203;1558](autobrr/qui#1558)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`8713667`](autobrr/qui@8713667): chore(deps): bump the golang group with 15 updates ([#&#8203;1543](autobrr/qui#1543)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`420607e`](autobrr/qui@420607e): chore(go,ci): adopt go fix, bump to 1.26, and speed up PR checks ([#&#8203;1480](autobrr/qui#1480)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0d0df45`](autobrr/qui@0d0df45): docs: add password reset section to CLI commands ([#&#8203;1598](autobrr/qui#1598)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9ef56a2`](autobrr/qui@9ef56a2): refactor(makefile): windows support ([#&#8203;1546](autobrr/qui#1546)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7899cc8`](autobrr/qui@7899cc8): refactor(reflinking): add windows ReFS filesystem support ([#&#8203;1576](autobrr/qui#1576)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`51d34ab`](autobrr/qui@51d34ab): refactor(releases): share hdr normalization helpers ([#&#8203;1586](autobrr/qui#1586)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c7f4e3d`](autobrr/qui@c7f4e3d): refactor(web): tighten unified scope navigation ([#&#8203;1618](autobrr/qui#1618)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4b05177`](autobrr/qui@4b05177): test(handlers): cover tag baseline field requests ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.14.1...v1.15.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.15.0`
- `docker pull ghcr.io/autobrr/qui:latest`

##### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/London)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTUuMSIsInVwZGF0ZWRJblZlciI6IjQzLjE5NS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://forgejo.hayden.moe/hayden/phoebe/pulls/12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FR] Enable autocomplete for existing torrents set location

2 participants