Browse Source

post MR fixes

Olivier Massot 3 years ago
parent
commit
4eb6c78227

+ 0 - 127
components/Form/Parameters/SubdomainNew.vue

@@ -1,127 +0,0 @@
-<!-- Component d'un formulaire pour la saisie d'un nouveau subdomain -->
-<template>
-  <main>
-    <LayoutContainer>
-      <v-card class="mb-5 mt-4">
-        <FormToolbar title="subdomain" icon="fa-at"/>
-
-        <UiForm
-          :id="id"
-          ref="form"
-          :model="model"
-          :query="query()"
-          :submitActions="submitActions"
-        >
-          <template #form.input="{entry, updateRepository}">
-            <v-container fluid class="container">
-              <v-row>
-                <v-col cols="12" sm="6">
-                  <div>{{ $t('pleaseEnterYourNewSubdomain')}} :</div>
-                </v-col>
-              </v-row>
-              <v-row>
-                <v-col cols="12" sm="6">
-                  <UiInputText
-                    field="subdomain"
-                    label="subdomain"
-                    :data="entry['subdomain']"
-                    type="string"
-                    :rules="rules()"
-                    @change="checkSubdomainHook($event, updateRepository)"
-                  />
-                </v-col>
-              </v-row>
-              <i v-if="validationPending" class="validation_status">{{ $t('validation_ongoing') }}</i>
-              <i v-else-if="subdomainAvailable === true" class="validation_status valid">{{ $t('this_subdomain_is_available') }}</i>
-            </v-container>
-          </template>
-
-          <template #form.button>
-            <NuxtLink :to="{ path: '/parameters/communication'}" class="no-decoration">
-              <v-btn class="mr-4 ot_light_grey ot_grey--text">
-                {{ $t('back') }}
-              </v-btn>
-            </NuxtLink>
-          </template>
-
-        </UiForm>
-      </v-card>
-    </LayoutContainer>
-  </main>
-</template>
-
-<script lang="ts">
-import {defineComponent, computed, useContext, Ref, ref} from '@nuxtjs/composition-api'
-import { Repository as VuexRepository } from '@vuex-orm/core/dist/src/repository/Repository'
-import { Query, Model } from '@vuex-orm/core'
-import {SUBMIT_TYPE} from '~/types/enums'
-import { repositoryHelper } from '~/services/store/repository'
-import {AnyJson} from "~/types/interfaces";
-import {Subdomain} from "~/models/Organization/Subdomain";
-import {useValidator} from "~/composables/form/useValidator";
-
-export default defineComponent({
-  props: {
-    id:{
-      type: [Number, String],
-      required: true
-    }
-  },
-  setup () {
-    const {$dataProvider, app:{i18n}} = useContext()
-    const repository: VuexRepository<Model> = repositoryHelper.getRepository(Subdomain)
-    const query: Query = repository.query()
-    const subdomainAvailable: Ref<boolean | null> = ref(null)
-    const form = ref(null);
-    const validationPending: Ref<boolean> = ref(false)
-
-    const { checkSubdomainAvailability } = useValidator($dataProvider, i18n).useHandleSubdomain()
-
-    const submitActions = computed(() => {
-      let actions:AnyJson = {}
-      actions[SUBMIT_TYPE.SAVE_AND_BACK] = { path: `/parameters/communication` }
-      return actions
-    })
-
-    const checkSubdomainHook = async (subdomain: string | null, updateRepository: any) => {
-      subdomainAvailable.value = null
-      if (subdomain !== null && subdomain.match(/^[\w\-]{2,60}$/) !== null) {
-        validationPending.value = true
-        subdomainAvailable.value = await checkSubdomainAvailability(subdomain);
-        validationPending.value = false
-      }
-      updateRepository(subdomain, 'subdomain');
-      (form.value as any).validate()
-    }
-
-    /** todo Computed properties needs to be returned as functions until nuxt3 : https://github.com/nuxt-community/composition-api/issues/207 **/
-    return {
-      model: Subdomain,
-      query: () => query,
-      submitActions,
-      form,
-      checkSubdomainHook,
-      validationPending,
-      subdomainAvailable,
-      rules: () => [
-        (subdomain: string | null) => (subdomain !== null) || i18n.t('please_enter_a_value_for_the_subdomain'),
-        (subdomain: string | null) => (subdomain !== null && subdomain.length >= 2 && subdomain.length <=60) || i18n.t('subdomain_need_to_have_0_to_60_cars'),
-        (subdomain: string | null) => (subdomain !== null && subdomain.match(/^[\w\-]+$/) !== null) || i18n.t('subdomain_can_not_contain_spaces_or_special_cars'),
-        () => (subdomainAvailable.value === true) || i18n.t('this_subdomain_is_already_in_use')
-      ]
-    }
-  },
-  beforeDestroy() {
-    repositoryHelper.cleanRepository(Subdomain)
-  }
-})
-</script>
-
-<style scoped>
-.validation_status {
-  font-size: 13px;
-}
-.validation_status.valid {
-  color: green;
-}
-</style>

