Browse Source

menu et layout conf

Vincent GUFFON 3 years ago
parent
commit
7b5578d9ea

+ 2 - 0
components/Layout/Menu.vue

@@ -12,6 +12,7 @@ Prend en paramètre une liste de ItemMenu et les met en forme
     class="ot_dark_grey ot_menu_color--text"
     class="ot_dark_grey ot_menu_color--text"
     app
     app
   >
   >
+    <slot name="title"></slot>
     <v-list class="left-menu">
     <v-list class="left-menu">
       <div v-for="(item, i) in menu" :key="i">
       <div v-for="(item, i) in menu" :key="i">
         <v-list-item
         <v-list-item
@@ -71,6 +72,7 @@ Prend en paramètre une liste de ItemMenu et les met en forme
         </v-list-group>
         </v-list-group>
       </div>
       </div>
     </v-list>
     </v-list>
+    <slot name="foot"></slot>
   </v-navigation-drawer>
   </v-navigation-drawer>
 </template>
 </template>
 
 

+ 3 - 2
components/Ui/Form.vue

@@ -68,7 +68,7 @@ Formulaire générique
 </template>
 </template>
 
 
 <script lang="ts">
 <script lang="ts">
-import {computed, ComputedRef, defineComponent, ref, Ref, toRefs, ToRefs, useContext} from '@nuxtjs/composition-api'
+import {computed, ComputedRef, defineComponent, ref, Ref, toRefs, ToRefs, useContext, useRouter} from '@nuxtjs/composition-api'
 import {Query} from '@vuex-orm/core'
 import {Query} from '@vuex-orm/core'
 import {repositoryHelper} from '~/services/store/repository'
 import {repositoryHelper} from '~/services/store/repository'
 import {queryHelper} from '~/services/store/query'
 import {queryHelper} from '~/services/store/query'
@@ -104,7 +104,8 @@ export default defineComponent({
     }
     }
   },
   },
   setup(props) {
   setup(props) {
-    const {$dataPersister, store, app: {router, i18n}} = useContext()
+    const {$dataPersister, store, app: {i18n}} = useContext()
+    const router = useRouter()
     const {markAsDirty, markAsNotDirty, readonly, nextStepFactory} = useForm(store)
     const {markAsDirty, markAsNotDirty, readonly, nextStepFactory} = useForm(store)
     const {id, query}: ToRefs = toRefs(props)
     const {id, query}: ToRefs = toRefs(props)
     const page = new Page(store)
     const page = new Page(store)

+ 5 - 1
composables/layout/Menus/baseMenu.ts

@@ -1,5 +1,5 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { NuxtConfig } from '@nuxt/types/config'
-import {IconItem, ItemMenu} from '~/types/interfaces'
+import {ItemMenu, ItemsMenu, IconItem} from '~/types/interfaces'
 
 
 /**
 /**
  * @category composables/layout/Menus
  * @category composables/layout/Menus
@@ -45,6 +45,10 @@ class BaseMenu {
     return null
     return null
   }
   }
 
 
+  getMenus (): ItemsMenu | null {
+    return null
+  }
+
   getHeaderMenu (): ItemMenu | null {
   getHeaderMenu (): ItemMenu | null {
     return null
     return null
   }
   }

+ 4 - 2
composables/layout/Menus/configurationMenu.ts

@@ -30,7 +30,8 @@ class ConfigurationMenu extends BaseMenu implements Menu {
     const children: ItemsMenu = []
     const children: ItemsMenu = []
 
 
     if (this.$ability.can('display', 'organization_page')) {
     if (this.$ability.can('display', 'organization_page')) {
-      children.push(this.constructMenu('organization_page', undefined, `/main/organizations/${this.$store.state.profile.organization.id}/dashboard`, true))
+      // children.push(this.constructMenu('organization_page', undefined, `/main/organizations/${this.$store.state.profile.organization.id}/dashboard`, true))
+      children.push(this.constructMenu('organization_page', undefined, `/organization`, false))
     }
     }
 
 
     if (this.$ability.can('display', 'cmf_licence_page')) {
     if (this.$ability.can('display', 'cmf_licence_page')) {
@@ -38,7 +39,8 @@ class ConfigurationMenu extends BaseMenu implements Menu {
     }
     }
 
 
     if (this.$ability.can('display', 'parameters_page')) {
     if (this.$ability.can('display', 'parameters_page')) {
-      children.push(this.constructMenu('parameters', undefined,`/main/edit/parameters/${this.$store.state.profile.organization.id}`, true))
+      // children.push(this.constructMenu('parameters', undefined,`/main/edit/parameters/${this.$store.state.profile.organization.id}`, true))
+      children.push(this.constructMenu('parameters', undefined,`/parameters`, false))
     }
     }
 
 
     if (this.$ability.can('display', 'place_page')) {
     if (this.$ability.can('display', 'place_page')) {

+ 59 - 0
composables/layout/Menus/parametersMenu.ts

@@ -0,0 +1,59 @@
+import { Ability } from '@casl/ability'
+import { NuxtConfig } from '@nuxt/types/config'
+import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
+
+/**
+ * @category composables/layout/Menus
+ * @class ConfigurationMenu
+ * Classe pour la construction du Menu Paramètres
+ */
+class ParametersMenu extends BaseMenu implements Menu {
+  private $ability: Ability;
+  private $store: AnyStore;
+
+  /**
+   * @constructor
+   * Initialisation des services issues du context
+   */
+  constructor ($config: NuxtConfig, $ability: Ability, $store: AnyStore) {
+    super($config)
+    this.$ability = $ability
+    this.$store = $store
+  }
+
+  /**
+   * Construit le menu Header Configuration ou null si aucune page accessible
+   * @return {ItemMenu | null}
+   */
+  getMenus (): ItemsMenu | null {
+    const children: ItemsMenu = []
+
+    if (this.$ability.can('display', 'parameters_page')) {
+      children.push(this.constructMenu('general_params', 'fa-cogs',`/parameters`, false))
+    }
+    if (this.$ability.can('display', 'parameters_communication_page')) {
+      children.push(this.constructMenu('communication_params', 'fa-comments',`/parameters/communication`, false))
+    }
+    if (this.$ability.can('display', 'parameters_student_page')) {
+      children.push(this.constructMenu('students_params', 'fa-users',`/parameters/student`, false))
+    }
+    if (this.$ability.can('display', 'parameters_education_page')) {
+      children.push(this.constructMenu('education_params', 'fa-graduation-cap',`/parameters/education`, false))
+    }
+    if (this.$ability.can('display', 'parameters_bills_page')) {
+      children.push(this.constructMenu('bills_params', 'fa-euro-sign',`/parameters/bills`, false))
+    }
+    if (this.$ability.can('display', 'parameters_secure_page')) {
+      children.push(this.constructMenu('secure_params', 'fa-lock',`/parameters/secure`, false))
+    }
+
+    if (children.length > 0) {
+      return children
+    } else {
+      return null
+    }
+  }
+}
+
+export const getParametersMenu = ($config: NuxtConfig, $ability: Ability, $store: AnyStore) => new ParametersMenu($config, $ability, $store).getMenus()

+ 9 - 0
composables/layout/menu.ts

@@ -17,6 +17,7 @@ import { getConfigurationMenu } from '~/composables/layout/Menus/configurationMe
 import { getMyFamilyMenu } from '~/composables/layout/Menus/myFamilyMenu'
 import { getMyFamilyMenu } from '~/composables/layout/Menus/myFamilyMenu'
 import { getMyAccessesMenu } from '~/composables/layout/Menus/myAccessesMenu'
 import { getMyAccessesMenu } from '~/composables/layout/Menus/myAccessesMenu'
 import { getAccountMenu } from '~/composables/layout/Menus/accountMenu'
 import { getAccountMenu } from '~/composables/layout/Menus/accountMenu'
+import {getParametersMenu} from "~/composables/layout/Menus/parametersMenu";
 
 
 /**
 /**
  * @category composables/layout
  * @category composables/layout
@@ -130,6 +131,14 @@ class Menu {
   useWebSiteMenuConstruct (): Ref {
   useWebSiteMenuConstruct (): Ref {
     return ref(getWebsiteMenu(this.$config, this.$ability, this.$store).getHeaderMenu())
     return ref(getWebsiteMenu(this.$config, this.$ability, this.$store).getHeaderMenu())
   }
   }
+
+  /**
+   * Construit le menu Paramètres
+   */
+  useParametersMenuConstruct (): Ref {
+    const menu: ItemsMenu | null = getParametersMenu(this.$config, this.$ability, this.$store)
+    return ref(menu)
+  }
 }
 }
 
 
 export const $useMenu = new Menu()
 export const $useMenu = new Menu()

