@saooti/octopus-sdk 0.28.16 → 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 (328) hide show
  1. package/README.md +188 -2
  2. package/index.ts +45 -11
  3. package/package.json +46 -48
  4. package/public/config.ts +4 -0
  5. package/public/css/fonts/icomoon.eot +0 -0
  6. package/public/css/fonts/icomoon.svg +129 -0
  7. package/public/css/fonts/icomoon.ttf +0 -0
  8. package/public/css/fonts/icomoon.woff +0 -0
  9. package/public/css/fonts/style.css +185 -1266
  10. package/public/img/403.jpeg +0 -0
  11. package/public/img/404.svg +242 -0
  12. package/public/img/ouest_france_logo.svg +12 -0
  13. package/src/App.vue +45 -24
  14. package/src/api/classicCrud.ts +34 -0
  15. package/src/api/initialize.ts +4 -2
  16. package/src/assets/bootstrap-diff.scss +197 -0
  17. package/src/assets/form.scss +77 -77
  18. package/src/assets/general.scss +287 -301
  19. package/src/assets/live.scss +39 -0
  20. package/src/assets/modal.scss +43 -50
  21. package/src/assets/multiselect.scss +522 -590
  22. package/src/assets/octopus-library.scss +17 -4
  23. package/src/assets/share.scss +150 -250
  24. package/src/assets/transition.scss +98 -2
  25. package/src/components/display/aggregator/RssSection.vue +4 -6
  26. package/src/components/display/categories/CategoryChooser.vue +100 -79
  27. package/src/components/display/categories/CategoryFilter.vue +117 -37
  28. package/src/components/display/categories/CategoryList.vue +121 -108
  29. package/src/components/display/comments/AddCommentModal.vue +98 -94
  30. package/src/components/display/comments/CommentBasicView.vue +95 -0
  31. package/src/components/display/comments/CommentInput.vue +175 -155
  32. package/src/components/display/comments/CommentItem.vue +152 -168
  33. package/src/components/display/comments/CommentList.vue +123 -229
  34. package/src/components/display/comments/CommentParentInfo.vue +26 -58
  35. package/src/components/display/comments/CommentPlayer.vue +51 -49
  36. package/src/components/display/comments/CommentSection.vue +44 -67
  37. package/src/components/display/edit/EditBox.vue +11 -5
  38. package/src/components/display/edit/EditCommentBox.vue +121 -29
  39. package/src/components/display/emission/EmissionChooser.vue +73 -81
  40. package/src/components/display/emission/EmissionInlineList.vue +130 -128
  41. package/src/components/display/emission/EmissionItem.vue +68 -109
  42. package/src/components/display/emission/EmissionList.vue +140 -146
  43. package/src/components/display/emission/EmissionPlayerItem.vue +186 -148
  44. package/src/components/display/filter/AdvancedSearch.vue +192 -273
  45. package/src/components/display/filter/CategoryFilter.vue +51 -59
  46. package/src/components/display/filter/MonetizableFilter.vue +17 -16
  47. package/src/components/display/filter/ProductorSearch.vue +149 -149
  48. package/src/components/display/filter/RubriqueChoice.vue +33 -37
  49. package/src/components/display/filter/RubriqueFilter.vue +132 -122
  50. package/src/components/display/list/ListPaginate.vue +145 -0
  51. package/src/components/display/list/Paginate.vue +218 -0
  52. package/src/components/display/live/CountDown.vue +19 -12
  53. package/src/components/display/live/LiveHorizontalList.vue +78 -55
  54. package/src/components/display/live/LiveItem.vue +136 -121
  55. package/src/components/display/live/LiveList.vue +172 -276
  56. package/src/components/display/organisation/OrganisationChooser.vue +104 -122
  57. package/src/components/display/organisation/OrganisationChooserLight.vue +46 -37
  58. package/src/components/display/participant/ParticipantItem.vue +91 -115
  59. package/src/components/display/participant/ParticipantList.vue +131 -117
  60. package/src/components/display/playlist/PlaylistItem.vue +54 -78
  61. package/src/components/display/playlist/PlaylistList.vue +91 -83
  62. package/src/components/display/playlist/PodcastList.vue +113 -128
  63. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +191 -0
  64. package/src/components/display/podcasts/AnimatorsItem.vue +28 -39
  65. package/src/components/display/podcasts/ParticipantDescription.vue +62 -74
  66. package/src/components/display/podcasts/PodcastFilterList.vue +47 -89
  67. package/src/components/display/podcasts/PodcastImage.vue +195 -229
  68. package/src/components/display/podcasts/PodcastInlineList.vue +64 -282
  69. package/src/components/display/podcasts/PodcastInlineListClassic.vue +240 -0
  70. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +167 -0
  71. package/src/components/display/podcasts/PodcastItem.vue +93 -227
  72. package/src/components/display/podcasts/PodcastItemInfo.vue +166 -0
  73. package/src/components/display/podcasts/PodcastList.vue +115 -134
  74. package/src/components/display/podcasts/PodcastModuleBox.vue +234 -0
  75. package/src/components/display/podcasts/PodcastPlayBar.vue +101 -0
  76. package/src/components/display/podcasts/PodcastSwiperList.vue +204 -0
  77. package/src/components/display/podcasts/TagList.vue +60 -39
  78. package/src/components/display/rubriques/RubriqueChooser.vue +114 -95
  79. package/src/components/display/rubriques/RubriqueList.vue +111 -106
  80. package/src/components/display/sharing/PlayerParameters.vue +90 -151
  81. package/src/components/display/sharing/QrCode.vue +40 -27
  82. package/src/components/display/sharing/ShareButtons.vue +64 -299
  83. package/src/components/display/sharing/ShareButtonsIntern.vue +225 -0
  84. package/src/components/display/sharing/ShareDistribution.vue +99 -140
  85. package/src/components/display/sharing/SharePlayer.vue +155 -370
  86. package/src/components/display/sharing/SharePlayerColors.vue +78 -0
  87. package/src/components/display/sharing/SharePlayerTypes.vue +112 -0
  88. package/src/components/display/sharing/SplitButton.vue +42 -0
  89. package/src/components/display/sharing/SubscribeButtons.vue +62 -179
  90. package/src/components/display/studio/RecordingItemButton.vue +4 -6
  91. package/src/components/form/ClassicCheckbox.vue +66 -0
  92. package/src/components/form/ClassicLoading.vue +28 -0
  93. package/src/components/form/ClassicRadio.vue +66 -0
  94. package/src/components/form/ClassicSearch.vue +86 -0
  95. package/src/components/form/ClassicSelect.vue +65 -0
  96. package/src/components/misc/ErrorMessage.vue +27 -14
  97. package/src/components/misc/Footer.vue +132 -127
  98. package/src/components/misc/HomeDropdown.vue +93 -150
  99. package/src/components/misc/LeftMenu.vue +121 -192
  100. package/src/components/misc/Popover.vue +118 -0
  101. package/src/components/misc/Snackbar.vue +70 -35
  102. package/src/components/misc/TopBar.vue +192 -308
  103. package/src/components/misc/modal/ClipboardModal.vue +35 -50
  104. package/src/components/misc/modal/MessageModal.vue +71 -48
  105. package/src/components/misc/modal/NewsletterModal.vue +260 -231
  106. package/src/components/misc/modal/QrCodeModal.vue +42 -60
  107. package/src/components/misc/modal/ShareModalPlayer.vue +136 -70
  108. package/src/components/misc/player/Player.vue +146 -0
  109. package/src/components/misc/player/PlayerCompact.vue +154 -0
  110. package/src/components/misc/player/PlayerLarge.vue +166 -0
  111. package/src/components/misc/player/PlayerProgressBar.vue +112 -0
  112. package/src/components/misc/player/PlayerTimeline.vue +61 -0
  113. package/src/components/mixins/functions.ts +11 -43
  114. package/src/components/mixins/handle403.ts +17 -0
  115. package/src/components/mixins/init.ts +8 -6
  116. package/src/components/mixins/orgaComputed.ts +15 -0
  117. package/src/components/mixins/organisationFilter.ts +35 -18
  118. package/src/components/mixins/player/playerComment.ts +98 -0
  119. package/src/components/mixins/player/playerDisplay.ts +113 -0
  120. package/src/components/mixins/player/playerLive.ts +111 -0
  121. package/src/components/mixins/player/playerLogic.ts +225 -0
  122. package/src/components/mixins/tagOfMixins.ts +19 -0
  123. package/src/components/pages/Category.vue +21 -26
  124. package/src/components/pages/Emission.vue +136 -162
  125. package/src/components/pages/Emissions.vue +60 -93
  126. package/src/components/pages/Error403Page.vue +60 -0
  127. package/src/components/pages/Home.vue +32 -39
  128. package/src/components/pages/Lives.vue +40 -46
  129. package/src/components/pages/PageNotFound.vue +55 -0
  130. package/src/components/pages/Participant.vue +110 -113
  131. package/src/components/pages/Participants.vue +21 -45
  132. package/src/components/pages/Playlist.vue +84 -75
  133. package/src/components/pages/Playlists.vue +29 -47
  134. package/src/components/pages/Podcast.vue +203 -434
  135. package/src/components/pages/Podcasts.vue +75 -134
  136. package/src/components/pages/Rubrique.vue +21 -29
  137. package/src/components/pages/Search.vue +33 -79
  138. package/src/helper/dom.ts +1 -1
  139. package/src/helper/duration.ts +1 -1
  140. package/src/helper/useEventListener.ts +18 -0
  141. package/src/i18n.ts +36 -0
  142. package/src/locale/de.ts +309 -0
  143. package/src/locale/educationen.ts +1 -1
  144. package/src/locale/educationfr.ts +1 -1
  145. package/src/locale/en.ts +45 -28
  146. package/src/locale/es.ts +309 -0
  147. package/src/locale/fr.ts +25 -8
  148. package/src/locale/it.ts +307 -0
  149. package/src/locale/messages.ts +9 -2
  150. package/src/locale/sl.ts +309 -0
  151. package/src/main.ts +59 -85
  152. package/src/router/router.ts +60 -39
  153. package/src/sass/_variables.scss +10 -8
  154. package/src/shims-tsx.d.ts +2 -0
  155. package/src/shims-vue-recaptcha-v3.d.ts +9 -0
  156. package/src/shims-vue.d.ts +5 -4
  157. package/src/store/AppStore.ts +8 -9
  158. package/src/store/class/adserver/adserverConfig.ts +9 -0
  159. package/src/store/class/adserver/adserverOtherEmission.ts +13 -0
  160. package/src/store/class/adserver/adserverTiming.ts +10 -0
  161. package/src/store/class/cartouchier/cartouche.ts +15 -0
  162. package/src/store/class/cartouchier/cartouchier.ts +9 -0
  163. package/src/store/class/conference/conference.ts +35 -0
  164. package/src/store/class/conference/conferenceMessage.ts +10 -0
  165. package/src/store/class/conference/conferenceParticipant.ts +18 -0
  166. package/src/store/class/conference/pad.ts +15 -0
  167. package/src/store/class/conference/studioCall.ts +7 -0
  168. package/src/store/class/contract/contract.ts +7 -0
  169. package/src/store/class/contract/contractOrganisation.ts +7 -0
  170. package/src/store/class/ftp/ftpEmission.ts +41 -0
  171. package/src/store/class/ftp/ftpParam.ts +12 -0
  172. package/src/store/class/ftp/testFtpEmission.ts +5 -0
  173. package/src/store/class/general/audioView.ts +21 -0
  174. package/src/store/class/general/category.ts +10 -0
  175. package/src/store/class/general/comment.ts +16 -0
  176. package/src/store/class/general/customPlayer.ts +9 -0
  177. package/src/store/class/general/emission.ts +23 -0
  178. package/src/store/class/general/fetchParam.ts +3 -0
  179. package/src/store/class/general/initState.ts +25 -0
  180. package/src/store/class/general/interfacePageable.ts +16 -0
  181. package/src/store/class/general/ituneCategory.ts +5 -0
  182. package/src/store/class/general/media.ts +14 -0
  183. package/src/store/class/general/organisation.ts +20 -0
  184. package/src/store/class/general/pageable.ts +13 -0
  185. package/src/store/class/general/participant.ts +12 -0
  186. package/src/store/class/{player.ts → general/player.ts} +5 -3
  187. package/src/store/class/general/playlist.ts +13 -0
  188. package/src/store/class/general/podcast.ts +43 -0
  189. package/src/store/class/general/sortPageable.ts +5 -0
  190. package/src/store/class/general/soundcastCategory.ts +8 -0
  191. package/src/store/class/ouestFrance/ofTag.ts +36 -0
  192. package/src/store/class/ouestFrance/ofTagInfo.ts +9 -0
  193. package/src/store/class/ouestFrance/ofTagPage.ts +7 -0
  194. package/src/store/class/ouestFrance/ofTagSeo.ts +7 -0
  195. package/src/store/class/ouestFrance/ofTagVente.ts +6 -0
  196. package/src/store/class/ouestFrance/ofTagWithParents.ts +26 -0
  197. package/src/store/class/rss/aggregator.ts +28 -0
  198. package/src/store/class/rss/rssEmission.ts +14 -0
  199. package/src/store/class/rss/rssInfo.ts +8 -0
  200. package/src/store/class/rubrique/rubriquage.ts +10 -0
  201. package/src/store/class/rubrique/rubriquageFilter.ts +6 -0
  202. package/src/store/class/rubrique/rubrique.ts +9 -0
  203. package/src/store/class/stat/statArrayIncome.ts +6 -0
  204. package/src/store/class/stat/statArrayObject.ts +34 -0
  205. package/src/store/class/stat/statGraph.ts +7 -0
  206. package/src/store/class/user/person.ts +15 -0
  207. package/src/store/class/user/profile.ts +12 -0
  208. package/src/store/class/user/userKeycloak.ts +24 -0
  209. package/src/store/paramStore.ts +221 -241
  210. package/src/store/typeAppStore.ts +45 -28
  211. package/src/vuex-shim.d.ts +8 -0
  212. package/tsconfig.json +2 -1
  213. package/vue.config.js +3 -1
  214. package/public/css/fonts/saooti-ui.eot +0 -0
  215. package/public/css/fonts/saooti-ui.svg +0 -840
  216. package/public/css/fonts/saooti-ui.ttf +0 -0
  217. package/public/css/fonts/saooti-ui.woff +0 -0
  218. package/public/css/fonts/stitcher-logo.svg +0 -83
  219. package/public/img/article.png +0 -0
  220. package/src/api/comments.ts +0 -7
  221. package/src/api/emissions.ts +0 -7
  222. package/src/api/podcasts.ts +0 -7
  223. package/src/api/profile.ts +0 -8
  224. package/src/api/studio.ts +0 -8
  225. package/src/assets/bootstrap_scss/_alert.scss +0 -51
  226. package/src/assets/bootstrap_scss/_badge.scss +0 -54
  227. package/src/assets/bootstrap_scss/_breadcrumb.scss +0 -42
  228. package/src/assets/bootstrap_scss/_button-group.scss +0 -164
  229. package/src/assets/bootstrap_scss/_buttons.scss +0 -298
  230. package/src/assets/bootstrap_scss/_card.scss +0 -278
  231. package/src/assets/bootstrap_scss/_carousel.scss +0 -197
  232. package/src/assets/bootstrap_scss/_close.scss +0 -41
  233. package/src/assets/bootstrap_scss/_code.scss +0 -48
  234. package/src/assets/bootstrap_scss/_custom-forms.scss +0 -522
  235. package/src/assets/bootstrap_scss/_dropdown.scss +0 -201
  236. package/src/assets/bootstrap_scss/_forms.scss +0 -352
  237. package/src/assets/bootstrap_scss/_functions.scss +0 -134
  238. package/src/assets/bootstrap_scss/_grid.scss +0 -69
  239. package/src/assets/bootstrap_scss/_images.scss +0 -42
  240. package/src/assets/bootstrap_scss/_input-group.scss +0 -191
  241. package/src/assets/bootstrap_scss/_jumbotron.scss +0 -17
  242. package/src/assets/bootstrap_scss/_list-group.scss +0 -158
  243. package/src/assets/bootstrap_scss/_media.scss +0 -8
  244. package/src/assets/bootstrap_scss/_mixins.scss +0 -47
  245. package/src/assets/bootstrap_scss/_modal.scss +0 -243
  246. package/src/assets/bootstrap_scss/_nav.scss +0 -120
  247. package/src/assets/bootstrap_scss/_navbar.scss +0 -324
  248. package/src/assets/bootstrap_scss/_pagination.scss +0 -74
  249. package/src/assets/bootstrap_scss/_popover.scss +0 -170
  250. package/src/assets/bootstrap_scss/_print.scss +0 -141
  251. package/src/assets/bootstrap_scss/_progress.scss +0 -46
  252. package/src/assets/bootstrap_scss/_reboot.scss +0 -482
  253. package/src/assets/bootstrap_scss/_root.scss +0 -20
  254. package/src/assets/bootstrap_scss/_spinners.scss +0 -55
  255. package/src/assets/bootstrap_scss/_tables.scss +0 -185
  256. package/src/assets/bootstrap_scss/_toasts.scss +0 -44
  257. package/src/assets/bootstrap_scss/_tooltip.scss +0 -115
  258. package/src/assets/bootstrap_scss/_transitions.scss +0 -20
  259. package/src/assets/bootstrap_scss/_type.scss +0 -125
  260. package/src/assets/bootstrap_scss/_utilities.scss +0 -17
  261. package/src/assets/bootstrap_scss/_variables.scss +0 -1145
  262. package/src/assets/bootstrap_scss/bootstrap-grid.scss +0 -29
  263. package/src/assets/bootstrap_scss/bootstrap-reboot.scss +0 -12
  264. package/src/assets/bootstrap_scss/bootstrap.scss +0 -44
  265. package/src/assets/bootstrap_scss/mixins/_alert.scss +0 -13
  266. package/src/assets/bootstrap_scss/mixins/_background-variant.scss +0 -22
  267. package/src/assets/bootstrap_scss/mixins/_badge.scss +0 -17
  268. package/src/assets/bootstrap_scss/mixins/_border-radius.scss +0 -63
  269. package/src/assets/bootstrap_scss/mixins/_box-shadow.scss +0 -20
  270. package/src/assets/bootstrap_scss/mixins/_breakpoints.scss +0 -123
  271. package/src/assets/bootstrap_scss/mixins/_buttons.scss +0 -110
  272. package/src/assets/bootstrap_scss/mixins/_caret.scss +0 -62
  273. package/src/assets/bootstrap_scss/mixins/_clearfix.scss +0 -7
  274. package/src/assets/bootstrap_scss/mixins/_deprecate.scss +0 -10
  275. package/src/assets/bootstrap_scss/mixins/_float.scss +0 -14
  276. package/src/assets/bootstrap_scss/mixins/_forms.scss +0 -177
  277. package/src/assets/bootstrap_scss/mixins/_gradients.scss +0 -45
  278. package/src/assets/bootstrap_scss/mixins/_grid-framework.scss +0 -71
  279. package/src/assets/bootstrap_scss/mixins/_grid.scss +0 -69
  280. package/src/assets/bootstrap_scss/mixins/_hover.scss +0 -37
  281. package/src/assets/bootstrap_scss/mixins/_image.scss +0 -36
  282. package/src/assets/bootstrap_scss/mixins/_list-group.scss +0 -21
  283. package/src/assets/bootstrap_scss/mixins/_lists.scss +0 -7
  284. package/src/assets/bootstrap_scss/mixins/_nav-divider.scss +0 -11
  285. package/src/assets/bootstrap_scss/mixins/_pagination.scss +0 -22
  286. package/src/assets/bootstrap_scss/mixins/_reset-text.scss +0 -17
  287. package/src/assets/bootstrap_scss/mixins/_resize.scss +0 -6
  288. package/src/assets/bootstrap_scss/mixins/_screen-reader.scss +0 -34
  289. package/src/assets/bootstrap_scss/mixins/_size.scss +0 -7
  290. package/src/assets/bootstrap_scss/mixins/_table-row.scss +0 -39
  291. package/src/assets/bootstrap_scss/mixins/_text-emphasis.scss +0 -17
  292. package/src/assets/bootstrap_scss/mixins/_text-hide.scss +0 -11
  293. package/src/assets/bootstrap_scss/mixins/_text-truncate.scss +0 -8
  294. package/src/assets/bootstrap_scss/mixins/_transition.scss +0 -16
  295. package/src/assets/bootstrap_scss/mixins/_visibility.scss +0 -8
  296. package/src/assets/bootstrap_scss/utilities/_align.scss +0 -8
  297. package/src/assets/bootstrap_scss/utilities/_background.scss +0 -19
  298. package/src/assets/bootstrap_scss/utilities/_borders.scss +0 -75
  299. package/src/assets/bootstrap_scss/utilities/_clearfix.scss +0 -3
  300. package/src/assets/bootstrap_scss/utilities/_display.scss +0 -26
  301. package/src/assets/bootstrap_scss/utilities/_embed.scss +0 -39
  302. package/src/assets/bootstrap_scss/utilities/_flex.scss +0 -51
  303. package/src/assets/bootstrap_scss/utilities/_float.scss +0 -11
  304. package/src/assets/bootstrap_scss/utilities/_overflow.scss +0 -5
  305. package/src/assets/bootstrap_scss/utilities/_position.scss +0 -32
  306. package/src/assets/bootstrap_scss/utilities/_screenreaders.scss +0 -11
  307. package/src/assets/bootstrap_scss/utilities/_shadows.scss +0 -6
  308. package/src/assets/bootstrap_scss/utilities/_sizing.scss +0 -20
  309. package/src/assets/bootstrap_scss/utilities/_spacing.scss +0 -73
  310. package/src/assets/bootstrap_scss/utilities/_stretched-link.scss +0 -19
  311. package/src/assets/bootstrap_scss/utilities/_text.scss +0 -72
  312. package/src/assets/bootstrap_scss/utilities/_visibility.scss +0 -13
  313. package/src/assets/bootstrap_scss/vendor/_rfs.scss +0 -204
  314. package/src/components/misc/Player.vue +0 -772
  315. package/src/store/class/category.ts +0 -8
  316. package/src/store/class/comment.ts +0 -17
  317. package/src/store/class/conference.ts +0 -27
  318. package/src/store/class/customPlayer.ts +0 -8
  319. package/src/store/class/emission.ts +0 -20
  320. package/src/store/class/media.ts +0 -13
  321. package/src/store/class/organisation.ts +0 -19
  322. package/src/store/class/participant.ts +0 -12
  323. package/src/store/class/person.ts +0 -13
  324. package/src/store/class/playlist.ts +0 -15
  325. package/src/store/class/podcast.ts +0 -37
  326. package/src/store/class/rubriquage.ts +0 -9
  327. package/src/store/class/rubriquageFilter.ts +0 -5
  328. package/src/store/class/rubrique.ts +0 -8
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div>
3
- <div class="module-box text-center-mobile">
3
+ <div class="module-box text-center-mobile overflow-visible">
4
4
  <h3>{{ $t('Embed') }}</h3>
