فهرست منبع

page "mes paramètres"

Vincent 11 ماه پیش
والد
کامیت
11ece8f190

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

@@ -99,3 +99,8 @@ cmf_licence_person_page:
   conditions:
     - { function: organizationIsCmf }
     - { function: accessIsAdminAccount, expectedResult: false }
+
+my_settings_page:
+  action: 'display'
+  conditions:
+    - { function: organizationHasAnyModule, parameters: ['GeneralConfig'] }

+ 4 - 0
lang/fr.json

@@ -1,4 +1,8 @@
 {
+  "my_settings_page": "Mes paramètres",
+  "allow_report_message": "Je souhaite recevoir les rapports d'envoie des emails que j'envoie",
+  "my-settings_breadcrumbs": "Mes paramètres",
+  "message_settings": "Paramètres des messages",
   "rewards_list": "Configuration des distinctions",
   "access_rewards_list": "Gestion des distinctions",
   "access_rewards_command": "Commande de distinctions",

+ 17 - 0
models/Access/AccessPreferences.ts

@@ -0,0 +1,17 @@
+import { Uid, Bool } from 'pinia-orm/dist/decorators'
+import ApiModel from '~/models/ApiModel'
+
+/**
+ * Ap2i Model : AccessPreference
+ *
+ * @see https://gitlab.2iopenservice.com/opentalent/ap2i/-/blob/develop/src/Entity/Access/AccessPreference.php
+ */
+export default class AccessPreferences extends ApiModel {
+  static entity = 'access_preferences'
+
+  @Uid()
+  declare id: number | string | null
+
+  @Bool(true)
+  declare messageReport: boolean
+}

+ 3 - 0
models/Access/MyProfile.ts

@@ -59,4 +59,7 @@ export default class MyProfile extends ApiResource {
 
   @Attr({})
   declare originalAccess: Access | null
+
+  @Num(null)
+  declare accessPreferenceId: number
 }

+ 59 - 0
pages/my-settings.vue

@@ -0,0 +1,59 @@
+<!--
+Page 'Mes préférences'
+-->
+<template>
+  <LayoutContainer>
+    <v-col cols="12" sm="12" md="12">
+      <v-expansion-panels v-model="openedPanels" :multiple="true">
+        <UiExpansionPanel title="message_settings" icon="fas fa-inbox">
+          <v-container fluid class="container">
+            <v-row>
+              <UiLoadingPanel v-if="preferencesPending" />
+              <UiForm
+                v-else
+                :model="AccessPreferences"
+                :entity="preferences"
+                action-position="bottom"
+              >
+                <v-row>
+                  <v-col cols="12">
+                    <UiInputCheckbox
+                      v-model="preferences.messageReport"
+                      field="messageReport"
+                      label="allow_report_message"
+                    />
+                  </v-col>
+                </v-row>
+              </UiForm>
+            </v-row>
+          </v-container>
+        </UiExpansionPanel>
+      </v-expansion-panels>
+    </v-col>
+  </LayoutContainer>
+</template>
+
+<script setup lang="ts">
+import type { Ref } from 'vue'
+import { useEntityFetch } from '~/composables/data/useEntityFetch'
+import AccessPreferences from '~/models/Access/AccessPreferences'
+import { useAccessProfileStore } from '~/stores/accessProfile'
+
+definePageMeta({
+  name: 'my_settings_page',
+})
+
+const accessProfileStore = useAccessProfileStore()
+if (accessProfileStore.accessPreferenceId === null) {
+  throw new Error("Missing access preference's id")
+}
+
+const { fetch } = useEntityFetch()
+const openedPanels: Ref<Array<number>> = ref([0])
+const { data: preferences, pending: preferencesPending } = await fetch(
+  AccessPreferences,
+  accessProfileStore.accessPreferenceId,
+)
+</script>
+
+<style scoped lang="scss"></style>

+ 2 - 0
services/layout/menuBuilder/accountMenuBuilder.ts

@@ -160,6 +160,8 @@ export default class AccountMenuBuilder extends AbstractMenuBuilder {
       )
     }
 
+    children.push(...this.makeChildren([{ pageName: 'my_settings_page' }]))
+
     actions.push(
       this.createItem('logout', undefined, `/logout`, MENU_LINK_TYPE.V1),
     )

+ 3 - 0
stores/accessProfile.ts

@@ -46,6 +46,7 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
   const multiAccesses: Ref<Array<BaseOrganizationProfile>> = ref([])
   const familyAccesses: Ref<Array<BaseAccessProfile>> = ref([])
   const originalAccess: Ref<OrignalAccessProfile | null> = ref(null)
+  const accessPreferenceId: Ref<number | null> = ref(null)
 
   // Getters
   /**
@@ -134,6 +135,7 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     isAdminAccess.value = profile.isAdminAccess
     isGuardian.value = profile.isGuardian
     isPayer.value = profile.isPayer
+    accessPreferenceId.value = profile.accessPreferenceId
 
     // Add the original Access (switch User case)
     if (profile.originalAccess !== null) {
@@ -213,5 +215,6 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     setProfile,
     setHistorical,
     setHistoricalRange,
+    accessPreferenceId,
   }
 })

+ 1 - 1
tests/units/services/data/entityManager.test.ts

@@ -428,7 +428,7 @@ describe('fetchCollection', () => {
     })
 
     // @ts-expect-error Needed to avoid 'Cannot stringify non POJO' occasional bugs
-    // eslint-disable-next-line
+
     expect(result.toJSON()).toEqual(
       'Computed result from fetchCollection at : api/dummyResource',
     )

+ 1 - 1
tests/units/services/layout/menuBuilder/accountMenuBuilder.test.ts

@@ -55,7 +55,7 @@ describe('build', () => {
     expect(result.label).toEqual('my_account')
 
     // @ts-ignore
-    expect(result.children.length).toEqual(14)
+    expect(result.children.length).toEqual(15)
     // @ts-ignore
     expect(result.actions.length).toEqual(1)
 

+ 1 - 0
types/interfaces.d.ts

@@ -113,6 +113,7 @@ interface AccessProfile extends BaseAccessProfile {
   originalAccess: OrignalAccessProfile | null
   hasRole: (role: string) => boolean
   isAdminAccount: boolean
+  accessPreferenceId: number | null
 }
 
 // TODO: y'a un problème entre l'interface AccessProfile et celle organizationState, les noms sont construits différemment,