improve overall exercices interfaces
This commit is contained in:
parent
11d0fe8d1f
commit
beba0a615f
6 changed files with 69 additions and 76 deletions
|
@ -767,7 +767,7 @@ angular.module("FICApp")
|
|||
if (response.data)
|
||||
$rootScope.newBox('danger', response.data);
|
||||
else
|
||||
$rootScope.newBox('success', "Synchronisation de la liste de drapeaux terminée avec succès.");
|
||||
$rootScope.newBox('success', "Synchronisation de la liste de fichiers terminée avec succès.");
|
||||
}, function(response) {
|
||||
$scope.inSync = false;
|
||||
$rootScope.newBox('danger', 'An error occurs when synchronizing flags list:', response.data);
|
||||
|
@ -784,6 +784,8 @@ angular.module("FICApp")
|
|||
$scope.deleteHint = function() {
|
||||
this.hint.$delete(function() {
|
||||
$scope.hints.splice($scope.hints.indexOf(this.hint), 1);
|
||||
}, function(response) {
|
||||
$rootScope.newBox('danger', 'An error occurs when trying to delete hint:', response.data);
|
||||
});
|
||||
}
|
||||
$scope.saveHint = function() {
|
||||
|
@ -822,6 +824,8 @@ angular.module("FICApp")
|
|||
$scope.deleteKey = function() {
|
||||
this.key.$delete(function() {
|
||||
$scope.keys.splice($scope.keys.indexOf(this.key), 1);
|
||||
}, function(response) {
|
||||
$rootScope.newBox('danger', 'An error occurs when trying to delete flag:', response.data);
|
||||
});
|
||||
}
|
||||
$scope.saveKey = function() {
|
||||
|
|
|
@ -28,33 +28,31 @@
|
|||
|
||||
<div class="col-md-4" ng-controller="ExerciceHintsController">
|
||||
<div class="card border-info">
|
||||
<div class="card-header">
|
||||
<div class="card-header bg-info text-light">
|
||||
<button ng-click="addHint()" class="float-right btn btn-sm btn-primary" style="margin-left: 7px"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></button>
|
||||
<button ng-click="syncHints()" class="float-right btn btn-sm btn-light"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></button>
|
||||
<h4 style="margin:0">Indices</h4>
|
||||
</div>
|
||||
<div class="list-group">
|
||||
<form ng-submit="saveHint()" class="list-group-item form-horizontal" ng-repeat="hint in hints">
|
||||
<div class="form-group">
|
||||
<label for="htitle{{hint.id}}" class="col-xs-2 col-form-label">Titre</label>
|
||||
<div class="col-xs-10">
|
||||
<input type="text" id="htitle{{hint.id}}" ng-model="hint.title" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="hcnt{{hint.id}}" class="col-xs-2 col-form-label">Contenu</label>
|
||||
<div class="col-xs-10">
|
||||
<textarea class="form-control" id="hcnt{{hint.id}}" ng-model="hint.content"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="hcost{{hint.id}}" class="col-xs-2 col-form-label">Coût</label>
|
||||
<div class="col-xs-10">
|
||||
<form ng-submit="saveHint()" class="list-group-item form-horizontal bg-light text-dark" ng-repeat="hint in hints">
|
||||
<input type="text" id="htitle{{hint.id}}" ng-model="hint.title" class="form-control form-control-sm" placeholder="Titre">
|
||||
<textarea class="form-control form-control-sm" id="hcnt{{hint.id}}" ng-model="hint.content" ng-if="!hint.file"></textarea>
|
||||
<p ng-if="hint.file">
|
||||
Fichier : <samp>{{ hint.file }}</samp><br>
|
||||
Hash : <samp class="cksum">{{ hint.content }}</samp><br>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-8 input-group input-group-sm mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" id="inputGroup-sizing-sm">Coût</span>
|
||||
</div>
|
||||
<input type="text" id="hcost{{hint.id}}" ng-model="hint.cost" class="form-control" integer>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<button type="submit" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button>
|
||||
<button ng-click="deleteHint()" class="btn btn-sm btn-danger" ng-show="hint.id"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button>
|
||||
<a ng-click="deleteHint()" class="btn btn-danger" ng-show="hint.id"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -62,19 +60,21 @@
|
|||
|
||||
<div class="col-md-4" ng-controller="ExerciceFilesController">
|
||||
<div class="card border-secondary">
|
||||
<div class="card-header">
|
||||
<div class="card-header bg-secondary text-light">
|
||||
<button ng-click="addFile()" class="float-right btn btn-sm btn-primary" style="margin-left: 7px"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></button>
|
||||
<button ng-click="syncFiles()" class="float-right btn btn-sm btn-light"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></button>
|
||||
<h4 style="margin:0">Téléchargements</h4>
|
||||
</div>
|
||||
<div class="list-group">
|
||||
<form ng-submit="saveFile()" class="list-group-item form" ng-repeat="file in files">
|
||||
<input type="text" ng-model="file.name">
|
||||
<a href="{{file.path}}" class="btn btn-default"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></a>
|
||||
<a ng-click="deleteFile()" class="btn btn-danger"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></a>
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button><br>
|
||||
Taille : <span title="{{ file.size }} octets">{{ file.size | size }}</span><br>
|
||||
BLAKE2b sum : <samp class="cksum">{{ file.checksum | cksum }}</samp>
|
||||
<form ng-submit="saveFile()" class="list-group-item bg-light text-dark" ng-repeat="file in files">
|
||||
<div class="row form-group">
|
||||
<input type="text" ng-model="file.name" class="col form-control form-control-sm" placeholder="Nom de fichier">
|
||||
<a href="{{file.path}}" class="btn btn-sm btn-secondary col-auto"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></a>
|
||||
<button type="submit" class="btn btn-sm btn-success col-auto"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button><br>
|
||||
<button ng-click="deleteFile()" class="btn btn-sm btn-danger col-auto"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
Taille : <span title="{{ file.size }} octets">{{ file.size | size }}</span><br>
|
||||
BLAKE2b sum : <samp class="cksum">{{ file.checksum | cksum }}</samp>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -82,37 +82,28 @@
|
|||
|
||||
<div class="col-md-4" ng-controller="ExerciceKeysController">
|
||||
<div class="card border-success">
|
||||
<div class="card-header">
|
||||
<div class="card-header bg-success text-light">
|
||||
<button ng-click="addKey()" class="float-right btn btn-sm btn-primary" style="margin-left: 7px"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></button>
|
||||
<button ng-click="syncKeys()" class="float-right btn btn-sm btn-light"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></button>
|
||||
<h4>Drapeaux</h4>
|
||||
</div>
|
||||
<div class="list-group">
|
||||
<form ng-submit="saveKey()" class="list-group-item form-horizontal" ng-repeat="key in keys">
|
||||
<div class="form-group" id="key-{{key.id}}">
|
||||
<label for="klabel{{key.id}}" class="col-xs-2 col-form-label">Intitulé</label>
|
||||
<div class="col-xs-8">
|
||||
<input type="text" id="klabel{{key.id}}" ng-model="key.type" class="form-control">
|
||||
</div>
|
||||
<div class="col-xs-1" ng-show="key.id">
|
||||
<a ng-click="deleteKey()" class="btn btn-danger"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></a>
|
||||
<form ng-submit="saveKey()" class="list-group-item form-horizontal bg-light text-dark" ng-repeat="key in keys">
|
||||
<div class="form-group row" id="key-{{key.id}}">
|
||||
<input type="text" id="klabel{{key.id}}" ng-model="key.label" class="col form-control" placeholder="Intitulé">
|
||||
<div class="col-auto" ng-show="key.id">
|
||||
<button ng-click="deleteKey()" class="btn btn-danger"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="key.id">
|
||||
<label for="kvalue{{key.id}}" class="col-xs-2 col-form-label">Hash</label>
|
||||
<div class="col-xs-8">
|
||||
<input type="text" id="kvalue{{key.id}}" ng-model="key.value" class="form-control">
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<div class="form-group row" ng-show="key.id">
|
||||
<input type="text" id="kvalue{{key.id}}" ng-model="key.value" class="col form-control" placeholder="Condensat">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="!key.id">
|
||||
<label for="kvalue{{key.id}}" class="col-xs-2 col-form-label">Clef brute</label>
|
||||
<div class="col-xs-8">
|
||||
<input type="text" id="kvalue{{key.id}}" ng-model="key.key" class="form-control">
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<div class="form-group row" ng-show="!key.id">
|
||||
<input type="text" id="kvalue{{key.id}}" ng-model="key.key" class="col form-control" placeholder="Chaîne à valider">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -11,19 +11,19 @@
|
|||
<div class="col-lg-8">
|
||||
|
||||
<form ng-submit="saveTeam()">
|
||||
<div class="form-group row" ng-if="team.id">
|
||||
<div class="row" ng-if="team.id">
|
||||
<label for="idTeam" class="col-sm-2 col-form-label-sm">Identifiant</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" readonly class="form-control-sm form-control-plaintext text-light" ng-model="team.id">
|
||||
<input type="text" readonly class="form-control-sm form-control-plaintext" ng-model="team.id">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row" ng-if="team.id">
|
||||
<div class="row" ng-if="team.id">
|
||||
<label for="initialName" class="col-sm-2 col-form-label-sm">Nom initial</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" readonly class="form-control-sm form-control-plaintext text-light" ng-model="team.initialName">
|
||||
<input type="text" readonly class="form-control-sm form-control-plaintext" ng-model="team.initialName">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row" ng-repeat="field in fields">
|
||||
<div class="row" ng-repeat="field in fields">
|
||||
<label for="{{ field }}" class="col-sm-2 col-form-label-sm">{{ field | capitalize }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control form-control-sm" id="{{ field }}" ng-model="team[field]" ng-if="field != 'color'">
|
||||
|
@ -43,22 +43,20 @@
|
|||
|
||||
<div class="card-deck">
|
||||
<form ng-submit="saveTeamMembers()" class="card" ng-if="team.id" ng-controller="TeamMembersController">
|
||||
<div class="card-header">
|
||||
<div class="panel-title">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> Membres
|
||||
<button type="submit" class="float-right btn btn-sm btn-primary" style="margin-left: 10px">
|
||||
<span class="glyphicon glyphicon-save" aria-hidden="true"></span> Save</button>
|
||||
<button ng-click="newMember()" class="float-right btn btn-sm btn-secondary">
|
||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
<div class="card-header bg-info text-light">
|
||||
<button type="submit" class="float-right btn btn-sm btn-primary" style="margin-left: 10px">
|
||||
<span class="glyphicon glyphicon-save" aria-hidden="true"></span> Save</button>
|
||||
<button ng-click="newMember()" class="float-right btn btn-sm btn-secondary">
|
||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span></button>
|
||||
<h4 style="margin:0"><span class="glyphicon glyphicon-user" aria-hidden="true"></span> Membres</h4>
|
||||
</div>
|
||||
<div class="card-body" ng-if="members.length == 0">
|
||||
<div class="card-body bg-light text-dark" ng-if="members.length == 0">
|
||||
This team has no member!
|
||||
</div>
|
||||
<div class="list-group-item" ng-repeat="member in members">
|
||||
<div class="form-group row" ng-repeat="field in fields">
|
||||
<label for="{{ field }}{{ member.id }}" class="col-sm-4 col-form-label-sm">{{ field | capitalize }}</label>
|
||||
<div class="col-sm-6">
|
||||
<div class="list-group-item bg-light text-dark" ng-repeat="member in members">
|
||||
<div class="row" ng-repeat="field in fields">
|
||||
<label for="{{ field }}{{ member.id }}" class="col-auto col-form-label-sm">{{ field | capitalize }}</label>
|
||||
<div class="col">
|
||||
<input type="text" class="form-control form-control-sm" id="{{ field }}{{ member.id }}" ng-model="member[field]">
|
||||
</div>
|
||||
<div class="col-sm-2" ng-if="$first">
|
||||
|
@ -69,13 +67,13 @@
|
|||
</form>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="card-header bg-primary text-light">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
Certificate
|
||||
<span class="badge badge-success" ng-if="hasCertificate">Generated</span>
|
||||
<span class="badge badge-danger" ng-if="!hasCertificate">Not found</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="card-body bg-light text-dark">
|
||||
<button ng-click="generateCertificate()" class="btn btn-success" ng-if="!hasCertificate">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span> Generate certificate</button>
|
||||
<button ng-click="revokeCertificate()" class="btn btn-danger" ng-if="hasCertificate">
|
||||
|
@ -88,9 +86,9 @@
|
|||
</div>
|
||||
|
||||
<div class="col-lg-4">
|
||||
<table ng-controller="TeamHistoryController" class="table table-hover table-striped table-bordered">
|
||||
<table ng-controller="TeamHistoryController" class="table table-hover table-striped table-bordered bg-primary text-light">
|
||||
<tbody>
|
||||
<tr ng-repeat="row in history" ng-class="{success: row.kind == 'solved', info: row.kind == 'hint', warning: row.kind == 'key_found'}">
|
||||
<tr ng-repeat="row in history" ng-class="{'bg-success': row.kind == 'solved', 'bg-info': row.kind == 'hint', 'bg-warning': row.kind == 'key_found'}">
|
||||
<td>
|
||||
<nobr>{{ row.time | date:"mediumTime" }}</nobr><br>{{ row.kind }}
|
||||
</td>
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<div ng-if="team.name != team.initialName">{{ team.initialName }}</div>
|
||||
</td>
|
||||
<td ng-controller="TeamMembersController" style="padding: 0;">
|
||||
<table class="table table-hover table-sm" style="margin: 0;">
|
||||
<table class="table table-hover table-sm bg-light" style="margin: 0;">
|
||||
<tr class="row" ng-repeat="member in members">
|
||||
<td class="col-sm-3" ng-repeat="field in fields">
|
||||
{{ member[field] }}
|
||||
|
|
|
@ -19,14 +19,14 @@
|
|||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-xl" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].files.length)">
|
||||
<div class="col-xl" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].files.length)" style="margin-bottom: 15px">
|
||||
<div class="card" style="margin-bottom: 15px">
|
||||
<div class="card-header text-white">
|
||||
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> Téléchargements
|
||||
</div>
|
||||
<div class="list-group">
|
||||
<a ng-href="{{ file.path }}" target="_self" class="list-group-item" ng-repeat="file in my.exercices[current_exercice].files">
|
||||
<h1 class="pull-left" style="margin: 7px 7px 5px -5px"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></h1>
|
||||
<h1 class="float-left" style="margin: 7px 7px 5px -5px"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></h1>
|
||||
<h4 class="list-group-item-heading"><strong><samp>{{ file.name }}</samp></strong></h4>
|
||||
<p class="list-group-item-text"><nobr>Taille : <span title="{{ file.size }} octets">{{ file.size | size }}</span></nobr> – <nobr><span title="blake2.net">b2sum</span> : <samp class="cksum" title="{{ file.checksum }}">{{ file.checksum }}</samp></nobr></p>
|
||||
</a>
|
||||
|
@ -109,7 +109,7 @@
|
|||
</p>
|
||||
<dl class="dl-horizontal" ng-repeat="key in my.exercices[current_exercice].keys">
|
||||
<dt title="{{ key.slice(128) }}">{{ key.slice(128) }}</dt>
|
||||
<dd class="samp"><samp>{{ key.slice(0, 128) }}</samp></dd>
|
||||
<dd><samp class="cksum">{{ key.slice(0, 128) }}</samp></dd>
|
||||
</dl>
|
||||
<div class="embed-responsive">
|
||||
<iframe type="text/html" ng-if="my.exercices[current_exercice].video_uri" ng-src="{{ my.exercices[current_exercice].video_uri }}" class="embed-responsive-item">
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
type Key struct {
|
||||
Id int64 `json:"id"`
|
||||
IdExercice int64 `json:"idExercice"`
|
||||
Label string `json:"type"`
|
||||
Label string `json:"label"`
|
||||
Checksum []byte `json:"value"`
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue