Move models to framework

This commit is contained in:
Dennis Eichhorn 2018-10-02 21:22:44 +02:00
parent 9e5f78c3ea
commit c15a1573a2
25 changed files with 700 additions and 0 deletions

View File

@ -0,0 +1,26 @@
/**
* Set message.
*
* @param {{title:string},{content:string},{level:int},{delay:int},{stay:int}} action Message data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const datalistAppend = function (action, callback)
{
"use strict";
const datalist = document.getElementById(action.id),
dataLength = action.data.length;
let option;
for (let i = 0; i < dataLength; i++) {
option = document.createElement('option');
option.value = action.data[i][action.text];
option.setAttribute('data-value', action.data[i][action.value]);
datalist.appendChild(option);
}
callback();
};

View File

@ -0,0 +1,20 @@
/**
* Set message.
*
* @param {{title:string},{content:string},{level:int},{delay:int},{stay:int}} action Message data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const datalistClear = function (action, callback)
{
"use strict";
const e = document.getElementById(action.id);
while (e.firstChild) {
e.removeChild(e.firstChild);
}
callback();
};

14
Model/Action/Dom/Focus.js Normal file
View File

@ -0,0 +1,14 @@
const focusAction = function (action, callback)
{
"use strict";
const focus = document.getElementById(action.id);
if (!focus) {
return;
}
focus.focus();
callback();
};

View File

@ -0,0 +1,33 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
* @param {string} id Action element
*
* @since 1.0.0
*/
const domGetValue = function (action, callback, id)
{
"use strict";
const e = action.base === 'self' ? (action.selector === '' || typeof action.selector === 'undefined' ? [document.getElementById(id)] : document.getElementById(id).querySelectorAll(action.selector)) : document.querySelectorAll(action.selector);
let value = [];
for (let i in e) {
/** global: HTMLElement */
if (!e.hasOwnProperty(i) || !(e[i] instanceof HTMLElement)) {
continue;
}
let eId = (typeof e[i].name !== 'undefined' && e[i].name !== '') ? e[i].name : e[i].id;
if (e[i].tagName === 'INPUT' || e[i].tagName === 'SELECTS' || e[i].tagName === 'BUTTON') {
value[eId] = e[i].value;
} else {
value[eId] = e[i].getAttribute('data-id');
}
}
callback(value);
};

15
Model/Action/Dom/Hide.js Normal file
View File

@ -0,0 +1,15 @@
const hideAction = function (action, callback)
{
"use strict";
const hide = document.getElementById(action.id);
if (!hide) {
return;
}
/** global: jsOMS */
jsOMS.addClass(hide, 'vh');
callback();
};

81
Model/Action/Dom/Popup.js Normal file
View File

@ -0,0 +1,81 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
* @param {id} element Action element
*
* @since 1.0.0
*/
const popupButtonAction = function (action, callback, id)
{
"use strict";
const popup = action.base === 'self' ? (action.selector === '' ? [document.getElementById(id)] : document.getElementById(id).querySelectorAll(action.selector)) : document.querySelectorAll(action.selector);
for(let i in popup) {
/** global: HTMLElement */
if(!popup.hasOwnProperty(i) || !popup[i] || !(popup[i] instanceof HTMLElement)) {
continue;
}
const clone = document.importNode(popup[i].content, true);
const dim = document.getElementById('dim');
if(dim) {
document.getElementById('dim').classList.remove('vh');
}
for(let j in clone) {
if(!clone.hasOwnProperty(j) || !(clone[j] instanceof HTMLElement)) {
continue;
}
clone[j].innerHTML = clone[j].innerHTML.replace(/\{\$id\}/g, action.id);
}
document.body.insertBefore(clone, document.body.firstChild);
let e = document.getElementById(popup[i].id.substr(0, popup[i].id.length - 4));
if(!e) {
continue;
}
window.omsApp.uiManager.getActionManager().bind(e.querySelectorAll('[data-action]'));
e.classList.add('animated');
if (typeof action.aniIn !== 'undefined') {
e.classList.add(action.aniIn);
}
if (action.stay > 0) {
setTimeout(function ()
{
let out = 0;
if (typeof action.aniOut !== 'undefined') {
e.classList.remove(action.aniIn);
e.classList.add(action.aniOut);
out = 200;
}
setTimeout(function ()
{
if (typeof action.aniOut !== 'undefined') {
e.classList.add(action.aniOut);
}
e.parentElement.removeChild(e);
const dim = document.getElementById('dim');
if (dim) {
document.getElementById('dim').classList.add('vh');
}
}, out);
}, action.stay);
}
}
callback();
};