+ 1 - 1
components/Form/Parameters/Subdomains.vue

@@ -64,7 +64,7 @@ export default defineComponent({
     const { getCollection } = useDataUtils($dataProvider)
     const router = useRouter();
 
-    const organizationId = store.state.profile.organization.id
+    const organizationId: number = store.state.profile.organization.id
     const { fetchState } = getCollection(Subdomain, Organization, organizationId)
 
     const repository: VuexRepository<Model> = repositoryHelper.getRepository(Subdomain)

+ 13 - 3
composables/form/useValidator.ts

@@ -2,7 +2,6 @@ import { ref, Ref } from '@nuxtjs/composition-api'
 import VueI18n from 'vue-i18n'
 import { QUERY_TYPE } from '~/types/enums'
 import DataProvider from "~/services/data/dataProvider";
-import {ApiResponse} from "~/types/interfaces";
 
 /**
  * @category composables/form
@@ -41,11 +40,22 @@ export function useValidator($dataProvider: DataProvider, i18n: VueI18n) {
 
   function useHandleSubdomain() {
 
-    const checkSubdomainAvailability = async (subdomain: string | null) => {
+    const checkSubdomainAvailability = async (subdomain: string | null): Promise<boolean> => {
+      if (subdomain === null) {
+        return true
+      }
+
       const response = await $dataProvider.invoke({
         type: QUERY_TYPE.DEFAULT,
-        url: '/api/subdomains/?subdomain[]=' + subdomain
+        url: '/api/subdomains',
+        listArgs: {
+          filters:[
+            {key: 'subdomain', value: subdomain}
+          ]
+        }
+
       })
+
       return typeof response !== 'undefined' && response.metadata.totalItems === 0
     }
     return {

+ 0 - 1
pages/parameters/subdomain/_id.vue

@@ -80,7 +80,6 @@ export default defineComponent({
         type: QUERY_TYPE.MODEL,
         model: Subdomain,
         id: id,
-        idTemp: null,
         query: query.value
       })
     }

+ 104 - 4
pages/parameters/subdomain/new.vue

@@ -6,32 +6,132 @@
       type="text"
     />
     <div v-else>
-      <FormParametersSubdomainNew :id="item.id"></FormParametersSubdomainNew>
+      <LayoutContainer>
+        <v-card class="mb-5 mt-4">
+          <FormToolbar title="subdomain" icon="fa-at"/>
+
+          <UiForm
+            :id="item.id"
+            ref="form"
+            :model="model"
+            :query="query()"
+            :submitActions="submitActions"
+          >
+            <template #form.input="{entry, updateRepository}">
+              <v-container fluid class="container">
+                <v-row>
+                  <v-col cols="12" sm="6">
+                    <div>{{ $t('pleaseEnterYourNewSubdomain')}} :</div>
+                  </v-col>
+                </v-row>
+                <v-row>
+                  <v-col cols="12" sm="6">
+                    <UiInputText
+                      field="subdomain"
+                      label="subdomain"
+                      :data="entry['subdomain']"
+                      type="string"
+                      :rules="rules()"
+                      @change="checkSubdomainHook($event, updateRepository)"
+                    />
+                  </v-col>
+                </v-row>
+                <i v-if="validationPending" class="validation_status">{{ $t('validation_ongoing') }}</i>
+                <i v-else-if="subdomainAvailable === true" class="validation_status valid">{{ $t('this_subdomain_is_available') }}</i>
+              </v-container>
+            </template>
+
+            <template #form.button>
+              <NuxtLink :to="{ path: '/parameters/communication'}" class="no-decoration">
+                <v-btn class="mr-4 ot_light_grey ot_grey--text">
+                  {{ $t('back') }}
+                </v-btn>
+              </NuxtLink>
+            </template>
+          </UiForm>
+        </v-card>
+      </LayoutContainer>
     </div>
   </main>
 </template>
 
 <script lang="ts">
-import {defineComponent, useContext} from '@nuxtjs/composition-api'
+import {computed, defineComponent, ref, Ref, useContext} from '@nuxtjs/composition-api'
 import {useDataUtils} from "~/composables/data/useDataUtils";
 import {Subdomain} from "~/models/Organization/Subdomain";
+import {Repository as VuexRepository} from "@vuex-orm/core/dist/src/repository/Repository";
+import {Model, Query} from "@vuex-orm/core";
+import {repositoryHelper} from "~/services/store/repository";
+import {useValidator} from "~/composables/form/useValidator";
+import {AnyJson} from "~/types/interfaces";
+import {SUBMIT_TYPE} from "~/types/enums";
 
 export default defineComponent({
   name: 'NewFormParametersSubdomain',
   setup () {
-    const {$dataProvider, store} = useContext()
+    const subdomainAvailable: Ref<boolean | null> = ref(null)
+    const form: Ref<HTMLCanvasElement | null> = ref(null);
+    const validationPending: Ref<boolean> = ref(false)
+
+    const {$dataProvider, store, app:{i18n}} = useContext()
+    const repository: VuexRepository<Model> = repositoryHelper.getRepository(Subdomain)
+    const query: Query = repository.query()
+    const { checkSubdomainAvailability } = useValidator($dataProvider, i18n).useHandleSubdomain()
     const {createItem} = useDataUtils($dataProvider)
     const {create, loading, item} = createItem(store, Subdomain)
 
+    const submitActions = computed(() => {
+      let actions:AnyJson = {}
+      actions[SUBMIT_TYPE.SAVE_AND_BACK] = { path: `/parameters/communication` }
+      return actions
+    })
+
+    const checkSubdomainHook = async (subdomain: string | null, updateRepository: any) => {
+      subdomainAvailable.value = null
+      if (subdomain !== null && subdomain.match(/^[\w\-]{2,60}$/) !== null) {
+        validationPending.value = true
+        subdomainAvailable.value = await checkSubdomainAvailability(subdomain);
+        validationPending.value = false
+      }
+      updateRepository(subdomain, 'subdomain');
+      (form.value as any).validate()
+    }
+
     if(process.client){
       const itemToCreate: Subdomain = new Subdomain()
       create(itemToCreate)
     }
 
+    /** todo Computed properties needs to be returned as functions until nuxt3 : https://github.com/nuxt-community/composition-api/issues/207 **/
     return {
       loading,
-      item
+      item,
+      model: Subdomain,
+      query: () => query,
+      submitActions,
+      form,
+      checkSubdomainHook,
+      validationPending,
+      subdomainAvailable,
+      rules: () => [
+        (subdomain: string | null) => (subdomain !== null) || i18n.t('please_enter_a_value_for_the_subdomain'),
+        (subdomain: string | null) => (subdomain !== null && subdomain.length >= 2 && subdomain.length <=60) || i18n.t('subdomain_need_to_have_0_to_60_cars'),
+        (subdomain: string | null) => (subdomain !== null && subdomain.match(/^[\w\-]+$/) !== null) || i18n.t('subdomain_can_not_contain_spaces_or_special_cars'),
+        () => (subdomainAvailable.value !== false) || i18n.t('this_subdomain_is_already_in_use')
+      ]
     }
+  },
+  beforeDestroy() {
+    repositoryHelper.cleanRepository(Subdomain)
   }
 })
 </script>
