@@ -719,16 +719,37 @@ function renderCompletionMetrics() {
719719 return ;
720720 }
721721
722+ const dashboard = createElement ( "div" , { className : "content-stack content-stack--compact" } ) ;
723+ dashboard . dataset . journeyProgressDashboard = "" ;
722724 const summary = createElement ( "p" , {
723725 className : "status" ,
724726 text : `Completion model: ${ completionMetricsSnapshot . completedCount } of ${ completionMetricsSnapshot . plannedCount } planned items complete (${ completionMetricsSnapshot . percentComplete } %). Active buckets: ${ completionMetricsSnapshot . activeCount } ; inactive buckets: ${ completionMetricsSnapshot . inactiveCount } .` ,
725727 } ) ;
728+ const overallHeading = createElement ( "h3" , { text : "Overall Progress" } ) ;
729+ const overallGrid = createElement ( "div" , { className : "grid cols-2" } ) ;
730+ overallGrid . dataset . journeyOverallProgress = "" ;
731+ [
732+ [ "Progress" , `${ completionMetricsSnapshot . percentComplete } %` ] ,
733+ [ "Completed" , String ( completionMetricsSnapshot . completedCount ) ] ,
734+ [ "Planned" , String ( completionMetricsSnapshot . plannedCount ) ] ,
735+ [ "Active Sections" , String ( completionMetricsSnapshot . activeCount ) ] ,
736+ ] . forEach ( ( [ label , value ] ) => {
737+ const stat = createElement ( "article" , { className : "mini-stat mini-stat--inline" } ) ;
738+ stat . append (
739+ createElement ( "strong" , { text : value } ) ,
740+ createElement ( "span" , { text : label } ) ,
741+ ) ;
742+ overallGrid . append ( stat ) ;
743+ } ) ;
744+
745+ const sectionHeading = createElement ( "h3" , { text : "Section Progress" } ) ;
726746 const wrapper = createElement ( "div" , { className : "table-wrapper" } ) ;
747+ wrapper . dataset . journeySectionProgress = "" ;
727748 const table = createElement ( "table" , { className : "data-table data-table--fixed" } ) ;
728- table . setAttribute ( "aria-label" , "Game Journey completion metrics " ) ;
749+ table . setAttribute ( "aria-label" , "Game Journey section progress " ) ;
729750 const head = createElement ( "thead" ) ;
730751 const headRow = createElement ( "tr" ) ;
731- [ "Bucket " , "Planned" , "Completed" , "%" , "Status" ] . forEach ( ( heading ) => {
752+ [ "Section " , "Planned" , "Completed" , "%" , "Status" ] . forEach ( ( heading ) => {
732753 const cell = createElement ( "th" , { text : heading } ) ;
733754 cell . scope = "col" ;
734755 headRow . append ( cell ) ;
@@ -749,7 +770,53 @@ function renderCompletionMetrics() {
749770 } ) ;
750771 table . append ( head , body ) ;
751772 wrapper . append ( table ) ;
752- completionMetrics . append ( summary , wrapper ) ;
773+
774+ const rankedRecords = records . filter ( ( metric ) => metric . plannedCount > 0 ) ;
775+ const mostComplete = [ ...rankedRecords ]
776+ . sort ( ( left , right ) =>
777+ right . percentComplete - left . percentComplete ||
778+ right . completedCount - left . completedCount ||
779+ left . bucketKey . localeCompare ( right . bucketKey ) ,
780+ )
781+ . slice ( 0 , 3 ) ;
782+ const leastComplete = [ ...rankedRecords ]
783+ . sort ( ( left , right ) =>
784+ left . percentComplete - right . percentComplete ||
785+ left . completedCount - right . completedCount ||
786+ left . bucketKey . localeCompare ( right . bucketKey ) ,
787+ )
788+ . slice ( 0 , 3 ) ;
789+
790+ const mostHeading = createElement ( "h3" , { text : "Most Complete Areas" } ) ;
791+ const mostList = createElement ( "ol" ) ;
792+ mostList . dataset . journeyMostCompleteAreas = "" ;
793+ mostComplete . forEach ( ( metric ) => {
794+ mostList . append ( createElement ( "li" , {
795+ text : `${ metric . bucketName } : ${ metric . percentComplete } % complete (${ metric . completedCount } of ${ metric . plannedCount } )` ,
796+ } ) ) ;
797+ } ) ;
798+
799+ const leastHeading = createElement ( "h3" , { text : "Least Complete Areas" } ) ;
800+ const leastList = createElement ( "ol" ) ;
801+ leastList . dataset . journeyLeastCompleteAreas = "" ;
802+ leastComplete . forEach ( ( metric ) => {
803+ leastList . append ( createElement ( "li" , {
804+ text : `${ metric . bucketName } : ${ metric . percentComplete } % complete (${ metric . completedCount } of ${ metric . plannedCount } )` ,
805+ } ) ) ;
806+ } ) ;
807+
808+ dashboard . append (
809+ summary ,
810+ overallHeading ,
811+ overallGrid ,
812+ sectionHeading ,
813+ wrapper ,
814+ mostHeading ,
815+ mostList ,
816+ leastHeading ,
817+ leastList ,
818+ ) ;
819+ completionMetrics . append ( dashboard ) ;
753820}
754821
755822function renderSearchStatus ( query , notes ) {
0 commit comments