@saooti/octopus-sdk 40.2.19 → 41.0.1-SNAPSHOT

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 (204) hide show
  1. package/package.json +2 -3
  2. package/src/App.vue +68 -88
  3. package/src/components/composable/player/usePlayerLive.ts +12 -3
  4. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  5. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  6. package/src/components/composable/useInit.ts +2 -2
  7. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  8. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  9. package/src/components/display/categories/CategoryChooser.vue +142 -145
  10. package/src/components/display/categories/CategoryFilter.vue +172 -198
  11. package/src/components/display/categories/CategoryList.vue +122 -147
  12. package/src/components/display/comments/CommentInput.vue +100 -122
  13. package/src/components/display/comments/CommentList.vue +169 -191
  14. package/src/components/display/comments/CommentName.vue +35 -45
  15. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  16. package/src/components/display/comments/CommentPlayer.vue +38 -50
  17. package/src/components/display/comments/CommentSection.vue +85 -103
  18. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  19. package/src/components/display/comments/item/CommentItem.vue +101 -116
  20. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  21. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  22. package/src/components/display/comments/like/LikeButton.vue +36 -41
  23. package/src/components/display/comments/like/LikeSection.vue +128 -136
  24. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  25. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  26. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  27. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  28. package/src/components/display/edit/EditBox.vue +6 -9
  29. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  30. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  31. package/src/components/display/emission/EmissionItem.vue +57 -69
  32. package/src/components/display/emission/EmissionList.vue +192 -218
  33. package/src/components/display/emission/EmissionPlayerItem.vue +47 -64
  34. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  35. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  36. package/src/components/display/filter/AdvancedSearch.vue +154 -176
  37. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  38. package/src/components/display/filter/DateFilter.vue +76 -91
  39. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  40. package/src/components/display/filter/ProductorSearch.vue +87 -90
  41. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  42. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  43. package/src/components/display/filter/SearchOrder.vue +35 -35
  44. package/src/components/display/list/ListPaginate.vue +80 -93
  45. package/src/components/display/list/PaginateParams.vue +36 -40
  46. package/src/components/display/list/PaginateSection.vue +113 -124
  47. package/src/components/display/list/SwiperList.vue +97 -109
  48. package/src/components/display/live/CountDown.vue +15 -9
  49. package/src/components/display/live/CountdownOctopus.vue +16 -10
  50. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  51. package/src/components/display/live/LiveItem.vue +65 -73
  52. package/src/components/display/live/LiveList.vue +125 -137
  53. package/src/components/display/live/RadioCurrently.vue +66 -73
  54. package/src/components/display/live/RadioImage.vue +39 -50
  55. package/src/components/display/live/RadioItem.vue +9 -14
  56. package/src/components/display/live/RadioList.vue +39 -53
  57. package/src/components/display/live/RadioPlanning.vue +210 -222
  58. package/src/components/display/organisation/OrganisationChooser.vue +116 -122
  59. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  60. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  61. package/src/components/display/participant/ParticipantItem.vue +66 -74
  62. package/src/components/display/participant/ParticipantList.vue +119 -141
  63. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  64. package/src/components/display/playlist/PlaylistList.vue +118 -144
  65. package/src/components/display/playlist/PodcastList.vue +79 -101
  66. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  67. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  68. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  69. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  70. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  71. package/src/components/display/podcasts/PodcastFilterList.vue +48 -53
  72. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  73. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  74. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  75. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  76. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  77. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  78. package/src/components/display/podcasts/PodcastList.vue +183 -206
  79. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  80. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  81. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  82. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  83. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  84. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  85. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  86. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  87. package/src/components/display/podcasts/TagList.vue +48 -50
  88. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  89. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  90. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  91. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  92. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  93. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  94. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  95. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  96. package/src/components/display/sharing/QrCode.vue +55 -67
  97. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  98. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  99. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  100. package/src/components/display/sharing/SharePlayer.vue +273 -295
  101. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  102. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  103. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  104. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  105. package/src/components/display/sharing/SubscribeButtons.vue +184 -207
  106. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  107. package/src/components/form/ClassicCheckbox.vue +26 -30
  108. package/src/components/form/ClassicContentEditable.vue +37 -33
  109. package/src/components/form/ClassicCopyButton.vue +40 -44
  110. package/src/components/form/ClassicDatePicker.vue +114 -114
  111. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  112. package/src/components/form/ClassicInputText.vue +116 -120
  113. package/src/components/form/ClassicLoading.vue +7 -12
  114. package/src/components/form/ClassicMultiselect.vue +106 -116
  115. package/src/components/form/ClassicRadio.vue +21 -16
  116. package/src/components/form/ClassicRadioLabel.vue +23 -22
  117. package/src/components/form/ClassicSearch.vue +24 -19
  118. package/src/components/form/ClassicSelect.vue +47 -38
  119. package/src/components/form/ClassicWysiwyg.vue +116 -123
  120. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  121. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  122. package/src/components/icons/BlueSkyIcon.vue +8 -11
  123. package/src/components/icons/DeezerIcon.vue +8 -11
  124. package/src/components/icons/EditFtpIcon.vue +8 -11
  125. package/src/components/icons/IHeartIcon.vue +8 -11
  126. package/src/components/icons/PlayVideoIcon.vue +7 -10
  127. package/src/components/icons/PlayerFmIcon.vue +7 -10
  128. package/src/components/icons/PocketCastIcon.vue +8 -11
  129. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  130. package/src/components/icons/RadiolineIcon.vue +8 -11
  131. package/src/components/icons/TuninIcon.vue +8 -11
  132. package/src/components/icons/XIcon.vue +7 -10
  133. package/src/components/misc/AcpmImage.vue +6 -7
  134. package/src/components/misc/ClassicAccordion.vue +26 -31
  135. package/src/components/misc/ClassicLazy.vue +86 -90
  136. package/src/components/misc/ClassicNav.vue +16 -20
  137. package/src/components/misc/ClassicPopover.vue +266 -282
  138. package/src/components/misc/ClassicSpinner.vue +5 -27
  139. package/src/components/misc/ErrorMessage.vue +11 -12
  140. package/src/components/misc/FooterGarSection.vue +33 -41
  141. package/src/components/misc/FooterSection.vue +109 -130
  142. package/src/components/misc/HomeDropdown.vue +83 -105
  143. package/src/components/misc/MobileMenu.vue +101 -111
  144. package/src/components/misc/ProgressBar.vue +53 -62
  145. package/src/components/misc/TopBar.vue +97 -120
  146. package/src/components/misc/TopBarMainContent.vue +114 -133
  147. package/src/components/misc/modal/ClassicModal.vue +40 -33
  148. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  149. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  150. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  151. package/src/components/misc/modal/MessageModal.vue +50 -47
  152. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  153. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  154. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  155. package/src/components/misc/player/PlayerCompact.vue +6 -4
  156. package/src/components/misc/player/PlayerComponent.vue +8 -9
  157. package/src/components/misc/player/PlayerLarge.vue +9 -8
  158. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  159. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  160. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  161. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  162. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  163. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  164. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  165. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  166. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  167. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  168. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  169. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  170. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  171. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  172. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  173. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  174. package/src/components/pages/CategoryPage.vue +28 -33
  175. package/src/components/pages/EmissionPage.vue +99 -132
  176. package/src/components/pages/EmissionsPage.vue +2 -0
  177. package/src/components/pages/Error403Page.vue +21 -20
  178. package/src/components/pages/HomePage.vue +91 -100
  179. package/src/components/pages/LivesPage.vue +35 -37
  180. package/src/components/pages/MapPage.vue +209 -241
  181. package/src/components/pages/PageLogout.vue +8 -11
  182. package/src/components/pages/PageNotFound.vue +9 -5
  183. package/src/components/pages/ParticipantPage.vue +82 -110
  184. package/src/components/pages/ParticipantsPage.vue +3 -0
  185. package/src/components/pages/PlaylistPage.vue +97 -115
  186. package/src/components/pages/PlaylistsPage.vue +9 -2
  187. package/src/components/pages/PodcastPage.vue +223 -238
  188. package/src/components/pages/PodcastsPage.vue +9 -2
  189. package/src/components/pages/RadioPage.vue +56 -70
  190. package/src/components/pages/RubriquePage.vue +7 -3
  191. package/src/components/pages/SearchPage.vue +31 -36
  192. package/src/components/pages/TagPage.vue +11 -9
  193. package/src/components/pages/VideoPage.vue +14 -11
  194. package/src/helper/displayHelper.ts +1 -1
  195. package/src/i18n.ts +2 -2
  196. package/src/main.ts +1 -1
  197. package/src/stores/class/general/player.ts +1 -0
  198. package/public/css/fonts/icomoon.eot +0 -0
  199. package/public/css/fonts/icomoon.svg +0 -113
  200. package/public/css/fonts/icomoon.ttf +0 -0
  201. package/public/css/fonts/icomoon.woff +0 -0
  202. package/public/css/fonts/icomoon.woff2 +0 -0
  203. package/public/css/fonts/style.css +0 -352
  204. package/sonarqube-scanner.js +0 -10
