UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

206 lines 18.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, Output, Optional, Self } from '@angular/core'; import { NUMBER, SPACE } from '../../models/mask.constants'; import { NgControl } from '@angular/forms'; import { AbstractFormControl } from '../../models/abstract-form-control'; import { LabelReplacementTag } from '../../models/error-message.interface'; /** * This component reports the following errors. * required * invalid * duplicate * * These messages can be changed by updated messages using the errorMessages interface * Ex. { required: 'This field is required', invalid: '{label} is invalid' } */ export class SinComponent extends AbstractFormControl { /** * @param {?} controlDir */ constructor(controlDir) { super(); this.controlDir = controlDir; this._defaultErrMsg = { required: `${LabelReplacementTag} is required.`, invalid: `${LabelReplacementTag} is invalid.`, duplicate: `${LabelReplacementTag} was already used for another family member.` }; this.sin = ''; this.label = 'Social Insurance Number (SIN)'; this.maxlength = '15'; this.placeholder = '111 111 111'; this.labelforId = 'sin_' + this.objectId; this.valueChange = new EventEmitter(); this.blur = new EventEmitter(); if (controlDir) { controlDir.valueAccessor = this; } this.mask = [NUMBER, NUMBER, NUMBER, SPACE, NUMBER, NUMBER, NUMBER, SPACE, NUMBER, NUMBER, NUMBER]; } /** * @param {?} val * @return {?} */ set value(val) { if (val) { this.sin = val; } } /** * @return {?} */ get value() { return this.sin; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); this.registerValidation(this.controlDir, this.validateSelf); } /** * @param {?} value * @return {?} */ onValueChange(value) { if (value !== this.sin) { // IE fix when focus does not display required error this.sin = value; this._onChange(value); this.valueChange.emit(value); } } /** * @param {?} event * @return {?} */ onBlur(event) { this._onTouched(event); this.blur.emit(event); } /** * @param {?} value * @return {?} */ writeValue(value) { if (value) { this.sin = value; } } /** * @private * @return {?} */ validateSelf() { /** @type {?} */ const validateResult = this.validateSin(); if (validateResult) { return validateResult; } return null; } /** * @private * @return {?} */ validateSin() { if (this.sin && this.sin.trim().length > 0) { // Init weights and other stuff /** @type {?} */ const weights = [1, 2, 1, 2, 1, 2, 1, 2, 1]; /** @type {?} */ let sum = 0; // Clean up string /** @type {?} */ const value = this.sin.trim(); this.sin = value .replace(/_/g, '') // remove underlines .replace(/\s/g, ''); // spaces // Test for length if (this.sin.length !== 9) { return { 'invalid': true }; } // Test for string of zeros if (this.sin === '000000000') { return { 'invalid': true }; } // Test for SINs that begin with 0 if (this.sin[0] === '0') { return { 'invalid': true }; } // Walk through each character for (let i = 0; i < this.sin.length; i++) { // pull out char /** @type {?} */ const char = this.sin.charAt(i); // parse the number /** @type {?} */ const num = Number(char); if (Number.isNaN(num)) { return { 'invalid': true }; } // multiply the value against the weight /** @type {?} */ let result = num * weights[i]; // If two digit result, substract 9 if (result > 9) { result = result - 9; } // add it to our sum sum += result; } // The sum must be divisible by 10 if (sum % 10 !== 0) { return { 'invalid': true }; } } return null; } } SinComponent.decorators = [ { type: Component, args: [{ selector: 'common-sin', template: "\r\n<label for=\"{{labelforId}}\" class=\"control-label\">{{label}}</label>\r\n<input class=\"form-control\"\r\n spellcheck=\"false\"\r\n id=\"{{labelforId}}\"\r\n [ngModel]=\"sin\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [placeholder]=\"placeholder\"\r\n [textMask]=\"{mask: mask}\"\r\n [disabled]=\"disabled\"\r\n [maxlength]=\"maxlength\"\r\n autocomplete=\"off\"/>\r\n\r\n\r\n <!-- Error messages for input -->\r\n <common-error-container\r\n [displayError]=\"controlDir && !disabled && (controlDir.touched || controlDir.dirty) && controlDir.errors\">\r\n <div *ngIf=\"controlDir.errors?.required\">\r\n {{_defaultErrMsg.required}}\r\n </div>\r\n <div *ngIf=\"controlDir.errors?.invalid\">\r\n {{_defaultErrMsg.invalid}}\r\n </div>\r\n <div *ngIf=\"controlDir.errors?.duplicate\">\r\n {{_defaultErrMsg.duplicate}}\r\n </div>\r\n </common-error-container>\r\n\r\n", styles: [""] }] } ]; /** @nocollapse */ SinComponent.ctorParameters = () => [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }] } ]; SinComponent.propDecorators = { label: [{ type: Input }], maxlength: [{ type: Input }], placeholder: [{ type: Input }], labelforId: [{ type: Input }], value: [{ type: Input }], valueChange: [{ type: Output }], blur: [{ type: Output }] }; if (false) { /** @type {?} */ SinComponent.prototype._defaultErrMsg; /** @type {?} */ SinComponent.prototype.sin; /** @type {?} */ SinComponent.prototype.mask; /** @type {?} */ SinComponent.prototype.label; /** @type {?} */ SinComponent.prototype.maxlength; /** @type {?} */ SinComponent.prototype.placeholder; /** @type {?} */ SinComponent.prototype.labelforId; /** @type {?} */ SinComponent.prototype.valueChange; /** @type {?} */ SinComponent.prototype.blur; /** @type {?} */ SinComponent.prototype.controlDir; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc2luL3Npbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFnQixNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7O0FBaUJ6RixNQUFNLE9BQU8sWUFBYSxTQUFRLG1CQUFtQjs7OztJQTZCbkQsWUFBd0MsVUFBcUI7UUFDM0QsS0FBSyxFQUFFLENBQUM7UUFEOEIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQTNCN0QsbUJBQWMsR0FBaUI7WUFDN0IsUUFBUSxFQUFFLEdBQUcsbUJBQW1CLGVBQWU7WUFDL0MsT0FBTyxFQUFFLEdBQUcsbUJBQW1CLGNBQWM7WUFDN0MsU0FBUyxFQUFFLEdBQUcsbUJBQW1CLDhDQUE4QztTQUNoRixDQUFDO1FBRUYsUUFBRyxHQUFXLEVBQUUsQ0FBQztRQUdSLFVBQUssR0FBVywrQkFBK0IsQ0FBQztRQUNoRCxjQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3pCLGdCQUFXLEdBQVcsYUFBYSxDQUFDO1FBQ3BDLGVBQVUsR0FBVyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQVkzQyxnQkFBVyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQy9ELFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztR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QUM3QyxrQ0FBcUQ7O0lBWXJELG1DQUF5RTs7SUFDekUsNEJBQTREOztJQUUvQyxrQ0FBZ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgT3B0aW9uYWwsIFNlbGYsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5VTUJFUiwgU1BBQ0UgfSBmcm9tICcuLi8uLi9tb2RlbHMvbWFzay5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbnRyb2wgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWJzdHJhY3QtZm9ybS1jb250cm9sJztcclxuaW1wb3J0IHsgTGFiZWxSZXBsYWNlbWVudFRhZywgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Vycm9yLW1lc3NhZ2UuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNvbXBvbmVudCByZXBvcnRzIHRoZSBmb2xsb3dpbmcgZXJyb3JzLlxyXG4gKiAgICByZXF1aXJlZFxyXG4gKiAgICBpbnZhbGlkXHJcbiAqICAgIGR1cGxpY2F0ZVxyXG4gKlxyXG4gKiAgVGhlc2UgbWVzc2FnZXMgY2FuIGJlIGNoYW5nZWQgYnkgdXBkYXRlZCBtZXNzYWdlcyB1c2luZyB0aGUgZXJyb3JNZXNzYWdlcyBpbnRlcmZhY2VcclxuICogIEV4LiB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIGludmFsaWQ6ICd7bGFiZWx9IGlzIGludmFsaWQnIH1cclxuICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvbW1vbi1zaW4nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW4uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Npbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW5Db21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db250cm9sIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgX2RlZmF1bHRFcnJNc2c6IEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHJlcXVpcmVkOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSBpcyByZXF1aXJlZC5gLFxyXG4gICAgaW52YWxpZDogYCR7TGFiZWxSZXBsYWNlbWVudFRhZ30gaXMgaW52YWxpZC5gLFxyXG4gICAgZHVwbGljYXRlOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSB3YXMgYWxyZWFkeSB1c2VkIGZvciBhbm90aGVyIGZhbWlseSBtZW1iZXIuYFxyXG4gIH07XHJcblxyXG4gIHNpbjogc3RyaW5nID0gJyc7XHJcbiAgbWFzazogYW55O1xyXG5cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJ1NvY2lhbCBJbnN1cmFuY2UgTnVtYmVyIChTSU4pJztcclxuICBASW5wdXQoKSBtYXhsZW5ndGg6IHN0cmluZyA9ICcxNSc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcxMTEgMTExIDExMSc7XHJcbiAgQElucHV0KCkgbGFiZWxmb3JJZDogc3RyaW5nID0gJ3Npbl8nICsgdGhpcy5vYmplY3RJZDtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUoIHZhbDogc3RyaW5nICkge1xyXG4gICAgaWYgKCB2YWwgKSB7XHJcbiAgICAgIHRoaXMuc2luID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaW47XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBjb250cm9sRGlyOiBOZ0NvbnRyb2wgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKCBjb250cm9sRGlyICkge1xyXG4gICAgICBjb250cm9sRGlyLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFzayA9XHJcbiAgICBbTlVNQkVSLCBOVU1CRVIsIE5VTUJFUiwgU1BBQ0UsIE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIFNQQUNFLCBOVU1CRVIsIE5VTUJFUiwgTlVNQkVSXTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdGlvbiggdGhpcy5jb250cm9sRGlyLCB0aGlzLnZhbGlkYXRlU2VsZiApO1xyXG4gIH1cclxuXHJcbiAgb25WYWx1ZUNoYW5nZSggdmFsdWU6IGFueSApIHtcclxuXHJcbiAgICBpZiAoIHZhbHVlICE9PSB0aGlzLnNpbiApIHsgLy8gSUUgZml4IHdoZW4gZm9jdXMgZG9lcyBub3QgZGlzcGxheSByZXF1aXJlZCBlcnJvclxyXG4gICAgICB0aGlzLnNpbiA9IHZhbHVlO1xyXG4gICAgICB0aGlzLl9vbkNoYW5nZSggdmFsdWUgKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCB2YWx1ZSApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CbHVyKCBldmVudDogYW55ICkge1xyXG4gICAgdGhpcy5fb25Ub3VjaGVkKCBldmVudCApO1xyXG4gICAgdGhpcy5ibHVyLmVtaXQoIGV2ZW50ICk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKCB2YWx1ZTogYW55ICk6IHZvaWQge1xyXG4gICAgaWYgKCB2YWx1ZSApIHtcclxuICAgICAgdGhpcy5zaW4gPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxmKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0ZVJlc3VsdCA9IHRoaXMudmFsaWRhdGVTaW4oKTtcclxuICAgIGlmICggdmFsaWRhdGVSZXN1bHQgKSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0ZVJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gICB9XHJcblxyXG4gICBwcml2YXRlIHZhbGlkYXRlU2luKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuXHJcbiAgICBpZiAoIHRoaXMuc2luICYmIHRoaXMuc2luLnRyaW0oKS5sZW5ndGggPiAwICkge1xyXG5cclxuICAgICAgLy8gSW5pdCB3ZWlnaHRzIGFuZCBvdGhlciBzdHVmZlxyXG4gICAgICBjb25zdCB3ZWlnaHRzOiBudW1iZXJbXSA9IFsxLCAyLCAxLCAyLCAxLCAyLCAxLCAyLCAxXTtcclxuICAgICAgbGV0IHN1bSA9IDA7XHJcblxyXG4gICAgICAvLyBDbGVhbiB1cCBzdHJpbmdcclxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpbi50cmltKCk7XHJcbiAgICAgIHRoaXMuc2luID0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL18vZywgJycpIC8vIHJlbW92ZSB1bmRlcmxpbmVzXHJcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBzcGFjZXNcclxuXHJcbiAgICAgIC8vIFRlc3QgZm9yIGxlbmd0aFxyXG4gICAgICBpZiAodGhpcy5zaW4ubGVuZ3RoICE9PSA5KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRlc3QgZm9yIHN0cmluZyBvZiB6ZXJvc1xyXG4gICAgICBpZiAoIHRoaXMuc2luID09PSAnMDAwMDAwMDAwJykge1xyXG4gICAgICAgIHJldHVybiB7ICdpbnZhbGlkJzogdHJ1ZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUZXN0IGZvciBTSU5zIHRoYXQgYmVnaW4gd2l0aCAwXHJcbiAgICAgIGlmICh0aGlzLnNpblswXSA9PT0gJzAnKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGNoYXJhY3RlclxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2luLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgICAgIC8vIHB1bGwgb3V0IGNoYXJcclxuICAgICAgICBjb25zdCBjaGFyID0gdGhpcy5zaW4uY2hhckF0KGkpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgbnVtYmVyXHJcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKGNoYXIpO1xyXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtdWx0aXBseSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgd2VpZ2h0XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bSAqIHdlaWdodHNbaV07XHJcblxyXG4gICAgICAgIC8vIElmIHR3byBkaWdpdCByZXN1bHQsIHN1YnN0cmFjdCA5XHJcbiAgICAgICAgaWYgKHJlc3VsdCA+IDkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAtIDk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgaXQgdG8gb3VyIHN1bVxyXG4gICAgICAgIHN1bSArPSByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZSBzdW0gbXVzdCBiZSBkaXZpc2libGUgYnkgMTBcclxuICAgICAgaWYgKHN1bSAlIDEwICE9PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==