Merge immortal/main into audit/securite-maintenabilite-standards

This commit is contained in:
GGThed
2026-08-12 14:58:28 -04:00
41 changed files with 157 additions and 83 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

+7
View File
@@ -96,6 +96,7 @@ a:hover { color: var(--primary-dark); }
} }
.logo i { color: var(--primary); font-size: 1.6rem; } .logo i { color: var(--primary); font-size: 1.6rem; }
.logo-img { height: 40px; width: auto; }
.user-badge { .user-badge {
display: flex; display: flex;
@@ -621,6 +622,12 @@ a:hover { color: var(--primary-dark); }
margin-bottom: 12px; margin-bottom: 12px;
} }
.auth-logo-img {
height: 80px;
width: auto;
margin-bottom: 12px;
}
.auth-header h2 { .auth-header h2 {
font-size: 1.6rem; font-size: 1.6rem;
font-weight: 700; font-weight: 700;
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('400 Bad Request') }} - TryoutPro{% endblock %} {% block title %}{{ _('400 Bad Request') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Bad Request') }}{% endblock %} {% block page_title %}{{ _('Bad Request') }}{% endblock %}
{% block content %} {% block content %}
<div class="error-container"> <div class="error-container">
@@ -12,4 +12,4 @@
<i class="fas fa-arrow-left"></i> {{ _('Go Back') }} <i class="fas fa-arrow-left"></i> {{ _('Go Back') }}
</a> </a>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('403 Forbidden') }} - TryoutPro{% endblock %} {% block title %}{{ _('403 Forbidden') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Access Denied') }}{% endblock %} {% block page_title %}{{ _('Access Denied') }}{% endblock %}
{% block content %} {% block content %}
<div class="error-container"> <div class="error-container">
@@ -12,4 +12,4 @@
<i class="fas fa-arrow-left"></i> {{ _('Go Back') }} <i class="fas fa-arrow-left"></i> {{ _('Go Back') }}
</a> </a>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('404 Not Found') }} - TryoutPro{% endblock %} {% block title %}{{ _('404 Not Found') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Page Not Found') }}{% endblock %} {% block page_title %}{{ _('Page Not Found') }}{% endblock %}
{% block content %} {% block content %}
<div class="error-container"> <div class="error-container">
@@ -12,4 +12,4 @@
<i class="fas fa-home"></i> {{ _('Return Home') }} <i class="fas fa-home"></i> {{ _('Return Home') }}
</a> </a>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('429 Too Many Requests') }} - TryoutPro{% endblock %} {% block title %}{{ _('429 Too Many Requests') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Rate Limit Exceeded') }}{% endblock %} {% block page_title %}{{ _('Rate Limit Exceeded') }}{% endblock %}
{% block content %} {% block content %}
<div class="error-container"> <div class="error-container">
@@ -12,4 +12,4 @@
<i class="fas fa-arrow-left"></i> {{ _('Go Back') }} <i class="fas fa-arrow-left"></i> {{ _('Go Back') }}
</a> </a>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('500 Server Error') }} - TryoutPro{% endblock %} {% block title %}{{ _('500 Server Error') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Internal Server Error') }}{% endblock %} {% block page_title %}{{ _('Internal Server Error') }}{% endblock %}
{% block content %} {% block content %}
<div class="error-container"> <div class="error-container">
@@ -18,4 +18,4 @@
<i class="fas fa-redo-alt"></i> {{ _('Try Again') }} <i class="fas fa-redo-alt"></i> {{ _('Try Again') }}
</a> </a>
</div> </div>
{% endblock %} {% endblock %}
+7 -13
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Team Tryout Management{% endblock %}</title> <title>{% block title %}UdeS team manager{% endblock %}</title>
{# Subresource integrity (QUA-004). Without it, whoever controls the CDN {# Subresource integrity (QUA-004). Without it, whoever controls the CDN
controls what runs on every page of this site — and the CSP names these controls what runs on every page of this site — and the CSP names these
hosts as allowed, so it would not object. hosts as allowed, so it would not object.
@@ -28,8 +28,8 @@
<nav class="sidebar" id="sidebar"> <nav class="sidebar" id="sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<div class="logo"> <div class="logo">
<i class="fas fa-trophy"></i> <img src="{{ url_for('static', filename='images/UdeS_logo.png') }}" alt="UdeS Logo" class="logo-img">
<span>TryoutPro</span> <span>UdeS team manager</span>
</div> </div>
<div class="user-badge"> <div class="user-badge">
<div class="user-avatar"> <div class="user-avatar">
@@ -100,12 +100,6 @@
</li> </li>
{% endif %} {% endif %}
{% if current_user.role == 'coach' %} {% if current_user.role == 'coach' %}
<li>
<a href="{{ url_for('users.manage_coach_availability') }}" class="{% if request.endpoint == 'users.manage_coach_availability' %}active{% endif %}">
<i class="fas fa-clock"></i>
<span>{{ _('Availability') }}</span>
</a>
</li>
<li> <li>
<a href="{{ url_for('users.notes_dashboard') }}" class="{% if request.endpoint == 'users.notes_dashboard' or request.endpoint == 'users.manage_team_notes' or request.endpoint == 'users.manage_personal_notes' %}active{% endif %}"> <a href="{{ url_for('users.notes_dashboard') }}" class="{% if request.endpoint == 'users.notes_dashboard' or request.endpoint == 'users.manage_team_notes' or request.endpoint == 'users.manage_personal_notes' %}active{% endif %}">
<i class="fas fa-sticky-note"></i> <i class="fas fa-sticky-note"></i>
@@ -194,9 +188,9 @@
</div> </div>
<div class="auth-container"> <div class="auth-container">
<div class="auth-header"> <div class="auth-header">
<i class="fas fa-trophy"></i> <img src="{{ url_for('static', filename='images/UdeS_logo.png') }}" alt="UdeS Logo" class="auth-logo-img">
<h2>TryoutPro</h2> <h2>UdeS team manager</h2>
<p>{{ _('Team Tryout Management System') }}</p> <p>{{ _('UdeS team manager') }}</p>
</div> </div>
<div class="auth-language"> <div class="auth-language">
{% include "layouts/_language_switcher.html" %} {% include "layouts/_language_switcher.html" %}
@@ -223,4 +217,4 @@
<script src="{{ url_for('static', filename='js/main.js') }}"></script> <script src="{{ url_for('static', filename='js/main.js') }}"></script>
{% block scripts %}{% endblock %} {% block scripts %}{% endblock %}
</body> </body>
</html> </html>
+1 -1
View File
@@ -7,7 +7,7 @@
{# Page Header Macro - renders title and breadcrumb #} {# Page Header Macro - renders title and breadcrumb #}
{% macro page_header(title, breadcrumb) %} {% macro page_header(title, breadcrumb) %}
{% block title %}{{ title }} - TryoutPro{% endblock %} {% block title %}{{ title }} - UdeS team manager{% endblock %}
{% block page_title %}{{ title }}{% endblock %} {% block page_title %}{{ title }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">{{ breadcrumb }}</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">{{ breadcrumb }}</span>{% endblock %}
{% endmacro %} {% endmacro %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Add Personal Note') }} - TryoutPro{% endblock %} {% block title %}{{ _('Add Personal Note') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Add Personal Note') }}{% endblock %} {% block page_title %}{{ _('Add Personal Note') }}{% endblock %}
{% block breadcrumb %} {% block breadcrumb %}
<span class="breadcrumb"> <span class="breadcrumb">
@@ -149,4 +149,4 @@
font-style: italic; font-style: italic;
} }
</style> </style>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Calendar') }} - TryoutPro{% endblock %} {% block title %}{{ _('Calendar') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Calendar') }}{% endblock %} {% block page_title %}{{ _('Calendar') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Calendar</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Calendar</span>{% endblock %}
@@ -459,4 +459,4 @@ registerActions({
'hide-event-modal': hideEventModal, 'hide-event-modal': hideEventModal,
}); });
</script> </script>
{% endblock %} {% endblock %}
+16 -4
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Manage Availability') }} - TryoutPro{% endblock %} {% block title %}{{ _('Manage Availability') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Manage Availability') }}{% endblock %} {% block page_title %}{{ _('Manage Availability') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Coach Availability</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Coach Availability</span>{% endblock %}
@@ -15,6 +15,9 @@
</div> </div>
<div class="form-actions mt-4"> <div class="form-actions mt-4">
<button type="button" class="btn btn-primary" data-action="save-availability">
<i class="fas fa-save"></i> {{ _('Save Availability') }}
</button>
<button type="button" class="btn btn-secondary" data-action="clear-availability"> <button type="button" class="btn btn-secondary" data-action="clear-availability">
<i class="fas fa-trash"></i> {{ _('Clear All') }} <i class="fas fa-trash"></i> {{ _('Clear All') }}
</button> </button>
@@ -170,13 +173,18 @@ function saveAvailability() {
fetch('{{ url_for("users.manage_coach_availability") }}', { fetch('{{ url_for("users.manage_coach_availability") }}', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token() }}'
},
body: JSON.stringify({ slots: slots }) body: JSON.stringify({ slots: slots })
}) })
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
if (data.success) { if (data.success) {
flash('Availability saved!', 'success'); flash('Availability saved!', 'success');
} else {
flash(data.error || 'Error saving availability.', 'danger');
} }
}) })
.catch(function(error) { .catch(function(error) {
@@ -190,7 +198,10 @@ function clearAllAvailability() {
return; return;
} }
fetch('{{ url_for("users.clear_coach_availability") }}', { method: 'POST' }) fetch('{{ url_for("users.clear_coach_availability") }}', {
method: 'POST',
headers: { 'X-CSRFToken': '{{ csrf_token() }}' }
})
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
if (data.success) { if (data.success) {
@@ -222,8 +233,9 @@ document.addEventListener('click', function(e) {
// dispatched by the delegated listener in main.js. This replaces inline // dispatched by the delegated listener in main.js. This replaces inline
// onclick attributes, which no CSP nonce is able to authorise. // onclick attributes, which no CSP nonce is able to authorise.
registerActions({ registerActions({
'save-availability': saveAvailability,
'clear-availability': clearAllAvailability, 'clear-availability': clearAllAvailability,
'toggle-slot': toggleSlot, 'toggle-slot': toggleSlot,
}); });
</script> </script>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Contracts') }} - TryoutPro{% endblock %} {% block title %}{{ _('Contracts') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Contracts') }}{% endblock %} {% block page_title %}{{ _('Contracts') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.profile') }}">Profile</a> / Contracts</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.profile') }}">Profile</a> / Contracts</span>{% endblock %}
@@ -127,4 +127,4 @@ registerActions({
'hide-upload-signed': hideUploadSignedForm, 'hide-upload-signed': hideUploadSignedForm,
}); });
</script> </script>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Create User') }} - TryoutPro{% endblock %} {% block title %}{{ _('Create User') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Create User') }}{% endblock %} {% block page_title %}{{ _('Create User') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_users') }}">Users</a> / Create</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_users') }}">Users</a> / Create</span>{% endblock %}
@@ -49,4 +49,4 @@
</form> </form>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Dashboard') }} - TryoutPro{% endblock %} {% block title %}{{ _('Dashboard') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Dashboard') }}{% endblock %} {% block page_title %}{{ _('Dashboard') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Dashboard</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Dashboard</span>{% endblock %}
@@ -378,4 +378,4 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Edit Profile') }} - TryoutPro{% endblock %} {% block title %}{{ _('Edit Profile') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Edit Profile') }}{% endblock %} {% block page_title %}{{ _('Edit Profile') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.profile') }}">Profile</a> / Edit</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.profile') }}">Profile</a> / Edit</span>{% endblock %}
@@ -148,4 +148,4 @@ document.addEventListener('DOMContentLoaded', function() {
toggleGamertagInputs(); toggleGamertagInputs();
}); });
</script> </script>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}Edit {{ user.username }} - TryoutPro{% endblock %} {% block title %}Edit {{ user.username }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Edit User') }}{% endblock %} {% block page_title %}{{ _('Edit User') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_users') }}">Users</a> / Edit</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_users') }}">Users</a> / Edit</span>{% endblock %}
@@ -148,4 +148,4 @@ document.addEventListener('DOMContentLoaded', function() {
toggleGamertagInputs(); toggleGamertagInputs();
}); });
</script> </script>
{% endblock %} {% endblock %}
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}Evaluate {{ player.username }} - TryoutPro{% endblock %} {% block title %}Evaluate {{ player.username }} - UdeS team manager{% endblock %}
{% block page_title %}Evaluate {{ player.username }}{% endblock %} {% block page_title %}Evaluate {{ player.username }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.view_tryout', tryout_id=tryout.id) }}">{{ tryout.title }}</a> / Evaluate</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.view_tryout', tryout_id=tryout.id) }}">{{ tryout.title }}</a> / Evaluate</span>{% endblock %}
+1 -1
View File
@@ -1,6 +1,6 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% import 'layouts/_pagination.html' as pager %} {% import 'layouts/_pagination.html' as pager %}
{% block title %}{{ _('Evaluations') }} - TryoutPro{% endblock %} {% block title %}{{ _('Evaluations') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Evaluations') }}{% endblock %} {% block page_title %}{{ _('Evaluations') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Evaluations</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Evaluations</span>{% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Login') }} - TryoutPro{% endblock %} {% block title %}{{ _('Login') }} - UdeS team manager{% endblock %}
{% block auth_content %} {% block auth_content %}
<form method="POST" action="{{ url_for('auth.login') }}" class="auth-form"> <form method="POST" action="{{ url_for('auth.login') }}" class="auth-form">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
@@ -14,4 +14,4 @@
<button type="submit" class="btn btn-primary btn-block">{{ _('Sign In') }}</button> <button type="submit" class="btn btn-primary btn-block">{{ _('Sign In') }}</button>
<p class="auth-link">{{ _("Don't have an account?") }} <a href="{{ url_for('auth.register') }}">{{ _('Register here') }}</a></p> <p class="auth-link">{{ _("Don't have an account?") }} <a href="{{ url_for('auth.register') }}">{{ _('Register here') }}</a></p>
</form> </form>
{% endblock %} {% endblock %}
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{% if match %}Edit Match{% else %}Schedule Match{% endif %} - {{ tryout.title }} - TryoutPro{% endblock %} {% block title %}{% if match %}Edit Match{% else %}Schedule Match{% endif %} - {{ tryout.title }} - UdeS team manager{% endblock %}
{% block page_title %}{% if match %}Edit Match{% else %}Schedule Match{% endif %}{% endblock %} {% block page_title %}{% if match %}Edit Match{% else %}Schedule Match{% endif %}{% endblock %}
{% block breadcrumb %} {% block breadcrumb %}
<span class="breadcrumb"> <span class="breadcrumb">
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('My Team(s)') }} - TryoutPro{% endblock %} {% block title %}{{ _('My Team(s)') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('My Team(s)') }}{% endblock %} {% block page_title %}{{ _('My Team(s)') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / My Team(s)</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / My Team(s)</span>{% endblock %}
@@ -282,4 +282,4 @@ registerActions({
color: #fcd34d; color: #fcd34d;
} }
</style> </style>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Notes') }} - TryoutPro{% endblock %} {% block title %}{{ _('Notes') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Notes') }}{% endblock %} {% block page_title %}{{ _('Notes') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Notes</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Notes</span>{% endblock %}
@@ -283,4 +283,4 @@ registerActions({
'hide-reject-modal': hideRejectModal, 'hide-reject-modal': hideRejectModal,
}); });
</script> </script>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('One on One') }} - TryoutPro{% endblock %} {% block title %}{{ _('One on One') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('One on One') }}{% endblock %} {% block page_title %}{{ _('One on One') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / One on One</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / One on One</span>{% endblock %}
@@ -314,4 +314,4 @@ registerActions({
'update-end-times': updateEndTimeOptions, 'update-end-times': updateEndTimeOptions,
}); });
</script> </script>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Personal Notes') }} - TryoutPro{% endblock %} {% block title %}{{ _('Personal Notes') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Personal Notes') }}{% endblock %} {% block page_title %}{{ _('Personal Notes') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Personal Notes</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Personal Notes</span>{% endblock %}
@@ -61,4 +61,4 @@
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('My Notes') }} - TryoutPro{% endblock %} {% block title %}{{ _('My Notes') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('My Notes') }}{% endblock %} {% block page_title %}{{ _('My Notes') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / One on One / My Notes</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / One on One / My Notes</span>{% endblock %}
@@ -82,4 +82,4 @@
</a> </a>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Players to Evaluate') }} - TryoutPro{% endblock %} {% block title %}{{ _('Players to Evaluate') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Players to Evaluate') }}{% endblock %} {% block page_title %}{{ _('Players to Evaluate') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.view_tryout', tryout_id=tryout.id) }}">{{ tryout.title }}</a> / Evaluate</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.view_tryout', tryout_id=tryout.id) }}">{{ tryout.title }}</a> / Evaluate</span>{% endblock %}
@@ -56,4 +56,4 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
+10 -4
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('My Profile') }} - TryoutPro{% endblock %} {% block title %}{{ _('My Profile') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('My Profile') }}{% endblock %} {% block page_title %}{{ _('My Profile') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Profile</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Profile</span>{% endblock %}
@@ -357,7 +357,10 @@ function saveCoachAvailability() {
} }
fetch('{{ url_for("users.manage_coach_availability") }}', { fetch('{{ url_for("users.manage_coach_availability") }}', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token() }}'
},
body: JSON.stringify({ slots: slots }) body: JSON.stringify({ slots: slots })
}) })
.then(r => r.json()) .then(r => r.json())
@@ -376,7 +379,10 @@ function saveCoachAvailability() {
function clearAllAvailability() { function clearAllAvailability() {
if (!confirm('Are you sure you want to clear all your availability slots?')) return; if (!confirm('Are you sure you want to clear all your availability slots?')) return;
fetch('{{ url_for("users.clear_coach_availability") }}', { method: 'POST' }) fetch('{{ url_for("users.clear_coach_availability") }}', {
method: 'POST',
headers: { 'X-CSRFToken': '{{ csrf_token() }}' }
})
.then(r => r.json()) .then(r => r.json())
.then(data => { .then(data => {
if (data.success) { if (data.success) {
@@ -610,4 +616,4 @@ registerActions({
}); });
</script> </script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
+60 -5
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Register') }} - TryoutPro{% endblock %} {% block title %}{{ _('Register') }} - UdeS team manager{% endblock %}
{% block auth_content %} {% block auth_content %}
<form method="POST" action="{{ url_for('auth.register') }}" class="auth-form"> <form method="POST" action="{{ url_for('auth.register') }}" class="auth-form">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
@@ -53,7 +53,7 @@
</span> </span>
</div> </div>
</div> </div>
<a href="{{ url_for('auth.discord_login') }}" class="btn btn-sm btn-outline discord-reconnect"> <a href="{{ url_for('auth.discord_login') }}" class="btn btn-sm btn-outline discord-reconnect" data-action="save-form-draft">
<i class="fas fa-sync-alt"></i> {{ _('Reconnect') }} <i class="fas fa-sync-alt"></i> {{ _('Reconnect') }}
</a> </a>
</div> </div>
@@ -65,7 +65,7 @@
</div> </div>
{% else %} {% else %}
<div class="form-group discord-connect-section"> <div class="form-group discord-connect-section">
<a href="{{ url_for('auth.discord_login') }}" class="btn btn-discord btn-block"> <a href="{{ url_for('auth.discord_login') }}" class="btn btn-discord btn-block" data-action="save-form-draft">
<i class="fab fa-discord"></i> {{ _('Connect Discord Account') }} <i class="fab fa-discord"></i> {{ _('Connect Discord Account') }}
</a> </a>
<small class="form-text text-muted">{{ _('Connect to pre-fill your gamertags from Steam, Battle.net, Xbox, etc.') }}</small> <small class="form-text text-muted">{{ _('Connect to pre-fill your gamertags from Steam, Battle.net, Xbox, etc.') }}</small>
@@ -170,8 +170,62 @@ function toggleGamertagInput(checkbox) {
} }
} }
// On page load, ensure gamertag groups match checkbox state // Save form draft to sessionStorage before navigating to Discord OAuth
function saveFormDraft() {
var draft = {};
var form = document.querySelector('.auth-form');
if (!form) return;
var inputs = form.querySelectorAll('input, select, textarea');
inputs.forEach(function(input) {
if (!input.name) return;
if (input.type === 'checkbox') {
if (!draft[input.name]) draft[input.name] = [];
if (input.checked) draft[input.name].push(input.value);
} else if (input.type === 'password') {
// Never save passwords
} else {
draft[input.name] = input.value;
}
});
sessionStorage.setItem('register_form_draft', JSON.stringify(draft));
}
// Restore form draft from sessionStorage on page load
function restoreFormDraft() {
var saved = sessionStorage.getItem('register_form_draft');
if (!saved) return;
try {
var draft = JSON.parse(saved);
var hasServerData = document.querySelector('.auth-form input[name="full_name"]').value !== '';
if (hasServerData) return;
for (var key in draft) {
if (key === 'games') {
var values = draft[key];
var checkboxes = document.querySelectorAll('input[name="games"]');
checkboxes.forEach(function(cb) {
cb.checked = values.indexOf(cb.value) !== -1;
toggleGamertagInput(cb);
});
} else if (key === 'csrf_token' || key.indexOf('password') !== -1) {
// Skip CSRF token and passwords
} else {
var input = document.querySelector('input[name="' + key + '"], textarea[name="' + key + '"]');
if (input) input.value = draft[key];
}
}
} catch(e) {
// Invalid JSON, ignore
}
}
// Clear draft on successful form submission
document.querySelector('.auth-form').addEventListener('submit', function() {
sessionStorage.removeItem('register_form_draft');
});
// On page load, ensure gamertag groups match checkbox state and restore draft
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
restoreFormDraft();
var checkboxes = document.querySelectorAll('input[name="games"]'); var checkboxes = document.querySelectorAll('input[name="games"]');
checkboxes.forEach(function(checkbox) { checkboxes.forEach(function(checkbox) {
toggleGamertagInput(checkbox); toggleGamertagInput(checkbox);
@@ -182,6 +236,7 @@ document.addEventListener('DOMContentLoaded', function() {
// dispatched by the delegated listener in main.js. This replaces inline // dispatched by the delegated listener in main.js. This replaces inline
// onclick attributes, which no CSP nonce is able to authorise. // onclick attributes, which no CSP nonce is able to authorise.
registerActions({ registerActions({
'save-form-draft': saveFormDraft,
'toggle-gamertag': toggleGamertagInput, 'toggle-gamertag': toggleGamertagInput,
}); });
</script> </script>
@@ -301,4 +356,4 @@ registerActions({
color: #57F287 !important; color: #57F287 !important;
} }
</style> </style>
{% endblock %} {% endblock %}
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{% if match %}Edit{% else %}Schedule{% endif %} Team Match - TryoutPro{% endblock %} {% block title %}{% if match %}Edit{% else %}Schedule{% endif %} Team Match - UdeS team manager{% endblock %}
{% block page_title %}{% if match %}Edit{% else %}Schedule{% endif %} Team Match{% endblock %} {% block page_title %}{% if match %}Edit{% else %}Schedule{% endif %} Team Match{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('team_matches.list_matches') }}">Team Matches</a> / {% if match %}Edit{% else %}New{% endif %}</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('team_matches.list_matches') }}">Team Matches</a> / {% if match %}Edit{% else %}New{% endif %}</span>{% endblock %}
+2 -2
View File
@@ -1,6 +1,6 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% import 'layouts/_pagination.html' as pager %} {% import 'layouts/_pagination.html' as pager %}
{% block title %}{{ _('Team Matches') }} - TryoutPro{% endblock %} {% block title %}{{ _('Team Matches') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Team Matches') }}{% endblock %} {% block page_title %}{{ _('Team Matches') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Team Matches</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Team Matches</span>{% endblock %}
@@ -236,4 +236,4 @@ registerActions({
margin-left: 4px; margin-left: 4px;
} }
</style> </style>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Team Notes') }} - TryoutPro{% endblock %} {% block title %}{{ _('Team Notes') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Team Notes') }}{% endblock %} {% block page_title %}{{ _('Team Notes') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Team Notes</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Team Notes</span>{% endblock %}
@@ -55,4 +55,4 @@
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Teams') }} - TryoutPro{% endblock %} {% block title %}{{ _('Teams') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Teams') }}{% endblock %} {% block page_title %}{{ _('Teams') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Teams</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Teams</span>{% endblock %}
@@ -548,4 +548,4 @@ registerActions({
color: var(--text-primary); color: var(--text-primary);
} }
</style> </style>
{% endblock %} {% endblock %}
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{% if tryout %}Edit Tryout{% else %}Create Tryout{% endif %} - TryoutPro{% endblock %} {% block title %}{% if tryout %}Edit Tryout{% else %}Create Tryout{% endif %} - UdeS team manager{% endblock %}
{% block page_title %}{% if tryout %}Edit Tryout{% else %}Create Tryout{% endif %}{% endblock %} {% block page_title %}{% if tryout %}Edit Tryout{% else %}Create Tryout{% endif %}{% endblock %}
{% block breadcrumb %} {% block breadcrumb %}
<span class="breadcrumb"> <span class="breadcrumb">
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Tryouts') }} - TryoutPro{% endblock %} {% block title %}{{ _('Tryouts') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Tryouts') }}{% endblock %} {% block page_title %}{{ _('Tryouts') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Tryouts</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Tryouts</span>{% endblock %}
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ _('Upload Contract') }} - TryoutPro{% endblock %} {% block title %}{{ _('Upload Contract') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Upload Contract') }}{% endblock %} {% block page_title %}{{ _('Upload Contract') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_contracts') }}">Contracts</a> / Upload</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_contracts') }}">Contracts</a> / Upload</span>{% endblock %}
@@ -42,4 +42,4 @@
</form> </form>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
+2 -2
View File
@@ -1,6 +1,6 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% import 'layouts/_pagination.html' as pager %} {% import 'layouts/_pagination.html' as pager %}
{% block title %}{{ _('Manage Users') }} - TryoutPro{% endblock %} {% block title %}{{ _('Manage Users') }} - UdeS team manager{% endblock %}
{% block page_title %}{{ _('Manage Users') }}{% endblock %} {% block page_title %}{{ _('Manage Users') }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / Users</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / Users</span>{% endblock %}
@@ -67,4 +67,4 @@
{{ pager.controls(pagination) }} {{ pager.controls(pagination) }}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ tryout.title }} - TryoutPro{% endblock %} {% block title %}{{ tryout.title }} - UdeS team manager{% endblock %}
{% block page_title %}{{ tryout.title }}{% endblock %} {% block page_title %}{{ tryout.title }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.list_tryouts') }}">Tryouts</a> / {{ tryout.title }}</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.list_tryouts') }}">Tryouts</a> / {{ tryout.title }}</span>{% endblock %}
+1 -1
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}{{ profile_user.username }} - TryoutPro{% endblock %} {% block title %}{{ profile_user.username }} - UdeS team manager{% endblock %}
{% block page_title %}{{ profile_user.username }}{% endblock %} {% block page_title %}{{ profile_user.username }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="#" data-action="history-back">Back</a> / {{ profile_user.username }}</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="#" data-action="history-back">Back</a> / {{ profile_user.username }}</span>{% endblock %}