@saooti/octopus-sdk 40.2.18 → 41.0.0-SNAPSHOT

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 (204) hide show
  1. package/package.json +38 -39
  2. package/src/App.vue +68 -88
  3. package/src/components/composable/player/usePlayerLive.ts +12 -3
  4. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  5. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  6. package/src/components/composable/useInit.ts +2 -2
  7. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  8. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  9. package/src/components/display/categories/CategoryChooser.vue +142 -145
  10. package/src/components/display/categories/CategoryFilter.vue +172 -198
  11. package/src/components/display/categories/CategoryList.vue +122 -147
  12. package/src/components/display/comments/CommentInput.vue +100 -122
  13. package/src/components/display/comments/CommentList.vue +169 -191
  14. package/src/components/display/comments/CommentName.vue +35 -45
  15. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  16. package/src/components/display/comments/CommentPlayer.vue +38 -50
  17. package/src/components/display/comments/CommentSection.vue +85 -103
  18. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  19. package/src/components/display/comments/item/CommentItem.vue +101 -116
  20. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  21. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  22. package/src/components/display/comments/like/LikeButton.vue +36 -41
  23. package/src/components/display/comments/like/LikeSection.vue +128 -136
  24. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  25. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  26. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  27. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  28. package/src/components/display/edit/EditBox.vue +6 -9
  29. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  30. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  31. package/src/components/display/emission/EmissionItem.vue +56 -69
  32. package/src/components/display/emission/EmissionList.vue +192 -218
  33. package/src/components/display/emission/EmissionPlayerItem.vue +48 -65
  34. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  35. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  36. package/src/components/display/filter/AdvancedSearch.vue +154 -176
  37. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  38. package/src/components/display/filter/DateFilter.vue +76 -91
  39. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  40. package/src/components/display/filter/ProductorSearch.vue +87 -90
  41. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  42. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  43. package/src/components/display/filter/SearchOrder.vue +35 -35
  44. package/src/components/display/list/ListPaginate.vue +80 -93
  45. package/src/components/display/list/PaginateParams.vue +36 -40
  46. package/src/components/display/list/PaginateSection.vue +113 -124
  47. package/src/components/display/list/SwiperList.vue +97 -109
  48. package/src/components/display/live/CountDown.vue +15 -9
  49. package/src/components/display/live/CountdownOctopus.vue +16 -10
  50. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  51. package/src/components/display/live/LiveItem.vue +65 -73
  52. package/src/components/display/live/LiveList.vue +125 -137
  53. package/src/components/display/live/RadioCurrently.vue +66 -73
  54. package/src/components/display/live/RadioImage.vue +40 -51
  55. package/src/components/display/live/RadioItem.vue +9 -14
  56. package/src/components/display/live/RadioList.vue +39 -53
  57. package/src/components/display/live/RadioPlanning.vue +211 -223
  58. package/src/components/display/organisation/OrganisationChooser.vue +117 -123
  59. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  60. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  61. package/src/components/display/participant/ParticipantItem.vue +66 -74
  62. package/src/components/display/participant/ParticipantList.vue +119 -141
  63. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  64. package/src/components/display/playlist/PlaylistList.vue +118 -144
  65. package/src/components/display/playlist/PodcastList.vue +79 -101
  66. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  67. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  68. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  69. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  70. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  71. package/src/components/display/podcasts/PodcastFilterList.vue +48 -53
  72. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  73. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  74. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  75. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  76. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  77. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  78. package/src/components/display/podcasts/PodcastList.vue +183 -206
  79. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  80. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  81. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  82. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  83. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  84. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  85. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  86. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  87. package/src/components/display/podcasts/TagList.vue +49 -51
  88. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  89. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  90. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  91. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  92. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  93. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  94. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  95. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  96. package/src/components/display/sharing/QrCode.vue +55 -67
  97. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  98. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  99. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  100. package/src/components/display/sharing/SharePlayer.vue +273 -295
  101. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  102. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  103. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  104. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  105. package/src/components/display/sharing/SubscribeButtons.vue +185 -209
  106. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  107. package/src/components/form/ClassicCheckbox.vue +26 -30
  108. package/src/components/form/ClassicContentEditable.vue +37 -33
  109. package/src/components/form/ClassicCopyButton.vue +40 -44
  110. package/src/components/form/ClassicDatePicker.vue +114 -114
  111. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  112. package/src/components/form/ClassicInputText.vue +116 -120
  113. package/src/components/form/ClassicLoading.vue +7 -12
  114. package/src/components/form/ClassicMultiselect.vue +106 -116
  115. package/src/components/form/ClassicRadio.vue +21 -16
  116. package/src/components/form/ClassicRadioLabel.vue +23 -22
  117. package/src/components/form/ClassicSearch.vue +24 -19
  118. package/src/components/form/ClassicSelect.vue +47 -38
  119. package/src/components/form/ClassicWysiwyg.vue +116 -123
  120. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  121. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  122. package/src/components/icons/BlueSkyIcon.vue +8 -11
  123. package/src/components/icons/DeezerIcon.vue +8 -11
  124. package/src/components/icons/EditFtpIcon.vue +8 -11
  125. package/src/components/icons/IHeartIcon.vue +8 -11
  126. package/src/components/icons/PlayVideoIcon.vue +7 -10
  127. package/src/components/icons/PlayerFmIcon.vue +7 -10
  128. package/src/components/icons/PocketCastIcon.vue +8 -11
  129. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  130. package/src/components/icons/RadiolineIcon.vue +8 -11
  131. package/src/components/icons/TuninIcon.vue +8 -11
  132. package/src/components/icons/XIcon.vue +7 -10
  133. package/src/components/misc/AcpmImage.vue +6 -7
  134. package/src/components/misc/ClassicAccordion.vue +27 -32
  135. package/src/components/misc/ClassicLazy.vue +86 -90
  136. package/src/components/misc/ClassicNav.vue +16 -20
  137. package/src/components/misc/ClassicPopover.vue +266 -282
  138. package/src/components/misc/ClassicSpinner.vue +5 -27
  139. package/src/components/misc/ErrorMessage.vue +11 -12
  140. package/src/components/misc/FooterGarSection.vue +33 -41
  141. package/src/components/misc/FooterSection.vue +109 -130
  142. package/src/components/misc/HomeDropdown.vue +85 -108
  143. package/src/components/misc/MobileMenu.vue +102 -113
  144. package/src/components/misc/ProgressBar.vue +53 -62
  145. package/src/components/misc/TopBar.vue +97 -120
  146. package/src/components/misc/TopBarMainContent.vue +116 -135
  147. package/src/components/misc/modal/ClassicModal.vue +40 -33
  148. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  149. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  150. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  151. package/src/components/misc/modal/MessageModal.vue +50 -47
  152. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  153. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  154. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  155. package/src/components/misc/player/PlayerCompact.vue +6 -4
  156. package/src/components/misc/player/PlayerComponent.vue +8 -9
  157. package/src/components/misc/player/PlayerLarge.vue +9 -8
  158. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  159. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  160. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  161. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  162. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  163. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  164. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  165. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  166. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  167. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  168. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  169. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  170. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  171. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  172. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  173. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  174. package/src/components/pages/CategoryPage.vue +28 -33
  175. package/src/components/pages/EmissionPage.vue +98 -131
  176. package/src/components/pages/EmissionsPage.vue +2 -0
  177. package/src/components/pages/Error403Page.vue +22 -21
  178. package/src/components/pages/HomePage.vue +91 -100
  179. package/src/components/pages/LivesPage.vue +35 -37
  180. package/src/components/pages/MapPage.vue +209 -241
  181. package/src/components/pages/PageLogout.vue +8 -11
  182. package/src/components/pages/PageNotFound.vue +9 -5
  183. package/src/components/pages/ParticipantPage.vue +83 -111
  184. package/src/components/pages/ParticipantsPage.vue +3 -0
  185. package/src/components/pages/PlaylistPage.vue +98 -116
  186. package/src/components/pages/PlaylistsPage.vue +9 -2
  187. package/src/components/pages/PodcastPage.vue +223 -238
  188. package/src/components/pages/PodcastsPage.vue +9 -2
  189. package/src/components/pages/RadioPage.vue +56 -70
  190. package/src/components/pages/RubriquePage.vue +7 -3
  191. package/src/components/pages/SearchPage.vue +31 -36
  192. package/src/components/pages/TagPage.vue +11 -9
  193. package/src/components/pages/VideoPage.vue +14 -11
  194. package/src/helper/displayHelper.ts +1 -1
  195. package/src/i18n.ts +2 -2
  196. package/src/main.ts +1 -1
  197. package/src/stores/class/general/player.ts +1 -0
  198. package/public/css/fonts/icomoon.eot +0 -0
  199. package/public/css/fonts/icomoon.svg +0 -113
  200. package/public/css/fonts/icomoon.ttf +0 -0
  201. package/public/css/fonts/icomoon.woff +0 -0
  202. package/public/css/fonts/icomoon.woff2 +0 -0
  203. package/public/css/fonts/style.css +0 -352
  204. package/sonarqube-scanner.js +0 -10