5
5
  <template v-if="!exclusive && (authenticated || notExclusive)">
6
6
  <div class="d-flex flex-column align-items-center">
@@ -16,139 +16,48 @@
16
16
  :src="iFrameSrc"
17
17
  scrolling="no"
18
18
  frameborder="0"
19
- :width="iFrameWidth"
19
+ width="100%"
20
20
  :height="iFrameHeight"
21
- class="maxIframe"
22
- ></iframe>
23
- <div class="d-flex flex-column">
24
- <button class="btn mb-3" @click="isShareModal = true">
25
- {{ $t('Share the player') }}
26
- </button>
27
- <template v-if="!isLiveReadyToRecord">
28
- <label
29
- for="iframe-select"
30
- class="d-inline"
31
- aria-label="select miniplayer"
32
- ></label>
33
- <select
34
- v-model="iFrameModel"
35
- id="iframe-select"
36
- class="frame-select input-no-outline"
37
- >
38
- <option value="default">{{ $t('Default version') }}</option>
39
- <option value="large">{{ $t('Large version') }}</option>
40
- <template v-if="isBeta">
41
- <option
42
- v-for="player in customPlayersDisplay" :key="player.customId"
43
- :value="player.customId"
44
-
45
- >{{ $t('Custom version') + " «" +player.name+"»" }}</option>
46
- </template>
47
- <option value="emission" v-if="podcast && podcast.podcastId">{{
48
- $t('Emission version')
49
- }}</option>
50
- <option
51
- value="largeEmission"
52
- v-if="podcast && podcast.podcastId"
53
- >{{ $t('Large emission version') }}</option
54
- >
55
- <option
56
- value="largeSuggestion"
57
- v-if="podcast && podcast.podcastId"
58
- >{{ $t('Large suggestion version') }}</option
59
- >
60
- </select>
61
- </template>
62
- </div>
63
- <div class="d-flex justify-content-around mt-3 flex-grow w-100">
64
- <div class="d-flex flex-column align-items-center flex-shrink mr-3">
65
- <div class="font-weight-600">{{ $t('Choose color') }}</div>
66
- <swatches
67
- v-model="color"
68
- class="c-hand input-no-outline"
69
- show-fallback
70
- colors="text-advanced"
71
- popover-to="right"
72
- :data-color="color"
73
- ></swatches>
74
- </div>
75
- <div class="d-flex flex-column align-items-center">
76
- <div class="font-weight-600">{{ $t('Choose theme') }}</div>
77
- <div class="d-flex" v-if="!isBeta">
78
- <swatches v-for="color in colors" :key="color" v-model="theme" :data-theme="theme"
79
- class="c-hand input-no-outline mr-1"
80
- :swatch-style="{
81
- padding: '0px 0px',
82
- marginRight: '0px',
83
- marginBottom: '0px',
84
- border: '1px gray solid',
85
- }"
86
- :wrapper-style="{
87
- paddingTop: '0px',
88
- paddingLeft: '0px',
89
- paddingRight: '0px',
90
- paddingBottom: '0px',
91
- }"
92
- :colors="[color]"
93
- inline
94
- ></swatches>
95
- </div>
96
- <swatches
97
- v-model="themeBeta"
98
- class="c-hand input-no-outline"
99
- show-fallback
100
- colors="text-advanced"
101
- popover-to="right"
102
- :data-color="themeBeta"
103
- v-else
104
- ></swatches>
105
- </div>
106
- </div>
107
- <div class="checkbox-saooti" v-if="displayBetaChoice">
108
- <input
109
- type="checkbox"
110
- class="custom-control-input"
111
- id="isBetaCheckbox"
112
- v-model="isBeta"
113
- />
114
- <label
115
- class="custom-control-label mr-2"
116
- for="isBetaCheckbox"
117
- >{{ $t('Use beta version') }}</label
118
- >
119
- </div>
120
- <div
121
- class="d-flex align-items-center flex-wrap"
21
+ class="max-iframe my-2"
22
+ />
23
+ <SharePlayerTypes
24
+ v-if="!isLiveReadyToRecord"
25
+ v-model:iFrameModel="iFrameModel"
26
+ :podcast="podcast"
27
+ :emission="emission"
28
+ :playlist="playlist"
29
+ :organisation-id="organisationId"
30
+ />
31
+ <SharePlayerColors
32
+ v-model:color="color"
33
+ v-model:theme="theme"
34
+ />
35
+ <ClassicCheckbox
122
36
  v-if="isPodcastNotVisible || playlist"
