Browse Source

apply new menu system to parameters menu

Olivier Massot 1 year ago
parent
commit
c42b28c839

+ 62 - 5
config/abilities/pages/parameters.yaml

@@ -26,7 +26,7 @@ parameters_page:
         parameters: [{ action: 'read', subject: 'general-config' }],
       }
 
-parameters_communication_page:
+parameters_general_page:
   action: 'display'
   conditions:
     - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }
@@ -35,7 +35,36 @@ parameters_communication_page:
         parameters: [{ action: 'read', subject: 'general-config' }],
       }
 
-parameters_student_page:
+parameters_website_page:
+  action: 'display'
+  conditions:
+    - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }
+    - {
+        function: accessHasAnyRoleAbility,
+        parameters: [{ action: 'read', subject: 'general-config' }],
+      }
+
+parameters_teaching_page:
+  action: 'display'
+  conditions:
+    - { function: organizationIsSchool }
+    - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }
+    - {
+        function: accessHasAnyRoleAbility,
+        parameters: [{ action: 'read', subject: 'general-config' }],
+      }
+
+parameters_intranet_page:
+  action: 'display'
+  conditions:
+    - { function: organizationIsSchool }
+    - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }
+    - {
+        function: accessHasAnyRoleAbility,
+        parameters: [{ action: 'read', subject: 'general-config' }],
+      }
+
+parameters_education_notation_page:
   action: 'display'
   conditions:
     - { function: organizationIsSchool }
@@ -45,7 +74,7 @@ parameters_student_page:
         parameters: [{ action: 'read', subject: 'general-config' }],
       }
 
-parameters_education_page:
+parameters_bulletin_page:
   action: 'display'
   conditions:
     - { function: organizationIsSchool }
@@ -55,7 +84,7 @@ parameters_education_page:
         parameters: [{ action: 'read', subject: 'general-config' }],
       }
 
-parameters_bills_page:
+parameters_education_timings_page:
   action: 'display'
   conditions:
     - { function: organizationIsSchool }
@@ -65,7 +94,35 @@ parameters_bills_page:
         parameters: [{ action: 'read', subject: 'general-config' }],
       }
 
-parameters_secure_page:
+parameters_residence_areas_page:
+  action: 'display'
+  conditions:
+    - { function: organizationIsSchool }
+    - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }
+    - {
+        function: accessHasAnyRoleAbility,
+        parameters: [{ action: 'read', subject: 'general-config' }],
+      }
+
+parameters_attendances_page:
+  action: 'display'
+  conditions:
+    - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }
+    - {
+        function: accessHasAnyRoleAbility,
+        parameters: [{ action: 'read', subject: 'general-config' }],
+      }
+
+parameters_sms_page:
+  action: 'display'
+  conditions:
+    - { function: organizationHasAllModules, parameters: ['GeneralConfig', 'Sms'] }
+    - {
+        function: accessHasAnyRoleAbility,
+        parameters: [{ action: 'read', subject: 'general-config' }],
+      }
+
+parameters_super_admin_page:
   action: 'display'
   conditions:
     - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }

+ 11 - 1
lang/fr.json

@@ -186,6 +186,7 @@
   "usernameSMS": "Nom d'utilisateur SMS",
   "smsSenderName": "Personnaliser le nom de l'expéditeur SMS",
   "attendance": "Absences",
+  "parameters_attendances_page": "Absences",
   "attendanceBookingReason": "Motif d'absence / retard",
   "attendanceBookingReasons": "Motifs d'absence / retard",
   "new_attendance_booking_reason": "Nouveau motif d'absence / retard",
@@ -477,6 +478,7 @@
   "right_menu": "Droits version 5.9",
   "tree_menu": "Gestion de l'arbre",
   "website": "Site internet",
+  "parameters_website_page": "Site internet",
   "website_breadcrumbs": "Site internet",
   "websiteList": "Site(s) internet",
   "advanced_modification": "Administration site internet",
@@ -611,22 +613,29 @@
   "end_date_of_courses": "Date de fin des cours",
   "show_adherents_list_and_their_coordinates": "Afficher la liste des adhérents et leurs coordonnées",
   "students_are_also_association_members": "Les élèves sont adhérents également de l'association",
-  "general_parameters": "Paramètres généraux",
+  "parameters_general_page": "Paramètres généraux",
   "general_parameters_breadcrumbs": "Paramètres généraux",
   "teaching": "Enseignements",
