Allg Konferenzliste.svelte 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. {#each chunk(schueler, anzahl) as slice, i}
  2. <div class="page grid" orientation="landscape" size="A3" style="font-size: 1.1rem">
  3. <div class="header">
  4. <pre>
  5. Konferenzliste <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; {aktAbschnitt().klassenlehrer_in}: <b>{`${aktAbschnitt().lehrer?.Vorname} ${aktAbschnitt().lehrer?.Nachname} (${aktAbschnitt().lehrer?.Kuerzel})`}</b> &Tab; Stand: {heute()} &Tab; Konferenzdatum: {datum(aktAbschnitt().Konferenzdatum)} &Tab; Zeugnisdatum: {datum(aktAbschnitt().ZeugnisDatum)}
  6. </pre>
  7. </div>
  8. <div class="main">
  9. <Voffset v=1/>
  10. <table>
  11. <tr>
  12. <th><b>Nr</b></th>
  13. <th><b>Name</b></th>
  14. <th class="rotate"><div><span><b>FStd</b></span></div></th>
  15. <th class="rotate"><div><span><b>uFStd</b></span></div></th>
  16. {#each Array.from(faecher) as f}
  17. <th class="rotate"><div><span><b>{f}</b></span></div></th>
  18. {/each}
  19. <th><b>Bemerkungen</b></th>
  20. </tr>
  21. <tr><td colspan="2" style="height: 4rem">Bitte abzeichnen</td>{#each Array.from(faecher) as f}<td></td>{/each}<td></td><td></td><td></td></tr>
  22. {#each slice as s, ii}
  23. {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
  24. <tr>
  25. <td><b>{i*anzahl+ii+1}</b></td>
  26. <td><b>{s.Name}, {s.Vorname}</b></td>
  27. <td>{hj.SumFehlStd || 0}</td>
  28. <td>{hj.SumFehlStdU || 0}</td>
  29. {#each Array.from(faecher) as f}
  30. {#each [hj.noten.find(n => n.fach.FachKrz === f)||{}] as n}
  31. <td class="text-center" style={parseInt(n.NotenKrz) > 4 ? 'background:tomato;':''}>
  32. <span class:kreis={n.Warnung==='+'}>{n.NotenKrz || '–'}</span>
  33. </td>
  34. {/each}
  35. {/each}
  36. <td class="extraklein">{hj.ZeugnisBem || ''}</td>
  37. </tr>
  38. {/each}
  39. {/each}
  40. </table>
  41. </div>
  42. <div class="footer">Seite {i+1}/{Math.ceil(schueler.length/anzahl)}</div>
  43. </div>
  44. {/each}
  45. <script>
  46. import { datum, chunk } from './helfer'
  47. import Voffset from './partials/Voffset.svelte'
  48. export let schueler, jahr, abschnitt, klasse
  49. const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
  50. const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
  51. const anzahl = 25
  52. const aktAbschnitt = () => schueler[0].abschnitte.slice(-1)[0]
  53. const faecher = new Set
  54. schueler.forEach(s => s.abschnitte.find(aktHalbjahr).noten.forEach(n => {faecher.add(n.fach.FachKrz)}))
  55. </script>
  56. <style>
  57. @import 'css/main.css';
  58. table {
  59. border-collapse: collapse;
  60. width:auto;
  61. }
  62. table td {
  63. border: thin solid #ddd;
  64. line-height: 1.3rem;
  65. padding: 9px;
  66. white-space:nowrap;
  67. }
  68. table td.extraklein {
  69. font-size: .6rem;
  70. white-space:pre-wrap;
  71. word-wrap:break-word;
  72. vertical-align: top;
  73. padding: 1px;
  74. }
  75. table td:last-child {
  76. width: 100%;
  77. }
  78. th.rotate {
  79. height: 30px;
  80. white-space: nowrap;
  81. }
  82. th.rotate > div {
  83. transform:
  84. translate(20px, -3px)
  85. rotate(315deg);
  86. box-sizing: border-box;
  87. }
  88. th.rotate > div > span {
  89. border-bottom: 1px solid #ccc;
  90. width: 30px;
  91. transform-origin: left bottom;
  92. display: inline-block
  93. }
  94. .kreis {
  95. border: 0.2rem solid red;
  96. border-radius: 20%;
  97. padding: 0.2rem;
  98. }
  99. </style>