123
- >
124
- <div class="checkbox-saooti">
125
- <input
126
- type="checkbox"
127
- class="custom-control-input"
128
- id="isVisibleCheckbox"
129
- v-model="isVisible"
130
- />
131
- <label
132
- class="custom-control-label mr-2"
133
- for="isVisibleCheckbox"
134
- >{{ titleStillAvailable }}</label
135
- >
136
- </div>
137
- </div>
37
+ v-model:textInit="isVisible"
38
+ id-checkbox="is-visible-checkbox"
39
+ :label="titleStillAvailable"
40
+ />
138
41
  </div>
139
42
  <PlayerParameters
140
43
  v-if="isPlayerParameter"
141
- :podcast="podcast"
142
- :playlist="playlist"
143
- :iFrameModel="iFrameModel"
144
- :isVisible="isVisible"
145
- @displayArticle="updateDisplayArticle"
146
- @episodeNumbers="updateEpisodeNumber"
147
- @proceedReading="updateProceedReading"
148
- @isVisible="updateIsVisible"
149
- @iFrameNumber="updateIframeNumber"
150
- @startTime="updateStartTime"
44
+ :is-visible="isVisible"
45
+ :chose-number-episode="displayChoiceAllEpisodes|| isLargeSuggestion"
46
+ :display-choice-all-episodes="displayChoiceAllEpisodes"
47
+ @displayArticle="displayArticle = $event"
48
+ @episodeNumbers="episodeNumbers = $event"
49
+ @proceedReading="proceedReading = $event"
50
+ @isVisible="isVisible = $event"
51
+ @iFrameNumber="iFrameNumber = $event"
151
52
  />
