308308 // show details cards
309309 function showDetails ( type , id , name , detailsSectionId ) {
310310 const detailsSection = document . getElementById ( detailsSectionId )
311+ if ( detailsSectionId === "member-details-section" ) {
312+ const p = document . getElementById ( "member-placeholder" )
313+ if ( p ) p . style . display = "none"
314+ }
315+
316+ if ( detailsSectionId === "team-details-section" ) {
317+ const p = document . getElementById ( "team-placeholder" )
318+ if ( p ) p . style . display = "none"
319+ }
311320
312321 if ( ! detailsSection ) {
313322 console . error ( `Details section with ID "${ detailsSectionId } " not found.` )
@@ -780,10 +789,18 @@ <h2>${name} Details</h2>
780789 // Count the unique members
781790 const numberOfUniqueMembers = uniqueMemberNames . size
782791 document . getElementById ( "stat-number-1" ) . textContent = numberOfUniqueMembers
792+ const memberPlaceholder = document . getElementById ( "member-placeholder" )
793+ if ( memberPlaceholder ) {
794+ memberPlaceholder . style . display = numberOfUniqueMembers > 0 ? "block" : "none"
795+ }
783796
784797 const uniqueTeamNames = new Set ( teamsDataArray . map ( ( team ) => team . name ) )
785798 const numberOfUniqueTeams = teamsWithTaskData . size
786799 document . getElementById ( "stat-number-2" ) . textContent = numberOfUniqueTeams
800+ const teamPlaceholder = document . getElementById ( "team-placeholder" )
801+ if ( teamPlaceholder ) {
802+ teamPlaceholder . style . display = numberOfUniqueTeams > 0 ? "block" : "none"
803+ }
787804
788805 // Extract all roles from project members
789806 const memberRoles = jsonData . projectMembers . flatMap ( ( member ) => member . roles )
@@ -870,7 +887,16 @@ <h2>${name} Details</h2>
870887 }
871888
872889 // Render the donut chart
873- Plotly . newPlot ( "roles-donut-chart" , roleData , roleLayout )
890+ const hasAnyRoles = roleValues . some ( ( v ) => v > 0 )
891+
892+ if ( hasAnyRoles ) {
893+ Plotly . newPlot ( "roles-donut-chart" , roleData , roleLayout )
894+ } else {
895+ const rolesEl = document . getElementById ( "roles-donut-chart" )
896+ if ( rolesEl ) {
897+ rolesEl . innerHTML = '<p class="empty-note">No roles</p>'
898+ }
899+ }
874900
875901 // Count the total number of rows
876902 const totalTasks = latestTaskLogs . length
@@ -920,7 +946,12 @@ <h2>${name} Details</h2>
920946 }
921947
922948 // Render the chart
923- Plotly . newPlot ( "completed-tasks-chart" , dataCompletedTasks , layout )
949+ if ( totalTasks > 0 ) {
950+ Plotly . newPlot ( "completed-tasks-chart" , dataCompletedTasks , layout )
951+ } else {
952+ const el = document . getElementById ( "completed-tasks-chart" )
953+ if ( el ) el . innerHTML = '<p class="empty-note">No tasks yet</p>'
954+ }
924955
925956 // completed form chart
926957 // Count the total number of form tasks
@@ -972,7 +1003,12 @@ <h2>${name} Details</h2>
9721003 }
9731004
9741005 // Render the chart
975- Plotly . newPlot ( "completed-forms-chart" , dataCompletedForms , layoutForm )
1006+ if ( totalForms > 0 ) {
1007+ Plotly . newPlot ( "completed-forms-chart" , dataCompletedForms , layoutForm )
1008+ } else {
1009+ const el = document . getElementById ( "completed-forms-chart" )
1010+ if ( el ) el . innerHTML = '<p class="empty-note">No forms</p>'
1011+ }
9761012
9771013 //get roles individuals
9781014 const rolesByIndividual = projectMembersDataFrame . map ( ( individual ) => {
@@ -1042,6 +1078,12 @@ <h2>${name} Details</h2>
10421078 100
10431079 ) . toFixed ( 1 )
10441080
1081+ // Hide progress bar if percentage is NaN
1082+ const showTasksBar = Number . isFinite ( Number ( tasksPercentComplete ) )
1083+ const showFormsBar = Number . isFinite ( Number ( formsPercentComplete ) )
1084+ const showNoTasksNote = ! showTasksBar
1085+ const showNoFormsNote = ! showFormsBar
1086+
10451087 // Create the card container
10461088 const card = document . createElement ( "div" )
10471089 card . className = "small-card clickable"
@@ -1051,28 +1093,57 @@ <h2>${name} Details</h2>
10511093 title . textContent = member . name
10521094 card . appendChild ( title )
10531095
1054- // Create a container for the donut chart
1055- const containerId = `member-role-chart-${ member . projectMemberId } `
1056- const chartDiv = document . createElement ( "div" )
1057- chartDiv . id = containerId
1058- card . appendChild ( chartDiv )
1096+ // Create a container for the donut chart or an empty note
1097+ const hasRoles = member . roles . length > 0
1098+
1099+ let chartDiv = null
1100+ if ( hasRoles ) {
1101+ chartDiv = document . createElement ( "div" )
1102+ chartDiv . id = `member-role-chart-${ member . projectMemberId } `
1103+ card . appendChild ( chartDiv )
1104+ } else {
1105+ const note = document . createElement ( "p" )
1106+ note . className = "empty-note"
1107+ note . textContent = "No roles"
1108+ card . appendChild ( note )
1109+ }
10591110
10601111 // Add progress bars for tasks and forms
10611112 const progressBars = `
1062- <div class="progress-container">
1063- <div class="progress-bar" style="width: ${ tasksPercentComplete } %; background-color: ${ themeColors . primary3 } ;" title="Tasks: ${ tasksPercentComplete } % Completed"></div>
1064- </div>
1065- <div class="progress-container">
1066- <div class="progress-bar" style="width: ${ formsPercentComplete } %; background-color: ${ themeColors . primary4 } ;" title="Forms: ${ formsPercentComplete } % Submitted"></div>
1067- </div>
1068- `
1113+ ${
1114+ showTasksBar
1115+ ? `
1116+ <div class="progress-container">
1117+ <div class="progress-bar"
1118+ style="width: ${ tasksPercentComplete } %; background-color: ${ themeColors . primary3 } ;"
1119+ title="Tasks: ${ tasksPercentComplete } % Completed"></div>
1120+ </div>`
1121+ : `<p class="empty-note">No tasks</p>`
1122+ }
1123+ ${
1124+ showFormsBar
1125+ ? `
1126+ <div class="progress-container">
1127+ <div class="progress-bar"
1128+ style="width: ${ formsPercentComplete } %; background-color: ${ themeColors . primary4 } ;"
1129+ title="Forms: ${ formsPercentComplete } % Submitted"></div>
1130+ </div>`
1131+ : `<p class="empty-note">No forms</p>`
1132+ }
1133+ `
10691134 card . innerHTML += progressBars // Append progress bars to the card
10701135
1071- // Append the card to the members section and render the chart
1136+ // Append the card to the members section and render the chart if appropriate
10721137 const memberRoleChartContainer = document . getElementById ( "members-section" )
10731138 if ( memberRoleChartContainer ) {
10741139 memberRoleChartContainer . appendChild ( card )
1075- createDonutChart ( data , containerId , `${ member . name } ` )
1140+ if ( hasRoles ) {
1141+ createDonutChart (
1142+ data ,
1143+ `member-role-chart-${ member . projectMemberId } ` ,
1144+ `${ member . name } `
1145+ )
1146+ }
10761147 } else {
10771148 console . error ( "Main container for member charts not found!" )
10781149 }
@@ -1157,32 +1228,57 @@ <h2>${name} Details</h2>
11571228 title . textContent = team . teamName
11581229 card . appendChild ( title )
11591230
1160- // Create a container for the donut chart
1161- const containerId = `team-role-chart-${ team . teamId } `
1162- const chartDiv = document . createElement ( "div" )
1163- chartDiv . id = containerId
1164- card . appendChild ( chartDiv )
1231+ // Create a container for the donut chart or an empty note
1232+ const hasRoles = team . roles . length > 0
1233+
1234+ let chartDiv = null
1235+ if ( hasRoles ) {
1236+ chartDiv = document . createElement ( "div" )
1237+ chartDiv . id = `team-role-chart-${ team . teamId } `
1238+ card . appendChild ( chartDiv )
1239+ } else {
1240+ const note = document . createElement ( "p" )
1241+ note . className = "empty-note"
1242+ note . textContent = "No roles"
1243+ card . appendChild ( note )
1244+ }
1245+
1246+ // NaN guards for progress bars
1247+ const showTeamTasksBar = Number . isFinite ( Number ( team . tasksPercentComplete ) )
1248+ const showTeamFormsBar = Number . isFinite ( Number ( team . formsPercentComplete ) )
11651249
11661250 // Add progress bars for tasks and forms
11671251 const progressBars = `
1168- <div class="progress-container">
1169- <div class="progress-bar"
1170- style="width: ${ team . tasksPercentComplete } %; background-color: ${ themeColors . primary3 } ;"
1171- title="Tasks: ${ team . tasksPercentComplete } % Completed"></div>
1172- </div>
1173- <div class="progress-container">
1174- <div class="progress-bar"
1175- style="width: ${ team . formsPercentComplete } %; background-color: ${ themeColors . primary4 } ;"
1176- title="Forms: ${ team . formsPercentComplete } % Submitted"></div>
1177- </div>
1178- `
1252+ ${
1253+ showTeamTasksBar
1254+ ? `
1255+ <div class="progress-container">
1256+ <div class="progress-bar"
1257+ style="width: ${ team . tasksPercentComplete } %; background-color: ${ themeColors . primary3 } ;"
1258+ title="Tasks: ${ team . tasksPercentComplete } % Completed"></div>
1259+ </div>`
1260+ : `<p class="empty-note">No tasks</p>`
1261+ }
1262+ ${
1263+ showTeamFormsBar
1264+ ? `
1265+ <div class="progress-container">
1266+ <div class="progress-bar"
1267+ style="width: ${ team . formsPercentComplete } %; background-color: ${ themeColors . primary4 } ;"
1268+ title="Forms: ${ team . formsPercentComplete } % Submitted"></div>
1269+ </div>`
1270+ : `<p class="empty-note">No forms</p>`
1271+ }
1272+ `
11791273 card . innerHTML += progressBars // Append progress bars to the card
11801274
1181- // Append the card to the teams section and render the chart
1275+ // Append the card to the teams section and render the chart if appropriate
11821276 const teamRoleChartContainer = document . getElementById ( "teams-section" )
11831277 if ( teamRoleChartContainer ) {
11841278 teamRoleChartContainer . appendChild ( card )
1185- createDonutChart ( data , containerId , `${ team . teamName } ` )
1279+ if ( hasRoles ) {
1280+ createDonutChart ( data , `team-role-chart-${ team . teamId } ` , `${ team . teamName } ` )
1281+ }
11861282 } else {
11871283 console . error ( "Main container for team charts not found!" )
11881284 }
@@ -1625,7 +1721,7 @@ <h3>Forms Submitted</h3>
16251721 </ p >
16261722 < div id ="members-section "> </ div >
16271723 < div id ="member-details-section " class ="details-container ">
1628- < p > Select a card to view details about the contributor or team .</ p >
1724+ < p id =" member-placeholder " > Select a card to view details about the contributor.</ p >
16291725 </ div >
16301726 </ div >
16311727 </ div >
@@ -1643,7 +1739,7 @@ <h3>Forms Submitted</h3>
16431739 </ p >
16441740 < div id ="teams-section "> </ div >
16451741 < div id ="team-details-section " class ="details-container ">
1646- < p > Select a card to view details about the contributor or team.</ p >
1742+ < p id =" team-placeholder " > Select a card to view details about the team.</ p >
16471743 </ div >
16481744 </ div >
16491745 </ div >
0 commit comments