@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
@@ -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"
25
-
26
- :title="$t('Emission name image', { name: name })"
24
+ aria-hidden="true"
25
+ alt=""
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
@@ -70,29 +70,34 @@
70
70
  :emission-id="emissionId"
71
71
  />
72
72
  <PodcastFilterList
73
+ v-if="isInit"
74
+ v-model:query="searchPattern"
73
75
  class="mx-2"
76
+ :first="paginateFirst"
77
+ :size="ps"
74
78
  :show-count="true"
75
79
  :emission-id="emissionId"
76
80
  :category-filter="false"
77
81
  :edit-right="editRight"
78
82
  :productor-id="[emission.orga.id]"
83
+ :force-update-parameters="true"
79
84
  @fetch="podcastsFetched"
80
85
  />
81
86
  </section>
82
87
  <ShareDistribution
83
- v-if="editRight && !isPodcastmaker && securityRight && !isGarRole"
88
+ v-if="editRight && !isPodcastmaker && securityRight && !authStore.isGarRole"
84
89
  :emission-id="emissionId"
85
90
  />
86
91
  </div>
87
92
  </template>
88
93
  <ClassicLoading
89
- :loading-text="!loaded ? $t('Loading content ...') : undefined"
90
- :error-text="error ? $t(`Emission doesn't exist`) : undefined"
94
+ :loading-text="!loaded ? t('Loading content ...') : undefined"
95
+ :error-text="error ? t(`Emission doesn't exist`) : undefined"
91
96
  />
92
97
  </section>
93
98
  </template>
94
99
 
95
- <script lang="ts">
100
+ <script setup lang="ts">
96
101
  import classicApi from "../../api/classicApi";
97
102
  import { state } from "../../stores/ParamSdkStore";
98
103
  import displayHelper from "../../helper/displayHelper";
@@ -102,14 +107,15 @@ import {useSeoTitleUrl} from "../composable/route/useSeoTitleUrl";
102
107
  import {useErrorHandler} from "../composable/useErrorHandler";
103
108
  import { Emission } from "@/stores/class/general/emission";
104
109
  import ClassicLoading from "../form/ClassicLoading.vue";
105
- import { defineComponent, defineAsyncComponent } from "vue";
110
+ import { defineAsyncComponent, ref, Ref, computed, watch, onBeforeUnmount } from "vue";
106
111
  import { AxiosError } from "axios";
107
- import { mapActions, mapState } from "pinia";
108
112
  import { useAuthStore } from "../../stores/AuthStore";
109
113
  import { useGeneralStore } from "../../stores/GeneralStore";
110
114
  import { useFilterStore } from "../../stores/FilterStore";
111
- import { useApiStore } from "../../stores/ApiStore";
112
115
  import { Podcast } from "@/stores/class/general/podcast";
116
+ import { useI18n } from "vue-i18n";
117
+ import { useRoute } from "vue-router";
118
+ import { useSimplePageParam } from "../composable/route/useSimplePageParam";
113
119
  const ShareAnonymous = defineAsyncComponent(() => import("../display/sharing/ShareAnonymous.vue"));
114
120
  const PodcastFilterList = defineAsyncComponent(
115
121
  () => import("../display/podcasts/PodcastFilterList.vue"),
@@ -138,128 +144,103 @@ const PodcastPlayButton = defineAsyncComponent(
138
144
  const PodcastmakerHeader = defineAsyncComponent(
139
145
  () => import("../display/podcastmaker/PodcastmakerHeader.vue"),
140
146
  );
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
147
 
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
148
 
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
- },
149
+ //Props
150
+ const props = defineProps({
151
+ emissionId: { default: undefined, type: Number },
152
+ pr: { default: 0, type: Number },
153
+ ps: { default: 30, type: Number },
154
+ routeQuery: { default: "", type: String },
155
+ })
177
156
 
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
157
 
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
- },
158
+ //Data
159
+ const loaded = ref(false);
160
+ const error = ref(false);
161
+ const emission: Ref<Emission | undefined> = ref(undefined);
162
+ const lastPodcast: Ref<Podcast | undefined> = ref(undefined);
163
+
164
+
165
+ //Composables
166
+ const { t } = useI18n();
167
+ const { useProxyImageUrl } = useImageProxy();
168
+ const { isPodcastmaker, isEditRights, authOrgaId } = useOrgaComputed();
169
+ const { updatePathParams } = useSeoTitleUrl();
170
+ const {handle403} = useErrorHandler();
171
+ const authStore = useAuthStore();
172
+ const filterStore = useFilterStore();
173
+ const generalStore= useGeneralStore();
174
+ const route= useRoute();
175
+ const {
176
+ searchPattern,
177
+ paginateFirst,
178
+ isInit
179
+ } = useSimplePageParam(props, true);
180
+
181
+
182
+ //Computed
183
+ const name = computed(() => emission.value?.name ?? "");
184
+ const description = computed(() => emission.value?.description ?? "");
185
+ const editRight = computed(() => isEditRights(emission.value?.orga.id));
186
+ const securityRight = computed(() =>{
187
+ return (
188
+ "PUBLIC" === emission.value?.orga?.privacy ||
189
+ ("PRIVATE" === emission.value?.orga?.privacy &&
190
+ ![null, undefined, "PRIVATE"].includes(emission.value?.privateRssType))
191
+ );
264
192
  });
193
+
194
+
195
+ //Watch
196
+ watch(()=>props.emissionId, () => {getEmissionDetails()}, {immediate: true});
197
+
198
+
199
+ onBeforeUnmount(() => {
200
+ generalStore.contentToDisplayUpdate(null);
201
+ })
202
+
203
+ //Methods
204
+ function urlify(text:string|undefined){
205
+ return displayHelper.urlify(text);
206
+ }
207
+ function initError(): void {
208
+ error.value = true;
209
+ loaded.value = true;
210
+ }
211
+ async function getEmissionDetails(): Promise<void> {
212
+ loaded.value = false;
213
+ error.value = false;
214
+ try {
215
+ emission.value = await classicApi.fetchData<Emission>({
216
+ api: 0,
217
+ path: "emission/" + props.emissionId,
218
+ });
219
+ if (
220
+ "PUBLIC" !== emission.value.orga.privacy &&
221
+ filterStore.filterOrgaId !== emission.value.orga.id &&
222
+ route.query.productor !== emission.value.orga.id
223
+ ) {
224
+ initError();
225
+ return;
226
+ }
227
+ generalStore.contentToDisplayUpdate(emission.value);
228
+ updatePathParams(name.value);
229
+ loaded.value = true;
230
+ } catch (error) {
231
+ handle403(error as AxiosError);
232
+ initError();
233
+ }
234
+ }
235
+ function podcastsFetched(podcasts: Array<Podcast>) {
236
+ for (const podcast of podcasts) {
237
+ if (
238
+ "READY" === podcast.processingStatus &&
239
+ podcast.availability.visibility
240
+ ) {
241
+ lastPodcast.value = podcast;
242
+ return;
243
+ }
244
+ }
245
+ }
265
246
  </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
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"
23
+ alt=""
22
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>