Topic: File upload plugin doesn't show an error when selecting extra files
                  
                  Lawman
                  priority
                  asked 2 years ago
                
Expected behavior When i select a lot files i should to get error about that
Actual behavior When I select a lot files - dialog frame is closing and further i don't get any error. (others errors i'm getting)
Resources (screenshots, code snippets etc.)
ts file:
import {Component, OnInit} from '@angular/core';
import {FormControl, FormGroup, Validators} from "@angular/forms";
import {FileUploadValidators} from "@iplab/ngx-file-upload";
import {HousesBuyProtectedService} from "../../services/houses-buy-protected.service";
import {catchError, Subscription, throwError} from "rxjs";
import {Houseforbuy} from "../../entity/houseforbuy";
import {PhotoService} from "../../services/photo.service";
import {MdbNotificationRef, MdbNotificationService} from "mdb-angular-ui-kit/notification";
import {SuccessComponent} from "../../common/toasts/success/success.component";
@Component({
  selector: 'app-property-sell-detail-protected',
  templateUrl: './property-sell-detail-protected.component.html',
  styleUrls: ['./property-sell-detail-protected.component.scss']
})
export class PropertySellDetailProtectedComponent implements OnInit {
  public animation: boolean = false
  public multiple: boolean = true
  createSellHouse: FormGroup
  files: File[] | undefined
  fileForm: FormGroup
  imageSrc: any[] = []
  image: any | undefined
  isHidden:boolean=false
  photoIdStore:number[]=[]
  photoUrlStore:string|undefined
  handlerUploadSubs:Subscription|undefined
  handlerCreateSubs:Subscription|undefined
  latitude=37.71187776619116
  longitude=-122.16758016166078
  private handlerFiles:Subscription[]=[]
  notificationRef: MdbNotificationRef<SuccessComponent> | null = null;
  sellHouseFormsArray           = [
    {id: 0,  name: "Title",         type: "text",   handler: "title",               errorMsg: "Title is required",            successMsg: "Good!",tag:"input"},
    {id: 1,  name: "Description",   type: "text",   handler: "description",         errorMsg: "Description is required",      successMsg: "Good!",tag:"textarea"},
    {id: 2,  name: "Bedrooms",      type: "number", handler: "bedrooms",            errorMsg: "Bedrooms is required",         successMsg: "Good!",tag:"checkbox"},
    {id: 3,  name: "Bathrooms",     type: "number", handler: "bathrooms",           errorMsg: "Bathrooms is required",        successMsg: "Good!",tag:"checkbox" },
    {id: 4,  name: "Square",        type: "number", handler: "square",              errorMsg: "Square is required",           successMsg: "Good!",tag:"input"},
    {id: 5,  name: "Car places",    type: "number", handler: "carPlaces",           errorMsg: "Car places is required",       successMsg: "Good!",tag:"checkbox"},
    {id: 6,  name: "Street",        type: "text",   handler: "street",              errorMsg: "Street is required",           successMsg: "Good!",tag:"input"},
    {id: 7,  name: "City",          type: "text",   handler: "city",                errorMsg: "City is required",             successMsg: "Good!",tag:"input"},
    {id: 8,  name: "State",         type: "text",   handler: "state",               errorMsg: "State is required",            successMsg: "Good!",tag:"input"},
    {id: 9,  name: "Zip code",      type: "number", handler: "zip",                 errorMsg: "zip is required",              successMsg: "Good!",tag:"input"},
    // {id: 10, name: "Contact name",  type: "text",   handler: "contactName",         errorMsg: "Contact name is required",     successMsg: "Good!",tag:"input"},
    // {id: 11, name: "Contact phone", type: "tel",    handler: "contactPhone",        errorMsg: "Contact phone is required",    successMsg: "Good!",tag:"input"},
    {id: 12, name: "Price",         type: "number", handler: "price",               errorMsg: "Price is required",            successMsg: "Good!",tag:"input"},
    {id: 13, name: "Property Type", type: "number", handler: "propertyType",        errorMsg: "Property type is required",    successMsg: "Good!",tag:"checkbox"},
    // {id: 14, name: "Land area",     type: "number", handler: "landArea",            errorMsg: "Land area is required",        successMsg: "Good!",tag:"input"},
  ]
  private filesControl = new FormControl(null,[FileUploadValidators.accept(['.jpeg','.jpg','png']), FileUploadValidators.filesLimit(2)]);
   constructor(private houseToBuy: HousesBuyProtectedService, private photoService:PhotoService,private toastr:MdbNotificationService) {
    this.createSellHouse = new FormGroup({
      title: new FormControl<string|null>(null, Validators.required),
      description: new FormControl<string|null>(null, Validators.required),
      bedrooms: new FormControl<number|null>(null, Validators.required),
      bathrooms: new FormControl<number|null>(null, Validators.required),
      square: new FormControl<number|null>(null, Validators.required),
      // landArea: new FormControl<number|null>(null, Validators.required),
      carPlaces: new FormControl<number|null>(null, Validators.required),
      street: new FormControl<string|null>(null, Validators.required),
      city: new FormControl<string|null>(null, Validators.required),
      state: new FormControl<string|null>(null, Validators.required),
      zip: new FormControl<number|null>(null, Validators.required),
      price: new FormControl<number|null>(null, Validators.required),
      propertyType: new FormControl<number|null>(null, Validators.required),
      // contactName: new FormControl<string|null>(null, Validators.required),
      // contactPhone: new FormControl<number|null>(null, Validators.required),
    })
    this.fileForm = new FormGroup({
      files: this.filesControl
    })
  }
  addFiles(files:File[]){
    this.files=files
    console.log(this.files)
  }
  removeFile(file:File){
     this.files?.splice(this.files?.indexOf(file,0))
    if(this.files!==undefined){
      this.imageSrc=[]
      this.onFileChanged(this.files)
    }
  }
  uploadError(){
     console.log("Something went wrong")
  }
  ngOnInit(): void {
  }
  ngOnDestroy():void{
    this.handlerUploadSubs?.unsubscribe()
    this.handlerCreateSubs?.unsubscribe()
    this.handlerFiles.forEach(value => value.unsubscribe())
  }
 uploadHouseImages() {
    this.files = this.fileForm.get("files")?.value
    if (this.files !== undefined) {
      this.onFileChanged(this.files)
    }
    this.files?.forEach(async file=>{
         this.handlerFiles.push(await this.photoService.createPhoto(file).subscribe({
        next: (res:{fileId:number,url:string}) => {
          this.photoIdStore?.push(res.fileId)
          this.photoUrlStore=res.url
        }
      })
         );catchError(err => throwError(() => err))
    })
  }
  onFileChanged(files: File[]) {
    files.forEach((file) => {
      const reader = new FileReader()
      reader.onload = (e) => {
        this.imageSrc?.push(e.target?.result)
      }
      reader.readAsDataURL(file)
    })
  }
  createHouseSellOffer(){
    if (this.photoIdStore!==undefined){
      console.log("Type: "+typeof this.createSellHouse.get('price')+" "+this.createSellHouse.get('price'))
      let houseDetails = new Houseforbuy([
        {
          'title'       : String(this.createSellHouse.get('title')?.value),
          'description' : String(this.createSellHouse.get('description')?.value),
          'price'       : Number(this.createSellHouse.get('price')?.value),
          'photoFileIds': this.photoIdStore,
          'street'      : String(this.createSellHouse.get('street')?.value),
          'state'       : String(this.createSellHouse.get('state')?.value),
          'city'        : String(this.createSellHouse.get('city')?.value),
          'zip'         : String(this.createSellHouse.get('zip')?.value), // 'contactName':String(this.createSellHouse.get('contactName')?.value),
          // 'contactPhone':Number(this.createSellHouse.get('contactPhone')?.value),
          'square'      : Number(this.createSellHouse.get('square')?.value),
          // 'landArea'    : Number(this.createSellHouse.get('landArea')?.value),
          'bedrooms'    : Number(this.createSellHouse.get('bedrooms')?.value),
          'bathrooms'   : Number(this.createSellHouse.get('bathrooms')?.value),
          'carPlaces'   : Number(this.createSellHouse.get('carPlaces')?.value),
          'propertyType': Number(this.createSellHouse.get('propertyType')?.value),
          location:{
            latitude:this.latitude,
            longitude:this.longitude
          }
          // 'location':{
          //   'latitude': this.latitude,
          //   'longitude': this.longitude,
          // }
        }
      ])
      if(houseDetails.items!==undefined){
        console.log(houseDetails.items[0]);
        this.handlerCreateSubs=this.houseToBuy.createSellOffer(houseDetails.items[0]).subscribe({
          next:()=>this.notificationRef=this.toastr.open(SuccessComponent,{data:{message:"Congratulations! The order have been created!"}})
        });
        catchError(err => throwError(() => err))
    } else {
      throw new Error("To create a new object please upload its photos")
    }}
  }
}
//
// 'title':String(this.createSellHouse.get('title')?.value),
//   'description':String(this.createSellHouse.get('description')?.value),
//   'price':Number(this.createSellHouse.get('price')?.value),
//   'photoFileIds':this.photoIdStore,
//   'street':String(this.createSellHouse.get('street')?.value),
//   'state':String(this.createSellHouse.get('state')?.value),
//   'city':String(this.createSellHouse.get('city')?.value),
//   'zip':String(this.createSellHouse.get('zip')?.value),
//   'contactName':String(this.createSellHouse.get('contactName')?.value),
//   'contactPhone':Number(this.createSellHouse.get('contactPhone')?.value),
//   'square':Number(this.createSellHouse.get('square')?.value),
//   'landArea':Number(this.createSellHouse.get('landArea')?.value),
//   'bedrooms':Number(this.createSellHouse.get('bedrooms')?.value),
//   'bathrooms':Number(this.createSellHouse.get('bathrooms')?.value),
//   'carPlaces':Number(this.createSellHouse.get('carPlaces')?.value),
//   'propertyType':Number(this.createSellHouse.get('propertyType')?.value),
Html file:
<app-protected-page>
  <div class="col-12 col-md-8 shadow shadow-strong-3 mx-auto mt-ste mb-auto rounded rounded-8">
    <app-present-photos [imagesUrls]="imageSrc"></app-present-photos>
