@saooti/octopus-sdk 1.0.0 → 1.1.1

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 (317) hide show
  1. package/README.md +261 -0
  2. package/index.d.ts +4 -0
  3. package/index.ts +55 -3
  4. package/package.json +53 -45
  5. package/public/config.ts +4 -0
  6. package/public/css/fonts/icomoon.eot +0 -0
  7. package/public/css/fonts/icomoon.svg +129 -0
  8. package/public/css/fonts/icomoon.ttf +0 -0
  9. package/public/css/fonts/icomoon.woff +0 -0
  10. package/public/css/fonts/style.css +186 -1224
  11. package/public/img/403.jpeg +0 -0
  12. package/public/img/404.svg +242 -0
  13. package/public/img/ACPM.png +0 -0
  14. package/public/img/ouest_france_logo.svg +12 -0
  15. package/src/App.vue +102 -31
  16. package/src/api/classicCrud.ts +34 -0
  17. package/src/api/initialize.ts +5 -2
  18. package/src/assets/bootstrap-diff.scss +197 -0
  19. package/src/assets/form.scss +77 -77
  20. package/src/assets/general.scss +284 -272
  21. package/src/assets/live.scss +39 -0
  22. package/src/assets/modal.scss +43 -50
  23. package/src/assets/multiselect.scss +522 -573
  24. package/src/assets/octopus-library.scss +18 -4
  25. package/src/assets/share.scss +243 -0
  26. package/src/assets/transition.scss +98 -2
  27. package/src/components/display/aggregator/RssSection.vue +3 -5
  28. package/src/components/display/categories/CategoryChooser.vue +151 -114
  29. package/src/components/display/categories/CategoryFilter.vue +162 -0
  30. package/src/components/display/categories/CategoryList.vue +149 -117
  31. package/src/components/display/comments/AddCommentModal.vue +103 -108
  32. package/src/components/display/comments/CommentBasicView.vue +95 -0
  33. package/src/components/display/comments/CommentInput.vue +195 -183
  34. package/src/components/display/comments/CommentItem.vue +170 -208
  35. package/src/components/display/comments/CommentList.vue +134 -228
  36. package/src/components/display/comments/CommentParentInfo.vue +28 -62
  37. package/src/components/display/comments/CommentPlayer.vue +53 -56
  38. package/src/components/display/comments/CommentSection.vue +52 -83
  39. package/src/components/display/edit/EditBox.vue +10 -4
  40. package/src/components/display/edit/EditCommentBox.vue +124 -38
  41. package/src/components/display/emission/EmissionChooser.vue +88 -108
  42. package/src/components/display/emission/EmissionInlineList.vue +156 -157
  43. package/src/components/display/emission/EmissionItem.vue +72 -226
  44. package/src/components/display/emission/EmissionList.vue +159 -201
  45. package/src/components/display/emission/EmissionPlayerItem.vue +203 -174
  46. package/src/components/display/filter/AdvancedSearch.vue +224 -432
  47. package/src/components/display/filter/CategoryFilter.vue +105 -0
  48. package/src/components/display/filter/MonetizableFilter.vue +18 -15
  49. package/src/components/display/filter/ProductorSearch.vue +153 -176
  50. package/src/components/display/filter/RubriqueChoice.vue +97 -0
  51. package/src/components/display/filter/RubriqueFilter.vue +232 -0
  52. package/src/components/display/list/ListPaginate.vue +145 -0
  53. package/src/components/display/list/Paginate.vue +218 -0
  54. package/src/components/display/live/CountDown.vue +31 -30
  55. package/src/components/display/live/LiveHorizontalList.vue +84 -62
  56. package/src/components/display/live/LiveItem.vue +161 -186
  57. package/src/components/display/live/LiveList.vue +184 -295
  58. package/src/components/display/organisation/OrganisationChooser.vue +124 -162
  59. package/src/components/display/organisation/OrganisationChooserLight.vue +53 -56
  60. package/src/components/display/participant/ParticipantItem.vue +91 -128
  61. package/src/components/display/participant/ParticipantList.vue +134 -121
  62. package/src/components/display/playlist/PlaylistItem.vue +60 -97
  63. package/src/components/display/playlist/PlaylistList.vue +99 -92
  64. package/src/components/display/playlist/PodcastList.vue +117 -132
  65. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +191 -0
  66. package/src/components/display/podcasts/AnimatorsItem.vue +29 -37
  67. package/src/components/display/podcasts/ParticipantDescription.vue +82 -0
  68. package/src/components/display/podcasts/PodcastFilterList.vue +49 -102
  69. package/src/components/display/podcasts/PodcastImage.vue +208 -225
  70. package/src/components/display/podcasts/PodcastInlineList.vue +62 -355
  71. package/src/components/display/podcasts/PodcastInlineListClassic.vue +240 -0
  72. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +167 -0
  73. package/src/components/display/podcasts/PodcastItem.vue +94 -218
  74. package/src/components/display/podcasts/PodcastItemInfo.vue +166 -0
  75. package/src/components/display/podcasts/PodcastList.vue +127 -178
  76. package/src/components/display/podcasts/PodcastModuleBox.vue +234 -0
  77. package/src/components/display/podcasts/PodcastPlayBar.vue +101 -0
  78. package/src/components/display/podcasts/PodcastSwiperList.vue +204 -0
  79. package/src/components/display/podcasts/TagList.vue +60 -38
  80. package/src/components/display/rubriques/RubriqueChooser.vue +144 -131
  81. package/src/components/display/rubriques/RubriqueList.vue +216 -0
  82. package/src/components/display/sharing/PlayerParameters.vue +111 -153
  83. package/src/components/display/sharing/QrCode.vue +96 -0
  84. package/src/components/display/sharing/ShareButtons.vue +63 -233
  85. package/src/components/display/sharing/ShareButtonsIntern.vue +225 -0
  86. package/src/components/display/sharing/ShareDistribution.vue +102 -166
  87. package/src/components/display/sharing/SharePlayer.vue +189 -353
  88. package/src/components/display/sharing/SharePlayerColors.vue +78 -0
  89. package/src/components/display/sharing/SharePlayerTypes.vue +112 -0
  90. package/src/components/display/sharing/SplitButton.vue +42 -0
  91. package/src/components/display/sharing/SubscribeButtons.vue +65 -118
  92. package/src/components/display/studio/RecordingItemButton.vue +3 -5
  93. package/src/components/form/ClassicCheckbox.vue +66 -0
  94. package/src/components/form/ClassicLoading.vue +28 -0
  95. package/src/components/form/ClassicRadio.vue +66 -0
  96. package/src/components/form/ClassicSearch.vue +86 -0
  97. package/src/components/form/ClassicSelect.vue +65 -0
  98. package/src/components/misc/ErrorMessage.vue +27 -18
  99. package/src/components/misc/Footer.vue +151 -108
  100. package/src/components/misc/HomeDropdown.vue +95 -154
  101. package/src/components/misc/LeftMenu.vue +137 -206
  102. package/src/components/misc/Popover.vue +118 -0
  103. package/src/components/misc/Snackbar.vue +73 -37
  104. package/src/components/misc/TopBar.vue +211 -314
  105. package/src/components/misc/modal/ClipboardModal.vue +34 -47
  106. package/src/components/misc/modal/MessageModal.vue +74 -53
  107. package/src/components/misc/modal/NewsletterModal.vue +272 -224
  108. package/src/components/misc/modal/QrCodeModal.vue +58 -0
  109. package/src/components/misc/modal/ShareModalPlayer.vue +140 -74
  110. package/src/components/misc/player/Player.vue +146 -0
  111. package/src/components/misc/player/PlayerCompact.vue +154 -0
  112. package/src/components/misc/player/PlayerLarge.vue +166 -0
  113. package/src/components/misc/player/PlayerProgressBar.vue +112 -0
  114. package/src/components/misc/player/PlayerTimeline.vue +61 -0
  115. package/src/components/mixins/functions.ts +21 -18
  116. package/src/components/mixins/handle403.ts +17 -0
  117. package/src/components/mixins/init.ts +24 -0
  118. package/src/components/mixins/orgaComputed.ts +15 -0
  119. package/src/components/mixins/organisationFilter.ts +41 -0
  120. package/src/components/mixins/player/playerComment.ts +98 -0
  121. package/src/components/mixins/player/playerDisplay.ts +113 -0
  122. package/src/components/mixins/player/playerLive.ts +111 -0
  123. package/src/components/mixins/player/playerLogic.ts +225 -0
  124. package/src/components/mixins/tagOfMixins.ts +19 -0
  125. package/src/components/pages/Category.vue +24 -28
  126. package/src/components/pages/Emission.vue +144 -177
  127. package/src/components/pages/Emissions.vue +94 -110
  128. package/src/components/pages/Error403Page.vue +60 -0
  129. package/src/components/pages/Home.vue +74 -21
  130. package/src/components/pages/Lives.vue +53 -58
  131. package/src/components/pages/PageNotFound.vue +55 -0
  132. package/src/components/pages/Participant.vue +113 -129
  133. package/src/components/pages/Participants.vue +25 -41
  134. package/src/components/pages/Playlist.vue +86 -86
  135. package/src/components/pages/Playlists.vue +33 -52
  136. package/src/components/pages/Podcast.vue +206 -478
  137. package/src/components/pages/Podcasts.vue +112 -156
  138. package/src/components/pages/Rubrique.vue +21 -27
  139. package/src/components/pages/Search.vue +37 -94
  140. package/src/helper/dom.ts +2 -2
  141. package/src/helper/duration.ts +18 -8
  142. package/src/helper/useEventListener.ts +18 -0
  143. package/src/i18n.ts +36 -0
  144. package/src/locale/de.ts +309 -0
  145. package/src/locale/educationen.ts +14 -0
  146. package/src/locale/en.ts +316 -1
  147. package/src/locale/es.ts +309 -0
  148. package/src/locale/fr.ts +47 -15
  149. package/src/locale/it.ts +307 -0
  150. package/src/locale/messages.ts +11 -2
  151. package/src/locale/sl.ts +309 -0
  152. package/src/main.ts +64 -55
  153. package/src/router/router.ts +192 -159
  154. package/src/sass/_variables.scss +10 -8
  155. package/src/shims-tsx.d.ts +15 -0
  156. package/src/shims-vue-recaptcha-v3.d.ts +9 -0
  157. package/src/shims-vue.d.ts +5 -6
  158. package/src/store/AppStore.ts +41 -173
  159. package/src/store/class/adserver/adserverConfig.ts +9 -0
  160. package/src/store/class/adserver/adserverOtherEmission.ts +13 -0
  161. package/src/store/class/adserver/adserverTiming.ts +10 -0
  162. package/src/store/class/cartouchier/cartouche.ts +15 -0
  163. package/src/store/class/cartouchier/cartouchier.ts +9 -0
  164. package/src/store/class/conference/conference.ts +35 -0
  165. package/src/store/class/conference/conferenceMessage.ts +10 -0
  166. package/src/store/class/conference/conferenceParticipant.ts +18 -0
  167. package/src/store/class/conference/pad.ts +15 -0
  168. package/src/store/class/conference/studioCall.ts +7 -0
  169. package/src/store/class/contract/contract.ts +7 -0
  170. package/src/store/class/contract/contractOrganisation.ts +7 -0
  171. package/src/store/class/ftp/ftpEmission.ts +41 -0
  172. package/src/store/class/ftp/ftpParam.ts +12 -0
  173. package/src/store/class/ftp/testFtpEmission.ts +5 -0
  174. package/src/store/class/general/audioView.ts +21 -0
  175. package/src/store/class/general/category.ts +10 -0
  176. package/src/store/class/general/comment.ts +16 -0
  177. package/src/store/class/general/customPlayer.ts +9 -0
  178. package/src/store/class/general/emission.ts +23 -0
  179. package/src/store/class/general/fetchParam.ts +3 -0
  180. package/src/store/class/general/initState.ts +25 -0
  181. package/src/store/class/general/interfacePageable.ts +16 -0
  182. package/src/store/class/general/ituneCategory.ts +5 -0
  183. package/src/store/class/general/media.ts +14 -0
  184. package/src/store/class/general/organisation.ts +20 -0
  185. package/src/store/class/general/pageable.ts +13 -0
  186. package/src/store/class/general/participant.ts +12 -0
  187. package/src/store/class/general/player.ts +14 -0
  188. package/src/store/class/general/playlist.ts +13 -0
  189. package/src/store/class/general/podcast.ts +43 -0
  190. package/src/store/class/general/sortPageable.ts +5 -0
  191. package/src/store/class/general/soundcastCategory.ts +8 -0
  192. package/src/store/class/ouestFrance/ofTag.ts +36 -0
  193. package/src/store/class/ouestFrance/ofTagInfo.ts +9 -0
  194. package/src/store/class/ouestFrance/ofTagPage.ts +7 -0
  195. package/src/store/class/ouestFrance/ofTagSeo.ts +7 -0
  196. package/src/store/class/ouestFrance/ofTagVente.ts +6 -0
  197. package/src/store/class/ouestFrance/ofTagWithParents.ts +26 -0
  198. package/src/store/class/rss/aggregator.ts +28 -0
  199. package/src/store/class/rss/rssEmission.ts +14 -0
  200. package/src/store/class/rss/rssInfo.ts +8 -0
  201. package/src/store/class/rubrique/rubriquage.ts +10 -0
  202. package/src/store/class/rubrique/rubriquageFilter.ts +6 -0
  203. package/src/store/class/rubrique/rubrique.ts +9 -0
  204. package/src/store/class/stat/statArrayIncome.ts +6 -0
  205. package/src/store/class/stat/statArrayObject.ts +34 -0
  206. package/src/store/class/stat/statGraph.ts +7 -0
  207. package/src/store/class/user/person.ts +15 -0
  208. package/src/store/class/user/profile.ts +12 -0
  209. package/src/store/class/user/userKeycloak.ts +24 -0
  210. package/src/store/paramStore.ts +222 -217
  211. package/src/store/typeAppStore.ts +186 -235
  212. package/src/vuex-shim.d.ts +8 -0
  213. package/tsconfig.json +4 -0
  214. package/vue.config.js +16 -0
  215. package/public/css/fonts/saooti-ui.eot +0 -0
  216. package/public/css/fonts/saooti-ui.svg +0 -829
  217. package/public/css/fonts/saooti-ui.ttf +0 -0
  218. package/public/css/fonts/saooti-ui.woff +0 -0
  219. package/public/css/fonts/stitcher-logo.svg +0 -83
  220. package/public/img/ACPM.PNG +0 -0
  221. package/src/api/comments.ts +0 -7
  222. package/src/api/emissions.ts +0 -7
  223. package/src/api/podcasts.ts +0 -7
  224. package/src/api/profile.ts +0 -8
  225. package/src/api/studio.ts +0 -1
  226. package/src/assets/bootstrap_scss/_alert.scss +0 -51
  227. package/src/assets/bootstrap_scss/_badge.scss +0 -54
  228. package/src/assets/bootstrap_scss/_breadcrumb.scss +0 -42
  229. package/src/assets/bootstrap_scss/_button-group.scss +0 -164
  230. package/src/assets/bootstrap_scss/_buttons.scss +0 -291
  231. package/src/assets/bootstrap_scss/_card.scss +0 -278
  232. package/src/assets/bootstrap_scss/_carousel.scss +0 -197
  233. package/src/assets/bootstrap_scss/_close.scss +0 -41
  234. package/src/assets/bootstrap_scss/_code.scss +0 -48
  235. package/src/assets/bootstrap_scss/_custom-forms.scss +0 -522
  236. package/src/assets/bootstrap_scss/_dropdown.scss +0 -201
  237. package/src/assets/bootstrap_scss/_forms.scss +0 -352
  238. package/src/assets/bootstrap_scss/_functions.scss +0 -134
  239. package/src/assets/bootstrap_scss/_grid.scss +0 -69
  240. package/src/assets/bootstrap_scss/_images.scss +0 -42
  241. package/src/assets/bootstrap_scss/_input-group.scss +0 -191
  242. package/src/assets/bootstrap_scss/_jumbotron.scss +0 -17
  243. package/src/assets/bootstrap_scss/_list-group.scss +0 -158
  244. package/src/assets/bootstrap_scss/_media.scss +0 -8
  245. package/src/assets/bootstrap_scss/_mixins.scss +0 -47
  246. package/src/assets/bootstrap_scss/_modal.scss +0 -243
  247. package/src/assets/bootstrap_scss/_nav.scss +0 -120
  248. package/src/assets/bootstrap_scss/_navbar.scss +0 -324
  249. package/src/assets/bootstrap_scss/_pagination.scss +0 -74
  250. package/src/assets/bootstrap_scss/_popover.scss +0 -170
  251. package/src/assets/bootstrap_scss/_print.scss +0 -141
  252. package/src/assets/bootstrap_scss/_progress.scss +0 -46
  253. package/src/assets/bootstrap_scss/_reboot.scss +0 -482
  254. package/src/assets/bootstrap_scss/_root.scss +0 -20
  255. package/src/assets/bootstrap_scss/_spinners.scss +0 -55
  256. package/src/assets/bootstrap_scss/_tables.scss +0 -185
  257. package/src/assets/bootstrap_scss/_toasts.scss +0 -44
  258. package/src/assets/bootstrap_scss/_tooltip.scss +0 -115
  259. package/src/assets/bootstrap_scss/_transitions.scss +0 -20
  260. package/src/assets/bootstrap_scss/_type.scss +0 -125
  261. package/src/assets/bootstrap_scss/_utilities.scss +0 -17
  262. package/src/assets/bootstrap_scss/_variables.scss +0 -1145
  263. package/src/assets/bootstrap_scss/bootstrap-grid.scss +0 -29
  264. package/src/assets/bootstrap_scss/bootstrap-reboot.scss +0 -12
  265. package/src/assets/bootstrap_scss/bootstrap.scss +0 -44
  266. package/src/assets/bootstrap_scss/mixins/_alert.scss +0 -13
  267. package/src/assets/bootstrap_scss/mixins/_background-variant.scss +0 -22
  268. package/src/assets/bootstrap_scss/mixins/_badge.scss +0 -17
  269. package/src/assets/bootstrap_scss/mixins/_border-radius.scss +0 -63
  270. package/src/assets/bootstrap_scss/mixins/_box-shadow.scss +0 -20
  271. package/src/assets/bootstrap_scss/mixins/_breakpoints.scss +0 -123
  272. package/src/assets/bootstrap_scss/mixins/_buttons.scss +0 -110
  273. package/src/assets/bootstrap_scss/mixins/_caret.scss +0 -62
  274. package/src/assets/bootstrap_scss/mixins/_clearfix.scss +0 -7
  275. package/src/assets/bootstrap_scss/mixins/_deprecate.scss +0 -10
  276. package/src/assets/bootstrap_scss/mixins/_float.scss +0 -14
  277. package/src/assets/bootstrap_scss/mixins/_forms.scss +0 -177
  278. package/src/assets/bootstrap_scss/mixins/_gradients.scss +0 -45
  279. package/src/assets/bootstrap_scss/mixins/_grid-framework.scss +0 -71
  280. package/src/assets/bootstrap_scss/mixins/_grid.scss +0 -69
  281. package/src/assets/bootstrap_scss/mixins/_hover.scss +0 -37
  282. package/src/assets/bootstrap_scss/mixins/_image.scss +0 -36
  283. package/src/assets/bootstrap_scss/mixins/_list-group.scss +0 -21
  284. package/src/assets/bootstrap_scss/mixins/_lists.scss +0 -7
  285. package/src/assets/bootstrap_scss/mixins/_nav-divider.scss +0 -11
  286. package/src/assets/bootstrap_scss/mixins/_pagination.scss +0 -22
  287. package/src/assets/bootstrap_scss/mixins/_reset-text.scss +0 -17
  288. package/src/assets/bootstrap_scss/mixins/_resize.scss +0 -6
  289. package/src/assets/bootstrap_scss/mixins/_screen-reader.scss +0 -34
  290. package/src/assets/bootstrap_scss/mixins/_size.scss +0 -7
  291. package/src/assets/bootstrap_scss/mixins/_table-row.scss +0 -39
  292. package/src/assets/bootstrap_scss/mixins/_text-emphasis.scss +0 -17
  293. package/src/assets/bootstrap_scss/mixins/_text-hide.scss +0 -11
  294. package/src/assets/bootstrap_scss/mixins/_text-truncate.scss +0 -8
  295. package/src/assets/bootstrap_scss/mixins/_transition.scss +0 -16
  296. package/src/assets/bootstrap_scss/mixins/_visibility.scss +0 -8
  297. package/src/assets/bootstrap_scss/utilities/_align.scss +0 -8
  298. package/src/assets/bootstrap_scss/utilities/_background.scss +0 -19
  299. package/src/assets/bootstrap_scss/utilities/_borders.scss +0 -75
  300. package/src/assets/bootstrap_scss/utilities/_clearfix.scss +0 -3
  301. package/src/assets/bootstrap_scss/utilities/_display.scss +0 -26
  302. package/src/assets/bootstrap_scss/utilities/_embed.scss +0 -39
  303. package/src/assets/bootstrap_scss/utilities/_flex.scss +0 -51
  304. package/src/assets/bootstrap_scss/utilities/_float.scss +0 -11
  305. package/src/assets/bootstrap_scss/utilities/_overflow.scss +0 -5
  306. package/src/assets/bootstrap_scss/utilities/_position.scss +0 -32
  307. package/src/assets/bootstrap_scss/utilities/_screenreaders.scss +0 -11
  308. package/src/assets/bootstrap_scss/utilities/_shadows.scss +0 -6
  309. package/src/assets/bootstrap_scss/utilities/_sizing.scss +0 -20
  310. package/src/assets/bootstrap_scss/utilities/_spacing.scss +0 -73
  311. package/src/assets/bootstrap_scss/utilities/_stretched-link.scss +0 -19
  312. package/src/assets/bootstrap_scss/utilities/_text.scss +0 -72
  313. package/src/assets/bootstrap_scss/utilities/_visibility.scss +0 -13
  314. package/src/assets/bootstrap_scss/vendor/_rfs.scss +0 -204
  315. package/src/components/misc/Player.vue +0 -792
  316. package/src/shims-vuex.d.ts +0 -7
  317. package/src/views/Home.vue +0 -18
