import type { Query as PiniaOrmQuery } from 'pinia-orm' import type { ApiFilter } from '~/types/data' import ApiResource from '~/models/ApiResource' export default class Equal implements ApiFilter { field: string filterValue: string | number | null | Ref reactiveFilter: boolean /** * @param field * @param value * @param reactiveFilter Est-ce qu'on doit conserver la réactivité du filtre ? Concrètement, dans le cas d'une * recherche textuelle, si le filtre est réactif, le résultat de la query Pinia-ORM sera * filtré à chaque fois que le filtre est modifié (même sans refresh ou nouvel appel à * fetchCollection). Si reactiveFilter est false (comportement par défaut), le résultat * de la query ne sera mis à jour qu'en cas de nouvel appel à fetchCollection (ou à refresh()). */ constructor( field: string, value: string | number | null | Ref, reactiveFilter: boolean = false, ) { this.field = field this.filterValue = value this.reactiveFilter = reactiveFilter } public applyToPiniaOrmQuery( query: PiniaOrmQuery, ): PiniaOrmQuery { let filterValue = null if (isRef(this.filterValue)) { filterValue = this.reactiveFilter ? this.filterValue : ref(this.filterValue.value) } else { filterValue = ref(this.filterValue) } if (filterValue === null || filterValue.value === null) { return query } return query.where(this.field, filterValue.value) } public getApiQueryPart(): string { let filterValue = null if (isRef(this.filterValue)) { filterValue = this.reactiveFilter ? this.filterValue : ref(this.filterValue.value) } else { filterValue = ref(this.filterValue) } if (filterValue === null || filterValue.value === null) { return '' } return `${this.field}=${filterValue.value}` } }