@saooti/octopus-sdk 40.2.19 → 41.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/index.ts +2 -1
  2. package/package.json +4 -3
  3. package/src/App.vue +71 -95
  4. package/src/components/composable/player/usePlayerLive.ts +13 -4
  5. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  6. package/src/components/composable/player/usePlayerVast.ts +7 -7
  7. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  8. package/src/components/composable/route/useAdvancedParamInit.ts +1 -1
  9. package/src/components/composable/route/useRouteUpdateParams.ts +4 -4
  10. package/src/components/composable/route/useSimplePageParam.ts +15 -8
  11. package/src/components/composable/useInit.ts +2 -2
  12. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  13. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  14. package/src/components/display/categories/CategoryChooser.vue +144 -145
  15. package/src/components/display/categories/CategoryFilter.vue +172 -198
  16. package/src/components/display/categories/CategoryList.vue +122 -147
  17. package/src/components/display/comments/CommentInput.vue +100 -122
  18. package/src/components/display/comments/CommentList.vue +169 -191
  19. package/src/components/display/comments/CommentName.vue +35 -45
  20. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  21. package/src/components/display/comments/CommentPlayer.vue +38 -50
  22. package/src/components/display/comments/CommentSection.vue +85 -103
  23. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  24. package/src/components/display/comments/item/CommentItem.vue +104 -115
  25. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  26. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  27. package/src/components/display/comments/like/LikeButton.vue +36 -41
  28. package/src/components/display/comments/like/LikeSection.vue +128 -136
  29. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  30. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  31. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  32. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  33. package/src/components/display/edit/EditBox.vue +9 -8
  34. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  35. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  36. package/src/components/display/emission/EmissionItem.vue +57 -69
  37. package/src/components/display/emission/EmissionList.vue +189 -218
  38. package/src/components/display/emission/EmissionPlayerItem.vue +47 -64
  39. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  40. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  41. package/src/components/display/filter/AdvancedSearch.vue +151 -176
  42. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  43. package/src/components/display/filter/DateFilter.vue +76 -91
  44. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  45. package/src/components/display/filter/ProductorSearch.vue +87 -90
  46. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  47. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  48. package/src/components/display/filter/SearchOrder.vue +35 -35
  49. package/src/components/display/list/ListPaginate.vue +72 -93
  50. package/src/components/display/list/PaginateParams.vue +36 -40
  51. package/src/components/display/list/PaginateSection.vue +113 -124
  52. package/src/components/display/list/SwiperList.vue +97 -109
  53. package/src/components/display/live/CountDown.vue +15 -9
  54. package/src/components/display/live/CountdownOctopus.vue +16 -10
  55. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  56. package/src/components/display/live/LiveItem.vue +64 -73
  57. package/src/components/display/live/LiveList.vue +125 -137
  58. package/src/components/display/live/RadioCurrently.vue +66 -73
  59. package/src/components/display/live/RadioImage.vue +39 -50
  60. package/src/components/display/live/RadioItem.vue +9 -14
  61. package/src/components/display/live/RadioList.vue +39 -53
  62. package/src/components/display/live/RadioPlanning.vue +210 -222
  63. package/src/components/display/organisation/OrganisationChooser.vue +116 -122
  64. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  65. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  66. package/src/components/display/participant/ParticipantItem.vue +66 -74
  67. package/src/components/display/participant/ParticipantList.vue +116 -141
  68. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  69. package/src/components/display/playlist/PlaylistList.vue +115 -144
  70. package/src/components/display/playlist/PodcastList.vue +90 -103
  71. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  72. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  73. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  74. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  75. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  76. package/src/components/display/podcasts/PodcastFilterList.vue +62 -56
  77. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  78. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  79. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  80. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  81. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  82. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  83. package/src/components/display/podcasts/PodcastList.vue +182 -206
  84. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  85. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  86. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  87. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  88. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  89. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  90. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  91. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  92. package/src/components/display/podcasts/TagList.vue +48 -50
  93. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  94. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  95. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  96. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  97. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  98. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  99. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  100. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  101. package/src/components/display/sharing/QrCode.vue +55 -67
  102. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  103. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  104. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  105. package/src/components/display/sharing/SharePlayer.vue +273 -295
  106. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  107. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  108. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  109. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  110. package/src/components/display/sharing/SubscribeButtons.vue +184 -207
  111. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  112. package/src/components/form/ClassicCheckbox.vue +26 -30
  113. package/src/components/form/ClassicContentEditable.vue +37 -33
  114. package/src/components/form/ClassicCopyButton.vue +40 -44
  115. package/src/components/form/ClassicDatePicker.vue +114 -114
  116. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  117. package/src/components/form/ClassicInputText.vue +116 -120
  118. package/src/components/form/ClassicLoading.vue +7 -12
  119. package/src/components/form/ClassicMultiselect.vue +115 -117
  120. package/src/components/form/ClassicRadio.vue +21 -16
  121. package/src/components/form/ClassicRadioLabel.vue +23 -22
  122. package/src/components/form/ClassicSearch.vue +24 -19
  123. package/src/components/form/ClassicSelect.vue +47 -38
  124. package/src/components/form/ClassicWysiwyg.vue +116 -123
  125. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  126. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  127. package/src/components/icons/BlueSkyIcon.vue +8 -11
  128. package/src/components/icons/DeezerIcon.vue +8 -11
  129. package/src/components/icons/EditFtpIcon.vue +8 -11
  130. package/src/components/icons/IHeartIcon.vue +8 -11
  131. package/src/components/icons/PlayVideoIcon.vue +7 -10
  132. package/src/components/icons/PlayerFmIcon.vue +7 -10
  133. package/src/components/icons/PocketCastIcon.vue +8 -11
  134. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  135. package/src/components/icons/RadiolineIcon.vue +8 -11
  136. package/src/components/icons/TuninIcon.vue +8 -11
  137. package/src/components/icons/XIcon.vue +7 -10
  138. package/src/components/misc/AcpmImage.vue +6 -7
  139. package/src/components/misc/ClassicAccordion.vue +26 -31
  140. package/src/components/misc/ClassicLazy.vue +86 -90
  141. package/src/components/misc/ClassicNav.vue +16 -20
  142. package/src/components/misc/ClassicPopover.vue +271 -282
  143. package/src/components/misc/ClassicSpinner.vue +5 -27
  144. package/src/components/misc/ErrorMessage.vue +11 -12
  145. package/src/components/misc/FooterGarSection.vue +33 -41
  146. package/src/components/misc/FooterSection.vue +94 -131
  147. package/src/components/misc/HomeDropdown.vue +83 -105
  148. package/src/components/misc/MobileMenu.vue +101 -111
  149. package/src/components/misc/ProgressBar.vue +53 -62
  150. package/src/components/misc/TopBar.vue +98 -120
  151. package/src/components/misc/TopBarMainContent.vue +114 -133
  152. package/src/components/misc/modal/ClassicModal.vue +40 -33
  153. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  154. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  155. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  156. package/src/components/misc/modal/MessageModal.vue +50 -47
  157. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  158. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  159. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  160. package/src/components/misc/player/PlayerCompact.vue +6 -4
  161. package/src/components/misc/player/PlayerComponent.vue +8 -9
  162. package/src/components/misc/player/PlayerLarge.vue +9 -8
  163. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  164. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  165. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  166. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  167. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  168. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  169. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  170. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  171. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  172. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  173. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  174. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  175. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  176. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  177. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  178. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  179. package/src/components/pages/CategoryPage.vue +28 -33
  180. package/src/components/pages/EmissionPage.vue +113 -132
  181. package/src/components/pages/EmissionsPage.vue +2 -0
  182. package/src/components/pages/Error403Page.vue +21 -20
  183. package/src/components/pages/HomePage.vue +91 -100
  184. package/src/components/pages/LivesPage.vue +35 -37
  185. package/src/components/pages/MapPage.vue +209 -241
  186. package/src/components/pages/PageLogout.vue +8 -11
  187. package/src/components/pages/PageNotFound.vue +9 -5
  188. package/src/components/pages/ParticipantPage.vue +96 -110
  189. package/src/components/pages/ParticipantsPage.vue +3 -0
  190. package/src/components/pages/PlaylistPage.vue +112 -117
  191. package/src/components/pages/PlaylistsPage.vue +9 -2
  192. package/src/components/pages/PodcastPage.vue +224 -238
  193. package/src/components/pages/PodcastsPage.vue +9 -2
  194. package/src/components/pages/RadioPage.vue +56 -70
  195. package/src/components/pages/RubriquePage.vue +7 -3
  196. package/src/components/pages/SearchPage.vue +31 -36
  197. package/src/components/pages/TagPage.vue +11 -9
  198. package/src/components/pages/VideoPage.vue +14 -11
  199. package/src/helper/displayHelper.ts +1 -1
  200. package/src/helper/loadScript.ts +4 -4
  201. package/src/i18n.ts +2 -2
  202. package/src/main.ts +1 -1
  203. package/src/router/router.ts +17 -4
  204. package/src/stores/AuthStore.ts +12 -12
  205. package/src/stores/FilterStore.ts +1 -1
  206. package/src/stores/VastStore.ts +2 -2
  207. package/src/stores/class/general/player.ts +1 -0
  208. package/public/css/fonts/icomoon.eot +0 -0
  209. package/public/css/fonts/icomoon.svg +0 -113
  210. package/public/css/fonts/icomoon.ttf +0 -0
  211. package/public/css/fonts/icomoon.woff +0 -0
  212. package/public/css/fonts/icomoon.woff2 +0 -0
  213. package/public/css/fonts/style.css +0 -352
  214. package/sonarqube-scanner.js +0 -10
