selectWordsAction

This commit is contained in:
silas
2018-10-16 10:20:13 +02:00
parent 204f94e740
commit 7fc54547c4
34 changed files with 238 additions and 35 deletions

View File

@@ -25,6 +25,7 @@ import {WordRotatorSettingFragment} from "../module/Application/pwa/js/Fragment/
import {PrivacyPolicySite} from "../module/Application/pwa/js/site/PrivacyPolicySite";
import {CreditsSite} from "../module/Application/pwa/js/site/CreditsSite";
import {SelectWordsSite} from "../module/Application/pwa/js/site/SelectWordsSite";
applyPolyfills();

View File

@@ -4,11 +4,12 @@ namespace Application;
use Ainias\Core\Factory\Controller\ServiceActionControllerFactory;
use Application\Controller\SyncController;
use Application\Controller\IndexController;
return array(
'controllers' => [
'factories' => [
Controller\IndexController::class => ServiceActionControllerFactory::class,
IndexController::class => ServiceActionControllerFactory::class,
SyncController::class => ServiceActionControllerFactory::class
],
],

View File

@@ -2,6 +2,7 @@
namespace Application;
use Application\Controller\IndexController;
use Zend\Router\Http\Segment;
return array(
@@ -9,14 +10,25 @@ return array(
'routes' => [
'data' => [
'child_routes' => [
'clock' => [
'words' => [
'type' => Segment::class,
'options' => [
'route' => '/clock',
'route' => '/words',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'clock',
'resource' => 'default',
'controller' => IndexController::class,
'action' => 'selectWords',
'resource' => 'admin',
],
],
],
'checkWord' => [
'type' => Segment::class,
'options' => [
'route' => '/checkWord',
'defaults' => [
'controller' => IndexController::class,
'action' => 'changeChecked',
'resource' => 'admin',
],
],
],

View File

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

View File

@@ -15,5 +15,5 @@ export class CreditsSite extends WordRotatorBaseSite{
}
InitPromise.addPromise(app => {
app.addDeepLink("credits", PrivacyPolicySite);
app.addDeepLink("credits", CreditsSite);
});

View File

@@ -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"));
});

View File

@@ -0,0 +1,5 @@
<div>
<p data-translation="credits-sister-text"></p>
<p data-translation="credits-coin-text" data-translation-args='["https://www.freesfx.co.uk/"]'></p>
<p data-translation="credits-music-text" data-translation-args='["https://audeeyah.de", "http://creativecommons.org/licenses/by/4.0/"]'></p>
</div>

View File

@@ -0,0 +1,25 @@
<div>
<div class="row">
<div class="column small-6">Noch nicht geprüft:</div>
<div class="column small-6" id='not-checked'></div>
<div class="column small-6">Gecheckt:</div>
<div class="column small-6" id='checked'></div>
<div class="column small-6">Unsicher:</div>
<div class="column small-6" id='not-sure'></div>
<div class="column small-6">Gelöscht:</div>
<div class="column small-6" id='deleted'></div>
</div>
<br/><br/>
<div id="word-container">
<div id="word-template" class='row'>
<div class="column small-12">
<span class='word'></span>
<span class="right">
<button class='button button-ok'>OK</button>
<button class='button button-unsure'>Unsicher</button>
<button class='button button-delete'>Entf.</button>
</span>
</div>
</div>
</div>
</div>

View File

@@ -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:<br/>Der Münz-Sound ist von der Webseite <a href = '{0}' target='_blank' rel='noopener' class = 'link'>{0}</a>. Alle Rechte für diesen Münz-Sound gehören <a target='_blank' rel='noopener' href = '{0}' class = 'link'>{0}</a>.",
"credits-music-text":"Musik:<br/>Bright And Beautiful - GEMAfreie Musik von <a href = '{0}' target='_blank' rel='noopener' class = 'link'>{0}</a><br/>Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0)<br/><a href = '{1}' target='_blank' rel='noopener' class = 'link'>{1}</a><br/>Angepasst (geschnitten) für diese App"
}

View File

@@ -1,14 +1,15 @@
<?php
namespace WordRotator\Controller;
namespace Application\Controller;
use Ainias\Core\Controller\OnlineController;
use Ainias\Core\Controller\ServiceActionController;
use Application\Model\Manager\WordManager;
use Application\Model\Word;
use Zend\View\Model\ViewModel;
class IndexController extends OnlineController
{
const LENGTH_WORDS_MIN = 12;
const LENGTH_WORDS_MIN = 6;
const LENGTH_WORDS_MAX = 12;
const NUMBER_WORDS_TO_CHECK_SIMULTANEOUSLY = 8;
@@ -34,16 +35,16 @@ class IndexController extends OnlineController
$wordsToCheck = [];
for ($i = 0; $i < self::NUMBER_WORDS_TO_CHECK_SIMULTANEOUSLY; $i++) {
$wordsToCheck[] = $wordManager->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),
];
}
}

View File

@@ -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(),

View File

@@ -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))