| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- import { ie } from "./environment";
- import { EventHandlers } from "./eventhandlers";
- import { keys } from "./keycode.js";
- import {
- caret,
- determineNewCaretPosition,
- getBuffer,
- getBufferTemplate,
- getLastValidPosition,
- isMask,
- resetMaskSet,
- seekNext
- } from "./positioning";
- import { isComplete, refreshFromBuffer } from "./validation";
- import { getMaskTemplate, getPlaceholder, getTest } from "./validation-tests";
- export {
- applyInputValue,
- clearOptionalTail,
- checkVal,
- HandleNativePlaceholder,
- unmaskedvalue,
- writeBuffer
- };
- function applyInputValue(input, value, initialEvent) {
- const inputmask = input ? input.inputmask : this,
- opts = inputmask.opts;
- input.inputmask.refreshValue = false;
- if (typeof opts.onBeforeMask === "function")
- value = opts.onBeforeMask.call(inputmask, value, opts) || value;
- value = (value || "").toString().split("");
- checkVal(input, true, false, value, initialEvent);
- inputmask.undoValue = inputmask._valueGet(true);
- if (
- (opts.clearMaskOnLostFocus || opts.clearIncomplete) &&
- input.inputmask._valueGet() ===
- getBufferTemplate.call(inputmask).join("") &&
- getLastValidPosition.call(inputmask) === -1
- ) {
- input.inputmask._valueSet("");
- }
- }
- // todo put on prototype?
- function clearOptionalTail(buffer) {
- const inputmask = this;
- buffer.length = 0;
- let template = getMaskTemplate.call(
- inputmask,
- true,
- 0,
- true,
- undefined,
- true
- ),
- lmnt;
- while ((lmnt = template.shift()) !== undefined) buffer.push(lmnt);
- return buffer;
- }
- function checkVal(input, writeOut, strict, nptvl, initiatingEvent) {
- const inputmask = input ? input.inputmask : this,
- maskset = inputmask.maskset,
- opts = inputmask.opts,
- $ = inputmask.dependencyLib;
- let inputValue = nptvl.slice(),
- charCodes = "",
- initialNdx = -1,
- result,
- skipOptionalPartCharacter = opts.skipOptionalPartCharacter;
- opts.skipOptionalPartCharacter = ""; // see issue #2311
- function isTemplateMatch(ndx, charCodes) {
- let targetTemplate = getMaskTemplate
- .call(inputmask, true, 0)
- .slice(ndx, seekNext.call(inputmask, ndx, false, false))
- .join("")
- .replace(/'/g, ""),
- charCodeNdx = targetTemplate.indexOf(charCodes);
- // strip spaces from targetTemplate
- while (charCodeNdx > 0 && targetTemplate[charCodeNdx - 1] === " ")
- charCodeNdx--;
- const match =
- charCodeNdx === 0 &&
- !isMask.call(inputmask, ndx) &&
- (getTest.call(inputmask, ndx).match.nativeDef === charCodes.charAt(0) ||
- (getTest.call(inputmask, ndx).match.static === true &&
- getTest.call(inputmask, ndx).match.nativeDef ===
- "'" + charCodes.charAt(0)) ||
- (getTest.call(inputmask, ndx).match.nativeDef === " " &&
- (getTest.call(inputmask, ndx + 1).match.nativeDef ===
- charCodes.charAt(0) ||
- (getTest.call(inputmask, ndx + 1).match.static === true &&
- getTest.call(inputmask, ndx + 1).match.nativeDef ===
- "'" + charCodes.charAt(0)))));
- if (
- !match &&
- charCodeNdx > 0 &&
- !isMask.call(inputmask, ndx, false, true)
- ) {
- const nextPos = seekNext.call(inputmask, ndx);
- if (inputmask.caretPos.begin < nextPos) {
- inputmask.caretPos = { begin: nextPos };
- }
- }
- return match;
- }
- resetMaskSet.call(inputmask, false);
- inputmask.clicked = 0; // reset click counter to correctly determine the caretposition in checkval
- initialNdx = opts.radixPoint
- ? determineNewCaretPosition.call(
- inputmask,
- {
- begin: 0,
- end: 0
- },
- false,
- opts.__financeInput === false ? "radixFocus" : undefined
- ).begin
- : 0;
- maskset.p = initialNdx;
- inputmask.caretPos = { begin: initialNdx };
- let staticMatches = [],
- prevCaretPos = inputmask.caretPos;
- inputValue.forEach(function (charCode, ndx) {
- if (charCode !== undefined) {
- // inputfallback strips some elements out of the inputarray. $.each logically presents them as undefined
- /* if (maskset.validPositions[ndx] === undefined && inputValue[ndx] === getPlaceholder.call(inputmask, ndx) && isMask.call(inputmask, ndx, true) &&
- isValid.call(inputmask, ndx, inputValue[ndx], true, undefined, true, true) === false) {
- inputmask.caretPos.begin++;
- } else */
- // console.log("caret " + inputmask.caretPos.begin);
- const keypress = new $.Event("_checkval");
- keypress.key = charCode;
- charCodes += charCode;
- const lvp = getLastValidPosition.call(inputmask, undefined, true);
- if (!isTemplateMatch(initialNdx, charCodes)) {
- result = EventHandlers.keypressEvent.call(
- inputmask,
- keypress,
- true,
- false,
- strict,
- inputmask.caretPos.begin
- );
- if (result) {
- initialNdx = inputmask.caretPos.begin + 1;
- charCodes = "";
- }
- } else {
- result = EventHandlers.keypressEvent.call(
- inputmask,
- keypress,
- true,
- false,
- strict,
- lvp + 1
- );
- }
- if (result) {
- if (
- result.pos !== undefined &&
- maskset.validPositions[result.pos] &&
- maskset.validPositions[result.pos].match.static === true &&
- maskset.validPositions[result.pos].alternation === undefined
- ) {
- staticMatches.push(result.pos);
- if (!inputmask.isRTL) {
- result.forwardPosition = result.pos + 1;
- }
- }
- writeBuffer.call(
- inputmask,
- undefined,
- getBuffer.call(inputmask),
- result.forwardPosition,
- keypress,
- false
- );
- inputmask.caretPos = {
- begin: result.forwardPosition,
- end: result.forwardPosition
- };
- prevCaretPos = inputmask.caretPos;
- } else {
- if (
- maskset.validPositions[ndx] === undefined &&
- inputValue[ndx] === getPlaceholder.call(inputmask, ndx) &&
- isMask.call(inputmask, ndx, true)
- ) {
- inputmask.caretPos.begin++;
- } else inputmask.caretPos = prevCaretPos; // restore the caret position from before the failed validation
- }
- }
- });
- if (staticMatches.length > 0) {
- let sndx,
- validPos,
- nextValid = seekNext.call(inputmask, -1, undefined, false);
- if (
- (!isComplete.call(inputmask, getBuffer.call(inputmask)) &&
- staticMatches.length <= nextValid) ||
- (isComplete.call(inputmask, getBuffer.call(inputmask)) &&
- staticMatches.length > 0 &&
- staticMatches.length !== nextValid &&
- staticMatches[0] === 0)
- ) {
- // should check if is sequence starting from 0
- let nextSndx = nextValid;
- while ((sndx = staticMatches.shift()) !== undefined) {
- if (sndx < nextSndx) {
- const keypress = new $.Event("_checkval");
- validPos = maskset.validPositions[sndx];
- validPos.generatedInput = true;
- keypress.key = validPos.input;
- result = EventHandlers.keypressEvent.call(
- inputmask,
- keypress,
- true,
- false,
- strict,
- nextSndx
- );
- if (
- result &&
- result.pos !== undefined &&
- result.pos !== sndx &&
- maskset.validPositions[result.pos] &&
- maskset.validPositions[result.pos].match.static === true
- ) {
- staticMatches.push(result.pos);
- } else if (!result) break;
- nextSndx++;
- }
- }
- } else {
- // mark al statics as generated
- // while ((sndx = staticMatches.pop())) {
- // validPos = maskset.validPositions[sndx];
- // if (validPos) {
- // validPos.generatedInput = true;
- // }
- // }
- }
- }
- if (writeOut) {
- writeBuffer.call(
- inputmask,
- input,
- getBuffer.call(inputmask),
- result ? result.forwardPosition : inputmask.caretPos.begin,
- initiatingEvent || new $.Event("checkval"),
- initiatingEvent &&
- ((initiatingEvent.type === "input" &&
- inputmask.undoValue !== getBuffer.call(inputmask).join("")) ||
- initiatingEvent.type === "paste")
- );
- // for (var vndx in maskset.validPositions) {
- // if (maskset.validPositions[vndx].match.generated !== true) { //only remove non forced generated
- // delete maskset.validPositions[vndx].generatedInput; //clear generated markings ~ consider initializing with a value as fully typed
- // }
- // }
- }
- opts.skipOptionalPartCharacter = skipOptionalPartCharacter;
- }
- function HandleNativePlaceholder(npt, value) {
- const inputmask = npt ? npt.inputmask : this;
- if (ie) {
- if (
- npt.inputmask._valueGet() !== value &&
- (npt.placeholder !== value || npt.placeholder === "")
- ) {
- let buffer = getBuffer.call(inputmask).slice(),
- nptValue = npt.inputmask._valueGet();
- if (nptValue !== value) {
- const lvp = getLastValidPosition.call(inputmask);
- if (
- lvp === -1 &&
- nptValue === getBufferTemplate.call(inputmask).join("")
- ) {
- buffer = [];
- } else if (lvp !== -1) {
- // clearout optional tail of the mask
- clearOptionalTail.call(inputmask, buffer);
- }
- writeBuffer(npt, buffer);
- }
- }
- } else if (npt.placeholder !== value) {
- npt.placeholder = value;
- if (npt.placeholder === "") npt.removeAttribute("placeholder");
- }
- }
- function unmaskedvalue(input) {
- const inputmask = input ? input.inputmask : this,
- opts = inputmask.opts,
- maskset = inputmask.maskset;
- if (input) {
- if (input.inputmask === undefined) {
- return input.value;
- }
- if (input.inputmask && input.inputmask.refreshValue) {
- // forced refresh from the value form.reset
- applyInputValue(input, input.inputmask._valueGet(true));
- }
- }
- const umValue = [],
- vps = maskset.validPositions;
- for (let pndx = 0, vpl = vps.length; pndx < vpl; pndx++) {
- if (
- vps[pndx] &&
- vps[pndx].match &&
- (vps[pndx].match.static != true ||
- (Array.isArray(maskset.metadata) && vps[pndx].generatedInput !== true))
- ) {
- // only include generated input with multiple masks (check on metadata)
- umValue.push(vps[pndx].input);
- }
- }
- let unmaskedValue =
- umValue.length === 0
- ? ""
- : (inputmask.isRTL ? umValue.reverse() : umValue).join("");
- if (typeof opts.onUnMask === "function") {
- const bufferValue = (
- inputmask.isRTL
- ? getBuffer.call(inputmask).slice().reverse()
- : getBuffer.call(inputmask)
- ).join("");
- unmaskedValue = opts.onUnMask.call(
- inputmask,
- bufferValue,
- unmaskedValue,
- opts
- );
- }
- return unmaskedValue;
- }
- function writeBuffer(input, buffer, caretPos, event, triggerEvents) {
- const inputmask = input ? input.inputmask : this,
- opts = inputmask.opts,
- $ = inputmask.dependencyLib;
- if (event && typeof opts.onBeforeWrite === "function") {
- // buffer = buffer.slice(); //prevent uncontrolled manipulation of the internal buffer
- const result = opts.onBeforeWrite.call(
- inputmask,
- event,
- buffer,
- caretPos,
- opts
- );
- if (result) {
- if (result.refreshFromBuffer) {
- const refresh = result.refreshFromBuffer;
- refreshFromBuffer.call(
- inputmask,
- refresh === true ? refresh : refresh.start,
- refresh.end,
- result.buffer || buffer
- );
- buffer = getBuffer.call(inputmask, true);
- }
- if (caretPos !== undefined)
- caretPos = result.caret !== undefined ? result.caret : caretPos;
- }
- }
- if (input !== undefined) {
- input.inputmask._valueSet(buffer.join(""));
- if (
- caretPos !== undefined &&
- (event === undefined || event.type !== "blur")
- ) {
- // console.log(caretPos);
- caret.call(
- inputmask,
- input,
- caretPos,
- undefined,
- undefined,
- event !== undefined &&
- event.type === "keydown" &&
- (event.key === keys.Delete || event.key === keys.Backspace)
- );
- }
- input.inputmask.writeBufferHook === undefined ||
- input.inputmask.writeBufferHook(caretPos);
- if (triggerEvents === true) {
- const $input = $(input),
- nptVal = input.inputmask._valueGet();
- input.inputmask.skipInputEvent = true;
- $input.trigger("input");
- setTimeout(function () {
- // timeout needed for IE
- if (nptVal === getBufferTemplate.call(inputmask).join("")) {
- $input.trigger("cleared");
- } else if (isComplete.call(inputmask, buffer) === true) {
- $input.trigger("complete");
- }
- }, 0);
- }
- }
- }
|