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:
Kevin Chung
2021-07-23 15:07:00 -04:00
committed by GitHub
parent 4e15eeea57
commit bff71c6169
10 changed files with 119 additions and 38 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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}

View File

@@ -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

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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>

View 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>