Compare commits

...

5 Commits

Author SHA1 Message Date
Clemens Schwaighofer
f316dde8b7 CoreLibs Fix mandator check & sub group checks for unique input 2019-10-09 10:55:54 +09:00
Clemens Schwaighofer
13b18c3a62 Add ajax page flag to basic class and updated login class to reflect this 2019-10-08 18:34:29 +09:00
Clemens Schwaighofer
18bf829c6b Fix JS comments 2019-10-04 18:56:23 +09:00
Clemens Schwaighofer
723b6345bb Info text about target base library for edit.js 2019-10-04 11:38:41 +09:00
Clemens Schwaighofer
e235721c8b Update JQUERY to jdocs3 comment style 2019-10-04 11:33:54 +09:00
5 changed files with 568 additions and 407 deletions

View File

@@ -1,4 +1,5 @@
/* general edit javascript */ /* general edit javascript */
/* jquery version */
/* jshint esversion: 6 */ /* jshint esversion: 6 */
@@ -11,19 +12,21 @@ if (!DEBUG) {
}); });
}*/ }*/
// METHOD: pop /**
// PARAMS: url, window name, features * opens a popup window with winName and given features (string)
// RETURN: none * @param {String} theURL the url
// DESC : opens a popup window with winNAme and given features (string) * @param {String} winName window name
* @param {Object} features popup features
*/
function pop(theURL, winName, features) { function pop(theURL, winName, features) {
winName = window.open(theURL, winName, features); winName = window.open(theURL, winName, features);
winName.focus(); winName.focus();
} }
// METHOD: expandTA /**
// PARAMS: id * automatically resize a text area based on the amount of lines in it
// RETURN: none * @param {[string} ta_id element id
// DESC : automatically resize a text area based on the amount of lines in it */
function expandTA(ta_id) { function expandTA(ta_id) {
var ta; var ta;
// if a string comes, its a get by id, else use it as an element pass on // if a string comes, its a get by id, else use it as an element pass on
@@ -44,10 +47,10 @@ function expandTA(ta_id) {
ta.rows = numNewRows + theRows.length; ta.rows = numNewRows + theRows.length;
} }
// METHOD: getWindowSize /**
// PARAMS: none * wrapper to get the real window size for the current browser window
// RETURN: array with width/height * @return {Object} object with width/height
// DESC : wrapper to get the real window size for the current browser window */
function getWindowSize() function getWindowSize()
{ {
var width, height; var width, height;
@@ -59,10 +62,10 @@ function getWindowSize()
}; };
} }
// METHOD: getScrollOffset /**
// PARAMS: none * wrapper to get the correct scroll offset
// RETURN: array with x/y px * @return {Object} object with x/y px
// DESC : wrapper to get the correct scroll offset */
function getScrollOffset() function getScrollOffset()
{ {
var left, top; var left, top;
@@ -74,10 +77,12 @@ function getScrollOffset()
}; };
} }
// METHOD: setCenter /**
// PARAMS: id to set center * centers div to current window size middle
// RETURN: none * @param {String} id element to center
// DESC : centers div to current window size middle * @param {Boolean} left if true centers to the middle from the left
* @param {Boolean} top if true centers to the middle from the top
*/
function setCenter(id, left, top) function setCenter(id, left, top)
{ {
// get size of id // get size of id
@@ -107,10 +112,11 @@ function setCenter(id, left, top)
} }
} }
// METHOD: goToPos() /**
// PARAMS: element, offset (default 0) * goes to an element id position
// RETURN: none * @param {String} element element id to move to
// DESC: goes to an element id position * @param {Number} [offset=0] offset from top, default is 0 (px)
*/
function goToPos(element, offset = 0) function goToPos(element, offset = 0)
{ {
try { try {
@@ -125,10 +131,12 @@ function goToPos(element, offset = 0)
} }
} }
// METHOD: __ /**
// PARAMS: text * uses the i18n object created in the translation template
// RETURN: translated text (based on PHP selected language) * that is filled from gettext in PHP
// DESC : uses the i18n array created in the translation template, that is filled from gettext in PHP (Smarty) * @param {String} string text to translate
* @return {String} translated text (based on PHP selected language)
*/
function __(string) function __(string)
{ {
if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) { if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) {
@@ -138,12 +146,13 @@ function __(string)
} }
} }
// METHOD: string.format /**
// PARAMS: any, for string format * simple sprintf formater for replace
// RETURN: formatted string * usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
// DESC : simple sprintf formater for replace * First, checks if it isn't implemented yet.
// "{0} is cool, {1} is not".format("Alpha", "Beta"); * @param {String} !String.prototype.format string with elements to be replaced
// First, checks if it isn't implemented yet. * @return {String} Formated string
*/
if (!String.prototype.format) { if (!String.prototype.format) {
String.prototype.format = function() String.prototype.format = function()
{ {
@@ -158,25 +167,32 @@ if (!String.prototype.format) {
}; };
} }
// METHOD: numberWithCommas /**
// PARAMS: number * formats flat number 123456 to 123,456
// RETURN: formatted with , in thousands * @param {Number} x number to be formated
// DESC : formats flat number 123456 to 123,456 * @return {String} formatted with , in thousands
*/
const numberWithCommas = (x) => { const numberWithCommas = (x) => {
var parts = x.toString().split("."); var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join("."); return parts.join(".");
}; };
// METHOD: /**
// PARAMS: string * converts line breaks to br
// RETURN: string with <br> * @param {String} string any string
// DESC : converts line breaks to br * @return {String} string with <br>
*/
function convertLBtoBR(string) function convertLBtoBR(string)
{ {
return string.replace(/(?:\r\n|\r|\n)/g, '<br>'); return string.replace(/(?:\r\n|\r|\n)/g, '<br>');
} }
/**
* escape HTML string
* @param {String} !String.prototype.escapeHTML HTML data string to be escaped
* @return {String} escaped string
*/
if (!String.prototype.escapeHTML) { if (!String.prototype.escapeHTML) {
String.prototype.escapeHTML = function() { String.prototype.escapeHTML = function() {
return this.replace(/[&<>"'\/]/g, function (s) { return this.replace(/[&<>"'\/]/g, function (s) {
@@ -194,6 +210,11 @@ if (!String.prototype.escapeHTML) {
}; };
} }
/**
* unescape a HTML encoded string
* @param {String} !String.prototype.unescapeHTML data with escaped entries
* @return {String} HTML formated string
*/
if (!String.prototype.unescapeHTML) { if (!String.prototype.unescapeHTML) {
String.prototype.unescapeHTML = function() { String.prototype.unescapeHTML = function() {
return this.replace(/&[#\w]+;/g, function (s) { return this.replace(/&[#\w]+;/g, function (s) {
@@ -211,31 +232,33 @@ if (!String.prototype.unescapeHTML) {
}; };
} }
// METHOD: getTimestamp /**
// PARAMS: none * returns current timestamp (unix timestamp)
// RETURN: timestamp (in milliseconds) * @return {Number} timestamp (in milliseconds)
// DESC : returns current timestamp (unix timestamp) */
function getTimestamp() function getTimestamp()
{ {
var date = new Date(); var date = new Date();
return date.getTime(); return date.getTime();
} }
// METHOD: dec2hex /**
// PARAMS: decimal string * dec2hex :: Integer -> String
// RETURN: string * i.e. 0-255 -> '00'-'ff'
// DESC : dec2hex :: Integer -> String * @param {Number} dec decimal string
// i.e. 0-255 -> '00'-'ff' * @return {String} hex encdoded number
*/
function dec2hex(dec) function dec2hex(dec)
{ {
return ('0' + dec.toString(16)).substr(-2); return ('0' + dec.toString(16)).substr(-2);
} }
// METHOD: generateId /**
// PARAMS: lenght in int * generateId :: Integer -> String
// RETURN: random string * only works on mondern browsers
// DESC : generateId :: Integer -> String * @param {Number} len length of unique id string
// only works on mondern browsers * @return {String} random string in length of len
*/
function generateId(len) function generateId(len)
{ {
var arr = new Uint8Array((len || 40) / 2); var arr = new Uint8Array((len || 40) / 2);
@@ -243,20 +266,22 @@ function generateId(len)
return Array.from(arr, dec2hex).join(''); return Array.from(arr, dec2hex).join('');
} }
// METHOD: randomIdF() /**
// PARAMS: none * creates a pseudo random string of 10 characters
// RETURN: not true random string * works on all browsers
// DESC : creates a pseudo random string of 10 characters * after many runs it will create duplicates
// after many runs it will create duplicates * @return {String} not true random string
*/
function randomIdF() function randomIdF()
{ {
return Math.random().toString(36).substring(2); return Math.random().toString(36).substring(2);
} }
// METHOD: isObject /**
// PARAMS: possible object * checks if a variable is an object
// RETURN: true/false if it is an object or not * @param {Mixed} val possible object
// DESC : checks if a variable is an object * @return {Boolean} true/false if it is an object or not
*/
function isObject(val) { function isObject(val) {
if (val === null) { if (val === null) {
return false; return false;
@@ -264,47 +289,55 @@ function isObject(val) {
return ((typeof val === 'function') || (typeof val === 'object')); return ((typeof val === 'function') || (typeof val === 'object'));
} }
// METHOD: keyInObject /**
// PARAMS: key name, object * checks if a key exists in a given object
// RETURN: true/false if key exists in object * @param {String} key key name
// DESC : checks if a key exists in a given object * @param {Object} object object to search key in
* @return {Boolean} true/false if key exists in object
*/
const keyInObject = (key, object) => (key in object) ? true : false; const keyInObject = (key, object) => (key in object) ? true : false;
/*function keyInObject(key, object) /*function keyInObject(key, object)
{ {
return (key in object) ? true : false; return (key in object) ? true : false;
}*/ }*/
// METHOD: getKeyByValue /**
// PARAMS: object, value * returns matching key of value
// RETURN: key found * @param {Object} obj object to search value in
// DESC : returns matching key of value * @param {Mixed} value any value (String, Number, etc)
* @return {String} the key found for the first matching value
*/
const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value); const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value);
// function getKeyByValue(object, value) // function getKeyByValue(object, value)
// { // {
// return Object.keys(object).find(key => object[key] === value); // return Object.keys(object).find(key => object[key] === value);
// } // }
// METHOD: valueInObject /**
// PARAMS: obj, value * returns true if value is found in object with a key
// RETURN: true/false * @param {Object} obj object to search value in
// DESC : returns true if value is found in object with a key * @param {Mixed} value any value (String, Number, etc)
* @return {Boolean} true on value found, false on not found
*/
const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false; const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false;
// METHOD: exists /**
// PARAMS: uid * checks if a DOM element actually exists
// RETURN: true/false * @param {String} id Element id to check for
// DESC : checks if a DOM element actually exists * @return {Boolean} true if element exists, false on failure
*/
const exists = (id) => $('#' + id).length > 0 ? true : false; const exists = (id) => $('#' + id).length > 0 ? true : false;
/*function exists(id) /*function exists(id)
{ {
return $('#' + id).length > 0 ? true : false; return $('#' + id).length > 0 ? true : false;
}*/ }*/
// METHOD: formatBytes /**
// PARAMS: bytes in int * converts a int number into bytes with prefix in two decimals precision
// RETURN: string in GB/MB/KB * currently precision is fixed, if dynamic needs check for max/min precision
// DESC : converts a int number into bytes with prefix in two decimals precision * @param {Number} bytes bytes in int
// currently precision is fixed, if dynamic needs check for max/min precision * @return {String} string in GB/MB/KB
*/
function formatBytes(bytes) function formatBytes(bytes)
{ {
var i = -1; var i = -1;
@@ -316,10 +349,10 @@ function formatBytes(bytes)
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
} }
// METHOD: errorCatch /**
// PARAMS: err (error from try/catch * prints out error messages based on data available from the browser
// RETURN: none * @param {Object} err error from try/catch block
// DESC : prints out error messages based on data available from the browser */
function errorCatch(err) function errorCatch(err)
{ {
// for FF & Chrome // for FF & Chrome
@@ -345,10 +378,10 @@ function errorCatch(err)
} }
} }
// METHOD: actionIndicator /**
// PARAMS: none * show or hide the "do" overlay
// RETURN: none * @param {String} [loc=''] location name for action indicator, default empty. for console.log
// DESC : show or hide the "do" overlay */
function actionIndicator(loc = '') function actionIndicator(loc = '')
{ {
if ($('#overlayBox').is(':visible')) { if ($('#overlayBox').is(':visible')) {
@@ -358,12 +391,11 @@ function actionIndicator(loc = '')
} }
} }
// METHOD: actionIndicatorShow/actionIndicatorHide /**
// PARAMS: loc for console log info * explicit show for action Indicator
// RETURN: none * instead of automatically show or hide, do on command show
// DESC : explicit show/hide for action Indicator * @param {String} [loc=''] optional location name, empty if not set. for console.log
// instead of automatically show or hide, do */
// on command
function actionIndicatorShow(loc = '') function actionIndicatorShow(loc = '')
{ {
console.log('Indicator: SHOW [%s]', loc); console.log('Indicator: SHOW [%s]', loc);
@@ -372,6 +404,12 @@ function actionIndicatorShow(loc = '')
$('#indicator').show(); $('#indicator').show();
overlayBoxShow(); overlayBoxShow();
} }
/**
* explicit hide for action Indicator
* instead of automatically show or hide, do on command hide
* @param {String} [loc=''] optional location name, empty if not set. for console.log
*/
function actionIndicatorHide(loc = '') function actionIndicatorHide(loc = '')
{ {
console.log('Indicator: HIDE [%s]', loc); console.log('Indicator: HIDE [%s]', loc);
@@ -380,10 +418,9 @@ function actionIndicatorHide(loc = '')
overlayBoxHide(); overlayBoxHide();
} }
// METHOD: overlayBoxView /**
// PARAMS: none * shows the overlay box
// RETURN: none */
// DESC : shows or hides the overlay box
function overlayBoxShow() function overlayBoxShow()
{ {
// check if overlay box exists and if yes set the z-index to 100 // check if overlay box exists and if yes set the z-index to 100
@@ -393,6 +430,10 @@ function overlayBoxShow()
$('#overlayBox').show(); $('#overlayBox').show();
} }
} }
/**
* hides the overlay box
*/
function overlayBoxHide() function overlayBoxHide()
{ {
// if the overlay box z-index is 100, do no hide, but set to 98 // if the overlay box z-index is 100, do no hide, but set to 98
@@ -403,10 +444,9 @@ function overlayBoxHide()
} }
} }
// METHOD: setOverlayBox /**
// PARAMS: none * position the overlay block box and shows it
// RETURN: none */
// DESC : position the overlay block box and shows it
function setOverlayBox() function setOverlayBox()
{ {
var viewport = document.viewport.getDimensions(); var viewport = document.viewport.getDimensions();
@@ -417,10 +457,9 @@ function setOverlayBox()
$('#overlayBox').show(); $('#overlayBox').show();
} }
// METHOD: ClearCall /**
// PARAMS: none * the abort call, clears the action box and hides it and the overlay box
// RETURN: none */
// DESC : the abort call, clears the action box and hides it and the overlay box
function ClearCall() function ClearCall()
{ {
$('#actionBox').innerHTML = ''; $('#actionBox').innerHTML = '';
@@ -429,14 +468,15 @@ function ClearCall()
} }
// *** DOM MANAGEMENT FUNCTIONS // *** DOM MANAGEMENT FUNCTIONS
// METHOD: cel [create element] /**
// PARAMS: tag: must set tag (div, span, etc) * reates object for DOM element creation flow
// id: optional set for id, if input, select will be used for name * @param {String} tag must set tag (div, span, etc)
// content: text content inside, is skipped if sub elements exist * @param {String} [id=''] optional set for id, if input, select will be used for name
// css: array for css tags * @param {String} [content=''] text content inside, is skipped if sub elements exist
// options: anything else (value, placeholder, OnClick, style) * @param {Array} [css=[]] array for css tags
// RETURN: object * @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
// DESC : creates object for DOM element creation flow * @return {Object} created element as an object
*/
const cel = (tag, id = '', content = '', css = [], options = {}) => const cel = (tag, id = '', content = '', css = [], options = {}) =>
_element = { _element = {
tag: tag, tag: tag,
@@ -448,12 +488,13 @@ const cel = (tag, id = '', content = '', css = [], options = {}) =>
sub: [] sub: []
}; };
// METHOD: ael [attach element] /**
// PARAMS: base: object where to attach/search * attach a cel created object to another to create a basic DOM tree
// attach: the object to be attached * @param {Object} base object where to attach/search
// id: optional id, if given search in base for this id and attach there * @param {Object} attach the object to be attached
// RETURN: "none", technically there is no return needed * @param {String} [id=''] optional id, if given search in base for this id and attach there
// DESC : attach a cel created object to another to create a basic DOM tree * @return {Object} "none", technically there is no return needed as it is global attach
*/
function ael(base, attach, id = '') function ael(base, attach, id = '')
{ {
if (id) { if (id) {
@@ -475,12 +516,13 @@ function ael(base, attach, id = '')
return base; return base;
} }
// METHOD: aelx [attach n elements] /**
// PARAMS: base: object to where we attach the elements * directly attach n elements to one master base element
// attach 1..n: attach directly to the base element those attachments * this type does not support attach with optional id
// RETURN: "none", technically there is no return needed * @param {Object} base object to where we attach the elements
// DESC : directly attach n elements to one master base element * @param {...Object} attach attach 1..n: attach directly to the base element those attachments
// this type does not support attach with optional id * @return {Object} "none", technically there is no return needed, global attach
*/
function aelx(base, ...attach) function aelx(base, ...attach)
{ {
for (var i = 0; i < attach.length; i ++) { for (var i = 0; i < attach.length; i ++) {
@@ -489,19 +531,22 @@ function aelx(base, ...attach)
return base; return base;
} }
// METHOD: rel [reset element] /**
// PARAMS: cel created element * resets the sub elements of the base element given
// RETURN: returns sub reset base element * @param {Object} base cel created element
// DESC : resets the sub elements of the base element given * @return {Object} returns reset base element
*/
const rel = (base) => { const rel = (base) => {
base.sub = []; base.sub = [];
return base; return base;
}; };
// METHOD: rcssel [remove a css from the element] /**
// PARAMS: element, style sheet to remove * searches and removes style from css array
// RETURN: "none", in place because of reference * @param {Object} _element element to work one
// DESC : searches and removes style from css array * @param {String css style sheet to remove (name)
* @return {Object} returns full element
*/
function rcssel(_element, css) function rcssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -511,10 +556,12 @@ function rcssel(_element, css)
return _element; return _element;
} }
// METHOD: acssel [add css element] /**
// PARAMS: element, style sheet to add * adds a new style sheet to the element given
// RETURN: "none", in place add because of reference * @param {Object} _element element to work on
// DESC : adds a new style sheet to the element given * @param {String} css style sheet to add (name)
* @return {Object} returns full element
*/
function acssel(_element, css) function acssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -524,23 +571,26 @@ function acssel(_element, css)
return _element; return _element;
} }
// METHOD: scssel /**
// PARAMS: element, style to remove, style to add * removes one css and adds another
// RETURN: "none", in place add because of reference * is a wrapper around rcssel/acssel
// DESC : removes one css and adds another * @param {Object} _element element to work on
// is a wrapper around rcssel/acssel * @param {String} rcss style to remove (name)
* @param {String} acss style to add (name)
* @return {Object} returns full element
*/
function scssel(_element, rcss, acss) function scssel(_element, rcss, acss)
{ {
rcssel(_element, rcss); rcssel(_element, rcss);
acssel(_element, acss); acssel(_element, acss);
} }
// METHOD: phfo [produce html from object] /**
// PARAMS: object tree with dom element declarations * parses the object tree created with cel/ael and converts it into an HTML string
// RETURN: HTML string that can be used as innerHTML * that can be inserted into the page
// DESC : parses the object tree created with cel/ael * @param {Object} tree object tree with dom element declarations
// and converts it into an HTML string that can * @return {String} HTML string that can be used as innerHTML
// be inserted into the page */
function phfo(tree) function phfo(tree)
{ {
// holds the elements // holds the elements
@@ -603,33 +653,44 @@ function phfo(tree)
// BLOCK: html wrappers for quickly creating html data blocks // BLOCK: html wrappers for quickly creating html data blocks
// NOTE : OLD FORMAT which misses multiple block set /**
// METHOD: html_options * NOTE: OLD FORMAT which misses multiple block set
// PARAMS: name/id, array for the options, selected item uid * creates an select/options drop down block.
// options_only [def false] if this is true, it will not print the select part * the array needs to be key -> value format.
// return_string [def false]: return as string and not as element * key is for the option id and value is for the data output
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: html with build options block * @param {Object} data array for the options
// DESC : creates an select/options drop down block. * @param {String} [selected=''] selected item uid
// the array needs to be key -> value format. key is for the option id and value is for the data output * @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @param {Boolean} [return_string=false] return as string and not as element
* @param {String} [sort=''] if empty as is, else allowed 'keys',
* 'values' all others are ignored
* @return {String} html with build options block
*/
function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '') function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '')
{ {
// wrapper to new call // wrapper to new call
return html_options_block(name, data, selected, false, options_only, return_string, sort); return html_options_block(name, data, selected, false, options_only, return_string, sort);
} }
// NOTE : USE THIS CALL, the above one is deprecated /**
// METHOD: html_options * NOTE: USE THIS CALL, the above one is deprecated
// PARAMS: name/id, array for the options, * creates an select/options drop down block.
// selected item uid [drop down string, multi select array] * the array needs to be key -> value format.
// multiple [def 0] if this is 1 or larger, the drop down will be turned into multiple select * key is for the option id and value is for the data output
// the number sets the size value unless it is 1, then it is default * @param {String} name name/id
// options_only [def false] if this is true, it will not print the select part * @param {Object} data array for the options
// return_string [def false]: return as string and not as element * @param {String} [selected=''] selected item uid
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {Number} [multiple=0] if this is 1 or larger, the drop down
// RETURN: html with build options block * will be turned into multiple select
// DESC : creates an select/options drop down block. * the number sets the size value unless it is 1,
// the array needs to be key -> value format. key is for the option id and value is for the data output * then it is default
* @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @param {Boolean} [return_string=false] return as string and not as element
* @param {String} [sort=''] if empty as is, else allowed 'keys',
* 'values' all others are ignored
* @return {String} html with build options block
*/
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '') function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '')
{ {
var content = []; var content = [];
@@ -700,11 +761,13 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
} }
} }
// METHOD: html_options_refill /**
// PARAMS: name/id, array of options, sort = '' * refills a select box with options and keeps the selected
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: none * @param {Object} data array of options
// DESC : refills a select box with options and keeps the selected * @param {String} [sort=''] if empty as is, else allowed 'keys', 'values'
* all others are ignored
*/
function html_options_refill(name, data, sort = '') function html_options_refill(name, data, sort = '')
{ {
var element_option; var element_option;
@@ -739,10 +802,9 @@ function html_options_refill(name, data, sort = '')
} }
// *** MASTER logout call // *** MASTER logout call
// METHOD: loginLogout /**
// PARAMS: none * submits basic data for form logout
// RETURN: none */
// DESC : submits basic data for form logout
function loginLogout() function loginLogout()
{ {
const form = document.createElement('form'); const form = document.createElement('form');

View File

@@ -1,4 +1,5 @@
/* general edit javascript */ /* general edit javascript */
/* prototype version */
/* jshint esversion: 6 */ /* jshint esversion: 6 */
@@ -11,19 +12,21 @@ if (!DEBUG) {
}); });
}*/ }*/
// METHOD: pop /**
// PARAMS: url, window name, features * opens a popup window with winName and given features (string)
// RETURN: none * @param {String} theURL the url
// DESC : opens a popup window with winName and given features (string) * @param {String} winName window name
* @param {Object} features popup features
*/
function pop(theURL, winName, features) { function pop(theURL, winName, features) {
winName = window.open(theURL, winName, features); winName = window.open(theURL, winName, features);
winName.focus(); winName.focus();
} }
// METHOD: expandTA /**
// PARAMS: id * automatically resize a text area based on the amount of lines in it
// RETURN: none * @param {[string} ta_id element id
// DESC : automatically resize a text area based on the amount of lines in it */
function expandTA(ta_id) { function expandTA(ta_id) {
var ta; var ta;
// if a string comes, its a get by id, else use it as an element pass on // if a string comes, its a get by id, else use it as an element pass on
@@ -44,12 +47,12 @@ function expandTA(ta_id) {
ta.rows = numNewRows + theRows.length; ta.rows = numNewRows + theRows.length;
} }
// METHOD: ShowHideMenu /**
// PARAMS: status -> show or hide * shows or hides the menu
// id -> id to work on * this is used in some old menu templates
// RETURN: none * @param {String} status show or hide
// DESC: shows or hides the menu * @param {String} id element id to work on
// this is used in some old menu templates */
function ShowHideMenu(status, id) function ShowHideMenu(status, id)
{ {
if (status == 'show') { if (status == 'show') {
@@ -65,8 +68,12 @@ function ShowHideMenu(status, id)
} }
} }
// used in old templates /**
// move element action * used in old templates
* move element action
* @param {String} id element id to move
* @param {String} direction move direction
*/
function mv(id, direction) function mv(id, direction)
{ {
document.forms[form_name].action.value = 'move'; document.forms[form_name].action.value = 'move';
@@ -75,7 +82,11 @@ function mv(id, direction)
document.forms[form_name].submit(); document.forms[form_name].submit();
} }
// load element action /**
* used in old templates
* load element action
* @param {String} id the element id to load
*/
function le(id) function le(id)
{ {
document.forms[form_name].action.value = 'load'; document.forms[form_name].action.value = 'load';
@@ -91,13 +102,14 @@ function le(id)
} }
} }
// METHOD: sh /**
// PARAMS: id -> element to hide * hides an element, additional writes 1 (show) or 0 (hide) into <id>Flag field
// showText -> text for the element if shown * this needs scriptacolous installed for BlindUp/BlindDown
// hideText -> text for the element if hidden * @param {String} id element id to hide
// RETURN: returns true if hidden, or false if not * @param {String} showText text for the element if shown
// DESC : hides an element, additional writes 1 (show) or 0 (hide) into <id>Flag field * @param {String} hideText text for the element if hidden
// this needs scriptacolous installed for BlindUp/BlindDown * @return {Boolean} returns true if hidden, or false if not
*/
function sh(id, showText, hideText) function sh(id, showText, hideText)
{ {
flag = id + 'Flag'; flag = id + 'Flag';
@@ -120,10 +132,10 @@ function sh(id, showText, hideText)
return divStatus; return divStatus;
} }
// METHOD: getWindowSize /**
// PARAMS: none * wrapper to get the real window size for the current browser window
// RETURN: array with width/height * @return {Object} object with width/height
// DESC : wrapper to get the real window size for the current browser window */
function getWindowSize() function getWindowSize()
{ {
var width, height; var width, height;
@@ -135,10 +147,10 @@ function getWindowSize()
}; };
} }
// METHOD: getScrollOffset /**
// PARAMS: none * wrapper to get the correct scroll offset
// RETURN: array with x/y px * @return {Object} object with x/y px
// DESC : wrapper to get the correct scroll offset */
function getScrollOffset() function getScrollOffset()
{ {
var left, top; var left, top;
@@ -150,10 +162,12 @@ function getScrollOffset()
}; };
} }
// METHOD: setCenter /**
// PARAMS: id to set center * centers div to current window size middle
// RETURN: none * @param {String} id element to center
// DESC : centers div to current window size middle * @param {Boolean} left if true centers to the middle from the left
* @param {Boolean} top if true centers to the middle from the top
*/
function setCenter(id, left, top) function setCenter(id, left, top)
{ {
// get size of id // get size of id
@@ -179,10 +193,11 @@ function setCenter(id, left, top)
} }
} }
// METHOD: goToPos() /**
// PARAMS: element, offset (default 0) * goes to an element id position
// RETURN: none * @param {String} element element id to move to
// DESC: goes to an element id position * @param {Number} [offset=0] offset from top, default is 0 (px)
*/
function goToPos(element, offset = 0) function goToPos(element, offset = 0)
{ {
try { try {
@@ -203,10 +218,12 @@ function goToPos(element, offset = 0)
} }
} }
// METHOD: __ /**
// PARAMS: text * uses the i18n object created in the translation template
// RETURN: translated text (based on PHP selected language) * that is filled from gettext in PHP
// DESC : uses the i18n array created in the translation template, that is filled from gettext in PHP (Smarty) * @param {String} string text to translate
* @return {String} translated text (based on PHP selected language)
*/
function __(string) function __(string)
{ {
if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) { if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) {
@@ -216,12 +233,13 @@ function __(string)
} }
} }
// METHOD: string.format /**
// PARAMS: any, for string format * simple sprintf formater for replace
// RETURN: formatted string * usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
// DESC : simple sprintf formater for replace * First, checks if it isn't implemented yet.
// "{0} is cool, {1} is not".format("Alpha", "Beta"); * @param {String} !String.prototype.format string with elements to be replaced
// First, checks if it isn't implemented yet. * @return {String} Formated string
*/
if (!String.prototype.format) { if (!String.prototype.format) {
String.prototype.format = function() String.prototype.format = function()
{ {
@@ -236,25 +254,32 @@ if (!String.prototype.format) {
}; };
} }
// METHOD: numberWithCommas /**
// PARAMS: number * formats flat number 123456 to 123,456
// RETURN: formatted with , in thousands * @param {Number} x number to be formated
// DESC : formats flat number 123456 to 123,456 * @return {String} formatted with , in thousands
*/
const numberWithCommas = (x) => { const numberWithCommas = (x) => {
var parts = x.toString().split("."); var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join("."); return parts.join(".");
}; };
// METHOD: /**
// PARAMS: string * converts line breaks to br
// RETURN: string with <br> * @param {String} string any string
// DESC : converts line breaks to br * @return {String} string with <br>
*/
function convertLBtoBR(string) function convertLBtoBR(string)
{ {
return string.replace(/(?:\r\n|\r|\n)/g, '<br>'); return string.replace(/(?:\r\n|\r|\n)/g, '<br>');
} }
/**
* escape HTML string
* @param {String} !String.prototype.escapeHTML HTML data string to be escaped
* @return {String} escaped string
*/
if (!String.prototype.escapeHTML) { if (!String.prototype.escapeHTML) {
String.prototype.escapeHTML = function() { String.prototype.escapeHTML = function() {
return this.replace(/[&<>"'\/]/g, function (s) { return this.replace(/[&<>"'\/]/g, function (s) {
@@ -272,6 +297,11 @@ if (!String.prototype.escapeHTML) {
}; };
} }
/**
* unescape a HTML encoded string
* @param {String} !String.prototype.unescapeHTML data with escaped entries
* @return {String} HTML formated string
*/
if (!String.prototype.unescapeHTML) { if (!String.prototype.unescapeHTML) {
String.prototype.unescapeHTML = function() { String.prototype.unescapeHTML = function() {
return this.replace(/&[#\w]+;/g, function (s) { return this.replace(/&[#\w]+;/g, function (s) {
@@ -289,31 +319,33 @@ if (!String.prototype.unescapeHTML) {
}; };
} }
// METHOD: getTimestamp /**
// PARAMS: none * returns current timestamp (unix timestamp)
// RETURN: timestamp (in milliseconds) * @return {Number} timestamp (in milliseconds)
// DESC : returns current timestamp (unix timestamp) */
function getTimestamp() function getTimestamp()
{ {
var date = new Date(); var date = new Date();
return date.getTime(); return date.getTime();
} }
// METHOD: dec2hex /**
// PARAMS: decimal string * dec2hex :: Integer -> String
// RETURN: string * i.e. 0-255 -> '00'-'ff'
// DESC : dec2hex :: Integer -> String * @param {Number} dec decimal string
// i.e. 0-255 -> '00'-'ff' * @return {String} hex encdoded number
*/
function dec2hex(dec) function dec2hex(dec)
{ {
return ('0' + dec.toString(16)).substr(-2); return ('0' + dec.toString(16)).substr(-2);
} }
// METHOD: generateId /**
// PARAMS: lenght in int * generateId :: Integer -> String
// RETURN: random string * only works on mondern browsers
// DESC : generateId :: Integer -> String * @param {Number} len length of unique id string
// only works on mondern browsers * @return {String} random string in length of len
*/
function generateId(len) function generateId(len)
{ {
var arr = new Uint8Array((len || 40) / 2); var arr = new Uint8Array((len || 40) / 2);
@@ -321,20 +353,22 @@ function generateId(len)
return Array.from(arr, dec2hex).join(''); return Array.from(arr, dec2hex).join('');
} }
// METHOD: randomIdF() /**
// PARAMS: none * creates a pseudo random string of 10 characters
// RETURN: not true random string * works on all browsers
// DESC : creates a pseudo random string of 10 characters * after many runs it will create duplicates
// after many runs it will create duplicates * @return {String} not true random string
*/
function randomIdF() function randomIdF()
{ {
return Math.random().toString(36).substring(2); return Math.random().toString(36).substring(2);
} }
// METHOD: isObject /**
// PARAMS: possible object * checks if a variable is an object
// RETURN: true/false if it is an object or not * @param {Mixed} val possible object
// DESC : checks if a variable is an object * @return {Boolean} true/false if it is an object or not
*/
function isObject(val) { function isObject(val) {
if (val === null) { if (val === null) {
return false; return false;
@@ -342,47 +376,55 @@ function isObject(val) {
return ((typeof val === 'function') || (typeof val === 'object')); return ((typeof val === 'function') || (typeof val === 'object'));
} }
// METHOD: keyInObject /**
// PARAMS: key name, object * checks if a key exists in a given object
// RETURN: true/false if key exists in object * @param {String} key key name
// DESC : checks if a key exists in a given object * @param {Object} object object to search key in
* @return {Boolean} true/false if key exists in object
*/
const keyInObject = (key, object) => (key in object) ? true : false; const keyInObject = (key, object) => (key in object) ? true : false;
/*function keyInObject(key, object) /*function keyInObject(key, object)
{ {
return (key in object) ? true : false; return (key in object) ? true : false;
}*/ }*/
// METHOD: getKeyByValue /**
// PARAMS: object, value * returns matching key of value
// RETURN: key found * @param {Object} obj object to search value in
// DESC : returns matching key of value * @param {Mixed} value any value (String, Number, etc)
* @return {String} the key found for the first matching value
*/
const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value); const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value);
// function getKeyByValue(object, value) // function getKeyByValue(object, value)
// { // {
// return Object.keys(object).find(key => object[key] === value); // return Object.keys(object).find(key => object[key] === value);
// } // }
// METHOD: valueInObject /**
// PARAMS: obj, value * returns true if value is found in object with a key
// RETURN: true/false * @param {Object} obj object to search value in
// DESC : returns true if value is found in object with a key * @param {Mixed} value any value (String, Number, etc)
* @return {Boolean} true on value found, false on not found
*/
const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false; const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false;
// METHOD: exists /**
// PARAMS: uid * checks if a DOM element actually exists
// RETURN: true/false * @param {String} id Element id to check for
// DESC : checks if a DOM element actually exists * @return {Boolean} true if element exists, false on failure
const exists = (id) => $('#' + id).length > 0 ? true : false; */
const exists = (id) => $(id).length > 0 ? true : false;
/*function exists(id) /*function exists(id)
{ {
return $('#' + id).length > 0 ? true : false; return $(id).length > 0 ? true : false;
}*/ }*/
// METHOD: formatBytes /**
// PARAMS: bytes in int * converts a int number into bytes with prefix in two decimals precision
// RETURN: string in GB/MB/KB * currently precision is fixed, if dynamic needs check for max/min precision
// DESC : converts a int number into bytes with prefix in two decimals precision * @param {Number} bytes bytes in int
// currently precision is fixed, if dynamic needs check for max/min precision * @return {String} string in GB/MB/KB
*/
function formatBytes(bytes) function formatBytes(bytes)
{ {
var i = -1; var i = -1;
@@ -394,10 +436,10 @@ function formatBytes(bytes)
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
} }
// METHOD: errorCatch /**
// PARAMS: err (error from try/catch * prints out error messages based on data available from the browser
// RETURN: none * @param {Object} err error from try/catch block
// DESC : prints out error messages based on data available from the browser */
function errorCatch(err) function errorCatch(err)
{ {
// for FF & Chrome // for FF & Chrome
@@ -423,10 +465,10 @@ function errorCatch(err)
} }
} }
// METHOD: actionIndicator /**
// PARAMS: none * show or hide the "do" overlay
// RETURN: none * @param {String} [loc=''] location name for action indicator, default empty. for console.log
// DESC : show or hide the "do" overlay */
function actionIndicator(loc = '') function actionIndicator(loc = '')
{ {
if ($('overlayBox').visible()) { if ($('overlayBox').visible()) {
@@ -436,12 +478,11 @@ function actionIndicator(loc = '')
} }
} }
// METHOD: actionIndicatorShow/actionIndicatorHide /**
// PARAMS: loc for console log info * explicit show for action Indicator
// RETURN: none * instead of automatically show or hide, do on command show
// DESC : explicit show/hide for action Indicator * @param {String} [loc=''] optional location name, empty if not set. for console.log
// instead of automatically show or hide, do */
// on command
function actionIndicatorShow(loc = '') function actionIndicatorShow(loc = '')
{ {
console.log('Indicator: SHOW [%s]', loc); console.log('Indicator: SHOW [%s]', loc);
@@ -450,6 +491,12 @@ function actionIndicatorShow(loc = '')
$('indicator').show(); $('indicator').show();
overlayBoxShow(); overlayBoxShow();
} }
/**
* explicit hide for action Indicator
* instead of automatically show or hide, do on command hide
* @param {String} [loc=''] optional location name, empty if not set. for console.log
*/
function actionIndicatorHide(loc = '') function actionIndicatorHide(loc = '')
{ {
console.log('Indicator: HIDE [%s]', loc); console.log('Indicator: HIDE [%s]', loc);
@@ -458,10 +505,9 @@ function actionIndicatorHide(loc = '')
overlayBoxHide(); overlayBoxHide();
} }
// METHOD: overlayBoxView /**
// PARAMS: none * shows the overlay box
// RETURN: none */
// DESC : shows or hides the overlay box
function overlayBoxShow() function overlayBoxShow()
{ {
// check if overlay box exists and if yes set the z-index to 100 // check if overlay box exists and if yes set the z-index to 100
@@ -471,6 +517,10 @@ function overlayBoxShow()
$('overlayBox').show(); $('overlayBox').show();
} }
} }
/**
* hides the overlay box
*/
function overlayBoxHide() function overlayBoxHide()
{ {
// if the overlay box z-index is 100, do no hide, but set to 98 // if the overlay box z-index is 100, do no hide, but set to 98
@@ -481,10 +531,9 @@ function overlayBoxHide()
} }
} }
// METHOD: setOverlayBox /**
// PARAMS: none * position the overlay block box and shows it
// RETURN: none */
// DESC : position the overlay block box and shows it
function setOverlayBox() function setOverlayBox()
{ {
var viewport = document.viewport.getDimensions(); var viewport = document.viewport.getDimensions();
@@ -495,10 +544,9 @@ function setOverlayBox()
$('overlayBox').show(); $('overlayBox').show();
} }
// METHOD: ClearCall /**
// PARAMS: none * the abort call, clears the action box and hides it and the overlay box
// RETURN: none */
// DESC : the abort call, clears the action box and hides it and the overlay box
function ClearCall() function ClearCall()
{ {
$('actionBox').innerHTML = ''; $('actionBox').innerHTML = '';
@@ -507,14 +555,15 @@ function ClearCall()
} }
// *** DOM MANAGEMENT FUNCTIONS // *** DOM MANAGEMENT FUNCTIONS
// METHOD: cel [create element] /**
// PARAMS: tag: must set tag (div, span, etc) * reates object for DOM element creation flow
// id: optional set for id, if input, select will be used for name * @param {String} tag must set tag (div, span, etc)
// content: text content inside, is skipped if sub elements exist * @param {String} [id=''] optional set for id, if input, select will be used for name
// css: array for css tags * @param {String} [content=''] text content inside, is skipped if sub elements exist
// options: anything else (value, placeholder, OnClick, style) * @param {Array} [css=[]] array for css tags
// RETURN: object * @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
// DESC : creates object for DOM element creation flow * @return {Object} created element as an object
*/
const cel = (tag, id = '', content = '', css = [], options = {}) => const cel = (tag, id = '', content = '', css = [], options = {}) =>
_element = { _element = {
tag: tag, tag: tag,
@@ -526,12 +575,13 @@ const cel = (tag, id = '', content = '', css = [], options = {}) =>
sub: [] sub: []
}; };
// METHOD: ael [attach element] /**
// PARAMS: base: object where to attach/search * attach a cel created object to another to create a basic DOM tree
// attach: the object to be attached * @param {Object} base object where to attach/search
// id: optional id, if given search in base for this id and attach there * @param {Object} attach the object to be attached
// RETURN: "none", technically there is no return needed * @param {String} [id=''] optional id, if given search in base for this id and attach there
// DESC : attach a cel created object to another to create a basic DOM tree * @return {Object} "none", technically there is no return needed as it is global attach
*/
function ael(base, attach, id = '') function ael(base, attach, id = '')
{ {
if (id) { if (id) {
@@ -553,12 +603,13 @@ function ael(base, attach, id = '')
return base; return base;
} }
// METHOD: aelx [attach n elements] /**
// PARAMS: base: object to where we attach the elements * directly attach n elements to one master base element
// attach 1..n: attach directly to the base element those attachments * this type does not support attach with optional id
// RETURN: "none", technically there is no return needed * @param {Object} base object to where we attach the elements
// DESC : directly attach n elements to one master base element * @param {...Object} attach attach 1..n: attach directly to the base element those attachments
// this type does not support attach with optional id * @return {Object} "none", technically there is no return needed, global attach
*/
function aelx(base, ...attach) function aelx(base, ...attach)
{ {
attach.each(function(t) { attach.each(function(t) {
@@ -567,19 +618,22 @@ function aelx(base, ...attach)
return base; return base;
} }
// METHOD: rel [reset element] /**
// PARAMS: cel created element * resets the sub elements of the base element given
// RETURN: returns reset base element * @param {Object} base cel created element
// DESC : resets the sub elements of the base element given * @return {Object} returns reset base element
*/
const rel = (base) => { const rel = (base) => {
base.sub = []; base.sub = [];
return base; return base;
}; };
// METHOD: rcssel [remove a css from the element] /**
// PARAMS: element, style sheet to remove * searches and removes style from css array
// RETURN: returns full element * @param {Object} _element element to work one
// DESC : searches and removes style from css array * @param {String css style sheet to remove (name)
* @return {Object} returns full element
*/
function rcssel(_element, css) function rcssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -589,10 +643,12 @@ function rcssel(_element, css)
return _element; return _element;
} }
// METHOD: acssel [add css element] /**
// PARAMS: element, style sheet to add * adds a new style sheet to the element given
// RETURN: returns full element * @param {Object} _element element to work on
// DESC : adds a new style sheet to the element given * @param {String} css style sheet to add (name)
* @return {Object} returns full element
*/
function acssel(_element, css) function acssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -602,11 +658,14 @@ function acssel(_element, css)
return _element; return _element;
} }
// METHOD: scssel /**
// PARAMS: element, style to remove, style to add * removes one css and adds another
// RETURN: returns full element * is a wrapper around rcssel/acssel
// DESC : removes one css and adds another * @param {Object} _element element to work on
// is a wrapper around rcssel/acssel * @param {String} rcss style to remove (name)
* @param {String} acss style to add (name)
* @return {Object} returns full element
*/
function scssel(_element, rcss, acss) function scssel(_element, rcss, acss)
{ {
rcssel(_element, rcss); rcssel(_element, rcss);
@@ -614,12 +673,12 @@ function scssel(_element, rcss, acss)
return _element; return _element;
} }
// METHOD: phfo [produce html from object] /**
// PARAMS: object tree with dom element declarations * parses the object tree created with cel/ael and converts it into an HTML string
// RETURN: HTML string that can be used as innerHTML * that can be inserted into the page
// DESC : parses the object tree created with cel/ael * @param {Object} tree object tree with dom element declarations
// and converts it into an HTML string that can * @return {String} HTML string that can be used as innerHTML
// be inserted into the page */
function phfo(tree) function phfo(tree)
{ {
// holds the elements // holds the elements
@@ -681,33 +740,44 @@ function phfo(tree)
// BLOCK: html wrappers for quickly creating html data blocks // BLOCK: html wrappers for quickly creating html data blocks
// NOTE : OLD FORMAT which misses multiple block set /**
// METHOD: html_options * NOTE: OLD FORMAT which misses multiple block set
// PARAMS: name/id, array for the options, selected item uid * creates an select/options drop down block.
// options_only [def false] if this is true, it will not print the select part * the array needs to be key -> value format.
// return_string [def false]: return as string and not as element * key is for the option id and value is for the data output
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: html with build options block * @param {Object} data array for the options
// DESC : creates an select/options drop down block. * @param {String} [selected=''] selected item uid
// the array needs to be key -> value format. key is for the option id and value is for the data output * @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @param {Boolean} [return_string=false] return as string and not as element
* @param {String} [sort=''] if empty as is, else allowed 'keys',
* 'values' all others are ignored
* @return {String} html with build options block
*/
function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '') function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '')
{ {
// wrapper to new call // wrapper to new call
return html_options_block(name, data, selected, false, options_only, return_string, sort); return html_options_block(name, data, selected, false, options_only, return_string, sort);
} }
// NOTE : USE THIS CALL, the above one is deprecated /**
// METHOD: html_options * NOTE: USE THIS CALL, the above one is deprecated
// PARAMS: name/id, array for the options, * creates an select/options drop down block.
// selected item uid [drop down string, multi select array] * the array needs to be key -> value format.
// multiple [def 0] if this is 1 or larger, the drop down will be turned into multiple select * key is for the option id and value is for the data output
// the number sets the size value unless it is 1, then it is default * @param {String} name name/id
// options_only [def false] if this is true, it will not print the select part * @param {Object} data array for the options
// return_string [def false]: return as string and not as element * @param {String} [selected=''] selected item uid
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {Number} [multiple=0] if this is 1 or larger, the drop down
// RETURN: html with build options block * will be turned into multiple select
// DESC : creates an select/options drop down block. * the number sets the size value unless it is 1,
// the array needs to be key -> value format. key is for the option id and value is for the data output * then it is default
* @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @param {Boolean} [return_string=false] return as string and not as element
* @param {String} [sort=''] if empty as is, else allowed 'keys',
* 'values' all others are ignored
* @return {String} html with build options block
*/
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '') function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '')
{ {
var content = []; var content = [];
@@ -778,11 +848,13 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
} }
} }
// METHOD: html_options_refill /**
// PARAMS: name/id, array of options, sort = '' * refills a select box with options and keeps the selected
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: none * @param {Object} data array of options
// DESC : refills a select box with options and keeps the selected * @param {String} [sort=''] if empty as is, else allowed 'keys', 'values'
* all others are ignored
*/
function html_options_refill(name, data, sort = '') function html_options_refill(name, data, sort = '')
{ {
var element_option; var element_option;
@@ -817,10 +889,9 @@ function html_options_refill(name, data, sort = '')
} }
// *** MASTER logout call // *** MASTER logout call
// METHOD: loginLogout /**
// PARAMS: none * submits basic data for form logout
// RETURN: none */
// DESC : submits basic data for form logout
function loginLogout() function loginLogout()
{ {
const form = document.createElement('form'); const form = document.createElement('form');

View File

@@ -150,7 +150,7 @@ class Login extends \CoreLibs\DB\IO
// set global is ajax page for if we show the data directly, or need to pass it back // set global is ajax page for if we show the data directly, or need to pass it back
// to the continue AJAX class for output back to the user // to the continue AJAX class for output back to the user
$this->login_is_ajax_page = isset($GLOBALS['AJAX_PAGE']) && $GLOBALS['AJAX_PAGE'] ? true : false; $this->login_is_ajax_page = $this->ajax_page_flag;
$this->l = new \CoreLibs\Language\L10n($lang); $this->l = new \CoreLibs\Language\L10n($lang);

View File

@@ -181,6 +181,8 @@ class Basic
// form token (used for form validation) // form token (used for form validation)
private $form_token = ''; private $form_token = '';
// ajax flag
protected $ajax_page_flag = false;
// METHOD: __construct // METHOD: __construct
// PARAMS: set_control_flag [current sets set/get var errors] // PARAMS: set_control_flag [current sets set/get var errors]
@@ -218,6 +220,11 @@ class Basic
die('Core Constant missing. Check config file.'); die('Core Constant missing. Check config file.');
} }
// set ajax page flag based on the AJAX_PAGE varaibles
// convert to true/false so if AJAX_PAGE is 0 or false it is
// always boolean false
$this->ajax_page_flag = isset($GLOBALS['AJAX_PAGE']) && $GLOBALS['AJAX_PAGE'] ? true : false;
// set the page name // set the page name
$this->page_name = $this->getPageName(); $this->page_name = $this->getPageName();
$this->host_name = $this->getHostName(); $this->host_name = $this->getHostName();

