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: {