mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-18 14:34:21 +01:00
Make team profile pages use the shared errors component (#1589)
* Fix team pages to use the core errors alert component * Closes #1585
This commit is contained in:
@@ -154,6 +154,9 @@ def new():
|
|||||||
@authed_only
|
@authed_only
|
||||||
@require_team_mode
|
@require_team_mode
|
||||||
def private():
|
def private():
|
||||||
|
infos = get_infos()
|
||||||
|
errors = get_errors()
|
||||||
|
|
||||||
user = get_current_user()
|
user = get_current_user()
|
||||||
if not user.team_id:
|
if not user.team_id:
|
||||||
return render_template("teams/team_enrollment.html")
|
return render_template("teams/team_enrollment.html")
|
||||||
@@ -167,6 +170,9 @@ def private():
|
|||||||
place = team.place
|
place = team.place
|
||||||
score = team.score
|
score = team.score
|
||||||
|
|
||||||
|
if config.is_scoreboard_frozen():
|
||||||
|
infos.append("Scoreboard has been frozen")
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"teams/private.html",
|
"teams/private.html",
|
||||||
solves=solves,
|
solves=solves,
|
||||||
@@ -176,6 +182,8 @@ def private():
|
|||||||
score=score,
|
score=score,
|
||||||
place=place,
|
place=place,
|
||||||
score_frozen=config.is_scoreboard_frozen(),
|
score_frozen=config.is_scoreboard_frozen(),
|
||||||
|
infos=infos,
|
||||||
|
errors=errors,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -184,6 +192,7 @@ def private():
|
|||||||
@check_score_visibility
|
@check_score_visibility
|
||||||
@require_team_mode
|
@require_team_mode
|
||||||
def public(team_id):
|
def public(team_id):
|
||||||
|
infos = get_infos()
|
||||||
errors = get_errors()
|
errors = get_errors()
|
||||||
team = Teams.query.filter_by(id=team_id, banned=False, hidden=False).first_or_404()
|
team = Teams.query.filter_by(id=team_id, banned=False, hidden=False).first_or_404()
|
||||||
solves = team.get_solves()
|
solves = team.get_solves()
|
||||||
@@ -195,6 +204,9 @@ def public(team_id):
|
|||||||
if errors:
|
if errors:
|
||||||
return render_template("teams/public.html", team=team, errors=errors)
|
return render_template("teams/public.html", team=team, errors=errors)
|
||||||
|
|
||||||
|
if config.is_scoreboard_frozen():
|
||||||
|
infos.append("Scoreboard has been frozen")
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"teams/public.html",
|
"teams/public.html",
|
||||||
solves=solves,
|
solves=solves,
|
||||||
@@ -203,4 +215,6 @@ def public(team_id):
|
|||||||
score=score,
|
score=score,
|
||||||
place=place,
|
place=place,
|
||||||
score_frozen=config.is_scoreboard_frozen(),
|
score_frozen=config.is_scoreboard_frozen(),
|
||||||
|
infos=infos,
|
||||||
|
errors=errors,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -154,139 +154,126 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{% if errors %}
|
{% include "components/errors.html" %}
|
||||||
<div id='errors' class="row">
|
|
||||||
{% for error in errors %}
|
<br>
|
||||||
<h1>{{ error }}</h1>
|
|
||||||
|
<div class="row min-vh-25">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>Members</h3>
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td><b>User Name</b></td>
|
||||||
|
<td><b>Score</b></td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for member in team.members %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
||||||
|
{{ member.name }}
|
||||||
|
</a>
|
||||||
|
{% if team.captain_id == member.id %}
|
||||||
|
<span class="badge badge-primary ml-2">Captain</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>{{ member.score }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if solves %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||||
|
<div id="keys-pie-graph" class="d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||||
|
<div id="categories-pie-graph" class="d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br class="clearfix">
|
||||||
|
<div class="col-md-12 d-none d-md-block d-lg-block">
|
||||||
|
<div id="score-graph" class="w-100 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
|
||||||
|
{% if awards %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>Awards</h3>
|
||||||
|
</div>
|
||||||
|
{% for award in awards %}
|
||||||
|
<div class="col-md-3 col-sm-6">
|
||||||
|
<p class="text-center">
|
||||||
|
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
||||||
|
<br>
|
||||||
|
<strong>{{ award.name }}</strong>
|
||||||
|
</p>
|
||||||
|
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
||||||
|
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
||||||
|
<p class="text-center">{{ award.value }}</p>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{% if score_frozen %}
|
<br>
|
||||||
<div class="row">
|
|
||||||
<h1 class="text-center">Scoreboard has been frozen.</h1>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<br>
|
<div class="row">
|
||||||
|
|
||||||
<div class="row min-vh-25">
|
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h3>Members</h3>
|
<h3>Solves</h3>
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>User Name</b></td>
|
<td><b>Challenge</b></td>
|
||||||
<td><b>Score</b></td>
|
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
||||||
|
<td><b>Value</b></td>
|
||||||
|
<td><b>Time</b></td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for member in team.members %}
|
{% for solve in solves %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
||||||
{{ member.name }}
|
{{ solve.challenge.name }}
|
||||||
</a>
|
</a>
|
||||||
{% if team.captain_id == member.id %}
|
|
||||||
<span class="badge badge-primary ml-2">Captain</span>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
</td>
|
||||||
<td>{{ member.score }}</td>
|
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
||||||
|
<td>{{ solve.challenge.value }}</td>
|
||||||
|
<td class="solve-time">
|
||||||
|
<span data-time="{{ solve.date | isoformat }}">{{ solve.date }}</span>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% else %}
|
||||||
{% if solves %}
|
<div class="row min-vh-25">
|
||||||
<div class="row">
|
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
No solves yet
|
||||||
<div id="keys-pie-graph" class="d-flex align-items-center">
|
</h3>
|
||||||
<div class="text-center w-100">
|
</div>
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
|
||||||
<div id="categories-pie-graph" class="d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br class="clearfix">
|
|
||||||
<div class="col-md-12 d-none d-md-block d-lg-block">
|
|
||||||
<div id="score-graph" class="w-100 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix"></div>
|
|
||||||
|
|
||||||
{% if awards %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<h3>Awards</h3>
|
|
||||||
</div>
|
|
||||||
{% for award in awards %}
|
|
||||||
<div class="col-md-3 col-sm-6">
|
|
||||||
<p class="text-center">
|
|
||||||
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
|
||||||
<br>
|
|
||||||
<strong>{{ award.name }}</strong>
|
|
||||||
</p>
|
|
||||||
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
|
||||||
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
|
||||||
<p class="text-center">{{ award.value }}</p>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<h3>Solves</h3>
|
|
||||||
<table class="table table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td><b>Challenge</b></td>
|
|
||||||
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
|
||||||
<td><b>Value</b></td>
|
|
||||||
<td><b>Time</b></td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for solve in solves %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
|
||||||
{{ solve.challenge.name }}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
|
||||||
<td>{{ solve.challenge.value }}</td>
|
|
||||||
<td class="solve-time">
|
|
||||||
<span data-time="{{ solve.date | isoformat }}">{{ solve.date }}</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="row min-vh-25">
|
|
||||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
|
||||||
No solves yet
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -54,136 +54,123 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{% if errors %}
|
{% include "components/errors.html" %}
|
||||||
<div id='errors' class="row">
|
|
||||||
{% for error in errors %}
|
<br>
|
||||||
<h1>{{ error }}</h1>
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>Members</h3>
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td><b>User Name</b></td>
|
||||||
|
<td><b>Score</b></td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for member in team.members %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
||||||
|
{{ member.name }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ member.score }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if solves %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||||
|
<div id="keys-pie-graph" class="d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||||
|
<div id="categories-pie-graph" class="d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br class="clearfix">
|
||||||
|
<div class="col-md-12 d-none d-md-block d-lg-block">
|
||||||
|
<div id="score-graph" class="w-100 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
|
||||||
|
{% if awards %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>Awards</h3>
|
||||||
|
</div>
|
||||||
|
{% for award in awards %}
|
||||||
|
<div class="col-md-3 col-sm-6">
|
||||||
|
<p class="text-center">
|
||||||
|
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
||||||
|
<br>
|
||||||
|
<strong>{{ award.name }}</strong>
|
||||||
|
</p>
|
||||||
|
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
||||||
|
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
||||||
|
<p class="text-center">{{ award.value }}</p>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{% if score_frozen %}
|
<br>
|
||||||
<div class="row">
|
|
||||||
<h1 class="text-center">Scoreboard has been frozen.</h1>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h3>Members</h3>
|
<h3>Solves</h3>
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>User Name</b></td>
|
<td><b>Challenge</b></td>
|
||||||
<td><b>Score</b></td>
|
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
||||||
|
<td><b>Value</b></td>
|
||||||
|
<td><b>Time</b></td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for member in team.members %}
|
{% for solve in solves %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
||||||
{{ member.name }}
|
{{ solve.challenge.name }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ member.score }}</td>
|
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
||||||
|
<td>{{ solve.challenge.value }}</td>
|
||||||
|
<td class="solve-time">
|
||||||
|
<span data-time="{{ solve.date | isoformat }}"></span>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% else %}
|
||||||
{% if solves %}
|
<div class="row min-vh-25">
|
||||||
<div class="row">
|
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
No solves yet
|
||||||
<div id="keys-pie-graph" class="d-flex align-items-center">
|
</h3>
|
||||||
<div class="text-center w-100">
|
</div>
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
|
||||||
<div id="categories-pie-graph" class="d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br class="clearfix">
|
|
||||||
<div class="col-md-12 d-none d-md-block d-lg-block">
|
|
||||||
<div id="score-graph" class="w-100 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix"></div>
|
|
||||||
|
|
||||||
{% if awards %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<h3>Awards</h3>
|
|
||||||
</div>
|
|
||||||
{% for award in awards %}
|
|
||||||
<div class="col-md-3 col-sm-6">
|
|
||||||
<p class="text-center">
|
|
||||||
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
|
||||||
<br>
|
|
||||||
<strong>{{ award.name }}</strong>
|
|
||||||
</p>
|
|
||||||
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
|
||||||
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
|
||||||
<p class="text-center">{{ award.value }}</p>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<h3>Solves</h3>
|
|
||||||
<table class="table table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td><b>Challenge</b></td>
|
|
||||||
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
|
||||||
<td><b>Value</b></td>
|
|
||||||
<td><b>Time</b></td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for solve in solves %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
|
||||||
{{ solve.challenge.name }}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
|
||||||
<td>{{ solve.challenge.value }}</td>
|
|
||||||
<td class="solve-time">
|
|
||||||
<span data-time="{{ solve.date | isoformat }}"></span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="row min-vh-25">
|
|
||||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
|
||||||
No solves yet
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user