EqualFilter.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import type { Query as PiniaOrmQuery } from 'pinia-orm'
  2. import type { ApiFilter } from '~/types/data'
  3. import ApiResource from '~/models/ApiResource'
  4. import type { Ref } from "vue";
  5. export default class EqualFilter implements ApiFilter {
  6. field: string
  7. filterValue: string | number | null | Ref<string | number | null>
  8. reactiveFilter: boolean
  9. /**
  10. * @param field
  11. * @param value
  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. field: string,
  20. value: string | number | null | Ref<string | number | null>,
  21. reactiveFilter: boolean = false,
  22. ) {
  23. this.field = field
  24. this.filterValue = value
  25. this.reactiveFilter = reactiveFilter
  26. }
  27. protected filterValueToRef(): Ref<string | number | null> {
  28. if (isRef(this.filterValue)) {
  29. if (this.reactiveFilter) {
  30. return this.filterValue
  31. } else {
  32. return ref(this.filterValue.value)
  33. }
  34. } else {
  35. return ref(this.filterValue)
  36. }
  37. }
  38. public applyToPiniaOrmQuery(
  39. query: PiniaOrmQuery<ApiResource>,
  40. ): PiniaOrmQuery<ApiResource> {
  41. const filterValue = this.filterValueToRef()
  42. if (filterValue.value === null) {
  43. return query
  44. }
  45. return query.where(this.field, filterValue.value)
  46. }
  47. public getApiQueryPart(): string {
  48. const filterValue = this.filterValueToRef()
  49. if (filterValue.value === null) {
  50. return ''
  51. }
  52. return `${this.field}=${filterValue.value}`
  53. }
  54. }