@saooti/octopus-sdk 40.2.19 → 41.0.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 (214) hide show
  1. package/index.ts +2 -1
  2. package/package.json +4 -3
  3. package/src/App.vue +71 -95
  4. package/src/components/composable/player/usePlayerLive.ts +13 -4
  5. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  6. package/src/components/composable/player/usePlayerVast.ts +7 -7
  7. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  8. package/src/components/composable/route/useAdvancedParamInit.ts +1 -1
  9. package/src/components/composable/route/useRouteUpdateParams.ts +4 -4
  10. package/src/components/composable/route/useSimplePageParam.ts +15 -8
  11. package/src/components/composable/useInit.ts +2 -2
  12. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  13. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  14. package/src/components/display/categories/CategoryChooser.vue +144 -145
  15. package/src/components/display/categories/CategoryFilter.vue +172 -198
  16. package/src/components/display/categories/CategoryList.vue +122 -147
  17. package/src/components/display/comments/CommentInput.vue +100 -122
  18. package/src/components/display/comments/CommentList.vue +169 -191
  19. package/src/components/display/comments/CommentName.vue +35 -45
  20. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  21. package/src/components/display/comments/CommentPlayer.vue +38 -50
  22. package/src/components/display/comments/CommentSection.vue +85 -103
  23. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  24. package/src/components/display/comments/item/CommentItem.vue +104 -115
  25. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  26. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  27. package/src/components/display/comments/like/LikeButton.vue +36 -41
  28. package/src/components/display/comments/like/LikeSection.vue +128 -136
  29. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  30. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  31. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  32. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  33. package/src/components/display/edit/EditBox.vue +9 -8
  34. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  35. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  36. package/src/components/display/emission/EmissionItem.vue +57 -69
  37. package/src/components/display/emission/EmissionList.vue +189 -218
  38. package/src/components/display/emission/EmissionPlayerItem.vue +47 -64
  39. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  40. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  41. package/src/components/display/filter/AdvancedSearch.vue +151 -176
  42. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  43. package/src/components/display/filter/DateFilter.vue +76 -91
  44. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  45. package/src/components/display/filter/ProductorSearch.vue +87 -90
  46. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  47. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  48. package/src/components/display/filter/SearchOrder.vue +35 -35
  49. package/src/components/display/list/ListPaginate.vue +72 -93
  50. package/src/components/display/list/PaginateParams.vue +36 -40
  51. package/src/components/display/list/PaginateSection.vue +113 -124
  52. package/src/components/display/list/SwiperList.vue +97 -109
  53. package/src/components/display/live/CountDown.vue +15 -9
  54. package/src/components/display/live/CountdownOctopus.vue +16 -10
  55. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  56. package/src/components/display/live/LiveItem.vue +64 -73
  57. package/src/components/display/live/LiveList.vue +125 -137
  58. package/src/components/display/live/RadioCurrently.vue +66 -73
  59. package/src/components/display/live/RadioImage.vue +39 -50
  60. package/src/components/display/live/RadioItem.vue +9 -14
  61. package/src/components/display/live/RadioList.vue +39 -53
  62. package/src/components/display/live/RadioPlanning.vue +210 -222
  63. package/src/components/display/organisation/OrganisationChooser.vue +116 -122
  64. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  65. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  66. package/src/components/display/participant/ParticipantItem.vue +66 -74
  67. package/src/components/display/participant/ParticipantList.vue +116 -141
  68. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  69. package/src/components/display/playlist/PlaylistList.vue +115 -144
  70. package/src/components/display/playlist/PodcastList.vue +90 -103
  71. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  72. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  73. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  74. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  75. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  76. package/src/components/display/podcasts/PodcastFilterList.vue +62 -56
  77. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  78. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  79. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  80. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  81. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  82. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  83. package/src/components/display/podcasts/PodcastList.vue +182 -206
  84. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  85. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  86. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  87. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  88. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  89. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  90. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  91. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  92. package/src/components/display/podcasts/TagList.vue +48 -50
  93. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  94. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  95. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  96. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  97. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  98. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  99. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  100. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  101. package/src/components/display/sharing/QrCode.vue +55 -67
  102. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  103. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  104. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  105. package/src/components/display/sharing/SharePlayer.vue +273 -295
  106. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  107. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  108. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  109. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  110. package/src/components/display/sharing/SubscribeButtons.vue +184 -207
  111. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  112. package/src/components/form/ClassicCheckbox.vue +26 -30
  113. package/src/components/form/ClassicContentEditable.vue +37 -33
  114. package/src/components/form/ClassicCopyButton.vue +40 -44
  115. package/src/components/form/ClassicDatePicker.vue +114 -114
  116. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  117. package/src/components/form/ClassicInputText.vue +116 -120
  118. package/src/components/form/ClassicLoading.vue +7 -12
  119. package/src/components/form/ClassicMultiselect.vue +115 -117
  120. package/src/components/form/ClassicRadio.vue +21 -16
  121. package/src/components/form/ClassicRadioLabel.vue +23 -22
  122. package/src/components/form/ClassicSearch.vue +24 -19
  123. package/src/components/form/ClassicSelect.vue +47 -38
  124. package/src/components/form/ClassicWysiwyg.vue +116 -123
  125. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  126. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  127. package/src/components/icons/BlueSkyIcon.vue +8 -11
  128. package/src/components/icons/DeezerIcon.vue +8 -11
  129. package/src/components/icons/EditFtpIcon.vue +8 -11
  130. package/src/components/icons/IHeartIcon.vue +8 -11
  131. package/src/components/icons/PlayVideoIcon.vue +7 -10
  132. package/src/components/icons/PlayerFmIcon.vue +7 -10
  133. package/src/components/icons/PocketCastIcon.vue +8 -11
  134. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  135. package/src/components/icons/RadiolineIcon.vue +8 -11
  136. package/src/components/icons/TuninIcon.vue +8 -11
  137. package/src/components/icons/XIcon.vue +7 -10
  138. package/src/components/misc/AcpmImage.vue +6 -7
  139. package/src/components/misc/ClassicAccordion.vue +26 -31
  140. package/src/components/misc/ClassicLazy.vue +86 -90
  141. package/src/components/misc/ClassicNav.vue +16 -20
  142. package/src/components/misc/ClassicPopover.vue +271 -282
  143. package/src/components/misc/ClassicSpinner.vue +5 -27
  144. package/src/components/misc/ErrorMessage.vue +11 -12
  145. package/src/components/misc/FooterGarSection.vue +33 -41
  146. package/src/components/misc/FooterSection.vue +94 -131
  147. package/src/components/misc/HomeDropdown.vue +83 -105
  148. package/src/components/misc/MobileMenu.vue +101 -111
  149. package/src/components/misc/ProgressBar.vue +53 -62
  150. package/src/components/misc/TopBar.vue +98 -120
  151. package/src/components/misc/TopBarMainContent.vue +114 -133
  152. package/src/components/misc/modal/ClassicModal.vue +40 -33
  153. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  154. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  155. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  156. package/src/components/misc/modal/MessageModal.vue +50 -47
  157. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  158. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  159. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  160. package/src/components/misc/player/PlayerCompact.vue +6 -4
  161. package/src/components/misc/player/PlayerComponent.vue +8 -9
  162. package/src/components/misc/player/PlayerLarge.vue +9 -8
  163. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  164. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  165. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  166. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  167. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  168. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  169. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  170. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  171. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  172. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  173. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  174. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  175. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  176. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  177. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  178. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  179. package/src/components/pages/CategoryPage.vue +28 -33
  180. package/src/components/pages/EmissionPage.vue +113 -132
  181. package/src/components/pages/EmissionsPage.vue +2 -0
  182. package/src/components/pages/Error403Page.vue +21 -20
  183. package/src/components/pages/HomePage.vue +91 -100
  184. package/src/components/pages/LivesPage.vue +35 -37
  185. package/src/components/pages/MapPage.vue +209 -241
  186. package/src/components/pages/PageLogout.vue +8 -11
  187. package/src/components/pages/PageNotFound.vue +9 -5
  188. package/src/components/pages/ParticipantPage.vue +96 -110
  189. package/src/components/pages/ParticipantsPage.vue +3 -0
  190. package/src/components/pages/PlaylistPage.vue +112 -117
  191. package/src/components/pages/PlaylistsPage.vue +9 -2
  192. package/src/components/pages/PodcastPage.vue +224 -238
  193. package/src/components/pages/PodcastsPage.vue +9 -2
  194. package/src/components/pages/RadioPage.vue +56 -70
  195. package/src/components/pages/RubriquePage.vue +7 -3
  196. package/src/components/pages/SearchPage.vue +31 -36
  197. package/src/components/pages/TagPage.vue +11 -9
  198. package/src/components/pages/VideoPage.vue +14 -11
  199. package/src/helper/displayHelper.ts +1 -1
  200. package/src/helper/loadScript.ts +4 -4
  201. package/src/i18n.ts +2 -2
  202. package/src/main.ts +1 -1
  203. package/src/router/router.ts +17 -4
  204. package/src/stores/AuthStore.ts +12 -12
  205. package/src/stores/FilterStore.ts +1 -1
  206. package/src/stores/VastStore.ts +2 -2
  207. package/src/stores/class/general/player.ts +1 -0
  208. package/public/css/fonts/icomoon.eot +0 -0
  209. package/public/css/fonts/icomoon.svg +0 -113
  210. package/public/css/fonts/icomoon.ttf +0 -0
  211. package/public/css/fonts/icomoon.woff +0 -0
  212. package/public/css/fonts/icomoon.woff2 +0 -0
  213. package/public/css/fonts/style.css +0 -352
  214. 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;