// sofianmeld.js rxf 2020-09-21 // Anmeldungen anzeigen und abhaken lassen // function getAuthorisation(was) { let x = was.split(',') return { storno: x[0], name: x[1] , double: x[2]} } $(document).ready(() => { // Globale Konstanten und Variable const ajaxURL="php/sofianmeldDB.php"; // const ajaxURL="../../DB4js.php"; const ANZAHL_DATES = 50; const TEXTE = { absagetext: "Absage an alle angemeldeten Besucher senden?", schonabgesagt: "Absage schon gesendet. Nochmal senden?", eingetragen: 'Besucher erfolgreich eingetragen.', subject: 'Absage der heutigen Führung zur Sonnenfinsternis', bodytext: `Sehr geehrte Dame, sehr geehrter Herr, Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur heutigen Sonnenfinsternis-Führung angemeldet. Aufgrund der aktuellen Wetterlage können wir heute die Führung nicht durchführen. Mit freundlichen Grüßen Beobachtergruppe Sternwarte Welzheim`, } const liste = { emails: [], ids: [] } let abgesagt = false; let actualdate; let cols = { name: "", anzahl: "", storno: "", summe: "", zeit: "col-2" } // Von der Datenbank Werte abholen // Param: // body: Object mit cmd und param // Return: // angeforderte Daten als JSON const fetchFromDbase = async (body) => { const response = await fetch(ajaxURL,{ method: 'POST', headers: {'Content-Type': 'application/js'}, body: JSON.stringify(body) }); return await response.json(); } // In die Datenbank Werte eintragen // Param: // body: Object mit cmd und param // Return: // angeforderte Daten als JSON const putToDbase = async (body) => { const response = await fetch(ajaxURL,{ method: 'POST', headers: {'Content-Type': 'application/js'}, body: JSON.stringify(body) }); return await response.json(); } // Uhrzeit aus dem Array hilen const getZeit = (zeiten, id) => { let idx = zeiten.findIndex((e) => e.id == id) if (idx != -1) { return zeiten[idx].uhrzeit.substr(0,5) } return "0:00" } // Aktuelle Anmeldungen anzeigen: // Für den ausgewählten Führungstag (date) die Anmeldungen aus der // Datenbank holen und in die Tabelle einbauen // Außerdem die globale Variable 'emails' mit den emails der Teilnehmer füllen const showAktAnmeldungen = async (id) => { actualdate = id; let auth = params.storno == 'true' liste.emails = []; liste.ids = []; abgesagt = false; let anmeldungen = await fetchFromDbase({cmd:'GET_ANMELD'}); let zeiten = await fetchFromDbase({cmd: 'GET_DATES'}) let besucher = 0; $('tbody').empty(); let zt = getZeit(zeiten,anmeldungen[0].id) let zeitsum=0; for (let e of anmeldungen) { let fett = false e.zeit = getZeit(zeiten, e.fid) if(zt != e.zeit) { zt = e.zeit fett = true } besucher += parseInt(e.anzahl); liste.emails.push(e.email); liste.ids.push(e.id); if (e.abgesagt == '1') { abgesagt = true; $('#absagen').html('Absage
wurde gesendet'); } let str = "" if (fett) { str += ` Summe ${zeitsum}` zeitsum = parseInt(e.anzahl); } str += ` ${e.zeit} ${e.name} ${e.vorname} ${e.anzahl}` zeitsum += parseInt(e.anzahl); if (auth) { str += `` } str += '' $('#tabAnmeld > tbody:last-child').append(str); } let str = ` Summe ${zeitsum}` if(besucher != 0) { str += ` Gesamtsumme der Anmeldungen ${besucher}` } $('#tabAnmeld > tbody:last-child').append(str); // Klick auf den Namen: Detail-Dialog öffnen $('.tdname').click( function() { const row = $(this).closest("tr") // Finds the closest row const index = (row[0].rowIndex)-1 $('#detail').data('id',anmeldungen[index].id).dialog('open'); }) // Klick auf 'storno' : den Eintrag stornieren $('.tdstorno').click( function() { const row = $(this).closest("tr") // Finds the closest row const index = (row[0].rowIndex)-1 austragen(anmeldungen[index]) // Teilnehmer austragen }) } // Führungszeiten in einer Select-Auswahl anzeigen // Zusätzlich den Eventhandler für die Auswahl registrieren. // Params: // dates -> Array mit den geholten Führungsdaten const buildFuehrungsDates = async (dates) => { let n = 0; let i = 0; let summ = 0; let select = // `` $('#auswahl').append(select); // Eventhandler für Auswahl eines Datums über die SelectBox: // Anzeigen der Anmeldungen dazu $('#ftermin').change( async () => { let x = $('#ftermin').find(':selected'); let date = x[0].value; console.log('date: ', date); let index = $('#ftermin').prop('selectedIndex'); if (index == 0) { $('#absagen').css('visibility', 'visible'); $('#uebernehmen').css('visibility', 'visible'); } else { $('#absagen').css('visibility', 'hidden'); $('#uebernehmen').css('visibility', 'hidden'); } await showAktAnmeldungen(date); }); return n; } // Text für die Tabelle abh. von der Schirmbreite umstellen // Params // x -> true/false für > oder < 700px function switchText(x) { let auth = params.storno == 'true' console.log("auth: ",auth) if (auth) { cols.name = "col-6" cols.anzahl = "col-2" cols.storno = "col-2" cols.summe = "col-4" } else { cols.name = "col-7" cols.anzahl = "col-3" cols.storno = "col-2" cols.summe = "col-3" } let thead = ` Uhrzeit Name ${x ? "Anz" : "Anzahl"}` if(auth) { thead += `${x ? "sto" : "stornieren"}` } thead += '' $('#tabAnmeld').empty() $('#tabAnmeld').append(thead) if (x) { $('#versn').html("V " + VERSION + ' ' + VDATE); } else { $('#versn').html("Version: " + VERSION + ' vom ' + VDATE); } } const getEintragetext = () => { let sel1 = $('input[type=checkbox]:checked').map(function (_, el) { return $(el).val(); }).get(); return `${sel1.length} ${TEXTE.eingetragen}`; } // Für die übergebenen IDs das #abgesagt'-Flag in der DB setzen const storeAbsage = async (ids) => { let update = {cmd:'UPDATE', field: 'abgesagt', ids : ids, values: [1]}; let erg1 = await putToDbase(update); abgesagt = true; } // die Daten des angewählten Teilnehmers anzeigen const getDetailText = async (id) => { const nbr = parseInt(id.substr(-3)); const holit = await fetchFromDbase({cmd:'GET_TEILN_ID',id:nbr}); const entry = holit[0]; const tafel = `
${entry.name} ${entry.vorname}
${entry.email}
${entry.plz} ${entry.stadt}
${entry.strasse}
${entry.telefon}
${entry.remarks}
` return tafel; } // Teilnehmer aus 'anmeldungen' austragen und die Anzahl 'besucher' in 'sofizeit' anpassen const austragen = async (teilnehmer) => { let update = {cmd: 'DELETEONE', id: parseInt(teilnehmer.id)} const erg1 = await putToDbase(update) update = {cmd: 'UPDATECOUNT',date: parseInt(teilnehmer.fid), anzahl: parseInt(teilnehmer.anzahl)} const erg2 = await putToDbase(update) console.log("Storno Ergenisse: ",erg1,erg2) showAktAnmeldungen(actualdate) } // ****************** // Event-Handler // ****************** // Übernahme der angeklickten 'teilgenommen' Boxen // // Jeder Teilnehmer, der hier abgehakt ist, wird in der Datenbank // als 'teilgenommen' eingetragen, jeder, der NICHT abgehakt ist, wird // als 'nicht teilgenommen' markiert. $('#uebernehmen').click(async function() { let sel1 = $('input[type=checkbox]:checked').map(function(_, el) { return $(el).val(); }).get(); let sel0 = $('input[type=checkbox]:not(:checked)').map(function(_, el) { return $(el).val(); }).get(); let update = {cmd:'UPDATE', field: 'teilgenommen', ids : sel1, values: [1]}; let erg1 = await putToDbase(update); update = {cmd:'UPDATE', field: 'teilgenommen', ids : sel0, values: [0]}; let erg0 = await putToDbase(update); if (erg0 && erg1) { $('#eintragedialog').dialog('open'); } }); // Dialogbox zu Absage aufrufen $('#absagen').click(()=> { $('#absagedialog').dialog('open'); }) // ****************** // Dialogboxen // ****************** // Dialogbox zur Absage $("#absagedialog").dialog({ autoOpen: false, modal: true, position: 'center', title: 'Absage-Mail', open: function() { if (abgesagt) { $('#absagetext').text(TEXTE.schonabgesagt) } else { $('#absagetext').text(TEXTE.absagetext) } }, buttons: [ { text: "Senden", click : async function() { await storeAbsage(liste.ids); let erg = await fetchFromDbase({ cmd: 'SENDMYMAIL', to: 'rexfue@gmail.com', betreff: TEXTE.subject, body: TEXTE.bodytext, bcc: liste.emails }); console.log("Mail gesendet"); $('#absagen').html('Absage
wurde gesendet'); $(this).dialog("close"); }, }, { text: "Abbrechen", click : function() { $(this).dialog("close"); }, } ], }); // Dialogbox für das 'eingetragen' $("#eintragedialog").dialog({ autoOpen: false, modal: true, position: 'center', title: 'Teilnehmer', open: () => { $('#eintragetext').text(getEintragetext()); } }); // Dialogbox mit den genauen Daten des Teilnehmers $("#detail").dialog({ autoOpen: false, modal: true, position: 'top', title: 'Teilnehmer-Details', open: () => { const id = $('#detail').data('id'); getDetailText(id) .then((txt) => { $('#detailtext').html(txt); }); } }); const filterDoubles = (data) => { let erg = {} return erg } async function getDoubles(date) { const update = { cmd: 'DOUBLE', date: date} let erg = await putToDbase(update) for (let i = erg.length-1; i>=0; i--) { if(erg[i].name == 'Donner') { console.log(erg) } if( ((erg[i].name == '-') && (erg[i].vorname == '-')) || (erg[i].abgesagt == "1") || (erg[i].fdatum <= parseInt(moment().format('YYYYMMDD'))) ) { erg.splice(i, 1) } } erg.sort(function (a,b) { let na = a.name.toUpperCase() let nb = b.name.toUpperCase() if (na < nb) { return -1 } if(na > nb) { return 1 } return 0 }) console.log(erg) // alle die, die nur noch 1x drin sind, rausschmeißen let i for(i = 0; i < erg.length-1; i++) { console.log(`${i} Name[${i}]: ${erg[i].name} Name[${i+1}]: ${erg[i+1].name}`) if(erg[i].name != erg[i+1].name) { erg[i].single = true } else { i++ } } erg[i].single = true return erg } // ***************************************** // main // ***************************************** // Hier gehts los: // Von der Datenbank die nächsten 'n' Führungsdaten holen // und anzeigen // Params: // n -> Anzahl der zu holnden Daten async function main(n){ // Media Query einbauen: let x = window.matchMedia("(max-width: 800px)"); switchText(x.matches); x.addEventListener("change", async (e) => { switchText(e.matches); await showAktAnmeldungen(actualdate); }); // let curtime = moment().subtract(14,'days').format("YYYYMMDD"); // let curtime = moment().format("YYYYMMDD"); // console.log(curtime) const y = await fetchFromDbase({cmd:'GET_DATES'}); const sel = await buildFuehrungsDates(y); await showAktAnmeldungen(y[sel].id); console.log(y); /* if(params.name != 'Null') { await findName(params.name) } if(params.double == 'true') { await showDoubles(curtime); } */ } main(ANZAHL_DATES).catch(console.error); });