@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
@@ -6,15 +6,16 @@
6
6
  params: { participantId: participant.participantId },
7
7
  }"
8
8
  class="mt-3 text-dark"
9
- :title="$t('Participant name page', { name: name })"
9
+ :title="t('Participant name page', { name: name })"
10
10
  >
11
11
  <img
12
12
  v-lazy="useProxyImageUrl(participant.imageUrl, '200')"
13
13
  width="200"
14
14
  height="200"
15
- role="presentation"
15
+ aria-hidden="true"
16
+ alt=""
16
17
 
17
- :title="$t('Animator image', { name: name })"
18
+ :title="t('Animator image', { name: name })"
18
19
  class="img-box border"
19
20
  />
20
21
  <div class="d-flex align-items-center h4 justify-content-center mt-2">
@@ -22,7 +23,7 @@
22
23
  v-if="!activeParticipant && !isPodcastmaker && editRight"
23
24
  :size="16"
24
25
  class="text-danger me-1"
25
- :title="$t('Participant have not podcasts')"
26
+ :title="t('Participant have not podcasts')"
26
27
  />
27
28
  {{ name }}
28
29
  </div>
@@ -51,87 +52,78 @@
51
52
  </article>
52
53
  </template>
53
54
 
54
- <script lang="ts">
55
+ <script setup lang="ts">
55
56
  import AlertIcon from "vue-material-design-icons/Alert.vue";
56
57
  import classicApi from "../../../api/classicApi";
57
58
  import { Participant } from "@/stores/class/general/participant";
58
59
  import {useImageProxy} from "../../composable/useImageProxy";
59
60
  import displayHelper from "../../../helper/displayHelper";
60
61
  import {useOrgaComputed} from "../../composable/useOrgaComputed";
61
- import { defineComponent } from "vue";
62
+ import { computed, onBeforeMount, onMounted, ref, useTemplateRef } from "vue";
62
63
  import { Podcast } from "@/stores/class/general/podcast";
63
64
  import { ListClassicReturn } from "@/stores/class/general/listReturn";
