From 96fd1dfdaf10f03ce1fd0628ed9937ced13e504e Mon Sep 17 00:00:00 2001 From: georgweiss Date: Thu, 8 May 2025 07:34:15 +0200 Subject: [PATCH 1/3] Log entry editor to use service provider level values --- .../phoebus/olog/es/api/OlogHttpClient.java | 19 +++++++++++++++++++ .../ui/write/LogEntryEditorController.java | 18 +++++++++++------- .../main/java/org/phoebus/logbook/Level.java | 15 +++++++++++++++ .../java/org/phoebus/logbook/LogClient.java | 5 +++++ 4 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 core/logbook/src/main/java/org/phoebus/logbook/Level.java diff --git a/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java b/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java index 93c3ac1d8f..6d1d902b40 100644 --- a/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java +++ b/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java @@ -49,6 +49,7 @@ import java.util.List; import java.util.Map; import java.util.ServiceLoader; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -548,4 +549,22 @@ public LogTemplate saveTemplate(LogTemplate template) throws LogbookException { throw new LogbookException(e); } } + + @Override + public Collection getLevels(){ + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(Preferences.olog_url + "/levels")) + .GET() + .build(); + + try { + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + return OlogObjectMappers.logEntryDeserializer.readValue( + response.body(), new TypeReference>() { + }); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unable to get templates from service", e); + return Collections.emptySet(); + } + } } diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java index 7cfc30b8ad..9dc743ac99 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java @@ -341,16 +341,9 @@ public void initialize() { } levelLabel.setText(LogbookUIPreferences.level_field_name); - // Sites may wish to define a different meaning and name for the "level" field. - String[] levelList = org.phoebus.olog.es.api.Preferences.levels; - availableLevels.addAll(Arrays.asList(levelList)); levelSelector.setItems(availableLevels); - selectedLevelProperty.set(logEntry.getLevel() != null ? logEntry.getLevel() : availableLevels.get(0)); - - levelSelector.getSelectionModel().select(selectedLevelProperty.get()); dateField.setText(TimestampFormats.DATE_FORMAT.format(Instant.now())); - titleField.textProperty().bindBidirectional(titleProperty); titleProperty.addListener((changeListener, oldVal, newVal) -> { @@ -830,6 +823,17 @@ private void getServerSideStaticData() { } templatesProperty.setAll(logClient.getTemplates().stream().toList()); + + Collection levels = logClient.getLevels(); + availableLevels.setAll(levels.stream().map(org.phoebus.logbook.Level::name).sorted().toList()); + Optional optionalLevel = levels.stream().filter(org.phoebus.logbook.Level::defaultLevel).findFirst(); + String defaultLevel = null; + if(optionalLevel.isPresent()){ + // One level value should be the default level + defaultLevel = optionalLevel.get().name(); + } + selectedLevelProperty.set(logEntry.getLevel() != null ? logEntry.getLevel() : defaultLevel); + levelSelector.getSelectionModel().select(selectedLevelProperty.get()); }); } diff --git a/core/logbook/src/main/java/org/phoebus/logbook/Level.java b/core/logbook/src/main/java/org/phoebus/logbook/Level.java new file mode 100644 index 0000000000..a50a62a944 --- /dev/null +++ b/core/logbook/src/main/java/org/phoebus/logbook/Level.java @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2025 European Spallation Source ERIC. + */ + +package org.phoebus.logbook; + +/** + * Encapsulates "level" data managed on the server side. + * @param name The name, presented in UI and contained on a log entry + * @param defaultLevel Indicates if the instantiated object is the + * default level. Server will ensure only one single + * level is maintained as the default level. + */ +public record Level(String name, boolean defaultLevel) { +} diff --git a/core/logbook/src/main/java/org/phoebus/logbook/LogClient.java b/core/logbook/src/main/java/org/phoebus/logbook/LogClient.java index 1fb91d8be3..6fdc813cc5 100644 --- a/core/logbook/src/main/java/org/phoebus/logbook/LogClient.java +++ b/core/logbook/src/main/java/org/phoebus/logbook/LogClient.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; /** * @author Eric Berryman taken from shroffk @@ -529,4 +530,8 @@ default Collection getTemplates(){ default LogTemplate saveTemplate(LogTemplate logTemplate) throws LogbookException{ return null; } + + default Collection getLevels(){ + return Collections.emptySet(); + } } From b5c248dfc462b8c5abeff3c9414eba0207149346 Mon Sep 17 00:00:00 2001 From: georgweiss Date: Fri, 9 May 2025 11:13:21 +0200 Subject: [PATCH 2/3] Update advanced search to use server side levels data --- .../phoebus/olog/es/api/OlogHttpClient.java | 5 +- .../olog/ui/AdvancedSearchViewController.java | 218 +++++++++++++----- .../olog/ui/LogEntryTableViewController.java | 4 +- .../logbook/olog/ui/SearchParameters.java | 14 +- .../ui/write/LogEntryEditorController.java | 9 +- .../log_olog_ui_preferences.properties | 2 +- .../logbook/olog/ui/AdvancedSearchView.fxml | 15 +- .../resources/log_ui_preferences.properties | 2 +- .../java/org/phoebus/logbook/LogClient.java | 6 +- .../{Level.java => LogEntryLevel.java} | 2 +- 10 files changed, 203 insertions(+), 74 deletions(-) rename core/logbook/src/main/java/org/phoebus/logbook/{Level.java => LogEntryLevel.java} (87%) diff --git a/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java b/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java index 6d1d902b40..fa16af7e64 100644 --- a/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java +++ b/app/logbook/olog/client-es/src/main/java/org/phoebus/olog/es/api/OlogHttpClient.java @@ -13,6 +13,7 @@ import org.phoebus.logbook.LogClient; import org.phoebus.logbook.LogEntry; import org.phoebus.logbook.LogEntryChangeHandler; +import org.phoebus.logbook.LogEntryLevel; import org.phoebus.logbook.LogTemplate; import org.phoebus.logbook.Logbook; import org.phoebus.logbook.LogbookException; @@ -551,7 +552,7 @@ public LogTemplate saveTemplate(LogTemplate template) throws LogbookException { } @Override - public Collection getLevels(){ + public Collection getLogEntryLevels(){ HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(Preferences.olog_url + "/levels")) .GET() @@ -560,7 +561,7 @@ public Collection getLevels(){ try { HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); return OlogObjectMappers.logEntryDeserializer.readValue( - response.body(), new TypeReference>() { + response.body(), new TypeReference>() { }); } catch (Exception e) { LOGGER.log(Level.WARNING, "Unable to get templates from service", e); diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/AdvancedSearchViewController.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/AdvancedSearchViewController.java index 3a7e06bb95..2fbe70729f 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/AdvancedSearchViewController.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/AdvancedSearchViewController.java @@ -20,33 +20,43 @@ import javafx.application.Platform; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.geometry.Pos; +import javafx.geometry.Side; import javafx.scene.control.Button; -import javafx.scene.control.ComboBox; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.CustomMenuItem; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.TextField; +import javafx.scene.control.ToggleButton; +import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; +import org.phoebus.logbook.LogEntryLevel; import org.phoebus.logbook.LogClient; import org.phoebus.logbook.Logbook; import org.phoebus.logbook.Tag; -import org.phoebus.olog.es.api.Preferences; import org.phoebus.ui.dialog.ListSelectionPopOver; import org.phoebus.ui.dialog.PopOver; +import org.phoebus.ui.javafx.ImageCache; import org.phoebus.ui.time.TimeRelativeIntervalPane; import org.phoebus.util.text.Strings; import org.phoebus.util.time.TimeParser; import org.phoebus.util.time.TimeRelativeInterval; import org.phoebus.util.time.TimestampFormats; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -84,31 +94,48 @@ public class AdvancedSearchViewController { TextField searchLogbooks; ListSelectionPopOver logbookSearchPopover; - @FXML - ComboBox levelSelector; - @FXML TextField searchTags; ListSelectionPopOver tagSearchPopover; private final LogClient logClient; + @SuppressWarnings("unused") @FXML private AnchorPane advancedSearchPane; + @SuppressWarnings("unused") @FXML private RadioButton sortDescRadioButton; + @SuppressWarnings("unused") @FXML private RadioButton sortAscRadioButton; + @SuppressWarnings("unused") @FXML private TextField attachmentTypes; + @SuppressWarnings("unused") + @FXML + private TextField selectedLevelsField; + + @SuppressWarnings("unused") + @FXML + private ToggleButton levelsToggleButton; + + @SuppressWarnings("unused") + @FXML + private GridPane gridPane; + + private final ContextMenu levelsContextMenu = new ContextMenu(); + private final SearchParameters searchParameters; private final SimpleBooleanProperty sortAscending = new SimpleBooleanProperty(false); - private final SimpleBooleanProperty requireAttachments = new SimpleBooleanProperty(false); + private final ObservableList levelSelections = FXCollections.observableArrayList(); + private final SimpleStringProperty selectedLevelsString = new SimpleStringProperty(); + private final List levelsList = new ArrayList<>(); private Runnable searchCallback = () -> { throw new IllegalStateException("Search callback is not set on AdvancedSearchViewController!"); @@ -133,8 +160,18 @@ public void initialize() { searchText.setOnKeyReleased(this::searchOnEnter); searchAuthor.textProperty().bindBidirectional(this.searchParameters.authorProperty()); searchAuthor.setOnKeyReleased(this::searchOnEnter); - levelSelector.valueProperty().bindBidirectional(this.searchParameters.levelProperty()); - levelSelector.setOnAction(e -> searchCallback.run()); + selectedLevelsField.textProperty().bind(selectedLevelsString); + levelsToggleButton.setGraphic(new ImageView(ImageCache.getImage(AdvancedSearchViewController.class, "/icons/down_triangle.png"))); + levelsToggleButton.focusedProperty().addListener((changeListener, oldVal, newVal) -> + { + if (!newVal && !levelsContextMenu.isShowing()) + levelsToggleButton.setSelected(false); + }); + + selectedLevelsString.addListener((obs, o, n) -> { + this.searchParameters.levelsProperty().setValue(selectedLevelsString.get()); + searchCallback.run(); + }); searchTags.textProperty().bindBidirectional(this.searchParameters.tagsProperty()); searchParameters.tagsProperty().addListener(searchOnTextChange); searchLogbooks.textProperty().bindBidirectional(this.searchParameters.logbooksProperty()); @@ -170,24 +207,22 @@ public void initialize() { Button apply = new Button(); apply.setText(Messages.Apply); apply.setPrefWidth(80); - apply.setOnAction((event) -> { - Platform.runLater(() -> { - TimeRelativeInterval interval = timeSelectionPane.getInterval(); - if (interval.isStartAbsolute()) { - searchParameters.startTimeProperty().setValue(TimestampFormats.MILLI_FORMAT.format(interval.getAbsoluteStart().get())); - } else { - searchParameters.startTimeProperty().setValue(TimeParser.format(interval.getRelativeStart().get())); - } - if (interval.isEndAbsolute()) { - searchParameters.endTimeProperty().setValue(TimestampFormats.MILLI_FORMAT.format(interval.getAbsoluteEnd().get())); - } else { - searchParameters.endTimeProperty().setValue(TimeParser.format(interval.getRelativeEnd().get())); - } - if (timeSearchPopover.isShowing()) - timeSearchPopover.hide(); - searchCallback.run(); - }); - }); + apply.setOnAction((event) -> Platform.runLater(() -> { + TimeRelativeInterval interval = timeSelectionPane.getInterval(); + if (interval.isStartAbsolute()) { + searchParameters.startTimeProperty().setValue(TimestampFormats.MILLI_FORMAT.format(interval.getAbsoluteStart().get())); + } else { + searchParameters.startTimeProperty().setValue(TimeParser.format(interval.getRelativeStart().get())); + } + if (interval.isEndAbsolute()) { + searchParameters.endTimeProperty().setValue(TimestampFormats.MILLI_FORMAT.format(interval.getAbsoluteEnd().get())); + } else { + searchParameters.endTimeProperty().setValue(TimeParser.format(interval.getRelativeEnd().get())); + } + if (timeSearchPopover.isShowing()) + timeSearchPopover.hide(); + searchCallback.run(); + })); Button cancel = new Button(); cancel.setText("Cancel"); cancel.setPrefWidth(80); @@ -283,9 +318,19 @@ public void initialize() { } }); - List levelList = Arrays.stream(Preferences.levels).toList(); - levelSelector.getItems().add(""); - levelSelector.getItems().addAll(levelList); + levelsList.addAll(logClient.getLogEntryLevels().stream().map(LogEntryLevel::name).sorted().toList()); + levelsList.forEach(level -> { + LevelSelection levelSelection = new LevelSelection(level, false); + levelSelections.add(levelSelection); + CheckBox checkBox = new CheckBox(level); + LevelSelectionMenuItem levelSelectionMenuItem = new LevelSelectionMenuItem(checkBox); + levelSelectionMenuItem.setHideOnClick(false); + checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> { + levelSelection.selected = newValue; + setSelectedLevelsString(); + }); + levelsContextMenu.getItems().add(levelSelectionMenuItem); + }); sortAscending.addListener((observable, oldValue, newValue) -> { sortDescRadioButton.selectedProperty().set(!newValue); @@ -295,6 +340,11 @@ public void initialize() { sortDescRadioButton.setOnAction(ae -> sortAscending.set(false)); sortAscRadioButton.setOnAction(ae -> sortAscending.set(true)); + + gridPane.setOnMouseClicked(e -> levelsToggleButton.setSelected(false)); + + // Make sure controls are updated based on search string entered by user + updateControls(searchParameters.getValue()); } public AnchorPane getPane() { @@ -308,23 +358,30 @@ public AnchorPane getPane() { */ private void updateControls(String queryString) { Map queryStringParameters = LogbookQueryUtil.parseHumanReadableQueryString(queryString); - queryStringParameters.entrySet().stream().forEach(entry -> { + queryStringParameters.entrySet().forEach(entry -> { Keys keys = Keys.findKey(entry.getKey()); if (keys != null) { if (keys.equals(Keys.LEVEL)) { - List levels = Arrays.stream(Preferences.levels).toList(); - if (levels.contains(entry.getValue())) { - searchParameters.levelProperty().setValue(entry.getValue()); + List validatedLevels = getValidatedLevelsSelection(entry.getValue()); + if (validatedLevels.isEmpty()) { + searchParameters.levelsProperty().setValue(null); } else { - searchParameters.levelProperty().setValue(null); + String selectedLevels = + String.join(",", validatedLevels); + searchParameters.levelsProperty().setValue(selectedLevels); } + levelsContextMenu.getItems().forEach(mi -> { + LevelSelectionMenuItem levelSelectionMenuItem = + (LevelSelectionMenuItem) mi; + levelSelectionMenuItem.setSelected(validatedLevels.contains(levelSelectionMenuItem.getCheckBox().getText())); + }); } else if (keys.equals(Keys.LOGBOOKS)) { List validatedLogbookNames = getValidatedLogbooksSelection(entry.getValue()); if (validatedLogbookNames.isEmpty()) { searchParameters.logbooksProperty().setValue(null); } else { String selectedLogbooks = - validatedLogbookNames.stream().collect(Collectors.joining(",")); + String.join(",", validatedLogbookNames); searchParameters.logbooksProperty().setValue(selectedLogbooks); } logbookSearchPopover.setSelected(validatedLogbookNames); @@ -333,7 +390,7 @@ private void updateControls(String queryString) { if (validatedTagsNames.isEmpty()) { searchParameters.tagsProperty().setValue(null); } else { - String selectedTags = validatedTagsNames.stream().collect(Collectors.joining(",")); + String selectedTags = String.join(",", validatedTagsNames); searchParameters.tagsProperty().setValue(selectedTags); } tagSearchPopover.setSelected(validatedTagsNames); @@ -347,12 +404,10 @@ protected List getValidatedLogbooksSelection(String logbooks) { return Collections.emptyList(); } List validLogbookNames = - logClient.listLogbooks().stream().map(Logbook::getName).sorted().collect(Collectors.toList()); + logClient.listLogbooks().stream().map(Logbook::getName).sorted().toList(); List logbooksFromQueryString = - Arrays.stream(logbooks.split(",")).map(s -> s.trim()).collect(Collectors.toList()); - List validatedLogbookNames = - logbooksFromQueryString.stream().filter(logbookName -> validLogbookNames.contains(logbookName)).collect(Collectors.toList()); - return validatedLogbookNames; + Arrays.stream(logbooks.split(",")).map(String::trim).toList(); + return logbooksFromQueryString.stream().filter(validLogbookNames::contains).collect(Collectors.toList()); } protected List getValidatedTagsSelection(String tags) { @@ -360,12 +415,19 @@ protected List getValidatedTagsSelection(String tags) { return Collections.emptyList(); } List validTagsNames = - logClient.listTags().stream().map(Tag::getName).sorted().collect(Collectors.toList()); + logClient.listTags().stream().map(Tag::getName).sorted().toList(); List logbooksFromQueryString = - Arrays.stream(tags.split(",")).map(s -> s.trim()).collect(Collectors.toList()); - List validatedLogbookNames = - logbooksFromQueryString.stream().filter(logbookName -> validTagsNames.contains(logbookName)).collect(Collectors.toList()); - return validatedLogbookNames; + Arrays.stream(tags.split(",")).map(String::trim).toList(); + return logbooksFromQueryString.stream().filter(validTagsNames::contains).collect(Collectors.toList()); + } + + protected List getValidatedLevelsSelection(String levels) { + if (Strings.isNullOrEmpty(levels)) { + return Collections.emptyList(); + } + List levelsFromQueryString = + Arrays.stream(levels.split(",")).map(String::trim).toList(); + return levelsFromQueryString.stream().filter(levelsList::contains).collect(Collectors.toList()); } public SimpleBooleanProperty getSortAscending() { @@ -378,12 +440,64 @@ private void searchOnEnter(KeyEvent e) { } } - private final ChangeListener searchOnTextChange = (options, oldValue, newValue) -> { - searchCallback.run(); - }; + private final ChangeListener searchOnTextChange = (options, oldValue, newValue) -> searchCallback.run(); - private final ChangeListener searchOnSortChange = (options, oldValue, newValue) -> { - searchCallback.run(); - }; + private final ChangeListener searchOnSortChange = (options, oldValue, newValue) -> searchCallback.run(); + + private void setSelectedLevelsString() { + selectedLevelsString.set(levelSelections.stream().filter(LevelSelection::isSelected) + .map(LevelSelection::getName).collect(Collectors.joining(","))); + } + + @SuppressWarnings("unused") + @FXML + public void selectLevels() { + if (levelsToggleButton.isSelected()) { + levelsContextMenu.show(selectedLevelsField, Side.BOTTOM, 0, 0); + } else { + levelsContextMenu.hide(); + } + } + + /** + * Encapsulates data needed to construct the level selection context menu. + */ + private static class LevelSelection { + private final String name; + private boolean selected; + + public LevelSelection(String name, boolean selected) { + this.name = name; + this.selected = selected; + } + + public String getName() { + return name; + } + + public boolean isSelected() { + return selected; + } + } + + /** + * Encapsulates items needed to maintain the level selection context menu. + */ + private static class LevelSelectionMenuItem extends CustomMenuItem { + private final CheckBox checkBox; + + public LevelSelectionMenuItem(CheckBox checkBox) { + super(checkBox); + this.checkBox = checkBox; + } + + public void setSelected(boolean selected) { + checkBox.setSelected(selected); + } + + public CheckBox getCheckBox() { + return checkBox; + } + } } diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTableViewController.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTableViewController.java index 9da1d0bcf5..f1fad641dd 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTableViewController.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTableViewController.java @@ -165,7 +165,9 @@ public void initialize() { configureComboBox(); ologQueries.setAll(ologQueryManager.getQueries()); - searchParameters.addListener((observable, oldValue, newValue) -> query.getEditor().setText(newValue)); + searchParameters.addListener((observable, oldValue, newValue) -> { + query.getEditor().setText(newValue); + }); tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/SearchParameters.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/SearchParameters.java index f50ba2e095..49ca603d69 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/SearchParameters.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/SearchParameters.java @@ -43,7 +43,7 @@ public class SearchParameters implements ObservableValue { private SimpleStringProperty title = new SimpleStringProperty(); private SimpleStringProperty text = new SimpleStringProperty(); private SimpleStringProperty author = new SimpleStringProperty(); - private SimpleStringProperty level = new SimpleStringProperty(); + private SimpleStringProperty levels = new SimpleStringProperty(); private SimpleStringProperty tags = new SimpleStringProperty(); private SimpleStringProperty logbooks = new SimpleStringProperty(); private SimpleStringProperty startTime = new SimpleStringProperty(); @@ -74,7 +74,7 @@ public SearchParameters() { updateMap(Keys.OWNER, newValue); notifyListeners(); }); - level.addListener((observable, oldValue, newValue) -> { + levels.addListener((observable, oldValue, newValue) -> { updateMap(Keys.LEVEL, newValue); notifyListeners(); }); @@ -106,7 +106,7 @@ private void updateMap(Keys key, String newValue) { } else { searchParameters.put(key, newValue); } - notifyListeners(); + //notifyListeners(); } public void addListener(InvalidationListener listener) { @@ -149,8 +149,8 @@ public SimpleStringProperty authorProperty() { return author; } - public SimpleStringProperty levelProperty() { - return level; + public SimpleStringProperty levelsProperty() { + return levels; } public SimpleStringProperty tagsProperty() { @@ -203,9 +203,9 @@ public void setQuery(String query) { textProperty().setValue(null); } if (map.containsKey(Keys.LEVEL.getName())) { - levelProperty().setValue(map.get(Keys.LEVEL.getName())); + levelsProperty().setValue(map.get(Keys.LEVEL.getName())); } else { - levelProperty().setValue(null); + levelsProperty().setValue(null); } if (map.containsKey(Keys.TAGS.getName())) { tagsProperty().setValue(map.get(Keys.TAGS.getName())); diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java index 9dc743ac99..c7d7e65cbf 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryEditorController.java @@ -61,6 +61,7 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.logbook.LogClient; import org.phoebus.logbook.LogEntry; +import org.phoebus.logbook.LogEntryLevel; import org.phoebus.logbook.LogFactory; import org.phoebus.logbook.LogService; import org.phoebus.logbook.LogTemplate; @@ -824,9 +825,9 @@ private void getServerSideStaticData() { templatesProperty.setAll(logClient.getTemplates().stream().toList()); - Collection levels = logClient.getLevels(); - availableLevels.setAll(levels.stream().map(org.phoebus.logbook.Level::name).sorted().toList()); - Optional optionalLevel = levels.stream().filter(org.phoebus.logbook.Level::defaultLevel).findFirst(); + Collection levels = logClient.getLogEntryLevels(); + availableLevels.setAll(levels.stream().map(LogEntryLevel::name).sorted().toList()); + Optional optionalLevel = levels.stream().filter(LogEntryLevel::defaultLevel).findFirst(); String defaultLevel = null; if(optionalLevel.isPresent()){ // One level value should be the default level @@ -906,7 +907,7 @@ public Optional getLogEntryResult() { * Loads template to configure UI elements. * * @param logTemplate A {@link LogTemplate} selected by user. If null, all log entry elements - * will be cleared, except the Level selector, which will be set to the top-most item. + * will be cleared, except the LogEntryLevel selector, which will be set to the top-most item. */ private void loadTemplate(LogTemplate logTemplate) { if (logTemplate != null) { diff --git a/app/logbook/olog/ui/src/main/resources/log_olog_ui_preferences.properties b/app/logbook/olog/ui/src/main/resources/log_olog_ui_preferences.properties index 92935f036f..55bd93601f 100644 --- a/app/logbook/olog/ui/src/main/resources/log_olog_ui_preferences.properties +++ b/app/logbook/olog/ui/src/main/resources/log_olog_ui_preferences.properties @@ -11,7 +11,7 @@ default_logbook_query=desc=*&start=12 hours&end=now # Stylesheet for the items in the log calendar view calendar_view_item_stylesheet=Agenda.css -# Text to render for the "Level" field of a log entry. Sites may wish to customize this with respect to +# Text to render for the "LogEntryLevel" field of a log entry. Sites may wish to customize this with respect to # its wording and its implied purpose. level_field_name=Level: diff --git a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/AdvancedSearchView.fxml b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/AdvancedSearchView.fxml index 848b9ab321..87e224afbd 100644 --- a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/AdvancedSearchView.fxml +++ b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/AdvancedSearchView.fxml @@ -23,10 +23,10 @@ ~ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --> - + - + @@ -67,7 +67,16 @@