@saooti/octopus-sdk 40.0.3 → 40.1.0

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 (174) hide show
  1. package/index.ts +31 -31
  2. package/package.json +1 -1
  3. package/plateform.conf +1 -1
  4. package/src/App.vue +9 -3
  5. package/src/api/classicApi.ts +1 -1
  6. package/src/components/composable/player/usePlayerDisplayTime.ts +33 -0
  7. package/src/components/composable/player/usePlayerLive.ts +150 -0
  8. package/src/components/composable/player/usePlayerLogic.ts +265 -0
  9. package/src/components/composable/player/usePlayerLogicProgress.ts +135 -0
  10. package/src/components/composable/player/usePlayerStitching.ts +213 -0
  11. package/src/components/composable/player/usePlayerTranscript.ts +120 -0
  12. package/src/components/composable/player/usePlayerVast.ts +207 -0
  13. package/src/components/composable/podcasts/useCountdown.ts +53 -0
  14. package/src/components/composable/podcasts/usePodcastView.ts +85 -0
  15. package/src/components/composable/radio/usefetchRadioData.ts +75 -0
  16. package/src/components/composable/route/useAdvancedParamInit.ts +165 -0
  17. package/src/components/composable/route/useRouteUpdateParams.ts +48 -0
  18. package/src/components/composable/route/useRubriquesFilterComputed.ts +24 -0
  19. package/src/components/composable/route/useRubriquesFilterParam.ts +32 -0
  20. package/src/components/composable/route/useSeoTitleUrl.ts +30 -0
  21. package/src/components/composable/route/useSimplePageParam.ts +50 -0
  22. package/src/components/composable/useErrorHandler.ts +25 -0
  23. package/src/components/composable/useImageProxy.ts +28 -0
  24. package/src/components/composable/useInit.ts +38 -0
  25. package/src/components/composable/useMetaTitle.ts +19 -0
  26. package/src/components/composable/useMetaTitleWatch.ts +14 -0
  27. package/src/components/composable/useOrgaComputed.ts +23 -0
  28. package/src/components/composable/useOrganisationFilter.ts +65 -0
  29. package/src/components/composable/useResizePhone.ts +27 -0
  30. package/src/components/composable/useSelenium.ts +10 -0
  31. package/src/components/composable/useTagOf.ts +21 -0
  32. package/src/components/display/accessibility/AccessibilityModal.vue +136 -0
  33. package/src/components/display/aggregator/RssSection.vue +1 -4
  34. package/src/components/display/categories/CategoryChooser.vue +1 -1
  35. package/src/components/display/categories/CategoryFilter.vue +7 -3
  36. package/src/components/display/categories/CategoryList.vue +5 -2
  37. package/src/components/display/comments/CommentInput.vue +0 -3
  38. package/src/components/display/comments/CommentList.vue +6 -2
  39. package/src/components/display/comments/CommentPlayer.vue +5 -2
  40. package/src/components/display/comments/CommentSection.vue +0 -2
  41. package/src/components/display/comments/item/CommentBasicView.vue +4 -4
  42. package/src/components/display/comments/item/CommentItem.vue +0 -4
  43. package/src/components/display/comments/item/CommentMoreActions.vue +6 -2
  44. package/src/components/display/emission/EmissionInlineList.vue +6 -6
  45. package/src/components/display/emission/EmissionItem.vue +13 -6
  46. package/src/components/display/emission/EmissionList.vue +5 -2
  47. package/src/components/display/emission/EmissionPlayerItem.vue +8 -5
  48. package/src/components/display/emission/EmissionPresentationItem.vue +16 -7
  49. package/src/components/display/emission/EmissionPresentationList.vue +10 -7
  50. package/src/components/display/filter/AdvancedSearch.vue +9 -6
  51. package/src/components/display/filter/CategorySearchFilter.vue +0 -2
  52. package/src/components/display/filter/ProductorSearch.vue +8 -3
  53. package/src/components/display/filter/RubriqueFilter.vue +6 -2
  54. package/src/components/display/list/ListPaginate.vue +9 -6
  55. package/src/components/display/list/SwiperList.vue +6 -5
  56. package/src/components/display/live/CountDown.vue +7 -15
  57. package/src/components/display/live/CountdownOctopus.vue +10 -30
  58. package/src/components/display/live/LiveItem.vue +0 -2
  59. package/src/components/display/live/LiveList.vue +9 -4
  60. package/src/components/display/live/RadioCurrently.vue +9 -5
  61. package/src/components/display/live/RadioImage.vue +6 -4
  62. package/src/components/display/live/RadioItem.vue +1 -2
  63. package/src/components/display/live/RadioList.vue +5 -3
  64. package/src/components/display/live/RadioPlanning.vue +10 -7
  65. package/src/components/display/organisation/OrganisationChooser.vue +8 -4
  66. package/src/components/display/participant/ParticipantInlineList.vue +5 -5
  67. package/src/components/display/participant/ParticipantItem.vue +13 -5
  68. package/src/components/display/participant/ParticipantList.vue +6 -3
  69. package/src/components/display/playlist/PlaylistItem.vue +12 -5
  70. package/src/components/display/playlist/PlaylistList.vue +6 -3
  71. package/src/components/display/playlist/PodcastList.vue +8 -4
  72. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +6 -3
  73. package/src/components/display/podcasts/DownloadPodcastButton.vue +2 -4
  74. package/src/components/display/podcasts/PodcastImage.vue +6 -3
  75. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +7 -4
  76. package/src/components/display/podcasts/PodcastItem.vue +1 -1
  77. package/src/components/display/podcasts/PodcastItemInfo.vue +6 -3
  78. package/src/components/display/podcasts/PodcastList.vue +6 -3
  79. package/src/components/display/podcasts/PodcastModuleBox.vue +22 -9
  80. package/src/components/display/podcasts/PodcastPlayBar.vue +1 -3
  81. package/src/components/display/podcasts/PodcastPlayButton.vue +1 -3
  82. package/src/components/display/podcasts/PodcastRawTranscript.vue +79 -10
  83. package/src/components/display/podcasts/PodcastRubriqueList.vue +4 -3
  84. package/src/components/display/podcasts/TagList.vue +5 -2
  85. package/src/components/display/podcasts/VideoModuleBox.vue +6 -3
  86. package/src/components/display/rubriques/RubriqueChooser.vue +0 -2
  87. package/src/components/display/rubriques/RubriqueList.vue +7 -5
  88. package/src/components/display/sharing/ShareButtons.vue +4 -2
  89. package/src/components/display/sharing/ShareDistribution.vue +4 -2
  90. package/src/components/form/ClassicEmojiPicker.vue +5 -3
  91. package/src/components/misc/ClassicLazy.vue +2 -2
  92. package/src/components/misc/FooterGarSection.vue +2 -3
  93. package/src/components/misc/FooterSection.vue +9 -5
  94. package/src/components/misc/MobileMenu.vue +5 -3
  95. package/src/components/misc/TopBar.vue +8 -6
  96. package/src/components/misc/TopBarMainContent.vue +8 -4
  97. package/src/components/misc/modal/ClassicModalInBody.vue +2 -3
  98. package/src/components/misc/modal/ClipboardModal.vue +4 -3
  99. package/src/components/misc/modal/NewsletterModal.vue +4 -3
  100. package/src/components/misc/modal/ShareModalPlayer.vue +4 -2
  101. package/src/components/misc/player/PlayerCompact.vue +30 -41
  102. package/src/components/misc/player/PlayerComponent.vue +69 -84
  103. package/src/components/misc/player/PlayerLarge.vue +43 -58
  104. package/src/components/misc/player/elements/PlayerImage.vue +6 -3
  105. package/src/components/misc/player/elements/PlayerTitle.vue +6 -2
  106. package/src/components/misc/player/radio/RadioHistory.vue +2 -4
  107. package/src/components/misc/player/video/PlayerVideoHls.vue +6 -7
  108. package/src/components/pages/EmissionPage.vue +19 -7
  109. package/src/components/pages/EmissionsPage.vue +31 -23
  110. package/src/components/pages/HomePage.vue +5 -2
  111. package/src/components/pages/PageLogout.vue +0 -2
  112. package/src/components/pages/PageNotFound.vue +11 -15
  113. package/src/components/pages/ParticipantPage.vue +18 -7
  114. package/src/components/pages/ParticipantsPage.vue +16 -21
  115. package/src/components/pages/PlaylistPage.vue +18 -7
  116. package/src/components/pages/PlaylistsPage.vue +20 -29
  117. package/src/components/pages/PodcastPage.vue +12 -6
  118. package/src/components/pages/PodcastsPage.vue +46 -48
  119. package/src/components/pages/RadioPage.vue +9 -6
  120. package/src/components/pages/RubriquePage.vue +41 -52
  121. package/src/components/pages/VideoPage.vue +152 -166
  122. package/src/helper/cookiesHelper.ts +20 -0
  123. package/src/helper/displayHelper.ts +15 -0
  124. package/src/helper/downloadHelper.ts +30 -0
  125. package/src/helper/{fetch.ts → fetchHelper.ts} +0 -1
  126. package/src/helper/loadScript.ts +22 -0
  127. package/src/helper/radio/radioHelper.ts +15 -0
  128. package/src/helper/{string.ts → stringHelper.ts} +5 -0
  129. package/src/locale/de.ts +4 -0
  130. package/src/locale/en.ts +4 -0
  131. package/src/locale/es.ts +4 -0
  132. package/src/locale/fr.ts +4 -0
  133. package/src/locale/it.ts +4 -0
  134. package/src/locale/sl.ts +4 -0
  135. package/src/stores/AuthStore.ts +1 -2
  136. package/src/stores/CommentStore.ts +8 -8
  137. package/src/stores/PlayerStore.ts +1 -1
  138. package/src/style/general.scss +15 -1
  139. package/src/components/mixins/cookies.ts +0 -22
  140. package/src/components/mixins/displayMethods.ts +0 -17
  141. package/src/components/mixins/download.ts +0 -33
  142. package/src/components/mixins/fetchParameters.ts +0 -16
  143. package/src/components/mixins/handle403.ts +0 -22
  144. package/src/components/mixins/imageProxy.ts +0 -28
  145. package/src/components/mixins/init.ts +0 -34
  146. package/src/components/mixins/loadScript.ts +0 -25
  147. package/src/components/mixins/metaTitle.ts +0 -15
  148. package/src/components/mixins/metaTitleWatch.ts +0 -26
  149. package/src/components/mixins/orgaComputed.ts +0 -23
  150. package/src/components/mixins/organisationFilter.ts +0 -56
  151. package/src/components/mixins/player/playerDisplayTime.ts +0 -35
  152. package/src/components/mixins/player/playerLive.ts +0 -144
  153. package/src/components/mixins/player/playerLogic.ts +0 -275
  154. package/src/components/mixins/player/playerLogicProgress.ts +0 -135
  155. package/src/components/mixins/player/playerStitching.ts +0 -202
  156. package/src/components/mixins/player/playerTranscript.ts +0 -113
  157. package/src/components/mixins/player/playerVast.ts +0 -198
  158. package/src/components/mixins/podcast/countdown.ts +0 -45
  159. package/src/components/mixins/podcast/podcastView.ts +0 -63
  160. package/src/components/mixins/radio/fetchRadioData.ts +0 -77
  161. package/src/components/mixins/resizePhone.ts +0 -26
  162. package/src/components/mixins/routeParam/advancedParamInit.ts +0 -202
  163. package/src/components/mixins/routeParam/paginateParamInit.ts +0 -43
  164. package/src/components/mixins/routeParam/routeParams.ts +0 -33
  165. package/src/components/mixins/routeParam/rubriquesFilterComputed.ts +0 -22
  166. package/src/components/mixins/routeParam/rubriquesFilterParam.ts +0 -29
  167. package/src/components/mixins/selenium.ts +0 -7
  168. package/src/components/mixins/seoTitleUrl.ts +0 -26
  169. package/src/components/mixins/tagOfMixins.ts +0 -19
  170. package/src/helper/uuidGenerator.ts +0 -7
  171. /package/src/{helper → components/composable}/useEventListener.ts +0 -0
  172. /package/src/{components/mixins/debounce.ts → helper/debounceHelper.ts} +0 -0
  173. /package/src/helper/{dom.ts → domHelper.ts} +0 -0
  174. /package/src/helper/{duration.ts → durationHelper.ts} +0 -0
