File

src/lib/table/table-sort.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
import { combineLatest, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { PlexColumnDirective } from './columns.directive';
import { IPlexTableColumns } from './table.interfaces';

@Pipe({
    name: 'plSort'
})
export class PlexTableSortPipe implements PipeTransform {

    calcularFiltros(plexTable: PlexColumnDirective, columns: IPlexTableColumns[], listado: any[]) {
        const cols = {};
        columns.forEach(columnDef => {
            if (columnDef.filterBy) {

                cols[columnDef.key] = Object.keys(
                    listado.reduce(
                        (acc, curr) => {
                            const k = columnDef.filterBy(curr);
                            acc[k] = true;
                            return acc;
                        },
                        {}
                    )
                ).sort((a, b) => a.localeCompare(b)).map(k => ({ id: k, label: k }));

            }
        });

        plexTable._filters.next(cols);
    }


    filtrarListado(columns: IPlexTableColumns[], filtros: any, listado: any[]) {
        Object.keys(filtros).forEach(k => {
            const keys = filtros[k];
            const colDef = columns.find(item => item.key === k);

            listado = listado.filter(item => {

                const computed = colDef.filterBy(item);

                return keys.includes(computed);

            });


        });

        return listado;
    }

    transform(value: Observable<any[]>, plexTable: PlexColumnDirective) {
        return combineLatest([
            plexTable.columns$,
            value,
            plexTable.sort$,
            plexTable.filtrosSeleccionados$
        ]).pipe(
            map(([columns, listado, sortData, filtros]) => {

                this.calcularFiltros(plexTable, columns, listado);

                listado = this.filtrarListado(columns, filtros, listado);


                const { sortBy, sortOrder } = sortData;
                if (!sortBy) {
                    return listado;
                }

                const colData = columns.find(item => item.key === sortBy);
                const sortFn = colData.sort;

                return listado.sort((a, b) => {
                    const factor = sortOrder === 'ASC' ? 1 : -1;
                    return sortFn(a, b) * factor;
                });
            })
        );

    }
}

results matching ""

    No results matching ""