View File

@ -0,0 +1,43 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
* @param {string} id Action element
*
* @since 1.0.0
*/
const removeButtonAction = function (action, callback, id)
{
"use strict";
const e = action.base === 'self' ? (action.selector === '' || typeof action.selector === 'undefined' ? [document.getElementById(id)] : document.getElementById(id).querySelectorAll(action.selector)) : document.querySelectorAll(action.selector);
const dim = document.getElementById('dim');
for (let i in e) {
/** global: HTMLElement */
if (!e.hasOwnProperty(i) || !e[i] || !(e[i] instanceof HTMLElement)) {
continue;
}
if (typeof action.aniOut !== 'undefined') {
e[i].classList.add(action.aniOut);
}
// todo: here is a problem with removing elements. after removing the first element in a list the second one cannot be deleted. maybe this is because the action event gets removed for sister elements after one is deleted?
setTimeout(function ()
{
if (e[i].parentElement === null) {
return;
}
e[i].parentElement.removeChild(e[i]);
if (dim) {
document.getElementById('dim').classList.add('vh');
}
}, 200);
}
callback();
};

View File

@ -0,0 +1,38 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
* @param {string} id Action element
*
* @since 1.0.0
*/
const domRemoveValue = function (action, callback, id)
{
"use strict";
const e = action.base === 'self' ? (action.selector === '' || typeof action.selector === 'undefined' ? [document.getElementById(id)] : document.getElementById(id).querySelectorAll(action.selector)) : document.querySelectorAll(action.selector);
for (let i in e) {
/** global: HTMLElement */
if (!e.hasOwnProperty(i) || !(e[i] instanceof HTMLElement)) {
continue;
}
if (e[i].value === action.data) {
e[i].value = '';
} else {
e[i].value = e[i].value.replace(', ' + action.data + ',', ',');
if (e[i].value.startsWith(action.data + ', ')) {
e[i].value = e[i].value.substring((action.data + ', ').length);
}
if (e[i].value.endsWith(', ' + action.data)) {
e[i].value = e[i].value.substring(0, e[i].value.length - (', ' + action.data).length);
}
}
}
callback();
};

View File

@ -0,0 +1,68 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
* @param {id} element Action element
*
* @since 1.0.0
*/
const domSetValue = function (action, callback, id)
{
"use strict";
let dataPath = action['value'],
path = '',
tempDataValue = '',
values = [],
replaceText = '',
start = 0,
end = 0;
while ((start = dataPath.indexOf('{', start)) !== -1) {
end = dataPath.indexOf('}', start);
start++;
path = dataPath.substring(start, end);
/** global: jsOMS */
tempDataValue = jsOMS.getArray(path, action.data, '/');
replaceText = '{' + path + '}';
dataPath = dataPath.replace(new RegExp(replaceText.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), tempDataValue);
}
const fill = action.base === 'self' ? (action.selector === '' ? [document.getElementById(id)] : document.getElementById(id).querySelectorAll(action.selector)) : document.querySelectorAll(action.selector);
for (let i in fill) {
/** global: HTMLElement */
if (!fill.hasOwnProperty(i) || !(fill[i] instanceof HTMLElement)) {
continue;
}
if (fill[i].tagName.toLowerCase() === 'div'
|| fill[i].tagName.toLowerCase() === 'span'
) {
if (!fill[i].innerHTML.includes(dataPath)) {
if (action.overwrite) {
fill[i].innerHTML = dataPath;
} else if (!action.overwrite) {
fill[i].innerHTML += dataPath;
}
}
} else {
if (fill[i].value !== dataPath
&& !fill[i].value.includes(', ' + dataPath + ',')
&& !fill[i].value.endsWith(', ' + dataPath)
&& !fill[i].value.startsWith(dataPath + ',')
) {
if (action.overwrite) {
fill[i].value = dataPath;
} else {
fill[i].value += (fill[i].value !== '' ? ', ' : '') + dataPath;
}
}
}
}
callback(action.data);
};

