UX

This page collects general UX requirements.

Inactive actions must be displayed as disabled rather than hidden

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 must label confirm button with action name

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”.

Rationale: Action-specific labels eliminate ambiguity about the consequence of the button press and reduce the risk of accidental confirmation.

Needs: impl

Merge entries dialog must close automatically when single source remains

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 must maintain focus when switching tabs or adding libraries

req~maintable.focus~1

The main table maintains focus when adding a new library or switching between library tabs.

Rationale: Retaining focus enables immediate keyboard interaction (such as Ctrl+V paste shortcuts) without requiring the user to click with the mouse first.

Needs: impl

Main table column headers must display user-friendly titles

req~maintable.column-headers.user-friendly~1

Column headers of the main table show readable names, not raw BibTeX field names. JabRef-internal fields such as the entry type and the citation key are shown as “Entry Type” and “Citation Key”. Headers use Title Case, as an exception to the sentence-case rule for UI text, so they read like the other headers (“Author/Editor”).

Needs: impl

GUI must display error dialog upon critical startup failure

req~ux.startup.critical-error-dialog~1

If a critical error occurs before the main window is fully constructed, JabRef displays a visible error dialog in addition to logging the error.

Rationale: Digging through log files is not accessible or obvious to non-technical users (#14967).

Needs: impl

JabRef must load citation style sources on demand

req~ux.citation-styles.lazy-source-loading~1

JabRef must load built-in citation-style metadata at startup without retaining every CSL source in memory. A style’s source is loaded only when that style is used.

Needs: impl, utest

Merge entries dialog must allow 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

Entry update workflow must apply confirmed merge result atomically

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

Library activation must keep entry preview rendering 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

Consistency reports must be prepared outside JavaFX application thread

req~ux.consistency.report-background~1

Report preparation includes computing the table columns and field-presence symbols before the dialog is shown.

Needs: impl, utest

Consistency exports must run outside JavaFX application thread

req~ux.consistency.export-background~1

The user chooses a destination in the GUI before the TXT or CSV report is written in the background.

Needs: impl, utest

Consistency exports must preserve results shown in dialog

req~ux.consistency.export-snapshot~1

Entry edits or entry-type customizations after the check must not change an exported report.

Needs: impl, utest

Consistency dialog actions must navigate to original library entries

req~ux.consistency.entry-navigation~1

The dialog uses snapshots to prepare its report without replacing the entries selected for editing.

Needs: impl, utest

Consistency dialog must display fields missing from every entry

req~ux.consistency.missing-field-columns~1

Reported columns remain visible even when all entries of the selected type have the same field-presence symbol.

Context: Consistency-check output fixes.

Needs: impl, utest

Consistency dialog can restrict field columns to a BibTeX style

req~ux.consistency.bst-field-columns~2

The user chooses a .bst file and can switch between all columns and the fields its ENTRY command declares, their supported aliases, and the implicit crossref field. Switching back and forth keeps the chosen style. A pending style load preserves a later choice to show all fields. Entry type and citation key stay visible; entry types without a visible column are not offered.

Needs: impl, utest

Consistency check must compare only entries selected by an AUX file

req~ux.consistency.aux-entry-selection~2

The user chooses a LaTeX .aux file to select cited entries, including citations from nested AUX files. If exactly one .aux file lies next to the library file, it is chosen by default after the consistency dialog opens. The decision to open the dialog uses the full-library findings, regardless of the default AUX subset. A wildcard citation selects all library entries. The check recomputes differences within the selected entries and preserves the chosen field restriction. The user switches between all entries and the cited ones; switching keeps the chosen .aux file. Unknown citation keys do not select entries; a valid selection without matching entries produces an empty report. Uncited cross-reference parents do not participate in the comparison.

Reading and checking run in the background. Superseded loads stop cooperatively when the selection changes or the dialog closes. Reports share immutable field-presence snapshots and derive cell symbols on demand. A read failure preserves the previous report. Automatic-load failures are logged without opening an error dialog; explicitly selected file failures are shown to the user. An older request cannot replace a newer selection. Exports use the selected-entry report, while entry navigation targets the original library entries.

Context: AUX selection for consistency checks.

Needs: impl, utest

Group creation must allow populating new explicit group from 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

The “Close dialog” key binding closes the dialog

req~ux.dialogs.close-key-binding~1

Pressing the “Close dialog” key binding in a dialog closes it (#8888, #15133). Its default is Esc; users can change it in the key binding preferences. Heavy-weight dialogs whose content the user builds up over time are exempt, so that a stray key press does not throw that state away. Currently, this is only the PDF viewer (“Document viewer”).

Needs: impl, utest

Open combo box popup must close without closing enclosing dialog on Escape

req~ux.combobox.escape-closes-popup-only~1

When a combobox or drop-down list (such as a CheckComboBox, ComboBox, or ChoiceBox) is open within a dialog and the user presses Escape, only the drop-down popup must be closed. The enclosing dialog must remain open (#16596).

Library save must maintain filesystem change detection after completion

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

Bulk entry deletion must keep 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

Text input dialogs must focus primary text field upon opening

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

Textual list filtering must be case-insensitive and separator-aware

req~ux.text-filtering.case-insensitive-separators~1

When users filter textual lists, matching must ignore case and treat punctuation or whitespace separators as equivalent. For example, a search for Springer lecture or SPRINGER LECTURE or springer lecture should match Springer - Lecture Notes in Computer Science.

Needs: impl

Save before closing dialog must offer diff view of unsaved changes

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

Text input dialogs must auto-paste relevant clipboard content on open

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

New entry dialog must auto-detect clipboard identifier and focus field

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.

Rationale: Pre-filling and auto-focusing the detected identifier eliminates repetitive mouse clicks and tab switching when creating entries from copied DOIs or ISBNs.

Needs: impl

JabRef must bundle dual-scheme community themes out of the box

req~ux.themes.bundled-community-themes~1

The themes from https://themes.jabref.org/ that cover both color schemes are bundled with JabRef and appear in the theme selection next to the built-in themes, without the user having to download a CSS file.

Needs: impl

Library tabs must display icon indicating library storage format

req~ux.tabs.library-kind-icon~1

Every library tab carries an icon: one for a BibTeX library, one for a BibLaTeX library, and one for a shared database. A shared database shows the database icon regardless of its mode.

Needs: impl, utest

Preferences walkthroughs must open preferences dialog directly

req~ux.walkthrough.preferences-direct~1

Walkthroughs that require preferences must open the preferences dialog directly, so they can start regardless of the platform menu presentation.

Needs: impl

Groups walkthrough must prepare example library and groups UI state

req~ux.walkthrough.groups-preparation~1

The groups walkthrough must open its bundled example library, display the Groups pane, and clear the current search before guiding the user.

Needs: impl

Donation prompt returns every six months

req~ux.donation.recurring-prompt~1

JabRef asks for a donation six months after the first launch and every six months afterwards. Dismissing the prompt hides it until the next time; “Dismiss forever” stops it for good.

Needs: impl

Library tab switches must preserve each library’s selected groups

req~ux.groups.library-switch-preserves-selection~1

Rationale: The user must be able to switch between libraries and still see the same groups selected (#1104).

Needs: impl, utest

Shared library group updates must preserve selected groups

req~ux.groups.shared-update-preserves-selection~1

When a shared library receives a group-tree update, groups that remain in the updated tree must remain selected.

Needs: impl, utest

Assigning an already used keyboard shortcut must require confirmation

req~ux.keybindings.duplicate-warning~1

When a user assigns a keyboard shortcut that is already used by other actions, JabRef warns the user, names these actions and lets the user cancel, keep both or replace the existing assignments (#17240).

Needs: impl, utest