瀏覽代碼

generalize new fetchCollection in paramaters page

Olivier Massot 1 年之前
父節點
當前提交
5ada596fa3

+ 1 - 1
components/Layout/Header/Notification.vue

@@ -120,7 +120,7 @@ const {
 } = await fetchCollection(Notification, null, query)
 
 /**
- * On récupère les Notifications via le store (sans ça, les mises à jour SSE ne seront pas prises en compte)
+ * On récupère les Notifications via le store
  */
 const notifications: ComputedRef<Array<Notification>> = computed(() => {
   return notificationRepo.getNotifications()

+ 1 - 1
components/Layout/SubHeader/PersonnalizedList.vue

@@ -61,7 +61,7 @@ import UrlUtils from '~/services/utils/urlUtils'
 
 const btn: Ref = ref(null)
 
-const { fetch, fetchCollection } = useEntityFetch()
+const { fetchCollection } = useEntityFetch()
 
 const { data: collection, pending } = await fetchCollection(PersonalizedList)
 

+ 1 - 5
components/Ui/Collection.vue

@@ -5,7 +5,7 @@
     <v-skeleton-loader v-if="pending" :type="loaderType" />
     <div v-else>
       <!-- Content -->
-      <slot name="list.item" v-bind="{ items }" />
+      <slot name="list.item" v-bind="{ collection.items }" />
 
       <!-- New button -->
       <v-btn v-if="newLink" class="theme-primary float-right">
@@ -53,8 +53,4 @@ const { data: collection, pending } = await fetchCollection(
   model.value,
   parent.value,
 )
-
-const items: ComputedRef<Collection> = computed(
-  () => collection.value ?? { items: [], pagination: {}, totalItems: 0 },
-)
 </script>

+ 3 - 18
pages/parameters/attendances.vue

@@ -39,8 +39,8 @@
             <td></td>
           </tr>
         </thead>
-        <tbody v-if="attendanceBookingReasons.length > 0">
-          <tr v-for="reason in attendanceBookingReasons" :key="reason.id">
+        <tbody v-if="attendanceBookingReasons!.items.length > 0">
+          <tr v-for="reason in attendanceBookingReasons!.items" :key="reason.id">
             <td class="cycle-editable-cell">
               {{ reason.reason }}
             </td>
@@ -82,14 +82,11 @@
 </template>
 <script setup lang="ts">
 import type { AsyncData } from '#app'
-import { type Collection, useRepo } from 'pinia-orm'
-import type { ComputedRef } from 'vue'
 import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 import UrlUtils from '~/services/utils/urlUtils'
 import AttendanceBookingReason from '~/models/Booking/AttendanceBookingReason'
-import AttendanceBookingReasonRepository from '~/stores/repositories/AttendanceBookingReasonRepository'
 
 const { fetch } = useEntityFetch()
 
@@ -106,22 +103,10 @@ const { data: parameters, pending } = fetch(
 
 const { fetchCollection } = useEntityFetch()
 
-const { pending: attendanceBookingReasonsPending } = fetchCollection(
+const { data: attendanceBookingReasons, pending: attendanceBookingReasonsPending } = fetchCollection(
   AttendanceBookingReason,
 )
 
-const attendanceBookingReasonsRepo = useRepo(AttendanceBookingReasonRepository)
-
-/**
- * On récupère les timings via le store
- * (sans ça, les mises à jour SSE ne seront pas prises en compte)
- */
-const attendanceBookingReasons: ComputedRef<
-  Collection<AttendanceBookingReason>
-> = computed(() => {
-  return attendanceBookingReasonsRepo.getReasons()
-})
-
 const goToEditPage = (id: number) => {
   navigateTo(UrlUtils.join('/parameters/attendance_booking_reasons', id))
 }

+ 3 - 16
pages/parameters/residence_areas/index.vue

@@ -9,8 +9,8 @@
             <td></td>
           </tr>
         </thead>
-        <tbody v-if="residenceAreas.length > 0">
-          <tr v-for="residenceArea in residenceAreas" :key="residenceArea.id">
+        <tbody v-if="residenceAreas!.items.length > 0">
+          <tr v-for="residenceArea in residenceAreas!.items" :key="residenceArea.id">
             <td class="cycle-editable-cell">
               {{ residenceArea.label }}
             </td>
@@ -53,26 +53,13 @@
 </template>
 
 <script setup lang="ts">
-import { useRepo } from 'pinia-orm'
-import type { ComputedRef } from 'vue'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import ResidenceArea from '~/models/Billing/ResidenceArea'
-import ResidenceAreasRepository from '~/stores/repositories/ResidenceAreasRepository'
 import UrlUtils from '~/services/utils/urlUtils'
 
-const residenceAreasRepo = useRepo(ResidenceAreasRepository)
-
 const { fetchCollection } = useEntityFetch()
 
-const { pending } = fetchCollection(ResidenceArea)
-
-/**
- * On récupère les Residence Area via le store
- * (sans ça, les mises à jour SSE ne seront pas prises en compte)
- */
-const residenceAreas: ComputedRef<Array<ResidenceArea>> = computed(() => {
-  return residenceAreasRepo.getResidenceAreas()
-})
+const { data: residenceAreas, pending } = fetchCollection(ResidenceArea)
 
 const goToEditPage = (id: number) => {
   navigateTo(UrlUtils.join('/parameters/residence_areas', id))

+ 6 - 4
pages/parameters/website.vue

@@ -45,10 +45,10 @@
             </div>
             <UiLoadingPanel v-if="subdomainsPending" />
             <div v-else>
-              <v-table v-if="subdomains" class="subdomains-table my-2">
+              <v-table v-if="subdomains!.items.value" class="subdomains-table my-2">
                 <tbody>
                   <tr
-                    v-for="subdomain in subdomains.items"
+                    v-for="subdomain in subdomains!.items.value"
                     :key="subdomain.id"
                     :title="subdomain.subdomain"
                     :class="
@@ -145,7 +145,7 @@ 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 EqualFilter from '~/services/data/Filters/EqualFilter'
 import Query from "~/services/data/Query";
 
 const { fetch, fetchCollection } = useEntityFetch()
@@ -161,7 +161,9 @@ const { data: parameters, pending } = fetch(
   organizationProfile.parametersId,
 ) as AsyncData<ApiResource | null, Error | null>
 
-const query = new Query(new Equal('organization', organizationProfile.id))
+const query = new Query(
+  new EqualFilter('organization', organizationProfile.id)
+)
 
 const { data: subdomains, pending: subdomainsPending } = fetchCollection(
   Subdomain,

+ 18 - 22
services/data/Filters/Equal.ts → services/data/Filters/EqualFilter.ts

@@ -1,8 +1,9 @@
 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 Equal implements ApiFilter {
+export default class EqualFilter implements ApiFilter {
   field: string
   filterValue: string | number | null | Ref<string | number | null>
   reactiveFilter: boolean
@@ -26,21 +27,24 @@ export default class Equal implements ApiFilter {
     this.reactiveFilter = reactiveFilter
   }
 
-  public applyToPiniaOrmQuery(
-    query: PiniaOrmQuery<ApiResource>,
-  ): PiniaOrmQuery<ApiResource> {
-
-    let filterValue = null
-
+  protected filterValueToRef(): Ref<string | number | null> {
     if (isRef(this.filterValue)) {
-      filterValue = this.reactiveFilter
-        ? this.filterValue
-        : ref(this.filterValue.value)
+      if (this.reactiveFilter) {
+        return this.filterValue
+      } else {
+        return ref(this.filterValue.value)
+      }
     } else {
-      filterValue = ref(this.filterValue)
+      return ref(this.filterValue)
     }
+  }
+
+  public applyToPiniaOrmQuery(
+    query: PiniaOrmQuery<ApiResource>,
+  ): PiniaOrmQuery<ApiResource> {
+    const filterValue = this.filterValueToRef()
 
-    if (filterValue === null || filterValue.value === null) {
+    if (filterValue.value === null) {
       return query
     }
 
@@ -48,17 +52,9 @@ export default class Equal implements ApiFilter {
   }
 
   public getApiQueryPart(): string {
-    let filterValue = null
-
-    if (isRef(this.filterValue)) {
-      filterValue = this.reactiveFilter
-        ? this.filterValue
-        : ref(this.filterValue.value)
-    } else {
-      filterValue = ref(this.filterValue)
-    }
+    const filterValue = this.filterValueToRef()
 
-    if (filterValue === null || filterValue.value === null) {
+    if (filterValue.value === null) {
       return ''
     }
 

+ 1 - 1
services/data/Filters/Search.ts → services/data/Filters/SearchFilter.ts

@@ -3,7 +3,7 @@ import type { ApiFilter } from '~/types/data'
 import ApiResource from '~/models/ApiResource'
 import { SEARCH_STRATEGY } from '~/types/enum/data'
 
-export default class Search implements ApiFilter {
+export default class SearchFilter implements ApiFilter {
   field: string
   filterValue: Ref<string>
   mode: SEARCH_STRATEGY

+ 4 - 3
services/data/Query.ts

@@ -34,9 +34,11 @@ export default class Query {
 
     this.filters.forEach((filter) => {
       const queryPart = filter.getApiQueryPart()
-      queryParts.push(queryPart)
+      if (queryPart) {
+        queryParts.push(queryPart)
+      }
     })
-    // console.log(queryParts)
+
     return queryParts.join('&')
   }
 
@@ -52,7 +54,6 @@ export default class Query {
     this.filters.forEach((filter) => {
       query = filter.applyToPiniaOrmQuery(query)
     })
-    // console.log(query)
     return query
   }
 }

+ 8 - 5
services/data/entityManager.ts

@@ -1,4 +1,5 @@
 import { Query as PiniaOrmQuery, Repository } from 'pinia-orm'
+import type { Collection as PiniaOrmCollection } from 'pinia-orm'
 import { v4 as uuid4 } from 'uuid'
 import * as _ from 'lodash-es'
 import ApiRequestService from './apiRequestService'
@@ -214,9 +215,9 @@ class EntityManager {
       url = UrlUtils.join('api', model.entity)
     }
 
-    query = query ?? new Query()
-    const urlQuery = query.getUrlQuery()
-    url += '?' + urlQuery
+    if (query) {
+      url += '?' + query.getUrlQuery()
+    }
 
     const response = await this.apiRequestService.get(url)
 
@@ -228,9 +229,11 @@ class EntityManager {
     })
 
     let piniaOrmQuery = this.getQuery(model)
-    piniaOrmQuery = query.applyToPiniaOrmQuery(piniaOrmQuery)
+    if (query) {
+      piniaOrmQuery = query.applyToPiniaOrmQuery(piniaOrmQuery)
+    }
 
-    const items = computed(() => piniaOrmQuery.get())
+    const items: ComputedRef<PiniaOrmCollection<ApiResource>> = computed(() => piniaOrmQuery.get())
 
     return {
       items,