\ No newline at end of file
diff --git a/public/html/application/impressum.html b/public/html/application/impressum.html
new file mode 100644
index 0000000..dd5d9c9
--- /dev/null
+++ b/public/html/application/impressum.html
@@ -0,0 +1 @@
+
Impressum
Silas Günther Mariabrunnstraße 48 52064 Aachen Deutschland
\ No newline at end of file
diff --git a/public/js/app.js b/public/js/app.js
index c1b24fb..e1be176 100755
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -6866,7 +6866,7 @@ class CreditsSite extends WordRotatorBaseSite{
}
InitPromise.addPromise(app => {
- app.addDeepLink("credits", PrivacyPolicySite);
+ app.addDeepLink("credits", CreditsSite);
});
class ChooseThemeDialog extends Dialog {
@@ -6997,6 +6997,78 @@ InitPromise.addPromise(function () {
SettingsSite.addSettingsFragment("settings", WordRotatorSettingFragment);
});
+class SelectWordsSite extends UserSite{
+
+ constructor(siteManager) {
+ super(siteManager, "version/1/html/selectWords.html", null, "admin");
+ }
+
+ async onConstruct(args) {
+ let res = await super.onConstruct(args);
+ this.stats = (await DataManager.load("words"))["result"];
+ this.words = this.stats["wordsToCheck"];
+ return res;
+ }
+
+ onFirstStart() {
+ super.onFirstStart();
+ this.findBy("#not-checked").appendChild(document.createTextNode(this.stats["wordsNotChecked"]));
+ this.findBy("#checked").appendChild(document.createTextNode(this.stats["wordsChecked"]));
+ this.findBy("#not-sure").appendChild(document.createTextNode(this.stats["wordsUnsure"]));
+ this.findBy("#deleted").appendChild(document.createTextNode(this.stats["wordsDeleted"]));
+
+ let template = this.findBy("#word-template");
+ template.id = null;
+ template.remove();
+
+ let container = this.findBy("#word-container");
+
+ let numWords = this.words.length;
+ for (let i = 0; i < numWords; i++) {
+ let wordElement = Helper.cloneNode(template);
+ wordElement.dataset["id"] = -1;
+ this.setWord(wordElement, this.words[i]);
+ container.appendChild(wordElement);
+
+ wordElement.querySelector(".button-ok").addEventListener("click", async () => {
+ let newWord = (await DataManager.send("checkWord", {
+ "wordId":wordElement.dataset["id"],
+ "action":"1"
+ }))["result"];
+ this.setWord(wordElement, newWord[0]);
+ });
+
+ wordElement.querySelector(".button-unsure").addEventListener("click", async () => {
+ let newWord = (await DataManager.send("checkWord", {
+ "wordId":wordElement.dataset["id"],
+ "action":"2"
+ }))["result"];
+ this.setWord(wordElement, newWord[0]);
+ });
+
+ wordElement.querySelector(".button-delete").addEventListener("click", async () => {
+ let newWord = (await DataManager.send("checkWord", {
+ "wordId":wordElement.dataset["id"],
+ "action":"3"
+ }))["result"];
+ this.setWord(wordElement, newWord[0]);
+ });
+ }
+ }
+
+ setWord(wordElement, word){
+ console.log(wordElement, word);
+ wordElement.querySelector(".word").removeAllChildren().appendChild(document.createTextNode(word["word"]));
+ wordElement.dataset["id"] = word["id"];
+ }
+}
+
+InitPromise.addPromise(app => {
+ app.addDefaultAction(new UserAction("select-words", () => {
+ app.startSite(SelectWordsSite);
+ }, null, null, "admin"));
+});
+
let basePath = "/pwa/wordRotator/public/";
if (window.location.pathname.includes("publicTest/"))
{
diff --git a/public/js/lang/de.json b/public/js/lang/de.json
index 1f81145..a0d47f5 100755
--- a/public/js/lang/de.json
+++ b/public/js/lang/de.json
@@ -1 +1 @@
-{"won":"Gewonnen!","continue":"Weiter","help":"?","not-enough-coins":"Du hast zu wenig Münzen!","sync-error":"Es gab einen Fehler beim Aktualisieren der Level. Bitte stelle sicher, dass du eine aktive Internetverbindung hast und versuche es später erneut.","game-ended":"Oh nein! Es sieht so aus, als ob du schon alle Level gespielt hast... Schau später noch einmal rein, evtl gibt es dann neue Level.","play":"Spielen!","tutorial-step-1":"Klicke auf ein Feld, um dieses rotieren zu lassen!","tutorial-step-2":"Um zu gewinnen, drehe die Segmente so, dass du zwei Wörter lesen kannst.","tutorial-step-3":"Die Hilfe löst ein Segment, kostet aber 25 Münzen. Probiere jetzt die Hilfe aus.","tutorial-step-4":"Große Segmente drehst du, indem du diese ziehst.","extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!","dark":"Dunkel","theme":"Theme:","sound":"Sound:","music":"Musik:","credits":"Credits","privacy-policy":"Datenschutzbestimmungen","impressum":"Impressum","track":"Anonymisierte Nutzungsdaten senden:",">":">","choose-theme-dialog-title":"Theme auswählen:","install":"Installieren","share-dialog":"Teilen:","Sunday":"Sonntag","Monday":"Montag","Tuesday":"Dienstag","Wednesday":"Mittwoch","Thursday":"Donnerstag","Friday":"Freitag","Saturday":"Samstag","January":"Januar","February":"Februar","March":"März","April":"April","May":"Mai","June":"Juni","July":"Juli","August":"August","September":"September","October":"Oktober","November":"November","December":"Dezember","Sun":"So","Mon":"Mo","Tue":"Di","Wed":"Mi","Thu":"Do","Fri":"Fr","Sat":"Sa","Jan":"Jan","Feb":"Feb","Mar":"Mär","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dez","code-not-valid":"Der angegebebe Code ist nicht gültig!","code-activated":"Der Code wurde erfolgreich aktiviert!","contact":"Kontakt","contact-email":"E-Mailadresse","contact-accepted-privacy-policy-2":" gelesen und akzepiert","contact-message":"Nachricht","contact-submit":"Absenden","contact-email-empty":"Die E-Mailadresse wird benötigt, um Ihre Nachricht zu beantworten.","contact-email-not-valid":"Die gegebene E-Mailadresse ist nicht gültig!","contact-accept-privacy-policy-empty":"Die Datenschutzbestimmungen müssen akzeptiert werden!","contact-message-empty":"Bitte geben Sie eine Nachricht ein.","contact-message-sent":"Ihre Nachricht wurde gesendet!","current-lang":"DE","en":"Englisch","de":"Deutsch","black":"Schwarz","red":"Rot","blue":"Blau","green":"Grün","pink":"Rosa","cancel-button":"ABBRECHEN","confirm-button":"OK","we-use-cookie-hint":"Diese Seite nutzt Cookies. Durch das weitere Benutzen dieser Seite geben Sie uns das Recht Cookies so zu benutzen, wie es in unserer Datenschutzerklärung steht.","policy-heading":"Datenschutzerklärung","area-of-validity-heading":"Geltungsbereich","area-of-validity":"Diese Datenschutzerklärung klärt Nutzer über die Art, den Umfang und Zwecke der Erhebung und Verwendung personenbezogener Daten durch den verantwortlichen Anbieter Silas Günther, Langenbusch 263b - 42897 Remscheid, matrix[at]silas.link auf dieser Website (im folgenden \"Angebot\") auf.
Die rechtlichen Grundlagen des Datenschutzes finden sich im Bundesdatenschutzgesetz (BDSG) und dem Telemediengesetz (TMG).","logfiles-heading":"Zugriffsdaten / Server-Logfiles","logfiles":"Der Anbieter (beziehungsweise sein Webspace-Provider) erhebt Daten über jeden Zugriff auf das Angebot (so genannte Serverlogfiles). Zu den Zugriffsdaten gehören:
Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.
Der Anbieter verwendet die Protokolldaten nur für statistische Auswertungen zum Zweck des Betriebs, der Sicherheit und der Optimierung des Angebotes. Der Anbieter behält sich jedoch vor, die Protokolldaten nachträglich zu überprüfen, wenn aufgrund konkreter Anhaltspunkte der berechtigte Verdacht einer rechtswidrigen Nutzung besteht.","contact-support-heading":"Kontaktaufnahme","contact-support":"Bei der Kontaktaufnahme mit dem Anbieter (zum Beispiel per Post oder E-Mail) werden die Angaben des Nutzers zwecks Bearbeitung der Anfrage sowie für den Fall, dass Anschlussfragen entstehen, gespeichert.","cookies-heading":"Cookies","cookies":"Cookies sind kleine Dateien, die es ermöglichen, auf dem Zugriffsgerät der Nutzer (PC, Smartphone o.ä.) spezifische, auf das Gerät bezogene Informationen zu speichern. Sie dienen zum einem der Benutzerfreundlichkeit von Webseiten und damit den Nutzern (z.B. Speicherung von Logindaten). Zum anderen dienen sie, um die statistische Daten der Webseitennutzung zu erfassen und sie zwecks Verbesserung des Angebotes analysieren zu können. Die Nutzer können auf den Einsatz der Cookies Einfluss nehmen. Die meisten Browser verfügen eine Option mit der das Speichern von Cookies eingeschränkt oder komplett verhindert wird. Allerdings wird darauf hingewiesen, dass die Nutzung und insbesondere der Nutzungskomfort ohne Cookies eingeschränkt werden.
Sie können viele Online-Anzeigen-Cookies von Unternehmen über die US-amerikanische Seite http://www.aboutads.info/choices/ oder die EU-Seite http://www.youronlinechoices.com/uk/your-ad-choices/ verwalten.","google-analytics-heading":"Google Analytics","google-analytics":"Dieses Angebot benutzt Google Analytics, einen Webanalysedienst der Google Inc. („Google“). Google Analytics verwendet sog. „Cookies“, Textdateien, die auf Computer der Nutzer gespeichert werden und die eine Analyse der Benutzung der Website durch sie ermöglichen. Die durch den Cookie erzeugten Informationen über Benutzung dieser Website durch die Nutzer werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.
Im Falle der Aktivierung der IP-Anonymisierung auf dieser Webseite, wird die IP-Adresse der Nutzer von Google jedoch innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Die IP-Anonymisierung ist auf dieser Website aktiv. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um die Nutzung der Website durch die Nutzer auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen.
Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Die Nutzer können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; Dieses Angebot weist die Nutzer jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: http://tools.google.com/dlpage/gaoptout?hl=de.
Weitere Informationen zur Datennutzung zu Werbezwecken durch Google, Einstellungs- und Widerspruchsmöglichkeiten erfahren Sie auf den Webseiten von Google: https://www.google.com/intl/de/policies/privacy/partners/ („Datennutzung durch Google bei Ihrer Nutzung von Websites oder Apps unserer Partner“), http://www.google.com/policies/technologies/ads („Datennutzung zu Werbezwecken“), http://www.google.de/settings/ads („Informationen verwalten, die Google verwendet, um Ihnen Werbung einzublenden“) und http://www.google.com/ads/preferences/ („Bestimmen Sie, welche Werbung Google Ihnen zeigt“).","edited-hint":"Der generierte Text wurde vom Webseiteninhaber angepasst.","generated-hint":"Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke","google-play-services-heading":"Google Play Dienste","google-play-services":"Features wie die Bestenliste und Erfolge benötigen einen Login bei Google Play. Hierfür wird die Identität benötigt, um die entsprechenden Punktzahlen und Erfolge an das jeweilige Google Play-Konto zu knüpfen. Alle anderen Features sind weiterhin auch ohne Login bei Google Play nutzbar. Außerdem kann sich jederzeit in den Einstellungen von Google Play abgemeldet werden.","settings":"Einstellungen","close":"Schließen","other-apps":"Andere Apps","optimistic-locking-dialog":"Deine Änderungen können nicht gespeichert werden! Ein anderer Benutzer hat die Daten bereits verändert. Bitte lade die Daten neu und speichere danach.","optimistic-locking-dialog-title":"Nicht gespeichert!","not-online":"Du bist nicht mit dem Internet verbunden. Bitte überprüfe deine Verbindung.","search":"Suchen...","site":"Seite","HTTP-Exception (403) Forbidden":"Nicht erlaubt!","login":"Login","login-email":"E-Mail","login-password":"Passwort","login-automated-login":"Automatischer Login","login-submit":"Login","logout":"Ausloggen","username-or-password-wrong":"Entweder der Username oder das Passwort stimmt nicht!","login-success":"Willkommen zurück!","logged-out-successfully":"Tschüss!","registration":"Registrieren","registration-username":"Username","registration-email":"E-Mail","registration-password1":"Passwort","registration-password2":"Passwort wiederholen","registration-submit":"Registrieren","registration-success":"Ein Registrierungscode wurde an Ihre E-Mailadresse gesendet.","not-allowed-title":"Nicht erlaubt!","not-allowed":"Du hast keine Berechtigung für diese Seite. Wenn das ein Fehler ist, wende dich bitte an einen Admin.","forgot-password":"Passwort vergessen?","forgot-password-title":"Passwort vergessen","forgot-password-email":"E-Mail","forgot-password-submit":"Absenden","forgot-password-text":"Gib deine E-Mailadresse in das Feld ein. Ist die Adresse registriert, werden wir eine E-Mail mit einem Passwort-Resetcode senden.","no-user-found":"Es gibt keinen Benutzer mit dieser E-Mailadresse","new-password-code-send":"Es wurde ein Reset-Code an deine E-Mailadresse gesendet.","new-password":"Neues Passwort","new-password-password1":"Passwort","new-password-password2":"Passwort wiederholen","new-password-submit":"Passwort setzten","password-updated":"Das Passwort ist geupdated!","user-settings":"E-Mail & Username","user-settings-title":"E-Mail & Username","user-settings-form-username":"Username","user-settings-form-old-email":"Aktuelle E-Mail","user-settings-form-new-email":"Neue E-Mail","user-settings-form-submit":"Speichern","user-data-is-changed":"Die Daten wurden gespeichert.","email-code-send":"Ein Änderungscode wurde an die neue E-Mailadresse gesendet. Sobald der Code aktiviert wurde, werden Ihnen E-Mails an die neue Adresse gesendet.","change-email-new-automated-login":"Wenn die E-Mailadresse geändert wird, muss der automatische Login erneut aktiviert werden!","password-settings":"Passwort","change-password-title":"Passwort","change-password-new-automated-login":"Wenn das Passwort geändert wird, muss der automatische Login erneut aktiviert werden!","change-password-old-password":"Altes Passwort","change-password-new-password1":"Neues Passwort","change-password-new-password2":"Neues Passwort wiederholen","change-password-submit":"Speichern","password-changed":"Das Passwort wurde erfolgreich geändert!","registration-username-empty":"Der Username darf nicht leer sein.","registration-username-wrong-char":"Der Username darf nur aus Buchstaben, Zahlen oder den folgenden Zeichen bestehen: -_.&;()#!?$+\",","registration-username-already-taken":"Der Username ist schon vergeben. Bitte wähle einen anderen.","registration-password-empty":"Das Passwort darf nicht leer sein.","registration-password-short":"Das Passwort muss mindestens 8 Zeichen lang sein.","registration-password-not-identical":"Die Passwörter sind nicht identlisch.","registration-email-empty":"Die Email darf nicht leer sein.","registration-email-not-valid":"Die Emailadresse ist keine gültige Emailadresse.","registration-email-already-taken":"Es gibt bereits einen Account mit der Emailadresse.","change-password-old-password-wrong":"Das Passwort stimmt nicht!","user-roles-heading":"Benutzerrollen","user-roles-list":"Aktuelle Rollen:","available-roles-list":"Verfügbare Rollen:","name":"Name","description":"Beschreibung"}
\ No newline at end of file
+{"won":"Gewonnen!","continue":"Weiter","help":"?","not-enough-coins":"Du hast zu wenig Münzen!","sync-error":"Es gab einen Fehler beim Aktualisieren der Level. Bitte stelle sicher, dass du eine aktive Internetverbindung hast und versuche es später erneut.","game-ended":"Oh nein! Es sieht so aus, als ob du schon alle Level gespielt hast... Schau später noch einmal rein, evtl gibt es dann neue Level.","play":"Spielen!","tutorial-step-1":"Klicke auf ein Feld, um dieses rotieren zu lassen!","tutorial-step-2":"Um zu gewinnen, drehe die Segmente so, dass du zwei Wörter lesen kannst.","tutorial-step-3":"Die Hilfe löst ein Segment, kostet aber 25 Münzen. Probiere jetzt die Hilfe aus.","tutorial-step-4":"Große Segmente drehst du, indem du diese ziehst.","extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!","dark":"Dunkel","theme":"Theme:","sound":"Sound:","music":"Musik:","credits":"Credits","privacy-policy":"Datenschutzbestimmungen","impressum":"Impressum","track":"Anonymisierte Nutzungsdaten senden:",">":">","choose-theme-dialog-title":"Theme auswählen:","install":"Installieren","share-dialog":"Teilen:","credits-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)","credits-coin-text":"Sound: Der Münz-Sound ist von der Webseite {0}. Alle Rechte für diesen Münz-Sound gehören {0}.","credits-music-text":"Musik: Bright And Beautiful - GEMAfreie Musik von {0} Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0) {1} Angepasst (geschnitten) für diese App","Sunday":"Sonntag","Monday":"Montag","Tuesday":"Dienstag","Wednesday":"Mittwoch","Thursday":"Donnerstag","Friday":"Freitag","Saturday":"Samstag","January":"Januar","February":"Februar","March":"März","April":"April","May":"Mai","June":"Juni","July":"Juli","August":"August","September":"September","October":"Oktober","November":"November","December":"Dezember","Sun":"So","Mon":"Mo","Tue":"Di","Wed":"Mi","Thu":"Do","Fri":"Fr","Sat":"Sa","Jan":"Jan","Feb":"Feb","Mar":"Mär","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dez","code-not-valid":"Der angegebebe Code ist nicht gültig!","code-activated":"Der Code wurde erfolgreich aktiviert!","contact":"Kontakt","contact-email":"E-Mailadresse","contact-accepted-privacy-policy-2":" gelesen und akzepiert","contact-message":"Nachricht","contact-submit":"Absenden","contact-email-empty":"Die E-Mailadresse wird benötigt, um Ihre Nachricht zu beantworten.","contact-email-not-valid":"Die gegebene E-Mailadresse ist nicht gültig!","contact-accept-privacy-policy-empty":"Die Datenschutzbestimmungen müssen akzeptiert werden!","contact-message-empty":"Bitte geben Sie eine Nachricht ein.","contact-message-sent":"Ihre Nachricht wurde gesendet!","current-lang":"DE","en":"Englisch","de":"Deutsch","black":"Schwarz","red":"Rot","blue":"Blau","green":"Grün","pink":"Rosa","cancel-button":"ABBRECHEN","confirm-button":"OK","we-use-cookie-hint":"Diese Seite nutzt Cookies. Durch das weitere Benutzen dieser Seite geben Sie uns das Recht Cookies so zu benutzen, wie es in unserer Datenschutzerklärung steht.","policy-heading":"Datenschutzerklärung","area-of-validity-heading":"Geltungsbereich","area-of-validity":"Diese Datenschutzerklärung klärt Nutzer über die Art, den Umfang und Zwecke der Erhebung und Verwendung personenbezogener Daten durch den verantwortlichen Anbieter Silas Günther, Langenbusch 263b - 42897 Remscheid, matrix[at]silas.link auf dieser Website (im folgenden \"Angebot\") auf.
Die rechtlichen Grundlagen des Datenschutzes finden sich im Bundesdatenschutzgesetz (BDSG) und dem Telemediengesetz (TMG).","logfiles-heading":"Zugriffsdaten / Server-Logfiles","logfiles":"Der Anbieter (beziehungsweise sein Webspace-Provider) erhebt Daten über jeden Zugriff auf das Angebot (so genannte Serverlogfiles). Zu den Zugriffsdaten gehören:
Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.
Der Anbieter verwendet die Protokolldaten nur für statistische Auswertungen zum Zweck des Betriebs, der Sicherheit und der Optimierung des Angebotes. Der Anbieter behält sich jedoch vor, die Protokolldaten nachträglich zu überprüfen, wenn aufgrund konkreter Anhaltspunkte der berechtigte Verdacht einer rechtswidrigen Nutzung besteht.","contact-support-heading":"Kontaktaufnahme","contact-support":"Bei der Kontaktaufnahme mit dem Anbieter (zum Beispiel per Post oder E-Mail) werden die Angaben des Nutzers zwecks Bearbeitung der Anfrage sowie für den Fall, dass Anschlussfragen entstehen, gespeichert.","cookies-heading":"Cookies","cookies":"Cookies sind kleine Dateien, die es ermöglichen, auf dem Zugriffsgerät der Nutzer (PC, Smartphone o.ä.) spezifische, auf das Gerät bezogene Informationen zu speichern. Sie dienen zum einem der Benutzerfreundlichkeit von Webseiten und damit den Nutzern (z.B. Speicherung von Logindaten). Zum anderen dienen sie, um die statistische Daten der Webseitennutzung zu erfassen und sie zwecks Verbesserung des Angebotes analysieren zu können. Die Nutzer können auf den Einsatz der Cookies Einfluss nehmen. Die meisten Browser verfügen eine Option mit der das Speichern von Cookies eingeschränkt oder komplett verhindert wird. Allerdings wird darauf hingewiesen, dass die Nutzung und insbesondere der Nutzungskomfort ohne Cookies eingeschränkt werden.
Sie können viele Online-Anzeigen-Cookies von Unternehmen über die US-amerikanische Seite http://www.aboutads.info/choices/ oder die EU-Seite http://www.youronlinechoices.com/uk/your-ad-choices/ verwalten.","google-analytics-heading":"Google Analytics","google-analytics":"Dieses Angebot benutzt Google Analytics, einen Webanalysedienst der Google Inc. („Google“). Google Analytics verwendet sog. „Cookies“, Textdateien, die auf Computer der Nutzer gespeichert werden und die eine Analyse der Benutzung der Website durch sie ermöglichen. Die durch den Cookie erzeugten Informationen über Benutzung dieser Website durch die Nutzer werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.
Im Falle der Aktivierung der IP-Anonymisierung auf dieser Webseite, wird die IP-Adresse der Nutzer von Google jedoch innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Die IP-Anonymisierung ist auf dieser Website aktiv. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um die Nutzung der Website durch die Nutzer auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen.
Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Die Nutzer können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; Dieses Angebot weist die Nutzer jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: http://tools.google.com/dlpage/gaoptout?hl=de.
Weitere Informationen zur Datennutzung zu Werbezwecken durch Google, Einstellungs- und Widerspruchsmöglichkeiten erfahren Sie auf den Webseiten von Google: https://www.google.com/intl/de/policies/privacy/partners/ („Datennutzung durch Google bei Ihrer Nutzung von Websites oder Apps unserer Partner“), http://www.google.com/policies/technologies/ads („Datennutzung zu Werbezwecken“), http://www.google.de/settings/ads („Informationen verwalten, die Google verwendet, um Ihnen Werbung einzublenden“) und http://www.google.com/ads/preferences/ („Bestimmen Sie, welche Werbung Google Ihnen zeigt“).","edited-hint":"Der generierte Text wurde vom Webseiteninhaber angepasst.","generated-hint":"Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke","google-play-services-heading":"Google Play Dienste","google-play-services":"Features wie die Bestenliste und Erfolge benötigen einen Login bei Google Play. Hierfür wird die Identität benötigt, um die entsprechenden Punktzahlen und Erfolge an das jeweilige Google Play-Konto zu knüpfen. Alle anderen Features sind weiterhin auch ohne Login bei Google Play nutzbar. Außerdem kann sich jederzeit in den Einstellungen von Google Play abgemeldet werden.","settings":"Einstellungen","close":"Schließen","other-apps":"Andere Apps","optimistic-locking-dialog":"Deine Änderungen können nicht gespeichert werden! Ein anderer Benutzer hat die Daten bereits verändert. Bitte lade die Daten neu und speichere danach.","optimistic-locking-dialog-title":"Nicht gespeichert!","not-online":"Du bist nicht mit dem Internet verbunden. Bitte überprüfe deine Verbindung.","search":"Suchen...","site":"Seite","HTTP-Exception (403) Forbidden":"Nicht erlaubt!","login":"Login","login-email":"E-Mail","login-password":"Passwort","login-automated-login":"Automatischer Login","login-submit":"Login","logout":"Ausloggen","username-or-password-wrong":"Entweder der Username oder das Passwort stimmt nicht!","login-success":"Willkommen zurück!","logged-out-successfully":"Tschüss!","registration":"Registrieren","registration-username":"Username","registration-email":"E-Mail","registration-password1":"Passwort","registration-password2":"Passwort wiederholen","registration-submit":"Registrieren","registration-success":"Ein Registrierungscode wurde an Ihre E-Mailadresse gesendet.","not-allowed-title":"Nicht erlaubt!","not-allowed":"Du hast keine Berechtigung für diese Seite. Wenn das ein Fehler ist, wende dich bitte an einen Admin.","forgot-password":"Passwort vergessen?","forgot-password-title":"Passwort vergessen","forgot-password-email":"E-Mail","forgot-password-submit":"Absenden","forgot-password-text":"Gib deine E-Mailadresse in das Feld ein. Ist die Adresse registriert, werden wir eine E-Mail mit einem Passwort-Resetcode senden.","no-user-found":"Es gibt keinen Benutzer mit dieser E-Mailadresse","new-password-code-send":"Es wurde ein Reset-Code an deine E-Mailadresse gesendet.","new-password":"Neues Passwort","new-password-password1":"Passwort","new-password-password2":"Passwort wiederholen","new-password-submit":"Passwort setzten","password-updated":"Das Passwort ist geupdated!","user-settings":"E-Mail & Username","user-settings-title":"E-Mail & Username","user-settings-form-username":"Username","user-settings-form-old-email":"Aktuelle E-Mail","user-settings-form-new-email":"Neue E-Mail","user-settings-form-submit":"Speichern","user-data-is-changed":"Die Daten wurden gespeichert.","email-code-send":"Ein Änderungscode wurde an die neue E-Mailadresse gesendet. Sobald der Code aktiviert wurde, werden Ihnen E-Mails an die neue Adresse gesendet.","change-email-new-automated-login":"Wenn die E-Mailadresse geändert wird, muss der automatische Login erneut aktiviert werden!","password-settings":"Passwort","change-password-title":"Passwort","change-password-new-automated-login":"Wenn das Passwort geändert wird, muss der automatische Login erneut aktiviert werden!","change-password-old-password":"Altes Passwort","change-password-new-password1":"Neues Passwort","change-password-new-password2":"Neues Passwort wiederholen","change-password-submit":"Speichern","password-changed":"Das Passwort wurde erfolgreich geändert!","registration-username-empty":"Der Username darf nicht leer sein.","registration-username-wrong-char":"Der Username darf nur aus Buchstaben, Zahlen oder den folgenden Zeichen bestehen: -_.&;()#!?$+\",","registration-username-already-taken":"Der Username ist schon vergeben. Bitte wähle einen anderen.","registration-password-empty":"Das Passwort darf nicht leer sein.","registration-password-short":"Das Passwort muss mindestens 8 Zeichen lang sein.","registration-password-not-identical":"Die Passwörter sind nicht identlisch.","registration-email-empty":"Die Email darf nicht leer sein.","registration-email-not-valid":"Die Emailadresse ist keine gültige Emailadresse.","registration-email-already-taken":"Es gibt bereits einen Account mit der Emailadresse.","change-password-old-password-wrong":"Das Passwort stimmt nicht!","user-roles-heading":"Benutzerrollen","user-roles-list":"Aktuelle Rollen:","available-roles-list":"Verfügbare Rollen:","name":"Name","description":"Beschreibung"}
\ No newline at end of file
diff --git a/public/version/1/html/selectWords.html b/public/version/1/html/selectWords.html
new file mode 100644
index 0000000..b19aa6e
--- /dev/null
+++ b/public/version/1/html/selectWords.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/module/Application/pwa/js/site/CreditsSite.js b/src/module/Application/pwa/js/site/CreditsSite.js
index 61563f3..4649665 100644
--- a/src/module/Application/pwa/js/site/CreditsSite.js
+++ b/src/module/Application/pwa/js/site/CreditsSite.js
@@ -15,5 +15,5 @@ export class CreditsSite extends WordRotatorBaseSite{
}
InitPromise.addPromise(app => {
- app.addDeepLink("credits", PrivacyPolicySite);
+ app.addDeepLink("credits", CreditsSite);
});
\ No newline at end of file
diff --git a/src/module/Application/pwa/js/site/SelectWordsSite.js b/src/module/Application/pwa/js/site/SelectWordsSite.js
new file mode 100644
index 0000000..08d61cd
--- /dev/null
+++ b/src/module/Application/pwa/js/site/SelectWordsSite.js
@@ -0,0 +1,75 @@
+import {Helper, InitPromise} from "../../../../../js/lib/pwa-lib";
+import {UserAction, UserSite} from "../../../../../js/lib/pwa-user-management";
+import {DataManager} from "../../../../../js/lib/pwa-core";
+
+export class SelectWordsSite extends UserSite{
+
+ constructor(siteManager) {
+ super(siteManager, "version/1/html/selectWords.html", null, "admin");
+ }
+
+ async onConstruct(args) {
+ let res = await super.onConstruct(args);
+ this.stats = (await DataManager.load("words"))["result"];
+ this.words = this.stats["wordsToCheck"];
+ return res;
+ }
+
+ onFirstStart() {
+ super.onFirstStart();
+ this.findBy("#not-checked").appendChild(document.createTextNode(this.stats["wordsNotChecked"]));
+ this.findBy("#checked").appendChild(document.createTextNode(this.stats["wordsChecked"]));
+ this.findBy("#not-sure").appendChild(document.createTextNode(this.stats["wordsUnsure"]));
+ this.findBy("#deleted").appendChild(document.createTextNode(this.stats["wordsDeleted"]));
+
+ let template = this.findBy("#word-template");
+ template.id = null;
+ template.remove();
+
+ let container = this.findBy("#word-container");
+
+ let numWords = this.words.length;
+ for (let i = 0; i < numWords; i++) {
+ let wordElement = Helper.cloneNode(template);
+ wordElement.dataset["id"] = -1;
+ this.setWord(wordElement, this.words[i]);
+ container.appendChild(wordElement);
+
+ wordElement.querySelector(".button-ok").addEventListener("click", async () => {
+ let newWord = (await DataManager.send("checkWord", {
+ "wordId":wordElement.dataset["id"],
+ "action":"1"
+ }))["result"];
+ this.setWord(wordElement, newWord[0]);
+ });
+
+ wordElement.querySelector(".button-unsure").addEventListener("click", async () => {
+ let newWord = (await DataManager.send("checkWord", {
+ "wordId":wordElement.dataset["id"],
+ "action":"2"
+ }))["result"];
+ this.setWord(wordElement, newWord[0]);
+ });
+
+ wordElement.querySelector(".button-delete").addEventListener("click", async () => {
+ let newWord = (await DataManager.send("checkWord", {
+ "wordId":wordElement.dataset["id"],
+ "action":"3"
+ }))["result"];
+ this.setWord(wordElement, newWord[0]);
+ });
+ }
+ }
+
+ setWord(wordElement, word){
+ console.log(wordElement, word);
+ wordElement.querySelector(".word").removeAllChildren().appendChild(document.createTextNode(word["word"]));
+ wordElement.dataset["id"] = word["id"];
+ }
+}
+
+InitPromise.addPromise(app => {
+ app.addDefaultAction(new UserAction("select-words", () => {
+ app.startSite(SelectWordsSite);
+ }, null, null, "admin"));
+});
\ No newline at end of file
diff --git a/src/module/Application/pwa/public/html/application/credits.html b/src/module/Application/pwa/public/html/application/credits.html
new file mode 100644
index 0000000..1806416
--- /dev/null
+++ b/src/module/Application/pwa/public/html/application/credits.html
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/module/Application/pwa/html/application/dialog/chooseTheme.html b/src/module/Application/pwa/public/html/application/dialog/chooseTheme.html
similarity index 100%
rename from src/module/Application/pwa/html/application/dialog/chooseTheme.html
rename to src/module/Application/pwa/public/html/application/dialog/chooseTheme.html
diff --git a/src/module/Application/pwa/html/application/dialog/share.html b/src/module/Application/pwa/public/html/application/dialog/share.html
similarity index 100%
rename from src/module/Application/pwa/html/application/dialog/share.html
rename to src/module/Application/pwa/public/html/application/dialog/share.html
diff --git a/src/module/Application/pwa/html/application/end.html b/src/module/Application/pwa/public/html/application/end.html
similarity index 100%
rename from src/module/Application/pwa/html/application/end.html
rename to src/module/Application/pwa/public/html/application/end.html
diff --git a/src/module/Application/pwa/html/application/fragment/settings.html b/src/module/Application/pwa/public/html/application/fragment/settings.html
similarity index 100%
rename from src/module/Application/pwa/html/application/fragment/settings.html
rename to src/module/Application/pwa/public/html/application/fragment/settings.html
diff --git a/src/module/Application/pwa/html/application/impressum.html b/src/module/Application/pwa/public/html/application/impressum.html
similarity index 100%
rename from src/module/Application/pwa/html/application/impressum.html
rename to src/module/Application/pwa/public/html/application/impressum.html
diff --git a/src/module/Application/pwa/html/application/level.html b/src/module/Application/pwa/public/html/application/level.html
similarity index 100%
rename from src/module/Application/pwa/html/application/level.html
rename to src/module/Application/pwa/public/html/application/level.html
diff --git a/src/module/Application/pwa/html/application/menu.html b/src/module/Application/pwa/public/html/application/menu.html
similarity index 100%
rename from src/module/Application/pwa/html/application/menu.html
rename to src/module/Application/pwa/public/html/application/menu.html
diff --git a/src/module/Application/pwa/html/application/privacyPolicy.html b/src/module/Application/pwa/public/html/application/privacyPolicy.html
similarity index 100%
rename from src/module/Application/pwa/html/application/privacyPolicy.html
rename to src/module/Application/pwa/public/html/application/privacyPolicy.html
diff --git a/src/module/Application/pwa/html/application/setting-template.html b/src/module/Application/pwa/public/html/application/setting-template.html
similarity index 100%
rename from src/module/Application/pwa/html/application/setting-template.html
rename to src/module/Application/pwa/public/html/application/setting-template.html
diff --git a/src/module/Application/pwa/html/application/sync.html b/src/module/Application/pwa/public/html/application/sync.html
similarity index 100%
rename from src/module/Application/pwa/html/application/sync.html
rename to src/module/Application/pwa/public/html/application/sync.html
diff --git a/src/module/Application/pwa/public/version/1/html/selectWords.html b/src/module/Application/pwa/public/version/1/html/selectWords.html
new file mode 100644
index 0000000..65d1b26
--- /dev/null
+++ b/src/module/Application/pwa/public/version/1/html/selectWords.html
@@ -0,0 +1,25 @@
+
+
+
Noch nicht geprüft:
+
+
Gecheckt:
+
+
Unsicher:
+
+
Gelöscht:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/module/Application/pwa/translations/de.json b/src/module/Application/pwa/translations/de.json
index f319499..617ec9f 100755
--- a/src/module/Application/pwa/translations/de.json
+++ b/src/module/Application/pwa/translations/de.json
@@ -27,5 +27,9 @@
">":">",
"choose-theme-dialog-title":"Theme auswählen:",
"install":"Installieren",
- "share-dialog":"Teilen:"
+ "share-dialog":"Teilen:",
+
+ "credits-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)",
+ "credits-coin-text":"Sound: Der Münz-Sound ist von der Webseite {0}. Alle Rechte für diesen Münz-Sound gehören {0}.",
+ "credits-music-text":"Musik: Bright And Beautiful - GEMAfreie Musik von {0} Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0) {1} Angepasst (geschnitten) für diese App"
}
\ No newline at end of file
diff --git a/src/module/Application/src/Controller/IndexController.php b/src/module/Application/src/Controller/IndexController.php
index 35afa0e..60b964d 100755
--- a/src/module/Application/src/Controller/IndexController.php
+++ b/src/module/Application/src/Controller/IndexController.php
@@ -1,14 +1,15 @@
getRandomWordNotChecked(self::LENGTH_WORDS_MIN, self::LENGTH_WORDS_MAX);
+ $wordsToCheck[] = WordManager::wordToArray($wordManager->getRandomWordNotChecked(self::LENGTH_WORDS_MIN, self::LENGTH_WORDS_MAX));
}
- return new ViewModel([
+ return [
"wordsNotChecked" => $wordsNotChecked,
"wordsDeleted" => $wordsDeleted,
"wordsChecked" => $wordsChecked,
"wordsUnsure" => $wordsUnsure,
"wordsToCheck" => $wordsToCheck,
- ]);
+ ];
}
public function changeCheckedAction()
@@ -70,15 +71,8 @@ class IndexController extends OnlineController
$randomWordNotChecked = $wordManager->getRandomWordNotChecked(self::LENGTH_WORDS_MIN, self::LENGTH_WORDS_MAX);
- $this->layout("layout/ajaxData");
- $viewModel = new ViewModel();
- $viewModel->setTemplate("ajax/json");
- $viewModel->setVariable("json", [
- "result" => true,
- "data" => [
- "newWord" => $wordManager->wordToArray($randomWordNotChecked),
- ],
- ]);
- return $viewModel;
+ return [
+ WordManager::wordToArray($randomWordNotChecked),
+ ];
}
}
diff --git a/src/module/Application/src/Model/Manager/WordManager.php b/src/module/Application/src/Model/Manager/WordManager.php
index 1b9ad3b..e778ebc 100755
--- a/src/module/Application/src/Model/Manager/WordManager.php
+++ b/src/module/Application/src/Model/Manager/WordManager.php
@@ -78,7 +78,7 @@ class WordManager extends StandardManager
return $this->repository->countNewerThanDate($dateTime);
}
- public function wordToArray(Word $word)
+ static function wordToArray(Word $word)
{
return [
"id" => $word->getId(),
diff --git a/src/module/Application/src/Model/Repository/WordRepository.php b/src/module/Application/src/Model/Repository/WordRepository.php
index 484aa49..c584c7e 100755
--- a/src/module/Application/src/Model/Repository/WordRepository.php
+++ b/src/module/Application/src/Model/Repository/WordRepository.php
@@ -53,13 +53,15 @@ class WordRepository extends StandardRepository
$queryBuilder = $this->_em->createQueryBuilder();
$queryBuilder->select("w")->from(Word::class, "w");
+ $offset = rand(0,$numberWords-1);
+
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.checked", "0"));
$queryBuilder->andWhere($queryBuilder->expr()->gte($queryBuilder->expr()->length("w.word"), ":minLength"));
$queryBuilder->andWhere($queryBuilder->expr()->lte($queryBuilder->expr()->length("w.word"), ":maxLength"));
$queryBuilder->setParameter("minLength", $minLength);
$queryBuilder->setParameter("maxLength", $maxLength);
$queryBuilder->setMaxResults(1);
- $queryBuilder->setFirstResult(rand(0,$numberWords));
+ $queryBuilder->setFirstResult($offset);
$res = $queryBuilder->getQuery()->getResult();
if (is_array($res))