@saooti/octopus-sdk 1.0.0 → 1.1.1

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 (317) hide show
  1. package/README.md +261 -0
  2. package/index.d.ts +4 -0
  3. package/index.ts +55 -3
  4. package/package.json +53 -45
  5. package/public/config.ts +4 -0
  6. package/public/css/fonts/icomoon.eot +0 -0
  7. package/public/css/fonts/icomoon.svg +129 -0
  8. package/public/css/fonts/icomoon.ttf +0 -0
  9. package/public/css/fonts/icomoon.woff +0 -0
  10. package/public/css/fonts/style.css +186 -1224
  11. package/public/img/403.jpeg +0 -0
  12. package/public/img/404.svg +242 -0
  13. package/public/img/ACPM.png +0 -0
  14. package/public/img/ouest_france_logo.svg +12 -0
  15. package/src/App.vue +102 -31
  16. package/src/api/classicCrud.ts +34 -0
  17. package/src/api/initialize.ts +5 -2
  18. package/src/assets/bootstrap-diff.scss +197 -0
  19. package/src/assets/form.scss +77 -77
  20. package/src/assets/general.scss +284 -272
  21. package/src/assets/live.scss +39 -0
  22. package/src/assets/modal.scss +43 -50
  23. package/src/assets/multiselect.scss +522 -573
  24. package/src/assets/octopus-library.scss +18 -4
  25. package/src/assets/share.scss +243 -0
  26. package/src/assets/transition.scss +98 -2
  27. package/src/components/display/aggregator/RssSection.vue +3 -5
  28. package/src/components/display/categories/CategoryChooser.vue +151 -114
  29. package/src/components/display/categories/CategoryFilter.vue +162 -0
  30. package/src/components/display/categories/CategoryList.vue +149 -117
  31. package/src/components/display/comments/AddCommentModal.vue +103 -108
  32. package/src/components/display/comments/CommentBasicView.vue +95 -0
  33. package/src/components/display/comments/CommentInput.vue +195 -183
  34. package/src/components/display/comments/CommentItem.vue +170 -208
  35. package/src/components/display/comments/CommentList.vue +134 -228
  36. package/src/components/display/comments/CommentParentInfo.vue +28 -62
  37. package/src/components/display/comments/CommentPlayer.vue +53 -56
  38. package/src/components/display/comments/CommentSection.vue +52 -83
  39. package/src/components/display/edit/EditBox.vue +10 -4
  40. package/src/components/display/edit/EditCommentBox.vue +124 -38
  41. package/src/components/display/emission/EmissionChooser.vue +88 -108
  42. package/src/components/display/emission/EmissionInlineList.vue +156 -157
  43. package/src/components/display/emission/EmissionItem.vue +72 -226
  44. package/src/components/display/emission/EmissionList.vue +159 -201
  45. package/src/components/display/emission/EmissionPlayerItem.vue +203 -174
  46. package/src/components/display/filter/AdvancedSearch.vue +224 -432
  47. package/src/components/display/filter/CategoryFilter.vue +105 -0
  48. package/src/components/display/filter/MonetizableFilter.vue +18 -15
  49. package/src/components/display/filter/ProductorSearch.vue +153 -176
  50. package/src/components/display/filter/RubriqueChoice.vue +97 -0
  51. package/src/components/display/filter/RubriqueFilter.vue +232 -0
  52. package/src/components/display/list/ListPaginate.vue +145 -0
  53. package/src/components/display/list/Paginate.vue +218 -0
  54. package/src/components/display/live/CountDown.vue +31 -30
  55. package/src/components/display/live/LiveHorizontalList.vue +84 -62
  56. package/src/components/display/live/LiveItem.vue +161 -186
  57. package/src/components/display/live/LiveList.vue +184 -295
  58. package/src/components/display/organisation/OrganisationChooser.vue +124 -162
  59. package/src/components/display/organisation/OrganisationChooserLight.vue +53 -56
  60. package/src/components/display/participant/ParticipantItem.vue +91 -128
  61. package/src/components/display/participant/ParticipantList.vue +134 -121
  62. package/src/components/display/playlist/PlaylistItem.vue +60 -97
  63. package/src/components/display/playlist/PlaylistList.vue +99 -92
  64. package/src/components/display/playlist/PodcastList.vue +117 -132
  65. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +191 -0
  66. package/src/components/display/podcasts/AnimatorsItem.vue +29 -37
  67. package/src/components/display/podcasts/ParticipantDescription.vue +82 -0
  68. package/src/components/display/podcasts/PodcastFilterList.vue +49 -102
  69. package/src/components/display/podcasts/PodcastImage.vue +208 -225
  70. package/src/components/display/podcasts/PodcastInlineList.vue +62 -355
  71. package/src/components/display/podcasts/PodcastInlineListClassic.vue +240 -0
  72. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +167 -0
  73. package/src/components/display/podcasts/PodcastItem.vue +94 -218
  74. package/src/components/display/podcasts/PodcastItemInfo.vue +166 -0
  75. package/src/components/display/podcasts/PodcastList.vue +127 -178
  76. package/src/components/display/podcasts/PodcastModuleBox.vue +234 -0
  77. package/src/components/display/podcasts/PodcastPlayBar.vue +101 -0
  78. package/src/components/display/podcasts/PodcastSwiperList.vue +204 -0
  79. package/src/components/display/podcasts/TagList.vue +60 -38
  80. package/src/components/display/rubriques/RubriqueChooser.vue +144 -131
  81. package/src/components/display/rubriques/RubriqueList.vue +216 -0
  82. package/src/components/display/sharing/PlayerParameters.vue +111 -153
  83. package/src/components/display/sharing/QrCode.vue +96 -0
  84. package/src/components/display/sharing/ShareButtons.vue +63 -233
  85. package/src/components/display/sharing/ShareButtonsIntern.vue +225 -0
  86. package/src/components/display/sharing/ShareDistribution.vue +102 -166
  87. package/src/components/display/sharing/SharePlayer.vue +189 -353
  88. package/src/components/display/sharing/SharePlayerColors.vue +78 -0
  89. package/src/components/display/sharing/SharePlayerTypes.vue +112 -0
  90. package/src/components/display/sharing/SplitButton.vue +42 -0
  91. package/src/components/display/sharing/SubscribeButtons.vue +65 -118
  92. package/src/components/display/studio/RecordingItemButton.vue +3 -5
  93. package/src/components/form/ClassicCheckbox.vue +66 -0
  94. package/src/components/form/ClassicLoading.vue +28 -0
  95. package/src/components/form/ClassicRadio.vue +66 -0
  96. package/src/components/form/ClassicSearch.vue +86 -0
  97. package/src/components/form/ClassicSelect.vue +65 -0
  98. package/src/components/misc/ErrorMessage.vue +27 -18
  99. package/src/components/misc/Footer.vue +151 -108
  100. package/src/components/misc/HomeDropdown.vue +95 -154
  101. package/src/components/misc/LeftMenu.vue +137 -206
  102. package/src/components/misc/Popover.vue +118 -0
  103. package/src/components/misc/Snackbar.vue +73 -37
  104. package/src/components/misc/TopBar.vue +211 -314
  105. package/src/components/misc/modal/ClipboardModal.vue +34 -47
  106. package/src/components/misc/modal/MessageModal.vue +74 -53
  107. package/src/components/misc/modal/NewsletterModal.vue +272 -224
  108. package/src/components/misc/modal/QrCodeModal.vue +58 -0
  109. package/src/components/misc/modal/ShareModalPlayer.vue +140 -74
  110. package/src/components/misc/player/Player.vue +146 -0
  111. package/src/components/misc/player/PlayerCompact.vue +154 -0
  112. package/src/components/misc/player/PlayerLarge.vue +166 -0
  113. package/src/components/misc/player/PlayerProgressBar.vue +112 -0
  114. package/src/components/misc/player/PlayerTimeline.vue +61 -0
  115. package/src/components/mixins/functions.ts +21 -18
  116. package/src/components/mixins/handle403.ts +17 -0
  117. package/src/components/mixins/init.ts +24 -0
  118. package/src/components/mixins/orgaComputed.ts +15 -0
  119. package/src/components/mixins/organisationFilter.ts +41 -0
  120. package/src/components/mixins/player/playerComment.ts +98 -0
  121. package/src/components/mixins/player/playerDisplay.ts +113 -0
  122. package/src/components/mixins/player/playerLive.ts +111 -0
  123. package/src/components/mixins/player/playerLogic.ts +225 -0
  124. package/src/components/mixins/tagOfMixins.ts +19 -0
  125. package/src/components/pages/Category.vue +24 -28
  126. package/src/components/pages/Emission.vue +144 -177
  127. package/src/components/pages/Emissions.vue +94 -110
  128. package/src/components/pages/Error403Page.vue +60 -0
  129. package/src/components/pages/Home.vue +74 -21
  130. package/src/components/pages/Lives.vue +53 -58
  131. package/src/components/pages/PageNotFound.vue +55 -0
  132. package/src/components/pages/Participant.vue +113 -129
  133. package/src/components/pages/Participants.vue +25 -41
  134. package/src/components/pages/Playlist.vue +86 -86
  135. package/src/components/pages/Playlists.vue +33 -52
  136. package/src/components/pages/Podcast.vue +206 -478
  137. package/src/components/pages/Podcasts.vue +112 -156
  138. package/src/components/pages/Rubrique.vue +21 -27
  139. package/src/components/pages/Search.vue +37 -94
  140. package/src/helper/dom.ts +2 -2
  141. package/src/helper/duration.ts +18 -8
  142. package/src/helper/useEventListener.ts +18 -0
  143. package/src/i18n.ts +36 -0
  144. package/src/locale/de.ts +309 -0
  145. package/src/locale/educationen.ts +14 -0
  146. package/src/locale/en.ts +316 -1
  147. package/src/locale/es.ts +309 -0
  148. package/src/locale/fr.ts +47 -15
  149. package/src/locale/it.ts +307 -0
  150. package/src/locale/messages.ts +11 -2
  151. package/src/locale/sl.ts +309 -0
  152. package/src/main.ts +64 -55
  153. package/src/router/router.ts +192 -159
  154. package/src/sass/_variables.scss +10 -8
  155. package/src/shims-tsx.d.ts +15 -0
  156. package/src/shims-vue-recaptcha-v3.d.ts +9 -0
  157. package/src/shims-vue.d.ts +5 -6
  158. package/src/store/AppStore.ts +41 -173
  159. package/src/store/class/adserver/adserverConfig.ts +9 -0
  160. package/src/store/class/adserver/adserverOtherEmission.ts +13 -0
  161. package/src/store/class/adserver/adserverTiming.ts +10 -0
  162. package/src/store/class/cartouchier/cartouche.ts +15 -0
  163. package/src/store/class/cartouchier/cartouchier.ts +9 -0
  164. package/src/store/class/conference/conference.ts +35 -0
  165. package/src/store/class/conference/conferenceMessage.ts +10 -0
  166. package/src/store/class/conference/conferenceParticipant.ts +18 -0
  167. package/src/store/class/conference/pad.ts +15 -0
  168. package/src/store/class/conference/studioCall.ts +7 -0
  169. package/src/store/class/contract/contract.ts +7 -0
  170. package/src/store/class/contract/contractOrganisation.ts +7 -0
  171. package/src/store/class/ftp/ftpEmission.ts +41 -0
  172. package/src/store/class/ftp/ftpParam.ts +12 -0
  173. package/src/store/class/ftp/testFtpEmission.ts +5 -0
  174. package/src/store/class/general/audioView.ts +21 -0
  175. package/src/store/class/general/category.ts +10 -0
  176. package/src/store/class/general/comment.ts +16 -0
  177. package/src/store/class/general/customPlayer.ts +9 -0
  178. package/src/store/class/general/emission.ts +23 -0
  179. package/src/store/class/general/fetchParam.ts +3 -0
  180. package/src/store/class/general/initState.ts +25 -0
  181. package/src/store/class/general/interfacePageable.ts +16 -0
  182. package/src/store/class/general/ituneCategory.ts +5 -0
  183. package/src/store/class/general/media.ts +14 -0
  184. package/src/store/class/general/organisation.ts +20 -0
  185. package/src/store/class/general/pageable.ts +13 -0
  186. package/src/store/class/general/participant.ts +12 -0
  187. package/src/store/class/general/player.ts +14 -0
  188. package/src/store/class/general/playlist.ts +13 -0
  189. package/src/store/class/general/podcast.ts +43 -0
  190. package/src/store/class/general/sortPageable.ts +5 -0
  191. package/src/store/class/general/soundcastCategory.ts +8 -0
  192. package/src/store/class/ouestFrance/ofTag.ts +36 -0
  193. package/src/store/class/ouestFrance/ofTagInfo.ts +9 -0
  194. package/src/store/class/ouestFrance/ofTagPage.ts +7 -0
  195. package/src/store/class/ouestFrance/ofTagSeo.ts +7 -0
  196. package/src/store/class/ouestFrance/ofTagVente.ts +6 -0
  197. package/src/store/class/ouestFrance/ofTagWithParents.ts +26 -0
  198. package/src/store/class/rss/aggregator.ts +28 -0
  199. package/src/store/class/rss/rssEmission.ts +14 -0
  200. package/src/store/class/rss/rssInfo.ts +8 -0
  201. package/src/store/class/rubrique/rubriquage.ts +10 -0
  202. package/src/store/class/rubrique/rubriquageFilter.ts +6 -0
  203. package/src/store/class/rubrique/rubrique.ts +9 -0
  204. package/src/store/class/stat/statArrayIncome.ts +6 -0
  205. package/src/store/class/stat/statArrayObject.ts +34 -0
  206. package/src/store/class/stat/statGraph.ts +7 -0
  207. package/src/store/class/user/person.ts +15 -0
  208. package/src/store/class/user/profile.ts +12 -0
  209. package/src/store/class/user/userKeycloak.ts +24 -0
  210. package/src/store/paramStore.ts +222 -217
  211. package/src/store/typeAppStore.ts +186 -235
  212. package/src/vuex-shim.d.ts +8 -0
  213. package/tsconfig.json +4 -0
  214. package/vue.config.js +16 -0
  215. package/public/css/fonts/saooti-ui.eot +0 -0
  216. package/public/css/fonts/saooti-ui.svg +0 -829
  217. package/public/css/fonts/saooti-ui.ttf +0 -0
  218. package/public/css/fonts/saooti-ui.woff +0 -0
  219. package/public/css/fonts/stitcher-logo.svg +0 -83
  220. package/public/img/ACPM.PNG +0 -0
  221. package/src/api/comments.ts +0 -7
  222. package/src/api/emissions.ts +0 -7
  223. package/src/api/podcasts.ts +0 -7
  224. package/src/api/profile.ts +0 -8
  225. package/src/api/studio.ts +0 -1
  226. package/src/assets/bootstrap_scss/_alert.scss +0 -51
  227. package/src/assets/bootstrap_scss/_badge.scss +0 -54
  228. package/src/assets/bootstrap_scss/_breadcrumb.scss +0 -42
  229. package/src/assets/bootstrap_scss/_button-group.scss +0 -164
  230. package/src/assets/bootstrap_scss/_buttons.scss +0 -291
  231. package/src/assets/bootstrap_scss/_card.scss +0 -278
  232. package/src/assets/bootstrap_scss/_carousel.scss +0 -197
  233. package/src/assets/bootstrap_scss/_close.scss +0 -41
  234. package/src/assets/bootstrap_scss/_code.scss +0 -48
  235. package/src/assets/bootstrap_scss/_custom-forms.scss +0 -522
  236. package/src/assets/bootstrap_scss/_dropdown.scss +0 -201
  237. package/src/assets/bootstrap_scss/_forms.scss +0 -352
  238. package/src/assets/bootstrap_scss/_functions.scss +0 -134
  239. package/src/assets/bootstrap_scss/_grid.scss +0 -69
  240. package/src/assets/bootstrap_scss/_images.scss +0 -42
  241. package/src/assets/bootstrap_scss/_input-group.scss +0 -191
  242. package/src/assets/bootstrap_scss/_jumbotron.scss +0 -17
  243. package/src/assets/bootstrap_scss/_list-group.scss +0 -158
  244. package/src/assets/bootstrap_scss/_media.scss +0 -8
  245. package/src/assets/bootstrap_scss/_mixins.scss +0 -47
  246. package/src/assets/bootstrap_scss/_modal.scss +0 -243
  247. package/src/assets/bootstrap_scss/_nav.scss +0 -120
  248. package/src/assets/bootstrap_scss/_navbar.scss +0 -324
  249. package/src/assets/bootstrap_scss/_pagination.scss +0 -74
  250. package/src/assets/bootstrap_scss/_popover.scss +0 -170
  251. package/src/assets/bootstrap_scss/_print.scss +0 -141
  252. package/src/assets/bootstrap_scss/_progress.scss +0 -46
  253. package/src/assets/bootstrap_scss/_reboot.scss +0 -482
  254. package/src/assets/bootstrap_scss/_root.scss +0 -20
  255. package/src/assets/bootstrap_scss/_spinners.scss +0 -55
  256. package/src/assets/bootstrap_scss/_tables.scss +0 -185
  257. package/src/assets/bootstrap_scss/_toasts.scss +0 -44
  258. package/src/assets/bootstrap_scss/_tooltip.scss +0 -115
  259. package/src/assets/bootstrap_scss/_transitions.scss +0 -20
  260. package/src/assets/bootstrap_scss/_type.scss +0 -125
  261. package/src/assets/bootstrap_scss/_utilities.scss +0 -17
  262. package/src/assets/bootstrap_scss/_variables.scss +0 -1145
  263. package/src/assets/bootstrap_scss/bootstrap-grid.scss +0 -29
  264. package/src/assets/bootstrap_scss/bootstrap-reboot.scss +0 -12
  265. package/src/assets/bootstrap_scss/bootstrap.scss +0 -44
  266. package/src/assets/bootstrap_scss/mixins/_alert.scss +0 -13
  267. package/src/assets/bootstrap_scss/mixins/_background-variant.scss +0 -22
  268. package/src/assets/bootstrap_scss/mixins/_badge.scss +0 -17
  269. package/src/assets/bootstrap_scss/mixins/_border-radius.scss +0 -63
  270. package/src/assets/bootstrap_scss/mixins/_box-shadow.scss +0 -20
  271. package/src/assets/bootstrap_scss/mixins/_breakpoints.scss +0 -123
  272. package/src/assets/bootstrap_scss/mixins/_buttons.scss +0 -110
  273. package/src/assets/bootstrap_scss/mixins/_caret.scss +0 -62
  274. package/src/assets/bootstrap_scss/mixins/_clearfix.scss +0 -7
  275. package/src/assets/bootstrap_scss/mixins/_deprecate.scss +0 -10
  276. package/src/assets/bootstrap_scss/mixins/_float.scss +0 -14
  277. package/src/assets/bootstrap_scss/mixins/_forms.scss +0 -177
  278. package/src/assets/bootstrap_scss/mixins/_gradients.scss +0 -45
  279. package/src/assets/bootstrap_scss/mixins/_grid-framework.scss +0 -71
  280. package/src/assets/bootstrap_scss/mixins/_grid.scss +0 -69
  281. package/src/assets/bootstrap_scss/mixins/_hover.scss +0 -37
  282. package/src/assets/bootstrap_scss/mixins/_image.scss +0 -36
  283. package/src/assets/bootstrap_scss/mixins/_list-group.scss +0 -21
  284. package/src/assets/bootstrap_scss/mixins/_lists.scss +0 -7
  285. package/src/assets/bootstrap_scss/mixins/_nav-divider.scss +0 -11
  286. package/src/assets/bootstrap_scss/mixins/_pagination.scss +0 -22
  287. package/src/assets/bootstrap_scss/mixins/_reset-text.scss +0 -17
  288. package/src/assets/bootstrap_scss/mixins/_resize.scss +0 -6
  289. package/src/assets/bootstrap_scss/mixins/_screen-reader.scss +0 -34
  290. package/src/assets/bootstrap_scss/mixins/_size.scss +0 -7
  291. package/src/assets/bootstrap_scss/mixins/_table-row.scss +0 -39
  292. package/src/assets/bootstrap_scss/mixins/_text-emphasis.scss +0 -17
  293. package/src/assets/bootstrap_scss/mixins/_text-hide.scss +0 -11
  294. package/src/assets/bootstrap_scss/mixins/_text-truncate.scss +0 -8
  295. package/src/assets/bootstrap_scss/mixins/_transition.scss +0 -16
  296. package/src/assets/bootstrap_scss/mixins/_visibility.scss +0 -8
  297. package/src/assets/bootstrap_scss/utilities/_align.scss +0 -8
  298. package/src/assets/bootstrap_scss/utilities/_background.scss +0 -19
  299. package/src/assets/bootstrap_scss/utilities/_borders.scss +0 -75
  300. package/src/assets/bootstrap_scss/utilities/_clearfix.scss +0 -3
  301. package/src/assets/bootstrap_scss/utilities/_display.scss +0 -26
  302. package/src/assets/bootstrap_scss/utilities/_embed.scss +0 -39
  303. package/src/assets/bootstrap_scss/utilities/_flex.scss +0 -51
  304. package/src/assets/bootstrap_scss/utilities/_float.scss +0 -11
  305. package/src/assets/bootstrap_scss/utilities/_overflow.scss +0 -5
  306. package/src/assets/bootstrap_scss/utilities/_position.scss +0 -32
  307. package/src/assets/bootstrap_scss/utilities/_screenreaders.scss +0 -11
  308. package/src/assets/bootstrap_scss/utilities/_shadows.scss +0 -6
  309. package/src/assets/bootstrap_scss/utilities/_sizing.scss +0 -20
  310. package/src/assets/bootstrap_scss/utilities/_spacing.scss +0 -73
  311. package/src/assets/bootstrap_scss/utilities/_stretched-link.scss +0 -19
  312. package/src/assets/bootstrap_scss/utilities/_text.scss +0 -72
  313. package/src/assets/bootstrap_scss/utilities/_visibility.scss +0 -13
  314. package/src/assets/bootstrap_scss/vendor/_rfs.scss +0 -204
  315. package/src/components/misc/Player.vue +0 -792
  316. package/src/shims-vuex.d.ts +0 -7
  317. package/src/views/Home.vue +0 -18
