-
+
diff --git a/src/app/modules/songs/song-list/song-list.component.less b/src/app/modules/songs/song-list/song-list.component.less
index 11c7349..e69de29 100644
--- a/src/app/modules/songs/song-list/song-list.component.less
+++ b/src/app/modules/songs/song-list/song-list.component.less
@@ -1,2 +0,0 @@
-.song-list {
-}
diff --git a/src/app/modules/songs/song-list/song-list.component.ts b/src/app/modules/songs/song-list/song-list.component.ts
index f83b504..e01fa02 100644
--- a/src/app/modules/songs/song-list/song-list.component.ts
+++ b/src/app/modules/songs/song-list/song-list.component.ts
@@ -6,6 +6,7 @@ import {combineLatest, Observable} from 'rxjs';
import {fade} from '../../../animations';
import {ActivatedRoute} from '@angular/router';
import {filterSong} from '../../../services/filter.helper';
+import {FilterValues} from './filter/filter-values';
@Component({
selector: 'app-songs',
@@ -16,6 +17,7 @@ import {filterSong} from '../../../services/filter.helper';
export class SongListComponent implements OnInit {
public songs$: Observable
;
+ public anyFilterActive = false;
constructor(private songService: SongService, private activatedRoute: ActivatedRoute) {
}
@@ -23,7 +25,7 @@ export class SongListComponent implements OnInit {
ngOnInit() {
const filter$ = this.activatedRoute.queryParams.pipe(
debounceTime(300),
- map(_ => _.q)
+ map(_ => _ as FilterValues)
);
const songs$ = this.songService.list$().pipe(
@@ -31,7 +33,35 @@ export class SongListComponent implements OnInit {
);
this.songs$ = combineLatest([filter$, songs$]).pipe(
- map(_ => _[1].filter(song => filterSong(song, _[0])))
+ map(_ => {
+ let songs = _[1];
+ let filter = _[0];
+ this.anyFilterActive = this.checkIfFilterActive(filter);
+ return songs.filter(song => this.filter(song, filter));
+ })
);
+
+ }
+
+ private filter(song: Song, filter: FilterValues): boolean {
+ let baseFilter = filterSong(song, filter.q);
+ baseFilter = baseFilter && (!filter.type || filter.type === song.type);
+ baseFilter = baseFilter && (!filter.legalType || filter.legalType === song.legalType);
+ baseFilter = baseFilter && (!filter.flag || this.checkFlag(filter.flag, song.flags));
+
+ return baseFilter;
+ }
+
+ private checkIfFilterActive(filter: FilterValues): boolean {
+ return !!filter.q || !!filter.type || !!filter.legalType || !!filter.flag;
+ }
+
+ private checkFlag(flag: string, flags: string) {
+ if (!flags) return false;
+
+ const flagStrings = flags.split(';');
+ if (flagStrings.length === 0) return false;
+
+ return flagStrings.indexOf(flag) !== -1;
}
}
diff --git a/src/app/modules/songs/song-list/song-list.module.ts b/src/app/modules/songs/song-list/song-list.module.ts
index c8d59e2..ce903aa 100644
--- a/src/app/modules/songs/song-list/song-list.module.ts
+++ b/src/app/modules/songs/song-list/song-list.module.ts
@@ -6,10 +6,17 @@ import {CardModule} from '../../../widget-modules/components/card/card.module';
import {RouterModule} from '@angular/router';
import {LegalTypeTranslatorModule} from '../../../widget-modules/pipes/legal-type-translator/legal-type-translator.module';
import {ListHeaderModule} from '../../../widget-modules/components/list-header/list-header.module';
+import {MatFormFieldModule} from '@angular/material/form-field';
+import {MatInputModule} from '@angular/material/input';
+import {FilterComponent} from './filter/filter.component';
+import {ReactiveFormsModule} from '@angular/forms';
+import {MatSelectModule} from '@angular/material/select';
+import {SongTypeTranslaterModule} from '../../../widget-modules/pipes/song-type-translater/song-type-translater.module';
+import {FontAwesomeModule} from '@fortawesome/angular-fontawesome';
@NgModule({
- declarations: [SongListComponent, ListItemComponent],
+ declarations: [SongListComponent, ListItemComponent, FilterComponent],
exports: [SongListComponent],
imports: [
CommonModule,
@@ -17,7 +24,13 @@ import {ListHeaderModule} from '../../../widget-modules/components/list-header/l
CardModule,
LegalTypeTranslatorModule,
- ListHeaderModule
+ ListHeaderModule,
+ MatFormFieldModule,
+ MatInputModule,
+ ReactiveFormsModule,
+ MatSelectModule,
+ SongTypeTranslaterModule,
+ FontAwesomeModule
]
})
export class SongListModule {
diff --git a/src/app/modules/songs/song/edit/edit-song/edit-song.component.html b/src/app/modules/songs/song/edit/edit-song/edit-song.component.html
index ff0d850..fb7d91a 100644
--- a/src/app/modules/songs/song/edit/edit-song/edit-song.component.html
+++ b/src/app/modules/songs/song/edit/edit-song/edit-song.component.html
@@ -36,7 +36,7 @@
-
+
{{flag}}
diff --git a/src/app/widget-modules/components/application-frame/navigation/filter/filter.component.ts b/src/app/widget-modules/components/application-frame/navigation/filter/filter.component.ts
index 523f8a3..a0d40d2 100644
--- a/src/app/widget-modules/components/application-frame/navigation/filter/filter.component.ts
+++ b/src/app/widget-modules/components/application-frame/navigation/filter/filter.component.ts
@@ -16,10 +16,7 @@ export class FilterComponent {
}
public async valueChange(text: string): Promise {
- const route = text
- ? this.router.createUrlTree(['songs'], {queryParams: {q: text}})
- : this.router.createUrlTree(['songs']);
-
+ const route = this.router.createUrlTree(['songs'], {queryParams: {q: text}, queryParamsHandling: 'merge'});
await this.router.navigateByUrl(route);
}
}
diff --git a/src/app/widget-modules/components/list-header/list-header.component.html b/src/app/widget-modules/components/list-header/list-header.component.html
index b282b90..beab8bf 100644
--- a/src/app/widget-modules/components/list-header/list-header.component.html
+++ b/src/app/widget-modules/components/list-header/list-header.component.html
@@ -1,8 +1,15 @@
+
+
diff --git a/src/app/widget-modules/components/list-header/list-header.component.less b/src/app/widget-modules/components/list-header/list-header.component.less
index 1cfcd70..4f5fa99 100644
--- a/src/app/widget-modules/components/list-header/list-header.component.less
+++ b/src/app/widget-modules/components/list-header/list-header.component.less
@@ -13,3 +13,8 @@
color: #A6C4F5;
}
+
+.filter-active {
+ color: #a21;
+ cursor: not-allowed;
+}
diff --git a/src/app/widget-modules/components/list-header/list-header.component.ts b/src/app/widget-modules/components/list-header/list-header.component.ts
index b983a8a..23228e7 100644
--- a/src/app/widget-modules/components/list-header/list-header.component.ts
+++ b/src/app/widget-modules/components/list-header/list-header.component.ts
@@ -1,18 +1,21 @@
-import {Component, OnInit} from '@angular/core';
+import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {faFilter} from '@fortawesome/free-solid-svg-icons/faFilter';
-import {faBars} from '@fortawesome/free-solid-svg-icons/faBars';
import {faPlus} from '@fortawesome/free-solid-svg-icons/faPlus';
+import {fade} from '../../../animations';
@Component({
selector: 'app-list-header',
templateUrl: './list-header.component.html',
- styleUrls: ['./list-header.component.less']
+ styleUrls: ['./list-header.component.less'],
+ animations: [fade]
})
export class ListHeaderComponent implements OnInit {
public faNew = faPlus;
public faFilter = faFilter;
- public faMenu = faBars;
+ public filterVisible = false;
+ @Output() filterVisibleChanged = new EventEmitter();
+ @Input() anyFilterActive = false;
constructor() {
}
@@ -20,4 +23,7 @@ export class ListHeaderComponent implements OnInit {
ngOnInit() {
}
+ public onFilterClick(): void {
+ this.filterVisible = !this.filterVisible || this.anyFilterActive;
+ }
}
diff --git a/src/app/widget-modules/components/list-header/list-header.module.ts b/src/app/widget-modules/components/list-header/list-header.module.ts
index fc0ebe3..78b6b28 100644
--- a/src/app/widget-modules/components/list-header/list-header.module.ts
+++ b/src/app/widget-modules/components/list-header/list-header.module.ts
@@ -4,6 +4,7 @@ import {ListHeaderComponent} from './list-header.component';
import {FontAwesomeModule} from '@fortawesome/angular-fontawesome';
import {MatButtonModule} from '@angular/material/button';
import {RouterModule} from '@angular/router';
+import {CardModule} from '../card/card.module';
@NgModule({
declarations: [ListHeaderComponent],
@@ -14,7 +15,8 @@ import {RouterModule} from '@angular/router';
CommonModule,
FontAwesomeModule,
MatButtonModule,
- RouterModule
+ RouterModule,
+ CardModule,
]
})
export class ListHeaderModule {