+
+<style scoped>
+.validation_status {
+  font-size: 13px;
+}
+.validation_status.valid {
+  color: green;
+}
+</style>

+ 2 - 2
services/data/hookable.ts

@@ -5,7 +5,7 @@ import BaseHook from '~/services/data/hooks/baseHook'
  * Base class for an object which support hooks
  */
 abstract class Hookable {
-  protected hooks: Array<typeof BaseHook> = []; // how could we replace 'any'?
+  protected hooks: Array<typeof BaseHook> = [];
 
   /**
    * Iterate over the available hooks and invoke the ones
@@ -14,7 +14,7 @@ abstract class Hookable {
   protected async triggerHooks (args: UrlArgs) {
     for (const Hook of this.sortedHooks()) {
       if (Hook.support(args)) {
-        await new Hook(this).invoke(args)
+        await new Hook(this).invoke(args)  // TODO: trouver une alternative au passage du this dans le constructeur, je trouve pas pour le moment :(
       }
     }
   }

+ 0 - 1
services/data/hooks/hookPersister/postPersistProfileRefresh.ts

@@ -1,6 +1,5 @@
 import { DataPersisterArgs, HookPersister } from '~/types/interfaces'
 import BaseHook from '~/services/data/hooks/baseHook'
-import {Parameters} from "~/models/Organization/Parameters";
 import DataPersister from "~/services/data/dataPersister";
 
 /**