@@ -886,7 +886,8 @@ try {
886886 button . id = r . id ;
887887 button . classList = ( r . status === "Incorrect" ) ? 'incorrect' : ( r . status === "Correct" ) ? 'correct' : '' ;
888888 if ( r . flagged ) button . classList . add ( 'flagged' ) ;
889- var response = `<b>Status:</b> ${ r . status . includes ( 'Unknown' ) ? r . status . split ( 'Unknown, ' ) [ 1 ] : r . status } at ${ unixToString ( r . timestamp ) } ${ ( r . reason ) ? `</p>\n<p><b>Response:</b> ${ r . reason } <br>` : '' } </p><button data-flag-response><i class="bi bi-flag-fill"></i> ${ r . flagged ? 'Unflag Response' : 'Flag for Review' } </button>` ;
889+ if ( r . review_later ) button . classList . add ( 'reviewLater' ) ;
890+ var response = `<b>Status:</b> ${ r . status . includes ( 'Unknown' ) ? r . status . split ( 'Unknown, ' ) [ 1 ] : r . status } at ${ unixToString ( r . timestamp ) } ${ ( r . reason ) ? `</p>\n<p><b>Response:</b> ${ r . reason } <br>` : '' } </p><div data-modal-actions style="margin-top: -0.25rem;"><button data-flag-response><i class="bi bi-flag-fill"></i> ${ r . flagged ? 'Unflag Response' : 'Flag for Review' } </button><button data-review-later-response><i class="bi ${ r . review_later ? 'bi-bookmark-check-fill' : 'bi-bookmark-plus-fill' } "></i> ${ r . review_later ? 'Mark Reviewed' : 'Review Later' } </button></div>` ;
890891 switch ( r . mode ) {
891892 case 'latex' :
892893 button . innerHTML = `${ convertLatexToMarkup ( r . response ) } \n<p class="hint">(Equation may not display properly)</p>\n<p>${ response } ` ;
@@ -906,6 +907,7 @@ try {
906907 // Resubmit check
907908 button . addEventListener ( "click" , async ( event ) => {
908909 if ( event . target . hasAttribute ( 'data-flag-response' ) ) return r . flagged ? unflagResponse ( event , true ) : flagResponse ( event , true ) ;
910+ if ( event . target . hasAttribute ( 'data-review-later-response' ) ) return r . review_later ? unReviewLaterResponse ( event , true ) : reviewLaterResponse ( event , true ) ;
909911 await resubmitCheck ( r ) ;
910912 window . scrollTo ( 0 , document . body . scrollHeight ) ;
911913 } ) ;
@@ -1131,7 +1133,8 @@ try {
11311133 button . id = r . id ;
11321134 button . classList = ( r . status === "Incorrect" ) ? 'incorrect' : ( r . status === "Correct" ) ? 'correct' : '' ;
11331135 if ( r . flagged ) button . classList . add ( 'flagged' ) ;
1134- var response = `<b>Status:</b> ${ r . status . includes ( 'Unknown' ) ? r . status . split ( 'Unknown, ' ) [ 1 ] : r . status } ${ ( r . reason ) ? `</p>\n<p><b>Response:</b> ${ r . reason } <br>` : '' } </p><button data-flag-response><i class="bi bi-flag-fill"></i> ${ r . flagged ? 'Unflag Response' : 'Flag for Review' } </button>` ;
1136+ if ( r . review_later ) button . classList . add ( 'reviewLater' ) ;
1137+ var response = `<b>Status:</b> ${ r . status . includes ( 'Unknown' ) ? r . status . split ( 'Unknown, ' ) [ 1 ] : r . status } ${ ( r . reason ) ? `</p>\n<p><b>Response:</b> ${ r . reason } <br>` : '' } </p><div data-modal-actions style="margin-top: -0.25rem;"><button data-flag-response><i class="bi bi-flag-fill"></i> ${ r . flagged ? 'Unflag Response' : 'Flag for Review' } </button><button data-review-later-response><i class="bi ${ r . review_later ? 'bi-bookmark-check-fill' : 'bi-bookmark-plus-fill' } "></i> ${ r . review_later ? 'Mark Reviewed' : 'Review Later' } </button></div>` ;
11351138 var segmentNumber = segmentsArray . find ( s => ( String ( s . id ) === String ( r . segment ) ) && ( courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( String ( r . seatCode ) . slice ( 0 , 1 ) ) ) ) ? ( String ( s . course ) === String ( courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( String ( r . seatCode ) . slice ( 0 , 1 ) ) ) ) . id ) ) : true ) ) ? ( segmentsArray . find ( s => ( String ( s . id ) === String ( r . segment ) ) && ( courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( String ( r . seatCode ) . slice ( 0 , 1 ) ) ) ) ? ( String ( s . course ) === String ( courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( String ( r . seatCode ) . slice ( 0 , 1 ) ) ) ) . id ) ) : true ) ) . number || r . segment ) : ( segmentsArray . find ( s => ( courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( String ( r . seatCode ) . slice ( 0 , 1 ) ) ) ) ? ( String ( s . course ) === String ( courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( String ( r . seatCode ) . slice ( 0 , 1 ) ) ) ) . id ) ) : false ) && JSON . parse ( s . question_ids || [ ] ) ?. find ( q => String ( q . id ) === String ( r . question_id ) ) ) ?. number || null ) ;
11361139 var questionNumber = JSON . parse ( segmentsArray . find ( s => String ( s . id ) === String ( r . segment ) ) ?. question_ids || '[]' ) . find ( q => String ( q . id ) === String ( r . question_id ) ) ?. name || questionsArray . find ( question => String ( question . id ) === String ( r . question_id ) ) . number ;
11371140 switch ( r . mode ) {
@@ -1153,6 +1156,7 @@ try {
11531156 // Resubmit check
11541157 button . addEventListener ( "click" , async ( event ) => {
11551158 if ( event . target . hasAttribute ( 'data-flag-response' ) ) return r . flagged ? unflagResponse ( event ) : flagResponse ( event ) ;
1159+ if ( event . target . hasAttribute ( 'data-review-later-response' ) ) return r . review_later ? unReviewLaterResponse ( event ) : reviewLaterResponse ( event ) ;
11561160 ui . view ( "" ) ;
11571161 await resubmitCheck ( r ) ;
11581162 window . scrollTo ( 0 , document . body . scrollHeight ) ;
@@ -1266,13 +1270,17 @@ try {
12661270 body : JSON . stringify ( {
12671271 usr : storage . get ( "code" ) ,
12681272 pwd : storage . get ( "password" ) ,
1269- question_id : event . srcElement . parentElement . id ,
1273+ question_id : event . srcElement . parentElement . parentElement . id ,
12701274 } ) ,
12711275 } )
12721276 . then ( q => q . json ( ) )
1273- . then ( ( ) => {
1277+ . then ( async ( ) => {
12741278 ui . setUnsavedChanges ( false ) ;
12751279 ui . toast ( "Flagged response for review." , 3000 , "success" , "bi bi-flag-fill" ) ;
1280+ await auth . bulkLoad ( [ "courses" , "segments" , "questions" , "responses" ] , storage . get ( "code" ) , storage . get ( "password" ) ) ;
1281+ await storage . idbReady ;
1282+ const _cache = ( await storage . idbGet ( 'cache' ) ) || storage . get ( 'cache' ) || { } ;
1283+ history = ( _cache ) . responses || [ ] ;
12761284 isInQuestion ? updateQuestion ( ) : updateHistory ( ) ;
12771285 } )
12781286 . catch ( ( e ) => {
@@ -1292,13 +1300,77 @@ try {
12921300 body : JSON . stringify ( {
12931301 usr : storage . get ( "code" ) ,
12941302 pwd : storage . get ( "password" ) ,
1295- question_id : event . srcElement . parentElement . id ,
1303+ question_id : event . srcElement . parentElement . parentElement . id ,
12961304 } ) ,
12971305 } )
12981306 . then ( q => q . json ( ) )
1299- . then ( ( ) => {
1307+ . then ( async ( ) => {
13001308 ui . setUnsavedChanges ( false ) ;
13011309 ui . toast ( "Unflagged response." , 3000 , "success" , "bi bi-flag-fill" ) ;
1310+ await auth . bulkLoad ( [ "courses" , "segments" , "questions" , "responses" ] , storage . get ( "code" ) , storage . get ( "password" ) ) ;
1311+ await storage . idbReady ;
1312+ const _cache = ( await storage . idbGet ( 'cache' ) ) || storage . get ( 'cache' ) || { } ;
1313+ history = ( _cache ) . responses || [ ] ;
1314+ isInQuestion ? updateQuestion ( ) : updateHistory ( ) ;
1315+ } )
1316+ . catch ( ( e ) => {
1317+ console . error ( e ) ;
1318+ ui . view ( "api-fail" ) ;
1319+ } ) ;
1320+ }
1321+
1322+ function reviewLaterResponse ( event , isInQuestion = false ) {
1323+ event . srcElement . disabled = true ;
1324+ ui . setUnsavedChanges ( true ) ;
1325+ fetch ( domain + '/reviewLater' , {
1326+ method : "POST" ,
1327+ headers : {
1328+ "Content-Type" : "application/json" ,
1329+ } ,
1330+ body : JSON . stringify ( {
1331+ usr : storage . get ( "code" ) ,
1332+ pwd : storage . get ( "password" ) ,
1333+ question_id : event . srcElement . parentElement . parentElement . id ,
1334+ } ) ,
1335+ } )
1336+ . then ( q => q . json ( ) )
1337+ . then ( async ( ) => {
1338+ ui . setUnsavedChanges ( false ) ;
1339+ ui . toast ( "Marked response to review later." , 3000 , "success" , "bi bi-bookmark-plus-fill" ) ;
1340+ await auth . bulkLoad ( [ "courses" , "segments" , "questions" , "responses" ] , storage . get ( "code" ) , storage . get ( "password" ) ) ;
1341+ await storage . idbReady ;
1342+ const _cache = ( await storage . idbGet ( 'cache' ) ) || storage . get ( 'cache' ) || { } ;
1343+ history = ( _cache ) . responses || [ ] ;
1344+ isInQuestion ? updateQuestion ( ) : updateHistory ( ) ;
1345+ } )
1346+ . catch ( ( e ) => {
1347+ console . error ( e ) ;
1348+ ui . view ( "api-fail" ) ;
1349+ } ) ;
1350+ }
1351+
1352+ function unReviewLaterResponse ( event , isInQuestion = false ) {
1353+ event . srcElement . disabled = true ;
1354+ ui . setUnsavedChanges ( true ) ;
1355+ fetch ( domain + '/unReviewLater' , {
1356+ method : "POST" ,
1357+ headers : {
1358+ "Content-Type" : "application/json" ,
1359+ } ,
1360+ body : JSON . stringify ( {
1361+ usr : storage . get ( "code" ) ,
1362+ pwd : storage . get ( "password" ) ,
1363+ question_id : event . srcElement . parentElement . parentElement . id ,
1364+ } ) ,
1365+ } )
1366+ . then ( q => q . json ( ) )
1367+ . then ( async ( ) => {
1368+ ui . setUnsavedChanges ( false ) ;
1369+ ui . toast ( "Marked response as reviewed." , 3000 , "success" , "bi bi-bookmark-check-fill" ) ;
1370+ await auth . bulkLoad ( [ "courses" , "segments" , "questions" , "responses" ] , storage . get ( "code" ) , storage . get ( "password" ) ) ;
1371+ await storage . idbReady ;
1372+ const _cache = ( await storage . idbGet ( 'cache' ) ) || storage . get ( 'cache' ) || { } ;
1373+ history = ( _cache ) . responses || [ ] ;
13021374 isInQuestion ? updateQuestion ( ) : updateHistory ( ) ;
13031375 } )
13041376 . catch ( ( e ) => {
0 commit comments