UNPKG

@xuda.io/runtime-bundle

Version:

The Xuda Runtime Bundle refers to a collection of scripts and libraries packaged together to provide the necessary runtime environment for executing plugins or components in the Xuda platform.

432 lines (427 loc) • 13.8 kB
export const input_mask = function ( actionP, valP, typeP, maskP, elemP, grid_objP, grid_row_idP, grid_col_idP, dsSessionP ) { // TEXT // =================== // 25 or AAA or aaa or Aaa or (AAA) XXX // X = Alpha numeric input // A = uppercase // a = lowercase // # = number digit // /T - auto tab // NUMERIC // =================== // 3 or 2.2 // ##.## - number mask // /T - auto tab // /A - auto fill // /+[custom char] - add + sign // /-[custom char] - add - sign (alow negative values) // /Z[custom char] - padding with zeros // /N[custom char] - null when zero // /C[custom char] - add custom character // /+[custom char]/-[custom char]/$/99.99/%/ZERO or Z[custom char]/NULL or N[custom char]/T // actionP : // init = initiate an input field // get = return masked val // val = return original val var nonCharPatt = /\W/; var wordPatt = /[A-Z,a-z]/; var digitPatt = /\d/; const get_properties = function (typeP, maskP) { var ret = { custom_pfx: false, customChar_pfx: "", positive_pfx: false, positiveChar_pfx: "+", negative_pfx: false, negativeChar_pfx: "-", size: 0, whole: 0, decimal: 0, zeros: false, zerosChar: "0", do_null: false, nullChar: "", autoTab: false, autoFill: false, negative_sfx: false, negativeChar_sfx: "", positive_sfx: false, positiveChar_sfx: "", custom_sfx: false, customChar_sfx: "", type: typeP, mask: "", maskPos: null, error: "", }; var get_char = function (valP, defaultP) { var ret = defaultP; if (valP.length > 1) ret = valP.substr(1, valP.length); return ret; }; var fill_mask = function (lenP, charP) { var s = ""; for (var i = 0; i < lenP; i++) { s += charP; } return s; }; var mask_Arr = maskP.split("/"); // find mask pos _.forEach(mask_Arr, function (val, key) { if (typeP === "number") { if (/[0-9.#]/.test(val) && !/[TNCZ+-]/.test(val.substr(0, 1))) ret.maskPos = key; } if (typeP === "string") { if (/[0-9XAaUL#]/.test(val) && !/[T]/.test(val.substr(0, 1))) ret.maskPos = key; } }); if (ret.maskPos === null) { ret.error = "SYS_MSG_0612 - missing mask definition"; return ret; } // make mask var mask = mask_Arr[ret.maskPos]; if (typeP === "number") { var whole = mask.split(".")[0]; var decimal = mask.split(".")[1]; if (whole && whole > 15) { ret.error = "SYS_MSG_0632 - Too big"; return ret; } if (decimal && decimal > 5) { ret.error = "SYS_MSG_0632 - Too big"; return ret; } if ( /\D/.test(whole) // find non digit for whole ) ret.mask = whole; else ret.mask = fill_mask(whole, "#"); if (decimal && ret.mask) { if ( /\D/.test(decimal) // find non digit for decimal ) ret.mask += "." + decimal; else ret.mask += "." + fill_mask(decimal, "#"); } } if (typeP === "string") { if (/\D/.test(mask)) { // find non digit // ret.mask = mask; if (/\d/.test(mask)) { // check if digit exist var patt = /[ULXAa#]/g; var str = ""; var Arr = []; for (var i = 0; i <= mask.length; i++) { var val = mask.substr(i, 1); if (patt.test(val)) str += "@" + val; else str += val; } var s = str.split("@"); for (var i = 1; i <= s.length - 1; i++) { Arr[i - 1] = fill_mask(s[i].substr(1), s[i].substr(0, 1)); } ret.mask = Arr.join(""); // U1L10 } else ret.mask = mask; // mixed UUUAAA //console.log(Arr.join("")) } else ret.mask = fill_mask(mask, "X"); // only digits eg. 25 } if (!ret.mask) { ret.error = "SYS_MSG_0614 - wrong mask definition"; return ret; } // get size var patt = /[#]/g; if (typeP === "number") { if (ret.mask.match(patt)) { ret.size = ret.mask.match(patt).join("").length; ret.whole = ret.mask.split(".")[0].match(patt).join("").length; if (ret.mask.split(".")[1]) ret.decimal = ret.mask.split(".")[1].match(patt).join("").length; } } patt = /[X#AaUL]/g; if (typeP === "string") { if (ret.mask.match(patt)) ret.size = ret.mask.match(patt).join("").length; } if (!ret.size) { ret.error = "SYS_MSG_0616 - size parser"; return ret; } for (let [key, val] of Object.entries(mask_Arr)) { if (!val) continue; if (val.trim() === "Z" || val.substr(0, 1) === "Z") { ret.zeros = true; ret.zerosChar = get_char(val, "0"); if (typeP === "string") ret.error = "SYS_MSG_0618 - Illegal 'Z' in string mask"; continue; } else { if (val.trim() === "N" || val.substr(0, 1) === "N") { ret.do_null = true; ret.nullChar = get_char(val, ""); if (typeP === "string") ret.error = "SYS_MSG_0620 - Illegal 'N' in string mask"; continue; } else { if (val.trim() === "+" || val.substr(0, 1) === "+") { if (key < ret.maskPos) { ret.positive_pfx = true; ret.positiveChar_pfx = get_char(val, "+"); } if (key > ret.maskPos) { ret.positive_sfx = true; ret.positiveChar_sfx = get_char(val, "+"); } if (typeP === "string" && val.trim() === "+") ret.error = "SYS_MSG_0622 - Illegal '+' in string mask"; continue; } else { if (val.trim() === "-" || val.substr(0, 1) === "-") { if (key < ret.maskPos) { ret.negative_pfx = true; ret.negativeChar_pfx = get_char(val, "-"); } if (key > ret.maskPos) { ret.negative_sfx = true; ret.negativeChar_sfx = get_char(val, "-"); } if (typeP === "string" && val.trim() === "-") ret.error = "SYS_MSG_0624 - Illegal '-' in string mask"; continue; } else { if (val.trim() === "C" || val.substr(0, 1) === "C") { if (key < ret.maskPos) { ret.custom_pfx = true; ret.customChar_pfx = get_char(val, "C"); } if (key > ret.maskPos) { ret.custom_sfx = true; ret.customChar_sfx = get_char(val, "C"); } if (typeP === "string" && val.trim() === "C") ret.error = "SYS_MSG_0626 - Illegal 'C' in string mask"; continue; } else { if (val.trim() === "T" || val.substr(0, 1) === "T") { ret.autoTab = true; continue; } else { if (key !== ret.maskPos) ret.error = "SYS_MSG_0628 - invalid /" + val + " switch"; } } } } } } } return ret; }; const run_mask = function (dataP, validateP, prev_val, mask) { // if (!dataP && dataP !== "" && dataP !== "0") // return; var str = ""; var i = -1; var prop = get_properties(typeP, mask); if (prop.error) return prop.error; if (typeP === "number") { var fill_zeros = function (maskLenP, valLenP, charP) { var s = ""; for (var i = 0; i < maskLenP - valLenP; i++) { if (charP) s += charP; else s += "0"; } return s; }; var str_pfx = prop.customChar_pfx; if (prop.positive_pfx && dataP > 0) str_pfx += prop.positiveChar_pfx; if (prop.negative_pfx && dataP < 0) str_pfx += prop.negativeChar_pfx; var str_sfx = ""; if (prop.negative_sfx && dataP < 0) str_sfx += prop.negativeChar_sfx; if (prop.positive_sfx && dataP > 0) str_sfx += prop.positiveChar_sfx; str_sfx += prop.customChar_sfx; if (dataP && dataP !== "0") { var val_whole = Math.abs(dataP.toString().split(".")[0]).toString(); var val_decimal = dataP.toString().split(".")[1]; var whole_truncated = val_whole; if (val_whole.length > prop.whole) whole_truncated = val_whole.substr( val_whole.length - prop.whole, val_whole.length ); // truncate only when mask length bigger then value if (prop.zeros) str += fill_zeros(prop.whole, whole_truncated.length, prop.zerosChar) + whole_truncated; // do padding else str += whole_truncated; // truncate whole acording the mask if (prop.decimal) { if (val_decimal) str += "." + val_decimal + fill_zeros(prop.decimal, val_decimal.length, prop.zerosChar); // fill zeroz for fraction else str += "." + fill_zeros(prop.decimal, 0, prop.zerosChar); // fill zeroz for fraction } } else { // no data exist if (prop.zeros) str = fill_zeros(prop.whole, 0); // do padding else str = "0"; if (prop.decimal) str += "." + fill_zeros(prop.decimal, 0, prop.zerosChar); // fill zeroz for fraction } if (prop.do_null && (!dataP || dataP === "0")) str = prop.nullChar; else str = str_pfx + str + str_sfx; return str; } if (typeP === "string") { var err; for (var x = 0; x <= prop.mask.length; x++) { var val = prop.mask.substr(x, 1); if (!dataP) return; if (dataP.length > i) { if (nonCharPatt.test(val) && val !== "#") { str += val; } else { i++; // var s = dataP.substr(i, 1); var s = ""; s = dataP.substr(i, 1); if (val === "X") { // X = mixed str += s; } if (val === "U") { // U = uppercase only if (wordPatt.test(s) || s === " ") str += s.toUpperCase(); } if (val === "A") { // A = uppercase str += s.toUpperCase(); } if (val === "a") { // a = lowercase str += s.toLowerCase(); } if (val === "L") { // L = lowercase only if (wordPatt.test(s) || s === " ") str += s.toLowerCase(); } if (val === "#") { // # = digit if (digitPatt.test(s)) str += s; } } } } // }); if (validateP && err) return prev_val; else return str; } }; var run_value = function (dataP, mask) { if (!dataP) return; var str = ""; if (typeP === "string") { if (mask) for (var i = 0; i <= dataP.length; i++) { var val = dataP.substr(i, 1); var s = mask.substr(i, 1); if (s === val && nonCharPatt.test(s) && s !== "#") str += ""; // return; //true; else str += val; } } if (typeP === "number") { var patt = /[0-9-.]/g; var arr = dataP.toString().match(patt); if (arr && arr.length > 0) str = parseFloat(arr.join("")); } return str; }; if (actionP === "init") { if (!elemP) return "SYS_MSG_0630 - Missing DOM Element"; $(elemP).data({ mask: maskP, }); $(elemP).off("keypress.mask"); $(elemP).on("keypress.mask", function (e) { var _this = this; setTimeout(function () { var prev_val = $(_this).data("prev_val"); var mask = $(_this).data("mask"); var prop = get_properties(typeP, mask); // var is_autoTab = prop.autoTab; // return on non character key if ( typeP === "number" && !/[0-9-.+]/.test(String.fromCharCode(e.keyCode)) ) { e.preventDefault(); return false; } var val = $(_this).val(); if (typeP === "string" && val) { var res = run_mask(run_value(val, mask), true, prev_val, mask); $(_this).val(res).data({ prev_val: res, }); } // if (grid_objP) { // // auto skip for grid // if (run_value(val, mask).toString().length >= prop.size) // func.UI.grid.next_field( // grid_objP, // grid_row_idP, // grid_col_idP, // dsSessionP // ); // } }, 50); }); $(elemP).off("blur.mask"); $(elemP).on("blur.mask", function (e) { var prev_val = $(this).data("prev_val"); var mask = $(this).data("mask"); var val = $(this).val(); // return on non character key if (typeP === "number" && !/[0-9-.+]/.test(val)) return; if (typeP === "number" && val) { var res = run_mask(run_value(val, mask), true, prev_val, mask); $(this).val(res).data({ prev_val: res, }); setTimeout(function () { if (grid_objP) grid_objP.cells(grid_row_idP, grid_col_idP).setValue(res); }, 50); } }); } if (actionP === "get") return run_mask(valP, null, null, maskP); if (actionP === "val") return run_value(valP, maskP); if (actionP === "properties") { var prop = {}; prop = get_properties(typeP, maskP); if (valP) prop.val_size = run_value(valP, maskP).toString().length; return prop; } };