UX
This page collects general UX requirements.
Generally available buttons and menu items are disabled instead of not shown
req~ux.disabled-vs-hidden~1
When there is functionality generally available but cannot be executed at the present time, it is shown as disabled.
Example: Button to open a link. If there is no link, the button should be shown but not enabled.
Needs: impl
Confirmation dialogs use the action name as the confirm button label
req~ui.dialogs.confirmation.naming~1
In confirmation dialogs, the confirm button must be labeled with the specific action name (e.g., “Download full text documents”) rather than a generic label such as “OK” or “Yes”. This makes the intended action unambiguous and reduces the risk of accidental confirmation.
Needs: impl
Auto close of merge entries dialog
req~ux.auto-close.merge-entries~1
The merge entries dialog collects and merges data from multiple sources. In case there is only one source, it should not be shown. Since some data fetchers take time, we need to open the dialog and wait until all sources are available. As soon as only one source is available, the dialog should be closed to speed up the user’s workflow.
Needs: impl
Main Table Focus
req~maintable.focus~1
Prevents the main table from losing focus when adding a new library or when changing tabs. This provides immediate keyboard interaction capabilities (such as Ctrl+V for pasting operations when changing tabs) without requiring explicit focus via mouse click.
Needs: impl
Critical startup failures show an error dialog
req~ux.startup.critical-error-dialog~1
If a critical error occurs before the main window is fully constructed, it must not fail silently. The user needs a visible error dialog, in addition to the log entry, since digging through log files is not accessible to most users.
Needs: impl
Merge entries dialog allows selecting empty field values
req~ux.merge-entries.select-empty-field~1
When the merge entries dialog shows a field that is missing in one of the source entries, the user must be able to explicitly select that empty value so the merged entry is cleared for that field.
Needs: impl
Updating an entry via entry data applies the confirmed merge result
req~ux.update-entry-web-info.apply-merge-result~1
When a user chooses Update with bibliographic information via entry data and confirms the merge dialog, the selected merged values must be written back to the original entry as one undoable update.
Needs: impl
Activating large libraries keeps entry previews responsive
req~ux.active-library.preview-responsiveness~1
When a user activates a large library, automatic group construction and group-count evaluation must not delay rendering the selected entry preview.
Needs: impl
Creating a new explicit group can reuse the current selection
req~ux.groups.create-explicit-from-selection~1
When a user creates a new explicit group, JabRef should allow reusing the currently selected entries for that group and should keep the newly created group selected afterwards.
Needs: impl
Saving keeps external change detection active
req~ux.external-library-changes.after-save~1
When JabRef saves a library, it must keep observing filesystem changes, defer change detection until the save has finished, and then inspect the resulting file for external changes that require conflict resolution. Since inspecting a library file means parsing it completely, the inspection is skipped when the file’s size and modification time show that it has not changed since the last state known to match the in-memory library.
Needs: impl
Deleting many entries keeps the main table responsive
req~ux.large-library.bulk-entry-removal~1
When a user deletes many entries from a large library, JabRef must keep the main table responsive.
Needs: impl
Focus the text field in text dialogs
req~ux.textdialogs.focus~1
When a dialog with text input as a main component is opened, the text field should be focused.
Needs: impl
Show unsaved changes before closing a library
req~ux.close.show-diff~1
When closing a modified library, the “Save before closing” dialog should offer to show the unsaved changes compared to the file on disk, so the user can decide between saving and discarding on an informed basis.
Needs: impl
Automatically paste clipboard content when useful
req~ux.textdialogs.autopaste~1
When a dialog with text input as a main component is opened, and it is expected that while working with it, the user will paste from clipboard, JabRef should already automatically paste it.
Example: new entry dialog by ID. It is expected that user would copy some paper ID (from browser, PDF, etc.), and then paste it in the dialog. As said above, JabRef automatically pastes the ID into the text field.
Needs: impl
Automatic Identifier Detection and Focus in New Entry Dialog
req~newentry.clipboard.autofocus~1
When the “New Entry” dialog is opened:
-
If the clipboard contains a valid identifier (e.g., DOI, ISBN, ArXiv, RFC):
- The dialog automatically switches to the “Enter Identifier” tab.
- The identifier input field is automatically filled with the clipboard content.
- The field receives keyboard focus and its content is selected.
- The corresponding fetcher (e.g., DOI, ISBN) is automatically selected based on the detected identifier type.
This behavior streamlines the process of creating new entries by allowing users to copy an identifier and open the dialog, without needing to manually select the input field, switch tabs, or choose a fetcher manually.
Needs: impl