@@ -1,169 +1,142 @@
1
1
  <template>
2
- <div class="d-flex flex-column align-items-center">
3
- <div class="d-flex justify-content-center" v-if="loading">
4
- <div class="spinner-border mr-3"></div>
5
- <h3 class="mt-2">{{ $t('Loading podcasts ...') }}</h3>
6
- </div>
7
- <div v-if="loaded && !podcasts.length">
8
- <p>{{ $t('No podcast match your query') }}</p>
9
- </div>
10
- <div
11
- v-if="showCount && loaded && podcasts.length > 1"
12
- class="text-secondary mb-2"
13
- >
14
- {{ $t('Number podcasts', { nb: totalCount }) + sortText }}
15
- </div>
16
- <ul class="podcast-list" v-show="loaded">
17
- <PodcastItem
18
- v-bind:podcast="p"
19
- v-for="p in podcasts"
20
- v-bind:key="p.podcastId"
21
- />
22
- </ul>
23
- <button
24
- class="btn"
25
- :class="buttonPlus ? 'btn-linkPlus mt-3' : 'btn-more'"
26
- @click="displayMore"
27
- :disabled="inFetching"
28
- v-show="!allFetched && loaded"
29
- :aria-label="$t('See more')"
30
- >
31
- <template v-if="buttonPlus">{{ $t('See more') }}</template>
32
- <div class="saooti-plus"></div>
33
- </button>
34
- </div>
2
+ <ListPaginate
3
+ id="podcastListPaginate"
4
+ v-model:first="dfirst"
5
+ v-model:rowsPerPage="dsize"
6
+ v-model:isMobile="isMobile"
7
+ :text-count="showCount && podcasts.length > 1 ? $t('Number podcasts', { nb: totalCount }) + sortText : undefined"
8
+ :total-count="totalCount"
9
+ :loading="loading"
10
+ :loading-text="loading?$t('Loading podcasts ...'):undefined"
11
+ :error-text="!loading && !podcasts.length?$t(`No podcast match your query`):undefined"
12
+ >
13
+ <template #list>
14
+ <ul
15
+ class="podcast-list"
16
+ >
17
+ <template
18
+ v-for="p in displayArray"
19
+ :key="p.podcastId"
20
+ >
21
+ <PodcastItem
22
+ v-if="0!==p.podcastId"
23
+ :podcast="p"
24
+ />
25
+ </template>
26
+ </ul>
27
+ </template>
28
+ </ListPaginate>
35
29
  </template>
