UNPKG

ngx-file-required

Version:
189 lines (188 loc) 14.7 kB
/** * @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=