import { Component, ElementRef, EventEmitter, Input, OnInit, Output, Renderer2, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
interface configurations{
isContainImages: boolean;
chosenField: string;
singleSelection:boolean;
}
interface CheckAllCheckbox{
isSelected:boolean;
}
interface ToggleMenu{
isClicked: boolean;
}
interface AllSelected{
isMasterSelected:boolean
}
interface CheckedItems{
dataChecked: string[];
dataDisplayed: string[];
}
@Component({
selector: 'multi-select',
template: `
`
})
export class MultiSelectComponent implements OnInit {
//Inputs
@Input() data:any =[];
@Input() configurations;
@Input() customStyle: any;
@ViewChild('selectMenu') selectMenu?: ElementRef;
//Outputs
@Output() onCheckAllClick: EventEmitter =new EventEmitter();
@Output() onToggleMenu: EventEmitter =new EventEmitter();
@Output() onAllSelected: EventEmitter=new EventEmitter();
@Output() onItemsChecked: EventEmitter=new EventEmitter();
isClicked=false;
isMasterSel=false;
checkedDataList:any;
selectedData:any;
length=0;
filterdData :any=[];
filteredData:any;
myForm?: any;
formValue?:any;
constructor(private formBuilder: FormBuilder,private renderer: Renderer2) {}
// Getter method to access formcontrols
get dataName() {
return this.formValue?.get('dataName');
}
ngOnInit(): void {
this.getCheckedDataList();
this.filterdData=this.data;
this.formValue=this.formBuilder.group({
dataName:['']
});
}
//Function to close and open menu whenever the close button is closed or the menu arrow is clicked
toggleMenu():void{
this.isClicked=!this.isClicked;
this.onToggleMenu.emit({isClicked:this.isClicked});
}
//Function triggered on the check all checkbox to select all checkboxes in the menu
checkUncheckAll(){
for (let i = 0; i < this.data.length; i++) {
this.data[i].isSelected = this.isMasterSel;
}
this.getCheckedDataList();
this. onCheckAllClick.emit({isSelected:this.isMasterSel});
}
//Function triggered when all menu items are checked and the effect must be reflected on the check all checkbox
isAllSelected(selectedDataId: any) {
if(!this.configurations.singleSelection){
this.isMasterSel = this.data.every(function(city:any) {
return city.isSelected == true;
})
}
else{
for(let i=0;i3){
this.length=this.selectedData.length;
this.selectedData= this.length + " items Selected"
}
this.checkedDataList = JSON.stringify(this.checkedDataList);
this.selectedData =JSON.parse( JSON.stringify(this.selectedData));
this.onItemsChecked.emit({dataChecked:this.checkedDataList, dataDisplayed:this.selectedData});
}
//Function triggered when a search in conducted in the search box of the menu
filterCities() {
this.filterdData = this.filteredData===""? this.data : this.data.filter(
item => {return item.name.toLowerCase().includes(this.filteredData.toLowerCase())}
);
}
}