From 034a714d55a808772b746bc969a60cb1da718865 Mon Sep 17 00:00:00 2001
From: Philip ABBET <philip.abbet@idiap.ch>
Date: Thu, 24 Nov 2016 11:35:56 +0100
Subject: [PATCH] [website] Only propose environments compatible with the
 selected algorithm on the experiment setup page

---
 beat/web/backend/static/backend/js/models.js  | 46 +++++++++++++++++++
 .../static/experiments/js/panels.js           | 29 ++++++++----
 2 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/beat/web/backend/static/backend/js/models.js b/beat/web/backend/static/backend/js/models.js
index 18deadbe8..33ef15c74 100644
--- a/beat/web/backend/static/backend/js/models.js
+++ b/beat/web/backend/static/backend/js/models.js
@@ -56,6 +56,7 @@ beat.backend.models.EnvironmentsList = function(declaration)
         var environment = {
             name: declaration[i].name,
             version: declaration[i].version,
+            languages: declaration[i].languages,
             queues: [],
         };
 
@@ -127,6 +128,51 @@ beat.backend.models.EnvironmentsList.prototype.contains = function(name, version
 }
 
 
+//----------------------------------------------------------------------------------------
+// Retrieve a list of environments supporting a specific language
+//----------------------------------------------------------------------------------------
+beat.backend.models.EnvironmentsList.prototype.filter = function(language)
+{
+    var result = new beat.backend.models.EnvironmentsList([]);
+
+    for (var i = 0; i < this.data.length; i++)
+    {
+        var environment = this.data[i];
+
+        if (environment.languages.indexOf(language) >= 0)
+            result.data.push(JSON.parse(JSON.stringify(environment)));
+    }
+
+    result.length = result.data.length;
+
+    return result;
+}
+
+
+//----------------------------------------------------------------------------------------
+// Retrieve the list of supported languages across all the environments
+//----------------------------------------------------------------------------------------
+beat.backend.models.EnvironmentsList.prototype.languages = function()
+{
+    var languages = [];
+
+    for (var i = 0; i < this.data.length; i++)
+    {
+        var environment = this.data[i];
+
+        for (var j = 0; j < environment.languages.length; j++)
+        {
+            var language = environment.languages[j];
+
+            if (languages.indexOf(language) < 0)
+                languages.push(language);
+        }
+    }
+
+    return languages;
+}
+
+
 //----------------------------------------------------------------------------------------
 // Returns an iterator over the environments
 //----------------------------------------------------------------------------------------
diff --git a/beat/web/experiments/static/experiments/js/panels.js b/beat/web/experiments/static/experiments/js/panels.js
index 9e0f1fd5b..82bb88b30 100644
--- a/beat/web/experiments/static/experiments/js/panels.js
+++ b/beat/web/experiments/static/experiments/js/panels.js
@@ -48,6 +48,7 @@ beat.experiments.panels.Settings = function(panel_id, toolchain_name,
   this.algorithms         = null;
   this.dataformats        = null;
   this.environments       = null;
+  this.environments_all   = null;
   this.smart_datasets     = null;
   this.algorithm_mapping  = algorithm_mapping;
   this.url_prefix         = url_prefix;
@@ -183,12 +184,22 @@ beat.experiments.panels.Settings.prototype.initialize = function(toolchain, conf
     dataformats, datasets,
     algorithms, environments)
 {
-  this.toolchain     = toolchain;
-  this.configuration = configuration;
-  this.dataformats   = dataformats;
-  this.datasets      = datasets;
-  this.environments  = environments;
-  this.algorithms    = algorithms;
+  this.toolchain        = toolchain;
+  this.configuration    = configuration;
+  this.dataformats      = dataformats;
+  this.datasets         = datasets;
+  this.environments_all = environments;
+  this.algorithms       = algorithms;
+
+  // Separate the environments by languages
+  this.environments = {};
+
+  var languages = environments.languages();
+  for (var i = 0; i < languages.length; ++i)
+  {
+    var language = languages[i];
+    this.environments[language] = environments.filter(language);
+  }
 
   // Update the environments
   var components = [].concat(this.toolchain.blocks, this.toolchain.analyzers);
@@ -200,8 +211,8 @@ beat.experiments.panels.Settings.prototype.initialize = function(toolchain, conf
 
     if ((configuration != null) && (configuration.environment != null))
     {
-      if (!this.environments.contains(configuration.environment.name, configuration.environment.version))
-        this.configuration.setBlockEnvironment(component.name, this.environments.get(configuration.environment.name));
+      if (!this.environments_all.contains(configuration.environment.name, configuration.environment.version))
+        this.configuration.setBlockEnvironment(component.name, this.environments_all.get(configuration.environment.name));
     }
   }
 
@@ -1078,7 +1089,7 @@ beat.experiments.panels.Settings.prototype._displayParametersControls = function
       this.configuration,
       block_entry.block.name,
       block_entry.algorithm,
-      this.environments
+      this.environments[block_entry.algorithm.language]
       );
 
   $(block_entry.reset_button).show();
-- 
GitLab