@saooti/octopus-sdk 37.0.6 → 37.0.8

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 (236) hide show
  1. package/README.md +2 -2
  2. package/index.ts +22 -22
  3. package/package.json +26 -22
  4. package/src/App.vue +69 -60
  5. package/src/api/classicCrud.ts +12 -12
  6. package/src/api/initialize.ts +1 -1
  7. package/src/assets/transition.scss +34 -22
  8. package/src/components/display/aggregator/RssSection.vue +3 -3
  9. package/src/components/display/categories/CategoryChooser.vue +73 -60
  10. package/src/components/display/categories/CategoryFilter.vue +134 -90
  11. package/src/components/display/categories/CategoryList.vue +76 -62
  12. package/src/components/display/comments/AddCommentModal.vue +44 -44
  13. package/src/components/display/comments/CommentBasicView.vue +38 -30
  14. package/src/components/display/comments/CommentInput.vue +121 -106
  15. package/src/components/display/comments/CommentItem.vue +144 -102
  16. package/src/components/display/comments/CommentList.vue +117 -85
  17. package/src/components/display/comments/CommentParentInfo.vue +18 -15
  18. package/src/components/display/comments/CommentPlayer.vue +39 -41
  19. package/src/components/display/comments/CommentSection.vue +68 -53
  20. package/src/components/display/edit/EditBox.vue +7 -7
  21. package/src/components/display/edit/EditBoxRadio.vue +3 -4
  22. package/src/components/display/edit/EditCommentBox.vue +34 -36
  23. package/src/components/display/emission/EmissionInlineList.vue +75 -63
  24. package/src/components/display/emission/EmissionItem.vue +47 -35
  25. package/src/components/display/emission/EmissionList.vue +118 -83
  26. package/src/components/display/emission/EmissionPlayerItem.vue +89 -89
  27. package/src/components/display/filter/AdvancedSearch.vue +81 -73
  28. package/src/components/display/filter/CategorySearchFilter.vue +27 -25
  29. package/src/components/display/filter/DateFilter.vue +38 -38
  30. package/src/components/display/filter/MonetizableFilter.vue +16 -14
  31. package/src/components/display/filter/ProductorSearch.vue +55 -47
  32. package/src/components/display/filter/RubriqueChoice.vue +42 -27
  33. package/src/components/display/filter/RubriqueFilter.vue +130 -85
  34. package/src/components/display/filter/SearchOrder.vue +16 -11
  35. package/src/components/display/list/ListPaginate.vue +72 -70
  36. package/src/components/display/list/PaginateParams.vue +29 -30
  37. package/src/components/display/list/PaginateSection.vue +210 -0
  38. package/src/components/display/list/SwiperList.vue +28 -32
  39. package/src/components/display/live/CountDown.vue +12 -14
  40. package/src/components/display/live/LiveHorizontalList.vue +60 -50
  41. package/src/components/display/live/LiveItem.vue +42 -26
  42. package/src/components/display/live/LiveList.vue +92 -65
  43. package/src/components/display/live/RadioCurrently.vue +47 -42
  44. package/src/components/display/live/RadioImage.vue +40 -42
  45. package/src/components/display/live/RadioItem.vue +15 -22
  46. package/src/components/display/live/RadioList.vue +24 -21
  47. package/src/components/display/live/RadioPlanning.vue +105 -68
  48. package/src/components/display/organisation/OrganisationChooser.vue +58 -42
  49. package/src/components/display/organisation/OrganisationChooserLight.vue +27 -19
  50. package/src/components/display/participant/ParticipantItem.vue +89 -77
  51. package/src/components/display/participant/ParticipantList.vue +90 -60
  52. package/src/components/display/playlist/PlaylistItem.vue +32 -35
  53. package/src/components/display/playlist/PlaylistList.vue +70 -52
  54. package/src/components/display/playlist/PodcastList.vue +61 -50
  55. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +47 -38
  56. package/src/components/display/podcasts/AnimatorsItem.vue +17 -15
  57. package/src/components/display/podcasts/ParticipantDescription.vue +21 -22
  58. package/src/components/display/podcasts/PodcastFilterList.vue +28 -26
  59. package/src/components/display/podcasts/PodcastImage.vue +129 -131
  60. package/src/components/display/podcasts/PodcastInlineList.vue +33 -29
  61. package/src/components/display/podcasts/PodcastInlineListClassic.vue +91 -71
  62. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +94 -85
  63. package/src/components/display/podcasts/PodcastItem.vue +96 -90
  64. package/src/components/display/podcasts/PodcastItemInfo.vue +61 -65
  65. package/src/components/display/podcasts/PodcastList.vue +115 -84
  66. package/src/components/display/podcasts/PodcastModuleBox.vue +95 -104
  67. package/src/components/display/podcasts/PodcastPlayBar.vue +45 -32
  68. package/src/components/display/podcasts/PodcastSwiperList.vue +65 -55
  69. package/src/components/display/podcasts/TagList.vue +33 -37
  70. package/src/components/display/rubriques/RubriqueChooser.vue +70 -51
  71. package/src/components/display/rubriques/RubriqueList.vue +117 -89
  72. package/src/components/display/sharing/PlayerParameters.vue +45 -42
  73. package/src/components/display/sharing/QrCode.vue +52 -46
  74. package/src/components/display/sharing/ShareButtons.vue +18 -18
  75. package/src/components/display/sharing/ShareButtonsIntern.vue +100 -78
  76. package/src/components/display/sharing/ShareDistribution.vue +101 -67
  77. package/src/components/display/sharing/SharePlayer.vue +207 -127
  78. package/src/components/display/sharing/SharePlayerColors.vue +15 -15
  79. package/src/components/display/sharing/SharePlayerRadio.vue +62 -39
  80. package/src/components/display/sharing/SharePlayerTypes.vue +93 -55
  81. package/src/components/display/sharing/SubscribeButtons.vue +83 -32
  82. package/src/components/display/studio/RecordingItemButton.vue +3 -3
  83. package/src/components/form/ClassicCheckbox.vue +32 -31
  84. package/src/components/form/ClassicDatePicker.vue +47 -49
  85. package/src/components/form/ClassicInputText.vue +99 -98
  86. package/src/components/form/ClassicLoading.vue +11 -14
  87. package/src/components/form/ClassicMultiselect.vue +125 -126
  88. package/src/components/form/ClassicRadio.vue +15 -18
  89. package/src/components/form/ClassicSearch.vue +17 -23
  90. package/src/components/form/ClassicSelect.vue +35 -27
  91. package/src/components/form/{Wysiwyg.vue → ClassicWysiwyg.vue} +103 -118
  92. package/src/components/misc/AcpmImage.vue +6 -6
  93. package/src/components/misc/ClassicAccordion.vue +73 -0
  94. package/src/components/misc/ClassicNav.vue +117 -0
  95. package/src/components/misc/ClassicPopover.vue +212 -0
  96. package/src/components/misc/{Spinner.vue → ClassicSpinner.vue} +14 -15
  97. package/src/components/misc/ErrorMessage.vue +9 -17
  98. package/src/components/misc/FooterSection.vue +198 -0
  99. package/src/components/misc/HomeDropdown.vue +60 -60
  100. package/src/components/misc/LeftMenu.vue +115 -79
  101. package/src/components/misc/ProgressBar.vue +36 -32
  102. package/src/components/misc/SnackBar.vue +169 -0
  103. package/src/components/misc/TopBar.vue +162 -116
  104. package/src/components/misc/modal/ClassicModal.vue +99 -103
  105. package/src/components/misc/modal/ClipboardModal.vue +21 -23
  106. package/src/components/misc/modal/MessageModal.vue +22 -28
  107. package/src/components/misc/modal/NewsletterModal.vue +139 -113
  108. package/src/components/misc/modal/QrCodeModal.vue +14 -17
  109. package/src/components/misc/modal/ShareModalPlayer.vue +44 -60
  110. package/src/components/misc/player/PlayerCompact.vue +47 -62
  111. package/src/components/misc/player/{Player.vue → PlayerComponent.vue} +54 -46
  112. package/src/components/misc/player/PlayerLarge.vue +62 -61
  113. package/src/components/misc/player/PlayerProgressBar.vue +40 -30
  114. package/src/components/misc/player/PlayerTimeline.vue +32 -36
  115. package/src/components/misc/player/radio/RadioHistory.vue +62 -59
  116. package/src/components/misc/player/radio/RadioProgressBar.vue +44 -35
  117. package/src/components/mixins/cookies.ts +11 -10
  118. package/src/components/mixins/displayMethods.ts +5 -4
  119. package/src/components/mixins/handle403.ts +9 -9
  120. package/src/components/mixins/imageProxy.ts +14 -7
  121. package/src/components/mixins/init.ts +31 -16
  122. package/src/components/mixins/orgaComputed.ts +7 -7
  123. package/src/components/mixins/organisationFilter.ts +36 -22
  124. package/src/components/mixins/player/playerComment.ts +46 -37
  125. package/src/components/mixins/player/playerDisplay.ts +122 -87
  126. package/src/components/mixins/player/playerLive.ts +65 -43
  127. package/src/components/mixins/player/playerLogic.ts +133 -88
  128. package/src/components/mixins/player/playerTranscript.ts +48 -30
  129. package/src/components/mixins/radio/fetchRadioData.ts +40 -23
  130. package/src/components/mixins/selenium.ts +2 -2
  131. package/src/components/mixins/tagOfMixins.ts +11 -11
  132. package/src/components/pages/CategoryPage.vue +43 -0
  133. package/src/components/pages/{Emission.vue → EmissionPage.vue} +98 -67
  134. package/src/components/pages/{Emissions.vue → EmissionsPage.vue} +51 -44
  135. package/src/components/pages/Error403Page.vue +20 -19
  136. package/src/components/pages/HomePage.vue +144 -0
  137. package/src/components/pages/LivesPage.vue +66 -0
  138. package/src/components/pages/PageNotFound.vue +33 -22
  139. package/src/components/pages/{Participant.vue → ParticipantPage.vue} +63 -49
  140. package/src/components/pages/{Participants.vue → ParticipantsPage.vue} +9 -9
  141. package/src/components/pages/PlaylistPage.vue +175 -0
  142. package/src/components/pages/{Playlists.vue → PlaylistsPage.vue} +16 -14
  143. package/src/components/pages/PodcastPage.vue +365 -0
  144. package/src/components/pages/PodcastsPage.vue +152 -0
  145. package/src/components/pages/RadioPage.vue +131 -0
  146. package/src/components/pages/RubriquePage.vue +45 -0
  147. package/src/components/pages/{Search.vue → SearchPage.vue} +19 -19
  148. package/src/helper/dom.ts +1 -1
  149. package/src/helper/duration.ts +10 -4
  150. package/src/helper/useEventListener.ts +7 -8
  151. package/src/i18n.ts +31 -30
  152. package/src/locale/de.ts +272 -257
  153. package/src/locale/educationen.ts +13 -13
  154. package/src/locale/educationfr.ts +1 -1
  155. package/src/locale/en.ts +332 -324
  156. package/src/locale/es.ts +334 -318
  157. package/src/locale/fr.ts +339 -324
  158. package/src/locale/it.ts +341 -328
  159. package/src/locale/messages.ts +9 -9
  160. package/src/locale/sl.ts +324 -319
  161. package/src/main.ts +28 -31
  162. package/src/router/router.ts +218 -198
  163. package/src/shims-tsx.d.ts +1 -1
  164. package/src/shims-vue.d.ts +1 -1
  165. package/src/stores/ApiStore.ts +44 -44
  166. package/src/stores/AuthStore.ts +21 -15
  167. package/src/stores/CommentStore.ts +13 -11
  168. package/src/stores/FilterStore.ts +25 -15
  169. package/src/stores/GeneralStore.ts +15 -15
  170. package/src/stores/ParamSdkStore.ts +179 -137
  171. package/src/stores/PlayerStore.ts +139 -125
  172. package/src/stores/class/adserver/adserverConfig.ts +1 -1
  173. package/src/stores/class/adserver/adserverOtherEmission.ts +9 -9
  174. package/src/stores/class/cartouchier/cartouche.ts +4 -4
  175. package/src/stores/class/cartouchier/cartouchier.ts +2 -2
  176. package/src/stores/class/conference/conference.ts +10 -9
  177. package/src/stores/class/conference/conferenceMessage.ts +2 -2
  178. package/src/stores/class/conference/conferenceParticipant.ts +1 -1
  179. package/src/stores/class/conference/studioCall.ts +6 -6
  180. package/src/stores/class/contract/contractOrganisation.ts +5 -5
  181. package/src/stores/class/ftp/ftpEmission.ts +9 -9
  182. package/src/stores/class/ftp/testFtpEmission.ts +4 -4
  183. package/src/stores/class/general/audioView.ts +19 -19
  184. package/src/stores/class/general/category.ts +1 -1
  185. package/src/stores/class/general/classicSelectType.ts +2 -3
  186. package/src/stores/class/general/customPlayer.ts +8 -8
  187. package/src/stores/class/general/emission.ts +20 -20
  188. package/src/stores/class/general/fetchParam.ts +8 -2
  189. package/src/stores/class/general/initState.ts +31 -31
  190. package/src/stores/class/general/interfacePageable.ts +13 -13
  191. package/src/stores/class/general/ituneCategory.ts +4 -4
  192. package/src/stores/class/general/listReturn.ts +12 -12
  193. package/src/stores/class/general/media.ts +7 -7
  194. package/src/stores/class/general/organisation.ts +9 -9
  195. package/src/stores/class/general/pageable.ts +10 -10
  196. package/src/stores/class/general/participant.ts +7 -7
  197. package/src/stores/class/general/player.ts +30 -28
  198. package/src/stores/class/general/playlist.ts +17 -19
  199. package/src/stores/class/general/podcast.ts +19 -19
  200. package/src/stores/class/general/sortPageable.ts +4 -4
  201. package/src/stores/class/general/soundcastCategory.ts +7 -7
  202. package/src/stores/class/ouestFrance/ofTag.ts +34 -34
  203. package/src/stores/class/ouestFrance/ofTagInfo.ts +9 -9
  204. package/src/stores/class/ouestFrance/ofTagPage.ts +7 -7
  205. package/src/stores/class/ouestFrance/ofTagSeo.ts +7 -7
  206. package/src/stores/class/ouestFrance/ofTagVente.ts +6 -6
  207. package/src/stores/class/ouestFrance/ofTagWithParents.ts +20 -20
  208. package/src/stores/class/radio/canal.ts +4 -4
  209. package/src/stores/class/radio/live.ts +6 -6
  210. package/src/stores/class/radio/mix.ts +16 -16
  211. package/src/stores/class/radio/playlistMedia.ts +7 -7
  212. package/src/stores/class/radio/recurrence.ts +54 -54
  213. package/src/stores/class/rss/rssEmission.ts +13 -13
  214. package/src/stores/class/rss/rssInfo.ts +7 -7
  215. package/src/stores/class/rubrique/rubriquage.ts +2 -2
  216. package/src/stores/class/rubrique/rubrique.ts +1 -1
  217. package/src/stores/class/stat/statArrayIncome.ts +5 -5
  218. package/src/stores/class/stat/statArrayObject.ts +26 -26
  219. package/src/stores/class/stat/statGraph.ts +6 -6
  220. package/src/stores/class/user/person.ts +4 -2
  221. package/src/stores/class/user/profile.ts +4 -2
  222. package/src/stores/class/user/userKeycloak.ts +4 -5
  223. package/src/components/display/list/Paginate.vue +0 -181
  224. package/src/components/misc/Accordion.vue +0 -78
  225. package/src/components/misc/Footer.vue +0 -169
  226. package/src/components/misc/Nav.vue +0 -119
  227. package/src/components/misc/Popover.vue +0 -193
  228. package/src/components/misc/Snackbar.vue +0 -168
  229. package/src/components/pages/Category.vue +0 -41
  230. package/src/components/pages/Home.vue +0 -125
  231. package/src/components/pages/Lives.vue +0 -64
  232. package/src/components/pages/Playlist.vue +0 -164
  233. package/src/components/pages/Podcast.vue +0 -307
  234. package/src/components/pages/Podcasts.vue +0 -146
  235. package/src/components/pages/Radio.vue +0 -122
  236. package/src/components/pages/Rubrique.vue +0 -42
