You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2020/06/12 19:51:15 UTC

[airavata-django-portal] 02/05: AIRAVATA-3285 Add dropdown selection widget

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

machristie pushed a commit to branch AIRAVATA-3285--Interactive-output-view-providers
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit f387e4e624059068ab945d55ae1d9031b4df04d8
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu May 7 11:02:33 2020 -0400

    AIRAVATA-3285 Add dropdown selection widget
---
 django_airavata/apps/api/output_views.py           | 25 +++++++++++++-
 .../InteractiveParameterSelectWidget.vue           | 28 ++++++++++++++++
 .../InteractiveParameterWidgetContainer.vue        | 38 ++++++++++++++++++++++
 .../InteractiveParametersPanel.vue                 | 13 ++++----
 4 files changed, 96 insertions(+), 8 deletions(-)

diff --git a/django_airavata/apps/api/output_views.py b/django_airavata/apps/api/output_views.py
index d10fd25..dfc3808 100644
--- a/django_airavata/apps/api/output_views.py
+++ b/django_airavata/apps/api/output_views.py
@@ -1,3 +1,4 @@
+import collections
 import inspect
 import json
 import logging
@@ -209,9 +210,29 @@ def _generate_data(request,
                                               experiment,
                                               output_file=output_file,
                                               **kwargs)
+    _convert_options(data)
     return data
 
 
+def _convert_options(data):
+    """Convert interactive options to explicit text/value dicts."""
+    if 'interactive' in data:
+        for param in data['interactive']:
+            if 'options' in param and isinstance(param['options'][0], str):
+                param['options'] = _convert_options_strings(param['options'])
+            elif 'options' in param and isinstance(
+                    param['options'][0], collections.Sequence):
+                param['options'] = _convert_options_sequences(param['options'])
+
+
+def _convert_options_strings(options):
+    return [{"text": o, "value": o} for o in options]
+
+
+def _convert_options_sequences(options):
+    return [{"text": o[0], "value": o[1]} for o in options]
+
+
 def _convert_params_to_type(output_view_provider, params):
     method_sig = inspect.signature(output_view_provider.generate_data)
     method_params = method_sig.parameters
@@ -221,6 +242,8 @@ def _convert_params_to_type(output_view_provider, params):
                 method_params[k].default is not None):
             # TODO: handle lists?
             # Handle boolean and numeric values, converting from string
-            if type(method_params[k]) is not str:
+            if type(method_params[k].default) is not str:
                 params[k] = json.loads(v)
+            else:
+                params[k] = v
     return params
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterSelectWidget.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterSelectWidget.vue
new file mode 100644
index 0000000..922c9f5
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterSelectWidget.vue
@@ -0,0 +1,28 @@
+<template>
+  <b-form-select
+    :value="value"
+    :options="options"
+    @input="$emit('input', $event)"
+  />
+</template>
+
+<script>
+export default {
+  name: "interactive-parameter-select-widget",
+  props: {
+    value: {
+      type: String,
+      required: true
+    },
+    parameter: {
+      type: Object,
+      required: true
+    }
+  },
+  computed: {
+    options() {
+      return this.parameter.options;
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterWidgetContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterWidgetContainer.vue
new file mode 100644
index 0000000..56f9367
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterWidgetContainer.vue
@@ -0,0 +1,38 @@
+<template>
+  <compoment :is="widgetComponent"
+    :value="parameter.value"
+    :parameter="parameter"
+    @input="$emit('input', $event)"
+  />
+</template>
+
+<script>
+import InteractiveParameterCheckboxWidget from "./InteractiveParameterCheckboxWidget";
+import InteractiveParameterSelectWidget from "./InteractiveParameterSelectWidget";
+
+export default {
+  name: "interactive-parameter-widget-container",
+  props: {
+    parameter: {
+      type: Object,
+      required: true
+    }
+  },
+  components: {
+    InteractiveParameterCheckboxWidget,
+    InteractiveParameterSelectWidget
+  },
+  computed: {
+    widgetComponent() {
+      if (this.parameter.options) {
+        return InteractiveParameterSelectWidget;
+      } else if (typeof this.parameter.value === "boolean") {
+        return InteractiveParameterCheckboxWidget;
+      } else {
+        return null;
+      }
+    }
+  }
+};
+</script>
+
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue
index 0b3527d..aa2018d 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue
@@ -5,21 +5,20 @@
       :key="param.name"
       :label="param.name"
     >
-      <!-- TODO: use dynamic components to pick the right widget for the type of parameter -->
-      <interactive-parameter-checkbox-widget
-        :value="param.value"
-        @input="updated(param, $event)"
-      />
+      <interactive-parameter-widget-container
+        :parameter="param"
+        @input="updated(param, $event)"/>
     </b-form-group>
   </b-card>
 </template>
 
 <script>
-import InteractiveParameterCheckboxWidget from "./InteractiveParameterCheckboxWidget";
+import InteractiveParameterWidgetContainer from "./InteractiveParameterWidgetContainer";
+
 export default {
   name: "interactive-parameters-panel",
   components: {
-    InteractiveParameterCheckboxWidget
+    InteractiveParameterWidgetContainer
   },
   props: {
     parameters: {