@uiowa/uiowa-mfk-material
Version:
mfk, uiowa-mfk
191 lines • 16.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChildren, QueryList } from '@angular/core';
import { Mfk } from '../models/mfk';
import { UiowaMfkOptionsService } from '../services/uiowa-mfk-options.service';
import { DigitOnlyDirective } from '@uiowa/digit-only';
export class MfkInputComponent {
/**
* @param {?} optionsService
*/
constructor(optionsService) {
this.optionsService = optionsService;
this._mfk = new Mfk();
this.options = [];
this.mfkChange = new EventEmitter();
}
/**
* @param {?} mfk
* @return {?}
*/
set mfk(mfk) {
this.options
.filter((/**
* @param {?} o
* @return {?}
*/
o => o.defaultValue))
.forEach((/**
* @param {?} o
* @return {?}
*/
o => {
if (!mfk[o.name]) {
mfk[o.name] = o.defaultValue;
}
}));
this._mfk = mfk;
}
/**
* @return {?}
*/
get mfk() {
this.options
.filter((/**
* @param {?} o
* @return {?}
*/
o => o.readonly))
.forEach((/**
* @param {?} o
* @return {?}
*/
o => {
this._mfk[o.name] = o.defaultValue;
}));
return this._mfk;
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.mfk) {
this.mfk = changes.mfk.currentValue;
}
if (changes.options) {
this.options = changes.options.currentValue;
this.options = this.optionsService.getOptions(this.options);
}
}
/**
* @return {?}
*/
ngOnInit() {
this.options = this.optionsService.getAllOptions();
console.log(this.options);
}
/**
* @return {?}
*/
ngAfterViewInit() { }
/**
* @param {?} e
* @return {?}
*/
paste(e) {
/** @type {?} */
const pastedInput = e.clipboardData.getData('text/plain').replace(/\D/g, '');
e.preventDefault();
if (!pastedInput) {
return;
}
if (pastedInput.length < 40) {
document.execCommand('insertText', false, pastedInput);
}
else {
this.mfk.parseString(pastedInput);
}
this.mfkChange.emit(this.mfk);
}
/**
* @param {?} e
* @return {?}
*/
onKeyup(e) {
this.mfkChange.emit(this.mfk);
if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {
return; // only numbers can trigger auto jump feature.
}
/** @type {?} */
const currentInputFieldName = e.target['name'];
if (this.mfk[currentInputFieldName].length === e.target['maxLength']) {
// auto jump to next input field when current field is full
/** @type {?} */
const currentInputFieldIndex = this.options.findIndex((/**
* @param {?} o
* @return {?}
*/
o => o.name === currentInputFieldName));
for (let i = currentInputFieldIndex + 1; i < this.options.length; i++) {
if (this.options[i].readonly) {
continue;
}
/** @type {?} */
const nextInputField = this.mfkInputFields.find((/**
* @param {?} v
* @return {?}
*/
v => v.el.nativeElement['name'] === this.options[i].name));
nextInputField.el.nativeElement.focus();
break;
}
}
}
/**
* @param {?} e
* @return {?}
*/
onKeydown(e) {
// handle "tab" key --> auto fill '0's if the input field has not completed
if (e.keyCode !== 9) {
return;
}
if (e.target['readOnly']) {
return;
}
/** @type {?} */
const maxlength = e.target['maxLength'];
while (this.mfk[e.target['name']].length < maxlength) {
this.mfk[e.target['name']] = this.mfk[e.target['name']].concat('0');
}
}
}
MfkInputComponent.decorators = [
{ type: Component, args: [{
selector: 'uiowa-mfk-input',
template: "<div id=\"mfk-container\">\r\n <div class=\"mfk-field\" fxLayout=\"row inline\" fxLayout.xs=\"column\" fxLayoutAlign=\"start center\"\r\n *ngFor=\"let option of options\" fxLayoutWrap fxLayoutGap=\"0.5%\">\r\n <mat-form-field class=\"form-control\" [ngStyle]=\"{'width.rem': option.width+0.5}\" appearance=\"outline\"\r\n floatLabel=\"always\" style=\" font-size: 14px;\">\r\n <mat-label>{{option.label}}</mat-label>\r\n <input matInput [attr.aria-label]=\"option.name\" [attr.name]=\"option.name\" [attr.maxlength]=\"option.length\"\r\n [readOnly]=\"option.readonly\" [(ngModel)]=\"mfk[option.name]\" (paste)=\"paste($event)\" (keyup)=\"onKeyup($event)\"\r\n (keydown)=\"onKeydown($event)\" inputmode=\"numeric\" pattern=\"[0-9]*\" digitOnly>\r\n </mat-form-field>\r\n\r\n\r\n </div>\r\n</div>\r\n",
styles: [":host{display:inline-flex}.mfk-field{display:flex;flex-direction:row;flex-flow:row;vertical-align:bottom;margin-right:.25rem}.mat-form-field{padding:.375rem!important;font-size:1rem;font-weight:400;font-style:normal;font-variant:normal}.mat-label{font-size:.625rem;margin-bottom:0;white-space:nowrap}"]
}] }
];
/** @nocollapse */
MfkInputComponent.ctorParameters = () => [
{ type: UiowaMfkOptionsService }
];
MfkInputComponent.propDecorators = {
mfk: [{ type: Input }],
options: [{ type: Input }],
mfkChange: [{ type: Output }],
mfkInputFields: [{ type: ViewChildren, args: [DigitOnlyDirective,] }]
};
if (false) {
/**
* @type {?}
* @private
*/
MfkInputComponent.prototype._mfk;
/** @type {?} */
MfkInputComponent.prototype.options;
/** @type {?} */
MfkInputComponent.prototype.mfkChange;
/** @type {?} */
MfkInputComponent.prototype.mfkInputFields;
/**
* @type {?}
* @private
*/
MfkInputComponent.prototype.optionsService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZrLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1aW93YS91aW93YS1tZmstbWF0ZXJpYWwvIiwic291cmNlcyI6WyJsaWIvbWZrLWlucHV0L21may1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFFTixZQUFZLEVBRVosWUFBWSxFQUNaLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT3ZELE1BQU0sT0FBTyxpQkFBaUI7Ozs7SUE0QjVCLFlBQTZCLGNBQXNDO1FBQXRDLG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQTNCM0QsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFxQmhCLFlBQU8sR0FBc0IsRUFBRSxDQUFDO1FBQy9CLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBS3dCLENBQUM7Ozs7O0lBMUJ2RSxJQUNJLEdBQUcsQ0FBQyxHQUFRO1FBQ2QsSUFBSSxDQUFDLE9BQU87YUFDVCxNQUFNOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFDO2FBQzNCLE9BQU87Ozs7UUFBQyxDQUFDLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7YUFDOUI7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENB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Q0FBeUI7O0lBcUJ6QixvQ0FBeUM7O0lBQ3pDLHNDQUE4Qzs7SUFFOUMsMkNBQzhDOzs7OztJQUVsQywyQ0FBdUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIEFmdGVyVmlld0luaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWZrIH0gZnJvbSAnLi4vbW9kZWxzL21mayc7XHJcbmltcG9ydCB7IE1ma0ZpZWxkT3B0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL21may1maWVsZC1vcHRpb24nO1xyXG5pbXBvcnQgeyBVaW93YU1ma09wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdWlvd2EtbWZrLW9wdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IERpZ2l0T25seURpcmVjdGl2ZSB9IGZyb20gJ0B1aW93YS9kaWdpdC1vbmx5JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWlvd2EtbWZrLWlucHV0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWZrLWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tZmstaW5wdXQuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZmtJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIF9tZmsgPSBuZXcgTWZrKCk7XHJcbiAgQElucHV0KClcclxuICBzZXQgbWZrKG1mazogTWZrKSB7XHJcbiAgICB0aGlzLm9wdGlvbnNcclxuICAgICAgLmZpbHRlcihvID0+IG8uZGVmYXVsdFZhbHVlKVxyXG4gICAgICAuZm9yRWFjaChvID0+IHtcclxuICAgICAgICBpZiAoIW1ma1tvLm5hbWVdKSB7XHJcbiAgICAgICAgICBtZmtbby5uYW1lXSA9IG8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5fbWZrID0gbWZrO1xyXG4gIH1cclxuICBnZXQgbWZrKCk6IE1mayB7XHJcbiAgICB0aGlzLm9wdGlvbnNcclxuICAgICAgLmZpbHRlcihvID0+IG8ucmVhZG9ubHkpXHJcbiAgICAgIC5mb3JFYWNoKG8gPT4ge1xyXG4gICAgICAgIHRoaXMuX21ma1tvLm5hbWVdID0gby5kZWZhdWx0VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuX21maztcclxuICB9XHJcbiAgQElucHV0KCkgb3B0aW9ucz86IE1ma0ZpZWxkT3B0aW9uW10gPSBbXTtcclxuICBAT3V0cHV0KCkgbWZrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZms+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oRGlnaXRPbmx5RGlyZWN0aXZlKVxyXG4gIG1ma0lucHV0RmllbGRzOiBRdWVyeUxpc3Q8RGlnaXRPbmx5RGlyZWN0aXZlPjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zU2VydmljZTogVWlvd2FNZmtPcHRpb25zU2VydmljZSkge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMubWZrKSB7XHJcbiAgICAgIHRoaXMubWZrID0gY2hhbmdlcy5tZmsuY3VycmVudFZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSBjaGFuZ2VzLm9wdGlvbnMuY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldE9wdGlvbnModGhpcy5vcHRpb25zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXRBbGxPcHRpb25zKCk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cclxuXHJcbiAgcGFzdGUoZTogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IHBhc3RlZElucHV0OiBzdHJpbmcgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpLnJlcGxhY2UoL1xcRC9nLCAnJyk7IC8vIGdldCBhIGRpZ2l0LW9ubHkgc3RyaW5nXHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAoIXBhc3RlZElucHV0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChwYXN0ZWRJbnB1dC5sZW5ndGggPCA0MCkge1xyXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCBwYXN0ZWRJbnB1dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1may5wYXJzZVN0cmluZyhwYXN0ZWRJbnB1dCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1ma0NoYW5nZS5lbWl0KHRoaXMubWZrKTtcclxuICB9XHJcblxyXG4gIG9uS2V5dXAoZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgdGhpcy5tZmtDaGFuZ2UuZW1pdCh0aGlzLm1mayk7XHJcbiAgICBpZiAoKGUua2V5Q29kZSA8IDQ4IHx8IGUua2V5Q29kZSA+IDU3KSAmJiAoZS5rZXlDb2RlIDwgOTYgfHwgZS5rZXlDb2RlID4gMTA1KSkge1xyXG4gICAgICByZXR1cm47IC8vIG9ubHkgbnVtYmVycyBjYW4gdHJpZ2dlciBhdXRvIGp1bXAgZmVhdHVyZS5cclxuICAgIH1cclxuICAgIGNvbnN0IGN1cnJlbnRJbnB1dEZpZWxkTmFtZSA9IGUudGFyZ2V0WyduYW1lJ107XHJcbiAgICBpZiAodGhpcy5tZmtbY3VycmVudElucHV0RmllbGROYW1lXS5sZW5ndGggPT09IGUudGFyZ2V0WydtYXhMZW5ndGgnXSkge1xyXG4gICAgICAvLyBhdXRvIGp1bXAgdG8gbmV4dCBpbnB1dCBmaWVsZCB3aGVuIGN1cnJlbnQgZmllbGQgaXMgZnVsbFxyXG4gICAgICBjb25zdCBjdXJyZW50SW5wdXRGaWVsZEluZGV4ID0gdGhpcy5vcHRpb25zLmZpbmRJbmRleChvID0+IG8ubmFtZSA9PT0gY3VycmVudElucHV0RmllbGROYW1lKTtcclxuICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRJbnB1dEZpZWxkSW5kZXggKyAxOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1tpXS5yZWFkb25seSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRJbnB1dEZpZWxkID0gdGhpcy5tZmtJbnB1dEZpZWxkcy5maW5kKHYgPT4gdi5lbC5uYXRpdmVFbGVtZW50WyduYW1lJ10gPT09IHRoaXMub3B0aW9uc1tpXS5uYW1lKTtcclxuICAgICAgICBuZXh0SW5wdXRGaWVsZC5lbC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAvLyBoYW5kbGUgXCJ0YWJcIiBrZXkgLS0+IGF1dG8gZmlsbCAnMCdzIGlmIHRoZSBpbnB1dCBmaWVsZCBoYXMgbm90IGNvbXBsZXRlZFxyXG4gICAgaWYgKGUua2V5Q29kZSAhPT0gOSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZS50YXJnZXRbJ3JlYWRPbmx5J10pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF4bGVuZ3RoID0gZS50YXJnZXRbJ21heExlbmd0aCddO1xyXG4gICAgd2hpbGUgKHRoaXMubWZrW2UudGFyZ2V0WyduYW1lJ11dLmxlbmd0aCA8IG1heGxlbmd0aCkge1xyXG4gICAgICB0aGlzLm1ma1tlLnRhcmdldFsnbmFtZSddXSA9IHRoaXMubWZrW2UudGFyZ2V0WyduYW1lJ11dLmNvbmNhdCgnMCcpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=