Переглянути джерело

use in real situation (in parameters/website)

Olivier Massot 1 рік тому
батько
коміт
ee9b5fc877

+ 7 - 1
models/Organization/Subdomain.ts

@@ -1,5 +1,7 @@
-import { Bool, Str, Uid } from 'pinia-orm/dist/decorators'
+import {Attr, Bool, Str, Uid} from 'pinia-orm/dist/decorators'
 import ApiModel from '~/models/ApiModel'
+import {IriEncoded} from "~/models/decorators";
+import Organization from "~/models/Organization/Organization";
 
 /**
  * AP2i Model : Subdomain
@@ -17,4 +19,8 @@ export default class Subdomain extends ApiModel {
 
   @Bool(false, { notNullable: true })
   declare active: boolean
+
+  @Attr(null)
+  @IriEncoded(Organization)
+  declare organization: number | null
 }

+ 5 - 1
pages/parameters/website.vue

@@ -145,6 +145,8 @@ import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import Subdomain from '~/models/Organization/Subdomain'
 import ApiResource from '~/models/ApiResource'
+import Equal from '~/services/data/Filters/Equal'
+import Query from "~/services/data/Query";
 
 const { fetch, fetchCollection } = useEntityFetch()
 
@@ -159,10 +161,12 @@ const { data: parameters, pending } = fetch(
   organizationProfile.parametersId,
 ) as AsyncData<ApiResource | null, Error | null>
 
+const query = new Query(new Equal('organization', organizationProfile.id))
+
 const { data: subdomains, pending: subdomainsPending } = fetchCollection(
   Subdomain,
   null,
-  ref({ organization: organizationProfile.id }),
+  query,
 )
 
 const canAddNewSubdomain: ComputedRef<boolean> = computed(

+ 67 - 0
services/data/Filters/Equal.ts

@@ -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}`
+  }
+}

+ 5 - 1
services/data/Query.ts

@@ -10,6 +10,10 @@ import type ApiResource from '~/models/ApiResource'
 export default class Query {
   protected filters: Array<ApiFilter> = []
 
+  constructor(...filters: Array<ApiFilter>) {
+    this.filters = filters
+  }
+
   /**
    * Add an ApiFilter to the query
    *
@@ -26,7 +30,7 @@ export default class Query {
    * @see https://api-platform.com/docs/core/filters/
    */
   public getUrlQuery(): string {
-    const queryParts: string[] = ['page=1']
+    const queryParts: string[] = []
 
     this.filters.forEach((filter) => {
       const queryPart = filter.getApiQueryPart()