mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-18 06:24:23 +01:00
Make user mode easier to change without having to reset accounts (#1956)
* Closes #1889 * Makes user mode easier to change without having to reset accounts. Submissions are still required to be deleted.
This commit is contained in:
@@ -79,3 +79,16 @@ tbody tr:hover {
|
||||
input[type="checkbox"] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.card-radio:checked + .card {
|
||||
background-color: transparent !important;
|
||||
border-color: #a3d39c;
|
||||
box-shadow: 0 0 0 0.1rem #a3d39c;
|
||||
transition: background-color 0.3s, border-color 0.3s;
|
||||
}
|
||||
.card-radio:checked + .card .card-radio-clone {
|
||||
visibility: visible !important;
|
||||
}
|
||||
.card:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -162,6 +162,27 @@ function uploadLogo(event) {
|
||||
});
|
||||
}
|
||||
|
||||
function switchUserMode(event) {
|
||||
event.preventDefault();
|
||||
if (
|
||||
confirm(
|
||||
"Are you sure you'd like to switch user modes?\n\nAll user submissions, awards, unlocks, and tracking will be deleted!"
|
||||
)
|
||||
) {
|
||||
let formData = new FormData();
|
||||
formData.append("submissions", true);
|
||||
formData.append("nonce", CTFd.config.csrfNonce);
|
||||
fetch(CTFd.config.urlRoot + "/admin/reset", {
|
||||
method: "POST",
|
||||
credentials: "same-origin",
|
||||
body: formData
|
||||
});
|
||||
// Bind `this` so that we can reuse the updateConfigs function
|
||||
let binded = updateConfigs.bind(this);
|
||||
binded(event);
|
||||
}
|
||||
}
|
||||
|
||||
function removeLogo() {
|
||||
ezQuery({
|
||||
title: "Remove logo",
|
||||
@@ -382,8 +403,11 @@ $(() => {
|
||||
insertTimezones($("#end-timezone"));
|
||||
insertTimezones($("#freeze-timezone"));
|
||||
|
||||
$(".config-section > form:not(.form-upload)").submit(updateConfigs);
|
||||
$(".config-section > form:not(.form-upload, .custom-config-form)").submit(
|
||||
updateConfigs
|
||||
);
|
||||
$("#logo-upload").submit(uploadLogo);
|
||||
$("#user-mode-form").submit(switchUserMode);
|
||||
$("#remove-logo").click(removeLogo);
|
||||
$("#ctf-small-icon-upload").submit(smallIconUpload);
|
||||
$("#remove-small-icon").click(removeSmallIcon);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
html{position:relative;min-height:100%}body{margin-bottom:60px}.footer{position:absolute;bottom:1px;width:100%;height:60px;line-height:normal !important;z-index:-20}
|
||||
|
||||
#score-graph{min-height:400px;display:block;clear:both}#solves-graph{display:block;height:350px}#keys-pie-graph{min-height:400px;display:block}#categories-pie-graph{min-height:400px;display:block}#solve-percentages-graph{min-height:400px;display:block}#score-distribution-graph{min-height:400px;display:block}.no-decoration{color:inherit !important;text-decoration:none !important}.no-decoration:hover{color:inherit !important;text-decoration:none !important}.table td,.table th{vertical-align:inherit}pre{white-space:pre-wrap;margin:0;padding:0}.form-control{position:relative;display:block;border-radius:0;font-weight:400;font-family:"Avenir Next", "Helvetica Neue", Helvetica, Arial, sans-serif;-webkit-appearance:none}tbody tr:hover{background-color:rgba(0,0,0,0.1) !important}[data-href]{cursor:pointer}.sort-col{cursor:pointer}input[type="checkbox"]{cursor:pointer}
|
||||
#score-graph{min-height:400px;display:block;clear:both}#solves-graph{display:block;height:350px}#keys-pie-graph{min-height:400px;display:block}#categories-pie-graph{min-height:400px;display:block}#solve-percentages-graph{min-height:400px;display:block}#score-distribution-graph{min-height:400px;display:block}.no-decoration{color:inherit !important;text-decoration:none !important}.no-decoration:hover{color:inherit !important;text-decoration:none !important}.table td,.table th{vertical-align:inherit}pre{white-space:pre-wrap;margin:0;padding:0}.form-control{position:relative;display:block;border-radius:0;font-weight:400;font-family:"Avenir Next", "Helvetica Neue", Helvetica, Arial, sans-serif;-webkit-appearance:none}tbody tr:hover{background-color:rgba(0,0,0,0.1) !important}[data-href]{cursor:pointer}.sort-col{cursor:pointer}input[type="checkbox"]{cursor:pointer}.card-radio:checked+.card{background-color:transparent !important;border-color:#a3d39c;box-shadow:0 0 0 0.1rem #a3d39c;transition:background-color 0.3s, border-color 0.3s}.card-radio:checked+.card .card-radio-clone{visibility:visible !important}.card:hover{cursor:pointer}
|
||||
|
||||
|
||||
2
CTFd/themes/admin/static/css/admin.min.css
vendored
2
CTFd/themes/admin/static/css/admin.min.css
vendored
@@ -1 +1 @@
|
||||
html{position:relative;min-height:100%}body{margin-bottom:60px}.footer{position:absolute;bottom:1px;width:100%;height:60px;line-height:normal!important;z-index:-20}#score-graph{min-height:400px;display:block;clear:both}#solves-graph{display:block;height:350px}#categories-pie-graph,#keys-pie-graph,#score-distribution-graph,#solve-percentages-graph{min-height:400px;display:block}.no-decoration,.no-decoration:hover{color:inherit!important;text-decoration:none!important}.table td,.table th{vertical-align:inherit}pre{white-space:pre-wrap;margin:0;padding:0}.form-control{position:relative;display:block;border-radius:0;font-weight:400;font-family:Avenir Next,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-appearance:none}tbody tr:hover{background-color:rgba(0,0,0,.1)!important}.sort-col,[data-href],input[type=checkbox]{cursor:pointer}
|
||||
html{position:relative;min-height:100%}body{margin-bottom:60px}.footer{position:absolute;bottom:1px;width:100%;height:60px;line-height:normal!important;z-index:-20}#score-graph{min-height:400px;display:block;clear:both}#solves-graph{display:block;height:350px}#categories-pie-graph,#keys-pie-graph,#score-distribution-graph,#solve-percentages-graph{min-height:400px;display:block}.no-decoration,.no-decoration:hover{color:inherit!important;text-decoration:none!important}.table td,.table th{vertical-align:inherit}pre{white-space:pre-wrap;margin:0;padding:0}.form-control{position:relative;display:block;border-radius:0;font-weight:400;font-family:Avenir Next,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-appearance:none}tbody tr:hover{background-color:rgba(0,0,0,.1)!important}.sort-col,[data-href],input[type=checkbox]{cursor:pointer}.card-radio:checked+.card{background-color:transparent!important;border-color:#a3d39c;box-shadow:0 0 0 .1rem #a3d39c;transition:background-color .3s,border-color .3s}.card-radio:checked+.card .card-radio-clone{visibility:visible!important}.card:hover{cursor:pointer}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,20 +1,6 @@
|
||||
{% extends "admin/base.html" %}
|
||||
|
||||
{% block stylesheets %}
|
||||
<style>
|
||||
.card-radio:checked + .card {
|
||||
background-color: transparent !important;
|
||||
border-color: #a3d39c;
|
||||
box-shadow: 0 0 0 0.1rem #a3d39c;
|
||||
transition: background-color 0.3s, border-color 0.3s;
|
||||
}
|
||||
.card-radio:checked + .card .card-radio-clone{
|
||||
visibility: visible !important;
|
||||
}
|
||||
.card:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link rounded-0" href="#backup" role="tab" data-toggle="tab">Backup</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link rounded-0" href="#usermode" role="tab" data-toggle="tab">User Mode</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link rounded-0" href="{{ url_for('admin.reset') }}" role="tab">Reset</a>
|
||||
</li>
|
||||
@@ -85,6 +88,8 @@
|
||||
{% include "admin/configs/legal.html" %}
|
||||
|
||||
{% include "admin/configs/backup.html" %}
|
||||
|
||||
{% include "admin/configs/usermode.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -19,25 +19,6 @@
|
||||
<textarea class="form-control" type="text" id="ctf_description" name="ctf_description" rows="5">{{ ctf_description }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="user_mode">
|
||||
User Mode
|
||||
<small class="form-text text-muted">User mode allows users to register as themselves
|
||||
or choose to form teams.
|
||||
</small>
|
||||
</label>
|
||||
<div data-toggle="tooltip" data-placement="bottom" title="In order to change User Mode you must reset your CTF and delete all accounts">
|
||||
<select class="form-control custom-select" id="user_mode" name="user_mode" disabled="true" style="z-index: -1;">
|
||||
<option value="teams" {% if user_mode == 'teams' %}selected{% endif %}>
|
||||
Teams
|
||||
</option>
|
||||
<option value="users" {% if user_mode == 'users' %}selected{% endif %}>
|
||||
Users
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-md btn-primary float-right">Update</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
72
CTFd/themes/admin/templates/configs/usermode.html
Normal file
72
CTFd/themes/admin/templates/configs/usermode.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<div role="tabpanel" class="tab-pane config-section" id="usermode">
|
||||
<form id="user-mode-form" method="POST" autocomplete="off" class="w-100 custom-config-form">
|
||||
<div class="form-group">
|
||||
<label for="ctf_name">
|
||||
User Mode
|
||||
<small class="form-text text-muted">Controls whether users join together in teams to play (Team Mode) or play as themselves (User Mode)</small>
|
||||
</label>
|
||||
|
||||
<div class="row pt-3">
|
||||
<div class="col-md-6">
|
||||
<label class="h-100 w-100">
|
||||
<input type="radio" class="card-radio d-none" name="user_mode" value="teams" {% if user_mode == 'teams' %}checked{% endif %}>
|
||||
<div class="card rounded-0 h-100">
|
||||
<div class="card-body p-3">
|
||||
<span class="card-title">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input card-radio-clone" type="radio" style="visibility: hidden;" checked>
|
||||
<span class="form-check-label text-center">
|
||||
<h5>Team Mode</h5>
|
||||
</span>
|
||||
<ul class="p-0 small">
|
||||
<li>Participants register accounts and form teams</li>
|
||||
<li>If a team member solves a challenge, the entire team receives credit</li>
|
||||
<br>
|
||||
<li>Easier to see which team member solved a challenge</li>
|
||||
<li>May be slightly more difficult to administer</li>
|
||||
</ul>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="h-100 w-100">
|
||||
<input type="radio" class="card-radio d-none" name="user_mode" value="users" {% if user_mode == 'users' %}checked{% endif %}>
|
||||
<div class="card rounded-0 h-100">
|
||||
<div class="card-body p-3">
|
||||
<span class="card-title">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input card-radio-clone" type="radio" style="visibility: hidden;" checked>
|
||||
<span class="form-check-label text-center">
|
||||
<h5>User Mode</h5>
|
||||
</span>
|
||||
<ul class="p-0 small">
|
||||
<li>Participants only register an individual account</li>
|
||||
<li>Players can share accounts to form pseudo-teams</li>
|
||||
<br>
|
||||
<li>Easier to organize</li>
|
||||
<li>Difficult to attribute solutions to individual team members</li>
|
||||
</ul>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-danger text-center" role="alert">
|
||||
<p>
|
||||
<strong>Changing your user mode will also delete all submissions or records that a user took an action.</strong>
|
||||
<br><small>(Submissions, Awards, Unlocks, Tracking)</small>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-md btn-primary float-right">
|
||||
Update
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
Reference in New Issue
Block a user