@@ -0,0 +1,365 @@
1
+ <template>
2
+ <div class="page-box">
3
+ <template v-if="loaded && !error">
4
+ <div class="page-element-title-container">
5
+ <div class="page-element-title">
6
+ <h1>{{ titlePage }}</h1>
7
+ <Countdown v-if="isCounter" :time-remaining="timeRemaining" />
8
+ </div>
9
+ <div class="page-element-bg" :style="backgroundDisplay" />
10
+ </div>
11
+ <div class="d-flex flex-column page-element">
12
+ <PodcastModuleBox
13
+ :playing-podcast="playingPodcast"
14
+ :podcast="podcast"
15
+ :fetch-conference="fetchConference"
16
+ @update-podcast="updatePodcast"
17
+ />
18
+ <SharePlayer
19
+ v-if="pageParameters.isSharePlayer && (authenticated || notExclusive)"
20
+ :podcast="podcast"
21
+ :emission="podcast.emission"
22
+ :exclusive="exclusive"
23
+ :not-exclusive="notExclusive"
24
+ :organisation-id="myOrganisationId"
25
+ :is-education="isEducation"
26
+ />
27
+ <ShareButtons v-if="pageParameters.isShareButtons" :podcast="podcast" />
28
+ <SubscribeButtons
29
+ v-if="pageParameters.isShareButtons && countLink >= 1"
30
+ :emission="podcast.emission"
31
+ />
32
+ <CommentSection
33
+ v-if="!isPodcastmaker"
34
+ ref="commentSection"
35
+ :podcast="podcast"
36
+ :fetch-conference="fetchConference"
37
+ />
38
+ <PodcastInlineList
39
+ class="mt-4"
40
+ :emission-id="podcast.emission.emissionId"
41
+ :href="'/main/pub/emission/' + podcast.emission.emissionId"
42
+ :title="$t('More episodes of this emission')"
43
+ :button-text="$t('All podcast emission button')"
44
+ />
45
+ <PodcastInlineList
46
+ :podcast-id="podcastId"
47
+ :title="$t('Suggested listening')"
48
+ />
49
+ <PodcastInlineList
50
+ v-for="c in categories"
51
+ :key="c.id"
52
+ :iab-id="c.id"
53
+ :href="'/main/pub/category/' + c.id"
54
+ :title="$t('More episodes of this category : ', { name: c.name })"
55
+ :button-text="$t('All podcast button', { name: c.name })"
56
+ />
57
+ </div>
58
+ </template>
59
+ <ClassicLoading
60
+ :loading-text="!loaded ? $t('Loading content ...') : undefined"
61
+ :error-text="
62
+ error
63
+ ? $t(`This episode is not available for (re)listening`)
64
+ : undefined
65
+ "
66
+ />
67
+ </div>
68
+ </template>
69
+
70
+ <script lang="ts">
71
+ import { orgaComputed } from "../mixins/orgaComputed";
72
+ import PodcastInlineList from "../display/podcasts/PodcastInlineList.vue";
73
+ import PodcastModuleBox from "../display/podcasts/PodcastModuleBox.vue";
74
+ import ClassicLoading from "../form/ClassicLoading.vue";
75
+ import octopusApi from "@saooti/octopus-api";
76
+ import crudApi from "@/api/classicCrud";
77
+ import { state } from "../../stores/ParamSdkStore";
78
+ import dayjs from "dayjs";
79
+ import { Podcast } from "@/stores/class/general/podcast";
80
+ import { Conference } from "@/stores/class/conference/conference";
81
+ import { handle403 } from "../mixins/handle403";
82
+ import { defineComponent, defineAsyncComponent } from "vue";
83
+ import { CommentPodcast } from "@/stores/class/general/comment";
84
+ import { Category } from "@/stores/class/general/category";
85
+ import { useGeneralStore } from "@/stores/GeneralStore";
86
+ import { mapState } from "pinia";
87
+ import { AxiosError } from "axios";
88
+ const ShareButtons = defineAsyncComponent(
89
+ () => import("../display/sharing/ShareButtons.vue"),
90
+ );
91
+ const SharePlayer = defineAsyncComponent(
92
+ () => import("../display/sharing/SharePlayer.vue"),
93
+ );
94
+ const SubscribeButtons = defineAsyncComponent(
95
+ () => import("../display/sharing/SubscribeButtons.vue"),
96
+ );
97
+ const Countdown = defineAsyncComponent(
98
+ () => import("../display/live/CountDown.vue"),
99
+ );
100
+ const CommentSection = defineAsyncComponent(
101
+ () => import("../display/comments/CommentSection.vue"),
102
+ );
103
+ export default defineComponent({
104
+ name: "PodcastPage",
105
+ components: {
106
+ PodcastInlineList,
107
+ ShareButtons,
108
+ SharePlayer,
109
+ SubscribeButtons,
110
+ Countdown,
111
+ CommentSection,
112
+ PodcastModuleBox,
113
+ ClassicLoading,
114
+ },
115
+
116
+ mixins: [handle403, orgaComputed],
117
+
118
+ props: {
119
+ updateStatus: { default: undefined, type: String },
120
+ playingPodcast: { default: undefined, type: Object as () => Podcast },
121
+ podcastId: { default: 0, type: Number },
122
+ isEducation: { default: false, type: Boolean },
123
+ },
124
+
125
+ emits: ["initConferenceId", "podcastTitle"],
126
+
127
+ data() {
128
+ return {
129
+ loaded: false as boolean,
130
+ podcast: undefined as Podcast | undefined,
131
+ error: false as boolean,
132
+ exclusive: false as boolean,
133
+ notExclusive: false as boolean,
134
+ fetchConference: undefined as Conference | undefined,
135
+ };
136
+ },
137
+
138
+ computed: {
139
+ ...mapState(useGeneralStore, ["storedCategories"]),
140
+ backgroundDisplay(): string {
141
+ if (!this.podcast) {
142
+ return "";
143
+ }
144
+ return `background-image: url('${this.podcast.imageUrl}');`;
145
+ },
146
+ isPodcastmaker(): boolean {
147
+ return state.generalParameters.podcastmaker as boolean;
148
+ },
149
+ pageParameters() {
150
+ return {
151
+ isShareButtons: state.podcastPage.ShareButtons as boolean,
152
+ isSharePlayer: state.podcastPage.SharePlayer as boolean,
153
+ };
154
+ },
155
+ emissionMainCategory(): number {
156
+ if (!this.podcast) {
157
+ return 0;
158
+ }
159
+ if (this.podcast.emission.annotations?.mainIabId) {
160
+ return parseInt(
161
+ this.podcast.emission.annotations.mainIabId as string,
162
+ 10,
163
+ );
164
+ } else if (this.podcast.emission.iabIds?.length) {
165
+ return this.podcast.emission.iabIds[0];
166
+ }
167
+ return 0;
168
+ },
169
+ categories(): Array<Category> {
170
+ if ("undefined" === typeof this.podcast) return [];
171
+ return this.storedCategories
172
+ .filter((item: Category) => {
173
+ return (
174
+ this.podcast?.emission.iabIds &&
175
+ -1 !== this.podcast.emission.iabIds.indexOf(item.id)
176
+ );
177
+ })
178
+ .sort((a: Category, b: Category) => {
179
+ if (a.id === this.emissionMainCategory) return -1;
180
+ if (b.id === this.emissionMainCategory) return 1;
181
+ return 0;
182
+ });
183
+ },
184
+ editRight(): boolean {
185
+ return (
186
+ (true === this.authenticated &&
187
+ this.myOrganisationId === this.podcast?.organisation.id) ||
188
+ true === state.generalParameters.isAdmin
189
+ );
190
+ },
191
+ countLink(): number {
192
+ const platformShare = [
193
+ "amazon",
194
+ "googlePodcasts",
195
+ "applePodcast",
196
+ "deezer",
197
+ "spotify",
198
+ "tunein",
199
+ "radioline",
200
+ "podcastAddict",
201
+ "playerFm",
202
+ "pocketCasts",
203
+ ];
204
+ let count = 0;
205
+ for (let i = 0, len = platformShare.length; i < len; i++) {
206
+ if (
207
+ undefined !== this.podcast?.emission?.annotations?.[platformShare[i]]
208
+ )
209
+ count++;
210
+ }
211
+ return count;
212
+ },
213
+ isLiveReadyToRecord(): boolean {
214
+ return (
215
+ undefined !== this.podcast?.conferenceId &&
216
+ 0 !== this.podcast?.conferenceId &&
217
+ "READY_TO_RECORD" === this.podcast?.processingStatus
218
+ );
219
+ },
220
+ isCounter(): boolean {
221
+ return (
222
+ this.isLiveReadyToRecord &&
223
+ undefined !== this.fetchConference &&
224
+ ("PLANNED" === this.fetchConference.status ||
225
+ "PENDING" === this.fetchConference.status)
226
+ );
227
+ },
228
+ isOctopusAndAnimator(): boolean {
229
+ return (
230
+ !this.isPodcastmaker &&
231
+ this.editRight &&
232
+ (state.generalParameters.isRoleLive as boolean)
233
+ );
234
+ },
235
+ titlePage(): string {
236
+ return this.isLiveReadyToRecord
237
+ ? this.$t("Live episode")
238
+ : this.$t("Episode");
239
+ },
240
+ timeRemaining(): string {
241
+ return !this.podcast
242
+ ? ""
243
+ : dayjs(this.podcast.pubDate).diff(dayjs(), "seconds").toString();
244
+ },
245
+ },
246
+ watch: {
247
+ updateStatus(): void {
248
+ if (this.fetchConference && null !== this.fetchConference) {
249
+ this.fetchConference.status = this.updateStatus;
250
+ }
251
+ },
252
+ podcastId: {
253
+ immediate: true,
254
+ async handler() {
255
+ await this.getPodcastDetails();
256
+ this.initConference();
257
+ },
258
+ },
259
+ },
260
+
261
+ methods: {
262
+ async fetchConferencePublic() {
263
+ const data = await octopusApi.fetchData<string>(
264
+ 9,
265
+ "conference/realstatus/" + this.podcast.conferenceId,
266
+ );
267
+ this.fetchConference = {
268
+ status: data,
269
+ conferenceId: this.podcast.conferenceId,
270
+ title: "",
271
+ };
272
+ },
273
+ async initConference() {
274
+ if (!this.podcast || undefined == this.podcast.conferenceId) return;
275
+ if (this.isOctopusAndAnimator) {
276
+ try {
277
+ const data = await crudApi.fetchData<Conference>(
278
+ 9,
279
+ "conference/" + this.podcast.conferenceId,
280
+ );
281
+ this.fetchConference = data ? data : { conferenceId: -1, title: "" };
282
+ } catch {
283
+ await this.fetchConferencePublic();
284
+ }
285
+ } else {
286
+ await this.fetchConferencePublic();
287
+ }
288
+ if (
289
+ this.fetchConference &&
290
+ -1 !== this.fetchConference.conferenceId &&
291
+ "PUBLISHING" !== this.fetchConference.status &&
292
+ "DEBRIEFING" !== this.fetchConference.status
293
+ ) {
294
+ this.$emit("initConferenceId", this.podcast.conferenceId);
295
+ }
296
+ },
297
+ updatePodcast(podcastUpdated: Podcast): void {
298
+ this.podcast = podcastUpdated;
299
+ },
300
+ initError(): void {
301
+ this.error = true;
302
+ this.loaded = true;
303
+ },
304
+ handleAnnotations() {
305
+ if (!this.podcast) {
306
+ return;
307
+ }
308
+ if (this.podcast.emission.annotations?.exclusive) {
309
+ this.exclusive = "true" === this.podcast.emission.annotations.exclusive;
310
+ this.exclusive =
311
+ this.exclusive &&
312
+ this.myOrganisationId !== this.podcast.organisation.id;
313
+ }
314
+ if (this.podcast.emission.annotations?.notExclusive) {
315
+ this.notExclusive =
316
+ "true" === this.podcast.emission.annotations.notExclusive;
317
+ }
318
+ },
319
+ async getPodcastDetails(): Promise<void> {
320
+ this.loaded = false;
321
+ this.error = false;
322
+ try {
323
+ const data: Podcast = await octopusApi.fetchData<Podcast>(
324
+ 0,
325
+ "podcast/" + this.podcastId,
326
+ );
327
+ if (
328
+ "PUBLIC" !== data.organisation.privacy &&
329
+ this.filterOrgaId !== data.organisation.id
330
+ ) {
331
+ this.initError();
332
+ return;
333
+ }
334
+ this.podcast = data;
335
+ this.$emit("podcastTitle", this.podcast.title);
336
+ this.handleAnnotations();
337
+ if (
338
+ (!this.podcast.availability.visibility ||
339
+ ("READY_TO_RECORD" !== this.podcast.processingStatus &&
340
+ "READY" !== this.podcast.processingStatus &&
341
+ "PROCESSING" !== this.podcast.processingStatus) ||
342
+ false === this.podcast.valid) &&
343
+ !this.editRight
344
+ ) {
345
+ this.error = true;
346
+ }
347
+ this.loaded = true;
348
+ } catch (error) {
349
+ this.handle403(error as AxiosError);
350
+ this.initError();
351
+ }
352
+ },
353
+
354
+ receiveCommentEvent(event: {
355
+ type: string;
356
+ comment: CommentPodcast;
357
+ oldStatus?: string;
358
+ }): void {
359
+ (
360
+ this.$refs.commentSection as InstanceType<typeof CommentSection>
361
+ ).receiveCommentEvent(event);
362
+ },
363
+ },
364
+ });
365
+ </script>
@@ -0,0 +1,152 @@
1
+ <template>
2
+ <div class="page-box">
3
+ <ProductorSearch
4
+ v-model:organisation-id="organisationId"
5
+ v-model:search-pattern="searchPattern"
6
+ />
7
+ <AdvancedSearch
8
+ :is-education="isEducation"
9
+ :is-emission="false"
10
+ :reset-rubriquage="resetRubriquage"
11
+ :sort-criteria="sortCriteria"
12
+ :include-hidden="includeHidden"
13
+ :organisation-id="organisationId"
14
+ @update-category="iabId = $event"
15
+ @update-rubriquage-filter="updateRubriquageFilter"
16
+ @update-monetization="monetization = $event"
17
+ @update-from-date="fromDate = $event"
18
+ @update-to-date="toDate = $event"
19
+ @update-sort-criteria="sortCriteria = $event"
20
+ @include-hidden="includeHidden = $event"
21
+ @not-valid="notValid = $event"
22
+ />
23
+ <PodcastList
24
+ :show-count="true"
25
+ :first="0"
26
+ :size="30"
27
+ :organisation-id="orgaArray"
28
+ :query="searchPattern"
29
+ :monetization="monetization"
30
+ :before="toDate"
31
+ :after="fromDate"
32
+ :sort-criteria="sortCriteria"
33
+ :include-hidden="includeHidden"
34
+ :not-valid="notValid"
35
+ :iab-id="iabId"
36
+ :rubrique-id="rubriqueId"
37
+ :rubriquage-id="rubriquageId"
38
+ :no-rubriquage-id="noRubriquageId"
39
+ />
40
+ </div>
41
+ </template>
42
+
43
+ <script lang="ts">
44
+ import { orgaComputed } from "../mixins/orgaComputed";
45
+ import PodcastList from "../display/podcasts/PodcastList.vue";
46
+ import { state } from "../../stores/ParamSdkStore";
47
+ import ProductorSearch from "../display/filter/ProductorSearch.vue";
48
+ import AdvancedSearch from "../display/filter/AdvancedSearch.vue";
49
+ import { RubriquageFilter } from "@/stores/class/rubrique/rubriquageFilter";
50
+ import { useFilterStore } from "@/stores/FilterStore";
51
+ import { mapState } from "pinia";
52
+ import { defineComponent } from "vue";
53
+ export default defineComponent({
54
+ name: "PodcastsPage",
55
+ components: {
56
+ PodcastList,
57
+ ProductorSearch,
58
+ AdvancedSearch,
59
+ },
60
+ mixins: [orgaComputed],
61
+ props: {
62
+ productor: { default: undefined, type: String },
63
+ isEducation: { default: false, type: Boolean },
64
+ searchInit: { default: "", type: String },
65
+ },
66
+ data() {
67
+ return {
68
+ isInit: false as boolean,
69
+ searchPattern: "" as string,
70
+ organisationId: undefined as string | undefined,
71
+ monetization: "UNDEFINED" as string, // UNDEFINED, YES, NO
72
+ fromDate: undefined as string | undefined,
73
+ toDate: undefined as string | undefined,
74
+ resetRubriquage: false as boolean,
75
+ includeHidden: false as boolean,
76
+ sortCriteria: "DATE" as string, // SCORE, DATE, POPULARITY, NAME, LAST_PODCAST_DESC
77
+ notValid: false as boolean,
78
+ iabId: undefined as number | undefined,
79
+ noRubriquageId: [] as Array<number>,
80
+ rubriquageId: [] as Array<number>,
81
+ rubriqueId: [] as Array<number>,
82
+ };
83
+ },
84
+
85
+ computed: {
86
+ ...mapState(useFilterStore, ["filterRubrique", "filterIab"]),
87
+ organisationRight(): boolean {
88
+ return (
89
+ (true === this.authenticated &&
90
+ this.myOrganisationId === this.organisationId) ||
91
+ true === state.generalParameters.isAdmin
92
+ );
93
+ },
94
+ orgaArray(): Array<string> {
95
+ return this.organisationId ? [this.organisationId] : [];
96
+ },
97
+ organisation(): string | undefined {
98
+ return this.organisationId ? this.organisationId : this.filterOrgaId;
99
+ },
100
+ },
101
+ watch: {
102
+ organisationId(): void {
103
+ if (!this.isInit) {
104
+ return;
105
+ }
106
+ this.resetRubriquage = !this.resetRubriquage;
107
+ this.rubriquageId = [];
108
+ this.rubriqueId = [];
109
+ this.noRubriquageId = [];
110
+ },
111
+ searchPattern(value: string): void {
112
+ this.sortCriteria = "" !== value ? "SCORE" : "DATE";
113
+ },
114
+ },
115
+ created() {
116
+ this.initPodcastsPage();
117
+ },
118
+ methods: {
119
+ initPodcastsPage() {
120
+ this.searchPattern = this.searchInit ?? "";
121
+ this.organisationId = this.productor ? this.productor : this.filterOrgaId;
122
+ this.includeHidden =
123
+ this.organisation && this.organisationRight ? true : false;
124
+ this.iabId = this.filterIab?.id;
125
+ if (this.filterRubrique.length) {
126
+ this.updateRubriquageFilter(this.filterRubrique);
127
+ }
128
+ this.$nextTick(() => {
129
+ this.isInit = true;
130
+ });
131
+ },
132
+ updateRubriquageFilter(value: Array<RubriquageFilter>) {
133
+ const length = value.length;
134
+ const allRubriquageId: Array<number> = [];
135
+ const noRubriquageId: Array<number> = [];
136
+ const rubriqueId: Array<number> = [];
137
+ for (let index = 0; index < length; index++) {
138
+ if (-1 === value[index].rubriqueId) {
139
+ noRubriquageId.push(value[index].rubriquageId);
140
+ } else if (0 === value[index].rubriqueId) {
141
+ allRubriquageId.push(value[index].rubriquageId);
142
+ } else {
143
+ rubriqueId.push(value[index].rubriqueId);
144
+ }
145
+ }
146
+ this.rubriquageId = allRubriquageId;
147
+ this.rubriqueId = rubriqueId;
148
+ this.noRubriquageId = noRubriquageId;
149
+ },
150
+ },
151
+ });
152
+ </script>
@@ -0,0 +1,131 @@
1
+ <template>
2
+ <div class="page-box">
3
+ <template v-if="loaded && !error">
4
+ <div class="page-element-title-container">
5
+ <div class="page-element-title">
6
+ <h1>{{ $t("Radio") }}</h1>
7
+ </div>
8
+ <div class="page-element-bg" :style="backgroundDisplay" />
9
+ </div>
10
+ <div v-if="radio" class="d-flex flex-column page-element">
11
+ <div class="module-box">
12
+ <div class="mb-5 descriptionText">
13
+ <RadioImage :radio="radio" />
14
+ <h2>{{ radio.name }}</h2>
15
+ <div v-if="radio.description">
16
+ {{ radio.description }}
17
+ </div>
18
+ </div>
19
+ <RadioCurrently :radio="radio" />
20
+ <EditBoxRadio v-if="editRight" :radio="radio" />
21
+ </div>
22
+ <RadioPlanning :radio="radio" />
23
+ <SharePlayerRadio
24
+ v-if="authenticated"
25
+ :canal="radio"
26
+ :organisation-id="myOrganisationId"
27
+ />
28
+ <ShareButtons />
29
+ </div>
30
+ </template>
31
+ <ClassicLoading
32
+ :loading-text="!loaded ? $t('Loading content ...') : undefined"
33
+ :error-text="error ? $t(`Emission doesn't exist`) : undefined"
34
+ />
35
+ </div>
36
+ </template>
37
+
38
+ <script lang="ts">
39
+ import octopusApi from "@saooti/octopus-api";
40
+ import { state } from "../../stores/ParamSdkStore";
41
+ import displayMethods from "../mixins/displayMethods";
42
+ import imageProxy from "../mixins/imageProxy";
43
+ import { orgaComputed } from "../mixins/orgaComputed";
44
+ import { handle403 } from "../mixins/handle403";
45
+ import ClassicLoading from "../form/ClassicLoading.vue";
46
+ import { defineComponent, defineAsyncComponent } from "vue";
47
+ import { AxiosError } from "axios";
48
+ import { Canal } from "@/stores/class/radio/canal";
49
+ const SharePlayerRadio = defineAsyncComponent(
50
+ () => import("../display/sharing/SharePlayerRadio.vue"),
51
+ );
52
+ const ShareButtons = defineAsyncComponent(
53
+ () => import("../display/sharing/ShareButtons.vue"),
54
+ );
55
+ const EditBoxRadio = defineAsyncComponent(
56
+ () => import("@/components/display/edit/EditBoxRadio.vue"),
57
+ );
58
+ const RadioCurrently = defineAsyncComponent(
59
+ () => import("../display/live/RadioCurrently.vue"),
60
+ );
61
+ const RadioImage = defineAsyncComponent(
62
+ () => import("../display/live/RadioImage.vue"),
63
+ );
64
+ const RadioPlanning = defineAsyncComponent(
65
+ () => import("../display/live/RadioPlanning.vue"),
66
+ );
67
+ export default defineComponent({
68
+ components: {
69
+ SharePlayerRadio,
70
+ ShareButtons,
71
+ EditBoxRadio,
72
+ ClassicLoading,
73
+ RadioCurrently,
74
+ RadioImage,
75
+ RadioPlanning,
76
+ },
77
+ mixins: [displayMethods, handle403, orgaComputed, imageProxy],
78
+ props: {
79
+ canalId: { default: undefined, type: Number },
80
+ },
81
+ emits: ["radioTitle"],
82
+
83
+ data() {
84
+ return {
85
+ loaded: false as boolean,
86
+ radio: undefined as Canal | undefined,
87
+ error: false as boolean,
88
+ };
89
+ },
90
+
91
+ computed: {
92
+ editRight(): boolean {
93
+ return (
94
+ (true === this.authenticated &&
95
+ this.myOrganisationId === this.radio?.organisationId) ||
96
+ true === state.generalParameters.isAdmin
97
+ );
98
+ },
99
+ backgroundDisplay(): string {
100
+ return !this.radio
101
+ ? ""
102
+ : `background-image: url('${this.radio.imageUrl}');`;
103
+ },
104
+ },
105
+ watch: {
106
+ canalId: {
107
+ immediate: true,
108
+ handler() {
109
+ this.getRadioDetails();
110
+ },
111
+ },
112
+ },
113
+ methods: {
114
+ async getRadioDetails(): Promise<void> {
115
+ this.loaded = false;
116
+ this.error = false;
117
+ try {
118
+ this.radio = await octopusApi.fetchData<Canal>(
119
+ 14,
120
+ "canal/" + this.canalId,
121
+ );
122
+ this.$emit("radioTitle", this.radio.name);
123
+ } catch (error) {
124
+ this.handle403(error as AxiosError);
125
+ this.error = true;
126
+ }
127
+ this.loaded = true;
128
+ },
129
+ },
130
+ });
131
+ </script>
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <div class="page-box">
3
+ <h1>{{ title }}</h1>
4
+ <PodcastList
5
+ :first="firstRoute"
6
+ :size="sizeRoute"
7
+ :rubrique-id="rubriqueId"
8
+ />
9
+ </div>
10
+ </template>
11
+
12
+ <script lang="ts">
13
+ import octopusApi from "@saooti/octopus-api";
14
+ import PodcastList from "../display/podcasts/PodcastList.vue";
15
+ import { defineComponent } from "vue";
16
+ import { Rubrique } from "@/stores/class/rubrique/rubrique";
17
+ export default defineComponent({
18
+ name: "RubriquePage",
19
+ components: {
20
+ PodcastList,
21
+ },
22
+ props: {
23
+ firstRoute: { default: 0, type: Number },
24
+ sizeRoute: { default: 30, type: Number },
25
+ rubriqueId: { default: undefined, type: [Number] },
26
+ },
27
+ data() {
28
+ return {
29
+ title: "" as string,
30
+ };
31
+ },
32
+ watch: {
33
+ rubriqueId: {
34
+ immediate: true,
35
+ async handler() {
36
+ const data = await octopusApi.fetchData<Rubrique>(
37
+ 0,
38
+ "rubrique/" + this.rubriqueId,
39
+ );
40
+ this.title = data.name;
41
+ },
42
+ },
43
+ },
44
+ });
45
+ </script>