<div>
  <h2>_{MsgCorrectionSheets}
  _{MsgCourseParticipants nrParticipants}
  <table .table .table--striped .table--hover>
    <tr .table__row .table__row--head>
      <th .table__th>_{MsgSheet}
      $if groupsPossible
        <th .table__th>_{MsgNrSubmittorsTotal}
      <th .table__th >_{MsgNrSubmissionsTotal}
      <th .table__th colspan=2>_{MsgNrSubmissionsNotAssigned}
      <th .table__th>_{MsgNrSubmissionsNotCorrected}
      <th .table__th colspan=3>_{MsgCorrectionTime}
    $forall (sheetName, CorrectionInfo{ciSubmittors, ciSubmissions, ciAssigned, ciCorrected, ciMin, ciTot, ciMax}) <- Map.toList sheetMap
      <tr .table__row>
        <td .table__td>^{simpleLink (toWidget sheetName) (CSheetR tid ssh csh sheetName SSubsR)}
        $if groupsPossible
          <td .table__td>#{ciSubmittors}
        <td .table__td>#{ciSubmissions}
        $maybe ((splus,sfailed),_) <- Map.lookup sheetName assignment
          $if 0 < Set.size sfailed
            <td .table__td>#{ciSubmissions - ciAssigned}
            <td .table__td .alert-danger>(-#{show (Set.size splus)}, failed: #{show (Set.size sfailed)})
          $elseif 0 < Set.size splus
            <td .table__td>#{ciSubmissions - ciAssigned}
            <td .table__td .alert-success>(-#{show (Set.size splus)})
          $else
            <td .table__td colspan=2>#{ciSubmissions - ciAssigned}
        $nothing
          <td .table__td colspan=2>#{ciSubmissions - ciAssigned}
        <td .table__td>#{ciSubmissions - ciCorrected}
        <td .table__td>#{showDiffDays ciMin}
        <td .table__td>#{showAvgsDays ciTot ciCorrected}
        <td .table__td>#{showDiffDays ciMax}
<div>
  <h2>_{MsgCorrectionCorrectors}
  <table .table .table--striped .table--hover>
    <tr .table__row .table__row--head>
      <th .table__th>_{MsgCorrector}
      <th .table__th>_{MsgNrSubmissionsTotal}
      <th .table__th>_{MsgNrSubmissionsNotCorrected}
      <th .table__th colspan=3>_{MsgCorrectionTime}
      $forall shn <- sheetNames
        <th .table__th colspan=5>#{shn}
        $# ^{simpleLinkI (SomeMessage MsgMenuCorrectors) (CSheetR tid ssh csh shn SCorrR)}
    $forall (CorrectionInfo{ciCorrector, ciSubmissions, ciCorrected, ciMin, ciTot, ciMax}) <- Map.elems corrMap
      $with (nameW,loadM) <- getCorrector ciCorrector
        <tr .table__row>
          <td .table__td>^{nameW}
          <td .table__td>#{ciSubmissions}
          <td .table__td .heated style="--hotness: #{heat ciSubmissions ciCorrected}">#{ciSubmissions - ciCorrected}
          <td .table__td>#{showDiffDays ciMin}
          <td .table__td>#{showAvgsDays ciTot ciCorrected}
          <td .table__td>#{showDiffDays ciMax}
          $forall shn <- sheetNames
            $maybe SheetCorrector{sheetCorrectorLoad, sheetCorrectorState} <- Map.lookup shn loadM
              <td .table__td>#{showCompactCorrectorLoad sheetCorrectorLoad sheetCorrectorState}
            $nothing
              <td .table__td>
            $maybe CorrectionInfo{ciSubmissions,ciCorrected,ciTot} <- getCorrSheetStatus ciCorrector shn
              $maybe nrNew <- getCorrNewAssignment ciCorrector shn
                <td .table__td>#{ciSubmissions}
                $# <td .table__td>#{ciAssigned} `ciSubmissions` is here always identical to `ciAssigned` and also works for `ciCorrector == Nothing`. ciAssigned only useful in aggregate maps like `sheetMap`
                <td .table__td .alert-success>(+#{nrNew})
              $nothing
                <td .table__td colspan=2>#{ciSubmissions}
              <td .table__td .heated style="--hotness: #{heat ciSubmissions ciCorrected}">#{ciSubmissions - ciCorrected}
              <td .table__td>#{showAvgsDays ciTot ciCorrected}
            $nothing
              <td .table__td colspan=4>
    $if 0 < length sheetNames
      <tr .table__row>
        <td colspan=6>
        $forall shn <- sheetNames
          <td .table__td colspan=5>^{simpleLinkI (SomeMessage MsgMenuCorrectors) (CSheetR tid ssh csh shn SCorrR)}
  ^{btnWdgt}
 <div>
  <p>_{MsgAssignSubmissionsRandomWarning}