burningTyger пре 5 година
родитељ
комит
4abe298aae
4 измењених фајлова са 60 додато и 42 уклоњено
  1. 14 10
      components/projektwoche-schueler.svelte
  2. 7 3
      components/svwahl.svelte
  3. 14 4
      components/vouchers.svelte
  4. 25 25
      Übersicht.svelte

+ 14 - 10
components/projektwoche-schueler.svelte

@@ -130,9 +130,10 @@
 {/if}
 
 <script>
-  export let schueler, privat
+  export let schueler, privat, knexConfig
   let projekte = [];
   let klassen = {}
+  Object.keys(schueler).forEach(k => klassen[k] = null)
   let modal = false, modal_s, selected_woche, selected_mo_di, selected_mi_do;
   function modalset (s) {
     modal = true
@@ -140,9 +141,9 @@
   }
   const { Pool } = R('pg')
   const _ = R('lodash')
-  const pool = new Pool({ connectionString: privat.mein_bk_db})
+  const postgres = new Pool({ connectionString: privat.mein_bk_db})
   function projekte_laden () {
-  pool.query(`SELECT id, titel, leitung, woche, mo_di, mi_do, max_teilnehmer,
+    postgres.query(`SELECT id, titel, leitung, woche, mo_di, mi_do, max_teilnehmer,
                 (SELECT COUNT(*)
                   FROM wahlen
                   WHERE projekte.id = wahlen.woche
@@ -156,10 +157,10 @@
                   WHERE projekte.id = wahlen.mi_do
                 ) as gewaehlt_mi_do
               FROM projekte`,
-    (err, resp) => projekte = resp.rows)
+      (err, resp) => projekte = resp.rows)
   }
   projekte_laden()
-  pool.query(`SELECT * FROM klassen ORDER BY klasse`,
+  postgres.query(`SELECT * FROM klassen ORDER BY klasse`,
     (err, resp) => resp.rows.forEach(k => { klassen[k.klasse] = k.abwesenheit }))
   $: wahl = s => {
     const abwesenheit = klassen[s.Klasse]
@@ -193,7 +194,7 @@
                   RETURNING *`
     const values = [modal_s.id, selected_woche, selected_mo_di, selected_mi_do]
     try {
-      const res = await pool.query(text, values)
+      const res = await postgres.query(text, values)
       const data = res.rows[0]
       projekte_laden()
       Object.assign(modal_s, data)
@@ -204,12 +205,15 @@
   }
   async function switcher(k, art) {
     const abwesenheit = klassen[k] === null || klassen[k] !== art ? art : null
-    const text = `UPDATE klassen SET abwesenheit = $1
-                  WHERE klasse = $2
+    const text = `INSERT INTO klassen(klasse, abwesenheit)
+                  VALUES($1, $2)
+                  ON CONFLICT (klasse) DO
+                    UPDATE SET abwesenheit = $2
+                    WHERE klassen.klasse = $1
                   RETURNING abwesenheit`
-    const values = [abwesenheit, k]
+    const values = [k, abwesenheit]
     try {
-      const res = await pool.query(text, values)
+      const res = await postgres.query(text, values)
       const data = res.rows[0]
       klassen[k] = data.abwesenheit
     } catch(err) {

+ 7 - 3
components/svwahl.svelte

@@ -80,10 +80,14 @@
     }
   }
   const check_aktiv = async (s, art) => {
-    const query = `UPDATE schueler SET ${art}=$1
-                   WHERE id=$2
+    console.log(s)
+    const query = `INSERT INTO schueler(id, ${art}, vorname, klasse)
+                   VALUES($1, $2, $3, $4)
+                   ON CONFLICT (id) DO
+                    UPDATE SET ${art}=$2
+                    WHERE schueler.id=$1
                    RETURNING ${art}`
-    const values=[!s[art], s.id]
+    const values=[s.id, !s[art], s.Vorname, s.Klasse]
     try {
       const res = await pool.query(query, values)
       console.log(res)

+ 14 - 4
components/vouchers.svelte

@@ -24,10 +24,20 @@
   </div>
   <div class="column">
     <h3 class="title">Voucher austauschen</h3>
-    Voucher als Liste zeilenweise in das Textfeld einfügen. Alte Voucher
-    werden entfernt und durch die neuen ersetzt.
-    <textarea bind:value={vouchers} rows="20" cols="20"></textarea>
-    <button on:click={()=>update_vouchers()}>Aktualisieren</button>
+    <div class="field">
+      <label class="label">
+        Voucher als Liste zeilenweise in das Textfeld einfügen. Alte Voucher
+        werden entfernt und durch die neuen ersetzt.
+      </label>
+      <div class="control">
+        <textarea class="textarea" bind:value={vouchers} rows="10" cols="20"></textarea>
+      </div>
+    </div>
+    <div class="field is-grouped">
+      <div class="control">
+        <button class="button is-link" on:click={()=>update_vouchers()}>Aktualisieren</button>
+      </div>
+    </div>
   </div>
 </div>
 

+ 25 - 25
Übersicht.svelte

@@ -2,9 +2,9 @@
   <div class="container">
     <h1 class="title">Mein BK</h1>
     <div>
-      <span class="tag is-success" class:is-danger={!diff(schueler_lokal, schueler_entfernt)} style="cursor: pointer;">
-      {diff(schueler_lokal, schueler_entfernt) ? `${schueler_lokal.length} Schüler in der Datenbank` : 'Schülerdaten müssen aktualisiert werden'}
-    </span>
+      <span class="tag is-success" on:click={()=>hole_lokale_schueler()} style="cursor: pointer;">
+        {schueler_lokal.length} Schüler in der Datenbank
+      </span>
     </div>
     <br>
     <div class="field">
@@ -23,7 +23,7 @@
         <li class:is-active={active === SVWahl}><a on:click={() => active=SVWahl}>SV-Wahl</a></li>
       </ul>
     </div>
-    <svelte:component this={active} schueler={schueler_filter} {privat} {einstellungen}/>
+    <svelte:component this={active} schueler={schueler_filter} {privat} {einstellungen} {knexConfig}/>
   </div>
 </section>
 
@@ -46,10 +46,14 @@
   const mysql = R('mysql')
   let schueler_entfernt = [], schueler_lokal = []
   let einstellungen
-  const pool = new Pool({ connectionString: privat.mein_bk_db})
-  pool.query(`SELECT * FROM einstellungen`).then(res => einstellungen = res.rows[0])
-  if (!einstellungen) pool.query(`INSERT INTO einstellungen DEFAULT VALUES RETURNING *`).then(res => einstellungen = res.rows[0])
-  pool.query(`SELECT schueler.*,
+  const postgres = new Pool({ connectionString: privat.mein_bk_db})
+  postgres.query(`SELECT * FROM einstellungen`)
+    .then(res => {
+      einstellungen = res.rows[0]
+      einstellungen || postgres.query(`INSERT INTO einstellungen DEFAULT VALUES RETURNING *`)
+        .then(res => einstellungen = res.rows[0])
+    })
+  postgres.query(`SELECT schueler.*,
                     wlan.voucher,
                     wahlen.*
               FROM schueler
@@ -58,25 +62,21 @@
         .then(resp => {
           schueler_entfernt = resp.rows
         })
-  const connection = mysql.createConnection(knexConfig.connection)
-  connection.connect()
-  connection.query(`SELECT ID AS id, Name, Vorname, Klasse
-                    FROM schueler
-                    WHERE Status = 2 AND Geloescht = "-" AND Gesperrt = "-"
-                    ORDER BY Klasse, Name ASC`,
-    (e, res) => {
-      schueler_lokal = res
-    })
-  connection.end()
-  function diff (eins, zwei) {
-    let a = new Set(eins);
-    let b = new Set(zwei);
-    return new Set(
-      [...a].filter(x => !b.has(x)));
+  const mysql_connection = mysql.createConnection(knexConfig.connection)
+  mysql_connection.connect()
+  function hole_lokale_schueler () {
+    mysql_connection.query(`SELECT ID AS id, Name, Vorname, Klasse,
+                              CONCAT (LOWER (Vorname), ' ', LOWER (Name)) AS vollname
+                            FROM schueler
+                            WHERE Status = 2 AND Geloescht = "-" AND Gesperrt = "-"
+                            ORDER BY Klasse, Name ASC`,
+      (e, res) => {
+        schueler_lokal = res
+      })
   }
+  hole_lokale_schueler()
   $: merged = schueler_lokal.map(itm => ({
       ...schueler_entfernt.find((item) => (item.id === itm.id) && item),
       ...itm}))
-  $: schueler_filter = _.groupBy(merged.filter(s => s.Vorname.startsWith(suche) || s.Name.startsWith(suche)), 'Klasse')
-  function update_db () {}
+  $: schueler_filter = _.groupBy(merged.filter(s => s.vollname.includes(suche.toLowerCase())), 'Klasse')
 </script>