View File

@@ -727,7 +727,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$EDIT_FGCOLOR_T = 'edit_fgcolor'; $EDIT_FGCOLOR_T = 'edit_fgcolor';
} }
$output_name = $this->table_array[$element_name]['output_name']; $output_name = $this->table_array[$element_name]['output_name'];
if (isset($this->table_array[$element_name]['mandatory'])) { if (isset($this->table_array[$element_name]['mandatory']) &&
$this->table_array[$element_name]['mandatory']
) {
$output_name .= ' *'; $output_name .= ' *';
} }
// create right side depending on 'definiton' in table_array // create right side depending on 'definiton' in table_array
@@ -1022,6 +1024,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} // switch } // switch
} // for each error to check } // for each error to check
} elseif (isset($value['mandatory']) && } elseif (isset($value['mandatory']) &&
$value['mandatory'] &&
( (
// for all 'normal' fields // for all 'normal' fields
($this->table_array[$key]['type'] != 'password' && $this->table_array[$key]['type'] != 'drop_down_db_input' && !$this->table_array[$key]['value']) || ($this->table_array[$key]['type'] != 'password' && $this->table_array[$key]['type'] != 'drop_down_db_input' && !$this->table_array[$key]['value']) ||
@@ -1065,7 +1068,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (is_array($this->reference_array)) { if (is_array($this->reference_array)) {
reset($this->reference_array); reset($this->reference_array);
foreach ($this->reference_array as $key => $value) { foreach ($this->reference_array as $key => $value) {
if ($this->reference_array[$key]['mandatory'] && !$this->reference_array[$key]['selected'][0]) { if (isset($this->reference_array[$key]['mandatory']) &&
$this->reference_array[$key]['mandatory'] &&
!$this->reference_array[$key]['selected'][0]) {
$this->msg .= sprintf($this->l->__('Please select at least one Element from field <b>%s</b>!<br>'), $this->reference_array[$key]['output_name']); $this->msg .= sprintf($this->l->__('Please select at least one Element from field <b>%s</b>!<br>'), $this->reference_array[$key]['output_name']);
} }
} }
@@ -1119,20 +1124,25 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
for ($i = 0; $i < $max; $i ++) { for ($i = 0; $i < $max; $i ++) {
// either one of the post pks is set, or the mandatory // either one of the post pks is set, or the mandatory
foreach ($reference_array['elements'] as $el_name => $data_array) { foreach ($reference_array['elements'] as $el_name => $data_array) {
if (isset($data_array['mandatory'])) { if (isset($data_array['mandatory']) && $data_array['mandatory']) {
$mand_name = $data_array['output_name']; $mand_name = $data_array['output_name'];
} }
// check if there is a primary ket inside, so it is okay // check if there is a primary ket inside, so it is okay
if (isset($data_array['pk_id']) && if (isset($data_array['pk_id']) &&
count($_POST[$prfx.$el_name]) && count($_POST[$prfx.$el_name]) &&
isset($reference_array['mandatory']) isset($reference_array['mandatory']) &&
$reference_array['mandatory']
) { ) {
$mand_okay = 1; $mand_okay = 1;
} }
// we found a mandatory field. check now if one is set to satisfy the main mandatory // we found a mandatory field. check now if one is set to satisfy the main mandatory
// also check, if this field is mandatory and its not set, but any other, throw an error // also check, if this field is mandatory and its not set, but any other, throw an error
// $this->debug('edit_error_chk', 'RG error - Data['.$prfx.$el_name.': '.$_POST[$prfx.$el_name][$i].' | '.$_POST[$prfx.$el_name].' - '.$reference_array['enable_name'].' - '.$_POST[$reference_array['enable_name']][$_POST[$prfx.$el_name][$i]]); // $this->debug('edit_error_chk', 'RG error - Data['.$prfx.$el_name.': '.$_POST[$prfx.$el_name][$i].' | '.$_POST[$prfx.$el_name].' - '.$reference_array['enable_name'].' - '.$_POST[$reference_array['enable_name']][$_POST[$prfx.$el_name][$i]]);
if (isset($data_array['mandatory']) && $_POST[$prfx.$el_name][$i]) { if (isset($data_array['mandatory']) &&
$data_array['mandatory'] &&
isset($_POST[$prfx.$el_name][$i]) &&
$_POST[$prfx.$el_name][$i]
) {
$mand_okay = 1; $mand_okay = 1;
$row_okay[$i] = 1; $row_okay[$i] = 1;
} elseif ($data_array['type'] == 'radio_group' && !isset($_POST[$prfx.$el_name])) { } elseif ($data_array['type'] == 'radio_group' && !isset($_POST[$prfx.$el_name])) {
@@ -1145,7 +1155,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// $this->debug('edit_error_chk', '[$i]'); // $this->debug('edit_error_chk', '[$i]');
$element_set[$i] = 1; $element_set[$i] = 1;
$row_okay[$i] = 1; $row_okay[$i] = 1;
} elseif (isset($data_array['mandatory']) && !$_POST[$prfx.$el_name][$i]) { } elseif (isset($data_array['mandatory']) &&
$data_array['mandatory'] &&
!$_POST[$prfx.$el_name][$i]
) {
$row_okay[$i] = 0; $row_okay[$i] = 0;
} }
// do optional error checks like for normal fields // do optional error checks like for normal fields
@@ -1153,19 +1166,20 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($data_array['error_check'])) { if (isset($data_array['error_check'])) {
foreach (explode('|', $data_array['error_check']) as $error_check) { foreach (explode('|', $data_array['error_check']) as $error_check) {
switch ($error_check) { switch ($error_check) {
// check unique, check if field in table is not yet exist // check unique, check if field is filled and not same in _POST set
case 'unique': case 'unique':
$q = 'SELECT '.$_pk_name.' FROM '.$table_name.' WHERE '.$el_name.' = '."'".$this->dbEscapeString($_POST[$prfx.$el_name][$i])."'"; // must be set for double check
if ($this->table_array[$this->int_pk_name]['value']) { if ($_POST[$prfx.$el_name][$i] &&
$q .= ' AND '.$this->int_pk_name.' <> '.$this->table_array[$this->int_pk_name]['value']; count(array_keys($_POST[$prfx.$el_name], $_POST[$prfx.$el_name][$i])) >= 2
} ) {
list($key) = $this->dbReturnRow($q);
if ($key) {
$this->msg .= sprintf($this->l->__('The field <b>%s</b> in row <b>%s</b> can be used only once!<br>'), $reference_array['output_name'], $i); $this->msg .= sprintf($this->l->__('The field <b>%s</b> in row <b>%s</b> can be used only once!<br>'), $reference_array['output_name'], $i);
} }
break; break;
case 'alphanumericspace': case 'alphanumericspace':
if (!preg_match("/^[0-9A-Za-z\ ]+$/", $_POST[$prfx.$el_name][$i])) { // only check if set
if ($_POST[$prfx.$el_name][$i] &&
!preg_match("/^[0-9A-Za-z\ ]+$/", $_POST[$prfx.$el_name][$i])
) {
$this->msg .= sprintf($this->l->__('Please enter a valid alphanumeric (Numbers and Letters, spaces allowed) value for the <b>%s</b> Field and row <b>%s</b>!<br>'), $reference_array['output_name'], $i); $this->msg .= sprintf($this->l->__('Please enter a valid alphanumeric (Numbers and Letters, spaces allowed) value for the <b>%s</b> Field and row <b>%s</b>!<br>'), $reference_array['output_name'], $i);
} }
break; break;
@@ -1176,7 +1190,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} }
// main mandatory is met -> error msg // main mandatory is met -> error msg
if (!$mand_okay && isset($reference_array['mandatory'])) { if (!$mand_okay &&
isset($reference_array['mandatory']) &&
$reference_array['mandatory']) {
$this->msg .= sprintf($this->l->__('You need to enter at least one data set for field <b>%s</b>!<Br>'), $reference_array['output_name']); $this->msg .= sprintf($this->l->__('You need to enter at least one data set for field <b>%s</b>!<Br>'), $reference_array['output_name']);
} }
for ($i = 0; $i < $max; $i ++) { for ($i = 0; $i < $max; $i ++) {
@@ -1472,6 +1488,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// if we have enable name & delete set, then only insert/update those which are flagged as active // if we have enable name & delete set, then only insert/update those which are flagged as active
// check if mandatory field is set, if not set 'do not write flag' // check if mandatory field is set, if not set 'do not write flag'
if (isset($data_array['mandatory']) && if (isset($data_array['mandatory']) &&
$data_array['mandatory'] &&
(!isset($_POST[$prfx.$el_name][$i]) || (isset($_POST[$prfx.$el_name][$i]) && empty($_POST[$prfx.$el_name][$i]))) (!isset($_POST[$prfx.$el_name][$i]) || (isset($_POST[$prfx.$el_name][$i]) && empty($_POST[$prfx.$el_name][$i])))
) { ) {
$no_write[$i] = 1; $no_write[$i] = 1;
@@ -1678,7 +1695,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
{ {
$data = array(); $data = array();
$output_name = $this->reference_array[$table_name]['output_name']; $output_name = $this->reference_array[$table_name]['output_name'];
if ($this->reference_array[$table_name]['mandatory']) { if (isset($this->reference_array[$table_name]['mandatory']) &&
$this->reference_array[$table_name]['mandatory']
) {
$output_name .= ' *'; $output_name .= ' *';
} }
$data['name'] = $this->reference_array[$table_name]['other_table_pk']; $data['name'] = $this->reference_array[$table_name]['other_table_pk'];
@@ -1708,7 +1727,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data = array(); $data = array();
// output name for the viewable left table td box, prefixed with * if mandatory // output name for the viewable left table td box, prefixed with * if mandatory
$output_name = $this->element_list[$table_name]['output_name']; $output_name = $this->element_list[$table_name]['output_name'];
if (isset($this->element_list[$table_name]['mandatory'])) { if (isset($this->element_list[$table_name]['mandatory']) &&
$this->element_list[$table_name]['mandatory']
) {
$output_name .= ' *'; $output_name .= ' *';
} }
// delete button name, if there is one set // delete button name, if there is one set
@@ -1789,7 +1810,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if ($this->error) { if ($this->error) {
if (isset($_POST[$el_name]) && is_array($_POST[$el_name])) { if (isset($_POST[$el_name]) && is_array($_POST[$el_name])) {
// this is for the new line // this is for the new line
$proto[$el_name] = $_POST[$el_name][(count($_POST[$el_name]) - 1)]; $proto[$el_name] = isset($_POST[$el_name][(count($_POST[$el_name]) - 1)]) ? $_POST[$el_name][(count($_POST[$el_name]) - 1)] : 0;
} else { } else {
$proto[$el_name] = 0; $proto[$el_name] = 0;
} }