PageFilter.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import type { Query as PiniaOrmQuery } from 'pinia-orm'
  2. import type { ApiFilter } from '~/types/data'
  3. import ApiResource from '~/models/ApiResource'
  4. import { SEARCH_STRATEGY } from '~/types/enum/data'
  5. export default class PageFilter implements ApiFilter {
  6. page: Ref<number>
  7. itemsPerPage: Ref<number>
  8. reactiveFilter: boolean
  9. /**
  10. * @param page
  11. * @param itemsPerPage
  12. * @param reactiveFilter Est-ce qu'on doit conserver la réactivité du filtre ? Concrètement, dans le cas d'une
  13. * recherche textuelle, si le filtre est réactif, le résultat de la query Pinia-ORM sera
  14. * filtré à chaque fois que le filtre est modifié (même sans refresh ou nouvel appel à
  15. * fetchCollection). Si reactiveFilter est false (comportement par défaut), le résultat
  16. * de la query ne sera mis à jour qu'en cas de nouvel appel à fetchCollection (ou à refresh()).
  17. */
  18. constructor(
  19. page: Ref<number>,
  20. itemsPerPage: Ref<number>,
  21. reactiveFilter: boolean = false,
  22. ) {
  23. this.page = page
  24. this.itemsPerPage = itemsPerPage
  25. this.reactiveFilter = reactiveFilter
  26. }
  27. public applyToPiniaOrmQuery(
  28. query: PiniaOrmQuery<ApiResource>,
  29. ): PiniaOrmQuery<ApiResource> {
  30. const page = this.reactiveFilter
  31. ? this.page
  32. : ref(this.page.value)
  33. const itemsPerPage = this.reactiveFilter
  34. ? this.itemsPerPage
  35. : ref(this.itemsPerPage.value)
  36. return query.offset(itemsPerPage.value * (page.value - 1)).limit(itemsPerPage.value)
  37. }
  38. public getApiQueryPart(): string {
  39. return `page=${this.page.value}&itemsPerPage=${this.itemsPerPage.value}`
  40. }
  41. }