53
+ <div class="d-flex flex-column align-items-center mt-3">
54
+ <button
55
+ class="btn btn-primary mb-3"
56
+ @click="isShareModal = true"
57
+ >
58
+ {{ $t('Share the player') }}
59
+ </button>
60
+ </div>
152
61
  </template>
153
62
  <div v-else-if="exclusive && authenticated">
154
63
  {{ $t('Only organisation members can share the content') }}
@@ -159,62 +68,44 @@
159
68
  </div>
160
69
  <ShareModalPlayer
161
70
  v-if="isShareModal"
71
+ :embed-link="iFrame"
72
+ :embedly-link="iFrameSrc"
73
+ :direct-link="podcast"
162
74
  @close="isShareModal = false"
163
- :embedLink="iFrame"
164
- :embedlyLink="iFrameSrc"
165
- :directLink="podcast"
166
- ></ShareModalPlayer>
75
+ />
167
76
  </div>
168
77
  </template>
169
78
 
170
- <style lang="scss">
171
- @import '../../../sass/_variables.scss';
172
- .sticker {
173
- align-self: center;
174
- background: rgba($octopus-primary-color, 0.3);
175
- padding: 0.5rem;
176
- transition: all 0.5s ease;
177
- color: #41403e;
178
- letter-spacing: 1px;
179
- outline: none;
180
- box-shadow: 10px 10px 34px -15px hsla(0, 0%, 0%, 0.4);
181
- border-radius: 255px 15px 225px 15px/15px 225px 15px 255px;
182
- border: solid 2px #41403e;
183
- &:hover {
184
- box-shadow: 2px 8px 4px -6px hsla(0, 0%, 0%, 0.3);
185
- }
186
- }
187
- .maxIframe {
188
- max-width: 300px;
189
- }
190
- </style>
191
-
192
79
  <script lang="ts">
