Skip to content

Commit

Permalink
support different length for enum
Browse files Browse the repository at this point in the history
  • Loading branch information
uNmAnNeR committed Jul 11, 2023
1 parent 1930b74 commit 607ce17
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 16 deletions.
17 changes: 3 additions & 14 deletions packages/imask/example.html
Expand Up @@ -12,20 +12,9 @@ <h1>IMask Core Demo</h1>
<!-- <script src="https://unpkg.com/imask"></script> -->
<script type="text/javascript">
const opts = {
mask: [
{ mask: '' },
{
mask: 'd % aa',
lazy: false,
blocks: {
d: {
mask: Number,
expose: true,
},
},
expose: true,
},
],
mask: IMask.MaskedEnum,
enum: ['a', 'bc', 'def'],
lazy: false,
};

var result = document.getElementById('value');
Expand Down
14 changes: 12 additions & 2 deletions packages/imask/src/masked/enum.ts
Expand Up @@ -15,6 +15,10 @@ export default
class MaskedEnum extends MaskedPattern {
declare enum: Array<string>;

constructor (opts?: MaskedEnumOptions) {
super(opts as MaskedPatternOptions); // mask will be created in _update
}

override updateOptions (opts: Partial<MaskedEnumOptions>) {
super.updateOptions(opts);
}
Expand All @@ -23,15 +27,21 @@ class MaskedEnum extends MaskedPattern {
const { enum: _enum, ...eopts }: MaskedEnumPatternOptions = opts;

if (_enum) {
eopts.mask = '*'.repeat(_enum[0].length);
const lengths = _enum.map(e => e.length);
const requiredLength = Math.min(...lengths);
const optionalLength = Math.max(...lengths) - requiredLength;

eopts.mask = '*'.repeat(requiredLength);
if (optionalLength) eopts.mask += '[' + '*'.repeat(optionalLength) + ']';

this.enum = _enum;
}

super._update(eopts);
}

override doValidate (flags: AppendFlags): boolean {
return this.enum.some(e => e.indexOf(this.unmaskedValue) >= 0) &&
return this.enum.some(e => e.indexOf(this.unmaskedValue) === 0) &&
super.doValidate(flags);
}
}
Expand Down
37 changes: 37 additions & 0 deletions packages/imask/test/masked/enum.ts
@@ -0,0 +1,37 @@
import assert from 'assert';
import { describe, it } from 'node:test';

import MaskedEnum from '../../src/masked/enum';


describe('MaskedEnum', function () {
it('should work with different length', function () {
const _enum = ['a', 'bc', 'def'];
const masked = new MaskedEnum({ enum: _enum });

_enum.forEach(e => {
masked.value = e;
assert.equal(masked.value, e);
});
});

it('should set required and optional chars', function () {
const masked = new MaskedEnum({ enum: ['a', 'bc', 'def'], lazy: false });
masked.value = '';

assert.equal(masked.value, '_');
});

it('should update options', function () {
const masked = new MaskedEnum({ enum: ['A', 'B'] });

masked.value = 'A';
assert.equal(masked.value, 'A');

masked.updateOptions({ enum: ['C', 'D'] });
assert.equal(masked.value, '');

masked.value = 'C';
assert.equal(masked.value, 'C');
});
});

0 comments on commit 607ce17

Please sign in to comment.