Add tabs to Clean Up Entries dialog#13852
Conversation
- Removed trivial comments - Renamed PDF-related variables - Updated methods to return Optional - Used Optional property for FieldFormatterCleanups
- Removed trivial comments - Fixed CHANGELOG.md
e8093f7 to
14fde53
Compare
- Removed trivial comments - Improved Optional checks - Perform null check for other parameters
calixtus
left a comment
There was a problem hiding this comment.
First impression after skimming through your changes: looks good, right track. Just set your PR to rfr as soon as you think we should review it.
calixtus
left a comment
There was a problem hiding this comment.
Hi, thanks for your PR,
the code itself looks fine to me.
However, I think with the refactoring to the tabbed dialog, there is now a logical gap:
You use the strategy pattern to configure the preferences to use in the calling CleanupAction and the currently selected tab as part of the configuration, what action should be called: single / multi ... I dont think that this is a good and intuitive ui pattern.
We discussed this shortly on JabCon. We think the solution would be the following ():
- Dismiss returning configuration from the dialog, and pull the logic from the action into a viewmodel of the cleanupDialog.
- Move the ok/cleanup button in the ui inside each tab
- Leave a close/cancel button at the bottom of the dialog.
Hopefully this will relax the complexity of the code and wont mean too much refactoring.
(@koppor @Siedlerchr wdyt?)
| if (button.getButtonData() == ButtonBar.ButtonData.OK_DONE) { | ||
| Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); | ||
| CleanupPanel panel = (CleanupPanel) selectedTab.getContent(); | ||
| return panel.getCleanupPreferences(); |
There was a problem hiding this comment.
This is weird for this dialog.
Split Class org.jabref.gui.cleanup.CleanupPresetPanel split to [org.jabref.gui.cleanup.CleanupFileRelatedPanel, org.jabref.gui.cleanup.CleanupMultiFieldPanel]
|
Hi, thank you for the review! I understand that moving the cleanup logic into a ViewModel per tab will simplify the UI. Just to confirm, is the enum refactor okay? I will return a CleanupPreferences from the ViewModel containing the preferences from the currently selected tab, and in CleanupAction I will update the initial preferences by replacing the category with the preferences returned from the tab. I will also move the Apply button into each tab and leave a global Close button at the bottom. |
|
About View and ViewModel: Every piece of logic should go into the ViewModel. You have a button on each tab, calling a different function in the viewmodel. So there should be no need for the enum anymore. See https://devdocs.jabref.org/code-howtos/javafx.html#architecture-model---view---controller---viewmodel-mvcvm |
- Create new ViewModel, pull logic from Action and SingleAction into ViewModel - Move Apply button to each tab - Remove categories from ENUM and keep enums of all jobs in each respective tab to be used for cleanup
* Fix non record comments by carl # Conflicts: # jabgui/src/main/java/org/jabref/gui/edit/automaticfiededitor/MoveFieldValueAction.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/cell/sidebuttons/ToggleMergeUnmergeButton.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/CommentMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/FieldMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/FileMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/GroupMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/KeywordMerger.java # jablib/src/main/java/org/jabref/logic/layout/format/HTMLChars.java # jablib/src/main/java/org/jabref/model/entry/identifier/ArXivIdentifier.java # jablib/src/main/java/org/jabref/model/entry/identifier/EprintIdentifier.java * Add file exceptions * Remove shebang line * Remove shebang line * Remove shebang line * Expand variables & rename class --------- Co-authored-by: Oliver Kopp <kopp.dev@gmail.com>
|
Hi, this PR is ready for review :) |
|
We will look into it asap, but it could take a few days, as we are currently all very busy with our day jobs. Please excuse our tight schedule. |
|
I think RefactoringMiner is needed for review. Reason: Need to check which code is new and which code was just moved. |
koppor
left a comment
There was a problem hiding this comment.
Two micro comment; one minor comment, then it should be good to go.
| if (tabSupplier != null) { | ||
| tabSupplier.get().markBaseChanged(); | ||
| } |
There was a problem hiding this comment.
Hi, just to clarify: the tabSupplier != null check was added for the single-action case, where tabSupplier is null. I also added the modifiedEntriesCount > 0 condition to ensure that the base is only marked as changed when an entry is actually modified.
There was a problem hiding this comment.
There is a code commetn for that, right?
There was a problem hiding this comment.
Hi no, not yet I will add a comment ASAP!
- Remove redundant comments following self-explanatory code - Add modifiedEntriesCount > 0 condition - Use "entry(s)" localization form for clean up message
koppor
left a comment
There was a problem hiding this comment.
OK, let's get this in. In case there are issues, we can fix later 😅
* Add cleanup dialog tabs with individual tab preferences * Fixed indentation and added commenting * Fix Trag-bot review issues - Removed trivial comments - Renamed PDF-related variables - Updated methods to return Optional - Used Optional property for FieldFormatterCleanups * Fix Trag-bot review issues - Removed trivial comments - Fixed CHANGELOG.md * Fix Trag-bot review issues - Removed trivial comments - Improved Optional checks - Perform null check for other parameters * Avoid nested Optionals, returning Optional<CleanupPreferences> directly * Refactor CleanupPreferences by keeping one assertion per test * Converted tests to assertEquals * Maintain consistent naming conventions * Returns CleanupPreferences directly since value is always present * Initial review refactor draft - Create new ViewModel, pull logic from Action and SingleAction into ViewModel - Move Apply button to each tab - Remove categories from ENUM and keep enums of all jobs in each respective tab to be used for cleanup * fix import error! * Reformat codebase (more carefully) (JabRef#13885) * Fix non record comments by carl # Conflicts: # jabgui/src/main/java/org/jabref/gui/edit/automaticfiededitor/MoveFieldValueAction.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/cell/sidebuttons/ToggleMergeUnmergeButton.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/CommentMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/FieldMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/FileMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/GroupMerger.java # jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/fieldsmerger/KeywordMerger.java # jablib/src/main/java/org/jabref/logic/layout/format/HTMLChars.java # jablib/src/main/java/org/jabref/model/entry/identifier/ArXivIdentifier.java # jablib/src/main/java/org/jabref/model/entry/identifier/EprintIdentifier.java * Add file exceptions * Remove shebang line * Remove shebang line * Remove shebang line * Expand variables & rename class --------- Co-authored-by: Oliver Kopp <kopp.dev@gmail.com> * fix import error & merge * Apply OpenRewrite Cleanup * Refactor Cleanup Tabs - Moved cleanup panel logic into CleanupDialogViewModel for better separation of UI and logic - Changed tabSupplier and taskExecutor from Optional to nullable parameters - Moved updateWith logic into the record for cleaner preference updates. - General design improvements: more maintainable. * Fix getDisplayName method * Fix formatting * Trag-bot review and fix en properties * fix indentation plssss * format properly and change to observablelist * fix formatting entriestoprocess (please) * Updated names and changed optional dependencies back to nullable * Refactored panels to use separate ViewModels - Introduced ViewModels to encapsulate state and logic for panels. - Replaced direct UI manipulation with bidirectional bindings. - Ensures cleaner UI logic, easier maintenance * Moved ALL_JOBS to respective ViewModels, small naming changes * Replaced requireNotNull to @NotNull following JabRef#13957 * Address review feedback in CleanupDialogViewModel - Remove redundant comments following self-explanatory code - Add modifiedEntriesCount > 0 condition - Use "entry(s)" localization form for clean up message --------- Co-authored-by: Subhramit Basu <subhramit.bb@live.in> Co-authored-by: Oliver Kopp <kopp.dev@gmail.com> Co-authored-by: Christoph <siedlerkiller@gmail.com>
We now have an apply button Follow up to #13852 Fixes JabRef/jabref-issue-melting-pot#1144
* Remove checkbox for Enable field formatters We now have an apply button Follow up to #13852 Fixes JabRef/jabref-issue-melting-pot#1144 * fix l10n
* Remove checkbox for Enable field formatters We now have an apply button Follow up to JabRef#13852 Fixes https://github.com/JabRef/jabref-issue-melting-pot/issues/1144 * fix l10n
Split Class org.jabref.gui.cleanup.CleanupPresetPanel split to [org.jabref.gui.cleanup.CleanupFileRelatedPanel, org.jabref.gui.cleanup.CleanupMultiFieldPanel]
JabRef/jabref#13852 jabgui/src/main/java/org/jabref/gui/cleanup/CleanupAction.java => jabgui/src/main/java/org/jabref/gui/cleanup/CleanupDialogViewModel.java
JabRef/jabref#13852 jabgui/src/main/java/org/jabref/gui/cleanup/CleanupSingleAction.java => jabgui/src/main/java/org/jabref/gui/cleanup/CleanupDialogViewModel.java

Closes #13819
This PR adds three tabs to the "Clean up entries" dialog: Single-field, File-related, and Multi-field, representing different types of formatters.
Pressing Apply applies the selected actions of the currently active tab, and Close closes the dialog.
Steps to test
Mandatory checks
CHANGELOG.mdin a way that is understandable for the average user (if change is visible to the user)