svwahl.svelte 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <div class="field is-horizontal">
  2. <div class="field-body">
  3. <div class="field">
  4. <p class="control is-expanded has-icons-left">
  5. <label class="label is-small">Beginn der SV-Wahl</label>
  6. <input type="datetime-local" bind:value={wahlbeginn_sv} class="input is-small">
  7. </p>
  8. </div>
  9. <div class="field">
  10. <p class="control is-expanded has-icons-left">
  11. <label class="label is-small">Ende der SV-Wahl</label>
  12. <input type="datetime-local" bind:value={wahlende_sv} class="input is-small">
  13. </p>
  14. </div>
  15. </div>
  16. </div>
  17. <div class="field">
  18. <p class="control is-expanded has-icons-left">
  19. <label class="label is-small">Datum der ersten Schulkonferenz</label>
  20. <input type="datetime-local" bind:value={erste_schuko} class="input is-small">
  21. </p>
  22. </div>
  23. <div class="field">
  24. <button class="is-small button is-default" on:click={changeDate}> Wahlzeitraum ändern </button>
  25. {#if check}<span class="tag is-success">✓</span>{/if}
  26. </div>
  27. <div class="columns">
  28. <div class="column is-two-thirds">
  29. {#each Object.entries(schueler) as [klasse, schuelers]}
  30. <h3 class="title">{klasse}</h3>
  31. <table class="table is-striped">
  32. <thead>
  33. <tr>
  34. <th>Name</th>
  35. <th>Vorname</th>
  36. <th>Wahlstatus</th>
  37. </tr>
  38. </thead>
  39. <tbody>
  40. {#each schuelers as s,i}
  41. <tr>
  42. <td>{s.Name}</td>
  43. <td>{s.Vorname}</td>
  44. <td class:has-background-success={s.schuko||s.sprecher}>
  45. Schuko: <input checked={s.schuko} type="checkbox" on:click={()=>check_aktiv(s, 'schuko')}>
  46. Sprecher: <input checked={s.sprecher} type="checkbox" on:click={()=>check_aktiv(s, 'sprecher')}>
  47. gewählt: <input checked={s.gewaehlt} type="checkbox" on:click={()=>check_aktiv(s, 'gewaehlt')}>
  48. </td>
  49. </tr>
  50. {/each}
  51. </tbody>
  52. </table>
  53. {/each}
  54. </div>
  55. </div>
  56. <script>
  57. export let schueler, privat, einstellungen = {}
  58. let check
  59. const { Pool } = R('pg')
  60. const pool = new Pool({ connectionString: privat.mein_bk_db})
  61. $: wahlbeginn_sv = wahlbeginn_sv || setDateTime(einstellungen.wahlbeginn_sv)
  62. $: wahlende_sv = wahlende_sv || setDateTime(einstellungen.wahlende_sv)
  63. $: erste_schuko = erste_schuko || setDateTime(einstellungen.erste_schuko)
  64. const changeDate = async _ => {
  65. const query = `UPDATE einstellungen
  66. SET wahlbeginn_sv=$1, wahlende_sv=$2, erste_schuko=$3
  67. RETURNING wahlbeginn_sv, wahlende_sv, erste_schuko`
  68. const values=[new Date(wahlbeginn_sv), new Date(wahlende_sv), new Date(erste_schuko)]
  69. try {
  70. const res = await pool.query(query, values)
  71. const data = res.rows[0]
  72. einstellungen.wahlbeginn_sv = data.wahlbeginn_sv
  73. einstellungen.wahlende_sv = data.wahlende_sv
  74. einstellungen.erste_schuko = data.erste_schuko
  75. einstellungen = einstellungen
  76. check = true
  77. } catch(err) {
  78. console.log(err.stack)
  79. }
  80. }
  81. const check_aktiv = async (s, art) => {
  82. console.log(s)
  83. const query = `INSERT INTO schueler(id, ${art}, vorname, klasse)
  84. VALUES($1, $2, $3, $4)
  85. ON CONFLICT (id) DO
  86. UPDATE SET ${art}=$2
  87. WHERE schueler.id=$1
  88. RETURNING ${art}`
  89. const values=[s.id, !s[art], s.Vorname, s.Klasse]
  90. try {
  91. const res = await pool.query(query, values)
  92. console.log(res)
  93. const data = res.rows[0]
  94. s[art] = data[art]
  95. schueler = schueler
  96. } catch(err) {
  97. console.log(err.stack)
  98. }
  99. }
  100. function setDateTime (date) {
  101. if (!date) return
  102. const d = new Date(date)
  103. return d.toISOString().replace('Z','')
  104. };
  105. </script>