@@ -0,0 +1,14 @@
1
+ import { useRoute } from "vue-router";
2
+ import { useMetaTitle } from "./useMetaTitle";
3
+ import { watch } from "vue";
4
+ import { useI18n } from "vue-i18n";
5
+
6
+ export const useMetaTitleWatch = ()=>{
7
+ const { updateMetaTitle } = useMetaTitle();
8
+
9
+ const route = useRoute();
10
+ const i18n = useI18n();
11
+
12
+ watch(route, () => updateMetaTitle(), {immediate:true});
13
+ watch(()=>i18n.locale, () => updateMetaTitle());
14
+ }
@@ -0,0 +1,23 @@
1
+ import { computed } from "vue";
2
+ import { useAuthStore } from "../../stores/AuthStore";
3
+ import { state } from "../../stores/ParamSdkStore";
4
+ export const useOrgaComputed = ()=>{
5
+
6
+ const authStore = useAuthStore();
7
+
8
+ const isPodcastmaker = computed(() =>state.generalParameters.podcastmaker as boolean);
9
+
10
+ function isEditRights(orgaId?: string, condition = true){
11
+ return (
12
+ (condition && undefined!==authStore.authOrgaId&&
13
+ authStore.authOrgaId === orgaId) ||
14
+ authStore.isRoleAdmin
15
+ );
16
+ }
17
+
18
+ return {
19
+ isPodcastmaker,
20
+ isEditRights,
21
+ authOrgaId: authStore.authOrgaId
22
+ }
23
+ }
@@ -0,0 +1,65 @@
1
+ import {useErrorHandler} from "./useErrorHandler";
2
+ import { useFilterStore } from "../../stores/FilterStore";
3
+ import { useSaveFetchStore } from "../../stores/SaveFetchStore";
4
+ import { state } from "../../stores/ParamSdkStore";
5
+ import classicApi from "../../api/classicApi";
6
+ import { Rubriquage } from "@/stores/class/rubrique/rubriquage";
7
+ import { useRoute, useRouter } from "vue-router";
8
+ import { AxiosError } from "axios";
9
+ export const useOrganisationFilter= ()=>{
10
+
11
+ const {handle403} = useErrorHandler();
12
+
13
+ const filterStore = useFilterStore();
14
+ const saveFetchStore = useSaveFetchStore();
15
+
16
+ const route = useRoute();
17
+ const router = useRouter();
18
+
19
+ async function selectOrganisation(organisationId: string): Promise<void> {
20
+ try {
21
+ const response = await saveFetchStore.getOrgaData(organisationId);
22
+ const data = await classicApi.fetchData<Array<Rubriquage>>({
23
+ api: 0,
24
+ path:"rubriquage/find/" + organisationId,
25
+ parameters:{
26
+ sort: "HOMEPAGEORDER",
27
+ homePageOrder: true,
28
+ },
29
+ specialTreatement:true
30
+ });
31
+ const isLive = await saveFetchStore.getOrgaLiveEnabled(organisationId);
32
+ filterStore.filterUpdateOrga({
33
+ orgaId: organisationId,
34
+ imgUrl: response.imageUrl,
35
+ name: response.name,
36
+ rubriquageArray: data.filter((element: Rubriquage) => {
37
+ return element.rubriques.length;
38
+ }),
39
+ isLive: isLive,
40
+ });
41
+ if(!state.generalParameters.podcastmaker){
42
+ const queries = route.query;
43
+ router.push({
44
+ query: { ...queries, ...{ productor: organisationId, o:undefined } },
45
+ });
46
+ }
47
+ } catch (error) {
48
+ handle403(error as AxiosError);
49
+ }
50
+ }
51
+
52
+ function removeSelectedOrga(): void {
53
+ if (route.query.productor) {
54
+ router.push({
55
+ query: { ...route.query, ...{ productor: undefined } },
56
+ });
57
+ }
58
+ filterStore.filterUpdateOrga({ orgaId: undefined });
59
+ }
60
+
61
+ return {
62
+ selectOrganisation,
63
+ removeSelectedOrga
64
+ }
65
+ }
@@ -0,0 +1,27 @@
1
+ import debounce from '../../helper/debounceHelper';
2
+ import {computed, onBeforeUnmount, onMounted, Ref, ref} from 'vue';
3
+ export const useResizePhone = ()=>{
4
+ const windowWidth = ref(0);
5
+ const debounceResizeEvent : Ref<undefined|((...args: any[]) => void)> =ref(undefined);
6
+
7
+ const isPhone = computed(() => windowWidth.value < 960);
8
+
9
+ function handleResize() {
10
+ windowWidth.value = window.innerWidth;
11
+ }
12
+ onMounted(() => {
13
+ debounceResizeEvent.value = debounce(handleResize, 500);
14
+ window.addEventListener('resize', debounceResizeEvent.value);
15
+ handleResize();
16
+ })
17
+
18
+ onBeforeUnmount(() => {
19
+ window.removeEventListener('resize', debounceResizeEvent.value);
20
+ })
21
+
22
+ return {
23
+ isPhone,
24
+ windowWidth,
25
+ }
26
+ }
27
+
@@ -0,0 +1,10 @@
1
+ export const useSelenium = ()=>{
2
+
3
+ function seleniumFormat(string: string): string {
4
+ return string.toLowerCase().replace(/\s/g, "");
5
+ }
6
+
7
+ return {
8
+ seleniumFormat
9
+ }
10
+ }
@@ -0,0 +1,21 @@
1
+ export const useTagOf = ()=>{
2
+
3
+ function isOuestFranceTag(tag: string): boolean {
4
+ return "[of]" === tag.substring(0, 4);
5
+ }
6
+ function formateOfTag(tag: string): string {
7
+ if (!isOuestFranceTag(tag)) {
8
+ return tag;
9
+ }
10
+ const lastSlash = tag.lastIndexOf("/");
11
+ if (-1 !== lastSlash) {
12
+ return tag.substring(lastSlash + 1, tag.length);
13
+ }
14
+ return tag.substring(4, tag.length);
15
+ }
16
+
17
+ return {
18
+ isOuestFranceTag,
19
+ formateOfTag
20
+ }
21
+ }
@@ -0,0 +1,136 @@
1
+ <template>
2
+ <ClassicModalInBody
3
+ id-modal="accessibility-modal"
4
+ :title-modal="$t('Transcript Accessibility')"
5
+ @close="closePopup"
6
+ >
7
+ <template #body>
8
+ <div class="d-flex gap-3 flex-wrap mb-3">
9
+ <div class="d-flex flex-nowrap align-items-center flex-grow-1">
10
+ <div class="form-label me-3">{{ $t('Choose background color') }}</div>
11
+ <VSwatches
12
+ v-model:model-value="background"
13
+ class="c-hand"
14
+ show-fallback
15
+ fallback-input-type="color"
16
+ colors="text-advanced"
17
+ popover-x="left"
18
+ :data-color="color"
19
+ />
20
+ </div>
21
+ <div class="d-flex flex-nowrap align-items-center flex-grow-1">
22
+ <div class="form-label me-3">{{ $t('Choose text color') }}</div>
23
+ <VSwatches
24
+ v-model:model-value="color"
25
+ class="c-hand"
26
+ show-fallback
27
+ fallback-input-type="color"
28
+ colors="text-advanced"
29
+ popover-x="left"
30
+ :data-color="color"
31
+ />
32
+ </div>
33
+ </div>
34
+
35
+ <div class="d-flex align-items-center flex-nowrap mb-3">
36
+ <label class="form-label me-3" for="accessibility-font-size">{{ $t('Font size') }}</label>
37
+ <button class="btn me-3" :disabled="isMinSize" @click="decreaseFontSize"><FormatFontSizeDecreaseIcon :size="44"/></button>
38
+ <button class="btn" :disabled="isMaxSize" @click="increaseFontSize"><FormatFontSizeIncreaseIcon :size="44"/></button>
39
+ </div>
40
+
41
+ <div class="form-label mt-3">{{ $t('Preview') }}</div>
42
+ <div class="border p-2 mb-3" :style="stylePreview">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
43
+ </template>
44
+ <template #footer>
45
+ <button class="btn m-1" @click="closePopup">
46
+ {{ $t("No") }}
47
+ </button>
48
+ <button
49
+ class="btn btn-primary m-1"
50
+ @click="saveData"
51
+ >
52
+ {{ $t("Save") }}
53
+ </button>
54
+ </template>
55
+ </ClassicModalInBody>
56
+ </template>
57
+
58
+ <script lang="ts">
59
+ import { VSwatches } from "vue3-swatches";
60
+ import "vue3-swatches/dist/style.css";
61
+ import FormatFontSizeIncreaseIcon from "vue-material-design-icons/FormatFontSizeIncrease.vue";
62
+ import FormatFontSizeDecreaseIcon from "vue-material-design-icons/FormatFontSizeDecrease.vue";
63
+ import { defineAsyncComponent, defineComponent } from "vue";
64
+ const ClassicModalInBody = defineAsyncComponent(
65
+ () => import("../../misc/modal/ClassicModalInBody.vue"),
66
+ );
67
+ export default defineComponent({
68
+ name: "AccessibilityModal",
69
+
70
+ components: {
71
+ ClassicModalInBody,
72
+ FormatFontSizeIncreaseIcon,
73
+ FormatFontSizeDecreaseIcon,
74
+ VSwatches
75
+ },
76
+
77
+ emits: ["close", "save"],
78
+ computed:{
79
+ isMaxSize(){
80
+ return this.fontSize>=30;
81
+ },
82
+ isMinSize(){
83
+ return this.fontSize<=16;
84
+ },
85
+ stylePreview(){
86
+ return 'font-size:'+this.fontSize+'px; background:'+this.background+'; color:'+this.color;
87
+ }
88
+ },
89
+ data() {
90
+ return {
91
+ fontSize :16 as number,
92
+ background: "white" as string,
93
+ color: "black" as string,
94
+ };
95
+ },
96
+ created(){
97
+ this.initAccessibility();
98
+ },
99
+ methods: {
100
+ initAccessibility(){
101
+ const actualFontSize = getComputedStyle(document.documentElement).getPropertyValue('--octopus-accessibility-font-size');
102
+ this.fontSize = isNaN(parseInt(actualFontSize.slice(0, -2), 10)) ? 16 :parseInt(actualFontSize.slice(0, -2), 10);
103
+ this.background = getComputedStyle(document.documentElement).getPropertyValue('--octopus-accessibility-background');
104
+ this.color = getComputedStyle(document.documentElement).getPropertyValue('--octopus-accessibility-color');
105
+ },
106
+ closePopup() {
107
+ this.$emit("close");
108
+ },
109
+ decreaseFontSize(){
110
+ if(!this.isMinSize){
111
+ this.fontSize -=2;
112
+ }
113
+ },
114
+ increaseFontSize(){
115
+ if(!this.isMaxSize){
116
+ this.fontSize +=2;
117
+ }
118
+ },
119
+ saveData(){
120
+ this.$emit('save', {
121
+ fontSize: this.fontSize,
122
+ background: this.background,
123
+ color: this.color,
124
+ });
125
+ }
126
+ },
127
+ });
128
+ </script>
129
+ <style lang="scss">
130
+ .octopus-app #accessibility-modal .octopus-modal-body{
131
+ min-height: 400px;
132
+ .gap-3{
133
+ gap:1rem;
134
+ }
135
+ }
136
+ </style>
@@ -2,7 +2,4 @@
2
2
  <div />
