From 1f1a3a016a8ca0acd1d31f0540a5181d0301c95a Mon Sep 17 00:00:00 2001
From: Nils G <nils.gondermann@ruhr-uni-bochum.de>
Date: Tue, 14 Apr 2020 12:30:00 +0200
Subject: [PATCH] Load main content dynamically via AJAX requests. (Split
 default/index into multiple views)

---
 controllers/default.py   |  4 +++
 static/css/base.css      | 49 ++++++++++++++++++++++++++++++-
 static/css/client.css    |  1 +
 static/js/ajax.js        | 13 +++++++++
 views/default/index.html | 62 +++++++++++++++++++++++-----------------
 views/default/login.html | 38 ++++++++++++++++++++++++
 6 files changed, 139 insertions(+), 28 deletions(-)
 create mode 100644 views/default/login.html

diff --git a/controllers/default.py b/controllers/default.py
index c1beb49..8f5a0c4 100644
--- a/controllers/default.py
+++ b/controllers/default.py
@@ -1,5 +1,9 @@
 from cookie_util import COOKIE_GET
 
 def index():
+    return dict()
+
+def content():
     player_record, room_record = COOKIE_GET()
+    response.view = "default/login.html"
     return dict()
diff --git a/static/css/base.css b/static/css/base.css
index f2d4fa7..9677e5f 100644
--- a/static/css/base.css
+++ b/static/css/base.css
@@ -1,7 +1,54 @@
+/* ============== Color placeholder ===================== */
+
+:root {
+  --error-bg: #FFBBBB;
+  --error-text: darkred;
+
+  --info-bg: #DDEEFF;
+  --info-text: #00004D;
+}
+
+
+/* ============== Popup ===================== */
+
+.popup {
+    border: solid 2px;
+
+    font-family: monospace;
+    font-size: 1.3em;
+    font-weight: bold;
+
+    width: 66%;
+
+    padding: 10px;
+    margin: auto;
+    margin-bottom: 50px;
+}
+
+.popup:empty {
+    display: none;
+}
+
+.popup button {
+    background-color: inherit;
+
+    border: solid 2px;
+
+    font-size: smaller;
+    color: inherit;
+
+    padding: 10px 30px 10px 30px;
+}
+
 .error {
-    color: red;
+    background-color: var(--error-bg);
+    color: var(--error-text);
 }
 
+.info {
+    background-color: var(--info-bg);
+    color: var(--info-text);
+}
 
 /* ============== Footer ===================== */
 
diff --git a/static/css/client.css b/static/css/client.css
index d8f9aa6..094d26e 100644
--- a/static/css/client.css
+++ b/static/css/client.css
@@ -1,4 +1,5 @@
 body {
     text-align: center;
     background-color: lightgrey;
+    padding-top: 50px;
 }
diff --git a/static/js/ajax.js b/static/js/ajax.js
index 4268188..f733b29 100644
--- a/static/js/ajax.js
+++ b/static/js/ajax.js
@@ -13,3 +13,16 @@ function AJAX_JSON(_url, _payload, _returnFunction) {
             }
     });
 }
+
+function AJAX_GET(_url, _returnFunction) {
+    $.ajax({
+            type: 'GET',
+            url: _url,
+            success: function(data) {
+                _returnFunction(200, data);
+            },
+            error: function(xhr, statusText, errorThrown){
+                _returnFunction(xhr.status, errorThrown);
+            }
+    });
+}
diff --git a/views/default/index.html b/views/default/index.html
index bbfaf6d..a11c2b3 100644
--- a/views/default/index.html
+++ b/views/default/index.html
@@ -4,45 +4,53 @@
 <link rel="stylesheet" type="text/css" href="{{=URL('static/css', 'client.css')}}">
 {{end}}
 
+<div id="current_error" class="popup error"></div> <!-- This will be dynamically filled when an error occurs -->
+
+<div id="current_info" class="popup info"></div> <!-- This will be dynamically filled when an info popup occurs -->
+
 <div id="current_content">
-    <form id="form_login">
-        <input type="text" id="room_code" placeholder="Room Code" maxlength="4"><br><br>
-        <input type="text" id="user_name" placeholder="User Name" maxlength="15"><br><br>
-        <span id="form_login_error" class="error"></span><br>
-        <input type="submit" value="Enter">
-    </form>
+    <!-- This will be dynamically loaded via AJAX -->
 </div>
 
 {{block page_js}}
 <script type="text/javascript">
-    $("#form_login").on("submit", function(){
-
-        $("#form_login_error").html("");
-
-        var payload = {"room_code": $("#room_code").val(), "user_name": $("#user_name").val()}
-        AJAX_JSON("{{=URL('player', 'create')}}", payload, function(_code, _data){
 
+    function content_reload(){
+        AJAX_GET("{{=URL('default', 'content')}}", function(_code, _data) {
             switch(_code){
                 case 200:
-                    break;
-                case 404:
-                    $("#form_login_error").html("Room not found or full.");
-                    break;
-                case 409:
-                    $("#form_login_error").html("Please choose a different user name.");
-                    break;
-                case 422:
-                    $("#form_login_error").html("Please provide valid values.");
-                    break;
-                case 500:
-                    $("#form_login_error").html("500 - Internal Server Error");
+                    $("#current_content").html(_data);
                     break;
                 default:
-                    $("#form_login_error").html("Error "+_code);
+                    set_error("HTTP Error "+_code+": "+_data);
             }
+        });
+    }
+
+    $(document).ready(content_reload);
+
+    //====================================
 
+    function set_popup(_id, _message){
+        if(!_message){
+            $(_id).html("");
+            return;
+        }
+        $(_id).html(_message);
+        var button = $("<button>OK</button>").click(function(){
+            $(_id).html("");
         });
-        return false;
-    });
+        $(_id).append("<br><br>");
+        $(_id).append(button);
+    }
+
+    function set_error(_message){
+        set_popup("#current_error", _message);
+    }
+
+    function set_info(_message){
+        set_popup("#current_info", _message);
+    }
+
 </script>
 {{end}}
diff --git a/views/default/login.html b/views/default/login.html
new file mode 100644
index 0000000..4a519f3
--- /dev/null
+++ b/views/default/login.html
@@ -0,0 +1,38 @@
+<form id="form_login">
+    <input type="text" id="room_code" placeholder="Room Code" maxlength="4"><br><br>
+    <input type="text" id="user_name" placeholder="User Name" maxlength="15"><br><br>
+    <input type="submit" value="Enter">
+</form>
+
+<script type="text/javascript">
+    $("#form_login").on("submit", function(){
+
+        set_error();
+
+        var payload = {"room_code": $("#room_code").val(), "user_name": $("#user_name").val()}
+        AJAX_JSON("{{=URL('player', 'create')}}", payload, function(_code, _data){
+
+            switch(_code){
+                case 200:
+                    break;
+                case 404:
+                    set_error("Room not found or full.");
+                    break;
+                case 409:
+                    set_error("Please choose a different user name.");
+                    break;
+                case 422:
+                    set_error("Please provide valid values.");
+                    break;
+                case 500:
+                    set_error("500 - Internal Server Error");
+                    break;
+                default:
+                    set_error("Error "+_code);
+            }
+
+        });
+
+        return false;
+    });
+</script>
-- 
GitLab