Browse Source

freemium final

Vincent 4 months ago
parent
commit
75847d418f

+ 4 - 0
assets/css/global.scss

@@ -75,6 +75,10 @@ header .v-toolbar__content {
   font-size: 0.9rem;
 }
 
+.text-neutral {
+  color: rgb(var(--v-theme-on-neutral));
+}
+
 h3,
 h4 {
   color: rgb(var(--v-theme-on-neutral-soft));

+ 29 - 18
components/Form/Freemium/Event.vue

@@ -69,26 +69,37 @@
           @update:model-value="getPlace(entity)"
         />
 
-        <div class="d-flex justify-center"
-             v-if="!newPlace"
-        >
-          <v-btn
-            prepend-icon="fa-solid fa-plus"
-            class="mb-6"
-            @click="onAddPlaceClick(entity)"
-          >
-            {{ $t('add_place') }}
-          </v-btn>
-
-          <v-btn
+        <v-row  v-if="!newPlace" class="mb-6 justify-center">
+          <v-col
             v-if="entity.place && !editPlace"
-            prepend-icon="fa-solid fa-plus"
-            class="mb-6 ml-6"
-            @click="onEditPlaceClick(entity)"
+            cols="12"
+            sm="6"
+            class="d-flex justify-center mb-2"
+          >
+              <v-btn
+                prepend-icon="fa-solid fa-pencil"
+                @click="onEditPlaceClick(entity)"
+              >
+                {{ $t('edit_place') }}
+              </v-btn>
+          </v-col>
+
+          <v-col
+            cols="12"
+            sm="6"
+            class="d-flex justify-center mb-2"
           >
-            {{ $t('edit_place') }}
-          </v-btn>
-        </div>
+            <v-btn
+              prepend-icon="fa-solid fa-plus"
+              @click="onAddPlaceClick(entity)"
+            >
+              {{ $t('add_place') }}
+            </v-btn>
+          </v-col>
+
+        </v-row>
+
+
 
         <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.placeName" field="placeName" />
 

+ 4 - 3
components/Layout/Header.vue

@@ -27,7 +27,7 @@ Contient entre autres le nom de l'organisation, l'accès à l'aide et aux préf
       :class="smAndUp ? 'mr-3' : ''"
     />
 
-    <LayoutHeaderHomeBtn v-if="smAndUp" />
+    <LayoutHeaderHomeBtn />
 
     <LayoutHeaderMenu
       v-if="isWebsitesMenuNotEmpty"
@@ -94,8 +94,9 @@ const { smAndUp } = useDisplay()
 
 const hasLateralMenu = computed(() => {
   return (
-    (layoutStore.name !== 'parameters' && hasMenu('Main')) ||
-    (layoutStore.name === 'parameters' && hasMenu('Parameters'))
+    layoutStore.name !== 'freemium' &&
+    ((layoutStore.name !== 'parameters' && hasMenu('Main')) ||
+    (layoutStore.name === 'parameters' && hasMenu('Parameters')))
   )
 })
 

+ 4 - 1
components/Layout/Subheader.vue

@@ -15,7 +15,9 @@ Contient entre autres le breadcrumb, les commandes de changement d'année et les
 
       <span class="flex-fill" />
 
-      <v-card class="d-flex flex-row align-center mr-6" :flat="true" tile>
+      <v-card
+        v-if="!organizationProfile.isFreemiumProduct"
+        class="d-flex flex-row align-center mr-6" :flat="true" tile>
         <LayoutSubHeaderActivityYear
           v-if="smAndUp && !showDateTimeRange"
           class="activity-year"
@@ -76,6 +78,7 @@ import { useAccessProfileStore } from '~/stores/accessProfile'
 
 const { smAndUp, lgAndUp } = useDisplay()
 const accessProfile = useAccessProfileStore()
+const organizationProfile = useOrganizationProfileStore()
 const { hasMenu } = useMenu()
 const btn: Ref = ref(null)
 

+ 31 - 9
components/Ui/EventList.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <v-list>
+    <v-list  height="380">
 
       <v-list-item
         class="event-item"
@@ -11,17 +11,17 @@
       >
         <template v-slot:prepend>
           <v-avatar color="grey-lighten-1">
-            <v-img :src="event.image" alt="Image de l'événement" />
+            <UiImage :imageId="event.image" :width="50" />
           </v-avatar>
         </template>
 
         <template v-slot:append>
-          <v-avatar color="primary" @click="$emit('edit', event.id)">
+          <v-avatar  @click="$emit('edit', event.id)">
             <v-icon>fas fa-pencil</v-icon>
           </v-avatar>
 
           <UiButtonDelete :entity="event">
-            <v-avatar color="error">
+            <v-avatar>
               <v-icon>fas fa-trash</v-icon>
             </v-avatar>
           </UiButtonDelete>
@@ -30,11 +30,27 @@
 
     </v-list>
 
-    <div class="d-flex justify-space-between px-4 py-2">
-      <v-btn variant="outlined" @click="$emit('load', pagination.first)" v-if="pagination.first && pagination.previous">Premier</v-btn>
-      <v-btn variant="outlined" @click="$emit('load', pagination.previous)" v-if="pagination.previous">Précédents</v-btn>
-      <v-btn variant="outlined" @click="$emit('load', pagination.next)" v-if="pagination.next">Suivants</v-btn>
-      <v-btn variant="outlined" @click="$emit('load', pagination.last)" v-if="pagination.last != 1">Dernier</v-btn>
+    <div class="d-flex justify-space-between px-4 py-2 pagination mb-5" v-if="events.length > 0">
+      <v-btn variant="flat" class="pagination-btn" @click="$emit('load', pagination.first)" :disabled="!pagination.first || !pagination.previous">
+        <v-avatar>
+        <v-icon>fas fa-angles-left</v-icon>
+      </v-avatar>
+      </v-btn>
+      <v-btn variant="flat" class="pagination-btn" @click="$emit('load', pagination.previous)" :disabled="!pagination.previous">
+        <v-avatar>
+          <v-icon>fas fa-angle-left</v-icon>
+        </v-avatar>
+      </v-btn>
+      <v-btn variant="flat" class="pagination-btn" @click="$emit('load', pagination.next)" :disabled="!pagination.next">
+        <v-avatar>
+          <v-icon>fas fa-angle-right</v-icon>
+        </v-avatar>
+      </v-btn>
+      <v-btn variant="flat" class="pagination-btn" @click="$emit('load', pagination.last)" :disabled="pagination.last == 1">
+        <v-avatar>
+          <v-icon>fas fa-angles-right</v-icon>
+        </v-avatar>
+      </v-btn>
     </div>
   </div>
 </template>
@@ -58,5 +74,11 @@ const date = useDate()
 <style scoped>
 .event-item {
   margin-top: 20px;
+  color: rgb(var(--v-theme-on-primary-alt));
 }
+
+.pagination-btn[disabled] {
+  opacity: 0.3;
+}
+
 </style>

+ 0 - 1
components/Ui/Input/TreeSelect.vue

@@ -53,7 +53,6 @@ et sélectionner des éléments organisés en catégories et sous-catégories.
         closable
         @click:close="removeItem(item.raw.value!)"
       >
-        <!-- Always prioritize the mapping for consistent labels, fall back to item label if available -->
         {{
           selectedItemsMap[item.raw] || selectedItemsMap[item.raw.value]
         }}

+ 1 - 1
components/Ui/LoadingPanel.client.vue

@@ -1,6 +1,6 @@
 <template>
   <v-row class="fill-height ma-0" align="center" justify="center">
-    <v-progress-circular :indeterminate="true" color="neutral" />
+    <v-progress-circular :indeterminate="true" color="on-neutral" />
   </v-row>
 </template>
 

+ 1 - 0
components/Ui/MapLeaflet.client.vue

@@ -32,6 +32,7 @@
     >
       {{$t('search_gps_button')}}
     </v-btn>
+
     <div v-if="!pending && gpsResponses.length > 0">
       <div v-for="(gpsResponse, key) in gpsResponses" class="address_choices" @click="addressChoice(key)">
         {{gpsResponse['displayName']}}

+ 12 - 1
i18n/lang/fr/general.json

@@ -1,4 +1,13 @@
 {
+  "no_future_event": "Vous n'avez aucun événement à venir",
+  "no_past_event": "Vous n'avez aucun événement passée",
+  "futur_event": "Mes événements à venir",
+  "past_event": "Mes événements passés",
+  "add_event": "Ajouter un événement",
+  "my_organization": "Ma structure",
+  "edit_organization": "Modifier la structure",
+  "dashboard_breadcrumbs": "Tableau de bord",
+  "freemium_breadcrumbs": "Freemium",
   "i_understand": "Je comprends",
   "place_change_everywhere": "Les changements apportés seront appliqués aux autres événements",
   "event_categories_choices": "Choisissez à quelles catégories appartient votre événement",
@@ -24,7 +33,7 @@
   "datetimeEnd": "Date et heure de fin",
   "need_to_be_integer": "Doit être un nombre entier",
   "freemium_event_create_page": "Créer un nouvel événement",
-  "search_gps_button": "Mettre à jour les coordonnées géographique.",
+  "search_gps_button": "Situer sur la carte",
   "invalid_phone_number": "Numéro de téléphone non valide (exemple {example})",
   "tel": "Téléphone",
   "postal_address": "Coordonnées postales",
@@ -45,6 +54,8 @@
   "trial_all_ready_did": "Vous avez déjà bénéficié d’un essai gratuit !",
   "opentalent_contact": "Contacter Opentalent",
   "discover_offer": "Découvrir toutes les offres",
+  "try_premium_light": "Essayez Opentalent Artist Premium",
+  "30_days_free": " gratuitement pendant 30J",
   "try_premium": "Essayez Opentalent Artist Premium gratuitement pendant 30J",
   "opentalent_options": "Les options Opentalent",
   "opentalent_offers": "Les offres Opentalent",

+ 93 - 9
layouts/freemium.vue

@@ -1,9 +1,9 @@
 <template>
-  <div>
+  <div class="layout-wrapper">
     <!-- Show the loading page -->
     <client-only placeholder-tag="client-only-placeholder" placeholder=" " />
 
-    <v-app>
+    <v-app class="app-wrapper">
       <LayoutLoadingScreen />
 
       <LayoutHeader />
@@ -11,21 +11,86 @@
       <v-main class="main">
 
         <!-- Page will be rendered here-->
-        <div class="inner-container">
-          <h3>{{ pageTitle }}</h3>
+        <div>
+          <LayoutSubheader />
+
+          <LayoutAlertBar />
 
           <slot />
         </div>
       </v-main>
 
+      <!-- Footer -->
+      <v-footer class="white--text footer theme-secondary">
+
+          <v-row v-if="smAndUp">
+            <v-col cols="12" sm="3">
+              <p class="text-h6 font-weight-bold text-center">DÉCOUVREZ NOS SOLUTIONS</p>
+            </v-col>
+            <v-col cols="12" sm="2" class="text-center text-product">
+              <a href="https://logiciels.opentalent.fr/opentalent-artist" target="_blank">
+                <img src="/images/Opentalent_Artist-Blanc.png" height="70" class="mb-2" />
+                <p>Pour les orchestres, les chorales, compagnies et troupes artistiques</p>
+              </a>
+            </v-col>
+            <v-col cols="12" sm="2" class="text-center text-product">
+              <a href="https://logiciels.opentalent.fr/opentalent-school" target="_blank">
+                <img src="/images/Opentalent_School-Blanc.png" height="70" class="mb-2" />
+                <p>Pour tous les établissements d’enseignement artistique</p>
+              </a>
+            </v-col>
+            <v-col cols="12" sm="2" class="text-center text-product">
+              <a href="https://logiciels.opentalent.fr/opentalent-manager" target="_blank">
+                <img src="/images/Opentalent_Manager-Blanc.png" height="70" class="mb-2" />
+                <p>Pour les fédérations, confédérations et institutions publiques</p>
+              </a>
+            </v-col>
+            <v-col cols="12" sm="2" class="text-center text-product">
+              <a href="https://opentalent.fr/" target="_blank">
+                <img src="/images/OT_Logo_Agenda.png" height="70" class="mb-2" />
+                <p>Pour la promotion de votre structure et de vos événements</p>
+              </a>
+            </v-col>
+          </v-row>
+
+          <v-row v-else>
+            <v-col cols="12">
+              <p class="text-h6 font-weight-bold text-center">DÉCOUVREZ NOS SOLUTIONS</p>
+            </v-col>
+            <v-col cols="3" class="text-center text-product">
+              <a href="https://logiciels.opentalent.fr/opentalent-artist" target="_blank">
+                <img src="/images/Opentalent_Artist_Griffe.png" height="70" class="mb-2" />
+              </a>
+            </v-col>
+            <v-col cols="3" class="text-center text-product">
+              <a href="https://logiciels.opentalent.fr/opentalent-school" target="_blank">
+                <img src="/images/Opentalent_School_Griffe.png" height="70" class="mb-2" />
+              </a>
+            </v-col>
+            <v-col cols="3" class="text-center text-product">
+              <a href="https://logiciels.opentalent.fr/opentalent-manager" target="_blank">
+                <img src="/images/Opentalent_Manager_Griffe.png" height="70" class="mb-2" />
+              </a>
+            </v-col>
+            <v-col cols="3" class="text-center text-product">
+              <a href="https://opentalent.fr" target="_blank">
+                <img src="/images/Opentalent_Griffe.png" height="70" class="mb-2" />
+              </a>
+            </v-col>
+          </v-row>
+      </v-footer>
+
       <LazyLayoutAlertContainer />
+
     </v-app>
   </div>
 </template>
 
 <script setup lang="ts">
 import { useLayoutStore } from '~/stores/layout'
+import {useDisplay} from "vuetify";
 
+const { smAndUp, sm } = useDisplay()
 const layoutStore = useLayoutStore()
 layoutStore.name = 'freemium'
 
@@ -36,12 +101,31 @@ const pageTitle = computed(() => i18n.t(route.name || 'freemium_page'))
 </script>
 
 <style scoped lang="scss">
-.inner-container {
-  max-width: 1200px;
-  margin: 0 auto;
+.layout-wrapper,
+.app-wrapper {
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh;
+}
+
+.main {
+  flex: 1 0 auto;  /* Prend tout l’espace restant */
+}
+
+.v-footer {
+  padding-left: 50px;
+  padding-right: 50px;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  flex: 0 0 auto !important;
+
+  .text-product{
+    font-size: 13px;
+  }
 
-  h3 {
-    margin: 36px 0 18px 2%;
+  a{
+    color: white;
+    text-decoration: none;
   }
 }
 </style>

+ 126 - 18
pages/freemium/dashboard.vue

@@ -1,16 +1,20 @@
 <template>
-  <v-container fluid>
+  <v-container fluid class="inner-container">
     <v-row>
       <!-- Bloc événements -->
-      <v-col cols="12" md="8">
+      <v-col cols="12" md="7">
         <v-card>
-          <v-tabs v-model="tab">
-            <v-tab value="future">Mes événements à venir</v-tab>
-            <v-tab value="past">Mes événements passés</v-tab>
+          <v-tabs v-model="tab" class="tabs-title">
+            <v-tab value="future">{{$t('futur_event')}}</v-tab>
+            <v-tab value="past">{{$t('past_event')}}</v-tab>
           </v-tabs>
 
+          <v-btn color="primary" to="events/new" class="ml-5 mt-5">{{$t('add_event')}}</v-btn>
+
           <v-tabs-window v-model="tab">
             <v-tabs-window-item value="future">
+              <UiLoadingPanel v-if="statusUpcomingEvents == FETCHING_STATUS.PENDING" />
+
               <UiEventList
                 v-if="statusUpcomingEvents == FETCHING_STATUS.SUCCESS && upcomingEvents?.items"
                 :events="upcomingEvents.items"
@@ -18,8 +22,13 @@
                 @load="loadUpcomingEvents"
                 @edit="editEvent"
               />
+              <span v-if="upcomingEvents.items.length == 0" class="no_event">
+                {{$t('no_future_event')}}
+              </span>
             </v-tabs-window-item>
             <v-tabs-window-item value="past">
+              <UiLoadingPanel v-if="statusPastEvents == FETCHING_STATUS.PENDING" />
+
               <UiEventList
                 v-if="statusPastEvents == FETCHING_STATUS.SUCCESS && pastEvents?.items"
                 :events="pastEvents.items"
@@ -27,30 +36,46 @@
                 @load="loadPastEvents"
                 @edit="editEvent"
               />
+              <span v-if="pastEvents.items.length == 0" class="no_event">
+                {{$t('no_past_event')}}
+              </span>
             </v-tabs-window-item>
           </v-tabs-window>
 
-          <v-card-actions>
-            <v-btn color="primary" to="events/new">Ajouter un événement</v-btn>
-          </v-card-actions>
         </v-card>
       </v-col>
 
       <!-- Bloc structure -->
-      <v-col cols="12" md="4">
-        <v-card v-if="statusOrganization == FETCHING_STATUS.SUCCESS">
-          <v-card-title>Structure</v-card-title>
+      <v-col cols="12" md="5">
+        <v-card v-if="statusOrganization == FETCHING_STATUS.SUCCESS" class="pa-5">
+          <v-card-title class="text-h6" >
+            <v-icon icon="fa fa-hotel" class="text-button icon-hotel"  />
+            <span class="organization_title">{{$t('my_organization')}}</span>
+          </v-card-title>
           <v-card-text>
-            <div><strong>Nom:</strong> {{ organization?.name }}</div>
-            <div><strong>Email:</strong> {{ organization?.email }}</div>
+            <div><strong>{{$t('name')}} :</strong> {{ organization?.name }}</div>
+            <div><strong>{{$t('email')}} :</strong> {{ organization?.email }}</div>
           </v-card-text>
-          <v-card-actions>
-            <v-btn color="secondary" to="organization">Modifier la structure</v-btn>
-          </v-card-actions>
         </v-card>
+
+        <v-btn block class="mb-2 btn btn_edit_orga" to="organization">
+          <i class="fa fa-pen mr-2" />{{$t('edit_organization')}}
+        </v-btn>
+
+        <v-btn block class="text-black btn btn_trial" @click="startTrial">
+          <span><v-icon icon="fa fa-ticket" /> {{$t('try_premium_light')}}<br /> {{$t('30_days_free')}}</span>
+        </v-btn>
+
       </v-col>
     </v-row>
+
   </v-container>
+
+  <LayoutDialogTrialAlreadyDid
+    :show="showDialogTrialAllReadyDid"
+    @close-dialog="showDialogTrialAllReadyDid = false"
+  />
+
 </template>
 
 <script setup lang="ts">
@@ -61,7 +86,7 @@ definePageMeta({
   name: 'freemium_dashboard_page',
 })
 
-import { ref } from 'vue'
+import {type Ref, ref} from 'vue'
 import {useEntityFetch} from "~/composables/data/useEntityFetch";
 import Organization from "~/models/Freemium/Organization";
 import Event from "~/models/Freemium/Event";
@@ -73,12 +98,16 @@ import TimeFilter from "~/services/data/Filters/TimeFilter";
 import Country from "~/models/Core/Country";
 import DateUtils from "~/services/utils/dateUtils";
 import UrlUtils from "~/services/utils/urlUtils";
+import {useApiLegacyRequestService} from "~/composables/data/useApiLegacyRequestService";
 
 //Ref Définition
-const tab = ref(null)
+const runtimeConfig = useRuntimeConfig()
 const { fetch, fetchCollection } = useEntityFetch()
+const { apiRequestService } = useApiLegacyRequestService()
+const tab = ref(null)
 const upcomingPage = ref(1)
 const pastPage = ref(1)
+const showDialogTrialAllReadyDid: Ref<boolean> = ref(false)
 
 //Fetch
 const { data: organization, status:statusOrganization } = fetch(Organization)
@@ -127,6 +156,24 @@ function fetchEvents(past:boolean = false){
   return fetchCollection(Event, null, query)
 }
 
+/**
+ * Action lorsque l'on souhaite démarrer l'essai
+ */
+async function startTrial() {
+  try {
+    await apiRequestService.get('/trial/is_available')
+    const v1BaseURL =
+      runtimeConfig.baseUrlAdminLegacy ||
+      runtimeConfig.public.baseUrlAdminLegacy
+    await navigateTo(UrlUtils.join(v1BaseURL, '#', 'trial'), {
+      external: true,
+    })
+  } catch (error) {
+    console.log(error)
+    showDialogTrialAllReadyDid.value = true
+  }
+}
+
 /**
  * Nettoyage du store
  */
@@ -139,7 +186,68 @@ onUnmounted(() => {
 </script>
 
 <style scoped>
+
+.tabs-title{
+  margin-top: 20px;
+  padding-left: 20px;
+  background-color: rgb(var(--v-theme-neutral));
+  .v-tab--selected{
+    color: rgb(var(--v-theme-on-neutral--clickable));
+  }
+}
+
+
 .v-card {
   margin-bottom: 16px;
+  color: rgb(var(--v-theme-on-primary-alt));
+}
+
+.v-card-text{
+  div{
+    line-height: 2;
+  }
+}
+
+.organization_title{
+  font-weight: 500;
+}
+
+.icon-hotel{
+  margin: 0 5px 4px 0;
+}
+
+.btn {
+  border: 1px solid;
+  cursor: pointer;
+}
+
+.inner-container {
+  margin: 0 auto;
+  padding: 30px;
+}
+.btn_trial {
+  height: 55px;
+  background-color: rgb(var(--v-theme-x-create-btn));
+  color: #000;
+
+  span {
+    text-align: center;
+    line-height: 1.2; /* optionnel : pour resserrer ou espacer */
+  }
+  .v-icon {
+    transform: rotate(135deg); /* angle en degrés */
+    font-size: 16px;
+    padding-right: 5px;
+    margin: 0 5px 4px 0;
+  }
+}
+
+.btn_edit_orga{
+  color: rgb(var(--v-theme-on-primary-alt)) !important;
+}
+
+.no_event{
+  padding: 25px;
+  font-size: 16px;
 }
 </style>

+ 9 - 0
pages/freemium/events/[id].vue

@@ -1,5 +1,6 @@
 <template>
   <UiFormEdition
+    class="inner-container"
     :model="Event"
     go-back-route="/freemium/dashboard"
   >
@@ -17,3 +18,11 @@ definePageMeta({
 })
 
 </script>
+
+<style scoped lang="scss">
+
+.inner-container {
+  max-width: 1200px;
+}
+
+</style>

+ 9 - 0
pages/freemium/events/new.vue

@@ -1,5 +1,6 @@
 <template>
   <UiFormCreation
+    class="inner-container"
     :model="Event"
     go-back-route="/freemium/dashboard"
   >
@@ -17,3 +18,11 @@ definePageMeta({
 })
 
 </script>
+
+<style scoped lang="scss">
+
+.inner-container {
+  max-width: 1200px;
+}
+
+</style>

+ 11 - 1
pages/freemium/organization.vue

@@ -1,5 +1,7 @@
 <template>
-      <UiFormEdition :model="Organization">
+      <UiFormEdition :model="Organization"
+                     class="inner-container"
+      >
         <template #default="{ entity : organization }">
           <div v-if="organization">
             <LayoutCommonSection>
@@ -121,3 +123,11 @@ onUnmounted(() => {
 const getAsserts = (key) => getAssertUtils(Organization.getAsserts(), key)
 
 </script>
+
+<style scoped lang="scss">
+
+.inner-container {
+  max-width: 1200px;
+}
+
+</style>

+ 1 - 1
pages/subscription.vue

@@ -472,7 +472,6 @@ Page 'Mon abonnement'
 import { useAbility } from '@casl/vue'
 import type { Ref } from 'vue'
 import { useDisplay } from 'vuetify'
-import type { AsyncData } from '#app'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import DolibarrAccount from '~/models/Organization/DolibarrAccount'
@@ -482,6 +481,7 @@ import { useApiLegacyRequestService } from '~/composables/data/useApiLegacyReque
 import { usePageStore } from '~/stores/page'
 import { DOLIBARR_BILLING_DOC_TYPE } from '~/types/enum/enums'
 import LayoutMobytStatus from '~/components/Layout/MobytStatus.vue'
+import {FETCHING_STATUS} from "~/types/enum/data";
 
 // meta
 definePageMeta({

BIN
public/images/OT_Logo_Agenda.png


BIN
public/images/Opentalent_Artist-Blanc.png


BIN
public/images/Opentalent_Artist_Griffe.png


BIN
public/images/Opentalent_Griffe.png


BIN
public/images/Opentalent_Manager-Blanc.png


BIN
public/images/Opentalent_Manager.png


BIN
public/images/Opentalent_Manager_Griffe.png


BIN
public/images/Opentalent_School-Blanc.png


BIN
public/images/Opentalent_School_Griffe.png


+ 9 - 0
stores/organizationProfile.ts

@@ -128,6 +128,14 @@ export const useOrganizationProfileStore = defineStore(
       return product.value === PRODUCT.MANAGER
     })
 
+    /**
+     * L'organization possède-t-elle un produit freemium
+     * @return {boolean}
+     */
+    const isFreemiumProduct = computed((): boolean => {
+      return product.value === PRODUCT.FREEMIUM
+    })
+
     /**
      * L'organization peut-elle afficher la lister des adhérents avec leurs coordonnées
      * @return {boolean|null}
@@ -230,6 +238,7 @@ export const useOrganizationProfileStore = defineStore(
       isSchoolProduct,
       isSchool,
       isManagerProduct,
+      isFreemiumProduct,
       isShowAdherentList,
       isAssociation,
       isTrialActive,

+ 1 - 0
types/enum/enums.ts

@@ -4,6 +4,7 @@ export const enum PRODUCT {
   ARTIST = 'artist',
   ARTIST_PREMIUM = 'artist-premium',
   MANAGER = 'manager',
+  FREEMIUM = 'freemium',
 }
 
 export const enum NETWORK {