@saooti/octopus-sdk 40.2.18 → 41.0.0-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 +38 -39
  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 +56 -69
  32. package/src/components/display/emission/EmissionList.vue +192 -218
  33. package/src/components/display/emission/EmissionPlayerItem.vue +48 -65
  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 +40 -51
  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 +211 -223
  58. package/src/components/display/organisation/OrganisationChooser.vue +117 -123
  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 +49 -51
  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 +185 -209
  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 +27 -32
  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 +85 -108
  143. package/src/components/misc/MobileMenu.vue +102 -113
  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 +116 -135
  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 +98 -131
  176. package/src/components/pages/EmissionsPage.vue +2 -0
  177. package/src/components/pages/Error403Page.vue +22 -21
  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 +83 -111
  184. package/src/components/pages/ParticipantsPage.vue +3 -0
  185. package/src/components/pages/PlaylistPage.vue +98 -116
  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
@@ -5,9 +5,9 @@
5
5
  :option-chosen="model"
6
6
  option-label="name"
7
7
  :display-label="displayLabel"
8
- :label="label ?? $t('By rubric')"
8
+ :label="label ?? t('By rubric')"
9
9
  :text-danger="textDanger"
10
- :placeholder="$t('Type string to filter by categories')"
10
+ :placeholder="t('Type string to filter by categories')"
11
11
  :max-element="maxElement"
12
12
  :multiple="multiple"
13
13
  :min-search-length="1"
@@ -20,151 +20,146 @@
20
20
  />
21
21
  </template>
22
22
 
23
- <script lang="ts">
23
+ <script setup lang="ts">
24
24
  import { Rubrique } from "@/stores/class/rubrique/rubrique";
25
25
  import ClassicMultiselect from "../../form/ClassicMultiselect.vue";
