server/admin/static/views/settings.html

273 lines
15 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="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 title="Coefficient multiplicateur global du score final (le coefficient est appliqué dans la fonction et vaut pour tout le challenge, présent/passé/futur, sans effet de bord)">
</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 title="Coefficient multiplicateur temporaire du nombre de points que fait perdre un indice (le coefficient est enregistré au moment où l'équipe demande un indice, ce n'est pas global)">
</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 title="Coefficient multiplicateur temporaire du nombre de points que fait perdre une demande de liste de choix (le coefficient est enregistré au moment où l'équipe demande la liste de choix, ce n'est pas global)">
</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 title="Coefficient multiplicateur temporaire du nombre de points que fait gagner un exercice validé (le coefficient est enregistré au moment où l'équipe valide l'exercice, ce n'est pas global)">
</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" ng-class="{'btn-outline-secondary': !activateTimeCountDown, 'btn-warning': activateTimeCountDown && config.activateTime == settings.activateTime, 'btn-outline-warning': config.activateTime && config.activateTime != settings.activateTime}"><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>
<a class="dropdown-item" ng-click="updActivateTime(60)">modulo 60 minutes</a>
<a class="dropdown-item" ng-click="updActivateTime(90)">modulo 90 minutes</a>
<a class="dropdown-item" ng-click="config.activateTime = '0001-01-01T00:00:00Z'" ng-show="activateTimeCountDown">annuler la propagation</a>
</div>
</div>
<input type="text" class="form-control form-control-sm" id="activateTime" ng-model="config.activateTime" ng-change="updateActivateTime()">
</div>
<small ng-if="activateTimeCountDown">
Propagation dans : {{ activateTimeCountDown | timer }}
Il restera : {{ timeRemaining - activateTimeCountDown | timer }}
</small>
</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" ng-change="exerciceDependChange()">
<span class="custom-control-label">Activer les dépendances des exercices</span>
<input type="number" 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é" min="0" 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>