This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 2c252810a8 Fix MongoDB transform dialog layout, update-option 
enablement, and Input preview when not outputting JSON (#7165)
2c252810a8 is described below

commit 2c252810a857e0d3ef37f703e7214d8a93588e42
Author: Lance <[email protected]>
AuthorDate: Mon May 25 14:59:56 2026 +0800

    Fix MongoDB transform dialog layout, update-option enablement, and Input 
preview when not outputting JSON (#7165)
---
 .../mongodbdelete/MongoDbDeleteDialog.java         |  8 ++--
 .../transforms/mongodbinput/MongoDbInput.java      |  4 ++
 .../transforms/mongodbinput/MongoDbInputData.java  |  5 ++-
 .../mongodbinput/MongoDbInputDialog.java           | 46 +++++++++++++---------
 .../mongodboutput/MongoDbOutputDialog.java         | 40 ++++++++++++-------
 .../messages/messages_en_US.properties             |  3 ++
 .../messages/messages_zh_CN.properties             |  3 ++
 .../mongodbinput/MongoDbInputDataTest.java         | 10 +++++
 8 files changed, 80 insertions(+), 39 deletions(-)

diff --git 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
index ff710c891f..407f6febaa 100644
--- 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
+++ 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
@@ -175,7 +175,7 @@ public class MongoDbDeleteDialog extends 
BaseTransformDialog {
         BaseMessages.getString(PKG, 
"MongoDbDeleteDialog.GetCollections.Button")); // $NON-NLS-1$
     fd = new FormData();
     fd.right = new FormAttachment(100, 0);
-    fd.top = new FormAttachment(lastControl, 0);
+    fd.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
     wbGetCollections.setLayoutData(fd);
     wbGetCollections.addListener(SWT.Selection, e -> getCollectionNames());
 
@@ -189,7 +189,7 @@ public class MongoDbDeleteDialog extends 
BaseTransformDialog {
         });
     fd = new FormData();
     fd.left = new FormAttachment(middle, 0);
-    fd.top = new FormAttachment(lastControl, margin);
+    fd.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
     fd.right = new FormAttachment(wbGetCollections, -margin);
     wCollection.setLayoutData(fd);
 
@@ -289,9 +289,9 @@ public class MongoDbDeleteDialog extends 
BaseTransformDialog {
           }
         });
     fd = new FormData();
-    fd.right = new FormAttachment(100, -margin);
-    fd.top = new FormAttachment(0, margin * 3);
     fd.left = new FormAttachment(middle, 0);
+    fd.right = new FormAttachment(100, -margin);
+    fd.top = new FormAttachment(useDefinedQueryLab, 0, SWT.CENTER);
     wbUseJsonQuery.setLayoutData(fd);
 
     colInf =
diff --git 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
index 34e838bc9a..85733ee400 100644
--- 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
+++ 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
@@ -266,6 +266,10 @@ public class MongoDbInput extends 
BaseTransform<MongoDbInputMeta, MongoDbInputDa
         data.collection = data.clientWrapper.getCollection(databaseName, 
collection);
 
         if (!meta.isOutputJson()) {
+          if (meta.getFields() == null || meta.getFields().isEmpty()) {
+            throw new HopException(
+                BaseMessages.getString(PKG, 
"MongoInput.ErrorMessage.NoFieldsSpecified"));
+          }
           data.setMongoFields(meta.getFields());
         }
 