@@ -4,14 +4,14 @@
4
4
  class="d-flex justify-content-between flex-grow-1 mb-3 w-100 align-items-center"
5
5
  >
6
6
  <h2 class="mb-0">
7
- {{ $t("Live") }}
7
+ {{ t("Live") }}
8
8
  </h2>
9
9
  <router-link
10
10
  v-if="liveRight && !isPodcastmaker"
11
11
  to="/main/priv/edit/live"
12
12
  >
13
13
  <button class="btn btn-primary">
14
- {{ $t("Launch a new live") }}
14
+ {{ t("Launch a new live") }}
15
15
  </button>
16
16
  </router-link>
17
17
  </div>
@@ -19,14 +19,14 @@
19
19
  v-if="lives.length || 'ALL' !== selectedStatus"
20
20
  v-model:text-init="selectedStatus"
21
21
  id-select="status-live-chooser-select"
22
- :label="$t('Selection by status')"
22
+ :label="t('Selection by status')"
23
23
  :display-label="false"
24
24
  :options="statusArraySelect"
25
25
  class="mb-3"
26
26
  />
27
27
  <ClassicLoading
28
- :loading-text="loading ? $t('Loading lives...') : undefined"
29
- :error-text="0 === lives.length ? $t('No live currently') : undefined"
28
+ :loading-text="loading ? t('Loading lives...') : undefined"
29
+ :error-text="0 === lives.length ? t('No live currently') : undefined"
30
30
  />