64
- export default defineComponent({
65
- name: "ParticpantItem",
66
- components: {
67
- AlertIcon,
68
- },
69
- props: {
70
- participant: { default: () => ({}), type: Object as () => Participant },
71
- },
72
- setup(){
73
- const { useProxyImageUrl } = useImageProxy();
74
- const { isPodcastmaker, isEditRights } = useOrgaComputed();
75
- return { useProxyImageUrl, isPodcastmaker, isEditRights }
76
- },
65
+ import { useI18n } from "vue-i18n";
77
66
 
78
- data() {
79
- return {
80
- activeParticipant: true as boolean,
81
- };
82
- },
83
- computed: {
84
- name(): string {
85
- return `${this.participant.firstName ?? ""} ${
86
- this.participant.lastName ?? ""
87
- }`.trim();
88
- },
89
- editRight(): boolean {
90
- if (!this.participant?.orga) {
91
- return false;
92
- }
93
- return this.isEditRights(this.participant.orga.id);
94
- },
95
- },
67
+ //Props
68
+ const props = defineProps({
69
+ participant: { default: () => ({}), type: Object as () => Participant },
70
+ })
71
+
72
+ //Data
73
+ const activeParticipant = ref(true);
96
74
 
97
- created() {
98
- if (!this.editRight) return;
99
- this.hasPodcast();
100
- },
101
- mounted() {
102
- const participantDesc = this.$refs.descriptionParticipant as HTMLElement;
103
- const participantDescContainer = this.$refs
104
- .descriptionParticipantContainer as HTMLElement;
105
- if (
106
- null !== participantDesc &&
107
- null !== participantDescContainer &&
108
- participantDesc.clientHeight > participantDescContainer.clientHeight
109
- ) {
110
- participantDescContainer.classList.add("after-element-description");
111
- }
112
- },
113
- methods: {
114
- urlify(text:string|undefined){
115
- return displayHelper.urlify(text);
116
- },
117
- async hasPodcast(): Promise<void> {
118
- const data = await classicApi.fetchData<ListClassicReturn<Podcast>>({
119
- api: 0,
120
- path: "podcast/search",
121
- parameters: {
122
- participantId: this.participant.participantId,
123
- first: 0,
124
- size: 0,
125
- includeStatus: ["READY", "PROCESSING"],
126
- },
127
- specialTreatement: true,
128
- });
129
- if (0 === data.count) {
130
- this.activeParticipant = false;
131
- }
132
- },
133
- },
75
+ //Composables
76
+ const { t } = useI18n();
77
+ const { useProxyImageUrl } = useImageProxy();
78
+ const { isPodcastmaker, isEditRights } = useOrgaComputed();
79
+
80
+ //Computed
81
+ const name = computed(() => `${props.participant.firstName ?? ""} ${props.participant.lastName ?? ""}`.trim());
82
+ const editRight = computed(() => {
83
+ if (!props.participant?.orga) {
84
+ return false;
85
+ }
86
+ return isEditRights(props.participant.orga.id);
134
87
  });
88
+
89
+ onBeforeMount(()=>{
90
+ if (!editRight.value) return;
91
+ hasPodcast();
92
+ })
93
+
94
+ onMounted(()=>{
95
+ const participantDesc = useTemplateRef('descriptionParticipant')?.value as HTMLElement;
96
+ const participantDescContainer = useTemplateRef('descriptionParticipantContainer')?.value as HTMLElement;
97
+
98
+ if (
99
+ null !== participantDesc &&
100
+ null !== participantDescContainer &&
101
+ participantDesc.clientHeight > participantDescContainer.clientHeight
102
+ ) {
103
+ participantDescContainer.classList.add("after-element-description");
104
+ }
105
+ })
106
+
107
+ //Methods
108
+ function urlify(text:string|undefined){
109
+ return displayHelper.urlify(text);
110
+ }
111
+ async function hasPodcast(): Promise<void> {
112
+ const data = await classicApi.fetchData<ListClassicReturn<Podcast>>({
113
+ api: 0,
114
+ path: "podcast/search",
115
+ parameters: {
116
+ participantId: props.participant.participantId,
117
+ first: 0,
118
+ size: 0,
119
+ includeStatus: ["READY", "PROCESSING"],
120
+ },
121
+ specialTreatement: true,
122
+ });
123
+ if (0 === data.count) {
124
+ activeParticipant.value = false;
125
+ }
126
+ }
135
127
  </script>
136
128
  <style lang="scss">
137
129
  .octopus-app .participant-item-container {
@@ -6,14 +6,14 @@
6
6
  v-model:is-mobile="isMobile"
7
7
  :text-count="
8
8
  showCount && displayCount > 1
9
- ? `${$t('Number participants', { nb: displayCount })} ${$t(
9
+ ? `${t('Number participants', { nb: displayCount })} ${t(
10
10
  'sort by score',
11
11
  )}`
12
12
  : undefined
13
13
  "
14
14
  :total-count="totalCount"
15
15
  :loading="loading"
16
- :loading-text="loading ? $t('Loading participants ...') : undefined"
16
+ :loading-text="loading ? t('Loading participants ...') : undefined"
17
17
  :player-responsive="true"
18
18
  >
19
19
  <template #list>
@@ -30,7 +30,7 @@
30
30
  name: 'participant',
31
31
  params: { participantId: p.participantId },
32
32
  }"
33
- :title="$t('Participant name page', { name: p.lastName })"
33
+ :title="t('Participant name page', { name: p.lastName })"
34
34
  >
35
35
  {{ p.lastName }}
36
36
  </router-link>
@@ -41,162 +41,140 @@
41
41
  </ListPaginate>
42
42
  </template>
43
43
 
44
- <script lang="ts">
44
+ <script setup lang="ts">
45
45
  import ListPaginate from "../list/ListPaginate.vue";
46
46
  import ClassicLazy from "../../misc/ClassicLazy.vue";
47
47
  import {useErrorHandler} from "../../composable/useErrorHandler";
48
48
  import classicApi from "../../../api/classicApi";
49
49
  import ParticipantItem from "./ParticipantItem.vue";
50
50
  import { useFilterStore } from "../../../stores/FilterStore";
51
- import { mapState } from "pinia";
52
51
  import {
53
52
  Participant,
54
53
  emptyParticipantData,
55
54
  } from "@/stores/class/general/participant";
56
- import { defineComponent } from "vue";
55
+ import { computed, onBeforeMount, Ref, ref, watch } from "vue";
57
56
  import { AxiosError } from "axios";
58
57
  import { ListClassicReturn } from "@/stores/class/general/listReturn";
59
- export default defineComponent({
60
- name: "ParticipantList",
58
+ import { useI18n } from "vue-i18n";
61
59
 
62
- components: {
63
- ParticipantItem,
64
- ListPaginate,
65
- ClassicLazy,
66
- },
67
60
 
68
- props: {
69
- first: { default: 0, type: Number },
70
- size: { default: 30, type: Number },
71
- query: { default: undefined, type: String },
72
- organisationId: { default: undefined, type: String },
73
- showCount: { default: false, type: Boolean },
74
- },
61
+ //Props
62
+ const props = defineProps({
63
+ first: { default: 0, type: Number },
64
+ size: { default: 30, type: Number },
65
+ query: { default: undefined, type: String },
66
+ organisationId: { default: undefined, type: String },
67
+ showCount: { default: false, type: Boolean },
68
+ })
75
69
 
76
- setup(){
77
- const {handle403} = useErrorHandler();
78
- return { handle403 }
79
- },
80
70
 
81
- data() {
82
- return {
83
- loading: true as boolean,
84
- dfirst: this.first,
85
- dsize: this.size,
86
- totalCount: 0 as number,
87
- displayCount: 0 as number,
88
- participants: [] as Array<Participant>,
89
- isMobile: false as boolean,
90
- };
91
- },
71
+ //Data
72
+ const loading = ref(true);
73
+ const dfirst = ref(props.first);
74
+ const dsize = ref(props.size);
75
+ const totalCount = ref(0);
76
+ const displayCount = ref(0);
77
+ const isMobile = ref(false);
78
+ const participants: Ref<Array<Participant>> = ref([]);
92
79
 
93
- computed: {
94
- ...mapState(useFilterStore, ["filterOrgaId"]),
95
- displayArray(): Array<Participant> {
96
- if (this.isMobile) {
97
- return this.participants;
98
- }
99
- return this.participants.slice(
100
- this.dfirst,
101
- Math.min(this.dfirst + this.dsize, this.totalCount),
102
- );
103
- },
104
- organisation(): string | undefined {
105
- return this.organisationId ? this.organisationId : this.filterOrgaId;
106
- },
107
- changePaginate(): string {
108
- return `${this.first}|${this.size}`;
109
- },
110
- sort(): string {
111
- return !this.query ? "NAME" : "SCORE";
112
- },
113
- },
114
- watch: {
115
- changePaginate() {
116
- this.dfirst = this.first;
117
- this.dsize = this.size;
118
- },
119
- query(): void {
120
- this.reloadList();
121
- },
122
- organisation(): void {
123
- this.reloadList();
124
- },
125
- dsize(): void {
126
- this.reloadList();
127
- },
128
- dfirst(): void {
129
- if (
130
- !this.participants[this.dfirst] ||
131
- 0 === this.participants[this.dfirst].participantId
80
+ //Composables
81
+ const { t } = useI18n();
82
+ const {handle403} = useErrorHandler();
83
+ const filterStore = useFilterStore();
84
+
85
+
86
+ //Computed
87
+ const organisation = computed(() => props.organisationId ? props.organisationId : filterStore.filterOrgaId);
88
+ const displayArray = computed(() => {
89
+ if (isMobile.value) {
90
+ return participants.value;
91
+ }
92
+ return participants.value.slice(
93
+ dfirst.value,
94
+ Math.min(dfirst.value + dsize.value, totalCount.value),
95
+ );
96
+ });
97
+ const changePaginate = computed(() => `${props.first}|${props.size}`);
98
+ const sort = computed(() => !props.query ? "NAME" : "SCORE");
99
+
100
+
101
+ //Watch
102
+ watch(changePaginate, () => {
103
+ dfirst.value = props.first;
104
+ dsize.value = props.size;
105
+ });
106
+ watch(()=>props.query, () => reloadList());
107
+ watch(organisation, () => reloadList());
108
+ watch(dsize, () => reloadList());
109
+ watch(dfirst, () => {
110
+ if (
111
+ !participants.value[dfirst.value] ||
112
+ 0 === participants.value[dfirst.value].participantId
113
+ ) {
114
+ fetchContent(false);
115
+ }
116
+ });
117
+
118
+ onBeforeMount(()=>fetchContent(true))
119
+
120
+
121
+ //Methods
122
+ function reloadList() {
123
+ dfirst.value = 0;
124
+ fetchContent(true);
125
+ }
126
+ async function fetchContent(reset: boolean): Promise<void> {
127
+ loading.value = true;
128
+ try {
129
+ const data = await classicApi.fetchData<ListClassicReturn<Participant>>(
130
+ {
131
+ api: 0,
132
+ path: "participant/search",
133
+ parameters: {
134
+ first: dfirst.value,
135
+ size: dsize.value,
136
+ query: props.query,
137
+ organisationId: organisation.value,
138
+ sort: sort.value
139
+ },
140
+ specialTreatement: true,
141
+ },
142
+ );
143
+ if (reset) {
144
+ participants.value.length = 0;
145
+ }
146
+ displayCount.value = data.count;
147
+ if (dfirst.value > participants.value.length) {
148
+ for (
149
+ let i = participants.value.length - 1,
150
+ len = dfirst.value + dsize.value;
151
+ i < len;
152
+ i++
132
153
  ) {
133
- this.fetchContent(false);
154
+ participants.value.push(emptyParticipantData());
134
155
  }
135
- },
136
- },
137
-
138
- created() {
139
- this.fetchContent(true);
140
- },
141
- methods: {
142
- reloadList() {
143
- this.dfirst = 0;
144
- this.fetchContent(true);
145
- },
146
- async fetchContent(reset: boolean): Promise<void> {
147
- this.loading = true;
148
- try {
149
- const data = await classicApi.fetchData<ListClassicReturn<Participant>>(
150
- {
151
- api: 0,
152
- path: "participant/search",
153
- parameters: {
154
- first: this.dfirst,
155
- size: this.dsize,
156
- query: this.query,
157
- organisationId: this.organisation,
158
- sort: this.sort
159
- },
160
- specialTreatement: true,
161
- },
162
- );
163
- if (reset) {
164
- this.participants.length = 0;
156
+ }
157
+ const responseParticipants = data.result.filter(
158
+ (p: Participant | null) => {
159
+ if (null === p) {
160
+ displayCount.value--;
165
161
  }
166
- this.displayCount = data.count;
167
- if (this.dfirst > this.participants.length) {
168
- for (
169
- let i = this.participants.length - 1,
170
- len = this.dfirst + this.dsize;
171
- i < len;
172
- i++
173
- ) {
174
- this.participants.push(emptyParticipantData());
175
- }
176
- }
177
- const responseParticipants = data.result.filter(
178
- (p: Participant | null) => {
179
- if (null === p) {
180
- this.displayCount--;
181
- }
182
- return null !== p;
183
- },
184
- );
185
- this.participants = this.participants
186
- .slice(0, this.dfirst)
187
- .concat(responseParticipants)
188
- .concat(
189
- this.participants.slice(
190
- this.dfirst + this.dsize,
191
- this.participants.length,
192
- ),
193
- );
194
- this.totalCount = data.count;
195
- } catch (error) {
196
- this.handle403(error as AxiosError);
197
- }
198
- this.loading = false;
199
- },
200
- },
201
- });
162
+ return null !== p;
163
+ },
164
+ );
165
+ participants.value = participants.value
166
+ .slice(0, dfirst.value)
167
+ .concat(responseParticipants)
168
+ .concat(
169
+ participants.value.slice(
170
+ dfirst.value + dsize.value,
171
+ participants.value.length,
172
+ ),
173
+ );
174
+ totalCount.value = data.count;
175
+ } catch (error) {
176
+ handle403(error as AxiosError);
177
+ }
178
+ loading.value = false;
179
+ }
202
180
  </script>
@@ -5,12 +5,12 @@
5
5
  name: 'playlist',
6
6
  params: { playlistId: playlist.playlistId },
7
7
  }"
8
- :title="$t('Playlist name page', { name: name })"
8
+ :title="t('Playlist name page', { name: name })"
9
9
  class="d-flex flex-grow-1 text-dark"
10
10
  >
11
11
  <div class="classic-element-text">
12
12
  <div v-if="!activePlaylist" class="sticker-empty-ressource">
13
- {{ $t("Empty playlist") }}
13
+ {{ t("Empty playlist") }}
14
14
  </div>
15
15
  <div class="d-flex align-items-center element-name basic-line-clamp">
16
16
  {{ name }}
@@ -24,7 +24,7 @@
24
24
  <!-- eslint-enable -->
25
25
  </div>
26
26
  <router-link
27
- v-if="!isPodcastmaker && playlist.organisation"
27
+ v-if="!state.generalParameters.podcastmaker && playlist.organisation"
28
28
  :to="{
29
29
  name: 'productor',
30
30
  params: { productorId: playlist.organisation.id },
@@ -38,63 +38,50 @@
38
38
  v-lazy="useProxyImageUrl(playlist.imageUrl, '250')"
39
39
  width="250"
40
40
  height="250"
41
- role="presentation"
41
+ aria-hidden="true"
42
+ alt=""
42
43
 
43
- :title="$t('Playlist name image', { name: name })"
44
+ :title="t('Playlist name image', { name: name })"
44
45
  class="img-box"
45
46
  />
46
47
  </router-link>
47
48
  </article>
48
49
  </template>
49
50
 
50
- <script lang="ts">
51
+ <script setup lang="ts">
51
52
  import { Playlist } from "@/stores/class/general/playlist";
52
53
  import { state } from "../../../stores/ParamSdkStore";
53
54
  import {useImageProxy} from "../../composable/useImageProxy";
54
55
  import displayHelper from "../../../helper/displayHelper";
55
- import { defineComponent } from "vue";
56
- export default defineComponent({
57
- name: "PlaylistItem",
56
+ import { computed, onMounted, useTemplateRef } from "vue";
57
+ import { useI18n } from "vue-i18n";
58
58
 
59
- props: {
60
- playlist: { default: () => ({}), type: Object as () => Playlist },
61
- },
62
- setup(){
63
- const { useProxyImageUrl } = useImageProxy();
64
- return { useProxyImageUrl }
65
- },
59
+ //Props
60
+ const props = defineProps({
61
+ playlist: { default: () => ({}), type: Object as () => Playlist },
62
+ })
66
63
 
67
- computed: {
68
- isPodcastmaker(): boolean {
69
- return state.generalParameters.podcastmaker as boolean;
70
- },
71
- organisation(): string {
72
- return this.playlist?.publisher?.organisation?.name ?? "";
73
- },
74
- description(): string {
75
- return this.playlist.description ?? "";
76
- },
77
- name(): string {
78
- return this.playlist.title;
79
- },
80
- activePlaylist(): boolean {
81
- return 0 !== Object.keys(this.playlist.samplingViews ?? []).length;
82
- },
83
- },
84
- mounted() {
85
- const playlistDesc = this.$refs.descriptionPlaylist as HTMLElement;
86
- const playlistDescContainer = this.$refs
87
- .descriptionPlaylistContainer as HTMLElement;
88
- if (playlistDesc?.clientHeight > playlistDescContainer?.clientHeight) {
89
- playlistDescContainer.classList.add("after-element-description");
90
- }
91
- },
92
- methods:{
93
- urlify(text:string|undefined){
94
- return displayHelper.urlify(text);
95
- },
64
+ //Composables
65
+ const { t } = useI18n();
66
+ const { useProxyImageUrl } = useImageProxy();
67
+
68
+ //Computed
69
+ const description = computed(() => props.playlist.description ?? "");
70
+ const name = computed(() => props.playlist.title ?? "");
71
+ const activePlaylist = computed(() => 0 !== Object.keys(props.playlist.samplingViews ?? []).length);
72
+
73
+ onMounted(()=>{
74
+ const playlistDesc = useTemplateRef('descriptionPlaylist')?.value as HTMLElement;
75
+ const playlistDescContainer = useTemplateRef('descriptionPlaylistContainer')?.value as HTMLElement;
76
+ if (playlistDesc?.clientHeight > playlistDescContainer?.clientHeight) {
77
+ playlistDescContainer.classList.add("after-element-description");
96
78
  }
97
- });
79
+ })
80
+
81
+ //Methods
82
+ function urlify(text:string|undefined){
83
+ return displayHelper.urlify(text);
84
+ }
98
85
  </script>
99
86
  <style lang="scss">
100
87
  .octopus-app .sticker-empty-ressource{