@saooti/octopus-sdk 1.0.0 → 29.0.2

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 (230) hide show
  1. package/README.md +73 -0
  2. package/index.d.ts +4 -0
  3. package/index.ts +12 -0
  4. package/package.json +61 -39
  5. package/public/css/fonts/saooti-ui.eot +0 -0
  6. package/public/css/fonts/saooti-ui.svg +30 -19
  7. package/public/css/fonts/saooti-ui.ttf +0 -0
  8. package/public/css/fonts/saooti-ui.woff +0 -0
  9. package/public/css/fonts/style.css +48 -5
  10. package/public/img/ACPM.png +0 -0
  11. package/public/img/article.png +0 -0
  12. package/src/App.vue +97 -31
  13. package/src/api/comments.ts +3 -1
  14. package/src/api/emissions.ts +5 -2
  15. package/src/api/initialize.ts +3 -2
  16. package/src/api/podcasts.ts +5 -2
  17. package/src/api/profile.ts +4 -2
  18. package/src/api/studio.ts +12 -1
  19. package/src/assets/bootstrap-diff.scss +265 -0
  20. package/src/assets/form.scss +23 -0
  21. package/src/assets/general.scss +47 -20
  22. package/src/assets/modal.scss +9 -10
  23. package/src/assets/multiselect.scss +19 -2
  24. package/src/assets/octopus-library.scss +16 -4
  25. package/src/assets/share.scss +343 -0
  26. package/src/components/display/aggregator/RssSection.vue +4 -4
  27. package/src/components/display/categories/CategoryChooser.vue +152 -105
  28. package/src/components/display/categories/CategoryFilter.vue +108 -0
  29. package/src/components/display/categories/CategoryList.vue +138 -109
  30. package/src/components/display/comments/AddCommentModal.vue +104 -87
  31. package/src/components/display/comments/CommentInput.vue +137 -118
  32. package/src/components/display/comments/CommentItem.vue +155 -137
  33. package/src/components/display/comments/CommentList.vue +142 -120
  34. package/src/components/display/comments/CommentParentInfo.vue +39 -35
  35. package/src/components/display/comments/CommentPlayer.vue +54 -48
  36. package/src/components/display/comments/CommentSection.vue +57 -58
  37. package/src/components/display/edit/EditBox.vue +4 -4
  38. package/src/components/display/edit/EditCommentBox.vue +25 -31
  39. package/src/components/display/emission/EmissionChooser.vue +82 -80
  40. package/src/components/display/emission/EmissionInlineList.vue +118 -105
  41. package/src/components/display/emission/EmissionItem.vue +66 -167
  42. package/src/components/display/emission/EmissionList.vue +96 -122
  43. package/src/components/display/emission/EmissionPlayerItem.vue +131 -126
  44. package/src/components/display/filter/AdvancedSearch.vue +306 -372
  45. package/src/components/display/filter/CategoryFilter.vue +117 -0
  46. package/src/components/display/filter/MonetizableFilter.vue +24 -10
  47. package/src/components/display/filter/ProductorSearch.vue +131 -135
  48. package/src/components/display/filter/RubriqueChoice.vue +104 -0
  49. package/src/components/display/filter/RubriqueFilter.vue +235 -0
  50. package/src/components/display/live/CountDown.vue +30 -29
  51. package/src/components/display/live/LiveHorizontalList.vue +40 -34
  52. package/src/components/display/live/LiveItem.vue +146 -158
  53. package/src/components/display/live/LiveList.vue +167 -154
  54. package/src/components/display/organisation/OrganisationChooser.vue +125 -124
  55. package/src/components/display/organisation/OrganisationChooserLight.vue +40 -47
  56. package/src/components/display/participant/ParticipantItem.vue +92 -108
  57. package/src/components/display/participant/ParticipantList.vue +76 -69
  58. package/src/components/display/playlist/PlaylistItem.vue +45 -56
  59. package/src/components/display/playlist/PlaylistList.vue +57 -48
  60. package/src/components/display/playlist/PodcastList.vue +94 -70
  61. package/src/components/display/podcasts/AnimatorsItem.vue +26 -23
  62. package/src/components/display/podcasts/ParticipantDescription.vue +115 -0
  63. package/src/components/display/podcasts/PodcastFilterList.vue +84 -85
  64. package/src/components/display/podcasts/PodcastImage.vue +244 -208
  65. package/src/components/display/podcasts/PodcastInlineList.vue +145 -207
  66. package/src/components/display/podcasts/PodcastItem.vue +150 -132
  67. package/src/components/display/podcasts/PodcastList.vue +89 -110
  68. package/src/components/display/podcasts/TagList.vue +23 -16
  69. package/src/components/display/rubriques/RubriqueChooser.vue +137 -123
  70. package/src/components/display/rubriques/RubriqueList.vue +227 -0
  71. package/src/components/display/sharing/PlayerParameters.vue +154 -106
  72. package/src/components/display/sharing/QrCode.vue +58 -0
  73. package/src/components/display/sharing/ShareButtons.vue +214 -92
  74. package/src/components/display/sharing/ShareDistribution.vue +110 -121
  75. package/src/components/display/sharing/SharePlayer.vue +245 -190
  76. package/src/components/display/sharing/SubscribeButtons.vue +130 -66
  77. package/src/components/display/studio/RecordingItemButton.vue +4 -4
  78. package/src/components/misc/ErrorMessage.vue +21 -16
  79. package/src/components/misc/Footer.vue +131 -66
  80. package/src/components/misc/HomeDropdown.vue +166 -123
  81. package/src/components/misc/LeftMenu.vue +151 -134
  82. package/src/components/misc/Player.vue +332 -328
  83. package/src/components/misc/Snackbar.vue +27 -29
  84. package/src/components/misc/TopBar.vue +204 -174
  85. package/src/components/misc/modal/ClipboardModal.vue +46 -26
  86. package/src/components/misc/modal/MessageModal.vue +67 -51
  87. package/src/components/misc/modal/NewsletterModal.vue +179 -136
  88. package/src/components/misc/modal/QrCodeModal.vue +83 -0
  89. package/src/components/misc/modal/ShareModalPlayer.vue +133 -74
  90. package/src/components/mixins/functions.ts +21 -18
  91. package/src/components/mixins/init.ts +24 -0
  92. package/src/components/mixins/organisationFilter.ts +24 -0
  93. package/src/components/pages/Category.vue +26 -26
  94. package/src/components/pages/Emission.vue +120 -92
  95. package/src/components/pages/Emissions.vue +109 -86
  96. package/src/components/pages/Home.vue +70 -16
  97. package/src/components/pages/Lives.vue +57 -47
  98. package/src/components/pages/Participant.vue +93 -77
  99. package/src/components/pages/Participants.vue +44 -31
  100. package/src/components/pages/Playlist.vue +63 -52
  101. package/src/components/pages/Playlists.vue +41 -39
  102. package/src/components/pages/Podcast.vue +265 -251
  103. package/src/components/pages/Podcasts.vue +135 -104
  104. package/src/components/pages/Rubrique.vue +25 -19
  105. package/src/components/pages/Search.vue +71 -67
  106. package/src/helper/dom.ts +2 -2
  107. package/src/helper/duration.ts +18 -8
  108. package/src/locale/educationen.ts +14 -0
  109. package/src/locale/en.ts +299 -1
  110. package/src/locale/fr.ts +25 -10
  111. package/src/locale/messages.ts +3 -2
  112. package/src/main.ts +54 -32
  113. package/src/router/router.ts +184 -159
  114. package/src/shims-tsx.d.ts +13 -0
  115. package/src/shims-vue-recaptcha-v3.d.ts +9 -0
  116. package/src/shims-vue.d.ts +5 -6
  117. package/src/store/AppStore.ts +36 -171
  118. package/src/store/class/category.ts +8 -0
  119. package/src/store/class/comment.ts +17 -0
  120. package/src/store/class/conference.ts +27 -0
  121. package/src/store/class/customPlayer.ts +8 -0
  122. package/src/store/class/emission.ts +20 -0
  123. package/src/store/class/fetchParam.ts +16 -0
  124. package/src/store/class/media.ts +13 -0
  125. package/src/store/class/organisation.ts +19 -0
  126. package/src/store/class/participant.ts +12 -0
  127. package/src/store/class/person.ts +13 -0
  128. package/src/store/class/player.ts +12 -0
  129. package/src/store/class/playlist.ts +15 -0
  130. package/src/store/class/podcast.ts +37 -0
  131. package/src/store/class/rubriquage.ts +9 -0
  132. package/src/store/class/rubriquageFilter.ts +5 -0
  133. package/src/store/class/rubrique.ts +8 -0
  134. package/src/store/paramStore.ts +70 -29
  135. package/src/store/typeAppStore.ts +171 -237
  136. package/src/vuex-shim.d.ts +8 -0
  137. package/tsconfig.json +4 -0
  138. package/vue.config.js +14 -0
  139. package/public/img/ACPM.PNG +0 -0
  140. package/src/assets/bootstrap_scss/_alert.scss +0 -51
  141. package/src/assets/bootstrap_scss/_badge.scss +0 -54
  142. package/src/assets/bootstrap_scss/_breadcrumb.scss +0 -42
  143. package/src/assets/bootstrap_scss/_button-group.scss +0 -164
  144. package/src/assets/bootstrap_scss/_buttons.scss +0 -291
  145. package/src/assets/bootstrap_scss/_card.scss +0 -278
  146. package/src/assets/bootstrap_scss/_carousel.scss +0 -197
  147. package/src/assets/bootstrap_scss/_close.scss +0 -41
  148. package/src/assets/bootstrap_scss/_code.scss +0 -48
  149. package/src/assets/bootstrap_scss/_custom-forms.scss +0 -522
  150. package/src/assets/bootstrap_scss/_dropdown.scss +0 -201
  151. package/src/assets/bootstrap_scss/_forms.scss +0 -352
  152. package/src/assets/bootstrap_scss/_functions.scss +0 -134
  153. package/src/assets/bootstrap_scss/_grid.scss +0 -69
  154. package/src/assets/bootstrap_scss/_images.scss +0 -42
  155. package/src/assets/bootstrap_scss/_input-group.scss +0 -191
  156. package/src/assets/bootstrap_scss/_jumbotron.scss +0 -17
  157. package/src/assets/bootstrap_scss/_list-group.scss +0 -158
  158. package/src/assets/bootstrap_scss/_media.scss +0 -8
  159. package/src/assets/bootstrap_scss/_mixins.scss +0 -47
  160. package/src/assets/bootstrap_scss/_modal.scss +0 -243
  161. package/src/assets/bootstrap_scss/_nav.scss +0 -120
  162. package/src/assets/bootstrap_scss/_navbar.scss +0 -324
  163. package/src/assets/bootstrap_scss/_pagination.scss +0 -74
  164. package/src/assets/bootstrap_scss/_popover.scss +0 -170
  165. package/src/assets/bootstrap_scss/_print.scss +0 -141
  166. package/src/assets/bootstrap_scss/_progress.scss +0 -46
  167. package/src/assets/bootstrap_scss/_reboot.scss +0 -482
  168. package/src/assets/bootstrap_scss/_root.scss +0 -20
  169. package/src/assets/bootstrap_scss/_spinners.scss +0 -55
  170. package/src/assets/bootstrap_scss/_tables.scss +0 -185
  171. package/src/assets/bootstrap_scss/_toasts.scss +0 -44
  172. package/src/assets/bootstrap_scss/_tooltip.scss +0 -115
  173. package/src/assets/bootstrap_scss/_transitions.scss +0 -20
  174. package/src/assets/bootstrap_scss/_type.scss +0 -125
  175. package/src/assets/bootstrap_scss/_utilities.scss +0 -17
  176. package/src/assets/bootstrap_scss/_variables.scss +0 -1145
  177. package/src/assets/bootstrap_scss/bootstrap-grid.scss +0 -29
  178. package/src/assets/bootstrap_scss/bootstrap-reboot.scss +0 -12
  179. package/src/assets/bootstrap_scss/bootstrap.scss +0 -44
  180. package/src/assets/bootstrap_scss/mixins/_alert.scss +0 -13
  181. package/src/assets/bootstrap_scss/mixins/_background-variant.scss +0 -22
  182. package/src/assets/bootstrap_scss/mixins/_badge.scss +0 -17
  183. package/src/assets/bootstrap_scss/mixins/_border-radius.scss +0 -63
  184. package/src/assets/bootstrap_scss/mixins/_box-shadow.scss +0 -20
  185. package/src/assets/bootstrap_scss/mixins/_breakpoints.scss +0 -123
  186. package/src/assets/bootstrap_scss/mixins/_buttons.scss +0 -110
  187. package/src/assets/bootstrap_scss/mixins/_caret.scss +0 -62
  188. package/src/assets/bootstrap_scss/mixins/_clearfix.scss +0 -7
  189. package/src/assets/bootstrap_scss/mixins/_deprecate.scss +0 -10
  190. package/src/assets/bootstrap_scss/mixins/_float.scss +0 -14
  191. package/src/assets/bootstrap_scss/mixins/_forms.scss +0 -177
  192. package/src/assets/bootstrap_scss/mixins/_gradients.scss +0 -45
  193. package/src/assets/bootstrap_scss/mixins/_grid-framework.scss +0 -71
  194. package/src/assets/bootstrap_scss/mixins/_grid.scss +0 -69
  195. package/src/assets/bootstrap_scss/mixins/_hover.scss +0 -37
  196. package/src/assets/bootstrap_scss/mixins/_image.scss +0 -36
  197. package/src/assets/bootstrap_scss/mixins/_list-group.scss +0 -21
  198. package/src/assets/bootstrap_scss/mixins/_lists.scss +0 -7
  199. package/src/assets/bootstrap_scss/mixins/_nav-divider.scss +0 -11
  200. package/src/assets/bootstrap_scss/mixins/_pagination.scss +0 -22
  201. package/src/assets/bootstrap_scss/mixins/_reset-text.scss +0 -17
  202. package/src/assets/bootstrap_scss/mixins/_resize.scss +0 -6
  203. package/src/assets/bootstrap_scss/mixins/_screen-reader.scss +0 -34
  204. package/src/assets/bootstrap_scss/mixins/_size.scss +0 -7
  205. package/src/assets/bootstrap_scss/mixins/_table-row.scss +0 -39
  206. package/src/assets/bootstrap_scss/mixins/_text-emphasis.scss +0 -17
  207. package/src/assets/bootstrap_scss/mixins/_text-hide.scss +0 -11
  208. package/src/assets/bootstrap_scss/mixins/_text-truncate.scss +0 -8
  209. package/src/assets/bootstrap_scss/mixins/_transition.scss +0 -16
  210. package/src/assets/bootstrap_scss/mixins/_visibility.scss +0 -8
  211. package/src/assets/bootstrap_scss/utilities/_align.scss +0 -8
  212. package/src/assets/bootstrap_scss/utilities/_background.scss +0 -19
  213. package/src/assets/bootstrap_scss/utilities/_borders.scss +0 -75
  214. package/src/assets/bootstrap_scss/utilities/_clearfix.scss +0 -3
  215. package/src/assets/bootstrap_scss/utilities/_display.scss +0 -26
  216. package/src/assets/bootstrap_scss/utilities/_embed.scss +0 -39
  217. package/src/assets/bootstrap_scss/utilities/_flex.scss +0 -51
  218. package/src/assets/bootstrap_scss/utilities/_float.scss +0 -11
  219. package/src/assets/bootstrap_scss/utilities/_overflow.scss +0 -5
  220. package/src/assets/bootstrap_scss/utilities/_position.scss +0 -32
  221. package/src/assets/bootstrap_scss/utilities/_screenreaders.scss +0 -11
  222. package/src/assets/bootstrap_scss/utilities/_shadows.scss +0 -6
  223. package/src/assets/bootstrap_scss/utilities/_sizing.scss +0 -20
  224. package/src/assets/bootstrap_scss/utilities/_spacing.scss +0 -73
  225. package/src/assets/bootstrap_scss/utilities/_stretched-link.scss +0 -19
  226. package/src/assets/bootstrap_scss/utilities/_text.scss +0 -72
  227. package/src/assets/bootstrap_scss/utilities/_visibility.scss +0 -13
  228. package/src/assets/bootstrap_scss/vendor/_rfs.scss +0 -204
  229. package/src/shims-vuex.d.ts +0 -7
  230. package/src/views/Home.vue +0 -18
