@saooti/octopus-sdk 36.0.5 → 36.0.7

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 (45) hide show
  1. package/index.ts +1 -2
  2. package/package.json +3 -2
  3. package/src/assets/bootstrap.scss +11 -1
  4. package/src/assets/octopus-library.scss +0 -1
  5. package/src/assets/share.scss +0 -6
  6. package/src/components/display/categories/CategoryChooser.vue +81 -171
  7. package/src/components/display/categories/CategoryFilter.vue +9 -4
  8. package/src/components/display/emission/EmissionPlayerItem.vue +4 -1
  9. package/src/components/display/filter/CategorySearchFilter.vue +1 -1
  10. package/src/components/display/filter/MonetizableFilter.vue +16 -13
  11. package/src/components/display/filter/ProductorSearch.vue +6 -16
  12. package/src/components/display/filter/RubriqueChoice.vue +12 -16
  13. package/src/components/display/filter/RubriqueFilter.vue +2 -1
  14. package/src/components/display/list/Paginate.vue +4 -1
  15. package/src/components/display/organisation/OrganisationChooser.vue +76 -201
  16. package/src/components/display/podcasts/PodcastFilterList.vue +5 -3
  17. package/src/components/display/podcasts/PodcastImage.vue +3 -1
  18. package/src/components/display/podcasts/PodcastModuleBox.vue +17 -5
  19. package/src/components/display/podcasts/TagList.vue +2 -2
  20. package/src/components/display/rubriques/RubriqueChooser.vue +87 -181
  21. package/src/components/display/rubriques/RubriqueList.vue +8 -5
  22. package/src/components/display/sharing/PlayerParameters.vue +3 -1
  23. package/src/components/display/sharing/ShareButtons.vue +5 -3
  24. package/src/components/display/sharing/ShareButtonsIntern.vue +24 -8
  25. package/src/components/display/sharing/ShareDistribution.vue +3 -1
  26. package/src/components/display/sharing/SharePlayer.vue +3 -1
  27. package/src/components/display/sharing/SharePlayerColors.vue +6 -2
  28. package/src/components/form/ClassicCheckbox.vue +1 -1
  29. package/src/components/form/ClassicMultiselect.vue +192 -0
  30. package/src/components/misc/TopBar.vue +8 -4
  31. package/src/components/misc/modal/NewsletterModal.vue +1 -1
  32. package/src/components/pages/Emission.vue +5 -2
  33. package/src/components/pages/Home.vue +3 -3
  34. package/src/components/pages/Playlist.vue +4 -1
  35. package/src/components/pages/Podcast.vue +4 -1
  36. package/src/locale/de.ts +1 -0
  37. package/src/locale/en.ts +1 -0
  38. package/src/locale/es.ts +1 -0
  39. package/src/locale/fr.ts +1 -0
  40. package/src/locale/it.ts +1 -0
  41. package/src/locale/sl.ts +1 -0
  42. package/src/stores/ParamSdkStore.ts +13 -13
  43. package/src/stores/class/general/organisation.ts +8 -0
  44. package/src/assets/multiselect.scss +0 -518
  45. package/src/components/display/emission/EmissionChooser.vue +0 -187
