update to pc
This commit is contained in:
parent
7fc54547c4
commit
56d17ca07d
1
.idea/php.xml
generated
1
.idea/php.xml
generated
@ -91,4 +91,5 @@
|
||||
<path value="$PROJECT_DIR$/vendor/ainias/pwa-zf-core" />
|
||||
</include_path>
|
||||
</component>
|
||||
<component name="PhpProjectSharedConfiguration" php_language_level="7" />
|
||||
</project>
|
||||
@ -41,7 +41,8 @@
|
||||
"ainias/pwa-zf-core":"dev-es6 as 0.0.10",
|
||||
"ainias/pwa-zf-contact": "dev-master as 0.0.10",
|
||||
"ainias/pwa-lib": "dev-es6 as 0.0.10",
|
||||
"ainias/pwa-assets": "dev-es6 as 0.0.10"
|
||||
"ainias/pwa-assets": "dev-es6 as 0.0.10",
|
||||
"ext-json": "*"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
||||
30890
orga/Word.sql
Normal file
30890
orga/Word.sql
Normal file
File diff suppressed because it is too large
Load Diff
@ -50,3 +50,8 @@ INSERT INTO RoleAccess(RoleId, AccessId) VALUES (1,3); -- gast - default
|
||||
INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,2); -- user - online
|
||||
INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,3); -- user - default
|
||||
INSERT INTO `RoleAccess` (`RoleId`, `AccessId`) VALUES (3, 4); -- admin - admin
|
||||
|
||||
|
||||
--------------
|
||||
|
||||
ALTER TABLE Word ADD used TINYINT(1) NOT NULL;
|
||||
@ -53,6 +53,7 @@ ALTER TABLE UserAccess ADD CONSTRAINT FK_26623A76A1A046DD FOREIGN KEY (AccessId)
|
||||
ALTER TABLE RequestNewPasswordCode ADD CONSTRAINT FK_27CF9C8BBF396750 FOREIGN KEY (id) REFERENCES Code (id) ON DELETE CASCADE;
|
||||
ALTER TABLE Rating ADD CONSTRAINT FK_D1189E24D9801611 FOREIGN KEY (levelId) REFERENCES Level (id);
|
||||
ALTER TABLE Rating ADD CONSTRAINT FK_D1189E24A1F3197E FOREIGN KEY (authTokenId) REFERENCES AuthToken (id);
|
||||
ALTER TABLE Word ADD used TINYINT(1) NOT NULL;
|
||||
|
||||
|
||||
INSERT INTO Role (name, beschreibung) VALUES ('gast', 'Kein aktives oder eingeloggtes Mitglied'); -- 1
|
||||
@ -72,6 +73,7 @@ INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,3); -- user - default
|
||||
INSERT INTO `RoleAccess` (`RoleId`, `AccessId`) VALUES (3, 4); -- admin - admin
|
||||
|
||||
|
||||
|
||||
INSERT INTO `Level` (`id`, `words`, `positions`, `renderer`, `lastUpdated`, `lang`, `deleted`, `difficulty`) VALUES
|
||||
(15, '["ARCHIV","CHARME"]', '[1,1,3]', 20, '2018-07-14 17:01:18', 1, 0, 2),
|
||||
(26, '["BODENSEE","ALARMRUF"]', '[3,2,0,3]', 40, '2018-07-14 17:01:18', 1, 0, 40),
|
||||
|
||||
1
orga/updateUsedFlagsSql.sql
Normal file
1
orga/updateUsedFlagsSql.sql
Normal file
@ -0,0 +1 @@
|
||||
UPDATE Word SET Word.used = 1 WHERE (SELECT count(*) FROM Level WHERE words LIKE CONCAT("%", Word.word, "%") AND deleted = 0) > 0
|
||||
@ -7069,6 +7069,62 @@ InitPromise.addPromise(app => {
|
||||
}, null, null, "admin"));
|
||||
});
|
||||
|
||||
class DeleteWordsSite extends UserSite {
|
||||
constructor(siteManager) {
|
||||
super(siteManager, "version/1/html/deleteLevels.html", null, "admin");
|
||||
}
|
||||
|
||||
async onConstruct(args) {
|
||||
let res = super.onConstruct(args);
|
||||
this.words = (await DataManager.load("getDoubleUsedWordsAction"))["result"];
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
onFirstStart() {
|
||||
super.onFirstStart();
|
||||
|
||||
let levelTemplate = this.findBy("#level-template");
|
||||
let wordTemplate = this.findBy("#word-template");
|
||||
let wordContainer = this.findBy("#word-container");
|
||||
|
||||
levelTemplate.id = null;
|
||||
levelTemplate.remove();
|
||||
|
||||
wordTemplate.id = null;
|
||||
wordTemplate.remove();
|
||||
|
||||
for (let k in this.words) {
|
||||
let wordElem = Helper.cloneNode(wordTemplate);
|
||||
wordElem.querySelector(".name").appendChild(document.createTextNode(k));
|
||||
let levelContainer = wordElem.querySelector(".level-container");
|
||||
for (let j = 0; j < this.words[k].length; j++) {
|
||||
let level = this.words[k][j];
|
||||
let levelElem = Helper.cloneNode(levelTemplate);
|
||||
levelElem.querySelector(".id").appendChild(document.createTextNode(level["id"]));
|
||||
levelElem.querySelector(".words").appendChild(document.createTextNode(level["words"]));
|
||||
levelElem.querySelector(".positions").appendChild(document.createTextNode(level["rotations"]));
|
||||
|
||||
levelElem.querySelector(".delete-button").addEventListener("click", async () => {
|
||||
let res = await DataManager.send("deleteLevel", {"levelId": level["id"]});
|
||||
if (res["success"]){
|
||||
levelElem.remove();
|
||||
}
|
||||
});
|
||||
|
||||
levelContainer.appendChild(levelElem);
|
||||
}
|
||||
wordContainer.appendChild(wordElem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InitPromise.addPromise(app => {
|
||||
app.addDefaultAction(new UserAction("delete-levels", () => {
|
||||
app.startSite(DeleteWordsSite);
|
||||
},null, null, "admin"));
|
||||
});
|
||||
|
||||
let basePath = "/pwa/wordRotator/public/";
|
||||
if (window.location.pathname.includes("publicTest/"))
|
||||
{
|
||||
|
||||
1
public/version/1/html/deleteLevels.html
Normal file
1
public/version/1/html/deleteLevels.html
Normal file
@ -0,0 +1 @@
|
||||
<div><div id=level-template class=row><div class="columns small-3">id:</div><div class="column small-6 id"></div><div class="column small-3"><button class="clickable margin-0 delete-button">X</button></div><div class="columns small-3">words:</div><div class="column small-9 words"></div><div class="columns small-3">rotations:</div><div class="column small-9 positions"></div><div class="columns small-12" style="border-bottom: 1px solid black"> </div></div><div id=word-template style="margin-bottom: 1.5rem"><span class=name></span>:<br><div class=level-container></div></div><div id=word-container></div></div>
|
||||
@ -26,6 +26,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";
|
||||
import {DeleteWordsSite} from "../module/Application/pwa/js/site/DeleteWordsSite";
|
||||
|
||||
applyPolyfills();
|
||||
|
||||
|
||||
@ -32,6 +32,28 @@ return array(
|
||||
],
|
||||
],
|
||||
],
|
||||
'getDoubleWords' => [
|
||||
'type' => Segment::class,
|
||||
'options' => [
|
||||
'route' => '/getDoubleUsedWordsAction',
|
||||
'defaults' => [
|
||||
'controller' => IndexController::class,
|
||||
'action' => 'getDoubleUsedWords',
|
||||
'resource' => 'admin',
|
||||
],
|
||||
],
|
||||
],
|
||||
'deleteLevel' => [
|
||||
'type' => Segment::class,
|
||||
'options' => [
|
||||
'route' => '/deleteLevel',
|
||||
'defaults' => [
|
||||
'controller' => IndexController::class,
|
||||
'action' => 'deleteLevel',
|
||||
'resource' => 'admin',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
59
src/module/Application/pwa/js/site/DeleteWordsSite.js
Normal file
59
src/module/Application/pwa/js/site/DeleteWordsSite.js
Normal file
@ -0,0 +1,59 @@
|
||||
import {UserAction, UserSite} from "../../../../../js/lib/pwa-user-management";
|
||||
import {Helper, InitPromise} from "../../../../../js/lib/pwa-lib";
|
||||
import {DataManager} from "../../../../../js/lib/pwa-core";
|
||||
|
||||
export class DeleteWordsSite extends UserSite {
|
||||
constructor(siteManager) {
|
||||
super(siteManager, "version/1/html/deleteLevels.html", null, "admin");
|
||||
}
|
||||
|
||||
async onConstruct(args) {
|
||||
let res = super.onConstruct(args);
|
||||
this.words = (await DataManager.load("getDoubleUsedWordsAction"))["result"];
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
onFirstStart() {
|
||||
super.onFirstStart();
|
||||
|
||||
let levelTemplate = this.findBy("#level-template");
|
||||
let wordTemplate = this.findBy("#word-template");
|
||||
let wordContainer = this.findBy("#word-container");
|
||||
|
||||
levelTemplate.id = null;
|
||||
levelTemplate.remove();
|
||||
|
||||
wordTemplate.id = null;
|
||||
wordTemplate.remove();
|
||||
|
||||
for (let k in this.words) {
|
||||
let wordElem = Helper.cloneNode(wordTemplate);
|
||||
wordElem.querySelector(".name").appendChild(document.createTextNode(k));
|
||||
let levelContainer = wordElem.querySelector(".level-container");
|
||||
for (let j = 0; j < this.words[k].length; j++) {
|
||||
let level = this.words[k][j];
|
||||
let levelElem = Helper.cloneNode(levelTemplate);
|
||||
levelElem.querySelector(".id").appendChild(document.createTextNode(level["id"]));
|
||||
levelElem.querySelector(".words").appendChild(document.createTextNode(level["words"]));
|
||||
levelElem.querySelector(".positions").appendChild(document.createTextNode(level["rotations"]));
|
||||
|
||||
levelElem.querySelector(".delete-button").addEventListener("click", async () => {
|
||||
let res = await DataManager.send("deleteLevel", {"levelId": level["id"]});
|
||||
if (res["success"]){
|
||||
levelElem.remove();
|
||||
}
|
||||
});
|
||||
|
||||
levelContainer.appendChild(levelElem);
|
||||
}
|
||||
wordContainer.appendChild(wordElem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InitPromise.addPromise(app => {
|
||||
app.addDefaultAction(new UserAction("delete-levels", () => {
|
||||
app.startSite(DeleteWordsSite);
|
||||
},null, null, "admin"))
|
||||
});
|
||||
@ -0,0 +1,13 @@
|
||||
<div>
|
||||
<div id = "level-template" class = "row">
|
||||
<div class = "columns small-3">id:</div><div class="column small-6 id"></div><div class = 'column small-3'><button class = 'clickable margin-0 delete-button'>X</button></div>
|
||||
<div class = "columns small-3">words:</div><div class="column small-9 words"></div>
|
||||
<div class = "columns small-3">rotations:</div><div class="column small-9 positions"></div>
|
||||
<div class = "columns small-12" style = 'border-bottom: 1px solid black'> </div>
|
||||
</div>
|
||||
<div id = "word-template" style="margin-bottom: 1.5rem">
|
||||
<span class = "name"></span>:<br/>
|
||||
<div class = "level-container"></div>
|
||||
</div>
|
||||
<div id = "word-container"></div>
|
||||
</div>
|
||||
@ -3,6 +3,7 @@
|
||||
namespace Application\Controller;
|
||||
|
||||
use Ainias\Core\Controller\OnlineController;
|
||||
use Application\Model\Manager\LevelManager;
|
||||
use Application\Model\Manager\WordManager;
|
||||
use Application\Model\Word;
|
||||
use Zend\View\Model\ViewModel;
|
||||
@ -75,4 +76,36 @@ class IndexController extends OnlineController
|
||||
WordManager::wordToArray($randomWordNotChecked),
|
||||
];
|
||||
}
|
||||
|
||||
public function getDoubleUsedWordsAction(){
|
||||
/** @var LevelManager $levelManager */
|
||||
$levelManager = $this->get(LevelManager::class);
|
||||
return $levelManager->getDoubleUsedWords();
|
||||
}
|
||||
|
||||
public function deleteLevelAction(){
|
||||
$request = $this->getRequest();
|
||||
|
||||
if (!$request->isPost()) {
|
||||
return $this->triggerDispatchError(403);
|
||||
}
|
||||
|
||||
$levelId = $request->getPost("levelId", "");
|
||||
|
||||
/** @var LevelManager $levelManager */
|
||||
$levelManager = $this->get(LevelManager::class);
|
||||
$level = $levelManager->getEntityById($levelId);
|
||||
$level->setDeleted(true);
|
||||
$level->setLastUpdated(new \DateTime());
|
||||
|
||||
$levelManager->save($level);
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
public function generateLevelsAction(){
|
||||
/** @var LevelManager $levelManager */
|
||||
$levelManager = $this->get(LevelManager::class);
|
||||
$levelManager->generateLevels();
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: silas
|
||||
* Date: 17.10.18
|
||||
* Time: 16:47
|
||||
*/
|
||||
|
||||
namespace Application\Factory\Model\Manager;
|
||||
|
||||
use Application\Model\Level;
|
||||
use Application\Model\Manager\LevelManager;
|
||||
use Application\Model\Manager\WordManager;
|
||||
use Interop\Container\ContainerInterface;
|
||||
use Zend\ServiceManager\Factory\FactoryInterface;
|
||||
|
||||
class LevelManagerFactory implements FactoryInterface
|
||||
{
|
||||
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
|
||||
{
|
||||
return $this->createService($container, $requestedName);
|
||||
}
|
||||
|
||||
public function createService(ContainerInterface $serviceLocator, $managerName)
|
||||
{
|
||||
$em = $serviceLocator->get('doctrine.entitymanager.orm_default');
|
||||
/** @var WordManager $wordManager */
|
||||
$wordManager = $serviceLocator->get(WordManager::class);
|
||||
return new LevelManager($em->getRepository(Level::class), $wordManager);
|
||||
}
|
||||
}
|
||||
@ -8,12 +8,16 @@ use Application\Model\Level;
|
||||
|
||||
class LevelManager extends StandardManager
|
||||
{
|
||||
/** @var LevelRepository */
|
||||
/** @var LevelRepository */
|
||||
protected $repository;
|
||||
|
||||
public function __construct(LevelRepository $repository, Level $entity = null)
|
||||
/** @var WordManager */
|
||||
protected $wordManager;
|
||||
|
||||
public function __construct(LevelRepository $repository, WordManager $wordManager, Level $entity = null)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
$this->wordManager = $wordManager;
|
||||
parent::__construct($repository, $entity);
|
||||
}
|
||||
|
||||
@ -51,12 +55,12 @@ class LevelManager extends StandardManager
|
||||
return $this->repository->countNewerThanDate($dateTime);
|
||||
}
|
||||
|
||||
public function levelToArray(Level $level)
|
||||
static function levelToArray(Level $level)
|
||||
{
|
||||
return [
|
||||
"id" => $level->getId(),
|
||||
"words" => json_decode($level->getWords()),
|
||||
"rotations"=> json_decode($level->getPositions()),
|
||||
"rotations" => json_decode($level->getPositions()),
|
||||
"lastUpdated" => $level->getLastUpdated()->format("Y-m-d"),
|
||||
"language" => $level->getLang(),
|
||||
"rendererType" => $level->getRenderer(),
|
||||
@ -65,14 +69,68 @@ class LevelManager extends StandardManager
|
||||
];
|
||||
}
|
||||
|
||||
public function levelsToArray($levels)
|
||||
static function levelsToArray($levels)
|
||||
{
|
||||
$returnArray = [];
|
||||
/** @var Level $level */
|
||||
foreach ($levels as $level)
|
||||
{
|
||||
$returnArray[] = $this->levelToArray($level);
|
||||
foreach ($levels as $level) {
|
||||
$returnArray[] = LevelManager::levelToArray($level);
|
||||
}
|
||||
return $returnArray;
|
||||
}
|
||||
|
||||
public function getDoubleUsedWords()
|
||||
{
|
||||
$words = [];
|
||||
$sameWords = [];
|
||||
|
||||
/** @var Level[] $level */
|
||||
$level = $this->findBy(["deleted" => 0]);
|
||||
|
||||
$levelNumber = count($level);
|
||||
for ($i = 0; $i < $levelNumber; $i++) {
|
||||
$words[$i] = $words[$i] ?? json_decode($level[$i]->getWords());
|
||||
$wordLength = count($words[$i]);
|
||||
for ($j = $i + 1; $j < $levelNumber; $j++) {
|
||||
$words[$j] = $words[$j] ?? json_decode($level[$j]->getWords());
|
||||
for ($k = 0; $k < $wordLength; $k++){
|
||||
if (in_array($words[$i][$k], $words[$j])){
|
||||
|
||||
$sameWords[$words[$i][$k]] = ($sameWords[$words[$i][$k]] ?? []);
|
||||
$sameWords[$words[$i][$k]][] = $level[$i];
|
||||
$sameWords[$words[$i][$k]][] = $level[$j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($sameWords as $key => &$levels){
|
||||
$sameWords[$key] = array_unique(LevelManager::levelsToArray($levels), SORT_REGULAR);
|
||||
}
|
||||
|
||||
return $sameWords;
|
||||
}
|
||||
|
||||
public function generateLevels()
|
||||
{
|
||||
$levelsToGenerate = [
|
||||
[
|
||||
"wordLength" => 12,
|
||||
"numWords" => 6,
|
||||
"numPositions" => 21
|
||||
],
|
||||
[
|
||||
"wordLength" => 12,
|
||||
"numWords" => 4,
|
||||
"numPositions" => 15
|
||||
],
|
||||
];
|
||||
|
||||
$words = [];
|
||||
do {
|
||||
$currentIndex = rand(0, count($levelsToGenerate) -1);
|
||||
$words[$levelsToGenerate[$currentIndex]] = $words[$levelsToGenerate[$currentIndex]] ?? $this->wordManager->findWordsForLength($levelsToGenerate[$currentIndex]["wordLength"]);
|
||||
|
||||
}while(1 == 2);
|
||||
|
||||
}
|
||||
}
|
||||
@ -125,4 +125,9 @@ class WordManager extends StandardManager
|
||||
{
|
||||
return $this->repository->countUnsure($minLength, $maxLength);
|
||||
}
|
||||
|
||||
public function findWordsForLength($length)
|
||||
{
|
||||
$this->repository->findWordsForLength($length);
|
||||
}
|
||||
}
|
||||
@ -128,4 +128,16 @@ class WordRepository extends StandardRepository
|
||||
$queryBuilder->setMaxResults(1);
|
||||
return $queryBuilder->getQuery()->getSingleScalarResult();
|
||||
}
|
||||
|
||||
public function findWordsForLength($length)
|
||||
{
|
||||
$queryBuilder = $this->_em->createQueryBuilder();
|
||||
$queryBuilder->select("w")->from(Word::class, "w");
|
||||
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.checked", "1"));
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.deleted", "0"));
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq($queryBuilder->expr()->length("w.word"), ":length"));
|
||||
$queryBuilder->setParameter("length", $length);
|
||||
return $queryBuilder->getQuery()->getResult();
|
||||
}
|
||||
}
|
||||
@ -60,6 +60,12 @@ class Word extends StandardModel
|
||||
*/
|
||||
protected $checked;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="boolean")
|
||||
* @var bool
|
||||
*/
|
||||
protected $used;
|
||||
|
||||
/**
|
||||
* Word constructor.
|
||||
*/
|
||||
@ -72,6 +78,7 @@ class Word extends StandardModel
|
||||
$this->lang = self::LANGUAGE_DE;
|
||||
$this->word = "";
|
||||
$this->checked = -1;
|
||||
$this->used = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -185,4 +192,20 @@ class Word extends StandardModel
|
||||
{
|
||||
$this->checked = $checked;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isUsed()
|
||||
{
|
||||
return $this->used;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $used
|
||||
*/
|
||||
public function setUsed($used)
|
||||
{
|
||||
$this->used = $used;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user