@@ -17,53 +17,45 @@
17
17
  </div>
18
18
  </template>
19
19
 
20
- <script lang="ts">
20
+ <script setup lang="ts">
21
21
  import downloadHelper from "../../helper/downloadHelper";
22
22
  import classicApi from "../../api/classicApi";
23
23
  import { Contract } from "../../stores/class/contract/contract";
24
- import { defineAsyncComponent, defineComponent } from "vue";
24
+ import { defineAsyncComponent, onMounted, ref, Ref } from "vue";
25
25
  import { useApiStore } from "../../stores/ApiStore";
26
- import { mapState } from "pinia";
27
26
  const ContractPreviewModal = defineAsyncComponent(
28
27
  () => import("./modal/ContractPreviewModal.vue"),
29
28
  );
30
- export default defineComponent({
31
- name: "FooterGarSection",
32
- components: {
33
- ContractPreviewModal,
34
- },
35
- props: {
36
- authOrgaId: { default: undefined, type: String },
37
- },
38
29
 
39
- data() {
40
- return {
41
- contracts: [] as Array<Contract>,
42
- contractToDisplay: undefined as Contract | undefined,
43
- };
44
- },
45
- computed: {
46
- ...mapState(useApiStore, ["keycloakUrl"]),
47
- },
48
- created() {
49
- this.fetchContracts();
50
- },
51
- methods: {
52
- async fetchContracts() {
53
- if (!this.authOrgaId) {
54
- return;
55
- }
56
- this.contracts = await classicApi.fetchData({
57
- api: 3,
58
- path: `contract/query/organisation/${this.authOrgaId}?signedStatus=SIGNED`,
59
- });
60
- },
61
- downloadContract(contract: Contract) {
62
- if (contract) {
63
- const url = this.keycloakUrl + "contract/" + contract.id;
64
- downloadHelper.onDownload(url, "download" + contract.name + ".pdf");
65
- }
66
- },
67
- },
68
- });
30
+ //Props
31
+ const props = defineProps({
32
+ authOrgaId: { default: undefined, type: String },
33
+ })
34
+
35
+
36
+ //Data
37
+ const contractToDisplay: Ref<Contract | undefined> = ref(undefined);
38
+ const contracts: Ref<Array<Contract>> = ref([]);
39
+
40
+ //Composables
41
+ const apiStore = useApiStore();
42
+
43
+ onMounted(()=>fetchContracts())
44
+
45
+ //Methods
46
+ async function fetchContracts() {
47
+ if (!props.authOrgaId) {
48
+ return;
49
+ }
50
+ contracts.value = await classicApi.fetchData({
51
+ api: 3,
52
+ path: `contract/query/organisation/${props.authOrgaId}?signedStatus=SIGNED`,
53
+ });
54
+ }
55
+ function downloadContract(contract: Contract) {
56
+ if (contract) {
57
+ const url = apiStore.keycloakUrl + "contract/" + contract.id;
58
+ downloadHelper.onDownload(url, "download" + contract.name + ".pdf");
59
+ }
60
+ }
69
61
  </script>
