@schoolbelle/common
Version:
201 lines (193 loc) • 7.07 kB
JavaScript
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