36
30
 
37
- <style lang="scss">
38
- .podcast-list {
39
- align-self: stretch;
40
- flex-grow: 1;
41
- margin: 1em 0 0;
42
- padding: 0;
43
- /*For ie11 */
44
- display: flex;
45
- flex-wrap: wrap;
46
- /* end */
47
- display: grid; /* 1 */
48
- grid-template-columns: repeat(auto-fill, 13rem); /* 2 */
49
- grid-gap: 1rem; /* 3 */
50
- justify-content: space-between; /* 4 */
51
- }
52
- /** PHONES*/
53
- @media (max-width: 960px) {
54
- .podcast-list {
55
- align-self: auto;
56
- justify-items: center;
57
- display: flex;
58
- justify-content: space-around;
59
- }
60
- }
61
- </style>
62
-
63
31
  <script lang="ts">
64
- const octopusApi = require('@saooti/octopus-api');
65
- import podcastApi from '@/api/podcasts';
32
+ import ListPaginate from '../list/ListPaginate.vue';
33
+ import { handle403 } from '../../mixins/handle403';
34
+ import octopusApi from '@saooti/octopus-api';
66
35
  import PodcastItem from './PodcastItem.vue';
67
36
  import { state } from '../../../store/paramStore';
68
-
37
+ import { Podcast } from '@/store/class/general/podcast';
69
38
  import { defineComponent } from 'vue'
