übertrag zum PC

This commit is contained in:
silas 2018-09-30 16:11:06 +02:00
parent ad1064ffd3
commit ac32aa83dd
32 changed files with 830 additions and 205 deletions

View File

@ -34,3 +34,121 @@
2018-09-28T23:32:54+02:00 ERR (3): 2018-09-28T23:32:54+02:00 ERR (3):
2018-09-28T23:32:59+02:00 ERR (3): 2018-09-28T23:32:59+02:00 ERR (3):
2018-09-28T23:33:05+02:00 ERR (3): 2018-09-28T23:33:05+02:00 ERR (3):
2018-09-29T09:35:28+02:00 ERR (3):
2018-09-29T09:42:41+02:00 ERR (3):
2018-09-29T09:45:41+02:00 ERR (3):
2018-09-29T09:45:46+02:00 ERR (3):
2018-09-29T09:46:15+02:00 ERR (3):
2018-09-29T09:46:27+02:00 ERR (3):
2018-09-29T09:46:31+02:00 ERR (3):
2018-09-29T09:46:59+02:00 ERR (3):
2018-09-29T09:47:02+02:00 ERR (3):
2018-09-29T09:51:15+02:00 ERR (3):
2018-09-29T09:51:44+02:00 ERR (3):
2018-09-29T10:11:47+02:00 ERR (3):
2018-09-29T10:12:26+02:00 ERR (3):
2018-09-29T10:12:52+02:00 ERR (3):
2018-09-29T14:37:23+02:00 ERR (3):
2018-09-29T15:00:40+02:00 ERR (3):
2018-09-29T15:00:56+02:00 ERR (3):
2018-09-29T15:01:13+02:00 ERR (3):
2018-09-29T15:01:19+02:00 ERR (3):
2018-09-29T15:01:25+02:00 ERR (3):
2018-09-29T15:02:15+02:00 ERR (3):
2018-09-29T17:15:23+02:00 ERR (3):
2018-09-29T17:16:53+02:00 ERR (3):
2018-09-29T17:24:09+02:00 ERR (3):
2018-09-29T17:27:09+02:00 ERR (3):
2018-09-29T17:30:58+02:00 ERR (3):
2018-09-29T17:45:49+02:00 ERR (3):
2018-09-29T17:48:13+02:00 ERR (3):
2018-09-29T17:54:14+02:00 ERR (3):
2018-09-29T17:56:12+02:00 ERR (3):
2018-09-29T18:01:33+02:00 ERR (3):
2018-09-29T18:06:05+02:00 ERR (3):
2018-09-29T18:06:45+02:00 ERR (3):
2018-09-29T18:09:20+02:00 ERR (3):
2018-09-29T18:09:35+02:00 ERR (3):
2018-09-29T18:11:43+02:00 ERR (3):
2018-09-29T18:12:05+02:00 ERR (3):
2018-09-29T18:12:46+02:00 ERR (3):
2018-09-29T18:16:54+02:00 ERR (3):
2018-09-29T18:18:28+02:00 ERR (3):
2018-09-29T18:22:58+02:00 ERR (3):
2018-09-29T18:25:34+02:00 ERR (3):
2018-09-29T18:30:32+02:00 ERR (3):
2018-09-29T18:34:35+02:00 ERR (3):
2018-09-29T18:38:16+02:00 ERR (3):
2018-09-29T18:40:06+02:00 ERR (3):
2018-09-29T18:41:13+02:00 ERR (3):
2018-09-29T18:42:51+02:00 ERR (3):
2018-09-29T18:43:03+02:00 ERR (3):
2018-09-29T18:45:17+02:00 ERR (3):
2018-09-29T18:47:00+02:00 ERR (3):
2018-09-29T18:49:12+02:00 ERR (3):
2018-09-29T18:56:59+02:00 ERR (3):
2018-09-29T18:58:07+02:00 ERR (3):
2018-09-29T23:36:05+02:00 ERR (3):
2018-09-29T23:36:50+02:00 ERR (3):
2018-09-29T23:38:34+02:00 ERR (3):
2018-09-29T23:45:18+02:00 ERR (3):
2018-09-29T23:48:11+02:00 ERR (3):
2018-09-29T23:49:48+02:00 ERR (3):
2018-09-29T23:59:24+02:00 ERR (3):
2018-09-30T00:01:00+02:00 ERR (3):
2018-09-30T00:05:26+02:00 ERR (3):
2018-09-30T00:07:11+02:00 ERR (3):
2018-09-30T00:16:33+02:00 ERR (3):
2018-09-30T00:17:50+02:00 ERR (3):
2018-09-30T00:18:46+02:00 ERR (3):
2018-09-30T00:20:06+02:00 ERR (3):
2018-09-30T00:21:43+02:00 ERR (3):
2018-09-30T00:24:30+02:00 ERR (3):
2018-09-30T00:26:22+02:00 ERR (3):
2018-09-30T00:26:38+02:00 ERR (3):
2018-09-30T00:29:17+02:00 ERR (3):
2018-09-30T00:31:20+02:00 ERR (3):
2018-09-30T00:31:54+02:00 ERR (3):
2018-09-30T00:36:31+02:00 ERR (3):
2018-09-30T00:36:55+02:00 ERR (3):
2018-09-30T00:37:57+02:00 ERR (3):
2018-09-30T00:38:44+02:00 ERR (3):
2018-09-30T00:39:31+02:00 ERR (3):
2018-09-30T00:40:21+02:00 ERR (3):
2018-09-30T00:42:53+02:00 ERR (3):
2018-09-30T00:43:12+02:00 ERR (3):
2018-09-30T00:43:31+02:00 ERR (3):
2018-09-30T00:44:39+02:00 ERR (3):
2018-09-30T00:45:10+02:00 ERR (3):
2018-09-30T00:46:20+02:00 ERR (3):
2018-09-30T00:48:22+02:00 ERR (3):
2018-09-30T00:50:45+02:00 ERR (3):
2018-09-30T00:51:44+02:00 ERR (3):
2018-09-30T00:52:11+02:00 ERR (3):
2018-09-30T00:53:07+02:00 ERR (3):
2018-09-30T00:55:02+02:00 ERR (3):
2018-09-30T00:56:40+02:00 ERR (3):
2018-09-30T01:01:55+02:00 ERR (3):
2018-09-30T01:06:06+02:00 ERR (3):
2018-09-30T01:06:52+02:00 ERR (3):
2018-09-30T01:07:44+02:00 ERR (3):
2018-09-30T12:56:40+02:00 ERR (3):
2018-09-30T13:18:27+02:00 ERR (3):
2018-09-30T13:44:27+02:00 ERR (3):
2018-09-30T13:44:53+02:00 ERR (3):
2018-09-30T13:45:05+02:00 ERR (3):
2018-09-30T13:49:21+02:00 ERR (3):
2018-09-30T13:55:56+02:00 ERR (3):
2018-09-30T13:59:45+02:00 ERR (3):
2018-09-30T14:04:47+02:00 ERR (3):
2018-09-30T14:05:07+02:00 ERR (3):
2018-09-30T14:06:00+02:00 ERR (3):
2018-09-30T14:07:50+02:00 ERR (3):
2018-09-30T14:13:31+02:00 ERR (3):
2018-09-30T14:16:40+02:00 ERR (3):
2018-09-30T14:16:45+02:00 ERR (3):
2018-09-30T14:17:42+02:00 ERR (3):
2018-09-30T14:36:33+02:00 ERR (3):
2018-09-30T14:37:37+02:00 ERR (3):
2018-09-30T14:38:19+02:00 ERR (3):
2018-09-30T14:39:33+02:00 ERR (3):

View File

