Equal.ts 2.0 KB

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