Topic: File upload plugin doesn't show an error when selecting extra files
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>
Add comment
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
Tags
Related topics