@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,48 +1,149 @@
1
1
  <template>
2
2
  <div>
3
- <b-modal
3
+ <div
4
4
  id="share-modal"
5
- @close="closePopup"
6
- @hide="closePopup"
7
- @cancel="closePopup"
8
- :title="$t('Share the player')"
5
+ class="modal"
9
6
  >
10
- <template v-slot:default>
11
- <b-tabs content-class="p-2 share-modal-border">
12
- <b-tab :title="$t('Embed link')" class="tab-pane" active>
13
- <p>{{ embedLink }}</p>
14
- <div
15
- class="saooti-copy"
16
- @click="onCopyCode(embedLink, afterCopy)"
17
- ></div>
18
- </b-tab>
19
- <b-tab :title="$t('Embedly link')" class="tab-pane">
20
- <p>{{ embedlyLink }}</p>
21
- <div
22
- class="saooti-copy"
23
- @click="onCopyCode(embedlyLink, afterCopy)"
24
- ></div>
25
- </b-tab>
26
- <b-tab :title="$t('Direct link')" class="tab-pane" v-if="directLink">
27
- <p>{{ directLink.audioUrl }}</p>
28
- <div
29
- class="saooti-copy"
30
- @click="onCopyCode(directLink.audioUrl, afterCopy)"
31
- ></div>
32
- </b-tab>
33
- </b-tabs>
34
- </template>
35
- <template v-slot:modal-footer>
36
- <button class="btn btn-primary m-1" @click="closePopup">
37
- {{ $t('Close') }}
38
- </button>
39
- </template>
40
- </b-modal>
41
- <Snackbar ref="snackbar" position="bottom-left"></Snackbar>
7
+ <div class="modal-backdrop" />
8
+ <div class="modal-dialog">
9
+ <div class="modal-content">
10
+ <div class="modal-header">
11
+ <h5 class="modal-title">
12
+ {{ $t('Share the player') }}
13
+ </h5>
14
+ <button
15
+ ref="focusElement"
16
+ type="button"
17
+ class="btn-close btn-close-white"
18
+ title="Close"
19
+ @click="closePopup"
20
+ />
21
+ </div>
22
+ <div class="modal-body">
23
+ <ul class="nav nav-tabs">
24
+ <li
25
+ v-for="(tab, index) in tabs"
26
+ :key="tab"
27
+ class="nav-item"
28
+ >
29
+ <div
30
+ class="nav-link"
31
+ :class="activeTab === index? 'active':''"
32
+ @click="activeTab = index"
33
+ >
34
+ {{ tab }}
35
+ </div>
36
+ </li>
37
+ </ul>
38
+ <div class="tab-content p-2 share-modal-border">
39
+ <div
40
+ class="tab-pane tab-pane"
41
+ :class="activeTab === 0? 'active':''"
42
+ >
43
+ <p>{{ embedLink }}</p>
44
+ <div
45
+ class="saooti-copy"
46
+ @click="onCopyCode(embedLink, afterCopy)"
47
+ />
48
+ </div>
49
+ <div
50
+ class="tab-pane tab-pane"
51
+ :class="activeTab === 1? 'active':''"
52
+ >
53
+ <div class="d-flex flex-column">
54
+ <div class="d-flex">
55
+ <p>{{ embedlyLink }}</p>
56
+ <div
57
+ class="saooti-copy"
58
+ @click="onCopyCode(embedlyLink, afterCopy)"
59
+ />
60
+ </div>
61
+ <QrCode :url="embedlyLink" />
62
+ </div>
63
+ </div>
64
+ <div
65
+ v-if="directLink"
66
+ class="tab-pane tab-pane"
67
+ :class="activeTab === 2? 'active':''"
68
+ >
69
+ <p>{{ directLink.audioUrl }}</p>
70
+ <div
71
+ class="saooti-copy"
72
+ @click="onCopyCode(directLink.audioUrl, snackbarRef)"
73
+ />
74
+ </div>
75
+ </div>
76
+ </div>
77
+ <div class="modal-footer">
78
+ <button
79
+ class="btn btn-primary m-1"
80
+ @click="closePopup"
81
+ >
82
+ {{ $t('Close') }}
83
+ </button>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ <Snackbar
89
+ ref="snackbar"
90
+ position="bottom-left"
91
+ />
42
92
  </div>