@@ -1,46 +1,54 @@
1
1
  <template>
2
2
  <div>
3
- <div class="page-box" v-if="loaded && !error">
4
- <h1 v-if="!isOuestFrance">{{ titlePage }}</h1>
5
- <Countdown :timeRemaining="timeRemaining" v-if="isCounter" />
3
+ <div
4
+ v-if="loaded && !error"
5
+ class="page-box"
6
+ >
7
+ <h1 v-if="!isOuestFrance">
8
+ {{ titlePage }}
9
+ </h1>
10
+ <Countdown
11
+ v-if="isCounter"
12
+ :time-remaining="timeRemaining"
13
+ />
6
14
  <div class="d-flex">
7
15
  <div class="d-flex flex-column flex-super-grow">
8
16
  <RecordingItemButton
9
- class="module-box text-center-mobile flex-no-grow"
10
- :podcast="podcast"
11
- :live="true"
12
- :recording="fetchConference"
13
- @deleteItem="removeDeleted"
14
- @validatePodcast="updatePodcast"
15
17
  v-if="
16
18
  !!fetchConference &&
17
19
  isLiveReadyToRecord &&
18
20
  !isNotRecorded &&
19
21
  isOctopusAndAnimator
20
22
  "
21
- ></RecordingItemButton>
22
- <EditBox
23
+ class="module-box text-center-mobile flex-no-grow"
23
24
  :podcast="podcast"
