import type { Query as PiniaOrmQuery } from 'pinia-orm' import type { ApiFilter } from '~/types/data' import ApiResource from '~/models/ApiResource' import type { Ref } from "vue"; export default class EqualFilter 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 } protected filterValueToRef(): Ref { if (isRef(this.filterValue)) { if (this.reactiveFilter) { return this.filterValue } else { return ref(this.filterValue.value) } } else { return ref(this.filterValue) } } public applyToPiniaOrmQuery( query: PiniaOrmQuery, ): PiniaOrmQuery { const filterValue = this.filterValueToRef() if (filterValue.value === null) { return query } return query.where(this.field, filterValue.value) } public getApiQueryPart(): string { const filterValue = this.filterValueToRef() if (filterValue.value === null) { return '' } return `${this.field}=${filterValue.value}` } }