svwahl.svelte 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <div class="columns">
  2. <div class="column">
  3. <b>Ergebnisse der Sprecherwahl:</b>
  4. <table class="table table-condensed table-striped">
  5. <th>Schüler</th><th>#</th>
  6. {#each wahlergebnis_schueler.filter(s=>s.gewaehlt_sprecher > 0).sort((a,b)=>a.gewaehlt_sprecher-b.gewaehlt_sprecher).reverse() as s}
  7. <tr>
  8. <td>{s.vorname} {s.nachname || ''} – {s.klasse} {s.email}</td><td>{s.gewaehlt_sprecher}</td>
  9. </tr>
  10. {/each}
  11. </table>
  12. </div>
  13. <div class="column">
  14. <b>Ergebnisse der Schukowahl:</b>
  15. <table class="table table-condensed table-striped">
  16. <th>Schüler</th><th>#</th>
  17. {#each wahlergebnis_schueler.filter(s=>s.gewaehlt_schuko > 0).sort((a,b)=>a.gewaehlt_schuko-b.gewaehlt_schuko).reverse() as s}
  18. <tr>
  19. <td>{s.vorname} {s.nachname || ''} – {s.klasse} {s.email}</td><td>{s.gewaehlt_schuko}</td>
  20. </tr>
  21. {/each}
  22. </table>
  23. </div>
  24. <div class="column">
  25. <b>Ergebnisse der SV-Lehrerwahl:</b>
  26. <table class="table table-condensed table-striped">
  27. <th>Lehrer</th><th>#</th>
  28. {#each wahlergebnis_lehrer.filter(l=>l.gewaehlt_lehrer > 0).sort((a,b)=>a.gewaehlt_lehrer-b.gewaehlt_lehrer).reverse() as l}
  29. <tr>
  30. <td>{l.name}</td><td>{l.gewaehlt_lehrer}</td>
  31. </tr>
  32. {/each}
  33. </table>
  34. </div>
  35. </div>
  36. <input type="checkbox" bind:checked={nur_aktive}> Nur aufgestellte Schüler anzeigen.
  37. <div class="columns">
  38. <div class="column is-two-thirds">
  39. <table class="table is-striped">
  40. <thead>
  41. <tr>
  42. <th>Name</th>
  43. <th>Wahlstatus</th>
  44. </tr>
  45. </thead>
  46. <tbody>
  47. {#each lehrer as l}
  48. <tr>
  49. <td>{l.name}</td>
  50. <td class:has-background-success={l.waehlbar}>
  51. wählbar: <input checked={l.waehlbar} type="checkbox" on:click={()=>lehrer_waehlbar(l)}>
  52. {#if l.waehlbar}
  53. <button class="button is-link tooltip is-tooltip-multiline" data-tooltip={l.info}
  54. on:click="{()=>lehrer_edit=l}">Infotext</button>
  55. {/if}
  56. {#if l===lehrer_edit}
  57. <textarea cols="80" rows="10" bind:value={l.info}></textarea><button on:click={lehrer_info}>Speichern</button>
  58. {/if}
  59. </td>
  60. </tr>
  61. {/each}
  62. </tbody>
  63. </table>
  64. {#each Object.entries(schueler) as [klasse, schuelers]}
  65. <h3 class="title">{klasse}</h3>
  66. <table class="table is-striped">
  67. <thead>
  68. <tr>
  69. <th>Name</th>
  70. <th>Vorname</th>
  71. <th>Wahlstatus</th>
  72. </tr>
  73. </thead>
  74. <tbody>
  75. {#each schuelers.filter(s=>(nur_aktive && (s.schuko || s.sprecher)) || (!nur_aktive && s)) as s}
  76. <tr>
  77. <td>{s.Name}</td>
  78. <td>{s.Vorname}</td>
  79. <td class:has-background-success={s.schuko||s.sprecher}>
  80. Schuko: <input checked={s.schuko} type="checkbox" on:click={()=>check_aktiv(s, 'schuko')}>
  81. Sprecher: <input checked={s.sprecher} type="checkbox" on:click={()=>check_aktiv(s, 'sprecher')}>
  82. gewählt: <input checked={s.gewaehlt} type="checkbox" on:click={()=>check_aktiv(s, 'gewaehlt')}>
  83. wählbar: <input checked={s.waehlbar} type="checkbox" on:click={()=>check_aktiv(s, 'waehlbar')}>
  84. {#if s.schuko || s.sprecher}
  85. <button class="button is-link tooltip is-tooltip-multiline" data-tooltip={`${s.info || ''} – ${s.Vorname} ${s.nachname || ''} – ${s.email || ''}`}
  86. on:click="{()=>edit=s}">Infotext</button>
  87. {/if}
  88. {#if s===edit}
  89. <textarea cols="80" rows="10" bind:value={s.info}></textarea><button on:click={info}>Speichern</button>
  90. {/if}
  91. </td>
  92. </tr>
  93. {/each}
  94. </tbody>
  95. </table>
  96. {/each}
  97. </div>
  98. </div>
  99. <script>
  100. export let schueler, privat
  101. let nur_aktive
  102. let wahlergebnis_schueler = []
  103. let wahlergebnis_lehrer = []
  104. let edit
  105. let lehrer_edit
  106. let lehrer=[]
  107. const { Pool } = R('pg')
  108. const pool = new Pool({ connectionString: privat.mein_bk_db})
  109. pool.query(`SELECT * from lehrer`).then(res=>lehrer=res.rows)
  110. const lehrer_info = async _ => {
  111. const query = `UPDATE lehrer SET info=$2 where id=$1`
  112. const values = [lehrer_edit.id, lehrer_edit.info]
  113. try {
  114. await pool.query(query, values)
  115. } catch (e) {console.log(e)}
  116. }
  117. const info = async _ => {
  118. const query = `UPDATE schueler SET info=$2 where id=$1`
  119. const values = [edit.id, edit.info]
  120. try {
  121. await pool.query(query, values)
  122. } catch (e) {console.log(e)}
  123. }
  124. const lehrer_waehlbar = async _ => {
  125. const query = `UPDATE lehrer SET waehlbar=$2 where id=$1`
  126. const values = [lehrer_edit.id, !lehrer_edit.waehlbar]
  127. try {
  128. await pool.query(query, values)
  129. } catch (e) {console.log(e)}
  130. }
  131. const check_aktiv = async (s, art) => {
  132. const query = `INSERT INTO schueler(id, ${art}, vorname, klasse)
  133. VALUES($1, $2, $3, $4)
  134. ON CONFLICT (id) DO
  135. UPDATE SET ${art}=$2
  136. WHERE schueler.id=$1
  137. RETURNING ${art}`
  138. const values=[s.id, !s[art], s.Vorname, s.Klasse]
  139. try {
  140. const res = await pool.query(query, values)
  141. const data = res.rows[0]
  142. s[art] = data[art]
  143. schueler = schueler
  144. } catch(err) {
  145. console.log(err.stack)
  146. }
  147. }
  148. async function hole_ergebnisse () {
  149. const query = `SELECT *,
  150. (SELECT COUNT(*)
  151. FROM sprecher
  152. WHERE sprecher.schueler_id = schueler.id
  153. ) as gewaehlt_sprecher,
  154. (SELECT COUNT(*)
  155. FROM schuko
  156. WHERE schuko.schueler_id = schueler.id
  157. ) as gewaehlt_schuko
  158. FROM schueler`
  159. const query2 = `SELECT *,
  160. (SELECT COUNT(*)
  161. FROM verbindungslehrer
  162. WHERE verbindungslehrer.lehrer_id = lehrer.id
  163. ) as gewaehlt_lehrer
  164. FROM lehrer`
  165. try {
  166. const res = await pool.query(query)
  167. wahlergebnis_schueler = res.rows
  168. const res2 = await pool.query(query2)
  169. wahlergebnis_lehrer = res2.rows
  170. }
  171. catch (e) {
  172. console.log(e)
  173. return []
  174. }
  175. }
  176. hole_ergebnisse()
  177. </script>
  178. <style>
  179. @import './node_modules/bulma-tooltip/dist/css/bulma-tooltip.min.css';
  180. </style>