From a971c5480a9997bc89b797e3e64ed1d178163c59 Mon Sep 17 00:00:00 2001
From: Kálmán Viktor <kviktor@cloud.bme.hu>
Date: Mon, 28 Oct 2013 15:27:16 +0100
Subject: [PATCH] dashboard: vm create finished network part

---
 circle/dashboard/static/dashboard/dashboard.js      | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
 circle/dashboard/templates/dashboard/vm-create.html | 30 ++++++++++++++++++++----------
 circle/dashboard/views.py                           |  6 ++++--
 3 files changed, 88 insertions(+), 29 deletions(-)

diff --git a/circle/dashboard/static/dashboard/dashboard.js b/circle/dashboard/static/dashboard/dashboard.js
index a96d7f3..aa65502 100644
--- a/circle/dashboard/static/dashboard/dashboard.js
+++ b/circle/dashboard/static/dashboard/dashboard.js
@@ -48,18 +48,42 @@ function vmCreateTemplateChange(new_this) {
     type: 'GET',
     success: function(data, textStatus, xhr) {
       if(xhr.status == 200) {
-       // set sliders
+        // set sliders
         $('#cpu-priority-slider').simpleSlider("setValue", data['priority']);
         $('#cpu-count-slider').simpleSlider("setValue", data['num_cores']);
         $('#ram-slider').simpleSlider("setValue", data['ram_size']);
 
+        /* clear selection */
+        $('select[id^="vm-create-network-add"], select[id$="managed"]').find('option').prop('selected', false);
+
+        /* append vlans from InterfaceTemplates */
         $('#vm-create-network-list').html('');
+        var added_vlans = []
         for(var n = 0; n<data['network'].length; n++) {
           nn = data['network'][n]
           $('#vm-create-network-list').append(
               vmCreateNetworkLabel(nn.vlan_pk, nn.vlan, nn.managed)
           );
-          $('#vm-create-network-add-form option[value="' + nn.vlan_pk + '|' + (nn.managed ? '1' : '0') + '"]').prop('selected', true);
+          
+          $('#vm-create-network-add-' + (nn.managed ? '' : 'un') + 'managed option[value="' + nn.vlan_pk + '"]').prop('selected', true);
+          added_vlans.push(nn.vlan_pk);
+        }
+
+        /* remove already added vlans from dropdown or add new ones */
+        $('#vm-create-network-add-select').html('');
+        for(var i=0; i < vlans.length; i++)
+          if(added_vlans.indexOf(vlans[i].pk) == -1)
+            $('#vm-create-network-add-select').append($('<option>', {
+              value: vlans[i].pk,                                                     
+              text: vlans[i].name                                                     
+            }));
+       
+        /* enalbe the network add button if there are not added vlans */
+        if(added_vlans.length != vlans.length) {
+          $('#vm-create-network-add-button').attr('disabled', false);
+        } else {
+          $('#vm-create-network-add-select').html('<option value="-1">We are out of &lt;options&gt; hehe</option>');
+          $('#vm-create-network-add-button').attr('disabled', true);
         }
       }
     }
@@ -71,6 +95,7 @@ function vmCreateNetworkLabel(pk, name, managed) {
 }
 
 
+var vlans = [];
 function vmCreateLoaded() {
   // temporarily disable for testing
   //$('.vm-create-advanced').hide();
@@ -89,19 +114,26 @@ function vmCreateLoaded() {
  
   /* add network */
   $('#vm-create-network-add-button').click(function() {
-    var option = $('#vm-create-network-add-select :selected');
-    var o = option.val().split('|');
-    var vlan_pk = o[0];
-    var managed = o[1];
+    var vlan_pk = $('#vm-create-network-add-select :selected').val();
+    var managed = $('#vm-create-network-add-checkbox-managed').prop('checked');
+    var name = $('#vm-create-network-add-select :selected').text();
+
     if ($('#vm-create-network-list').children('span').length < 1) { 
       $('#vm-create-network-list').html('');
     }  
     $('#vm-create-network-list').append(
-      vmCreateNetworkLabel(option.val(), option.text(), managed > 0 ? true : false)
+      vmCreateNetworkLabel(vlan_pk, name, managed)
     );
-    $('#vm-create-network-add-form option[value="' + vlan_pk + '|' + (managed ? '1' : '0') + '"]').prop('selected', true);
-    $('option:selected', $('#vm-create-network-add-select')).remove();
 
+    /* select the network from the managed/unmanaged multiple select */
+    if(managed) {
+      $('#vm-create-network-add-managed option[value="' + vlan_pk + '"]').prop('selected', true);
+    } else {
+      $('#vm-create-network-add-unmanaged option[value="' + vlan_pk + '"]').prop('selected', true);
+    }
+    /* remove the network from select */
+    $('option:selected', $('#vm-create-network-add-select')).remove();
+    
     /* add dummy text if no more networks are available */
     if($('#vm-create-network-add-select option').length < 1) {
       $('#vm-create-network-add-button').attr('disabled', true);
@@ -113,26 +145,30 @@ function vmCreateLoaded() {
 
   /* remove network */
   // event for network remove button (icon, X)
-  // TODO still not the right place
+  // TODO still not the right place (wrong file ...)
   $('body').on('click', '.vm-create-remove-network', function() {
-    var value = ($(this).parent('span').prop('id')).replace('vlan-', '').split('|');
-    var vlan_pk = value[0];
-    var managed = value[1];
-    $(this).parent('span').fadeOut(500, function() {  
+    var vlan_pk = ($(this).parent('span').prop('id')).replace('vlan-', '')
+    // if it's "blue" then it's managed, kinda not cool
+    var managed = $(this).parent('span').hasClass('label-primary');
+
+    $(this).parent('span').fadeOut(500, function() {
+      /* if ther are no more vlans disabled the add button */
       if($('#vm-create-network-add-select option')[0].value == -1) {   
         $('#vm-create-network-add-button').attr('disabled', false);            
         $('#vm-create-network-add-select').html('');
       }
       
+      /* remove the network label */
       $(this).remove(); 
-      var vlan_name = $(this).text();
 
+      var vlan_name = $(this).text();
       $('#vm-create-network-add-select').append($('<option>', {
-        value: vlan_pk + "|" + managed,
+        value: vlan_pk,
         text: vlan_name
       }));
 
-      $('#vm-create-network-add-form option[value="' + vlan_pk + '|' + (managed ? '1' : '0') + '"]').prop('selected', false);
+      /* remove the selection from the multiple select */
+      $('#vm-create-network-add-' + (managed ? '' : 'un') + 'managed option[value="' + vlan_pk + '"]').prop('selected', false);
       if ($('#vm-create-network-list').children('span').length < 1) {
         $('#vm-create-network-list').append('Not added to any network!');
       }
@@ -140,6 +176,17 @@ function vmCreateLoaded() {
     return false;
   });
 
+  /* copy networks from hidden select */
+  $('#vm-create-network-add-select').html($('#vm-create-network-add-managed').html());
+
+
+  /* build up network list */
+  $('#vm-create-network-add-select option').each(function() {
+    vlans.push({
+      'name': $(this).text(),
+      'pk': parseInt($(this).val())
+    });
+  });
 
   /* no js compatibility */
   $('.no-js-hidden').show();
diff --git a/circle/dashboard/templates/dashboard/vm-create.html b/circle/dashboard/templates/dashboard/vm-create.html
index 51e627a..ddf2453 100644
--- a/circle/dashboard/templates/dashboard/vm-create.html
+++ b/circle/dashboard/templates/dashboard/vm-create.html
@@ -61,7 +61,6 @@
     </div>
     <style>
       /* temporary inline css for dev */
-      
       a.hover-black {
         color:white;
       }
@@ -76,22 +75,33 @@
       }
     </style>
     <div class="col-sm-8" style="padding-top: 3px;">
-      <select class="form-control js-hidden" id="vm-create-network-add-form" multiple>
-        <option value="1|1">vmnet2 - managed</option>
-        <option value="2|0">PUB</option>
-        <option value="3|0">OFF</option>
-      </select>
+      <div class="js-hidden" style="padding-top: 15px;">
+        <h4>Managed networks</h4>
+        <select class="form-control" id="vm-create-network-add-managed" multiple>
+          {% for v in vlans %}
+            <option value="{{ v.pk }}">{{ v.name }}</option>
+          {% endfor %}
+        </select>
+
+        <h4>Unmanaged networks</h4>
+        <select class="form-control" id="vm-create-network-add-unmanaged" multiple>
+          {% for v in vlans %}
+            <option value="{{ v.pk }}">{{ v.name }}</option>
+          {% endfor %}
+        </select>
+      </div>
       <div class="no-js-hidden">
         <h3 id="vm-create-network-list" class="no-js-hidden">
           Not added to any network!
         </h3>
         <h3 id="vm-create-network-add">
-          <div class="input-group" style="max-width: 300px;">
+          <div class="input-group" style="max-width: 330px;">
             <select class="form-control" id="vm-create-network-add-select">         
-              <option value="1|1">vmnet2</option>
-              <option value="2|0">PUB</option>
-              <option value="3|0">OFF</option>
+              <!-- options should be copied via js from above -->
             </select>
+            <span class="input-group-addon">
+              <input id="vm-create-network-add-checkbox-managed" type="checkbox" title data-original-title="Managed network?" style="-webkit-transform: scale(1.4, 1.4); margin-top: 4px;" checked/>
+            </span>
             <div class="input-group-btn">
               <!--<input type="submit" value="Add to network" class="btn btn-success"/>-->
               <a href="#" id="vm-create-network-add-button" class="btn btn-success"><i class="icon-plus-sign"></i></a>
diff --git a/circle/dashboard/views.py b/circle/dashboard/views.py
index 44d8582..c9ec8e5 100644
--- a/circle/dashboard/views.py
+++ b/circle/dashboard/views.py
@@ -5,6 +5,7 @@ from django_tables2 import SingleTableView
 from tables import VmListTable
 
 from vm.models import Instance, InstanceTemplate, InterfaceTemplate
+from firewall.models import Vlan
 from django.core import signing
 
 import json
@@ -108,9 +109,10 @@ class VmCreate(TemplateView):
 
     def get_context_data(self, **kwargs):
         context = super(VmCreate, self).get_context_data(**kwargs)
+        # TODO acl
         context.update({
-            # TODO acl
-            'templates': InstanceTemplate.objects.all()
+            'templates': InstanceTemplate.objects.all(),
+            'vlans': Vlan.objects.all()
         })
 
         return context
--
libgit2 0.26.0