Group file operations in the entry context menu - #16829
Conversation
The main table context menu had no way to fetch a fulltext PDF, while four file-related entries took up top-level space. "Get fulltext" is now available directly, and the file entries moved into a "More file operations..." submenu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019mkXzbUjnC9crn8w8d9neF
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019mkXzbUjnC9crn8w8d9neF
PR Summary by QodoGroup file operations in the entry context menu
AI Description
Diagram
High-Level Assessment
Files changed (4)
|
Code Review by Qodo
1.
|
* upstream/main: Common CSS styles for spacing, padding, gaps and font-size (JabRef#16708) Group file operations in the entry context menu (JabRef#16829) add subset search (JabRef#16871) Speed up building (JabRef#16873) Enhance developer documentation (JabRef#16760) Fix BST entry preview formatting (JabRef#16853) Fix invalid regex handling in search (JabRef#16855) New Crowdin updates (JabRef#16867) # Conflicts: # jabgui/src/main/java/org/jabref/gui/collab/metedatachange/MetadataChangeDetailsView.java
* upstream/main: fix(bibtex): recover after unmatched braces (#16869) Common CSS styles for spacing, padding, gaps and font-size (#16708) Group file operations in the entry context menu (#16829) add subset search (#16871) Speed up building (#16873) Enhance developer documentation (#16760) Fix BST entry preview formatting (#16853)
* main: (66 commits) Fix undo C - One undomanager / journal per library and some cleanups (#16857) Fix status label update for reviews on fork PRs (#16883) Rework shared SQL database synchronization (PostgreSQL, live updates) (#11879) Gracefully handle JGit errors (#16882) Require SHA-pinned GitHub Actions in AGENTS.md (#16875) fix(ai): keep group chat window after library edits (#16879) Add auto-commit, push & pull features for Git (#16651) Pin issue only when the PR author is the assignee (#16872) Select newly added entry (#16845) Add infer style button (#16870) Show group changes in Git diff (#16868) Label CI/CD and build-system pull requests automatically (#16877) AsyncEmbeddingModel.java: Switch NotNull annotation to NonNull from jspecify. (#16880) fix(bibtex): recover after unmatched braces (#16869) Common CSS styles for spacing, padding, gaps and font-size (#16708) Group file operations in the entry context menu (#16829) add subset search (#16871) Speed up building (#16873) Enhance developer documentation (#16760) Fix BST entry preview formatting (#16853) ... # Conflicts: # docs/requirements/shared-database.md # jabgui/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java # jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseLoginDialogView.java # jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseLoginDialogViewModel.java # jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseUIManager.java # jabgui/src/main/resources/org/jabref/gui/shared/SharedDatabaseLoginDialog.fxml # jablib/src/main/java/org/jabref/logic/shared/DBMSConnectionProperties.java # jablib/src/main/java/org/jabref/logic/shared/DBMSConnectionPropertiesBuilder.java # jablib/src/main/java/org/jabref/logic/shared/prefs/SharedDatabasePreferences.java
…list origin/common-style (JabRef#16708), origin/fulltext-context-menu (JabRef#16829) and origin/fulltext-download-background-task (JabRef#16831) no longer exist upstream; last night's run warned about all three. Upstream has landed each of them itself: the StyleClasses migration, the GroupChangeDetailsView extraction and the background full text search (req~fetchers.fulltext-background-search~1) all arrived via origin/main, so experimental keeps the work without the branches. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KEfEAwaU63aKf2XzAKa7p8
Summary
🤖 The entry context menu offered no way to fetch a fulltext PDF, while four file-related commands occupied top-level space. "Get fulltext" is now reachable directly from the context menu, and "Attach file", "Attach file from URL", "Open folder(s)" and "Open file" moved into a "More file operations..." submenu.
Analogies: like honey the change is a thin sweet layer over what was already there, like chocolate it is best in a neatly wrapped bar instead of loose pieces, and like the moon it only rearranges what light already exists rather than making any of its own.
jabref-contrib-policy:4.2:reviewed:okSteps to test
Related issues and pull requests
Closes NA
AI usage
Claude Code (model claude-opus-5), AIL5.
AI CHECKLIST.md walkthrough
1. Code self-review
Nullability and control flow
== null/!= nullchecks — JSpecify annotations (@NullMarked,@Nullable,@NonNull) used instead.Objects.requireNonNull(...)— nullability expressed via JSpecify annotations.@NullMarked(org.jspecify.annotations.NullMarked).Optionalconsumed withifPresent/ifPresentOrElse/map/orElseThrow— neverorElse(unusedValue)nor anisPresent()+get()block.StringUtil.isBlank(...)used instead ofs == null || s.isBlank().Not applicable: the change only moves existing menu-item construction into a submenu factory method.
Exceptions
catch (Exception e)— only specific exceptions are caught.throw new RuntimeException(...)/IllegalStateException(...)— these tear down the whole application.LOGGER.info("...", e)), not concatenated into the message string.Not applicable: no exception handling touched.
Style and idioms
BibEntryobjects built with withers (withField, notsetField).List.of()/Map.of()/Set.of(),Path.of(),SequencedCollection/SequencedSet, text blocks.Pattern.compile(...)constant, notString.matches(...).org.jabref.logic.util.BackgroundTask, notnew Thread().///) uses Markdown syntax, not JavaDoc inline tags:`code`instead of{@code},[ClassName]instead of{@link}.User-facing text
Localization.langin Java,%prefix in FXML).!; labels do not end with:."...: %0"), not string concatenation.Security
text/htmlresponse — including exception/error messages, not just the success body (XSS).Tests
org.jabref.model/org.jabref.logichave added or updated tests.assertEquals), use plain JUnit asserts (not AssertJ), have no@DisplayName, do not catch exceptions (let them propagate so JUnit reports setup/teardown failures directly), and use@TempDirinstead of manual temp directories.Not applicable: GUI-only menu composition, verified manually.
2. Verification commands
./gradlew :jablib:check(or./gradlew checkfor all modules)../gradlew checkstyleMain checkstyleTest checkstyleJmh../gradlew modernizer../gradlew --no-configuration-cache :rewriteDryRunreports no changes (run./gradlew rewriteRunto fix)../gradlew javadoc.npx markdownlint-cli2 "docs/**/*.md" "*.md"(only if Markdown changed).rewriteRun:docker run -v $(pwd):/github/workspace ghcr.io/leventebajczi/intellij-format:master "*.java" "" ".idea/codeStyles/Project.xml".3. Documentation
CHANGELOG.mdentry added if the change is visible to the user (end-user wording, no extra blank lines, sorted in next to existing entries about the same component/feature). Link the issue if one exists; link the PR only when no issue exists. UseTODOas the placeholder when neither is known yet — never a fake number. No entry for fixes to changes that were themselves introduced after the last release (feature only in## [Unreleased]) — update the existing unreleased entry instead if needed.TODO(nocloses/fixesfor merely-similar issues).docs/requirements/<area>.mdif the change is a new feature or significant bug fix (skip for refactors, minor fixes, and internal changes).docs/updated if behavior or architecture changed.4. Pull request
.github/PULL_REQUEST_TEMPLATE.md, every section filled.[x],[ ], or[/].gh pr create --body-file <file>(not--body).CHANGELOG.mdused aTODOplaceholder (no issue confidently identified yet — an existing issue link always stays), it was replaced with the real PR-number link after PR creation, then committed and pushed. If an issue is identified or created later, the link is switched to the issue.Checklist
CHANGELOG.mddescribing the change from the user's point of view (if the change is visible to the user)🤖 Generated with Claude Code
https://claude.ai/code/session_019mkXzbUjnC9crn8w8d9neF