<!--    [ngClass]="setMainClass(image.id)"-->
    <div>
      <form [formGroup]="fileForm" (ngSubmit)="uploadHouseImages()" [ngClass]="isHidden?'d-none':'d-block'">
        <div class="p-4 d-flex justify-content-center bg-light" >
          <mdb-file-upload  [multiple]="true" [defaultMsg]="'Drag and drop files here or click (max size 2mb and max 12 files jpeg/jpg/png )'" [quantityError]="'Too much files'"  [maxFileQuantity]="3" [height]="100" [maxFileSize]="3" [acceptedExtensions]="'.jpeg, .jpg, .png'" (fileAdded)="addFiles($event);onFileChanged($event)" (fileRemoved)="removeFile($event)" (uploadError)="uploadError()" ></mdb-file-upload>
<!--        <file-upload formControlName="files" [multiple]="multiple" [animation]="animation"></file-upload>-->
        </div>
      </form>
      <div class="d-flex justify-content-end my-2 me-3">
      <button role="button" class="btn btn-sm btn-outline-primary btn-rounded me-3" [ngClass]="isHidden?'d-block':'d-none'" (click)="isHidden=!isHidden" >
        Show files
      </button>
      <button role="button" class="btn btn-sm btn-primary btn-rounded " (click)="uploadHouseImages();isHidden=!isHidden;" >
        Upload
      </button>
      </div>
    </div>
  <form [formGroup]="createSellHouse" (ngSubmit)="createHouseSellOffer()"  class="col-8 pt-5 mx-auto pb-5">
