Merge branch 'master' of ssh://161.35.163.87:/home/django/rts

This commit is contained in:
Ross
2022-01-03 15:34:47 +00:00
6 changed files with 961 additions and 580 deletions
+2 -1
View File
@@ -3,5 +3,6 @@
"javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false, "javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
"javascript.format.insertSpaceAfterKeywordsInControlFlowStatements": false, "javascript.format.insertSpaceAfterKeywordsInControlFlowStatements": false,
"javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": false, "javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": false,
"javascript.format.enable": false "javascript.format.enable": false,
"liveServer.settings.port": 5502
} }
+71 -17
View File
@@ -1,18 +1,67 @@
html, body, div, span, applet, object, iframe, html,
h1, h2, h3, h4, h5, h6, p, blockquote, pre, body,
a, abbr, acronym, address, big, cite, code, div,
del, dfn, em, font, img, ins, kbd, q, s, samp, span,
small, strike, strong, sub, sup, tt, var, applet,
dl, dt, dd, ol, ul, li, object,
fieldset, form, label, legend, iframe,
table, caption, tbody, tfoot, thead, tr, th, td { h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
font,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td {
margin: 0; margin: 0;
padding: 0; padding: 0;
border: 0; border: 0;
outline: 0; outline: 0;
font-weight: inherit; font-weight: inherit;
font-style: inherit; font-style: inherit;
font-size: 100%;
font-family: inherit; font-family: inherit;
vertical-align: baseline; vertical-align: baseline;
} }
@@ -27,7 +76,8 @@ body {
background: white; background: white;
} }
ol, ul { ol,
ul {
list-style: none; list-style: none;
} }
@@ -36,17 +86,21 @@ table {
border-spacing: 0; border-spacing: 0;
} }
caption, th, td { caption,
th,
td {
text-align: left; text-align: left;
font-weight: normal; font-weight: normal;
} }
blockquote:before, blockquote:after, blockquote:before,
q:before, q:after { blockquote:after,
q:before,
q:after {
content: ""; content: "";
} }
blockquote, q { blockquote,
quotes: "" ""; q {
} quotes: """";
}
+239 -148
View File
@@ -3,7 +3,7 @@
@import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700"); @import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700");
/* Colourscheme from https://www.materialui.co/colors */ /* Colourscheme from https://www.materialui.co/colors */
* { * {
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
@@ -17,7 +17,6 @@
appearance: none; appearance: none;
font-family: "Noto Sans", sans-serif !important; font-family: "Noto Sans", sans-serif !important;
font-weight: 400; font-weight: 400;
font-size: 1.6rem;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
line-height: 1.5; line-height: 1.5;
} }
@@ -49,7 +48,12 @@ html {
font-size: 62.5%; font-size: 62.5%;
} }
html, body, input:not([type=text]), button, select, option { html,
body,
input:not([type=text]),
button,
select,
option {
user-select: none; user-select: none;
-moz-user-select: none; -moz-user-select: none;
-webkit-user-select: none; -webkit-user-select: none;
@@ -57,11 +61,18 @@ html, body, input:not([type=text]), button, select, option {
-o-user-select: none; -o-user-select: none;
} }
html, body, input, button, select, option, textarea { html,
vertical-align:top; body,
input,
button,
select,
option,
textarea {
vertical-align: top;
margin: 0; margin: 0;
padding: 0; padding: 0;
color: black; /*#1d3850;*/ color: black;
/*#1d3850;*/
/*font-family: 'Noto Sans', sans-serif;*/ /*font-family: 'Noto Sans', sans-serif;*/
overflow: hidden; overflow: hidden;
} }
@@ -72,7 +83,11 @@ body {
font-weight: 400; font-weight: 400;
} }
input, button, select, option, textarea { input,
button,
select,
option,
textarea {
background-color: white; background-color: white;
font-size: 100%; font-size: 100%;
padding: 0.4rem 0.8rem; padding: 0.4rem 0.8rem;
@@ -174,8 +189,8 @@ td {
} }
.question-list-flag { .question-list-flag {
float: right; float: right;
color: #311B92; color: #311B92;
visibility: hidden; visibility: hidden;
} }
@@ -247,7 +262,7 @@ td {
} }
.no-touch .navigation:hover { .no-touch .navigation:hover {
background-color: #1a237e; background-color: #1a237e;
border-color: #ddd; border-color: #ddd;
} }
@@ -275,7 +290,7 @@ td {
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
} }
.question * { .question * {
-webkit-transform: translate3d(0, 0, 0); -webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0);
@@ -350,7 +365,7 @@ td {
.canvas-panel { .canvas-panel {
display: block; display: block;
padding: 0; padding: 0;
margin: 0; margin: 0;
background-color: black; background-color: black;
image-rendering: optimizeSpeed; image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges; image-rendering: -moz-crisp-edges;
@@ -529,7 +544,7 @@ img {
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
overflow: auto; overflow: auto;
background-color: rgba(0,0,0,0.4); background-color: rgba(0, 0, 0, 0.4);
text-align: center; text-align: center;
} }
@@ -541,7 +556,7 @@ img {
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
border-radius: 5px; border-radius: 5px;
padding: 0px; padding: 0px;
} }
.dialog-title { .dialog-title {
@@ -606,9 +621,9 @@ img {
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
background-color: rgba(0,0,0,0.9); background-color: rgba(0, 0, 0, 0.9);
z-index: 2; z-index: 2;
cursor: pointer; cursor: pointer;
color: lightgray; color: lightgray;
overflow: auto; overflow: auto;
} }
@@ -623,7 +638,7 @@ img {
right: 0; right: 0;
bottom: 0; bottom: 0;
z-index: 2; z-index: 2;
cursor: pointer; cursor: pointer;
color: lightgray; color: lightgray;
overflow: auto; overflow: auto;
} }
@@ -652,7 +667,8 @@ img {
opacity: 1; opacity: 1;
} }
.close:before, .close:after { .close:before,
.close:after {
position: absolute; position: absolute;
left: 15px; left: 15px;
content: ' '; content: ' ';
@@ -796,7 +812,7 @@ select option:disabled {
} }
.feedback { .feedback {
padding-top: 0.8rem; padding-top: 0.8rem;
} }
#options-panel { #options-panel {
@@ -816,72 +832,89 @@ select option:disabled {
padding-top: 20px; padding-top: 20px;
} }
.packet-button {
display:inline-block; .login-button {
padding:0.35em 1.2em; display: inline-block;
border:0.1em solid #FFFFFF; padding: 0.35em 1.2em;
margin:0 0.3em 0.3em 0; border: 0.1em solid purple;
border-radius:0.12em; margin: 0 0.3em 0.3em 0;
border-radius: 0.12em;
box-sizing: border-box; box-sizing: border-box;
text-decoration:none; text-decoration: none;
font-family:'Roboto',sans-serif; font-family: 'Roboto', sans-serif;
font-weight:300; font-weight: 300;
color:#FFFFFF; color: rgb(201, 0, 201);
text-align:center; text-align: center;
transition: all 0.2s;
background-color: black;
}
.packet-button {
display: inline-block;
padding: 0.35em 1.2em;
border: 0.1em solid #FFFFFF;
margin: 0 0.3em 0.3em 0;
border-radius: 0.12em;
box-sizing: border-box;
text-decoration: none;
font-family: 'Roboto', sans-serif;
font-weight: 300;
color: #FFFFFF;
text-align: center;
transition: all 0.2s; transition: all 0.2s;
} }
.packet-button.cached:after{ .packet-button.cached:after {
content: "cached"; content: "cached";
width: 12px; width: 12px;
height: 12px; height: 12px;
color: gray; color: gray;
border-radius: 50%; border-radius: 50%;
position:relative; position: relative;
transform: translate(15px, 5.5px) rotate(270deg); transform: translate(15px, 5.5px) rotate(270deg);
display: inline-block; display: inline-block;
right: 0; right: 0;
font-size: 8px; font-size: 8px;
} }
.packet-button.out-of-date{ .packet-button.out-of-date {
color: darkslategray color: darkslategray
} }
.save-button { .save-button {
display:inline-block; display: inline-block;
margin-left: 10px; margin-left: 10px;
color:#FFFFFF; color: #FFFFFF;
border-bottom:2px solid transparent; border-bottom: 2px solid transparent;
} }
.save-button a { .save-button a {
color: inherit; color: inherit;
} }
.save-button:hover { .save-button:hover {
color: #311B92; color: #311B92;
border-bottom:2px solid #311B92; border-bottom: 2px solid #311B92;
} }
.packet-button:hover{ .packet-button:hover {
color:lightblue; color: lightblue;
border-color:blue; border-color: blue;
} }
.progress-block { .progress-block {
position: fixed; position: fixed;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
font-size: smaller; font-size: smaller;
} }
#timer { #timer {
/* left: 50%; */ /* left: 50%; */
margin: auto; margin: auto;
margin-right: 1em; margin-right: 1em;
opacity: 25%; opacity: 25%;
} }
#timer:hover:before { #timer:hover:before {
@@ -889,69 +922,97 @@ select option:disabled {
} }
.sk-cube-grid { .sk-cube-grid {
width: 60px; width: 60px;
height: 60px; height: 60px;
} }
.sk-cube-grid .sk-cube { .sk-cube-grid .sk-cube {
width: 33%; width: 33%;
height: 33%; height: 33%;
background-color: #4527A0; background-color: #4527A0;
float: left; float: left;
-webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
} }
.sk-cube-grid .sk-cube1 { .sk-cube-grid .sk-cube1 {
-webkit-animation-delay: 0.2s; -webkit-animation-delay: 0.2s;
animation-delay: 0.2s; } animation-delay: 0.2s;
}
.sk-cube-grid .sk-cube2 { .sk-cube-grid .sk-cube2 {
-webkit-animation-delay: 0.3s; -webkit-animation-delay: 0.3s;
animation-delay: 0.3s; } animation-delay: 0.3s;
}
.sk-cube-grid .sk-cube3 { .sk-cube-grid .sk-cube3 {
-webkit-animation-delay: 0.4s; -webkit-animation-delay: 0.4s;
animation-delay: 0.4s; } animation-delay: 0.4s;
}
.sk-cube-grid .sk-cube4 { .sk-cube-grid .sk-cube4 {
-webkit-animation-delay: 0.1s; -webkit-animation-delay: 0.1s;
animation-delay: 0.1s; } animation-delay: 0.1s;
}
.sk-cube-grid .sk-cube5 { .sk-cube-grid .sk-cube5 {
-webkit-animation-delay: 0.2s; -webkit-animation-delay: 0.2s;
animation-delay: 0.2s; } animation-delay: 0.2s;
}
.sk-cube-grid .sk-cube6 { .sk-cube-grid .sk-cube6 {
-webkit-animation-delay: 0.3s; -webkit-animation-delay: 0.3s;
animation-delay: 0.3s; } animation-delay: 0.3s;
}
.sk-cube-grid .sk-cube7 { .sk-cube-grid .sk-cube7 {
-webkit-animation-delay: 0s; -webkit-animation-delay: 0s;
animation-delay: 0s; } animation-delay: 0s;
}
.sk-cube-grid .sk-cube8 { .sk-cube-grid .sk-cube8 {
-webkit-animation-delay: 0.1s; -webkit-animation-delay: 0.1s;
animation-delay: 0.1s; } animation-delay: 0.1s;
}
.sk-cube-grid .sk-cube9 { .sk-cube-grid .sk-cube9 {
-webkit-animation-delay: 0.2s; -webkit-animation-delay: 0.2s;
animation-delay: 0.2s; } animation-delay: 0.2s;
}
@-webkit-keyframes sk-cubeGridScaleDelay { @-webkit-keyframes sk-cubeGridScaleDelay {
0%, 70%, 100% {
-webkit-transform: scale3D(1, 1, 1); 0%,
transform: scale3D(1, 1, 1); 70%,
} 35% { 100% {
-webkit-transform: scale3D(0, 0, 1); -webkit-transform: scale3D(1, 1, 1);
transform: scale3D(0, 0, 1); transform: scale3D(1, 1, 1);
} }
35% {
-webkit-transform: scale3D(0, 0, 1);
transform: scale3D(0, 0, 1);
}
} }
@keyframes sk-cubeGridScaleDelay { @keyframes sk-cubeGridScaleDelay {
0%, 70%, 100% {
-webkit-transform: scale3D(1, 1, 1); 0%,
transform: scale3D(1, 1, 1); 70%,
} 35% { 100% {
-webkit-transform: scale3D(0, 0, 1); -webkit-transform: scale3D(1, 1, 1);
transform: scale3D(0, 0, 1); transform: scale3D(1, 1, 1);
} }
35% {
-webkit-transform: scale3D(0, 0, 1);
transform: scale3D(0, 0, 1);
}
} }
.displayblock { .displayblock {
display: block display: block
} }
.review-list-header { .review-list-header {
@@ -971,30 +1032,30 @@ display: block
padding-bottom: 0px; padding-bottom: 0px;
opacity: 50%; opacity: 50%;
text-align: center; text-align: center;
} }
#resume-exam-button { #resume-exam-button {
position: fixed; position: fixed;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
} }
#pause-text { #pause-text {
position: fixed; position: fixed;
/* left: 50%; */ /* left: 50%; */
width: 100%; width: 100%;
text-align: center; text-align: center;
top: 20%; top: 20%;
font-size: xxx-large; font-size: xxx-large;
transform: translate(0%, 20%); transform: translate(0%, 20%);
} }
#pause-time-remaining { #pause-time-remaining {
width: auto; width: auto;
font-size: large; font-size: large;
/* position: fixed; */ /* position: fixed; */
text-align: center; text-align: center;
} }
.packet-database-options { .packet-database-options {
@@ -1048,36 +1109,40 @@ display: block
.lds-ripple { .lds-ripple {
display: inline-block; display: inline-block;
position: relative; position: relative;
width: 80px; width: 80px;
height: 80px; height: 80px;
} }
.lds-ripple div { .lds-ripple div {
position: absolute; position: absolute;
border: 4px solid #4527A0; border: 4px solid #4527A0;
opacity: 1;
border-radius: 50%;
animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.lds-ripple div:nth-child(2) {
animation-delay: -0.5s;
}
@keyframes lds-ripple {
0% {
top: 36px;
left: 36px;
width: 0;
height: 0;
opacity: 1; opacity: 1;
} border-radius: 50%;
100% { animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
top: 0px; }
left: 0px;
width: 72px; .lds-ripple div:nth-child(2) {
height: 72px; animation-delay: -0.5s;
opacity: 0; }
}
@keyframes lds-ripple {
0% {
top: 36px;
left: 36px;
width: 0;
height: 0;
opacity: 1;
}
100% {
top: 0px;
left: 0px;
width: 72px;
height: 72px;
opacity: 0;
}
} }
#submit-error-overlay { #submit-error-overlay {
@@ -1095,4 +1160,30 @@ display: block
.cache-out-of-date { .cache-out-of-date {
color: red; color: red;
} }
.user-text {
color: darkslateblue;
}
.inactive::before {
content: "inactive";
transform: rotate(45deg);
color: red;
font-size: 1rem;
font-weight: 900;
border: 0.25rem solid red;
display: inline-block;
/* padding: 0.25rem 1rem; */
text-transform: uppercase;
border-radius: 1rem;
font-family: 'Courier';
/* mix-blend-mode: multiply; */
opacity: 30%;
margin-left: -2em;
position: absolute;
}
.invalid-login {
color: red;
}
+44 -29
View File
@@ -19,8 +19,8 @@
<div class="nav-bar"> <div class="nav-bar">
<button id="review-button" class="navigation nav-right"><b></b></button> <button id="review-button" class="navigation nav-right"><b></b></button>
<button id="nav-submit-button" class="submit-button navigation nav-right"><b>submit</b></button> <button id="nav-submit-button" class="submit-button navigation nav-right"><b>submit</b></button>
<button id="options-button" class="navigation nav-right" <!--<button id="options-button" class="navigation nav-right"
title="click to load new packet or manage saved answers">options</button> title="click to load new packet or manage saved answers">options</button>-->
<button id="review-overlay-button" class="navigation nav-right" <button id="review-overlay-button" class="navigation nav-right"
title="click to finish exam and review answers">review</button> title="click to finish exam and review answers">review</button>
<button id="fullscreen-overlay-button" class="navigation nav-right" <button id="fullscreen-overlay-button" class="navigation nav-right"
@@ -63,9 +63,20 @@
</div> </div>
<div id="options-panel" class="fullscreen-overlay"> <div id="options-panel" class="fullscreen-overlay">
<h1>RTS</h1> <h1>RTS</h1>
<input type='button' id='btn-candidate-login' class="login-button" value='Enter candidate details'><span
id="candidate-details"></span>
<!-- <a href="#" id="overlay-close" class="close"></a> --> <!-- <a href="#" id="overlay-close" class="close"></a> -->
<div id="user" class="user-text"></div>
<div id="packets"> <div id="packets">
<p>Available Packets (click to load):</p> <p>Click buttons below to load an exam / packet</p>
<span class="exam-wrapper hidden">
<h2>Available Exams:</h2>
<span id="exam-list">
</span>
</span>
<h2>Available Packets:</h2>
<span id="packet-list"> <span id="packet-list">
</span> </span>
</div> </div>
@@ -74,28 +85,28 @@
<div id="storage-details"> <div id="storage-details">
</div> </div>
<div id="cache-details"> <div id="cache-details">
<details> <details>
<summary></summary> <summary></summary>
<ul> <ul>
</ul> </ul>
</details> </details>
</div> </div>
<details> <details>
<summary>Options</summary> <summary>Options</summary>
<div id="database-buttons"> <div id="database-buttons">
<input type='button' id='btn-delete-answer-databases' value='Delete local answers'> <input type='button' id='btn-delete-answer-databases' value='Delete local answers'>
<input type='button' id='btn-delete-cached-questions' value='Delete cached questions'> <input type='button' id='btn-delete-cached-questions' value='Delete cached questions'>
</div> </div>
<div id="local-fileloader"> <div id="local-fileloader">
<form id="jsonFile" name="jsonFile" enctype="multipart/form-data" method="post"> <form id="jsonFile" name="jsonFile" enctype="multipart/form-data" method="post">
<fieldset> <fieldset>
<h2>Load local question set</h2> <h2>Load local question set</h2>
<input type='file' id='fileinput'> <input type='file' id='fileinput'>
<input type='button' id='btn-local-file-load' value='Load'> <input type='button' id='btn-local-file-load' value='Load'>
</fieldset> </fieldset>
</form> </form>
</div> </div>
</details> </details>
</div> </div>
<div id="review-overlay" class="fullscreen-overlay"> <div id="review-overlay" class="fullscreen-overlay">
@@ -137,7 +148,7 @@
</div> </div>
<div id="exam-candidate-number" class="dialog-text hidden"> <div id="exam-candidate-number" class="dialog-text hidden">
Check your below candidate number is correct. Check your below candidate number is correct.
<input type='number' size=10 id='candidate-number2'></input> <input type='number' size=10 id='candidate-number2' disabled></input>
</div> </div>
<button class="start-packet-button navigation dialog-yes">Start</button> <button class="start-packet-button navigation dialog-yes">Start</button>
</div> </div>
@@ -152,12 +163,13 @@
<button id="dialog-submit-button" class="submit-button navigation dialog-review hidden"><b>submit</b></button> <button id="dialog-submit-button" class="submit-button navigation dialog-review hidden"><b>submit</b></button>
</div> </div>
<div id="login-dialog" class="dialog modal"> <div id="login-dialog" class="dialog modal noclose">
<h3 class="dialog-title">Select exam</h3> <h3 class="dialog-title">Enter Details</h3>
<div class="dialog-text"> <div class="dialog-text">
Candidate number: <input type="text" id="candidate-number" name="candidate" required size="10"> Candidate number: <input type="number" id="candidate-number" name="candidate" required size="10"><br />
Passcode: <input type="text" id="passcode" name="passcode" required size="10"><br />
</div> </div>
<button id="start-exam-button" class="navigation dialog-yes">Start</button> <button id="login-button" class="navigation dialog-yes">Login</button>
</div> </div>
<div id="loading" class="fullscreen-overlay"> <div id="loading" class="fullscreen-overlay">
@@ -179,7 +191,10 @@
</div> </div>
<div id="question-loading" class="fullscreen-overlay-transparent"> <div id="question-loading" class="fullscreen-overlay-transparent">
<div class="progress-block"> <div class="progress-block">
<div class="lds-ripple"><div></div><div></div></div> <div class="lds-ripple">
<div></div>
<div></div>
</div>
</div> </div>
</div> </div>
@@ -202,7 +217,7 @@
<script src="lib/dicomParser.min.js"></script> <script src="lib/dicomParser.min.js"></script>
<script src="lib/cornerstoneMath.min.js"></script> <script src="lib/cornerstoneMath.min.js"></script>
<!-- <script src="lib/cornerstoneTools.min.js"></script> --> <!-- <script src="lib/cornerstoneTools.min.js"></script> -->
<script src="https://www.unpkg.com/cornerstone-tools@5.1.3/dist/cornerstoneTools.js"></script> <script src="https://www.unpkg.com/cornerstone-tools@5.2.0/dist/cornerstoneTools.js"></script>
<script src="lib/cornerstoneWebImageLoader.min.js"></script> <script src="lib/cornerstoneWebImageLoader.min.js"></script>
<script src="lib/cornerstoneWADOImageLoader.js"></script> <script src="lib/cornerstoneWADOImageLoader.js"></script>
<script src="lib/cornerstone-base64-image-loader.umd.js"></script> <script src="lib/cornerstone-base64-image-loader.umd.js"></script>
+29 -23
View File
@@ -8,6 +8,8 @@ export function submitAnswers(exam_details, db, config) {
.then((a) => { .then((a) => {
let json = { let json = {
eid: exam_details.eid, eid: exam_details.eid,
cid: exam_details.cid,
start_time: exam_details.start_time,
answers: JSON.stringify(a), answers: JSON.stringify(a),
}; };
postAnswers(json, config, exam_details); postAnswers(json, config, exam_details);
@@ -25,10 +27,10 @@ export function submitAnswers(exam_details, db, config) {
export function getJsonAnswers(exam_details, db) { export function getJsonAnswers(exam_details, db) {
console.log(exam_details) console.log(exam_details)
console.log({ console.log({
aid: exam_details.aid, aid: exam_details.aid,
cid: exam_details.cid, cid: exam_details.cid,
eid: exam_details.eid, eid: exam_details.eid,
}) })
return db.answers return db.answers
.where({ .where({
aid: exam_details.aid, aid: exam_details.aid,
@@ -56,7 +58,7 @@ export function postAnswers(ans, config, exam_details) {
); );
if (ret) { if (ret) {
$( document ).trigger( "saveSessionEvent", [ true ] ); $(document).trigger("saveSessionEvent", [true]);
if (config.exam_results_url != "") { if (config.exam_results_url != "") {
let url = config.exam_results_url; let url = config.exam_results_url;
@@ -70,8 +72,7 @@ export function postAnswers(ans, config, exam_details) {
); );
} }
$("#options-panel").show(); $("#options-panel").show();
} else { } else {}
}
} else { } else {
alert(`${data.question_count} answers sucessfully submitted.`); alert(`${data.question_count} answers sucessfully submitted.`);
} }
@@ -100,13 +101,13 @@ function submissionError(data, answer_json, exam_details) {
let answer_map = {} let answer_map = {}
answers.forEach((ans, n) => { answers.forEach((ans, n) => {
if (!answer_map.hasOwnProperty(ans.qid)) { if (!answer_map.hasOwnProperty(ans.qid)) {
answer_map[ans.qid] = []; answer_map[ans.qid] = [];
} }
answer_map[ans.qid].push(ans); answer_map[ans.qid].push(ans);
}); });
let html = $("<ul></ul>"); let html = $("<ul></ul>");
@@ -114,13 +115,13 @@ function submissionError(data, answer_json, exam_details) {
exam_details.question_order.forEach((i, j) => { exam_details.question_order.forEach((i, j) => {
console.log(i, answer_map) console.log(i, answer_map)
if (i in answer_map) { if (i in answer_map) {
console.log("YES", i, answer_map) console.log("YES", i, answer_map)
let ans_array = answer_map[i]; let ans_array = answer_map[i];
ans_array.forEach((x, y) => { ans_array.forEach((x, y) => {
$(html).append(`<li><b>Question ${j+1}.${y}:</b> ${x.ans}</li>`); $(html).append(`<li><b>Question ${j+1}.${y}:</b> ${x.ans}</li>`);
}); });
} }
}) })
console.log(exam_details.question_order); console.log(exam_details.question_order);
@@ -145,10 +146,7 @@ export function getQuestion(url, question_number, question_total) {
return $.ajax({ return $.ajax({
dataType: "json", dataType: "json",
url: url, url: url,
progress: function (e) { progress: function(e) {
$("#progress").html(
`Downloading question [${question_number}/${question_total}]<br/>This file is compressed (no size available)`
);
if (e.lengthComputable) { if (e.lengthComputable) {
var completedPercentage = Math.round((e.loaded * 100) / e.total); var completedPercentage = Math.round((e.loaded * 100) / e.total);
@@ -157,6 +155,10 @@ export function getQuestion(url, question_number, question_total) {
e.total e.total
)}` )}`
); );
} else {
$("#progress").html(
`Downloading question [${question_number}/${question_total}]<br/>This file is compressed (downloaded ${helper.humanFileSize(e.loaded)})`
);
} }
}, },
error: (jqXHR, textStatus, errorThrown) => { error: (jqXHR, textStatus, errorThrown) => {
@@ -170,14 +172,18 @@ export function getQuestion(url, question_number, question_total) {
} }
export function postSavedAnswer(type, qid, answer, e, db_object, db) { export function postSavedAnswer(type, qid, answer, e, db_object, db) {
console.log("post", type, qid, answer, e) console.log("post", type, qid, answer, e)
return $.ajax({ return $.ajax({
type: "POST", type: "POST",
url: config.question_answer_submit_url, url: config.question_answer_submit_url,
data: JSON.stringify({ qid: `${type}/${qid}`, answer: answer, status: 2 }), data: JSON.stringify({
qid: `${type}/${qid}`,
answer: answer,
status: 2
}),
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
dataType: "json", dataType: "json",
success: function(data){ success: function(data) {
db_object.submitted = true; db_object.submitted = true;
db.user_answers.put(db_object); db.user_answers.put(db_object);
e.target.remove() e.target.remove()
@@ -185,7 +191,7 @@ return $.ajax({
}, },
error: function(errMsg) { error: function(errMsg) {
alert(errMsg); alert(errMsg);
} }
}); });
} }
+576 -362
View File
File diff suppressed because it is too large Load Diff