25
+ :live="true"
26
+ :recording="fetchConference"
27
+ @deleteItem="removeDeleted"
28
+ @validatePodcast="updatePodcast"
29
+ />
30
+ <EditBox
24
31
  v-else-if="editRight && isEditBox"
25
- :isReady="isReady"
32
+ :podcast="podcast"
33
+ :is-ready="isReady"
26
34
  @validatePodcast="updatePodcast"
27
- ></EditBox>
35
+ />
28
36
  <div class="module-box">
29
37
  <h2
30
- class="text-uppercase font-weight-bold title-page-podcast"
31
38
  v-if="!isOuestFrance"
39
+ class="text-uppercase fw-bold title-page-podcast"
32
40
  >
33
- {{ this.podcast.title }}
41
+ {{ podcast.title }}
34
42
  </h2>
35
43
  <router-link
44
+ v-else
36
45
  :to="{
37
46
  name: 'emission',
38
47
  params: { emissionId: podcast.emission.emissionId },
39
- query: { productor: this.$store.state.filter.organisationId },
48
+ query: { productor: $store.state.filter.organisationId },
40
49
  }"
41
- v-else
42
50
  >
43
- <h1>{{ this.podcast.emission.name }}</h1>
51
+ <h1>{{ podcast.emission.name }}</h1>
44
52
  </router-link>