+ 43 - 0
config/abilities/pages/parameters.yaml

@@ -23,6 +23,49 @@
       organization:
       organization:
         - {function: hasModule, parameters: ['GeneralConfig']}
         - {function: hasModule, parameters: ['GeneralConfig']}
 
 
+  parameters_communication_page:
+    action: 'display'
+    services:
+      access:
+        - { function: hasAbility, parameters: [ { action: 'read', subject: 'general-config' } ] }
+      organization:
+        - { function: hasModule, parameters: [ 'GeneralConfig' ] }
+
+  parameters_student_page:
+    action: 'display'
+    services:
+      access:
+        - { function: hasAbility, parameters: [ { action: 'read', subject: 'general-config' } ] }
+      organization:
+        - { function: hasModule, parameters: [ 'GeneralConfig' ] }
+        - {function: isSchool}
+
+  parameters_education_page:
+    action: 'display'
+    services:
+      access:
+        - { function: hasAbility, parameters: [ { action: 'read', subject: 'general-config' } ] }
+      organization:
+        - { function: hasModule, parameters: [ 'GeneralConfig' ] }
+        - { function: isSchool }
+
+  parameters_bills_page:
+    action: 'display'
+    services:
+      access:
+        - { function: hasAbility, parameters: [ { action: 'read', subject: 'general-config' } ] }
+      organization:
+        - { function: hasModule, parameters: [ 'GeneralConfig' ] }
+        - { function: isSchool }
+
+  parameters_secure_page:
+    action: 'display'
+    services:
+      access:
+        - { function: hasAbility, parameters: [ { action: 'read', subject: 'general-config' } ] }
+      organization:
+        - { function: hasModule, parameters: [ 'GeneralConfig' ] }
+
   place_page:
   place_page:
     action: 'display'
     action: 'display'
     services:
     services:

+ 7 - 0
lang/layout/fr-FR.js

@@ -1,5 +1,12 @@
 export default (context, locale) => {
 export default (context, locale) => {
   return ({
   return ({
+    general_params:'Général',
+    communication_params:'Communication',
+    students_params:'Suivi des étudiants',
+    education_params:'Enseignements',
+    bills_params:'Facturation',
+    secure_params:'Sécurité',
+    back_to_dashboard:'Quittez les paramètres',
     modif_picture:'Modifier l\'image',
     modif_picture:'Modifier l\'image',
     image_assistant:'Assistant de téléchargement',
     image_assistant:'Assistant de téléchargement',
     delete_assistant:'Assistant de suppression',
     delete_assistant:'Assistant de suppression',

File diff suppressed because it is too large
+ 69 - 0
layouts/parameters.vue


Some files were not shown because too many files changed in this diff