@@ -0,0 +1,192 @@
1
+ <template>
2
+ <div
3
+ :class="{'multiselect-in-modal' : inModal,
4
+ 'multiselect-no-deselect': noDeselect}"
5
+ :style="{ width: width }"
6
+ >
7
+ <label
8
+ :class="displayLabel? '':'d-none'"
9
+ :for="id"
10
+ class="form-label"
11
+ >{{ label }}</label>
12
+ <vSelect
13
+ :id="id"
14
+ v-model="optionSelected"
15
+ :label="optionLabel"
16
+ :append-to-body="inModal"
17
+ :multiple="multiple"
18
+ :options="options"
19
+ :disabled="isDisabled"
20
+ :loading="isLoading"
21
+ :placeholder="placeholder"
22
+ :selectable="()=>!maxOptionsSelected"
23
+ @open="onSearch"
24
+ @search="onSearch"
25
+ @option:selected="onOptionSelected"
26
+ @option:deselected="onOptionDeselect"
27
+ >
28
+ <template
29
+ v-if="optionCustomTemplating.length"
30
+ #option="option"
31
+ >
32
+ <slot
33
+ :name="optionCustomTemplating"
34
+ :option="option"
35
+ />
36
+ </template>
37
+ <template
38
+ v-if="optionSelectedCustomTemplating.length"
39
+ #selected-option="option"
40
+ >
41
+ <slot
42
+ :name="optionSelectedCustomTemplating"
43
+ :option="option"
44
+ />
45
+ </template>
46
+ <template #no-options="{ searching }">
47
+ <span v-if="searching">{{ $t('No elements found. Consider changing the search query.') }}</span>
48
+ <span v-else>{{ $t('List is empty') }}</span>
49
+ </template>
50
+ <template #list-footer>
51
+ <li
52
+ v-if="remainingElements"
53
+ class="vs__dropdown-option"
54
+ >
55
+ {{
56
+ $t('Count more elements matched your query, please make a more specific search.',{ count: remainingElements })
57
+ }}
58
+ </li>
59
+ </template>
60
+ <template #list-header>
61
+ <li
62
+ v-if="maxOptionsSelected"
63
+ class="vs__dropdown-option"
64
+ >
65
+ {{
66
+ $t('Multiselect max options', {max:maxOptions})
67
+ }}
68
+ </li>
69
+ </template>
70
+ </vSelect>
71
+ </div>
72
+ </template>
73
+
74
+ <script lang="ts">
75
+ import vSelect from "vue-select";
76
+ export default {
77
+ components: {
78
+ vSelect,
79
+ },
80
+ props: {
81
+ id:{default: '', type: String},
82
+ label:{default: '', type: String},
83
+ placeholder:{default: '', type: String},
84
+ optionLabel:{default: '', type: String},
85
+ inModal:{default: false, type: Boolean},
86
+ multiple:{default: false, type: Boolean},
87
+ isDisabled:{default: false, type: Boolean},
88
+ width: { default: '100%', type: String },
89
+ maxElement: { default: 50, type: Number },
90
+ minSearchLength: { default: 3, type: Number },
91
+ optionChosen: { default: undefined, type: Object as ()=>unknown},
92
+ noDeselect:{default: true, type: Boolean},
93
+ optionCustomTemplating:{default: "", type: String},
94
+ optionSelectedCustomTemplating:{default: "", type: String},
95
+ displayLabel:{default: false, type: Boolean},
96
+ maxOptions: { default: null, type: Number },
97
+ allowEmpty: { default: true, type: Boolean },
98
+ },
99
+
100
+ emits: ['onSearch','selected'],
101
+
102
+ data() {
103
+ return {
104
+ optionSelected: undefined as unknown|undefined,
105
+ options: [] as Array<unknown>,
106
+ remainingElements: 0 as number,
107
+ isLoading: false as boolean,
108
+ nbOptionsSelected: 0 as number,
109
+ };
110
+ },
111
+ computed:{
112
+ maxOptionsSelected(): boolean{
113
+ if(this.maxOptions !== null && this.multiple){
114
+ return (this.optionSelected as Array<unknown>).length >= this.maxOptions;
115
+ }
116
+ return false;
117
+ }
118
+ },
119
+
120
+ watch: {
121
+ optionChosen: {
122
+ deep: true,
123
+ immediate:true,
124
+ handler(){
125
+ this.optionSelected = this.optionChosen;
126
+ }
127
+ },
128
+ optionSelected: {
129
+ deep: true,
130
+ handler(){
131
+ if(this.noDeselect || null!==this.optionSelected){ return; }
132
+ this.$emit('selected', undefined);
133
+ }
134
+ }
135
+ },
136
+
137
+ methods:{
138
+ onSearch(search: string): void{
139
+ if(search && search.length < this.minSearchLength){return;}
140
+ this.isLoading = true;
141
+ this.$emit('onSearch', search);
142
+ },
143
+ afterSearch(optionsFetched: Array<unknown>, count: number):void{
144
+ this.options = optionsFetched;
145
+ this.remainingElements = Math.max(0, count - this.maxElement);
146
+ this.isLoading = false;
147
+ },
148
+ onOptionSelected(optionSelected: unknown):void{
149
+ this.$emit('selected', optionSelected);
150
+ },
151
+ onOptionDeselect(event: unknown):void{
152
+ if(!this.multiple){ return; }
153
+ if(!this.allowEmpty && 1>=(this.optionSelected as Array<unknown>).length){
154
+ (this.optionSelected as Array<unknown>).push(event);
155
+ return;
156
+ }
157
+ this.$emit('selected', this.optionSelected);
158
+ }
159
+ }
160
+ }
161
+ </script>
162
+ <style lang="scss">
163
+ @import "vue-select/dist/vue-select.css";
164
+ :root{
165
+ --vs-dropdown-z-index:1060;
166
+ }
167
+ .octopus-app{
168
+ --vs-border-radius: 0.2rem;
169
+ --vs-dropdown-option--active-bg: #ddd;
170
+ --vs-dropdown-option--active-color: black;
171
+ --vs-font-size:0.8rem;
172
+ .vs__dropdown-option{
173
+ white-space: initial;
174
+ }
175
+ .vs__search:focus{
176
+ min-width: 150px;
177
+ }
178
+ .multiselect-no-deselect .vs__clear{
179
+ display: none;
180
+ }
181
+ .multiselect-transparent{
182
+ --vs-border-color: transparent;
183
+ }
184
+ .multiselect-white{
185
+ --vs-selected-color: white;
186
+ --vs-dropdown-bg: black;
187
+ .vs__actions path{
188
+ fill: white;
189
+ }
190
+ }
191
+ }
192
+ </style>
@@ -45,9 +45,14 @@
45
45
  {{ link.title }}