45
53
  <div class="mb-5 mt-3 d-flex">
46
54
  <div class="w-100">
@@ -50,61 +58,52 @@
50
58
  ? 'shadow-element'
51
59
  : '',
52
60
  isLiveReadyToRecord &&
53
- fetchConference &&
54
- 'null' !== fetchConference &&
55
- fetchConference.status
61
+ fetchConference &&
62
+ 'null' !== fetchConference &&
63
+ fetchConference.status
56
64
  ? fetchConference.status.toLowerCase() + '-shadow'
57
65
  : '',
58
66
  ]"
59
- class="mr-3"
60
- v-bind:podcast="podcast"
61
- :hidePlay="!isLiveReadyToRecord"
62
- :playingPodcast="playingPodcast"
67
+ class="me-3"
68
+ :podcast="podcast"
69
+ :hide-play="!isLiveReadyToRecord"
70
+ :playing-podcast="playingPodcast"
71
+ :fetch-conference="fetchConference"
72
+ :is-animator-live="isOctopusAndAnimator"
63
73
  @playPodcast="playPodcast"
64
- :fetchConference="fetchConference"
65
- :isAnimatorLive="isOctopusAndAnimator"
66
74
  />
67
- <h3 v-if="isOuestFrance">{{ this.podcast.title }}</h3>
75
+ <h3 v-if="isOuestFrance">
76
+ {{ podcast.title }}
77
+ </h3>
68
78
  <div
69
79
  class="date-text-zone"
70
80
  :class="isLiveReady ? 'justify-content-between' : ''"
71
81
  >
72
82
  <div
73
- :class="!isLiveReady ? 'mr-5' : ''"
74
83
  v-if="!isOuestFrance && 0 !== date.length"
84
+ :class="!isLiveReady ? 'me-5' : ''"
75
85
  >
76
86
  {{ date }}
77
87
  </div>
78
- <div class="ml-2 mr-2 duration">
79
- <span class="saooti-clock3" v-if="isOuestFrance"></span
80
- >{{ $t('Duration', { duration: duration }) }}
88
+ <div class="ms-2 me-2 duration">
89
+ <span
90
+ v-if="isOuestFrance"
91
+ class="saooti-clock3"
92
+ />{{ $t('Duration', { duration: duration }) }}
81
93
  </div>
82
- <div class="text-danger" v-if="isLiveReady">
94
+ <div
95
+ v-if="isLiveReady"
96
+ class="text-danger"
97
+ >
83
98
  {{ $t('Episode record in live') }}
84
99
  </div>
85
100
  </div>
86
101
  <div
87
102
  class="descriptionText html-wysiwyg-content"
88
- v-html="urlify(this.podcast.description)"
89
- ></div>
103
+ v-html="urlify(podcast.description)"
104
+ />
90
105
  <div class="mt-3 mb-3">
91
- <div class="comma" v-if="podcast.animators">
92
- {{ $t('Animated by : ') }}
93
- <router-link
94
- :aria-label="$t('Participant')"
95
- class="link-info"
96
- v-for="animator in podcast.animators"
97
- v-bind:key="animator.participantId"
98
- :to="{
99
- name: 'participant',
100
- params: { participantId: animator.participantId },
101
- query: {
102
- productor: this.$store.state.filter.organisationId,
103
- },
104
- }"
105
- >{{ getName(animator) }}</router-link
106
- >
107
- </div>
106
+ <ParticipantDescription :participants="podcast.animators" />
108
107
  <div v-if="!isOuestFrance">
109
108
  {{ $t('Emission') + ' : ' }}
110
109
  <router-link
@@ -113,11 +112,12 @@
113
112
  name: 'emission',
114
113
  params: { emissionId: podcast.emission.emissionId },
115
114
  query: {
116
- productor: this.$store.state.filter.organisationId,
115
+ productor: $store.state.filter.organisationId,
117
116
  },
118
117
  }"
119
- >{{ this.podcast.emission.name }}</router-link
120
118
  >
119
+ {{ podcast.emission.name }}
120
+ </router-link>
121
121
  </div>
122
122
  <div v-if="!isPodcastmaker">
123
123
  {{ $t('Producted by : ') }}
@@ -127,62 +127,64 @@
127
127
  name: 'productor',
128
128
  params: { productorId: podcast.organisation.id },
129
129
  query: {
130
- productor: this.$store.state.filter.organisationId,
131
- },
132
- }"
133
- >{{ this.podcast.organisation.name }}</router-link
134
- >
135
- </div>
136
- <div class="comma" v-if="podcast.guests">
137
- {{ $t('Guests') + ' : ' }}
138
- <router-link
139
- class="link-info"
140
- v-for="guest in podcast.guests"
141
- v-bind:key="guest.participantId"
142
- :to="{
143
- name: 'participant',
144
- params: { participantId: guest.participantId },
145
- query: {
146
- productor: this.$store.state.filter.organisationId,
130
+ productor: $store.state.filter.organisationId,
147
131
  },
148
132
  }"
149
- >{{ getName(guest) }}</router-link
150
133
  >
