src/app/manage-learn/shared/components/entityfilter/entityfilter.component.ts
                OnInit
    
| selector | app-entityfilter | 
            
| styleUrls | ./entityfilter.component.scss | 
            
| templateUrl | ./entityfilter.component.html | 
            
                        Properties | 
                
                        Methods | 
                
constructor(localStorage: LocalStorageService, navParams: NavParams, loader: LoaderService, httpClient: HttpClient, modalCtrl: ModalController, assessmentService: AssessmentApiService, utils: UtilsService, ref: ChangeDetectorRef, kendra: KendraApiService)
                     | 
                ||||||||||||||||||||||||||||||
| 
                             
                                    Parameters :
                                     
                    
  | 
                
| addSchools | 
addSchools()
                 | 
            
| 
                     
                        Returns :          
                void
                     | 
            
| cancel | 
cancel()
                 | 
            
| 
                     
                        Returns :          
                void
                     | 
            
| checkItem | ||||
checkItem(listItem)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    void
                     | 
            
| clearEntity | 
clearEntity()
                 | 
            
| 
                     
                        Returns :          
                void
                     | 
            
| doInfinite | ||||
doInfinite(infiniteScroll)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    void
                     | 
            
| Async getTargettedEntityType | 
                    
                    getTargettedEntityType()
                 | 
            
| 
                     
                        Returns :          
                any
                     | 
            
| ngOnInit | 
ngOnInit()
                 | 
            
| 
                     
                        Returns :          
                void
                     | 
            
| onStateChange | ||||
onStateChange(event)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    void
                     | 
            
| openSelect | 
openSelect()
                 | 
            
| 
                     
                        Returns :          
                void
                     | 
            
| Async search | ||||
                    
                    search(event?)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    any
                     | 
            
| searchEntity | 
searchEntity()
                 | 
            
| 
                     
                        Returns :          
                void
                     | 
            
| toggleInfiniteScroll | ||||
toggleInfiniteScroll(e)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    void
                     | 
            
| allStates | 
                        Type :     Array<Object>
                     | 
                
| arr | 
                        Type :     []
                     | 
                
                        Default value : []
                     | 
                
| entity | 
                        Type :         any
                     | 
                
| entityList | 
| entityType | 
| index | 
                        Type :         any
                     | 
                
                        Default value : 50
                     | 
                
| infiniteScroll | 
                        Type :     IonInfiniteScroll
                     | 
                
                        Decorators : 
                        
                            @ViewChild(IonInfiniteScroll, {static: true})
                     | 
                
| isProfileAssignedWithState | 
                        Type :         boolean
                     | 
                
| limit | 
                        Type :         number
                     | 
                
                        Default value : 50
                     | 
                
| loading | 
                        Type :         boolean
                     | 
                
                        Default value : false
                     | 
                
| observationId | 
| page | 
                        Type :         number
                     | 
                
                        Default value : 1
                     | 
                
| payload | 
| profileData | 
                        Type :         any
                     | 
                
| profileMappedState | 
                        Type :         any
                     | 
                
| searchQuery | 
| searchUrl | 
| searchValue | 
                        Type :         string
                     | 
                
                        Default value : ''
                     | 
                
| selectableList | 
                        Type :         any
                     | 
                
                        Default value : []
                     | 
                
| selectedItems | 
                        Type :         any
                     | 
                
                        Default value : []
                     | 
                
| selectedListCount | 
                        Type :         object
                     | 
                
                        Default value : {
    count: 0,
  }
                     | 
                
| selectedState | 
| selectStateRef | 
                        Decorators : 
                        
                            @ViewChild('selectStateRef', {static: true})
                     | 
                
| solutionId | 
                        Type :         any
                     | 
                
| totalCount | 
                        Type :         number
                     | 
                
                        Default value : 0
                     | 
                