3
3
  </template>
4
4
 
5
- <script lang="ts">
6
- import { defineComponent } from "vue";
7
- export default defineComponent({});
8
- </script>
5
+ <script setup lang="ts"></script>
@@ -75,7 +75,7 @@ export default defineComponent({
75
75
  return this.storedCategories;
76
76
  },
77
77
  categoriesOrdered(): Array<Category> {
78
- let allCategoriesOrdered = [...this.categoriesChosen].sort(
78
+ let allCategoriesOrdered = this.categoriesChosen.toSorted(
79
79
  (a: Category, b: Category) => (a.name > b.name ? 1 : -1),
80
80
  );
81
81
  if (!this.displayAllCategories) {
@@ -67,8 +67,8 @@
67
67
  </template>
68
68
 
69
69
  <script lang="ts">
70
- import { rubriquesFilterParam } from "../../mixins/routeParam/rubriquesFilterParam";
71
- import { routeParams } from "../../mixins/routeParam/routeParams";
70
+ import { useRubriquesFilterParam } from "../../composable/route/useRubriquesFilterParam";
71
+ import { useRouteUpdateParams } from "../../composable/route/useRouteUpdateParams";
72
72
  import { Rubriquage } from "@/stores/class/rubrique/rubriquage";
73
73
  import { RubriquageFilter } from "@/stores/class/rubrique/rubriquageFilter";
74
74
  import { Rubrique } from "@/stores/class/rubrique/rubrique";
@@ -91,7 +91,11 @@ export default defineComponent({
91
91
  RubriqueList,
92
92
  RubriqueChooser,
93
93
  },
94
- mixins: [routeParams, rubriquesFilterParam],
94
+ setup(){
95
+ const { updateFiltersParam } = useRouteUpdateParams();
96
+ const { modifyRubriquesFilter } = useRubriquesFilterParam();
97
+ return {updateFiltersParam, modifyRubriquesFilter }
98
+ },
95
99
  data() {
96
100
  return {
97
101
  isCategories: false as boolean,
@@ -42,7 +42,7 @@
42
42
 
43
43
  <script lang="ts">
44
44
  import PlusIcon from "vue-material-design-icons/Plus.vue";
45
- import { routeParams } from "../../mixins/routeParam/routeParams";
45
+ import { useRouteUpdateParams } from "../../composable/route/useRouteUpdateParams";
46
46
  import classicApi from "../../../api/classicApi";
47
47
  import { state } from "../../../stores/ParamSdkStore";
48
48
  import ClassicPopover from "../../misc/ClassicPopover.vue";
@@ -57,13 +57,16 @@ export default defineComponent({
57
57
  ClassicPopover,
58
58
  PlusIcon,
59
59
  },
60
- mixins: [routeParams],
61
60
 
62
61
  props: {
63
62
  isFilter: { default: false, type: Boolean },
64
63
  isDisplay: { default: false, type: Boolean },
65
64
  },
66
65
  emits: ["categoriesLength"],
66
+ setup(){
67
+ const { updateFiltersParam } = useRouteUpdateParams();
68
+ return {updateFiltersParam }
69
+ },
67
70
 
68
71
  data() {
69
72
  return {
@@ -51,7 +51,6 @@
51
51
 
52
52
  <script lang="ts">
53
53
  import classicApi from "../../../api/classicApi";
54
- import cookies from "../../mixins/cookies";
55
54
  import { Podcast } from "@/stores/class/general/podcast";
56
55
  import { CommentCreate, CommentPodcast } from "@/stores/class/general/comment";
57
56
  import Constants from "../../../../public/config";
@@ -82,8 +81,6 @@ export default defineComponent({
82
81
  ClassicContentEditable,
83
82
  CommentName,
84
83
  },
85
- mixins: [cookies],
86
-
87
84
  props: {
88
85
  podcast: { default: undefined, type: Object as () => Podcast },
89
86
  focus: { default: false, type: Boolean },
@@ -64,7 +64,7 @@
64
64
  import SortVariantIcon from "vue-material-design-icons/SortVariant.vue";
65
65
  import PlusIcon from "vue-material-design-icons/Plus.vue";
66
66
  import ClassicLoading from "../../form/ClassicLoading.vue";
67
- import { handle403 } from "../../mixins/handle403";
67
+ import {useErrorHandler} from "../../composable/useErrorHandler";
68
68
  import classicApi from "../../../api/classicApi";
69
69
  import { defineAsyncComponent, defineComponent } from "vue";
70
70
  import { AxiosError } from "axios";
@@ -91,7 +91,6 @@ export default defineComponent({
91
91
  PlusIcon,
92
92
  SortVariantIcon,
93
93
  },
94
- mixins: [handle403],
95
94
 
96
95
  props: {
97
96
  size: { default: 10, type: Number },
@@ -107,6 +106,11 @@ export default defineComponent({
107
106
  },
108
107
  emits: ["update:nbComments", "commentDeleted"],
109
108
 
109
+ setup(){
110
+ const {handle403} = useErrorHandler();
111
+ return { handle403 }
112
+ },
113
+
110
114
  data() {
111
115
  return {
112
116
  loading: false as boolean,
@@ -34,14 +34,17 @@
34
34
 
35
35
  <script lang="ts">
36
36
  import { CommentPodcast } from "@/stores/class/general/comment";
37
- import selenium from "../../mixins/selenium";
37
+ import {useSelenium} from "../../composable/useSelenium";
38
38
  import { usePlayerStore } from "../../../stores/PlayerStore";
39
39
  import { mapActions, mapState } from "pinia";
40
40
  import { defineComponent } from "vue";
41
41
  import { useCommentStore } from "../../../stores/CommentStore";
42
42
  export default defineComponent({
43
43
  name: "CommentPlayer",
44
- mixins: [selenium],
44
+ setup(){
45
+ const { seleniumFormat } = useSelenium();
46
+ return { seleniumFormat }
47
+ },
45
48
  data() {
46
49
  return {
47
50
  displayContent: undefined as CommentPodcast | undefined,
@@ -28,7 +28,6 @@
28
28
 
29
29
  <script lang="ts">
30
30
  import RefreshIcon from "vue-material-design-icons/Refresh.vue";
31
- import cookies from "../../mixins/cookies";
32
31
  import { Podcast } from "@/stores/class/general/podcast";
33
32
  import { defineAsyncComponent, defineComponent } from "vue";
34
33
  import { mapActions, mapState } from "pinia";
@@ -48,7 +47,6 @@ export default defineComponent({
48
47
  CommentInput,
49
48
  RefreshIcon,
50
49
  },
51
- mixins: [cookies],
52
50
  props: {
53
51
  podcast: { default: undefined, type: Object as () => Podcast },
54
52
  },
@@ -40,8 +40,7 @@ import AlertIcon from "vue-material-design-icons/Alert.vue";
40
40
  import dayjs from "dayjs";
41
41
  import relativeTime from "dayjs/plugin/relativeTime";
42
42
  dayjs.extend(relativeTime);
43
- import selenium from "../../../mixins/selenium";
44
- import displayMethods from "../../../mixins/displayMethods";
43
+ import displayHelper from "../../../../helper/displayHelper";
45
44
  import { CommentPodcast } from "@/stores/class/general/comment";
46
45
  import ClassicPopover from "../../../misc/ClassicPopover.vue";
47
46
  import { defineComponent } from "vue";
@@ -53,8 +52,6 @@ export default defineComponent({
53
52
  AlertIcon,
54
53
  },
55
54
 
56
- mixins: [displayMethods, selenium],
57
-
58
55
  props: {
59
56
  comment: { default: () => ({}), type: Object as () => CommentPodcast },
60
57
  editRight: { default: false, type: Boolean },
@@ -96,6 +93,9 @@ export default defineComponent({
96
93
  clearInterval(this.dateInterval as unknown as number);
97
94
  },
98
95
  methods: {
96
+ urlify(text:string|undefined){
97
+ return displayHelper.urlify(text);
98
+ },
99
99
  defineDateFromNow() {
100
100
  if (!this.comment.date) {
101
101
  this.date = "";
@@ -79,8 +79,6 @@
79
79
 
80
80
  <script lang="ts">
81
81
  import ChevronDownIcon from "vue-material-design-icons/ChevronDown.vue";
82
- import selenium from "../../../mixins/selenium";
83
- import displayMethods from "../../../mixins/displayMethods";
84
82
  import { CommentPodcast } from "@/stores/class/general/comment";
85
83
  import { Podcast } from "../../../../stores/class/general/podcast";
86
84
  import CommentBasicView from "./CommentBasicView.vue";
@@ -116,8 +114,6 @@ export default defineComponent({
116
114
  ChevronDownIcon,
117
115
  },
118
116
 
119
- mixins: [displayMethods, selenium],
120
-
121
117
  props: {
122
118
  comment: { default: () => ({}), type: Object as () => CommentPodcast },
123
119
  podcast: { default: undefined, type: Object as () => Podcast },
@@ -59,7 +59,7 @@
59
59
 
60
60
  <script lang="ts">
61
61
  import DotsVerticalIcon from "vue-material-design-icons/DotsVertical.vue";
62
- import selenium from "../../../mixins/selenium";
62
+ import {useSelenium} from "../../../composable/useSelenium";
63
63
  import classicApi from "../../../../api/classicApi";
64
64
  import CommentMoreActionsAdmin from "@/components/display/comments/item/CommentMoreActionsAdmin.vue";
65
65
  import { useAuthStore } from "../../../../stores/AuthStore";
@@ -92,7 +92,6 @@ export default defineComponent({
92
92
  MessageModal,
93
93
  DotsVerticalIcon,
94
94
  },
95
- mixins: [selenium],
96
95
 
97
96
  props: {
98
97
  comment: { default: () => ({}), type: Object as () => CommentPodcast },
@@ -102,6 +101,11 @@ export default defineComponent({
102
101
  },
103
102
 
104
103
  emits: ["update:comment", "deleteComment"],
104
+
105
+ setup(){
106
+ const { seleniumFormat } = useSelenium();
107
+ return { seleniumFormat }
108
+ },
105
109
  data() {
106
110
  return {
107
111
  isEdit: false as boolean,
@@ -32,14 +32,12 @@ import SwiperList from "../list/SwiperList.vue";
32
32
  import classicApi from "../../../api/classicApi";
33
33
  import EmissionPlayerItem from "./EmissionPlayerItem.vue";
34
34
  import { state } from "../../../stores/ParamSdkStore";
35
- import { handle403 } from "../../mixins/handle403";
35
+ import {useErrorHandler} from "../../composable/useErrorHandler";
36
36
  import ClassicLoading from "../../form/ClassicLoading.vue";
37
37
  import { Emission } from "@/stores/class/general/emission";
38
38
  import { Rubrique } from "@/stores/class/rubrique/rubrique";
39
39
  import { defineComponent } from "vue";
40
40
  import { AxiosError } from "axios";
41
- import imageProxy from "../../mixins/imageProxy";
42
- import resizePhone from "../../mixins/resizePhone";
43
41
  import { Rubriquage } from "@/stores/class/rubrique/rubriquage";
44
42
  import { ListClassicReturn } from "@/stores/class/general/listReturn";
45
43
  export default defineComponent({
@@ -50,9 +48,6 @@ export default defineComponent({
50
48
  ClassicLoading,
51
49
  SwiperList,
52
50
  },
53
-
54
- mixins: [handle403, imageProxy, resizePhone],
55
-
56
51
  props: {
57
52
  organisationId: { default: undefined, type: String },
58
53
  href: { default: undefined, type: String },
@@ -63,6 +58,11 @@ export default defineComponent({
63
58
  itemSize: { default: undefined, type: Number },
64
59
  },
65
60
 
61
+ setup(){
62
+ const {handle403} = useErrorHandler();
63
+ return { handle403 }
64
+ },
65
+
66
66
  data() {
67
67
  return {
68
68
  loading: true as boolean,
@@ -9,7 +9,7 @@
9
9
  class="d-flex flex-grow-1 text-dark"
10
10
  >
11
11
  <img
12
- v-lazy="proxyImageUrl(emission.imageUrl, '250')"
12
+ v-lazy="useProxyImageUrl(emission.imageUrl, '250')"
13
13
  width="250"
14
14
  height="250"
15
15
  class="img-box"
@@ -55,11 +55,11 @@
55
55
 
56
56
  <script lang="ts">
57
57
  import AlertIcon from "vue-material-design-icons/Alert.vue";
58
- import { orgaComputed } from "../../mixins/orgaComputed";
58
+ import {useOrgaComputed} from "../../composable/useOrgaComputed";
59
59
  import { Emission } from "@/stores/class/general/emission";
60
60
  import classicApi from "../../../api/classicApi";
61
- import imageProxy from "../../mixins/imageProxy";
62
- import displayMethods from "../../mixins/displayMethods";
61
+ import {useImageProxy} from "../../composable/useImageProxy";
62
+ import displayHelper from "../../../helper/displayHelper";
63
63
  import { defineComponent } from "vue";
64
64
  import { Podcast } from "@/stores/class/general/podcast";
65
65
  import { ListClassicReturn } from "@/stores/class/general/listReturn";
@@ -69,12 +69,16 @@ export default defineComponent({
69
69
  AlertIcon,
70
70
  },
71
71
 
72
- mixins: [displayMethods, orgaComputed, imageProxy],
73
-
74
72
  props: {
75
73
  emission: { default: () => ({}), type: Object as () => Emission },
76
74
  },
77
75
 
76
+ setup(){
77
+ const { useProxyImageUrl } = useImageProxy();
78
+ const { isPodcastmaker, isEditRights } = useOrgaComputed();
79
+ return { useProxyImageUrl, isPodcastmaker, isEditRights }
80
+ },
81
+
78
82
  data() {
79
83
  return {
80
84
  activeEmission: true as boolean,
@@ -107,6 +111,9 @@ export default defineComponent({
107
111
  }
108
112
  },
109
113
  methods: {
114
+ urlify(text:string|undefined){
115
+ return displayHelper.urlify(text);
116
+ },
110
117
  async hasPodcast(): Promise<void> {
111
118
  const data = await classicApi.fetchData<ListClassicReturn<Podcast>>({
112
119
  api: 0,
@@ -60,7 +60,7 @@
60
60
  import ListPaginate from "../list/ListPaginate.vue";
61
61
  import classicApi from "../../../api/classicApi";
62
62
  import ClassicLazy from "../../misc/ClassicLazy.vue";
63
- import { handle403 } from "../../mixins/handle403";
63
+ import {useErrorHandler} from "../../composable/useErrorHandler";
64
64
  import { state } from "../../../stores/ParamSdkStore";
65
65
  import { Emission, emptyEmissionData } from "@/stores/class/general/emission";
66
66
  import { Rubrique } from "@/stores/class/rubrique/rubrique";
@@ -85,7 +85,6 @@ export default defineComponent({
85
85
  ClassicLazy,
86
86
  },
87
87
 
88
- mixins: [handle403],
89
88
 
90
89
  props: {
91
90
  first: { default: 0, type: Number },
@@ -104,6 +103,10 @@ export default defineComponent({
104
103
  noRubriquageId: { default: () => [], type: Array as () => Array<number> },
105
104
  nbPodcasts: { default: undefined, type: Number },
106
105
  },
106
+ setup(){
107
+ const {handle403} = useErrorHandler();
108
+ return { handle403 }
109
+ },
107
110
 
108
111
  data() {
109
112
  return {