134
+ {{ podcast.organisation.name }}
135
+ </router-link>
151
136
  </div>
137
+ <a
138
+ v-if="podcast.article"
139
+ class="btn d-flex align-items-center my-2 width-fit-content"
140
+ :href="podcast.article"
141
+ rel="noopener"
142
+ target="_blank"
143
+ >
144
+ <span class="saooti-newspaper me-1" />
145
+ <div>{{ $t('See associated article') }}</div>
146
+ </a>
147
+ <ParticipantDescription
148
+ :participants="podcast.guests"
149
+ :is-guest="true"
150
+ />
152
151
  <div v-if="editRight && !isPodcastmaker">
153
152
  <div
154
- class="mr-5"
155
153
  v-if="podcast.annotations && podcast.annotations.RSS"
154
+ class="me-5"
156
155
  >
157
156
  {{ $t('From RSS') }}
158
157
  </div>
159
158
  <ErrorMessage
160
- :message="$t('Podcast is not visible for listeners')"
161
159
  v-if="!podcast.availability.visibility"
160
+ :message="$t('Podcast is not visible for listeners')"
162
161
  />
163
162
  <ErrorMessage
164
- :message="$t('Podcast in ERROR, please contact Saooti')"
165
163
  v-if="'ERROR' === podcast.processingStatus"
164
+ :message="$t('Podcast in ERROR, please contact Saooti')"
166
165
  />
167
166
  <ErrorMessage
168
- :message="$t('Podcast not validated')"
169
167
  v-if="podcastNotValid"
168
+ :message="$t('Podcast not validated')"
170
169
  />
171
170
  </div>
172
171
  <ShareButtons
173
- :podcast="podcast"
174
- :bigRound="true"
175
- :audioUrl="podcast.audioUrl"
176
172
  v-if="isDownloadButton"
177
- ></ShareButtons>
173
+ :podcast="podcast"
174
+ :big-round="true"
175
+ :audio-url="podcast.audioUrl"
176
+ />
178
177
  </div>
179
178
  </div>
180
179
  </div>
181
- <TagList v-if="isTagList" :tagList="podcast.tags" />
180
+ <TagList
181
+ v-if="isTagList"
182
+ :tag-list="podcast.tags"
183
+ />
182
184
  </div>
183
185
  <SubscribeButtons
184
- :emission="podcast.emission"
185
186
  v-if="isShareButtons && countLink >= 1"
187
+ :emission="podcast.emission"
186
188
  />
187
189
  </div>
188
190
  <div
@@ -190,100 +192,91 @@
190
192
  :class="authenticated || notExclusive ? 'flex-grow' : ''"
191
193
  >
192
194
  <SharePlayer
195
+ v-if="isSharePlayer && (authenticated || notExclusive)"
193
196
  :podcast="podcast"
194
197
  :emission="podcast.emission"
195
198
  :exclusive="exclusive"
196
- :notExclusive="notExclusive"
197
- :organisationId="organisationId"
198
- :isEducation="isEducation"
199
- v-if="isSharePlayer && (authenticated || notExclusive)"
200
- ></SharePlayer>
199
+ :not-exclusive="notExclusive"
200
+ :organisation-id="organisationId"
201
+ :is-education="isEducation"
202
+ />
201
203
  <ShareButtons
202
- :podcast="podcast"
203
- :notExclusive="notExclusive"
204
204
  v-if="isShareButtons"
205
- ></ShareButtons>
205
+ :podcast="podcast"
206
+ :not-exclusive="notExclusive"
207
+ />
206
208
  </div>
207
209
  </div>
208
210
  <template v-if="!isOuestFrance">
209
211
  <CommentSection
210
- :podcast="podcast"
211
212
  v-if="!isPodcastmaker"
212
- :fetchConference="fetchConference"
213
213
  ref="commentSection"
214
+ :podcast="podcast"
215
+ :fetch-conference="fetchConference"
214
216
  />
215
217
  <PodcastInlineList
216
- :emissionId="this.podcast.emission.emissionId"
217
- :href="'/main/pub/emission/' + this.podcast.emission.emissionId"
218
+ :emission-id="podcast.emission.emissionId"
219
+ :href="'/main/pub/emission/' + podcast.emission.emissionId"
218
220
  :title="$t('More episodes of this emission')"
219
- :buttonText="$t('All podcast emission button')"
221
+ :button-text="$t('All podcast emission button')"
220
222
  />
221
223
  <PodcastInlineList
222
224
  v-for="c in categories"
223
225
  :key="c.id"
224
- :iabId="c.id"
226
+ :iab-id="c.id"
225
227
  :href="'/main/pub/category/' + c.id"
226
228
  :title="$t('More episodes of this category : ', { name: c.name })"
227
- :buttonText="$t('All podcast button', { name: c.name })"
229
+ :button-text="$t('All podcast button', { name: c.name })"
228
230
  />
229
231
  </template>
230
232
  </div>
231
- <div class="d-flex justify-content-center" v-if="!loaded">
232
- <div class="spinner-border mr-3"></div>
233
- <h3 class="mt-2">{{ $t('Loading content ...') }}</h3>
233
+ <div
234
+ v-if="!loaded"
235
+ class="d-flex justify-content-center"
236
+ >
237
+ <div class="spinner-border me-3" />
238
+ <h3 class="mt-2">
239
+ {{ $t('Loading content ...') }}
240
+ </h3>
234
241
  </div>
235
- <div class="text-center" v-if="error">
242
+ <div
243
+ v-if="error"
244
+ class="text-center"
245
+ >
236
246
  <h3>{{ $t("Podcast doesn't exist") }}</h3>
237
247
  </div>
238
248
  </div>
239
249
  </template>
240
- <style lang="scss">
241
- .title-page-podcast {
242
- font-size: 0.9rem;
243
- }
244
250
 
245
- .date-text-zone {
246
- display: flex;
247
- flex-wrap: wrap;
248
- margin-bottom: 1rem;
249
- @media (max-width: 600px) {
250
- display: initial;
251
- .duration {
252
- margin-left: 0 !important;
253
- }
254
- }
255
- }
256
- .share-container {
257
- @media (max-width: 960px) {
258
- flex-grow: 1;
259
- }
260
- }
261
- </style>
262
251
  <script lang="ts">
