|
@@ -0,0 +1,67 @@
|
|
|
|
|
+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<string | number | null>
|
|
|
|
|
+ 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<string | number | null>,
|
|
|
|
|
+ reactiveFilter: boolean = false,
|
|
|
|
|
+ ) {
|
|
|
|
|
+ this.field = field
|
|
|
|
|
+ this.filterValue = value
|
|
|
|
|
+ this.reactiveFilter = reactiveFilter
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public applyToPiniaOrmQuery(
|
|
|
|
|
+ query: PiniaOrmQuery<ApiResource>,
|
|
|
|
|
+ ): PiniaOrmQuery<ApiResource> {
|
|
|
|
|
+
|
|
|
|
|
+ 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}`
|
|
|
|
|
+ }
|
|
|
|
|
+}
|