Browse Source

fix laetitia

Vincent GUFFON 3 years ago
parent
commit
4137818b72

+ 1 - 1
.env.preprod

@@ -1,5 +1,5 @@
 ## PREPROD ENVIRONMENT FILE
-NODE_ENV=production
+NODE_ENV=preprod
 DEBUG=1
 
 ## API Base Url

+ 1 - 1
components/Layout/AlertBar/SwitchYear.vue

@@ -40,7 +40,7 @@ export default defineComponent({
       setHistorical(['present'])
       if(profileOrganization.currentActivityYear)
         setActivityYear(profileOrganization.currentActivityYear)
-      
+
       markFormAsNotDirty()
       await updateMyProfile()
       window.location.reload()

+ 1 - 1
components/Layout/Header/UniversalCreation/GenerateCardsSteps.vue

@@ -25,7 +25,7 @@
             || $ability.can('manage', 'events'))"
             title="an_event"
             text-content="add_an_event_course"
-            icon="fa fa-comment"
+            icon="fa fa-calendar-alt"
             type="event"
             @typeClick="onTypeClick"
           >

+ 54 - 62
components/Layout/SubHeader/PersonnalizedList.vue

@@ -16,20 +16,36 @@
           {{ $t('my_list') }}
         </span>
       </template>
-      <v-list>
-        <v-list-item>
-          <v-list-item-title>
-            <UiInputAutocomplete
-              :label="$t('searchList')"
-              :is-loading="isLoading"
-              :items="items"
-              :item-text="['label']"
-              :return-object="true"
-              @update="goOn"
-            />
-          </v-list-item-title>
-        </v-list-item>
-      </v-list>
+      <v-card scrollable>
+        <v-card-title class="text-body-2 header-personnalized">
+          <v-text-field
+            dense
+            clear-icon="header-personnalized"
+            :loading="fetchState.pending"
+            v-model="search"
+            :label="$t('searchList')"
+          />
+        </v-card-title>
+        <v-card-text class="ma-0 pa-0 mt-n3 header_menu">
+          <v-list dense :subheader="true">
+            <template v-for="(item, index) in filteredItems">
+              <v-list-item
+                :id="item.id"
+                :key="index"
+                :href="goOn(item)"
+                router
+                exact
+              >
+                <v-list-item-title>
+                  {{item.label}} - <strong>{{$t(item.menuKey)}}</strong>
+                </v-list-item-title>
+              </v-list-item>
+            </template>
+
+          </v-list>
+        </v-card-text>
+      </v-card>
+
     </v-menu>
   </main>
 </template>
@@ -43,78 +59,54 @@ import { QUERY_TYPE } from '~/types/enums'
 import { PersonalizedList } from '~/models/Access/PersonalizedList'
 import { repositoryHelper } from '~/services/store/repository'
 import { AnyJson } from '~/types/interfaces'
-import { $objectProperties } from '~/services/utils/objectProperties'
-import VueI18n from "vue-i18n";
+import {queryHelper} from "~/services/store/query";
 
 export default defineComponent({
   fetchOnServer: false,
   setup () {
-    const { $dataProvider, $config } = useContext()
-    const isLoading: Ref<boolean> = ref(true)
+    const { $dataProvider, $config, app:{i18n} } = useContext()
     const homeUrl:string = $config.baseURL_adminLegacy
 
-    useFetch(async () => {
+    const {fetchState} = useFetch(async () => {
       await $dataProvider.invoke({
         type: QUERY_TYPE.MODEL,
         model: PersonalizedList
       })
-      isLoading.value = false
     })
 
     const items:ComputedRef<Array<AnyJson>> = computed(() => {
-      const lists = repositoryHelper.findCollectionFromModel(PersonalizedList, {'id':'desc'}) as Collection<PersonalizedList>
-
-      let listsGroupByKeyMenu:Array<AnyJson> = groupListByKey(lists)
-
-      listsGroupByKeyMenu = $objectProperties.sortObjectByKey(listsGroupByKeyMenu)
+      const query = repositoryHelper.getRepository(PersonalizedList).query()
+      return queryHelper.getCollection(query, {'label':'asc'}) as Collection<PersonalizedList>
+    })
 
-      return constructAutoCompleteItems(listsGroupByKeyMenu)
+    const search = ref('');
+    const filteredItems = computed(() => {
+      return items.value.filter( item => {
+          return item.label.toLowerCase().indexOf(search.value.toLowerCase()) >= 0
+            ||i18n.t(item.menuKey).toLowerCase().indexOf(search.value.toLowerCase()) >= 0
+        }
+      )
     })
 
     const goOn = (list:PersonalizedList) => {
-      window.location.href = `${homeUrl}/${list.entity}/list/${list.id}`
+      return `${homeUrl}/${list.entity}/list/${list.id}`
     }
 
     return {
       items,
-      isLoading,
-      goOn
+      fetchState,
+      goOn,
+      filteredItems,
+      search,
+      homeUrl
     }
   }
 })
-
-/**
-   * On regroupe la list par clé afin de constituer les groups
-   * @param lists
-   * @param i18n
-   */
-function groupListByKey (lists:Collection<PersonalizedList>): Array<AnyJson> {
-  const { app: { i18n } } = useContext()
-  const listsGroupByKeyMenu:any = {}
-  for (const list of lists) {
-    const key = i18n.t(list.menuKey) as string
-    listsGroupByKeyMenu[key] = listsGroupByKeyMenu[key] ?? []
-    listsGroupByKeyMenu[key].push(list)
-  }
-  return listsGroupByKeyMenu
-}
-
-/**
-   * On construit la list d'Item, constituée de Header et d'Item "sélectionnable"
-   * @param listsGroupByKeyMenu
-   */
-function constructAutoCompleteItems (listsGroupByKeyMenu:Array<any>) {
-  const items: any = []
-  for (const key in listsGroupByKeyMenu) {
-    items.push({ header: key })
-    for (const item of listsGroupByKeyMenu[key]) {
-      items.push(item)
-    }
-  }
-  return items
-}
 </script>
 
-<style scoped>
-
+<style type="text/css" lang="scss">
+  .header-personnalized{
+    margin-bottom: 0px;
+    padding-bottom: 0px;
+  }
 </style>

+ 1 - 1
components/Layout/Subheader.vue

@@ -13,7 +13,7 @@ Contient entre autres le breadcrumb, les commandes de changement d'année et les
       <LayoutSubHeaderBreadcrumbs class="mr-auto" />
 
       <v-card
-        class="d-md-flex ot_super_light_grey pt-2 mr-6  align-baseline"
+        class="d-md-flex ot_light_grey pt-2 mr-6  align-baseline"
         flat
         tile
       >

+ 8 - 1
components/Ui/Input/Autocomplete.vue

@@ -23,6 +23,7 @@ Liste déroulante avec autocompletion
       :prepend-icon="prependIcon"
       :error="error"
       :rules="rules"
+      :menu-props="menuProps"
       @input="onChange($event)"
     >
       <template v-if="slotText" #item="data">
@@ -33,7 +34,7 @@ Liste déroulante avec autocompletion
 </template>
 
 <script lang="ts">
-import {computed, defineComponent, ComputedRef, Ref, ref, watch, onUnmounted, useContext} from '@nuxtjs/composition-api'
+import {computed, defineComponent, ComputedRef, Ref, ref, watch, onUnmounted, useContext, onMounted} from '@nuxtjs/composition-api'
 import { AnyJson } from '~/types/interfaces'
 import * as _ from 'lodash'
 import {$objectProperties} from "~/services/utils/objectProperties";
@@ -106,6 +107,10 @@ export default defineComponent({
       type: Boolean,
       default: false
     },
+    menuProps: {
+      type: Object,
+      default: false
+    },
     rules: {
       type: Array,
       required: false,
@@ -128,6 +133,7 @@ export default defineComponent({
         emit('research', newResearch)
     }, 500))
 
+
     onUnmounted(() => {
       unwatch()
     })
@@ -188,6 +194,7 @@ export default defineComponent({
       return finalItems
     }
 
+
     return {
       label_field: props.label ?? props.field,
       itemsToDisplayed,

+ 2 - 2
components/Ui/Input/DatePicker.vue

@@ -30,7 +30,6 @@ Sélecteur de dates
       </template>
       <v-date-picker
         v-model="datesParsed"
-        locale="fr"
         :range="range"
         color="ot_green lighten-1"
         @input="dateOpen = range && datesParsed.length < 2"
@@ -96,12 +95,13 @@ export default defineComponent({
     }
 
     const datesFormatted: ComputedRef<string|null> = computed(() => {
+      if (props.range && datesParsed.value.length < 2) { return }
       return datesParsed.value ? dateUtils.formattedDate(datesParsed.value, 'DD/MM/YYYY') :  null
     })
 
     const unwatch: WatchStopHandle = watch(datesParsed, (newValue, oldValue) => {
       if (newValue === oldValue) { return }
-      if (Array.isArray(newValue) && newValue.length < 2) { return }
+      if (props.range && newValue.length < 2) { return }
       onChange(Array.isArray(newValue) ? dateUtils.sortDate(newValue) : newValue)
     })
 

+ 0 - 9
components/Ui/Template/DataTable.vue

@@ -12,12 +12,7 @@ Tableau interactif
     <v-data-table
       :headers="headersWithItem"
       :items="items"
-      :locale="$i18n.locale"
       class="elevation-1"
-      :footer-props="{
-        'items-per-page-text':  $t('itemsPerPage'),
-        'items-per-page-all-text':  $t('allResult')
-      }"
     >
       <template v-for="header in headersWithItem" #[header.item]="props">
         <slot :name="header.item" v-bind="props">
@@ -25,10 +20,6 @@ Tableau interactif
         </slot>
       </template>
 
-      <template #[`footer.page-text`]="items">
-        {{ items.pageStart }} - {{ items.pageStop }} {{$t('of')}} {{ items.itemsLength }}
-      </template>
-
     </v-data-table>
   </v-col>
 </template>

+ 6 - 0
config/nuxtConfig/vuetify.js

@@ -1,8 +1,14 @@
 import colors from 'vuetify/es5/util/colors'
+// Translation provided by Vuetify (typescript)
+import fr from 'vuetify/src/locale/fr'
 
 export default {
   // Vuetify module configuration (https://go.nuxtjs.dev/config-vuetify)
   vuetify: {
+    lang: {
+      locales: { fr },
+      current: 'fr',
+    },
     icons: {
       iconfont: 'fa' || 'mdi'
     },

+ 5 - 5
lang/layout/fr-FR.js

@@ -10,11 +10,11 @@ export default (context, locale) => {
     add_any_type_material:'Ajoutez tout type de matériel ou de documents tels que des partitions à votre parc de matériel',
     a_materiel:'Un matériel',
     sen_email_letter:'Envoyez un email, un courrier, ou un SMS aux personnes de votre carnet d\'adresses',
-    a_correspondence:'Une Correspondance',
+    a_correspondence:'Une correspondance',
     add_an_event_course:'Ajoutez un évenement, un cours, une prestation pédagogique, un examen... à votre planning',
     an_event:'Un évènement',
     add_new_person_student:'Ajoutez un nouveau membre parent, élève, professeur, personnel... à votre répertoire',
-    a_person:'une personne',
+    a_person:'Une personne',
     other_event_text_creation_card:'Comprend entre autres: auditions, concerts, répétitions, spectacles, stages...',
     educational_services_text_creation_card:'Correspond aux interventions en milieu scolaire, pénitentiaire, ou hospitalier',
     exam_text_creation_card:'Permet d\'organiser des examens avec la gestion des jurys, des convocations et des résultats',
@@ -65,7 +65,7 @@ export default (context, locale) => {
     attendances: 'Absences',
     equipment: 'Parc matériel',
     education_state: 'Suivi pédagogique',
-    criteria_notations: "Critère d'évaluation",
+    criteria_notations: "Critères d'évaluation",
     education_notation_configs: "Grilles d'évaluation",
     seizure_period: 'Périodes de saisie',
     test_seizure: 'Saisie des évaluations',
@@ -73,7 +73,7 @@ export default (context, locale) => {
     examen_results: 'Résultats des examens',
     education_by_student_validation: 'Validation par enseignement',
     billing: 'Facturation',
-    billing_product: 'Produit',
+    billing_product: 'Produits',
     billing_products_by_student: 'Produits par élève',
     billing_edition: 'Édition des factures',
     billing_accounting: 'Factures et avoirs',
@@ -154,7 +154,7 @@ export default (context, locale) => {
     notification: 'Notifications',
     history_help: 'Personnaliser la période d\'affichage',
     period_choose: 'Période à afficher',
-    date_choose: 'Choix de la période',
+    date_choose: 'Veuillez sélectionner deux dates',
     my_list: 'Mes listes',
     searchList: 'Rechercher parmi mes listes personnalisées',
     template_systems: 'Mails système',

+ 1 - 1
pages/organization/index.vue

@@ -362,7 +362,7 @@ Contient toutes les informations sur l'organization courante
                       field="image"
                       :ownerId="id"
                       @update="updateRepository"
-                    ></UiImage>v
+                    ></UiImage>
                   </div>
                 </v-col>
 

+ 8 - 1
services/store/query.ts

@@ -2,6 +2,7 @@ import { Query as VuexQuery } from '@vuex-orm/core'
 import { Collection, Item } from '@vuex-orm/core/dist/src/data/Data'
 import { $objectProperties } from '~/services/utils/objectProperties'
 import { AnyJson } from '~/types/interfaces'
+import {OrderByVuexOrm} from "~/types/types";
 
 /**
  * Classe Wrapper pour assurer les opérations les plus communes des Query de VuexORM
@@ -38,7 +39,13 @@ class Query {
    * @param {VuexQuery} query
    * @return {Collection} Array d'Item
    */
-  public getCollection (query: VuexQuery): Collection {
+  public getCollection (query: VuexQuery, orderBy?: OrderByVuexOrm): Collection {
+    if(orderBy){
+      for(const orderKey in orderBy){
+        query.orderBy(orderKey, orderBy[orderKey])
+      }
+    }
+
     return query.get()
   }