@saooti/octopus-sdk 1.0.0 → 29.0.2

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 (230) hide show
  1. package/README.md +73 -0
  2. package/index.d.ts +4 -0
  3. package/index.ts +12 -0
  4. package/package.json +61 -39
  5. package/public/css/fonts/saooti-ui.eot +0 -0
  6. package/public/css/fonts/saooti-ui.svg +30 -19
  7. package/public/css/fonts/saooti-ui.ttf +0 -0
  8. package/public/css/fonts/saooti-ui.woff +0 -0
  9. package/public/css/fonts/style.css +48 -5
  10. package/public/img/ACPM.png +0 -0
  11. package/public/img/article.png +0 -0
  12. package/src/App.vue +97 -31
  13. package/src/api/comments.ts +3 -1
  14. package/src/api/emissions.ts +5 -2
  15. package/src/api/initialize.ts +3 -2
  16. package/src/api/podcasts.ts +5 -2
  17. package/src/api/profile.ts +4 -2
  18. package/src/api/studio.ts +12 -1
  19. package/src/assets/bootstrap-diff.scss +265 -0
  20. package/src/assets/form.scss +23 -0
  21. package/src/assets/general.scss +47 -20
  22. package/src/assets/modal.scss +9 -10
  23. package/src/assets/multiselect.scss +19 -2
  24. package/src/assets/octopus-library.scss +16 -4
  25. package/src/assets/share.scss +343 -0
  26. package/src/components/display/aggregator/RssSection.vue +4 -4
  27. package/src/components/display/categories/CategoryChooser.vue +152 -105
  28. package/src/components/display/categories/CategoryFilter.vue +108 -0
  29. package/src/components/display/categories/CategoryList.vue +138 -109
  30. package/src/components/display/comments/AddCommentModal.vue +104 -87
  31. package/src/components/display/comments/CommentInput.vue +137 -118
  32. package/src/components/display/comments/CommentItem.vue +155 -137
  33. package/src/components/display/comments/CommentList.vue +142 -120
  34. package/src/components/display/comments/CommentParentInfo.vue +39 -35
  35. package/src/components/display/comments/CommentPlayer.vue +54 -48
  36. package/src/components/display/comments/CommentSection.vue +57 -58
  37. package/src/components/display/edit/EditBox.vue +4 -4
  38. package/src/components/display/edit/EditCommentBox.vue +25 -31
  39. package/src/components/display/emission/EmissionChooser.vue +82 -80
  40. package/src/components/display/emission/EmissionInlineList.vue +118 -105
  41. package/src/components/display/emission/EmissionItem.vue +66 -167
  42. package/src/components/display/emission/EmissionList.vue +96 -122
  43. package/src/components/display/emission/EmissionPlayerItem.vue +131 -126
  44. package/src/components/display/filter/AdvancedSearch.vue +306 -372
  45. package/src/components/display/filter/CategoryFilter.vue +117 -0
  46. package/src/components/display/filter/MonetizableFilter.vue +24 -10
  47. package/src/components/display/filter/ProductorSearch.vue +131 -135
  48. package/src/components/display/filter/RubriqueChoice.vue +104 -0
  49. package/src/components/display/filter/RubriqueFilter.vue +235 -0
  50. package/src/components/display/live/CountDown.vue +30 -29
  51. package/src/components/display/live/LiveHorizontalList.vue +40 -34
  52. package/src/components/display/live/LiveItem.vue +146 -158
  53. package/src/components/display/live/LiveList.vue +167 -154
  54. package/src/components/display/organisation/OrganisationChooser.vue +125 -124
  55. package/src/components/display/organisation/OrganisationChooserLight.vue +40 -47
  56. package/src/components/display/participant/ParticipantItem.vue +92 -108
  57. package/src/components/display/participant/ParticipantList.vue +76 -69
  58. package/src/components/display/playlist/PlaylistItem.vue +45 -56
  59. package/src/components/display/playlist/PlaylistList.vue +57 -48
  60. package/src/components/display/playlist/PodcastList.vue +94 -70
  61. package/src/components/display/podcasts/AnimatorsItem.vue +26 -23
  62. package/src/components/display/podcasts/ParticipantDescription.vue +115 -0
  63. package/src/components/display/podcasts/PodcastFilterList.vue +84 -85
  64. package/src/components/display/podcasts/PodcastImage.vue +244 -208
  65. package/src/components/display/podcasts/PodcastInlineList.vue +145 -207
  66. package/src/components/display/podcasts/PodcastItem.vue +150 -132
  67. package/src/components/display/podcasts/PodcastList.vue +89 -110
  68. package/src/components/display/podcasts/TagList.vue +23 -16
  69. package/src/components/display/rubriques/RubriqueChooser.vue +137 -123
  70. package/src/components/display/rubriques/RubriqueList.vue +227 -0
  71. package/src/components/display/sharing/PlayerParameters.vue +154 -106
  72. package/src/components/display/sharing/QrCode.vue +58 -0
  73. package/src/components/display/sharing/ShareButtons.vue +214 -92
  74. package/src/components/display/sharing/ShareDistribution.vue +110 -121
  75. package/src/components/display/sharing/SharePlayer.vue +245 -190
  76. package/src/components/display/sharing/SubscribeButtons.vue +130 -66
  77. package/src/components/display/studio/RecordingItemButton.vue +4 -4
  78. package/src/components/misc/ErrorMessage.vue +21 -16
  79. package/src/components/misc/Footer.vue +131 -66
  80. package/src/components/misc/HomeDropdown.vue +166 -123
  81. package/src/components/misc/LeftMenu.vue +151 -134
  82. package/src/components/misc/Player.vue +332 -328
  83. package/src/components/misc/Snackbar.vue +27 -29
  84. package/src/components/misc/TopBar.vue +204 -174
  85. package/src/components/misc/modal/ClipboardModal.vue +46 -26
  86. package/src/components/misc/modal/MessageModal.vue +67 -51
  87. package/src/components/misc/modal/NewsletterModal.vue +179 -136
  88. package/src/components/misc/modal/QrCodeModal.vue +83 -0
  89. package/src/components/misc/modal/ShareModalPlayer.vue +133 -74
  90. package/src/components/mixins/functions.ts +21 -18
  91. package/src/components/mixins/init.ts +24 -0
  92. package/src/components/mixins/organisationFilter.ts +24 -0
  93. package/src/components/pages/Category.vue +26 -26
  94. package/src/components/pages/Emission.vue +120 -92
  95. package/src/components/pages/Emissions.vue +109 -86
  96. package/src/components/pages/Home.vue +70 -16
  97. package/src/components/pages/Lives.vue +57 -47
  98. package/src/components/pages/Participant.vue +93 -77
  99. package/src/components/pages/Participants.vue +44 -31
  100. package/src/components/pages/Playlist.vue +63 -52
  101. package/src/components/pages/Playlists.vue +41 -39
  102. package/src/components/pages/Podcast.vue +265 -251
  103. package/src/components/pages/Podcasts.vue +135 -104
  104. package/src/components/pages/Rubrique.vue +25 -19
  105. package/src/components/pages/Search.vue +71 -67
  106. package/src/helper/dom.ts +2 -2
  107. package/src/helper/duration.ts +18 -8
  108. package/src/locale/educationen.ts +14 -0
  109. package/src/locale/en.ts +299 -1
  110. package/src/locale/fr.ts +25 -10
  111. package/src/locale/messages.ts +3 -2
  112. package/src/main.ts +54 -32
  113. package/src/router/router.ts +184 -159
  114. package/src/shims-tsx.d.ts +13 -0
  115. package/src/shims-vue-recaptcha-v3.d.ts +9 -0
  116. package/src/shims-vue.d.ts +5 -6
  117. package/src/store/AppStore.ts +36 -171
  118. package/src/store/class/category.ts +8 -0
  119. package/src/store/class/comment.ts +17 -0
  120. package/src/store/class/conference.ts +27 -0
  121. package/src/store/class/customPlayer.ts +8 -0
  122. package/src/store/class/emission.ts +20 -0
  123. package/src/store/class/fetchParam.ts +16 -0
  124. package/src/store/class/media.ts +13 -0
  125. package/src/store/class/organisation.ts +19 -0
  126. package/src/store/class/participant.ts +12 -0
  127. package/src/store/class/person.ts +13 -0
  128. package/src/store/class/player.ts +12 -0
  129. package/src/store/class/playlist.ts +15 -0
  130. package/src/store/class/podcast.ts +37 -0
  131. package/src/store/class/rubriquage.ts +9 -0
  132. package/src/store/class/rubriquageFilter.ts +5 -0
  133. package/src/store/class/rubrique.ts +8 -0
  134. package/src/store/paramStore.ts +70 -29
  135. package/src/store/typeAppStore.ts +171 -237
  136. package/src/vuex-shim.d.ts +8 -0
  137. package/tsconfig.json +4 -0
  138. package/vue.config.js +14 -0
  139. package/public/img/ACPM.PNG +0 -0
  140. package/src/assets/bootstrap_scss/_alert.scss +0 -51
  141. package/src/assets/bootstrap_scss/_badge.scss +0 -54
  142. package/src/assets/bootstrap_scss/_breadcrumb.scss +0 -42
  143. package/src/assets/bootstrap_scss/_button-group.scss +0 -164
  144. package/src/assets/bootstrap_scss/_buttons.scss +0 -291
  145. package/src/assets/bootstrap_scss/_card.scss +0 -278
  146. package/src/assets/bootstrap_scss/_carousel.scss +0 -197
  147. package/src/assets/bootstrap_scss/_close.scss +0 -41
  148. package/src/assets/bootstrap_scss/_code.scss +0 -48
  149. package/src/assets/bootstrap_scss/_custom-forms.scss +0 -522
  150. package/src/assets/bootstrap_scss/_dropdown.scss +0 -201
  151. package/src/assets/bootstrap_scss/_forms.scss +0 -352
  152. package/src/assets/bootstrap_scss/_functions.scss +0 -134
  153. package/src/assets/bootstrap_scss/_grid.scss +0 -69
  154. package/src/assets/bootstrap_scss/_images.scss +0 -42
  155. package/src/assets/bootstrap_scss/_input-group.scss +0 -191
  156. package/src/assets/bootstrap_scss/_jumbotron.scss +0 -17
  157. package/src/assets/bootstrap_scss/_list-group.scss +0 -158
  158. package/src/assets/bootstrap_scss/_media.scss +0 -8
  159. package/src/assets/bootstrap_scss/_mixins.scss +0 -47
  160. package/src/assets/bootstrap_scss/_modal.scss +0 -243
  161. package/src/assets/bootstrap_scss/_nav.scss +0 -120
  162. package/src/assets/bootstrap_scss/_navbar.scss +0 -324
  163. package/src/assets/bootstrap_scss/_pagination.scss +0 -74
  164. package/src/assets/bootstrap_scss/_popover.scss +0 -170
  165. package/src/assets/bootstrap_scss/_print.scss +0 -141
  166. package/src/assets/bootstrap_scss/_progress.scss +0 -46
  167. package/src/assets/bootstrap_scss/_reboot.scss +0 -482
  168. package/src/assets/bootstrap_scss/_root.scss +0 -20
  169. package/src/assets/bootstrap_scss/_spinners.scss +0 -55
  170. package/src/assets/bootstrap_scss/_tables.scss +0 -185
  171. package/src/assets/bootstrap_scss/_toasts.scss +0 -44
  172. package/src/assets/bootstrap_scss/_tooltip.scss +0 -115
  173. package/src/assets/bootstrap_scss/_transitions.scss +0 -20
  174. package/src/assets/bootstrap_scss/_type.scss +0 -125
  175. package/src/assets/bootstrap_scss/_utilities.scss +0 -17
  176. package/src/assets/bootstrap_scss/_variables.scss +0 -1145
  177. package/src/assets/bootstrap_scss/bootstrap-grid.scss +0 -29
  178. package/src/assets/bootstrap_scss/bootstrap-reboot.scss +0 -12
  179. package/src/assets/bootstrap_scss/bootstrap.scss +0 -44
  180. package/src/assets/bootstrap_scss/mixins/_alert.scss +0 -13
  181. package/src/assets/bootstrap_scss/mixins/_background-variant.scss +0 -22
  182. package/src/assets/bootstrap_scss/mixins/_badge.scss +0 -17
  183. package/src/assets/bootstrap_scss/mixins/_border-radius.scss +0 -63
  184. package/src/assets/bootstrap_scss/mixins/_box-shadow.scss +0 -20
  185. package/src/assets/bootstrap_scss/mixins/_breakpoints.scss +0 -123
  186. package/src/assets/bootstrap_scss/mixins/_buttons.scss +0 -110
  187. package/src/assets/bootstrap_scss/mixins/_caret.scss +0 -62
  188. package/src/assets/bootstrap_scss/mixins/_clearfix.scss +0 -7
  189. package/src/assets/bootstrap_scss/mixins/_deprecate.scss +0 -10
  190. package/src/assets/bootstrap_scss/mixins/_float.scss +0 -14
  191. package/src/assets/bootstrap_scss/mixins/_forms.scss +0 -177
  192. package/src/assets/bootstrap_scss/mixins/_gradients.scss +0 -45
  193. package/src/assets/bootstrap_scss/mixins/_grid-framework.scss +0 -71
  194. package/src/assets/bootstrap_scss/mixins/_grid.scss +0 -69
  195. package/src/assets/bootstrap_scss/mixins/_hover.scss +0 -37
  196. package/src/assets/bootstrap_scss/mixins/_image.scss +0 -36
  197. package/src/assets/bootstrap_scss/mixins/_list-group.scss +0 -21
  198. package/src/assets/bootstrap_scss/mixins/_lists.scss +0 -7
  199. package/src/assets/bootstrap_scss/mixins/_nav-divider.scss +0 -11
  200. package/src/assets/bootstrap_scss/mixins/_pagination.scss +0 -22
  201. package/src/assets/bootstrap_scss/mixins/_reset-text.scss +0 -17
  202. package/src/assets/bootstrap_scss/mixins/_resize.scss +0 -6
  203. package/src/assets/bootstrap_scss/mixins/_screen-reader.scss +0 -34
  204. package/src/assets/bootstrap_scss/mixins/_size.scss +0 -7
  205. package/src/assets/bootstrap_scss/mixins/_table-row.scss +0 -39
  206. package/src/assets/bootstrap_scss/mixins/_text-emphasis.scss +0 -17
  207. package/src/assets/bootstrap_scss/mixins/_text-hide.scss +0 -11
  208. package/src/assets/bootstrap_scss/mixins/_text-truncate.scss +0 -8
  209. package/src/assets/bootstrap_scss/mixins/_transition.scss +0 -16
  210. package/src/assets/bootstrap_scss/mixins/_visibility.scss +0 -8
  211. package/src/assets/bootstrap_scss/utilities/_align.scss +0 -8
  212. package/src/assets/bootstrap_scss/utilities/_background.scss +0 -19
  213. package/src/assets/bootstrap_scss/utilities/_borders.scss +0 -75
  214. package/src/assets/bootstrap_scss/utilities/_clearfix.scss +0 -3
  215. package/src/assets/bootstrap_scss/utilities/_display.scss +0 -26
  216. package/src/assets/bootstrap_scss/utilities/_embed.scss +0 -39
  217. package/src/assets/bootstrap_scss/utilities/_flex.scss +0 -51
  218. package/src/assets/bootstrap_scss/utilities/_float.scss +0 -11
  219. package/src/assets/bootstrap_scss/utilities/_overflow.scss +0 -5
  220. package/src/assets/bootstrap_scss/utilities/_position.scss +0 -32
  221. package/src/assets/bootstrap_scss/utilities/_screenreaders.scss +0 -11
  222. package/src/assets/bootstrap_scss/utilities/_shadows.scss +0 -6
  223. package/src/assets/bootstrap_scss/utilities/_sizing.scss +0 -20
  224. package/src/assets/bootstrap_scss/utilities/_spacing.scss +0 -73
  225. package/src/assets/bootstrap_scss/utilities/_stretched-link.scss +0 -19
  226. package/src/assets/bootstrap_scss/utilities/_text.scss +0 -72
  227. package/src/assets/bootstrap_scss/utilities/_visibility.scss +0 -13
  228. package/src/assets/bootstrap_scss/vendor/_rfs.scss +0 -204
  229. package/src/shims-vuex.d.ts +0 -7
  230. package/src/views/Home.vue +0 -18
