ngx-file-required
Version:
Angular input file required directive
189 lines (188 loc) • 14.7 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;
export class NgxFileRequiredDirective {
/**
* @param {?} element
*/
constructor(element) {
this.requiredErrorMsg = 'File is required';
this._required = false;
this._multiple = false;
this._element = element;
}
/**
* @return {?}
*/
get required() {
return this._required || this._element.nativeElement.hasAttribute('required');
}
/**
* @param {?} value
* @return {?}
*/
set required(value) {
this._required = value || this._element.nativeElement.hasAttribute('required');
}
/**
* @return {?}
*/
get multiple() {
return this._element.nativeElement.hasAttribute('multiple');
}
/**
* @param {?} value
* @return {?}
*/
set multiple(value) {
this._multiple = value === '' || !!value;
}
/**
* @return {?}
*/
ngOnInit() {
this._mutationObserver = new MutationObserver((mutations) => {
this._setValidity(this._getInputValue(/** @type {?} */ (this._element.nativeElement)));
});
this._mutationObserver.observe(this._element.nativeElement, {
attributes: true,
attributeOldValue: true,
attributeFilter: ['required']
});
}
/**
* @return {?}
*/
ngOnDestroy() {
this._mutationObserver.disconnect();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.required &&
(changes["requiredErrorMsg"] && !changes["requiredErrorMsg"].firstChange)) {
this._setValidity(this._getInputValue(/** @type {?} */ (this._element.nativeElement)));
}
}
/**
* @param {?} control
* @return {?}
*/
validate(control) {
if (!this._control) {
this._control = control;
}
if (this._hasError(this._control.value)) {
return /** @type {?} */ ({
required: this.requiredErrorMsg
});
}
}
/**
* @param {?} eventTarget
* @return {?}
*/
onChange(eventTarget) {
/** @type {?} */
const value = this._getInputValue(/** @type {?} */ (eventTarget));
this._setValidity(value);
}
/**
* @param {?} value
* @return {?}
*/
_setValidity(value) {
/** @type {?} */
const 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 {?}
*/
_hasError(value) {
return this.required && !this._hasValue(value);
}
/**
* @param {?} value
* @return {?}
*/
_hasValue(value) {
return this.multiple ?
value instanceof FileList && !!value.length :
value instanceof File;
}
/**
* @param {?} eventTarget
* @return {?}
*/
_getInputValue(eventTarget) {
return this.multiple ? eventTarget.files : eventTarget.files.item(0);
}
}
NgxFileRequiredDirective.decorators = [
{ type: Directive, args: [{
selector: `
input[type="file"][attr.required][formControlName],
input[type="file"][attr.required][formControl],
input[type="file"][attr.required][ngModel],
input[type="file"][required][formControlName],
input[type="file"][required][formControl],
input[type="file"][required][ngModel]
`,
exportAs: 'ngxFileRequiredDirective',
providers: [
{
provide: NG_VALIDATORS,
useExisting: NgxFileRequiredDirective,
multi: true
}
]
},] },
];
/** @nocollapse */
NgxFileRequiredDirective.ctorParameters = () => [
{ type: ElementRef }
];
NgxFileRequiredDirective.propDecorators = {
requiredErrorMsg: [{ type: Input }],
multiple: [{ type: Input }],
onChange: [{ type: HostListener, args: ['change', ['$event.target'],] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpbGUtcmVxdWlyZWQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWZpbGUtcmVxdWlyZWQvIiwic291cmNlcyI6WyJsaWIvbmd4LWZpbGUtcmVxdWlyZWQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBS0wsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxhQUFhLEVBSWQsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQXlCeEIsTUFBTTs7OztnQkFnQ2UsT0FBbUI7Z0NBckJaLGtCQUFrQjt5QkFXeEIsS0FBSzt5QkFFTCxLQUFLO1FBU3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDOzs7OztRQS9CZixRQUFRO1FBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7O1FBR3JFLFFBQVEsQ0FBQyxLQUE2QjtRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7Ozs7O0lBTWpGLElBQ1csUUFBUTtRQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzdEOzs7OztRQUVVLFFBQVEsQ0FBQyxLQUE2QjtRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQzs7Ozs7SUFpQnBDLFFBQVE7UUFDYixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLFNBQTJCLEVBQVEsRUFBRTtZQUNsRixJQUFJLENBQUMs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QUFDLENBQUMsQ0FBQyxDQUFDOzs7O1lBMUh4RSxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFOzs7Ozs7O0dBT1Q7Z0JBQ0QsUUFBUSxFQUFHLDBCQUEwQjtnQkFDckMsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBTSxhQUFhO3dCQUMxQixXQUFXLEVBQUUsd0JBQXdCO3dCQUNyQyxLQUFLLEVBQVEsSUFBSTtxQkFDbEI7aUJBQ0Y7YUFDRjs7OztZQWpDQyxVQUFVOzs7K0JBNENULEtBQUs7dUJBR0wsS0FBSzt1QkE0REwsWUFBWSxTQUFDLFFBQVEsRUFBRSxDQUFDLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE5HX1ZBTElEQVRPUlMsXG4gIFZhbGlkYXRvcixcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IHR5cGUgSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSA9IGFueSB8IGJvb2xlYW47XG5pbnRlcmZhY2UgRmlsZUlucHV0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGZpbGVzOiBGaWxlTGlzdDtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bYXR0ci5yZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICBpbnB1dFt0eXBlPVwiZmlsZVwiXVthdHRyLnJlcXVpcmVkXVtmb3JtQ29udHJvbF0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bYXR0ci5yZXF1aXJlZF1bbmdNb2RlbF0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxcbiAgICBpbnB1dFt0eXBlPVwiZmlsZVwiXVtyZXF1aXJlZF1bbmdNb2RlbF1cbiAgYCxcbiAgZXhwb3J0QXM6ICAnbmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlLFxuICAgICAgbXVsdGk6ICAgICAgIHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IEhUTUxGaWxlSW5wdXRBdHRyaWJ1dGUge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCB8fCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuICB9XG5cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWUgfHwgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXF1aXJlZEVycm9yTXNnID0gJ0ZpbGUgaXMgcmVxdWlyZWQnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbXVsdGlwbGUoKTogSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJyk7XG4gIH1cblxuICBwdWJsaWMgc2V0IG11bHRpcGxlKHZhbHVlOiBIVE1MRmlsZUlucHV0QXR0cmlidXRlKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZSA9PT0gJycgfHwgISF2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbXVsdGlwbGUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICBwcml2YXRlIF9tdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuX3NldFZhbGlkaXR5KHRoaXMuX2dldElucHV0VmFsdWUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEZpbGVJbnB1dEV2ZW50VGFyZ2V0KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsncmVxdWlyZWQnXVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAoY2hhbmdlcy5yZXF1aXJlZEVycm9yTXNnICYmICFjaGFuZ2VzLnJlcXVpcmVkRXJyb3JNc2cuZmlyc3RDaGFuZ2UpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRWYWxpZGl0eSh0aGlzLl9nZXRJbnB1dFZhbHVlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBGaWxlSW5wdXRFdmVudFRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNFcnJvcih0aGlzLl9jb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWRFcnJvck1zZ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3JzO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwdWJsaWMgb25DaGFuZ2UoZXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkID0gdGhpcy5fZ2V0SW5wdXRWYWx1ZShldmVudFRhcmdldCBhcyBGaWxlSW5wdXRFdmVudFRhcmdldCk7XG4gICAgdGhpcy5fc2V0VmFsaWRpdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VmFsaWRpdHkodmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29udHJvbC5lcnJvcnMpO1xuXG4gICAgaWYgKHRoaXMuX2hhc0Vycm9yKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZEVycm9yTXNnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICBkZWxldGUgZXJyb3JzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID8gZXJyb3JzIDogbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9oYXNFcnJvcih2YWx1ZTogRmlsZXxGaWxlTGlzdHx1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5faGFzVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFzVmFsdWUodmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgP1xuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdCAmJiAhIXZhbHVlLmxlbmd0aCA6XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEZpbGU7XG4gIH1cblxuICBwcml2YXRlIF9nZXRJbnB1dFZhbHVlKGV2ZW50VGFyZ2V0OiBGaWxlSW5wdXRFdmVudFRhcmdldCk6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IGV2ZW50VGFyZ2V0LmZpbGVzIDogZXZlbnRUYXJnZXQuZmlsZXMuaXRlbSgwKTtcbiAgfVxuXG59XG4iXX0=