|
|
@@ -10,6 +10,13 @@ Prend en paramètre une liste de ItemMenu et les met en forme
|
|
|
:disable-resize-watcher="true"
|
|
|
class="theme-secondary main-menu"
|
|
|
>
|
|
|
+ <div
|
|
|
+ v-if="organizationProfile.isArtist && (accessProfile.isCaMember || accessProfile.isAdmin)"
|
|
|
+ class="btn_trial"
|
|
|
+ :class="{['btn_mini'] : isRail}"
|
|
|
+ @click="trialAction()"
|
|
|
+ ><v-icon icon="fa fa-ticket" /> <span v-if="!isRail">{{btnLabel}}</span></div>
|
|
|
+
|
|
|
<template #prepend>
|
|
|
<slot name="title"></slot>
|
|
|
</template>
|
|
|
@@ -65,6 +72,11 @@ Prend en paramètre une liste de ItemMenu et les met en forme
|
|
|
<slot name="foot"></slot>
|
|
|
</template>
|
|
|
</v-navigation-drawer>
|
|
|
+
|
|
|
+ <DialogTrialAllReadyDid
|
|
|
+ :show="showDialog"
|
|
|
+ @closeDialog = "showDialog = false"
|
|
|
+ />
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
@@ -72,30 +84,30 @@ import { useMenu } from '~/composables/layout/useMenu'
|
|
|
import { computed } from '@vue/reactivity'
|
|
|
import { useDisplay } from 'vuetify'
|
|
|
import type { MenuGroup, MenuItem } from '~/types/layout'
|
|
|
+import UrlUtils from "~/services/utils/urlUtils";
|
|
|
+import {useAp2iRequestService} from "~/composables/data/useAp2iRequestService";
|
|
|
|
|
|
-const { getMenu, hasMenu, isInternalLink, setMenuState, isMenuOpened } =
|
|
|
- useMenu()
|
|
|
+const runtimeConfig = useRuntimeConfig()
|
|
|
+const i18n = useI18n()
|
|
|
+const organizationProfile = useOrganizationProfileStore()
|
|
|
+const accessProfile = useAccessProfileStore()
|
|
|
+const { getMenu, hasMenu, isInternalLink, setMenuState, isMenuOpened } = useMenu()
|
|
|
+const { apiRequestService } = useAp2iRequestService()
|
|
|
|
|
|
const { mdAndUp, lgAndUp } = useDisplay()
|
|
|
|
|
|
+const showDialog: Ref<boolean> = ref(false)
|
|
|
const menu = getMenu('Main')
|
|
|
|
|
|
-const isOpened = computed(() => isMenuOpened('Main'))
|
|
|
-
|
|
|
-let items: Array<MenuGroup | MenuItem>
|
|
|
-if (menu === null) {
|
|
|
- items = []
|
|
|
-} else if (menu.hasOwnProperty('children')) {
|
|
|
- items = (menu as MenuGroup).children ?? []
|
|
|
-} else {
|
|
|
- items = [menu]
|
|
|
-}
|
|
|
-
|
|
|
// En vue lg+, on affiche toujours le menu
|
|
|
const displayMenu = computed(() => {
|
|
|
return menu !== null && hasMenu('Main') && (lgAndUp.value || isOpened.value)
|
|
|
})
|
|
|
|
|
|
+const isOpened = computed(() => isMenuOpened('Main'))
|
|
|
+
|
|
|
+const items: Array<MenuGroup | MenuItem> = getItems(menu)
|
|
|
+
|
|
|
// En vue md+, fermer le menu le passe simplement en mode rail
|
|
|
// Sinon, le fermer le masque complètement
|
|
|
const isRail = computed(() => {
|
|
|
@@ -107,6 +119,10 @@ const isRail = computed(() => {
|
|
|
)
|
|
|
})
|
|
|
|
|
|
+const btnLabel = computed(() => {
|
|
|
+ return organizationProfile.principalType === 'ARTISTIC_PRACTICE_ONLY' ? i18n.t('try_premium') : i18n.t('discover_offer')
|
|
|
+})
|
|
|
+
|
|
|
const unwatch = watch(lgAndUp, (newValue, oldValue) => {
|
|
|
// Par défaut si l'écran est trop petit au chargement de la page, le menu doit rester fermé.
|
|
|
if (process.client && menu !== null) {
|
|
|
@@ -117,6 +133,46 @@ const unwatch = watch(lgAndUp, (newValue, oldValue) => {
|
|
|
onUnmounted(() => {
|
|
|
unwatch()
|
|
|
})
|
|
|
+
|
|
|
+/**
|
|
|
+ * Lorsque l'on appuie sur le bouton pour démarrer l'essai / découvrir les offres
|
|
|
+ */
|
|
|
+const trialAction = async () => {
|
|
|
+ if(organizationProfile.principalType === 'ARTISTIC_PRACTICE_ONLY'){
|
|
|
+ const apiV1BaseURL = runtimeConfig.baseUrlLegacy || runtimeConfig.public.baseUrlLegacy
|
|
|
+ try{
|
|
|
+ await apiRequestService.get(
|
|
|
+ UrlUtils.join(apiV1BaseURL, '/api/trial/is_available')
|
|
|
+ )
|
|
|
+
|
|
|
+ const v1BaseURL = runtimeConfig.baseUrlAdminLegacy || runtimeConfig.public.baseUrlAdminLegacy
|
|
|
+ await navigateTo(UrlUtils.join(v1BaseURL, '#', 'trial'), {
|
|
|
+ external: true
|
|
|
+ })
|
|
|
+ }catch(error){
|
|
|
+ showDialog.value = true
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ await navigateTo('/subscription')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Récupère les menuItem disponibles
|
|
|
+ * @param menu
|
|
|
+ */
|
|
|
+function getItems(menu: MenuGroup|MenuItem|null) : Array<MenuGroup | MenuItem>{
|
|
|
+ let items: Array<MenuGroup | MenuItem>
|
|
|
+
|
|
|
+ if (menu === null) {
|
|
|
+ items = []
|
|
|
+ } else if (menu.hasOwnProperty('children')) {
|
|
|
+ items = (menu as MenuGroup).children ?? []
|
|
|
+ } else {
|
|
|
+ items = [menu]
|
|
|
+ }
|
|
|
+ return items;
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@@ -183,4 +239,35 @@ onUnmounted(() => {
|
|
|
:deep(.menu-item .fa) {
|
|
|
text-align: center;
|
|
|
}
|
|
|
+
|
|
|
+.btn_trial{
|
|
|
+ background-color: rgb(var(--v-theme-x-create-btn));
|
|
|
+ border-radius: 5px;
|
|
|
+ border: 1px solid #fff;
|
|
|
+ margin-left: 15px;
|
|
|
+ margin-right: 15px;
|
|
|
+ font-size: 12px;
|
|
|
+ text-align: center;
|
|
|
+ color:#000;
|
|
|
+ margin-top: 5px;
|
|
|
+ padding: 5px;
|
|
|
+ padding-left: 10px;
|
|
|
+ padding-right: 10px;
|
|
|
+ cursor: pointer;
|
|
|
+ .v-icon{
|
|
|
+ font-size: 15px;
|
|
|
+ color:#000;
|
|
|
+ padding-right: 5px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.btn_mini{
|
|
|
+ font-size: 17px;
|
|
|
+ margin-left: 7px;
|
|
|
+ margin-right: 7px;
|
|
|
+ padding: 0px;
|
|
|
+ .v-icon{
|
|
|
+ padding-right: 0px;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|