diff options
Diffstat (limited to 'templates')
-rw-r--r-- | templates/main/jams/index.html | 9 | ||||
-rw-r--r-- | templates/main/jams/team_list.html | 93 | ||||
-rw-r--r-- | templates/main/jams/team_view.html | 291 | ||||
-rw-r--r-- | templates/main/navigation.html | 6 | ||||
-rw-r--r-- | templates/staff/jams/create.html | 6 | ||||
-rw-r--r-- | templates/staff/jams/edit_basics.html | 6 | ||||
-rw-r--r-- | templates/staff/jams/edit_ending.html | 128 | ||||
-rw-r--r-- | templates/staff/jams/edit_info.html | 256 | ||||
-rw-r--r-- | templates/staff/jams/forms/preamble_edit.html | 128 | ||||
-rw-r--r-- | templates/staff/jams/index.html | 2 | ||||
-rw-r--r-- | templates/staff/tables/edit.html | 18 |
11 files changed, 675 insertions, 268 deletions
diff --git a/templates/main/jams/index.html b/templates/main/jams/index.html index 8e6985c6..9a228b74 100644 --- a/templates/main/jams/index.html +++ b/templates/main/jams/index.html @@ -72,8 +72,13 @@ </a> {% endif %} {% else %} + {% if jam.teams and jam.teams | length > 0 %} + <a class="uk-button uk-button-primary" href="{{ url_for('main.jams.jam_team_list', jam_id=jam.number) }}"> + <i class="uk-icon fa-fw far fa-users"></i> Teams + </a> + {% endif %} <a class="uk-button uk-button-default" target="_blank" href="{{ jam.repo }}"> - <i class="uk-icon fa-fw fab fa-gitlab"></i> Repository + <i class="uk-icon fa-fw fab fa-gitlab"></i> </a> {% endif %} </span> @@ -101,7 +106,7 @@ </span> {% if jam.state in ["running", "judging", "finished"] %} - <span class="uk-label uk-align-right"> + <span class="uk-label uk-align-right theme-label"> Theme: {{ jam.theme }} </span> {% endif %} diff --git a/templates/main/jams/team_list.html b/templates/main/jams/team_list.html new file mode 100644 index 00000000..65d58f8a --- /dev/null +++ b/templates/main/jams/team_list.html @@ -0,0 +1,93 @@ +{% extends "main/base.html" %} + +{% block title %} + {% if user_teams %} + Code Jams | My Teams + {% else %} + Code Jams | Code Jam {{ jam.number }} Teams + {% endif %} +{% endblock %} +{% block og_title %} + {% if user_teams %} + Code Jams | My Teams + {% else %} + Code Jams | Code Jam {{ jam.number }} Teams + {% endif %} +{% endblock %} + +{% block page_classes %}jam-team-list{% endblock %} + +{% block content %} + <div class="uk-section"> + <div class="uk-container"> + <h1 class="uk-header uk-article-title uk-heading-divider"> + {% if user_teams %} + Code Jams: My Teams + {% else %} + Code Jam {{ jam.number }}: Teams + {% endif %} + </h1> + {% if not user_teams %} + <p> + <a id="back" class="uk-button uk-button-default" href="{{ url_for("main.jams.index") }}"> + <i class="uk-icon fa-fw far fa-arrow-left"></i> All Jams + </a> + </p> + {% endif %} + {% if teams %} + <div class="uk-flex uk-flex-row uk-flex-wrap uk-flex-center team-list-cards"> + {% for team in teams %} + <div class="uk-card uk-card-default uk-margin-small-bottom uk-margin-small-right uk-margin-small-top uk-margin-small-left + {% if not user_teams and logged_in and user.user_id in member_ids(team.members) %} + team-card-own + {% endif %} + "> + <div class="uk-card-body"> + <div class="uk-card-title"> + Team <strong>{{ team.name }}</strong> + {% if user_teams %} + <p class="uk-article-meta team-subtitle"> + Code Jam {{ team.jam.number }} + </p> + {% endif %} + </div> + <div class="team-member-avatars"> + {% for member in team.members %} + <a href="https://discordapp.com/users/{{ member.user_id }}" + title="{{ member.username }}#{{ member.discriminator }}" + target="_blank" + class="team-member-avatar-link"> + <img src="{{ member.avatar }}" class="team-member-avatar uk-border-circle"/> + </a> + {% endfor %} + </div> + <div class="team-links"> + <a href="{{ url_for('main.jams.team_view', team_id=team.id) }}" + class="uk-button uk-button-primary"> + <i class="uk-icon fa-fw far fa-eye"></i> View + </a> + {% if team.repo %} + <a href="https://gitlab.com/{{ team.repo }}" target="_blank" + class="uk-button uk-button-default"> + <i class="uk-icon fa-fw fab fa-gitlab"></i> + </a> + {% else %} + <a href="#" target="_blank" class="uk-button uk-button-darkish uk-disabled"> + <i class="uk-icon fa-fw fab fa-gitlab"></i> + </a> + {% endif %} + </div> + </div> + </div> + {% endfor %} + </div> + {% else %} + {% if user_teams %} + <p>You are not part of any team.</p> + {% else %} + <p>There are no teams in this jam.</p> + {% endif %} + {% endif %} + </div> + </div> +{% endblock %} diff --git a/templates/main/jams/team_view.html b/templates/main/jams/team_view.html new file mode 100644 index 00000000..0554c3d4 --- /dev/null +++ b/templates/main/jams/team_view.html @@ -0,0 +1,291 @@ +{% extends "main/base.html" %} +{% block title %}Team {{ team.name }}{% endblock %} +{% block og_title %}Team {{ team.name }}{% endblock %} + +{% block page_classes %}jam-team-view{% endblock %} + +{% block content %} + <div class="uk-section"> + <div class="uk-container uk-container-small"> + <h1 class="uk-header uk-article-title"> + Team <strong>{{ team.name }}</strong> + </h1> + <p class="uk-article-meta"> + Code Jam {{ team.jam.number }} + </p> + <p> + <a href="{{ url_for('main.jams.jam_team_list', jam_id=team.jam.number) }}" + class="uk-button uk-button-default"> + <i class="uk-icon fa-fw far fa-users"></i> Competing Teams + </a> + {% if logged_in %} + <a href="{{ url_for('main.jams.user_team_list') }}" + class="uk-button uk-button-default"> + <i class="uk-icon fa-fw far fa-user"></i> My Teams + </a> + {% endif %} + </p> + + <div class="uk-grid"> + <div class="uk-width-1-2@m"> + <h2> + Team Members + </h2> + <div class="participant-card-list"> + {% for member in team.members %} + <div class="participant-card uk-card-default"> + <a href="https://discordapp.com/users/{{ member.user_id }}" target="_blank" + class="participant-avatar-link"> + <img src="{{ member.avatar }}" class="uk-border-circle participant-avatar"> + </a> + <strong>{{ member.username }}#{{ member.discriminator }}</strong> + <div class="participant-links"> + <a href="https://gitlab.com/{{ member.gitlab_username }}" target="_blank" + class="uk-button uk-button-default"> + <i class="uk-icon fa-fw fab fa-gitlab"></i> + </a> + </div> + </div> + {% endfor %} + </div> + </div> + <div class="uk-width-1-2@m"> + <h2> + Activity + </h2> + <p> + {% if team.repo %} + <a href="https://gitlab.com/{{ team.repo }}" target="_blank" + class="uk-button uk-button-primary"> + <i class="uk-icon fa-fw fab fa-gitlab"></i> View on GitLab + </a> + {% else %} + <a href="https://gitlab.com/{{ team.repo }}" target="_blank" id="view-repo-button" + class="uk-button uk-button-darkish uk-disabled"> + <i class="uk-icon fa-fw fab fa-gitlab"></i> View on GitLab + </a> + {% endif %} + {% if is_own_team %} + <a class="uk-button uk-button-default" id="edit-repo-button"> + <i class="uk-icon fa-fw far fa-pencil"></i> + </a> + {% endif %} + </p> + <div id="gitlab-activity" class="gitlab-activity uk-card-default + {% if not team.repo %} + uk-hidden + {% endif %} + "> + <div id="gitlab-activity-loading" class="gitlab-activity-loading"> + <div class="gitlab-activity-loading-content"> + <p> + Loading GitLab activity, hang tight... + </p> + <div uk-spinner class="gitlab-activity-spinner"></div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + {% if is_own_team %} + <div id="repo-modal" class="uk-flex-top" uk-modal> + <div class="uk-modal-dialog"> + <button class="uk-modal-close-default" type="button" uk-close></button> + + <div class="uk-modal-header"> + <h2 class="uk-modal-title">Edit Repository</h2> + </div> + <form> + <input type="hidden" name="csrf_token" id="csrf_token" value="{{ csrf_token() }}"/> + <div class="uk-modal-body"> + <p> + Enter your team's GitLab repository URL in the field below. + </p> + <p> + Note: it should be a fork of the jam's GitLab repository + (<strong>{{ team.jam.repo }}</strong>). + </p> + <div class="uk-form-horizontal"> + <div> + <div class="uk-form-label"> + <label class="uk-form-label" for="repo-url">Repository URL</label> + </div> + + <div class="uk-form-controls uk-form-controls-text"> + <input class="uk-input" type="text" name="repo-url" id="repo-url" + value="https://gitlab.com/{{ team.repo }}" required> + </div> + </div> + </div> + </div> + + <div class="uk-modal-footer"> + <div class="uk-text-center"> + <button class="uk-button uk-button-default uk-modal-close" type="button" id="repo-cancel"> + <i class="uk-icon fa-fw far fa-arrow-left"></i> Cancel + </button> + <a class="uk-button uk-button-primary" id="repo-submit"> + <i class="uk-icon fa-fw far fa-check"></i> Save + </a> + </div> + </div> + </form> + </div> + </div> + {% endif %} + <script type="application/javascript"> + "use strict"; + + {% if is_own_team %} + /* Modal */ + + const csrf_token = "{{ csrf_token() }}"; + const repo_edit_target = "{{ url_for('main.jams.team.edit_repo', team_id=team.id) }}"; + const repo_modal = UIkit.modal(document.getElementById("repo-modal")); + const repo_cancel = document.getElementById("repo-cancel"); + const repo_submit = document.getElementById("repo-submit"); + const repo_url = document.getElementById("repo-url"); + const repo_edit_button = document.getElementById("edit-repo-button"); + + repo_cancel.onclick = function () { + repo_modal.hide(); + }; + + repo_edit_button.onclick = () => { + repo_modal.show(); + }; + + function editTeamRepoURL(repo, callback) { + $.ajax(repo_edit_target, { + "data": {"repo_url": repo}, + "dataType": "json", + "headers": {"X-CSRFToken": csrf_token}, + "method": "POST", + }).done(data => { + if ("error_code" in data) { + return callback(false, data); + } + + return callback(true, data); + }).fail((xhr) => callback(false, xhr["responseJSON"])); + } + + repo_submit.onclick = () => { + repo_submit.classList.add("uk-disabled"); + let repo = repo_url.value; + editTeamRepoURL(repo, (success, data) => { + repo_submit.classList.remove("uk-disabled"); + if (success) { + UIkit.notification({ + "message": "Edited repository successfully", + "status": "success", + "pos": "bottom-center", + "timeout": 5000, + }); + + GITLAB_PROJECT_ID = data["project_path"]; + repo_modal.hide(); + resetGitLabActivity(); + } else { + console.log(data); + let message = (data && "error_message" in data) ? `Failed: ${data["error_message"]}` : "Failed to edit repository."; + UIkit.notification({ + "message": message, + "status": "danger", + "pos": "bottom-center", + "timeout": 5000 + }); + } + }); + }; + + {% endif %} + + + /* GitLab activity */ + + function resetGitLabActivity() { + $("#gitlab-activity-events").remove(); + $("#gitlab-activity-loading").show(); + $("#gitlab-activity").removeClass("uk-hidden"); + $("#view-repo-button").attr("href", `https://gitlab.com/${GITLAB_PROJECT_ID}`) + .removeClass("uk-button-darkish") + .removeClass("uk-disabled") + .addClass("uk-button-primary"); + loadGitLabActivity(); + } + + let GITLAB_PROJECT_ID = "{{ team.repo }}"; // the gitlab project id + function loadGitLabActivity() { + const GITLAB_EVENT_ACTIONS = ["pushed"]; // the actions to filter in the event list + const JAM_START_DATE = "{{ day_delta(team.jam.date_start, -1).strftime("%Y-%m-%d") }}"; // the start date of the jam, in order to ignore pushes prior to start + const JAM_END_DATE = "{{ day_delta(team.jam.date_end, +1).strftime("%Y-%m-%d") }}"; // the end date of the jam, in order to ignore pushes after the end + const GITLAB_PROJECT_EVENTS_ENDPOINT = () => `https://gitlab.com/api/v4/projects/${encodeURIComponent(GITLAB_PROJECT_ID)}/events?action=${GITLAB_EVENT_ACTIONS.join(",")}&after=${JAM_START_DATE}&before=${JAM_END_DATE}`; + const GITLAB_ACCEPTED_ACTIONS = ["pushed", "created"]; + + function gitlabBranchURL(branch) { + return `https://gitlab.com/${GITLAB_PROJECT_ID}/tree/${branch}` + } + + function gitlabCommitURL(commit) { + return `https://gitlab.com/${GITLAB_PROJECT_ID}/commit/${commit}` + } + + function onEventsLoaded(events) { + $("#gitlab-activity-loading").hide(); + + let eventList = $("<div id=\"gitlab-activity-events\"></div>") + .addClass("gitlab-activity-events"); + + let eventCount = 0; + for (let i = 0; i < events.length; i++) { + let event = events[i]; + if (!GITLAB_ACCEPTED_ACTIONS.includes(event["push_data"]["action"])) { + continue; + } + let commit = event["push_data"]["commit_to"]; + let branch = event["push_data"]["ref"]; + let eventDate = Date.parse(event["created_at"]); + let eventElement = $( + "" + + "<div class=\"gitlab-activity-event-item\">" + + "<div class=\"gitlab-activity-event-item-content\">" + + `<span><strong>${event["author"]["username"]}</strong> pushed: "${event["push_data"]["commit_title"]}"</span>` + + "<br>" + + `<a target=\"blank\" href=\"${gitlabCommitURL(commit)}\" class=\"pasta\">${commit.substring(0, 8)}</a>` + + `<a target=\"blank\" href=\"${gitlabBranchURL(branch)}\" class=\"pasta\"><i class="uk-icon fa-fw far fa-code-branch"></i> ${branch}</a>` + + `` + + "</div>" + + "</div>" + ); + eventList.append(eventElement); + eventCount++; + } + + let footerMessage = eventCount > 0 ? "We've reached the end!" : "There is no activity to show at this time."; + + // add the footer + let eventListFooter = $( + "" + + "<div class=\"gitlab-activity-events-footer\">" + + `<span>${footerMessage}</span>` + + "</div>" + ).appendTo(eventList); + + $("#gitlab-activity").append(eventList); + } + + function onEventsFailed(xhr) { + console.error(xhr); + } + + $.get( + GITLAB_PROJECT_EVENTS_ENDPOINT() + ).done(onEventsLoaded).fail(onEventsFailed); + } + + window.onload = loadGitLabActivity; + </script> +{% endblock %} diff --git a/templates/main/navigation.html b/templates/main/navigation.html index cd5b967f..a32ac1c1 100644 --- a/templates/main/navigation.html +++ b/templates/main/navigation.html @@ -143,6 +143,12 @@ <li><a href="{{ url_for('main.jams.profile') }}">My Profile</a></li> {% endif %} + {% if current_page == "main.jams.user_team_list" %} + <li class="uk-active"><a href="{{ url_for('main.jams.user_team_list') }}">My Teams</a></li> + {% else %} + <li><a href="{{ url_for('main.jams.user_team_list') }}">My Teams</a></li> + {% endif %} + <li class="uk-nav-divider"></li> {% if current_page.startswith("main.about.privacy") %} diff --git a/templates/staff/jams/create.html b/templates/staff/jams/create.html index 49a8b615..c19addd3 100644 --- a/templates/staff/jams/create.html +++ b/templates/staff/jams/create.html @@ -70,7 +70,9 @@ </div> <script type="application/javascript"> - const date_start = flatpickr("#date_start", {enableTime: true, altInput: true}); - const date_end = flatpickr("#date_end", {enableTime: true, altInput: true}); + window.onload = () => { + const date_start = flatpickr("#date_start", {enableTime: true, altInput: true}); + const date_end = flatpickr("#date_end", {enableTime: true, altInput: true}); + } </script> {% endblock %} diff --git a/templates/staff/jams/edit_basics.html b/templates/staff/jams/edit_basics.html index c6d9753f..1208e5d2 100644 --- a/templates/staff/jams/edit_basics.html +++ b/templates/staff/jams/edit_basics.html @@ -71,7 +71,9 @@ </div> <script type="application/javascript"> - const date_start = flatpickr("#date_start", {enableTime: true, altInput: true}); - const date_end = flatpickr("#date_end", {enableTime: true, altInput: true}); + window.onload = () => { + const date_start = flatpickr("#date_start", {enableTime: true, altInput: true}); + const date_end = flatpickr("#date_end", {enableTime: true, altInput: true}); + } </script> {% endblock %} diff --git a/templates/staff/jams/edit_ending.html b/templates/staff/jams/edit_ending.html index 4e70776e..a0c5e8ff 100644 --- a/templates/staff/jams/edit_ending.html +++ b/templates/staff/jams/edit_ending.html @@ -64,87 +64,89 @@ <script type="application/javascript"> "use strict"; - let csrf_token = "{{ csrf_token() }}"; - let modal = UIkit.modal(document.getElementById("preview-modal")); - let preview_url = "{{ url_for("staff.render") }}"; + window.onload = () => { + let csrf_token = "{{ csrf_token() }}"; + let modal = UIkit.modal(document.getElementById("preview-modal")); + let preview_url = "{{ url_for("staff.render") }}"; + + function do_preview(callback) { + let oReq = new XMLHttpRequest(); + + oReq.addEventListener("load", function () { + let response = JSON.parse(this.responseText); + + if (response.error !== undefined) { + document.getElementById("done").disabled = true; + + if (response.error_lines !== undefined) { + editor.session.setAnnotations(response.error_lines); + document.getElementById("preview-div").innerHTML = "<h3>Error - see editor margin</h3>"; + } else { + console.log("Error: " + response.error); + document.getElementById("preview-div").innerHTML = "<h3>Error</h3><p>" + response.error + "<p>"; + } + } else { + document.getElementById("done").disabled = false; + document.getElementById("preview-div").innerHTML = response.data; - function do_preview(callback) { - let oReq = new XMLHttpRequest(); + editor.session.setAnnotations([]); + } - oReq.addEventListener("load", function() { - let response = JSON.parse(this.responseText); + if (callback !== undefined) { + callback(); + } + }); - if (response.error !== undefined) { + let data = editor.getValue(); + + if (data.replace("\s", "").length < 1) { document.getElementById("done").disabled = true; - if (response.error_lines !== undefined) { - editor.session.setAnnotations(response.error_lines); - document.getElementById("preview-div").innerHTML ="<h3>Error - see editor margin</h3>"; - } else { - console.log("Error: " + response.error); - document.getElementById("preview-div").innerHTML ="<h3>Error</h3><p>" + response.error + "<p>"; + if (callback !== undefined) { + UIkit.notification({ + "message": "Please enter some text to preview", + "status": "danger", + "pos": "bottom-center", + "timeout": 5000 + }); } - } else { - document.getElementById("done").disabled = false; - document.getElementById("preview-div").innerHTML = response.data; - - editor.session.setAnnotations([]); + return false; } - if (callback !== undefined) { - callback(); - } - }); + oReq.open("POST", preview_url); - let data = editor.getValue(); + oReq.setRequestHeader("Content-type", "application/json"); + oReq.setRequestHeader("X-CSRFToken", csrf_token); - if (data.replace("\s", "").length < 1) { - document.getElementById("done").disabled = true; + oReq.send(JSON.stringify({"data": editor.getValue()})); - if (callback !== undefined) { - UIkit.notification({ - "message": "Please enter some text to preview", - "status": "danger", - "pos": "bottom-center", - "timeout": 5000 - }); - } return false; } - oReq.open("POST", preview_url); + document.getElementById("preview").onclick = function () { + do_preview(function () { + modal.show(); + }) + }; - oReq.setRequestHeader("Content-type", "application/json"); - oReq.setRequestHeader("X-CSRFToken", csrf_token); + let editor = ace.edit("editor"); + let timer; - oReq.send(JSON.stringify({"data": editor.getValue()})); + editor.session.setMode("ace/mode/rst"); + editor.session.setUseWrapMode(true); - return false; - } + editor.setTheme("ace/theme/iplastic"); + editor.setShowPrintMargin(false); - document.getElementById("preview").onclick = function() { - do_preview(function() { - modal.show(); - }) - }; - - let editor = ace.edit("editor"); - let timer; - - editor.session.setMode("ace/mode/rst"); - editor.session.setUseWrapMode(true); - - editor.setTheme("ace/theme/iplastic"); - editor.setShowPrintMargin(false); - - editor.on("input", function() { - document.getElementById("done").disabled = true; - document.getElementById("end_rst").value = editor.getValue(); + editor.on("input", function () { + document.getElementById("done").disabled = true; + document.getElementById("end_rst").value = editor.getValue(); - if (timer !== undefined) { - clearTimeout(timer); - } - timer = setTimeout(do_preview, 1000); - }); + if (timer !== undefined) { + clearTimeout(timer); + } + timer = setTimeout(do_preview, 1000); + }); + }; </script> {% endblock %} diff --git a/templates/staff/jams/edit_info.html b/templates/staff/jams/edit_info.html index 471f7aaf..75df1957 100644 --- a/templates/staff/jams/edit_info.html +++ b/templates/staff/jams/edit_info.html @@ -133,175 +133,177 @@ <script type="application/javascript"> "use strict"; - let csrf_token = "{{ csrf_token() }}"; - let info_modal = UIkit.modal(document.getElementById("preview-info-modal")); - let task_modal = UIkit.modal(document.getElementById("preview-task-modal")); - let preview_url = "{{ url_for("staff.render") }}"; + window.onload = () => { + let csrf_token = "{{ csrf_token() }}"; + let info_modal = UIkit.modal(document.getElementById("preview-info-modal")); + let task_modal = UIkit.modal(document.getElementById("preview-task-modal")); + let preview_url = "{{ url_for("staff.render") }}"; + + function do_preview_info(callback) { + let oReq = new XMLHttpRequest(); + + oReq.addEventListener("load", function () { + let response = JSON.parse(this.responseText); + + if (response.error !== undefined) { + document.getElementById("done").disabled = true; + + if (response.error_lines !== undefined) { + info_editor.session.setAnnotations(response.error_lines); + document.getElementById("preview-info-div").innerHTML = "<h3>Error - see editor margin</h3>"; + } else { + console.log("Error: " + response.error); + document.getElementById("preview-info-div").innerHTML = "<h3>Error</h3><p>" + response.error + "<p>"; + } + } else { + document.getElementById("done").disabled = false; + document.getElementById("preview-info-div").innerHTML = response.data; - function do_preview_info(callback) { - let oReq = new XMLHttpRequest(); + info_editor.session.setAnnotations([]); + } - oReq.addEventListener("load", function() { - let response = JSON.parse(this.responseText); + if (callback !== undefined) { + callback(); + } + }); - if (response.error !== undefined) { + let data = info_editor.getValue(); + + if (data.replace("\s", "").length < 1) { document.getElementById("done").disabled = true; - if (response.error_lines !== undefined) { - info_editor.session.setAnnotations(response.error_lines); - document.getElementById("preview-info-div").innerHTML ="<h3>Error - see editor margin</h3>"; - } else { - console.log("Error: " + response.error); - document.getElementById("preview-info-div").innerHTML ="<h3>Error</h3><p>" + response.error + "<p>"; + if (callback !== undefined) { + UIkit.notification({ + "message": "Please enter some text to preview", + "status": "danger", + "pos": "bottom-center", + "timeout": 5000 + }); } - } else { - document.getElementById("done").disabled = false; - document.getElementById("preview-info-div").innerHTML = response.data; - - info_editor.session.setAnnotations([]); + return false; } - if (callback !== undefined) { - callback(); - } - }); + oReq.open("POST", preview_url); - let data = info_editor.getValue(); + oReq.setRequestHeader("Content-type", "application/json"); + oReq.setRequestHeader("X-CSRFToken", csrf_token); - if (data.replace("\s", "").length < 1) { - document.getElementById("done").disabled = true; + oReq.send(JSON.stringify({"data": data})); - if (callback !== undefined) { - UIkit.notification({ - "message": "Please enter some text to preview", - "status": "danger", - "pos": "bottom-center", - "timeout": 5000 - }); - } return false; } - oReq.open("POST", preview_url); + function do_preview_task(callback) { + let oReq = new XMLHttpRequest(); - oReq.setRequestHeader("Content-type", "application/json"); - oReq.setRequestHeader("X-CSRFToken", csrf_token); + oReq.addEventListener("load", function () { + let response = JSON.parse(this.responseText); - oReq.send(JSON.stringify({"data": data})); + if (response.error !== undefined) { + document.getElementById("done").disabled = true; - return false; - } + if (response.error_lines !== undefined) { + task_editor.session.setAnnotations(response.error_lines); + document.getElementById("preview-task-div").innerHTML = "<h3>Error - see editor margin</h3>"; + } else { + console.log("Error: " + response.error); + document.getElementById("preview-task-div").innerHTML = "<h3>Error</h3><p>" + response.error + "<p>"; + } + } else { + document.getElementById("done").disabled = false; + document.getElementById("preview-task-div").innerHTML = response.data; - function do_preview_task(callback) { - let oReq = new XMLHttpRequest(); + task_editor.session.setAnnotations([]); + } - oReq.addEventListener("load", function() { - let response = JSON.parse(this.responseText); + if (callback !== undefined) { + callback(); + } + }); - if (response.error !== undefined) { + let data = task_editor.getValue(); + + if (data.replace("\s", "").length < 1) { document.getElementById("done").disabled = true; - if (response.error_lines !== undefined) { - task_editor.session.setAnnotations(response.error_lines); - document.getElementById("preview-task-div").innerHTML ="<h3>Error - see editor margin</h3>"; - } else { - console.log("Error: " + response.error); - document.getElementById("preview-task-div").innerHTML ="<h3>Error</h3><p>" + response.error + "<p>"; + if (callback !== undefined) { + UIkit.notification({ + "message": "Please enter some text to preview", + "status": "danger", + "pos": "bottom-center", + "timeout": 5000 + }); } - } else { - document.getElementById("done").disabled = false; - document.getElementById("preview-task-div").innerHTML = response.data; - - task_editor.session.setAnnotations([]); + return false; } - if (callback !== undefined) { - callback(); - } - }); + oReq.open("POST", preview_url); - let data = task_editor.getValue(); + oReq.setRequestHeader("Content-type", "application/json"); + oReq.setRequestHeader("X-CSRFToken", csrf_token); - if (data.replace("\s", "").length < 1) { - document.getElementById("done").disabled = true; + oReq.send(JSON.stringify({"data": data})); - if (callback !== undefined) { - UIkit.notification({ - "message": "Please enter some text to preview", - "status": "danger", - "pos": "bottom-center", - "timeout": 5000 - }); - } return false; } - oReq.open("POST", preview_url); - - oReq.setRequestHeader("Content-type", "application/json"); - oReq.setRequestHeader("X-CSRFToken", csrf_token); + document.getElementById("preview-task-button").onclick = function () { + do_preview_task(function () { + task_modal.show(); + }) + }; - oReq.send(JSON.stringify({"data": data})); + document.getElementById("preview-info-button").onclick = function () { + do_preview_info(function () { + info_modal.show(); + }) + }; - return false; - } + document.getElementById("theme").oninput = function () { + document.getElementById("preview-task-theme").textContent = this.value; + document.getElementById("preview-info-theme").textContent = this.value; + }; - document.getElementById("preview-task-button").onclick = function() { - do_preview_task(function() { - task_modal.show(); - }) - }; - - document.getElementById("preview-info-button").onclick = function() { - do_preview_info(function() { - info_modal.show(); - }) - }; - - document.getElementById("theme").oninput = function() { - document.getElementById("preview-task-theme").textContent = this.value; - document.getElementById("preview-info-theme").textContent = this.value; - }; - - document.getElementById("repo").oninput = function() { - document.getElementById("preview-task-url").href = this.value; - document.getElementById("preview-info-url").href = this.value; - }; + document.getElementById("repo").oninput = function () { + document.getElementById("preview-task-url").href = this.value; + document.getElementById("preview-info-url").href = this.value; + }; - let info_editor = ace.edit("info_editor"); - let task_editor = ace.edit("task_editor"); - let info_timer, task_timer; + let info_editor = ace.edit("info_editor"); + let task_editor = ace.edit("task_editor"); + let info_timer, task_timer; - info_editor.session.setMode("ace/mode/rst"); - info_editor.session.setUseWrapMode(true); + info_editor.session.setMode("ace/mode/rst"); + info_editor.session.setUseWrapMode(true); - info_editor.setTheme("ace/theme/iplastic"); - info_editor.setShowPrintMargin(false); + info_editor.setTheme("ace/theme/iplastic"); + info_editor.setShowPrintMargin(false); - info_editor.on("input", function() { - document.getElementById("done").disabled = true; - document.getElementById("info_rst").value = info_editor.getValue(); + info_editor.on("input", function () { + document.getElementById("done").disabled = true; + document.getElementById("info_rst").value = info_editor.getValue(); - if (info_timer !== undefined) { - clearTimeout(info_timer); - } - info_timer = setTimeout(do_preview_info, 1000); - }); + if (info_timer !== undefined) { + clearTimeout(info_timer); + } + info_timer = setTimeout(do_preview_info, 1000); + }); - task_editor.session.setMode("ace/mode/rst"); - task_editor.session.setUseWrapMode(true); + task_editor.session.setMode("ace/mode/rst"); + task_editor.session.setUseWrapMode(true); - task_editor.setTheme("ace/theme/iplastic"); - task_editor.setShowPrintMargin(false); + task_editor.setTheme("ace/theme/iplastic"); + task_editor.setShowPrintMargin(false); - task_editor.on("input", function() { - document.getElementById("done").disabled = true; - document.getElementById("task_rst").value = task_editor.getValue(); + task_editor.on("input", function () { + document.getElementById("done").disabled = true; + document.getElementById("task_rst").value = task_editor.getValue(); - if (task_timer !== undefined) { - clearTimeout(task_timer); - } - task_timer = setTimeout(do_preview_task, 1000); - }); + if (task_timer !== undefined) { + clearTimeout(task_timer); + } + task_timer = setTimeout(do_preview_task, 1000); + }); + }; </script> {% endblock %} diff --git a/templates/staff/jams/forms/preamble_edit.html b/templates/staff/jams/forms/preamble_edit.html index c2245b35..85747713 100644 --- a/templates/staff/jams/forms/preamble_edit.html +++ b/templates/staff/jams/forms/preamble_edit.html @@ -62,87 +62,89 @@ <script type="application/javascript"> "use strict"; - let csrf_token = "{{ csrf_token() }}"; - let modal = UIkit.modal(document.getElementById("preview-modal")); - let preview_url = "{{ url_for("staff.render") }}"; + window.onload = () => { + let csrf_token = "{{ csrf_token() }}"; + let modal = UIkit.modal(document.getElementById("preview-modal")); + let preview_url = "{{ url_for("staff.render") }}"; + + function do_preview(callback) { + let oReq = new XMLHttpRequest(); + + oReq.addEventListener("load", function () { + let response = JSON.parse(this.responseText); + + if (response.error !== undefined) { + document.getElementById("done").disabled = true; + + if (response.error_lines !== undefined) { + editor.session.setAnnotations(response.error_lines); + document.getElementById("preview-div").innerHTML = "<h3>Error - see editor margin</h3>"; + } else { + console.log("Error: " + response.error); + document.getElementById("preview-div").innerHTML = "<h3>Error</h3><p>" + response.error + "<p>"; + } + } else { + document.getElementById("done").disabled = false; + document.getElementById("preview-div").innerHTML = response.data; - function do_preview(callback) { - let oReq = new XMLHttpRequest(); + editor.session.setAnnotations([]); + } - oReq.addEventListener("load", function() { - let response = JSON.parse(this.responseText); + if (callback !== undefined) { + callback(); + } + }); - if (response.error !== undefined) { + let data = editor.getValue(); + + if (data.replace("\s", "").length < 1) { document.getElementById("done").disabled = true; - if (response.error_lines !== undefined) { - editor.session.setAnnotations(response.error_lines); - document.getElementById("preview-div").innerHTML ="<h3>Error - see editor margin</h3>"; - } else { - console.log("Error: " + response.error); - document.getElementById("preview-div").innerHTML ="<h3>Error</h3><p>" + response.error + "<p>"; + if (callback !== undefined) { + UIkit.notification({ + "message": "Please enter some text to preview", + "status": "danger", + "pos": "bottom-center", + "timeout": 5000 + }); } - } else { - document.getElementById("done").disabled = false; - document.getElementById("preview-div").innerHTML = response.data; - - editor.session.setAnnotations([]); + return false; } - if (callback !== undefined) { - callback(); - } - }); + oReq.open("POST", preview_url); - let data = editor.getValue(); + oReq.setRequestHeader("Content-type", "application/json"); + oReq.setRequestHeader("X-CSRFToken", csrf_token); - if (data.replace("\s", "").length < 1) { - document.getElementById("done").disabled = true; + oReq.send(JSON.stringify({"data": editor.getValue()})); - if (callback !== undefined) { - UIkit.notification({ - "message": "Please enter some text to preview", - "status": "danger", - "pos": "bottom-center", - "timeout": 5000 - }); - } return false; } - oReq.open("POST", preview_url); + document.getElementById("preview").onclick = function () { + do_preview(function () { + modal.show(); + }) + }; - oReq.setRequestHeader("Content-type", "application/json"); - oReq.setRequestHeader("X-CSRFToken", csrf_token); + let editor = ace.edit("editor"); + let timer; - oReq.send(JSON.stringify({"data": editor.getValue()})); + editor.session.setMode("ace/mode/rst"); + editor.session.setUseWrapMode(true); - return false; - } + editor.setTheme("ace/theme/iplastic"); + editor.setShowPrintMargin(false); - document.getElementById("preview").onclick = function() { - do_preview(function() { - modal.show(); - }) - }; - - let editor = ace.edit("editor"); - let timer; - - editor.session.setMode("ace/mode/rst"); - editor.session.setUseWrapMode(true); - - editor.setTheme("ace/theme/iplastic"); - editor.setShowPrintMargin(false); - - editor.on("input", function() { - document.getElementById("done").disabled = true; - document.getElementById("preamble_rst").value = editor.getValue(); + editor.on("input", function () { + document.getElementById("done").disabled = true; + document.getElementById("preamble_rst").value = editor.getValue(); - if (timer !== undefined) { - clearTimeout(timer); - } - timer = setTimeout(do_preview, 1000); - }); + if (timer !== undefined) { + clearTimeout(timer); + } + timer = setTimeout(do_preview, 1000); + }); + }; </script> {% endblock %} diff --git a/templates/staff/jams/index.html b/templates/staff/jams/index.html index 74292204..e4e1e242 100644 --- a/templates/staff/jams/index.html +++ b/templates/staff/jams/index.html @@ -78,7 +78,7 @@ <i class="uk-icon fa-fw far fa-pencil"></i> Basics </a> - {% if jam.state in ["planning", "announced", "finished"] %} + {% if jam.state in ["planning", "announced", "preparing", "finished"] %} <a class="uk-button uk-button-default uk-width-expand" data-jam="{{ jam.number }}" id="jam-{{ jam.number }}-button-info" href="{{ url_for("staff.jams.edit.info", jam=jam.number) }}"> <i class="uk-icon fa-fw far fa-pencil"></i> Info </a> diff --git a/templates/staff/tables/edit.html b/templates/staff/tables/edit.html index 421f6c45..b3b9faae 100644 --- a/templates/staff/tables/edit.html +++ b/templates/staff/tables/edit.html @@ -32,17 +32,19 @@ <script type="application/javascript"> "use strict"; - let editor = ace.edit("editor"); + window.onload = () => { + let editor = ace.edit("editor"); - editor.session.setMode("ace/mode/json"); - editor.session.setUseWrapMode(true); + editor.session.setMode("ace/mode/json"); + editor.session.setUseWrapMode(true); - editor.setTheme("ace/theme/iplastic"); - editor.setShowPrintMargin(false); + editor.setTheme("ace/theme/iplastic"); + editor.setShowPrintMargin(false); - editor.on("input", function() { - document.getElementById("json").value = editor.getValue(); - }); + editor.on("input", function () { + document.getElementById("json").value = editor.getValue(); + }); + }; </script> </div> {% endblock %} |