dodex-vertx
Version:
A java asynchronous server for Dodex and Dodex-mess
236 lines (213 loc) • 7.81 kB
JavaScript
import { DateTime } from "luxon";
export default {
scrollTop () {
$("html, body").animate({
scrollTop: 0
}, "slow");
},
convertToBoolean (value) {
if (!this.isNullOrEmpty(value)) {
return false;
}
if (typeof value === "string") {
switch (value.toLowerCase()) {
case "true":
case "yes":
case "1":
return true;
case "false":
case "no":
case "0":
return false;
}
}
return Boolean(value);
},
parseJson (json) {
return (JSON && JSON.parse(json)) || $.parseJSON(json);
},
isNullOrEmpty (value) {
return typeof value === "undefined" || value === null || value.length === 0;
},
getValueOrDefault (value, defaultValue) {
return !this.isNullOrEmpty(value) ? value : defaultValue;
},
endsWith (str, endswith) {
return str.endsWith(endswith);
},
getWeekKeys () {
const nthWeek = DateTime.local().toFormat("W");
const year = "T" + DateTime.local().toFormat("yyyy");
const weekKeys = [];
for (let i = 1; i <= nthWeek; i++) {
const week = (`0${i}`).slice(-2);
weekKeys.push(year + week);
}
return weekKeys;
},
getOptions (keys, values) {
if (!values || values.length !== keys.length) {
values = keys;
}
let options = "<option value=\"\"></option>";
for (let i = 0; i < keys.length; i++) {
options = `${options}<option value='${values[i]}'>${keys[i]}</option>`;
}
return options;
},
// Insert loaded html into main_container or specified element
renderer (controller, options) {
const helper = this;
return frag => {
if (options.react) {
return frag;
}
const selector = typeof options.selector !== "undefined" ? options.selector : "#main_container";
let el = $(selector);
el.empty();
const fade = helper.getValueOrDefault(options.fade, options.fade);
// If loading(long running load from backend) don't fade-in).
if (fade && !controller.loading) {
el.hide().html(frag).fadeIn(fade);
} else {
el.html(frag);
}
if (options.fnLoad) {
options.fnLoad(el);
}
helper.scrollTop();
};
},
isLoaded: function isLoaded (resolve, reject, dataHtml, Controller, counter, length) {
switch (Controller.name) {
case "start":
case "table":
dataHtml = Controller.getHtml();
break;
default:
}
if (dataHtml.length > length) {
resolve(dataHtml);
} else {
counter++;
if (counter > 20) {
reject("failed");
} else {
const time = Math.random() * 100 + 200;
setTimeout(() => {
isLoaded(resolve, reject, dataHtml, Controller, counter, length);
}, time);
}
}
return true;
}
/* develblock:start */
/* eslint comma-style: ["error", "first", { "exceptions": { "ArrayExpression": true, "ObjectExpression": true } }] */
,
// Custom promise for async call for a resource.
// If the DOM (#main_container) is populated then the promise is complete.
isResolved: function isResolved (resolve, reject, vm, selectorId, counter, length) {
const container = document.getElementById(`${selectorId}`);
if (!container) {
resolve("loaded");
return true;
}
if (container && container.children[0].children.length > length) {
resolve(`loaded - with counter/length: ${counter} - ${container.children.length}`);
} else {
counter++;
if (counter > 10) {
reject("failed");
} else {
const time = Math.random() * 100 + 500;
setTimeout(() => {
isResolved(resolve, reject, vm, selectorId, counter, length);
}, time);
}
}
return true;
},
getResource (vm, selector, startCount, childrenLength) {
return new Promise((resolve, reject) => {
this.isResolved(resolve, reject, vm, selector, startCount, childrenLength);
}).catch(rejected => {
fail(`The ${selector} Page did not load within limited time: ${rejected}`);
}).then(resolved => {
return resolved;
});
},
// Per Stack Overflow - Fire a click event in raw javascript
/* global extend:true */
fireEvent (...args) {
let eventType = null;
let i;
let j;
let k;
let l;
let event;
const einstellungen = {
"pointerX": 0,
"pointerY": 0,
"button": 0,
"ctrlKey": false,
"altKey": false,
"shiftKey": false,
"metaKey": false,
"bubbles": true,
"cancelable": true
};
const moeglicheEvents = [
["HTMLEvents", ["load", "unload", "abort", "error", "select", "change", "submit", "reset", "focus", "blur", "resize", "scroll"]],
["MouseEvents", ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove", "mouseout"]]
];
for (i = 0, j = moeglicheEvents.length; i < j; ++i) {
for (k = 0, l = moeglicheEvents[i][1].length; k < l; ++k) {
if (args[1] === moeglicheEvents[i][1][k]) {
eventType = moeglicheEvents[i][0];
i = j;
k = l;
}
}
}
if (args.length > 2) {
if ((typeof args[2]) === "object") {
this.change(einstellungen, args[2]);
}
}
if (eventType === null) {
throw new SyntaxError(`Event type ${args[1]} is not implemented!`);
}
if (document.createEvent) {
event = document.createEvent(eventType);
if (eventType === "HTMLEvents") {
event.initEvent(args[1], einstellungen.bubbles, einstellungen.cancalable);
} else {
event.initMouseEvent(args[1], einstellungen.bubbles, einstellungen.cancelable, document.defaultView,
einstellungen.button, einstellungen.pointerX, einstellungen.pointerY, einstellungen.pointerX, einstellungen.pointerY,
einstellungen.ctrlKey, einstellungen.altKey, einstellungen.shiftKey, einstellungen.metaKey, einstellungen.button, args[0]);
}
args[0].dispatchEvent(event);
} else {
einstellungen.clientX = einstellungen.pointerX;
einstellungen.clientY = einstellungen.pointerY;
event = document.createEventObject();
event = extend(event, einstellungen);
args[0].fireEvent(`on${args[1]}`, event);
}
},
change: function change () {
let name;
for (name in arguments[1]) {
if ((typeof arguments[1][name]) === "object") {
if ((typeof arguments[0][name]) === "undefined") {
arguments[0][name] = {};
}
change(arguments[0][name], arguments[1][name]);
} else {
arguments[0][name] = arguments[1][name];
}
}
return arguments[0];
}
/* develblock:end */
};