Переглянути джерело

Merge branch 'hotfix/v8-5418-add-distinction-menu' into 'master'

v8-5418-add-distinction-menu

See merge request opentalent/app!34
Vincent G. 1 рік тому
батько
коміт
fe5ed06c67

+ 0 - 5
config/abilities/pages/medals.yaml

@@ -1,5 +0,0 @@
-  medals_page:
-    action: 'display'
-    conditions:
-      - {function: organizationHasAnyModule, parameters: ['Medals']}
-      - {function: accessHasAnyRoleAbility, parameters: [{action: 'read', subject: 'medals'}]}

+ 17 - 0
config/abilities/pages/rewards.yaml

@@ -0,0 +1,17 @@
+  access_rewards_list_page:
+    action: 'display'
+    conditions:
+      - {function: organizationHasAnyModule, parameters: ['AccessReward']}
+      - {function: accessHasAnyRoleAbility, parameters: [{action: 'read', subject: 'accessreward'}]}
+
+  access_rewards_command_page:
+    action: 'display'
+    conditions:
+      - { function: organizationHasAnyModule, parameters: [ 'AccessRewardCommand' ] }
+      - { function: accessHasAnyRoleAbility, parameters: [ { action: 'read', subject: 'accessreward' } ] }
+      -
+  rewards_list_page:
+    action: 'display'
+    conditions:
+      - { function: organizationHasAnyModule, parameters: [ 'Reward' ] }
+      - { function: accessHasAnyRoleAbility, parameters: [ { action: 'read', subject: 'reward' } ] }

+ 4 - 1
lang/fr.json