@@ -1,14 +1,22 @@
1
1
  <template>
2
- <div class="w-100" :style="{ width: width }">
3
- <label :for="id" class="d-inline" aria-label="select category"></label>
4
- <Multiselect
5
- v-model="category"
6
- :disabled="isDisabled"
2
+ <div
3
+ class="default-multiselect-width"
4
+ :style="{ width: width }"
5
+ >
6
+ <label
7
+ :for="id"
8
+ class="d-inline"
9
+ title="select category"
10
+ />
11
+ <VueMultiselect
7
12
  :id="id"
13
+ ref="multiselectRef"
14
+ v-model="model"
15
+ :disabled="isDisabled"
8
16
  label="name"
9
17
  track-by="id"
18
+ :aria-expanded="false"
10
19
  :placeholder="$t('Type string to filter by categories')"
11
- ref="multiselectRef"
12
20
  :options="categories"
13
21
  :multiple="multiple"
14
22
  :searchable="true"
@@ -21,114 +29,151 @@
21
29
  :show-no-results="true"
22
30
  :hide-selected="true"
23
31
  :show-labels="false"
24
- @open="clearAll"
32
+ @open="onOpen"
25
33
  @search-change="onSearchCategory"
26
- @close="onClose"
27
- @select="onEmissionSelected"
34
+ @select="onCategorySelected"
28
35
  >