@@ -1,15 +1,22 @@
1
1
  <template>
2
- <div class="default-multiselect-width" :style="{ width: width }">
3
- <label :for="id" class="d-inline" aria-label="select rubrique"></label>
4
- <Multiselect
5
- v-model="rubrique"
2
+ <div
3
+ class="default-multiselect-width"
4
+ :style="{ width: width }"
5
+ >
6
+ <label
7
+ :for="id"
8
+ class="d-inline"
9
+ aria-label="select rubrique"
10
+ />
11
+ <VueMultiselect
6
12
  :id="id"
13
+ ref="multiselectRef"
14
+ v-model="model"
7
15
  :disabled="isDisabled"
8
16
  class="rubriqueChooser"
9
17
  label="name"
10
18
  track-by="rubriqueId"
11
19
  :placeholder="$t('Type string to filter by rubrics')"
12
- ref="multiselectRef"
13
20
  :options="rubriques"
14
21
  :multiple="multiple"
15
22
  :searchable="true"
@@ -27,82 +34,124 @@
27
34
  @close="onClose"
28
35
  @select="onRubriqueSelected"
29
36
  >
30
- <template v-slot:singleLabel="props" >
37
+ <template #singleLabel="{ option }">
31
38
  <div class="multiselect-octopus-proposition">