@@ -5,12 +5,12 @@
5
5
  role="contentinfo"
6
6
  class="d-flex align-items-center justify-content-between border-top mt-auto"
7
7
  >
8
- <div v-if="!isPodcastmaker" class="d-flex flex-column px-1">
8
+ <div v-if="!state.generalParameters.podcastmaker" class="d-flex flex-column px-1">
9
9
  <div class="text-dark my-1 special-select-align-magic-trick">
10
10
  &copy; Saooti 2025
11
11
  </div>
12
- <FooterGarSection v-if="isGarRole" :auth-orga-id="authOrgaId" />
13
- <nav :aria-label="$t('Site menu')">
12
+ <FooterGarSection v-if="authStore.isGarRole" :auth-orga-id="authStore.authOrgaId" />
13
+ <nav :aria-label="t('Site menu')">
14
14
  <ul class="p-0 m-0">
15
15
  <li
16
16
  v-for="link in routerLinkSecondArray"
@@ -30,7 +30,7 @@
30
30
  v-model:text-init="language"
31
31
  :display-label="false"
32
32
  id-select="language-chooser-select"
33
- :label="$t('Change locale')"
33
+ :label="t('Change locale')"
34
34
  :transparent="true"
35
35
  :options="[
36
36
  { title: 'Deutsch', value: 'de' },
