This commit is contained in:
silas
2018-09-18 13:22:20 +02:00
parent 013783322f
commit d029ea130b
28 changed files with 23291 additions and 5339 deletions

View File

@@ -10,6 +10,8 @@ class DelayPromise extends Promise {
class ScaleHelper {
scaleTo(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight) {
console.log("test");
margin = Helper.nonNull(margin, 10);
ignoreHeight = Helper.nonNull(ignoreHeight, false);
ignoreWidth = Helper.nonNull(ignoreWidth, false);

View File

@@ -103,13 +103,14 @@ class Form {
let self = this;
this.submitCallback = null;
this.errorCallback = function (errors) {
self.setErrors(errors);
this.errorCallback = async function (errors) {
await self.setErrors(errors);
};
formElem.addEventListener("submit", function (e) {
formElem.addEventListener("submit", async function (e) {
console.log("submitting!", e);
e.preventDefault();
self.doSubmit(e);
await self.doSubmit(e);
});
for (let i = 0, n = formElem.elements.length; i < n; i++) {
@@ -187,6 +188,18 @@ class Form {
self.setIsBusy(false);
for (let k in values) {
if (Helper.isNotNull(self.formElem.elements[k])) {
if (Helper.isNotNull(self.formElem.elements[k].options) && Helper.isNotNull(values[k+"Options"]))
{
let options = self.formElem.elements[k].options;
for (let val in values[k+"Options"])
{
let option = document.createElement("option");
option.value = val;
option.innerText = values[k+"Options"][val];
options.add(option);
}
}
self.formElem.elements[k].value = Helper.htmlspecialcharsDecode(values[k]);
if (Helper.isNotNull(values[k]) && (""+values[k]).trim() !== "") {
self.formElem.elements[k].classList.add("notEmpty");
@@ -200,7 +213,7 @@ class Form {
});
}
setErrors(errors) {
async setErrors(errors) {
let hasElem = false;
let firstError = null;
@@ -225,6 +238,7 @@ class Form {
}
}
}
if (hasElem) {
this.formElem.querySelector("input[type=submit]").click();
}
@@ -279,6 +293,7 @@ class SettingsManager {
getSetting(name, defaultValue) {
const settings = this.getSettings();
if (Helper.isNotNull(settings[name])) {
return settings[name].value;
}
@@ -310,6 +325,11 @@ class SettingsManager {
this._saveSettings();
}
hasSetting(name)
{
return Helper.nonNull(this._settings[name]);
}
_loadSettings() {
this._settings = localStorage.getItem(this._localStorageKey);
if (this._settings === null) {
@@ -334,15 +354,17 @@ class LocalStorageSettingsFragment extends Fragment {
let res = super.onFirstStart();
let settings = this.findBy(".setting", true);
const settingsManager = SettingsManager.getInstance();
for (let i = 0, n = settings.length; i < n; i++) {
for (let i = 0; i < settings.length; i++) {
let setting = settings[i];
const name = setting.name;
let value = settingsManager.getSetting(name);
let isCheckable = false;
if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) {
isCheckable = true;
}
if (Helper.isNull(value) && Helper.isNotNull(settings[i]["dataset"]["default"])) {
if (!settingsManager.hasSetting(name) && Helper.isNotNull(settings[i]["dataset"]["default"])) {
value = setting["dataset"]["default"];
if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) {
@@ -383,7 +405,6 @@ class LocalStorageSettingsFragment extends Fragment {
delete setting["dataset"]["translation"];
});
}
return res;
}
}
@@ -709,7 +730,7 @@ class ListHelper {
class SettingsSite extends AbstractSite {
constructor(siteManager) {
super(siteManager, 'public/html/settings.html', "settings");
super(siteManager, 'core/html/settings.html', "settings");
for (let k in SettingsSite.settingsFragments) {
this.addSettingsFragment(k, new SettingsSite.settingsFragments[k](this));
}
@@ -785,10 +806,10 @@ SettingsSite.shouldAddSettingsSite = true;
InitPromise.addPromise(function (app) {
if (SettingsSite.shouldAddSettingsSite) {
app.addDeepLink("settings", SettingsSite.name);
app.addDeepLink("settings", SettingsSite);
let settingsAction = new MenuAction("settings", function () {
app.startSite(SettingsSite.name);
app.startSite(SettingsSite);
}, MenuAction.SHOW_FOR_LARGE, 10000);
settingsAction.setIcon("img/settings.png");
app.addDefaultAction(settingsAction);

View File

@@ -36,6 +36,10 @@ class MenuAction {
this._shouldTranslate = shouldTranslate;
}
getShowFor(){
return this.showFor;
}
getTitle()
{
return this.title;
@@ -55,7 +59,7 @@ class MenuAction {
}
if (removeCopies)
{
for (let i = 0, n = this._copies.length; i < n; i++) {
for (let i = 0; i < this._copies.length; i++) {
this._copies[i].remove();
}
}
@@ -203,7 +207,7 @@ class Menu {
this.sortActions();
let actionElements = [];
for (let i = 0, n = this.actions.length; i < n; i++) {
for (let i = 0; i < this.actions.length; i++) {
let element = this.renderAction(this.actions[i]);
this.actions[i]._htmlElement = element;
actionElements.push(element);
@@ -310,7 +314,7 @@ class Menu {
_getElementsForAction(action){
let elements = [];
for (let i = 0, n = this.parentElements.length; i < n; i++) {
for (let i = 0; i < this.parentElements.length; i++) {
let elem = this.parentElements[i].querySelector("[data-id=\""+action.getId()+"\"]");
Helper.isNull(elem) || elements.push(elem);
}
@@ -319,6 +323,7 @@ class Menu {
updateAction(action)
{
console.log("update action here!");
let oldElements = this._getElementsForAction(action);
if (oldElements.length === 0)
{
@@ -328,7 +333,7 @@ class Menu {
let element = this.renderAction(action);
action._htmlElement = element;
for (let i = 0, n = oldElements.length; i < n; i++) {
for (let i = 0; i < oldElements.length; i++) {
oldElements[i].replaceWith(Helper.cloneNode(element));
}
}
@@ -402,7 +407,7 @@ class Submenu extends Menu
if (Helper.isNotNull(this.parentElements))
{
let self = this;
for (let i = 0, n = this.parentElements.length; i < n; i++) {
for (let i = 0; i < this.parentElements.length; i++) {
let closeListener = document.createElement("div");
closeListener.classList.add("close-listener");
closeListener.onclick = function(e){
@@ -973,7 +978,7 @@ class Helper {
static encodeToBase(stringToEncode, base) {
let encodedString = "";
let charlength = Math.floor(Math.log(265) / Math.log(base));
for (let i = 0, n = stringToEncode.length; i < n; i++) {
for (let i = 0; i < stringToEncode.length; i++) {
let value = stringToEncode.charCodeAt(i).toString(base);
let joinLength = value.length % charlength;
if (joinLength > 0) {
@@ -1494,7 +1499,6 @@ class ActionBarMenu extends Menu {
responsiveMenu.firstElementChild.addEventListener("click", function (e) {
if (e.target === responsiveMenu.firstElementChild && Helper.isNotNull(ActionBarMenu.currentMenu)) {
ActionBarMenu.currentMenu.close();
}
}
);
@@ -1504,7 +1508,7 @@ class ActionBarMenu extends Menu {
static _getCurrentSize() {
let matched;
for (let i = 0, n = ActionBarMenu.queries.length; i < n; i++) {
for (let i = 0; i < ActionBarMenu.queries.length; i++) {
let query = ActionBarMenu.queries[i];
if (matchMedia(query.value).matches) {
@@ -1519,12 +1523,6 @@ class ActionBarMenu extends Menu {
}
}
renderLiElement(aElement, action) {
let liElement = super.renderLiElement(aElement, action);
liElement.classList.add(action.showFor);
return liElement;
}
static filterVisibleElements(elements) {
let visibleElements = [];
for (let i = 0, n = elements.length; i < n; i++) {
@@ -1535,12 +1533,18 @@ class ActionBarMenu extends Menu {
return visibleElements;
}
renderLiElement(aElement, action) {
let liElement = super.renderLiElement(aElement, action);
liElement.classList.add(action.getShowFor());
return liElement;
}
updateToggleButton() {
let size = ActionBarMenu._getCurrentSize();
let firstParentElement = this.parentElements[0];
if (ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_LARGE)).length > 0 && (size === "medium" || size === "smedium" || size === "small") ||
ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_MEDIUM)).length > 0 && (size === "smedium" || size === "small") ||
ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_SMEDIUM)).length > 0 && (size === "small") ||
if ((size === "medium" || size === "smedium" || size === "small") && ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_LARGE)).length > 0 ||
(size === "smedium" || size === "small") && ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_MEDIUM)).length > 0 ||
(size === "small") && ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_SMEDIUM)).length > 0 ||
ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_NEVER)).length > 0) {
document.getElementById("responsive-menu-toggle").style.display = 'block';
} else {
@@ -1576,7 +1580,6 @@ class ActionBarMenu extends Menu {
}
}
removeAction(action) {
let res = super.removeAction(action);
this.updateToggleButton();
@@ -1744,7 +1747,7 @@ class Context {
}
}
class AbstractSite$1 extends Context {
class AbstractSite extends Context {
constructor(siteManager, view, deepLink) {
super(view);
@@ -1987,7 +1990,7 @@ class SiteManager {
}
startSite(siteConstructor, paramsPromise) {
if (!(siteConstructor.prototype instanceof AbstractSite$1))
if (!(siteConstructor.prototype instanceof AbstractSite))
{
throw {
"error": "wrong class given! Expected AbstractSite, given "+siteConstructor.name
@@ -2171,7 +2174,7 @@ class SiteManager {
}
}
class PauseSite extends AbstractSite$1 {
class PauseSite extends AbstractSite {
onConstruct(args) {
let pausedElement = null;
@@ -3522,22 +3525,31 @@ class Prioritised {
this.prioResult = -1;
this.callback = null;
this.hasResult = false;
this.highestPrio = -1;
let self = this;
this.callbackCalledPromise = new Promise(function (resolver) {
self.callbackCalledPromiseResolver = resolver;
});
this.endPromise = new Promise(function (resolver) {
self.endPromiseResolver = resolver;
});
this.setCallback(callback);
for (let k in resultPromises) {
resultPromises[k].then(function (res) {
self.setResult(k, res);
});
this.registerResultPromise(k, resultPromises[k]);
}
}
setResult(prio, result) {
async registerResultPromise(prio, promise) {
this.highestPrio = Math.max(prio, this.highestPrio);
let res = await Promise.resolve(promise);
this._setResult(prio, res);
}
_setResult(prio, result) {
if (this.prioResult <= prio || !this.hasResult) {
this.hasResult = true;
@@ -3547,6 +3559,12 @@ class Prioritised {
this.callback(result, prio, this);
this.callbackCalledPromiseResolver();
}
if (prio == this.highestPrio) {
console.log("endPromise resolved!");
this.endPromiseResolver();
}
}
}
@@ -3561,6 +3579,10 @@ class Prioritised {
getCallbackCalledPromise() {
return this.callbackCalledPromise;
}
getEndPromise() {
return this.endPromise;
}
}
class ScriptLoader {
@@ -4033,7 +4055,7 @@ class DBTranslator extends Translator {
function applyPolyfills(){
if (!String.prototype.format) {
String.prototype.format = function (args) {
String.prototype["format"] = function (args) {
return this.replace(/{(\d+)}/g, function (match, number) {
return args[number] !== undefined
? args[number]
@@ -4042,7 +4064,7 @@ function applyPolyfills(){
});
};
}
Object.assign = Helper.nonNull(Object.assign, function (base, obj) {
Object["assign"] = Helper.nonNull(Object["assign"], function (base, obj) {
base = Helper.nonNull(base, {});
if (obj === null || typeof(obj) !== 'object' || 'isActiveClone' in obj)
return base;
@@ -4076,7 +4098,6 @@ function applyPolyfills(){
}
if (HTMLElement) {
HTMLElement.prototype["fadeOut"] = Helper.nonNull(HTMLElement.prototype["fadeOut"],
function (time, effect, delay) {
time = Helper.nonNull(time, 0.5);
@@ -4212,7 +4233,7 @@ function applyPolyfills(){
});
var fetch = Helper.nonNull(fetch, function (url) {
window["fetch"] = Helper.nonNull(window["fetch"], function (url) {
console.log("customFetch", url);
let request = null;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
@@ -4253,4 +4274,4 @@ function applyPolyfills(){
});
}
export { App, ChainAble, CookieCompliance, ConfirmDialog, Dialog, FlashMessenger, AbstractService, AbstractGapiResponse, Achievement, AchievementList, GameService, GapiPlayer, Leaderboard, Score, GapiHandler, Helper, InitPromise, ActionBarMenu, Menu, MenuAction, OpenSubmenuAction, Submenu, MyDb, Prioritised, ScriptLoader, CopyShareButton, ShareButton, ShareManager, SmsShareButton, TelegramShareButton, WhatsappShareButton, SimpleWS, AbstractSite$1 as AbstractSite, Context, Fragment, PauseSite, SiteContainer, SiteManager, SystemSettings, Theme, ThemeManager, DBTranslator, Translator, TranslatorDB, ViewInflater, applyPolyfills };
export { App, ChainAble, CookieCompliance, ConfirmDialog, Dialog, FlashMessenger, AbstractService, AbstractGapiResponse, Achievement, AchievementList, GameService, GapiPlayer, Leaderboard, Score, GapiHandler, Helper, InitPromise, ActionBarMenu, Menu, MenuAction, OpenSubmenuAction, Submenu, MyDb, Prioritised, ScriptLoader, CopyShareButton, ShareButton, ShareManager, SmsShareButton, TelegramShareButton, WhatsappShareButton, SimpleWS, AbstractSite, Context, Fragment, PauseSite, SiteContainer, SiteManager, SystemSettings, Theme, ThemeManager, DBTranslator, Translator, TranslatorDB, ViewInflater, applyPolyfills };

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,13 @@
import {SystemSettings, Translator} from "./lib/pwa-lib";
SystemSettings.setBasePath("/pwa/wordRotator/public/");
let basePath = "/pwa/wordRotator/public/";
if (window.location.pathname.endsWith("publicTest/"))
{
basePath = "/pwa/wordRotator/publicTest/";
}
SystemSettings.setBasePath(basePath);
Translator.supportedLanguages = ["de", "en"];
Translator.markTranslations = false;

View File

@@ -22,7 +22,7 @@
</div>
</div>
<div class='show-when-won flex-center height-20'>
<button class='button' id='continue-button' data-translation="continue"></button>
<button class='button max-width' id='continue-button' data-translation="continue"></button>
</div>
</div>
</div>

View File

@@ -56,7 +56,7 @@ export class LevelSite extends AbstractSite {
let wonText = this.findBy("#won-text");
let scaleHelper = new ScaleHelper();
scaleHelper.scaleToFull(continueButton, continueButton.parentElement);
scaleHelper.scaleToFull(continueButton, continueButton.parentElement, false, true);
scaleHelper.scaleToFull(wonText, wonText.parentElement);
this.levelCounterAction.setTitle(this.levelCounter);
@@ -70,6 +70,7 @@ export class LevelSite extends AbstractSite {
let currentLevelInfo = localStorage.getItem("currentLevel");
if (currentLevelInfo !== null) {
currentLevelInfo = JSON.parse(currentLevelInfo);
console.log("LevelID: ", currentLevelInfo["id"]);
const db = WordRotatorDb.getInstance();
const levelJson = await db.loadLevel(currentLevelInfo["id"]);

View File

@@ -9,7 +9,6 @@ export class SynchronizeSite extends AbstractSite {
super(siteManager, "html/application/sync.html");
}
async onConstruct(args) {
let res = await super.onConstruct(args);
await this.loadLevels();
@@ -22,7 +21,6 @@ export class SynchronizeSite extends AbstractSite {
}
async loadLevels() {
const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0);
const db = WordRotatorDb.getInstance();
@@ -53,6 +51,9 @@ export class SynchronizeSite extends AbstractSite {
let levels = await Promise.all(levelPromises);
await db.saveManyLevels(levels);
localStorage.setItem("date-last-sync", newLastSync);
if (newLastSync != null && newLastSync !== "null")
{
localStorage.setItem("date-last-sync", newLastSync);
}
}
}

View File

@@ -4,7 +4,8 @@ import {DelayPromise} from "../../../../../../js/lib/pwa-assets";
export class ParentSegment extends Segment {
static initListener(){
window.addEventListener("mousedown", (e) => {
ParentSegment.mouseDownTarget = e.originalTarget;
ParentSegment.mouseDownTarget = e.target;
// ParentSegment.mouseDownTarget = e.originalTarget;
});
window.addEventListener("mouseup", (e) => {
ParentSegment.mouseDownTarget = null;
@@ -38,7 +39,9 @@ export class ParentSegment extends Segment {
}
};
this.mouseupListener = function(e){
if (ParentSegment.mouseDownTarget !== null && self.element.contains(ParentSegment.mouseDownTarget) && self.element.contains(e.originalTarget))
console.log("mouseup", e);
// if (ParentSegment.mouseDownTarget !== null && self.element.contains(ParentSegment.mouseDownTarget) && self.element.contains(e.originalTarget))
if (ParentSegment.mouseDownTarget !== null && self.element.contains(ParentSegment.mouseDownTarget) && self.element.contains(e.target))
{
self.rotate();
e.stopPropagation();
@@ -134,12 +137,19 @@ export class ParentSegment extends Segment {
}
_updateElement() {
let layer = this._getLayer();
if (layer >= 2)
{
this.element.classList.add("layer-"+layer);
}
const childContainer = this.element.querySelector(".child-container");
childContainer.removeAllChildren();
this._updateRotationClass();
const self = this;
// const self = this;
// this.element.onclick = function (e) {
// self.rotate();
// e.stopPropagation();
@@ -159,5 +169,13 @@ export class ParentSegment extends Segment {
}
}
}
_getLayer(){
if (this.children.length >= 1 && this.children[0] && this.children[0] instanceof ParentSegment)
{
return this.children[0]._getLayer()+1;
}
return 1;
}
}
ParentSegment.initListener();

View File

@@ -28,7 +28,7 @@ $animationDuration: 0.25s;
&.rotating {
z-index: 10 !important;
overflow: hidden;
vertical-align:top;
vertical-align: top;
@for $i from 1 through length($rotationDegrees) {
&.rotate-#{nth($rotationDegrees, $i)} {
@@ -98,7 +98,7 @@ $animationDuration: 0.25s;
white-space: nowrap;
transition: none;
max-width: 100%;
-webkit-tap-highlight-color: rgba(255,255,255,0);
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
//width: 100%;
* {
@@ -149,13 +149,16 @@ $animationDuration: 0.25s;
border: solid 1px #a9a9a9;
border-radius: 3px;
padding: 1px;
&.layer-2 {
border: solid 3px #000000;
}
}
&.segment-triangle {
> .child-container {
> .child-container {
> .segment-parent {
border: solid 3px #000000;
position: relative;
//border: solid 3px #000000;
//position: relative;
}
}
}