UNPKG

@schoolbelle/common

Version:

201 lines (193 loc) 7.07 kB
import { Directive, forwardRef, NgModule } from '@angular/core'; import { FormArray, NG_VALIDATORS, FormGroup } from '@angular/forms'; import { values, isEmpty, filter } from 'lodash-es'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @param {?} targetCtrl * @return {?} */ function NoDuplicateValidatorFn(targetCtrl) { /** @type {?} */ const targetCtrlValue = targetCtrl.value; /** @type {?} */ const parent = targetCtrl.parent; if (!parent) return; /** @type {?} */ const siblingCtrlList = (parent instanceof FormArray ? parent.controls : values(parent.controls)).filter((/** * @param {?} siblingCtrl * @return {?} */ siblingCtrl => siblingCtrl !== targetCtrl)); /** @type {?} */ const siblingCtrlsWithSameValue = siblingCtrlList.filter((/** * @param {?} siblingCtrl * @return {?} */ siblingCtrl => siblingCtrl.value && siblingCtrl.value === targetCtrl.value)); /** @type {?} */ let error = null; if (siblingCtrlsWithSameValue.length !== 0) { siblingCtrlsWithSameValue.forEach((/** * @param {?} c * @return {?} */ c => c.setErrors(Object.assign({}, c.errors, { duplicate: targetCtrlValue })))); error = { duplicate: targetCtrlValue }; } if (targetCtrl.errors && targetCtrl.errors.duplicate && targetCtrl.errors.duplicate !== targetCtrlValue // had duplicate errors before and receives a different value now ) { // clear siblings old errors /** @type {?} */ const sameValueSiblingCtrlList = siblingCtrlList.filter((/** * @param {?} siblingCtrl * @return {?} */ siblingCtrl => siblingCtrl.errors && siblingCtrl.errors.duplicate === targetCtrl.errors.duplicate)); if (sameValueSiblingCtrlList.length === 1) { /** @type {?} */ const siblingCtrl = sameValueSiblingCtrlList[0]; delete siblingCtrl.errors['duplicate']; siblingCtrl.setErrors(isEmpty(siblingCtrl.errors) ? null : siblingCtrl.errors); } // clear old errors delete targetCtrl.errors['duplicate']; targetCtrl.setErrors(isEmpty(targetCtrl.errors) ? null : targetCtrl.errors); } return error; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class NoDuplicateDirective { constructor() { this.validate = NoDuplicateValidatorFn; } } NoDuplicateDirective.decorators = [ { type: Directive, args: [{ selector: '[no-duplicate][formControlName],[no-duplicate][formControl],[no-duplicate][ngModel]', providers: [ { provide: NG_VALIDATORS, useExisting: forwardRef((/** * @return {?} */ () => NoDuplicateDirective)), multi: true } ] },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class NoDuplicateModule { } NoDuplicateModule.decorators = [ { type: NgModule, args: [{ declarations: [NoDuplicateDirective], exports: [NoDuplicateDirective] },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @param {?} strOrRegexOrFn * @return {?} */ function NoDuplicateValidatorV2Fn(strOrRegexOrFn) { return (/** * @param {?} targetCtrl * @return {?} */ (targetCtrl) => { if (!targetCtrl.parent) return null; if (!(targetCtrl.parent instanceof FormGroup)) return null; /** @type {?} */ const parentCtrl = (/** @type {?} */ (targetCtrl.parent)); /** @type {?} */ const siblingCtrlList = filter(parentCtrl.controls, (/** * @param {?} ctrl * @param {?} key * @return {?} */ (ctrl, key) => { if (ctrl === targetCtrl) return false; if (typeof strOrRegexOrFn === 'function') return strOrRegexOrFn(key); else if (strOrRegexOrFn instanceof RegExp) return strOrRegexOrFn.test(key); else return key === strOrRegexOrFn; })); /** @type {?} */ const targetCtrlValue = targetCtrl.value; /** @type {?} */ const siblingCtrlsWithSameValue = siblingCtrlList.filter((/** * @param {?} siblingCtrl * @return {?} */ siblingCtrl => siblingCtrl.value && siblingCtrl.value === targetCtrl.value)); /** @type {?} */ let error = null; if (siblingCtrlsWithSameValue.length !== 0) { siblingCtrlsWithSameValue.forEach((/** * @param {?} c * @return {?} */ c => c.setErrors(Object.assign({}, c.errors, { duplicate: targetCtrlValue })))); error = { duplicate: targetCtrlValue }; } if (targetCtrl.errors && targetCtrl.errors.duplicate && targetCtrl.errors.duplicate !== targetCtrlValue // had duplicate errors before and receives a different value now ) { // clear siblings old errors /** @type {?} */ const sameValueSiblingCtrlList = siblingCtrlList.filter((/** * @param {?} siblingCtrl * @return {?} */ siblingCtrl => siblingCtrl.errors && siblingCtrl.errors.duplicate === targetCtrl.errors.duplicate)); if (sameValueSiblingCtrlList.length === 1) { /** @type {?} */ const siblingCtrl = sameValueSiblingCtrlList[0]; delete siblingCtrl.errors['duplicate']; siblingCtrl.setErrors(isEmpty(siblingCtrl.errors) ? null : siblingCtrl.errors); } // clear old errors delete targetCtrl.errors['duplicate']; targetCtrl.setErrors(isEmpty(targetCtrl.errors) ? null : targetCtrl.errors); } return error; }); } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { NoDuplicateModule, NoDuplicateDirective, NoDuplicateValidatorFn, NoDuplicateValidatorV2Fn }; //# sourceMappingURL=schoolbelle-common-no-duplicate.js.map