diff --git a/composer.json b/composer.json index eb2d37e..a5bc41a 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,5 @@ { "require": { - "rakibtg/sleekdb": "2.15", - "ext-json": "*" + "rakibtg/sleekdb": "2.15" } } \ No newline at end of file diff --git a/js/gamemgr.js b/js/gamemgr.js index f55697a..cfb7d17 100644 --- a/js/gamemgr.js +++ b/js/gamemgr.js @@ -227,34 +227,90 @@ function list_results_by_game(game) { return Number(b["testid"]) - Number(a["testid"]) }); // sort records by ID + let results_by_nickname = {}; results.forEach((record) => { - if (record["state"] !== "concluded") { - return; + let nickname = record["nickname"]; + if (!results_by_nickname.hasOwnProperty(nickname)) { + results_by_nickname[nickname] = []; } + results_by_nickname[nickname].push(record); + }); - let test_summary_record = document.createElement("section"); - test_summary_record.classList.add("test-summary-record"); + let nicknames = Object.keys(results_by_nickname); - let sequence_number_sec = document.createElement("section"); - sequence_number_sec.classList.add("summary-name-id-block"); - sequence_number_sec.innerText = record["nickname"] + "#" + n; - let duration_sec = document.createElement("section"); - duration_sec.classList.add("summary-duration"); - let start_time = unix_time_to_human_readable(record["start_time"]); - let end_time = unix_time_to_human_readable(record["end_time"]); + // mark best of the results + nicknames.forEach((nickname) => { + let result_group = results_by_nickname[nickname]; + let best_entry = null; + let best_percentage = -1.0; + result_group.forEach((result) => { + result["best"] = false; + if (result["state"] === "concluded") { + let percentage = result["summary"]["correct_answer_n"] / result["summary"]["challenge_n"]; + if ((best_entry === null) || (percentage >= best_percentage)) { + best_percentage = percentage; + best_entry = result; + } + } + }); + if (best_entry !== null) { + best_entry["best"] = true; + } + }); - let summary = record["summary"]; - duration_sec.innerHTML = `${start_time}-
${end_time}
${summary["correct_answer_n"]}/${summary["challenge_n"]}`; + // print the grouped results + nicknames.forEach((nickname) => { + let result_group = results_by_nickname[nickname]; - let percentage = document.createElement("section"); - percentage.classList.add("summary-percentage"); - let r = Math.floor((summary["correct_answer_n"] / summary["challenge_n"]) * 100); - percentage.innerHTML = `${r}%`; + let test_group_box = document.createElement("section"); + test_group_box.classList.add("summary-group") - test_summary_record.append(sequence_number_sec, duration_sec, percentage); - rd.appendChild(test_summary_record); + let nickname_box = document.createElement("section"); + nickname_box.classList.add("summary-nickname-box"); + nickname_box.innerText = nickname; - n--; + test_group_box.append(nickname_box); + + result_group.forEach((record) => { + if (record["state"] !== "concluded") { + return; + } + + let test_summary_record = document.createElement("section"); + test_summary_record.classList.add("test-summary-record"); + + // let sequence_number_sec = document.createElement("section"); + // sequence_number_sec.classList.add("summary-name-id-block"); + // sequence_number_sec.innerText = record["nickname"] + "#" + n; + let duration_sec = document.createElement("section"); + duration_sec.classList.add("summary-duration"); + let start_time = unix_time_to_human_readable(record["start_time"]); + let end_time = unix_time_to_human_readable(record["end_time"]); + + let summary = record["summary"]; + duration_sec.innerHTML = `${start_time}-
${end_time}
${summary["correct_answer_n"]}/${summary["challenge_n"]}`; + + let percentage = document.createElement("section"); + percentage.classList.add("summary-percentage"); + let r = Math.floor((summary["correct_answer_n"] / summary["challenge_n"]) * 100); + percentage.innerHTML = `${r}%`; + + test_summary_record.append(duration_sec, percentage); + + if (record["best"]) { + let best_badge = document.createElement("section"); + best_badge.classList.add("summary-best-badge"); + best_badge.innerText = "LEGJOBB"; + test_summary_record.append(best_badge); + } + + test_group_box.appendChild(test_summary_record); + + n--; + + }); + + rd.append(test_group_box); }); show("results_viewer_window"); diff --git a/style/quizmaster_area.css b/style/quizmaster_area.css index 84a62bd..d8b4ac5 100644 --- a/style/quizmaster_area.css +++ b/style/quizmaster_area.css @@ -62,20 +62,35 @@ section.window-inner tr td:first-of-type { text-align: right !important; } -.summary-name-id-block { +.summary-nickname-box { display: inline-block; position: relative; background-color: #176767; color: whitesmoke; padding: 0.5em; - height: 3.5em; - top: -1.1em; box-shadow: 5px 0 #d3e5e5; min-width: 12em; + margin: 0.5em 0; + width: 90%; } .test-summary-record { min-width: 25em; height: 3.5em; overflow: clip; + margin-left: 2em; +} + +.summary-group { + margin: 0.5em 0; +} + +.summary-best-badge { + position: absolute; + display: block; + font-size: 0.8em; + top: 0; + right: 0; + padding: 0.2em; + color: #671b17; } \ No newline at end of file