import { HttpClient } from '@angular/common/http';
import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';
import { LoaderService, LocalStorageService, UtilsService } from '@app/app/manage-learn/core';
import { urlConstants } from '@app/app/manage-learn/core/constants/urlConstants';
import { AssessmentApiService } from '@app/app/manage-learn/core/services/assessment-api.service';
import { KendraApiService } from '@app/app/manage-learn/core/services/kendra-api.service';
import { IonInfiniteScroll, ModalController, NavParams } from '@ionic/angular';
@Component({
  selector: 'app-entityfilter',
  templateUrl: './entityfilter.component.html',
  styleUrls: ['./entityfilter.component.scss'],
})
export class EntityfilterComponent implements OnInit {
  @ViewChild('selectStateRef', { static: true }) selectStateRef;
  @ViewChild(IonInfiniteScroll, { static: true }) infiniteScroll: IonInfiniteScroll;
  entityList;
  observationId;
  searchUrl;
  limit = 50;
  page = 1;
  totalCount = 0;
  searchValue = '';
  selectableList: any = [];
  index: any = 50;
  arr = [];
  selectedListCount = {
    count: 0,
  };
  solutionId: any;
  searchQuery;
  allStates: Array<Object>;
  profileMappedState: any;
  isProfileAssignedWithState: boolean;
  profileData: any;
  selectedState;
  loading: boolean = false;
  payload;
  entityType;
  selectedItems: any = [];
  entity:any;
  constructor(
    private localStorage: LocalStorageService,
    private navParams: NavParams,
    private loader: LoaderService,
    private httpClient: HttpClient,
    private modalCtrl: ModalController,
    private assessmentService: AssessmentApiService,
    private utils: UtilsService,
    private ref: ChangeDetectorRef,
    private kendra: KendraApiService
  ) {
    this.searchUrl = urlConstants.API_URLS.SEARCH_ENTITY;
    this.observationId = this.navParams.get('data');
    this.solutionId = this.navParams.get('solutionId');
    this.entity = this.navParams.get('entity');
    // this.localStorage
    //   .getLocalStorage('profileRole')
  }
  async getTargettedEntityType() {
    this.payload = await this.utils.getProfileInfo();
    const config = {
      url: urlConstants.API_URLS.TARGETTED_ENTITY_TYPES + this.solutionId,
      payload: this.payload,
    };
    this.kendra.post(config).subscribe(success => {
      this.entityType = success.result ? success.result._id : null;
      this.search();
    }, error => {
    })
  }
  openSelect() {
    this.profileData.stateSelected || this.profileMappedState ? this.search() : null;
    this.selectedState
      ? null
      : setTimeout(() => {
        this.selectStateRef.open();
      }, 100);
  }
  onStateChange(event) {
    if (this.profileData) {
      this.profileData.stateSelected = event;
    }
    this.searchQuery = '';
  }
  addSchools() {
    this.modalCtrl.dismiss(this.selectedItems);
    this.selectedItems = [];
  }
  clearEntity() {
    this.selectableList = [];
  }
  cancel() {
    this.modalCtrl.dismiss();
  }
  checkItem(listItem) {
    if (!listItem.selected) {
      this.selectedItems.push(listItem)
    } else {
      let indexToRemove = this.selectedItems.indexOf(listItem)
      this.selectedItems.splice(indexToRemove, 1)
    }
    listItem.selected = !listItem.selected;
    listItem.selected ? this.selectedListCount.count++ : this.selectedListCount.count--;
  }
  async search(event?) {
    let payload = await this.utils.getProfileInfo();
    !event ? this.loader.startLoader() : '';
    this.page = !event ? 1 : this.page + 1;
    let apiUrl =
      this.searchUrl +
      '?observationId=' +
      this.observationId +
      '&search=' +
      encodeURIComponent(this.searchQuery ? this.searchQuery : '') +
      '&page=' +
      this.page +
      '&limit=' +
      this.limit;
    apiUrl =
      apiUrl +
      `&parentEntityId=${encodeURIComponent(
        this.entityType
        // this.isProfileAssignedWithState ? this.profileMappedState : this.selectedState
      )}`;
    this.loading = true;
    const config = {
      url: apiUrl,
      payload: payload,
    };
    this.assessmentService.post(config).subscribe(
      (success) => {
        this.loading = false;
        this.selectableList = !event ? [] : this.selectableList;
        for (let i = 0; i < success.result[0].data.length; i++) {
          success.result[0].data[i].isSelected = success.result[0].data[i].selected;
          success.result[0].data[i].preSelected = success.result[0].data[i].selected ? true : false;
        }
        this.totalCount = success.result[0].count;
        if (this.selectedItems.length) {
          if (!event) {
            if (this.searchQuery === "") {
              this.selectableList = [...this.selectedItems, ...success.result[0].data];
            } else {
              this.selectableList = [...this.selectableList, ...success.result[0].data];
            }
          } else {
            this.selectableList.forEach((element) => {
              this.selectedItems.forEach((item) => {
                if (element._id === item._id) {
                  let indexToReplace = this.selectableList.indexOf(element);
                  this.selectableList.splice(indexToReplace, 1, item)
                }
              })
            })
            this.selectableList = [...this.selectableList, ...success.result[0].data];
          }
        } else {
          this.selectableList = [...this.selectableList, ...success.result[0].data];
        }
        !event ? this.loader.stopLoader() : this.toggleInfiniteScroll(event);
      },
      (error) => {
        this.loading = false;
        !event ? this.loader.stopLoader() : this.toggleInfiniteScroll(event);
      }
    );
  }
  toggleInfiniteScroll(e) {
    e.target.complete()
  }
  doInfinite(infiniteScroll) {
    setTimeout(() => {
      this.search(infiniteScroll);
    }, 500);
  }
  searchEntity() {
    this.selectableList = [];
    this.search();
  }
  ngOnInit() {
    this.getTargettedEntityType();
  }
}
    <ion-header>
  <ion-toolbar>
    <div class="_flex-box searchCard">
      <ion-searchbar
        debounce="500"
        (keyup.enter)="searchEntity()"
        [(ngModel)]="searchQuery"
        placeholder="Search {{entity}} "
        (ionClear)="searchQuery = ''; searchEntity()"
      ></ion-searchbar>
      <ion-button ion-button icon-only (click)="searchEntity()" class="serachBtn">
        <ion-icon role="button" aria-label="search" name="search" class="searchIcon"></ion-icon>
      </ion-button>
    </div>
  </ion-toolbar>
