diff --git a/frontend/ui/src/lib/components/ExerciceHints.svelte b/frontend/ui/src/lib/components/ExerciceHints.svelte index 065a3923..6de5ed6e 100644 --- a/frontend/ui/src/lib/components/ExerciceHints.svelte +++ b/frontend/ui/src/lib/components/ExerciceHints.svelte @@ -10,6 +10,7 @@ Spinner, } from 'sveltestrap'; + import { my } from '$lib/stores/my.js'; import { settings } from '$lib/stores/settings.js'; export let hints = []; diff --git a/frontend/ui/src/lib/stores/issues.js b/frontend/ui/src/lib/stores/issues.js index a6508fcb..8c87bdfa 100644 --- a/frontend/ui/src/lib/stores/issues.js +++ b/frontend/ui/src/lib/stores/issues.js @@ -5,28 +5,19 @@ import { stop_refresh } from './common'; let refresh_interval_issues = null; function createIssuesStore() { - const { subscribe, set, update } = writable({issues: [], issues_idx: {}, issues_nb_responses: 0, issues_need_info: 0}); + const { subscribe, set, update } = writable([]); function updateFunc (res_issues, cb=null) { if (res_issues.status === 200) { res_issues.json().then((issues) => { - const issues_idx = {}; - let issues_nb_responses = 0; - let issues_need_info = 0; - issues.forEach(function(issue, k) { - issues_idx[issue.id] = issue; - issues_nb_responses += issue.texts.length; - if (issue.state == 'need-info') issues_need_info++; - issues[k].texts.reverse(); - }) - update((i) => (Object.assign(i, {issues, issues_idx, issues_nb_responses, issues_need_info}))); + update((i) => issues); if (cb) { - cb(issues, issues_idx, issues_nb_responses, issues_need_info); + cb(issues); } }); } else if (res_issues.status === 404) { - update((i) => ({issues: [], issues_idx: {}, issues_nb_responses: 0, issues_need_info: 0})); + update((i) => ([])); } } @@ -57,22 +48,51 @@ export const issuesStore = createIssuesStore(); export const issues = derived( issuesStore, - ($issuesStore) => ($issuesStore.issues), + ($issuesStore) => { + $issuesStore.forEach(function(issue, k) { + $issuesStore[k].texts.reverse(); + }) + return $issuesStore; + }, ); export const issues_idx = derived( - issuesStore, - ($issuesStore) => ($issuesStore.issues_idx), + issues, + ($issues) => { + const issues_idx = {}; + + $issues.forEach(function(issue, k) { + issues_idx[issue.id] = issue; + }) + + return issues_idx; + }, ); export const issues_nb_responses = derived( issuesStore, - ($issuesStore) => ($issuesStore.issues_nb_responses), + ($issuesStore) => { + let issues_nb_responses = 0; + + $issuesStore.forEach(function(issue, k) { + issues_nb_responses += issue.texts.length; + }) + + return issues_nb_responses; + }, ); export const issues_need_info = derived( issuesStore, - ($issuesStore) => ($issuesStore.issues_need_info), + ($issuesStore) => { + let issues_need_info = 0; + + $issuesStore.forEach(function(issue, k) { + if (issue.state == 'need-info') issues_need_info++; + }) + + return issues_need_info; + }, ); export const issues_known_responses = writable(0); diff --git a/frontend/ui/src/lib/stores/mythemes.js b/frontend/ui/src/lib/stores/mythemes.js index ef23b6a4..94a6fd08 100644 --- a/frontend/ui/src/lib/stores/mythemes.js +++ b/frontend/ui/src/lib/stores/mythemes.js @@ -3,33 +3,33 @@ import { derived } from 'svelte/store'; import seedrandom from 'seedrandom'; import { my } from './my.js'; -import { themesStore } from './themes.js'; +import { themes as themesStore } from './themes.js'; export const myThemes = derived([my, themesStore], ([$my, $themesStore]) => { - const themes = {}; + const mythemes = {}; - for (let key in $themesStore.themes) { - themes[key] = {exercice_solved: 0}; + for (let key in $themesStore) { + mythemes[key] = {exercice_solved: 0}; if ($my && $my.exercices) { - for (let k in $themesStore.themes[key].exercices) { + for (let k in $themesStore[key].exercices) { if ($my.exercices[k] && $my.exercices[k].solved_rank) { - themes[key].exercice_solved++; + mythemes[key].exercice_solved++; } } } } - return themes; + return mythemes; }); export const themes = derived( [my, themesStore], ([$my, $themesStore]) => { const arr = []; - for (let th in $themesStore.themes) { - $themesStore.themes[th].id = th - arr.push($themesStore.themes[th]); + for (let th in $themesStore) { + $themesStore[th].id = th + arr.push($themesStore[th]); } const size = arr.length; const rng = new seedrandom($my && $my.team_id ? $my.team_id : 0); @@ -51,9 +51,9 @@ export const themes = derived( export const tags = derived([my, themesStore], ([$my, $themesStore]) => { const tags = {}; - for (let key in $themesStore.themes) { - for (let k in $themesStore.themes[key].exercices) { - $themesStore.themes[key].exercices[k].tags.forEach((tag) => { + for (let key in $themesStore) { + for (let k in $themesStore[key].exercices) { + $themesStore[key].exercices[k].tags.forEach((tag) => { if (!tags[tag]) tags[tag] = {count: 1, solved: 0}; else diff --git a/frontend/ui/src/lib/stores/teams.js b/frontend/ui/src/lib/stores/teams.js index 51c0e2b5..6f851243 100644 --- a/frontend/ui/src/lib/stores/teams.js +++ b/frontend/ui/src/lib/stores/teams.js @@ -5,24 +5,15 @@ import { stop_refresh } from './common'; let refresh_interval_teams = null; function createTeamsStore() { - const { subscribe, set, update } = writable({teams:{}, teams_count: 0, rank: []}); + const { subscribe, set, update } = writable({}); function updateFunc(res_teams, cb=null) { if (res_teams.status === 200) { res_teams.json().then((teams) => { - const teams_count = Object.keys(teams).length - - const rank = []; - for (const tid in teams) { - teams[tid].id = Number(tid); - rank.push(teams[tid]); - } - rank.sort((a, b) => (a.rank > b.rank ? 1 : (a.rank == b.rank ? 0 : -1))); - - update((t) => (Object.assign(t, {teams, teams_count, rank}))); + update((t) => teams); if (cb) { - cb(teams, teams_count, rank); + cb(teams); } }); } @@ -55,15 +46,33 @@ export const teamsStore = createTeamsStore(); export const teams = derived( teamsStore, - ($teamsStore) => ($teamsStore.teams) + ($teamsStore) => { + const teams = {}; + + for (const tid in $teamsStore) { + teams[tid] = $teamsStore[tid]; + teams[tid].id = Number(tid); + } + + return teams; + } ); export const teams_count = derived( teamsStore, - ($teamsStore) => ($teamsStore.teams_count) + ($teamsStore) => Object.keys(teams).length ); export const rank = derived( - teamsStore, - ($teamsStore) => ($teamsStore.rank) + teams, + ($teams) => { + const rank = []; + + for (const tid in $teams) { + rank.push($teams[tid]); + } + rank.sort((a, b) => (a.rank > b.rank ? 1 : (a.rank == b.rank ? 0 : -1))); + + return rank; + } ); diff --git a/frontend/ui/src/lib/stores/themes.js b/frontend/ui/src/lib/stores/themes.js index 1ebaf204..592cf13c 100644 --- a/frontend/ui/src/lib/stores/themes.js +++ b/frontend/ui/src/lib/stores/themes.js @@ -5,47 +5,16 @@ import { stop_refresh } from './common'; let refresh_interval_themes = null; function createThemesStore() { - const { subscribe, set, update } = writable({themes: null, exercices_idx: {}, max_solved: 0}); + const { subscribe, set, update } = writable({}); async function updateFunc (res_themes, cb=null) { if (res_themes.status === 200) { const themes = await res_themes.json(); - let max_solved = 0; - const exercices_idx = {}; - - for (let key in themes) { - const theme = themes[key]; - - if (theme.solved > max_solved) { - max_solved = theme.solved; - } - - themes[key].exercice_count = Object.keys(theme.exercices).length; - themes[key].exercice_coeff_max = 0; - themes[key].max_gain = 0; - let last_exercice = null; - for (let k in theme.exercices) { - const exercice = theme.exercices[k]; - - themes[key].max_gain += exercice.gain; - if (themes[key].exercice_coeff_max < exercice.curcoeff) { - themes[key].exercice_coeff_max = exercice.curcoeff; - } - - if (last_exercice != null) - themes[key].exercices[last_exercice].next = k; - last_exercice = k; - - exercice.id = k; - exercices_idx[k] = exercice; - } - } - - update((t) => (Object.assign(t, {themes, exercices_idx, max_solved}))); + update((t) => themes); if (cb) { - cb(themes, exercices_idx, max_solved); + cb(themes); } } } @@ -77,15 +46,66 @@ export const themesStore = createThemesStore(); export const themes = derived( themesStore, - ($themesStore) => ($themesStore.themes), + ($themesStore) => { + const themes = {}; + + for (const key in $themesStore) { + const theme = $themesStore[key]; + + themes[key] = theme + themes[key].exercice_count = Object.keys(theme.exercices).length; + themes[key].exercice_coeff_max = 0; + themes[key].max_gain = 0; + + let last_exercice = null; + for (let k in theme.exercices) { + const exercice = theme.exercices[k]; + + themes[key].max_gain += exercice.gain; + if (themes[key].exercice_coeff_max < exercice.curcoeff) { + themes[key].exercice_coeff_max = exercice.curcoeff; + } + + if (last_exercice != null) + themes[key].exercices[last_exercice].next = k; + last_exercice = k; + + exercice.id = k; + } + } + + return themes; + }, ); export const exercices_idx = derived( themesStore, - ($themesStore) => ($themesStore.exercices_idx), + ($themesStore) => { + const ret = {}; + + for (const key in $themesStore) { + const theme = $themesStore[key]; + for (let k in theme.exercices) { + ret[k] = theme.exercices[k]; + } + } + + return ret; + }, ); export const max_solved = derived( themesStore, - ($themesStore) => ($themesStore.max_solved), + ($themesStore) => { + let ret = 0; + + for (const key in $themesStore) { + const theme = $themesStore[key]; + if (theme.solved > ret) { + ret = theme.solved; + } + } + + return ret; + }, ); diff --git a/frontend/ui/src/routes/issues/+page.svelte b/frontend/ui/src/routes/issues/+page.svelte index 763fa1be..fc1c6a12 100644 --- a/frontend/ui/src/routes/issues/+page.svelte +++ b/frontend/ui/src/routes/issues/+page.svelte @@ -132,7 +132,7 @@ Messages {#if !data.fillIssue} - {/if} @@ -159,7 +159,7 @@