@ -34,3 +34,121 @@
2018-09-28T23:32:54+02:00 ERR (3): 2018-09-28T23:32:54+02:00 ERR (3):
2018-09-28T23:32:59+02:00 ERR (3): 2018-09-28T23:32:59+02:00 ERR (3):
2018-09-28T23:33:05+02:00 ERR (3): 2018-09-28T23:33:05+02:00 ERR (3):
2018-09-29T09:35:28+02:00 ERR (3):
2018-09-29T09:42:41+02:00 ERR (3):
2018-09-29T09:45:41+02:00 ERR (3):
2018-09-29T09:45:46+02:00 ERR (3):
2018-09-29T09:46:15+02:00 ERR (3):
2018-09-29T09:46:27+02:00 ERR (3):
2018-09-29T09:46:31+02:00 ERR (3):
2018-09-29T09:46:59+02:00 ERR (3):
2018-09-29T09:47:02+02:00 ERR (3):
2018-09-29T09:51:15+02:00 ERR (3):
2018-09-29T09:51:44+02:00 ERR (3):
2018-09-29T10:11:47+02:00 ERR (3):
2018-09-29T10:12:26+02:00 ERR (3):
2018-09-29T10:12:52+02:00 ERR (3):
2018-09-29T14:37:23+02:00 ERR (3):
2018-09-29T15:00:40+02:00 ERR (3):
2018-09-29T15:00:56+02:00 ERR (3):
2018-09-29T15:01:13+02:00 ERR (3):
2018-09-29T15:01:19+02:00 ERR (3):
2018-09-29T15:01:25+02:00 ERR (3):
2018-09-29T15:02:15+02:00 ERR (3):
2018-09-29T17:15:23+02:00 ERR (3):
2018-09-29T17:16:53+02:00 ERR (3):
2018-09-29T17:24:09+02:00 ERR (3):
2018-09-29T17:27:09+02:00 ERR (3):
2018-09-29T17:30:58+02:00 ERR (3):
2018-09-29T17:45:49+02:00 ERR (3):
2018-09-29T17:48:13+02:00 ERR (3):
2018-09-29T17:54:14+02:00 ERR (3):
2018-09-29T17:56:12+02:00 ERR (3):
2018-09-29T18:01:33+02:00 ERR (3):
2018-09-29T18:06:05+02:00 ERR (3):
2018-09-29T18:06:45+02:00 ERR (3):
2018-09-29T18:09:20+02:00 ERR (3):
2018-09-29T18:09:35+02:00 ERR (3):
2018-09-29T18:11:43+02:00 ERR (3):
2018-09-29T18:12:05+02:00 ERR (3):
2018-09-29T18:12:46+02:00 ERR (3):
2018-09-29T18:16:54+02:00 ERR (3):
2018-09-29T18:18:28+02:00 ERR (3):
2018-09-29T18:22:58+02:00 ERR (3):
2018-09-29T18:25:34+02:00 ERR (3):
2018-09-29T18:30:32+02:00 ERR (3):
2018-09-29T18:34:35+02:00 ERR (3):
2018-09-29T18:38:16+02:00 ERR (3):
2018-09-29T18:40:06+02:00 ERR (3):
2018-09-29T18:41:13+02:00 ERR (3):
2018-09-29T18:42:51+02:00 ERR (3):
2018-09-29T18:43:03+02:00 ERR (3):
2018-09-29T18:45:17+02:00 ERR (3):
2018-09-29T18:47:00+02:00 ERR (3):
2018-09-29T18:49:12+02:00 ERR (3):
2018-09-29T18:56:59+02:00 ERR (3):
2018-09-29T18:58:07+02:00 ERR (3):
2018-09-29T23:36:05+02:00 ERR (3):
2018-09-29T23:36:50+02:00 ERR (3):
2018-09-29T23:38:34+02:00 ERR (3):
2018-09-29T23:45:18+02:00 ERR (3):
2018-09-29T23:48:11+02:00 ERR (3):
2018-09-29T23:49:48+02:00 ERR (3):
2018-09-29T23:59:24+02:00 ERR (3):
2018-09-30T00:01:00+02:00 ERR (3):
2018-09-30T00:05:26+02:00 ERR (3):
2018-09-30T00:07:11+02:00 ERR (3):
2018-09-30T00:16:33+02:00 ERR (3):
2018-09-30T00:17:50+02:00 ERR (3):
2018-09-30T00:18:46+02:00 ERR (3):
2018-09-30T00:20:06+02:00 ERR (3):
2018-09-30T00:21:43+02:00 ERR (3):
2018-09-30T00:24:30+02:00 ERR (3):
2018-09-30T00:26:22+02:00 ERR (3):
2018-09-30T00:26:38+02:00 ERR (3):
2018-09-30T00:29:17+02:00 ERR (3):
2018-09-30T00:31:20+02:00 ERR (3):
2018-09-30T00:31:54+02:00 ERR (3):
2018-09-30T00:36:31+02:00 ERR (3):
2018-09-30T00:36:55+02:00 ERR (3):
2018-09-30T00:37:57+02:00 ERR (3):
2018-09-30T00:38:44+02:00 ERR (3):
2018-09-30T00:39:31+02:00 ERR (3):
2018-09-30T00:40:21+02:00 ERR (3):
2018-09-30T00:42:53+02:00 ERR (3):
2018-09-30T00:43:12+02:00 ERR (3):
2018-09-30T00:43:31+02:00 ERR (3):
2018-09-30T00:44:39+02:00 ERR (3):
2018-09-30T00:45:10+02:00 ERR (3):
2018-09-30T00:46:20+02:00 ERR (3):
2018-09-30T00:48:22+02:00 ERR (3):
2018-09-30T00:50:45+02:00 ERR (3):
2018-09-30T00:51:44+02:00 ERR (3):
2018-09-30T00:52:11+02:00 ERR (3):
2018-09-30T00:53:07+02:00 ERR (3):
2018-09-30T00:55:02+02:00 ERR (3):
2018-09-30T00:56:40+02:00 ERR (3):
2018-09-30T01:01:55+02:00 ERR (3):
2018-09-30T01:06:06+02:00 ERR (3):
2018-09-30T01:06:52+02:00 ERR (3):
2018-09-30T01:07:44+02:00 ERR (3):
2018-09-30T12:56:40+02:00 ERR (3):
2018-09-30T13:18:27+02:00 ERR (3):
2018-09-30T13:44:27+02:00 ERR (3):
2018-09-30T13:44:53+02:00 ERR (3):
2018-09-30T13:45:05+02:00 ERR (3):
2018-09-30T13:49:21+02:00 ERR (3):
2018-09-30T13:55:56+02:00 ERR (3):
2018-09-30T13:59:45+02:00 ERR (3):
2018-09-30T14:04:47+02:00 ERR (3):
2018-09-30T14:05:07+02:00 ERR (3):
2018-09-30T14:06:00+02:00 ERR (3):
2018-09-30T14:07:50+02:00 ERR (3):
2018-09-30T14:13:31+02:00 ERR (3):
2018-09-30T14:16:40+02:00 ERR (3):
2018-09-30T14:16:45+02:00 ERR (3):
2018-09-30T14:17:42+02:00 ERR (3):
2018-09-30T14:36:33+02:00 ERR (3):
2018-09-30T14:37:37+02:00 ERR (3):
2018-09-30T14:38:19+02:00 ERR (3):
2018-09-30T14:39:33+02:00 ERR (3):

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<div></div>

View File

@ -0,0 +1 @@
<div id=theme-choose-container><div id=choose-theme-template><div class=name></div></div></div>

View File