43
93
  </template>
44
94
 
95
+ <script lang="ts">
96
+ import Snackbar from '../Snackbar.vue';
97
+ import { displayMethods } from '../../mixins/functions';
98
+
99
+ import QrCode from '../../display/sharing/QrCode.vue';
100
+ import { defineComponent } from 'vue'
101
+ import { Podcast } from '@/store/class/general/podcast';
102
+ import SnackbarVue from '../Snackbar.vue';
103
+ export default defineComponent({
104
+ name: 'ShareModalPlayer',
105
+
106
+ components: {
107
+ Snackbar,
108
+ QrCode
109
+ },
110
+ mixins: [displayMethods],
111
+ props: {
112
+ embedLink: { default: undefined, type: String},
113
+ embedlyLink: { default: undefined, type: String},
114
+ directLink: { default: undefined, type: Object as ()=>Podcast},
115
+ },
116
+ emits: ['close'],
117
+ data() {
118
+ return {
119
+ activeTab: 0 as number,
120
+ };
121
+ },
122
+ computed:{
123
+ tabs(): Array<string>{
124
+ if(this.directLink){
125
+ return [this.$t('Embed link'),this.$t('Embedly link'),this.$t('Direct link')];
126
+ }
127
+ return [this.$t('Embed link'),this.$t('Embedly link')];
128
+ }
129
+ },
130
+ mounted(){
131
+ (this.$refs.focusElement as HTMLElement)?.focus();
132
+ },
133
+ methods: {
134
+ closePopup(event: { preventDefault: () => void }): void {
135
+ event.preventDefault();
136
+ this.$emit('close');
137
+ },
138
+ afterCopy(): void{
139
+ (this.$refs.snackbar as InstanceType<typeof SnackbarVue>).open(this.$t('Data in clipboard'));
140
+ }
141
+ },
142
+ })
143
+ </script>
144
+
45
145
  <style lang="scss">
146
+ .octopus-app{
46
147
  .share-modal-border {
47
148
  border-right: solid 1px rgb(222, 226, 230);
48
149
  border-left: solid 1px rgb(222, 226, 230);
@@ -82,40 +183,5 @@
82
183
  align-self: center;
83
184
  }
84
185
  }
