@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,166 +1,108 @@
1
1
  <template>
2
- <div class="d-flex flex-column align-items-center">
3
- <h2 class="mt-3 align-self-baseline" v-if="notEmptyPlaylist">
4
- {{ $t('Podcasts in the playlist') }}
2
+ <div>
3
+ <h2 class="mt-3 align-self-baseline">
4
+ {{ titleList }}
5
5
  </h2>
6
- <h2 class="mt-3 align-self-baseline" v-else>
7
- {{ $t('No podcasts in the playlist') }}
8
- </h2>
9
- <div class="d-flex justify-content-center" v-if="loading">
10
- <div class="spinner-border mr-3"></div>
11
- <h3 class="mt-2">{{ $t('Loading podcasts ...') }}</h3>
12
- </div>
13
- <div v-if="loaded && !podcasts.length && notEmptyPlaylist">
14
- <p>{{ $t('No podcast match your query') }}</p>
15
- </div>
16
- <div v-if="loaded && podcasts.length > 1" class="text-secondary mb-4">
17
- {{ $t('Number podcasts', { nb: podcasts.length }) + $t('sort by score') }}
18
- </div>
19
- <div
20
- class="d-flex position-relative width-600 align-self-baseline"
21
- v-if="notEmptyPlaylist"
22
- >
23
- <label for="search" class="d-inline" :aria-label="$t('Search')"></label>
24
- <input
25
- :placeholder="$t('Search')"
26
- v-model="searchPattern"
27
- class="filter-search-input input-no-outline flex-grow"
28
- id="search"
29
- />
30
- <div
31
- class="saooti-search-bounty filter-list-search-icon search-icon-container"
32
- ></div>
33
- </div>
34
- <ul class="podcast-list" v-show="loaded">
35
- <PodcastItem
36
- :podcast="p"
37
- v-for="p in podcastsDisplay"
38
- :key="p.podcastId"
39
- />
40
- </ul>
41
- <button
42
- class="btn"
43
- :class="buttonPlus ? 'btn-linkPlus mt-3' : 'btn-more'"
44
- @click="displayMore"
45
- v-show="size < podcasts.length && loaded"
46
- :aria-label="$t('See more')"
6
+ <ClassicSearch
7
+ v-if="!loading && notEmptyPlaylist"
8
+ v-model:textInit="searchPattern"
9
+ class="width-600 align-self-baseline mb-2"
10
+ id-checkbox="podcast-list-search"
11
+ :label="$t('Search')"
12
+ />
13
+ <ListPaginate
14
+ id="podcastPlaylistListPaginate"
15
+ v-model:first="first"
16
+ v-model:rowsPerPage="size"
17
+ v-model:isMobile="isMobile"
18
+ :text-count="podcasts.length > 1 ? `${$t('Number podcasts', { nb: podcasts.length })} ${$t('sort by score')}` : undefined"
19
+ :total-count="podcasts.length"
20
+ :loading="loading"
21
+ :loading-text="loading?$t('Loading podcasts ...'):undefined"
22
+ :error-text="!loading && !podcasts.length && notEmptyPlaylist?$t(`No podcast match your query`):undefined"
47
23
  >
48
- <template v-if="buttonPlus">{{ $t('See more') }}</template>
49
- <div class="saooti-plus"></div>
50
- </button>
24
+ <template #list>
25
+ <ul
26
+ class="podcast-list"
27
+ >
28
+ <template
29
+ v-for="p in podcastsDisplay"
30
+ :key="p.podcastId"
31
+ >
32
+ <PodcastItem
33
+ v-if="0!==p.podcastId"
34
+ :podcast="p"
35
+ />
36
+ </template>
37
+ </ul>
38
+ </template>
39
+ </ListPaginate>
51
40
  </div>
52
41
  </template>
53
42
 
