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
JavaScript
/**
* @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==