Skip to content

Commit 95577d9

Browse files
wip(web-worker): base functionality implemented
1 parent 2ea5580 commit 95577d9

File tree

14 files changed

+128
-67
lines changed

14 files changed

+128
-67
lines changed

Phonebook.Frontend/src/app/modules/table/PersonsDataSource.ts

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { MatTableDataSource } from '@angular/material/table';
22
import { BehaviorSubject, Observable } from 'rxjs';
3-
import { TableLogic } from 'src/app/modules/table/table-logic';
4-
import { Column, SearchFilter, TableSort } from 'src/app/shared/models';
3+
import { performSearch, SearchParams } from 'src/app/modules/table/SearchParams';
4+
import { SearchFilter, TableSort } from 'src/app/shared/models';
55
import { Person } from 'src/app/shared/models/classes';
6-
import { PhonebookSortDirection } from 'src/app/shared/models/enumerables/PhonebookSortDirection';
6+
import { ColumnId } from 'src/app/shared/models/enumerables/ColumnId';
7+
import { Environment } from 'src/environments/EnvironmentInterfaces';
8+
import { runtimeEnvironment } from 'src/environments/runtime-environment';
79

810
export class PersonsDataSource extends MatTableDataSource<Person> {
911
private PAGE_SIZE: number = 30;
@@ -33,6 +35,7 @@ export class PersonsDataSource extends MatTableDataSource<Person> {
3335
public dataChanged: BehaviorSubject<Person[]> = new BehaviorSubject<Person[]>(this.data);
3436

3537
private lastFilterKeyword: string = '';
38+
private worker: Worker | null = null;
3639

3740
constructor(private dataSource: Person[]) {
3841
super();
@@ -50,38 +53,41 @@ export class PersonsDataSource extends MatTableDataSource<Person> {
5053
public refresh(
5154
filterKeyword: string,
5255
searchFilters: SearchFilter[],
53-
searchableColumns: Column[],
56+
searchableColumns: ColumnId[],
5457
sort: TableSort
5558
): Observable<Person[]> {
5659
this.loadingSubject.next(true);
5760
return new Observable<Person[]>(observer => {
58-
let preResult = this.dataSource;
61+
const searchParams: SearchParams = {
62+
filterKeyword: filterKeyword,
63+
searchFilters: searchFilters,
64+
searchableColumns: searchableColumns,
65+
sort: sort,
66+
data: this.dataSource
67+
};
5968

60-
// Filtering
61-
searchFilters.forEach(searchFilter => {
62-
preResult = TableLogic.filter(preResult, searchFilter.filterValue, [searchFilter.filterColumn]);
63-
});
69+
if (typeof Worker !== 'undefined' && runtimeEnvironment.environment != Environment.development) {
70+
if(this.worker == null){
71+
this.worker = new Worker('./table.worker', { type: 'module' });
72+
}
73+
this.worker.onmessage = ({ data }) => {
74+
this.allData = data;
75+
this.lastFilterKeyword = filterKeyword;
6476

65-
// Searching
66-
let searchResult: Person[] = TableLogic.filter(preResult, filterKeyword, searchableColumns);
77+
this.loadingSubject.next(false);
78+
observer.next(data);
79+
observer.complete();
80+
};
81+
this.worker.postMessage(searchParams);
82+
} else {
83+
let searchResult = performSearch(searchParams);
84+
this.allData = searchResult;
85+
this.lastFilterKeyword = filterKeyword;
6786

68-
// Sorting
69-
switch (sort.direction) {
70-
case PhonebookSortDirection.none: {
71-
searchResult = TableLogic.rankedSort(searchResult, filterKeyword, searchableColumns);
72-
break;
73-
}
74-
default: {
75-
searchResult = TableLogic.sort(searchResult, sort);
76-
break;
77-
}
87+
this.loadingSubject.next(false);
88+
observer.next(searchResult);
89+
observer.complete();
7890
}
79-
this.allData = searchResult;
80-
this.lastFilterKeyword = filterKeyword;
81-
82-
this.loadingSubject.next(false);
83-
observer.next(searchResult);
84-
observer.complete();
8591
});
8692
}
8793

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { TableLogic } from 'src/app/modules/table/table-logic';
2+
import { Person, PhonebookSortDirection, SearchFilter, TableSort } from 'src/app/shared/models';
3+
import { ColumnId } from 'src/app/shared/models/enumerables/ColumnId';
4+
5+
export class SearchParams {
6+
public filterKeyword: string;
7+
public searchFilters: SearchFilter[];
8+
public searchableColumns: ColumnId[];
9+
public sort: TableSort;
10+
public data: Person[];
11+
}
12+
13+
export function performSearch(searchParams: SearchParams): Person[] {
14+
let preResult = searchParams.data;
15+
16+
// Filtering
17+
searchParams.searchFilters.forEach(searchFilter => {
18+
preResult = TableLogic.filter(preResult, searchFilter.filterValue, [searchFilter.filterColumn]);
19+
});
20+
21+
// Searching
22+
let searchResult: Person[] = TableLogic.filter(preResult, searchParams.filterKeyword, searchParams.searchableColumns);
23+
24+
// Sorting
25+
switch (searchParams.sort.direction) {
26+
case PhonebookSortDirection.none: {
27+
searchResult = TableLogic.rankedSort(searchResult, searchParams.filterKeyword, searchParams.searchableColumns);
28+
break;
29+
}
30+
default: {
31+
searchResult = TableLogic.sort(searchResult, searchParams.sort);
32+
break;
33+
}
34+
}
35+
return searchResult;
36+
}

Phonebook.Frontend/src/app/modules/table/components/table/table.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { SearchState, SetTableResultCount, TableState, UpdateUrl } from 'src/app
2121
})
2222
export class TableComponent implements OnInit, OnDestroy {
2323
public get displayedColumns(): string[] {
24-
return this.store.selectSnapshot(TableState.visibleColumns).map(col => col.id);
24+
return this.store.selectSnapshot(TableState.visibleColumns);
2525
}
2626

2727
public dataSource: PersonsDataSource = new PersonsDataSource([]);

Phonebook.Frontend/src/app/modules/table/dialogs/table-settings-dialog/table-settings.dialog.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ <h2 i18n="TableSettingsDialog|Title of displayed table columns@@TableSettingsDia
3030
>
3131
<mat-card class="item" cdkDrag *ngFor="let column of displayedColumns">
3232
<mat-card-title-group>
33-
{{ columnTranslate.getTranslation(column.id) }}
33+
{{ columnTranslate.getTranslation(column) }}
3434
<mat-icon>drag_handle</mat-icon>
3535
</mat-card-title-group>
3636
</mat-card>
@@ -53,7 +53,7 @@ <h2 i18n="TableSettingsDialog|Title of displayed table columns@@TableSettingsDia
5353
>
5454
<mat-card class="item" cdkDrag *ngFor="let column of notDisplayedColumns">
5555
<mat-card-title-group>
56-
{{ columnTranslate.getTranslation(column.id) }}
56+
{{ columnTranslate.getTranslation(column) }}
5757
<mat-icon>drag_handle</mat-icon>
5858
</mat-card-title-group>
5959
</mat-card>

Phonebook.Frontend/src/app/modules/table/dialogs/table-settings-dialog/table-settings.dialog.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core';
33
import { Store } from '@ngxs/store';
44
import { ColumnDefinitions } from 'src/app/shared/config/columnDefinitions';
55
import { ColumnTranslate } from 'src/app/shared/config/columnTranslate';
6-
import { Column } from 'src/app/shared/models';
6+
import { ColumnId } from 'src/app/shared/models/enumerables/ColumnId';
77
import { ResetTableSettings, SetVisibleTableColumns, TableState } from 'src/app/shared/states';
88

99
@Component({
@@ -12,8 +12,8 @@ import { ResetTableSettings, SetVisibleTableColumns, TableState } from 'src/app/
1212
styleUrls: ['./table-settings.dialog.scss']
1313
})
1414
export class TableSettingsDialog implements OnInit {
15-
public notDisplayedColumns: Column[] = [];
16-
public displayedColumns: Column[] = this.store.selectSnapshot(TableState.visibleColumns);
15+
public notDisplayedColumns: ColumnId[] = [];
16+
public displayedColumns: ColumnId[] = this.store.selectSnapshot(TableState.visibleColumns);
1717

1818
constructor(public store: Store, public columnTranslate: ColumnTranslate) {}
1919

@@ -22,11 +22,13 @@ export class TableSettingsDialog implements OnInit {
2222
}
2323

2424
private updateNotDisplayedColumns() {
25-
this.notDisplayedColumns = ColumnDefinitions.getAll().filter(col => {
26-
return !this.displayedColumns.some(column => {
27-
return col.id === column.id;
28-
});
29-
});
25+
this.notDisplayedColumns = ColumnDefinitions.getAll()
26+
.filter(col => {
27+
return !this.displayedColumns.some(columnId => {
28+
return col.id === columnId;
29+
});
30+
})
31+
.map(col => col.id);
3032
}
3133

3234
public resetTableSettings() {

Phonebook.Frontend/src/app/modules/table/table-logic.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Helpers } from 'src/app/modules/table/helpers';
22
import { ColumnDefinitions } from 'src/app/shared/config/columnDefinitions';
3-
import { Column } from 'src/app/shared/models';
43
import { Person } from 'src/app/shared/models/classes/Person';
54
import { PhonebookSortDirection } from 'src/app/shared/models/enumerables/PhonebookSortDirection';
65
import { TableSort } from 'src/app/shared/models/interfaces/TableSort';
6+
import { ColumnId } from 'src/app/shared/models/enumerables/ColumnId';
77

88
/**
99
* This Class Contains the Filter and Sort Logic of the User List.
@@ -15,15 +15,15 @@ export class TableLogic {
1515
* @param filterString
1616
* @param columns
1717
*/
18-
public static filter(persons: Person[], filterString: string, searchColumns: Column[]): Person[] {
18+
public static filter(persons: Person[], filterString: string, searchColumns: ColumnId[]): Person[] {
1919
if (filterString === '') {
2020
return persons;
2121
}
2222
const searchString = TableLogic.prepareSearchString(filterString);
2323

2424
return persons.filter(person => {
2525
for (let i = 0; i < searchColumns.length; i++) {
26-
if (searchColumns[i].filterFunction(searchString, person)) {
26+
if (ColumnDefinitions[searchColumns[i]].filterFunction(searchString, person)) {
2727
return true;
2828
}
2929
}
@@ -47,7 +47,7 @@ export class TableLogic {
4747
* @param filterString The keyword you are ranking after.
4848
* @param columns Column enum with set Flags for each Column you want to search in.
4949
*/
50-
public static rankedSort(list: Person[], rankString: string, columns: Column[]): Person[] {
50+
public static rankedSort(list: Person[], rankString: string, columns: ColumnId[]): Person[] {
5151
const rankedList: RankedListItem<Person>[] = list.map(person => {
5252
return new RankedListItem<Person>(person);
5353
});
@@ -60,8 +60,8 @@ export class TableLogic {
6060

6161
// Calculate the rank for all items.
6262
columns.forEach(col => {
63-
if (col.filterFunction(searchString, x.item)) {
64-
x.rank += col.rank;
63+
if (ColumnDefinitions[col].filterFunction(searchString, x.item)) {
64+
x.rank += ColumnDefinitions[col].rank;
6565
}
6666
});
6767
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { performSearch } from 'src/app/modules/table/SearchParams';
2+
3+
/// <reference lib="webworker" />
4+
5+
addEventListener('message', ({ data }) => {
6+
postMessage(performSearch(data));
7+
});

Phonebook.Frontend/src/app/shared/components/add-filter/add-filter.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ export class AddFilterComponent {
3838
if (this.resetSearchTerm) {
3939
this.store.dispatch(new UpdateUrl({ searchTerm: '' }));
4040
}
41-
this.store.dispatch(new AddSearchFilter({ filterColumn: this.filterColumn, filterValue: this.filterValue }));
41+
this.store.dispatch(new AddSearchFilter({ filterColumn: this.filterColumn.id, filterValue: this.filterValue }));
4242
}
4343
}

Phonebook.Frontend/src/app/shared/components/search/search.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
</button>
55
<mat-chip-list>
66
<mat-chip *ngFor="let filter of searchFilters$ | async" [removable]="true" (removed)="removeFilter(filter)">
7-
{{ columnTranslate.getTranslation(filter.filterColumn.id) }}: {{ filter.filterValue }}
7+
{{ columnTranslate.getTranslation(filter.filterColumn) }}: {{ filter.filterValue }}
88
<mat-icon matChipRemove class="pb-chip-remove">cancel</mat-icon>
99
</mat-chip>
1010
</mat-chip-list>

Phonebook.Frontend/src/app/shared/components/search/search.component.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@ import { Observable } from 'rxjs';
66
import { ColumnDefinitions } from 'src/app/shared/config/columnDefinitions';
77
import { ColumnTranslate } from 'src/app/shared/config/columnTranslate';
88
import { SearchFilter } from 'src/app/shared/models';
9-
import { AddSearchFilter, RemoveLastSearchFilter, RemoveSearchFilter, ResetSearch, SearchState, UpdateUrl } from 'src/app/shared/states';
9+
import {
10+
AddSearchFilter,
11+
RemoveLastSearchFilter,
12+
RemoveSearchFilter,
13+
ResetSearch,
14+
SearchState,
15+
UpdateUrl
16+
} from 'src/app/shared/states';
1017

1118
@Component({
1219
selector: 'app-search',
@@ -80,7 +87,7 @@ export class SearchComponent implements OnInit, OnDestroy {
8087
return keyvalue[0].toLowerCase() === this.columnTranslate.getTranslation(col.id).toLowerCase();
8188
});
8289
if (col != null) {
83-
this.store.dispatch(new AddSearchFilter({ filterColumn: col, filterValue: keyvalue[1] }));
90+
this.store.dispatch(new AddSearchFilter({ filterColumn: col.id, filterValue: keyvalue[1] }));
8491
(event.target as HTMLInputElement).value = '';
8592
} else {
8693
this.snackBar

0 commit comments

Comments
 (0)