diff --git a/packages/imask/example.html b/packages/imask/example.html index 9f89f006..cdb49ef4 100644 --- a/packages/imask/example.html +++ b/packages/imask/example.html @@ -17,25 +17,6 @@ <h1>IMask Core Demo</h1> lazy: false, overwrite: true, autofix: 'pad', - blocks: { - d: { - mask: IMask.MaskedRange, - from: 1, - to: 31, - maxLength: 2, - }, - m: { - mask: IMask.MaskedRange, - from: 1, - to: 12, - maxLength: 2, - }, - Y: { - mask: IMask.MaskedRange, - from: 2023, - to: 2023, - }, - }, }; const input = document.getElementById('input'); diff --git a/packages/imask/src/masked/base.ts b/packages/imask/src/masked/base.ts index df64fb15..dbc51283 100644 --- a/packages/imask/src/masked/base.ts +++ b/packages/imask/src/masked/base.ts @@ -231,20 +231,24 @@ abstract class Masked<Value=any> { const beforeTailState = this.state; if (this.overwrite === true) { consistentTail = checkTail.state; - checkTail.unshift(this.displayValue.length - details.tailShift); + for (let i=0; i < details.rawInserted.length; ++i) { + checkTail.unshift(this.displayValue.length - details.tailShift); + } } let tailDetails = this.appendTail(checkTail); - appended = tailDetails.rawInserted === checkTail.toString(); + appended = tailDetails.rawInserted.length === checkTail.toString().length; // not ok, try shift if (!(appended && tailDetails.inserted) && this.overwrite === 'shift') { this.state = beforeTailState; consistentTail = checkTail.state; - checkTail.shift(); + for (let i=0; i < details.rawInserted.length; ++i) { + checkTail.shift(); + } tailDetails = this.appendTail(checkTail); - appended = tailDetails.rawInserted === checkTail.toString(); + appended = tailDetails.rawInserted.length === checkTail.toString().length; } // if ok, rollback state after tail diff --git a/packages/imask/src/masked/pattern.ts b/packages/imask/src/masked/pattern.ts index 0c8bd37b..dd050e01 100644 --- a/packages/imask/src/masked/pattern.ts +++ b/packages/imask/src/masked/pattern.ts @@ -305,10 +305,7 @@ class MaskedPattern<Value=string> extends Masked<Value> { const details = new ChangeDetails(); if (!blockIter) return details; - for (let bi=blockIter.index; ; ++bi) { - const block = this._blocks[bi]; - if (!block) break; - + for (let bi=blockIter.index, block; (block = this._blocks[bi]); ++bi) { const blockDetails = block._appendChar(ch, { ...flags, _beforeTailState: flags._beforeTailState?._blocks?.[bi] }); const skip = blockDetails.skip; diff --git a/packages/imask/test/masked/base.ts b/packages/imask/test/masked/base.ts index 6a3de976..1f39213b 100644 --- a/packages/imask/test/masked/base.ts +++ b/packages/imask/test/masked/base.ts @@ -5,6 +5,7 @@ import MaskedPattern from '../../src/masked/pattern'; import MaskedDate from '../../src/masked/date'; import MaskedNumber from '../../src/masked/number'; import { DIRECTION } from '../../src/core/utils'; +import { MaskedRange } from '../../src'; describe('Masked', function () { @@ -147,6 +148,24 @@ describe('Masked', function () { masked.splice(4, 0, '0', DIRECTION.NONE, { input: true, raw: true }); assert.strictEqual(masked.value, '$1,230.45'); }); + + it('should work with autofix', function () { + const masked = new MaskedRange({ + from: 1, + to: 31, + autofix: 'pad', + overwrite: true, + }); + + masked.value = '12'; + assert.strictEqual(masked.value, '12'); + + masked.splice(0, 0, '3', DIRECTION.NONE, { input: true, raw: true }); + assert.strictEqual(masked.value, '31'); + + masked.splice(0, 0, '4', DIRECTION.NONE, { input: true, raw: true }); + assert.strictEqual(masked.value, '04'); + }); }); describe('#splice', function () {