@@ -1,4 +1,8 @@
 {
+  "rewards_list": "Configuration des distinctions",
+  "access_rewards_list": "Gestion des distinctions",
+  "access_rewards_command": "Commande de distinctions",
+  "access_rewards": "Distinctions",
   "afi_export": "Export AFI",
   "item": "Détails",
   "organization_breadcrumbs": "Fiche de la structure",
@@ -425,7 +429,6 @@
   "message_templates": "Modèles",
   "communication": "Communication",
   "donors": "Partenariats et dons",
-  "medals": "Médailles",
   "stats": "Statistiques",
   "report_activity": "Rapport d'activité",
   "educations_quotas_by_education": "Quotas par enseignement",

+ 2 - 2
services/layout/menuBuilder/mainMenuBuilder.ts

@@ -6,7 +6,7 @@ import EquipmentMenuBuilder from "~/services/layout/menuBuilder/equipmentMenuBui
 import EducationalMenuBuilder from "~/services/layout/menuBuilder/educationalMenuBuilder";
 import BillingMenuBuilder from "~/services/layout/menuBuilder/billingMenuBuilder";
 import CommunicationMenuBuilder from "~/services/layout/menuBuilder/communicationMenuBuilder";
-import MedalsMenuBuilder from "~/services/layout/menuBuilder/medalsMenuBuilder";
+import RewardsMenuBuilder from "~/services/layout/menuBuilder/rewardsMenuBuilder";
 import DonorsMenuBuilder from "~/services/layout/menuBuilder/donorsMenuBuilder";
 import WebsiteAdminMenuBuilder from "~/services/layout/menuBuilder/websiteAdminMenuBuilder";
 import CotisationsMenuBuilder from "~/services/layout/menuBuilder/cotisationsMenuBuilder";
@@ -31,7 +31,7 @@ export default class MainMenuBuilder extends AbstractMenuBuilder {
       this.buildSubmenu(BillingMenuBuilder),
       this.buildSubmenu(CommunicationMenuBuilder),
       this.buildSubmenu(DonorsMenuBuilder),
-      this.buildSubmenu(MedalsMenuBuilder),
+      this.buildSubmenu(RewardsMenuBuilder),
       this.buildSubmenu(WebsiteAdminMenuBuilder),
       this.buildSubmenu(CotisationsMenuBuilder),
       this.buildSubmenu(StatsMenuBuilder),

+ 0 - 20
services/layout/menuBuilder/medalsMenuBuilder.ts

@@ -1,20 +0,0 @@
-import AbstractMenuBuilder from '~/services/layout/menuBuilder/abstractMenuBuilder'
-import {MenuItem} from "~/types/layout";
-import {MENU_LINK_TYPE} from "~/types/enum/layout";
-
-/**
- * Menu Médailles
- */
-export default class MedalsMenuBuilder extends AbstractMenuBuilder {
-  static readonly menuName = "Medals"
-
-  /**
-   * Construit le menu Médailles et Dons, ou null si aucune page accessible
-   */
-  build (): MenuItem | null {
-    if (this.ability.can('display', 'medals_page')) {
-      return this.createItem('medals', {name: 'fas fa-trophy'}, '/medals/list/', MENU_LINK_TYPE.V1)
-    }
-    return null
-  }
-}

+ 40 - 0
services/layout/menuBuilder/rewardsMenuBuilder.ts

@@ -0,0 +1,40 @@
+import AbstractMenuBuilder from '~/services/layout/menuBuilder/abstractMenuBuilder'
+import {MenuGroup, MenuItems} from "~/types/layout";
+import {MENU_LINK_TYPE} from "~/types/enum/layout";
+
+/**
+ * Menu Distinctions
+ */
+export default class RewardsMenuBuilder extends AbstractMenuBuilder {
+  static readonly menuName = "AccessRewards"
+
+  /**
+   * Construit le menu distinctions, ou null si aucune page accessible
+   */
+  build (): MenuItems | MenuGroup | null {
+    const children: MenuItems = []
+
+    if (this.ability.can('display', 'access_rewards_list_page')) {
+      children.push(this.createItem('access_rewards_list', {name: 'fas fa-trophy'}, '/access_rewards_not_delivered/list/', MENU_LINK_TYPE.V1))
+    }
+
+    if (this.ability.can('display', 'access_rewards_command_page')) {
+      children.push(this.createItem('access_rewards_command', {name: 'fas fa-trophy'}, '/access_reward_commands', MENU_LINK_TYPE.V1))
+    }
+
+    if (this.ability.can('display', 'rewards_list_page')) {
+      children.push(this.createItem('rewards_list', {name: 'fas fa-trophy'}, '/rewards/list/', MENU_LINK_TYPE.V1))
+    }
+
+    if (children.length > 1) {
+      // Plusieurs éléments, on retourne un groupe
+      return this.createGroup('access_rewards', {name: 'fas fa-trophy'}, children)
+    }
+    else if (children.length === 1) {
+      // Un seul élément, on retourne cet élément seul
+      return children[0]
+    }
+
+    return null
+  }
+}

+ 2 - 2
tests/units/services/layout/menuBuilder/mainMenuBuilder.test.ts

@@ -13,7 +13,7 @@ import EducationalMenuBuilder from "~/services/layout/menuBuilder/educationalMen
 import BillingMenuBuilder from "~/services/layout/menuBuilder/billingMenuBuilder";
 import CommunicationMenuBuilder from "~/services/layout/menuBuilder/communicationMenuBuilder";
 import DonorsMenuBuilder from "~/services/layout/menuBuilder/donorsMenuBuilder";
-import MedalsMenuBuilder from "~/services/layout/menuBuilder/medalsMenuBuilder";
+import RewardsMenuBuilder from "~/services/layout/menuBuilder/rewardsMenuBuilder";
 import WebsiteAdminMenuBuilder from "~/services/layout/menuBuilder/websiteAdminMenuBuilder";
 import CotisationsMenuBuilder from "~/services/layout/menuBuilder/cotisationsMenuBuilder";
 import StatsMenuBuilder from "~/services/layout/menuBuilder/statsMenuBuilder";
@@ -66,7 +66,7 @@ describe('build', () => {
         // @ts-ignore
         expect(menuBuilder.buildSubmenu).toBeCalledWith(DonorsMenuBuilder)
         // @ts-ignore
-        expect(menuBuilder.buildSubmenu).toBeCalledWith(MedalsMenuBuilder)
+        expect(menuBuilder.buildSubmenu).toBeCalledWith(RewardsMenuBuilder)
         // @ts-ignore
         expect(menuBuilder.buildSubmenu).toBeCalledWith(WebsiteAdminMenuBuilder)
         // @ts-ignore

+ 10 - 9
tests/units/services/layout/menuBuilder/medalsMenuBuilder.test.ts → tests/units/services/layout/menuBuilder/rewardsMenuBuilder.test.ts

@@ -3,7 +3,7 @@ import { describe, test, it, expect } from 'vitest'
 import {RuntimeConfig} from "@nuxt/schema";
 import {AnyAbility} from "@casl/ability/dist/types";
 import {AccessProfile, organizationState} from "~/types/interfaces";
-import MedalsMenuBuilder from "~/services/layout/menuBuilder/medalsMenuBuilder";
+import RewardsMenuBuilder from "~/services/layout/menuBuilder/rewardsMenuBuilder";
 import {MenuGroup, MenuItem} from "~/types/layout";
 import {MENU_LINK_TYPE} from "~/types/enum/layout";
 
@@ -11,7 +11,7 @@ let runtimeConfig: RuntimeConfig
 let ability: AnyAbility
 let organizationProfile: organizationState
 let accessProfile: AccessProfile
-let menuBuilder: MedalsMenuBuilder
+let menuBuilder: RewardsMenuBuilder
 
 beforeEach(()=> {
     runtimeConfig = vi.fn() as any as RuntimeConfig
@@ -21,13 +21,13 @@ beforeEach(()=> {
 
     runtimeConfig.baseUrlAdminLegacy = 'https://mydomain.com/'
 
-    menuBuilder = new MedalsMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile)
+    menuBuilder = new RewardsMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile)
 })
 
 
 describe('getMenuName', () => {
     test('validate name', () => {
-        expect(menuBuilder.getMenuName()).toEqual("Medals")
+        expect(menuBuilder.getMenuName()).toEqual("AccessRewards")
     })
 })
 
@@ -35,12 +35,13 @@ describe('build', () => {
     test('has all items', () => {
         ability.can = vi.fn(() => true)
 
-        // Should return a MenuItem
-        const result = menuBuilder.build() as MenuItem
+        // Should return a MenuGroup
+        const result = menuBuilder.build() as MenuGroup
 
-        expect(result).toEqual({
-            label: 'medals', icon: {name: 'fas fa-trophy'}, to: 'https://mydomain.com/#/medals/list/', type: MENU_LINK_TYPE.V1, active: false
-        })
+        expect(result.label).toEqual('access_rewards')
+        expect(result.icon).toEqual({name: 'fas fa-trophy'})
+        // @ts-ignore
+        expect(result.children.length).toEqual(3)
     })
 
     test('has no items', () => {