@ -1 +1 @@
<div class="max-height fill-me"><div class="row max-width grow flex-center"><div class="columns small-centered small-12 smedium-9 medium-11 large-7"><div class=row><span class="columns small-6" data-translation=theme></span> <span class="columns small-6"><label id=theme-radio-template><input type=radio class=setting name=theme></label></span></div><button id=reset-levels class=button data-translation=reset-levels></button></div></div></div> <div class="max-height fill-me"><div class="row max-width grow flex-center"><div class="columns small-centered small-12 smedium-11 medium-9 large-7"><div class=row id=theme-chooser><span class="columns small-6" data-translation=theme></span> <span class="columns small-6 text-right"><div id=theme-name></div></span></div><div class=row><span class="columns small-6" data-translation=sound></span> <span class="columns small-6 text-right"><label class=switch><input type=checkbox class=setting id=play-sound name=play-sound value=1 data-default=1> <span class=slider></span></label></span></div><div class=row><span class="columns small-6" data-translation=music></span> <span class="columns small-6 text-right"><label class=switch><input type=checkbox class=setting id=play-music name=play-music value=1 data-default=1> <span class=slider></span></label></span></div><div class=row id=credits-button><span class="columns small-6" data-translation=credits></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class=row id=privacy-policy-button><span class="columns small-6" data-translation=privacy-policy></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class=row id=impressum-button><span class="columns small-6" data-translation=impressum></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class=row><span class="columns small-6" data-translation=track></span> <span class="columns small-6 text-right"><label class=switch><input type=checkbox class=setting id=track-switch name=matomoShouldTrack value=1 data-default=1 data-raw=1> <span class=slider></span></label></span></div><button id=reset-levels class=button data-translation=reset-levels></button></div></div></div>

View File

@ -1 +1 @@
<div class="max-height overflow-hidden"><div id=segment-leaf-template class="segment segment-leaf"><div class=leaf-element></div></div><div id=segment-parent-template class="segment segment-parent"><div class=child-container></div></div><div id=segment-row-template class="segment segment-row"><div class=child-container></div></div><div id=segment-triangle-template class="segment segment-triangle"><div class=child-container></div></div><div id=tutorial-pointer></div><div class="max-height fill-me"><div class="text-right max-width"><button class="button show-while-playing" id=help-button data-translation=help></button></div><div class="height-20 no-transition tutorial-text center flex-center hidden"><div class="step-1 hidden" data-translation=tutorial-step-1></div><div class="step-2 hidden" data-translation=tutorial-step-2></div><div class="step-3 hidden" data-translation=tutorial-step-3></div><div class="step-4 hidden" data-translation=tutorial-step-4></div></div><div class="height-20 show-when-won center flex-center fill-me" style="min-height: 45px"><div class="grow max-width"><b data-translation=won id=won-text></b></div><div id=coin-container><div id=coin-template class=coin style="opacity: 0"><img src=img/coin.png></div></div></div><div class="flex-center level-container grow"><div id=level></div></div><div class="show-when-won flex-center height-20"><button class="button max-width" id=continue-button data-translation=continue></button></div></div><div class=tutorial-blanket></div></div> <div class="max-height overflow-hidden"><div id=segment-leaf-template class="segment segment-leaf"><div class=leaf-element></div></div><div id=segment-parent-template class="segment segment-parent"><div class=child-container></div></div><div id=segment-row-template class="segment segment-row"><div class=child-container></div></div><div id=segment-triangle-template class="segment segment-triangle"><div class=child-container></div></div><div id=tutorial-pointer></div><div class="max-height fill-me"><div class="text-right max-width"><button class="button show-while-playing" id=help-button><img src=img/help.png></button></div><div class="height-20 no-transition tutorial-text center flex-center hidden"><div class="step-1 hidden" data-translation=tutorial-step-1></div><div class="step-2 hidden" data-translation=tutorial-step-2></div><div class="step-3 hidden" data-translation=tutorial-step-3></div><div class="step-4 hidden" data-translation=tutorial-step-4></div></div><div class="height-20 show-when-won center flex-center fill-me" style="min-height: 45px"><div class="grow max-width"><b data-translation=won id=won-text></b></div><div id=coin-container><div id=coin-template class=coin style="opacity: 0"><img src=img/coin.png></div></div></div><div class="flex-center level-container grow"><div id=level></div></div><div class="show-when-won flex-center height-20"><button class="button max-width" id=continue-button data-translation=continue></button></div></div><div class=tutorial-blanket></div></div>

View File

@ -0,0 +1 @@
<div></div>

View File

@ -1 +1 @@
<div class="max-height fill-me"><ul class="menu vertical plain dropdown hidden" id=settings-fragment-list></ul><h2 data-translation=settings></h2><div id=settings-fragments></div></div> <div class="max-height fill-me overflow-y-scroll"><ul class="menu vertical plain dropdown hidden" id=settings-fragment-list></ul><h2 data-translation=settings></h2><div id=settings-fragments></div></div>

BIN
public/img/help.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

View File

