msteudtn / Mat-O-Wahl

:de: Mat-O-Wahl - Ein einfach zu bedienender, freier Open Source Wahl-O-Mat Klon fuer jedermann ### :gb: :us: A simple to handle, free "Voting Advice Application" / "Electoral Compass" alternative
https://mat-o-wahl.de/
GNU General Public License v3.0
35 stars 15 forks source link

intParties dynamisch berechnen #83

Closed fenglisch closed 1 year ago

fenglisch commented 1 year ago

Anstatt die intParties nach jedem Update in der definition.js aktualisieren zu müssen, könnte diese auch dynamisch berechnet werden (aus der Länge der fileAnswers und der Zahl der Fragen).

msteudtn commented 1 year ago

irgendwo scheint da noch der Wurm drin zu sein. :(

Ein console.log(intParties) nach der Funktion gibt mir die Funktion aus aber nicht die Anzahl der Parteien / Vereine. Ein console.log(arIntParties) innerhalb der Funktion wird gar nicht angezeigt. Dementsprechend kann die Auswertung am Ende auch nicht angezeigt werden.

Ich habe noch nicht herausgefunden, woran es liegt.

Daneben gibt es noch die Funktion fnReadCsv(csvFile,fnCallback) weiter unten. Das war meine Spar-Variante um die FRAGEN.CSV und PARTEIEN.CSV mit einer Funktion abzufrühstücken. Wenn jetzt die PARTEIEN.CSV noch einmal gelesen wird, kann man das auch komplett umstellen. :)

msteudtn commented 1 year ago

So. Ich glaube, ich bin dem Problemchen ein bisschen näher gekommen.

intParties muss natürlich noch aufgerufen werden, weil es eine Funktion ist. Also z.B. die const intParties = () => { umbenennen in const functionIntParties = () => { und danach erfolgt der Aufruf über const intParties = functionIntParties();

Aber die Variable ist weiterhin undefined. Wenn ich mich recht entsinne, liegt das daran, dass $.ajax({}).done() den return-Wert nicht nach außen gibt. Das geht nur über eine Callback-Funktion.

Wie so etwas aussieht, kann man z.B. bei function fnReadCsv(csvFile,fnCallback) sehen. Im DONE-Bereich wird das DATA-Ergebnis aus der Ajax-Abfrage an die Übergabefunktion weiter gegeben. Dort wird damit weiter gerechnet.

.done(function(data) {
    console.log("Mat-o-Wahl load: "+csvFile);
    fnCallback(data);
    })

Die fnReadCsv() wird 2x aus /DATA/OUTPUT.JS/fnStart() aufgerufen (ca. Zeile 96 / 99). Als Rückgabe-Funktion landen die Werte aus den FRAGEN.CSV und PARTEIEN.CSV in /DATA/GENERAL.JS/fnShowQuestions() und /DATA/GENERAL.JS/fnReadPositions().

Bevor dort jeweils fnTransformCsvToArray() ausgeführt wird, sollten die Variablen intQuestions und intParties definiert sein. Das könnte z.B. über deine (zusätzliche?) "Säuberungs-Funktion" geschehen.

fenglisch commented 1 year ago

Autsch, da habe ich beim Testing ja ganz schön geschludert. Danke fürs Fehler finden!

Daneben gibt es noch die Funktion fnReadCsv(csvFile,fnCallback) weiter unten. Das war meine Spar-Variante um die FRAGEN.CSV und PARTEIEN.CSV mit einer Funktion abzufrühstücken. Wenn jetzt die PARTEIEN.CSV noch einmal gelesen wird, kann man das auch komplett umstellen. :)

Da ich dachte, dass es keine Callback Function braucht, dachte ich, dass die fnReadCsv nicht geeignet wäre. So ist das aber natürlich was anderes. Die eingebauten Funktionen für error und fail sowie console.log("Mat-o-Wahl load: "+csvFile); passen zwar nicht perfekt, aber problematisch sollten sie ja auch nicht sein.

fenglisch commented 1 year ago

Mit den neuesten Commits sollte das gefixed sein. Bei mir hat es jedenfalls gut funktioniert. Vielleicht fällt dir auch eine elegantere Lösung ein, als window.intParties als Vehikel zu verwenden

msteudtn commented 1 year ago

:) Ja, bei mir hat es auch funktioniert.

Ich habe die Funktion in GENERAL.JS/fnReadPositions() verschoben, wo bereits das Ajax-Ergebnis ausgewertet wird. So muss die PARTEIEN.CSV kein zweites Mal ausgelesen werden. ;) Das zog dann nur noch ein paar kleinere Änderungen nach sich. Siehe:

Wenn das bei dir auch weiterhin funktioniert, kannst du es gern als neue Version 0.6.0.8.JJJJMMTT veröffentlichen. (general.js und changelog.md)

fenglisch commented 1 year ago

Ah ja, das ist deutlich eleganter. Hab mich erst gewundert, weil in der output.js ja zuerst fnReadCsv -> fnShowQuestions -> fnTransformCsvToArray kommt und in der fnTransformCsvToArray ja intParties bereits vorkommt, bevor es berechnet wurde (else { lastLine = (5 + intQuestions + 1) * intParties -1}). Aber in diese else-clause kommt es ja nur, wenn fnTransformCsvToArray mit dem Parameter modus = 0 aufgerufen wird.