sorting in angular 14

 based on pipe sorting


import { Pipe, PipeTransform } from '@angular/core';
export type SortOrder = 'asc' | 'desc';
@Pipe({
  name: 'tableSorting'
})
export class TableSortingPipe implements PipeTransform {
   
 
  public sortByTab:  any;


  transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: any): any {
    let sortArrayData = value;
     this.sortByTab = (a: any, b: any) => {
      const isNumber = (v: any) => Number(v).toString() === v;
      const aPart = a[sortKey].toString().match(/\d+|\D+/g);
      const bPart = b[sortKey].toString().match(/\d+|\D+/g);
      let i = 0;
      const len = Math.min(aPart.length, bPart.length);
      while (i < len && aPart[i] === bPart[i]) {
        i++;
      }

      if (i === len) {
        return sortOrder === 'asc'
          ? bPart.length - aPart.length
          : aPart.length - bPart.length;
      }

      if (isNumber(aPart[i]) && isNumber(bPart[i])) {
        return sortOrder === 'asc'
          ? bPart[i] - aPart[i]
          : aPart[i] - bPart[i];
      }

      return sortOrder === 'asc'
        ? bPart[i].localeCompare(aPart[i])
        : aPart[i].localeCompare(bPart[i]);
    };
    sortArrayData.sort(this.sortByTab);
    return sortArrayData;    
  }
}
 private getKeyByValue(object: any, value: any) {
    return Object.keys(object).find((key) => object[key] === value);
  }
  public sortElement(event: any, column: string){
    const requestheaders = {
      job: 'Job#',
      jobOwner:"Job Owner",
      case:"Case",
      specimen:"Specimen",
      slideId:"Slide Id",
      algorithmName:"Algorithm Name",
      algorithmVersion:"Algorithm Version",
      vendor:"Vendor",
      regularityStatus:"Regulatory Status",
      testType:"Test Type",
      startDateTime:"Start Date Time",
      completion:"Completion"
    };
    this.objkey = this.getKeyByValue(requestheaders, column);
    this.inProgressData=this.sorting.transform
(this.inProgressData,event.detail,this.objkey);
     
  }
based on function sorting use below code


import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class TableSortingService {
  public isAscending: any;
  public objkey: any;
  public sortByTab: any;
  constructor() { }
  public getKeyByValue(object: any, value: any) {
    console.log(object, value);
    return Object.keys(object).find((key) => object[key] === value);
  }

  public sortElement(event: any, column: string, headers: any, array: any) {
    let sortArrayData = array;
    this.isAscending = event.detail;
    this.objkey = this.getKeyByValue(headers, column);
    this.sortByTab = (a: any, b: any) => {
      const isNumber = (v: any) => Number(v).toString() === v;
      // eslint-disable-next-line require-unicode-regexp
      const aPart = a[this.objkey].toString().match(/\d+|\D+/g);
      // eslint-disable-next-line require-unicode-regexp
      const bPart = b[this.objkey].toString().match(/\d+|\D+/g);
      let i = 0;
      const len = Math.min(aPart.length, bPart.length);
      while (i < len && aPart[i] === bPart[i]) {
        i++;
      }

      if (i === len) {
        return this.isAscending === 'asc'
          ? bPart.length - aPart.length
          : aPart.length - bPart.length;
      }

      if (isNumber(aPart[i]) && isNumber(bPart[i])) {
        return this.isAscending === 'asc'
          ? bPart[i] - aPart[i]
          : aPart[i] - bPart[i];
      }

      return this.isAscending === 'asc'
        ? bPart[i].localeCompare(aPart[i])
        : aPart[i].localeCompare(bPart[i]);
    };
    sortArrayData.sort(this.sortByTab);
    return sortArrayData;

  }
}





Comments

Popular posts from this blog

How to Add Firebase Analytics to Your NativeScript Mobile App

sidemenu refresh through events

push multiple data in array(select and disselect items in array)