InArrayFilter.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import type { Query as PiniaOrmQuery } from 'pinia-orm'
  2. import type { Ref } from 'vue'
  3. import type { ApiFilter } from '~/types/data'
  4. import ApiResource from '~/models/ApiResource'
  5. import AbstractFilter from '~/services/data/Filters/AbstractFilter'
  6. import RefUtils from '~/services/utils/refUtils'
  7. export default class InArrayFilter extends AbstractFilter implements ApiFilter {
  8. field: string
  9. filterValue: Array<string | number | null> | Ref<Array<string | number | null>> | null
  10. /**
  11. * @param field
  12. * @param value
  13. * @param reactiveFilter
  14. */
  15. constructor(
  16. field: string,
  17. value: Array<string | number | null> | Ref<Array<string | number | null>> | 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.whereIn(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. if (!Array.isArray(filterValue.value)) {
  45. filterValue.value = [filterValue.value]
  46. }
  47. if (!filterValue.value.length > 0) {
  48. return ''
  49. }
  50. return `${this.field}[in]=${filterValue.value.join(',')}`
  51. }
  52. }