import { Pipe, PipeTransform } from '@angular/core'; // enums import { DropdownStringEnum, DropdownTemplateTypeEnum } from '../enums'; // config import { ICaInput } from '../../ca-input-test/config'; // interfaces import { IOptionModel } from '../interfaces/input-dropdown-option.interface'; @Pipe({ name: 'caDropdownOptionsPipe', standalone: true, }) export class DropdownOptionsPipe implements PipeTransform { transform( searchText: string, options: IOptionModel[], inputConfig: ICaInput, canAddNew: boolean, label: string, sort: string, template: string ): any { let filteredOptions = options.map((option) => label ? { ...option } : option ); filteredOptions = filteredOptions.filter((item) => { let filterItem = inputConfig.searchinGroupIndex ? item[inputConfig.searchinGroupIndex as keyof IOptionModel] : item; if (typeof filterItem?.length !== 'undefined') { const filteredGroup = [ ...(filterItem as IOptionModel[]), ].filter((item) => { const value = this.getValue(label, item, template); return value .toLowerCase() .includes(searchText.toLowerCase()); }); item[inputConfig.searchinGroupIndex as keyof IOptionModel] = filteredGroup; return filteredGroup.length; } else { const value = this.getValue(label, item, template); if (value === DropdownStringEnum.ADD_NEW) return true; return value.toLowerCase().includes(searchText.toLowerCase()); } }); // Get sorted value if there is any filteredOptions = this.getSortedOptions(sort, filteredOptions); if (canAddNew) { return [ { id: 7655, [label]: DropdownStringEnum.ADD_NEW, type: 'add-new', }, ...filteredOptions, ]; } return filteredOptions.length ? filteredOptions : [ { id: 7654, [label]: DropdownStringEnum.NO_RESULTS, type: 'no-results', }, ]; } public getSortedOptions(sort: string, options: IOptionModel[]) { // I added a switch for now, probably there will be more options later switch (sort) { case 'active-drivers': { return options.sort( (x, y) => Number(y.status) - Number(x.status) ); } } return options; } public getValue(label: string, item: IOptionModel, template: string) { if (!label) return item.toString() as string; switch (template) { case DropdownTemplateTypeEnum.LOAD_DISPATCHES_TTD: return `${item.truck?.truckNumber} ${item.trailer?.trailerNumber} ${item.driver?.firstName} ${item.driver?.lastName}`; default: return label ? (item[label as keyof IOptionModel] as string) : (item as string); } } }