80
+ import { orgaComputed } from '../../mixins/orgaComputed';
193
81
  import { state } from '../../../store/paramStore';
194
- //@ts-ignore
195
- import Swatches from 'vue-swatches';
196
- import 'vue-swatches/dist/vue-swatches.min.css';
197
- import profileApi from '@/api/profile';
198
- const octopusApi = require('@saooti/octopus-api');
199
- import Vue from 'vue';
200
- import { Podcast } from '@/store/class/podcast';
201
- import { Emission } from '@/store/class/emission';
202
- import { Playlist } from '@/store/class/playlist';
203
- import { CustomPlayer } from '@/store/class/customPlayer';
204
- export default Vue.extend({
205
- props: {
206
- podcast: { default: undefined as Podcast|undefined},
207
- emission: { default: undefined as Emission|undefined},
208
- playlist: { default: undefined as Playlist|undefined},
209
- organisationId: { default: undefined as string|undefined},
210
- isEducation: { default: false as boolean},
211
- exclusive: { default: false as boolean},
212
- notExclusive: { default: true as boolean},
213
- },
82
+ import octopusApi from '@saooti/octopus-api';
83
+ import { Podcast } from '@/store/class/general/podcast';
84
+ import { Emission } from '@/store/class/general/emission';
85
+ import { Playlist } from '@/store/class/general/playlist';
86
+ import { defineComponent, defineAsyncComponent } from 'vue';
87
+ const ShareModalPlayer = defineAsyncComponent(() => import('../../misc/modal/ShareModalPlayer.vue'));
88
+ const PlayerParameters = defineAsyncComponent(() => import('./PlayerParameters.vue'));
89
+ const SharePlayerTypes = defineAsyncComponent(() => import('./SharePlayerTypes.vue'));
90
+ const SharePlayerColors = defineAsyncComponent(() => import('./SharePlayerColors.vue'));
91
+ const ClassicCheckbox = defineAsyncComponent(() => import('../../form/ClassicCheckbox.vue'));
92
+ export default defineComponent({
214
93
  components: {
215
- ShareModalPlayer: () => import('../../misc/modal/ShareModalPlayer.vue'),
216
- Swatches,
217
- PlayerParameters: () => import('./PlayerParameters.vue'),
94
+ ShareModalPlayer,
95
+ SharePlayerColors,
96
+ PlayerParameters,
97
+ SharePlayerTypes,
98
+ ClassicCheckbox
99
+ },
100
+ mixins:[orgaComputed],
101
+ props: {
102
+ podcast: { default: undefined, type: Object as ()=> Podcast},
103
+ emission: { default: undefined, type: Object as ()=> Emission},
104
+ playlist: { default: undefined, type: Object as ()=> Playlist},
105
+ organisationId: { default: undefined, type: String},
106
+ isEducation: { default: false, type: Boolean},
107
+ exclusive: { default: false, type: Boolean},
108
+ notExclusive: { default: true, type: Boolean},
218
109
  },
219
110
 
220
111
  data() {
@@ -223,51 +114,33 @@ export default Vue.extend({
223
114
  isShareModal: false as boolean,
224
115
  color: '#40a372' as string,
225
116
  theme: '#000000' as string,
226
- themeBeta: '#000000' as string,
227
117
  proceedReading: true as boolean,
228
118
  episodeNumbers: 'number' as string,
229
119
  iFrameNumber: '3' as string,
230
- startTime: 0 as number,
231
120
  isVisible: false as boolean,
232
121
  displayArticle: true as boolean,
233
- displayBetaChoice: false as boolean,
234
- customPlayers: [] as Array<CustomPlayer>,
235
- isBeta: false as boolean,
236
122
  colors: ['#000000', '#ffffff'],
237
123
  };
238
124
  },
239
- async created() {
240
- await this.initColor();
241
- if (this.isLiveReadyToRecord) {
242
- this.iFrameModel = 'large';
243
- }
244
- },
245
125
 
246
126
  computed: {
247
- customPlayersDisplay(): Array<CustomPlayer>{
248
- return this.customPlayers.filter((player: CustomPlayer)=>{
249
- return (('EPISODE' === player.typePlayer ||'SUGGESTION' === player.typePlayer) && this.podcast && this.podcast.podcastId) ||
250
- ('EMISSION' === player.typePlayer && this.emission && !this.podcast)|| ('PLAYLIST' === player.typePlayer && this.playlist );
251
- });
127
+ displayChoiceAllEpisodes():boolean{
128
+ return !this.podcast || this.isEmission || this.isLargeEmission;
252
129
  },
253
- miniplayerBaseUrl(): string{
254
- if(this.isBeta){
255
- return state.podcastPage.MiniplayerBetaUri;
256
- }
257
- return state.podcastPage.MiniplayerUri;
130
+ baseUrl(): string{
131
+ return (state.podcastPage.MiniplayerUri as string);
258
132
  },
259
133
  isEmission(): boolean {
260
134
  return 'emission' === this.iFrameModel;
261
135
  },
262
136
  isLargeEmission(): boolean {
263
- return 'largeEmission' === this.iFrameModel;
137
+ return 'emissionLarge' === this.iFrameModel;
264
138
  },
265
139
  isLargeSuggestion(): boolean {
266
140
  return 'largeSuggestion' === this.iFrameModel;
267
141
  },
268
142
  titleStillAvailable(): string {
269
- if (this.isPodcastNotVisible) return this.$t('Podcast still available').toString();
270
- return this.$t('Podcasts still available').toString();
143
+ return this.isPodcastNotVisible ?this.$t('Podcast still available') : this.$t('Podcasts still available');
271
144
  },
272
145
  isLiveReadyToRecord(): boolean {
273
146
  if (this.podcast)
@@ -279,148 +152,90 @@ export default Vue.extend({
279
152
  return false;
280
153
  },
281
154
  noAd(): boolean {
282
- if (
283
- (this.podcast &&
284
- this.podcast.organisation.id !== this.organisationId &&
285
- 'NO' === this.podcast.monetisable) ||
286
- (this.podcast &&
287
- 'UNDEFINED' === this.podcast.monetisable &&
288
- 'NO' === this.podcast.emission.monetisable)
289
- ) {
290
- return true;
291
- }
292
- return false;
293
- },
294
- authenticated(): boolean {
295
- return state.generalParameters.authenticated;
155
+ return (this.podcast?.organisation.id !== this.organisationId &&
156
+ 'NO' === this.podcast?.monetisable) ||
157
+ ('UNDEFINED' === this.podcast?.monetisable &&
158
+ 'NO' === this.podcast?.emission.monetisable);
296
159
  },
297
160
  iFrameSrc(): string {
298
161
  const url = [''];
299
- let iFrameNumber = '/' + this.iFrameNumber;
300
- if (
301
- (!this.podcast || this.isEmission || this.isLargeEmission) &&
302
- 'all' === this.episodeNumbers
303
- ) {
304
- iFrameNumber = '/0';
305
- }
306
- if (!this.podcast && !this.playlist) {
307
- if ('default' === this.iFrameModel) {
308
- url.push(
309
- `${this.miniplayerBaseUrl}miniplayer/emission/${this.emission.emissionId}${iFrameNumber}`
310
- );
311
- }else if('large' === this.iFrameModel) {
312
- url.push(
313
- `${this.miniplayerBaseUrl}miniplayer/emissionLarge/${this.emission.emissionId}${iFrameNumber}`
314
- );
315
- }
316
- else {
317
- url.push(
318
- `${this.miniplayerBaseUrl}miniplayer/${this.iFrameModel}/${this.emission.emissionId}${iFrameNumber}`
319
- );
162
+ let iFrameNumber = this.displayChoiceAllEpisodes && 'all' === this.episodeNumbers ? '/0' : '/' + this.iFrameNumber;
163
+ url.push(`${this.baseUrl}miniplayer/`);
164
+ if (!this.podcast && !this.playlist && this.emission) {
165
+ switch (this.iFrameModel) {
166
+ case 'default': url.push('emission'); break;
167
+ case 'large': url.push('emissionLarge'); break;
168
+ default: url.push(`${this.iFrameModel}`);break;
320
169
  }
170
+ url.push(`/${this.emission.emissionId}${iFrameNumber}`);
321
171
  } else if (this.playlist) {
322
- if ('default' === this.iFrameModel) {
323
- url.push(
324
- `${this.miniplayerBaseUrl}miniplayer/playlist/${this.playlist.playlistId}`
325
- );
326
- } else if('large' === this.iFrameModel) {
327
- url.push(
328
- `${this.miniplayerBaseUrl}miniplayer/playlistLarge/${this.playlist.playlistId}`
329
- );
330
- }else {
331
- url.push(
332
- `${this.miniplayerBaseUrl}miniplayer/${this.iFrameModel}/${this.playlist.playlistId}`
333
- );
172
+ switch (this.iFrameModel) {
173
+ case 'default': url.push('playlist'); break;
174
+ case 'large': url.push('playlistLarge'); break;
175
+ default: url.push(`${this.iFrameModel}`);break;
334
176
  }
335
- } else {
177
+ url.push(`/${this.playlist.playlistId}`);
178
+ } else if(this.emission && this.podcast){
179
+ url.push(`${this.iFrameModel}/`);
336
180
  if (this.isEmission || this.isLargeEmission) {
337
- url.push(
338
- `${this.miniplayerBaseUrl}miniplayer/${this.iFrameModel}/${this.emission.emissionId}${iFrameNumber}/${this.podcast.podcastId}`
339
- );
181
+ url.push(`${this.emission.emissionId}${iFrameNumber}/${this.podcast.podcastId}`);
340
182
  } else if (this.isLargeSuggestion) {
341
- url.push(
342
- `${this.miniplayerBaseUrl}miniplayer/${this.iFrameModel}/${this.podcast.podcastId}${iFrameNumber}`
343
- );
183
+ url.push(`${this.podcast.podcastId}${iFrameNumber}`);
344
184
  } else {
345
- url.push(
346
- `${this.miniplayerBaseUrl}miniplayer/${this.iFrameModel}/${this.podcast.podcastId}`
347
- );
185
+ url.push(`${this.podcast.podcastId}`);
348
186
  }
349
187
  }
350
188
  url.push('?distributorId=' + this.organisationId);
351
- const theme = this.isBeta ? this.themeBeta : this.theme;
352
- url.push(
353
- '&color=' +
354
- this.color.substring(1) +
355
- '&theme=' +
356
- theme.substring(1)
357
- );
189
+ url.push(`&color=${this.color.substring(1)}&theme=${this.theme.substring(1)}`);
358
190
  if (!this.proceedReading) {
359
191
  url.push('&proceed=false');
360
192
  }
361
193
  if(!this.displayArticle){
362
194
  url.push('&article=false');
363
195
  }
364
- url.push('&time=' + this.startTime);
365
196
  if (this.isVisible) {
366
197
  url.push('&key=' + window.btoa(this.dataTitle.toString()));
367
198
  }
368
199
  return url.join('');
369
200
  },
370
- iFrameWidth(): string {
371
- return '100%';
372
- },
373
201
  iFrameHeight(): string {
374
202
  switch (this.iFrameModel) {
375
203
  case 'large':
376
204
  if (this.podcast) return '180px';
377
205
  if ('number' === this.episodeNumbers) {
378
- switch (this.iFrameNumber) {
379
- case '1':
380
- return '185px';
381
- case '2':
382
- return '240px';
383
- case '3':
384
- return '290px';
385
- case '4':
386
- return '345px';
387
- case '5':
388
- return '390px';
389
- default:
390
- return '435px';
206
+ switch (this.iFrameNumber.toString()) {
207
+ case '1': return '270px';
208
+ case '2': return '320px';
209
+ case '3': return '360px';
210
+ case '4': return '420px';
211
+ case '5': return '420px';
212
+ default: return '420px';
391
213
  }
392
214
  }
393
215
  return '435px';
394
- case 'largeEmission':
216
+ case 'emissionLarge':
395
217
  case 'largeSuggestion':
396
218
  if ('number' !== this.episodeNumbers) return '510px';
397
- switch (this.iFrameNumber) {
398
- case '1':
399
- return '260px';
400
- case '2':
401
- return '315px';
402
- case '3':
403
- return '365px';
404
- case '4':
405
- return '420px';
406
- case '5':
407
- return '465px';
408
- default:
409
- return '510px';
219
+ switch (this.iFrameNumber.toString()) {
220
+ case '1':return '315px';
221
+ case '2':return '365px';
222
+ case '3':return '420px';
223
+ case '4':return '470px';
224
+ case '5':return '470px';
225
+ default:return '470px';
410
226
  }
411
- case 'emission':
412
- return '530px';
227
+ case 'emission':return '530px';
413
228
  default:
414
229
  if (this.podcast) return '520px';
415
230
  return '530px';
416
231
  }
417
232
  },
418
233
  iFrame(): string {
419
- return `<iframe src="${this.iFrameSrc}" width="${this.iFrameWidth}" height="${this.iFrameHeight}" scrolling="no" frameborder="0"></iframe>`;
234
+ return `<iframe src="${this.iFrameSrc}" width="100%" height="${this.iFrameHeight}" scrolling="no" frameborder="0"></iframe>`;
420
235
  },
421
236
  isPodcastNotVisible(): boolean {
422
237
  return (
423
- this.podcast &&
238
+ undefined !== this.podcast &&
424
239
  !this.podcast.availability.visibility &&
425
240
  ('default' === this.iFrameModel || 'large' === this.iFrameModel)
426
241
  );
@@ -428,87 +243,57 @@ export default Vue.extend({
428
243
  dataTitle(): number {
429
244
  if (this.podcast) return this.podcast.podcastId;
430
245
  if (this.emission) return this.emission.emissionId;
431
- return this.playlist.playlistId;
246
+ if (this.playlist) return this.playlist.playlistId;
247
+ return 0;
432
248
  },
433
249
  isPlayerParameter(): boolean{
434
- return !this.podcast || (this.podcast.article && 0 !== this.podcast.article.length) || this.isEmission || this.isLargeEmission || this.isLargeSuggestion;
250
+ return (!this.podcast || (this.podcast.article && 0 !== this.podcast.article.length) || this.isEmission || this.isLargeEmission || this.isLargeSuggestion) && !this.playlist;
251
+ }
252
+ },
253
+ async created() {
254
+ await this.initColor();
255
+ if (this.isLiveReadyToRecord) {
256
+ this.iFrameModel = 'large';
435
257
  }
436
258
  },
437
259
  methods: {
438
- /* getOrganisationId(): string{
439
- let orgaId = undefined;
440
- if (this.podcast) {
441
- orgaId = this.podcast.organisation.id;
442
- } else if (this.playlist) {
443
- orgaId = this.playlist.organisation.id;
444
- } else {
445
- orgaId = this.emission.orga.id;
446
- }
447
- return orgaId;
448
- },
449
- async initBeta(): Promise<void> {
450
- const orgaId = this.getOrganisationId();
451
- const data: any = await octopusApi.fetchOrganisationAttributes(orgaId);
452
- if (data.hasOwnProperty('playerBeta')) {
453
- this.isBeta = data.playerBeta;
454
- }
455
- }, */
456
260
  async initColor(): Promise<void> {
457
261
  if (!this.authenticated) return;
458
262
  let data;
459
- if(this.$store.state.organisation && this.$store.state.organisation.attributes && Object.keys(this.$store.state.organisation.attributes).length > 1){
263
+ if(this.$store.state.organisation?.attributes && Object.keys(this.$store.state.organisation.attributes).length > 1){
460
264
  data = this.$store.state.organisation.attributes;
461
265
  }else{
462
- data= await profileApi.fetchOrganisationAttibutes(
463
- this.$store.state,
464
- state.generalParameters.organisationId
465
- );
466
- }
467
- if (data.hasOwnProperty('COLOR')) {
468
- this.color = data.COLOR;
469
- } else {
470
- this.color = '#40a372';
266
+ data= await octopusApi.fetchData<{[key:string]:string}>(0, 'organisation/attributes/'+this.myOrganisationId);
471
267
  }
472
- if (data.hasOwnProperty('THEME')) {
473
- this.theme = data.THEME;
474
- } else {
475
- this.theme = '#ffffff';
476
- }
477
- if (data.hasOwnProperty('playerBeta')) {
478
- if (data.hasOwnProperty('THEMEBETA')) {
479
- this.themeBeta = data.THEMEBETA;
480
- }
481
- this.displayBetaChoice = data.playerBeta;
482
- let dataFetched = await octopusApi.fetchCustomPlayer('customPlayer/organisation/'+ this.organisationId!);
483
- this.customPlayers = dataFetched.content;
484
- const totalCount = dataFetched.totalElements;
485
- let index = 1;
486
- while (totalCount > this.customPlayers.length) {
487
- dataFetched = await octopusApi.fetchCustomPlayer('customPlayer/organisation/'+ this.organisationId!+'?start='+index);
488
- this.customPlayers = this.customPlayers.concat(dataFetched.content);
489
- ++index;
490
- }
491
- }
492
- return;
493
- },
494
- updateEpisodeNumber(value: string): void {
495
- this.episodeNumbers = value;
496
- },
497
- updateProceedReading(value: boolean): void {
498
- this.proceedReading = value;
268
+ this.color = Object.prototype.hasOwnProperty.call(data,'COLOR') ? data.COLOR : '#40a372';
269
+ this.theme = Object.prototype.hasOwnProperty.call(data,'THEME') ? data.THEME : '#000000';
499
270
  },
500
- updateIframeNumber(value: string): void {
501
- this.iFrameNumber = value;
502
- },
503
- updateStartTime(value: number): void {
504
- this.startTime = value;
505
- },
506
- updateIsVisible(value: boolean): void {
507
- this.isVisible = value;
508
- },
509
- updateDisplayArticle(value: boolean): void{
510
- this.displayArticle = value;
511
- }
512
271
  },
513
- });
272
+ })
514
273
  </script>
274
+
275
+ <style lang="scss">
276
+ @import '../../../sass/_variables.scss';
277
+ .octopus-app{
278
+ .sticker {
279
+ align-self: center;
280
+ background: $octopus-primary-dark;
281
+ padding: 0.5rem;
282
+ transition: all 0.5s ease;
283
+ color: white;
284
+ font-weight: bold;
285
+ letter-spacing: 1px;
286
+ box-shadow: 10px 10px 34px -15px hsla(0, 0%, 0%, 0.4);
287
+ border-radius: 255px 15px 225px 15px/15px 225px 15px 255px;
288
+ border: solid 2px #41403e;
289
+ &:hover {
290
+ box-shadow: 2px 8px 4px -6px hsla(0, 0%, 0%, 0.3);
291
+ background: transparent;
292
+ color: $octopus-primary-dark;
293
+ }
294
+ }
295
+ .max-iframe {
296
+ max-width: 300px;
297
+ }
298
+ }
299
+ </style>