<ng-container *ngFor="let item of sellHouseFormsArray" [ngSwitch]="item.tag">
    <mdb-form-control class="col-12 mb-4 mx-auto"  *ngSwitchCase="'input'" >
              <input mdbInput mdbValidate class="form-control"  formControlName="{{item.handler}}" type="{{item.type}}" id="{{item.handler}}sell"/>
            <label mdbLabel class="form-label" for="{{item.handler}}">{{item.name}}</label>
            <mdb-error
              *ngIf="(createSellHouse.get(item.handler)?.touched || createSellHouse.get(item.handler)?.dirty)&&createSellHouse.get(item.handler)?.invalid"
            >{{item.errorMsg}}</mdb-error>
            <mdb-success
              *ngIf="(createSellHouse.get(item.handler)?.touched || createSellHouse.get(item.handler)?.dirty)&&createSellHouse.get(item.handler)?.valid "
            >{{item.successMsg}}</mdb-success>
    </mdb-form-control>
  <mdb-form-control class="col-6  mb-4"  *ngSwitchCase="'checkbox'">
             <input mdbInput mdbValidate class="form-control col-6"  formControlName="{{item.handler}}" type="{{item.type}}" id="{{item.handler}}sell"  />
             <label mdbLabel class="form-label" for="{{item.handler}}">{{item.name}}</label>
             <mdb-error
               *ngIf="(createSellHouse.get(item.handler)?.touched || createSellHouse.get(item.handler)?.dirty)&&createSellHouse.get(item.handler)?.invalid"
             >{{item.errorMsg}}</mdb-error>
             <mdb-success
               *ngIf="(createSellHouse.get(item.handler)?.touched || createSellHouse.get(item.handler)?.dirty)&&createSellHouse.get(item.handler)?.valid "
             >{{item.successMsg}}</mdb-success>
  </mdb-form-control>
  <mdb-form-control class="col-12  mb-4 mx-auto"  *ngSwitchCase="'textarea'">
            <textarea  mdbInput mdbValidate class="form-control" id="{{item.handler}}sell" formControlName="{{item.handler}}" rows="4" ></textarea>
            <label mdbLabel class="form-label" for="{{item.handler}}">{{item.name}}</label>
            <mdb-error
              *ngIf="(createSellHouse.get(item.handler)?.touched || createSellHouse.get(item.handler)?.dirty)&&createSellHouse.get(item.handler)?.invalid"
            >{{item.errorMsg}}</mdb-error>
            <mdb-success
              *ngIf="(createSellHouse.get(item.handler)?.touched || createSellHouse.get(item.handler)?.dirty)&&createSellHouse.get(item.handler)?.valid "
            >{{item.successMsg}}</mdb-success>
    </mdb-form-control>
</ng-container>
    <div class="d-flex justify-content-end">
    <button type="button" class="btn btn-primary btn-rounded" (click)="createHouseSellOffer()" >
      Create
    </button>
    </div>
  </form>
  </div>
</app-protected-page>
                
                  
                      
                      Rafał Seifert
                      free
                        answered 2 years ago
                    
Currently we don't support errors caused by exceeding maximum file quantity. We may add it in the future and we will let you know.
FREE CONSULTATION
Hire our experts to build a dedicated project. We'll analyze your business requirements, for free.
Answered
- ForumUser: Priority
 - Premium support: Yes
 - Technology: MDB Angular
 - MDB Version: MDB5 5.0.0
 - Device: Desctope
 - Browser: Chrome
 - OS: Windows
 - Provided sample code: No
 - Provided link: No