26
- import { defineComponent } from "vue";
27
- export default defineComponent({
28
- components: {
29
- ClassicMultiselect,
30
- },
31
- props: {
32
- defaultanswer: { default: "", type: String },
33
- width: { default: "100%", type: String },
34
- multiple: { default: false, type: Boolean },
35
- reset: { default: false, type: Boolean },
36
- allRubriques: { default: () => [], type: Array as () => Array<Rubrique> },
37
- rubriqueSelected: { default: undefined, type: Number },
38
- rubriqueSelectedArray: {
39
- default: undefined,
40
- type: Object as () => Array<number>,
41
- },
42
- id: { default: "rubrique-chooser", type: String },
43
- withoutRubrique: { default: false, type: Boolean },
44
- isDisabled: { default: false, type: Boolean },
45
- noDeselect: { default: true, type: Boolean },
46
- inModal: { default: false, type: Boolean },
47
- label:{default: undefined, type: String },
48
- displayLabel: { default: false, type: Boolean },
49
- textDanger :{ default: undefined, type: String },
50
- },
51
- emits: [
52
- "update:rubriqueSelected",
53
- "update:rubriqueSelectedArray",
54
- "selected",
55
- ],
26
+ import { computed, onMounted, Ref, ref, useTemplateRef, watch } from "vue";
27
+ import { useI18n } from "vue-i18n";
56
28
 
57
- data() {
58
- return {
59
- maxElement: 250 as number,
60
- rubrique: undefined as Rubrique | undefined,
61
- rubriqueForArray: [] as Array<Rubrique> | undefined,
62
- withoutItem: { name: this.$t("Without rubric"), rubriqueId: -1 } as {
63
- name: string;
64
- rubriqueId: number;
65
- },
66
- };
29
+ //Props
30
+ const props = defineProps({
31
+ defaultanswer: { default: "", type: String },
32
+ width: { default: "100%", type: String },
33
+ multiple: { default: false, type: Boolean },
34
+ reset: { default: false, type: Boolean },
35
+ allRubriques: { default: () => [], type: Array as () => Array<Rubrique> },
36
+ rubriqueSelected: { default: undefined, type: Number },
37
+ rubriqueSelectedArray: {
38
+ default: undefined,
39
+ type: Object as () => Array<number>,
67
40
  },
68
- computed: {
69
- getDefaultRubrique(): Rubrique | undefined {
70
- if ("" === this.defaultanswer) {
71
- return undefined;
72
- }
73
- return { name: this.defaultanswer, rubriqueId: 0 };
74
- },
75
- rubriques(): Array<Rubrique> {
76
- const rubriques = this.allRubriques;
77
- if (!this.getDefaultRubrique) {
78
- return rubriques;
79
- }
80
- if (this.withoutRubrique) {
81
- rubriques.unshift(this.withoutItem);
82
- }
83
- rubriques.unshift(this.getDefaultRubrique);
41
+ id: { default: "rubrique-chooser", type: String },
42
+ withoutRubrique: { default: false, type: Boolean },
43
+ isDisabled: { default: false, type: Boolean },
44
+ noDeselect: { default: true, type: Boolean },
45
+ inModal: { default: false, type: Boolean },
46
+ label:{default: undefined, type: String },
47
+ displayLabel: { default: false, type: Boolean },
48
+ textDanger :{ default: undefined, type: String },
49
+ })
84
50
 
85
- return rubriques;
86
- },
87
- model: {
88
- get(): Rubrique | Array<Rubrique> | undefined {
89
- return !this.multiple ? this.rubrique : this.rubriqueForArray;
90
- },
91
- set(value: Rubrique | Array<Rubrique> | undefined): void {
92
- if (!this.multiple) {
93
- this.rubrique = value as Rubrique | undefined;
94
- return;
95
- }
96
- this.rubriqueForArray = value as Array<Rubrique>;
97
- },
98
- },
99
- },
100
- watch: {
101
- rubriqueSelected: {
102
- immediate: true,
103
- handler() {
104
- if (this.rubriqueSelected) {
105
- this.initRubriqueSelected();
106
- } else {
107
- this.rubrique = this.getDefaultRubrique;
108
- }
109
- },
110
- },
111
- reset(): void {
112
- this.rubrique = this.getDefaultRubrique;
113
- },
51
+
52
+ //Emits
53
+ const emit = defineEmits([
54
+ "update:rubriqueSelected",
55
+ "update:rubriqueSelectedArray",
56
+ "selected"
57
+ ]);
58
+ //COmposables
59
+ const { t } = useI18n();
60
+
61
+
62
+ //Data
63
+ const maxElement = ref(250);
64
+ const rubrique: Ref<Rubrique | undefined> = ref(undefined);
65
+ const rubriqueForArray: Ref<Array<Rubrique> | undefined> = ref([]);
66
+ const withoutItem: Ref<{
67
+ name: string;
68
+ rubriqueId: number;
69
+ }> = ref({ name: t("Without rubric"), rubriqueId: -1 });
70
+ const selectRubriqueRef = useTemplateRef('selectRubrique');
71
+
72
+
73
+ //Computed
74
+ const getDefaultRubrique = computed(() => {
75
+ if ("" === props.defaultanswer) {
76
+ return undefined;
77
+ }
78
+ return { name: props.defaultanswer, rubriqueId: 0 };
79
+ });
80
+ const rubriques = computed(() => {
81
+ const rubriques = props.allRubriques;
82
+ if (!getDefaultRubrique.value) {
83
+ return rubriques;
84
+ }
85
+ if (props.withoutRubrique) {
86
+ rubriques.unshift(withoutItem.value);
87
+ }
88
+ rubriques.unshift(getDefaultRubrique.value);
89
+ return rubriques;
90
+ });
91
+
92
+ const model = computed({
93
+ get(): Rubrique | Array<Rubrique> | undefined {
94
+ return !props.multiple ? rubrique.value : rubriqueForArray.value;
114
95
  },
115
- mounted() {
116
- this.initRubriqueArray();
96
+ set(value: Rubrique | Array<Rubrique> | undefined): void {
97
+ if (!props.multiple) {
98
+ rubrique.value = value as Rubrique | undefined;
99
+ return;
100
+ }
101
+ rubriqueForArray.value = value as Array<Rubrique>;
117
102
  },
118
- methods: {
119
- onSearchRubrique(query: string): void {
120
- let rubriques = this.rubriques;
121
- if (query) {
122
- rubriques = rubriques.filter((item: Rubrique) => {
123
- return item.name.toUpperCase().includes(query.toUpperCase());
124
- });
125
- }
126
- (
127
- this.$refs.selectRubrique as InstanceType<typeof ClassicMultiselect>
128
- ).afterSearch(rubriques, rubriques.length);
129
- },
130
- onRubriqueSelected(rubrique: Rubrique | Array<Rubrique>): void {
131
- if (undefined !== this.rubriqueSelected) {
132
- this.$emit(
133
- "update:rubriqueSelected",
134
- (rubrique as Rubrique).rubriqueId,
135
- );
136
- }
137
- if (undefined !== this.rubriqueSelectedArray) {
138
- const idsArray: Array<number> = [];
139
- (rubrique as Array<Rubrique>).forEach((el: Rubrique) => {
140
- idsArray.push(el.rubriqueId ?? 0);
141
- });
142
- this.$emit("update:rubriqueSelectedArray", idsArray);
143
- } else {
144
- this.$emit("selected", rubrique);
145
- }
146
- },
147
- initRubriqueSelected(): void {
148
- this.rubrique =
149
- this.rubriques.find((el: Rubrique) => {
150
- return el.rubriqueId === this.rubriqueSelected;
151
- }) ?? this.getDefaultRubrique;
152
- },
103
+ })
153
104
 
154
- initRubriqueArray(): void {
155
- if (!this.rubriqueForArray || !this.rubriqueSelectedArray) {
156
- return;
157
- }
158
- this.rubriqueForArray.length = 0;
159
- this.rubriqueSelectedArray.forEach((element: number) => {
160
- const item = this.rubriques.find((el: Rubrique) => {
161
- return el.rubriqueId === element;
162
- });
163
- if (this.rubriqueForArray && item) {
164
- this.rubriqueForArray.push(item);
165
- }
166
- });
167
- },
168
- },
105
+
106
+ //Watch
107
+ watch(()=>props.rubriqueSelected, () => {
108
+ if (props.rubriqueSelected) {
109
+ initRubriqueSelected();
110
+ } else {
111
+ rubrique.value = getDefaultRubrique.value;
112
+ }
113
+ }, {immediate: true});
114
+ watch(()=>props.reset, () => {
115
+ rubrique.value = getDefaultRubrique.value;
169
116
  });
117
+
118
+ onMounted(()=>initRubriqueArray())
119
+
120
+
121
+ //Methods
122
+ function onSearchRubrique(query: string): void {
123
+ let tempRubriques = rubriques.value;
124
+ if (query) {
125
+ tempRubriques = tempRubriques.filter((item: Rubrique) => {
126
+ return item.name.toUpperCase().includes(query.toUpperCase());
127
+ });
128
+ }
129
+ (selectRubriqueRef?.value as InstanceType<typeof ClassicMultiselect>).afterSearch(tempRubriques, tempRubriques.length);
130
+ }
131
+ function onRubriqueSelected(rubrique: Rubrique | Array<Rubrique>): void {
132
+ if (undefined !== props.rubriqueSelected) {
133
+ emit("update:rubriqueSelected",(rubrique as Rubrique).rubriqueId);
134
+ }
135
+ if (undefined !== props.rubriqueSelectedArray) {
136
+ const idsArray: Array<number> = [];
137
+ (rubrique as Array<Rubrique>).forEach((el: Rubrique) => {
138
+ idsArray.push(el.rubriqueId ?? 0);
139
+ });
140
+ emit("update:rubriqueSelectedArray", idsArray);
141
+ } else {
142
+ emit("selected", rubrique);
143
+ }
144
+ }
145
+ function initRubriqueSelected(): void {
146
+ rubrique.value =
147
+ rubriques.value.find((el: Rubrique) => {
148
+ return el.rubriqueId === props.rubriqueSelected;
149
+ }) ?? getDefaultRubrique.value;
150
+ }
151
+ function initRubriqueArray(): void {
152
+ if (!rubriqueForArray.value || !props.rubriqueSelectedArray) {
153
+ return;
154
+ }
155
+ rubriqueForArray.value.length = 0;
156
+ props.rubriqueSelectedArray.forEach((element: number) => {
157
+ const item = rubriques.value.find((el: Rubrique) => {
158
+ return el.rubriqueId === element;
159
+ });
160
+ if (rubriqueForArray.value && item) {
161
+ rubriqueForArray.value.push(item);
162
+ }
163
+ });
164
+ }
170
165
  </script>
@@ -3,7 +3,7 @@
3
3
  <div ref="rubriqueListContainer" class="rubrique-list-container">
4
4
  <select
5
5
  v-model="rubriquage"
6
- :title="$t('By topic')"
6
+ :title="t('By topic')"
7
7
  class="c-hand"
8
8
  @change="onRubriquageSelected"
9
9
  >
@@ -17,7 +17,7 @@
17
17
  </select>
18
18
  <button
19
19
  v-for="rubrique in rubriqueDisplay"
20
- :ref="'rubrique' + rubrique.rubriqueId"
20
+ :id="'rubrique' + rubrique.rubriqueId"
21
21
  :key="rubrique.rubriqueId"
22
22
  class="btn btn-primary btn-on-dark m-1"
23
23
  @click="addFilter(rubrique)"
@@ -29,7 +29,7 @@
29
29
  v-show="hidenRubriques.length"
30
30
  id="rubriques-dropdown"
31
31
  class="btn btn-primary btn-on-dark m-1"
32
- :title="$t('See more')"
32
+ :title="t('See more')"
33
33
  >
34
34
  <PlusIcon />
35
35
  </button>
@@ -49,184 +49,164 @@
49
49
  </div>
50
50
  </template>
51
51
 
52
- <script lang="ts">
52
+ <script setup lang="ts">
53
53
  import PlusIcon from "vue-material-design-icons/Plus.vue";
54
54
  import { useRubriquesFilterParam } from "../../composable/route/useRubriquesFilterParam";
55
55
  import ClassicPopover from "../../misc/ClassicPopover.vue";
56
56
  import { Rubrique } from "@/stores/class/rubrique/rubrique";
57
57
  import { Rubriquage } from "@/stores/class/rubrique/rubriquage";
58
58
  import { useFilterStore } from "../../../stores/FilterStore";
59
- import { mapState, mapActions } from "pinia";
60
- import { defineAsyncComponent, defineComponent } from "vue";
59
+ import { computed, defineAsyncComponent, nextTick, onBeforeUnmount, onMounted, Ref, ref, useTemplateRef, watch } from "vue";
60
+ import { useI18n } from "vue-i18n";
61
61
  const RubriqueChooser = defineAsyncComponent(
62
62
  () => import("../rubriques/RubriqueChooser.vue"),
63
63
  );
64
- export default defineComponent({
65
- name: "RubriqueList",
66
64
 
67
- components: {
68
- ClassicPopover,
69
- RubriqueChooser,
70
- PlusIcon,
71
- },
65
+ //Props
66
+ const props = defineProps({
67
+ rubriquages: { default: () => [], type: Array as () => Array<Rubriquage> },
68
+ })
72
69
 
73
- props: {
74
- rubriquages: { default: () => [], type: Array as () => Array<Rubriquage> },
75
- },
70
+ //Data
71
+ const hidenRubriques: Ref<Array<Rubrique>> = ref([]);
72
+ const rubriquage: Ref<Rubriquage | undefined> = ref(undefined);
73
+ const popoverRubriqueRef = useTemplateRef('popoverRubrique');
74
+ const rubriqueListContainerRef = useTemplateRef('rubriqueListContainer');
76
75
 
77
- setup(){
78
- const { modifyRubriquesFilter } = useRubriquesFilterParam();
79
- return { modifyRubriquesFilter }
80
- },
81
76
 
82
- data() {
83
- return {
84
- hidenRubriques: [] as Array<Rubrique>,
85
- rubriques: [] as Array<Rubrique>,
86
- rubriquage: undefined as Rubriquage | undefined,
87
- };
88
- },
77
+ //Composables
78
+ const { t } = useI18n();
79
+ const { modifyRubriquesFilter } = useRubriquesFilterParam();
80
+ const filterStore = useFilterStore();
89
81
 
90
- computed: {
91
- ...mapState(useFilterStore, ["filterRubrique", "filterRubriqueDisplay"]),
92
- rubriqueDisplay(): Array<Rubrique> {
93
- return this.filterRubriqueDisplay.filter(
94
- (rubrique: Rubrique) => 0 !== rubrique.podcastCount,
95
- );
96
- },
97
- rubriquageDisplay(): Array<Rubriquage> {
98
- const elementToNotShow = Array.from(this.filterRubrique);
99
- if (elementToNotShow.length) {
100
- const rubriquageIdToNotShow = elementToNotShow.map(
101
- (a) => a.rubriquageId,
102
- );
103
- return this.rubriquages.filter((element) => {
104
- if (!element.rubriquageId) {
105
- return;
106
- }
107
- return !rubriquageIdToNotShow.includes(element.rubriquageId);
108
- });
109
- }
110
- return Array.from(this.rubriquages).toSorted((a,b) => {
111
- if(a.title > b.title){
112
- return 1;
113
- }
114
- return (b.title > a.title) ? -1 : 0;
115
- });
116
- },
117
- },
118
- watch: {
119
- filterRubrique: {
120
- deep: true,
121
- handler() {
122
- this.selectNewRubriquage();
123
- },
124
- },
125
- },
126
82
 
127
- mounted() {
128
- this.selectNewRubriquage();
129
- },
130
- beforeUnmount(): void {
131
- window.removeEventListener("resize", this.resizeWindow);
132
- },
133
- methods: {
134
- ...mapActions(useFilterStore, ["filterUpdateRubriqueDisplay"]),
135
- initRubriques(): void {
136
- this.filterUpdateRubriqueDisplay(this.rubriquage?.rubriques ?? []);
137
- window.addEventListener("resize", this.resizeWindow);
138
- this.$nextTick(() => {
139
- this.resizeWindow();
140
- });
141
- },
142
- addFilterFromPopover(rubrique: Rubrique): void {
143
- (this.$refs.popoverRubrique as InstanceType<typeof Popover>).clearClick();
144
- this.addFilter(rubrique);
145
- },
146
- addFilter(rubrique: Rubrique): void {
147
- if (!this.rubriquage) {
148
- return;
149
- }
150
- const filterToAdd = {
151
- rubriquageId: this.rubriquage.rubriquageId ?? 0,
152
- rubriqueId: rubrique.rubriqueId ?? 0,
153
- nameRubriquage: this.rubriquage.title,
154
- nameRubrique: rubrique.name,
155
- };
156
- this.modifyRubriquesFilter((a) => {
157
- a.push(filterToAdd);
158
- return a;
159
- });
160
- this.selectNewRubriquage();
161
- },
162
- selectNewRubriquage() {
163
- const rubriquageLength = this.rubriquages.length;
164
- if (rubriquageLength === this.filterRubrique.length) {
165
- return;
166
- }
167
- let index = 0;
168
- const rubriquageAlreadyFilter = this.filterRubrique.map(
169
- (a) => a.rubriquageId,
170
- );
171
- for (index; index < rubriquageLength; index++) {
172
- const rubriquageIdIndex = this.rubriquages[index].rubriquageId;
173
- if (
174
- rubriquageIdIndex &&
175
- !rubriquageAlreadyFilter.includes(rubriquageIdIndex)
176
- ) {
177
- break;
178
- }
179
- }
180
- this.rubriquage = this.rubriquages[index];
181
- this.initRubriques();
182
- },
183
- resizeWindow(): void {
184
- const rubriqueList = this.$refs.rubriqueListContainer as HTMLElement;
185
- if (null === rubriqueList) {
83
+ //Computed
84
+ const rubriqueDisplay = computed(() => {
85
+ return filterStore.filterRubriqueDisplay.filter(
86
+ (rubrique: Rubrique) => 0 !== rubrique.podcastCount,
87
+ );
88
+ });
89
+ const rubriquageDisplay = computed(() => {
90
+ const elementToNotShow = Array.from(filterStore.filterRubrique);
91
+ if (elementToNotShow.length) {
92
+ const rubriquageIdToNotShow = elementToNotShow.map(
93
+ (a) => a.rubriquageId,
94
+ );
95
+ return props.rubriquages.filter((element) => {
96
+ if (!element.rubriquageId) {
186
97
  return;
187
98
  }
188
- rubriqueList.style.justifyContent = "flex-start";
189
- this.hidenRubriques.length = 0;
190
- this.rubriqueDisplay.forEach((element: Rubrique) => {
191
- const el = (
192
- this.$refs["rubrique" + element.rubriqueId] as Array<HTMLElement>
193
- )[0];
194
- if (!el) return;
195
- if (el.classList.contains("hid")) {
196
- el.classList.remove("hid");
197
- }
198
- });
199
- this.rubriqueDisplay.forEach((element: Rubrique) => {
200
- const el = (
201
- this.$refs["rubrique" + element.rubriqueId] as Array<HTMLElement>
202
- )[0];
203
- if (!el) return;
204
- const parent = el.parentElement;
205
- if (
206
- null !== parent &&
207
- el.offsetLeft + el.clientWidth <= parent.clientWidth - 20
208
- ) {
209
- return;
210
- }
211
- this.hidenRubriques.push(element);
212
- if (!el.classList.contains("hid")) {
213
- el.className += " hid";
214
- }
215
- });
216
- if (!this.hidenRubriques.length) {
217
- rubriqueList.style.justifyContent = "center";
218
- }
219
- },
220
- onRubriquageSelected() {
221
- this.initRubriques();
222
- },
223
- },
99
+ return !rubriquageIdToNotShow.includes(element.rubriquageId);
100
+ });
101
+ }
102
+ return Array.from(props.rubriquages).toSorted((a,b) => {
103
+ if(a.title > b.title){
104
+ return 1;
105
+ }
106
+ return (b.title > a.title) ? -1 : 0;
107
+ });
224
108
  });
225
- </script>
226
109
 
227
- <style lang="scss">
228
110
 
111
+ //Watch
112
+ watch(()=>filterStore.filterRubrique, () => {
113
+ selectNewRubriquage()
114
+ }, {deep: true});
115
+
116
+ onMounted(()=>selectNewRubriquage())
229
117
 
118
+ onBeforeUnmount(()=> window.removeEventListener("resize", resizeWindow))
119
+
120
+
121
+ //Methods
122
+ function initRubriques(): void {
123
+ filterStore.filterUpdateRubriqueDisplay(rubriquage.value?.rubriques ?? []);
124
+ window.addEventListener("resize", resizeWindow);
125
+ nextTick(() => {
126
+ resizeWindow();
127
+ });
128
+ }
129
+ function addFilterFromPopover(rubrique: Rubrique): void {
130
+ const popover = popoverRubriqueRef?.value as InstanceType<typeof ClassicPopover>;
131
+ popover.clearClick();
132
+ addFilter(rubrique);
133
+ }
134
+ function addFilter(rubrique: Rubrique): void {
135
+ if (!rubriquage.value) {
136
+ return;
137
+ }
138
+ const filterToAdd = {
139
+ rubriquageId: rubriquage.value.rubriquageId ?? 0,
140
+ rubriqueId: rubrique.rubriqueId ?? 0,
141
+ nameRubriquage: rubriquage.value.title,
142
+ nameRubrique: rubrique.name,
143
+ };
144
+ modifyRubriquesFilter((a) => {
145
+ a.push(filterToAdd);
146
+ return a;
147
+ });
148
+ selectNewRubriquage();
149
+ }
150
+ function selectNewRubriquage() {
151
+ const rubriquageLength = props.rubriquages.length;
152
+ if (rubriquageLength === filterStore.filterRubrique.length) {
153
+ return;
154
+ }
155
+ let index = 0;
156
+ const rubriquageAlreadyFilter = filterStore.filterRubrique.map(
157
+ (a) => a.rubriquageId,
158
+ );
159
+ for (index; index < rubriquageLength; index++) {
160
+ const rubriquageIdIndex = props.rubriquages[index].rubriquageId;
161
+ if (
162
+ rubriquageIdIndex &&
163
+ !rubriquageAlreadyFilter.includes(rubriquageIdIndex)
164
+ ) {
165
+ break;
166
+ }
167
+ }
168
+ rubriquage.value = props.rubriquages[index];
169
+ initRubriques();
170
+ }
171
+ function resizeWindow(): void {
172
+ const rubriqueList = rubriqueListContainerRef?.value as HTMLElement;
173
+ if (null === rubriqueList) {
174
+ return;
175
+ }
176
+ rubriqueList.style.justifyContent = "flex-start";
177
+ hidenRubriques.value.length = 0;
178
+ rubriqueDisplay.value.forEach((element: Rubrique) => {
179
+ const el = rubriqueList.querySelector('#rubrique' + element.rubriqueId);
180
+ if (!el) return;
181
+ if (el.classList.contains("hid")) {
182
+ el.classList.remove("hid");
183
+ }
184
+ });
185
+ rubriqueDisplay.value.forEach((element: Rubrique) => {
186
+ const el = rubriqueList.querySelector('#rubrique' + element.rubriqueId);
187
+ if (!el) return;
188
+ const parent = el.parentElement;
189
+ if (
190
+ null !== parent &&
191
+ el.offsetLeft + el.clientWidth <= parent.clientWidth - 20
192
+ ) {
193
+ return;
194
+ }
195
+ hidenRubriques.value.push(element);
196
+ if (!el.classList.contains("hid")) {
197
+ el.className += " hid";
198
+ }
199
+ });
200
+ if (!hidenRubriques.value.length) {
201
+ rubriqueList.style.justifyContent = "center";
202
+ }
203
+ }
204
+ function onRubriquageSelected() {
205
+ initRubriques();
206
+ }
207
+ </script>
208
+
209
+ <style lang="scss">
230
210
  .octopus-app {
231
211
  .rubrique-list-container {
232
212
  display: flex;