Compare commits
	
		
			No commits in common. "99304649ea743ca180cb1963536bbf7e2c1f0ea3" and "42cfadb9e96c8e51e49d9c5df34fa77482d8f9c6" have entirely different histories. 
		
	
	
		
			99304649ea
			...
			42cfadb9e9
		
	
		|  | @ -644,6 +644,11 @@ | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@swimlane/ngx-datatable": { | ||||||
|  |       "version": "13.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-13.0.1.tgz", | ||||||
|  |       "integrity": "sha512-jjMEzQhXcdD+jfKNp+7U61lWx9ZzSGDn9QbpY6pJOJwz+E2CKeek6OouT5Qcc4MY4oFL9g/SZoPjLf90cbNIRw==" | ||||||
|  |     }, | ||||||
|     "@types/jasmine": { |     "@types/jasmine": { | ||||||
|       "version": "2.5.38", |       "version": "2.5.38", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.38.tgz", |       "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.38.tgz", | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ | ||||||
|     "@angular/platform-browser-dynamic": "^6.0.7", |     "@angular/platform-browser-dynamic": "^6.0.7", | ||||||
|     "@angular/router": "^6.0.7", |     "@angular/router": "^6.0.7", | ||||||
|     "@swimlane/ngx-charts": "^8.1.0", |     "@swimlane/ngx-charts": "^8.1.0", | ||||||
|  |     "@swimlane/ngx-datatable": "^13.0.1", | ||||||
|     "bootstrap": "^3.3.7", |     "bootstrap": "^3.3.7", | ||||||
|     "d3": "^4.11.0", |     "d3": "^4.11.0", | ||||||
|     "file-saver": "^1.3.8", |     "file-saver": "^1.3.8", | ||||||
|  |  | ||||||
|  | @ -11,53 +11,71 @@ h2 { | ||||||
|   margin: 20px 0 0 10%; |   margin: 20px 0 0 10%; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .highscore-table-container { | ngx-datatable { | ||||||
|   width: 320px; |   width: 345px; | ||||||
|   max-height: 394px; |   margin: 3% 5% 0 5%; | ||||||
|   margin: 100px 0 0 8%; |   height: 310px; | ||||||
|   float: left; |   float: left; | ||||||
|   overflow-x: hidden; |  | ||||||
|   overflow-y: auto; |  | ||||||
|   border: solid #dfdfdf 1px; |   border: solid #dfdfdf 1px; | ||||||
|   box-shadow: 3px 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); |   border-radius: 10px 10px 2px 2px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .highscore-table { | :host /deep/ .datatable-header { | ||||||
|   width: 100%; |   width: 350px !important; | ||||||
|  |   background: #222222; | ||||||
|  |   font-weight: 700; | ||||||
|  |   border-radius: 10px 10px 0 0; | ||||||
|  |   color: white; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| table.mat-table img { | :host /deep/ span.datatable-header-cell-label, :host /deep/ div.datatable-body-cell-label { | ||||||
|   filter: invert(60%); |   padding-left: 8px; | ||||||
|   margin-left: -15px; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| :host /deep/ table.mat-table > thead { | :host /deep/ .ngx-datatable .datatable-header { | ||||||
|   position: absolute; |   /*vertical center alignment*/ | ||||||
|   width: 320px; |   display: table-cell; | ||||||
|   display: inherit; |   vertical-align: middle; | ||||||
|   margin-left: -1px; |  | ||||||
|   margin-top: -57px; |  | ||||||
|   border: 1px solid #dadada; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .mat-column-kill, .mat-column-friendlyFire, .mat-column-revive, .mat-column-flagTouch, | :host /deep/ .ngx-datatable .datatable-body .datatable-body-row > div { | ||||||
| .mat-column-vehicleLight, .mat-column-vehicleHeavy, .mat-column-vehicleAir, .mat-column-death, .mat-column-respawn { |   /*vertical alignment*/ | ||||||
|   width: 67px; |   position: relative; | ||||||
|   text-indent: 14px; |   top: 10px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | :host /deep/ .datatable-body { | ||||||
|  |   overflow-x: hidden; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | :host /deep/ .datatable-body-row { | ||||||
|  |   color: #222222; | ||||||
|  |   border-bottom: 1px solid grey; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | :host /deep/ .datatable-body-row:hover { | ||||||
|  |   background-color: #f7f7f7; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | :host /deep/ .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell { | ||||||
|  |   margin: auto; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Table Scrollbar BEGIN */ | /* Table Scrollbar BEGIN */ | ||||||
| 
 | 
 | ||||||
| .highscore-table-container::-webkit-scrollbar { | :host /deep/ .ngx-datatable.scroll-vertical .datatable-body::-webkit-scrollbar { | ||||||
|   width: 12px; |   width: 12px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .highscore-table-container::-webkit-scrollbar-track { | :host /deep/ .ngx-datatable.scroll-vertical .datatable-body::-webkit-scrollbar-track { | ||||||
|   border-left: 1px solid #f1f1f1; |   -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); | ||||||
|  |   border-radius: 10px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .highscore-table-container::-webkit-scrollbar-thumb { | :host /deep/ .ngx-datatable.scroll-vertical .datatable-body::-webkit-scrollbar-thumb { | ||||||
|   background: rgb(234, 234, 234); |   border-radius: 10px; | ||||||
|  |   background: #4b4b4b; | ||||||
|  |   -webkit-box-shadow: inset 0 0 6px rgba(255, 255, 255, 0.5); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Table Scrollbar END */ | /* Table Scrollbar END */ | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ | ||||||
| 
 | 
 | ||||||
|   <div class="input-group search-field"> |   <div class="input-group search-field"> | ||||||
|     <input id="search-tasks" |     <input id="search-tasks" | ||||||
|            markForCheck |  | ||||||
|            placeholder="Spielername (mehrere mit '&' trennen)" |            placeholder="Spielername (mehrere mit '&' trennen)" | ||||||
|            type="text" #query class="form-control" |            type="text" #query class="form-control" | ||||||
|            (keyup.enter)="filterPlayers()" |            (keyup.enter)="filterPlayers()" | ||||||
|  | @ -17,37 +16,41 @@ | ||||||
|   </div> |   </div> | ||||||
| 
 | 
 | ||||||
|   <div *ngFor="let attributeMap of playerAttributeDisplayNames"> |   <div *ngFor="let attributeMap of playerAttributeDisplayNames"> | ||||||
|     <div class="highscore-table-container"> |     <ngx-datatable | ||||||
|       <table mat-table matSort |       [rows]="players[attributeMap.prop]" | ||||||
|              [dataSource]="players[attributeMap.prop]" |       [messages]="emptyMessage" | ||||||
|              class="mat-elevation-z8 highscore-table"> |       [headerHeight]="cellHeight" | ||||||
|  |       [rowHeight]="cellHeight" | ||||||
|  |       [cssClasses]='customClasses' | ||||||
|  |       [columnMode]="'force'" | ||||||
|  |       [scrollbarV]="true" | ||||||
|  |       [selectionType]="'single'"> | ||||||
|  |       <ngx-datatable-column [width]="numberColWidth" name="#" prop="num"></ngx-datatable-column> | ||||||
|  |       <ngx-datatable-column name="Spieler" prop="name" [width]="nameColWidth" style="padding-left:10px"> | ||||||
|  |         <ng-template ngx-datatable-cell-template let-row="row" let-value="value"> | ||||||
|  |         <span class="player-name" | ||||||
|  |               [style.color]="row['fraction'] === 'BLUFOR' ? fraction.COLOR_BLUFOR : fraction.COLOR_OPFOR"> | ||||||
|  |           {{value}} | ||||||
|  |         </span> | ||||||
|  |         </ng-template> | ||||||
|  |       </ngx-datatable-column> | ||||||
| 
 | 
 | ||||||
|         <ng-container matColumnDef="num"> |       <ngx-datatable-column [width]="valueColWidth" prop="{{attributeMap.prop}}"> | ||||||
|           <th mat-header-cell *matHeaderCellDef>#</th> |         <ng-template ngx-datatable-header-template let-sort="sortFn"> | ||||||
|           <td mat-cell *matCellDef="let element">{{element.num}}</td> |         <span class="datatable-header-cell-wrapper"> | ||||||
|         </ng-container> |           <span class="datatable-header-cell-label text-truncate" matTooltip="{{attributeMap.head}}" (click)="sort()"> | ||||||
| 
 |             <img src="../../../../assets/scoreboard/{{attributeMap.prop}}.png" alt="{{attributeMap.head}}"> | ||||||
|         <ng-container matColumnDef="name"> |           </span> | ||||||
|           <th mat-header-cell *matHeaderCellDef>Name</th> |         </span> | ||||||
|           <td mat-cell *matCellDef="let element" |         </ng-template> | ||||||
|               [style.color]="element['fraction'] === 'BLUFOR' ? fraction.COLOR_BLUFOR : fraction.COLOR_OPFOR"> |         <ng-template ngx-datatable-cell-template let-row="row" let-value="value"> | ||||||
|             {{element.name}} |         <span style="padding-left: 7px;"> | ||||||
|           </td> |           {{value}} | ||||||
|         </ng-container> |         </span> | ||||||
| 
 |         </ng-template> | ||||||
|         <ng-container matColumnDef="{{attributeMap.prop}}"> |       </ngx-datatable-column> | ||||||
|           <th mat-header-cell *matHeaderCellDef> |     </ngx-datatable> | ||||||
|             <img src="../../../../assets/scoreboard/{{attributeMap.prop}}.png" |  | ||||||
|                  matTooltip="{{attributeMap.head}}" |  | ||||||
|                  alt="{{attributeMap.head}}"> |  | ||||||
|           </th> |  | ||||||
|           <td mat-cell *matCellDef="let element"> {{element[attributeMap.prop]}}</td> |  | ||||||
|         </ng-container> |  | ||||||
| 
 |  | ||||||
|         <tr mat-header-row *matHeaderRowDef="['num', 'name', attributeMap.prop];"></tr> |  | ||||||
|         <tr mat-row *matRowDef="let row; columns: ['num', 'name', attributeMap.prop];"></tr> |  | ||||||
|       </table> |  | ||||||
|     </div> |  | ||||||
|   </div> |   </div> | ||||||
|  | 
 | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -30,6 +30,21 @@ export class StatisticHighScoreComponent implements OnInit { | ||||||
| 
 | 
 | ||||||
|   playerAttributeDisplayNames = PlayerUtils.attributeDisplayNames.slice(2, PlayerUtils.attributeDisplayNames.length); |   playerAttributeDisplayNames = PlayerUtils.attributeDisplayNames.slice(2, PlayerUtils.attributeDisplayNames.length); | ||||||
| 
 | 
 | ||||||
|  |   cellHeight = 40; | ||||||
|  | 
 | ||||||
|  |   numberColWidth = 60; | ||||||
|  | 
 | ||||||
|  |   nameColWidth = 210; | ||||||
|  | 
 | ||||||
|  |   valueColWidth = 55; | ||||||
|  | 
 | ||||||
|  |   emptyMessage = {emptyMessage: 'Keine Einträge'}; | ||||||
|  | 
 | ||||||
|  |   customClasses = { | ||||||
|  |     sortAscending: 'glyphicon glyphicon-triangle-top', | ||||||
|  |     sortDescending: 'glyphicon glyphicon-triangle-bottom', | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   readonly fraction = Fraction; |   readonly fraction = Fraction; | ||||||
| 
 | 
 | ||||||
|   constructor(private route: ActivatedRoute, |   constructor(private route: ActivatedRoute, | ||||||
|  | @ -82,6 +97,7 @@ export class StatisticHighScoreComponent implements OnInit { | ||||||
| 
 | 
 | ||||||
|   private filterPlayerAttribute(attribute) { |   private filterPlayerAttribute(attribute) { | ||||||
|     const query = this.searchTerm.value.toLowerCase().split('&'); |     const query = this.searchTerm.value.toLowerCase().split('&'); | ||||||
|  | 
 | ||||||
|     return this.playersStored[attribute].filter(player => { |     return this.playersStored[attribute].filter(player => { | ||||||
|       for (let i = 0; i < query.length; i++) { |       for (let i = 0; i < query.length; i++) { | ||||||
|         if (query[i].trim() !== '' && player.name.toLowerCase().includes(query[i].trim())) { |         if (query[i].trim() !== '' && player.name.toLowerCase().includes(query[i].trim())) { | ||||||
|  | @ -91,4 +107,5 @@ export class StatisticHighScoreComponent implements OnInit { | ||||||
|       return false; |       return false; | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ import {statsRouterModule, statsRoutingComponents} from './stats.routing'; | ||||||
| import {WarService} from '../services/logs/war.service'; | import {WarService} from '../services/logs/war.service'; | ||||||
| import {NgxChartsModule} from '@swimlane/ngx-charts'; | import {NgxChartsModule} from '@swimlane/ngx-charts'; | ||||||
| import {CampaignService} from '../services/logs/campaign.service'; | import {CampaignService} from '../services/logs/campaign.service'; | ||||||
|  | import {NgxDatatableModule} from '@swimlane/ngx-datatable'; | ||||||
| import {PlayerService} from '../services/logs/player.service'; | import {PlayerService} from '../services/logs/player.service'; | ||||||
| import {LogsService} from '../services/logs/logs.service'; | import {LogsService} from '../services/logs/logs.service'; | ||||||
| import {MatButtonModule, MatButtonToggleModule, MatExpansionModule, MatTableModule, MatSortModule} from '@angular/material'; | import {MatButtonModule, MatButtonToggleModule, MatExpansionModule, MatTableModule, MatSortModule} from '@angular/material'; | ||||||
|  | @ -12,8 +13,8 @@ import {MatButtonModule, MatButtonToggleModule, MatExpansionModule, MatTableModu | ||||||
| 
 | 
 | ||||||
| @NgModule({ | @NgModule({ | ||||||
|   declarations: statsRoutingComponents, |   declarations: statsRoutingComponents, | ||||||
|   imports: [CommonModule, SharedModule, statsRouterModule, NgxChartsModule, MatButtonModule, MatExpansionModule, |   imports: [CommonModule, SharedModule, statsRouterModule, NgxChartsModule, NgxDatatableModule, | ||||||
|     MatButtonToggleModule, MatTableModule, MatSortModule], |     MatButtonModule, MatExpansionModule, MatButtonToggleModule, MatTableModule, MatSortModule], | ||||||
|   providers: [WarService, CampaignService, PlayerService, LogsService] |   providers: [WarService, CampaignService, PlayerService, LogsService] | ||||||
| }) | }) | ||||||
| export class StatsModule { | export class StatsModule { | ||||||
|  |  | ||||||
|  | @ -1,11 +1,3 @@ | ||||||
| .scoreboard-table { |  | ||||||
|   height: 68vh; |  | ||||||
|   width:fit-content; |  | ||||||
|   border: 1px solid #dadada; |  | ||||||
|   overflow-x: auto; |  | ||||||
|   margin:auto; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .in-table-btn { | .in-table-btn { | ||||||
|   position: absolute; |   position: absolute; | ||||||
|   margin-top: -5px; |   margin-top: -5px; | ||||||
|  | @ -20,16 +12,6 @@ table.mat-table img { | ||||||
|   filter: invert(60%); |   filter: invert(60%); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| :host /deep/ table.mat-table > thead { |  | ||||||
|   position: absolute; |  | ||||||
|   display: inherit; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :host /deep/ table.mat-table > tbody { |  | ||||||
|   margin-top: 60px; |  | ||||||
|   display: block; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .mat-column-name { | .mat-column-name { | ||||||
|   width: 200px; |   width: 200px; | ||||||
| } | } | ||||||
|  | @ -43,18 +25,6 @@ table.mat-table img { | ||||||
|   text-indent: 9px; |   text-indent: 9px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| th.mat-column-interact { |  | ||||||
|   padding-left: 36px; |  | ||||||
|   background: white; |  | ||||||
|   position: relative; |  | ||||||
|   z-index: 100; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* TABLE SCROLLBAR */ |  | ||||||
| div::-webkit-scrollbar-thumb { |  | ||||||
|   border-top: solid white 56px; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* MAT ICON BUTTON */ | /* MAT ICON BUTTON */ | ||||||
| 
 | 
 | ||||||
| :host/deep/.mat-table .mat-icon { | :host/deep/.mat-table .mat-icon { | ||||||
|  |  | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| <div class="fade-in scoreboard-table"> | <div class="fade-in" style="border-top: 1px solid #dadada; overflow-x: auto"> | ||||||
| 
 | 
 | ||||||
|   <table mat-table matSort |   <table mat-table matSort | ||||||
|          [dataSource]="sortedRows" |          [dataSource]="sortedRows" | ||||||
|          matSortActive="{{tableHead[2].prop}}" matSortDirection="asc" matSortDisableClear |          matSortActive="{{tableHead[2].prop}}" matSortDirection="asc" matSortDisableClear | ||||||
|          (matSortChange)="sortScoreboardData($event)" |          (matSortChange)="sortData($event)" | ||||||
|          class="mat-elevation-z8"> |          class="mat-elevation-z8"> | ||||||
| 
 | 
 | ||||||
|     <ng-container matColumnDef="{{tableHead[0].prop}}"> |     <ng-container matColumnDef="{{tableHead[0].prop}}"> | ||||||
|  | @ -29,7 +29,7 @@ | ||||||
|     </ng-container> |     </ng-container> | ||||||
| 
 | 
 | ||||||
|     <ng-container matColumnDef="interact"> |     <ng-container matColumnDef="interact"> | ||||||
|       <th mat-header-cell *matHeaderCellDef> </th> |       <th mat-header-cell *matHeaderCellDef></th> | ||||||
|       <td mat-cell *matCellDef="let element"> |       <td mat-cell *matCellDef="let element"> | ||||||
|         <button mat-icon-button |         <button mat-icon-button | ||||||
|                 matTooltip="Kampagnenstatistik für {{element.name}}" |                 matTooltip="Kampagnenstatistik für {{element.name}}" | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ import {Fraction} from '../../../utils/fraction.enum'; | ||||||
| import {PlayerUtils} from '../../../utils/player-utils'; | import {PlayerUtils} from '../../../utils/player-utils'; | ||||||
| import {saveAs} from 'file-saver/FileSaver'; | import {saveAs} from 'file-saver/FileSaver'; | ||||||
| import {MatSort, Sort} from '@angular/material'; | import {MatSort, Sort} from '@angular/material'; | ||||||
| import {SortUtils} from '../../../utils/sort-utils'; |  | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'cc-scoreboard', |   selector: 'cc-scoreboard', | ||||||
|  | @ -33,8 +32,6 @@ export class ScoreboardComponent implements OnChanges { | ||||||
| 
 | 
 | ||||||
|   sortedRows = []; |   sortedRows = []; | ||||||
| 
 | 
 | ||||||
|   currentSort = new MatSort(); |  | ||||||
| 
 |  | ||||||
|   displayedColumns = this.tableHead.map(head => head.prop); |   displayedColumns = this.tableHead.map(head => head.prop); | ||||||
| 
 | 
 | ||||||
|   reorderable = false; |   reorderable = false; | ||||||
|  | @ -58,8 +55,10 @@ export class ScoreboardComponent implements OnChanges { | ||||||
|   ngOnChanges(changes: SimpleChanges) { |   ngOnChanges(changes: SimpleChanges) { | ||||||
|     if (changes.war) { |     if (changes.war) { | ||||||
|       this.rows = changes.war.currentValue.players; |       this.rows = changes.war.currentValue.players; | ||||||
|       this.currentSort.active = 'kill'; | 
 | ||||||
|       this.sortScoreboardData(this.currentSort); |       const sort = new MatSort(); | ||||||
|  |       sort.active = 'kill'; | ||||||
|  |       this.sortData(sort); | ||||||
| //      this.elRef.nativeElement
 | //      this.elRef.nativeElement
 | ||||||
| //          .querySelector('.datatable-body')
 | //          .querySelector('.datatable-body')
 | ||||||
| //          .scrollTo(0, 0);
 | //          .scrollTo(0, 0);
 | ||||||
|  | @ -77,13 +76,9 @@ export class ScoreboardComponent implements OnChanges { | ||||||
|     } else { |     } else { | ||||||
|       this.rows = this.war.players; |       this.rows = this.war.players; | ||||||
|     } |     } | ||||||
|     this.sortScoreboardData(this.currentSort); |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   sortScoreboardData(sort: MatSort) { |   sortData(sort: Sort) { | ||||||
|     if (sort) { |  | ||||||
|       this.currentSort = sort; |  | ||||||
|     } |  | ||||||
|     const data = this.rows.slice(); |     const data = this.rows.slice(); | ||||||
|     if (!sort.active || sort.direction === '') { |     if (!sort.active || sort.direction === '') { | ||||||
|       this.sortedRows = data; |       this.sortedRows = data; | ||||||
|  | @ -93,10 +88,14 @@ export class ScoreboardComponent implements OnChanges { | ||||||
|     this.sortedRows = data.sort((a, b) => { |     this.sortedRows = data.sort((a, b) => { | ||||||
|       const isAsc = sort.direction === 'desc'; |       const isAsc = sort.direction === 'desc'; | ||||||
|       const sortProperty = sort.active; |       const sortProperty = sort.active; | ||||||
|       return SortUtils.compare(a[sortProperty], b[sortProperty], isAsc); |       return this.compare(a[sortProperty], b[sortProperty], isAsc); | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   compare(a, b, isAsc) { | ||||||
|  |     return (a < b ? -1 : 1) * (isAsc ? 1 : -1); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   exportCSV() { |   exportCSV() { | ||||||
|     let csvOut = ''; |     let csvOut = ''; | ||||||
|     for (let i = 0; i < this.tableHead.length; i++) { |     for (let i = 0; i < this.tableHead.length; i++) { | ||||||
|  |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| export class SortUtils { |  | ||||||
| 
 |  | ||||||
|   public static compare(a, b, isAsc) { |  | ||||||
|     return (a < b ? -1 : 1) * (isAsc ? 1 : -1); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue