diff --git a/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionView.java b/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionView.java index c7fe540cccf..59c9f6bebd8 100644 --- a/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionView.java +++ b/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionView.java @@ -70,6 +70,13 @@ public class ManageStudyDefinitionView extends BaseDialog @FXML private Label directoryWarning; + @FXML private Label validationHeaderLabel; + @FXML private Label titleValidationLabel; + @FXML private Label authorsValidationLabel; + @FXML private Label questionsValidationLabel; + @FXML private Label queriesValidationLabel; + @FXML private Label catalogsValidationLabel; + @Inject private DialogService dialogService; @Inject private GuiPreferences preferences; @@ -173,6 +180,7 @@ private void initialize() { initQuestionsTab(); initQueriesTab(); initCatalogsTab(); + initValidationBindings(); } private void updateDirectoryWarning(Path directory) { @@ -247,6 +255,34 @@ private void initCatalogsTab() { catalogTable.setItems(viewModel.getCatalogs()); } + private void initValidationBindings() { + // Header label + validationHeaderLabel.textProperty().bind(viewModel.validationHeaderMessageProperty()); + validationHeaderLabel.visibleProperty().bind(Bindings.isNotEmpty(viewModel.validationHeaderMessageProperty())); + validationHeaderLabel.managedProperty().bind(validationHeaderLabel.visibleProperty()); + + // Specific validation messages + titleValidationLabel.textProperty().bind(viewModel.titleValidationMessageProperty()); + titleValidationLabel.visibleProperty().bind(Bindings.isNotEmpty(viewModel.titleValidationMessageProperty())); + titleValidationLabel.managedProperty().bind(titleValidationLabel.visibleProperty()); + + authorsValidationLabel.textProperty().bind(viewModel.authorsValidationMessageProperty()); + authorsValidationLabel.visibleProperty().bind(Bindings.isNotEmpty(viewModel.authorsValidationMessageProperty())); + authorsValidationLabel.managedProperty().bind(authorsValidationLabel.visibleProperty()); + + questionsValidationLabel.textProperty().bind(viewModel.questionsValidationMessageProperty()); + questionsValidationLabel.visibleProperty().bind(Bindings.isNotEmpty(viewModel.questionsValidationMessageProperty())); + questionsValidationLabel.managedProperty().bind(questionsValidationLabel.visibleProperty()); + + queriesValidationLabel.textProperty().bind(viewModel.queriesValidationMessageProperty()); + queriesValidationLabel.visibleProperty().bind(Bindings.isNotEmpty(viewModel.queriesValidationMessageProperty())); + queriesValidationLabel.managedProperty().bind(queriesValidationLabel.visibleProperty()); + + catalogsValidationLabel.textProperty().bind(viewModel.catalogsValidationMessageProperty()); + catalogsValidationLabel.visibleProperty().bind(Bindings.isNotEmpty(viewModel.catalogsValidationMessageProperty())); + catalogsValidationLabel.managedProperty().bind(catalogsValidationLabel.visibleProperty()); + } + private void setupCommonPropertiesForTables(Node addControl, Runnable addAction, TableColumn contentColumn, diff --git a/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionViewModel.java b/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionViewModel.java index 6cde33f6926..bb70c2485e6 100644 --- a/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/slr/ManageStudyDefinitionViewModel.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.stream.Collectors; +import javafx.beans.binding.Bindings; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; @@ -64,6 +65,13 @@ public class ManageStudyDefinitionViewModel { private final WorkspacePreferences workspacePreferences; + private final StringProperty titleValidationMessage = new SimpleStringProperty(); + private final StringProperty authorsValidationMessage = new SimpleStringProperty(); + private final StringProperty questionsValidationMessage = new SimpleStringProperty(); + private final StringProperty queriesValidationMessage = new SimpleStringProperty(); + private final StringProperty catalogsValidationMessage = new SimpleStringProperty(); + private final StringProperty validationHeaderMessage = new SimpleStringProperty(); + /** * Constructor for a new study */ @@ -84,6 +92,8 @@ public ManageStudyDefinitionViewModel(ImportFormatPreferences importFormatPrefer .toList()); this.dialogService = dialogService; this.workspacePreferences = workspacePreferences; + + initializeValidationBindings(); } /** @@ -119,6 +129,47 @@ public ManageStudyDefinitionViewModel(@NonNull Study study, this.directory.set(studyDirectory.toString()); this.workspacePreferences = workspacePreferences; this.dialogService = dialogService; + + initializeValidationBindings(); + } + + private void initializeValidationBindings() { + titleValidationMessage.bind(Bindings.when(title.isEmpty()) + .then(Localization.lang("Study title is required")) + .otherwise("")); + + authorsValidationMessage.bind(Bindings.when(Bindings.isEmpty(authors)) + .then(Localization.lang("At least one author is required")) + .otherwise("")); + + questionsValidationMessage.bind(Bindings.when(Bindings.isEmpty(researchQuestions)) + .then(Localization.lang("At least one research question is required")) + .otherwise("")); + + queriesValidationMessage.bind(Bindings.when(Bindings.isEmpty(queries)) + .then(Localization.lang("At least one query is required")) + .otherwise("")); + + catalogsValidationMessage.bind(Bindings.when( + Bindings.createBooleanBinding(() -> + databases.stream().noneMatch(StudyCatalogItem::isEnabled), databases)) + .then(Localization.lang("At least one catalog must be selected")) + .otherwise("")); + + validationHeaderMessage.bind(Bindings.when( + Bindings.or( + Bindings.or( + Bindings.or( + Bindings.or(title.isEmpty(), Bindings.isEmpty(authors)), + Bindings.isEmpty(researchQuestions) + ), + Bindings.isEmpty(queries) + ), + Bindings.createBooleanBinding(() -> + databases.stream().noneMatch(StudyCatalogItem::isEnabled), databases) + )) + .then(Localization.lang("In order to proceed:")) + .otherwise("")); } public StringProperty getTitle() { @@ -241,4 +292,28 @@ public void updateSelectedCatalogs() { workspacePreferences.setSelectedSlrCatalogs(selectedCatalogsList); } + + public StringProperty validationHeaderMessageProperty() { + return validationHeaderMessage; + } + + public StringProperty titleValidationMessageProperty() { + return titleValidationMessage; + } + + public StringProperty authorsValidationMessageProperty() { + return authorsValidationMessage; + } + + public StringProperty questionsValidationMessageProperty() { + return questionsValidationMessage; + } + + public StringProperty queriesValidationMessageProperty() { + return queriesValidationMessage; + } + + public StringProperty catalogsValidationMessageProperty() { + return catalogsValidationMessage; + } } diff --git a/jabgui/src/main/resources/org/jabref/gui/slr/ManageStudyDefinition.fxml b/jabgui/src/main/resources/org/jabref/gui/slr/ManageStudyDefinition.fxml index e5ca0032d28..cd6f78283e1 100644 --- a/jabgui/src/main/resources/org/jabref/gui/slr/ManageStudyDefinition.fxml +++ b/jabgui/src/main/resources/org/jabref/gui/slr/ManageStudyDefinition.fxml @@ -270,8 +270,17 @@ -