39
+ import { FetchParam } from '@/store/class/general/fetchParam';
40
+ import { AxiosError } from 'axios';
41
+ import { emptyPodcastData } from '@/store/typeAppStore';
70
42
  export default defineComponent({
71
43
  name: 'PodcastList',
72
44
 
73
- props: {
74
- first: { default: 0 },
75
- size: { default: 5 },
76
- organisationId: { default: undefined as any },
77
- emissionId: { default: undefined as any },
78
- iabId: { default: undefined as any },
79
- participantId: { default: undefined as any },
80
- query: { default: undefined as any },
81
- monetization: { default: undefined as any },
82
- popularSort: { default: false },
83
- reload: { default: false },
84
- rubriqueId: { default: undefined as any },
85
- rubriquageId: { default: undefined as any },
86
- before: { default: undefined as any },
87
- after: { default: undefined as any },
88
- includeHidden: { default: false },
89
- showCount: { default: false },
90
- noRubrique: { default: undefined as any },
91
- sortCriteria: { default: undefined as any },
92
- notValid: { default: undefined as any },
93
- },
94
- emits: ['fetch', 'emptyList'],
95
-
96
45
  components: {
97
46
  PodcastItem,
47
+ ListPaginate
98
48
  },
99
49
 
100
- created() {
101
- this.fetchContent(true);
50
+ mixins: [handle403],
51
+
52
+ props: {
53
+ first: { default: 0, type: Number},
54
+ size: { default: 30, type: Number},
55
+ organisationId: { default: undefined, type: String},
56
+ emissionId: { default: undefined, type: Number},
57
+ iabId: { default: undefined, type: Number},
58
+ participantId: { default: undefined, type: Number},
59
+ query: { default: undefined, type: String},
60
+ monetization: { default: undefined, type: String},
61
+ popularSort: { default: false, type: Boolean},
62
+ reload: { default: false, type: Boolean},
63
+ before: { default: undefined, type: String},
64
+ after: { default: undefined, type: String},
65
+ includeHidden: { default: false, type: Boolean},
66
+ showCount: { default: false, type: Boolean },
67
+ sortCriteria: { default: undefined, type: String},
68
+ notValid: { default: undefined , type: Boolean},
69
+ rubriqueId: { default: () => [], type: Array as ()=>Array<number> },
70
+ rubriquageId:{ default: () => [], type: Array as ()=>Array<number> },
71
+ noRubriquageId: { default: () => [], type: Array as ()=>Array<number> },
102
72
  },
73
+ emits: ['fetch', 'emptyList'],
103
74
 
104
75
  data() {
105
76
  return {
106
- loading: true,
107
- loaded: true,
108
- dfirst: this.$props.first,
109
- dsize: this.$props.size,
110
- totalCount: 0,
111
- podcasts: [] as any,
112
- inFetching: false,
77
+ loading: true as boolean,
78
+ dfirst: this.first as number,
79
+ dsize: this.size as number,
80
+ totalCount: 0 as number,
81
+ podcasts: [] as Array<Podcast>,
82
+ isMobile: false as boolean,
113
83
  };
114
84
  },
115
85
 
116
86
  computed: {
117
- allFetched():boolean {
118
- return this.dfirst >= this.totalCount;
119
- },
120
- buttonPlus() {
121
- return state.generalParameters.buttonPlus;
122
- },
123
- changed():any {
87
+ displayArray(): Array<Podcast>{
88
+ if(this.isMobile){
89
+ return this.podcasts;
90
+ }
91
+ return this.podcasts.slice(this.dfirst, Math.min(this.dfirst + this.dsize,this.totalCount));
92
+ },
93
+ changed(): string {
124
94
  return `${this.first}|${this.size}|${this.organisation}|${this.emissionId}|${this.sortCriteria}|${this.sort}
125
95
  ${this.iabId}|${this.participantId}|${this.query}|${this.monetization}|${this.popularSort}|
126
- ${this.rubriqueId}|${this.rubriquageId}|${this.before}|${this.after}|${this.includeHidden}|${this.noRubrique}|${this.notValid}`;
96
+ ${this.rubriqueId}|${this.rubriquageId}|${this.before}|${this.after}|${this.includeHidden}|${this.noRubriquageId}|${this.notValid}`;
127
97
  },
128
- filterOrga():any {
129
- return this.$store.state.filter.organisationId;
98
+ organisation(): string|undefined {
99
+ return this.organisationId ?? this.$store.state.filter.organisationId;
130
100
  },
131
- organisation():any {
132
- if (this.organisationId) return this.organisationId;
133
- if (this.filterOrga) return this.filterOrga;
134
- return undefined;
101
+ sort(): string {
102
+ return this.popularSort? "POPULARITY" : this.sortCriteria??'DATE';
135
103
  },
136
- sort():string {
137
- if (this.popularSort) return 'POPULARITY';
138
- return this.sortCriteria;
139
- },
140
- sortText():string {
104
+ sortText(): string {
141
105
  switch (this.sortCriteria) {
142
- case 'SCORE':
143
- return this.$t('sort by score');
144
- case 'DATE':
145
- return this.$t('sort by date');
146
- case 'NAME':
147
- return this.$t('sort by alphabetical');
148
- default:
149
- return this.$t('sort by date');
106
+ case 'SCORE':return " "+this.$t('sort by score');
107
+ case 'DATE':return " "+this.$t('sort by date');
108
+ case 'NAME':return " "+this.$t('sort by alphabetical');
109
+ default:return " "+this.$t('sort by date');
150
110
  }
151
111
  },
152
- isProduction() {
153
- return state.generalParameters.isProduction;
112
+ },
113
+ watch: {
114
+ changed(): void {
115
+ this.reloadList();
116
+ },
117
+ reload(): void {
118
+ this.reloadList();
154
119
  },
120
+ dsize():void{
121
+ this.reloadList();
122
+ },
123
+ dfirst(): void{
124
+ if(!this.podcasts[this.dfirst] || 0===this.podcasts[this.dfirst].podcastId){
125
+ this.fetchContent(false);
126
+ }
127
+ },
128
+ },
129
+ async created() {
130
+ await this.fetchContent(true);
155
131
  },
156
-
157
132
  methods: {
158
- async fetchContent(reset: boolean) {
159
- this.inFetching = true;
160
- if (reset) {
161
- this.podcasts.length = 0;
162
- this.dfirst = 0;
163
- this.loading = true;
164
- this.loaded = false;
165
- }
166
- let param:any = {
133
+ reloadList(){
134
+ this.dfirst = 0;
135
+ this.fetchContent(true);
136
+ },
137
+ async fetchContent(reset: boolean): Promise<void> {
138
+ this.loading = true;
139
+ const param: FetchParam = {
167
140
  first: this.dfirst,
168
141
  size: this.dsize,
169
142
  organisationId: this.organisation,
@@ -173,66 +146,42 @@ export default defineComponent({
173
146
  query: this.query,
174
147
  monetisable: this.monetization,
175
148
  sort: this.sort,
176
- rubriqueId: this.rubriqueId,
177
- rubriquageId: this.rubriquageId,
178
149
  before: this.before,
179
150
  after: this.after,
180
- noRubrique: this.noRubrique,
151
+ noRubriquageId: this.noRubriquageId.length ? this.noRubriquageId : undefined,
152
+ rubriqueId: this.rubriqueId.length ? this.rubriqueId : undefined,
153
+ rubriquageId: this.rubriquageId.length ? this.rubriquageId : undefined,
154
+ includeHidden: this.includeHidden,
155
+ validity: undefined !== this.notValid?!this.notValid: undefined,
156
+ publisherId:this.notValid && !(state.generalParameters.isProduction as boolean)?this.$store.state.profile.userId:undefined
181
157
  };
182
- if (undefined !== this.notValid) {
183
- param.validity = !this.notValid;
184
- }
185
- if (this.notValid && !this.isProduction) {
186
- param.publisherId = this.$store.state.profile.userId;
187
- }
188
- if (this.includeHidden) {
189
- param.includeHidden = this.includeHidden;
190
- const data = await podcastApi.fetchPodcastsAdmin(this.$store, param);
191
- this.afterFetching(reset, data);
192
- } else {
193
- const data = await octopusApi.fetchPodcasts(param);
158
+ try {
159
+ const data =await octopusApi.fetchDataWithParams<{count: number;result:Array<Podcast>;sort: string;}>(0, 'podcast/search',param, true);
194
160
  this.afterFetching(reset, data);
161
+ } catch (error) {
162
+ this.handle403((error as AxiosError));
195
163
  }
196
164
  },
197
-
198
- afterFetching(reset: any, data: any) {
165
+ afterFetching(reset: boolean, data: {count: number, result: Array<Podcast>, sort: string}): void {
199
166
  if (reset) {
200
167
  this.podcasts.length = 0;
201
- this.dfirst = 0;
202
- this.loading = true;
203
- this.loaded = false;
204
168
  }
205
- this.loading = false;
206
- this.loaded = true;
207
- this.podcasts = this.podcasts.concat(data.result).filter((p: null) => {
169
+ if(this.dfirst > this.podcasts.length){
170
+ for (let i = this.podcasts.length-1, len = this.dfirst + this.dsize; i < len; i++) {
171
+ this.podcasts.push(emptyPodcastData());
172
+ }
173
+ }
174
+ const responsePodcasts= data.result.filter((p: Podcast|null) => {
208
175
  return null !== p;
209
176
  });
177
+ this.podcasts = this.podcasts.slice(0, this.dfirst).concat(responsePodcasts).concat(this.podcasts.slice(this.dfirst+this.dsize, this.podcasts.length));
210
178
  this.$emit('fetch', this.podcasts);
211
- this.dfirst += this.dsize;
212
179
  this.totalCount = data.count;
213
180
  if (0 === this.podcasts.length) {
214
181
  this.$emit('emptyList');
215
182
  }
216
- this.inFetching = false;
217
- },
218
-
219
- displayMore(event: { preventDefault: () => void; }) {
220
- event.preventDefault();
221
- this.fetchContent(false);
222
- },
223
- },
224
-
225
- watch: {
226
- changed: {
227
- handler() {
228
- this.fetchContent(true);
229
- },
230
- },
231
- reload: {
232
- handler() {
233
- this.fetchContent(true);
234
- },
183
+ this.loading = false;
235
184
  },
236
185
  },
237
- });
238
- </script>
186
+ })
187
+ </script>
@@ -0,0 +1,234 @@
1
+ <template>
2
+ <div class="module-box">
3
+ <div
4
+ class="text-uppercase h4"
5
+ >
6
+ {{ podcast.title }}
7
+ </div>
8
+ <div class="mb-5 mt-3 d-flex">
9
+ <div class="w-100">
10
+ <PodcastImage
11
+ :class="[
12
+ !isLiveReadyToRecord
13
+ ? 'shadow-element'
14
+ : '',
15
+ isLiveReadyToRecord &&
16
+ fetchConference &&
17
+ 'null' !== fetchConference &&
18
+ fetchConference.status
19
+ ? fetchConference.status.toLowerCase() + '-shadow'
20
+ : '',
21
+ ]"
22
+ class="me-3"
23
+ :podcast="podcast"
24
+ :hide-play="!isLiveReadyToRecord"
25
+ :playing-podcast="playingPodcast"
26
+ :fetch-conference="fetchConference"
27
+ :is-animator-live="isOctopusAndAnimator"
28
+ @playPodcast="playPodcast"
29
+ />
30
+ <div
31
+ class="d-flex flex-wrap mb-3"
32
+ :class="isLiveReady ? 'justify-content-between' : ''"
33
+ >
34
+ <div
35
+ v-if="0 !== date.length"
36
+ :class="!isLiveReady ? 'me-5' : ''"
37
+ >
38
+ {{ date }}
39
+ </div>
40
+ <div>
41
+ {{ $t('Duration', { duration: duration }) }}
42
+ </div>
43
+ <div
44
+ v-if="isLiveReady"
45
+ class="text-danger"
46
+ >
47
+ {{ $t('Episode record in live') }}
48
+ </div>
49
+ </div>
50
+ <!-- eslint-disable vue/no-v-html -->
51
+ <div
52
+ class="descriptionText html-wysiwyg-content"
53
+ v-html="urlify(podcast.description)"
54
+ />
55
+ <!-- eslint-enable -->
56
+ <div class="my-3">
57
+ <ParticipantDescription :participants="podcast.animators" />
58
+ <div>
59
+ {{ $t('Emission') + ' : ' }}
60
+ <router-link
61
+ class="fw-bold"
62
+ :to="{
63
+ name: 'emission',
64
+ params: { emissionId: podcast.emission.emissionId },
65
+ query: {
66
+ productor: filterOrga,
67
+ },
68
+ }"
69
+ >
70
+ {{ podcast.emission.name }}
71
+ </router-link>
72
+ </div>
73
+ <div v-if="!isPodcastmaker">
74
+ {{ $t('Producted by : ') }}
75
+ <router-link
76
+ class="fw-bold"
77
+ :to="{
78
+ name: 'productor',
79
+ params: { productorId: podcast.organisation.id },
80
+ query: {
81
+ productor: filterOrga,
82
+ },
83
+ }"
84
+ >
85
+ {{ podcast.organisation.name }}
86
+ </router-link>
87
+ </div>
88
+ <a
89
+ v-if="podcast.article"
90
+ class="btn d-flex align-items-center my-2 width-fit-content"
91
+ :href="podcast.article"
92
+ rel="noopener"
93
+ target="_blank"
94
+ >
95
+ <span class="saooti-newspaper me-1" />
96
+ <div>{{ $t('See associated article') }}</div>
97
+ </a>
98
+ <ParticipantDescription
99
+ :participants="podcast.guests"
100
+ :is-guest="true"
101
+ />
102
+ <PodcastPlayBar
103
+ :podcast="podcast"
104
+ />
105
+ <div v-if="editRight && !isPodcastmaker">
106
+ <div
107
+ v-if="podcast.annotations && podcast.annotations.RSS"
108
+ class="me-5"
109
+ >
110
+ {{ $t('From RSS') }}
111
+ </div>
112
+ <ErrorMessage
113
+ v-if="''!==errorMessage"
114
+ :message="errorMessage"
115
+ />
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ <TagList
121
+ :tag-list="podcast.tags"
122
+ />
123
+ </div>
124
+ </template>
125
+
126
+ <script lang="ts">
127
+ import PodcastPlayBar from './PodcastPlayBar.vue';
128
+ import PodcastImage from './PodcastImage.vue';
129
+ import ParticipantDescription from './ParticipantDescription.vue';
130
+ import TagList from './TagList.vue';
131
+ import { state } from '../../../store/paramStore';
132
+ import moment from 'moment';
133
+ // @ts-ignore
134
+ import humanizeDuration from 'humanize-duration';
135
+ import { displayMethods } from '../../mixins/functions';
136
+ import { orgaComputed } from '../../mixins/orgaComputed';
137
+ import { Podcast } from '@/store/class/general/podcast';
138
+ import { Conference } from '@/store/class/conference/conference';
139
+
140
+ import { defineComponent, defineAsyncComponent } from 'vue';
141
+ const ErrorMessage = defineAsyncComponent(() => import('../../misc/ErrorMessage.vue'));
142
+ export default defineComponent({
143
+ name: "PodcastModuleBox",
144
+ components: {
145
+ PodcastImage,
146
+ ParticipantDescription,
147
+ TagList,
148
+ ErrorMessage,
149
+ PodcastPlayBar
150
+ },
151
+
152
+ mixins:[displayMethods, orgaComputed],
153
+
154
+ props: {
155
+ playingPodcast: { default: undefined, type: Object as ()=> Podcast},
156
+ podcast: { default: undefined, type: Object as ()=> Podcast},
157
+ fetchConference: { default: undefined, type: Object as ()=> Conference},
158
+ },
159
+
160
+ emits: ['playPodcast'],
161
+
162
+ computed: {
163
+ errorMessage(): string{
164
+ if(!this.podcast?.availability.visibility){
165
+ return this.$t('Podcast is not visible for listeners');
166
+ }
167
+ if('ERROR' === this.podcast?.processingStatus){
168
+ return this.$t('Podcast in ERROR, please contact Saooti');
169
+ }
170
+ return this.podcastNotValid ? this.$t('Podcast not validated') : '';
171
+ },
172
+ isPodcastmaker(): boolean {
173
+ return (state.generalParameters.podcastmaker as boolean);
174
+ },
175
+ date(): string {
176
+ if (this.podcast && 1970 !== moment(this.podcast.pubDate).year()){
177
+ return moment(this.podcast.pubDate).format('D MMMM YYYY, HH[h]mm');
178
+ }
179
+ return '';
180
+ },
181
+ duration(): string {
182
+ if (!this.podcast || this.podcast.duration <= 1) return '';
183
+ if (this.podcast.duration > 600000) {
184
+ return humanizeDuration(this.podcast.duration, {
185
+ language: this.$i18n.locale,
186
+ largest: 1,
187
+ round: true,
188
+ });
189
+ }
190
+ return humanizeDuration(this.podcast.duration, {
191
+ language: this.$i18n.locale,
192
+ largest: 2,
193
+ round: true,
194
+ });
195
+ },
196
+ editRight(): boolean {
197
+ return (true===this.authenticated &&
198
+ this.myOrganisationId === this.podcast?.organisation.id) ||true===state.generalParameters.isAdmin
199
+ },
200
+ isLiveReadyToRecord(): boolean {
201
+ return (undefined!==this.podcast && undefined!==this.podcast.conferenceId && 0 !== this.podcast.conferenceId && 'READY_TO_RECORD' === this.podcast.processingStatus);
202
+ },
203
+ isLiveReady(): boolean {
204
+ return (
205
+ undefined!==this.podcast?.conferenceId &&
206
+ 0 !== this.podcast?.conferenceId &&
207
+ 'READY' === this.podcast?.processingStatus
208
+ );
209
+ },
210
+ isNotRecorded(): boolean {
211
+ return (
212
+ this.isLiveReadyToRecord &&
213
+ undefined!==this.fetchConference &&
214
+ 'DEBRIEFING' === this.fetchConference.status
215
+ );
216
+ },
217
+ isOctopusAndAnimator(): boolean {
218
+ return (
219
+ !this.isPodcastmaker &&
220
+ this.editRight &&
221
+ (state.generalParameters.isRoleLive as boolean)
222
+ );
223
+ },
224
+ podcastNotValid(): boolean {
225
+ return undefined!==this.podcast?.availability && false === this.podcast?.valid;
226
+ },
227
+ },
228
+ methods: {
229
+ playPodcast(podcast: Podcast): void {
230
+ this.$emit('playPodcast', podcast);
231
+ },
232
+ },
233
+ })
234
+ </script>