54
- <style lang="scss">
55
- .width-600 {
56
- width: 600px;
57
- @media (max-width: 600px) {
58
- width: 100%;
59
- }
60
- }
61
- </style>
62
-
63
43
  <script lang="ts">
64
- const octopusApi = require('@saooti/octopus-api');
44
+ import ListPaginate from '../list/ListPaginate.vue';
45
+ import { handle403 } from '../../mixins/handle403';
46
+ import { orgaComputed } from '../../mixins/orgaComputed';
47
+ import octopusApi from '@saooti/octopus-api';
65
48
  import PodcastItem from '../podcasts/PodcastItem.vue';
66
49
  import { state } from '../../../store/paramStore';
67
-
50
+ import ClassicSearch from '../../form/ClassicSearch.vue';
51
+ import { Podcast } from '@/store/class/general/podcast';
52
+ import { Playlist } from '@/store/class/general/playlist';
68
53
  import { defineComponent } from 'vue'
54
+ import { AxiosError } from 'axios';
69
55
  export default defineComponent({
70
56
  name: 'PodcastList',
71
57
 
72
- props: ['playlist'],
73
-
74
58
  components: {
75
59
  PodcastItem,
60
+ ClassicSearch,
61
+ ListPaginate
76
62
  },
77
63
 
78
- created() {
79
- if (this.notEmptyPlaylist) {
80
- this.fetchContent();
81
- } else {
82
- this.loading = false;
83
- this.loaded = true;
84
- }
64
+ mixins: [handle403, orgaComputed],
65
+
66
+ props: {
67
+ playlist: { default: ()=>({}), type: Object as ()=>Playlist},
85
68
  },
86
69
 
87
70
  data() {
88
71
  return {
89
- loading: true,
90
- loaded: true,
91
- podcasts: [] as any,
92
- podcastsQuery: [] as any,
93
- size: 12,
94
- searchPattern: '',
72
+ loading: true as boolean,
73
+ podcasts: [] as Array<Podcast>,
74
+ podcastsQuery: [] as Array<Podcast>,
75
+ size: 30 as number,
76
+ first: 0 as number,
77
+ searchPattern: '' as string,
78
+ isMobile: false as boolean,
95
79
  };
96
80
  },
97
81
 
82
+
98
83
  computed: {
99
- notEmptyPlaylist():boolean {
100
- return 0 !== Object.keys(this.playlist.podcasts).length;
101
- },
102
- podcastsDisplay():any {
103
- if (this.size < this.podcastsQuery.length)
104
- return this.podcastsQuery.slice(0, this.size);
105
- return this.podcastsQuery.slice(0, this.podcasts.length);
84
+ titleList(): string{
85
+ return this.notEmptyPlaylist ? this.$t('Podcasts in the playlist') : this.$t('No podcasts in the playlist');
106
86
  },
107
- buttonPlus() {
108
- return state.generalParameters.buttonPlus;
109
- },
110
- organisationId() {
111
- return state.generalParameters.organisationId;
112
- },
113
-
114
- authenticated():boolean {
115
- return state.generalParameters.authenticated;
116
- },
117
-
118
- editRight() {
119
- if (
120
- (this.authenticated &&
121
- this.organisationId === this.playlist.organisation.id) ||
122
- state.generalParameters.isAdmin
123
- )
124
- return true;
125
- return false;
87
+ notEmptyPlaylist(): boolean {
88
+ return 0 !== Object.keys(this.playlist.podcasts).length;
126
89
  },
127
- },
128
-
129
- methods: {
130
- async fetchContent() {
131
- this.podcasts.length = 0;
132
- this.loading = true;
133
- this.loaded = false;
134
- let content = await octopusApi.fetchPlaylistContent(
135
- this.playlist.playlistId
136
- );
137
- for (let index = 0, len = content.length; index < len; index++) {
138
- content[index].order = this.playlist.podcasts[content[index].podcastId];
139
- }
140
- this.podcasts = content;
141
- if (!this.editRight) {
142
- this.podcasts = this.podcasts.filter((p:any) => {
143
- return (
144
- null !== p &&
145
- (!p.availability || true === p.availability.visibility)
146
- );
147
- });
90
+ podcastsDisplay(): Array<Podcast>{
91
+ if(this.isMobile){
92
+ return this.podcastsQuery.slice(0, Math.min(this.first + this.size,this.podcasts.length));
148
93
  }
149
-
150
- this.podcastsQuery = this.podcasts;
151
- this.loading = false;
152
- this.loaded = true;
153
- },
154
-
155
- displayMore(event: { preventDefault: () => void; }) {
156
- event.preventDefault();
157
- this.size += 12;
94
+ return this.podcastsQuery.slice(this.first, Math.min(this.first + this.size,this.podcasts.length));
95
+ },
96
+ editRight(): boolean {
97
+ return (true===this.authenticated &&
98
+ this.myOrganisationId === this.playlist.organisation?.id) ||
99
+ true ===state.generalParameters.isAdmin
158
100
  },
159
101
  },
160
102
  watch: {
161
- searchPattern() {
103
+ searchPattern(): void {
162
104
  if ('' !== this.searchPattern) {
163
- this.podcastsQuery = this.podcasts.filter((el:any) => {
105
+ this.podcastsQuery = this.podcasts.filter((el: Podcast) => {
164
106
  return el.title
165
107
  .toLowerCase()
166
108
  .includes(this.searchPattern.toLowerCase());
@@ -170,5 +112,48 @@ export default defineComponent({
170
112
  }
171
113
  },
172
114
  },
173
- });
115
+
116
+ created() {
117
+ this.fetchContent();
118
+ },
119
+ methods: {
120
+ async fetchContent(): Promise<void> {
121
+ if (this.notEmptyPlaylist){
122
+ this.podcasts.length = 0;
123
+ this.loading = true;
124
+ try {
125
+ const content = await octopusApi.fetchData<Array<Podcast>>(0, 'playlist/'+this.playlist.playlistId+'/content');
126
+ for (let index = 0, len = content.length; index < len; index++) {
127
+ content[index].order = this.playlist.podcasts[content[index].podcastId];
128
+ }
129
+ this.podcasts = content;
130
+ if (!this.editRight) {
131
+ this.podcasts = this.podcasts.filter((p: Podcast|null) => {
132
+ return (
133
+ null !== p &&
134
+ (!p.availability || true === p.availability.visibility)
135
+ );
136
+ });
137
+ }
138
+ this.podcastsQuery = this.podcasts;
139
+ } catch (error) {
140
+ this.handle403((error as AxiosError));
141
+ }
142
+ }
143
+ this.loading = false;
144
+ },
145
+ },
146
+ })
174
147
  </script>
148
+
149
+
150
+ <style lang="scss">
151
+ .octopus-app{
152
+ .width-600 {
153
+ width: 600px;
154
+ @media (max-width: 600px) {
155
+ width: 100%;
156
+ }
157
+ }
158
+ }
159
+ </style>
@@ -0,0 +1,191 @@
1
+ <template>
2
+ <div
3
+ v-if="loading || (!loading && 0 !== allPodcasts.length)"
4
+ class="d-flex flex-column p-3 playlist-inline-podcast"
5
+ >
6
+ <h2>{{ title }}</h2>
7
+ <div
8
+ v-if="!overflowScroll"
9
+ class="d-flex justify-content-end hide-phone"
10
+ >
11
+ <button
12
+ class="btn admin-button m-1 saooti-left"
13
+ :class="{ disabled: !previousAvailable }"
14
+ :title="$t('Display previous')"
15
+ @click="displayPrevious()"
16
+ />
17
+ <button
18
+ class="btn admin-button m-1 saooti-right"
19
+ :class="{ disabled: !nextAvailable }"
20
+ :title="$t('Display next')"
21
+ @click="displayNext()"
22
+ />
23
+ </div>
24
+ <ClassicLoading
25
+ :loading-text="loading?$t('Loading podcasts ...'):undefined"
26
+ />
27
+ <transition-group
28
+ :name="transitionName"
29
+ class="element-list-inline"
30
+ tag="ul"
31
+ :class="[
32
+ alignLeft ? 'justify-content-start' : '',
33
+ overflowScroll ? 'overflowScroll' : '',
34
+ ]"
35
+ :css="isInlineAnimation"
36
+ >
37
+ <PodcastItem
38
+ v-for="p in podcasts"
39
+ :key="p.podcastId"
40
+ class="flex-shrink-0 item-phone-margin"
41
+ :podcast="p"
42
+ :class="[alignLeft ? 'me-3' : '']"
43
+ />
44
+ </transition-group>
45
+ <router-link
46
+ class="btn btn-primary align-self-center width-fit-content m-4"
47
+ :to="{
48
+ name: 'playlist',
49
+ params: { playlistId: playlistId.toString() },
50
+ }"
51
+ >
52
+ {{ $t('See more') }}
53
+ <div
54
+ class="ms-1 saooti-more"
55
+ />
56
+ </router-link>
57
+ </div>
58
+ </template>
59
+
60
+ <script lang="ts">
61
+ import octopusApi from '@saooti/octopus-api';
62
+ import domHelper from '../../../helper/dom';
63
+ import PodcastItem from '../podcasts/PodcastItem.vue';
64
+ import ClassicLoading from '../../form/ClassicLoading.vue';
65
+ const PHONE_WIDTH = 960;
66
+ import { state } from '../../../store/paramStore';
67
+ import { Podcast } from '@/store/class/general/podcast';
68
+ import { Playlist } from '@/store/class/general/playlist';
69
+ import { defineComponent } from 'vue'
70
+ export default defineComponent({
71
+ name: 'PodcastPlaylistInlineList',
72
+
73
+ components: {
74
+ PodcastItem,
75
+ ClassicLoading
76
+ },
77
+
78
+ props: {
79
+ playlistId: { default: undefined, type: Number},
80
+ },
81
+
82
+ data() {
83
+ return {
84
+ loading: true as boolean,
85
+ index: 0 as number,
86
+ first: 0 as number,
87
+ size: 5 as number,
88
+ totalCount: 0 as number,
89
+ playlist: undefined as Playlist|undefined,
90
+ allPodcasts: [] as Array<Podcast>,
91
+ direction: 1 as number,
92
+ alignLeft: false as boolean,
93
+ };
94
+ },
95
+ computed: {
96
+ title(): string{
97
+ return this.playlist?.title??"";
98
+ },
99
+ podcasts(): Array<Podcast> {
100
+ return this.allPodcasts.slice(this.index, this.index + this.size);
101
+ },
102
+ sizeItem(): number {
103
+ return state.generalParameters.podcastItem ? (state.generalParameters.podcastItem as number): 13;
104
+ },
105
+ overflowScroll(): boolean {
106
+ return (state.emissionPage.overflowScroll as boolean);
107
+ },
108
+ isInlineAnimation(): boolean {
109
+ return (state.generalParameters.isInlineAnimation as boolean);
110
+ },
111
+ previousAvailable(): boolean {
112
+ return this.index > 0;
113
+ },
114
+ nextAvailable(): boolean {
115
+ return this.index + this.size < this.totalCount;
116
+ },
117
+ transitionName(): string {
118
+ return this.direction > 0 ? 'out-left' : 'out-right';
119
+ },
120
+ },
121
+ watch: {
122
+ playlistId(): void {
123
+ this.reset();
124
+ this.fetchContent();
125
+ },
126
+ },
127
+
128
+ created() {
129
+ window.addEventListener('resize', this.handleResize);
130
+ },
131
+
132
+ unmounted() {
133
+ window.removeEventListener('resize', this.handleResize);
134
+ },
135
+
136
+ mounted() {
137
+ this.handleResize();
138
+ this.fetchContent();
139
+ },
140
+ methods: {
141
+ async fetchContent(): Promise<void> {
142
+ this.allPodcasts.length = 0;
143
+ this.loading = true;
144
+ this.playlist = await octopusApi.fetchData<Playlist>(0, 'playlist/'+this.playlistId);
145
+ this.allPodcasts = await octopusApi.fetchData<Array<Podcast>>(0, 'playlist/'+this.playlistId+'/content');
146
+ if (!((state.generalParameters.authenticated && state.generalParameters.organisationId === this.playlist?.organisation?.id) ||
147
+ state.generalParameters.isAdmin)) {
148
+ this.allPodcasts = this.allPodcasts.filter((p: Podcast|null) => {
149
+ return (
150
+ null !== p &&
151
+ (!p.availability || true === p.availability.visibility)
152
+ );
153
+ });
154
+ }
155
+ this.alignLeft = this.allPodcasts.length <= 3;
156
+ this.loading = false;
157
+ },
158
+ displayPrevious(): void {
159
+ this.direction = -1;
160
+ if (this.previousAvailable) {
161
+ this.index -= 1;
162
+ }
163
+ },
164
+ displayNext(): void {
165
+ this.direction = 1;
166
+ if (!this.nextAvailable) return;
167
+ this.index += 1;
168
+ },
169
+ handleResize(): void {
170
+ if (!this.$el) return;
171
+ if (this.overflowScroll) {
172
+ this.size = 20;
173
+ return;
174
+ }
175
+ if (window.innerWidth <= PHONE_WIDTH) {
176
+ this.size = 10;
177
+ return;
178
+ }
179
+ const width = (this.$el as HTMLElement).offsetWidth;
180
+ const sixteen = domHelper.convertRemToPixels(this.sizeItem + 0.7);
181
+ this.size = Math.floor(width / sixteen);
182
+ },
183
+ reset(): void {
184
+ this.index = 0;
185
+ this.first = 0;
186
+ this.totalCount = 0;
187
+ this.allPodcasts.length = 0;
188
+ },
189
+ },
190
+ })
191
+ </script>
@@ -1,59 +1,51 @@
1
1
  <template>
2
2
  <div
3
- class="d-flex align-items-center justify-content-start"
4
- v-if="animators && 0 !== animators.length"
3
+ v-if="animator"
4
+ class="d-flex align-items-center justify-content-start animators-item"
5
5
  >
6
6
  <router-link
7
7
  :to="{
8
8
  name: 'participant',
9
9
  params: { participantId: animator.participantId },
10
- query: { productor: this.$store.state.filter.organisationId },
10
+ query: { productor: $store.state.filter.organisationId },
11
11
  }"
12
- class="animator-item"
13
- v-for="(animator, index) in animators"
14
- v-bind:key="animator.participantId"
15
- v-show="index === visibleIndex"
16
- :aria-label="$t('Participant')"
12
+ :title="$t('Participant')"
17
13
  >
18
14
  <div class="podcast-item-animator text-dark">
19
- {{ getAnimatorName(animator) }}
15
+ {{ animatorName }}
20
16
  </div>
21
17
  </router-link>
22
18
  </div>
23
19
  </template>
24
20
 
25
- <style lang="scss">
26
- .podcast-item-animator {
27
- display: flex;
28
- align-items: flex-start;
29
- justify-content: center;
30
-
31
- font-size: 0.55rem;
32
- font-weight: 300;
33
- text-transform: capitalize;
34
- margin: 00.25rem 0.5rem 0;
35
- }
36
- </style>
37
-
38
21
  <script lang="ts">
22
+ import { Participant } from '@/store/class/general/participant';
39
23
  import { defineComponent } from 'vue'
40
24
  export default defineComponent({
41
25
  name: 'AnimatorsItem',
42
26
 
43
- props: ['animators'],
44
-
45
- data() {
46
- return {
47
- visibleIndex: 0,
48
- };
27
+ props: {
28
+ animator: { default: undefined, type: Object as ()=> Participant},
49
29
  },
50
-
51
- methods: {
52
- getAnimatorName(animator:any) {
53
- const first = animator.firstName || '';
54
- const last = animator.lastName || '';
55
- return (first + ' ' + last).trim();
56
- },
57
- },
58
- });
30
+ computed:{
31
+ animatorName(): string{
32
+ return (`${this.animator?.firstName??''} ${this.animator?.lastName??''}`).trim();
33
+ }
34
+ }
35
+ })
59
36
  </script>
37
+
38
+ <style lang="scss">
39
+ .octopus-app{
40
+ .podcast-item-animator {
41
+ display: flex;
42
+ align-items: flex-start;
43
+ justify-content: center;
44
+
45
+ font-size: 0.55rem;
46
+ font-weight: 300;
47
+ text-transform: capitalize;
48
+ margin: 00.25rem 0.5rem 0;
49
+ }
50
+ }
51
+ </style>
@@ -0,0 +1,82 @@
1
+ <template>
2
+ <div
3
+ v-if="participants.length"
4
+ class="comma"
5
+ >
6
+ {{ title }}
7
+ <span
8
+ :id="idPopover"
9
+ role="button"
10
+ tabindex="0"
11
+ class="saooti-help m-0"
12
+ :title="title"
13
+ />
14
+ <span class="mx-1">:</span>
15
+ <Popover
16
+ :target="idPopover"
17
+ >
18
+ <div
19
+ v-for="participant in participants"
20
+ :key="'desc-'+participant.participantId"
21
+ class="d-flex flex-column align-items-center"
22
+ >
23
+ <b><i>{{ getName(participant) }}</i></b>
24
+ <!-- eslint-disable vue/no-v-html -->
25
+ <div
26
+ v-if="participant.description"
27
+ class="h6 participant-desc html-wysiwyg-content"
28
+ v-html="participant.description"
29
+ />
30
+ <!-- eslint-enable -->
31
+ <hr>
32
+ </div>
33
+ </Popover>
34
+ <router-link
35
+ v-for="participant in participants"
36
+ :key="participant.participantId"
37
+ :title="$t('Participant')"
38
+ class="fw-bold"
39
+ :to="{
40
+ name: 'participant',
41
+ params: { participantId: participant.participantId },
42
+ query: {
43
+ productor: $store.state.filter.organisationId,
44
+ },
45
+ }"
46
+ >
47
+ {{ getName(participant) }}
48
+ </router-link>
49
+ </div>
50
+ </template>
51
+
52
+ <script lang="ts">
53
+ import Popover from '../../misc/Popover.vue';
54
+ import { Participant } from '@/store/class/general/participant';
55
+ import { defineComponent } from 'vue'
56
+ export default defineComponent({
57
+ name: 'ParticipantDescription',
58
+
59
+ components:{
60
+ Popover
61
+ },
62
+
63
+ props: {
64
+ participants: { default: () => [], type: Array as ()=> Array<Participant>},
65
+ isGuest: { default: false, type: Boolean},
66
+ },
67
+
68
+ computed:{
69
+ idPopover(): string{
70
+ return this.isGuest ? "popover-guests-help" : "popover-animators-help";
71
+ },
72
+ title(): string{
73
+ return this.isGuest ? this.$t('Guests') : this.$t('Animated by');
74
+ }
75
+ },
76
+ methods: {
77
+ getName(person: Participant): string {
78
+ return (`${person.firstName??''} ${person.lastName??''}`).trim();
79
+ },
80
+ },
81
+ })
82
+ </script>