Enhancement: optimize tasks / stats reload (#7402)

This commit is contained in:
shamoon 2024-08-05 23:25:55 -07:00 committed by GitHub
parent 15554322dd
commit 8fa52046e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 42 additions and 25 deletions

View File

@ -5565,7 +5565,7 @@
<source>Other</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts</context>
<context context-type="linenumber">66</context>
<context context-type="linenumber">67</context>
</context-group>
</trans-unit>
<trans-unit id="8187573012244728580" datatype="html">

View File

@ -71,6 +71,13 @@ describe('StatisticsWidgetComponent', () => {
expect(reloadSpy).toHaveBeenCalled()
})
it('should not call statistics endpoint on reload if already loading', () => {
httpTestingController.expectOne(`${environment.apiBaseUrl}statistics/`)
component.loading = true
component.reload()
httpTestingController.expectNone(`${environment.apiBaseUrl}statistics/`)
})
it('should display inbox link with count', () => {
const mockStats = {
documents_total: 200,

View File

@ -1,6 +1,6 @@
import { HttpClient } from '@angular/common/http'
import { Component, OnDestroy, OnInit } from '@angular/core'
import { Observable, Subscription } from 'rxjs'
import { first, Observable, Subject, Subscription, takeUntil } from 'rxjs'
import { FILTER_HAS_TAGS_ANY } from 'src/app/data/filter-rule-type'
import { ConsumerStatusService } from 'src/app/services/consumer-status.service'
import { DocumentListViewService } from 'src/app/services/document-list-view.service'
@ -35,7 +35,7 @@ export class StatisticsWidgetComponent
extends ComponentWithPermissions
implements OnInit, OnDestroy
{
loading: boolean = true
loading: boolean = false
constructor(
private http: HttpClient,
@ -48,31 +48,32 @@ export class StatisticsWidgetComponent
statistics: Statistics = {}
subscription: Subscription
private getStatistics(): Observable<Statistics> {
return this.http.get(`${environment.apiBaseUrl}statistics/`)
}
private unsubscribeNotifer: Subject<any> = new Subject()
reload() {
if (this.loading) return
this.loading = true
this.getStatistics().subscribe((statistics) => {
this.loading = false
const fileTypeMax = 5
if (statistics.document_file_type_counts?.length > fileTypeMax) {
const others = statistics.document_file_type_counts.slice(fileTypeMax)
statistics.document_file_type_counts =
statistics.document_file_type_counts.slice(0, fileTypeMax)
statistics.document_file_type_counts.push({
mime_type: $localize`Other`,
mime_type_count: others.reduce(
(currentValue, documentFileType) =>
documentFileType.mime_type_count + currentValue,
0
),
})
}
this.statistics = statistics
})
this.http
.get<Statistics>(`${environment.apiBaseUrl}statistics/`)
.pipe(takeUntil(this.unsubscribeNotifer), first())
.subscribe((statistics) => {
this.loading = false
const fileTypeMax = 5
if (statistics.document_file_type_counts?.length > fileTypeMax) {
const others = statistics.document_file_type_counts.slice(fileTypeMax)
statistics.document_file_type_counts =
statistics.document_file_type_counts.slice(0, fileTypeMax)
statistics.document_file_type_counts.push({
mime_type: $localize`Other`,
mime_type_count: others.reduce(
(currentValue, documentFileType) =>
documentFileType.mime_type_count + currentValue,
0
),
})
}
this.statistics = statistics
})
}
getFileTypeExtension(filetype: DocumentFileType): string {
@ -105,6 +106,8 @@ export class StatisticsWidgetComponent
ngOnDestroy(): void {
this.subscription.unsubscribe()
this.unsubscribeNotifer.next(true)
this.unsubscribeNotifer.complete()
}
goToInbox() {

View File

@ -39,6 +39,12 @@ describe('TasksService', () => {
expect(req.request.method).toEqual('GET')
})
it('does not call tasks api endpoint on reload if already loading', () => {
tasksService.loading = true
tasksService.reload()
httpTestingController.expectNone(`${environment.apiBaseUrl}tasks/`)
})
it('calls acknowledge_tasks api endpoint on dismiss and reloads', () => {
tasksService.dismissTasks(new Set([1, 2, 3]))
const req = httpTestingController.expectOne(

View File

@ -50,6 +50,7 @@ export class TasksService {
constructor(private http: HttpClient) {}
public reload() {
if (this.loading) return
this.loading = true
this.http