15
Model/Action/Dom/Show.js Normal file
View File

@ -0,0 +1,15 @@
const showAction = function (action, callback)
{
"use strict";
const show = document.getElementById(action.id);
if (!show) {
return;
}
/** global: jsOMS */
jsOMS.removeClass(show, 'vh');
callback();
};

View File

@ -0,0 +1,45 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const tableAppend = function (action, callback)
{
"use strict";
const table = document.getElementById(action.id),
tbody = table !== null && typeof table !== 'undefined' ? table.getElementsByTagName('tbody')[0] : null,
headers = table !== null && typeof table !== 'undefined' ? table.getElementsByTagName('thead')[0].getElementsByTagName('th') : null,
dataLength = action.data.length,
headerLength = headers !== null && typeof headers !== 'undefined' ? headers.length : 0;
let row, cell, text, rawText;
for (let i = 0; i < dataLength; i++) {
if (tbody === null) {
break;
}
row = tbody.insertRow(tbody.rows.length);
for (let j = 0; j < headerLength; j++) {
if (row === null) {
break;
}
cell = row.insertCell(j);
rawText = action.data[i][headers[j].getAttribute('data-name')];
if (typeof rawText === 'undefined') {
rawText = '';
}
cell.appendChild(document.createTextNode(rawText));
}
}
callback();
};

View File

@ -0,0 +1,20 @@
/**
* Set message.
*
* @param {{title:string},{content:string},{level:int},{delay:int},{stay:int}} action Message data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const tableClear = function (action, callback)
{
"use strict";
const e = document.getElementById(action.id).getElementsByTagName('tbody')[0];
while (e.firstChild) {
e.removeChild(e.firstChild);
}
callback();
};

View File

@ -0,0 +1,22 @@
/**
* Log.
*
* @param {Object} action Action data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const logAction = function (action, callback)
{
"use strict";
window.omsApp.notifyManager.send(
new jsOMS.Message.Notification.NotificationMessage(
action.data.status,
action.data.title,
action.data.message
), jsOMS.Message.Notification.NotificationType.APP_NOTIFICATION
);
callback();
};

View File

@ -0,0 +1,26 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const requestAction = function (action, callback)
{
"use strict";
/** global: jsOMS */
const request = new jsOMS.Message.Request.Request(action.uri, action.method, action.request_type);
request.setSuccess(function(xhr) {
console.log(xhr.responseText);
callback(JSON.parse(xhr.responseText));
});
if (typeof action.data !== 'undefined') {
request.setData(action.data);
}
request.send();
};

View File

@ -0,0 +1,33 @@
/**
* Collect data.
*
* @param {Object} action Action data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const dataCollectionAction = function (action, callback)
{
"use strict";
let elements, data = {};
for (let selector in action.collect) {
if (!action.collect.hasOwnProperty(selector)) {
continue;
}
elements = document.querySelectorAll(action.collect[selector]);
for (let e in elements) {
if(!elements.hasOwnProperty(e)) {
continue;
}
// todo: different types of elements have differnt forms of storing values (input, textarea etc.)
data[selector].push(e.value);
}
}
callback(data);
};

View File

@ -0,0 +1,23 @@
/**
* Set message.
*
* @param {Object} action Action data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const timerActionDelay = {};
const timerAction = function (action, callback)
{
"use strict";
if (timerActionDelay[action.id]) {
clearTimeout(timerActionDelay[action.id]);
delete timerActionDelay[action.id]
}
timerActionDelay[action.id] = setTimeout(function() {
delete timerActionDelay[action.id];
callback();
}, action.delay);
};

View File

@ -0,0 +1,22 @@
/**
* Validate Keypress.
*
* @param {Object} action Action data
* @param {function} callback Callback
*
* @since 1.0.0
*/
const validateKeypress = function (action, callback)
{
"use strict";
const invertValidate = action.pressed.startsWith('!'),
keyPressCheck = invertValidate ? action.pressed.split('!') : action.pressed.split('|');
if (typeof action.data.keyCode !== 'undefined'
&& ((!invertValidate && keyPressCheck.indexOf(action.data.keyCode.toString()) !== -1)
|| (invertValidate && keyPressCheck.indexOf(action.data.keyCode.toString()) === -1))
) {
callback();
}
};

