Moving Linked Files Between Configured Directories
JabRef supports up to four directory types for storing linked files (see Directories for Files):
| ID | Name | Scope |
|---|---|---|
| MD | Main file directory | Global preference; current user only |
| LSD | Library-specific file directory | Per library; all users of that library |
| USD | User-specific file directory | Per user per library; current user only |
| LD | Next to library | Global preference “store files next to library”; files live alongside the .bib file |
Issue: #12287
Linked file context menu must display all configured directories as move targets
req~jabgui.linked-files.move.context-menu-all-directories~1
The right-click context menu for a linked file must display one menu item per configured directory type (MD, LSD, USD, LD). Each item is labelled as follows:
| Directory | Menu label |
|---|---|
| MD | Move file to main file directory |
| LSD | Move file to library-specific file directory |
| USD | Move file to user-specific file directory |
| LD | Move file next to library |
Only directories that are actually configured appear in the menu.
TODO Needs: impl, utest
Linked file context menu must disable move target for file current directory
req~jabgui.linked-files.move.context-menu-disable-current~1
The menu item whose directory contains the linked file must be shown but disabled. It must not be hidden, so that the user can see which directory the file currently resides in.
TODO Needs: impl, utest
Linked file context menu must disable move items when no directory is configured
req~jabgui.linked-files.move.context-menu-disable-no-config~1
When no file directory of any type is configured (e.g. an unsaved new library with no preferences set), all move menu items must be disabled.
TODO Needs: impl, utest
Linked file context menu must disable move next to library when library is unsaved
req~jabgui.linked-files.move.ld-requires-saved-library~1
The “Move file next to library” item (LD) must be disabled whenever the current library has no file path on disk (i.e. it has never been saved).
TODO Needs: impl, utest
File move action must move all selected files to chosen target directory
req~jabgui.linked-files.move.multi-file-single-target~1
When multiple linked files are selected and the user invokes a move action, every selected file must be moved to the single target directory the user chose. The source directory of each individual file is irrelevant to the choice of target.
TODO Needs: impl, utest
File move action must silently skip files already present in target directory
req~jabgui.linked-files.move.multi-file-skip-existing~1
If a selected file already resides in the chosen target directory, the system must skip that file without raising an error or displaying a warning.
TODO Needs: impl, utest
File move action must preserve subdirectory structure under target directory
req~logic.linked-files.move.preserve-subdirectory-structure~1
When a file is moved between directories, its path relative to the source directory must be reconstructed under the target directory.
Example:
| Item | Path |
|---|---|
| Source directory (LSD) | E:\lib |
| Target directory (USD) | U:\papers |
| Original file path | E:\lib\a\b\c\paper.pdf |
| Expected file path after move | U:\papers\a\b\c\paper.pdf |
TODO Needs: impl, utest
Alternatives considered for the context menu
Two earlier designs were rejected before settling on “one menu item per configured directory”:
- One dynamic label computed from an algorithm (e.g. “Move file to [best target]”) — rejected because the user cannot choose, and the algorithm (see comments on issue #12287) has acknowledged inconsistencies between the two-directory and three-directory cases that are hard to explain to users.
- A single generic rotating label (“Move file to next configured directory”) — implemented by PR #15055 but rejected because “next” is opaque: the user must know the rotation order (USD → LSD → MD → USD) to predict where the file lands, and reaching a non-adjacent target requires multiple interactions.
The chosen design — one menu item per configured directory, with the current directory shown but disabled — was selected because behaviour is explicit and discoverable, any target is reachable in one action, and adding or removing a directory configuration is immediately reflected in the menu.