@@ -43,11 +43,11 @@
43
43
  class="my-1"
44
44
  />
45
45
  <OrganisationChooserLight
46
- v-if="!isPodcastmaker && organisationId && authenticated"
46
+ v-if="!state.generalParameters.podcastmaker && organisationId && authenticated"
47
47
  page="footer"
48
48
  width="auto"
49
49
  class="my-1"
50
- :defaultanswer="$t('No organisation filter')"
50
+ :defaultanswer="t('No organisation filter')"
51
51
  :value="organisationId"
52
52
  :reset="reset"
53
53
  @selected="onOrganisationSelected"
@@ -55,16 +55,16 @@
55
55
  </div>
56
56
  <div class="d-flex align-items-center">
57
57
  <div class="hosted-by">
58
- {{ $t("Hosted by") }}<span class="ms-1 me-1 text-primary">Saooti</span>
58
+ {{ t("Hosted by") }}<span class="ms-1 me-1 text-primary">Saooti</span>
59
59
  </div>
60
60
 
61
- <AcpmImage v-if="isGarRole" />
61
+ <AcpmImage v-if="authStore.isGarRole" />
62
62
  <a
63
63
  v-else
64
64
  href="https://www.acpm.fr/L-ACPM/Certifications-et-Labels/Les-Podcasts"
65
65
  rel="noreferrer noopener"
66
66
  target="_blank"
67
- :title="$t('New window', {text: $t('Octopus is ACPM Podcast accredited')})"
67
+ :title="t('New window', {text: t('Octopus is ACPM Podcast accredited')})"
68
68
  >
69
69
  <AcpmImage />
70
70
  </a>
@@ -72,9 +72,8 @@
72
72
  </footer>
73
73
  </template>
74
74
 
75
- <script lang="ts">
75
+ <script setup lang="ts">
76
76
  import cookiesHelper from "../../helper/cookiesHelper";
77
- import { useRubriquesFilterComputed } from "../composable/route/useRubriquesFilterComputed";
78
77
  import ClassicSelect from "../form/ClassicSelect.vue";
79
78
  import AcpmImage from "./AcpmImage.vue";
80
79
  import { state } from "../../stores/ParamSdkStore";
@@ -83,136 +82,100 @@ import classicApi from "../../api/classicApi";
83
82
  import { useFilterStore } from "../../stores/FilterStore";
84
83
  import { useGeneralStore } from "../../stores/GeneralStore";
85
84
  import { useAuthStore } from "../../stores/AuthStore";
86
- import { mapState, mapActions } from "pinia";
87
85
  import { Category } from "@/stores/class/general/category";
88
- import { defineAsyncComponent, defineComponent } from "vue";
86
+ import { computed, defineAsyncComponent, Ref, ref, watch } from "vue";
89
87
  import { Organisation } from "@/stores/class/general/organisation";
88
+ import { useI18n } from "vue-i18n";
89
+ import { useRoute, useRouter } from "vue-router";
90
90
  const OrganisationChooserLight = defineAsyncComponent(
91
91
  () => import("../display/organisation/OrganisationChooserLight.vue"),
92
92
  );
93
93
  const FooterGarSection = defineAsyncComponent(
94
94
  () => import("./FooterGarSection.vue"),
95
95
  );
