{% extends "base.html" %} {% load staticfiles %} {% load bootstrap3 %} {% block content %} <style> .grid_container { display: grid; grid-template-columns: repeat(12, 1fr); padding: 30px; } .grid_element { border-radius: 3px; box-shadow: 0px 0px 7px 0px rgba(0,0,0,0.75); margin: 10px; padding: 7px; } .grid_element_wide { grid-column-start: span 12; } .grid_element_half { grid-column-start: span 6; } .grid_element_1third { grid-column-start: span 4; } .grid_element_2third { grid-column-start: span 8; } #id_length { -moz-appearance: none; border: none; box-shadow: none; } input[type=range]::-moz-range-track { background: #cccccc; } </style> {% bootstrap_form_errors form type='non_fields' %} <form id="quick_booking_form" action="/booking/quick/" method="POST" class="form"> {% csrf_token %} <div class="grid_container"> <div class="grid_element host_select_pane grid_element_wide"> <p>Please select a host type you wish to book. Only available types are shown.</p> {% bootstrap_field form.filter_field show_label=False %} </div> <div class="grid_element booking_info_pane grid_element_1third"> {% bootstrap_field form.purpose %} {% bootstrap_field form.project %} {% bootstrap_field form.length %} <p style="display:inline;">Days: </p><output id="daysout" style="display:inline;">0</output> <script> document.getElementById("id_length").setAttribute("oninput", "daysout.value=this.value"); document.getElementById("daysout").value = document.getElementById("id_length").value; </script> </div> <div class="grid_element collaborator_pane grid_element_1third"> <label>Collaborators</label> {{ form.users }} </div> <div class="grid_element_1third"> <div class="configuration_pane grid_element"> {% bootstrap_field form.hostname %} {% bootstrap_field form.image %} </div> <div class="configuration_pane grid_element"> <strong>OPNFV: (Optional)</strong> {% bootstrap_field form.installer %} {% bootstrap_field form.scenario %} </div> </div> </div> <script type="text/javascript"> var normalize = function(data) { //converts the top level keys in data to map to lists var normalized = {} for( var key in data ){ normalized[key] = []; for( var subkey in data[key] ){ normalized[key].push(data[key][subkey]); } } return normalized; } var update_page_contents = function(response) { document.open(); document.write(response); document.close(); } //form hamdler code submit_form = function() { //altered from initial prototype: form submits automatically, //but needs formatting for multiple select field var data = normalize(result); data = JSON.stringify(data); document.getElementById("filter_field").value = data; } var sup_image_dict = {{ image_filter|safe }}; var sup_installer_dict = {{ installer_filter|safe }}; var sup_scenario_dict = {{ scenario_filter|safe }}; function imageHider() { var data = normalize(result); var drop = document.getElementById("id_image"); for( var i=0; i < drop.length; i++ ) { if ( drop.options[i].text == '---------' ) { drop.selectedIndex = i; } } $('#id_image').children().hide(); var empty_map = {} for ( var i=0; i < drop.childNodes.length; i++ ) { var image_object = sup_image_dict[drop.childNodes[i].value]; if( image_object ) //weed out empty option { var lab_pk = "" for( var j in data["labs"][0] ) { if( j in {} ) { continue; } else { lab_pk = j; break; } } var host_pk = ""; for( var j in data["hosts"][0] ) { if( j in {} ) { continue; } else { host_pk = j; break; } } if( image_object.host_profile == host_pk && image_object.lab == lab_pk ) { drop.childNodes[i].style.display = "inherit"; } } } } $('#id_image').children().hide(); $('#id_installer').children().hide(); $('#id_scenario').children().hide(); Array.from(document.getElementsByClassName("grid-item-select-btn")).forEach(function(element) { element.addEventListener('click', imageHider); }); function installerHider() { dropFilter("id_installer", sup_installer_dict, "id_image"); scenarioHider(); } document.getElementById('id_image').addEventListener('change', installerHider); function scenarioHider() { dropFilter("id_scenario", sup_scenario_dict, "id_installer"); } document.getElementById('id_installer').addEventListener('change', scenarioHider); function dropFilter(target, target_filter, master) { ob = document.getElementById(target); for(var i=0; i<ob.options.length; i++) { if ( ob.options[i].text == '---------' ) { ob.selectedIndex = i; } } targ_id = "#" + target; $(targ_id).children().hide(); var drop = document.getElementById(master); var opts = target_filter[drop.options[drop.selectedIndex].value]; if (!opts) { opts = {}; } var emptyMap = {} var map = Object.create(null); for (var i = 0; i < opts.length; i++) { var j = opts[i]; map[j] = true; } for (var i = 0; i < document.getElementById(target).childNodes.length; i++) { if (document.getElementById(target).childNodes[i].value in opts && !(document.getElementById(target).childNodes[i].value in emptyMap) ) { document.getElementById(target).childNodes[i].style.display = "inherit"; } } } </script> <button onclick="submit_form();" class="btn btn-success">Confirm</button> </form> <script> //context vars var prefill_host_selection = "{{host_select_field_prefill_data|default:""|safe}}"; var prefill_purpose = "{{prefill_purpose|default:""|safe}}"; var prefill_project = "{{prefill_project|default:""|safe}}"; var prefill_hostname = "{{prefill_hostname|default:""|safe}}"; //to handle prefill function prefill_host_select_field(data) { // if(data) { make_selection(data); } } //call init functions prefill_host_select_field(prefill_host_selection); </script> {% endblock %}