85
- </style>
86
- <script lang="ts">
87
- import Snackbar from '../Snackbar.vue';
88
- import { displayMethods } from '../../mixins/functions';
89
- import { defineComponent } from 'vue'
90
- export default defineComponent({
91
- name: 'ShareModalPlayer',
92
-
93
- props: ['embedLink', 'embedlyLink', 'directLink'],
94
- emits: ['close'],
95
-
96
- components: {
97
- Snackbar,
98
- },
99
-
100
- mixins: [displayMethods],
101
-
102
- mounted() {
103
- /* this.$bvModal.show('share-modal'); */
104
- },
105
- computed: {
106
- snackbarRef():any {
107
- return this.$refs.snackbar;
108
- },
109
- },
110
-
111
- methods: {
112
- closePopup(event: { preventDefault: () => void; }) {
113
- event.preventDefault();
114
- this.$emit('close');
115
- },
116
- afterCopy(){
117
- this.snackbarRef.open(this.$t('Data in clipboard'));
118
- }
119
- },
120
- });
121
- </script>
186
+ }
187
+ </style>
@@ -0,0 +1,146 @@
1
+ <template>
2
+ <div
3
+ class="w-100 transition-height bg-dark"
4
+ :style="{ height: playerHeight }"
5
+ >
6
+ <div
7
+ class="player-container"
8
+ :style="{ height: playerHeight }"
9
+ @transitionend="onHidden"
10
+ >
11
+ <template v-if="display">
12
+ <audio
13
+ id="audio-player"
14
+ :src="!live? audioUrlToPlay: undefined"
15
+ autoplay
16
+ @timeupdate="onTimeUpdate"
17
+ @ended="onFinished"
18
+ @playing="onPlay"
19
+ @durationChange="onTimeUpdate"
20
+ @error="onError"
21
+ />
22
+ <PlayerCompact
23
+ v-if="!largeVersion"
24
+ v-model:notListenTime="notListenTime"
25
+ :player-error="playerError"
26
+ :hls-ready="hlsReady"
27
+ :comments="comments"
28
+ :display-alert-bar="displayAlertBar"
29
+ :percent-live-progress="percentLiveProgress"
30
+ :duration-live-position="durationLivePosition"
31
+ :listen-time="listenTime"
32
+ @stopPlayer="stopPlayer"
33
+ @changePlayerLargeVersion="largeVersion = true"
34
+ />
35
+ <PlayerLarge
36
+ v-else
37
+ v-model:notListenTime="notListenTime"
38
+ :player-error="playerError"
39
+ :hls-ready="hlsReady"
40
+ :comments="comments"
41
+ :display-alert-bar="displayAlertBar"
42
+ :percent-live-progress="percentLiveProgress"
43
+ :duration-live-position="durationLivePosition"
44
+ :listen-time="listenTime"
45
+ @stopPlayer="stopPlayer"
46
+ @changePlayerLargeVersion="largeVersion = false"
47
+ />
48
+ </template>
49
+ </div>
50
+ </div>
51
+ </template>
52
+ <script lang="ts">
53
+ import { mapState } from 'vuex';
54
+ import { CommentPodcast } from '@/store/class/general/comment';
55
+ import { playerLogic } from '../../mixins/player/playerLogic';
56
+ import { StoreState } from '@/store/typeAppStore';
57
+ import PlayerCompact from '../player/PlayerCompact.vue';
58
+ import PlayerLarge from '../player/PlayerLarge.vue';
59
+ import { defineComponent } from 'vue';
60
+ export default defineComponent({
61
+ name: 'Player',
62
+
63
+ components: {
64
+ PlayerCompact,
65
+ PlayerLarge
66
+ },
67
+ mixins:[playerLogic],
68
+ emits: ['hide'],
69
+ data() {
70
+ return {
71
+ forceHide: false as boolean,
72
+ listenTime: 0 as number,
73
+ notListenTime: 0 as number,
74
+ lastSend: 0 as number,
75
+ downloadId: null as string|null,
76
+ playerError: false as boolean,
77
+ listenError: false as boolean,
78
+ percentLiveProgress: 0 as number,
79
+ durationLivePosition: 0 as number,
80
+ displayAlertBar: false as boolean,
81
+ hlsReady: false as boolean,
82
+ comments: [] as Array<CommentPodcast>,
83
+ showTimeline: false as boolean,
84
+ largeVersion: false as boolean,
85
+ audioUrlToPlay: "" as string
86
+ };
87
+ },
88
+ computed: {
89
+ ...mapState({
90
+ display: (state: StoreState) => 'STOPPED' !== state.player.status,
91
+ playerHeight(state: StoreState) {
92
+ if ('STOPPED' === state.player.status || this.forceHide) return 0;
93
+ if (this.largeVersion) return '27rem';
94
+ if (window.innerWidth > 450 && !this.showTimeline) return '5rem';
95
+ if (window.innerWidth > 450 && this.showTimeline) return '6rem';
96
+ return '3.5rem';
97
+ },
98
+ }),
99
+ },
100
+
101
+ watch: {
102
+ playerHeight(): void {
103
+ this.$emit('hide', 0 === this.playerHeight);
104
+ },
105
+ },
106
+
107
+ methods: {
108
+ onHidden(): void {
109
+ if (this.forceHide) {
110
+ this.$store.commit('playerPlayPodcast');
111
+ this.forceHide = false;
112
+ }
113
+ },
114
+ },
115
+ })
116
+ </script>
117
+
118
+ <style lang="scss">
119
+ .octopus-app{
120
+ .player-container {
121
+ max-height: 94%;
122
+ position: fixed;
123
+ overflow: hidden;
124
+ z-index: 12;
125
+ width: 100%;
126
+ bottom: 0;
127
+ display: flex;
128
+ flex-direction: column;
129
+ transition: height 1s;
130
+ background: #282828 !important;
131
+ font-size: 1rem;
132
+
133
+ .player-progress-border {
134
+ height: 10px;
135
+ width: 3px;
136
+ background: black;
137
+ }
138
+
139
+ @media (max-width: 960px) {
140
+ .d-flex {
141
+ flex-wrap: nowrap !important;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ </style>
@@ -0,0 +1,154 @@
1
+ <template>
2
+ <div
3
+ class="d-flex align-items-center flex-grow-1 ps-2"
4
+ >
5
+ <router-link
6
+ v-if="isImage && podcastImage"
7
+ :to="podcastShareUrl"
8
+ >
9
+ <img
10
+ v-lazy="podcastImage"
11
+ :alt="$t('Podcast image')"
12
+ class="player-image"
13
+ >
14
+ </router-link>
15
+ <button
16
+ v-if="!playerError"
17
+ :title="$t('Play')"
18
+ :class="{
19
+ 'saooti-play': isPaused,
20
+ 'saooti-pause': isPlaying,
21
+ '':!isPaused&&!isPlaying
22
+ }"
23
+ class="btn play-button-box text-light primary-bg"
24
+ @click="switchPausePlay"
25
+ >
26
+ <span
27
+ v-if="!isPaused&&!isPlaying"
28
+ class="spinner-border flex-shrink-0"
29
+ />
30
+ </button>
31
+ <div class="text-light player-grow-content">
32
+ <div class="d-flex mb-1">
33
+ <div
34
+ v-if="playerError"
35
+ class="text-warning mx-2"
36
+ >
37
+ {{ $t('Podcast play error') + ' - ' }}
38
+ </div>
39
+ <div class="flex-grow-1 text-truncate">
40
+ {{ podcastTitle }}
41
+ </div>
42
+ <div
43
+ v-if="!playerError"
44
+ class="hide-phone"
45
+ >
46
+ {{ playedTime }} / {{ totalTime }}
47
+ </div>
48
+ </div>
49
+ <PlayerProgressBar
50
+ :hls-ready="hlsReady"
51
+ :show-timeline="showTimeline"
52
+ :comments="comments"
53
+ :display-alert-bar="displayAlertBar"
54
+ :percent-live-progress="percentLiveProgress"
55
+ :duration-live-position="durationLivePosition"
56
+ :player-error="playerError"
57
+ :listen-time="listenTime"
58
+ @updateNotListenTime="$emit('update:notListenTime', $event)"
59
+ />
60
+ </div>
61
+ <button
62
+ :title="$t('Enlarge')"
63
+ class="btn play-button-box primary-bg text-light saooti-up"
64
+ @click="changePlayerLargeVersion"
65
+ />
66
+ <button
67
+ :title="$t('Close')"
68
+ class="btn play-button-box primary-bg text-light saooti-remove"
69
+ @click="stopPlayer"
70
+ />
71
+ <PlayerTimeline
72
+ v-model:showTimeline="showTimeline"
73
+ :comments="comments"
74
+ />
75
+ </div>
76
+ </template>
77
+ <script lang="ts">
78
+ import { CommentPodcast } from '@/store/class/general/comment';
79
+ import { playerDisplay } from '../../mixins/player/playerDisplay';
80
+ import PlayerProgressBar from './PlayerProgressBar.vue';
81
+ import PlayerTimeline from './PlayerTimeline.vue';
82
+ import { defineComponent } from 'vue';
83
+ export default defineComponent({
84
+ name: 'PlayerCompact',
85
+
86
+ components: {
87
+ PlayerProgressBar,
88
+ PlayerTimeline
89
+ },
90
+ mixins:[playerDisplay],
91
+
92
+ props: {
93
+ playerError: { default: false, type: Boolean},
94
+ notListenTime: { default: 0 , type: Number},
95
+ hlsReady: { default: false , type: Boolean},
96
+ comments: { default: ()=>[] , type: Array as ()=> Array<CommentPodcast> },
97
+ displayAlertBar: { default: false , type: Boolean},
98
+ percentLiveProgress: { default: 0 , type: Number},
99
+ durationLivePosition: { default: 0 , type: Number},
100
+ listenTime: { default: 0 , type: Number},
101
+ },
102
+
103
+ emits: ['stopPlayer', 'update:notListenTime', 'changePlayerLargeVersion'],
104
+ data() {
105
+ return {
106
+ showTimeline: false as boolean,
107
+ };
108
+ },
109
+ methods:{
110
+ stopPlayer(){
111
+ this.$emit('stopPlayer');
112
+ },
113
+ changePlayerLargeVersion(){
114
+ this.$emit('changePlayerLargeVersion');
115
+ }
116
+ }
117
+ })
118
+ </script>
119
+
120
+ <style lang="scss">
121
+ .octopus-app{
122
+ .player-grow-content {
123
+ display: flex;
124
+ flex-direction: column;
125
+ flex-grow: 1;
126
+ flex-shrink: 1;
127
+ overflow: hidden;
128
+ font-size: 0.8rem;
129
+ }
130
+ .player-image {
131
+ border-radius: 0.2rem;
132
+ height: 2.4rem;
133
+ width: 2.4rem;
134
+ cursor: pointer;
135
+ /** PHONES*/
136
+ @media (max-width: 450px) {
137
+ height: 1.8rem;
138
+ width: 1.8rem;
139
+ }
140
+ }
141
+ .play-button-box {
142
+ height: 2.2rem;
143
+ width: 2.2rem;
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ margin: 0 0.5rem;
148
+ border-radius: 50%;
149
+ font-size: 0.7rem !important;
150
+ flex-shrink: 0;
151
+ cursor: pointer;
152
+ }
153
+ }
154
+ </style>
@@ -0,0 +1,166 @@
1
+ <template>
2
+ <div
3
+ class="d-flex flex-column align-items-center my-2 flex-grow-1 text-light position-relative overflow-y-auto"
4
+ >
5
+ <button
6
+ :title="$t('Reduce')"
7
+ class="player-reduce-button btn bg-transparent text-light saooti-down"
8
+ @click="changePlayerLargeVersion"
9
+ />
10
+ <router-link
11
+ v-if="isImage && podcastImage"
12
+ :to="podcastShareUrl"
13
+ >
14
+ <img
15
+ v-lazy="podcastImage"
16
+ :alt="$t('Podcast image')"
17
+ class="img-box"
18
+ >
19
+ </router-link>
20
+ <div class="d-flex w-100 px-2 mt-2 text-center">
21
+ <div
22
+ v-if="playerError"
23
+ class="text-warning mx-2"
24
+ >
25
+ {{ $t('Podcast play error') + ' - ' }}
26
+ </div>
27
+ <div class="flex-grow-1 text-truncate h3">
28
+ {{ podcastTitle }}
29
+ </div>
30
+ </div>
31
+ <div class="player-grow-large-content">
32
+ <PlayerProgressBar
33
+ ref="progressbar"
34
+ :hls-ready="hlsReady"
35
+ :show-timeline="showTimeline"
36
+ :comments="comments"
37
+ :display-alert-bar="displayAlertBar"
38
+ :percent-live-progress="percentLiveProgress"
39
+ :duration-live-position="durationLivePosition"
40
+ :player-error="playerError"
41
+ :listen-time="listenTime"
42
+ @updateNotListenTime="$emit('update:notListenTime', $event)"
43
+ />
44
+ <div class="d-flex justify-content-between">
45
+ <div>{{ playedTime }}</div>
46
+ <div>{{ totalTime }}</div>
47
+ </div>
48
+ </div>
49
+ <div class="d-flex align-items-center">
50
+ <button
51
+ class="btn fs-1 bg-transparent text-light saooti-backward"
52
+ @click="seekClick(-15)"
53
+ />
54
+ <button
55
+ v-if="!playerError"
56
+ :title="$t('Play')"
57
+ :class="{
58
+ 'saooti-play': isPaused,
59
+ 'saooti-pause': isPlaying,
60
+ '':!isPaused&&!isPlaying
61
+ }"
62
+ class="btn play-big-button-box text-light primary-bg"
63
+ @click="switchPausePlay"
64
+ >
65
+ <span
66
+ v-if="!isPaused&&!isPlaying"
67
+ class="spinner-border flex-shrink-0"
68
+ />
69
+ </button>
70
+ <button
71
+ class="btn fs-1 bg-transparent text-light saooti-forward"
72
+ @click="seekClick(15)"
73
+ />
74
+ </div>
75
+ <PlayerTimeline
76
+ v-model:showTimeline="showTimeline"
77
+ :comments="comments"
78
+ />
79
+ </div>
80
+ </template>
81
+ <script lang="ts">
82
+ import { playerDisplay } from '../../mixins/player/playerDisplay';
83
+ import PlayerProgressBar from './PlayerProgressBar.vue';
84
+ import PlayerTimeline from './PlayerTimeline.vue';
85
+ import { defineComponent } from 'vue';
86
+ import { CommentPodcast } from '@/store/class/general/comment';
87
+ export default defineComponent({
88
+ name: 'PlayerLarge',
89
+
90
+ components: {
91
+ PlayerProgressBar,
92
+ PlayerTimeline
93
+ },
94
+ mixins:[playerDisplay],
95
+
96
+ props: {
97
+ playerError: { default: false, type: Boolean},
98
+ notListenTime: { default: 0 , type: Number},
99
+ hlsReady: { default: false , type: Boolean},
100
+ comments: { default: ()=>[] , type: Array as ()=> Array<CommentPodcast> },
101
+ displayAlertBar: { default: false , type: Boolean},
102
+ percentLiveProgress: { default: 0 , type: Number},
103
+ durationLivePosition: { default: 0 , type: Number},
104
+ listenTime: { default: 0 , type: Number},
105
+ },
106
+
107
+ emits: ['stopPlayer', 'update:notListenTime', 'changePlayerLargeVersion'],
108
+ data() {
109
+ return {
110
+ showTimeline: false as boolean,
111
+ };
112
+ },
113
+ methods:{
114
+ stopPlayer(){
115
+ this.$emit('stopPlayer');
116
+ },
117
+ changePlayerLargeVersion(){
118
+ this.$emit('changePlayerLargeVersion');
119
+ },
120
+ seekClick(addTime: number):void{
121
+ const audioPlayer: HTMLAudioElement|null = document.querySelector('#audio-player');
122
+ if(!audioPlayer){return;}
123
+ const seekTo = audioPlayer.currentTime + addTime;
124
+ (this.$refs.progressbar as InstanceType<typeof PlayerProgressBar>).isSeekTo(audioPlayer, seekTo >0?seekTo: 0);
125
+ },
126
+ }
127
+ })
128
+ </script>
129
+
130
+ <style lang="scss">
131
+ .octopus-app{
132
+ .player-container .img-box{
133
+ @media (max-width: 960px) {
134
+ width: 10rem;
135
+ height: 10rem;
136
+ }
137
+ }
138
+ .player-reduce-button{
139
+ position: absolute;
140
+ right: 0;
141
+ font-size: 1.2rem !important;
142
+ }
143
+ .player-grow-large-content{
144
+ width: 100%;
145
+ padding: 1rem 2rem;
146
+ @media (max-width: 960px) {
147
+ padding: 0.5rem;
148
+ }
149
+ .progress, .progress-bar{
150
+ height: 15px !important;
151
+ }
152
+ }
153
+ .play-big-button-box {
154
+ height: 5rem;
155
+ width: 5rem;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ margin: 0 0.5rem;
160
+ border-radius: 50%;
161
+ font-size: 2.5rem !important;
162
+ flex-shrink: 0;
163
+ cursor: pointer;
164
+ }
165
+ }
166
+ </style>