263
- // @ is an alias to /src
264
- import RecordingItemButton from '@/components/display/studio/RecordingItemButton.vue';
265
- import EditBox from '@/components/display/edit/EditBox.vue';
266
- import SharePlayer from '../display/sharing/SharePlayer.vue';
267
- import ShareButtons from '../display/sharing/ShareButtons.vue';
268
252
  import PodcastInlineList from '../display/podcasts/PodcastInlineList.vue';
269
253
  import PodcastImage from '../display/podcasts/PodcastImage.vue';
270
- import CommentSection from '../display/comments/CommentSection.vue';
271
- import TagList from '../display/podcasts/TagList.vue';
272
- import SubscribeButtons from '../display/sharing/SubscribeButtons.vue';
273
- import Countdown from '../display/live/CountDown.vue';
254
+ import ParticipantDescription from '../display/podcasts/ParticipantDescription.vue';
274
255
  const octopusApi = require('@saooti/octopus-api');
275
256
  import studioApi from '@/api/studio';
276
257
  import { state } from '../../store/paramStore';
277
- import ErrorMessage from '../misc/ErrorMessage.vue';
278
258
  const moment = require('moment');
279
259
  const humanizeDuration = require('humanize-duration');
280
260
  import { displayMethods } from '../mixins/functions';
261
+ import { Podcast } from '@/store/class/podcast';
262
+ import { Conference } from '@/store/class/conference';
281
263
 