@ -1,19 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html" lang="de"> <html xmlns="http://www.w3.org/1999/html" lang="de">
<head> <head>
<!-- Global Site Tag (gtag.js) - Google Analytics -->
<!--TODO Für Prod einkommentieren-->
<!--<script async src="https://www.googletagmanager.com/gtag/js?id=UA-73144353-3"></script>-->
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments)
};
gtag('js', new Date());
</script>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8"> <meta charset="utf-8">
@ -33,7 +20,6 @@
<!-- Le styles --> <!-- Le styles -->
<link href="css/foundation.css" media="screen,print" rel="stylesheet" type="text/css"> <link href="css/foundation.css" media="screen,print" rel="stylesheet" type="text/css">
<link href="css/wordRotator.css" media="screen,print" rel="stylesheet" type="text/css"> <link href="css/wordRotator.css" media="screen,print" rel="stylesheet" type="text/css">
</head> </head>
<body class='blue'> <body class='blue'>
@ -98,11 +84,10 @@
</div> </div>
</div> </div>
<footer> <footer>
<!--<a data-site-name='policy' class='deep-link' data-translation="policy-heading">Privacy Policy</a>--> <a data-site-name='privacyPolicy' class='deep-link' data-translation="policy-heading">Privacy Policy</a>
<a href="https://apps.silas.link" target="_blank" rel = "noopener" data-translation="other-apps">Other Apps</a> <a href="https://apps.silas.link" target="_blank" rel = "noopener" data-translation="other-apps">Other Apps</a>
</footer> </footer>
<script> <script>
var initPromise; var initPromise;
try { try {
function init() { function init() {

View File

@ -3672,16 +3672,22 @@ class LocalStorageSettingsFragment extends Fragment {
let settings = this.findBy(".setting", true); let settings = this.findBy(".setting", true);
const settingsManager = SettingsManager.getInstance(); const settingsManager = SettingsManager.getInstance();
for (let i = 0; i < settings.length; i++) { for (let i = 0; i < settings.length; i++) {
let setting = settings[i]; let setting = settings[i];
const name = setting.name; const name = setting.name;
let value = settingsManager.getSetting(name); let value;
if (!setting["dataset"]["raw"]) {
value = settingsManager.getSetting(name);
} else {
value = localStorage.getItem(name);
}
let isCheckable = false; let isCheckable = false;
if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) { if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) {
isCheckable = true; isCheckable = true;
} }
if (!settingsManager.hasSetting(name) && Helper.isNotNull(settings[i]["dataset"]["default"])) { if (((!setting["dataset"]["raw"] && !settingsManager.hasSetting(name)) || (setting["dataset"]["raw"] && value === null))
&& Helper.isNotNull(settings[i]["dataset"]["default"])) {
value = setting["dataset"]["default"]; value = setting["dataset"]["default"];
if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) { if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) {
@ -3704,19 +3710,15 @@ class LocalStorageSettingsFragment extends Fragment {
} }
setting.addEventListener("change", function () { setting.addEventListener("change", function () {
// console.log(setting);
let value = this.value; let value = this.value;
if (isCheckable) { if (isCheckable && !this.checked) {
if (this.checked) value = null;
{
settingsManager.setSetting(name, value);
}
else
{
settingsManager.setSetting(name, null);
}
} }
else { if (!setting["dataset"]["raw"]) {
settingsManager.setSetting(name, value); settingsManager.setSetting(name, value);
} else {
localStorage.setItem(name, value);
} }
delete setting["dataset"]["translationValue"]; delete setting["dataset"]["translationValue"];
delete setting["dataset"]["translation"]; delete setting["dataset"]["translation"];
@ -4599,6 +4601,88 @@ InitPromise.addPromise(function(app){
app.addDeepLink("newPassword", SetNewPasswordSite); app.addDeepLink("newPassword", SetNewPasswordSite);
}); });
class Matomo {
static init() {
Matomo.isTrackingPromise = new Promise(async (resolve) => {
let shouldTrack = localStorage.getItem(Matomo.LOCAL_STORAGE_KEY);
console.log(shouldTrack,Helper.isNull(shouldTrack));
if (Helper.isNull(shouldTrack)) {
shouldTrack = await Matomo._askIsTracking();
localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, shouldTrack);
}
else {
console.log(shouldTrack, (shouldTrack === "1"));
shouldTrack = (shouldTrack === "1");
Matomo.setTrack(shouldTrack);
}
resolve(shouldTrack);
});
Matomo.isTrackingPromise.then(() => {
Matomo.push(['trackPageView']);
Matomo.push(['enableLinkTracking']);
Matomo.push(['setTrackerUrl', Matomo.TRACK_SITE + '/piwik.php']);
Matomo.push(['setSiteId', '1']);
let d = document, g = d.createElement('script'), s = d.getElementsByTagName('head')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = Matomo.TRACK_SITE + '/piwik.js';
s.appendChild(g);
});
}
static async _askIsTracking() {
console.log(Matomo.TRACK_SITE + Matomo.BASE_PATH + "isTracked");
Matomo.isTrackingPromise = Matomo.query("isTracked")
.then(xml => {
let textContent = xml.firstChild.textContent;
// localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, textContent);
return (textContent === "1")
});
return Matomo.isTrackingPromise;
}
static async query(method) {
return fetch(Matomo.TRACK_SITE + Matomo.BASE_PATH + method, {
// "method":"POST",
"mode": "cors",
"credentials": "include",
// "headers": {
// 'Access-Control-Allow-Origin': '*',
// 'Access-Control-Allow-Credentials': 'true',
// },
}).then(res => res.text()).then(text => (new window.DOMParser()).parseFromString(text, "text/xml"));
}
static getTrackingPromise() {
return Matomo.isTrackingPromise;
}
static async setTrack(shouldTrack) {
Matomo.isTrackingPromise = Promise.resolve(shouldTrack);
localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, (shouldTrack === true) ? "1" : "0");
return await Matomo.query((shouldTrack) ? "doTrack" : "doIgnore");
}
static async push(arr) {
if (await Matomo.getTrackingPromise()) {
window["_paq"].push(arr);
}
}
}
Matomo.LOCAL_STORAGE_KEY = "matomoShouldTrack";
Matomo.TRACK_SITE = "//matomo.silas.link";
Matomo.BASE_PATH = "/index.php?module=API&method=AjaxOptOut.";
InitPromise.addPromise(() => {
window["_paq"] = window["_paq"] || [];
Matomo.init();
});
class ScaleHelper { class ScaleHelper {
async scaleTo(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animationDelay, addListener) { async scaleTo(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animationDelay, addListener) {
@ -5899,7 +5983,7 @@ class LevelSite extends WordRotatorBaseSite {
let levelSegment = this.findBy("#level"); let levelSegment = this.findBy("#level");
levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement()); levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement());
let scaleHelper = new ScaleHelper(); let scaleHelper = new ScaleHelper();
this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length*1.5 , null, 0); this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length * 1.5, null, 0);
this.level = level; this.level = level;
return this.tutorial(); return this.tutorial();
@ -6003,14 +6087,9 @@ class LevelSite extends WordRotatorBaseSite {
}).then(() => { }).then(() => {
return Promise.all([new Promise((r) => { return Promise.all([new Promise((r) => {
setTimeout(() => { setTimeout(() => {
console.log("fadeIn"); r(continueButton.fadeIn());
r(continueButton.fadeIn().then(() => {
console.log("fade in ended!");
}));
}, 500); }, 500);
}), audioOptions.loadedPromise.then(() => { }), audioOptions.loadedPromise.catch(e => {
console.log("audio loaded");
}).catch(e => {
console.error(e); console.error(e);
})]); })]);
}); });
@ -6406,34 +6485,98 @@ InitPromise.addPromise(app => {
MenuSite.app = app; MenuSite.app = app;
}); });
class PrivacyPolicySite extends WordRotatorBaseSite {
constructor(siteManager) {
super(siteManager, "html/application/privacyPolicy.html", "privacyPolicy");
}
}
InitPromise.addPromise(app => {
app.addDeepLink("privacyPolicy", PrivacyPolicySite);
});
class CreditsSite extends WordRotatorBaseSite{
constructor(siteManager) {
super(siteManager, "html/application/credits.html", "credits");
}
}
InitPromise.addPromise(app => {
app.addDeepLink("credits", PrivacyPolicySite);
});
class ChooseThemeDialog extends Dialog {
constructor() {
let viewPromise = ViewInflater.inflate("html/application/dialog/chooseTheme.html").then(view => {
let template = view.querySelector("#choose-theme-template");
template.remove();
template.id = null;
let themeTemplateContainer = template.querySelector("#theme-choose-container");
for (let i = 0; i < ThemeManager.themes.length; i++) {
let themeElem = Helper.cloneNode(template);
let theme = ThemeManager.themes[i];
themeElem.querySelector(".name").appendChild(Translator.makePersistentTranslation(theme._name));
themeElem["dataset"]["theme"] = theme._name;
themeElem.addEventListener("click", () => {
this.result = themeElem["dataset"]["theme"];
this.close();
});
themeTemplateContainer.appendChild(themeElem);
}
return view;
});
super(viewPromise, "choose-theme-dialog-title");
}
}
class WordRotatorSettingFragment extends LocalStorageSettingsFragment { class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) { constructor(site) {
super(site, "html/application/fragment/settings.html"); super(site, "html/application/fragment/settings.html");
} }
onFirstStart() { onFirstStart() {
let themeTemplate = this.findBy("#theme-radio-template"); // let themeTemplate = this.findBy("#theme-radio-template");
delete themeTemplate["id"]; // delete themeTemplate["id"];
let themeTemplateContainer = themeTemplate.parentNode; // let themeTemplateContainer = themeTemplate.parentNode;
themeTemplateContainer.removeAllChildren(); // themeTemplateContainer.removeAllChildren();
//
// for (let i = 0; i < ThemeManager.themes.length; i++) {
// let themeElem = Helper.cloneNode(themeTemplate);
// let theme = ThemeManager.themes[i];
// themeElem.appendChild(Translator.makePersistentTranslation(theme._name));
//
// let inputElem = themeElem.querySelector("input");
// inputElem.value = theme._className;
//
// inputElem.addEventListener("change", function() {
// if (this.checked){
// ThemeManager.changeCurrentTheme(theme)
// }
// });
// themeTemplateContainer.appendChild(themeElem);
// }
for (let i = 0; i < ThemeManager.themes.length; i++) { let currentThemeName = ThemeManager.currentTheme._name;
let themeElem = Helper.cloneNode(themeTemplate); SettingsManager.getInstance().setSetting("theme", currentThemeName);
let theme = ThemeManager.themes[i];
themeElem.appendChild(Translator.makePersistentTranslation(theme._name));
let inputElem = themeElem.querySelector("input"); let themeNameElem = this.findBy("#theme-name");
inputElem.value = theme._className; themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(currentThemeName));
this.findBy("#theme-chooser").addEventListener("click", async () => {
console.log("clicked");
let newTheme = (new ChooseThemeDialog()).show();
if (Helper.isNotNull(newTheme)){
SettingsManager.getInstance().setSetting("theme", newTheme);
ThemeManager.changeCurrentTheme(newTheme);
themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(newTheme));
}
});
inputElem.addEventListener("change", function() {
if (this.checked){
ThemeManager.changeCurrentTheme(theme);
}
});
themeTemplateContainer.appendChild(themeElem);
}
SettingsManager.getInstance().setSetting("theme", ThemeManager.currentTheme._name);
this.findBy("#reset-levels").addEventListener("click", () => { this.findBy("#reset-levels").addEventListener("click", () => {
localStorage.removeItem("currentLevel"); localStorage.removeItem("currentLevel");
@ -6443,6 +6586,28 @@ class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL); WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL);
}); });
let playMusicButton = this.findBy("#play-music");
playMusicButton.addEventListener("change", () => {
let soundManager = SoundManager.getInstance();
soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC);
if (playMusicButton.checked){
soundManager.play(SoundManager.CHANNELS.MUSIC);
}
});
this.findBy("#track-switch").addEventListener("change", function(e) {
Matomo.setTrack(this.checked === true);
e.stopPropagation();
e.preventDefault();
});
this.findBy("#credits-button").addEventListener("click", () => {
this.getSite().startSite(CreditsSite);
});
this.findBy("#privacy-policy-button").addEventListener("click", () => {
this.getSite().startSite(PrivacyPolicySite);
});
return super.onFirstStart(); return super.onFirstStart();
} }
} }
@ -6452,7 +6617,7 @@ InitPromise.addPromise(function () {
}); });
let basePath = "/pwa/wordRotator/public/"; let basePath = "/pwa/wordRotator/public/";
if (window.location.pathname.endsWith("publicTest/")) if (window.location.pathname.includes("publicTest/"))
{ {
basePath = "/pwa/wordRotator/publicTest/"; basePath = "/pwa/wordRotator/publicTest/";
} }
@ -6477,8 +6642,6 @@ ShareManager.addShareButton(new TelegramShareButton('img/telegram.svg'));
let app = new App(); let app = new App();
// app.addDeepLink("policy", PrivatePolicySite.name); // app.addDeepLink("policy", PrivatePolicySite.name);
// app.setAddThemeAction(true);
// app.addDefaultAction(Translator.generateChangeLanguageMenuAction());
// bridge für Android // bridge für Android
window["ThemeManager"] = ThemeManager; window["ThemeManager"] = ThemeManager;
@ -6494,7 +6657,7 @@ SettingsSite.setTemplate("html/application/setting-template.html");
RegistrationSite.addAction = false; RegistrationSite.addAction = false;
LoginSite.addLoginAction = false; LoginSite.addLoginAction = false;
InitPromise.resolve(app).then(function(){ InitPromise.resolve(app).then(async function(){
SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS; SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS;
let settingsManager = SettingsManager.getInstance(); let settingsManager = SettingsManager.getInstance();
@ -6504,4 +6667,7 @@ InitPromise.resolve(app).then(function(){
app.start(MenuSite); app.start(MenuSite);
Translator.setLanguage("de"); Translator.setLanguage("de");
// let matomo = new Matomo();
// console.log(await matomo._askIsTracking());
}); });

File diff suppressed because one or more lines are too long

View File

@ -18,10 +18,13 @@ import "./lib/pwa-user-management"
import {SettingsManager, SettingsSite} from "./lib/pwa-core"; import {SettingsManager, SettingsSite} from "./lib/pwa-core";
import {SoundManager} from "./lib/pwa-assets"; import {Matomo, SoundManager} from "./lib/pwa-assets";
import {MenuSite} from "../module/Application/pwa/js/site/MenuSite"; import {MenuSite} from "../module/Application/pwa/js/site/MenuSite";
import {WordRotatorSettingFragment} from "../module/Application/pwa/js/Fragment/WordRotatorSettingFragment"; import {WordRotatorSettingFragment} from "../module/Application/pwa/js/Fragment/WordRotatorSettingFragment";
import {PrivacyPolicySite} from "../module/Application/pwa/js/site/PrivacyPolicySite";
import {CreditsSite} from "../module/Application/pwa/js/site/CreditsSite";
applyPolyfills(); applyPolyfills();
@ -41,8 +44,6 @@ ShareManager.addShareButton(new TelegramShareButton('img/telegram.svg'));
let app = new App(); let app = new App();
// app.addDeepLink("policy", PrivatePolicySite.name); // app.addDeepLink("policy", PrivatePolicySite.name);
// app.setAddThemeAction(true);
// app.addDefaultAction(Translator.generateChangeLanguageMenuAction());
// bridge für Android // bridge für Android
window["ThemeManager"] = ThemeManager; window["ThemeManager"] = ThemeManager;
@ -58,7 +59,7 @@ SettingsSite.setTemplate("html/application/setting-template.html");
RegistrationSite.addAction = false; RegistrationSite.addAction = false;
LoginSite.addLoginAction = false; LoginSite.addLoginAction = false;
InitPromise.resolve(app).then(function(){ InitPromise.resolve(app).then(async function(){
SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS; SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS;
let settingsManager = SettingsManager.getInstance(); let settingsManager = SettingsManager.getInstance();
@ -68,5 +69,8 @@ InitPromise.resolve(app).then(function(){
app.start(MenuSite); app.start(MenuSite);
Translator.setLanguage("de"); Translator.setLanguage("de");
// let matomo = new Matomo();
// console.log(await matomo._askIsTracking());
}); });

View File

@ -1,4 +1,4 @@
import { Helper, Fragment, Translator } from './pwa-lib.js'; import { Helper, InitPromise, Fragment, Translator } from './pwa-lib.js';
class DelayPromise extends Promise { class DelayPromise extends Promise {
static async delay(delay) { static async delay(delay) {
@ -8,6 +8,88 @@ class DelayPromise extends Promise {
} }
} }
class Matomo {
static init() {
Matomo.isTrackingPromise = new Promise(async (resolve) => {
let shouldTrack = localStorage.getItem(Matomo.LOCAL_STORAGE_KEY);
console.log(shouldTrack,Helper.isNull(shouldTrack));
if (Helper.isNull(shouldTrack)) {
shouldTrack = await Matomo._askIsTracking();
localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, shouldTrack);
}
else {
console.log(shouldTrack, (shouldTrack === "1"));
shouldTrack = (shouldTrack === "1");
Matomo.setTrack(shouldTrack);
}
resolve(shouldTrack);
});
Matomo.isTrackingPromise.then(() => {
Matomo.push(['trackPageView']);
Matomo.push(['enableLinkTracking']);
Matomo.push(['setTrackerUrl', Matomo.TRACK_SITE + '/piwik.php']);
Matomo.push(['setSiteId', '1']);
let d = document, g = d.createElement('script'), s = d.getElementsByTagName('head')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = Matomo.TRACK_SITE + '/piwik.js';
s.appendChild(g);
});
}
static async _askIsTracking() {
console.log(Matomo.TRACK_SITE + Matomo.BASE_PATH + "isTracked");
Matomo.isTrackingPromise = Matomo.query("isTracked")
.then(xml => {
let textContent = xml.firstChild.textContent;
// localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, textContent);
return (textContent === "1")
});
return Matomo.isTrackingPromise;
}
static async query(method) {
return fetch(Matomo.TRACK_SITE + Matomo.BASE_PATH + method, {
// "method":"POST",
"mode": "cors",
"credentials": "include",
// "headers": {
// 'Access-Control-Allow-Origin': '*',
// 'Access-Control-Allow-Credentials': 'true',
// },
}).then(res => res.text()).then(text => (new window.DOMParser()).parseFromString(text, "text/xml"));
}
static getTrackingPromise() {
return Matomo.isTrackingPromise;
}
static async setTrack(shouldTrack) {
Matomo.isTrackingPromise = Promise.resolve(shouldTrack);
localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, (shouldTrack === true) ? "1" : "0");
return await Matomo.query((shouldTrack) ? "doTrack" : "doIgnore");
}
static async push(arr) {
if (await Matomo.getTrackingPromise()) {
window["_paq"].push(arr);
}
}
}
Matomo.LOCAL_STORAGE_KEY = "matomoShouldTrack";
Matomo.TRACK_SITE = "//matomo.silas.link";
Matomo.BASE_PATH = "/index.php?module=API&method=AjaxOptOut.";
InitPromise.addPromise(() => {
window["_paq"] = window["_paq"] || [];
Matomo.init();
});
class RotateHelper { class RotateHelper {
rotate(element, degrees){ rotate(element, degrees){
let rotateText = element.innerText; let rotateText = element.innerText;
@ -271,4 +353,4 @@ class TabbedFragment extends Fragment {
} }
} }
export { DelayPromise, RotateHelper, ScaleHelper, SoundManager, TabbedFragment }; export { DelayPromise, Matomo, RotateHelper, ScaleHelper, SoundManager, TabbedFragment };

View File

@ -355,16 +355,22 @@ class LocalStorageSettingsFragment extends Fragment {
let settings = this.findBy(".setting", true); let settings = this.findBy(".setting", true);
const settingsManager = SettingsManager.getInstance(); const settingsManager = SettingsManager.getInstance();
for (let i = 0; i < settings.length; i++) { for (let i = 0; i < settings.length; i++) {
let setting = settings[i]; let setting = settings[i];
const name = setting.name; const name = setting.name;
let value = settingsManager.getSetting(name); let value;
if (!setting["dataset"]["raw"]) {
value = settingsManager.getSetting(name);
} else {
value = localStorage.getItem(name);
}
let isCheckable = false; let isCheckable = false;
if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) { if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) {
isCheckable = true; isCheckable = true;
} }
if (!settingsManager.hasSetting(name) && Helper.isNotNull(settings[i]["dataset"]["default"])) { if (((!setting["dataset"]["raw"] && !settingsManager.hasSetting(name)) || (setting["dataset"]["raw"] && value === null))
&& Helper.isNotNull(settings[i]["dataset"]["default"])) {
value = setting["dataset"]["default"]; value = setting["dataset"]["default"];
if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) { if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) {
@ -387,19 +393,15 @@ class LocalStorageSettingsFragment extends Fragment {
} }
setting.addEventListener("change", function () { setting.addEventListener("change", function () {
// console.log(setting);
let value = this.value; let value = this.value;
if (isCheckable) { if (isCheckable && !this.checked) {
if (this.checked) value = null;
{
settingsManager.setSetting(name, value);
}
else
{
settingsManager.setSetting(name, null);
}
} }
else { if (!setting["dataset"]["raw"]) {
settingsManager.setSetting(name, value); settingsManager.setSetting(name, value);
} else {
localStorage.setItem(name, value);
} }
delete setting["dataset"]["translationValue"]; delete setting["dataset"]["translationValue"];
delete setting["dataset"]["translation"]; delete setting["dataset"]["translation"];

View File

@ -2,7 +2,7 @@ import {SystemSettings, Translator} from "./lib/pwa-lib";
let basePath = "/pwa/wordRotator/public/"; let basePath = "/pwa/wordRotator/public/";
if (window.location.pathname.endsWith("publicTest/")) if (window.location.pathname.includes("publicTest/"))
{ {
basePath = "/pwa/wordRotator/publicTest/"; basePath = "/pwa/wordRotator/publicTest/";
} }

View File

@ -0,0 +1 @@
<div></div>

View File

@ -0,0 +1,5 @@
<div id='theme-choose-container'>
<div id='choose-theme-template'>
<div class='name'></div>
</div>
</div>

View File

@ -1,103 +1,137 @@
<div class='max-height fill-me'> <div class='max-height fill-me'>
<div class='row max-width grow flex-center'> <div class='row max-width grow flex-center'>
<div class='columns small-centered small-12 smedium-9 medium-11 large-7'> <div class='columns small-centered small-12 smedium-11 medium-9 large-7'>
<div class='row'> <div class='row' id = "theme-chooser">
<span class='columns small-6' data-translation="theme"></span> <span class='columns small-6' data-translation="theme"></span>
<span class='columns small-6'> <span class='columns small-6 text-right'>
<label id = 'theme-radio-template'><input type="radio" class='setting' name='theme'></label> <!--<label id='theme-radio-template'><input type="radio" class='setting' name='theme'></label>-->
<div id = 'theme-name'></div>
</span>
</div>
<div class='row'>
<span class='columns small-6' data-translation="sound"></span>
<span class='columns small-6 text-right'>
<label class="switch">
<!--<div data-view="img/speaker.svg"></div>-->
<input type="checkbox" class="setting" id="play-sound" name='play-sound' value="1" data-default="1">
<span class="slider"></span>
</label>
</span> </span>
</div> </div>
<!--<div class='row'>--> <div class='row'>
<!--<span class='columns small-6' data-translation="language"></span>--> <span class='columns small-6' data-translation="music"></span>
<!--<span class='columns small-6'>--> <span class='columns small-6 text-right'>
<!--<label id = 'language-radio-template'><input type="radio" class='setting' name='language'></label>--> <label class="switch">
<!--</span>--> <!--<div data-view="img/music.svg"></div>-->
<!--</div>--> <input type="checkbox" class="setting" id="play-music" name='play-music' value="1" data-default="1">
<span class="slider"></span>
</label>
<button id = 'reset-levels' class = "button" data-translation="reset-levels"></button> </span>
</div>
<div class='row' id='credits-button'>
<span class='columns small-6' data-translation="credits"></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<div class='row' id='privacy-policy-button'>
<span class='columns small-6' data-translation="privacy-policy"></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<div class='row' id='impressum-button'>
<span class='columns small-6' data-translation="impressum"></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<div class='row'>
<span class='columns small-6' data-translation="track"></span>
<span class='columns small-6 text-right'>
<label class="switch">
<!--<div data-view="img/music.svg"></div>-->
<input type="checkbox" class="setting" id="track-switch" name='matomoShouldTrack' value="1" data-default="1" data-raw="1">
<span class="slider"></span>
</label>
</span>
</div>
<!--<iframe-->
<!--style="border: 0; height: 200px; width: 600px;"-->
<!--src="https://matomo.silas.link/index.php?module=CoreAdminHome&action=optOut&language=de&backgroundColor=&fontColor=&fontSize=&fontFamily="-->
<!--&gt;</iframe>-->
<button id='reset-levels' class="button" data-translation="reset-levels"></button>
<!--<label class='row'>--> <!--<label class='row'>-->
<!--<span class='columns small-6' data-translation="ignore-card-always"></span>--> <!--<span class='columns small-6' data-translation="ignore-card-always"></span>-->
<!--<span class='columns small-6'><input type="checkbox" class='setting' name='ignore-card-always'--> <!--<span class='columns small-6'><input type="checkbox" class='setting' name='ignore-card-always'-->
<!--value='true'></span>--> <!--value='true'></span>-->
<!--</label>--> <!--</label>-->
<!--<br/>--> <!--<br/>-->
<!--<label class='row'>--> <!--<label class='row'>-->
<!--<span class='columns small-6' data-translation="use-included-latex"></span>--> <!--<span class='columns small-6' data-translation="use-included-latex"></span>-->
<!--<span class='columns small-6'><input type="checkbox" class='setting' name='use-included-latex' data-default="true" value="true"></span>--> <!--<span class='columns small-6'><input type="checkbox" class='setting' name='use-included-latex' data-default="true" value="true"></span>-->
<!--</label>--> <!--</label>-->
<!--<div class='row'>--> <!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-1-text"--> <!--<input type="text" class='setting' required name="ignore-button-1-text"-->
<!--data-default="ignore-card-1" data-default-translateable="1">--> <!--data-default="ignore-card-1" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-1-text"></span>--> <!--<span data-translation="settings-ignore-button-1-text"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-1-time" data-default="120">--> <!--<input type="number" class='setting' required name="ignore-button-1-time" data-default="120">-->
<!--<span data-translation="settings-ignore-button-1-time"></span>--> <!--<span data-translation="settings-ignore-button-1-time"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--</div>--> <!--</div>-->
<!--<div class='row'>--> <!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-2-text"--> <!--<input type="text" class='setting' required name="ignore-button-2-text"-->
<!--data-default="ignore-card-2" data-default-translateable="1">--> <!--data-default="ignore-card-2" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-2-text"></span>--> <!--<span data-translation="settings-ignore-button-2-text"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-2-time" data-default="1440">--> <!--<input type="number" class='setting' required name="ignore-button-2-time" data-default="1440">-->
<!--<span data-translation="settings-ignore-button-2-time"></span>--> <!--<span data-translation="settings-ignore-button-2-time"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--</div>--> <!--</div>-->
<!--<div class='row'>--> <!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-3-text"--> <!--<input type="text" class='setting' required name="ignore-button-3-text"-->
<!--data-default="ignore-card-3" data-default-translateable="1">--> <!--data-default="ignore-card-3" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-3-text"></span>--> <!--<span data-translation="settings-ignore-button-3-text"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-3-time" data-default="7200">--> <!--<input type="number" class='setting' required name="ignore-button-3-time" data-default="7200">-->
<!--<span data-translation="settings-ignore-button-3-time"></span>--> <!--<span data-translation="settings-ignore-button-3-time"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--</div>--> <!--</div>-->
<!--<div class='row'>--> <!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-4-text" data-default="ignore-card-4"--> <!--<input type="text" class='setting' required name="ignore-button-4-text" data-default="ignore-card-4"-->
<!--data-default-translateable="1">--> <!--data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-4-text"></span>--> <!--<span data-translation="settings-ignore-button-4-text"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--<div class="columns small-12 smedium-6">--> <!--<div class="columns small-12 smedium-6">-->
<!--<label>--> <!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-4-time" data-default="525600">--> <!--<input type="number" class='setting' required name="ignore-button-4-time" data-default="525600">-->
<!--<span data-translation="settings-ignore-button-4-time"></span>--> <!--<span data-translation="settings-ignore-button-4-time"></span>-->
<!--</label>--> <!--</label>-->
<!--</div>--> <!--</div>-->
<!--</div>--> <!--</div>-->

View File

@ -17,7 +17,9 @@
<!-- Site Content --> <!-- Site Content -->
<div class='max-height fill-me'> <div class='max-height fill-me'>
<div class="text-right max-width"> <div class="text-right max-width">
<button class="button show-while-playing" id='help-button' data-translation="help"></button> <button class="button show-while-playing" id='help-button'>
<img src = "img/help.png"/>
</button>
</div> </div>
<div class = 'height-20 no-transition tutorial-text center flex-center hidden'> <div class = 'height-20 no-transition tutorial-text center flex-center hidden'>
<div class = 'step-1 hidden' data-translation="tutorial-step-1"></div> <div class = 'step-1 hidden' data-translation="tutorial-step-1"></div>

View File

@ -0,0 +1 @@
<div></div>

View File

@ -1,4 +1,4 @@
<div class="max-height fill-me"> <div class="max-height fill-me overflow-y-scroll">
<ul class="menu vertical plain dropdown hidden" id="settings-fragment-list"></ul> <ul class="menu vertical plain dropdown hidden" id="settings-fragment-list"></ul>
<h2 data-translation="settings"></h2> <h2 data-translation="settings"></h2>
<div id="settings-fragments"></div> <div id="settings-fragments"></div>

View File

@ -1,6 +1,10 @@
import {LocalStorageSettingsFragment, SettingsManager, SettingsSite} from "../../../../../js/lib/pwa-core"; import {LocalStorageSettingsFragment, SettingsManager, SettingsSite} from "../../../../../js/lib/pwa-core";
import {Helper, InitPromise, ThemeManager, Translator} from "../../../../../js/lib/pwa-lib"; import {Helper, InitPromise, ThemeManager, Translator} from "../../../../../js/lib/pwa-lib";
import {WordRotatorDb} from "../WordRotatorDb"; import {WordRotatorDb} from "../WordRotatorDb";
import {Matomo, SoundManager} from "../../../../../js/lib/pwa-assets";
import {CreditsSite} from "../site/CreditsSite";
import {PrivacyPolicySite} from "../site/PrivacyPolicySite";
import {ChooseThemeDialog} from "../dialog/ChooseThemeDialog";
export class WordRotatorSettingFragment extends LocalStorageSettingsFragment { export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) { constructor(site) {
@ -8,28 +12,42 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
} }
onFirstStart() { onFirstStart() {
let themeTemplate = this.findBy("#theme-radio-template"); // let themeTemplate = this.findBy("#theme-radio-template");
delete themeTemplate["id"]; // delete themeTemplate["id"];
let themeTemplateContainer = themeTemplate.parentNode; // let themeTemplateContainer = themeTemplate.parentNode;
themeTemplateContainer.removeAllChildren(); // themeTemplateContainer.removeAllChildren();
//
// for (let i = 0; i < ThemeManager.themes.length; i++) {
// let themeElem = Helper.cloneNode(themeTemplate);
// let theme = ThemeManager.themes[i];
// themeElem.appendChild(Translator.makePersistentTranslation(theme._name));
//
// let inputElem = themeElem.querySelector("input");
// inputElem.value = theme._className;
//
// inputElem.addEventListener("change", function() {
// if (this.checked){
// ThemeManager.changeCurrentTheme(theme)
// }
// });
// themeTemplateContainer.appendChild(themeElem);
// }
for (let i = 0; i < ThemeManager.themes.length; i++) { let currentThemeName = ThemeManager.currentTheme._name;
let themeElem = Helper.cloneNode(themeTemplate); SettingsManager.getInstance().setSetting("theme", currentThemeName);
let theme = ThemeManager.themes[i];
themeElem.appendChild(Translator.makePersistentTranslation(theme._name));
let inputElem = themeElem.querySelector("input"); let themeNameElem = this.findBy("#theme-name");
inputElem.value = theme._className; themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(currentThemeName));
this.findBy("#theme-chooser").addEventListener("click", async () => {
console.log("clicked");
let newTheme = (new ChooseThemeDialog()).show();
if (Helper.isNotNull(newTheme)){
SettingsManager.getInstance().setSetting("theme", newTheme);
ThemeManager.changeCurrentTheme(newTheme);
themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(newTheme));
}
});
inputElem.addEventListener("change", function() {
if (this.checked){
ThemeManager.changeCurrentTheme(theme)
}
});
themeTemplateContainer.appendChild(themeElem);
}
SettingsManager.getInstance().setSetting("theme", ThemeManager.currentTheme._name);
this.findBy("#reset-levels").addEventListener("click", () => { this.findBy("#reset-levels").addEventListener("click", () => {
localStorage.removeItem("currentLevel"); localStorage.removeItem("currentLevel");
@ -39,6 +57,28 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL); WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL);
}); });
let playMusicButton = this.findBy("#play-music");
playMusicButton.addEventListener("change", () => {
let soundManager = SoundManager.getInstance();
soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC);
if (playMusicButton.checked){
soundManager.play(SoundManager.CHANNELS.MUSIC);
}
});
this.findBy("#track-switch").addEventListener("change", function(e) {
Matomo.setTrack(this.checked === true);
e.stopPropagation();
e.preventDefault();
});
this.findBy("#credits-button").addEventListener("click", () => {
this.getSite().startSite(CreditsSite);
});
this.findBy("#privacy-policy-button").addEventListener("click", () => {
this.getSite().startSite(PrivacyPolicySite);
});
return super.onFirstStart(); return super.onFirstStart();
} }
} }

View File

@ -0,0 +1,31 @@
import {Dialog, Helper, ThemeManager, Translator, ViewInflater} from "../../../../../js/lib/pwa-lib";
export class ChooseThemeDialog extends Dialog {
constructor() {
let viewPromise = ViewInflater.inflate("html/application/dialog/chooseTheme.html").then(view => {
let template = view.querySelector("#choose-theme-template");
template.remove();
template.id = null;
let themeTemplateContainer = template.querySelector("#theme-choose-container");
for (let i = 0; i < ThemeManager.themes.length; i++) {
let themeElem = Helper.cloneNode(template);
let theme = ThemeManager.themes[i];
themeElem.querySelector(".name").appendChild(Translator.makePersistentTranslation(theme._name));
themeElem["dataset"]["theme"] = theme._name;
themeElem.addEventListener("click", () => {
this.result = themeElem["dataset"]["theme"];
this.close()
});
themeTemplateContainer.appendChild(themeElem);
}
return view;
});
super(viewPromise, "choose-theme-dialog-title");
}
}

View File

@ -0,0 +1,13 @@
import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
import {InitPromise} from "../../../../../js/lib/pwa-lib";
import {PrivacyPolicySite} from "./PrivacyPolicySite";
export class CreditsSite extends WordRotatorBaseSite{
constructor(siteManager) {
super(siteManager, "html/application/credits.html", "credits");
}
}
InitPromise.addPromise(app => {
app.addDeepLink("credits", PrivacyPolicySite);
});

View File

@ -130,7 +130,7 @@ export class LevelSite extends WordRotatorBaseSite {
let levelSegment = this.findBy("#level"); let levelSegment = this.findBy("#level");
levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement()); levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement());
let scaleHelper = new ScaleHelper(); let scaleHelper = new ScaleHelper();
this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length*1.5 , null, 0); this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length * 1.5, null, 0);
this.level = level; this.level = level;
return this.tutorial(); return this.tutorial();
@ -234,14 +234,9 @@ export class LevelSite extends WordRotatorBaseSite {
}).then(() => { }).then(() => {
return Promise.all([new Promise((r) => { return Promise.all([new Promise((r) => {
setTimeout(() => { setTimeout(() => {
console.log("fadeIn"); r(continueButton.fadeIn());
r(continueButton.fadeIn().then(() => {
console.log("fade in ended!")
}));
}, 500) }, 500)
}), audioOptions.loadedPromise.then(() => { }), audioOptions.loadedPromise.catch(e => {
console.log("audio loaded")
}).catch(e => {
console.error(e) console.error(e)
})]); })]);
}); });