31
31
  <template v-if="lives.length">
32
32
  <SwiperList v-if="!loading" :list-object="lives">
@@ -42,7 +42,7 @@
42
42
  </section>
43
43
  </template>
44
44
 
45
- <script lang="ts">
45
+ <script setup lang="ts">
46
46
  import ClassicLoading from "../../form/ClassicLoading.vue";
47
47
  import LiveItem from "./LiveItem.vue";
48
48
  import ClassicSelect from "../../form/ClassicSelect.vue";
@@ -52,85 +52,79 @@ import {useOrgaComputed} from "../../composable/useOrgaComputed";
52
52
  import classicApi from "../../../api/classicApi";
53
53
  import { useAuthStore } from "../../../stores/AuthStore";
54
54
  import { useFilterStore } from "../../../stores/FilterStore";
55
- import { mapActions, mapState } from "pinia";
56
55
  import { Conference } from "@/stores/class/conference/conference";
57
- import { defineComponent } from "vue";
56
+ import { computed, Ref, ref, watch } from "vue";
58
57
  import { AxiosError } from "axios";
59
58
  import { useSaveFetchStore } from "../../../stores/SaveFetchStore";
60
- export default defineComponent({
61
- name: "LiveList",
62
- components: {
63
- LiveItem,
64
- ClassicLoading,
65
- SwiperList,
66
- ClassicSelect,
67
- },
59
+ import { useI18n } from "vue-i18n";
68
60
 
69
- props: {
70
- organisationId: { default: undefined, type: String },
71
- hideIfEmpty: { default: false, type: Boolean },
72
- },
73
- setup(){
74
- const { isPodcastmaker, isEditRights } = useOrgaComputed();
75
- const {handle403} = useErrorHandler();
76
- return { isPodcastmaker, isEditRights, handle403 }
77
- },
78
- data() {
79
- return {
80
- loading: true as boolean,
81
- loaded: true as boolean,
82
- lives: [] as Array<Conference>,
83
- isLiveAuthorized: false as boolean,
84
- statusClassic: ["RECORDING", "PENDING", "PLANNED"] as Array<string>,
85
- statusAdmin: ["DEBRIEFING", "ERROR", "PUBLISHING"] as Array<string>,
86
- selectedStatus: "ALL" as string,
87
- };
88
- },
61
+ //Props
62
+ const props = defineProps({
63
+ organisationId: { default: undefined, type: String },
64
+ hideIfEmpty: { default: false, type: Boolean },
65
+ })
89
66
 
90
- computed: {
91
- ...mapState(useAuthStore, ["authOrganisation", "isRoleLive"]),
92
- ...mapState(useFilterStore, ["filterOrgaId"]),
93
- displayLiveList(): boolean {
94
- return (
95
- (undefined !== this.filterOrgaId ||
96
- undefined !== this.organisationId) &&
97
- (!this.hideIfEmpty || (this.hideIfEmpty && 0 !== this.lives.length))
98
- );
99
- },
100
- filterOrgaUsed(): string | undefined {
101
- return this.filterOrgaId ? this.filterOrgaId : this.organisationId;
102
- },
103
- editRight(): boolean {
104
- return this.isEditRights(this.filterOrgaUsed);
105
- },
106
- liveRight(): boolean {
107
- return (
108
- this.isRoleLive &&
109
- "true" === this.authOrganisation.attributes?.["live.active"]
110
- );
111
- },
112
- statusArraySelect(): Array<{ title: string; value: string }> {
113
- const statusArray = [{ title: this.$t("All lives"), value: "ALL" }];
114
- for (const status of this.statusFetched) {
67
+ //Data
68
+ const loading = ref(true);
69
+ const loaded = ref(true);
70
+ const lives: Ref<Array<Conference>> = ref([]);
71
+ const isLiveAuthorized = ref(false);
72
+ const statusClassic= ref(["RECORDING", "PENDING", "PLANNED"]);
73
+ const statusAdmin = ref(["DEBRIEFING", "ERROR", "PUBLISHING"]);
74
+ const selectedStatus = ref("ALL");
75
+
76
+
77
+ //Composables
78
+ const { t } = useI18n();
79
+ const { isPodcastmaker, isEditRights } = useOrgaComputed();
80
+ const {handle403} = useErrorHandler();
81
+ const authStore = useAuthStore();
82
+ const filterStore = useFilterStore();
83
+ const saveFetchStore = useSaveFetchStore();
84
+
85
+
86
+ //Computed
87
+ const displayLiveList = computed(() => {
88
+ return (
89
+ (undefined !== filterStore.filterOrgaId ||
90
+ undefined !== props.organisationId) &&
91
+ (!props.hideIfEmpty || (props.hideIfEmpty && 0 !== lives.value.length))
92
+ );
93
+ });
94
+ const filterOrgaUsed = computed(() => {
95
+ return filterStore.filterOrgaId ? filterStore.filterOrgaId : props.organisationId;
96
+ });
97
+ const editRight = computed(() => {
98
+ return isEditRights(filterOrgaUsed.value);
99
+ });
100
+ const liveRight = computed(() => {
101
+ return (
102
+ authStore.isRoleLive &&
103
+ "true" === authStore.authOrganisation.attributes?.["live.active"]
104
+ );
105
+ });
106
+ const statusArraySelect = computed(() => {
107
+ const statusArray = [{ title: t("All lives"), value: "ALL" }];
108
+ for (const status of statusFetched.value) {
115
109
  let title = "";
116
110
  switch (status) {
117
111
  case "RECORDING":
118
- title = this.$t("In live");
112
+ title = t("In live");
119
113
  break;
120
114
  case "PENDING":
121
- title = this.$t("live upcoming");
115
+ title = t("live upcoming");
122
116
  break;
123
117
  case "PLANNED":
124
- title = this.$t("live in few time");
118
+ title = t("live in few time");
125
119
  break;
126
120
  case "DEBRIEFING":
127
- title = this.$t("In debriefing");
121
+ title = t("In debriefing");
128
122
  break;
129
123
  case "PUBLISHING":
130
- title = this.$t("In the process of being published");
124
+ title = t("In the process of being published");
131
125
  break;
132
126
  case "ERROR":
133
- title = this.$t("In error");
127
+ title = t("In error");
134
128
  break;
135
129
  default:
136
130
  break;
@@ -138,75 +132,69 @@ export default defineComponent({
138
132
  statusArray.push({ title: title, value: status });
139
133
  }
140
134
  return statusArray;
141
- },
142
- statusFetched(): Array<string> {
143
- if (this.editRight) {
144
- return this.statusClassic.concat(this.statusAdmin);
145
- }
146
- return this.statusClassic;
147
- },
148
- },
149
- watch: {
150
- filterOrgaUsed: {
151
- async handler(): Promise<void> {
152
- await this.checkIfLiveAuthorized();
153
- this.fetchContent();
154
- },
155
- immediate: true,
156
- },
157
- selectedStatus() {
158
- this.fetchContent();
159
- },
160
- },
161
- methods: {
162
- ...mapActions(useSaveFetchStore, ["getOrgaLiveEnabled"]),
163
- async checkIfLiveAuthorized(): Promise<void> {
164
- if (!this.filterOrgaUsed) {
165
- return;
166
- }
167
- this.isLiveAuthorized = await this.getOrgaLiveEnabled(
168
- this.filterOrgaUsed,
169
- );
170
- },
171
- endLoading(): void {
172
- this.loading = false;
173
- this.loaded = true;
174
- },
175
- updateLive(live: Conference, index: number): void {
176
- this.lives.splice(index, 1, live);
177
- },
178
- async fetchContent(): Promise<void> {
179
- this.lives.length = 0;
180
- if (!this.filterOrgaUsed || !this.isLiveAuthorized) {
181
- this.endLoading();
182
- return;
183
- }
184
- this.loading = true;
185
- this.loaded = false;
186
- try {
187
- const dataLives = await classicApi.fetchData<Array<Conference>>({
188
- api: 9,
189
- path: "conference/list",
190
- parameters: {
191
- organisationId: this.filterOrgaUsed,
192
- withPodcastId: true,
193
- status:
194
- "ALL" === this.selectedStatus
195
- ? this.statusFetched
196
- : this.selectedStatus,
197
- },
198
- });
199
- this.lives = dataLives.filter((p: Conference | null) => {
200
- return null !== p;
201
- });
202
- } catch (error) {
203
- this.handle403(error as AxiosError);
204
- }
205
- this.endLoading();
206
- },
207
- deleteLive(index: number): void {
208
- this.lives.splice(index, 1);
209
- },
210
- },
211
135
  });
136
+ const statusFetched = computed(() => {
137
+ if (editRight.value) {
138
+ return statusClassic.value.concat(statusAdmin.value);
139
+ }
140
+ return statusClassic.value;
141
+ });
142
+
143
+
144
+ //Watch
145
+ watch(filterOrgaUsed, async () => {
146
+ await checkIfLiveAuthorized();
147
+ fetchContent();
148
+ }, {immediate: true});
149
+ watch(selectedStatus, () => fetchContent());
150
+
151
+
152
+ //Methods
153
+ async function checkIfLiveAuthorized(): Promise<void> {
154
+ if (!filterOrgaUsed.value) {
155
+ return;
156
+ }
157
+ isLiveAuthorized.value = await saveFetchStore.getOrgaLiveEnabled(
158
+ filterOrgaUsed.value,
159
+ );
160
+ }
161
+ function endLoading(): void {
162
+ loading.value = false;
163
+ loaded.value = true;
164
+ }
165
+ function updateLive(live: Conference, index: number): void {
166
+ lives.value.splice(index, 1, live);
167
+ }
168
+ async function fetchContent(): Promise<void> {
169
+ lives.value.length = 0;
170
+ if (!filterOrgaUsed.value || !isLiveAuthorized.value) {
171
+ endLoading();
172
+ return;
173
+ }
174
+ loading.value = true;
175
+ loaded.value = false;
176
+ try {
177
+ const dataLives = await classicApi.fetchData<Array<Conference>>({
178
+ api: 9,
179
+ path: "conference/list",
180
+ parameters: {
181
+ organisationId: filterOrgaUsed.value,
182
+ withPodcastId: true,
183
+ status:
184
+ "ALL" === selectedStatus.value
185
+ ? statusFetched.value
186
+ : selectedStatus.value,
187
+ },
188
+ });
189
+ lives.value = dataLives.filter((p: Conference | null) => {
190
+ return null !== p;
191
+ });
192
+ } catch (error) {
193
+ handle403(error as AxiosError);
194
+ }
195
+ endLoading();
196
+ }
197
+ function deleteLive(index: number): void {
198
+ lives.value.splice(index, 1);
199
+ }
212
200
  </script>
@@ -4,7 +4,7 @@
4
4
  v-if="currentlyPlayingString.length || podcastRadio"
5
5
  class="me-2 fw-bold"
6
6
  >
7
- {{ $t("Currently") + " : " }}
7
+ {{ t("Currently") + " : " }}
8
8
  </div>
9
9
  <router-link
10
10
  v-if="podcastRadio"
@@ -13,16 +13,17 @@
13
13
  name: 'podcast',
14
14
  params: { podcastId: podcastRadio.podcastId },
15
15
  }"
16
- :title="$t('Episode name page', { name: podcastRadio.title })"
16
+ :title="t('Episode name page', { name: podcastRadio.title })"
17
17
  >
18
18
  <img
19
19
  v-lazy="useProxyImageUrl(podcastRadio.imageUrl, '80')"
20
20
  width="80"
21
21
  height="80"
22
22
  class="small-img-box"
23
- role="presentation"
23
+ aria-hidden="true"
24
+ alt=""
24
25
 
25
- :title="$t('Episode name image', { name: podcastRadio.title })"
26
+ :title="t('Episode name image', { name: podcastRadio.title })"
26
27
  />
27
28
  <div>{{ podcastRadio.title }}</div>
28
29
  </router-link>
@@ -32,87 +33,79 @@
32
33
  </div>
33
34
  </template>
34
35
 
35
- <script lang="ts">
36
+ <script setup lang="ts">
36
37
  import {useFetchRadio} from "../../composable/radio/usefetchRadioData";
37
38
  import { usePlayerStore } from "../../../stores/PlayerStore";
38
- import { mapState } from "pinia";
39
39
  import {useImageProxy} from "../../composable/useImageProxy";
40
- import { defineComponent } from "vue";
40
+ import { computed, onMounted, onUnmounted, ref, Ref } from "vue";
41
41
  import { Canal } from "@/stores/class/radio/canal";
42
42
  import { MediaRadio } from "@/stores/class/general/player";
43
43
  import { Podcast } from "@/stores/class/general/podcast";
44
- export default defineComponent({
45
- name: "RadioItem",
44
+ import { useI18n } from "vue-i18n";
46
45
 
47
- components: {},
46
+ //Props
47
+ const props = defineProps({
48
+ radio: { default: undefined, type: Object as () => Canal },
49
+ })
48
50
 
49
- props: {
50
- radio: { default: undefined, type: Object as () => Canal },
51
- },
52
- setup(){
53
- const { fetchRadioMetadata, displayTitle } = useFetchRadio();
54
- const { useProxyImageUrl } = useImageProxy();
55
- return { fetchRadioMetadata, displayTitle, useProxyImageUrl };
56
- },
51
+ //Data
52
+ const currentMetadata: Ref<MediaRadio | undefined> = ref(undefined);
53
+ const currentPodcast: Ref<Podcast | undefined> = ref(undefined);
54
+ const radioInterval: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined);
57
55
 
56
+
57
+ //Composables
58
+ const { t } = useI18n();
59
+ const { fetchRadioMetadata, displayTitle } = useFetchRadio();
60
+ const { useProxyImageUrl } = useImageProxy();
61
+ const playerStore = usePlayerStore();
58
62
 
59
- data() {
60
- return {
61
- currentMetadata: undefined as undefined | MediaRadio,
62
- currentPodcast: undefined as undefined | Podcast,
63
- radioInterval: undefined as ReturnType<typeof setTimeout> | undefined,
64
- };
65
- },
63
+ //Computed
64
+ const playingRadio = computed(() => playerStore.playerRadio && playerStore.playerRadio.canalId === props.radio?.id);
65
+ const podcastRadio = computed(() => {
66
+ if (playingRadio.value) {
67
+ return playerStore.playerRadio?.podcast;
68
+ }
69
+ return currentPodcast.value;
70
+ });
71
+ const currentlyPlayingString = computed(() => {
72
+ if (playingRadio.value && playerStore.playerRadio) {
73
+ return displayTitle(playerStore.playerRadio.metadata);
74
+ }
75
+ if (currentMetadata.value) {
76
+ return displayTitle(currentMetadata.value);
77
+ }
78
+ return "";
79
+ });
66
80
 
67
- computed: {
68
- ...mapState(usePlayerStore, ["playerRadio"]),
69
- playingRadio() {
70
- return this.playerRadio && this.playerRadio.canalId === this.radio?.id;
71
- },
72
- podcastRadio(): Podcast | undefined {
73
- if (this.playingRadio) {
74
- return this.playerRadio?.podcast;
75
- }
76
- return this.currentPodcast;
77
- },
78
- currentlyPlayingString(): string {
79
- if (this.playingRadio && this.playerRadio) {
80
- return this.displayTitle(this.playerRadio.metadata);
81
- }
82
- if (this.currentMetadata) {
83
- return this.displayTitle(this.currentMetadata);
84
- }
85
- return "";
86
- },
87
- },
81
+ onMounted(()=>{
82
+ fetchCurrentlyPlaying();
83
+ radioInterval.value = setInterval(() => {
84
+ fetchCurrentlyPlaying();
85
+ }, 10000);
86
+ })
88
87
 
89
- mounted() {
90
- this.fetchCurrentlyPlaying();
91
- this.radioInterval = setInterval(() => {
92
- this.fetchCurrentlyPlaying();
93
- }, 10000);
94
- },
95
- unmounted(){
96
- clearInterval(this.radioInterval as unknown as number);
97
- this.radioInterval= undefined;
98
- },
99
- methods: {
100
- async fetchCurrentlyPlaying(): Promise<void> {
101
- if (!this.radio || this.playingRadio) {
102
- return;
103
- }
104
- this.fetchRadioMetadata(
105
- this.radio.id,
106
- this.currentMetadata?.title ?? "",
107
- this.updateMetadata,
108
- );
109
- },
110
- updateMetadata(metadata: MediaRadio, podcast?: Podcast): void {
111
- this.currentMetadata = metadata;
112
- this.currentPodcast = podcast;
113
- },
114
- },
115
- });
88
+ onUnmounted(()=>{
89
+ clearInterval(radioInterval.value as unknown as number);
90
+ radioInterval.value= undefined;
91
+ })
92
+
93
+
94
+ //Methods
95
+ async function fetchCurrentlyPlaying(): Promise<void> {
96
+ if (!props.radio || playingRadio.value) {
97
+ return;
98
+ }
99
+ fetchRadioMetadata(
100
+ props.radio.id,
101
+ currentMetadata.value?.title ?? "",
102
+ updateMetadata,
103
+ );
104
+ }
105
+ function updateMetadata(metadata: MediaRadio, podcast?: Podcast): void {
106
+ currentMetadata.value = metadata;
107
+ currentPodcast.value = podcast;
108
+ }
116
109
  </script>
117
110
  <style lang="scss">
118
111
  .octopus-app .small-img-box {
@@ -10,13 +10,14 @@
10
10
  "
11
11
  width="270"
12
12
  height="270"
13
- role="presentation"
13
+ aria-hidden="true"
14
+ alt=""
14
15
 
15
16
  class="img-box img-box-podcast"
16
- :title="$t('Canal name image', { name: radio.name })"
17
+ :title="t('Canal name image', { name: radio.name })"
17
18
  />
18
19
  <button class="radio-play-button" @click="playRadio">
19
- <PlayIcon v-if="!playingRadio" :title="$t('Play')" :size="40" />
20
+ <PlayIcon v-if="!playingRadio" :title="t('Play')" :size="40" />
20
21
  <PodcastIsPlaying v-else/>
21
22
  <div class="ms-2">
22
23
  {{ playText }}
@@ -25,62 +26,50 @@
25
26
  </div>
26
27
  </template>
27
28
 
28
- <script lang="ts">
29
+ <script setup lang="ts">
29
30
  import PlayIcon from "vue-material-design-icons/Play.vue";
30
31
  import { usePlayerStore } from "../../../stores/PlayerStore";
31
- import { useFilterStore } from "../../../stores/FilterStore";
32
- import { mapState, mapActions } from "pinia";
32
+ import { useAuthStore } from "../../../stores/AuthStore";
33
33
  import {useImageProxy} from "../../composable/useImageProxy";
34
- import { defineAsyncComponent, defineComponent } from "vue";
34
+ import { computed, defineAsyncComponent } from "vue";
35
35
  import { Canal } from "@/stores/class/radio/canal";
36
+ import { useI18n } from "vue-i18n";
36
37
  const PodcastIsPlaying = defineAsyncComponent(() => import("../podcasts/PodcastIsPlaying.vue"));
37
- export default defineComponent({
38
- name: "RadioImage",
39
38
 
40
- components: {
41
- PlayIcon,
42
- PodcastIsPlaying
43
- },
39
+ //Props
40
+ const props = defineProps({
41
+ radio: { default: undefined, type: Object as () => Canal },
42
+ })
44
43
 
45
- props: {
46
- radio: { default: undefined, type: Object as () => Canal },
47
- },
48
- setup(){
49
- const { useProxyImageUrl } = useImageProxy();
50
- return { useProxyImageUrl }
51
- },
44
+ //Composables
45
+ const { t } = useI18n();
46
+ const { useProxyImageUrl } = useImageProxy();
47
+ const authStore = useAuthStore();
48
+ const playerStore = usePlayerStore();
52
49
 
53
- computed: {
54
- ...mapState(usePlayerStore, ["playerRadio", "playerStatus"]),
55
- ...mapState(useFilterStore, ["filterOrgaId"]),
56
- playingRadio() {
57
- return this.playerRadio && this.playerRadio.canalId === this.radio?.id;
58
- },
59
- playText(): string {
60
- return this.playingRadio && "PLAYING" === this.playerStatus
61
- ? this.$t("Pause")
62
- : this.$t("Play");
63
- },
64
- },
65
-
66
- methods: {
67
- ...mapActions(usePlayerStore, ["playerPlay", "playerChangeStatus"]),
68
- playRadio(): void {
69
- if (!this.radio) {
70
- return;
71
- }
72
- if (this.playingRadio) {
73
- this.playerChangeStatus("PLAYING" === this.playerStatus);
74
- } else {
75
- this.playerPlay({
76
- canalId: this.radio.id,
77
- url: "https://" + this.radio.url + "/live.m3u8",
78
- metadata: "",
79
- });
80
- }
81
- },
82
- },
50
+ //Computed
51
+ const playingRadio = computed(() => playerStore.playerRadio && playerStore.playerRadio.canalId === props.radio?.id);
52
+ const playText = computed(() => {
53
+ return playingRadio.value && "PLAYING" === playerStore.playerStatus? t("Pause") : t("Play");
83
54
  });
55
+
56
+
57
+ //Methods
58
+ function playRadio(): void {
59
+ if (!props.radio) {
60
+ return;
61
+ }
62
+ if (playingRadio.value) {
63
+ playerStore.playerChangeStatus("PLAYING" === playerStore.playerStatus);
64
+ } else {
65
+ playerStore.playerPlay({
66
+ canalId: props.radio.id,
67
+ url: "https://" + props.radio.url + "/live.m3u8",
68
+ metadata: "",
69
+ secured: props.radio.organisationId === authStore.authOrganisation?.id && "SECURED"===authStore.authOrganisation?.privacy
70
+ });
71
+ }
72
+ }
84
73
  </script>
85
74
  <style lang="scss">
86
75
  .octopus-app .radio-play-button{
@@ -7,7 +7,7 @@
7
7
  params: { canalId: radio.id },
8
8
  }"
9
9
  class="text-dark classic-element-text"
10
- :title="$t('Radio name page', { name: radio.name })"
10
+ :title="t('Radio name page', { name: radio.name })"
11
11
  >
12
12
  <div class="element-name mb-2 basic-line-clamp">
13
13
  {{ radio.name }}
@@ -20,22 +20,17 @@
20
20
  </div>
21
21
  </template>
22
22
 
23
- <script lang="ts">
24
-
23
+ <script setup lang="ts">
25
24
  import RadioImage from "./RadioImage.vue";
26
25
  import RadioCurrently from "./RadioCurrently.vue";
27
- import { defineComponent } from "vue";
28
26
  import { Canal } from "@/stores/class/radio/canal";
29
- export default defineComponent({
30
- name: "RadioItem",
27
+ import { useI18n } from "vue-i18n";
31
28
 
32
- components: {
33
- RadioCurrently,
34
- RadioImage,
35
- },
29
+ //Props
30
+ defineProps({
31
+ radio: { default: undefined, type: Object as () => Canal },
32
+ })
36
33
 
37
- props: {
38
- radio: { default: undefined, type: Object as () => Canal },
39
- },
40
- });
34
+ //Composables
35
+ const { t } = useI18n();
41
36
  </script>