// 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/sonnenfDB.php"; const ANZAHL_DATES = 12; const TEXTE = { absagetext: "Absage an alle angemeldeten Besucher senden?", schonabgesagt: "Absage schon gesendet. Nochmal senden?", eingetragen: 'Besucher erfolgreich eingetragen.', subject: 'Absage der heutigen Sonnenführung', bodytext: `Sehr geehrte Dame, sehr geehrter Herr, Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur heutigen Sonnenführung angemeldet. Aufgrund der aktuellen Wetterlage können wir heute keine Sonnenführung anbieten. Bitte melden Sie sich für einen anderen Termin neu an. Mit freundlichen Grüßen Beobachtergruppe Sternwarte Welzheim`, } const liste = { emails: [], ids: [] } let abgesagt = false; let actualdate; // 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(); } // 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 (date) => { actualdate = date; let auth = params.storno == 'true' let column = auth ? "col-2" : "col-6" liste.emails = []; liste.ids = []; abgesagt = false; console.log('date: ', date); let anmeldungen = await fetchFromDbase({cmd:'GET_ANMELD',id:date}); let besucher = 0; $('tbody').empty(); for (let e of anmeldungen) { 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'); } // const selected = e.teilgenommen == "1" ? "checked" : ""; let str = ` ${e.name} ${e.vorname} ${e.anzahl}` // ` if (auth) { str += `` } str += '' $('#tabAnmeld > tbody:last-child').append(str); } if(besucher != 0) { let str = ` Summe 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 }) } // Aus dem rohen Führungsdatum von der Datenbank ein besser // leserliches Format erzeugen // Params: // w -> Wochentag // d -> Datum in DBase-Format // t -> Uhrzeit // Return // neu formatierter Datums-String const bauDate = (w,d,t) => { let dd = d.replace(/^(\d{4})(\d{2})(\d{2})$/, '$3.$2.$1',); let dt = w.substr(0,2) + ', ' + dd + ' ' + t.substr(0,2) + ':00'; return dt; } // Führungsdaten 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, last) => { let n = 0; let i = 0; let summ = 0; let select = // `
Gesamtzahl der Anmeldungen (ab heute): ${summ}
`; $('#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) let column = auth ? "col-2" : "col-6" let thead = ` Name ${x ? "Anz" : "Person"}` // ${x ? "tlg" : "teilgenommen"}` 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 nbr = parseInt(id); 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 den count in 'fdatum1' anpassen const austragen = async (teilnehmer) => { let update = {cmd: 'DELETEONE', id: parseInt(teilnehmer.id)} const erg1 = await putToDbase(update) // update = {cmd: 'UPDATECOUNT',date: parseInt(teilnehmer.fdatum), anzahl: parseInt(teilnehmer.anzahl)} // const erg2 = await putToDbase(update) console.log("Storno Ergenisse: ",erg1) 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); await fetch('https://laufschrift.rexfue.de/switch/switch_on') 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 } const showDoubles = async (date) => { let erg = await getDoubles(date) console.log(erg) $('#tnames').append( '' + ' Name' + ' Email' + ' Anzahl' + ' Datum' + ' Anmeldung' + ' Finden' + '') for(let x of erg) { if((x.single != undefined) && (x.single == true)) { continue } $('#tnames').append(` ${x.name} ${x.vorname} ${x.email} ${x.anzahl} ${moment(x.fdatum).format('YYYY-MM-DD')} ${moment(x.angemeldet).format('YYYY-MM-DD')} \` `) } $('#tnames').append('' + ' Name' + ' Anzahl' + ' Datum' + ' Finden' + '') for(let x of erg) { $('#tnames').append(` ${x.name} ${x.vorname} ${x.anzahl} ${moment(x.fdatum).format('YYYY-MM-DD')}