@@ -106,7 +106,6 @@ try {
106106 return ;
107107 }
108108 await auth . sync ( false , updateCode ) ;
109- ui . stopLoader ( ) ;
110109 } ;
111110
112111 init ( ) ;
@@ -438,123 +437,121 @@ try {
438437 } ) ;
439438 document . title = `Virtual Checker (${ storage . get ( "code" ) } )` ;
440439 const periodRange = getExtendedPeriodRange ( null , Number ( code . slice ( 0 , 1 ) ) ) ;
441- try {
442- await auth . bulkLoad ( [ "courses" , "segments" , "questions" , "responses" ] , storage . get ( "code" ) , storage . get ( "password" ) ) ;
443- await storage . idbReady ;
444- const bulkLoad = ( await storage . idbGet ( 'cache' ) ) || storage . get ( "cache" ) || { } ;
445- courses = bulkLoad . courses ;
446- segmentsArray = bulkLoad . segments ;
447- questionsArray = bulkLoad . questions ;
448- const course = courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( code . slice ( 0 , 1 ) ) ) ) ;
449- if ( course ) {
450- ui . view ( ) ;
440+ if ( ! ( await auth . bulkLoad ( [ "courses" , "segments" , "questions" , "responses" ] , storage . get ( "code" ) , storage . get ( "password" ) , false , false , ( ) => {
441+ ui . view ( "api-fail" ) ;
442+ } ) ) ) return ;
443+ await storage . idbReady ;
444+ const bulkLoad = ( await storage . idbGet ( 'cache' ) ) || storage . get ( "cache" ) || { } ;
445+ courses = bulkLoad . courses ;
446+ segmentsArray = bulkLoad . segments ;
447+ questionsArray = bulkLoad . questions ;
448+ const course = courses . find ( c => JSON . parse ( c . periods ) . includes ( Number ( code . slice ( 0 , 1 ) ) ) ) ;
449+ if ( course ) {
450+ ui . view ( ) ;
451+ } else {
452+ ui . startLoader ( ) ;
453+ return ui . view ( "no-course" ) ;
454+ }
455+ if ( document . getElementById ( "course-input" ) ) document . getElementById ( "course-input" ) . value = course . name || "Unknown Course" ;
456+ if ( document . querySelector ( '[data-syllabus-download]' ) ) {
457+ if ( course . syllabus ) {
458+ document . querySelector ( '[data-syllabus-download]' ) . removeAttribute ( 'hidden' ) ;
459+ document . querySelector ( '[data-syllabus-download]' ) . addEventListener ( 'click' , ( ) => {
460+ window . open ( course . syllabus , '_blank' ) ;
461+ } ) ;
451462 } else {
452- ui . startLoader ( ) ;
453- return ui . view ( "no-course" ) ;
463+ document . querySelector ( '[data-syllabus-download]' ) . setAttribute ( 'hidden' , '' ) ;
454464 }
455- if ( document . getElementById ( "course-input" ) ) document . getElementById ( "course-input" ) . value = course . name || "Unknown Course" ;
456- if ( document . querySelector ( '[data-syllabus-download]' ) ) {
457- if ( course . syllabus ) {
458- document . querySelector ( '[data-syllabus-download]' ) . removeAttribute ( 'hidden' ) ;
459- document . querySelector ( '[data-syllabus-download]' ) . addEventListener ( 'click' , ( ) => {
460- window . open ( course . syllabus , '_blank' ) ;
465+ }
466+ if ( document . querySelector ( '.alert' ) ) {
467+ var checker_announcement = JSON . parse ( course . checker_announcement || '{}' ) ;
468+ if ( ( checker_announcement . image || checker_announcement . title || checker_announcement . content || checker_announcement . link ) && ( checker_announcement . expires ? new Date ( `${ checker_announcement . expires } T${ extendedSchedule [ Number ( code . slice ( 0 , 1 ) ) ] [ 1 ] } :00` ) > new Date ( ) : true ) ) {
469+ document . querySelector ( '.alert' ) . removeAttribute ( 'hidden' ) ;
470+ document . querySelector ( '.alert' ) . classList = `alert ${ checker_announcement . layout || '' } ` ;
471+ if ( checker_announcement . image ) {
472+ document . querySelector ( '.alert img' ) . removeAttribute ( 'hidden' ) ;
473+ document . querySelector ( '.alert img' ) . src = checker_announcement . image ;
474+ mediumZoom ( document . querySelector ( '.alert img' ) , {
475+ background : "transparent"
461476 } ) ;
462477 } else {
463- document . querySelector ( '[data-syllabus-download] ' ) . setAttribute ( 'hidden' , '' ) ;
478+ document . querySelector ( '.alert img ' ) . setAttribute ( 'hidden' , '' ) ;
464479 }
465- }
466- if ( document . querySelector ( '.alert' ) ) {
467- var checker_announcement = JSON . parse ( course . checker_announcement || '{}' ) ;
468- if ( ( checker_announcement . image || checker_announcement . title || checker_announcement . content || checker_announcement . link ) && ( checker_announcement . expires ? new Date ( `${ checker_announcement . expires } T${ extendedSchedule [ Number ( code . slice ( 0 , 1 ) ) ] [ 1 ] } :00` ) > new Date ( ) : true ) ) {
469- document . querySelector ( '.alert' ) . removeAttribute ( 'hidden' ) ;
470- document . querySelector ( '.alert' ) . classList = `alert ${ checker_announcement . layout || '' } ` ;
471- if ( checker_announcement . image ) {
472- document . querySelector ( '.alert img' ) . removeAttribute ( 'hidden' ) ;
473- document . querySelector ( '.alert img' ) . src = checker_announcement . image ;
474- mediumZoom ( document . querySelector ( '.alert img' ) , {
475- background : "transparent"
476- } ) ;
477- } else {
478- document . querySelector ( '.alert img' ) . setAttribute ( 'hidden' , '' ) ;
479- }
480- document . querySelector ( '.alert h3' ) . innerText = checker_announcement . title || 'Announcement' ;
481- if ( checker_announcement . content ) {
482- document . querySelector ( '.alert p' ) . removeAttribute ( 'hidden' ) ;
483- document . querySelector ( '.alert p' ) . innerText = checker_announcement . content ;
484- } else {
485- document . querySelector ( '.alert p' ) . setAttribute ( 'hidden' , '' ) ;
486- }
487- if ( checker_announcement . link ) {
488- document . querySelector ( '.alert button' ) . removeAttribute ( 'hidden' ) ;
489- document . querySelector ( '.alert button' ) . innerHTML = `${ checker_announcement . linkTitle || 'Go' } <i class="bi bi-arrow-right-short"></i>` ;
490- document . querySelector ( '.alert button' ) . addEventListener ( 'click' , ( ) => {
491- window . open ( checker_announcement . link , '_blank' ) ;
492- } ) ;
493- } else {
494- document . querySelector ( '.alert button' ) . setAttribute ( 'hidden' , '' ) ;
495- document . querySelector ( '.alert button' ) . removeEventListener ( 'click' , ( ) => { } ) ;
496- }
480+ document . querySelector ( '.alert h3' ) . innerText = checker_announcement . title || 'Announcement' ;
481+ if ( checker_announcement . content ) {
482+ document . querySelector ( '.alert p' ) . removeAttribute ( 'hidden' ) ;
483+ document . querySelector ( '.alert p' ) . innerText = checker_announcement . content ;
484+ } else {
485+ document . querySelector ( '.alert p' ) . setAttribute ( 'hidden' , '' ) ;
486+ }
487+ if ( checker_announcement . link ) {
488+ document . querySelector ( '.alert button' ) . removeAttribute ( 'hidden' ) ;
489+ document . querySelector ( '.alert button' ) . innerHTML = `${ checker_announcement . linkTitle || 'Go' } <i class="bi bi-arrow-right-short"></i>` ;
490+ document . querySelector ( '.alert button' ) . addEventListener ( 'click' , ( ) => {
491+ window . open ( checker_announcement . link , '_blank' ) ;
492+ } ) ;
497493 } else {
498- document . querySelector ( '.alert' ) . setAttribute ( 'hidden' , '' ) ;
494+ document . querySelector ( '.alert button' ) . setAttribute ( 'hidden' , '' ) ;
495+ document . querySelector ( '.alert button' ) . removeEventListener ( 'click' , ( ) => { } ) ;
499496 }
497+ } else {
498+ document . querySelector ( '.alert' ) . setAttribute ( 'hidden' , '' ) ;
500499 }
501- segmentsArray = segmentsArray . filter ( s => String ( s . course ) === String ( course . id ) ) ;
502- segments . innerHTML = '' ;
503- segmentsArray . sort ( ( a , b ) => a . order - b . order ) . forEach ( segment => {
504- const option = document . createElement ( 'option' ) ;
505- option . value = segment . id ;
506- var questionStatuses = [ ] ;
507- JSON . parse ( segment . question_ids ) . forEach ( questionId => {
508- const question = questionsArray . find ( q => String ( q . id ) === String ( questionId . id ) ) ;
509- if ( question ) {
510- var highestStatus = "" ;
511- var questionResponses = history . filter ( r => String ( r . question_id ) === String ( questionId . id ) ) ;
512- if ( questionResponses . find ( r => r . status === 'Correct' ) ) {
513- highestStatus = 'Correct' ;
514- } else if ( questionResponses . find ( r => r . status . includes ( 'Unknown' ) ) ) {
515- highestStatus = 'Awaiting Scoring' ;
516- } else if ( questionResponses . find ( r => r . status === 'Incorrect' ) ) {
517- highestStatus = 'In Progress' ;
518- }
519- questionStatuses . push ( { "segment" : segment . id , "question" : questionId . id , "status" : highestStatus , "nonscored" : question . nonscored } ) ;
500+ }
501+ segmentsArray = segmentsArray . filter ( s => String ( s . course ) === String ( course . id ) ) ;
502+ segments . innerHTML = '' ;
503+ segmentsArray . sort ( ( a , b ) => a . order - b . order ) . forEach ( segment => {
504+ const option = document . createElement ( 'option' ) ;
505+ option . value = segment . id ;
506+ var questionStatuses = [ ] ;
507+ JSON . parse ( segment . question_ids ) . forEach ( questionId => {
508+ const question = questionsArray . find ( q => String ( q . id ) === String ( questionId . id ) ) ;
509+ if ( question ) {
510+ var highestStatus = "" ;
511+ var questionResponses = history . filter ( r => String ( r . question_id ) === String ( questionId . id ) ) ;
512+ if ( questionResponses . find ( r => r . status === 'Correct' ) ) {
513+ highestStatus = 'Correct' ;
514+ } else if ( questionResponses . find ( r => r . status . includes ( 'Unknown' ) ) ) {
515+ highestStatus = 'Awaiting Scoring' ;
516+ } else if ( questionResponses . find ( r => r . status === 'Incorrect' ) ) {
517+ highestStatus = 'In Progress' ;
520518 }
521- } ) ;
522- const allQuestionsCorrect = ( JSON . parse ( segment . question_ids ) . length > 0 ) && questionStatuses . every ( question => ( question . status === 'Correct' ) || question . nonscored ) ;
523- option . innerHTML = `${ segment . number } - ${ segment . name } ${ segment . due ? ` (Due ${ new Date ( `${ segment . due } T00:00:00` ) . toLocaleDateString ( 'en-US' , { weekday : 'short' , year : 'numeric' , month : 'short' , day : 'numeric' } ) } )` : '' } ${ allQuestionsCorrect ? ' [MASTERY]' : '' } ` ;
524- option . setAttribute ( 'due' , segment . due || '' ) ;
525- segments . append ( option ) ;
519+ questionStatuses . push ( { "segment" : segment . id , "question" : questionId . id , "status" : highestStatus , "nonscored" : question . nonscored } ) ;
520+ }
526521 } ) ;
527- segments . value = segmentsArray . find ( s => {
528- if ( ! s . due ) return false ;
529- return ( new Date ( `${ s . due } T00:00:00` ) . toLocaleDateString ( 'en-US' , { weekday : 'short' , year : 'numeric' , month : 'short' , day : 'numeric' } ) === new Date ( ) . toLocaleDateString ( 'en-US' , { weekday : 'short' , year : 'numeric' , month : 'short' , day : 'numeric' , } ) && new Date ( ) . getTime ( ) <= periodRange [ 1 ] ) ;
530- } ) ?. id || segmentsArray . find ( s => {
531- if ( ! s . due ) return false ;
532- return ( new Date ( `${ s . due } T00:00:00` ) . getTime ( ) > periodRange [ 1 ] && new Date ( `${ s . due } T00:00:00` ) . getTime ( ) <= periodRange [ 0 ] + 86400000 ) ;
533- } ) ?. id || segmentsArray . find ( s => ! s . due ) ?. id || segmentsArray [ 0 ] ?. id ;
534- segments . removeEventListener ( "change" , updateSegment ) ;
535- segments . addEventListener ( "change" , updateSegment ) ;
536- // Update history feed
537- await storage . idbReady ;
538- history = ( ( await storage . idbGet ( 'cache' ) ) || storage . get ( "cache" ) || { } ) . responses || [ ] ;
539- await updateHistory ( ) ;
540- await updateSegment ( ) ;
541- // Show clear data fix guide
542- // if (storage.get("created")) {
543- // document.querySelector(`[data-modal-view="clear-data-fix"]`).remove();
544- // } else {
545- // storage.set("created", Date.now());
546- // }
547- // Focus segment input
548- if ( segmentInput ) segmentInput . focus ( ) ;
549- // Set default answer mode
550- answerMode ( "input" ) ;
551- // Focus answer input
552- document . getElementById ( "answer-suggestion" ) . addEventListener ( "click" , ( ) => answerInput . focus ( ) ) ;
553- document . querySelector ( "[data-sync]" ) . addEventListener ( "click" , ( ) => auth . syncManual ( ) ) ;
554- ui . reloadUnsavedInputs ( ) ;
555- } catch ( error ) {
556- ui . view ( "api-fail" ) ;
557- }
522+ const allQuestionsCorrect = ( JSON . parse ( segment . question_ids ) . length > 0 ) && questionStatuses . every ( question => ( question . status === 'Correct' ) || question . nonscored ) ;
523+ option . innerHTML = `${ segment . number } - ${ segment . name } ${ segment . due ? ` (Due ${ new Date ( `${ segment . due } T00:00:00` ) . toLocaleDateString ( 'en-US' , { weekday : 'short' , year : 'numeric' , month : 'short' , day : 'numeric' } ) } )` : '' } ${ allQuestionsCorrect ? ' [MASTERY]' : '' } ` ;
524+ option . setAttribute ( 'due' , segment . due || '' ) ;
525+ segments . append ( option ) ;
526+ } ) ;
527+ segments . value = segmentsArray . find ( s => {
528+ if ( ! s . due ) return false ;
529+ return ( new Date ( `${ s . due } T00:00:00` ) . toLocaleDateString ( 'en-US' , { weekday : 'short' , year : 'numeric' , month : 'short' , day : 'numeric' } ) === new Date ( ) . toLocaleDateString ( 'en-US' , { weekday : 'short' , year : 'numeric' , month : 'short' , day : 'numeric' , } ) && new Date ( ) . getTime ( ) <= periodRange [ 1 ] ) ;
530+ } ) ?. id || segmentsArray . find ( s => {
531+ if ( ! s . due ) return false ;
532+ return ( new Date ( `${ s . due } T00:00:00` ) . getTime ( ) > periodRange [ 1 ] && new Date ( `${ s . due } T00:00:00` ) . getTime ( ) <= periodRange [ 0 ] + 86400000 ) ;
533+ } ) ?. id || segmentsArray . find ( s => ! s . due ) ?. id || segmentsArray [ 0 ] ?. id ;
534+ segments . removeEventListener ( "change" , updateSegment ) ;
535+ segments . addEventListener ( "change" , updateSegment ) ;
536+ // Update history feed
537+ await storage . idbReady ;
538+ history = ( ( await storage . idbGet ( 'cache' ) ) || storage . get ( "cache" ) || { } ) . responses || [ ] ;
539+ await updateHistory ( ) ;
540+ await updateSegment ( ) ;
541+ // Show clear data fix guide
542+ // if (storage.get("created")) {
543+ // document.querySelector(`[data-modal-view="clear-data-fix"]`).remove();
544+ // } else {
545+ // storage.set("created", Date.now());
546+ // }
547+ // Focus segment input
548+ if ( segmentInput ) segmentInput . focus ( ) ;
549+ // Set default answer mode
550+ answerMode ( "input" ) ;
551+ // Focus answer input
552+ document . getElementById ( "answer-suggestion" ) . addEventListener ( "click" , ( ) => answerInput . focus ( ) ) ;
553+ document . querySelector ( "[data-sync]" ) . addEventListener ( "click" , ( ) => auth . syncManual ( ) ) ;
554+ ui . reloadUnsavedInputs ( ) ;
558555 ui . reloadUnsavedInputs ( ) ;
559556 }
560557
0 commit comments