0
Model/Message/Dom.js Normal file
View File

View File

@ -0,0 +1,27 @@
/**
* Perform DOM action.
*
* @param {{delay:int},{type:int}} data DOM action data
*
* @since 1.0.0
*/
const domAction = function (data)
{
/** global: jsOMS */
setTimeout(function ()
{
switch (data.type) {
case jsOMS.EnumDomActionType.SHOW:
break;
case jsOMS.EnumDomActionType.HIDE:
break;
}
}, parseInt(data.delay));
};
/**
* Show/Hide
* identifier: #element or .elements or query
* anim: someclass
* delay: 0
*/

View File

@ -0,0 +1,15 @@
(function (jsOMS) {
"use strict";
jsOMS.EnumDomActionType = Object.freeze({
CREATE_BEFORE: 0,
CREATE_AFTER: 1,
DELETE: 2,
REPLACE: 3,
MODIFY: 4,
SHOW: 5,
HIDE: 6,
ACTIVATE: 7,
DEACTIVATE: 8
});
} (window.jsOMS = window.jsOMS || {}));

View File

@ -0,0 +1,39 @@
/**
* Set message.
*
* @param {{delay:int},{errors:string},{form:string}} data Message data
*
* @since 1.0.0
*/
const formValidationMessage = function (data) {
const form = document.getElementById(data.form);
if(!form) {
return;
}
const eEles = document.getElementsByClassName('i-' + data.form);
while (eEles.length > 0) {
eEles[0].parentNode.removeChild(eEles[0]);
}
/**
* @param {{msg:string}} error Error data
*/
data.errors.forEach(function (error) {
const eEle = document.getElementById(error.id);
if (!eEle) {
return;
}
const msgEle = document.createElement('i'),
msg = document.createTextNode(error.msg);
msgEle.id = 'i-' + error.id;
msgEle.class = 'i-' + data.form;
msgEle.appendChild(msg);
eEle.parentNode.insertBefore(msgEle, eEle.nextSibling);
});
};

37
Model/Message/Notify.js Normal file
View File

@ -0,0 +1,37 @@
/**
* Set message.
*
* @param {{title:string},{content:string},{level:int},{delay:int},{stay:int}} data Message data
*
* @since 1.0.0
*/
const notifyMessage = function (data)
{
setTimeout(function ()
{
const notify = document.createElement('div'),
h = document.createElement('h1'),
inner = document.createElement('div'),
title = document.createTextNode(data.title),
content = document.createTextNode(data.msg);
notify.id = 'notify';
notify.class = data.level;
h.appendChild(title);
inner.appendChild(content);
notify.appendChild(h);
notify.appendChild(inner);
document.body.appendChild(notify);
if (data.stay <= 0) {
data.stay = 5000;
}
if (data.stay > 0) {
setTimeout(function ()
{
notify.parentElement.removeChild(notify);
}, data.stay);
}
}, parseInt(data.delay));
};

View File

@ -0,0 +1,11 @@
(function (jsOMS) {
"use strict";
jsOMS.EnumNotifyType = Object.freeze({
BINARY: 0,
INFO: 1,
WARNING: 2,
ERROR: 3,
FATAL: 4
});
}(window.jsOMS = window.jsOMS || {}));

15
Model/Message/Redirect.js Normal file
View File

@ -0,0 +1,15 @@
/**
* Set message.
*
* @param {{delay:int},{url:string}} data Message data
*
* @since 1.0.0
*/
const redirectMessage = function (data)
{
setTimeout(function ()
{
/** global: jsOMS */
window.location = jsOMS.Uri.UriFactory.build(data.uri);
}, parseInt(data.delay));
};

12
Model/Message/Reload.js Normal file
View File

@ -0,0 +1,12 @@
/**
* Set message.
*
* @param {{delay:int}} data Message data
*
* @since 1.0.0
*/
const reloadMessage = function (data) {
setTimeout(function () {
document.location.reload(true);
}, parseInt(data.delay));
};