瀏覽代碼

ajout des filtres dans la construction d'une url pour une list et possibilité de normalizer un item via une query

Vincent GUFFON 4 年之前
父節點
當前提交
d634a269b9

+ 6 - 0
services/connection/urlOptionsBuilder.ts

@@ -50,6 +50,12 @@ class UrlOptionsBuilder {
       options.push(`page=${listArgs.page}`)
       options.push(`page=${listArgs.page}`)
     }
     }
 
 
+    if (listArgs.filters) {
+      for(const filter of listArgs.filters){
+        options.push(`${filter.key}=${filter.value}`)
+      }
+    }
+
     return options
     return options
   }
   }
 }
 }

+ 11 - 2
services/serializer/normalizer/model.ts

@@ -3,6 +3,8 @@ import BaseNormalizer from '~/services/serializer/normalizer/baseNormalizer'
 import {AnyJson, DataPersisterArgs} from '~/types/interfaces'
 import {AnyJson, DataPersisterArgs} from '~/types/interfaces'
 import { QUERY_TYPE } from '~/types/enums'
 import { QUERY_TYPE } from '~/types/enums'
 import { repositoryHelper } from '~/services/store/repository'
 import { repositoryHelper } from '~/services/store/repository'
+import { Item } from '@vuex-orm/core'
+import {queryHelper} from "~/services/store/query";
 
 
 /**
 /**
  * @category Services/serializer/normalizer
  * @category Services/serializer/normalizer
@@ -24,7 +26,14 @@ class Model extends BaseNormalizer {
       throw new Error('*args* has no model attribute')
       throw new Error('*args* has no model attribute')
     }
     }
 
 
-    const item = repositoryHelper.findItemFromModel(args.model, args.idTemp ? args.idTemp : args.id)
+    let item:Item = null
+    const itemId = args.idTemp ? args.idTemp : args.id
+
+    if(args.query){
+      item = queryHelper.getItem(args.query, itemId)
+    }else{
+      item = repositoryHelper.findItemFromModel(args.model, itemId)
+    }
 
 
     if (!item || typeof item === 'undefined') {
     if (!item || typeof item === 'undefined') {
       throw new Error('Item not found')
       throw new Error('Item not found')
@@ -50,7 +59,7 @@ class Model extends BaseNormalizer {
    * @param data
    * @param data
    */
    */
   public static sanitizeBeforePost(data:AnyJson): AnyJson{
   public static sanitizeBeforePost(data:AnyJson): AnyJson{
-    data.id = null
+    delete data.id
     return data
     return data
   }
   }
 }
 }

+ 19 - 0
services/utils/modelsUtils.ts

@@ -0,0 +1,19 @@
+export default class ModelsUtils {
+  /**
+   * Formate la ou les dates au format donné
+   *
+   * @param dates
+   * @param format
+   */
+  static extractIdFromUri (uri: string): number|null {
+    if(!uri) return null
+
+    const partUri: Array<string> = uri.split('/')
+    const id:any = partUri.pop()
+
+    if(isNaN(id))
+      throw new Error('id is not a number')
+
+    return parseInt(id)
+  }
+}

+ 13 - 5
types/interfaces.d.ts

@@ -1,4 +1,4 @@
-import { Model } from '@vuex-orm/core'
+import { Model, Query } from '@vuex-orm/core'
 import { Ability } from '@casl/ability'
 import { Ability } from '@casl/ability'
 import { Store } from 'vuex'
 import { Store } from 'vuex'
 import { Context } from '@nuxt/types/app'
 import { Context } from '@nuxt/types/app'
@@ -154,7 +154,8 @@ interface UrlArgs {
   readonly idTemp?: any,
   readonly idTemp?: any,
   readonly rootId?: number,
   readonly rootId?: number,
   readonly showProgress?: boolean,
   readonly showProgress?: boolean,
-  readonly hook?: string
+  readonly hook?: string,
+  readonly params?: AnyJson
 }
 }
 
 
 interface ImageArgs {
 interface ImageArgs {
@@ -163,9 +164,15 @@ interface ImageArgs {
   readonly width: number
   readonly width: number
 }
 }
 
 
+interface Filter{
+  readonly key: string,
+  readonly value: string|boolean|number
+}
+
 interface ListArgs {
 interface ListArgs {
-  readonly itemsPerPage: number,
-  readonly page: number
+  readonly itemsPerPage?: number,
+  readonly page?: number
+  readonly filters?: Array<Filter>
 }
 }
 
 
 interface DataProviderArgs extends UrlArgs {
 interface DataProviderArgs extends UrlArgs {
@@ -173,7 +180,8 @@ interface DataProviderArgs extends UrlArgs {
   listArgs?: ListArgs,
   listArgs?: ListArgs,
 }
 }
 interface DataPersisterArgs extends UrlArgs {
 interface DataPersisterArgs extends UrlArgs {
-  data?: AnyJson
+  data?: AnyJson,
+  query?: Query
 }
 }
 interface DataDeleterArgs extends UrlArgs {}
 interface DataDeleterArgs extends UrlArgs {}