46
46
  </router-link>
47
47
  </template>
48
- <button id="more-dropdown" class="d-flex align-items-center hide-phone btn-transparent p-3">
49
- <div class="link-hover">{{$t('More')}}</div>
50
- <div class="ms-1 saooti-down"></div>
48
+ <button
49
+ id="more-dropdown"
50
+ class="d-flex align-items-center hide-phone btn-transparent p-3"
51
+ >
52
+ <div class="link-hover">
53
+ {{ $t('More') }}
54
+ </div>
55
+ <div class="ms-1 saooti-down" />
51
56
  </button>
52
57
  <Popover
53
58
  target="more-dropdown"
@@ -80,7 +85,6 @@
80
85
  @click="onDisplayMenu(false)"
81
86
  />
82
87
  <div class="d-flex flex-column">
83
-
84
88
  <div class="d-flex justify-content-end flex-nowrap">
85
89
  <HomeDropdown :is-education="isEducation" />
86
90
  <router-link
@@ -8,7 +8,7 @@
8
8
  <template #body>
9
9
  <div class="d-flex justify-content-between">
10
10
  <!-- eslint-disable vue/no-v-html -->
11
- <div v-html="newsletterHtml"/>
11
+ <div v-html="newsletterHtml" />
12
12
  <!-- eslint-enable -->
13
13
  <div class="d-flex flex-column flex-grow-1 ms-4">
14
14
  <h4 class="mb-3">
@@ -1,11 +1,14 @@
1
1
  <template>
2
2
  <div class="page-box">
3
- <template v-if="loaded && !error" >
3
+ <template v-if="loaded && !error">
4
4
  <div class="page-element-title-container">