29
- <template v-slot:singleLabel="props" >
36
+ <template #singleLabel="{ option }">
30
37
  <div class="multiselect-octopus-proposition">
31
38
  <span class="option__title">
32
- {{ props.option.name }}
39
+ {{ option.name }}
33
40
  </span>
34
41
  </div>
35
42
  </template>
36
- <template v-slot:option="props" >
43
+ <template #option="{ option }">
37
44
  <div class="multiselect-octopus-proposition">
38
- <span class="option__title">{{ props.option.name }}</span>
45
+ <span class="option__title">{{ option.name }}</span>
39
46
  </div>
40
47
  </template>
41
- <template v-slot:noOptions>{{ $t('List is empty') }}</template>
42
- <template v-slot:noResult>
43
- <span>
44
- {{ $t('No elements found. Consider changing the search query.') }}
45
- </span>
48
+ <template #noOptions="">
49
+ {{ $t('List is empty') }}
46
50
  </template>
47
- <template v-slot:caret>
48
- <div class="position-relative">
49
- <span
50
- class="saooti-arrow_down octopus-arrow-down-2 octopus-arrow-down-top"
51
- ></span>
52
- </div>
51
+ <template #noResult="">
52
+ <span>
53
+ {{ $t('No elements found. Consider changing the search query.') }}
54
+ </span>
53
55
  </template>
