aboutsummaryrefslogtreecommitdiffstats
path: root/templates
diff options
context:
space:
mode:
Diffstat (limited to 'templates')
-rw-r--r--templates/main/jams/index.html9
-rw-r--r--templates/main/jams/team_list.html93
-rw-r--r--templates/main/jams/team_view.html291
-rw-r--r--templates/main/navigation.html6
-rw-r--r--templates/staff/jams/create.html6
-rw-r--r--templates/staff/jams/edit_basics.html6
-rw-r--r--templates/staff/jams/edit_ending.html128
-rw-r--r--templates/staff/jams/edit_info.html256
-rw-r--r--templates/staff/jams/forms/preamble_edit.html128
-rw-r--r--templates/staff/jams/index.html2
-rw-r--r--templates/staff/tables/edit.html18
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> &nbsp;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> &nbsp;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> &nbsp;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> &nbsp;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> &nbsp;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> &nbsp;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> &nbsp;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> &nbsp;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> &nbsp;Cancel
+ </button>
+ <a class="uk-button uk-button-primary" id="repo-submit">
+ <i class="uk-icon fa-fw far fa-check"></i> &nbsp;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> &nbsp;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> &nbsp;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 %}