@saooti/octopus-sdk 41.0.5-SNAPSHOT → 41.0.5
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 +2 -1
- package/package.json +3 -1
- package/src/App.vue +3 -7
- package/src/api/classicApi.ts +1 -1
- package/src/components/composable/player/usePlayerLive.ts +1 -1
- package/src/components/composable/player/usePlayerVast.ts +7 -7
- package/src/components/composable/route/useAdvancedParamInit.ts +1 -1
- package/src/components/composable/route/useRouteUpdateParams.ts +4 -4
- package/src/components/composable/route/useSimplePageParam.ts +15 -8
- package/src/components/display/categories/CategoryChooser.vue +6 -0
- package/src/components/display/comments/CommentList.vue +1 -1
- package/src/components/display/emission/EmissionList.vue +5 -8
- package/src/components/display/filter/AdvancedSearch.vue +0 -3
- package/src/components/display/list/ListPaginate.vue +4 -12
- package/src/components/display/live/LiveItem.vue +2 -3
- package/src/components/display/participant/ParticipantList.vue +6 -9
- package/src/components/display/playlist/PlaylistList.vue +5 -8
- package/src/components/display/playlist/PodcastList.vue +16 -7
- package/src/components/display/podcasts/PodcastFilterList.vue +19 -8
- package/src/components/display/podcasts/PodcastList.vue +8 -9
- package/src/components/display/podcasts/PodcastModuleBox.vue +0 -1
- package/src/components/display/sharing/SharePlayerTypes.vue +1 -1
- package/src/components/display/sharing/SubscribeButtons.vue +4 -2
- package/src/components/form/ClassicInputText.vue +4 -1
- package/src/components/form/ClassicMultiselect.vue +36 -8
- package/src/components/misc/ClassicAccordion.vue +4 -4
- package/src/components/misc/ClassicPopover.vue +1 -1
- package/src/components/misc/ClassicSpinner.vue +1 -1
- package/src/components/misc/FooterSection.vue +0 -16
- package/src/components/misc/TopBar.vue +4 -11
- package/src/components/misc/player/elements/PlayerImage.vue +0 -1
- package/src/components/pages/EmissionPage.vue +14 -0
- package/src/components/pages/PageLogout.vue +1 -6
- package/src/components/pages/ParticipantPage.vue +14 -0
- package/src/components/pages/PlaylistPage.vue +17 -4
- package/src/components/pages/PodcastPage.vue +2 -1
- package/src/helper/loadScript.ts +4 -4
- package/src/locale/de.ts +2 -2
- package/src/locale/en.ts +2 -2
- package/src/locale/es.ts +2 -2
- package/src/locale/fr.ts +2 -2
- package/src/locale/it.ts +2 -2
- package/src/locale/sl.ts +2 -2
- package/src/router/router.ts +17 -4
- package/src/stores/AuthStore.ts +12 -12
- package/src/stores/FilterStore.ts +1 -1
- package/src/stores/VastStore.ts +2 -2
- package/src/style/_variables.scss +3 -0
- package/src/style/general.scss +5 -0
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"
|
|
20
20
|
:just-size-chosen="justSizeChosen"
|
|
21
21
|
:player-responsive="true"
|
|
22
|
+
:force-update-parameters="forceUpdateParameters"
|
|
22
23
|
>
|
|
23
24
|
<template #list>
|
|
24
25
|
<div class="octopus-element-list">
|
|
@@ -85,6 +86,7 @@ const props = defineProps({
|
|
|
85
86
|
justSizeChosen: { default: false, type: Boolean },
|
|
86
87
|
withVideo: { default: undefined, type: Boolean },
|
|
87
88
|
includeTag:{ default: () => [], type: Array as () => Array<string> },
|
|
89
|
+
forceUpdateParameters: { default: false, type: Boolean },
|
|
88
90
|
})
|
|
89
91
|
|
|
90
92
|
//Emits
|
|
@@ -148,9 +150,9 @@ watch(changePaginate, () => {
|
|
|
148
150
|
dfirst.value = props.first;
|
|
149
151
|
dsize.value = props.size;
|
|
150
152
|
});
|
|
151
|
-
watch(changed, () =>
|
|
152
|
-
watch(()=>props.reload, () =>
|
|
153
|
-
watch(dsize, () =>
|
|
153
|
+
watch(changed, () => fetchContent(true));
|
|
154
|
+
watch(()=>props.reload, () => fetchContent(true));
|
|
155
|
+
watch(dsize, () => fetchContent(true));
|
|
154
156
|
watch(dfirst, () => {
|
|
155
157
|
if (
|
|
156
158
|
!podcasts.value[dfirst.value] ||
|
|
@@ -160,17 +162,13 @@ watch(dfirst, () => {
|
|
|
160
162
|
}
|
|
161
163
|
});
|
|
162
164
|
|
|
163
|
-
onBeforeMount(()=>fetchContent(
|
|
165
|
+
onBeforeMount(()=>fetchContent(false))
|
|
164
166
|
|
|
165
167
|
//Methods
|
|
166
|
-
function reloadList() {
|
|
167
|
-
dfirst.value = 0;
|
|
168
|
-
fetchContent(true);
|
|
169
|
-
}
|
|
170
168
|
async function fetchContent(reset: boolean): Promise<void> {
|
|
171
169
|
loading.value = true;
|
|
172
170
|
const param: FetchParam = {
|
|
173
|
-
first: dfirst.value,
|
|
171
|
+
first: reset ? 0 : dfirst.value,
|
|
174
172
|
size: dsize.value,
|
|
175
173
|
organisationId: organisation.value,
|
|
176
174
|
emissionId: props.emissionId,
|
|
@@ -213,6 +211,7 @@ function afterFetching(
|
|
|
213
211
|
data: { count: number; result: Array<Podcast>; sort: string },
|
|
214
212
|
): void {
|
|
215
213
|
if (reset) {
|
|
214
|
+
dfirst.value = 0;
|
|
216
215
|
podcasts.value.length = 0;
|
|
217
216
|
}
|
|
218
217
|
if (dfirst.value > podcasts.value.length) {
|
|
@@ -137,7 +137,7 @@ onMounted(()=>{
|
|
|
137
137
|
function isNumeric(value: string): boolean {
|
|
138
138
|
return /^-?\d+$/.test(value);
|
|
139
139
|
}
|
|
140
|
-
function selectChange($event:
|
|
140
|
+
function selectChange($event: Event) {
|
|
141
141
|
const val = $event.target.value;
|
|
142
142
|
if (!val) {
|
|
143
143
|
return;
|
|
@@ -78,7 +78,7 @@ import RssIcon from "vue-material-design-icons/Rss.vue";
|
|
|
78
78
|
import { useApiStore } from "../../../stores/ApiStore";
|
|
79
79
|
import ClassicPopover from "../../misc/ClassicPopover.vue";
|
|
80
80
|
import { Emission } from "@/stores/class/general/emission";
|
|
81
|
-
import { computed, Ref, ref, useTemplateRef, watch } from "vue";
|
|
81
|
+
import { computed, onMounted, Ref, ref, useTemplateRef, watch } from "vue";
|
|
82
82
|
import { useI18n } from "vue-i18n";
|
|
83
83
|
type Link = {
|
|
84
84
|
name: string;
|
|
@@ -204,7 +204,9 @@ const rssUrl = computed(() => {
|
|
|
204
204
|
|
|
205
205
|
|
|
206
206
|
//Watch
|
|
207
|
-
watch(()=>props.windowWidth, () =>resizeWindow()
|
|
207
|
+
watch(()=>props.windowWidth, () =>resizeWindow());
|
|
208
|
+
|
|
209
|
+
onMounted(()=>resizeWindow());
|
|
208
210
|
|
|
209
211
|
|
|
210
212
|
//Methods
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
>{{ label }}
|
|
13
13
|
<AsteriskIcon v-if="displayRequired" :size="10" class="ms-1 mb-2" :title="t('Mandatory input')"/>
|
|
14
14
|
</component>
|
|
15
|
+
<slot name="afterTitle"/>
|
|
15
16
|
<template v-if="popover">
|
|
16
17
|
<button
|
|
17
18
|
:id="'popover' + inputId"
|
|
@@ -31,7 +32,9 @@
|
|
|
31
32
|
<!-- eslint-enable -->
|
|
32
33
|
</ClassicPopover>
|
|
33
34
|
</template>
|
|
35
|
+
<slot name="afterHelp"/>
|
|
34
36
|
</div>
|
|
37
|
+
<slot name="betweenTitleInput"/>
|
|
35
38
|
<input
|
|
36
39
|
v-if="!isWysiwyg && !isTextarea"
|
|
37
40
|
v-show="showField"
|
|
@@ -216,7 +219,7 @@ watch(textValue, () => {
|
|
|
216
219
|
});
|
|
217
220
|
watch(()=>props.textInit, () => {
|
|
218
221
|
if (props.textInit !== textValue.value) {
|
|
219
|
-
|
|
222
|
+
textValue.value = props.textInit;
|
|
220
223
|
}
|
|
221
224
|
});
|
|
222
225
|
|
|
@@ -5,13 +5,33 @@
|
|
|
5
5
|
'multiselect-no-deselect': noDeselect,
|
|
6
6
|
'form-margin': displayLabel,
|
|
7
7
|
}"
|
|
8
|
-
:style="{ width: width }"
|
|
8
|
+
:style="{ width: width, height: height }"
|
|
9
9
|
>
|
|
10
|
-
<
|
|
11
|
-
label
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
<div class="d-flex align-items-center">
|
|
11
|
+
<label :class="displayLabel ? '' : 'd-none'" :for="id" class="form-label">{{
|
|
12
|
+
label
|
|
13
|
+
}}
|
|
14
|
+
<AsteriskIcon v-if="displayRequired" :size="10" class="ms-1 mb-2" :title="t('Mandatory input')"/>
|
|
15
|
+
</label>
|
|
16
|
+
<template v-if="popover">
|
|
17
|
+
<button
|
|
18
|
+
:id="'popover' + id"
|
|
19
|
+
:title="t('Help')"
|
|
20
|
+
class="btn-transparent"
|
|
21
|
+
>
|
|
22
|
+
<HelpCircleIcon :size="30" />
|
|
23
|
+
</button>
|
|
24
|
+
<ClassicPopover
|
|
25
|
+
:target="'popover' + id"
|
|
26
|
+
popover-class="popover-z-index"
|
|
27
|
+
:relative-class="popoverRelativeClass"
|
|
28
|
+
>
|
|
29
|
+
<!-- eslint-disable vue/no-v-html -->
|
|
30
|
+
<div v-html="popover" />
|
|
31
|
+
<!-- eslint-enable -->
|
|
32
|
+
</ClassicPopover>
|
|
33
|
+
</template>
|
|
34
|
+
</div>
|
|
15
35
|
<vSelect
|
|
16
36
|
v-model="optionSelected"
|
|
17
37
|
:input-id="id"
|
|
@@ -28,6 +48,7 @@
|
|
|
28
48
|
"
|
|
29
49
|
:filter="fakeSearch"
|
|
30
50
|
:selectable="() => !maxOptionsSelected"
|
|
51
|
+
:style="{height: height }"
|
|
31
52
|
:class="{ 'border border-danger': textDanger?.length }"
|
|
32
53
|
@open="onSearch"
|
|
33
54
|
@search="onSearch"
|
|
@@ -76,12 +97,15 @@
|
|
|
76
97
|
</template>
|
|
77
98
|
|
|
78
99
|
<script setup lang="ts">
|
|
79
|
-
import { computed, ref, Ref, watch } from "vue";
|
|
100
|
+
import { computed, defineAsyncComponent, ref, Ref, watch } from "vue";
|
|
80
101
|
import { useI18n } from "vue-i18n";
|
|
81
102
|
import AsteriskIcon from "vue-material-design-icons/Asterisk.vue";
|
|
82
103
|
import ChevronDownIcon from "vue-material-design-icons/ChevronDown.vue";
|
|
83
104
|
import vSelect from "vue-select";
|
|
84
|
-
|
|
105
|
+
import HelpCircleIcon from "vue-material-design-icons/HelpCircle.vue";
|
|
106
|
+
const ClassicPopover = defineAsyncComponent(
|
|
107
|
+
() => import("../misc/ClassicPopover.vue"),
|
|
108
|
+
);
|
|
85
109
|
|
|
86
110
|
//Props
|
|
87
111
|
const props = defineProps({
|
|
@@ -93,6 +117,7 @@ const props = defineProps({
|
|
|
93
117
|
multiple: { default: false, type: Boolean },
|
|
94
118
|
isDisabled: { default: false, type: Boolean },
|
|
95
119
|
width: { default: "100%", type: String },
|
|
120
|
+
height: { default: undefined, type: String },
|
|
96
121
|
maxElement: { default: 50, type: Number },
|
|
97
122
|
minSearchLength: { default: 3, type: Number },
|
|
98
123
|
optionChosen: { default: undefined, type: Object as () => unknown },
|
|
@@ -104,6 +129,8 @@ const props = defineProps({
|
|
|
104
129
|
allowEmpty: { default: true, type: Boolean },
|
|
105
130
|
textDanger :{ default: undefined, type: String },
|
|
106
131
|
displayRequired: { default: false, type: Boolean },
|
|
132
|
+
popover: { default: undefined, type: String },
|
|
133
|
+
popoverRelativeClass: { default: undefined, type: String },
|
|
107
134
|
})
|
|
108
135
|
|
|
109
136
|
//Emits
|
|
@@ -209,6 +236,7 @@ defineExpose({
|
|
|
209
236
|
|
|
210
237
|
.vs__dropdown-toggle {
|
|
211
238
|
padding: 0;
|
|
239
|
+
height: 100%;
|
|
212
240
|
}
|
|
213
241
|
|
|
214
242
|
.vs__search:focus {
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
class="img-accordion"
|
|
21
21
|
:src="imageUrl"
|
|
22
22
|
aria-hidden="true"
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
alt=""
|
|
25
24
|
/>
|
|
26
|
-
<span
|
|
27
|
-
<
|
|
25
|
+
<span>{{ title }}</span>
|
|
26
|
+
<slot name="afterTitle"/>
|
|
27
|
+
<ChevronDownIcon class="ms-auto" :class="{ 'arrow-transform': isOpen }" />
|
|
28
28
|
</button>
|
|
29
29
|
<div v-show="isOpen" class="body p-2">
|
|
30
30
|
<slot />
|
|
@@ -72,7 +72,7 @@ const router= useRouter();
|
|
|
72
72
|
const popoverId = computed(() => "popover" + props.target);
|
|
73
73
|
const positionInlineStyle = computed(() => `left: ${posX.value}px; top: ${posY.value}px;max-height:${maxHeight.value}`);
|
|
74
74
|
const displayPopover = computed(() => show.value && !props.disable);
|
|
75
|
-
const isTopLayerPopover = computed(() => (props.isTopLayer || "octopus-modal"===props.relativeClass) && HTMLElement.prototype
|
|
75
|
+
const isTopLayerPopover = computed(() => (props.isTopLayer || "octopus-modal"===props.relativeClass) && Object.hasOwn(HTMLElement.prototype, "popover"));
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
//Watch
|
|
@@ -74,7 +74,6 @@
|
|
|
74
74
|
|
|
75
75
|
<script setup lang="ts">
|
|
76
76
|
import cookiesHelper from "../../helper/cookiesHelper";
|
|
77
|
-
import { useRubriquesFilterComputed } from "../composable/route/useRubriquesFilterComputed";
|
|
78
77
|
import ClassicSelect from "../form/ClassicSelect.vue";
|
|
79
78
|
import AcpmImage from "./AcpmImage.vue";
|
|
80
79
|
import { state } from "../../stores/ParamSdkStore";
|
|
@@ -103,7 +102,6 @@ const reset = ref(false);
|
|
|
103
102
|
const organisationId: Ref<string | undefined> = ref(undefined);
|
|
104
103
|
|
|
105
104
|
//Composables
|
|
106
|
-
const { rubriqueQueryParam } = useRubriquesFilterComputed();
|
|
107
105
|
const generalStore = useGeneralStore();
|
|
108
106
|
const filterStore = useFilterStore();
|
|
109
107
|
const authStore = useAuthStore();
|
|
@@ -140,20 +138,6 @@ watch(()=>filterStore.filterOrgaId, () => {
|
|
|
140
138
|
|
|
141
139
|
|
|
142
140
|
//Methods
|
|
143
|
-
function getQueriesRouter(routeName: string) {
|
|
144
|
-
if (
|
|
145
|
-
"podcasts" !== routeName &&
|
|
146
|
-
"emissions" !== routeName &&
|
|
147
|
-
"home" !== routeName
|
|
148
|
-
) {
|
|
149
|
-
return { productor: filterStore.filterOrgaId };
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
productor: filterStore.filterOrgaId,
|
|
153
|
-
iabId: filterStore.filterIab?.id,
|
|
154
|
-
rubriquesId: rubriqueQueryParam.value,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
141
|
function changeLanguage(): void {
|
|
158
142
|
cookiesHelper.setCookie("octopus-language", language.value);
|
|
159
143
|
loadLocaleMessages(
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
role="banner"
|
|
4
4
|
class="header-saooti-play"
|
|
5
5
|
:style="headerBackgroundImage"
|
|
6
|
-
:class="[generalStore.contentToDisplay ? 'header-img-bg':'
|
|
6
|
+
:class="[generalStore.contentToDisplay ? 'header-img-bg':'bg-gradient', scrolled? 'scrolled':'', needToBlur ? 'header-force-blur':'']"
|
|
7
7
|
>
|
|
8
8
|
<TopBarMainContent
|
|
9
9
|
:is-phone="isPhone"
|
|
@@ -93,7 +93,8 @@ watch(()=>generalStore.contentToDisplay, async () => {
|
|
|
93
93
|
needToBlur.value = false;
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
|
-
const
|
|
96
|
+
const widthAsked = window.innerWidth > 960 ? "1600":"1000";
|
|
97
|
+
const proxyUrl = useProxyImageUrl(generalStore.contentToDisplay.imageUrl,widthAsked, undefined, true);
|
|
97
98
|
try {
|
|
98
99
|
const result = await axios.get(proxyUrl);
|
|
99
100
|
headerBackgroundImage.value = `background-image: url('${result.data}');`;
|
|
@@ -159,15 +160,7 @@ function handleScroll(): void {
|
|
|
159
160
|
background-repeat: no-repeat;
|
|
160
161
|
background-size: cover;
|
|
161
162
|
}
|
|
162
|
-
&.
|
|
163
|
-
background: var(--octopus-primary);
|
|
164
|
-
background: linear-gradient(
|
|
165
|
-
90deg,
|
|
166
|
-
var(--octopus-primary) 0%,
|
|
167
|
-
var(--octopus-tertiary) 100%
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
&.header-color-bg, &.scrolled{
|
|
163
|
+
&.bg-gradient, &.scrolled{
|
|
171
164
|
box-shadow: 0 2px 15px 5px var(--octopus-shadow) !important;
|
|
172
165
|
}
|
|
173
166
|
}
|
|
@@ -70,12 +70,17 @@
|
|
|
70
70
|
:emission-id="emissionId"
|
|
71
71
|
/>
|
|
72
72
|
<PodcastFilterList
|
|
73
|
+
v-if="isInit"
|
|
74
|
+
v-model:query="searchPattern"
|
|
73
75
|
class="mx-2"
|
|
76
|
+
:first="paginateFirst"
|
|
77
|
+
:size="ps"
|
|
74
78
|
:show-count="true"
|
|
75
79
|
:emission-id="emissionId"
|
|
76
80
|
:category-filter="false"
|
|
77
81
|
:edit-right="editRight"
|
|
78
82
|
:productor-id="[emission.orga.id]"
|
|
83
|
+
:force-update-parameters="true"
|
|
79
84
|
@fetch="podcastsFetched"
|
|
80
85
|
/>
|
|
81
86
|
</section>
|
|
@@ -110,6 +115,7 @@ import { useFilterStore } from "../../stores/FilterStore";
|
|
|
110
115
|
import { Podcast } from "@/stores/class/general/podcast";
|
|
111
116
|
import { useI18n } from "vue-i18n";
|
|
112
117
|
import { useRoute } from "vue-router";
|
|
118
|
+
import { useSimplePageParam } from "../composable/route/useSimplePageParam";
|
|
113
119
|
const ShareAnonymous = defineAsyncComponent(() => import("../display/sharing/ShareAnonymous.vue"));
|
|
114
120
|
const PodcastFilterList = defineAsyncComponent(
|
|
115
121
|
() => import("../display/podcasts/PodcastFilterList.vue"),
|
|
@@ -143,6 +149,9 @@ const PodcastmakerHeader = defineAsyncComponent(
|
|
|
143
149
|
//Props
|
|
144
150
|
const props = defineProps({
|
|
145
151
|
emissionId: { default: undefined, type: Number },
|
|
152
|
+
pr: { default: 0, type: Number },
|
|
153
|
+
ps: { default: 30, type: Number },
|
|
154
|
+
routeQuery: { default: "", type: String },
|
|
146
155
|
})
|
|
147
156
|
|
|
148
157
|
|
|
@@ -163,6 +172,11 @@ const authStore = useAuthStore();
|
|
|
163
172
|
const filterStore = useFilterStore();
|
|
164
173
|
const generalStore= useGeneralStore();
|
|
165
174
|
const route= useRoute();
|
|
175
|
+
const {
|
|
176
|
+
searchPattern,
|
|
177
|
+
paginateFirst,
|
|
178
|
+
isInit
|
|
179
|
+
} = useSimplePageParam(props, true);
|
|
166
180
|
|
|
167
181
|
|
|
168
182
|
//Computed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<section
|
|
3
|
-
class="page-box page-box-absolute page-logout"
|
|
3
|
+
class="page-box page-box-absolute page-logout bg-gradient"
|
|
4
4
|
>
|
|
5
5
|
<div class="logout-section">
|
|
6
6
|
<h1 class="mb-3">{{ t("Logout") }}</h1>
|
|
@@ -19,11 +19,6 @@ const { t } = useI18n();
|
|
|
19
19
|
</script>
|
|
20
20
|
<style lang="scss">
|
|
21
21
|
.octopus-app .page-logout {
|
|
22
|
-
background: linear-gradient(
|
|
23
|
-
90deg,
|
|
24
|
-
var(--octopus-primary) 0%,
|
|
25
|
-
var(--octopus-tertiary) 100%
|
|
26
|
-
);
|
|
27
22
|
display: flex;
|
|
28
23
|
align-items: center;
|
|
29
24
|
justify-content: center;
|
|
@@ -47,12 +47,17 @@
|
|
|
47
47
|
</section>
|
|
48
48
|
<!-- productorId define to avoid overwrite #12817 -->
|
|
49
49
|
<PodcastFilterList
|
|
50
|
+
v-if="isInit"
|
|
51
|
+
v-model:query="searchPattern"
|
|
52
|
+
:first="paginateFirst"
|
|
53
|
+
:size="ps"
|
|
50
54
|
:participant-id="participantId"
|
|
51
55
|
:name="name"
|
|
52
56
|
:category-filter="true"
|
|
53
57
|
:productor-id="['']"
|
|
54
58
|
:reload="reload"
|
|
55
59
|
:show-count="true"
|
|
60
|
+
:force-update-parameters="true"
|
|
56
61
|
/>
|
|
57
62
|
</template>
|
|
58
63
|
<ClassicLoading
|
|
@@ -77,6 +82,7 @@ import { computed, defineAsyncComponent, ref, Ref, watch } from "vue";
|
|
|
77
82
|
import { AxiosError } from "axios";
|
|
78
83
|
import { useI18n } from "vue-i18n";
|
|
79
84
|
import { useRoute } from "vue-router";
|
|
85
|
+
import { useSimplePageParam } from "../composable/route/useSimplePageParam";
|
|
80
86
|
const ShareSocialsButtons = defineAsyncComponent(
|
|
81
87
|
() => import("../display/sharing/ShareSocialsButtons.vue"),
|
|
82
88
|
);
|
|
@@ -92,6 +98,9 @@ const ShareAnonymous = defineAsyncComponent(() => import("../display/sharing/Sha
|
|
|
92
98
|
//Props
|
|
93
99
|
const props = defineProps({
|
|
94
100
|
participantId: { default: undefined, type: Number },
|
|
101
|
+
pr: { default: 0, type: Number },
|
|
102
|
+
ps: { default: 30, type: Number },
|
|
103
|
+
routeQuery: { default: "", type: String },
|
|
95
104
|
});
|
|
96
105
|
|
|
97
106
|
|
|
@@ -110,6 +119,11 @@ const { isEditRights } = useOrgaComputed();
|
|
|
110
119
|
const { updatePathParams } = useSeoTitleUrl();
|
|
111
120
|
const {handle403} = useErrorHandler();
|
|
112
121
|
const filterStore = useFilterStore();
|
|
122
|
+
const {
|
|
123
|
+
searchPattern,
|
|
124
|
+
paginateFirst,
|
|
125
|
+
isInit
|
|
126
|
+
} = useSimplePageParam(props, true);
|
|
113
127
|
|
|
114
128
|
|
|
115
129
|
//Computed
|
|
@@ -18,8 +18,7 @@
|
|
|
18
18
|
width="250"
|
|
19
19
|
height="250"
|
|
20
20
|
aria-hidden="true"
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
alt=""
|
|
23
22
|
:title="t('Playlist name image', { name: name })"
|
|
24
23
|
class="img-box float-start me-3 mb-3"
|
|
25
24
|
/>
|
|
@@ -42,7 +41,13 @@
|
|
|
42
41
|
:organisation-id="playlist.organisation.id"
|
|
43
42
|
/>
|
|
44
43
|
<section class="module-box">
|
|
45
|
-
<PodcastList
|
|
44
|
+
<PodcastList
|
|
45
|
+
v-if="isInit"
|
|
46
|
+
v-model:query="searchPattern"
|
|
47
|
+
:first="paginateFirst"
|
|
48
|
+
:size="ps"
|
|
49
|
+
:playlist="playlist"
|
|
50
|
+
/>
|
|
46
51
|
</section>
|
|
47
52
|
</div>
|
|
48
53
|
</template>
|
|
@@ -71,6 +76,7 @@ import {defineAsyncComponent, ref, Ref, computed, watch, onBeforeUnmount } from
|
|
|
71
76
|
import { AxiosError } from "axios";
|
|
72
77
|
import { useI18n } from "vue-i18n";
|
|
73
78
|
import { useRoute } from "vue-router";
|
|
79
|
+
import { useSimplePageParam } from "../composable/route/useSimplePageParam";
|
|
74
80
|
const ShareSocialsButtons = defineAsyncComponent(
|
|
75
81
|
() => import("../display/sharing/ShareSocialsButtons.vue"),
|
|
76
82
|
);
|
|
@@ -89,6 +95,9 @@ const ShareAnonymous = defineAsyncComponent(() => import("../display/sharing/Sha
|
|
|
89
95
|
//Props
|
|
90
96
|
const props = defineProps({
|
|
91
97
|
playlistId: { default: undefined, type: Number },
|
|
98
|
+
pr: { default: 0, type: Number },
|
|
99
|
+
ps: { default: 30, type: Number },
|
|
100
|
+
routeQuery: { default: "", type: String },
|
|
92
101
|
});
|
|
93
102
|
|
|
94
103
|
|
|
@@ -108,7 +117,11 @@ const {handle403} = useErrorHandler();
|
|
|
108
117
|
const authStore = useAuthStore();
|
|
109
118
|
const filterStore = useFilterStore();
|
|
110
119
|
const generalStore = useGeneralStore();
|
|
111
|
-
|
|
120
|
+
const {
|
|
121
|
+
searchPattern,
|
|
122
|
+
paginateFirst,
|
|
123
|
+
isInit
|
|
124
|
+
} = useSimplePageParam(props, true);
|
|
112
125
|
|
|
113
126
|
|
|
114
127
|
//Computed
|
|
@@ -255,7 +255,8 @@ async function fetchConferenceStatus() {
|
|
|
255
255
|
api: 9,
|
|
256
256
|
path: "conference/info/" + podcast.value?.conferenceId,
|
|
257
257
|
});
|
|
258
|
-
|
|
258
|
+
|
|
259
|
+
fetchConference.value = {...fetchConference.value, ...data};
|
|
259
260
|
} catch {
|
|
260
261
|
//Do nothing
|
|
261
262
|
}
|
package/src/helper/loadScript.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function loadScript(src: string, async:boolean, callback:
|
|
1
|
+
function loadScript(src: string, async:boolean, callback: (isLoaded:boolean) => void) {
|
|
2
2
|
const firstElement = document.getElementsByTagName('head')[0] || document.documentElement,
|
|
3
3
|
scriptElement = document.createElement('script');
|
|
4
4
|
scriptElement.type = 'text/javascript';
|
|
@@ -6,13 +6,13 @@ function loadScript(src: string, async:boolean, callback: any) {
|
|
|
6
6
|
scriptElement.async = async;
|
|
7
7
|
scriptElement.addEventListener('load', function() {
|
|
8
8
|
if(callback && typeof callback === 'function') {
|
|
9
|
-
callback(true
|
|
9
|
+
callback(true);
|
|
10
10
|
}
|
|
11
11
|
}, false);
|
|
12
|
-
scriptElement.addEventListener('error', function(
|
|
12
|
+
scriptElement.addEventListener('error', function() {
|
|
13
13
|
firstElement.removeChild(scriptElement);
|
|
14
14
|
if(callback && typeof callback === 'function') {
|
|
15
|
-
callback(false
|
|
15
|
+
callback(false);
|
|
16
16
|
}
|
|
17
17
|
}, false);
|
|
18
18
|
firstElement.insertBefore(scriptElement, firstElement.firstChild);
|
package/src/locale/de.ts
CHANGED
|
@@ -146,8 +146,8 @@ export default {
|
|
|
146
146
|
"Sort score": "Nach Relevanz",
|
|
147
147
|
"Sort name": "Nach Titel",
|
|
148
148
|
"Sort last": "Nach Datum",
|
|
149
|
-
"Choose color": "
|
|
150
|
-
"Choose theme": "
|
|
149
|
+
"Choose color": "Akzentfarbe",
|
|
150
|
+
"Choose theme": "Thema (Spielerhintergrund)",
|
|
151
151
|
"Podcast no visible": "Podcast nicht sichtbar",
|
|
152
152
|
"Display episodes": "Folgen anzeigen",
|
|
153
153
|
"Podcast published in future": "Podcast geplant",
|
package/src/locale/en.ts
CHANGED
|
@@ -145,8 +145,8 @@ export default {
|
|
|
145
145
|
"Sort score": "Sorted by relevancy score",
|
|
146
146
|
"Sort name": "Sorted title",
|
|
147
147
|
"Sort last": "Sorted last",
|
|
148
|
-
"Choose color": "
|
|
149
|
-
"Choose theme": "
|
|
148
|
+
"Choose color": "Accent color",
|
|
149
|
+
"Choose theme": "Theme (player background)",
|
|
150
150
|
"Podcast no visible": "Podcast not visible",
|
|
151
151
|
"Display episodes": "Display episodes",
|
|
152
152
|
"Podcast published in future": "Podcast published in the future",
|
package/src/locale/es.ts
CHANGED
|
@@ -145,8 +145,8 @@ export default {
|
|
|
145
145
|
"Sort score": "Clasificación por pertinencia",
|
|
146
146
|
"Sort name": "Clasificación por título",
|
|
147
147
|
"Sort last": "Clasificación por fecha más reciente",
|
|
148
|
-
"Choose color": "
|
|
149
|
-
"Choose theme": "
|
|
148
|
+
"Choose color": "Color de acento",
|
|
149
|
+
"Choose theme": "Tema (fondo del jugador)",
|
|
150
150
|
"Podcast no visible": "Este pódcast no puede visualizarse",
|
|
151
151
|
"Display episodes": "Mostrar episodios",
|
|
152
152
|
"Podcast published in future": "Pódcast pendiente de publicación",
|
package/src/locale/fr.ts
CHANGED
|
@@ -146,8 +146,8 @@ export default {
|
|
|
146
146
|
"Sort score": "Pertinence",
|
|
147
147
|
"Sort name": "Alphabétique",
|
|
148
148
|
"Sort last": "Antéchronologique",
|
|
149
|
-
"Choose color": "Couleur",
|
|
150
|
-
"Choose theme": "Thème",
|
|
149
|
+
"Choose color": "Couleur d'accent",
|
|
150
|
+
"Choose theme": "Thème (fond du player)",
|
|
151
151
|
"Podcast no visible": "Épisode non visible actuellement",
|
|
152
152
|
"Display episodes": "Affichage des épisodes",
|
|
153
153
|
"Podcast publish in future": "Épisode publié dans le futur",
|
package/src/locale/it.ts
CHANGED
|
@@ -141,8 +141,8 @@ export default{
|
|
|
141
141
|
'Sort score': 'Suddiviso per grado di rilevanza',
|
|
142
142
|
'Sort name': 'Suddividi titolo',
|
|
143
143
|
'Sort last': 'Suddividi ultimo',
|
|
144
|
-
'Choose color': '
|
|
145
|
-
'Choose theme': '
|
|
144
|
+
'Choose color': 'Colore accento',
|
|
145
|
+
'Choose theme': 'Tema (sfondo del giocatore)',
|
|
146
146
|
'Podcast no visible': 'Podcast non visibile',
|
|
147
147
|
'Display episodes': 'Mostra episodi',
|
|
148
148
|
'Podcast published in future': 'Podcast pubblicato in futuro',
|
package/src/locale/sl.ts
CHANGED
|
@@ -142,8 +142,8 @@ export default {
|
|
|
142
142
|
"Sort score": "Razvrščeno po relevantnosti",
|
|
143
143
|
"Sort name": "Naslov",
|
|
144
144
|
"Sort last": "Zadnje",
|
|
145
|
-
"Choose color": "
|
|
146
|
-
"Choose theme": "
|
|
145
|
+
"Choose color": "Poudarjena barva",
|
|
146
|
+
"Choose theme": "Tema (ozadje igralca)",
|
|
147
147
|
"Podcast no visible": "Podkast je skrit",
|
|
148
148
|
"Display episodes": "Prikaži epizode",
|
|
149
149
|
"Podcast published in future": "Podkast bo objavljen v prihodnje",
|
package/src/router/router.ts
CHANGED
|
@@ -144,9 +144,13 @@ const routes: Array<RouteRecordRaw> = [
|
|
|
144
144
|
component: EmissionPage,
|
|
145
145
|
props: (route: RouteLocationNormalized) => ({
|
|
146
146
|
emissionId: parseInt(route.params.emissionId.toString(), 10),
|
|
147
|
+
pr: route.query.pr ? parseInt(route.query.pr.toString(), 10) : undefined,
|
|
148
|
+
ps: route.query.ps ? parseInt(route.query.ps.toString(), 10) : undefined,
|
|
149
|
+
routeQuery: route.query.q ?? "",
|
|
147
150
|
}),
|
|
148
151
|
meta:{
|
|
149
|
-
title: ""
|
|
152
|
+
title: "",
|
|
153
|
+
noScroll:true
|
|
150
154
|
}
|
|
151
155
|
},
|
|
152
156
|
{
|
|
@@ -177,9 +181,13 @@ const routes: Array<RouteRecordRaw> = [
|
|
|
177
181
|
component: ParticipantPage,
|
|
178
182
|
props: (route: RouteLocationNormalized) => ({
|
|
179
183
|
participantId: parseInt(route.params.participantId.toString(), 10),
|
|
184
|
+
pr: route.query.pr ? parseInt(route.query.pr.toString(), 10) : undefined,
|
|
185
|
+
ps: route.query.ps ? parseInt(route.query.ps.toString(), 10) : undefined,
|
|
186
|
+
routeQuery: route.query.q ?? "",
|
|
180
187
|
}),
|
|
181
188
|
meta:{
|
|
182
|
-
title: ""
|
|
189
|
+
title: "",
|
|
190
|
+
noScroll:true
|
|
183
191
|
}
|
|
184
192
|
},
|
|
185
193
|
{
|
|
@@ -266,9 +274,13 @@ const routes: Array<RouteRecordRaw> = [
|
|
|
266
274
|
component: PlaylistPage,
|
|
267
275
|
props: (route: RouteLocationNormalized) => ({
|
|
268
276
|
playlistId: parseInt(route.params.playlistId.toString(), 10),
|
|
277
|
+
pr: route.query.pr ? parseInt(route.query.pr.toString(), 10) : undefined,
|
|
278
|
+
ps: route.query.ps ? parseInt(route.query.ps.toString(), 10) : undefined,
|
|
279
|
+
routeQuery: route.query.q ?? "",
|
|
269
280
|
}),
|
|
270
281
|
meta:{
|
|
271
|
-
title: ""
|
|
282
|
+
title: "",
|
|
283
|
+
noScroll:true
|
|
272
284
|
}
|
|
273
285
|
},
|
|
274
286
|
//Fake route to avoid errors
|
|
@@ -321,7 +333,8 @@ const routes: Array<RouteRecordRaw> = [
|
|
|
321
333
|
const router = createRouter({
|
|
322
334
|
history: createWebHistory(),
|
|
323
335
|
routes: routes,
|
|
324
|
-
scrollBehavior()
|
|
336
|
+
scrollBehavior(to, from) {
|
|
337
|
+
if (to.name === from.name && to.meta.noScroll) return false;
|
|
325
338
|
return { left: 0, top: 0 };
|
|
326
339
|
},
|
|
327
340
|
});
|