282
- import { defineComponent, ref } from 'vue'
264
+ import { defineComponent, defineAsyncComponent } from 'vue';
265
+ const ShareButtons = defineAsyncComponent(() => import('../display/sharing/ShareButtons.vue'));
266
+ const SharePlayer = defineAsyncComponent(() => import('../display/sharing/SharePlayer.vue'));
267
+ const EditBox = defineAsyncComponent(() => import('@/components/display/edit/EditBox.vue'));
268
+ const TagList = defineAsyncComponent(() => import('../display/podcasts/TagList.vue'));
269
+ const SubscribeButtons = defineAsyncComponent(() => import('../display/sharing/SubscribeButtons.vue'));
270
+ const RecordingItemButton = defineAsyncComponent(() => import('@/components/display/studio/RecordingItemButton.vue'));
271
+ const Countdown = defineAsyncComponent(() => import('../display/live/CountDown.vue'));
272
+ const CommentSection = defineAsyncComponent(() => import('../display/comments/CommentSection.vue'));
273
+ const ErrorMessage = defineAsyncComponent(() => import('../misc/ErrorMessage.vue'));
283
274
  export default defineComponent({
275
+ name: "Podcast",
284
276
  components: {
285
277
  PodcastInlineList,
286
278
  PodcastImage,
279
+ ParticipantDescription,
287
280
  ShareButtons,
288
281
  SharePlayer,
289
282
  EditBox,
@@ -295,92 +288,61 @@ export default defineComponent({
295
288
  ErrorMessage,
296
289
  },
297
290
 
298
- mixins: [displayMethods],
299
- emits: ['podcastTitle', 'playPodcast', 'initConferenceId'],
291
+ mixins:[displayMethods],
300
292
 
301
- async mounted() {
302
- await this.getPodcastDetails(this.podcastId);
303
- if (!this.isLiveReadyToRecord) return;
304
- if (this.isOctopusAndAnimator) {
305
- let data = await studioApi.getConference(
306
- this.$store,
307
- this.podcast.conferenceId
308
- );
309
- if ('' !== data.data) {
310
- this.fetchConference = data.data;
311
- } else {
312
- this.fetchConference = 'null';
313
- }
314
- } else {
315
- let data = await studioApi.getRealConferenceStatus(
316
- this.$store,
317
- this.podcast.conferenceId
318
- );
319
- this.fetchConference = {
320
- status: data.data,
321
- conferenceId: this.podcast.conferenceId,
322
- };
323
- }
324
- if (
325
- 'null' !== this.fetchConference &&
326
- 'PUBLISHING' !== this.fetchConference.status &&
327
- 'DEBRIEFING' !== this.fetchConference.status
328
- ) {
329
- this.$emit('initConferenceId', this.podcast.conferenceId);
330
- }
293
+ props: {
294
+ updateStatus: { default: undefined, type: String},
295
+ playingPodcast: { default: undefined, type: Object as ()=> Podcast},
296
+ podcastId: { default: 0, type: Number},
297
+ isEducation: { default: false, type: Boolean},
331
298
  },
332
299
 
333
- props: ['podcastId', 'playingPodcast', 'updateStatus', 'isEducation'],
300
+ emits: ['initConferenceId', 'podcastTitle', 'playPodcast'],
334
301
 
335
302
  data() {
336
303
  return {
337
- loaded: false,
338
- podcast: undefined as any,
339
- error: false,
340
- exclusive: false,
341
- notExclusive: false,
342
- fetchConference: undefined as any,
343
- };
344
- },
345
- setup() {
346
- const commentSection:any =ref(null);
347
- return {
348
- commentSection,
304
+ loaded: false as boolean,
305
+ podcast: undefined as Podcast|undefined,
306
+ error: false as boolean,
307
+ exclusive: false as boolean,
308
+ notExclusive: false as boolean,
309
+ fetchConference: undefined as Conference|undefined,
349
310
  };
350
311
  },
351
312
 
352
313
  computed: {
353
- isPodcastmaker() {
314
+ isPodcastmaker(): boolean {
354
315
  return state.generalParameters.podcastmaker;
355
316
  },
356
- isEditBox() {
317
+ isEditBox(): boolean {
357
318
  return state.podcastPage.EditBox;
358
319
  },
359
- isShareButtons() {
320
+ isShareButtons(): boolean {
360
321
  return state.podcastPage.ShareButtons;
361
322
  },
362
- isSharePlayer() {
323
+ isSharePlayer(): boolean {
363
324
  return state.podcastPage.SharePlayer;
364
325
  },
365
- allCategories() {
366
- return state.generalParameters.allCategories;
326
+ allCategories(): any {
327
+ return this.$store.state.categories;
367
328
  },
368
- organisationId() {
329
+ organisationId(): string {
369
330
  return state.generalParameters.organisationId;
370
331
  },
371
- authenticated():boolean {
332
+ authenticated(): boolean {
372
333
  return state.generalParameters.authenticated;
373
334
  },
374
- isOuestFrance() {
335
+ isOuestFrance(): boolean {
375
336
  return state.podcastPage.ouestFranceStyle;
376
337
  },
377
- isTagList() {
338
+ isTagList(): boolean {
378
339
  return state.podcastPage.tagList;
379
340
  },
380
- isDownloadButton() {
341
+ isDownloadButton(): boolean {
381
342
  return state.podcastPage.downloadButton;
382
343
  },
383
- emissionMainCategory():any {
344
+ emissionMainCategory(): number {
345
+ if(!this.podcast){return 0;}
384
346
  if (
385
347
  this.podcast.emission.annotations &&
386
348
  this.podcast.emission.annotations.mainIabId
@@ -394,47 +356,47 @@ export default defineComponent({
394
356
  }
395
357
  return 0;
396
358
  },
397
-
398
- categories():any {
359
+ categories(): any {
399
360
  if ('undefined' === typeof this.podcast) return '';
400
361
  return this.allCategories
401
- .filter((item:any) => {
402
- return (
362
+ .filter((item: any) => {
363
+ return ( this.podcast &&
403
364
  this.podcast.emission.iabIds &&
404
365
  -1 !== this.podcast.emission.iabIds.indexOf(item.id)
405
366
  );
406
367
  })
407
- .sort((a:any, b:any) => {
368
+ .sort((a: any, b: any) => {
408
369
  if (a.id === this.emissionMainCategory) return -1;
409
370
  if (b.id === this.emissionMainCategory) return 1;
410
371
  return 0;
411
372
  });
412
373
  },
413
-
414
- date():string {
415
- if (1970 !== moment(this.podcast.pubDate).year())
416
- return moment(this.podcast.pubDate).format('D MMMM YYYY [à] HH[h]mm');
374
+ date(): string {
375
+ if (this.podcast && 1970 !== moment(this.podcast.pubDate).year()){
376
+ if('fr' === this.$i18n.locale){
377
+ return moment(this.podcast.pubDate).format('D MMMM YYYY [à] HH[h]mm');
378
+ }
379
+ return moment(this.podcast.pubDate).format('D MMMM YYYY [at] HH[h]mm');
380
+ }
417
381
  return '';
418
382
  },
419
-
420
- duration():string {
421
- if (this.podcast.duration <= 1) return '';
383
+ duration(): string {
384
+ if (!this.podcast || this.podcast.duration <= 1) return '';
422
385
  if (this.podcast.duration > 600000) {
423
386
  return humanizeDuration(this.podcast.duration, {
424
- language: 'fr',
387
+ language: this.$i18n.locale,
425
388
  largest: 1,
426
389
  round: true,
427
390
  });
428
391
  }
429
392
  return humanizeDuration(this.podcast.duration, {
430
- language: 'fr',
393
+ language: this.$i18n.locale,
431
394
  largest: 2,
432
395
  round: true,
433
396
  });
434
397
  },
435
-
436
- editRight() {
437
- if (
398
+ editRight(): boolean {
399
+ if ( this.podcast &&
438
400
  (this.authenticated &&
439
401
  this.organisationId === this.podcast.organisation.id) ||
440
402
  state.generalParameters.isAdmin
@@ -442,7 +404,7 @@ export default defineComponent({
442
404
  return true;
443
405
  return false;
444
406
  },
445
- isReady() {
407
+ isReady(): boolean {
446
408
  /* if(this.podcast && this.podcast.processingStatus !== "PLANNED" && this.podcast.processingStatus !== "PROCESSING"){
447
409
  return true;
448
410
  }else{
@@ -450,63 +412,64 @@ export default defineComponent({
450
412
  } */
451
413
  return true;
452
414
  },
453
- countLink() {
415
+ countLink(): number {
454
416
  let count = 0;
455
- if (this.podcast.emission && this.podcast.emission.annotations) {
417
+ if (this.podcast && this.podcast.emission && this.podcast.emission.annotations) {
418
+ if (undefined !== this.podcast.emission.annotations.amazon) count++;
456
419
  if (undefined !== this.podcast.emission.annotations.applePodcast)
457
420
  count++;
458
421
  if (undefined !== this.podcast.emission.annotations.deezer) count++;
459
422
  if (undefined !== this.podcast.emission.annotations.spotify) count++;
460
423
  if (undefined !== this.podcast.emission.annotations.tunein) count++;
461
- if (undefined !== this.podcast.emission.annotations.tootak) count++;
462
424
  if (undefined !== this.podcast.emission.annotations.radioline) count++;
425
+ if (undefined !== this.podcast.emission.annotations.podcastAddict) count++;
426
+ if (undefined !== this.podcast.emission.annotations.playerFm) count++;
427
+ if (undefined !== this.podcast.emission.annotations.stitcher) count++;
463
428
  }
464
429
  return count;
465
430
  },
466
- isLiveReadyToRecord():boolean {
467
- return (
468
- this.podcast.conferenceId &&
469
- 0 !== this.podcast.conferenceId &&
470
- 'READY_TO_RECORD' === this.podcast.processingStatus
471
- );
431
+ isLiveReadyToRecord(): boolean {
432
+ return (undefined!==this.podcast && undefined!==this.podcast.conferenceId && 0 !== this.podcast.conferenceId && 'READY_TO_RECORD' === this.podcast.processingStatus);
472
433
  },
473
- isLiveReady():boolean {
434
+ isLiveReady(): boolean {
474
435
  return (
475
- this.podcast.conferenceId &&
436
+ undefined!==this.podcast &&
437
+ undefined!==this.podcast.conferenceId &&
476
438
  0 !== this.podcast.conferenceId &&
477
439
  'READY' === this.podcast.processingStatus
478
440
  );
479
441
  },
480
- isCounter():boolean {
442
+ isCounter(): boolean {
481
443
  return (
482
444
  this.isLiveReadyToRecord &&
483
- this.fetchConference &&
445
+ undefined!==this.fetchConference &&
484
446
  ('PLANNED' === this.fetchConference.status ||
485
447
  'PENDING' === this.fetchConference.status)
486
448
  );
487
449
  },
488
- isNotRecorded():boolean {
450
+ isNotRecorded(): boolean {
489
451
  return (
490
452
  this.isLiveReadyToRecord &&
491
- this.fetchConference &&
453
+ undefined!==this.fetchConference &&
492
454
  'DEBRIEFING' === this.fetchConference.status
493
455
  );
494
456
  },
495
- isOctopusAndAnimator() {
457
+ isOctopusAndAnimator(): boolean {
496
458
  return (
497
459
  !this.isPodcastmaker &&
498
460
  this.editRight &&
499
461
  state.generalParameters.isRoleLive
500
462
  );
501
463
  },
502
- titlePage():string {
503
- if (this.isLiveReadyToRecord) return this.$t('Live episode');
504
- return this.$t('Episode');
464
+ titlePage(): string {
465
+ if (this.isLiveReadyToRecord) return this.$t('Live episode').toString();
466
+ return this.$t('Episode').toString();
505
467
  },
506
- timeRemaining():string {
468
+ timeRemaining(): string {
469
+ if(!this.podcast){return "";}
507
470
  return moment(this.podcast.pubDate).diff(moment(), 'seconds');
508
471
  },
509
- podcastNotValid() {
472
+ podcastNotValid(): boolean {
510
473
  if (
511
474
  this.podcast &&
512
475
  this.podcast.availability &&
@@ -516,14 +479,56 @@ export default defineComponent({
516
479
  return false;
517
480
  },
518
481
  },
519
-
482
+ watch: {
483
+ updateStatus(): void {
484
+ if (this.fetchConference && null !== this.fetchConference) {
485
+ this.fetchConference.status = this.updateStatus;
486
+ }
487
+ },
488
+ podcastId(): void {
489
+ this.loaded = false;
490
+ this.error = false;
491
+ this.getPodcastDetails(this.podcastId);
492
+ },
493
+ },
494
+
495
+ async mounted() {
496
+ await this.getPodcastDetails(this.podcastId);
497
+ if (!this.podcast) return;
498
+ if (!this.isLiveReadyToRecord) return;
499
+ if (this.isOctopusAndAnimator && undefined!==this.podcast.conferenceId) {
500
+ const data: any = await studioApi.getConference(this.$store.state,this.podcast.conferenceId.toString());
501
+ if ('' !== data.data) {
502
+ this.fetchConference = data.data;
503
+ } else {
504
+ this.fetchConference = {conferenceId:-1, title:''};
505
+ }
506
+ } else if(undefined!==this.podcast.conferenceId){
507
+ const data: any = await octopusApi.getRealConferenceStatus(this.podcast.conferenceId.toString());
508
+ this.fetchConference = {
509
+ status: data.data,
510
+ conferenceId: this.podcast.conferenceId,
511
+ title:'',
512
+ };
513
+ }
514
+ if (
515
+ this.fetchConference &&
516
+ -1 !== this.fetchConference.conferenceId &&
517
+ 'PUBLISHING' !== this.fetchConference.status &&
518
+ 'DEBRIEFING' !== this.fetchConference.status
519
+ ) {
520
+ this.$emit('initConferenceId', this.podcast.conferenceId);
521
+ }
522
+ },
523
+
524
+
520
525
  methods: {
521
- updatePodcast(podcastUpdated: any) {
526
+ updatePodcast(podcastUpdated: Podcast): void {
522
527
  this.podcast = podcastUpdated;
523
528
  },
524
- async getPodcastDetails(podcastId: any) {
529
+ async getPodcastDetails(podcastId: number): Promise<void> {
525
530
  try {
526
- let data = await octopusApi.fetchPodcast(podcastId);
531
+ const data : Podcast = await octopusApi.fetchPodcast(podcastId);
527
532
  this.podcast = data;
528
533
  this.$emit('podcastTitle', this.podcast.title);
529
534
  if (
@@ -562,36 +567,45 @@ export default defineComponent({
562
567
  this.loaded = true;
563
568
  }
564
569
  },
565
- getName(person: { firstName: string; lastName: string; }) {
570
+ getName(person: any): string {
566
571
  const first = person.firstName || '';
567
572
  const last = person.lastName || '';
568
573
  return (first + ' ' + last).trim();
569
574
  },
570
- playPodcast(podcast: any) {
575
+ playPodcast(podcast: Podcast): void {
571
576
  this.$emit('playPodcast', podcast);
572
577
  },
573
- removeDeleted() {
578
+ removeDeleted(): void {
574
579
  if (window.history.length > 1) {
575
580
  this.$router.go(-1);
576
581
  } else {
577
582
  this.$router.push('/');
578
583
  }
579
584
  },
580
- receiveCommentEvent(event: any) {
581
- this.commentSection.receiveCommentEvent(event);
582
- },
583
- },
584
- watch: {
585
- updateStatus() {
586
- if (this.fetchConference && null !== this.fetchConference) {
587
- this.fetchConference.status = this.updateStatus;
588
- }
589
- },
590
- podcastId(val) {
591
- this.loaded = false;
592
- this.error = false;
593
- this.getPodcastDetails(val);
585
+ receiveCommentEvent(event: any): void {
586
+ (this.$refs.commentSection as any).receiveCommentEvent(event);
594
587
  },
595
588
  },
596
- });
589
+ })
597
590
  </script>
591
+
592
+ <style lang="scss">
593
+ .title-page-podcast {
594
+ font-size: 0.9rem;
595
+ }
596
+ .width-fit-content{
597
+ width: fit-content;
598
+ }
599
+
600
+ .date-text-zone {
601
+ display: flex;
602
+ flex-wrap: wrap;
603
+ margin-bottom: 1rem;
604
+ @media (max-width: 600px) {
605
+ display: initial;
606
+ .duration {
607
+ margin-left: 0 !important;
608
+ }
609
+ }
610
+ }
611
+ </style>