</ion-header>
<ion-content padding [ngStyle]="{ 'margin-top': profileMappedState ? '0px' : '50px' }">
  <div>
    <ion-list *ngIf="selectableList && selectableList?.length" (ionScroll)="detectBottom()">
      <ng-container *ngFor="let listItem of selectableList">
        <ion-item *ngIf="!listItem.isSelected">
          <ion-label text-wrap>{{ listItem.name }}</ion-label>
          <ion-checkbox color="dark" checked="{{ listItem.selected }}" (ionChange)="checkItem(listItem)"></ion-checkbox>
        </ion-item>
      </ng-container>
    </ion-list>
    <ion-list *ngIf="!selectableList?.length ">
      <div class="_flex-box _justify-content-center noDataMsg">
        {{ 'FRMELEMNTS_MSG_NO_SCHOOL_FOUND' |  translate:{'entity': entity} }}
      </div>
    </ion-list>
  </div>
  <div *ngIf="!(this.selectableList?.length == totalCount) && this.selectableList?.length > 0">
    <ion-infinite-scroll
      #infiniteScroll
      [enabled]="!(this.selectableList?.length == totalCount) && this.selectableList?.length > 0"
      (ionInfinite)="doInfinite($event)"
    >
      <ion-infinite-scroll-content loadingSpinner="bubbles" loadingText="Loading more data...">
      </ion-infinite-scroll-content>
    </ion-infinite-scroll>
  </div>
</ion-content>
<ion-footer no-shadow>
  <ion-toolbar class="_toolbar-background-md" position="bottom">
    <ion-row>
      <ion-col>
        <ion-button ion-button full (click)="cancel()" class="w-100 custom-btn-txt-transform-none">
          <ion-icon role="button" name="close" attr.aria-label="{{ 'CANCEL' | translate }}" margin-right></ion-icon>
          {{ 'CANCEL' | translate }}
        </ion-button>
      </ion-col>
      <ion-col>
        <ion-button ion-button full (click)="addSchools()" class="w-100 custom-btn-txt-transform-none" [disabled]="selectedListCount.count === 0">
          <ion-icon role="button" name="add" attr.aria-label="{{ 'FRMELEMENTS_BTN_ADD' | translate }}" margin-right></ion-icon>
          {{ 'FRMELEMENTS_BTN_ADD' | translate }}
        </ion-button>
      </ion-col>
    </ion-row>
  </ion-toolbar>
</ion-footer>
    
                    ./entityfilter.component.scss
                
@import 'src/assets/styles/_variables.scss';
.seacrhInput {
  padding-left: 15px;
  border: 1px solid $gray-100 !important;
  // background-color: $white-color !important;
}
.toolbar-background-md {
  background-color: $white-color;
}
.serachBar {
  flex: 1;
}
.labelAdj {
  color: $black-color !important;
}