AIRAVATA-3655 Support "in" comparison type
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
index 8d94c03..fb06215 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
@@ -156,8 +156,8 @@
    *         "AND": [                     // Boolean operator ("AND", "OR")
    *           {
    *             "INPUT_1": {               // Name of other application input
-   *               "comparison": "equals",  // Name of comparison type
-   *               "value": "1"             // Value to compare with
+   *               "comparison": "equals",  // Name of comparison type ("equals", "in")
+   *               "value": "1"             // Value to compare with (for "in" the value should be an Array)
    *             }
    *           },
    *           {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/dependencies/BooleanExpressionEvaluator.js b/django_airavata/apps/api/static/django_airavata_api/js/models/dependencies/BooleanExpressionEvaluator.js
index 18e6daf..3f0ed7a 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/dependencies/BooleanExpressionEvaluator.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/dependencies/BooleanExpressionEvaluator.js
@@ -82,6 +82,8 @@
     }
     if (comparison === "equals") {
       return value === this._getComparisonValue(comparisonDefinition);
+    } else if (comparison === "in") {
+      return this._getComparisonValue(comparisonDefinition).includes(value);
     }
     throw new Error("Unrecognized comparison " + JSON.stringify(comparison));
   }
diff --git a/django_airavata/apps/api/static/django_airavata_api/tests/models/dependencies/BooleanExpressionEvaluator.test.js b/django_airavata/apps/api/static/django_airavata_api/tests/models/dependencies/BooleanExpressionEvaluator.test.js
index 62792e7..1b056d4 100644
--- a/django_airavata/apps/api/static/django_airavata_api/tests/models/dependencies/BooleanExpressionEvaluator.test.js
+++ b/django_airavata/apps/api/static/django_airavata_api/tests/models/dependencies/BooleanExpressionEvaluator.test.js
@@ -211,3 +211,25 @@
   });
   expect(result).toBe(true);
 });
+
+// 'in' comparison
+test("INPUT1 in [1, 2, 3] is TRUE", () => {
+  const result = booleanExpressionEvaluator.evaluate({
+    INPUT1: {
+      comparison: "in",
+      value: ["1", "2", "3"],
+    },
+  });
+  expect(result).toBe(true);
+});
+
+// 'in' comparison
+test("INPUT1 in [4, 5, 6] is FALSE", () => {
+  const result = booleanExpressionEvaluator.evaluate({
+    INPUT1: {
+      comparison: "in",
+      value: ["4", "5", "6"],
+    },
+  });
+  expect(result).toBe(false);
+});
diff --git a/docs/admin/app_inputs.md b/docs/admin/app_inputs.md
index 14ad7d7..df96d0d 100644
--- a/docs/admin/app_inputs.md
+++ b/docs/admin/app_inputs.md
@@ -75,6 +75,10 @@
 }
 ```
 
+See
+[code comment on evaluateDependencies()](https://github.com/apache/airavata-django-portal/blob/develop/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js#L146)
+for more information on how to define expressions.
+
 ## Alternate UI Components
 
 ### Checkboxes