32
39
  <span class="option__title">
33
- {{ props.option.name }}
40
+ {{ option.name }}
34
41
  </span>
35
42
  </div>
36
43
  </template>
37
- <template v-slot:option="props" >
44
+ <template
45
+ v-if="undefined!==option"
46
+ #option="{ option }"
47
+ >
38
48
  <div
39
49
  class="multiselect-octopus-proposition"
40
- :class="props.option.rubriqueId <= 0 ? 'primary-dark' : ''"
41
- :data-selenium="'rubric-chooser-' + seleniumFormat(props.option.name)"
50
+ :class="option.rubriqueId <= 0 ? 'primary-dark' : ''"
51
+ :data-selenium="'rubric-chooser-' + seleniumFormat(option.name)"
42
52
  >
43
- <span class="option__title">{{ props.option.name }}</span>
53
+ <span class="option__title">{{ option.name }}</span>
44
54
  </div>
45
55
  </template>
46
- <template v-slot:noOptions>{{ $t('List is empty') }}</template>
47
- <template v-slot:noResult>
48
- <span>
56
+ <template #noOptions>
57
+ {{ $t('List is empty') }}
58
+ </template>
59
+ <template #noResult>
49
60
  {{ $t('No elements found. Consider changing the search query.') }}
50
- </span></template>
51
- <template v-slot:caret>
52
- <span
53
- class="saooti-arrow_down octopus-arrow-down octopus-arrow-down-top"
54
- ></span></template>
55
- </Multiselect>
61
+ </template>
62
+ <template #caret>
63
+ <span class="saooti-arrow_down octopus-arrow-down octopus-arrow-down-top" />
64
+ </template>
65
+ </VueMultiselect>
56
66
  </div>
