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())} ); } }