import { Injectable, OnInit } from '@angular/core'; import { FiltersDataService } from './filters-data.service'; import {FilterTemplate} from '../types/filter-template'; import {NameValue} from '../types/name-value'; import {FiltersListService} from './filters-list.service'; import {FilterChangeNotifyService} from './filter-change-notify.service'; /** * @author Harsha A.N.S */ @Injectable({ providedIn: 'root', }) export class SelectedFiltersDataService { selectedData: any[]; filtersData: any[]; list: FilterTemplate[]; ft: FilterTemplate; // for loop iteration constructor(filtersDataService: FiltersDataService, private broadcastService: FilterChangeNotifyService, private filterList: FiltersListService, private filterDataService: FiltersDataService ) { this.selectedData = new Array(); this.filtersData = filtersDataService.getAllData(); this.list = filterList.getList(); this.initObjects(); } private initObjects() { for (const property in this.filtersData) { if (this.getTypeOfFilter(property) === 'checkbox') { this.selectedData[property] = []; } else { this.selectedData[property] = ''; } } } // perhaps not using this function set defaults(template: FilterTemplate) { for (const filter of template.filterInfo) { this.selectedData[filter.name] = this.filterDataService.getData(filter.name); } } /** * @description method to send whether it is dropdown or checkbox or radio * */ getTypeOfFilter(item: any) { for (let i = 0; i < this.list.length; i++) { this.ft = this.list[i]; for (let j = 0; j < this.ft.filterInfo.length; j++) { if (item === this.ft.filterInfo[j].name) { return this.ft.filterInfo[j].type; } } } } public storeSelectedData(filterName: string, value: any): Promise { return new Promise((resolve, reject) => { try { this.selectedData[filterName] = value; resolve(true); } catch (error) { reject(false); } }); } public getSelectedData(filter: string) { return this.selectedData[filter]; } public getSelectedDataList(filters: string[]): any[] { const list = []; filters.forEach( filter => list.push(this.getSelectedData(filter))); return list; } public getDisplaySelectedData(filter: string): string { const valueOfFilter = this.selectedData[filter]; const data = this.filterDataService.getData(filter); for (const filterData of data) { if (filterData[filter].value === valueOfFilter) { return filterData[filter].name; } } } public getFiltersForApi(names: string[]): NameValue[] { const filters: NameValue[] = []; for (let i = 0; i < names.length; i++) { const value: string = this.selectedData[names[i]]; if (value === undefined || value === null || value === '') { continue; } if (value.constructor === Array) { for (const val of value) { filters.push(new NameValue(names[i], val)); } } else { filters.push(new NameValue(names[i], value)); } } return filters; } public getBodyWithFilters(filterNames: string[]): string { let body = ''; const parameters = this.getFiltersForApi(filterNames); for (const filter of filterNames) { parameters.push(new NameValue('filters', filter)); } for (let i = 0; i < parameters.length; i++) { body += parameters[i].name + '=' + encodeURIComponent(parameters[i].value) + '&'; } return body; } }