svelte-migrate: updated files
This commit is contained in:
parent
4d6149760d
commit
ff5a2eef65
36 changed files with 1252 additions and 1384 deletions
9
ui/src/routes/works/[wid]/+layout.js
Normal file
9
ui/src/routes/works/[wid]/+layout.js
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
import { getWork } from '$lib/works';
|
||||
|
||||
export async function load({ params }) {
|
||||
const work = getWork(params.wid);
|
||||
|
||||
return {
|
||||
work,
|
||||
};
|
||||
}
|
||||
|
|
@ -1,27 +1,8 @@
|
|||
<script context="module">
|
||||
import { getWork } from '$lib/works';
|
||||
|
||||
export async function load({ params, stuff }) {
|
||||
const work = getWork(params.wid);
|
||||
|
||||
return {
|
||||
props: {
|
||||
work,
|
||||
},
|
||||
stuff: {
|
||||
...stuff,
|
||||
work,
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
|
||||
export let work;
|
||||
export let data;
|
||||
</script>
|
||||
|
||||
{#await work}
|
||||
{#await data.work}
|
||||
<div class="text-center">
|
||||
<div class="spinner-border text-primary mx-3" role="status"></div>
|
||||
<span>Chargement du rendu …</span>
|
||||
|
|
|
|||
7
ui/src/routes/works/[wid]/+page.js
Normal file
7
ui/src/routes/works/[wid]/+page.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
export async function load({ parent }) {
|
||||
const stuff = await parent();
|
||||
|
||||
return {
|
||||
work: stuff.work,
|
||||
};
|
||||
}
|
||||
|
|
@ -1,15 +1,3 @@
|
|||
<script context="module">
|
||||
import { getWork } from '$lib/works';
|
||||
|
||||
export async function load({ params, stuff }) {
|
||||
return {
|
||||
props: {
|
||||
work: stuff.work,
|
||||
},
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
|
||||
|
|
@ -21,222 +9,220 @@
|
|||
import WorkRepository from '$lib/components/WorkRepository.svelte';
|
||||
import { getScore } from '$lib/users';
|
||||
|
||||
export let work = null;
|
||||
export let data;
|
||||
let edit = false;
|
||||
let my_submission = null;
|
||||
let warn_already_used = false;
|
||||
let w = null;
|
||||
|
||||
work.then((w) => {
|
||||
refresh_submission(w);
|
||||
})
|
||||
$: w = data.work;
|
||||
$: refresh_submission(data.work);
|
||||
|
||||
function refresh_submission(w) {
|
||||
my_submission = w.getSubmission();
|
||||
}
|
||||
</script>
|
||||
|
||||
{#await work then w}
|
||||
{#if $user && $user.is_admin}
|
||||
<button class="btn btn-primary ms-1 float-end" on:click={() => { edit = !edit; } } title="Éditer"><i class="bi bi-pencil"></i></button>
|
||||
<a class="btn btn-success ms-1 float-end" href="works/{w.id}/rendus" title="Voir les rendus"><i class="bi bi-files"></i></a>
|
||||
{/if}
|
||||
<div class="d-flex align-items-center">
|
||||
<h2>
|
||||
<a href="works/" class="text-muted" style="text-decoration: none"><</a>
|
||||
{w.title}
|
||||
</h2>
|
||||
<SurveyBadge class="ms-2" survey={w} />
|
||||
</div>
|
||||
{#if $user && $user.is_admin}
|
||||
<button class="btn btn-primary ms-1 float-end" on:click={() => { edit = !edit; } } title="Éditer"><i class="bi bi-pencil"></i></button>
|
||||
<a class="btn btn-success ms-1 float-end" href="works/{w.id}/rendus" title="Voir les rendus"><i class="bi bi-files"></i></a>
|
||||
{/if}
|
||||
<div class="d-flex align-items-center">
|
||||
<h2>
|
||||
<a href="works/" class="text-muted" style="text-decoration: none"><</a>
|
||||
{w.title}
|
||||
</h2>
|
||||
<SurveyBadge class="ms-2" survey={w} />
|
||||
</div>
|
||||
|
||||
{#if $user && $user.is_admin && edit}
|
||||
<WorkAdmin work={w} on:saved={() => edit = false} />
|
||||
{#if $user && $user.is_admin && edit}
|
||||
<WorkAdmin work={w} on:saved={() => edit = false} />
|
||||
|
||||
{#if w.description}
|
||||
{#if w.description}
|
||||
<hr>
|
||||
{@html w.description}
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
<hr>
|
||||
<h3 class="mt-3">Notes</h3>
|
||||
<div class="card mt-3 mb-5">
|
||||
{#await w.getGrades()}
|
||||
<div class="text-center">
|
||||
<div class="spinner-border text-primary mx-3" role="status"></div>
|
||||
<span>Chargement des notes …</span>
|
||||
</div>
|
||||
{:then grades}
|
||||
<table class="table table-hover table-striped mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Login</th>
|
||||
<th>Note</th>
|
||||
<th>Commentaire</th>
|
||||
<th>Date de la note</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#if !grades}
|
||||
<div class="text-center">
|
||||
Aucune note n'a encore été envoyée pour ce travail.
|
||||
</div>
|
||||
{:else}
|
||||
{#each grades as grade, gid (grade.id)}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="users/{grade.id_user}">{grade.login}</a>
|
||||
</td>
|
||||
<td>{grade.score}</td>
|
||||
<td>{#if grade.comment}{grade.comment}{:else}-{/if}</td>
|
||||
<td>{grade.date}</td>
|
||||
</tr>
|
||||
{/each}
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
{/await}
|
||||
</div>
|
||||
{:else if (!$user || !$user.is_admin) && new Date(w.start_availability) > new Date()}
|
||||
<div class="alert alert-warning">
|
||||
<i class="bi bi-stopwatch-fill"></i>
|
||||
<strong>Ce travail n'est pas encore ouvert.</strong> Revenez plus tard !
|
||||
</div>
|
||||
{:else}
|
||||
<dl style="columns: 3">
|
||||
<dt>Date de début</dt>
|
||||
<dd><DateFormat date={new Date(w.start_availability)} dateStyle="medium" timeStyle="medium" /></dd>
|
||||
<dt>Date de fin</dt>
|
||||
<dd><DateFormat date={new Date(w.end_availability)} dateStyle="medium" timeStyle="medium" /></dd>
|
||||
{#if w.submission_url != "-"}
|
||||
<dt>Rendu ?</dt>
|
||||
<dd>
|
||||
{#if w.submission_url}
|
||||
<SubmissionStatus work={w} user={$user} />
|
||||
<hr>
|
||||
<h3 class="mt-3">Notes</h3>
|
||||
<div class="card mt-3 mb-5">
|
||||
{#await w.getGrades()}
|
||||
<div class="text-center">
|
||||
<div class="spinner-border text-primary mx-3" role="status"></div>
|
||||
<span>Chargement des notes …</span>
|
||||
</div>
|
||||
{:then grades}
|
||||
<table class="table table-hover table-striped mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Login</th>
|
||||
<th>Note</th>
|
||||
<th>Commentaire</th>
|
||||
<th>Date de la note</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#if !grades}
|
||||
<div class="text-center">
|
||||
Aucune note n'a encore été envoyée pour ce travail.
|
||||
</div>
|
||||
{:else}
|
||||
{#each grades as grade, gid (grade.id)}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="users/{grade.id_user}">{grade.login}</a>
|
||||
</td>
|
||||
<td>{grade.score}</td>
|
||||
<td>{#if grade.comment}{grade.comment}{:else}-{/if}</td>
|
||||
<td>{grade.date}</td>
|
||||
</tr>
|
||||
{/each}
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
{/await}
|
||||
</div>
|
||||
{:else if (!$user || !$user.is_admin) && new Date(w.start_availability) > new Date()}
|
||||
<div class="alert alert-warning">
|
||||
<i class="bi bi-stopwatch-fill"></i>
|
||||
<strong>Ce travail n'est pas encore ouvert.</strong> Revenez plus tard !
|
||||
</div>
|
||||
{:else}
|
||||
<dl style="columns: 3">
|
||||
<dt>Date de début</dt>
|
||||
<dd><DateFormat date={new Date(w.start_availability)} dateStyle="medium" timeStyle="medium" /></dd>
|
||||
<dt>Date de fin</dt>
|
||||
<dd><DateFormat date={new Date(w.end_availability)} dateStyle="medium" timeStyle="medium" /></dd>
|
||||
{#if w.submission_url != "-"}
|
||||
<dt>Rendu ?</dt>
|
||||
<dd>
|
||||
{#if w.submission_url}
|
||||
<SubmissionStatus work={w} user={$user} />
|
||||
{:else}
|
||||
{#await my_submission}
|
||||
<div class="spinner-grow spinner-grow-sm mx-1" role="status"></div>
|
||||
{:then submission}
|
||||
<i
|
||||
class="bi bi-check-circle text-success"
|
||||
title="Oui !"
|
||||
></i>
|
||||
<DateFormat date={new Date(submission.date)} dateStyle="medium" timeStyle="medium" />
|
||||
{:catch}
|
||||
<i
|
||||
class="bi bi-x-circle text-danger"
|
||||
title="Pas de rendu trouvé"
|
||||
></i>
|
||||
Non
|
||||
{/await}
|
||||
{/if}
|
||||
</dd>
|
||||
{/if}
|
||||
</dl>
|
||||
{#if w.description}
|
||||
<hr>
|
||||
{@html w.description}
|
||||
{/if}
|
||||
|
||||
<hr>
|
||||
|
||||
<h3 class="mt-3">Rendu</h3>
|
||||
|
||||
{#if !w.corrected && w.submission_url != "-"}
|
||||
<p>
|
||||
Pour rendre votre travail, vous devez préalablement créer un dépôt Git sur la <a href="https://gitlab.cri.epita.fr/" target="_blank">forge de l'école</a>.<br>Ce dépôt DOIT :
|
||||
</p>
|
||||
<ul>
|
||||
<li>être dans l'espace de nom de votre utilisateur (à la fin de la liste des <span class="fst-italic">namespaces</span>),</li>
|
||||
<li>avoir la visibilité « Privé »,</li>
|
||||
<li>avoir invité <a href="https://gitlab.cri.epita.fr/nemunaire" target="_blank" style="font-family: monospace">nemunaire</a> avec le rôle <span class="fst-italic">Reporter</span> une fois le dépôt créé.</li>
|
||||
</ul>
|
||||
|
||||
{#if w.tag}
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb-fill text-info me-1"></i>
|
||||
Vous pouvez utiliser un dépôt pour tous les travaux à effectuer, ou créer un dépôt par travail.
|
||||
Son nom/slug n'a pas d'importance car c'est à vous de le sélectionner dans le formulaire ci-après.
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{#if w.submission_url != "-"}
|
||||
<WorkRepository class="mb-3" readonly={w.corrected || new Date(w.end_availability) <= new Date()} work={w} on:update_submission={() => refresh_submission(w)} bind:already_used={warn_already_used} />
|
||||
<div class="card mb-3">
|
||||
<div class="card-body d-flex justify-content-between">
|
||||
<div>
|
||||
{#if w.submission_url}
|
||||
<strong>État du rendu :</strong> <SubmissionStatus work={w} user={$user} />
|
||||
{:else}
|
||||
Rendu :
|
||||
{#await my_submission}
|
||||
<div class="spinner-grow spinner-grow-sm mx-1" role="status"></div>
|
||||
{:then submission}
|
||||
<i
|
||||
class="bi bi-check-circle text-success"
|
||||
title="Oui !"
|
||||
></i>
|
||||
<DateFormat date={new Date(submission.date)} dateStyle="medium" timeStyle="medium" />
|
||||
<strong>{submission.commit} ({submission.tag})</strong> (taille : {submission.size} o, date : <DateFormat date={new Date(submission.date)} dateStyle="medium" timeStyle="medium" />)
|
||||
{:catch}
|
||||
<i
|
||||
class="bi bi-x-circle text-danger"
|
||||
title="Pas de rendu trouvé"
|
||||
></i>
|
||||
Non
|
||||
<strong>-</strong>
|
||||
{/await}
|
||||
{/if}
|
||||
</dd>
|
||||
{/if}
|
||||
</dl>
|
||||
{#if w.description}
|
||||
<hr>
|
||||
{@html w.description}
|
||||
{/if}
|
||||
|
||||
<hr>
|
||||
|
||||
<h3 class="mt-3">Rendu</h3>
|
||||
|
||||
{#if !w.corrected && w.submission_url != "-"}
|
||||
<p>
|
||||
Pour rendre votre travail, vous devez préalablement créer un dépôt Git sur la <a href="https://gitlab.cri.epita.fr/" target="_blank">forge de l'école</a>.<br>Ce dépôt DOIT :
|
||||
</p>
|
||||
<ul>
|
||||
<li>être dans l'espace de nom de votre utilisateur (à la fin de la liste des <span class="fst-italic">namespaces</span>),</li>
|
||||
<li>avoir la visibilité « Privé »,</li>
|
||||
<li>avoir invité <a href="https://gitlab.cri.epita.fr/nemunaire" target="_blank" style="font-family: monospace">nemunaire</a> avec le rôle <span class="fst-italic">Reporter</span> une fois le dépôt créé.</li>
|
||||
</ul>
|
||||
|
||||
{#if w.tag}
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb-fill text-info me-1"></i>
|
||||
Vous pouvez utiliser un dépôt pour tous les travaux à effectuer, ou créer un dépôt par travail.
|
||||
Son nom/slug n'a pas d'importance car c'est à vous de le sélectionner dans le formulaire ci-après.
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{#if w.submission_url != "-"}
|
||||
<WorkRepository class="mb-3" readonly={w.corrected || new Date(w.end_availability) <= new Date()} work={w} on:update_submission={() => refresh_submission(w)} bind:already_used={warn_already_used} />
|
||||
<div class="card mb-3">
|
||||
<div class="card-body d-flex justify-content-between">
|
||||
<div>
|
||||
{#if w.submission_url}
|
||||
<strong>État du rendu :</strong> <SubmissionStatus work={w} user={$user} />
|
||||
{:else}
|
||||
Rendu :
|
||||
{#await my_submission}
|
||||
<div class="spinner-grow spinner-grow-sm mx-1" role="status"></div>
|
||||
{:then submission}
|
||||
<strong>{submission.commit} ({submission.tag})</strong> (taille : {submission.size} o, date : <DateFormat date={new Date(submission.date)} dateStyle="medium" timeStyle="medium" />)
|
||||
{:catch}
|
||||
<strong>-</strong>
|
||||
{/await}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="d-flex flex-column justify-content-center">
|
||||
{#await my_submission then submission}
|
||||
<a
|
||||
href="/api/works/{w.id}/download"
|
||||
class="btn btn-sm btn-dark"
|
||||
title="Voir la tarball de mon rendu"
|
||||
>
|
||||
<i class="bi bi-download"></i>
|
||||
</a>
|
||||
{:catch}
|
||||
<i
|
||||
class="bi bi-x-circle text-danger"
|
||||
title="Pas de rendu trouvé"
|
||||
></i>
|
||||
{/await}
|
||||
</div>
|
||||
<div class="d-flex flex-column justify-content-center">
|
||||
{#await my_submission then submission}
|
||||
<a
|
||||
href="/api/works/{w.id}/download"
|
||||
class="btn btn-sm btn-dark"
|
||||
title="Voir la tarball de mon rendu"
|
||||
>
|
||||
<i class="bi bi-download"></i>
|
||||
</a>
|
||||
{:catch}
|
||||
<i
|
||||
class="bi bi-x-circle text-danger"
|
||||
title="Pas de rendu trouvé"
|
||||
></i>
|
||||
{/await}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if w.corrected}
|
||||
{#await getScore(w)}
|
||||
<div class="spinner-border spinner-border-sm" role="status"></div>
|
||||
{:then grade}
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-clipboard2-check-fill text-info me-1"></i>
|
||||
<strong>Note finale :</strong> <span title="Établie le {grade.date}">{grade.score}</span> {#if grade.comment}– {grade.comment}{/if}
|
||||
</div>
|
||||
{:catch error}
|
||||
<div class="alert alert-danger">
|
||||
<i class="bi text-warning bi-exclamation-triangle-fill" title={error}></i>
|
||||
<strong>{error.message}</strong>
|
||||
</div>
|
||||
{/await}
|
||||
{:else if w.submission_url != "-"}
|
||||
{#if warn_already_used}
|
||||
<div class="alert alert-danger">
|
||||
<strong>Vous avez déjà utilisé ce dépôt pour rendre un autre travail.</strong> Pour conserver ce que vous avez fait, tout en respectant l'arborescence de rendu attendue, vous devriez partir d'une nouvelle branche vide :
|
||||
<pre class="mx-2 mt-1 mb-2">
|
||||
{#if w.corrected}
|
||||
{#await getScore(w)}
|
||||
<div class="spinner-border spinner-border-sm" role="status"></div>
|
||||
{:then grade}
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-clipboard2-check-fill text-info me-1"></i>
|
||||
<strong>Note finale :</strong> <span title="Établie le {grade.date}">{grade.score}</span> {#if grade.comment}– {grade.comment}{/if}
|
||||
</div>
|
||||
{:catch error}
|
||||
<div class="alert alert-danger">
|
||||
<i class="bi text-warning bi-exclamation-triangle-fill" title={error}></i>
|
||||
<strong>{error.message}</strong>
|
||||
</div>
|
||||
{/await}
|
||||
{:else if w.submission_url != "-"}
|
||||
{#if warn_already_used}
|
||||
<div class="alert alert-danger">
|
||||
<strong>Vous avez déjà utilisé ce dépôt pour rendre un autre travail.</strong> Pour conserver ce que vous avez fait, tout en respectant l'arborescence de rendu attendue, vous devriez partir d'une nouvelle branche vide :
|
||||
<pre class="mx-2 mt-1 mb-2">
|
||||
42sh$ git checkout --orphan renduX
|
||||
42sh$ git reset
|
||||
42sh$ rm -r *
|
||||
# Créez l'arborescence de rendu ensuite</pre>
|
||||
|
||||
Pour retrouver ensuite vos rendus des travaux précédents :
|
||||
<pre class="mx-2 my-1">
|
||||
Pour retrouver ensuite vos rendus des travaux précédents :
|
||||
<pre class="mx-2 my-1">
|
||||
42sh$ git checkout renduY
|
||||
-- ou --
|
||||
42sh$ git checkout master
|
||||
</pre>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="alert alert-warning">
|
||||
Pour être reconnu, vous devez pousser un tag <strong><a href="keys">signé</a></strong> sur votre dépôt. {#if w.tag}Le tag attendu doit commencer par : <code>{w.tag}</code>. Par exemple <code>{w.tag}v1.0</code>, <code>{w.tag}v1.1</code>, …{/if} Seul le dernier tag <strong>alphabétique</strong> que vous envoyez avant la date du rendu sera pris en compte. Vous pouvez donc faire autant de tag que vous le souhaitez d'ici la date du rendu.
|
||||
</div>
|
||||
{:else}
|
||||
<div class="alert alert-primary">
|
||||
Ce travail n'a pas de modalité de rendu.
|
||||
</pre>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="alert alert-warning">
|
||||
Pour être reconnu, vous devez pousser un tag <strong><a href="keys">signé</a></strong> sur votre dépôt. {#if w.tag}Le tag attendu doit commencer par : <code>{w.tag}</code>. Par exemple <code>{w.tag}v1.0</code>, <code>{w.tag}v1.1</code>, …{/if} Seul le dernier tag <strong>alphabétique</strong> que vous envoyez avant la date du rendu sera pris en compte. Vous pouvez donc faire autant de tag que vous le souhaitez d'ici la date du rendu.
|
||||
</div>
|
||||
{:else}
|
||||
<div class="alert alert-primary">
|
||||
Ce travail n'a pas de modalité de rendu.
|
||||
</div>
|
||||
{/if}
|
||||
{/await}
|
||||
{/if}
|
||||
<div class="mb-5"></div>
|
||||
|
|
|
|||
7
ui/src/routes/works/[wid]/rendus/+page.js
Normal file
7
ui/src/routes/works/[wid]/rendus/+page.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
export async function load({ parent }) {
|
||||
const stuff = await parent();
|
||||
|
||||
return {
|
||||
work: stuff.work,
|
||||
};
|
||||
}
|
||||
|
|
@ -1,15 +1,3 @@
|
|||
<script context="module">
|
||||
import { getWork } from '$lib/works';
|
||||
|
||||
export async function load({ params, stuff }) {
|
||||
return {
|
||||
props: {
|
||||
work: stuff.work,
|
||||
},
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
|
||||
|
|
@ -23,11 +11,13 @@
|
|||
import { ToastsStore } from '$lib/stores/toasts';
|
||||
import { getUsers } from '$lib/users';
|
||||
|
||||
export let work = null;
|
||||
export let data;
|
||||
let usersP = null;
|
||||
let show_dl_btn = { };
|
||||
let repositoriesP = { };
|
||||
work.then((w) => {
|
||||
let w = null;
|
||||
$: {
|
||||
w = data.work;
|
||||
usersP = getUsers(w.promo, w.group);
|
||||
usersP.then((users) => {
|
||||
nb_users = users.length;
|
||||
|
|
@ -36,7 +26,7 @@
|
|||
updateRepoUser(w.id, user.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateRepoUser(wid, userid) {
|
||||
repositoriesP[userid] = getRepositories(wid, userid);
|
||||
|
|
@ -50,34 +40,33 @@
|
|||
let search_repo_for = {repo: null, user: null};
|
||||
</script>
|
||||
|
||||
{#await work then w}
|
||||
<div class="d-flex align-items-center">
|
||||
<h2>
|
||||
<a href="works/{w.id}" class="text-muted" style="text-decoration: none"><</a>
|
||||
{w.title}
|
||||
<small class="text-muted">Rendus {Math.trunc(nb_rendus/nb_users*100)} % ({nb_rendus}/{nb_users})</small>
|
||||
</h2>
|
||||
<SurveyBadge class="ms-2" survey={w} />
|
||||
</div>
|
||||
<div class="d-flex align-items-center">
|
||||
<h2>
|
||||
<a href="works/{w.id}" class="text-muted" style="text-decoration: none"><</a>
|
||||
{w.title}
|
||||
<small class="text-muted">Rendus {Math.trunc(nb_rendus/nb_users*100)} % ({nb_rendus}/{nb_users})</small>
|
||||
</h2>
|
||||
<SurveyBadge class="ms-2" survey={w} />
|
||||
</div>
|
||||
|
||||
{#await usersP then users}
|
||||
<table class="w-100 mb-5">
|
||||
<thead>
|
||||
{#await usersP then users}
|
||||
<table class="w-100 mb-5">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Login</th>
|
||||
<th>Rendu</th>
|
||||
<th>Dépôts</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each users as user (user.id)}
|
||||
<tr>
|
||||
<th>Login</th>
|
||||
<th>Rendu</th>
|
||||
<th>Dépôts</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each users as user (user.id)}
|
||||
<tr>
|
||||
<td><a href="users/{user.login}">{user.login}</a></td>
|
||||
<td>
|
||||
<SubmissionStatus work={w} user={user} on:done={() => { nb_rendus += 1; show_dl_btn[user.id] = true; }} />
|
||||
</td>
|
||||
<td>
|
||||
{#if repositoriesP[user.id]}
|
||||
<td><a href="users/{user.login}">{user.login}</a></td>
|
||||
<td>
|
||||
<SubmissionStatus work={w} user={user} on:done={() => { nb_rendus += 1; show_dl_btn[user.id] = true; }} />
|
||||
</td>
|
||||
<td>
|
||||
{#if repositoriesP[user.id]}
|
||||
{#await repositoriesP[user.id] then repos}
|
||||
<div class="d-flex flex-column">
|
||||
{#each repos as repo (repo.id)}
|
||||
|
|
@ -90,7 +79,7 @@
|
|||
<DateFormat date={new Date(repo.last_check)} dateStyle="medium" timeStyle="medium" />
|
||||
<BuildState
|
||||
repo_pull_state={repo.getBuildState()}
|
||||
on:show_logs={() => { show_logs = repo.getBuildLogs(user.id); (new bootstrap.Modal(document.getElementById('logsModal'))).show(); }}
|
||||
on:show_logs={() => { show_logs = repo.getBuildLogs(user.id); (new bootstrap.Modal(document.getElementById('logsModal'))).show(); }}
|
||||
/>
|
||||
{:else}
|
||||
-
|
||||
|
|
@ -115,7 +104,7 @@
|
|||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{:catch err}
|
||||
{:catch err}
|
||||
<div class="d-flex justify-content-between">
|
||||
-
|
||||
<button
|
||||
|
|
@ -127,69 +116,68 @@
|
|||
</button>
|
||||
</div>
|
||||
{/await}
|
||||
{/if}
|
||||
</td>
|
||||
<td>
|
||||
<a
|
||||
href="/api/users/{user.id}/works/{w.id}/download"
|
||||
class="btn btn-sm btn-dark"
|
||||
class:disabled={!show_dl_btn[user.id]}
|
||||
title="Télécharger la tarball du rendu"
|
||||
>
|
||||
<i class="bi bi-download"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
{/await}
|
||||
|
||||
<div class="modal fade" tabindex="-1" id="pullModal">
|
||||
<div class="modal-dialog">
|
||||
<form class="modal-content" on:submit|preventDefault={() => {run_pull_for.modal.hide(); try { run_pull_for.repo.retrieveWork(run_pull_for.struct); updateRepoUser(w.id, run_pull_for.user.id); } catch(err) { ToastsStore.addToast({color: "danger", title: "Connexion impossible", msg: err}) };}}>
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Repository Pull {#if run_pull_for.user}{run_pull_for.user.login}{/if}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group row mb-2">
|
||||
<label class="col-2 col-form-label" for="pull-tag">Tag</label>
|
||||
<input class="form-control col" id="pull-tag" autofocus placeholder={w.tag} bind:value={run_pull_for.struct.tag}>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" value="1" id="optional-sig" bind:checked={run_pull_for.struct.sig_optional}>
|
||||
<label class="form-check-label" for="optional-sig">
|
||||
Signature du tag optionnelle
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Récupérer le travail
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" tabindex="-1" id="repoModal">
|
||||
<div class="modal-dialog">
|
||||
<form class="modal-content" on:submit|preventDefault={() => {search_repo_for.modal.hide(); try { search_repo_for.repo.retrieveWork(run_pull_for.struct); updateRepoUser(w.id, run_pull_for.user.id); } catch(err) { ToastsStore.addToast({color: "danger", title: "Connexion impossible", msg: err}) }; search_repo_for.user = null; }}>
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Repository selector {#if search_repo_for.user}{search_repo_for.user.login}{/if}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{#if search_repo_for.user}
|
||||
<WorkRepository work={w} user={search_repo_for.user} />
|
||||
{/if}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</td>
|
||||
<td>
|
||||
<a
|
||||
href="/api/users/{user.id}/works/{w.id}/download"
|
||||
class="btn btn-sm btn-dark"
|
||||
class:disabled={!show_dl_btn[user.id]}
|
||||
title="Télécharger la tarball du rendu"
|
||||
>
|
||||
<i class="bi bi-download"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
{/await}
|
||||
|
||||
<div class="modal fade" tabindex="-1" id="pullModal">
|
||||
<div class="modal-dialog">
|
||||
<form class="modal-content" on:submit|preventDefault={() => {run_pull_for.modal.hide(); try { run_pull_for.repo.retrieveWork(run_pull_for.struct); updateRepoUser(w.id, run_pull_for.user.id); } catch(err) { ToastsStore.addToast({color: "danger", title: "Connexion impossible", msg: err}) };}}>
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Repository Pull {#if run_pull_for.user}{run_pull_for.user.login}{/if}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group row mb-2">
|
||||
<label class="col-2 col-form-label" for="pull-tag">Tag</label>
|
||||
<input class="form-control col" id="pull-tag" autofocus placeholder={w.tag} bind:value={run_pull_for.struct.tag}>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" value="1" id="optional-sig" bind:checked={run_pull_for.struct.sig_optional}>
|
||||
<label class="form-check-label" for="optional-sig">
|
||||
Signature du tag optionnelle
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Récupérer le travail
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" tabindex="-1" id="repoModal">
|
||||
<div class="modal-dialog">
|
||||
<form class="modal-content" on:submit|preventDefault={() => {search_repo_for.modal.hide(); try { search_repo_for.repo.retrieveWork(run_pull_for.struct); updateRepoUser(w.id, run_pull_for.user.id); } catch(err) { ToastsStore.addToast({color: "danger", title: "Connexion impossible", msg: err}) }; search_repo_for.user = null; }}>
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Repository selector {#if search_repo_for.user}{search_repo_for.user.login}{/if}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{#if search_repo_for.user}
|
||||
<WorkRepository work={w} user={search_repo_for.user} />
|
||||
{/if}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" tabindex="-1" id="logsModal">
|
||||
<div class="modal-dialog modal-xl">
|
||||
<div class="modal-content">
|
||||
|
|
|
|||
Reference in a new issue