Переглянути джерело

Improved paging with ResultPage<T>

Lukas Angerer 3 роки тому
батько
коміт
46166da150

+ 1 - 1
src/RunnersMeet.Client/src/app/pages/tracks-page/tracks-page.component.html

@@ -14,4 +14,4 @@ Tracks:
 	<li *ngFor="let track of tracks | async"><app-track-list-item [track]="track"></app-track-list-item></li>
 </ul>
 
-<button type="button" (click)="loadMore()">More</button>
+<button type="button" [disabled]="!hasMore" (click)="loadMore()">More</button>

+ 5 - 3
src/RunnersMeet.Client/src/app/pages/tracks-page/tracks-page.component.ts

@@ -12,6 +12,7 @@ import { Subject } from 'rxjs';
 export class TracksPageComponent {
 	private _tracks: Track[] = [];
 	public tracks: Subject<Track[]> = new Subject<Track[]>();
+	public hasMore: boolean = false;
 
 	public showMyTracks: boolean = false;
 	public nameFilter: string = '';
@@ -40,11 +41,12 @@ export class TracksPageComponent {
 		this.tracksApi.getTracks(this.searchParams)
 			.then(trackPage => {
 				if (this.searchParams.page === 0) {
-					this._tracks = trackPage;
+					this._tracks = trackPage.items;
 				} else {
-					this._tracks.push(...trackPage);
+					this._tracks.push(...trackPage.items);
 				}
-				this.tracks.next(this._tracks)
+				this.hasMore = trackPage.hasMore;
+				this.tracks.next(this._tracks);
 			});
 	}
 }

+ 5 - 0
src/RunnersMeet.Client/src/app/result-page.ts

@@ -0,0 +1,5 @@
+export class ResultPage<T> {
+	public items: T[] = [];
+	public page: number = 0;
+	public hasMore: boolean = false;
+}

+ 3 - 2
src/RunnersMeet.Client/src/app/tracks-api.service.ts

@@ -2,6 +2,7 @@ import { HttpClient, HttpParams } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 import { lastValueFrom } from 'rxjs';
 import { ConfigService } from './config.service';
+import { ResultPage } from './result-page';
 import { Track } from './tracks/track';
 import { TrackSearchParams } from './tracks/track-search-params';
 
@@ -15,8 +16,8 @@ export class TracksApiService {
 		private readonly http: HttpClient
 	) { }
 
-	public getTracks(searchParams: TrackSearchParams): Promise<Track[]> {
-		return lastValueFrom(this.http.get<Track[]>(this.config.apiUri(`/api/tracks`), { params: searchParams.toHttpParams() }));
+	public getTracks(searchParams: TrackSearchParams): Promise<ResultPage<Track>> {
+		return lastValueFrom(this.http.get<ResultPage<Track>>(this.config.apiUri(`/api/tracks`), { params: searchParams.toHttpParams() }));
 	}
 
 	public createTrack(formData: FormData): Promise<Track> {

+ 2 - 2
src/RunnersMeet.Server/Controllers/TracksController.cs

@@ -28,7 +28,7 @@ public class TracksController : ControllerBase
 	}
 
 	[HttpGet]
-	public ActionResult<IEnumerable<Track>> GetTracks([FromQuery] int? page, [FromQuery] string? owner, [FromQuery] string? filter)
+	public ActionResult<ResultPage<Track>> GetTracks([FromQuery] int? page, [FromQuery] string? owner, [FromQuery] string? filter)
 	{
 		var query = _queryFactory.TracksQuery();
 		if (owner == "me")
@@ -47,7 +47,7 @@ public class TracksController : ControllerBase
 
 		query.Paging((page ?? 0) * _settings.PageSize, _settings.PageSize);
 
-		return Ok(query.Get());
+		return Ok(new ResultPage<Track>(query.Get(), page ?? 0, _settings.PageSize));
 	}
 
 	[HttpPost]

+ 19 - 0
src/RunnersMeet.Server/Domain/ResultPage.cs

@@ -0,0 +1,19 @@
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+// ReSharper disable PropertyCanBeMadeInitOnly.Global
+// ReSharper disable MemberCanBePrivate.Global
+
+namespace RunnersMeet.Server.Domain;
+
+public class ResultPage<T>
+{
+	public IList<T> Items { get; }
+	public int Page { get; }
+	public bool HasMore { get; }
+
+	public ResultPage(IList<T> items, int page, int pageSize)
+	{
+		Items = items;
+		Page = page;
+		HasMore = Items.Count >= pageSize;
+	}
+}