96
- export default defineComponent({
97
- name: "FooterSection",
98
- components: {
99
- ClassicSelect,
100
- AcpmImage,
101
- OrganisationChooserLight,
102
- FooterGarSection,
103
- },
96
+ const i18n = useI18n();
97
+ const { t, locale } = useI18n();
104
98
 
105
- setup(){
106
- const { rubriqueQueryParam } = useRubriquesFilterComputed();
107
- return { rubriqueQueryParam }
108
- },
109
- data() {
110
- return {
111
- language: this.$i18n.locale,
112
- organisationId: undefined as string | undefined,
113
- reset: false as boolean,
114
- };
115
- },
116
- computed: {
117
- ...mapState(useGeneralStore, ["storedCategories", "platformEducation"]),
118
- ...mapState(useFilterStore, ["filterOrgaId", "filterIab"]),
119
- ...mapState(useAuthStore, ["isGarRole", "authOrgaId"]),
120
- authenticated() {
121
- return undefined !== this.authOrgaId;
122
- },
123
- routerLinkSecondArray() {
124
- const links = [];
125
- if (!this.isGarRole) {
126
- links.push(
127
- { title: this.$t("Contact"), routeName: "/main/pub/contact" },
128
- {
129
- title: this.$t("Used libraries"),
130
- routeName: "/main/pub/libraries",
131
- },
132
- { title: this.$t("Term of use"), routeName: "/main/pub/cgu" },
133
- );
134
- }
135
- links.push({ title: this.$t("Site map"), routeName: "/main/pub/map" });
136
- return links;
137
- },
138
- isPodcastmaker(): boolean {
139
- return state.generalParameters.podcastmaker as boolean;
140
- },
141
- },
142
- watch: {
143
- language() {
144
- this.changeLanguage();
145
- },
146
- filterOrgaId: {
147
- immediate: true,
148
- handler() {
149
- if (this.filterOrgaId) {
150
- this.organisationId = this.filterOrgaId;
151
- } else {
152
- this.reset = !this.reset;
153
- }
154
- },
155
- },
156
- },
157
- methods: {
158
- ...mapActions(useGeneralStore, ["storedUpdateCategories"]),
159
- ...mapActions(useFilterStore, ["filterUpdateIab"]),
160
- getQueriesRouter(routeName: string) {
161
- if (
162
- "podcasts" !== routeName &&
163
- "emissions" !== routeName &&
164
- "home" !== routeName
165
- ) {
166
- return { productor: this.filterOrgaId };
167
- }
168
- return {
169
- productor: this.filterOrgaId,
170
- iabId: this.filterIab?.id,
171
- rubriquesId: this.rubriqueQueryParam,
172
- };
173
- },
174
- changeLanguage(): void {
175
- cookiesHelper.setCookie("octopus-language", this.language);
176
- loadLocaleMessages(
177
- this.$i18n,
178
- this.language,
179
- this.authenticated,
180
- this.platformEducation,
181
- );
182
- classicApi
183
- .fetchData<Array<Category>>({
184
- api: 0,
185
- path: `iab/list${this.authOrgaId ? "/" + this.authOrgaId : ""}`,
186
- parameters: { lang: this.$i18n.locale },
187
- })
188
- .then((data: Array<Category>) => {
189
- this.storedUpdateCategories(data);
190
- if (this.filterIab) {
191
- const category = this.storedCategories.filter((c: Category) => {
192
- return c.id === this.filterIab?.id;
193
- });
194
- if (category.length) {
195
- this.filterUpdateIab(category[0]);
196
- }
197
- }
198
- });
199
- },
200
- async onOrganisationSelected(
201
- organisation: Organisation | undefined,
202
- ): Promise<void> {
203
- if (organisation?.id) {
204
- this.$router.push({
205
- query: { ...this.$route.query, ...{ productor: organisation.id, o:undefined } },
206
- });
207
- }else{
208
- this.organisationId = undefined;
209
- this.$router.push({
210
- query: { ...this.$route.query, ...{ productor: undefined } },
211
- });
212
- }
213
- },
214
- },
99
+ //Data
100
+ const language = ref(locale);
101
+ const reset = ref(false);
102
+ const organisationId: Ref<string | undefined> = ref(undefined);
103
+
104
+ //Composables
105
+ const generalStore = useGeneralStore();
106
+ const filterStore = useFilterStore();
107
+ const authStore = useAuthStore();
108
+ const router = useRouter();
109
+ const route = useRoute();
110
+
111
+
112
+ //Computed
113
+ const authenticated = computed(() => undefined !== authStore.authOrgaId);
114
+ const routerLinkSecondArray = computed(() => {
115
+ const links = [];
116
+ if (!authStore.isGarRole) {
117
+ links.push(
118
+ { title: t("Contact"), routeName: "/main/pub/contact" },
119
+ { title:t("Used libraries"), routeName: "/main/pub/libraries"},
120
+ { title: t("Term of use"), routeName: "/main/pub/cgu" },
121
+ );
122
+ }
123
+ links.push({ title: t("Site map"), routeName: "/main/pub/map" });
124
+ return links;
215
125
  });
126
+
127
+
128
+ //Watch
129
+ watch(language, () => changeLanguage());
130
+ watch(()=>filterStore.filterOrgaId, () => {
131
+ if (filterStore.filterOrgaId) {
132
+ organisationId.value = filterStore.filterOrgaId;
133
+ } else {
134
+ reset.value = !reset.value;
135
+ }
136
+ }, {immediate: true});
137
+
138
+
139
+
140
+ //Methods
141
+ function changeLanguage(): void {
142
+ cookiesHelper.setCookie("octopus-language", language.value);
143
+ loadLocaleMessages(
144
+ i18n,
145
+ language.value,
146
+ authenticated.value,
147
+ generalStore.platformEducation,
148
+ );
149
+ classicApi
150
+ .fetchData<Array<Category>>({
151
+ api: 0,
152
+ path: `iab/list${authStore.authOrgaId ? "/" + authStore.authOrgaId : ""}`,
153
+ parameters: { lang: language.value },
154
+ })
155
+ .then((data: Array<Category>) => {
156
+ generalStore.storedUpdateCategories(data);
157
+ if (filterStore.filterIab) {
158
+ const category = generalStore.storedCategories.filter((c: Category) => {
159
+ return c.id === filterStore.filterIab?.id;
160
+ });
161
+ if (category.length) {
162
+ filterStore.filterUpdateIab(category[0]);
163
+ }
164
+ }
165
+ });
166
+ }
167
+ async function onOrganisationSelected( organisation: Organisation | undefined): Promise<void> {
168
+ if (organisation?.id) {
169
+ router.push({
170
+ query: { ...route.query, ...{ productor: organisation.id, o:undefined } },
171
+ });
172
+ }else{
173
+ organisationId.value = undefined;
174
+ router.push({
175
+ query: { ...route.query, ...{ productor: undefined } },
176
+ });
177
+ }
178
+ }
216
179
  </script>
217
180
 
218
181
  <style lang="scss">
@@ -2,15 +2,15 @@
2
2
  <div class="d-flex align-items-center">
3
3
  <button
4
4
  v-if="isAuthenticatedWithOrga"
5
- :title="$t('My space')"
5
+ :title="t('My space')"
6
6
  class="btn admin-button hide-small-screen m-1 text-blue-octopus"
7
7
  @click="goToAdministration"
8
8
  >
9
9
  <AppsIcon :size="30" />
10
10
  </button>
11
11
  <router-link
12
- v-if="isAuthenticatedWithOrga && isRoleContribution"
13
- :title="$t('Upload')"
12
+ v-if="isAuthenticatedWithOrga && authStore.isRoleContribution"
13
+ :title="t('Upload')"
14
14
  to="/main/priv/upload"
15
15
  class="btn admin-button hide-small-screen m-1 text-blue-octopus"
16
16
  >
@@ -20,7 +20,7 @@
20
20
  v-show="!mobileMenuDisplay || isAuthenticatedWithOrga"
21
21
  id="home-dropdown"
22
22
  class="btn m-1 admin-button hide-small-screen text-blue-octopus"
23
- :title="$t('User menu')"
23
+ :title="t('User menu')"
24
24
  >
25
25
  <AccountIcon :size="30" />
26
26
  </button>
@@ -32,28 +32,28 @@
32
32
  :left-pos="true"
33
33
  :is-top-layer="true"
34
34
  >
35
- <nav :aria-label="$t('User menu')">
35
+ <nav :aria-label="t('User menu')">
36
36
  <ul class="p-0 m-0">
37
37
  <template v-if="!isAuthenticated">
38
38
  <li class="li-style-none">
39
39
  <a class="octopus-dropdown-item realLink" :href="pathLogin">
40
- {{ $t("Login") }}
40
+ {{ t("Login") }}
41
41
  </a>
42
42
  </li>
43
43
  <li class="li-style-none">
44
44
  <router-link
45
- v-if="!isPodcastmaker"
45
+ v-if="!state.generalParameters.podcastmaker"
46
46
  class="octopus-dropdown-item"
47
47
  to="/main/pub/create"
48
48
  >
49
- {{ $t("Create an account") }}
49
+ {{ t("Create an account") }}
50
50
  </router-link>
51
51
  </li>
52
52
  </template>
53
53
  <template v-else>
54
54
  <li v-for="routerBack in routerBackoffice" :key="routerBack.path" class="li-style-none">
55
55
  <router-link
56
- v-if="!isPodcastmaker && routerBack.condition"
56
+ v-if="!state.generalParameters.podcastmaker && routerBack.condition"
57
57
  :class="routerBack.class"
58
58
  :to="routerBack.path"
59
59
  >
@@ -68,7 +68,7 @@
68
68
  class="octopus-dropdown-item realLink"
69
69
  rel="noreferrer noopener"
70
70
  target="_blank"
71
- :title="$t('New window', {text: helpLink.title})"
71
+ :title="t('New window', {text: helpLink.title})"
72
72
  >
73
73
  {{ helpLink.title }}
74
74
  <OpenInNewIcon class="ms-1" :size="15"/>
@@ -78,17 +78,17 @@
78
78
  <hr />
79
79
  <li class="li-style-none">
80
80
  <a class="octopus-dropdown-item c-hand" href="/logout">
81
- {{ $t("Logout") }}
81
+ {{ t("Logout") }}
82
82
  </a>
83
83
  </li>
84
84
  </template>
85
85
  <li class="li-style-none">
86
86
  <router-link
87
- v-if="!isGarRole"
87
+ v-if="!authStore.isGarRole"
88
88
  class="octopus-dropdown-item"
89
89
  to="/main/pub/contact"
90
90
  >
91
- {{ $t("Contact") }}
91
+ {{ t("Contact") }}
92
92
  </router-link>
93
93
  </li>
94
94
  </ul>
@@ -97,7 +97,7 @@
97
97
  </div>
98
98
  </template>
99
99
 
100
- <script lang="ts">
100
+ <script setup lang="ts">
101
101
  import OpenInNewIcon from "vue-material-design-icons/OpenInNew.vue";
102
102
  import AppsIcon from "vue-material-design-icons/Apps.vue";
103
103
  import AccountIcon from "vue-material-design-icons/Account.vue";
@@ -105,101 +105,79 @@ import DownloadIcon from "vue-material-design-icons/Download.vue";
105
105
  import { state } from "../../stores/ParamSdkStore";
106
106
  import ClassicPopover from "../misc/ClassicPopover.vue";
107
107
  import { useAuthStore } from "../../stores/AuthStore";
108
- import { mapState } from "pinia";
109
- import { defineComponent } from "vue";
110
- import { Organisation } from "@/stores/class/general/organisation";
108
+ import { computed } from "vue";
111
109
  import { useApiStore } from "../../stores/ApiStore";
112
- export default defineComponent({
113
- name: "HomeDropdown",
114
- components: {
115
- ClassicPopover,
116
- DownloadIcon,
117
- AccountIcon,
118
- AppsIcon,
119
- OpenInNewIcon
120
- },
121
- props: {
122
- isEducation: { default: false, type: Boolean },
123
- mobileMenuDisplay: { default: false, type: Boolean },
124
- scrolled: { default: false, type: Boolean },
125
- },
126
- computed: {
127
- ...mapState(useAuthStore, [
128
- "authOrgaId",
129
- "authProfile",
130
- "isGarRole",
131
- "isRoleContribution",
132
- "isRoleOrganisation",
133
- ]),
134
- ...mapState(useApiStore, ["frontendUrl"]),
135
- pathLogin(){
136
- return "/sso/login?redirect_url="+encodeURI(this.frontendUrl + this.$route.fullPath);
137
- },
138
- organisationsAvailable(): Array<Organisation> {
139
- return this.authProfile.organisations ?? [];
140
- },
141
- helpLinks() {
142
- if (this.isGarRole || this.isEducation) {
143
- return [];
144
- }
145
- return [
146
- {
147
- title: this.$t("Help"),
148
- href: "https://help.octopus.saooti.com/Aide/",
149
- },
150
- { title: this.$t("TutoMag"), href: "https://help.octopus.saooti.com/" },
151
- ];
152
- },
153
- routerBackoffice() {
154
- return [
155
- {
156
- title: this.$t("My space"),
157
- class: "octopus-dropdown-item show-small-phone-flex",
158
- path: "/main/priv/backoffice",
159
- condition: this.isAuthenticatedWithOrga,
160
- },
161
- {
162
- title: this.$t("Upload"),
163
- class: "octopus-dropdown-item show-small-phone-flex",
164
- path: "/main/priv/upload",
165
- condition: this.isAuthenticatedWithOrga && this.isRoleContribution,
166
- },
167
- {
168
- title: this.$t("Edit my profile"),
169
- class: "octopus-dropdown-item",
170
- path: "/main/priv/edit/profile",
171
- condition: true,
172
- },
173
- {
174
- title: this.$t("Edit my organisation"),
175
- class: "octopus-dropdown-item",
176
- path: "/main/priv/edit/organisation",
177
- condition:
178
- this.isAuthenticatedWithOrga &&
179
- (this.isRoleOrganisation || 1 < this.organisationsAvailable.length),
180
- },
181
- ];
182
- },
183
- isPodcastmaker(): boolean {
184
- return state.generalParameters.podcastmaker as boolean;
110
+ import { useI18n } from "vue-i18n";
111
+ import { useRoute, useRouter } from "vue-router";
112
+
113
+ //Props
114
+ const props = defineProps({
115
+ isEducation: { default: false, type: Boolean },
116
+ mobileMenuDisplay: { default: false, type: Boolean },
117
+ scrolled: { default: false, type: Boolean },
118
+ })
119
+
120
+ //Composables
121
+ const { t } = useI18n();
122
+ const authStore = useAuthStore();
123
+ const apiStore = useApiStore();
124
+ const route = useRoute();
125
+ const router = useRouter();
126
+
127
+ //Computed
128
+ const isAuthenticated = computed(() => undefined !== authStore.authProfile?.userId);
129
+ const isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);
130
+ const pathLogin = computed(() => "/sso/login?redirect_url="+encodeURI(apiStore.frontendUrl + route.fullPath));
131
+ const organisationsAvailable = computed(() => authStore.authProfile?.organisations ?? []);
132
+ const helpLinks = computed(() => {
133
+ if (authStore.isGarRole || props.isEducation) {
134
+ return [];
135
+ }
136
+ return [
137
+ { title:t("Help"), href: "https://help.octopus.saooti.com/Aide/"},
138
+ { title: t("TutoMag"), href: "https://help.octopus.saooti.com/" },
139
+ ];
140
+ });
141
+ const routerBackoffice = computed(() => {
142
+ return [
143
+ {
144
+ title: t("My space"),
145
+ class: "octopus-dropdown-item show-small-phone-flex",
146
+ path: "/main/priv/backoffice",
147
+ condition: isAuthenticatedWithOrga.value,
185
148
  },
186
- isAuthenticated(): boolean {
187
- return undefined !== this.authProfile?.userId;
149
+ {
150
+ title: t("Upload"),
151
+ class: "octopus-dropdown-item show-small-phone-flex",
152
+ path: "/main/priv/upload",
153
+ condition: isAuthenticatedWithOrga.value && authStore.isRoleContribution,
188
154
  },
189
- isAuthenticatedWithOrga(): boolean {
190
- return undefined !== this.authOrgaId;
155
+ {
156
+ title: t("Edit my profile"),
157
+ class: "octopus-dropdown-item",
158
+ path: "/main/priv/edit/profile",
159
+ condition: true,
191
160
  },
192
- },
193
- methods: {
194
- goToAdministration() {
195
- if ("backoffice" !== this.$route.name) {
196
- this.$router.push("/main/priv/backoffice");
197
- } else if (window.history.length > 1) {
198
- this.$router.go(-1);
199
- } else {
200
- this.$router.push("/");
201
- }
161
+ {
162
+ title: t("Edit my organisation"),
163
+ class: "octopus-dropdown-item",
164
+ path: "/main/priv/edit/organisation",
165
+ condition:
166
+ isAuthenticatedWithOrga.value &&
167
+ (authStore.isRoleOrganisation || 1 < organisationsAvailable.value.length),
202
168
  },
203
- },
169
+ ];
204
170
  });
171
+
172
+
173
+ //Methods
174
+ function goToAdministration() {
175
+ if ("backoffice" !== route.name) {
176
+ router.push("/main/priv/backoffice");
177
+ } else if (window.history.length > 1) {
178
+ router.go(-1);
179
+ } else {
180
+ router.push("/");
181
+ }
182
+ }
205
183
  </script>