EqualFilter.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import type { Query as PiniaOrmQuery } from 'pinia-orm'
  2. import type { Ref } from 'vue'
  3. import type { ApiFilter } from '~/types/data'
  4. import type ApiResource from '~/models/ApiResource'
  5. import AbstractFilter from '~/services/data/Filters/AbstractFilter'
  6. import RefUtils from '~/services/utils/refUtils'
  7. export default class EqualFilter extends AbstractFilter implements ApiFilter {
  8. field: string
  9. filterValue: string | number | null | Ref<string | number | null>
  10. /**
  11. * @param field
  12. * @param value
  13. * @param reactiveFilter
  14. */
  15. constructor(
  16. field: string,
  17. value: string | number | null | Ref<string | number | null>,
  18. reactiveFilter: boolean = false,
  19. ) {
  20. super(reactiveFilter)
  21. this.field = field
  22. this.filterValue = value
  23. }
  24. public applyToPiniaOrmQuery(
  25. query: PiniaOrmQuery<ApiResource>,
  26. ): PiniaOrmQuery<ApiResource> {
  27. const filterValue = RefUtils.castToRef(
  28. this.filterValue,
  29. this.reactiveFilter,
  30. )
  31. if (filterValue.value === null) {
  32. return query
  33. }
  34. return query.where(this.field, filterValue.value)
  35. }
  36. public getApiQueryPart(): string {
  37. const filterValue = RefUtils.castToRef(
  38. this.filterValue,
  39. this.reactiveFilter,
  40. )
  41. if (filterValue.value === null) {
  42. return ''
  43. }
  44. return `${this.field}=${filterValue.value}`
  45. }
  46. }