Merge branch 'time-selection' into v1.1
diff --git a/css/bulma-adjustments.css b/css/bulma-adjustments.css
index a722717..739591c 100644
--- a/css/bulma-adjustments.css
+++ b/css/bulma-adjustments.css
@@ -48,10 +48,6 @@
     cursor: pointer;
 }
 
-.hidden {
-    display: none;
-}
-
 #fme-maps-container h4 {
   font-weight: bold;
 }
diff --git a/index.html b/index.html
index b7cc6f7..0e65137 100644
--- a/index.html
+++ b/index.html
@@ -21,7 +21,7 @@
     <body>
         <script></script>
 
-        <span id="dev-mode" class="hidden">Dev mode</span>
+        <span id="dev-mode" class="is-hidden">Dev mode</span>
         
         <nav class="navbar is-link">
             <div class="navbar-brand">
@@ -30,56 +30,61 @@
         </nav>
         
         <section id="section-1" class="section">
-            <!--
-            <div class="field has-addons">
-                <p class="control">
-                    <button class="button">&lt;</button>
-                </p>
-                <p class="control">
-                    <input type="date" class="button">
-                </p>
-                <p class="control">
-                    <button class="button">&gt;</button>
-                </p>
-            </div>
-            <div class="field has-addons">
-                <p class="control">
-                    <button class="button">&lt;</button>
-                </p>
-                <p class="control">
-                    <input type="button" class="button" value="08:00 - 08:30">
-                </p>
-                <p class="control">
-                    <button class="button">&gt;</button>
-                </p>
-            </div><br>
-            -->
+            <nav class="level">
+                <div class="level-item">
+                    <div class="field has-addons has-addons-centered">
+                        <p class="control">
+                        <button id="date-prev" class="button">&lt;</button>
+                        </p>
+                        <p class="control">
+                        <input id="date-selector" type="button" class="button">
+                        </p>
+                        <p class="control">
+                        <button id="date-next" class="button">&gt;</button>
+                        </p>
+                    </div>
+                </div>
+                <div class="level-item">
+                    <div class="field has-addons has-addons-centered">
+                        <p class="control">
+                        <button id="time-prev" class="button">&lt;</button>
+                        </p>
+                        <p class="control">
+                        <input id="time-selector" type="button" class="button" value="08:00 - 08:30">
+                        </p>
+                        <p class="control">
+                        <button id="time-next" class="button">&gt;</button>
+                        </p>
+                    </div>
+                </div>
+            </nav>
+
             <div id="subject-container" class="grid buttons"></div>
-            <div id="no-subjects" class="hidden">No s'està impartint cap classe en aquests moments.</div>
-            <div id="fme-maps-container" class="hidden">
-              <h4>Mapes de les aules de l'FME</h4>
-              <div class="maps">
-                <div class="map">
-                  <img src="img/ps.png">
-                  <div class="map--label">Planta <b>-1</b></div>
+            <div id="no-subjects" class="is-hidden">No s'està impartint cap classe en aquests moments.</div>
+            <div id="fme-maps-container" class="is-hidden">
+                <h4>Plànols de les aules de l'FME</h4>
+                <div class="maps">
+                    <div class="map">
+                        <img src="img/ps.png">
+                        <div class="map--label">Planta <b>-1</b></div>
+                    </div>
+                    <div class="map">
+                        <img src="img/p0.png">
+                        <div class="map--label">Planta <b>0</b></div>
+                    </div>
+                    <div class="map">
+                        <img src="img/p1.png">
+                        <div class="map--label">Planta <b>1</b></div>
+                    </div>
                 </div>
-                <div class="map">
-                  <img src="img/p0.png">
-                  <div class="map--label">Planta <b>0</b></div>
-                </div>
-                <div class="map">
-                  <img src="img/p1.png">
-                  <div class="map--label">Planta <b>1</b></div>
-                </div>
-              </div>
             </div>
-            
+
         </section>
 
-        <section id="section-2" class="section hidden">
+        <section id="section-2" class="section is-hidden">
             <button class="button is-link is-light" onclick="switchSection('section-1')">Torna enrere (Classe)</button>
 
-            <!-- <div id="repeated-subject-warning" class="hidden">
+            <div id="repeated-subject-warning" class="is-hidden">
                 <br><article class="message is-warning">
                     <div class="message-body">
                         Heu triat una assignatura que es fa en dues aules alhora. Comproveu que sou a l'aula <strong id="repeated-subject-warning-class">aula</strong>.
@@ -103,9 +108,9 @@
             </div>
         </section>
 
-        <section id="section-3" class="section hidden">
+        <section id="section-3" class="section is-hidden">
             <button class="button is-link is-light" onclick="switchSection('section-2')">Torna enrere (Lletra)</button>
