]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/app/shared/rest/rest-table.ts
Factorize rest-table and fix/simplify SQL
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / rest / rest-table.ts
1 import { peertubeLocalStorage } from '@app/shared/misc/peertube-web-storage'
2 import { LazyLoadEvent, SortMeta } from 'primeng/api'
3 import { RestPagination } from './rest-pagination'
4 import { Subject } from 'rxjs'
5 import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
6
7 export abstract class RestTable {
8
9 abstract totalRecords: number
10 abstract sort: SortMeta
11 abstract pagination: RestPagination
12
13 search: string
14 rowsPerPageOptions = [ 10, 20, 50, 100 ]
15 rowsPerPage = this.rowsPerPageOptions[0]
16
17 private searchStream: Subject<string>
18
19 abstract getIdentifier (): string
20
21 initialize () {
22 this.loadSort()
23 this.initSearch()
24 }
25
26 loadSort () {
27 const result = peertubeLocalStorage.getItem(this.getSortLocalStorageKey())
28
29 if (result) {
30 try {
31 this.sort = JSON.parse(result)
32 } catch (err) {
33 console.error('Cannot load sort of local storage key ' + this.getSortLocalStorageKey(), err)
34 }
35 }
36 }
37
38 loadLazy (event: LazyLoadEvent) {
39 this.sort = {
40 order: event.sortOrder,
41 field: event.sortField
42 }
43
44 this.pagination = {
45 start: event.first,
46 count: this.rowsPerPage
47 }
48
49 this.loadData()
50 this.saveSort()
51 }
52
53 saveSort () {
54 peertubeLocalStorage.setItem(this.getSortLocalStorageKey(), JSON.stringify(this.sort))
55 }
56
57 initSearch () {
58 this.searchStream = new Subject()
59
60 this.searchStream
61 .pipe(
62 debounceTime(400),
63 distinctUntilChanged()
64 )
65 .subscribe(search => {
66 this.search = search
67 this.loadData()
68 })
69 }
70
71 onSearch (event: Event) {
72 const target = event.target as HTMLInputElement
73 this.searchStream.next(target.value)
74 }
75
76 protected abstract loadData (): void
77
78 private getSortLocalStorageKey () {
79 return 'rest-table-sort-' + this.getIdentifier()
80 }
81 }