5
5
  <div class="page-element-title">
6
6
  <h1>{{ $t('Emission') }}</h1>
7
7
  </div>
8
- <div class="page-element-bg" :style="backgroundDisplay"></div>
8
+ <div
9
+ class="page-element-bg"
10
+ :style="backgroundDisplay"
11
+ />
9
12
  </div>
10
13
  <div class="d-flex flex-column page-element">
11
14
  <div class="module-box">
@@ -30,9 +30,9 @@
30
30
  :to="{
31
31
  name: 'podcasts',
32
32
  query: { productor: filterOrgaId,
33
- iabId: filterIab?.id,
34
- rubriquesId: this.rubriqueQueryParam },
35
- }"
33
+ iabId: filterIab?.id,
34
+ rubriquesId: rubriqueQueryParam },
35
+ }"
36
36
  class="btn btn-primary align-self-center width-fit-content mt-5 m-auto"
37
37
  >
38
38
  {{
@@ -7,7 +7,10 @@
7
7
  <div class="page-element-title">
8
8
  <h1>{{ $t('Playlist') }}</h1>
9
9
  </div>
10
- <div class="page-element-bg" :style="backgroundDisplay"></div>
10
+ <div
11
+ class="page-element-bg"
12
+ :style="backgroundDisplay"
13
+ />
11
14
  </div>
12
15
  <div class="d-flex flex-column page-element">
13
16
  <div class="module-box">
@@ -9,7 +9,10 @@
9
9
  :time-remaining="timeRemaining"
10
10
  />
11
11
  </div>
12
- <div class="page-element-bg" :style="backgroundDisplay"></div>
12
+ <div
13
+ class="page-element-bg"
14
+ :style="backgroundDisplay"
15
+ />
13
16
  </div>
14
17
  <div class="d-flex flex-column page-element">
15
18
  <PodcastModuleBox
package/src/locale/de.ts CHANGED
@@ -316,4 +316,5 @@ export default{
316
316
  "Newsletter":"Newsletter",
317
317
  "QR Code":"QR-Code",
318
318
  "Rss feed": "RSS-Feed",
319
+ "Multiselect max options":"Maximal {max} gleichzeitige Optionen. Bitte entfernen Sie zuerst eine Option, um eine neue auswählen zu können",
319
320
  }
package/src/locale/en.ts CHANGED
@@ -323,4 +323,5 @@ export default{
323
323
  "Newsletter":"Newsletter",
324
324
  "QR Code":"QR Code",
325
325
  "Rss feed": "Rss feed",
326
+ "Multiselect max options":"Maximum of {max} concurrent options. Please first remove an option to be able to select a new one",
326
327
  };
package/src/locale/es.ts CHANGED
@@ -316,4 +316,5 @@ export default{
316
316
  "Newsletter":"Newsletter",
317
317
  "QR Code":"Código QR",
318
318
  "Rss feed": "RSS Feed",
319
+ "Multiselect max options":"Máximo de {max} opciones simultáneas. Primero elimine una opción para poder seleccionar una nueva",
319
320
  }
package/src/locale/fr.ts CHANGED
@@ -323,4 +323,5 @@ export default{
323
323
  "Newsletter":"Newsletter",
324
324
  "QR Code":"QR Code",
325
325
  "Rss feed": "Flux RSS",
326
+ "Multiselect max options":"Maximum de {max} options simultanées. Veuillez dans un premier temps retirer une option pour pouvoir en sélectionner une nouvelle",
326
327
  };
package/src/locale/it.ts CHANGED
@@ -313,4 +313,5 @@ export default{
313
313
  "Newsletter":"Newsletter",
314
314
  "QR Code":"QR Code",
315
315
  "Rss feed": "RSS Feed",
316
+ "Multiselect max options":"Massimo di {max} opzioni simultanee. Per prima cosa rimuovi un'opzione per poterne selezionare una nuova",
316
317
  };
package/src/locale/sl.ts CHANGED
@@ -316,4 +316,5 @@ export default{
316
316
  "Newsletter":"Newsletter",
317
317
  "QR Code":"koda QR",
318
318
  "Rss feed": "Rss vir",
319
+ "Multiselect max options":"Največ {max} sočasnih možnosti. Najprej odstranite možnost, da boste lahko izbrali novo",
319
320
  }
@@ -5,14 +5,14 @@ const state:ParamStore = {
5
5
  generalParameters: {
6
6
  organisationId:'ecbd98d9-79bd-4312-ad5e-fc7c1c4a191c',
7
7
  authenticated: true,
8
- isAdmin: false,
8
+ isAdmin: true,
9
9
  isRoleLive: false,
10
10
  isCommments: false,
11
11
  isOrganisation: false,
12
12
  isPlaylist: false,
13
13
  isProduction: false,
14
14
  isContribution: true,
15
- ApiUri: 'https://api.dev2.saooti.org/',
15
+ ApiUri: 'https://api.staging.saooti.org/',
16
16
  podcastmaker: false,
17
17
  buttonPlus: true,
18
18
  allCategories: [],
@@ -26,8 +26,8 @@ const state:ParamStore = {
26
26
  SharePlayer: true,
27
27
  ShareButtons: true,
28
28
  ShareDistribution: true,
29
- MiniplayerUri: 'https://playerbeta.dev2.saooti.org/',
30
- hlsUri: 'https://hls.dev2.saooti.org/',
29
+ MiniplayerUri: 'https://playerbeta.staging.saooti.org/',
30
+ hlsUri: 'https://hls.staging.saooti.org/',
31
31
  mainRubrique: 0,
32
32
  resourceUrl: undefined,
33
33
  podcastItemShowEmission: false,
@@ -79,13 +79,13 @@ const state:ParamStore = {
79
79
  userName: '',
80
80
  },
81
81
  octopusApi: {
82
- url: 'https://api.dev2.saooti.org/',
83
- commentsUrl: 'https://comments.dev2.saooti.org/',
84
- imageUrl:'https://imageproxy.dev2.saooti.org/',
85
- studioUrl: 'https://studio.dev2.saooti.org/',
86
- playerUrl: 'https://playerbeta.dev2.saooti.org/',
87
- speechToTextUrl:'https://speech2text.dev2.saooti.org/',
88
- recoUrl: 'https://reco.dev2.saooti.org/',
82
+ url: 'https://api.staging.saooti.org/',
83
+ commentsUrl: 'https://comments.staging.saooti.org/',
84
+ imageUrl:'https://imageproxy.staging.saooti.org/',
85
+ studioUrl: 'https://studio.staging.saooti.org/',
86
+ playerUrl: 'https://playerbeta.staging.saooti.org/',
87
+ speechToTextUrl:'https://speech2text.staging.saooti.org/',
88
+ recoUrl: 'https://reco.staging.saooti.org/',
89
89
  organisationId: undefined,
90
90
  rubriqueIdFilter: undefined,
91
91
  },
@@ -164,8 +164,8 @@ export interface Footer{
164
164
  }
165
165
  export interface Organisation{
166
166
  imageUrl?: string,
167
- name?: string,
168
- userName?: string,
167
+ name?: string,
168
+ userName?: string,
169
169
  }
170
170
  export interface OctopusApi{
171
171
  url?: string,
@@ -17,4 +17,12 @@ export interface Organisation{
17
17
  score?: number;
18
18
  soundcastId?: string;
19
19
  privacy?:string;
20
+ }
21
+
22
+ export function emptyOrgaData(defaultName: string): Organisation{
23
+ return {
24
+ imageUrl: "/img/emptypodcast.webp",
25
+ id: "",
26
+ name: defaultName
27
+ }
20
28
  }