+  "parameters_teaching_page": "Enseignements",
   "teaching_breadcrumbs": "Enseignements",
   "intranet_access": "Accès intranet (professeurs, élèves...)",
+  "parameters_intranet_page": "Accès intranet",
   "intranet_breadcrumbs": "Accès intranet",
   "educationNotations": "Suivi pédagogique",
+  "parameters_education_notation_page": "Suivi pédagogique",
   "education_notation_breadcrumbs": "Suivi pédagogique",
   "bulletin": "Bulletins",
+  "parameters_bulletin_page": "Bulletins",
   "bulletin_breadcrumbs": "Bulletins",
   "educationTimings": "Durée des cours (en minutes)",
   "new_education_timing": "Nouvelle durée de cours",
   "residenceAreas": "Zones de résidence",
+  "parameters_residence_areas_page": "Zones de résidence",
+  "parameters_sms_page": "Option SMS",
   "sms_option": "Option SMS",
   "sms_breadcrumbs": "SMS",
   "super_admin": "Compte super-admin",
+  "parameters_super_admin_page": "Compte super-admin",
   "super_admin_breadcrumbs": "Compte super-admin",
   "an_error_happened": "Une erreur s'est produite",
   "your_opentalent_website_address_is": "L'adresse de votre site Opentalent est",
@@ -670,6 +679,7 @@
   "EUROPE_ZURICH": "Europe/Zurich",
   "EUROPE_PARIS": "Europe/Paris",
   "licenceQrCode": "QrCode pour la licence",
+  "parameters_education_timings_page": "Durée des cours",
   "education_timings_breadcrumbs": "Durée des cours",
   "create_a_new_residence_area": "Créer une nouvelle zone de résidence",
   "residence_areas_breadcrumbs": "Zones de résidence",

+ 4 - 0
pages/parameters/attendances.vue

@@ -99,6 +99,10 @@ import UrlUtils from '~/services/utils/urlUtils'
 import AttendanceBookingReason from '~/models/Booking/AttendanceBookingReason'
 import AttendanceBookingReasonRepository from '~/stores/repositories/AttendanceBookingReasonRepository'
 
+definePageMeta({
+  name: 'parameters_attendances_page',
+})
+
 const { fetch } = useEntityFetch()
 
 const i18n = useI18n()

+ 4 - 0
pages/parameters/bulletin.vue

@@ -79,6 +79,10 @@ import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 
+definePageMeta({
+  name: 'parameters_bulletin_page',
+})
+
 const { fetch } = useEntityFetch()
 
 const organizationProfile = useOrganizationProfileStore()

+ 4 - 0
pages/parameters/education_notation.vue

@@ -64,6 +64,10 @@ import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 
+definePageMeta({
+  name: 'parameters_education_notation_page',
+})
+
 const { fetch } = useEntityFetch()
 
 const organizationProfile = useOrganizationProfileStore()

+ 4 - 0
pages/parameters/education_timings/index.vue

@@ -60,6 +60,10 @@ import EducationTimingsRepository from '~/stores/repositories/EducationTimingsRe
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 import UrlUtils from '~/services/utils/urlUtils'
 