54
- </Multiselect>
56
+ <template #caret="">
57
+ <div class="position-relative">
58
+ <span
59
+ class="saooti-down octopus-arrow-down"
60
+ />
61
+ </div>
62
+ </template>
63
+ </VueMultiselect>
55
64
  </div>
56
65
  </template>
57
66
 
58
- <style lang="scss"></style>
59
67
  <script lang="ts">
60
- import Multiselect from 'vue-multiselect';
61
- import { state } from '../../../store/paramStore';
68
+ //@ts-ignore
69
+ import VueMultiselect from 'vue-multiselect';
62
70
 
63
- const getDefaultCategory = (defaultName: any) => {
64
- if (undefined !== defaultName) return { name: defaultName, id: 0 };
65
- return '';
71
+ const getDefaultCategory = (defaultName: string) => {
72
+ if ('' === defaultName){
73
+ return undefined;
74
+ }
75
+ return { name: defaultName, id: 0 };
66
76
  };
67
77
 
68
- import { defineComponent, ref } from 'vue'
78
+ import { Category } from '@/store/class/general/category';
79
+ import { defineComponent } from 'vue'
69
80
  export default defineComponent({
70
81
  components: {
71
- Multiselect,
82
+ VueMultiselect
72
83
  },
73
-
74
84
  props: {
75
- width: { default: '100%' },
76
- defaultanswer: { default: undefined as any },
77
- categorySelected: { default: undefined as any },
78
- multiple: { default: false },
79
- categoryArray: { default: undefined as any },
80
- displayAllCategories: { default: false },
81
- isDisabled: { default: false },
85
+ width: { default: '100%', type: String },
86
+ defaultanswer: { default: '', type: String },
87
+ categorySelected: { default: undefined, type: Number },
88
+ multiple: { default: false, type: Boolean },
89
+ categoryArray: { default: undefined, type: Array as ()=>Array<number> },
90
+ displayAllCategories: { default: false, type: Boolean },
91
+ isDisabled: { default: false, type: Boolean },
92
+ initCategories: { default: undefined, type: Array as ()=>Array<Category> },
82
93
  },
83
- emits: ['update:categorySelected', 'selected'],
94
+ emits: ['update:categorySelected','selected'],
95
+ data() {
96
+ return {
97
+ categories: [] as Array<Category>,
98
+ category: getDefaultCategory(this.defaultanswer) as Category|undefined,
99
+ categoryForArray: [getDefaultCategory(this.defaultanswer)] as Array<Category>|undefined,
100
+ isLoading: false as boolean,
101
+ totalCategories: [] as Array<Category>,
102
+ init: true as boolean,
103
+ initArray: false as boolean,
104
+ };
105
+ },
106
+
84
107
 
85
108
  computed: {
86
- allCategories() {
87
- return state.generalParameters.allCategories.sort((a:any, b:any) =>
109
+ categoriesChosen(): Array<Category>{
110
+ if(this.initCategories){
111
+ return this.initCategories;
112
+ }
113
+ return this.$store.state.categories;
114
+ },
115
+ allCategories(): Array<Category> {
116
+ return [...this.categoriesChosen].sort((a: Category, b: Category) =>
88
117
  a.name > b.name ? 1 : -1
89
118
  );
90
119
  },
91
- id():string {
120
+ id(): string {
92
121
  if (this.multiple) return 'categoryChooser' + this.multiple;
93
122
  return 'categoryChooser';
94
123
  },
95
- },
124
+ model: {
125
+ get(): Category| Array<Category>|undefined{
126
+ if(false===this.initArray){
127
+ return this.category;
128
+ }
129
+ return this.categoryForArray;
130
+ },
131
+ set(value: Category| Array<Category>|undefined): void{
132
+ if(false===this.initArray){
133
+ this.category = (value as Category|undefined);
134
+ return
135
+ }
136
+ this.categoryForArray = (value as Array<Category>|undefined);
137
+ }
96
138
 
97
- data() {
98
- return {
99
- categories: [] as any,
100
- category: getDefaultCategory(this.defaultanswer) as any,
101
- isLoading: false,
102
- totalCategories: undefined as any,
103
- init: true,
104
- };
139
+ }
105
140
  },
106
-
107
- setup() {
108
- const multiselect : any = ref(null);
109
- return {
110
- multiselect,
111
- };
141
+ watch: {
142
+ categorySelected(): void {
143
+ if(this.categorySelected){
144
+ this.initCategorySelected(this.categorySelected);
145
+ }
146
+ },
147
+ model: {
148
+ deep: true,
149
+ handler(){
150
+ if(undefined===this.categoryArray ||undefined === this.categoryForArray){
151
+ return;
152
+ }
153
+ const idsArray: Array<number> = [];
154
+ this.categoryForArray.forEach((el: Category) => {
155
+ idsArray.push(el.id);
156
+ });
157
+ this.$emit('selected', idsArray);
158
+ }
159
+ },
112
160
  },
113
-
161
+
114
162
  mounted() {
115
163
  if (undefined !== this.categorySelected) {
116
164
  this.initCategorySelected(this.categorySelected);
117
165
  }
118
166
  if (undefined !== this.categoryArray) {
119
167
  this.initCategoryArray(this.categoryArray);
168
+ this.initArray=true;
120
169
  }
121
170
  },
122
-
123
171
  methods: {
124
- clearAll() {
125
- this.multiselect.$refs.search.setAttribute(
172
+ onOpen(): void {
173
+ (this.$refs.multiselectRef as VueMultiselect).$refs.search.setAttribute(
126
174
  'autocomplete',
127
175
  'off'
128
176
  );
129
- if (undefined === this.categoryArray) {
130
- this.category = '';
131
- }
132
177
  if (
133
178
  undefined !== this.categorySelected ||
134
179
  undefined !== this.categoryArray ||
@@ -136,75 +181,67 @@ export default defineComponent({
136
181
  ) {
137
182
  this.totalCategories = this.allCategories;
138
183
  } else {
139
- this.totalCategories = this.allCategories.filter((c: { podcastCount: any; }) => {
184
+ this.totalCategories = this.allCategories.filter((c: Category) => {
140
185
  return c.podcastCount;
141
186
  });
142
187
  }
143
- if (undefined !== this.defaultanswer) {
144
- this.categories = [getDefaultCategory(this.defaultanswer)].concat(
145
- this.totalCategories
146
- );
188
+ if ('' !== this.defaultanswer) {
189
+ const categoryDefault = getDefaultCategory(this.defaultanswer);
190
+ if(categoryDefault){
191
+ this.categories = [categoryDefault].concat(
192
+ this.totalCategories
193
+ );
194
+ }
147
195
  } else {
148
196
  this.categories = this.totalCategories;
149
197
  }
150
198
  },
151
-
152
- onClose() {
153
- if (!this.category && undefined === this.categoryArray) {
154
- this.category = getDefaultCategory(this.defaultanswer);
155
- this.onEmissionSelected(this.category);
156
- }
157
- },
158
-
159
- onSearchCategory(query: string) {
199
+ onSearchCategory(query: string): void {
160
200
  this.isLoading = true;
161
- let list = [getDefaultCategory(this.defaultanswer)].concat(
162
- this.totalCategories
163
- );
164
- if (undefined === this.defaultanswer) {
165
- list = this.totalCategories;
201
+ const categoryDefault = getDefaultCategory(this.defaultanswer);
202
+ if(categoryDefault){
203
+ let list: Array<Category> = [categoryDefault].concat(
204
+ this.totalCategories
205
+ );
206
+ if ('' === this.defaultanswer) {
207
+ list = this.totalCategories;
208
+ }
209
+ this.categories = list.filter((item: Category) => {
210
+ return item.name.toUpperCase().includes(query.toUpperCase());
211
+ });
166
212
  }
167
- this.categories = list.filter((item:any) => {
168
- return item.name.toUpperCase().includes(query.toUpperCase());
169
- });
170
213
  this.isLoading = false;
171
214
  },
172
-
173
- onEmissionSelected(category: any) {
215
+ onCategorySelected(category: Category): void {
174
216
  if (undefined !== this.categorySelected) {
175
217
  this.$emit('update:categorySelected', category.id);
176
218
  } else if (undefined === this.categoryArray) {
177
219
  this.$emit('selected', category);
178
220
  }
179
221
  },
180
- initCategorySelected(val: any) {
181
- this.category = state.generalParameters.allCategories.find((el: { id: any; }) => {
222
+ initCategorySelected(val: number): void {
223
+ let categorySelected = this.categoriesChosen.find((el: Category) => {
182
224
  return el.id === val;
183
225
  });
226
+ if(!categorySelected){
227
+ categorySelected = getDefaultCategory(this.defaultanswer);
228
+ }
229
+ this.category = categorySelected;
184
230
  },
185
- initCategoryArray(val: any[]) {
186
- this.category.length = 0;
187
- val.forEach((element: any) => {
188
- let item = state.generalParameters.allCategories.find((el: { id: any; }) => {
231
+ initCategoryArray(val: Array<number>): void {
232
+ if(!this.categoryForArray){
233
+ return;
234
+ }
235
+ this.categoryForArray.length = 0;
236
+ val.forEach((element: number) => {
237
+ const item = this.categoriesChosen.find((el: Category) => {
189
238
  return el.id === element;
190
239
  });
191
- this.category.push(item);
192
- });
193
- },
194
- },
195
- watch: {
196
- categorySelected(newVal) {
197
- this.initCategorySelected(newVal);
198
- },
199
- category(newVal) {
200
- if (undefined === this.categoryArray) return;
201
-
202
- let idsArray: any[] = [];
203
- newVal.forEach((el: { id: any; }) => {
204
- idsArray.push(el.id);
240
+ if(this.categoryForArray && item){
241
+ this.categoryForArray.push(item);
242
+ }
205
243
  });
206
- this.$emit('selected', idsArray);
207
244
  },
208
245
  },
209
- });
210
- </script>
246
+ })
247
+ </script>
@@ -0,0 +1,162 @@
1
+ <template>
2
+ <div
3
+ v-show="isDisplay"
4
+ class="mt-3"
5
+ >
6
+ <nav
7
+ v-if="categoryFilter || rubriqueFilter.length"
8
+ title="breadcrumb"
9
+ >
10
+ <ol class="breadcrumb">
11
+ <li class="breadcrumb-item">
12
+ <a
13
+ href="#"
14
+ @click="removeFilter(-1, $event)"
15
+ >{{ $t('All') }}</a>
16
+ </li>
17
+ <li
18
+ v-if="categoryFilter"
19
+ class="breadcrumb-item active"
20
+ >
21
+ {{ categoryFilter.name }}
22
+ </li>
23
+ <li
24
+ v-for="(filter, index) in rubriqueFilter"
25
+ :key="filter.rubriqueId"
26
+ class="breadcrumb-item d-flex align-items-center"
27
+ :class="rubriqueFilter.length-1 === index ? 'active':''"
28
+ >
29
+ <a
30
+ v-if="rubriqueFilter.length - 1 !== index"
31
+ href="#"
32
+ @click="removeFilter(index,$event)"
33
+ >{{ filter.nameRubriquage }}</a>
34
+ <template v-else>
35
+ {{ filter.nameRubriquage }}
36
+ </template>
37
+ <div class="mx-1">
38
+ :
39
+ </div>
40
+ <RubriqueChooser
41
+ v-if="getRubriques(filter.rubriquageId).length"
42
+ class="ms-2 multiselect-transparent"
43
+ :multiple="false"
44
+ :rubriquage-id="filter.rubriquageId"
45
+ :rubrique-selected="filter.rubriqueId"
46
+ :all-rubriques="getRubriques(filter.rubriquageId)"
47
+ :cannot-be-undefined="true"
48
+ width="auto"
49
+ @selected="onRubriqueSelected(index,$event)"
50
+ />
51
+ </li>
52
+ </ol>
53
+ </nav>
54
+ <CategoryList
55
+ v-if="!categoryFilter && !rubriquageFilter.length"
56
+ :is-filter="true"
57
+ :is-display="isDisplay"
58
+ @categoriesLength="checkIfCategories"
59
+ />
60
+ <RubriqueList
61
+ v-else-if="isDisplay && rubriquageFilter.length !== rubriqueFilter.length"
62
+ :rubriquages="rubriquageFilter"
63
+ />
64
+ </div>
65
+ <div
66
+ v-if="!isDisplay"
67
+ class="categary-filter-no-filter"
68
+ />
69
+ </template>
70
+
71
+ <script lang="ts">
72
+ import { Category } from '@/store/class/general/category';
73
+ import { Rubriquage } from '@/store/class/rubrique/rubriquage';
74
+ import { RubriquageFilter } from '@/store/class/rubrique/rubriquageFilter';
75
+ import { Rubrique } from '@/store/class/rubrique/rubrique';
76
+ import { defineComponent, defineAsyncComponent } from 'vue';
77
+ const CategoryList = defineAsyncComponent(() => import('./CategoryList.vue'));
78
+ const RubriqueList = defineAsyncComponent(() => import('./../rubriques/RubriqueList.vue'));
79
+ const RubriqueChooser = defineAsyncComponent(() => import('../rubriques/RubriqueChooser.vue'));
80
+ export default defineComponent({
81
+ name: 'CategoryFilter',
82
+
83
+ components:{
84
+ CategoryList,
85
+ RubriqueList,
86
+ RubriqueChooser
87
+ },
88
+ data() {
89
+ return {
90
+ isCategories: false as boolean,
91
+ };
92
+ },
93
+ computed: {
94
+ categoryFilter(): Category|undefined{
95
+ return this.$store.state.filter.iab;
96
+ },
97
+ rubriqueFilter(): Array<RubriquageFilter>{
98
+ return this.$store.state.filter.rubriqueFilter;
99
+ },
100
+ isDisplay(): boolean {
101
+ return ("homePriv" === this.$route.name ||"home" === this.$route.name ||"podcasts" === this.$route.name||"emissions" === this.$route.name)
102
+ && (this.isCategories || undefined!==this.categoryFilter || 0!==this.rubriqueFilter.length || 0!==this.rubriquageFilter.length);
103
+ },
104
+ rubriquageFilter(): Array<Rubriquage>{
105
+ return this.$store.state.filter.organisationId ? this.$store.state.filter.rubriquageArray : [];
106
+ },
107
+ },
108
+ methods:{
109
+ checkIfCategories(length: number): void{
110
+ this.isCategories = 0!==length;
111
+ },
112
+ onRubriqueSelected(index: number, rubrique: Rubrique): void {
113
+ if(!rubrique ||this.rubriqueFilter[index].rubriqueId === rubrique.rubriqueId){
114
+ return;
115
+ }
116
+ const filter = Array.from(this.rubriqueFilter);
117
+ filter[index].rubriqueId = rubrique.rubriqueId||0;
118
+ this.$store.commit('filterRubrique', filter);
119
+ const queryString = filter.map(value => value.rubriquageId+':'+value.rubriqueId).join();
120
+ this.$router.replace({ query: { ...this.$route.query, ...{ rubriquesId: queryString }} });
121
+ },
122
+ getRubriques(rubriquageId: number): Array<Rubrique>{
123
+ const rubriquage = this.$store.state.filter.rubriquageArray.find((x: Rubriquage) => {
124
+ return x.rubriquageId === rubriquageId;
125
+ });
126
+ return rubriquage ? rubriquage.rubriques : [];
127
+ },
128
+ removeFilter(index: number, event?: { preventDefault: () => void }): void{
129
+ if(this.categoryFilter){
130
+ if (this.$route.query.iabId) {
131
+ this.$router.replace({ query: {...this.$route.query, ...{iabId: undefined} } });
132
+ }
133
+ this.$store.commit('filterIab', undefined);
134
+ }else{
135
+ const newFilter: Array<RubriquageFilter> = Array.from(this.$store.state.filter.rubriqueFilter);
136
+ newFilter.splice(index + 1);
137
+ if (this.$route.query.rubriquesId) {
138
+ const queryString = newFilter.map(value => value.rubriquageId+':'+value.rubriqueId).join();
139
+ this.$router.replace({ query: { ...this.$route.query, ...{ rubriquesId:"" !== queryString? queryString : undefined}} });
140
+ }
141
+ this.$store.commit('filterRubrique', newFilter);
142
+ }
143
+ if(event){
144
+ event.preventDefault();
145
+ }
146
+ }
147
+ }
148
+ })
149
+ </script>
150
+ <style lang="scss">
151
+ .octopus-app{
152
+ .categary-filter-no-filter{
153
+ position: absolute;
154
+ top: 0;
155
+ bottom: 0;
156
+ right: 0;
157
+ left: 0;
158
+ background: white;
159
+ z-index: -1;
160
+ }
161
+ }
162
+ </style>