@@ -3,7 +3,7 @@
3
3
  <template v-if="loaded && !error && emission">
4
4
  <PodcastmakerHeader
5
5
  v-if="isPodcastmaker"
6
- :page-title="$t('Emission')"
6
+ :page-title="t('Emission')"
7
7
  :img-url="emission.imageUrl"
8
8
  />
9
9
  <div
@@ -21,9 +21,9 @@
21
21
  v-lazy="useProxyImageUrl(emission.imageUrl, '250')"
22
22
  width="250"
23
23
  height="250"
24
- role="presentation"
24
+ aria-hidden="true"
25
25
  alt=""
26
- :title="$t('Emission name image', { name: name })"
26
+ :title="t('Emission name image', { name: name })"
27
27
  class="img-box img-box-podcast mb-3 flex-column justify-content-start align-items-start position-relative flex-shrink-0 float-start me-3"
28
28
  />
29
29
  <div class="d-flex align-items-center justify-content-between">
@@ -42,7 +42,7 @@
42
42
  :just-buttons="true"
43
43
  />
44
44
  <div class="ms-2 fw-bold">
45
- {{ $t("Listen to the latest episode") }}
45
+ {{ t("Listen to the latest episode") }}
46
46
  </div>
47
47
  </div>
48
48
  <SubscribeButtons
