InArrayFilter.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 InArrayFilter extends AbstractFilter implements ApiFilter {
  8. field: string
  9. filterValue:
  10. | Array<string | number | null>
  11. | Ref<Array<string | number | null>>
  12. | null
  13. /**
  14. * @param field
  15. * @param value
  16. * @param reactiveFilter
  17. */
  18. constructor(
  19. field: string,
  20. value:
  21. | Array<string | number | null>
  22. | Ref<Array<string | number | null>>
  23. | null,
  24. reactiveFilter: boolean = false,
  25. ) {
  26. super(reactiveFilter)
  27. this.field = field
  28. this.filterValue = value
  29. }
  30. public applyToPiniaOrmQuery(
  31. query: PiniaOrmQuery<ApiResource>,
  32. ): PiniaOrmQuery<ApiResource> {
  33. const filterValue = RefUtils.castToRef(
  34. this.filterValue,
  35. this.reactiveFilter,
  36. )
  37. if (filterValue.value === null) {
  38. return query
  39. }
  40. return query.whereIn(this.field, filterValue.value)
  41. }
  42. public getApiQueryPart(): string {
  43. const filterValue = RefUtils.castToRef(
  44. this.filterValue,
  45. this.reactiveFilter,
  46. )
  47. if (filterValue.value === null) {
  48. return ''
  49. }
  50. if (!Array.isArray(filterValue.value)) {
  51. filterValue.value = [filterValue.value]
  52. }
  53. if (!filterValue.value.length > 0) {
  54. return ''
  55. }
  56. return `${this.field}[in]=${filterValue.value.join(',')}`
  57. }
  58. }