diff --git 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
index 298f4dd7a7..c2584dcec6 100644
--- 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
+++ 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
@@ -258,9 +258,10 @@ public class MongoDbInputData extends BaseTransformData 
implements ITransformDat
    * @param fields the field path specifications
    */
   public void setMongoFields(List<MongoField> fields) {
-    // copy this list
     userFields = new ArrayList<>();
-
+    if (fields == null) {
+      return;
+    }
     for (MongoField f : fields) {
       userFields.add(f.copy());
     }
diff --git 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
index bd5a5d1f63..1cc468a081 100644
--- 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
+++ 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
@@ -166,7 +166,7 @@ public class MongoDbInputDialog extends BaseTransformDialog 
{
         BaseMessages.getString(PKG, 
"MongoDbInputDialog.GetCollections.Button"));
     FormData fd = new FormData();
     fd.right = new FormAttachment(100, 0);
-    fd.top = new FormAttachment(lastControl, 0);
+    fd.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
     wbGetCollections.setLayoutData(fd);
     wbGetCollections.addListener(SWT.Selection, e -> getCollectionNames());
 
@@ -175,8 +175,8 @@ public class MongoDbInputDialog extends BaseTransformDialog 
{
     wCollection.addModifyListener(lsMod);
     FormData fdCollection = new FormData();
     fdCollection.left = new FormAttachment(middle, 0);
-    fdCollection.top = new FormAttachment(lastControl, margin);
-    fdCollection.right = new FormAttachment(wbGetCollections, 0);
+    fdCollection.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
+    fdCollection.right = new FormAttachment(wbGetCollections, -margin);
     wCollection.setLayoutData(fdCollection);
     lastControl = wCollection;
     wCollection.addListener(SWT.Selection, e -> updateQueryTitleInfo());
@@ -497,25 +497,22 @@ public class MongoDbInputDialog extends 
BaseTransformDialog {
     meta.setExecuteForEachIncomingRow(wbExecuteForEachRow.getSelection());
 
     int numNonEmpty = wFields.nrNonEmpty();
-    if (numNonEmpty > 0) {
-      List<MongoField> outputFields = new ArrayList<>();
-      for (int i = 0; i < numNonEmpty; i++) {
-        TableItem item = wFields.getNonEmpty(i);
-        MongoField newField = new MongoField();
-
-        newField.fieldName = item.getText(1).trim();
-        newField.fieldPath = item.getText(2).trim();
-        newField.hopType = item.getText(3).trim();
-
-        if (!StringUtils.isEmpty(item.getText(4))) {
-          newField.indexedValues = 
MongoDbInputData.indexedValsList(item.getText(4).trim());
-        }
+    List<MongoField> outputFields = new ArrayList<>();
+    for (int i = 0; i < numNonEmpty; i++) {
+      TableItem item = wFields.getNonEmpty(i);
+      MongoField newField = new MongoField();
+
+      newField.fieldName = item.getText(1).trim();
+      newField.fieldPath = item.getText(2).trim();
+      newField.hopType = item.getText(3).trim();
 
-        outputFields.add(newField);
+      if (!StringUtils.isEmpty(item.getText(4))) {
+        newField.indexedValues = 
MongoDbInputData.indexedValsList(item.getText(4).trim());
       }
 
-      meta.setFields(outputFields);
+      outputFields.add(newField);
     }
+    meta.setFields(outputFields);
   }
 
   private void ok() {
@@ -734,6 +731,19 @@ public class MongoDbInputDialog extends 
BaseTransformDialog {
       return;
     }
 
+    if (!oneMeta.isOutputJson() && Utils.isEmpty(oneMeta.getFields())) {
+      ShowMessageDialog smd =
+          new ShowMessageDialog(
+              shell,
+              SWT.ICON_WARNING | SWT.OK,
+              BaseMessages.getString(
+                  PKG, 
"MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput.Title"),
+              BaseMessages.getString(
+                  PKG, 
"MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput"));
+      smd.open();
+      return;
+    }
+
     PipelineMeta previewMeta =
         PipelinePreviewFactory.generatePreviewPipeline(
             metadataProvider, oneMeta, wTransformName.getText());
diff --git 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
index ca86defd4d..a03568f7ed 100644
--- 
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
+++ 
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
@@ -81,8 +81,11 @@ public class MongoDbOutputDialog extends BaseTransformDialog 
{
 
   private Button wbTruncate;
   private Button wbUpdate;
+  private Label upsertLab;
   private Button wbUpsert;
+  private Label multiLab;
   private Button wbMulti;
+  private Label modifierLab;
   private Button wbModifierUpdate;
 
   private TextVar wWriteRetries;
@@ -267,22 +270,16 @@ public class MongoDbOutputDialog extends 
BaseTransformDialog {
         SWT.Selection,
         e -> {
           currentMeta.setChanged();
-          wbUpsert.setEnabled(wbUpdate.getSelection());
-          wbModifierUpdate.setEnabled(wbUpdate.getSelection());
-          wbMulti.setEnabled(wbUpdate.getSelection());
           if (!wbUpdate.getSelection()) {
             wbModifierUpdate.setSelection(false);
             wbMulti.setSelection(false);
             wbUpsert.setSelection(false);
           }
-          wbMulti.setEnabled(wbModifierUpdate.getSelection());
-          if (!wbMulti.getEnabled()) {
-            wbMulti.setSelection(false);
-          }
+          setUpdateOptionControlsEnabled();
         });
 
     // upsert line
-    Label upsertLab = new Label(wOutputComp, SWT.RIGHT);
+    upsertLab = new Label(wOutputComp, SWT.RIGHT);
     upsertLab.setText(BaseMessages.getString(PKG, 
"MongoDbOutputDialog.Upsert.Label"));
     PropsUi.setLook(upsertLab);
     upsertLab.setToolTipText(BaseMessages.getString(PKG, 
"MongoDbOutputDialog.Upsert.TipText"));
@@ -302,7 +299,7 @@ public class MongoDbOutputDialog extends 
BaseTransformDialog {
     lastControl = upsertLab;
 
     // multi line
-    Label multiLab = new Label(wOutputComp, SWT.RIGHT);
+    multiLab = new Label(wOutputComp, SWT.RIGHT);
     multiLab.setText(BaseMessages.getString(PKG, 
"MongoDbOutputDialog.Multi.Label"));
     PropsUi.setLook(multiLab);
     multiLab.setToolTipText(BaseMessages.getString(PKG, 
"MongoDbOutputDialog.Multi.TipText"));
@@ -323,7 +320,7 @@ public class MongoDbOutputDialog extends 
BaseTransformDialog {
     lastControl = multiLab;
 
     // modifier update
-    Label modifierLab = new Label(wOutputComp, SWT.RIGHT);
+    modifierLab = new Label(wOutputComp, SWT.RIGHT);
     modifierLab.setText(BaseMessages.getString(PKG, 
"MongoDbOutputDialog.Modifier.Label"));
     PropsUi.setLook(modifierLab);
     modifierLab.setToolTipText(BaseMessages.getString(PKG, 
"MongoDbOutputDialog.Modifier.TipText"));
@@ -346,12 +343,13 @@ public class MongoDbOutputDialog extends 
BaseTransformDialog {
         SWT.Selection,
         e -> {
           currentMeta.setChanged();
-          wbMulti.setEnabled(wbModifierUpdate.getSelection());
           if (!wbModifierUpdate.getSelection()) {
             wbMulti.setSelection(false);
           }
+          setUpdateOptionControlsEnabled();
         });
     lastControl = modifierLab;
+    setUpdateOptionControlsEnabled();
 
     // retries stuff
     Label retriesLab = new Label(wOutputComp, SWT.RIGHT);
@@ -699,6 +697,21 @@ public class MongoDbOutputDialog extends 
BaseTransformDialog {
     return null;
   }
 
+  /**
+   * Enables or disables Upsert, Modifier update, and Multi-update labels and 
checkboxes based on
+   * Update and Modifier update.
+   */
+  private void setUpdateOptionControlsEnabled() {
+    boolean updateSelected = wbUpdate.getSelection();
+    upsertLab.setEnabled(updateSelected);
+    wbUpsert.setEnabled(updateSelected);
+    modifierLab.setEnabled(updateSelected);
+    wbModifierUpdate.setEnabled(updateSelected);
+    boolean multiEnabled = updateSelected && wbModifierUpdate.getSelection();
+    multiLab.setEnabled(multiEnabled);
+    wbMulti.setEnabled(multiEnabled);
+  }
+
   private void getData() {
     wConnection.setText(Const.NVL(currentMeta.getConnectionName(), "")); //
     wCollectionField.setText(Const.NVL(currentMeta.getCollection(), "")); //
@@ -709,14 +722,11 @@ public class MongoDbOutputDialog extends 
BaseTransformDialog {
     wbTruncate.setSelection(currentMeta.isTruncate());
     wbModifierUpdate.setSelection(currentMeta.isModifierUpdate());
 
-    wbUpsert.setEnabled(wbUpdate.getSelection());
-    wbModifierUpdate.setEnabled(wbUpdate.getSelection());
-    wbMulti.setEnabled(wbUpdate.getSelection());
     if (!wbUpdate.getSelection()) {
       wbModifierUpdate.setSelection(false);
       wbMulti.setSelection(false);
     }
-    wbMulti.setEnabled(wbModifierUpdate.getSelection());
+    setUpdateOptionControlsEnabled();
     if (!wbMulti.getEnabled()) {
       wbMulti.setSelection(false);
     }
diff --git 
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
 
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
index 1039793883..bdba76cb54 100644
--- 
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
+++ 
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
@@ -94,4 +94,7 @@ MongoInput.ErrorMessage.ErrorLoadingMongoDbConnection=Error 
loading MongoDB conn
 MongoInput.ErrorMessage.MongoDbConnection.NotFound=MongoDB connection {0} 
couldn''t be found
 MongoInput.ErrorMessage.NoCollectionSpecified=No collection specified
 MongoInput.ErrorMessage.NoDBSpecified=No database specified
+MongoInput.ErrorMessage.NoFieldsSpecified=No MongoDB document fields are 
defined for structured output
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput.Title=Missing 
fields
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput=When ''Output a 
single JSON field'' is not selected, define at least one field on the Fields 
tab (use Get Fields to sample the collection).
 MongoInput.ErrorMessage.PathContainsMultipleExpansions=Path contains multiple 
array expansions: {0}
diff --git 
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
 
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
index bd9514e956..ae2e86f56d 100644
--- 
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
+++ 
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
@@ -68,3 +68,6 @@ MongoInput.ErrorMessage.ErrorLoadingMongoDbConnection=\u4ECE 
MongoDB \u8FDE\u63A
 MongoInput.ErrorMessage.MongoDbConnection.NotFound=\u627E\u4E0D\u5230 MongoDB 
\u8FDE\u63A5 {0}
 MongoInput.ErrorMessage.NoCollectionSpecified=\u672A\u6307\u5B9A\u96C6\u5408
 MongoInput.ErrorMessage.NoDBSpecified=\u672A\u6307\u5B9A\u6570\u636E\u5E93
+MongoInput.ErrorMessage.NoFieldsSpecified=\u672A\u5B9A\u4E49\u7528\u4E8E\u7ED3\u6784\u5316\u8F93\u51FA\u7684
 MongoDB \u5B57\u6BB5
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput.Title=\u7F3A\u5C11\u5B57\u6BB5
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput=\u672A\u52FE\u9009\u300C\u8F93\u51FA\u5355\u4E2A
 JSON 
\u5B57\u6BB5\u300D\u65F6\uFF0C\u8BF7\u5728\u300C\u5B57\u6BB5\u300D\u9875\u7B7E\u4E2D\u81F3\u5C11\u5B9A\u4E49\u4E00\u4E2A\u5B57\u6BB5\uFF08\u53EF\u4F7F\u7528\u300C\u83B7\u53D6\u5B57\u6BB5\u300D\u4ECE\u96C6\u5408\u4E2D\u91C7\u6837\uFF09\u3002
diff --git 
a/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
 
b/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
index c5c8cbdb28..a63c7170c3 100644
--- 
a/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
+++ 
b/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.hop.pipeline.transforms.mongodbinput;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -379,4 +380,13 @@ class MongoDbInputDataTest {
         "my.${oneparam}.with.${a_dot_param}.otherstuff",
         
MongoDbInputData.cleansePath("my.${oneparam}.with.${a.dot.param}.otherstuff"));
   }
+
+  @Test
+  void setMongoFieldsNullIsSafe() {
+    MongoDbInputData data = new MongoDbInputData();
+    data.outputRowMeta = new RowMeta();
+    data.setMongoFields(null);
+
+    assertDoesNotThrow(data::init);
+  }
 }

Reply via email to