57
67
  </template>
58
68
 
59
- <style lang="scss"></style>
60
69
  <script lang="ts">
61
70
  import { selenium } from '../../mixins/functions';
62
- import Multiselect from 'vue-multiselect';
63
-
64
- const getDefaultRubrique = (defaultName: any) => {
65
- if (undefined !== defaultName) return { name: defaultName, rubriqueId: 0 };
66
- return '';
71
+ //@ts-ignore
72
+ import VueMultiselect from 'vue-multiselect';
73
+ import { Rubrique } from '@/store/class/rubrique';
74
+ const getDefaultRubrique = (defaultName: string) => {
75
+ if ('' === defaultName){
76
+ return undefined;
77
+ }
78
+ return { name: defaultName, rubriqueId: 0 };
67
79
  };
68
80
 
69
- import { defineComponent, ref } from 'vue'
81
+ import { defineComponent } from 'vue'
70
82
  export default defineComponent({
71
83
  components: {
72
- Multiselect,
84
+ VueMultiselect,
73
85
  },
74
-
86
+ mixins:[selenium],
75
87
  props: {
76
- width: { default: '100%' },
77
- defaultanswer: { default: undefined as any },
78
- rubriqueSelected: { default: undefined as any },
79
- multiple: { default: false },
80
- rubriqueArray: { default: undefined as any },
81
- rubriquageId: { default: undefined as any },
82
- allRubriques: { default: [] },
83
- reset: { default: false },
84
- withoutRubrique: { default: false },
85
- isDisabled: { default: false },
88
+ width: { default: '100%', type: String },
89
+ defaultanswer: { default: '', type: String },
90
+ rubriqueSelected: { default: undefined, type: Number },
91
+ multiple: { default: false, type: Boolean },
92
+ rubriqueArray: { default: undefined, type: Object as ()=>Array<number> },
93
+ rubriquageId: { default: undefined, type: Number },
94
+ allRubriques: { default: () => [], type: Array as ()=> Array<Rubrique> },
95
+ reset: { default: false, type: Boolean },
96
+ withoutRubrique: { default: false, type: Boolean },
97
+ isDisabled: { default: false, type: Boolean },
86
98
  },
87
- emits: ['update:rubrique', 'selected'],
88
- mixins: [selenium],
99
+ emits: ['update:rubriqueSelected', 'selected'],
89
100
 
90
101
  data() {
91
102
  return {
92
- rubriques: [] as any,
93
- rubrique: getDefaultRubrique(this.defaultanswer) as any,
94
- isLoading: false,
95
- withoutItem: { name: this.$t('Without rubric'), rubriqueId: -1 },
103
+ rubriques: [] as Array<Rubrique>,
104
+ rubrique: getDefaultRubrique(this.defaultanswer) as Rubrique|undefined,
105
+ rubriqueForArray: [] as Array<Rubrique>,
106
+ isLoading: false as boolean,
107
+ withoutItem: { name: this.$t('Without rubric'), rubriqueId: -1 } as any,
96
108
  };
97
109
  },
110
+ computed: {
111
+ id(): string {
112
+ if (this.rubriquageId) return 'rubriqueChooser' + this.rubriquageId;
113
+ return 'rubriqueChooser';
114
+ },
115
+ model: {
116
+ get(): Rubrique| Array<Rubrique>|undefined{
117
+ if(false===this.multiple){
118
+ return this.rubrique;
119
+ }
120
+ return this.rubriqueForArray;
121
+ },
122
+ set(value: any): void{
123
+ if(false===this.multiple){
124
+ this.rubrique = value;
125
+ return
126
+ }
127
+ this.rubriqueForArray = value;
128
+ }
98
129
 
99
- setup() {
100
- const multiselect : any = ref(null);
101
- return {
102
- multiselect,
103
- };
130
+ }
131
+ },
132
+ watch: {
133
+ model(): void {
134
+ if(false===this.multiple){
135
+ return;
136
+ }
137
+ const selected: Array<Rubrique> = JSON.parse(JSON.stringify(this.model));
138
+ const idsArray: Array<number> = [];
139
+ selected.forEach((el: Rubrique) => {
140
+ if(el.rubriqueId){
141
+ idsArray.push(el.rubriqueId);
142
+ }
143
+ });
144
+ this.$emit('selected', idsArray);
145
+ },
146
+ rubriqueSelected(): void {
147
+ if (undefined !== this.rubriqueSelected) {
148
+ this.initRubriqueSelected(this.rubriqueSelected);
149
+ }
150
+ },
151
+ reset(): void {
152
+ this.rubrique = getDefaultRubrique(this.defaultanswer);
153
+ }
104
154
  },
105
-
106
155
  mounted() {
107
156
  if (undefined !== this.rubriqueSelected) {
108
157
  this.initRubriqueSelected(this.rubriqueSelected);
@@ -111,109 +160,74 @@ export default defineComponent({
111
160
  this.initRubriqueArray(this.rubriqueArray);
112
161
  }
113
162
  },
114
- computed: {
115
- id():string {
116
- if (this.rubriquageId) return 'rubriqueChooser' + this.rubriquageId;
117
- return 'rubriqueChooser';
118
- },
119
- },
120
-
121
163
  methods: {
122
- clearAll() {
123
- this.multiselect.$refs.search.setAttribute(
124
- 'autocomplete',
125
- 'off'
126
- );
127
- if (undefined === this.rubriqueArray) {
128
- this.rubrique = '';
129
- }
130
- if (undefined === this.defaultanswer) {
131
- this.rubriques = this.allRubriques;
132
- return;
164
+ initRubriquesArray(): Array<Rubrique>{
165
+ if ('' === this.defaultanswer) {
166
+ return this.allRubriques;
133
167
  }
134
168
  if (this.withoutRubrique) {
135
- this.rubriques = [
169
+ return [
136
170
  getDefaultRubrique(this.defaultanswer),
137
171
  this.withoutItem,
138
172
  ].concat(this.allRubriques);
139
173
  } else {
140
- this.rubriques = [getDefaultRubrique(this.defaultanswer)].concat(
174
+ return [(getDefaultRubrique(this.defaultanswer) as Rubrique)].concat(
141
175
  this.allRubriques
142
176
  );
143
177
  }
144
178
  },
145
-
146
- onClose() {
179
+ clearAll(): void {
180
+ (this.$refs.multiselectRef as any).$refs.search.setAttribute(
181
+ 'autocomplete',
182
+ 'off'
183
+ );
184
+ if (undefined === this.rubriqueArray) {
185
+ this.rubrique = undefined;
186
+ }
187
+ this.rubriques = this.initRubriquesArray();
188
+ },
189
+ onClose(): void {
147
190
  if (this.rubrique || undefined !== this.rubriqueArray) return;
148
- if (undefined !== this.defaultanswer) {
191
+ if ('' !== this.defaultanswer) {
149
192
  this.rubrique = getDefaultRubrique(this.defaultanswer);
150
193
  } else {
151
- this.rubrique = '';
194
+ this.rubrique = undefined;
152
195
  }
153
196
  this.onRubriqueSelected(this.rubrique);
154
197
  },
155
-
156
- onSearchRubrique(query: string) {
198
+ onSearchRubrique(query: string): void {
157
199
  this.isLoading = true;
158
- let list;
159
- if (undefined !== this.defaultanswer) {
160
- if (this.withoutRubrique) {
161
- list = [
162
- getDefaultRubrique(this.defaultanswer),
163
- this.withoutItem,
164
- ].concat(this.allRubriques);
165
- } else {
166
- list = [getDefaultRubrique(this.defaultanswer)].concat(
167
- this.allRubriques
168
- );
169
- }
170
- } else {
171
- list = this.allRubriques;
172
- }
173
- this.rubriques = list.filter((item:any) => {
200
+ this.rubriques = this.initRubriquesArray().filter((item: Rubrique) => {
174
201
  return item.name.toUpperCase().includes(query.toUpperCase());
175
202
  });
176
203
  this.isLoading = false;
177
204
  },
178
-
179
- onRubriqueSelected(rubrique:any) {
180
- if (undefined !== this.rubriqueSelected) {
181
- this.$emit('update:rubrique', rubrique.rubriqueId);
182
- } else if (undefined === this.rubriqueArray) {
205
+ onRubriqueSelected(rubrique: Rubrique|undefined): void {
206
+ if (undefined !== this.rubriqueSelected && rubrique) {
207
+ this.$emit('update:rubriqueSelected', rubrique.rubriqueId);
208
+ }
209
+ if (false === this.multiple) {
183
210
  this.$emit('selected', rubrique);
184
211
  }
185
212
  },
186
- initRubriqueSelected(val: any) {
187
- this.rubrique = this.allRubriques.find((el:any) => {
213
+ initRubriqueSelected(val: number): void {
214
+ this.rubrique = this.initRubriquesArray().find((el: Rubrique) => {
188
215
  return el.rubriqueId === val;
189
216
  });
190
217
  },
191
- initRubriqueArray(val: any[]) {
192
- this.rubrique.length = 0;
193
- val.forEach((element: any) => {
194
- let item = this.allRubriques.find((el:any) => {
218
+ initRubriqueArray(val: number[]): void {
219
+ this.rubriqueForArray = [];
220
+ val.forEach((element: number) => {
221
+ const item = this.initRubriquesArray().find((el: Rubrique) => {
195
222
  return el.rubriqueId === element;
196
223
  });
197
- this.rubrique.push(item);
198
- });
199
- },
200
- },
201
- watch: {
202
- rubriqueSelected(newVal) {
203
- this.initRubriqueSelected(newVal);
204
- },
205
- rubrique(newVal) {
206
- if (undefined === this.rubriqueArray) return;
207
-
208
- let idsArray: any[] = [];
209
- newVal.forEach((el: { rubriqueId: any; }) => {
210
- idsArray.push(el.rubriqueId);
224
+ if(undefined!==item){
225
+ this.rubriqueForArray.push(item);
226
+ }
211
227
  });
212
- this.$emit('selected', idsArray);
213
- },
214
- reset() {
215
- this.rubrique = getDefaultRubrique(this.defaultanswer);
216
228
  },
217
229
  },
218
- });
230
+ })
219
231
  </script>
232
+
233
+ <style lang="scss"></style>
@@ -0,0 +1,227 @@
1
+ <template>
2
+ <div class="d-inline-flex w-100 mb-3 ps-3 pe-3 hide-phone rubrique-list">
3
+ <div
4
+ id="rubrique-list-container"
5
+ class="rubrique-list-container"
6
+ >
7
+ <select
8
+ v-model="rubriquage"
9
+ class="basic-select border c-hand"
10
+ @change="onRubriquageSelected"
11
+ >
12
+ <option
13
+ v-for="myRubriquage in rubriquageDisplay"
14
+ :key="myRubriquage.rubriquageId"
15
+ :value="myRubriquage"
16
+ >
17
+ {{ myRubriquage.title }}
18
+ </option>
19
+ </select>
20
+ <button
21
+ v-for="rubrique in rubriqueDisplay"
22
+ :id="'rubrique' + rubrique.rubriqueId"
23
+ :key="rubrique.rubriqueId"
24
+ class="rubrique-item"
25
+ @click="addFilter(rubrique)"
26
+ >
27
+ {{ rubrique.name }}
28
+ </button>
29
+ </div>
30
+ <div
31
+ v-show="hidenRubriques.length"
32
+ class="dropdown btn-group"
33
+ >
34
+ <button
35
+ class="btn dropdown-toggle btn-secondary text-decoration-none text-dark category-item category-item-plus dropdown-toggle-no-caret"
36
+ data-bs-toggle="dropdown"
37
+ aria-expanded="false"
38
+ :aria-label="$t('See more')"
39
+ >
40
+ <i class="saooti-plus" />
41
+ </button>
42
+ <ul class="dropdown-menu dropdown-menu-right px-4">
43
+ <div
44
+ v-for="rubrique in hidenRubriques"
45
+ :key="rubrique.rubriqueId"
46
+ class="me-3 dropdown-item"
47
+ @click="addFilter(rubrique)"
48
+ >
49
+ {{ rubrique.name }}
50
+ </div>
51
+ </ul>
52
+ </div>
53
+ </div>
54
+ </template>
55
+
56
+ <script lang="ts">
57
+ import { Rubrique } from '@/store/class/rubrique';
58
+ import { Rubriquage } from '@/store/class/rubriquage';
59
+ import { RubriquageFilter } from '@/store/class/rubriquageFilter';
60
+ import { defineComponent } from 'vue'
61
+ export default defineComponent({
62
+ name: 'RubriqueList',
63
+
64
+ props: {
65
+ rubriquages: { default: () => [], type: Array as ()=>Array<Rubriquage>},
66
+ },
67
+
68
+ data() {
69
+ return {
70
+ hidenRubriques: [] as Array<Rubrique>,
71
+ rubriques: [] as Array<Rubrique>,
72
+ rubriquage: undefined as Rubriquage|undefined,
73
+ };
74
+ },
75
+
76
+ computed: {
77
+ filterOrga(): string {
78
+ return this.$store.state.filter.organisationId;
79
+ },
80
+ rubriqueFilter(): Array<RubriquageFilter>{
81
+ return this.$store.state.filter.rubriqueFilter;
82
+ },
83
+ rubriqueDisplay(): Array<Rubrique>{
84
+ return this.$store.state.filter.rubriqueDisplay;
85
+ },
86
+ rubriquageDisplay(): Array<Rubriquage>{
87
+ const elementToNotShow = Array.from(this.rubriqueFilter);
88
+ if(elementToNotShow.length){
89
+ const rubriquageIdToNotShow = elementToNotShow.map(a => a.rubriquageId);
90
+ return this.rubriquages.filter((element)=>{
91
+ if(!element.rubriquageId){return;}
92
+ return !rubriquageIdToNotShow.includes(element.rubriquageId);
93
+ });
94
+ }
95
+ return this.rubriquages;
96
+ },
97
+ },
98
+ watch:{
99
+ rubriqueFilter(): void{
100
+ this.selectNewRubriquage();
101
+ }
102
+ },
103
+
104
+ mounted() {
105
+ this.selectNewRubriquage();
106
+ },
107
+ beforeUnmount(): void {
108
+ window.removeEventListener('resize', this.resizeWindow);
109
+ },
110
+ methods: {
111
+
112
+ initRubriques(): void{
113
+ if(!this.rubriquage){ return ;}
114
+ this.$store.commit('filterRubriqueDisplay', this.rubriquage.rubriques);
115
+ window.addEventListener('resize', this.resizeWindow);
116
+ this.resizeWindow();
117
+ },
118
+ addFilter(rubrique: Rubrique): void{
119
+ if(!this.rubriquage){ return ;}
120
+ const filterToAdd = {
121
+ rubriquageId: this.rubriquage.rubriquageId?this.rubriquage.rubriquageId: 0,
122
+ rubriqueId: rubrique.rubriqueId? rubrique.rubriqueId:0,
123
+ name: this.rubriquage.title +": "+rubrique.name
124
+ };
125
+ const newFilter: Array<RubriquageFilter> = Array.from(this.$store.state.filter.rubriqueFilter);
126
+ newFilter.push(filterToAdd);
127
+ this.$store.commit('filterRubrique', newFilter);
128
+ const queries = this.$route.query;
129
+ const queryString = newFilter.map(value => value.rubriquageId+':'+value.rubriqueId).join();
130
+ this.$router.push({ query: { ...queries, ...{ rubriquesId: queryString }} });
131
+ this.selectNewRubriquage();
132
+ },
133
+ selectNewRubriquage(){
134
+ const rubriquageLength = this.rubriquages.length;
135
+ if(rubriquageLength === this.rubriqueFilter.length){
136
+ return;
137
+ }
138
+ let index = 0;
139
+ const rubriquageAlreadyFilter = this.rubriqueFilter.map(a => a.rubriquageId);
140
+ for (index; index < rubriquageLength; index++) {
141
+ const rubriquageIdIndex = this.rubriquages[index].rubriquageId;
142
+ if(rubriquageIdIndex && !rubriquageAlreadyFilter.includes(rubriquageIdIndex)){
143
+ break;
144
+ }
145
+ }
146
+ this.rubriquage = this.rubriquages[index];
147
+ this.initRubriques();
148
+ },
149
+ resizeWindow(): void {
150
+ const rubriqueList = document.getElementById('rubrique-list-container');
151
+ if(null === rubriqueList){return}
152
+ rubriqueList.style.justifyContent = 'flex-start';
153
+ this.hidenRubriques.length = 0;
154
+ this.rubriqueDisplay.forEach((element: Rubrique) => {
155
+ const el = document.getElementById('rubrique' + element.rubriqueId);
156
+ if (!el) return;
157
+ const parent = el.parentElement;
158
+ if (null !== parent && el.offsetLeft + el.clientWidth <= parent.clientWidth - 20) {
159
+ el.classList.remove('hid');
160
+ return;
161
+ }
162
+ this.hidenRubriques.push(element);
163
+ if (!el.classList.contains('hid')) {
164
+ el.className += ' hid';
165
+ }
166
+ });
167
+ if (!this.hidenRubriques.length) {
168
+ rubriqueList.style.justifyContent = 'center';
169
+ }
170
+ },
171
+ onRubriquageSelected(){
172
+ this.initRubriques();
173
+ }
174
+ }
175
+ })
176
+ </script>
177
+
178
+ <style lang="scss">
179
+ .rubrique-list-container {
180
+ display: flex;
181
+ justify-content: flex-start;
182
+ align-items: center;
183
+ overflow: hidden;
184
+ flex-grow: 1;
185
+ width: 0;
186
+ padding: 0 4rem;
187
+ select{
188
+ width: auto;
189
+ border-radius: 1.5rem;
190
+ margin: 0.2rem;
191
+ font-size: 0.6rem;
192
+ margin: 0.2rem;
193
+ padding: 0.5rem;
194
+ }
195
+ }
196
+ .rubrique-item {
197
+ font-size: 0.6rem;
198
+ margin: 0.2rem;
199
+ padding: 0.5rem;
200
+ display: block;
201
+ height: 1.5rem;
202
+ border-radius: 1.5rem;
203
+ border: 0;
204
+ display: flex;
205
+ align-items: center;
206
+ justify-content: center;
207
+ white-space: nowrap;
208
+ flex-shrink: 0;
209
+ }
210
+ button.rubrique-item {
211
+ .router-link-active {
212
+ background: #ddd !important;
213
+ }
214
+ &:hover {
215
+ background: #ddd !important;
216
+ }
217
+ }
218
+
219
+ .rubrique-list .rubrique-item-plus {
220
+ display: flex;
221
+ height: 1.5rem;
222
+ width: 1.5rem;
223
+ align-items: center;
224
+ justify-content: center;
225
+ font-size: 0.5rem;
226
+ }
227
+ </style>