@@ -55,7 +55,7 @@
55
55
  </div>
56
56
  </section>
57
57
  <ShareSocialsButtons
58
- v-if="pageParameters.isShareButtons"
58
+ v-if="state.podcastPage.ShareButtons"
59
59
  :organisation-id="emission.orga.id"
60
60
  />
61
61
  <SharePlayer
@@ -80,19 +80,19 @@
80
80
  />
81
81
  </section>
82
82
  <ShareDistribution
83
- v-if="editRight && !isPodcastmaker && securityRight && !isGarRole"
83
+ v-if="editRight && !isPodcastmaker && securityRight && !authStore.isGarRole"
84
84
  :emission-id="emissionId"
85
85
  />
86
86
  </div>
87
87
  </template>
88
88
  <ClassicLoading
89
- :loading-text="!loaded ? $t('Loading content ...') : undefined"
90
- :error-text="error ? $t(`Emission doesn't exist`) : undefined"
89
+ :loading-text="!loaded ? t('Loading content ...') : undefined"
90
+ :error-text="error ? t(`Emission doesn't exist`) : undefined"
91
91
  />
92
92
  </section>
93
93
  </template>
94
94
 
95
- <script lang="ts">
95
+ <script setup lang="ts">
96
96
  import classicApi from "../../api/classicApi";
97
97
  import { state } from "../../stores/ParamSdkStore";
98
98
  import displayHelper from "../../helper/displayHelper";
@@ -102,14 +102,14 @@ import {useSeoTitleUrl} from "../composable/route/useSeoTitleUrl";
102
102
  import {useErrorHandler} from "../composable/useErrorHandler";
103
103
  import { Emission } from "@/stores/class/general/emission";
104
104
  import ClassicLoading from "../form/ClassicLoading.vue";
105
- import { defineComponent, defineAsyncComponent } from "vue";
105
+ import { defineAsyncComponent, ref, Ref, computed, watch, onBeforeUnmount } from "vue";
106
106
  import { AxiosError } from "axios";
107
- import { mapActions, mapState } from "pinia";
108
107
  import { useAuthStore } from "../../stores/AuthStore";
