UNPKG

moh-common-lib

Version:

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

235 lines 19.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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' } */ var SinComponent = /** @class */ (function (_super) { tslib_1.__extends(SinComponent, _super); function SinComponent(controlDir) { var _this = _super.call(this) || this; _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]; return _this; } Object.defineProperty(SinComponent.prototype, "value", { get: /** * @return {?} */ function () { return this.sin; }, set: /** * @param {?} val * @return {?} */ function (val) { if (val) { this.sin = val; } }, enumerable: true, configurable: true }); /** * @return {?} */ SinComponent.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); this.registerValidation(this.controlDir, this.validateSelf); }; /** * @param {?} value * @return {?} */ SinComponent.prototype.onValueChange = /** * @param {?} value * @return {?} */ function (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 {?} */ SinComponent.prototype.onBlur = /** * @param {?} event * @return {?} */ function (event) { this._onTouched(event); this.blur.emit(event); }; /** * @param {?} value * @return {?} */ SinComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (value) { this.sin = value; } }; /** * @private * @return {?} */ SinComponent.prototype.validateSelf = /** * @private * @return {?} */ function () { /** @type {?} */ var validateResult = this.validateSin(); if (validateResult) { return validateResult; } return null; }; /** * @private * @return {?} */ SinComponent.prototype.validateSin = /** * @private * @return {?} */ function () { if (this.sin && this.sin.trim().length > 0) { // Init weights and other stuff /** @type {?} */ var weights = [1, 2, 1, 2, 1, 2, 1, 2, 1]; /** @type {?} */ var sum = 0; // Clean up string /** @type {?} */ var 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 (var i = 0; i < this.sin.length; i++) { // pull out char /** @type {?} */ var char = this.sin.charAt(i); // parse the number /** @type {?} */ var num = Number(char); if (Number.isNaN(num)) { return { 'invalid': true }; } // multiply the value against the weight /** @type {?} */ var 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 = function () { return [ { 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 }] }; return SinComponent; }(AbstractFormControl)); export { SinComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc2luL3Npbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0IsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7Ozs7OztBQVl6RjtJQUtrQyx3Q0FBbUI7SUE2Qm5ELHNCQUF3QyxVQUFxQjtRQUE3RCxZQUNFLGlCQUFPLFNBT1I7UUFSdUMsZ0JBQVUsR0FBVixVQUFVLENBQVc7UUEzQjdELG9CQUFjLEdBQWlCO1lBQzdCLFFBQVEsRUFBSyxtQkFBbUIsa0JBQWU7WUFDL0MsT0FBTyxFQUFLLG1CQUFtQixpQkFBYztZQUM3QyxTQUFTLEVBQUssbUJBQW1CLGlEQUE4QztTQUNoRixDQUFDO1FBRUYsU0FBRyxHQUFXLEVBQUUsQ0FBQztRQUdSLFdBQUssR0FBVywrQkFBK0IsQ0FBQztRQUNoRCxlQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3pCLGlCQUFXLEdBQVcsYUFBYSxDQUFDO1FBQ3BDLGdCQUFVLEdBQVcsTUFBTSxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUM7UUFZM0MsaUJBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMvRCxVQUFJLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFJMUQsSUFBSyxVQUFVLEVBQUc7WUFDaEIs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QUFZOzs7SUFFdkIsc0NBSUU7O0lBRUYsMkJBQWlCOztJQUNqQiw0QkFBVTs7SUFFViw2QkFBeUQ7O0lBQ3pELGlDQUFrQzs7SUFDbEMsbUNBQTZDOztJQUM3QyxrQ0FBcUQ7O0lBWXJELG1DQUF5RTs7SUFDekUsNEJBQTREOztJQUUvQyxrQ0FBZ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgT3B0aW9uYWwsIFNlbGYsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5VTUJFUiwgU1BBQ0UgfSBmcm9tICcuLi8uLi9tb2RlbHMvbWFzay5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbnRyb2wgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWJzdHJhY3QtZm9ybS1jb250cm9sJztcclxuaW1wb3J0IHsgTGFiZWxSZXBsYWNlbWVudFRhZywgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Vycm9yLW1lc3NhZ2UuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNvbXBvbmVudCByZXBvcnRzIHRoZSBmb2xsb3dpbmcgZXJyb3JzLlxyXG4gKiAgICByZXF1aXJlZFxyXG4gKiAgICBpbnZhbGlkXHJcbiAqICAgIGR1cGxpY2F0ZVxyXG4gKlxyXG4gKiAgVGhlc2UgbWVzc2FnZXMgY2FuIGJlIGNoYW5nZWQgYnkgdXBkYXRlZCBtZXNzYWdlcyB1c2luZyB0aGUgZXJyb3JNZXNzYWdlcyBpbnRlcmZhY2VcclxuICogIEV4LiB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIGludmFsaWQ6ICd7bGFiZWx9IGlzIGludmFsaWQnIH1cclxuICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvbW1vbi1zaW4nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW4uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Npbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW5Db21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db250cm9sIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgX2RlZmF1bHRFcnJNc2c6IEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHJlcXVpcmVkOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSBpcyByZXF1aXJlZC5gLFxyXG4gICAgaW52YWxpZDogYCR7TGFiZWxSZXBsYWNlbWVudFRhZ30gaXMgaW52YWxpZC5gLFxyXG4gICAgZHVwbGljYXRlOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSB3YXMgYWxyZWFkeSB1c2VkIGZvciBhbm90aGVyIGZhbWlseSBtZW1iZXIuYFxyXG4gIH07XHJcblxyXG4gIHNpbjogc3RyaW5nID0gJyc7XHJcbiAgbWFzazogYW55O1xyXG5cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJ1NvY2lhbCBJbnN1cmFuY2UgTnVtYmVyIChTSU4pJztcclxuICBASW5wdXQoKSBtYXhsZW5ndGg6IHN0cmluZyA9ICcxNSc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcxMTEgMTExIDExMSc7XHJcbiAgQElucHV0KCkgbGFiZWxmb3JJZDogc3RyaW5nID0gJ3Npbl8nICsgdGhpcy5vYmplY3RJZDtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUoIHZhbDogc3RyaW5nICkge1xyXG4gICAgaWYgKCB2YWwgKSB7XHJcbiAgICAgIHRoaXMuc2luID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaW47XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBjb250cm9sRGlyOiBOZ0NvbnRyb2wgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKCBjb250cm9sRGlyICkge1xyXG4gICAgICBjb250cm9sRGlyLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFzayA9XHJcbiAgICBbTlVNQkVSLCBOVU1CRVIsIE5VTUJFUiwgU1BBQ0UsIE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIFNQQUNFLCBOVU1CRVIsIE5VTUJFUiwgTlVNQkVSXTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdGlvbiggdGhpcy5jb250cm9sRGlyLCB0aGlzLnZhbGlkYXRlU2VsZiApO1xyXG4gIH1cclxuXHJcbiAgb25WYWx1ZUNoYW5nZSggdmFsdWU6IGFueSApIHtcclxuXHJcbiAgICBpZiAoIHZhbHVlICE9PSB0aGlzLnNpbiApIHsgLy8gSUUgZml4IHdoZW4gZm9jdXMgZG9lcyBub3QgZGlzcGxheSByZXF1aXJlZCBlcnJvclxyXG4gICAgICB0aGlzLnNpbiA9IHZhbHVlO1xyXG4gICAgICB0aGlzLl9vbkNoYW5nZSggdmFsdWUgKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCB2YWx1ZSApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CbHVyKCBldmVudDogYW55ICkge1xyXG4gICAgdGhpcy5fb25Ub3VjaGVkKCBldmVudCApO1xyXG4gICAgdGhpcy5ibHVyLmVtaXQoIGV2ZW50ICk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKCB2YWx1ZTogYW55ICk6IHZvaWQge1xyXG4gICAgaWYgKCB2YWx1ZSApIHtcclxuICAgICAgdGhpcy5zaW4gPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxmKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0ZVJlc3VsdCA9IHRoaXMudmFsaWRhdGVTaW4oKTtcclxuICAgIGlmICggdmFsaWRhdGVSZXN1bHQgKSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0ZVJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gICB9XHJcblxyXG4gICBwcml2YXRlIHZhbGlkYXRlU2luKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuXHJcbiAgICBpZiAoIHRoaXMuc2luICYmIHRoaXMuc2luLnRyaW0oKS5sZW5ndGggPiAwICkge1xyXG5cclxuICAgICAgLy8gSW5pdCB3ZWlnaHRzIGFuZCBvdGhlciBzdHVmZlxyXG4gICAgICBjb25zdCB3ZWlnaHRzOiBudW1iZXJbXSA9IFsxLCAyLCAxLCAyLCAxLCAyLCAxLCAyLCAxXTtcclxuICAgICAgbGV0IHN1bSA9IDA7XHJcblxyXG4gICAgICAvLyBDbGVhbiB1cCBzdHJpbmdcclxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpbi50cmltKCk7XHJcbiAgICAgIHRoaXMuc2luID0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL18vZywgJycpIC8vIHJlbW92ZSB1bmRlcmxpbmVzXHJcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBzcGFjZXNcclxuXHJcbiAgICAgIC8vIFRlc3QgZm9yIGxlbmd0aFxyXG4gICAgICBpZiAodGhpcy5zaW4ubGVuZ3RoICE9PSA5KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRlc3QgZm9yIHN0cmluZyBvZiB6ZXJvc1xyXG4gICAgICBpZiAoIHRoaXMuc2luID09PSAnMDAwMDAwMDAwJykge1xyXG4gICAgICAgIHJldHVybiB7ICdpbnZhbGlkJzogdHJ1ZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUZXN0IGZvciBTSU5zIHRoYXQgYmVnaW4gd2l0aCAwXHJcbiAgICAgIGlmICh0aGlzLnNpblswXSA9PT0gJzAnKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGNoYXJhY3RlclxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2luLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgICAgIC8vIHB1bGwgb3V0IGNoYXJcclxuICAgICAgICBjb25zdCBjaGFyID0gdGhpcy5zaW4uY2hhckF0KGkpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgbnVtYmVyXHJcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKGNoYXIpO1xyXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtdWx0aXBseSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgd2VpZ2h0XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bSAqIHdlaWdodHNbaV07XHJcblxyXG4gICAgICAgIC8vIElmIHR3byBkaWdpdCByZXN1bHQsIHN1YnN0cmFjdCA5XHJcbiAgICAgICAgaWYgKHJlc3VsdCA+IDkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAtIDk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgaXQgdG8gb3VyIHN1bVxyXG4gICAgICAgIHN1bSArPSByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZSBzdW0gbXVzdCBiZSBkaXZpc2libGUgYnkgMTBcclxuICAgICAgaWYgKHN1bSAlIDEwICE9PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWQnOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==