server/admin/static/views/settings.html

287 lines
14 KiB
HTML

<form ng-submit="saveSettings()" class="row">
<div class="col-8 jumbotron text-light bg-dark">
<h2>Paramètres<button ng-click="regenerate()" class="float-right btn btn-info" type="button"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Regénérer les fichiers statiques</a></h2>
<hr>
<input type="hidden" class="form-control form-control-sm" id="lastRegeneration" ng-model="config.generation">
<div class="form-group row">
<label for="challengeName" class="col-sm-3 col-form-label col-form-label-sm">Nom du challenge</label>
<div class="col-sm-9">
<input type="text" class="form-control form-control-sm" id="challengeName" ng-model="config.title">
</div>
</div>
<div class="form-group row">
<label for="challengeAuthors" class="col-sm-3 col-form-label col-form-label-sm">Auteurs du challenge</label>
<div class="col-sm-9">
<input type="text" class="form-control form-control-sm" id="challengeAuthors" ng-model="config.authors">
</div>
</div>
<div class="form-group row">
<label for="challengeVideo" class="col-sm-3 col-form-label col-form-label-sm">Lien vidéos de résolution</label>
<div class="col-sm-9">
<input type="text" class="form-control form-control-sm" id="challengeVideo" ng-model="config.videoslink">
</div>
</div>
<div class="form-group row">
<label for="startTime" class="col-sm-3 col-form-label col-form-label-sm">Début du challenge</label>
<div class="col-sm-9">
<div class="input-group">
<input type="text" class="form-control form-control-sm" id="startTime" ng-model="config.start">
<div class="input-group-append">
<button ng-click="launchChallenge()" class="btn btn-sm btn-secondary" type="button"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> Lancer le challenge</button>
</div>
</div>
</div>
</div>
<div class="form-group row">
<label for="endTime" class="col-sm-3 col-form-label col-form-label-sm">Fin du challenge</label>
<div class="col-sm-6">
<input type="text" class="form-control form-control-sm" id="endTime" ng-model="config.end">
</div>
<div class="col-sm-1 text-right">
<label for="duration" class="col-form-label col-form-label-sm">Durée</label>
</div>
<div class="col-sm-2">
<div class="input-group input-group-sm">
<input type="text" class="form-control form-control-sm" id="duration" ng-model="duration" integer>
<div class="input-group-append">
<span class="input-group-text">min</span>
</div>
</div>
</div>
</div>
<hr>
<div class="form-group row">
<label for="globalScoreCoefficient" class="col-sm-2 col-form-label col-form-label-sm"><strong>Coefficients</strong></label>
<div class="col-sm-1">
<input type="text" class="form-control form-control-sm" id="globalScoreCoefficient" ng-model="config.globalScoreCoefficient" float>
</div>
<label for="hintcoefficient" class="col-sm-2 col-form-label col-form-label-sm text-right">incides</label>
<div class="col-sm-1">
<input type="text" class="form-control form-control-sm" id="hintcoefficient" ng-model="config.hintCurrentCoefficient" float>
</div>
<label for="wchoicescoefficient" class="col-sm-2 col-form-label col-form-label-sm text-right">WChoices</label>
<div class="col-sm-1">
<input type="text" class="form-control form-control-sm" id="wchoicescoefficient" ng-model="config.wchoiceCurrentCoefficient" float>
</div>
<label for="exercicecurcoefficient" class="col-sm-2 col-form-label col-form-label-sm text-right">défis</label>
<div class="col-sm-1">
<input type="text" class="form-control form-control-sm" id="exercicecurcoefficient" ng-model="config.exerciceCurrentCoefficient" float>
</div>
</div>
<div class="form-group row">
<label for="firstBlood" class="col-sm-3 col-form-label col-form-label-sm">Bonus premier sang</label>
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm" id="firstBlood" ng-model="config.firstBlood" float>
</div>
<label for="submissionCostBase" class="offset-sm-1 col-sm-4 col-form-label col-form-label-sm text-right">Coût de base d'une tentative</label>
<div class="col-sm-2">
<input type="text" class="form-control form-control-sm" id="submissionCostBase" ng-model="config.submissionCostBase" float>
</div>
</div>
<div class="form-group row">
<div class="col">
<div class="input-group" style="margin-top: 5px;">
<div class="input-group-prepend">
<button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-record" aria-hidden="true"></span> Propager plus tard</button>
<div class="dropdown-menu">
<a class="dropdown-item" ng-click="updActivateTime(2)">modulo 2 minutes</a>
<a class="dropdown-item" ng-click="updActivateTime(5)">modulo 5 minutes</a>
<a class="dropdown-item" ng-click="updActivateTime(10)">modulo 10 minutes</a>
<a class="dropdown-item" ng-click="updActivateTime(15)">modulo 15 minutes</a>
<a class="dropdown-item" ng-click="updActivateTime(20)">modulo 20 minutes</a>
<a class="dropdown-item" ng-click="updActivateTime(30)">modulo 30 minutes</a>
</div>
</div>
<input type="text" class="form-control form-control-sm" id="activateTime" ng-model="config.activateTime">
</div>
</div>
<div class="col text-right">
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-save" aria-hidden="true"></span> Propager ces paramètres</button>
</div>
</div>
</div>
<div class="col-4 jumbotron text-light bg-dark">
<fieldset class="form-group">
<legend class="col-form-legend">Options</legend>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.allowRegistration">
<span class="custom-control-label">Activer les inscriptions</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.canJoinTeam" ng-disabled="!config.allowRegistration">
<span class="custom-control-label">Les participants sans équipe peuvent en rejoindre une</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.denyTeamCreation" ng-disabled="!config.allowRegistration && !config.canJoinTeam">
<span class="custom-control-label">Interdire la création de nouvelles équipes</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.denyNameChange">
<span class="custom-control-label">Interdire les changements de nom d'équipe</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.ignoreTeamMembers">
<span class="custom-control-label" title="Un message d'avertissement est affiché aux équipes dont la liste des membres n'est pas connue, afin qu'ils viennent se présenter à l'équipe serveur. Cocher cette case pour que le message ne s'affiche pas, lorsque la composition de l'équipe n'intéresse pas.">Ne pas avertir les équipes sans membre</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.acceptNewIssue">
<span class="custom-control-label">Activer le rapport d'anomalies par les équipes</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.QAenabled">
<span class="custom-control-label">Activer les rapports QA</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.enableResolutionRoute">
<span class="custom-control-label">Activer la route montrant les solutions</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.partialValidation">
<span class="custom-control-label">Activer la validation partielle des challenges</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.enableExerciceDepend">
<span class="custom-control-label">Activer les dépendances des exercices</span>
<input type="text" class="form-control form-control-sm" id="duration" ng-model="config.unlockedChallengeDepth" ng-disabled="!config.enableExerciceDepend" title="-1 : Désactivé ; 0: activé ; 1,2,3 : débloque 1,2,3,... exercices supplémentaires après un challenge validé" integer>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.displayAllFlags">
<span class="custom-control-label">Désactiver les dépendances des flags</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.submissionUniqueness">
<span class="custom-control-label">Ne pas comptabiliser les tentatives identiques dans le score</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.countOnlyNotGoodTries">
<span class="custom-control-label">Comptabiliser seulement les tentatives sans bonne réponse dans le score</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.displayMCQBadCount">
<span class="custom-control-label">Afficher le décompte de mauvaises réponses des QCM</span>
</label>
</div>
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="config.eventKindness">
<span class="custom-control-label">Réduire la relève d'évènements côté navigateur</span>
</label>
</div>
</fieldset>
</div>
</form>
<div class="card mb-5" ng-show="!config.wip && timeProgression && !displayDangerousActions">
<div class="card-header bg-secondary text-light">
Synchronisation et suppressions de masse
</div>
<div class="card-body">
<div class="form-check">
<label class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" ng-model="displayDangerousActions">
<strong class="custom-control-label">Je sais ce que le challenge a démarré ET <span style="text-decoration: underline red;">j'ai réalisé une sauvegarde de la base de données il y a moins d'une minute</span> ET je sais que c'est <span style="text-decoration: underline yellow;">une très mauvaise idée de cocher cette case</span>, mais j'y suis obligé pour de bonnes raisons.</strong>
</label>
</div>
</div>
</div>
<div class="row mb-5" ng-show="config.wip || !timeProgression || displayDangerousActions">
<div class="col-8 card text-light bg-dark">
<div class="card-body">
<dl class="row">
<dt class="col-3">Synchronisation</dt>
<dd class="col-9" title="{{ configro['sync-type'] }}" ng-bind="configro.sync"></dd>
<dt class="col-3" ng-if="configro['sync-id']">ID</dt>
<dd class="col-9" ng-if="configro['sync-id']">{{ configro['sync-id'] }}</dd>
</dl>
<div class="float-right" ng-if="configro.sync">
{{ syncProgress }}
</div>
<div ng-if="syncReport">
Dernier import&nbsp;: {{ syncReport._date[1] }}
</div>
<div class="text-left" ng-if="configro.sync">
<button ng-if="configro['sync-type'] === 'GitImporter'" type="button" class="btn btn-info" ng-click="baseSync()" ng-disabled="deepSyncInProgress"><span class="glyphicon glyphicon-repeat" aria-hidden="true"></span> Pull</button>
<div class="btn-group">
<button type="button" class="btn btn-secondary" ng-click="deepSync()" ng-disabled="deepSyncInProgress"><span class="glyphicon glyphicon-import" aria-hidden="true"></span> Synchronisation intégrale</button>
<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" ng-disabled="deepSyncInProgress">
<span class="sr-only">Toggle Dropdown</span>
</button>
<div class="dropdown-menu" ng-controller="ThemesListController">
<a class="dropdown-item" ng-click="deepSync(theme)" ng-repeat="theme in themes" ng-bind="theme.name"></a>
</div>
</div>
<button type="button" class="btn btn-secondary" ng-click="speedyDeepSync()" ng-disabled="deepSyncInProgress"><span class="glyphicon glyphicon-import" aria-hidden="true"></span> Synchronisation sans fichiers</button>
<a href="check_import.html" class="btn btn-success" target="_self" ng-if="syncReport">Voir le rapport</a>
</div>
</div>
</div>
<div class="col-4 d-flex flex-column">
<button ng-click="reset('settings');" class="btn btn-secondary mt-2 mb-1" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Revenir aux paramètres par défaut</button>
<button ng-click="reset('challenges')" class="btn btn-secondary mt-2 mb-1" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer les challenges et les thèmes</button>
<button ng-click="reset('teams');" class="btn btn-secondary mt-1 mb-1" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer les équipes</button>
<button ng-click="reset('game');" class="btn btn-secondary mt-1 mb-2" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer la partie (tentatives, indices, ...)</button>
</div>
</div>