Übersicht.svelte 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <section class="section no-print">
  2. <div class="container no-print">
  3. <h1 class="title">Mein BK</h1>
  4. <div>
  5. <span class="tag is-success" on:click={()=>hole_lokale_schueler()} style="cursor: pointer;">
  6. {schueler_lokal.length} Schüler in der Datenbank
  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 no-print">
  17. <div class="tabs">
  18. <ul>
  19. <li class:is-active={active === Vouchers} on:click={() => active=Vouchers}>WLAN</li>
  20. <li class:is-active={active === ProjektwocheSchueler} on:click={() => active=ProjektwocheSchueler}>PW Schüler</li>
  21. <li class:is-active={active === ProjektwocheLehrer} on:click={() => active=ProjektwocheLehrer}>PW Projekte</li>
  22. <li class:is-active={active === ProjektwocheDrucksache} on:click={() => active=ProjektwocheDrucksache}>PW Drucksache</li>
  23. <li class:is-active={active === ProjektwocheTnListen} on:click={() => active=ProjektwocheTnListen}>PW Teilnehmerliste</li>
  24. <li class:is-active={active === SVWahl} on:click={() => active=SVWahl}>SV-Wahl</li>
  25. <li class:is-active={active === Einstellungen} on:click={() => active=Einstellungen}>Einstellungen</li>
  26. <li class:is-active={active === Infos} on:click={() => active=Infos}>Infos</li>
  27. <li class:is-active={active === Teams} on:click={() => active=Teams}>Teams</li>
  28. </ul>
  29. </div>
  30. <svelte:component this={active} schueler={schueler_filter} {privat} {einstellungen} {knexConfig}/>
  31. </div>
  32. </section>
  33. <!-- <div class="container">
  34. </div> -->
  35. <style>
  36. @import 'node_modules/bulma/css/bulma.css';
  37. .tabs li.is-active {
  38. border-bottom-color: #3273dc;
  39. color: #3273dc;
  40. }
  41. .tabs li:hover {
  42. border-bottom-color: #3273dc;
  43. }
  44. .tabs li {
  45. align-items: center;
  46. border-bottom-color: #dbdbdb;
  47. border-bottom-style: solid;
  48. border-bottom-width: 1px;
  49. color: #4a4a4a;
  50. display: flex;
  51. justify-content: center;
  52. margin-bottom: -1px;
  53. padding: 0.5em 1em;
  54. vertical-align: top;
  55. cursor: pointer;
  56. text-decoration: none;
  57. }
  58. </style>
  59. <script>
  60. import Vouchers from './components/vouchers.svelte'
  61. import ProjektwocheSchueler from './components/projektwoche-schueler.svelte'
  62. import ProjektwocheLehrer from './components/projektwoche-lehrer.svelte'
  63. import ProjektwocheDrucksache from './components/projektwoche-drucksache.svelte'
  64. import ProjektwocheTnListen from './components/projektwoche-tn-listen.svelte'
  65. import SVWahl from './components/svwahl.svelte'
  66. import Einstellungen from './components/einstellungen.svelte'
  67. import Infos from './components/infos.svelte'
  68. import Teams from './components/teams.svelte'
  69. export let knexConfig, privat
  70. let active = ProjektwocheDrucksache
  71. let suche = ''
  72. const { Pool } = R('pg')
  73. const mysql = R('mysql')
  74. let schueler_entfernt = [], schueler_lokal = []
  75. let einstellungen
  76. const postgres = new Pool({ connectionString: privat.mein_bk_db})
  77. postgres.query(`SELECT * FROM einstellungen`)
  78. .then(res => {
  79. einstellungen = res.rows[0]
  80. einstellungen || postgres.query(`INSERT INTO einstellungen DEFAULT VALUES RETURNING *`)
  81. .then(res => einstellungen = res.rows[0])
  82. })
  83. postgres.query(`SELECT schueler.*,
  84. wlan.voucher,
  85. wahlen.*
  86. FROM schueler
  87. LEFT JOIN wlan ON schueler.id = wlan.schueler_id
  88. LEFT JOIN wahlen ON schueler.id = wahlen.schueler_id`)
  89. .then(resp => {
  90. schueler_entfernt = resp.rows
  91. })
  92. const mysql_connection = mysql.createConnection(knexConfig.connection)
  93. mysql_connection.connect()
  94. function hole_lokale_schueler () {
  95. mysql_connection.query(`SELECT ID AS id, Name, Vorname, Klasse, Volljaehrig,
  96. CONCAT (LOWER (Vorname), ' ', LOWER (Name)) AS vollname
  97. FROM schueler
  98. WHERE Status = 2 AND Geloescht = "-" AND Gesperrt = "-"
  99. ORDER BY Klasse, Name ASC`,
  100. (e, res) => {
  101. schueler_lokal = res
  102. })
  103. }
  104. const groupBy = (arr, id) => arr.reduce(
  105. (entryMap, f) => {
  106. const fx = id.split('.').reduce((p,c)=>p&&p[c]||null, f)
  107. return entryMap.set(fx, [...entryMap.get(fx)||[], f])
  108. },
  109. new Map()
  110. )
  111. hole_lokale_schueler()
  112. $: merged = schueler_lokal.map(itm => ({
  113. ...schueler_entfernt.find((item) => (item.id === itm.id) && item),
  114. ...itm}))
  115. $: schueler_filter = Object.fromEntries(groupBy(merged.filter(s => s.vollname.includes(suche.toLowerCase())), 'Klasse'))
  116. </script>