-            
+
             <div id="number-container" class="buttons grid">
                 <button class="button" id="number-1" data-number="1">1</button>
                 <button class="button" id="number-2" data-number="2">2</button>
@@ -119,7 +124,7 @@
                 <button class="button" id="number-10" data-number="10">10</button>
             </div>
         </section>
-        <section id="section-send" class="section hidden">
+        <section id="section-send" class="section is-hidden">
             <button class="button is-link is-light" onclick="switchSection('section-3')">Torna enrere (Número)</button>
             <br/><br/>
             <span class="has-text-weight-bold">Assignatura:</span>
@@ -134,7 +139,7 @@
             <span id="letter-final">A</span><span id="number-final">1</span><br><br>
 
             <button id="send-button" class="button is-link is-large">Omple el formulari</button><br><br>
-            
+
             Hi ha errors? <br /><a class="button is-link is-light" href="https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform">Completa el formulari manualment</a>
 
 
diff --git a/js/build_page.js b/js/build_page.js
index 6fcae69..81b76ed 100644
--- a/js/build_page.js
+++ b/js/build_page.js
@@ -1,5 +1,3 @@
-

-

 const idsFormulari = {

     room: "1063142948",

     day: "2115504093",

@@ -24,6 +22,9 @@
 

 const formBaseUrl = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform";

 

+const MIN_HOUR = 8;

+const MAX_HOUR = 23; // Pels altres graus de la Facultat

+

 var final_JSON = {

     "class": null,

     "number": "",

@@ -33,6 +34,8 @@
 var current_section = "section-1";

 

 var repeated_subjects;

+var current_time;

+

 

 function fillInSummary() {

     var begins = new Date(parseInt(final_JSON.class.begins)*1000);

@@ -41,7 +44,7 @@
     document.getElementById('subject-final').textContent = final_JSON.class.friendly_name || final_JSON.class.calendar_name;

     document.getElementById('classroom-final').textContent = final_JSON.class.room;

     document.getElementById('date-final').textContent = begins.toLocaleDateString();

-    document.getElementById('time-final').textContent = formatDate(begins) + ' - ' + formatDate(ends);

+    document.getElementById('time-final').textContent = formatTime(begins) + ' - ' + formatTime(ends);

     document.getElementById('letter-final').textContent = final_JSON.letter;

     document.getElementById('number-final').textContent = final_JSON.number;

 }

@@ -59,10 +62,10 @@
         final_JSON["class"] = selectedClass;

         // Missatge advertència classe repetida

         if (repeated_subjects.has(selectedClass.id)) {

-            document.getElementById('repeated-subject-warning').classList.remove('hidden');

+            document.getElementById('repeated-subject-warning').classList.remove('is-hidden');

             document.getElementById('repeated-subject-warning-class').textContent = selectedClass.room;

         } else {

-            document.getElementById('repeated-subject-warning').classList.add('hidden');

+            document.getElementById('repeated-subject-warning').classList.add('is-hidden');

         }

         // Anchor següent pregunta

         switchSection("section-2");

@@ -89,8 +92,8 @@
 

 function switchSection(s) {

     setTimeout(function(){ 

-        document.getElementById(current_section).classList.add('hidden');

-        document.getElementById(s).classList.remove('hidden');

+        document.getElementById(current_section).classList.add('is-hidden');

+        document.getElementById(s).classList.remove('is-hidden');

         current_section = s;

     }, 75);

 }

@@ -169,7 +172,7 @@
         document.getElementById("subject-container").appendChild(classeDiv);

         ++duplicateSubjectCounter;

     }

-

+  

     var elements = document.getElementsByClassName("button");

     Array.from(elements).forEach(function(element) {

         element.addEventListener('click', clickButton);

@@ -182,29 +185,117 @@
     });

 }

 

-function formatDate(d) {

-    var str = "";

+function getDefaultTime() {

+    var time = new Date();

+    time.setSeconds(0);

+    time.setMilliseconds(0);

+    if (time.getMinutes() < 30) time.setMinutes(0);

+    else time.setMinutes(30);

+    if (time.getHours() < MIN_HOUR) {

+        time.setHours(MIN_HOUR);

+        time.setMinutes(0);

+    }

+    if (time.getHours() >= MAX_HOUR) {

+        time.setHours(MAX_HOUR - 1);

+        time.setMinutes(30);

+    }

+    return time

+}

+

+function buildTimeSelector(date) {

+    document.getElementById("date-selector").value = formatDate(date);

+    var end_time = new Date(date.getTime() + 30*60000);  // 1 min = 60000 ms

+    document.getElementById("time-selector").value = formatTime(date) + " - " + formatTime(end_time);

+}

+

+function addDateEventListeners(date) {

+    document.getElementById("date-prev").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() - 24*60*60000);

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+    document.getElementById("date-next").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() + 24*60*60000);

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+    document.getElementById("time-prev").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() - 30*60000);