109
108
  import { useGeneralStore } from "../../stores/GeneralStore";
110
109
  import { useFilterStore } from "../../stores/FilterStore";
111
- import { useApiStore } from "../../stores/ApiStore";
112
110
  import { Podcast } from "@/stores/class/general/podcast";
111
+ import { useI18n } from "vue-i18n";
112
+ import { useRoute } from "vue-router";
113
113
  const ShareAnonymous = defineAsyncComponent(() => import("../display/sharing/ShareAnonymous.vue"));
114
114
  const PodcastFilterList = defineAsyncComponent(
115
115
  () => import("../display/podcasts/PodcastFilterList.vue"),
@@ -138,128 +138,95 @@ const PodcastPlayButton = defineAsyncComponent(
138
138
  const PodcastmakerHeader = defineAsyncComponent(
139
139
  () => import("../display/podcastmaker/PodcastmakerHeader.vue"),
140
140
  );
141
- export default defineComponent({
142
- components: {
143
- PodcastFilterList,
144
- SharePlayer,
145
- ShareSocialsButtons,
146
- ShareDistribution,
147
- EditBox,
148
- SubscribeButtons,
149
- LiveHorizontalList,
150
- ClassicLoading,
151
- PodcastPlayButton,
152
- PodcastmakerHeader,
153
- ShareAnonymous
154
- },
155
- props: {
156
- emissionId: { default: undefined, type: Number },
157
- },
158
141
 
159
- setup(){
160
- const { useProxyImageUrl } = useImageProxy();
161
- const { isPodcastmaker, isEditRights, authOrgaId } = useOrgaComputed();
162
- const { updatePathParams } = useSeoTitleUrl();
163
- const {handle403} = useErrorHandler();
164
- return { useProxyImageUrl, isPodcastmaker, isEditRights, authOrgaId, updatePathParams, handle403 }
165
- },
166
142
 
167
- data() {
168
- return {
169
- loaded: false as boolean,
170
- title: "" as string,
171
- emission: undefined as Emission | undefined,
172
- error: false as boolean,
173
- fetchLive: true as boolean,
174
- lastPodcast: undefined as Podcast | undefined,
175
- };
176
- },
143
+ //Props
144
+ const props = defineProps({
145
+ emissionId: { default: undefined, type: Number },
146
+ })
177
147
 
178
- computed: {
179
- ...mapState(useAuthStore, ["isGarRole"]),
180
- ...mapState(useApiStore, ["apiUrl"]),
181
- ...mapState(useFilterStore, ["filterOrgaId"]),
182
- pageParameters() {
183
- return {
184
- isShareButtons: state.podcastPage.ShareButtons as boolean,
185
- };
186
- },
187
- rssUrl(): string {
188
- return `${this.apiUrl}rss/emission/${this.emissionId}`;
189
- },
190
- name(): string {
191
- return this.emission?.name ?? "";
192
- },
193
- description(): string {
194
- return this.emission?.description ?? "";
195
- },
196
- editRight(): boolean {
197
- return this.isEditRights(this.emission?.orga.id);
198
- },
199
- securityRight() {
200
- return (
201
- "PUBLIC" === this.emission?.orga?.privacy ||
202
- ("PRIVATE" === this.emission?.orga?.privacy &&
203
- ![null, undefined, "PRIVATE"].includes(this.emission?.privateRssType))
204
- );
205
- },
206
- },
207
- watch: {
208
- emissionId: {
209
- immediate: true,
210
- handler() {
211
- this.getEmissionDetails();
212
- },
213
- },
214
- },
215
- beforeUnmount() {
216
- this.contentToDisplayUpdate(null);
217
- },
218
148
 
219
- methods: {
220
- ...mapActions(useGeneralStore, ["contentToDisplayUpdate"]),
221
- urlify(text:string|undefined){
222
- return displayHelper.urlify(text);
223
- },
224
- initError(): void {
225
- this.error = true;
226
- this.loaded = true;
227
- },
228
- async getEmissionDetails(): Promise<void> {
229
- this.loaded = false;
230
- this.error = false;
231
- try {
232
- this.emission = await classicApi.fetchData<Emission>({
233
- api: 0,
234
- path: "emission/" + this.emissionId,
235
- });
236
- if (
237
- "PUBLIC" !== this.emission.orga.privacy &&
238
- this.filterOrgaId !== this.emission.orga.id &&
239
- this.$route.query.productor !== this.emission.orga.id
240
- ) {
241
- this.initError();
242
- return;
243
- }
244
- this.contentToDisplayUpdate(this.emission);
245
- this.updatePathParams(this.name);
246
- this.loaded = true;
247
- } catch (error) {
248
- this.handle403(error as AxiosError);
249
- this.initError();
250
- }
251
- },
252
- podcastsFetched(podcasts: Array<Podcast>) {
253
- for (const podcast of podcasts) {
254
- if (
255
- "READY" === podcast.processingStatus &&
256
- podcast.availability.visibility
257
- ) {
258
- this.lastPodcast = podcast;
259
- return;
260
- }
261
- }
262
- },
263
- },
149
+ //Data
150
+ const loaded = ref(false);
151
+ const error = ref(false);
152
+ const emission: Ref<Emission | undefined> = ref(undefined);
153
+ const lastPodcast: Ref<Podcast | undefined> = ref(undefined);
154
+
155
+
156
+ //Composables
157
+ const { t } = useI18n();
158
+ const { useProxyImageUrl } = useImageProxy();
159
+ const { isPodcastmaker, isEditRights, authOrgaId } = useOrgaComputed();
160
+ const { updatePathParams } = useSeoTitleUrl();
161
+ const {handle403} = useErrorHandler();
162
+ const authStore = useAuthStore();
163
+ const filterStore = useFilterStore();
164
+ const generalStore= useGeneralStore();
165
+ const route= useRoute();
166
+
167
+
168
+ //Computed
169
+ const name = computed(() => emission.value?.name ?? "");
170
+ const description = computed(() => emission.value?.description ?? "");
171
+ const editRight = computed(() => isEditRights(emission.value?.orga.id));
172
+ const securityRight = computed(() =>{
173
+ return (
174
+ "PUBLIC" === emission.value?.orga?.privacy ||
175
+ ("PRIVATE" === emission.value?.orga?.privacy &&
176
+ ![null, undefined, "PRIVATE"].includes(emission.value?.privateRssType))
177
+ );
264
178
  });
179
+
180
+
181
+ //Watch
182
+ watch(()=>props.emissionId, () => {getEmissionDetails()}, {immediate: true});
183
+
184
+
185
+ onBeforeUnmount(() => {
186
+ generalStore.contentToDisplayUpdate(null);
187
+ })
188
+
189
+ //Methods
190
+ function urlify(text:string|undefined){
191
+ return displayHelper.urlify(text);
192
+ }
193
+ function initError(): void {
194
+ error.value = true;
195
+ loaded.value = true;
196
+ }
197
+ async function getEmissionDetails(): Promise<void> {
198
+ loaded.value = false;
199
+ error.value = false;
200
+ try {
201
+ emission.value = await classicApi.fetchData<Emission>({
202
+ api: 0,
203
+ path: "emission/" + props.emissionId,
204
+ });
205
+ if (
206
+ "PUBLIC" !== emission.value.orga.privacy &&
207
+ filterStore.filterOrgaId !== emission.value.orga.id &&
208
+ route.query.productor !== emission.value.orga.id
209
+ ) {
210
+ initError();
211
+ return;
212
+ }
213
+ generalStore.contentToDisplayUpdate(emission.value);
214
+ updatePathParams(name.value);
215
+ loaded.value = true;
216
+ } catch (error) {
217
+ handle403(error as AxiosError);
218
+ initError();
219
+ }
220
+ }
221
+ function podcastsFetched(podcasts: Array<Podcast>) {
222
+ for (const podcast of podcasts) {
223
+ if (
224
+ "READY" === podcast.processingStatus &&
225
+ podcast.availability.visibility
226
+ ) {
227
+ lastPodcast.value = podcast;
228
+ return;
229
+ }
230
+ }
231
+ }
265
232
  </script>
@@ -46,6 +46,7 @@ const ProductorSearch = defineAsyncComponent(
46
46
  () => import("../display/filter/ProductorSearch.vue"),
47
47
  );
48
48
 
49
+ //Props
49
50
  const props = defineProps({
50
51
  pr: { default: 0, type: Number },
51
52
  ps: { default: 30, type: Number },
@@ -60,6 +61,7 @@ const props = defineProps({
60
61
  routeRubriques: { default: "", type: String },
61
62
  });
62
63
 
64
+ //Composables
63
65
  const {
64
66
  organisationId,
65
67
  searchPattern,
@@ -7,48 +7,49 @@
7
7
  height="auto"
8
8
  class="logo-octopus"
9
9
  src="/img/logo_saooti_play_black.svg"
10
- role="presentation"
10
+ aria-hidden="true"
11
+ alt=""
11
12
  title="Saooti"
12
- alt=""
13
+
13
14
  />
14
- <h2>{{ $t("You do not have the right to access this page") }}</h2>
15
+ <h2>{{ t("You do not have the right to access this page") }}</h2>
15
16
  </div>
16
17
  <img
17
18
  width="600"
18
19
  height="auto"
19
20
  class="stop-octopus-img"
20
21
  src="/img/403.webp"
21
- role="presentation"
22
+ aria-hidden="true"
22
23
  alt=""
24
+
23
25
  title="403"
24
26
  />
25
27
  </div>
26
28
 
27
- <a v-if="authOrgaId" class="btn btn-primary" href="/logout">
29
+ <a v-if="authStore.authOrgaId" class="btn btn-primary" href="/logout">
28
30
  {{ authText }}
29
31
  </a>
30
32
  <a v-else class="btn btn-primary" :href="pathLogin">{{ authText }}</a>
31
33
  </section>
32
34
  </template>
33
35
 
34
- <script lang="ts">
36
+ <script setup lang="ts">
37
+ import { useI18n } from "vue-i18n";
35
38
  import { useApiStore } from "../../stores/ApiStore";
36
39
  import { useAuthStore } from "../../stores/AuthStore";
37
- import { mapState } from "pinia";
38
- import { defineComponent } from "vue";
39
- export default defineComponent({
40
- name: "Error403Page",
41
- computed: {
42
- ...mapState(useAuthStore, ["authOrgaId"]),
43
- ...mapState(useApiStore, ["frontendUrl"]),
44
- authText(): string {
45
- return this.authOrgaId ? this.$t("Logout") : this.$t("Login");
46
- },
47
- pathLogin(){
48
- return "/sso/login?redirect_url="+encodeURI(this.frontendUrl + this.$route.fullPath);
49
- },
50
- },
51
- });
40
+ import { computed } from "vue";
41
+ import { useRoute } from "vue-router";
42
+
43
+ //Composables
44
+ const { t } = useI18n();
45
+ const authStore= useAuthStore();
46
+ const apiStore= useApiStore();
47
+ const route = useRoute()
48
+
49
+ //Computed
50
+ const authText = computed(() => authStore.authOrgaId ? t("Logout") : t("Login"));
51
+ const pathLogin = computed(() => "/sso/login?redirect_url="+encodeURI(apiStore.frontendUrl + route.fullPath));
52
+
52
53
  </script>
53
54
  <style lang="scss">
54
55
  .octopus-app .not-auth-content {
@@ -11,7 +11,7 @@
11
11
  style="min-height: 650px"
12
12
  :iab-id="c.id"
13
13
  :title="c.name"
14
- :button-text="$t('All podcast button', { name: c.name })"
14
+ :button-text="t('All podcast button', { name: c.name })"
15
15
  />
16
16
  <template #preview>
17
17
  <div style="min-height: 650px"></div>
@@ -30,7 +30,7 @@
30
30
  :rubrique-id="rubriqueId.concat(r.rubriqueId)"
31
31
  :title="r.name"
32
32
  :href="rubriqueMorePath? rubriqueMorePath+r.rubriqueId: undefined"
33
- :button-text="$t('All podcast button', { name: r.name })"
33
+ :button-text="t('All podcast button', { name: r.name })"
34
34
  />
35
35
  <template #preview>
36
36
  <div style="min-height: 650px"></div>
@@ -42,22 +42,22 @@
42
42
  :to="{
43
43
  name: 'podcasts',
44
44
  query: {
45
- iabId: filterIab?.id,
46
- rubriquesId: rubriqueQueryParam,
47
- productor: filterOrgaId
45
+ iabId: filterStore.filterIab?.id,
46
+ rubriquesId: rubriqueQueryParam.value,
47
+ productor: filterStore.filterOrgaId
48
48
  },
49
49
  }"
50
50
  class="btn btn-primary align-self-center w-fit-content mt-5 m-auto"
51
51
  >
52
- {{ $t("See more") }}
52
+ {{ t("See more") }}
53
53
  </router-link>
54
54
  <PodcastInlineList
55
55
  v-else-if="displayWithoutRubriques"
56
56
  :no-rubriquage-id="[rubriqueDisplay[0].rubriquageId]"
57
57
  :rubrique-id="rubriqueId"
58
- :title="$t('Without rubric')"
58
+ :title="t('Without rubric')"
59
59
  :button-text="
60
- $t('All podcast button', { name: $t('Without rubric') })
60
+ t('All podcast button', { name: t('Without rubric') })
61
61
  "
62
62
  />
63
63
  </template>
@@ -65,105 +65,96 @@
65
65
  </section>
66
66
  </template>
67
67
 
68
- <script lang="ts">
68
+ <script setup lang="ts">
69
69
  import { useRubriquesFilterComputed } from "../composable/route/useRubriquesFilterComputed";
70
70
  import PodcastInlineList from "../display/podcasts/PodcastInlineList.vue";
71
71
  import ClassicLazy from "../misc/ClassicLazy.vue";
72
72
  import { state } from "../../stores/ParamSdkStore";
73
- import { Rubriquage } from "@/stores/class/rubrique/rubriquage";
74
73
  import { Rubrique } from "@/stores/class/rubrique/rubrique";
75
74
  import { useFilterStore } from "../../stores/FilterStore";
76
75
  import { useGeneralStore } from "../../stores/GeneralStore";
77
- import { mapState } from "pinia";
78
- import { defineComponent } from "vue";
76
+ import { computed, Ref, ref, watch } from "vue";
79
77
  import { Category } from "@/stores/class/general/category";
80
- export default defineComponent({
81
- name: "HomePage",
82
- components: {
83
- PodcastInlineList,
84
- ClassicLazy,
85
- },
86
- props: {
87
- displayWithoutRubriques: { default: true, type: Boolean },
88
- rubriqueMorePath: { default: undefined, type: String },
89
- },
90
- emits: ["categoriesLength"],
91
- setup(){
92
- const { rubriqueQueryParam } = useRubriquesFilterComputed();
93
- return { rubriqueQueryParam }
94
- },
95
- data() {
96
- return {
97
- rubriqueId: [] as Array<number>,
98
- rubriqueMaxDisplay: 20 as number,
99
- };
100
- },
101
- computed: {
102
- ...mapState(useGeneralStore, ["storedCategories", "storedCategoriesOrga"]),
103
- ...mapState(useFilterStore, [
104
- "filterRubriquage",
105
- "filterOrgaId",
106
- "filterRubrique",
107
- "filterRubriqueDisplay",
108
- "filterIab",
109
- ]),
110
- rubriqueDisplay(): Array<Rubrique> {
111
- return this.filterRubriqueDisplay.filter(
112
- (rubrique: Rubrique) => 0 !== rubrique.podcastCount,
113
- );
114
- },
115
- rubriqueToShow(): Array<Rubrique> {
116
- if (
117
- !this.rubriqueDisplay ||
118
- this.rubriqueDisplay.length < this.rubriqueMaxDisplay
119
- ) {
120
- return this.rubriqueDisplay ?? [];
121
- }
122
- return this.rubriqueDisplay.slice(0, this.rubriqueMaxDisplay);
123
- },
124
- rubriquageFilter(): Array<Rubriquage> {
125
- return this.filterOrgaId ? this.filterRubriquage : [];
126
- },
127
- categories(): Array<Category> {
128
- let arrayCategories: Array<Category> = [];
129
- if (this.filterIab) {
130
- return [this.filterIab];
131
- }
132
- if (this.filterOrgaId) {
133
- arrayCategories = this.storedCategoriesOrga.filter((c: Category) => {
134
- return c.podcastOrganisationCount;
135
- });
136
- } else {
137
- arrayCategories = this.storedCategories.filter((c: Category) => {
138
- if (state.generalParameters.podcastmaker)
139
- return c.podcastOrganisationCount;
140
- return c.podcastCount;
141
- });
142
- }
143
- this.$emit("categoriesLength", arrayCategories.length);
144
- return arrayCategories;
145
- },
146
- },
147
- watch: {
148
- filterRubrique: {
149
- deep: true,
150
- immediate: true,
151
- handler() {
152
- this.updateRubriquageFilter();
153
- },
154
- },
155
- },
156
- methods: {
157
- updateRubriquageFilter() {
158
- const length = this.filterRubrique.length;
159
- const rubriqueId: Array<number> = [];
160
- for (let index = 0; index < length; index++) {
161
- if (0 < this.filterRubrique[index].rubriqueId) {
162
- rubriqueId.push(this.filterRubrique[index].rubriqueId);
163
- }
164
- }
165
- this.rubriqueId = rubriqueId;
166
- },
167
- },
78
+ import { useI18n } from "vue-i18n";
79
+
80
+ //Props
81
+ defineProps({
82
+ displayWithoutRubriques: { default: true, type: Boolean },
83
+ rubriqueMorePath: { default: undefined, type: String },
84
+ })
85
+
86
+ //Data
87
+ const rubriqueId: Ref<Array<number>> = ref([]);
88
+ const rubriqueMaxDisplay = ref(20);
89
+
90
+
91
+ //Emits
92
+ const emit = defineEmits(["categoriesLength"]);
93
+
94
+
95
+ //Composables
96
+ const { t } = useI18n();
97
+ const { rubriqueQueryParam } = useRubriquesFilterComputed();
98
+ const generalStore = useGeneralStore();
99
+ const filterStore = useFilterStore();
100
+
101
+
102
+
103
+ //Computed
104
+ const rubriqueDisplay = computed(() => {
105
+ return filterStore.filterRubriqueDisplay.filter(
106
+ (rubrique: Rubrique) => 0 !== rubrique.podcastCount,
107
+ );
168
108
  });
109
+ const rubriqueToShow = computed(() => {
110
+ if (
111
+ !rubriqueDisplay.value ||
112
+ rubriqueDisplay.value.length < rubriqueMaxDisplay.value
113
+ ) {
114
+ return rubriqueDisplay.value ?? [];
115
+ }
116
+ return rubriqueDisplay.value.slice(0, rubriqueMaxDisplay.value);
117
+ });
118
+ const rubriquageFilter = computed(() => {
119
+ return filterStore.filterOrgaId ? filterStore.filterRubriquage : [];
120
+ });
121
+ const categories = computed(() => {
122
+ let arrayCategories: Array<Category> = [];
123
+ if (filterStore.filterIab) {
124
+ return [filterStore.filterIab];
125
+ }
126
+ if (filterStore.filterOrgaId) {
127
+ arrayCategories = generalStore.storedCategoriesOrga.filter((c: Category) => {
128
+ return c.podcastOrganisationCount;
129
+ });
130
+ } else {
131
+ arrayCategories = generalStore.storedCategories.filter((c: Category) => {
132
+ if (state.generalParameters.podcastmaker)
133
+ return c.podcastOrganisationCount;
134
+ return c.podcastCount;
135
+ });
136
+ }
137
+ emit("categoriesLength", arrayCategories.length);
138
+ return arrayCategories;
139
+ });
140
+
141
+
142
+ //Watch
143
+ watch(()=>filterStore.filterRubrique, () => {
144
+ updateRubriquageFilter();
145
+ }, {deep: true, immediate: true});
146
+
147
+
148
+ //Methods
149
+ function updateRubriquageFilter() {
150
+ const length = filterStore.filterRubrique.length;
151
+ const rubriquesId: Array<number> = [];
152
+ for (let index = 0; index < length; index++) {
153
+ if (0 < filterStore.filterRubrique[index].rubriqueId) {
154
+ rubriquesId.push(filterStore.filterRubrique[index].rubriqueId);
155
+ }
156
+ }
157
+ rubriqueId.value = rubriquesId;
158
+ }
159
+
169
160
  </script>