1- import { Component , OnInit , OnChanges , Input , NgZone , Inject , PLATFORM_ID } from '@angular/core' ;
2- import { Server , PinConfig } from '../server' ;
1+ import { Component , OnInit , OnChanges , Input , NgZone , Inject , PLATFORM_ID , ChangeDetectorRef } from '@angular/core' ;
2+ import { Server , PinConfigCached } from '../server' ;
33import { ServersListHeadingColumn } from './servers-list-header.component' ;
44import { ServerFilterContainer } from './server-filter.component' ;
55import { Subject } from 'rxjs/Subject' ;
@@ -24,18 +24,21 @@ export class ServersListComponent implements OnInit, OnChanges {
2424 private filters : ServerFilterContainer ;
2525
2626 @Input ( )
27- private pinConfig : PinConfig ;
27+ private pinConfig : PinConfigCached ;
2828
2929 private subscriptions : { [ addr : string ] : any } = { } ;
3030
31+ private lastLength : number ;
32+
3133 sortOrder : string [ ] ;
3234
3335 columns : ServersListHeadingColumn [ ] ;
3436
3537 localServers : Server [ ] ;
3638 sortedServers : Server [ ] ;
3739
38- constructor ( private zone : NgZone , @Inject ( LocalStorage ) private localStorage : any , @Inject ( PLATFORM_ID ) private platformId : any ) {
40+ constructor ( private zone : NgZone , @Inject ( LocalStorage ) private localStorage : any , @Inject ( PLATFORM_ID ) private platformId : any ,
41+ public changeDetectorRef : ChangeDetectorRef ) {
3942 this . servers = [ ] ;
4043
4144 this . columns = [
@@ -83,6 +86,12 @@ export class ServersListComponent implements OnInit, OnChanges {
8386 if ( changed ) {
8487 changed = false ;
8588
89+ for ( const server of ( this . servers || [ ] ) ) {
90+ if ( ! this . subscriptions [ server . address ] ) {
91+ this . subscriptions [ server . address ] = server . onChanged . subscribe ( a => this . changeSubject . next ( ) ) ;
92+ }
93+ }
94+
8695 zone . run ( ( ) => {
8796 this . sortAndFilterServers ( ) ;
8897 } ) ;
@@ -100,7 +109,7 @@ export class ServersListComponent implements OnInit, OnChanges {
100109 return false ;
101110 }
102111
103- return ( this . pinConfig . pinnedServers . indexOf ( server . address ) >= 0 )
112+ return this . pinConfig . pinnedServers . has ( server . address ) ;
104113 }
105114
106115 isPremium ( server : Server ) {
@@ -213,7 +222,9 @@ export class ServersListComponent implements OnInit, OnChanges {
213222 const filters = filterList . filters ;
214223
215224 const hiddenByTags = ( server : Server ) => {
216- if ( filterList . tags ) {
225+ const tagListEntries = ( filterList . tags ) ? Object . entries ( filterList . tags . tagList ) : [ ] ;
226+
227+ if ( tagListEntries . length > 0 ) {
217228 const tags =
218229 ( server && server . data && server . data . vars && server . data . vars . tags ) ?
219230 ( < string > server . data . vars . tags )
@@ -225,7 +236,7 @@ export class ServersListComponent implements OnInit, OnChanges {
225236
226237 const tagSet = new Set < string > ( tags ) ;
227238
228- for ( const [ tag , active ] of Object . entries ( filterList . tags . tagList ) ) {
239+ for ( const [ tag , active ] of tagListEntries ) {
229240 if ( active ) {
230241 if ( ! tagSet . has ( tag ) ) {
231242 return true ;
@@ -247,7 +258,7 @@ export class ServersListComponent implements OnInit, OnChanges {
247258 }
248259
249260 if ( server . currentPlayers === 0 && filters . hideEmpty ) {
250- if ( ! this . isPinned ( server ) || ! this . pinConfig . pinIfEmpty ) {
261+ if ( ! this . isPinned ( server ) || ! this . pinConfig . data . pinIfEmpty ) {
251262 return false ;
252263 }
253264 }
@@ -271,7 +282,7 @@ export class ServersListComponent implements OnInit, OnChanges {
271282 }
272283
273284 sortAndFilterServers ( ) {
274- const servers = ( this . servers || [ ] ) . concat ( ) . filter ( this . getFilter ( this . filters ) ) ;
285+ const servers = ( this . servers || [ ] ) . filter ( this . getFilter ( this . filters ) ) ;
275286
276287 const sortChain = ( a : Server , b : Server , ...stack : ( ( a : Server , b : Server ) => number ) [ ] ) => {
277288 for ( const entry of stack ) {
@@ -311,26 +322,30 @@ export class ServersListComponent implements OnInit, OnChanges {
311322 }
312323 } ;
313324
325+ const sortList = [
326+ ( a : Server , b : Server ) => {
327+ const aPinned = this . isPinned ( a ) ;
328+ const bPinned = this . isPinned ( b ) ;
329+
330+ if ( aPinned === bPinned ) {
331+ return 0 ;
332+ } else if ( aPinned && ! bPinned ) {
333+ return - 1 ;
334+ } else if ( ! aPinned && bPinned ) {
335+ return 1 ;
336+ }
337+ } ,
338+ sortSortable ( this . sortOrder ) ,
339+ sortSortable ( [ 'upvotePower' , '-' ] ) ,
340+ sortSortable ( [ 'ping' , '+' ] ) ,
341+ sortSortable ( [ 'name' , '+' ] )
342+ ] ;
343+
314344 servers . sort ( ( a , b ) => {
315345 return sortChain (
316346 a ,
317347 b ,
318- ( a : Server , b : Server ) => {
319- const aPinned = this . isPinned ( a ) ;
320- const bPinned = this . isPinned ( b ) ;
321-
322- if ( aPinned === bPinned ) {
323- return 0 ;
324- } else if ( aPinned && ! bPinned ) {
325- return - 1 ;
326- } else if ( ! aPinned && bPinned ) {
327- return 1 ;
328- }
329- } ,
330- sortSortable ( this . sortOrder ) ,
331- sortSortable ( [ 'upvotePower' , '-' ] ) ,
332- sortSortable ( [ 'ping' , '+' ] ) ,
333- sortSortable ( [ 'name' , '+' ] )
348+ ...sortList
334349 ) ;
335350 } ) ;
336351
@@ -358,14 +373,10 @@ export class ServersListComponent implements OnInit, OnChanges {
358373 changeObservable = this . changeSubject . asObservable ( ) ;
359374
360375 ngOnChanges ( ) {
361- for ( const server of ( this . servers || [ ] ) ) {
362- if ( ! this . subscriptions [ server . address ] ) {
363- this . subscriptions [ server . address ] = server . onChanged . subscribe ( a => this . changeSubject . next ( ) ) ;
364- }
376+ if ( this . servers . length !== this . lastLength ) {
377+ this . changeSubject . next ( ) ;
378+ this . lastLength = this . servers . length ;
365379 }
366-
367- //this.sortAndFilterServers();
368- this . changeSubject . next ( ) ;
369380 }
370381
371382 svTrack ( index : number , serverRow : Server ) {
0 commit comments