imask
Version:
vanilla javascript input mask
76 lines (65 loc) • 1.89 kB
JavaScript
import MaskedPattern from './pattern.js';
import PatternGroup from './pattern/group.js';
export default
class MaskedDate extends MaskedPattern {
constructor (opts) {
super({
...MaskedDate.DEFAULTS,
...opts
});
}
_update (opts) {
if (opts.mask === Date) delete opts.mask;
if (opts.pattern) {
opts.mask = opts.pattern;
delete opts.pattern;
}
const groups = opts.groups;
opts.groups = Object.assign({}, MaskedDate.GET_DEFAULT_GROUPS());
// adjust year group
if (opts.min) opts.groups.Y.from = opts.min.getFullYear();
if (opts.max) opts.groups.Y.to = opts.max.getFullYear();
Object.assign(opts.groups, groups);
super._update(opts);
}
doValidate (soft) {
const valid = super.doValidate(soft);
const date = this.date;
return valid &&
(!this.isComplete ||
this.isDateExist(this.value) && date &&
(this.min == null || this.min <= date) &&
(this.max == null || date <= this.max));
}
isDateExist (str) {
return this.format(this.parse(str)) === str;
}
get date () {
return this.isComplete ?
this.parse(this.value) :
null;
}
set date (date) {
this.value = this.format(date);
}
}
MaskedDate.DEFAULTS = {
pattern: 'd{.}`m{.}`Y',
format: date => {
const day = ('' + date.getDate()).padStart(2, '0');
const month = ('' + (date.getMonth() + 1)).padStart(2, '0');
const year = date.getFullYear();
return [day, month, year].join('.');
},
parse: str => {
const [day, month, year] = str.split('.');
return new Date(year, month - 1, day);
},
};
MaskedDate.GET_DEFAULT_GROUPS = () => {
return {
d: new PatternGroup.Range([1, 31]),
m: new PatternGroup.Range([1, 12]),
Y: new PatternGroup.Range([1900, 9999]),
};
}