diff --git a/frontend/ui/src/components/ExerciceFlags.svelte b/frontend/ui/src/components/ExerciceFlags.svelte index 92e7ceb3..1deeefcd 100644 --- a/frontend/ui/src/components/ExerciceFlags.svelte +++ b/frontend/ui/src/components/ExerciceFlags.svelte @@ -8,17 +8,88 @@ Icon, ListGroup, ListGroupItem, + Spinner, } from 'sveltestrap'; - export let exercice = {}; + import FlagKey from './FlagKey.svelte'; + import FlagMCQ from './FlagMCQ.svelte'; + + export let exercice = { }; export let flags = []; - function submitFlags(event) { - console.log(event); + export let refresh_my; + export let refresh_teams; + + function waitDiff(i) { + refresh_my((my) => { + if (my && my.exercices[exercice.id].tries != exercice.tries) { + submitInProgress = false; + refresh_teams(); + } else if (i > 0) { + setTimeout(waitDiff, 450, i-1); + } + }) + } + + let responses = { }; + async function submitFlags() { + submitInProgress = true; + sberr = ""; + message = ""; + + const response = await fetch( + "/submit/" + exercice.id, + { + method: "POST", + body: JSON.stringify(responses), + } + ) + + if (response.status < 300) { + const data = await response.json(); + messageClass = 'text-success'; + message = data.errmsg; + waitDiff(20); + } else { + submitInProgress = false; + + messageClass = 'text-danger'; + + let data = ""; + try { + data = await response.json(); + } catch(e) { + data = null; + } + + if (data && data.errmsg) + message = data.errmsg; + if (response.statys != 402) + sberr = "Oups !"; + } + } + + function resetResponses() { + responses = { + flags: { }, + mcqs: { }, + justifications: { }, + }; + } + + let last_exercice = null; + $: { + if (!last_exercice || last_exercice != exercice.id) { + last_exercice = exercice.id; + resetResponses() + } } let sberr = ""; let message = ""; + let messageClass = "text-danger"; + let timeouted = false; + let submitInProgress = false; @@ -40,7 +111,7 @@ {/if} {#if exercice.submitted || sberr} - + {#if !sberr} Votre solution a bien été envoyée ! {:else} @@ -48,7 +119,7 @@ {/if} {/if} - {#if exercice.timeouted} + {#if timeouted} Oops La requête a dépassé le délai d'attente. Vous devriez réessayer dans quelques instant… @@ -59,12 +130,34 @@ {#if !exercice.submitted || sberr}
- {JSON.stringify(flags)} + {#each flags as flag ((flag.type?flag.type:"i") + flag.id)} + {#if flag.type == "mcq"} + + {:else} + + {/if} + {/each} +
diff --git a/frontend/ui/src/components/FlagKey.svelte b/frontend/ui/src/components/FlagKey.svelte new file mode 100644 index 00000000..b227fd96 --- /dev/null +++ b/frontend/ui/src/components/FlagKey.svelte @@ -0,0 +1,173 @@ + + +
+ + {#if flag.found && flag.value} + {flag.value} + {/if} + {#if !flag.found} + {#each values as v, index} +
+ {#if !flag.choices} + {#if !flag.multiline} + + {:else} + + {/if} + {:else} + + {/if} + {#if flag.choices_cost > 0} + + {:else if flag.separator && !flag.nb_lines && index == values.length - 1} + + {/if} +
+ {/each} + {#if flag.help} + {flag.help} + {/if} + {:else} +
diff --git a/frontend/ui/src/components/FlagMCQ.svelte b/frontend/ui/src/components/FlagMCQ.svelte new file mode 100644 index 00000000..efddea16 --- /dev/null +++ b/frontend/ui/src/components/FlagMCQ.svelte @@ -0,0 +1,49 @@ + + +{#if flag.label} +

+ {flag.label} : + {#if flag.found} +

+{/if} +{#if !flag.found || flag.justify} + {#each Object.keys(flag.choices) as cid, index} +
+ + + {#if values[Number(cid)] && flag.justify && (!flag.choices[cid].justification || !flag.choices[cid].justification.solved)} + + {/if} + {#if flag.choices[cid].justification && flag.choices[cid].justification.solved} +
+ {/each} +{/if} +
diff --git a/frontend/ui/src/components/TeamChangeName.svelte b/frontend/ui/src/components/TeamChangeName.svelte index bf7808e0..fb08825b 100644 --- a/frontend/ui/src/components/TeamChangeName.svelte +++ b/frontend/ui/src/components/TeamChangeName.svelte @@ -20,7 +20,7 @@ messageClass = "info"; sberr = "Votre nom d'équipe a été changé avec succès."; message = ""; - } else { + } else if (i > 0) { setTimeout(gotoHomeOnDiff, 850, i-1); } }) diff --git a/frontend/ui/src/routes/[theme]/[exercice].svelte b/frontend/ui/src/routes/[theme]/[exercice].svelte index 739a2501..34589f52 100644 --- a/frontend/ui/src/routes/[theme]/[exercice].svelte +++ b/frontend/ui/src/routes/[theme]/[exercice].svelte @@ -18,6 +18,8 @@ props: { theme: context.theme, exercice: exercice, + refresh_my: context.refresh_my, + refresh_teams: context.refresh_teams, } }; } @@ -45,6 +47,9 @@ export let theme; export let exercice; + + export let refresh_my; + export let refresh_teams; @@ -147,8 +152,13 @@ {/if} - {#if !$my.exercices[exercice.id].solved} - + {#if !$my.exercices[exercice.id].solved_rank} + {:else} {/if} diff --git a/frontend/ui/src/routes/[theme]/index.svelte b/frontend/ui/src/routes/[theme]/index.svelte index 3a47e7b6..888cc432 100644 --- a/frontend/ui/src/routes/[theme]/index.svelte +++ b/frontend/ui/src/routes/[theme]/index.svelte @@ -38,19 +38,19 @@ on:click={goto(`/${theme.urlid}/${theme.exercices[k].urlid}`)} >
-
+
diff --git a/frontend/ui/src/routes/register.svelte b/frontend/ui/src/routes/register.svelte index bc4930b6..27f769b6 100644 --- a/frontend/ui/src/routes/register.svelte +++ b/frontend/ui/src/routes/register.svelte @@ -39,7 +39,7 @@ refresh_my((my) => { if (my && my.team_id) { goto('/'); - } else { + } else if (i > 0) { setTimeout(gotoHomeOnDiff, 650, i-1); } }) diff --git a/frontend/ui/src/stores/mythemes.js b/frontend/ui/src/stores/mythemes.js index 726b71b5..279d9bc7 100644 --- a/frontend/ui/src/stores/mythemes.js +++ b/frontend/ui/src/stores/mythemes.js @@ -11,7 +11,7 @@ export const myThemes = derived([my, themesStore], ([$my, $themesStore]) => { if ($my && $my.exercices) { for (let k in $themesStore.themes[key].exercices) { - if ($my.exercices[k] && $my.exercices[k].solved) { + if ($my.exercices[k] && $my.exercices[k].solved_rank) { themes[key].exercice_solved++; } } @@ -32,7 +32,7 @@ export const tags = derived([my, themesStore], ([$my, $themesStore]) => { else tags[tag].count += 1; - if ($my && $my.exercices && $my.exercices[k] && $my.exercices[k].solved) + if ($my && $my.exercices && $my.exercices[k] && $my.exercices[k].solved_rank) tags[tag].solved += 1; }); }