View File

@ -0,0 +1,12 @@
import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
import {InitPromise} from "../../../../../js/lib/pwa-lib";
export class PrivacyPolicySite extends WordRotatorBaseSite {
constructor(siteManager) {
super(siteManager, "html/application/privacyPolicy.html", "privacyPolicy");
}
}
InitPromise.addPromise(app => {
app.addDeepLink("privacyPolicy", PrivacyPolicySite);
});

View File

@ -16,5 +16,13 @@
"tutorial-step-4": "Große Segmente drehst du, indem du diese ziehst.", "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!", "extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!",
"dark":"Dunkel" "dark":"Dunkel",
"theme":"Theme:",
"sound":"Sound",
"music":"Musik",
"credits":"Credits",
"privacy-policy":"Datenschutzbestimmungen",
"impressum":"Impressum",
"track":"Anonymisierte Nutzungsdaten senden",
">":">"
} }

View File

@ -26,7 +26,7 @@
background-color:#{map-get($theme, themeColor)} !important; background-color:#{map-get($theme, themeColor)} !important;
} }
} }
.segment:not(.segment-row):not(.segment-triangle):not(.rotating) { .segment:not(.segment-row):not(.segment-triangle) {
@for $i from 1 through length($rotationDegrees) { @for $i from 1 through length($rotationDegrees) {
&.rotate-#{nth($rotationDegrees, $i)} { &.rotate-#{nth($rotationDegrees, $i)} {
background-color: #{map-get($theme, background)};; background-color: #{map-get($theme, background)};;
@ -41,7 +41,7 @@
} }
&.rotate-#{nth($rotationDegrees, $j)} { &.rotate-#{nth($rotationDegrees, $j)} {
background-color: #{map-get($theme, background)};; background-color: #{map-get($theme, background)};
} }
} }
} }
@ -51,7 +51,6 @@
} }
} }
body { body {
@each $theme, $values in $themes { @each $theme, $values in $themes {
@if (map-get($values, class) == '') { @if (map-get($values, class) == '') {

View File

@ -99,7 +99,6 @@ $coinTowerDimension: 28px;
//Segments //Segments
@for $i from 1 through length($rotationDegrees) { @for $i from 1 through length($rotationDegrees) {
$startDegree: ((nth($rotationDegrees, $i)+270)%360); $startDegree: ((nth($rotationDegrees, $i)+270)%360);
@ -317,33 +316,40 @@ $coinTowerDimension: 28px;
#continue-button { #continue-button {
margin-bottom: 2px; margin-bottom: 2px;
@include breakpoint(small down) { @include breakpoint(small down) {
margin-bottom: 0; margin-bottom: 0;
padding: 0.3em .6em; padding: 0.3em .6em;
} }
} }
#play-button{
@include breakpoint(small down){ #play-button {
@include breakpoint(small down) {
margin-bottom: 2px; margin-bottom: 2px;
} }
} }
#help-button { #help-button {
margin: 0; margin: 0;
padding: 0.4em 0.4em;
max-width: 3em;
@include breakpoint(smedium down) { @include breakpoint(smedium down) {
padding: 0.4em 0.6em; padding: 0.2em 0.2em;
max-width: 2em;
} }
} }
.line-height-1{
line-height:1; .line-height-1 {
line-height: 1;
} }
body{
body {
overscroll-behavior: contain; overscroll-behavior: contain;
} }
#site-content{
#site-content {
overflow: hidden; overflow: hidden;
} }
#img-sound:before{ #img-sound:before {
content: ""; content: "";
max-width: 1.4em; max-width: 1.4em;
background: url('../img/speaker.svg') background: url('../img/speaker.svg')

View File

@ -34,7 +34,7 @@ module.exports = {
], ],
runtimeCaching: [ runtimeCaching: [
{ {
urlPattern: /^https:\/\/((www\.google-analytics\.com)|(www\.googletagmanager\.com)|(apis\.google\.com)|(.*\.googleusercontent\.com)|(.*\.google.com)|(cdn.jsdelivr.net)).*$/, urlPattern: /^https:\/\/((matomo\.silas\.link)|(www\.googletagmanager\.com)|(apis\.google\.com)|(.*\.googleusercontent\.com)|(.*\.google.com)|(cdn.jsdelivr.net)).*$/,
handler: "networkFirst" handler: "networkFirst"
}, },
{ {