File upload plugin doesn't show an error when selecting extr


Topic: File upload plugin doesn't show an error when selecting extra files

Lawman pro premium priority asked a year 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>

r.seifert answered a year 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.


Lawman pro premium priority commented a year ago

Please, add the future. Really need. We will wait. Thanks


Please insert min. 20 characters.

FREE CONSULTATION

Hire our experts to build a dedicated project. We'll analyze your business requirements, for free.

Status

Answered

Specification of the issue
  • User: Pro
  • 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