{"version":3,"file":"toolbox-sort-table.mjs","sources":["../../../projects/toolbox/sortable-table/sortable-table.service.ts","../../../projects/toolbox/sortable-table/column-sort.utils.ts","../../../projects/toolbox/sortable-table/sortable-table.directive.ts","../../../projects/toolbox/sortable-table/sortable-column.component.ts","../../../projects/toolbox/sortable-table/toolbox-sort-table.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\nimport { TbxColumnSortedEvent } from \"./column-sorted-event.interface\";\r\n\r\n/**\r\n * Allows communication between sort column components on the table sort status.\r\n */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxSortableTableService {\r\n  /** The source to send notifications on sort events. */\r\n  readonly #columnSortedSource = new Subject<TbxColumnSortedEvent>();\r\n\r\n  /** Gets the column sort subscription for component to subscribe to sort events. */\r\n  public get columnSorted(): Observable<TbxColumnSortedEvent> {\r\n    return this.#columnSortedSource.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Notifies other subscribers that a column sort event occurred.\r\n   * @param event The data for the event.\r\n   */\r\n  public onColumnSorted( event: TbxColumnSortedEvent ): void {\r\n    this.#columnSortedSource.next( event );\r\n  }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n  isNotNullOrEmpty,\r\n  isDate,\r\n  isNumber\r\n} from \"@lacera/ngx-toolbox/utilities\";\r\nimport {\r\n  TbxColumnSortDataType,\r\n  TbxColumnSortDirection,\r\n  TbxColumnSortedEvent\r\n} from \"./column-sorted-event.interface\";\r\n\r\nexport const tbxTableSortCompareFn = ( event: TbxColumnSortedEvent ): any =>\r\n  sort( event.sortColumn, event.sortDirection, event.sortDataType );\r\n\r\n/**\r\n * Sorts based on the specified column, direction, and optional data type.\r\n * @param sortColumn The column to sort.\r\n * @param sortDirection The sort direction (ascending or descending).\r\n * @param sortDataType The possible data type provided by the user.\r\n * @returns The sorting function.\r\n */\r\nconst sort = (\r\n  sortColumn: string,\r\n  sortDirection: TbxColumnSortDirection,\r\n  sortDataType: TbxColumnSortDataType\r\n): any => ( a: any, b: any ): number => {\r\n    // Check if property exists on either object\r\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\r\n    if( !Object.prototype.hasOwnProperty.call( a, sortColumn ) ||\r\n      !Object.prototype.hasOwnProperty.call( b, sortColumn ) ) {\r\n      return 0;\r\n    }\r\n\r\n    const colType = determineType( a[sortColumn], sortDataType );\r\n    const colA = convertType( a[sortColumn], colType );\r\n    const colB = convertType( b[sortColumn], colType );\r\n\r\n    let comparison = 0;\r\n    if( colA > colB ) {\r\n      comparison = 1;\r\n    }\r\n    else if( colA < colB ) {\r\n      comparison = -1;\r\n    }\r\n\r\n    return sortDirection === \"desc\" ? (\r\n      comparison * -1\r\n    ) : comparison;\r\n  };\r\n\r\n/**\r\n * Indicates whether the specified value is null or an empty string.\r\n * @param value The value to test.\r\n * @param type The data type of the column being sorted.\r\n * @returns true if the value is null or an empty string.\r\n */\r\nconst determineType = (\r\n  value: unknown, type?: TbxColumnSortDataType ): TbxColumnSortDataType => {\r\n  switch( type ) {\r\n    case \"date\":\r\n      return \"date\";\r\n    case \"number\":\r\n      return \"number\";\r\n    case \"string\":\r\n      return \"string\";\r\n    default: {\r\n      return isDate( value )\r\n             ? \"date\"\r\n             : isNumber( value )\r\n               ? \"number\"\r\n               : isNotNullOrEmpty( value )\r\n                 ? \"string\"\r\n                 : \"\";\r\n    }\r\n  }\r\n};\r\n\r\n/**\r\n * Converts the given value to the specified type.\r\n * @param value The value to convert.\r\n * @param type The value data type.\r\n * @returns The value in right type.\r\n */\r\nconst convertType = ( value: unknown, type: TbxColumnSortDataType ): any => {\r\n  switch( type ) {\r\n    case \"date\":\r\n      return new Date( String( value ) );\r\n    case \"number\":\r\n      return Number( value );\r\n    case \"string\":\r\n      return value != null ? String( value ).toUpperCase() : \"\";\r\n    default:\r\n      return value;\r\n  }\r\n};\r\n","import {\r\n  Directive,\r\n  inject,\r\n  model,\r\n  OnDestroy,\r\n  OnInit,\r\n  output\r\n} from \"@angular/core\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\nimport { TbxSortableTableService } from \"./sortable-table.service\";\r\nimport { TbxColumnSortedEvent } from \"./column-sorted-event.interface\";\r\nimport { tbxTableSortCompareFn } from \"./column-sort.utils\";\r\n\r\n/**\r\n * Allows communication between sort column components on the table sort status.\r\n */\r\n@Directive( {\r\n  selector: \"[tbxSortableTable]\"\r\n} )\r\nexport class TbxSortableTableDirective<T> implements OnInit, OnDestroy {\r\n  public items = model<T[]>();\r\n\r\n  /** The event to emit when a column sort event occurs. */\r\n  public tableSort = output<TbxColumnSortedEvent>();\r\n\r\n  readonly #sortService = inject( TbxSortableTableService );\r\n  #columnSortedSub!: Subscription;\r\n\r\n  public ngOnInit(): void {\r\n    this.#columnSortedSub =\r\n      this.#sortService.columnSorted.subscribe( event => {\r\n        this.tableSort.emit( event );\r\n        this.items?.set( this.items()?.sort( tbxTableSortCompareFn( event ) ) );\r\n      } );\r\n  }\r\n\r\n  public ngOnDestroy(): void {\r\n    this.#columnSortedSub.unsubscribe();\r\n  }\r\n}\r\n","import {\r\n  Component,\r\n  OnInit,\r\n  model,\r\n  OnDestroy,\r\n  HostListener,\r\n  Renderer2,\r\n  ElementRef\r\n} from \"@angular/core\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\nimport { TbxSortableTableService } from \"./sortable-table.service\";\r\nimport {\r\n  TbxColumnSortDirection,\r\n  TbxColumnSortDataType\r\n} from \"./column-sorted-event.interface\";\r\n\r\n/**\r\n * Displays the sort chevrons on the applied column.\r\n */\r\n@Component( {\r\n  selector: \"[tbx-sort-column]\",\r\n  template: `\r\n    <ng-content></ng-content>`\r\n} )\r\nexport class TbxSortableColumnComponent implements OnInit, OnDestroy {\r\n  /** Gets or sets the column name to sort. */\r\n  public columnName = model.required<string>( { alias: \"tbx-sort-column\" } );\r\n\r\n  /** Gets or sets the sort direction (asc or desc). */\r\n  public sortDirection =\r\n    model<TbxColumnSortDirection>( \"asc\", { alias: \"tbx-sort-direction\" } );\r\n\r\n  /** Gets or sets the data type for the column for more accurate sort. */\r\n  public sortDataType =\r\n    model<TbxColumnSortDataType>( \"string\", { alias: \"tbx-sort-data-type\" } );\r\n\r\n  /** The subscription to the sort service. */\r\n  private columnSortedSub!: Subscription;\r\n\r\n  /**\r\n   * Initializes a new instance of the {@link TbxSortableColumnComponent} class.\r\n   * @param renderer The Angular screen renderer\r\n   * @param elementRef The element on to which this directive is attached.\r\n   * @param sortService The service that provides the sorting for the column.\r\n   */\r\n  public constructor(\r\n    private readonly renderer: Renderer2,\r\n    private readonly elementRef: ElementRef,\r\n    private readonly sortService: TbxSortableTableService\r\n  ) {\r\n  }\r\n\r\n  /** Called when the user clicks on the column to sort. */\r\n  @HostListener( \"click\" )\r\n  public sort(): void {\r\n    this.sortDirection.set( this.sortDirection() === \"asc\" ? \"desc\" : \"asc\" );\r\n    this.setSortClass();\r\n\r\n    this.sortService.onColumnSorted( {\r\n      sortColumn: this.columnName(),\r\n      sortDirection: this.sortDirection(),\r\n      sortDataType: this.sortDataType()\r\n    } );\r\n  }\r\n\r\n  public ngOnInit(): void {\r\n    // Subscribe to sort changes, so we can react when other columns are sorted\r\n    this.columnSortedSub =\r\n      this.sortService\r\n          .columnSorted\r\n          .subscribe( event => {\r\n            // Reset this column's sort direction to hide the sort icons\r\n            if( this.columnName() !== event.sortColumn ) {\r\n              this.sortDirection.set( \"\" );\r\n              this.resetSortClasses();\r\n            }\r\n          } );\r\n  }\r\n\r\n  public ngOnDestroy(): void {\r\n    this.columnSortedSub.unsubscribe();\r\n  }\r\n\r\n  /** Sets the sort class depending on the set direction. */\r\n  protected setSortClass(): void {\r\n    this.resetSortClasses();\r\n    this.renderer.addClass( this.elementRef.nativeElement, this.sortDirection() );\r\n  }\r\n\r\n  /** Resets the element to the default sort classes. */\r\n  protected resetSortClasses(): void {\r\n    this.renderer.removeClass( this.elementRef.nativeElement, \"asc\" );\r\n    this.renderer.removeClass( this.elementRef.nativeElement, \"desc\" );\r\n    this.renderer.addClass( this.elementRef.nativeElement, \"both\" );\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TbxSortableTableService"],"mappings":"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"}