+definePageMeta({
+  name: 'parameters_education_timings_page',
+})
+
 const organizationProfile = useOrganizationProfileStore()
 
 if (organizationProfile.parametersId === null) {

+ 4 - 0
pages/parameters/general_parameters.vue

@@ -92,6 +92,10 @@ import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 
+definePageMeta({
+  name: 'parameters_general_page'
+})
+
 const { fetch } = useEntityFetch()
 
 const organizationProfile = useOrganizationProfileStore()

+ 4 - 0
pages/parameters/intranet.vue

@@ -56,6 +56,10 @@ import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 
+definePageMeta({
+  name: 'parameters_intranet_page',
+})
+
 const { fetch } = useEntityFetch()
 
 const organizationProfile = useOrganizationProfileStore()

+ 4 - 0
pages/parameters/residence_areas/index.vue

@@ -60,6 +60,10 @@ import ResidenceArea from '~/models/Billing/ResidenceArea'
 import ResidenceAreasRepository from '~/stores/repositories/ResidenceAreasRepository'
 import UrlUtils from '~/services/utils/urlUtils'
 
+definePageMeta({
+  name: 'parameters_residence_areas_page',
+})
+
 const residenceAreasRepo = useRepo(ResidenceAreasRepository)
 
 const { fetchCollection } = useEntityFetch()

+ 4 - 0
pages/parameters/sms.vue

@@ -40,6 +40,10 @@ import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 
+definePageMeta({
+  name: 'parameters_sms_page',
+})
+
 const { fetch } = useEntityFetch()
 
 const organizationProfile = useOrganizationProfileStore()

+ 4 - 0
pages/parameters/super_admin.vue

@@ -45,6 +45,10 @@ import { useAccessProfileStore } from '~/stores/accessProfile'
 import AdminAccess from '~/models/Access/AdminAccess'
 import { useValidationUtils } from '~/composables/utils/useValidationUtils'
 
+definePageMeta({
+  name: 'parameters_super_admin_page',
+})
+
 const { fetch } = useEntityFetch()
 
 const accessProfile = useAccessProfileStore()

+ 4 - 0
pages/parameters/teaching.vue

@@ -58,6 +58,10 @@ import type { AnyJson } from '~/types/data'
 import { useEnumFetch } from '~/composables/data/useEnumFetch'
 import ApiResource from '~/models/ApiResource'
 
+definePageMeta({
+  name: 'parameters_teaching_page',
+})
+
 const organizationProfile = useOrganizationProfileStore()
 
 if (organizationProfile.parametersId === null) {

+ 4 - 0
pages/parameters/website.vue

@@ -146,6 +146,10 @@ import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import Subdomain from '~/models/Organization/Subdomain'
 import ApiResource from '~/models/ApiResource'
 
+definePageMeta({
+  name: 'parameters_website_page',
+})
+
 const { fetch, fetchCollection } = useEntityFetch()
 
 const organizationProfile = useOrganizationProfileStore()

+ 11 - 8
services/layout/menuBuilder/abstractMenuBuilder.ts

@@ -84,16 +84,23 @@ abstract class AbstractMenuBuilder implements MenuBuilder {
    * @param {string} label Titre qui sera traduit
    * @param to
    * @param type
+   * @param noWarning
    * @return {MenuItem}
    */
   protected createItem(
     label: string,
     icon?: IconItem,
     to: string = '',
-    type: MENU_LINK_TYPE = MENU_LINK_TYPE.INTERNAL,
+    type: MENU_LINK_TYPE = MENU_LINK_TYPE.INTERNAL
   ): MenuItem {
     let url: string
 
+    if (type === MENU_LINK_TYPE.INTERNAL) {
+      console.warn(
+        "'createItem()' should not be used for internal links, use 'addChildItemIfAllowed()'",
+      )
+    }
+
     switch (type) {
       case MENU_LINK_TYPE.V1:
         // eslint-disable-next-line no-case-declarations
@@ -105,12 +112,6 @@ abstract class AbstractMenuBuilder implements MenuBuilder {
       case MENU_LINK_TYPE.EXTERNAL:
         url = UrlUtils.prependHttps(to)
         break
-      case MENU_LINK_TYPE.INTERNAL:
-        console.warn(
-          "'createItem()' should not be used for internal links, use 'addChildItemIfAllowed()'",
-        )
-        url = to
-        break
       default:
         url = to
     }
@@ -137,7 +138,9 @@ abstract class AbstractMenuBuilder implements MenuBuilder {
   ) {
     if (this.ability.can('display', pageName)) {
       const to = this.router.resolve({ name: pageName }).href
-
+      if (!to) {
+        throw new Error('unknown page name : ' + pageName)
+      }
       children.push({
         icon,
         label: pageName,

+ 37 - 103
services/layout/menuBuilder/parametersMenuBuilder.ts

@@ -13,115 +13,49 @@ export default class ParametersMenuBuilder extends AbstractMenuBuilder {
   build(): MenuGroup | null {
     const children: MenuItems = []
 
-    if (!this.ability.can('display', 'parameters_page')) {
-      return null
-    }
+    this.addChildItemIfAllowed(children, 'parameters_general_page', {
+      name: 'fas fa-gears',
+    })
 
-    children.push(
-      this.createItem(
-        'general_parameters',
-        { name: 'fas fa-gears' },
-        `/parameters/general_parameters`,
-      ),
-    )
-    children.push(
-      this.createItem(
-        'website',
-        { name: 'fas fa-globe-americas' },
-        `/parameters/website`,
-      ),
-    )
+    this.addChildItemIfAllowed(children, 'parameters_website_page', {
+      name: 'fas fa-globe-americas',
+    })
 
-    if (this.organizationProfile.isSchool) {
-      children.push(
-        this.createItem(
-          'teaching',
-          { name: 'fas fa-school' },
-          `/parameters/teaching`,
-        ),
-      )
-      children.push(
-        this.createItem(
-          'intranet_breadcrumbs',
-          { name: 'fas fa-arrows-down-to-people' },
-          `/parameters/intranet`,
-        ),
-      )
-      children.push(
-        this.createItem(
-          'educationNotations',
-          { name: 'fas fa-graduation-cap' },
-          `/parameters/education_notation`,
-        ),
-      )
-      children.push(
-        this.createItem(
-          'bulletin',
-          { name: 'fas fa-file-lines' },
-          `/parameters/bulletin`,
-        ),
-      )
-      children.push(
-        this.createItem(
-          'education_timings_breadcrumbs',
-          { name: 'fas fa-clock' },
-          `/parameters/education_timings`,
-        ),
-      )
-      children.push(
-        this.createItem(
-          'residenceAreas',
-          { name: 'fas fa-location-dot' },
-          `/parameters/residence_areas`,
-        ),
-      )
-    }
+    this.addChildItemIfAllowed(children, 'parameters_teaching_page', {
+      name: 'fas fa-school',
+    })
 
-    children.push(
-      this.createItem(
-        'attendance',
-        { name: 'fas fa-user-times' },
-        `/parameters/attendances`,
-      ),
-    )
+    this.addChildItemIfAllowed(children, 'parameters_intranet_page', {
+      name: 'fas fa-arrows-down-to-people',
+    })
 
-    if (this.organizationProfile.hasModule('Sms')) {
-      children.push(
-        this.createItem(
-          'sms_option',
-          { name: 'fas fa-mobile' },
-          `/parameters/sms`,
-        ),
-      )
-    }
+    this.addChildItemIfAllowed(children, 'parameters_education_notation_page', {
+      name: 'fas fa-graduation-cap',
+    })
+
+    this.addChildItemIfAllowed(children, 'parameters_bulletin_page', {
+      name: 'fas fa-file-lines',
+    })
+
+    this.addChildItemIfAllowed(children, 'parameters_education_timings_page', {
+      name: 'fas fa-clock',
+    })
+
+    this.addChildItemIfAllowed(children, 'parameters_residence_areas_page', {
+      name: 'fas fa-location-dot',
+    })
+
+    this.addChildItemIfAllowed(children, 'parameters_attendances_page', {
+      name: 'fas fa-user-times',
+    })
 
-    children.push(
-      this.createItem(
-        'super_admin',
-        { name: 'fas fa-user-gear' },
-        `/parameters/super_admin`,
-      ),
-    )
+    this.addChildItemIfAllowed(children, 'parameters_sms_page', {
+      name: 'fas fa-mobile',
+    })
 
-    // Voir nouveau découpage?
-    // if (this.ability.can('display', 'parameters_page')) {
-    //   children.push(this.createItem('general_params', {name: 'fas fa-cogs'},`/parameters`, MENU_LINK_TYPE.V1))
-    // }
-    // if (this.ability.can('display', 'parameters_communication_page')) {
-    //   children.push(this.createItem('communication_params', {name: 'fas fa-comments'},`/parameters/communication`, MENU_LINK_TYPE.V1))
-    // }
-    // if (this.ability.can('display', 'parameters_student_page')) {
-    //   children.push(this.createItem('students_params', {name: 'fas fa-users'},`/parameters/student`, MENU_LINK_TYPE.V1))
-    // }
-    // if (this.ability.can('display', 'parameters_education_page')) {
-    //   children.push(this.createItem('education_params', {name: 'fas fa-graduation-cap'},`/parameters/education`, MENU_LINK_TYPE.V1))
-    // }
-    // if (this.ability.can('display', 'parameters_bills_page')) {
-    //   children.push(this.createItem('bills_params', {name: 'fas fa-euro-sign'},`/parameters/billing`, MENU_LINK_TYPE.V1))
-    // }
-    // if (this.ability.can('display', 'parameters_secure_page')) {
-    //   children.push(this.createItem('secure_params', {name: 'fas fa-lock'},`/parameters/secure`, MENU_LINK_TYPE.V1))
-    // }
+    this.addChildItemIfAllowed(children, 'parameters_super_admin_page', {
+      name: 'fas fa-user-gear',
+    })
 
     if (children.length > 0) {
       return this.createGroup('parameters', undefined, children)

+ 0 - 0
tests/units/services/layout/menuBuilder/parametersMenuBuilder.test.ts.off → tests/units/services/layout/menuBuilder/parametersMenuBuilder.test.ts