+        if (current_time.getHours() < MIN_HOUR) {

+            current_time = new Date(current_time.getTime() - 24*60*60000);

+            current_time.setHours(MAX_HOUR - 1);

+            current_time.setMinutes(30);

+        }

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+    document.getElementById("time-next").addEventListener('click', function (el) {

+        current_time = new Date(current_time.getTime() + 30*60000);

+        if (current_time.getHours() >= MAX_HOUR) {

+            current_time = new Date(current_time.getTime() + 24*60*60000);

+            current_time.setHours(MIN_HOUR);

+            current_time.setMinutes(0);

+        }

+        buildTimeSelector(current_time);

+        fetchClasses();

+    });

+}

+

+function formatTime(d) {

+    return d.toLocaleTimeString("ca", {timeStyle: 'short'});

+    /* var str = "";

     str += d.getHours();

     str += ":";

     if (d.getMinutes() < 10) str += "0";

-    str += d.getMinutes();

-    return str;

+     str += d.getMinutes();

+    return str; */

+}

+

+function formatDate(d) {

+    return d.toLocaleDateString("ca");

+}

+

+function fetchClasses() {

+    console.log(api_url + "getClassesInTime/" + current_time.getTime()/1000);

+    fetch(api_url + "getClassesInTime/" + current_time.getTime()/1000, {

+        "mode": "cors",

+        "credentials": "include"

+    })

+        .then(response => response.json())

+        .then(data => {

+            if (data.payload.classes.length == 0) {

+                document.getElementById('no-subjects').classList.remove('is-hidden');

+                document.getElementById('subject-container').classList.add('is-hidden');

+                document.getElementById('fme-maps-container').classList.add('is-hidden');

+            } else {

+                repeated_subjects = findRepeatedSubjects(data.payload.classes);

+                buildSubjectContainer(data.payload.classes, repeated_subjects);

+                document.getElementById('no-subjects').classList.add('is-hidden');

+                document.getElementById('subject-container').classList.remove('is-hidden');

+                document.getElementById('fme-maps-container').classList.remove('is-hidden');

+            }

+

+        });

 }

 

 function onPageLoad() {

 

-    // Check if devMode is on

+    // Check if user is signed in

     if (localStorage.getItem('devMode') == 'true') {

         var banner = document.getElementById('dev-mode');

         banner.addEventListener('click', _ => {

             localStorage.devMode = 'false';

             location.reload();

         });

-        banner.classList.remove('hidden');

+        banner.classList.remove('is-hidden');

         api_url = localStorage.getItem('apiUrl') || 'https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/'

     } else {

         api_url = "https://covid-tracability-backend-prod.sandbox.avm99963.com/api/v1/";

     }

+

+    current_time = getDefaultTime();

+    buildTimeSelector(current_time);

+

     fetch(api_url + "isSignedIn", {

         "mode": "cors",

         "credentials": "include"

@@ -226,21 +317,7 @@
             }

         });

 

-    fetch(api_url + "getCurrentClasses", {

-        "mode": "cors",

-        "credentials": "include"

-    })

-        .then(response => response.json())

-        .then(data => {

-            if (data.payload.classes.length == 0) {

-                document.getElementById('no-subjects').classList.remove('hidden');

-            } else {

-                repeated_subjects = findRepeatedSubjects(data.payload.classes);

-                buildSubjectContainer(data.payload.classes, repeated_subjects);

-                document.getElementById('fme-maps-container').classList.remove('hidden');

-            }

-

-        });

+    fetchClasses();

 }

 

 function sendForm() {

@@ -263,8 +340,8 @@
             var params = new URLSearchParams();

             params.append("entry." + idsFormulari.room, final_JSON.class.room); // class, number, letter

             params.append("entry." + idsFormulari.day, begins.getFullYear().toString() + '-' + (begins.getMonth() + 1).toString().padStart(2, "0") + '-' + begins.getDate().toString().padStart(2, "0"));

-            params.append("entry." + idsFormulari.begins, formatDate(begins));

-            params.append("entry." + idsFormulari.ends, formatDate(ends));

+            params.append("entry." + idsFormulari.begins, formatTime(begins));

+            params.append("entry." + idsFormulari.ends, formatTime(ends));

             params.append("entry." + idsFormulari.rows[final_JSON.letter], 'Columna ' + final_JSON.number);

             // params.append("entry." + idsFormulari.notes, '[Autogenerat per delefme/covid-tracability -- Assignatura seleccionada: ' + (final_JSON.class.friendly_name || final_JSON.class.calendar_name) + ']');

 

@@ -293,6 +370,8 @@
         document.getElementById("send-button").classList.add('is-loading');

         sendForm();

     });

+

+    addDateEventListeners();

 }

 

 addEventListeners();