@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.
- package/index.ts +1 -2
- package/package.json +3 -2
- package/src/assets/bootstrap.scss +11 -1
- package/src/assets/octopus-library.scss +0 -1
- package/src/assets/share.scss +0 -6
- package/src/components/display/categories/CategoryChooser.vue +81 -171
- package/src/components/display/categories/CategoryFilter.vue +9 -4
- package/src/components/display/emission/EmissionPlayerItem.vue +4 -1
- package/src/components/display/filter/CategorySearchFilter.vue +1 -1
- package/src/components/display/filter/MonetizableFilter.vue +16 -13
- package/src/components/display/filter/ProductorSearch.vue +6 -16
- package/src/components/display/filter/RubriqueChoice.vue +12 -16
- package/src/components/display/filter/RubriqueFilter.vue +2 -1
- package/src/components/display/list/Paginate.vue +4 -1
- package/src/components/display/organisation/OrganisationChooser.vue +76 -201
- package/src/components/display/podcasts/PodcastFilterList.vue +5 -3
- package/src/components/display/podcasts/PodcastImage.vue +3 -1
- package/src/components/display/podcasts/PodcastModuleBox.vue +17 -5
- package/src/components/display/podcasts/TagList.vue +2 -2
- package/src/components/display/rubriques/RubriqueChooser.vue +87 -181
- package/src/components/display/rubriques/RubriqueList.vue +8 -5
- package/src/components/display/sharing/PlayerParameters.vue +3 -1
- package/src/components/display/sharing/ShareButtons.vue +5 -3
- package/src/components/display/sharing/ShareButtonsIntern.vue +24 -8
- package/src/components/display/sharing/ShareDistribution.vue +3 -1
- package/src/components/display/sharing/SharePlayer.vue +3 -1
- package/src/components/display/sharing/SharePlayerColors.vue +6 -2
- package/src/components/form/ClassicCheckbox.vue +1 -1
- package/src/components/form/ClassicMultiselect.vue +192 -0
- package/src/components/misc/TopBar.vue +8 -4
- package/src/components/misc/modal/NewsletterModal.vue +1 -1
- package/src/components/pages/Emission.vue +5 -2
- package/src/components/pages/Home.vue +3 -3
- package/src/components/pages/Playlist.vue +4 -1
- package/src/components/pages/Podcast.vue +4 -1
- package/src/locale/de.ts +1 -0
- package/src/locale/en.ts +1 -0
- package/src/locale/es.ts +1 -0
- package/src/locale/fr.ts +1 -0
- package/src/locale/it.ts +1 -0
- package/src/locale/sl.ts +1 -0
- package/src/stores/ParamSdkStore.ts +13 -13
- package/src/stores/class/general/organisation.ts +8 -0
- package/src/assets/multiselect.scss +0 -518
- 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
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
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
|
-
|
|
34
|
-
|
|
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
|
|
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
|
|
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
package/src/locale/en.ts
CHANGED
package/src/locale/es.ts
CHANGED
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
package/src/locale/sl.ts
CHANGED
|
@@ -5,14 +5,14 @@ const state:ParamStore = {
|
|
|
5
5
|
generalParameters: {
|
|
6
6
|
organisationId:'ecbd98d9-79bd-4312-ad5e-fc7c1c4a191c',
|
|
7
7
|
authenticated: true,
|
|
8
|
-
isAdmin:
|
|
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.
|
|
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.
|
|
30
|
-
hlsUri: 'https://hls.
|
|
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.
|
|
83
|
-
commentsUrl: 'https://comments.
|
|
84
|
-
imageUrl:'https://imageproxy.
|
|
85
|
-
studioUrl: 'https://studio.
|
|
86
|
-
playerUrl: 'https://playerbeta.
|
|
87
|
-
speechToTextUrl:'https://speech2text.
|
|
88
|
-
recoUrl: 'https://reco.
|
|
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
|
-
|
|
168
|
-
|
|
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
|
}
|