Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rename the Review Tab into Comments Tab #3658

Merged
merged 28 commits into from
Feb 17, 2018
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
289c2d2
Rename the Review Tab into Comments Tab
LinusDietz Jan 22, 2018
351b1db
Remove Localization Key for Review
LinusDietz Jan 22, 2018
ac341e4
Merge branch 'master' into comment-tab
LinusDietz Feb 1, 2018
07a8965
Use Comment field in the Comment tab
LinusDietz Feb 14, 2018
6a75c6a
Migration for the Review field
LinusDietz Feb 14, 2018
af9022a
Merge remote-tracking branch 'origin/comment-tab' into comment-tab
LinusDietz Feb 14, 2018
afe5476
Remove Comment Field from General Tab
LinusDietz Feb 14, 2018
995b965
Tests
LinusDietz Feb 14, 2018
056ef9d
Simplify tests
LinusDietz Feb 14, 2018
9d9c5a6
Fix Codacy
LinusDietz Feb 14, 2018
4a6886e
Package refactoring, streamline naming
LinusDietz Feb 14, 2018
a5a2994
Also move tests
LinusDietz Feb 14, 2018
37a247c
Merge branch 'master' of https://github.com/JabRef/jabref into commen…
LinusDietz Feb 14, 2018
1e0d56e
Add Confirmation Dialog for Merging Fields
LinusDietz Feb 15, 2018
e949025
Localize Tests
LinusDietz Feb 15, 2018
c93b490
Fix tests
LinusDietz Feb 15, 2018
e405f67
Fix Codacy
LinusDietz Feb 15, 2018
6cca4ab
fixed issue 298
grotepfn Feb 15, 2018
b7ca150
updated Changes
grotepfn Feb 15, 2018
38750e8
Update CHANGELOG.md
grotepfn Feb 15, 2018
2d2bb7e
User decides now once for all migrations.
LinusDietz Feb 15, 2018
dfeda8d
fix localization
LinusDietz Feb 16, 2018
4828955
Merge pull request #3726 from grotepfn/patch-3
lenhard Feb 16, 2018
5962710
Remove 'no' button
LinusDietz Feb 16, 2018
4c1905d
Merge branch 'master' of https://github.com/JabRef/jabref into commen…
LinusDietz Feb 16, 2018
38e6139
Merge branch 'comment-tab' of https://github.com/JabRef/jabref into c…
LinusDietz Feb 16, 2018
b246cfe
Mark Database as changed after the LoadDatabaseMigration
LinusDietz Feb 16, 2018
303ed4d
Getters and Setters
LinusDietz Feb 16, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `#
## [Unreleased]

### Changed
- Changed order of items in context menu [#298] (https://github.com/koppor/jabref/issues/298)
- Changed ID-based entry generator to store the last used fetcher. [#2796] (https://github.com/JabRef/jabref/issues/2796)
- Reorganised annotation information on the right side of the "File annotations" tab. [#3109](https://github.com/JabRef/jabref/issues/3109)
- We now show a small notification icon in the entry editor when we detect data inconsistency or other problems. [#3145](https://github.com/JabRef/jabref/issues/3145)
Expand All @@ -23,6 +24,7 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `#
- We improved the export of the `address` and `location` field to the MS-Office XML fields. If the address field does not contain a comma, it is treated as single value and exported to the field `city`. [#1750, comment](https://github.com/JabRef/jabref/issues/1750#issuecomment-357539167)
For more details refer to the [field mapping help page](http://help.jabref.org/en/MsOfficeBibFieldMapping)
- We added Facebook and Twitter icons in the toolbar to link to our [Facebook](https://www.facebook.com/JabRef/) and [Twitter](https://twitter.com/jabref_org) pages.
- Renamed the _Review_ Tab into _Comments_ Tab
- We no longer print empty lines when exporting an entry in RIS format [#3634](https://github.com/JabRef/jabref/issues/3634)
- We improved file saving so that hard links are now preserved when a save is performed [#2633](https://github.com/JabRef/jabref/issues/2633)
- We changed the default dialog option when removing a [file link](http://help.jabref.org/en/FileLinks#adding-external-links-to-an-entry) from an entry.
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/org/jabref/JabRefGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import org.jabref.gui.BasePanel;
import org.jabref.gui.GUIGlobals;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.autosaveandbackup.BackupUIManager;
import org.jabref.gui.dialogs.BackupUIManager;
import org.jabref.gui.importer.ParserResultWarningDialog;
import org.jabref.gui.importer.actions.OpenDatabaseAction;
import org.jabref.gui.shared.SharedDatabaseUIManager;
Expand Down Expand Up @@ -301,5 +301,4 @@ public static JabRefFrame getMainFrame() {
public static void setMainFrame(JabRefFrame mainFrame) {
JabRefGUI.mainFrame = mainFrame;
}

}
2 changes: 1 addition & 1 deletion src/main/java/org/jabref/gui/JabRefFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,11 @@
import org.jabref.gui.actions.OpenBrowserAction;
import org.jabref.gui.actions.SearchForUpdateAction;
import org.jabref.gui.actions.SortTabsAction;
import org.jabref.gui.autosaveandbackup.AutosaveUIManager;
import org.jabref.gui.bibtexkeypattern.BibtexKeyPatternDialog;
import org.jabref.gui.copyfiles.CopyFilesAction;
import org.jabref.gui.customentrytypes.EntryCustomizationDialog;
import org.jabref.gui.dbproperties.DatabasePropertiesDialog;
import org.jabref.gui.dialogs.AutosaveUIManager;
import org.jabref.gui.documentviewer.ShowDocumentViewerAction;
import org.jabref.gui.exporter.ExportAction;
import org.jabref.gui.exporter.ExportCustomizationDialog;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/jabref/gui/PreviewPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@ private ContextMenu createPopupMenu() {
menu.getItems().add(copyPreview);
menu.getItems().add(printEntryPreview);
menu.getItems().add(new SeparatorMenuItem());
menu.getItems().add(previousPreviewLayout);
menu.getItems().add(nextPreviewLayout);
menu.getItems().add(previousPreviewLayout);
return menu;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.jabref.gui.autosaveandbackup;
package org.jabref.gui.dialogs;

import org.jabref.gui.BasePanel;
import org.jabref.gui.exporter.SaveDatabaseAction;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.jabref.gui.autosaveandbackup;
package org.jabref.gui.dialogs;

import java.nio.file.Path;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.jabref.gui.dialogs;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.swing.JOptionPane;

import org.jabref.logic.l10n.Localization;
import org.jabref.model.entry.BibEntry;

public class MergeReviewIntoCommentUIManager {

public boolean askUserForMerge(List<BibEntry> conflicts) {
List<String> bibKeys = conflicts.stream()
.map(BibEntry::getCiteKeyOptional)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());

int answer = JOptionPane.showConfirmDialog(
null,
String.join(",\n", bibKeys) + " " +
Localization.lang("has/have both a 'Comment' and a 'Review' field.") + "\n" +
Localization.lang("Since the 'Review' field was deprecated in JabRef 4.2, these two fields are about to be merged into the 'Comment' field.") + "\n" +
Localization.lang("By clicking 'Yes' the conflicting fields of these entries will be merged into the 'Comment' field."),
Localization.lang("Review Field Migration"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);

return 0 == answer;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import org.jabref.gui.DialogService;
import org.jabref.gui.FXDialogService;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.autosaveandbackup.AutosaveUIManager;
import org.jabref.gui.collab.ChangeScanner;
import org.jabref.gui.collab.FileUpdatePanel;
import org.jabref.gui.dialogs.AutosaveUIManager;
import org.jabref.gui.util.DefaultTaskExecutor;
import org.jabref.gui.util.FileDialogConfiguration;
import org.jabref.gui.worker.AbstractWorker;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import org.jabref.gui.IconTheme;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.actions.MnemonicAwareAction;
import org.jabref.gui.autosaveandbackup.BackupUIManager;
import org.jabref.gui.dialogs.BackupUIManager;
import org.jabref.gui.importer.ParserResultWarningDialog;
import org.jabref.gui.keyboard.KeyBinding;
import org.jabref.gui.shared.SharedDatabaseUIManager;
Expand Down
16 changes: 9 additions & 7 deletions src/main/java/org/jabref/logic/importer/OpenDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
import java.util.List;

import org.jabref.logic.importer.fileformat.BibtexImporter;
import org.jabref.logic.importer.util.ConvertLegacyExplicitGroups;
import org.jabref.logic.importer.util.PostOpenAction;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.specialfields.SpecialFieldsUtils;
import org.jabref.logic.util.io.FileBasedLock;
import org.jabref.migrations.ConvertLegacyExplicitGroups;
import org.jabref.migrations.MergeReviewIntoComment;
import org.jabref.migrations.PostOpenMigration;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.util.FileUpdateMonitor;

Expand Down Expand Up @@ -81,16 +82,17 @@ public static ParserResult loadDatabase(File fileToOpen, ImportFormatPreferences
LOGGER.debug("Synchronized special fields based on keywords");
}

applyPostActions(result);
performLoadDatabaseMigrations(result);

return result;
}

private static void applyPostActions(ParserResult parserResult) {
List<PostOpenAction> actions = Arrays.asList(new ConvertLegacyExplicitGroups());
private static void performLoadDatabaseMigrations(ParserResult parserResult) {

for (PostOpenAction action : actions) {
action.performAction(parserResult);
List<PostOpenMigration> postOpenMigrations = Arrays.asList(new ConvertLegacyExplicitGroups(), new MergeReviewIntoComment());

for (PostOpenMigration migration : postOpenMigrations) {
migration.performMigration(parserResult);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.jabref.logic.importer.util;
package org.jabref.migrations;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -13,10 +13,10 @@
* Converts legacy explicit groups, where the group contained a list of assigned entries, to the new format,
* where the entry stores a list of groups it belongs to.
*/
public class ConvertLegacyExplicitGroups implements PostOpenAction {
public class ConvertLegacyExplicitGroups implements PostOpenMigration {

@Override
public void performAction(ParserResult parserResult) {
public void performMigration(ParserResult parserResult) {
Objects.requireNonNull(parserResult);
if (!parserResult.getMetaData().getGroups().isPresent()) {
return;
Expand Down
69 changes: 69 additions & 0 deletions src/main/java/org/jabref/migrations/MergeReviewIntoComment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.jabref.migrations;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import javafx.collections.ObservableList;

import org.jabref.gui.dialogs.MergeReviewIntoCommentUIManager;
import org.jabref.logic.importer.ParserResult;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.FieldName;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MergeReviewIntoComment implements PostOpenMigration {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think most of this code should move to the logic package.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I told him to move it there, because I want to have the migrations together. The migrations package should probably go into logic, but some of the migration classes are awefully coupled to UI classes.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, then the location is fine. But at least the new class should be completely decoupled in logic and gui since otherwise the migration of the migration package is getting harder with this PR.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tobiasdiez I guess you mean this line?

if (!conflicts.isEmpty() && new MergeReviewIntoCommentUIManager().askUserForMerge(conflicts)) {

I can create another Class for this confirmation, but where would you put that?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no deep knowledge about the migration code, so the following may be a bit naïve. For me, the expected flow is something like:

  • You have a general migration manager class (in gui), which is getting called as soon as the user opens a database
  • This manager has a list of possible migrations which are defined in logic and which provide two methods: one for determining if an action is needed and a second one to actually perform the action
  • The manager first calls actionNeeded and maybe asks the user for confirmation, then runs performAction on the migration action.

Not sure how much of this architecture is already in place and how much you are willing to refactor for this PR. My initial comment was triggered by the fact that a new class was created that mixed UI and logic.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I totally support your point, however this is all a bit tricky, as these PostOpenMigrations are all called before the main GUI is instatiated.

Suggestion: Lets merge this PR now, and I'll refactor the code in a sensible way in a followup PR. (I'm on the train tomorrow for at least 5 hours)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine with me!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The follow-up was done at #3733

public static final Logger LOGGER = LoggerFactory.getLogger(MergeReviewIntoComment.class);

@Override
public void performMigration(ParserResult parserResult) {
ObservableList<BibEntry> entries = Objects.requireNonNull(parserResult).getDatabase().getEntries();

// migrate non-conflicting entries first
entries.stream()
.filter(this::hasReviewField)
.filter(entry -> !this.hasCommentField(entry))
.forEach(this::migrate);

// determine conflicts
List<BibEntry> conflicts = entries.stream()
.filter(this::hasReviewField)
.filter(this::hasCommentField)
.collect(Collectors.toList());

// resolve conflicts if users agrees
if (!conflicts.isEmpty() && new MergeReviewIntoCommentUIManager().askUserForMerge(conflicts)) {
conflicts.stream()
.filter(this::hasReviewField)
.forEach(this::migrate);
}
}

private String mergeCommentFieldIfPresent(BibEntry entry, String review) {
if (entry.getField(FieldName.COMMENT).isPresent()) {
LOGGER.info(String.format("Both Comment and Review fields are present in %s! Merging them into the comment field.", entry.getAuthorTitleYear(150)));
return String.format("%s\n%s:\n%s", entry.getField(FieldName.COMMENT).get().trim(), Localization.lang("Review"), review.trim());
}
return review;
}

private boolean hasCommentField(BibEntry entry) {
return entry.getField(FieldName.COMMENT).isPresent();
}

private boolean hasReviewField(BibEntry entry) {
return entry.getField(FieldName.REVIEW).isPresent();
}

private void migrate(BibEntry entry) {
updateFields(entry, mergeCommentFieldIfPresent(entry, entry.getField(FieldName.REVIEW).get()));
}

private void updateFields(BibEntry entry, String review) {
entry.setField(FieldName.COMMENT, review);
entry.clearField(FieldName.REVIEW);
}
}
7 changes: 7 additions & 0 deletions src/main/java/org/jabref/migrations/PostOpenMigration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.jabref.migrations;

import org.jabref.logic.importer.ParserResult;

public interface PostOpenMigration {
void performMigration(ParserResult parserResult);
}
11 changes: 5 additions & 6 deletions src/main/java/org/jabref/model/entry/InternalBibtexFields.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@
* config files -> simple extension and definition of new fields
*
* TODO:
* - handling of identically fields with different names (https://github.com/JabRef/jabref/issues/521)
* e.g. LCCN = lib-congress, journaltitle = journal
* - group id for each fields, e.g. standard, jurabib, bio, ...
* - add a additional properties functionality into the BibtexSingleField class
* - handling of identically fields with different names (https://github.com/JabRef/jabref/issues/521)
* e.g. LCCN = lib-congress, journaltitle = journal
* - group id for each fields, e.g. standard, jurabib, bio, ...
* - add a additional properties functionality into the BibtexSingleField class
*/
public class InternalBibtexFields {

Expand All @@ -35,7 +35,7 @@ public class InternalBibtexFields {
*
* A user can change them. The change is currently stored in the preferences only and not explicitley exposed as separte preferences object
*/
public static final List<String> DEFAULT_GENERAL_FIELDS = Arrays.asList(FieldName.CROSSREF, FieldName.KEYWORDS, FieldName.FILE, FieldName.DOI, FieldName.URL, FieldName.GROUPS, FieldName.COMMENT, FieldName.OWNER, FieldName.TIMESTAMP);
public static final List<String> DEFAULT_GENERAL_FIELDS = Arrays.asList(FieldName.CROSSREF, FieldName.KEYWORDS, FieldName.FILE, FieldName.DOI, FieldName.URL, FieldName.GROUPS, FieldName.OWNER, FieldName.TIMESTAMP);

// Lists of fields with special properties
private static final List<String> INTEGER_FIELDS = Arrays.asList(FieldName.CTLMAX_NAMES_FORCED_ETAL,
Expand Down Expand Up @@ -382,7 +382,6 @@ public static void setNumericFields(List<String> numFields) {
field.setNumeric(true);
InternalBibtexFields.RUNTIME.fieldSet.put(fieldName, field);
}

}

public static Set<FieldProperty> getFieldProperties(String name) {
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/jabref/preferences/JabRefPreferences.java
Original file line number Diff line number Diff line change
Expand Up @@ -982,9 +982,9 @@ public void setLanguageDependentDefaultValues() {
defaults.put(CUSTOM_TAB_FIELDS + "_def1", FieldName.ABSTRACT);
defaults.put(CUSTOM_TAB_NAME + "_def1", Localization.lang("Abstract"));

// Entry editor tab 2: Review Field - used for research comments, etc.
defaults.put(CUSTOM_TAB_FIELDS + "_def2", FieldName.REVIEW);
defaults.put(CUSTOM_TAB_NAME + "_def2", Localization.lang("Review"));
// Entry editor tab 2: Comments Field - used for research comments, etc.
defaults.put(CUSTOM_TAB_FIELDS + "_def2", FieldName.COMMENT);
defaults.put(CUSTOM_TAB_NAME + "_def2", Localization.lang("Comments"));

defaults.put(EMAIL_SUBJECT, Localization.lang("References"));
}
Expand Down
8 changes: 5 additions & 3 deletions src/main/resources/l10n/JabRef_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ Broken\ link=Broken link
Browse=Browse

by=by
By\ clicking\ 'Yes'\ the\ conflicting\ fields\ of\ these\ entries\ will\ be\ merged\ into\ the\ 'Comment'\ field.=By clicking 'Yes' the conflicting fields of these entries will be merged into the 'Comment' field.

Cancel=Cancel

Expand Down Expand Up @@ -210,7 +211,7 @@ Color\ for\ marking\ incomplete\ entries=Color for marking incomplete entries
Column\ width=Column width

Command\ line\ id=Command line id

Comments=Comments

Contained\ in=Contained in

Expand Down Expand Up @@ -560,6 +561,7 @@ Get\ fulltext=Get fulltext
Gray\ out\ non-hits=Gray out non-hits

Groups=Groups
has/have\ both\ a\ 'Comment'\ and\ a\ 'Review'\ field.=has/have both a 'Comment' and a 'Review' field.

Have\ you\ chosen\ the\ correct\ package\ path?=Have you chosen the correct package path?

Expand Down Expand Up @@ -1004,10 +1006,9 @@ Resolve\ strings\ for\ all\ fields\ except=Resolve strings for all fields except
Resolve\ strings\ for\ standard\ BibTeX\ fields\ only=Resolve strings for standard BibTeX fields only

resolved=resolved

Review=Review

Review\ changes=Review changes
Review\ Field\ Migration=Review Field Migration

Right=Right

Expand Down Expand Up @@ -1100,6 +1101,7 @@ Show\ URL/DOI\ column=Show URL/DOI column
Show\ validation\ messages=Show validation messages

Simple\ HTML=Simple HTML
Since\ the\ 'Review'\ field\ was\ deprecated\ in\ JabRef\ 4.2,\ these\ two\ fields\ are\ about\ to\ be\ merged\ into\ the\ 'Comment'\ field.=Since the 'Review' field was deprecated in JabRef 4.2, these two fields are about to be merged into the 'Comment' field.

Size=Size

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.jabref.logic.importer.util;
package org.jabref.migrations;

import java.util.Collections;
import java.util.Optional;
Expand All @@ -17,7 +17,7 @@

public class ConvertLegacyExplicitGroupsTest {

private PostOpenAction action;
private PostOpenMigration action;
private BibEntry entry;
private ExplicitGroup group;

Expand All @@ -35,7 +35,7 @@ public void setUp() throws Exception {
public void performActionWritesGroupMembershipInEntry() throws Exception {
ParserResult parserResult = generateParserResult(GroupTreeNode.fromGroup(group));

action.performAction(parserResult);
action.performMigration(parserResult);

assertEquals(Optional.of("TestGroup"), entry.getField("groups"));
}
Expand All @@ -44,7 +44,7 @@ public void performActionWritesGroupMembershipInEntry() throws Exception {
public void performActionClearsLegacyKeys() throws Exception {
ParserResult parserResult = generateParserResult(GroupTreeNode.fromGroup(group));

action.performAction(parserResult);
action.performMigration(parserResult);

assertEquals(Collections.emptyList(), group.getLegacyEntryKeys());
}
Expand All @@ -56,7 +56,7 @@ public void performActionWritesGroupMembershipInEntryForComplexGroupTree() throw
root.addSubgroup(group);
ParserResult parserResult = generateParserResult(root);

action.performAction(parserResult);
action.performMigration(parserResult);

assertEquals(Optional.of("TestGroup"), entry.getField("groups"));
}
Expand Down
Loading