@clr/angular
Version:
Angular components for Clarity
101 lines • 15 kB
JavaScript
/*
* Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
* This software is released under MIT license.
* The full license information can be found in LICENSE in the root directory of this project.
*/
import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS } from '@angular/forms';
import * as i0 from "@angular/core";
export class ClrFileInputValidator {
constructor(elementRef) {
this.elementRef = elementRef;
}
validate(control) {
const files = control.value;
const fileInputElement = this.elementRef.nativeElement;
const errors = {};
// required validation (native attribute)
if (fileInputElement.required && files?.length === 0) {
errors.required = true;
}
const accept = fileInputElement.accept ? fileInputElement.accept.split(',').map(type => type.trim()) : null;
if (files?.length > 0 && (accept || this.minFileSize || this.maxFileSize)) {
for (let i = 0; i < files.length; i++) {
const file = files.item(i);
// accept validation (native attribute)
if (accept && accept.length) {
if (!this.validateAccept(file, accept)) {
errors.accept = errors.accept || [];
errors.accept.push({
name: file.name,
accept,
type: file.type || '',
extension: this.getSuffixByDepth(file.name, 2), // last up to 2 parts for reporting
});
}
}
// min file validation (custom input)
if (this.minFileSize && file.size < this.minFileSize) {
errors.minFileSize = errors.minFileSize || [];
errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });
}
// max file validation (custom input)
if (this.maxFileSize && file.size > this.maxFileSize) {
errors.maxFileSize = errors.maxFileSize || [];
errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });
}
}
}
return Object.keys(errors).length ? errors : null;
}
getSuffixByDepth(filename, depth) {
const match = filename.toLowerCase().match(new RegExp(`(\\.[^.]+){1,${depth}}$`, 'i'));
return match ? match[0] : '';
}
validateAccept(file, acceptList) {
const name = file.name.toLowerCase();
const type = (file.type || '').toLowerCase();
for (const entryRaw of acceptList) {
const entry = entryRaw.trim().toLowerCase();
if (!entry) {
continue;
}
// Extension check
if (entry.startsWith('.')) {
const depth = (entry.match(/\./g) || []).length;
if (this.getSuffixByDepth(name, depth) === entry) {
return true;
}
continue;
}
// MIME check
if (entry.endsWith('/*')) {
const prefix = entry.slice(0, entry.length - 1); // keep trailing slash
if (type.startsWith(prefix)) {
return true;
}
}
else if (entry.includes('/') && type === entry) {
return true;
}
}
return false;
}
}
ClrFileInputValidator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValidator, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
ClrFileInputValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInputValidator, selector: "input[type=\"file\"][clrFileInput]", inputs: { minFileSize: ["clrMinFileSize", "minFileSize"], maxFileSize: ["clrMaxFileSize", "maxFileSize"] }, providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValidator, decorators: [{
type: Directive,
args: [{
selector: 'input[type="file"][clrFileInput]',
providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }],
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { minFileSize: [{
type: Input,
args: ['clrMinFileSize']
}], maxFileSize: [{
type: Input,
args: ['clrMaxFileSize']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy9mb3Jtcy9maWxlLWlucHV0L2ZpbGUtaW5wdXQtdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFtQixhQUFhLEVBQStCLE1BQU0sZ0JBQWdCLENBQUM7O0FBUTdGLE1BQU0sT0FBTyxxQkFBcUI7SUFJaEMsWUFBNkIsVUFBd0M7UUFBeEMsZUFBVSxHQUFWLFVBQVUsQ0FBOEI7SUFBRyxDQUFDO0lBRXpFLFFBQVEsQ0FBQyxPQUFrQztRQUN6QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFdkQsTUFBTSxNQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUUvQyx5Q0FBeUM7UUFDekMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEQsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDeEI7UUFFRCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU1RyxJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcs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LGdCQUFnQjtnQkFDRSxXQUFXO3NCQUFuQyxLQUFLO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBCcm9hZGNvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoZSB0ZXJtIFwiQnJvYWRjb21cIiByZWZlcnMgdG8gQnJvYWRjb20gSW5jLiBhbmQvb3IgaXRzIHN1YnNpZGlhcmllcy5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBOR19WQUxJREFUT1JTLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IENsckZpbGVMaXN0VmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4vZmlsZS1pbnB1dC12YWxpZGF0b3ItZXJyb3JzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbdHlwZT1cImZpbGVcIl1bY2xyRmlsZUlucHV0XScsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IENsckZpbGVJbnB1dFZhbGlkYXRvciwgbXVsdGk6IHRydWUgfV0sXG59KVxuZXhwb3J0IGNsYXNzIENsckZpbGVJbnB1dFZhbGlkYXRvciBpbXBsZW1lbnRzIFZhbGlkYXRvciB7XG4gIEBJbnB1dCgnY2xyTWluRmlsZVNpemUnKSBtaW5GaWxlU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoJ2Nsck1heEZpbGVTaXplJykgbWF4RmlsZVNpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pIHt9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sPEZpbGVMaXN0Pik6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IGZpbGVzID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBmaWxlSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBlcnJvcnM6IENsckZpbGVMaXN0VmFsaWRhdGlvbkVycm9ycyA9IHt9O1xuXG4gICAgLy8gcmVxdWlyZWQgdmFsaWRhdGlvbiAobmF0aXZlIGF0dHJpYnV0ZSlcbiAgICBpZiAoZmlsZUlucHV0RWxlbWVudC5yZXF1aXJlZCAmJiBmaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBlcnJvcnMucmVxdWlyZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2VwdCA9IGZpbGVJbnB1dEVsZW1lbnQuYWNjZXB0ID8gZmlsZUlucHV0RWxlbWVudC5hY2NlcHQuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSkgOiBudWxsO1xuXG4gICAgaWYgKGZpbGVzPy5sZW5ndGggPiAwICYmIChhY2NlcHQgfHwgdGhpcy5taW5GaWxlU2l6ZSB8fCB0aGlzLm1heEZpbGVTaXplKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlID0gZmlsZXMuaXRlbShpKTtcblxuICAgICAgICAvLyBhY2NlcHQgdmFsaWRhdGlvbiAobmF0aXZlIGF0dHJpYnV0ZSlcbiAgICAgICAgaWYgKGFjY2VwdCAmJiBhY2NlcHQubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlQWNjZXB0KGZpbGUsIGFjY2VwdCkpIHtcbiAgICAgICAgICAgIGVycm9ycy5hY2NlcHQgPSBlcnJvcnMuYWNjZXB0IHx8IFtdO1xuICAgICAgICAgICAgZXJyb3JzLmFjY2VwdC5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgICAgICBhY2NlcHQsXG4gICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uOiB0aGlzLmdldFN1ZmZpeEJ5RGVwdGgoZmlsZS5uYW1lLCAyKSwgLy8gbGFzdCB1cCB0byAyIHBhcnRzIGZvciByZXBvcnRpbmdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1pbiBmaWxlIHZhbGlkYXRpb24gKGN1c3RvbSBpbnB1dClcbiAgICAgICAgaWYgKHRoaXMubWluRmlsZVNpemUgJiYgZmlsZS5zaXplIDwgdGhpcy5taW5GaWxlU2l6ZSkge1xuICAgICAgICAgIGVycm9ycy5taW5GaWxlU2l6ZSA9IGVycm9ycy5taW5GaWxlU2l6ZSB8fCBbXTtcbiAgICAgICAgICBlcnJvcnMubWluRmlsZVNpemUucHVzaCh7IG5hbWU6IGZpbGUubmFtZSwgbWluRmlsZVNpemU6IHRoaXMubWluRmlsZVNpemUsIGFjdHVhbEZpbGVTaXplOiBmaWxlLnNpemUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXggZmlsZSB2YWxpZGF0aW9uIChjdXN0b20gaW5wdXQpXG4gICAgICAgIGlmICh0aGlzLm1heEZpbGVTaXplICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpIHtcbiAgICAgICAgICBlcnJvcnMubWF4RmlsZVNpemUgPSBlcnJvcnMubWF4RmlsZVNpemUgfHwgW107XG4gICAgICAgICAgZXJyb3JzLm1heEZpbGVTaXplLnB1c2goeyBuYW1lOiBmaWxlLm5hbWUsIG1heEZpbGVTaXplOiB0aGlzLm1heEZpbGVTaXplLCBhY3R1YWxGaWxlU2l6ZTogZmlsZS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID8gZXJyb3JzIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VmZml4QnlEZXB0aChmaWxlbmFtZTogc3RyaW5nLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXRjaCA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkubWF0Y2gobmV3IFJlZ0V4cChgKFxcXFwuW14uXSspezEsJHtkZXB0aH19JGAsICdpJykpO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQWNjZXB0KGZpbGU6IEZpbGUsIGFjY2VwdExpc3Q6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmFtZSA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHR5cGUgPSAoZmlsZS50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeVJhdyBvZiBhY2NlcHRMaXN0KSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJ5UmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0ZW5zaW9uIGNoZWNrXG4gICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoID0gKGVudHJ5Lm1hdGNoKC9cXC4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3VmZml4QnlEZXB0aChuYW1lLCBkZXB0aCkgPT09IGVudHJ5KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE1JTUUgY2hlY2tcbiAgICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBlbnRyeS5zbGljZSgwLCBlbnRyeS5sZW5ndGggLSAxKTsgLy8ga2VlcCB0cmFpbGluZyBzbGFzaFxuICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pbmNsdWRlcygnLycpICYmIHR5cGUgPT09IGVudHJ5KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19