ngx-file-required
Version:
Angular input file required directive
224 lines (223 loc) • 16.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Input, HostListener } from '@angular/core';
import { NG_VALIDATORS } from '@angular/forms';
/** @typedef {?} */
var HTMLFileInputAttribute;
export { HTMLFileInputAttribute };
/**
* @record
*/
function FileInputEventTarget() { }
/** @type {?} */
FileInputEventTarget.prototype.files;
var NgxFileRequiredDirective = /** @class */ (function () {
function NgxFileRequiredDirective(element) {
this.requiredErrorMsg = 'File is required';
this._required = false;
this._multiple = false;
this._element = element;
}
Object.defineProperty(NgxFileRequiredDirective.prototype, "required", {
get: /**
* @return {?}
*/
function () {
return this._required || this._element.nativeElement.hasAttribute('required');
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._required = value || this._element.nativeElement.hasAttribute('required');
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxFileRequiredDirective.prototype, "multiple", {
get: /**
* @return {?}
*/
function () {
return this._element.nativeElement.hasAttribute('multiple');
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._multiple = value === '' || !!value;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxFileRequiredDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this._mutationObserver = new MutationObserver(function (mutations) {
_this._setValidity(_this._getInputValue(/** @type {?} */ (_this._element.nativeElement)));
});
this._mutationObserver.observe(this._element.nativeElement, {
attributes: true,
attributeOldValue: true,
attributeFilter: ['required']
});
};
/**
* @return {?}
*/
NgxFileRequiredDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._mutationObserver.disconnect();
};
/**
* @param {?} changes
* @return {?}
*/
NgxFileRequiredDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (this.required &&
(changes["requiredErrorMsg"] && !changes["requiredErrorMsg"].firstChange)) {
this._setValidity(this._getInputValue(/** @type {?} */ (this._element.nativeElement)));
}
};
/**
* @param {?} control
* @return {?}
*/
NgxFileRequiredDirective.prototype.validate = /**
* @param {?} control
* @return {?}
*/
function (control) {
if (!this._control) {
this._control = control;
}
if (this._hasError(this._control.value)) {
return /** @type {?} */ ({
required: this.requiredErrorMsg
});
}
};
/**
* @param {?} eventTarget
* @return {?}
*/
NgxFileRequiredDirective.prototype.onChange = /**
* @param {?} eventTarget
* @return {?}
*/
function (eventTarget) {
/** @type {?} */
var value = this._getInputValue(/** @type {?} */ (eventTarget));
this._setValidity(value);
};
/**
* @param {?} value
* @return {?}
*/
NgxFileRequiredDirective.prototype._setValidity = /**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var errors = Object.assign({}, this._control.errors);
if (this._hasError(value)) {
errors["required"] = this.requiredErrorMsg;
}
else {
if (this._control.hasError('required')) {
delete errors["required"];
}
}
this._control.setErrors(Object.keys(errors).length ? errors : null);
};
/**
* @param {?} value
* @return {?}
*/
NgxFileRequiredDirective.prototype._hasError = /**
* @param {?} value
* @return {?}
*/
function (value) {
return this.required && !this._hasValue(value);
};
/**
* @param {?} value
* @return {?}
*/
NgxFileRequiredDirective.prototype._hasValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
return this.multiple ?
value instanceof FileList && !!value.length :
value instanceof File;
};
/**
* @param {?} eventTarget
* @return {?}
*/
NgxFileRequiredDirective.prototype._getInputValue = /**
* @param {?} eventTarget
* @return {?}
*/
function (eventTarget) {
return this.multiple ? eventTarget.files : eventTarget.files.item(0);
};
NgxFileRequiredDirective.decorators = [
{ type: Directive, args: [{
selector: "\n input[type=\"file\"][attr.required][formControlName],\n input[type=\"file\"][attr.required][formControl],\n input[type=\"file\"][attr.required][ngModel],\n input[type=\"file\"][required][formControlName],\n input[type=\"file\"][required][formControl],\n input[type=\"file\"][required][ngModel]\n ",
exportAs: 'ngxFileRequiredDirective',
providers: [
{
provide: NG_VALIDATORS,
useExisting: NgxFileRequiredDirective,
multi: true
}
]
},] },
];
/** @nocollapse */
NgxFileRequiredDirective.ctorParameters = function () { return [
{ type: ElementRef }
]; };
NgxFileRequiredDirective.propDecorators = {
requiredErrorMsg: [{ type: Input }],
multiple: [{ type: Input }],
onChange: [{ type: HostListener, args: ['change', ['$event.target'],] }]
};
return NgxFileRequiredDirective;
}());
export { NgxFileRequiredDirective };
if (false) {
/** @type {?} */
NgxFileRequiredDirective.prototype.requiredErrorMsg;
/** @type {?} */
NgxFileRequiredDirective.prototype._required;
/** @type {?} */
NgxFileRequiredDirective.prototype._multiple;
/** @type {?} */
NgxFileRequiredDirective.prototype._element;
/** @type {?} */
NgxFileRequiredDirective.prototype._control;
/** @type {?} */
NgxFileRequiredDirective.prototype._mutationObserver;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpbGUtcmVxdWlyZWQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWZpbGUtcmVxdWlyZWQvIiwic291cmNlcyI6WyJsaWIvbmd4LWZpbGUtcmVxdWlyZWQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBS0wsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxhQUFhLEVBSWQsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7c0NBeURILE9BQW1CO2dDQXJCWixrQkFBa0I7eUJBV3hCLEtBQUs7eUJBRUwsS0FBSztRQVN2QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQzs7MEJBL0JmLDhDQUFROzs7OztZQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7Ozs7OztrQkFHNUQsS0FBNkI7WUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzs7OztJQU1qRixzQkFDVyw4Q0FBUTs7OztRQURuQjtZQUVFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0Q7Ozs7O2tCQUVtQixLQUE2QjtZQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQzs7OztPQUgxQzs7OztJQW9CTSwyQ0FBUTs7Ozs7UUFDYixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFDLFNBQTJCO1lBQ3hFLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSSxD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LENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O2dCQTFIeEUsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxnVUFPVDtvQkFDRCxRQUFRLEVBQUcsMEJBQTBCO29CQUNyQyxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFNLGFBQWE7NEJBQzFCLFdBQVcsRUFBRSx3QkFBd0I7NEJBQ3JDLEtBQUssRUFBUSxJQUFJO3lCQUNsQjtxQkFDRjtpQkFDRjs7OztnQkFqQ0MsVUFBVTs7O21DQTRDVCxLQUFLOzJCQUdMLEtBQUs7MkJBNERMLFlBQVksU0FBQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLENBQUM7O21DQWpIM0M7O1NBd0NhLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE5HX1ZBTElEQVRPUlMsXG4gIFZhbGlkYXRvcixcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IHR5cGUgSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSA9IGFueSB8IGJvb2xlYW47XG5pbnRlcmZhY2UgRmlsZUlucHV0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGZpbGVzOiBGaWxlTGlzdDtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bYXR0ci5yZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICBpbnB1dFt0eXBlPVwiZmlsZVwiXVthdHRyLnJlcXVpcmVkXVtmb3JtQ29udHJvbF0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bYXR0ci5yZXF1aXJlZF1bbmdNb2RlbF0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxcbiAgICBpbnB1dFt0eXBlPVwiZmlsZVwiXVtyZXF1aXJlZF1bbmdNb2RlbF1cbiAgYCxcbiAgZXhwb3J0QXM6ICAnbmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlLFxuICAgICAgbXVsdGk6ICAgICAgIHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IEhUTUxGaWxlSW5wdXRBdHRyaWJ1dGUge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCB8fCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuICB9XG5cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWUgfHwgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXF1aXJlZEVycm9yTXNnID0gJ0ZpbGUgaXMgcmVxdWlyZWQnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbXVsdGlwbGUoKTogSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJyk7XG4gIH1cblxuICBwdWJsaWMgc2V0IG11bHRpcGxlKHZhbHVlOiBIVE1MRmlsZUlucHV0QXR0cmlidXRlKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZSA9PT0gJycgfHwgISF2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbXVsdGlwbGUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICBwcml2YXRlIF9tdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuX3NldFZhbGlkaXR5KHRoaXMuX2dldElucHV0VmFsdWUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEZpbGVJbnB1dEV2ZW50VGFyZ2V0KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsncmVxdWlyZWQnXVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAoY2hhbmdlcy5yZXF1aXJlZEVycm9yTXNnICYmICFjaGFuZ2VzLnJlcXVpcmVkRXJyb3JNc2cuZmlyc3RDaGFuZ2UpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRWYWxpZGl0eSh0aGlzLl9nZXRJbnB1dFZhbHVlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBGaWxlSW5wdXRFdmVudFRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNFcnJvcih0aGlzLl9jb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWRFcnJvck1zZ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3JzO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwdWJsaWMgb25DaGFuZ2UoZXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkID0gdGhpcy5fZ2V0SW5wdXRWYWx1ZShldmVudFRhcmdldCBhcyBGaWxlSW5wdXRFdmVudFRhcmdldCk7XG4gICAgdGhpcy5fc2V0VmFsaWRpdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VmFsaWRpdHkodmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29udHJvbC5lcnJvcnMpO1xuXG4gICAgaWYgKHRoaXMuX2hhc0Vycm9yKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZEVycm9yTXNnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICBkZWxldGUgZXJyb3JzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID8gZXJyb3JzIDogbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9oYXNFcnJvcih2YWx1ZTogRmlsZXxGaWxlTGlzdHx1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5faGFzVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFzVmFsdWUodmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgP1xuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdCAmJiAhIXZhbHVlLmxlbmd0aCA6XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEZpbGU7XG4gIH1cblxuICBwcml2YXRlIF9nZXRJbnB1dFZhbHVlKGV2ZW50VGFyZ2V0OiBGaWxlSW5wdXRFdmVudFRhcmdldCk6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IGV2ZW50VGFyZ2V0LmZpbGVzIDogZXZlbnRUYXJnZXQuZmlsZXMuaXRlbSgwKTtcbiAgfVxuXG59XG4iXX0=