import type { Query as PiniaOrmQuery } from 'pinia-orm' import type { Ref } from 'vue' import type { ApiFilter } from '~/types/data' import ApiResource from '~/models/ApiResource' import AbstractFilter from '~/services/data/Filters/AbstractFilter' import RefUtils from '~/services/utils/refUtils' export default class InArrayFilter extends AbstractFilter implements ApiFilter { field: string filterValue: | Array | Ref> | null /** * @param field * @param value * @param reactiveFilter */ constructor( field: string, value: | Array | Ref> | null, reactiveFilter: boolean = false, ) { super(reactiveFilter) this.field = field this.filterValue = value } public applyToPiniaOrmQuery( query: PiniaOrmQuery, ): PiniaOrmQuery { const filterValue = RefUtils.castToRef( this.filterValue, this.reactiveFilter, ) if (filterValue.value === null) { return query } return query.whereIn(this.field, filterValue.value) } public getApiQueryPart(): string { const filterValue = RefUtils.castToRef( this.filterValue, this.reactiveFilter, ) if (filterValue.value === null) { return '' } if (!Array.isArray(filterValue.value)) { filterValue.value = [filterValue.value] } if (!filterValue.value.length > 0) { return '' } return `${this.field}[in]=${filterValue.value.join(',')}` } }