From 982876f2b5da563a91fc0335908c2e9c41c93ffa Mon Sep 17 00:00:00 2001 From: Milena Schedle Date: Wed, 17 Jun 2026 15:29:27 +0200 Subject: [PATCH 1/5] Work in Progress --- .../olog/ui/LogEntryTableViewController.java | 10 +++++- .../org/phoebus/logbook/olog/ui/Messages.java | 1 + .../logbook/olog/ui/write/LogEntryUtils.java | 28 ++++++++++++++++ .../logbook/olog/ui/messages.properties | 2 ++ .../olog/ui/write/LogEntryUtilsTest.java | 33 +++++++++++++++++++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java create mode 100644 app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java 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 3e5bb795be..cc41df5d51 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 @@ -56,6 +56,7 @@ import org.phoebus.logbook.olog.ui.spi.Decoration; import org.phoebus.logbook.olog.ui.write.EditMode; import org.phoebus.logbook.olog.ui.write.LogEntryEditorStage; +import org.phoebus.logbook.olog.ui.write.LogEntryUtils; import org.phoebus.olog.es.api.model.LogGroupProperty; import org.phoebus.olog.es.api.model.OlogLog; import org.phoebus.security.store.SecureStore; @@ -214,7 +215,14 @@ public void initialize() { menuItemUpdateLogEntry.acceleratorProperty().setValue(new KeyCodeCombination(KeyCode.U, KeyCombination.CONTROL_DOWN)); menuItemUpdateLogEntry.setOnAction(ae -> new LogEntryEditorStage(selectedLogEntries.get(0), null, EditMode.UPDATE_LOG_ENTRY).show()); - contextMenu.getItems().addAll(groupSelectedEntries, menuItemShowHideAll, menuItemNewLogEntry); + //Milena + MenuItem menuItemCreateLogEntryFromSelection = new MenuItem(Messages.CreateLogEntryFromSelection); + menuItemCreateLogEntryFromSelection.setOnAction(pl -> { + LogEntry logEntry = LogEntryUtils.createLogEntryFromList(LogbookUIPreferences.web_client_root_URL, selectedLogEntries); + new LogEntryEditorStage(logEntry, null, EditMode.NEW_LOG_ENTRY).show(); + }); + + contextMenu.getItems().addAll(groupSelectedEntries, menuItemShowHideAll, menuItemNewLogEntry, menuItemCreateLogEntryFromSelection); if (LogbookUIPreferences.log_entry_update_support) { contextMenu.getItems().add(menuItemUpdateLogEntry); } diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java index b6a741f161..ba732b94c2 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java @@ -28,6 +28,7 @@ public class Messages CloseRequestHeader, CloseRequestButtonContinue, CloseRequestButtonDiscard, + CreateLogEntryFromSelection, DownloadSelected, DownloadingAttachments, EditLogEntry, diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java new file mode 100644 index 0000000000..5f64f25876 --- /dev/null +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java @@ -0,0 +1,28 @@ +package org.phoebus.logbook.olog.ui.write; + +import org.phoebus.logbook.LogEntry; +import org.phoebus.olog.es.api.model.OlogLog; + +import java.util.List; + +public class LogEntryUtils { + + public static LogEntry createLogEntryFromList(String baseURL, List logEntries){ + // number of log entries + // they links should be based on the + // instantiate new Log Entry implementatin Olog + // interface: type of class that defines a behavior/functionality/data + // you cannot instantiate an interface + // so we instantiate an OlogLog + // public class OlogLog implements LogEntry + OlogLog log = new OlogLog(); + StringBuilder stringBuilder = new StringBuilder(); + logEntries.forEach(l -> { + stringBuilder.append("\n"); + stringBuilder.append("[").append(l.getTitle()).append("](").append(baseURL).append(l.getId()).append(")\n\n"); + }); + + log.setSource(stringBuilder.toString()); + return log; + } +} diff --git a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/messages.properties b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/messages.properties index bed80ccac5..273c426ba5 100644 --- a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/messages.properties +++ b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/messages.properties @@ -30,6 +30,8 @@ CloseRequestHeader=Log entry not saved. Do you wish to close? CloseRequestButtonContinue=Continue Editing CloseRequestButtonDiscard=Close CreateLogbookEntry=Create Log Book Entry +#milena +CreateLogEntryFromSelection=Create Log Entry From Selection CopyMarkdown=Copy Markdown CopyURL=Copy URL CSSWindow=CSS Window diff --git a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java new file mode 100644 index 0000000000..854c3f3422 --- /dev/null +++ b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java @@ -0,0 +1,33 @@ +package org.phoebus.logbook.olog.ui.write; + +import org.junit.jupiter.api.Test; +import org.phoebus.logbook.*; +import org.phoebus.olog.es.api.model.OlogLog; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class LogEntryUtilsTest { + + @Test + public void testCreateLogEntryFromList(){ + + OlogLog ologEntry01 = new OlogLog(); + ologEntry01.setTitle("Title01"); + ologEntry01.setId(1L); + + OlogLog ologEntry02 = new OlogLog(); + ologEntry02.setTitle("Title02"); + ologEntry02.setId(2L); + + + OlogLog ologEntry03 = new OlogLog(); + ologEntry03.setTitle("Title03"); + ologEntry03.setId(3L); + + LogEntry testListLog = LogEntryUtils.createLogEntryFromList("someURL", List.of(ologEntry01, ologEntry02, ologEntry03)); + + assertEquals("\n[Title01](someURL1)\n\n\n[Title02](someURL2)\n\n\n[Title03](someURL3)\n\n", testListLog.getSource()); + } +} + From b3e7090492ed6d7a35c0487bc6669fa34bf96271 Mon Sep 17 00:00:00 2001 From: milenaschedle Date: Thu, 18 Jun 2026 12:45:10 +0100 Subject: [PATCH 2/5] Create new Log Entry from Selection of log entries --- .../olog/ui/write/LogEntryEditorController.java | 4 ++-- .../phoebus/logbook/olog/ui/write/LogEntryUtils.java | 10 +--------- .../logbook/olog/ui/write/LogEntryUtilsTest.java | 2 +- 3 files changed, 4 insertions(+), 12 deletions(-) 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 f5b0008876..0c82ad87c9 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 @@ -389,8 +389,8 @@ public void initialize() { textArea.textProperty().bindBidirectional(descriptionProperty); // When editing an existing entry, set the description to the source of the entry. - descriptionProperty.set(editMode.equals(EditMode.UPDATE_LOG_ENTRY) ? logEntry.getSource() : - (logEntry.getDescription() != null ? logEntry.getDescription() : "")); + descriptionProperty.set(logEntry.getSource()); +// (logEntry.getDescription() != null ? logEntry.getDescription() : "")); descriptionProperty.addListener((observable, oldValue, newValue) -> isDirty = true); Image tagIcon = ImageCache.getImage(LogEntryEditorController.class, "/icons/add_tag.png"); diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java index 5f64f25876..291061af66 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogEntryUtils.java @@ -2,24 +2,16 @@ import org.phoebus.logbook.LogEntry; import org.phoebus.olog.es.api.model.OlogLog; - import java.util.List; public class LogEntryUtils { public static LogEntry createLogEntryFromList(String baseURL, List logEntries){ - // number of log entries - // they links should be based on the - // instantiate new Log Entry implementatin Olog - // interface: type of class that defines a behavior/functionality/data - // you cannot instantiate an interface - // so we instantiate an OlogLog - // public class OlogLog implements LogEntry OlogLog log = new OlogLog(); StringBuilder stringBuilder = new StringBuilder(); logEntries.forEach(l -> { stringBuilder.append("\n"); - stringBuilder.append("[").append(l.getTitle()).append("](").append(baseURL).append(l.getId()).append(")\n\n"); + stringBuilder.append("- [").append(l.getTitle()).append("](").append(baseURL).append("/").append(l.getId()).append(")"); }); log.setSource(stringBuilder.toString()); diff --git a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java index 854c3f3422..84e5387e23 100644 --- a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java +++ b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java @@ -27,7 +27,7 @@ public void testCreateLogEntryFromList(){ LogEntry testListLog = LogEntryUtils.createLogEntryFromList("someURL", List.of(ologEntry01, ologEntry02, ologEntry03)); - assertEquals("\n[Title01](someURL1)\n\n\n[Title02](someURL2)\n\n\n[Title03](someURL3)\n\n", testListLog.getSource()); + assertEquals("\n- [Title01](someURL/1)\n- [Title02](someURL/2)\n- [Title03](someURL/3)", testListLog.getSource()); } } From a2bed9f2292eb01ef497c3011e68a45995c37f42 Mon Sep 17 00:00:00 2001 From: milenaschedle Date: Thu, 18 Jun 2026 13:17:54 +0100 Subject: [PATCH 3/5] Removed comments --- .../phoebus/logbook/olog/ui/write/LogEntryEditorController.java | 2 -- 1 file changed, 2 deletions(-) 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 0c82ad87c9..0c51be9e29 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 @@ -388,9 +388,7 @@ public void initialize() { titleProperty.set(logEntry.getTitle()); textArea.textProperty().bindBidirectional(descriptionProperty); - // When editing an existing entry, set the description to the source of the entry. descriptionProperty.set(logEntry.getSource()); -// (logEntry.getDescription() != null ? logEntry.getDescription() : "")); descriptionProperty.addListener((observable, oldValue, newValue) -> isDirty = true); Image tagIcon = ImageCache.getImage(LogEntryEditorController.class, "/icons/add_tag.png"); From 210f3b89ff9f7ad352de5d9c051b67162694b21f Mon Sep 17 00:00:00 2001 From: milenaschedle Date: Mon, 22 Jun 2026 08:56:04 +0100 Subject: [PATCH 4/5] Bug fixes --- .../olog/ui/LogEntryTableViewController.java | 2 +- .../logbook/olog/ui/write/EditMode.java | 3 ++- .../ui/write/LogEntryEditorController.java | 27 ++++++++++++------- 3 files changed, 20 insertions(+), 12 deletions(-) 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 cc41df5d51..d641701534 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 @@ -219,7 +219,7 @@ public void initialize() { MenuItem menuItemCreateLogEntryFromSelection = new MenuItem(Messages.CreateLogEntryFromSelection); menuItemCreateLogEntryFromSelection.setOnAction(pl -> { LogEntry logEntry = LogEntryUtils.createLogEntryFromList(LogbookUIPreferences.web_client_root_URL, selectedLogEntries); - new LogEntryEditorStage(logEntry, null, EditMode.NEW_LOG_ENTRY).show(); + new LogEntryEditorStage(logEntry, null, EditMode.NEW_LOG_ENTRY_FROM_SELECTION).show(); }); contextMenu.getItems().addAll(groupSelectedEntries, menuItemShowHideAll, menuItemNewLogEntry, menuItemCreateLogEntryFromSelection); diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/EditMode.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/EditMode.java index aac9c57b90..11bba351ee 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/EditMode.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/EditMode.java @@ -7,5 +7,6 @@ public enum EditMode { NEW_LOG_ENTRY, - UPDATE_LOG_ENTRY + UPDATE_LOG_ENTRY, + NEW_LOG_ENTRY_FROM_SELECTION } 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 0c51be9e29..d281d1d23f 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 @@ -388,7 +388,11 @@ public void initialize() { titleProperty.set(logEntry.getTitle()); textArea.textProperty().bindBidirectional(descriptionProperty); - descriptionProperty.set(logEntry.getSource()); + switch(editMode){ + case NEW_LOG_ENTRY -> descriptionProperty.set(""); + case UPDATE_LOG_ENTRY, NEW_LOG_ENTRY_FROM_SELECTION -> descriptionProperty.set(logEntry.getSource()); + } +// descriptionProperty.set(logEntry.getSource()); descriptionProperty.addListener((observable, oldValue, newValue) -> isDirty = true); Image tagIcon = ImageCache.getImage(LogEntryEditorController.class, "/icons/add_tag.png"); @@ -743,17 +747,20 @@ public void submit() { LogClient logClient = logFactory.getLogClient(new SimpleAuthenticationToken(usernameProperty.get(), passwordProperty.get())); try { - if(editMode.equals(EditMode.NEW_LOG_ENTRY)){ - if (replyTo == null) { + switch(editMode){ + case NEW_LOG_ENTRY: + if (replyTo == null) { + logEntryResult = Optional.of(logClient.set(ologLog)); + } else { + logEntryResult = Optional.of(logClient.reply(ologLog, replyTo)); + } + break; + case UPDATE_LOG_ENTRY: + logEntryResult = Optional.of(logClient.update(ologLog)); + break; + case NEW_LOG_ENTRY_FROM_SELECTION: logEntryResult = Optional.of(logClient.set(ologLog)); - } else { - logEntryResult = Optional.of(logClient.reply(ologLog, replyTo)); - } - } - else{ - logEntryResult = Optional.of(logClient.update(ologLog)); } - // Not dirty anymore... isDirty = false; From 60d0b7a003a7046b404fd832a4e9cff1cd3623e4 Mon Sep 17 00:00:00 2001 From: milenaschedle Date: Mon, 22 Jun 2026 13:44:19 +0100 Subject: [PATCH 5/5] Moved createLogERntryFromSelectipn from Context Menu to New Log Entry Button --- .../olog/ui/LogEntryDisplayController.java | 24 ++++++++++++++----- .../olog/ui/LogEntryTableViewController.java | 14 +++++------ .../logbook/olog/ui/LogEntryDisplay.fxml | 2 +- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java index 5be01d52e3..b86b7cdc6c 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java @@ -38,10 +38,12 @@ import org.phoebus.logbook.LogEntry; import org.phoebus.logbook.olog.ui.write.EditMode; import org.phoebus.logbook.olog.ui.write.LogEntryEditorStage; +import org.phoebus.logbook.olog.ui.write.LogEntryUtils; import org.phoebus.olog.es.api.model.LogGroupProperty; import org.phoebus.olog.es.api.model.OlogLog; import org.phoebus.ui.javafx.ImageCache; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -184,12 +186,6 @@ public void reply() { new LogEntryEditorStage(new OlogLog(), logEntryProperty.get(), EditMode.NEW_LOG_ENTRY).show(); } - @FXML - public void newLogEntry(){ - // Show a new editor dialog. - new LogEntryEditorStage(new OlogLog(), null, EditMode.NEW_LOG_ENTRY).show(); - } - @FXML public void goBack() { if (logEntryTableViewController.goBackAndGoForwardActions.isPresent()) { @@ -204,6 +200,22 @@ public void goForward() { } } + /** + * Creates a new Log Entry. + * If 2 or more existing Log Entries in the list are selected, + * they get linked into the description of the new Log Entry. + * */ + @FXML + public void createNewLogEntry(){ + List selectedLogEntries = logEntryTableViewController.getSelectedLogEntries(); + if (selectedLogEntries.size() > 1){ + LogEntry logEntry = LogEntryUtils.createLogEntryFromList(LogbookUIPreferences.web_client_root_URL, selectedLogEntries); + new LogEntryEditorStage(logEntry,null, EditMode.NEW_LOG_ENTRY_FROM_SELECTION).show(); + } else { + new LogEntryEditorStage(new OlogLog(), null, EditMode.NEW_LOG_ENTRY).show(); + } + } + /** * Sets/renders the {@link LogEntry} in the view unless already rendered or unedited. * @param logEntry A non-null {@link LogEntry} 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 d641701534..aafd648f5e 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 @@ -215,14 +215,7 @@ public void initialize() { menuItemUpdateLogEntry.acceleratorProperty().setValue(new KeyCodeCombination(KeyCode.U, KeyCombination.CONTROL_DOWN)); menuItemUpdateLogEntry.setOnAction(ae -> new LogEntryEditorStage(selectedLogEntries.get(0), null, EditMode.UPDATE_LOG_ENTRY).show()); - //Milena - MenuItem menuItemCreateLogEntryFromSelection = new MenuItem(Messages.CreateLogEntryFromSelection); - menuItemCreateLogEntryFromSelection.setOnAction(pl -> { - LogEntry logEntry = LogEntryUtils.createLogEntryFromList(LogbookUIPreferences.web_client_root_URL, selectedLogEntries); - new LogEntryEditorStage(logEntry, null, EditMode.NEW_LOG_ENTRY_FROM_SELECTION).show(); - }); - - contextMenu.getItems().addAll(groupSelectedEntries, menuItemShowHideAll, menuItemNewLogEntry, menuItemCreateLogEntryFromSelection); + contextMenu.getItems().addAll(groupSelectedEntries, menuItemShowHideAll, menuItemNewLogEntry); if (LogbookUIPreferences.log_entry_update_support) { contextMenu.getItems().add(menuItemUpdateLogEntry); } @@ -599,6 +592,11 @@ public OlogQuery fromString(String s) { } + + public List getSelectedLogEntries(){ + return selectedLogEntries; + } + /** * Wrapper class for a {@link LogEntry} and a flag indicating whether details of the * log entry meta-data should be rendered in the list view. diff --git a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml index a1ee45a978..e11f3f9cb0 100644 --- a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml +++ b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml @@ -28,7 +28,7 @@ -