import type { Query as PiniaOrmQuery } from 'pinia-orm' import type { ApiFilter } from '~/types/data' import ApiResource from '~/models/ApiResource' import { SEARCH_STRATEGY } from '~/types/enum/data' export default class PageFilter implements ApiFilter { page: Ref itemsPerPage: Ref reactiveFilter: boolean /** * @param page * @param itemsPerPage * @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( page: Ref, itemsPerPage: Ref, reactiveFilter: boolean = false, ) { this.page = page this.itemsPerPage = itemsPerPage this.reactiveFilter = reactiveFilter } public applyToPiniaOrmQuery( query: PiniaOrmQuery, ): PiniaOrmQuery { const page = this.reactiveFilter ? this.page : ref(this.page.value) const itemsPerPage = this.reactiveFilter ? this.itemsPerPage : ref(this.itemsPerPage.value) return query.offset(itemsPerPage.value * (page.value - 1)).limit(itemsPerPage.value) } public getApiQueryPart(): string { return `page=${this.page.value}&itemsPerPage=${this.itemsPerPage.value}` } }