1 {% extends "base.html" %}
6 {% bootstrap_form_errors form type='non_fields' %}
7 <form id="quick_booking_form" action="/booking/quick/" method="POST" class="form">
9 <div class="row mx-0 px-0">
10 <div class="col-12 mx-0 px-0 mt-2">
13 Please select a host type you wish to book. Only available types are shown.
14 If something isn't working right, let us know <a href="mailto:{{contact_email}}"> here! </a>
16 {% endblock form-text %}
17 {% bootstrap_field form.filter_field show_label=False %}
20 <div class="row justify-content-center">
21 <div class="col-12 col-lg-4 my-2">
22 <div class="col border rounded py-2 h-100">
23 {% bootstrap_field form.purpose %}
24 {% bootstrap_field form.project %}
25 {% bootstrap_field form.length %}
26 <span>Days: </span><output id="daysout">0</output>
28 document.getElementById("id_length").setAttribute("oninput", "daysout.value=this.value");
29 document.getElementById("daysout").value = document.getElementById("id_length").value;
34 <div class="col-12 col-lg-4 my-2">
35 <div class="col border rounded py-2 h-100">
36 <label>Collaborators</label>
41 <div class="col-12 col-lg-4 my-2">
42 <div class="col border rounded py-2 h-100">
43 {% bootstrap_field form.hostname %}
44 {% bootstrap_field form.image %}
47 <div class="col-12 d-flex mt-2 justify-content-end">
48 <button id="quick_booking_confirm" onclick="submit_form();" type="button" class="btn btn-success">Confirm</button>
52 {% block image_script %}
53 {% endblock image_script %}
55 <script type="text/javascript">
56 function submit_form()
59 document.getElementById("quick_booking_form").submit();
62 function hide_dropdown(drop_id) {
63 var drop = document.getElementById(drop_id);
64 //select 'blank' option
65 for( var i=0; i < drop.length; i++ )
67 if ( drop.options[i].text == '---------' )
68 drop.selectedIndex = i;
72 function get_selected_value(key){
73 for( var attr in multi_filter_widget.result[key] ){
79 $(document).ready(function() {
80 $('.has-popover').popover({'trigger':'hover'});
83 var sup_image_dict = {{image_filter | safe}};
84 var sup_installer_dict = {{installer_filter | safe}};
85 var sup_scenario_dict = {{scenario_filter | safe}};
86 var resource_profile_map = {{resource_profile_map | safe}};
88 function imageFilter() {
89 var drop = document.getElementById("id_image");
90 var lab_pk = get_selected_value("lab");
91 var host_pk = get_selected_value("resource");
93 for (const childNode of drop.childNodes) {
94 var image_object = sup_image_dict[childNode.value];
95 if (image_object) //weed out empty option
97 const img_at_lab = image_object.lab == lab_pk;
98 const profiles = resource_profile_map[host_pk];
99 const img_in_template = profiles && profiles.indexOf(image_object.host_profile) > -1
100 childNode.disabled = !img_at_lab || !img_in_template;
107 Array.from(document.getElementsByClassName("grid-item-select-btn")).forEach(function (element) {
108 element.addEventListener('click', imageFilter);
111 function dropFilter(target, target_filter, master) {
112 var dropdown = document.getElementById(target);
114 hide_dropdown(target);
116 var drop = document.getElementById(master);
117 var opts = target_filter[drop.options[drop.selectedIndex].value];
122 var map = Object.create(null);
123 for (var i = 0; i < opts.length; i++) {
128 for (var i = 0; i < dropdown.childNodes.length; i++) {
129 if (dropdown.childNodes[i].value in opts && !(dropdown.childNodes[i].value in {})) {
130 dropdown.childNodes[i].style.display = "inherit";
131 dropdown.childNodes[i].disabled = false;