Übersicht.svelte 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <section class="section">
  2. <div class="container">
  3. <h1 class="title">Mein BK</h1>
  4. <div>
  5. <span class="tag is-success" class:is-danger={!diff(schueler_lokal, schueler_entfernt)} on:click={query} style="cursor: pointer;">
  6. {diff(schueler_lokal, schueler_entfernt) ? `${schueler_lokal.length} Schüler in der Datenbank` : 'Schülerdaten müssen aktualisiert werden'}
  7. </span>
  8. </div>
  9. <br>
  10. <div class="field">
  11. <div class="control">
  12. <input class="input" type="text" placeholder="Filter" bind:value={suche}>
  13. </div>
  14. </div>
  15. </div>
  16. <div class="container">
  17. <div class="tabs">
  18. <ul>
  19. <li class:is-active={active === Vouchers}><a on:click={() => active=Vouchers}>WLAN</a></li>
  20. <li class:is-active={active === Projektwoche}><a on:click={() => active=Projektwoche}>Projektwoche</a></li>
  21. <li class:is-active={active === Svwahl}><a on:click={() => active=Svwahl}>SV-Wahl</a></li>
  22. </ul>
  23. </div>
  24. <svelte:component this={active} schueler={schueler_filter} {privat}/>
  25. </div>
  26. </section>
  27. <style>
  28. @import 'node_modules/bulma/css/bulma.css';
  29. </style>
  30. <script>
  31. import Hashids from 'hashids'
  32. import Vouchers from './components/vouchers.svelte'
  33. import Projektwoche from './components/projektwoche.svelte'
  34. import Svwahl from './components/svwahl.svelte'
  35. export let schueler, knexConfig, privat
  36. let active = Vouchers
  37. let suche = ''
  38. const { Pool } = R('pg')
  39. const _ = R('lodash')
  40. const Schueler = R('schild').Schueler
  41. Schueler.knex(R('knex')(knexConfig))
  42. const hashids = new Hashids(privat.salt, 5, 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789')
  43. const h = (id) => hashids.encode(id)
  44. let schueler_entfernt = [], schueler_lokal = []
  45. const pool = new Pool({ connectionString: privat.mein_bk_db})
  46. async function query () {
  47. const resp = await pool.query(`SELECT schueler.hashid, wlan.voucher, wahlen.* FROM schueler
  48. LEFT JOIN wlan ON schueler.hashid = wlan.schueler_hashid
  49. LEFT JOIN wahlen ON schueler.hashid = wahlen.schueler_hashid`)
  50. schueler_entfernt = resp.rows
  51. }
  52. async function lokal () {
  53. schueler_lokal = await Schueler.query()
  54. .where('Status', '2')
  55. .andWhere('Geloescht', '-')
  56. .andWhere('Gesperrt', '-')
  57. .select('ID', 'Name', 'Vorname', 'Klasse')
  58. .orderBy('Klasse')
  59. .orderBy('Name')
  60. }
  61. query() && lokal()
  62. function diff (eins, zwei) {
  63. let a = new Set(eins);
  64. let b = new Set(zwei);
  65. return new Set(
  66. [...a].filter(x => !b.has(x)));
  67. }
  68. const mergeById = (a1, a2) =>
  69. a1.map(itm => ({
  70. ...a2.find((item) => (item.hashid === h(itm.ID)) && item),
  71. ...itm
  72. }));
  73. function update_db () {}
  74. let merged
  75. $: merged = mergeById(schueler_lokal, schueler_entfernt)
  76. let schueler_filter
  77. $: schueler_filter = _.groupBy(merged.filter(s => s.Vorname.startsWith(suche) || s.Name.startsWith(suche)), 'Klasse')
  78. </script>