@saooti/octopus-sdk 41.1.14 → 41.2.0
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/CHANGELOG.md +42 -0
- package/index.ts +24 -1
- package/package.json +1 -1
- package/src/api/groupsApi.ts +214 -0
- package/src/api/podcastApi.ts +47 -9
- package/src/components/buttons/ActionButton.vue +99 -0
- package/src/components/buttons/index.ts +5 -0
- package/src/components/composable/route/types.ts +11 -3
- package/src/components/composable/route/useAdvancedParamInit.ts +38 -13
- package/src/components/composable/useErrorHandler.ts +3 -2
- package/src/components/composable/useNotifications.ts +50 -0
- package/src/components/display/emission/EmissionGroupChooser.vue +56 -0
- package/src/components/display/emission/EmissionItem.vue +23 -3
- package/src/components/display/emission/EmissionList.vue +8 -2
- package/src/components/display/filter/AdvancedSearch.vue +82 -23
- package/src/components/display/list/ListPaginate.vue +4 -1
- package/src/components/display/podcasts/PodcastList.vue +12 -5
- package/src/components/display/podcasts/PodcastPlayButton.vue +2 -2
- package/src/components/display/podcasts/TagList.vue +4 -1
- package/src/components/form/ClassicMultiselect.vue +43 -37
- package/src/components/icons.ts +13 -0
- package/src/components/misc/ClassicAlert.vue +8 -1
- package/src/components/misc/ClassicBigChip.vue +84 -0
- package/src/components/misc/ClassicDataTable.vue +98 -0
- package/src/components/misc/ClassicDataTable_Internal.vue +132 -0
- package/src/components/misc/ClassicHelpButton.vue +3 -3
- package/src/components/misc/ClassicNotifications.vue +23 -0
- package/src/components/misc/ClassicPopover.vue +1 -0
- package/src/components/pages/EmissionPage.vue +2 -2
- package/src/components/pages/EmissionsPage.vue +10 -15
- package/src/components/pages/PodcastPage.vue +1 -1
- package/src/components/pages/PodcastsPage.vue +8 -20
- package/src/helper/fetchHelper.ts +1 -0
- package/src/locale/de.ts +2 -0
- package/src/locale/en.ts +2 -0
- package/src/locale/es.ts +2 -0
- package/src/locale/fr.ts +5 -3
- package/src/locale/it.ts +2 -0
- package/src/locale/sl.ts +2 -0
- package/src/router/router.ts +38 -53
- package/src/stores/class/general/emission.ts +8 -2
- package/src/style/_variables.scss +3 -0
- package/src/style/bootstrap.scss +5 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="big-chip">
|
|
3
|
+
<div class="title">
|
|
4
|
+
<b>{{ title }}</b>
|
|
5
|
+
<ActionButton
|
|
6
|
+
v-if="removeable"
|
|
7
|
+
action="delete"
|
|
8
|
+
:confirm-modal="confirmModal"
|
|
9
|
+
@click="emit('remove')"
|
|
10
|
+
/>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<p>{{ content }}</p>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script setup lang="ts">
|
|
18
|
+
import { ActionButton } from '../buttons';
|
|
19
|
+
import { ConfirmModalData } from '../buttons/ActionButton.vue';
|
|
20
|
+
|
|
21
|
+
defineProps<{
|
|
22
|
+
/** The title of the chip */
|
|
23
|
+
title: string;
|
|
24
|
+
/** The content of the chip */
|
|
25
|
+
content: string;
|
|
26
|
+
/** When true, displays an action button for removing this chip */
|
|
27
|
+
removeable?: boolean;
|
|
28
|
+
/** When removeable, allow for a confirmation modal to be shown */
|
|
29
|
+
confirmModal?: ConfirmModalData;
|
|
30
|
+
}>();
|
|
31
|
+
|
|
32
|
+
const emit = defineEmits<{
|
|
33
|
+
/** Called when the remove button is clicked */
|
|
34
|
+
(e: 'remove'): void;
|
|
35
|
+
}>();
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<style scoped lang="scss">
|
|
39
|
+
.big-chip {
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
border-radius: 3px;
|
|
43
|
+
background-color: var(--octopus-secondary);
|
|
44
|
+
border: 1px solid var(--octopus-primary);
|
|
45
|
+
padding: 8px 16px;
|
|
46
|
+
margin: 4px;
|
|
47
|
+
width: 335px;
|
|
48
|
+
height: 80px;
|
|
49
|
+
|
|
50
|
+
.title {
|
|
51
|
+
display: flex;
|
|
52
|
+
justify-content: space-between;
|
|
53
|
+
|
|
54
|
+
b {
|
|
55
|
+
white-space: nowrap;
|
|
56
|
+
overflow-x: hidden;
|
|
57
|
+
text-overflow: ellipsis;
|
|
58
|
+
height: 1rem;
|
|
59
|
+
|
|
60
|
+
&:hover {
|
|
61
|
+
background-color: var(--octopus-secondary);
|
|
62
|
+
overflow-x: unset;
|
|
63
|
+
z-index: 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Limit style to buttons directly in title (to not affect the modal)
|
|
68
|
+
& > div > :deep(button) {
|
|
69
|
+
margin-top: -6px;
|
|
70
|
+
padding: 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
p {
|
|
75
|
+
margin: 0;
|
|
76
|
+
overflow: hidden;
|
|
77
|
+
&:hover {
|
|
78
|
+
background-color: var(--octopus-secondary);
|
|
79
|
+
overflow: unset;
|
|
80
|
+
z-index: 1;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
</style>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Generic component to display an array of elements
|
|
3
|
+
|
|
4
|
+
**Slots** :
|
|
5
|
+
- `item-[header.value]`
|
|
6
|
+
- Replace the default display of a value
|
|
7
|
+
- Parameters :
|
|
8
|
+
- `item`: The item being displayed
|
|
9
|
+
- `value`: The value of the item
|
|
10
|
+
- `item-actions`
|
|
11
|
+
- When defined, add a final column dedicated to action buttons
|
|
12
|
+
- Parameters :
|
|
13
|
+
- `item`: The item being displayed
|
|
14
|
+
-->
|
|
15
|
+
<template>
|
|
16
|
+
<ClassicDataTable_Internal
|
|
17
|
+
v-if="noPagination"
|
|
18
|
+
v-bind="{ ...props, ...$attrs }"
|
|
19
|
+
>
|
|
20
|
+
<template v-for="(_, name) in $slots" v-slot:[name]="scope">
|
|
21
|
+
<slot :name="name" v-bind="{ ...scope }" />
|
|
22
|
+
</template>
|
|
23
|
+
</ClassicDataTable_Internal>
|
|
24
|
+
<ListPaginate
|
|
25
|
+
v-else
|
|
26
|
+
:first="first"
|
|
27
|
+
:size="size"
|
|
28
|
+
:text-count="$t('Number items', { nb: items.length })"
|
|
29
|
+
:total-count="items.length"
|
|
30
|
+
:loading="loading"
|
|
31
|
+
:loading-text="$t('Loading content ...')"
|
|
32
|
+
>
|
|
33
|
+
<template v-if="!loading" #list>
|
|
34
|
+
<ClassicDataTable_Internal
|
|
35
|
+
v-bind="{ ...props, ...$attrs }"
|
|
36
|
+
>
|
|
37
|
+
<template v-for="(_, name) in $slots" v-slot:[name]="scope">
|
|
38
|
+
<slot :name="name" v-bind="{ ...scope }" />
|
|
39
|
+
</template>
|
|
40
|
+
</ClassicDataTable_Internal>
|
|
41
|
+
</template>
|
|
42
|
+
</ListPaginate>
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<script setup lang="ts" generic="T">
|
|
46
|
+
import ListPaginate from '../display/list/ListPaginate.vue';
|
|
47
|
+
import ClassicDataTable_Internal, {
|
|
48
|
+
type ClassicDataTableHeader,
|
|
49
|
+
type ClassicDataTableProps
|
|
50
|
+
} from './ClassicDataTable_Internal.vue';
|
|
51
|
+
|
|
52
|
+
export type { ClassicDataTableHeader };
|
|
53
|
+
|
|
54
|
+
const {
|
|
55
|
+
first = 0,
|
|
56
|
+
size = 50,
|
|
57
|
+
noPagination = false,
|
|
58
|
+
...props
|
|
59
|
+
} = defineProps<ClassicDataTableProps<T> & {
|
|
60
|
+
/** Index of first element in pagination */
|
|
61
|
+
first?: number;
|
|
62
|
+
/** Number of elements in pagination */
|
|
63
|
+
size?: number;
|
|
64
|
+
/** Disable pagination */
|
|
65
|
+
noPagination?: boolean;
|
|
66
|
+
/** Indicates that data is loading */
|
|
67
|
+
loading?: boolean;
|
|
68
|
+
}>();
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<style scoped lang="scss">
|
|
72
|
+
table {
|
|
73
|
+
border-collapse: collapse;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
th {
|
|
77
|
+
text-align: start;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
tr {
|
|
81
|
+
height: var(--table-line-height);
|
|
82
|
+
min-height: var(--table-line-height);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
thead, tr/*:not(:last-child)*/ {
|
|
86
|
+
// Display a border between each line
|
|
87
|
+
border-bottom: 1px solid var(--octopus-primary-more-transparent);
|
|
88
|
+
|
|
89
|
+
td:first-child, th:first-child {
|
|
90
|
+
padding: 0px 32px;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.actions {
|
|
95
|
+
// Right align content
|
|
96
|
+
justify-content: right;
|
|
97
|
+
}
|
|
98
|
+
</style>
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
This component is used by ClassicDataTable and should not be used by
|
|
3
|
+
itself.
|
|
4
|
+
-->
|
|
5
|
+
<template>
|
|
6
|
+
<table class="w-100">
|
|
7
|
+
<!-- Displays the headers of the table -->
|
|
8
|
+
<thead>
|
|
9
|
+
<tr>
|
|
10
|
+
<th v-if="selectable" />
|
|
11
|
+
<th v-for="(header, i) in headers" :key="i">
|
|
12
|
+
{{ header.label }}
|
|
13
|
+
</th>
|
|
14
|
+
</tr>
|
|
15
|
+
</thead>
|
|
16
|
+
|
|
17
|
+
<!-- Displays the data of the table -->
|
|
18
|
+
<tbody>
|
|
19
|
+
<tr v-for="(item, i) in items" :key="'item-' + i">
|
|
20
|
+
<td v-if="selectable" class="selection">
|
|
21
|
+
<ClassicCheckbox
|
|
22
|
+
:text-init="isSelected(item)"
|
|
23
|
+
@update:text-init="select(item)"
|
|
24
|
+
/>
|
|
25
|
+
</td>
|
|
26
|
+
<td v-for="(header, j) in headers" :key="'item-' + i + '-' + j">
|
|
27
|
+
<!-- Slot to allow for customisation of value display -->
|
|
28
|
+
<slot
|
|
29
|
+
:name="'item-' + header.value.toString()"
|
|
30
|
+
:item="item"
|
|
31
|
+
:value="item[header.value]"
|
|
32
|
+
>
|
|
33
|
+
{{ item[header.value] }}
|
|
34
|
+
</slot>
|
|
35
|
+
</td>
|
|
36
|
+
|
|
37
|
+
<!-- Slot to display optional actions -->
|
|
38
|
+
<td v-if="slots['item-actions']" class="actions d-flex">
|
|
39
|
+
<slot name="item-actions" :item="item" />
|
|
40
|
+
</td>
|
|
41
|
+
</tr>
|
|
42
|
+
</tbody>
|
|
43
|
+
</table>
|
|
44
|
+
</template>
|
|
45
|
+
|
|
46
|
+
<script setup lang="ts" generic="T">
|
|
47
|
+
import { useSlots } from 'vue';
|
|
48
|
+
|
|
49
|
+
import ClassicCheckbox from '../form/ClassicCheckbox.vue';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Header of table
|
|
53
|
+
*/
|
|
54
|
+
export interface ClassicDataTableHeader<T> {
|
|
55
|
+
/** Label of the header */
|
|
56
|
+
label: string;
|
|
57
|
+
/** Key of the item that will be displayed */
|
|
58
|
+
value: keyof T;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface ClassicDataTableProps<T> {
|
|
62
|
+
/** The elements to display in the table */
|
|
63
|
+
items: Array<T>;
|
|
64
|
+
/** The columns to display in the table */
|
|
65
|
+
headers: Array<ClassicDataTableHeader<T>>;
|
|
66
|
+
/** When true, checkboxes allowing for selection will be displayed */
|
|
67
|
+
selectable?: boolean;
|
|
68
|
+
/** The currently selected items */
|
|
69
|
+
selection?: Array<T>;
|
|
70
|
+
/** When set to false, only one element can be selected */
|
|
71
|
+
selectionMultiple?: boolean;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface ClassicDataTableEvents<T> {
|
|
75
|
+
/** Event triggered when the selection changes */
|
|
76
|
+
(e: 'update:selection', selection: Array<T>): void
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const { selection, selectionMultiple = true } = defineProps<ClassicDataTableProps<T>>();
|
|
80
|
+
|
|
81
|
+
const emit = defineEmits<ClassicDataTableEvents<T>>();
|
|
82
|
+
|
|
83
|
+
const slots = useSlots();
|
|
84
|
+
|
|
85
|
+
function isSelected(element: T): boolean {
|
|
86
|
+
return selection.indexOf(element) >= 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function select(element: T): void {
|
|
90
|
+
if (isSelected(element)) {
|
|
91
|
+
emit('update:selection', []);
|
|
92
|
+
} else if (selectionMultiple === false) {
|
|
93
|
+
emit('update:selection', [element]);
|
|
94
|
+
} else {
|
|
95
|
+
emit('update:selection', [...selection, element]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<style scoped lang="scss">
|
|
101
|
+
table {
|
|
102
|
+
border-collapse: collapse;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
th {
|
|
106
|
+
text-align: start;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
tr {
|
|
110
|
+
height: var(--table-line-height);
|
|
111
|
+
min-height: var(--table-line-height);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
thead, tr/*:not(:last-child)*/ {
|
|
115
|
+
// Display a border between each line
|
|
116
|
+
border-bottom: 1px solid var(--octopus-primary-more-transparent);
|
|
117
|
+
|
|
118
|
+
td:first-child, th:first-child {
|
|
119
|
+
padding: 0px 32px;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.actions {
|
|
124
|
+
// Right align content
|
|
125
|
+
justify-content: right;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.selection {
|
|
129
|
+
width: 20px;
|
|
130
|
+
padding: 0;
|
|
131
|
+
}
|
|
132
|
+
</style>
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
<ClassicPopover
|
|
18
18
|
:target="computedId"
|
|
19
19
|
popover-class="help-popover"
|
|
20
|
-
:relative-class="
|
|
20
|
+
:relative-class="relativeClass"
|
|
21
21
|
>
|
|
22
22
|
<div class="content">
|
|
23
23
|
<slot />
|
|
@@ -35,7 +35,7 @@ import ClassicPopover from './ClassicPopover.vue';
|
|
|
35
35
|
const { colored, small } = defineProps<{
|
|
36
36
|
colored?: boolean;
|
|
37
37
|
/** Make the popover relative (userful when in page-element) */
|
|
38
|
-
|
|
38
|
+
relativeClass?: string;
|
|
39
39
|
/** Make the icon smaller if true *(default: false)* */
|
|
40
40
|
small?: boolean;
|
|
41
41
|
}>();
|
|
@@ -74,4 +74,4 @@ const iconSize = computed(() => {
|
|
|
74
74
|
.help-popover {
|
|
75
75
|
background-color: var(--octopus-secondary-lighter);
|
|
76
76
|
}
|
|
77
|
-
</style>
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
A component to display notifications
|
|
3
|
+
-->
|
|
4
|
+
<template>
|
|
5
|
+
<MessageModal
|
|
6
|
+
v-if="notification !== null"
|
|
7
|
+
:title="notification.title"
|
|
8
|
+
:message="notification.message"
|
|
9
|
+
:closeable="notification.closeable !== false"
|
|
10
|
+
@close="clearNotifications"
|
|
11
|
+
/>
|
|
12
|
+
</template>
|
|
13
|
+
|
|
14
|
+
<script setup lang="ts">
|
|
15
|
+
import MessageModal from './modal/MessageModal.vue';
|
|
16
|
+
|
|
17
|
+
import { useNotifications } from '../composable/useNotifications';
|
|
18
|
+
|
|
19
|
+
const {
|
|
20
|
+
notification,
|
|
21
|
+
clearNotifications
|
|
22
|
+
} = useNotifications();
|
|
23
|
+
</script>
|
|
@@ -40,6 +40,7 @@ const props = defineProps({
|
|
|
40
40
|
onlyClick: { type: Boolean, default: false },
|
|
41
41
|
onlyMouse: { type: Boolean, default: false },
|
|
42
42
|
isFixed: { type: Boolean, default: false },
|
|
43
|
+
/** Class(????) of the parent with relative positionning, must be set for proper positionning */
|
|
43
44
|
relativeClass: { type: String, default: undefined },
|
|
44
45
|
leftPos: { type: Boolean, default: false },
|
|
45
46
|
topPos: { type: Boolean, default: false },
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
<div class="d-flex" style="align-items: center">
|
|
43
43
|
<div>{{ t('Emission - Not available for listeners') }}</div>
|
|
44
44
|
|
|
45
|
-
<ClassicHelpButton relative small>
|
|
45
|
+
<ClassicHelpButton relative-class="page-element" small>
|
|
46
46
|
{{ t('Emission - Not available explanation') }}
|
|
47
47
|
</ClassicHelpButton>
|
|
48
48
|
</div>
|
|
@@ -179,7 +179,7 @@ const props = withDefaults(defineProps<{
|
|
|
179
179
|
ps?: number;
|
|
180
180
|
routeQuery?: string;
|
|
181
181
|
/** When true, display emission title in podcastmaker header */
|
|
182
|
-
useEmissionTitle
|
|
182
|
+
useEmissionTitle: boolean;
|
|
183
183
|
}>(), {
|
|
184
184
|
pr: 0,
|
|
185
185
|
ps: 30,
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
v-model:to-date="toDate"
|
|
16
16
|
v-model:rubrique-filter="rubriqueFilter"
|
|
17
17
|
v-model:beneficiaries="beneficiaries"
|
|
18
|
+
v-model:emission-groups="emissionGroups"
|
|
18
19
|
:search-pattern="searchPattern"
|
|
19
20
|
:is-emission="true"
|
|
20
21
|
:organisation-id="organisationId"
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
:rubriquage-id="rubriquesFilterArrayIds.rubriquageId"
|
|
36
37
|
:no-rubriquage-id="rubriquesFilterArrayIds.noRubriquageId"
|
|
37
38
|
:beneficiaries="beneficiaries"
|
|
39
|
+
:emission-groups="emissionGroups"
|
|
38
40
|
/>
|
|
39
41
|
</section>
|
|
40
42
|
</template>
|
|
@@ -44,25 +46,17 @@ import EmissionList from "../display/emission/EmissionList.vue";
|
|
|
44
46
|
import AdvancedSearch from "../display/filter/AdvancedSearch.vue";
|
|
45
47
|
import {useAdvancedParamInit} from "../composable/route/useAdvancedParamInit";
|
|
46
48
|
import { defineAsyncComponent } from "vue";
|
|
49
|
+
import { RouteProps } from "../composable/route/types";
|
|
47
50
|
const ProductorSearch = defineAsyncComponent(
|
|
48
51
|
() => import("../display/filter/ProductorSearch.vue"),
|
|
49
52
|
);
|
|
50
53
|
|
|
51
54
|
//Props
|
|
52
|
-
const props = defineProps({
|
|
53
|
-
pr:
|
|
54
|
-
ps:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
routeIab: { default: undefined, type: Number },
|
|
58
|
-
routeSort: { default: "LAST_PODCAST_DESC", type: String },
|
|
59
|
-
routeIncludeHidden: { default: "", type: String },
|
|
60
|
-
routeFrom: { default: undefined, type: String },
|
|
61
|
-
routeTo: { default: undefined, type: String },
|
|
62
|
-
routeOrga: { default: undefined, type: String },
|
|
63
|
-
routeRubriques: { default: "", type: String },
|
|
64
|
-
/** The filter on beneficiaries defined on the route props */
|
|
65
|
-
routeBeneficiaries: { default: null, type: Array as () => Array<string> }
|
|
55
|
+
const props = withDefaults(defineProps<RouteProps>(), {
|
|
56
|
+
pr: 0,
|
|
57
|
+
ps: 30,
|
|
58
|
+
routeMonetisable: "UNDEFINED",
|
|
59
|
+
routeSort: "LAST_PODCAST_DESC"
|
|
66
60
|
});
|
|
67
61
|
|
|
68
62
|
//Composables
|
|
@@ -80,6 +74,7 @@ const {
|
|
|
80
74
|
paginateFirst,
|
|
81
75
|
rubriquesFilterArrayIds,
|
|
82
76
|
isInit,
|
|
83
|
-
beneficiaries
|
|
77
|
+
beneficiaries,
|
|
78
|
+
emissionGroups
|
|
84
79
|
} = useAdvancedParamInit(props, true);
|
|
85
80
|
</script>
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
v-model:validity="validity"
|
|
16
16
|
v-model:rubrique-filter="rubriqueFilter"
|
|
17
17
|
v-model:beneficiaries="beneficiaries"
|
|
18
|
+
v-model:emission-groups="emissionGroups"
|
|
18
19
|
:search-pattern="searchPattern"
|
|
19
20
|
:is-emission="false"
|
|
20
21
|
:organisation-id="organisationId"
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
:beneficiaries="beneficiaries"
|
|
38
39
|
:with-video="withVideo"
|
|
39
40
|
:validity="validity"
|
|
41
|
+
:emission-groups="emissionGroups"
|
|
40
42
|
/>
|
|
41
43
|
</section>
|
|
42
44
|
</template>
|
|
@@ -47,31 +49,17 @@ import ProductorSearch from "../display/filter/ProductorSearch.vue";
|
|
|
47
49
|
import AdvancedSearch from "../display/filter/AdvancedSearch.vue";
|
|
48
50
|
import {useAdvancedParamInit} from "../composable/route/useAdvancedParamInit";
|
|
49
51
|
import { computed, ref, watch } from "vue";
|
|
52
|
+
import { RouteProps } from "../composable/route/types";
|
|
50
53
|
|
|
51
54
|
//Props
|
|
52
|
-
const props = defineProps({
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
routeQuery: { default: "", type: String },
|
|
56
|
-
routeMonetisable: { default: "UNDEFINED", type: String },
|
|
57
|
-
routeIab: { default: undefined, type: Number },
|
|
58
|
-
routeSort: { default: "DATE", type: String },
|
|
59
|
-
routeIncludeHidden: { default: "", type: String },
|
|
60
|
-
routeFrom: { default: undefined, type: String },
|
|
61
|
-
routeTo: { default: undefined, type: String },
|
|
62
|
-
routeValidity: { default: "", type: String },
|
|
63
|
-
routeOnlyVideo: { default: "", type: String },
|
|
64
|
-
routeOrga: { default: undefined, type: String },
|
|
65
|
-
routeRubriques: { default: "", type: String },
|
|
66
|
-
/** The filter on beneficiaries defined on the route props */
|
|
67
|
-
routeBeneficiaries: { default: null, type: Array as () => Array<string> }
|
|
55
|
+
const props = withDefaults(defineProps<RouteProps>(), {
|
|
56
|
+
routeMonetisable: "UNDEFINED",
|
|
57
|
+
routeSort: "DATE"
|
|
68
58
|
});
|
|
69
59
|
|
|
70
|
-
|
|
71
60
|
//Data
|
|
72
61
|
const onlyVideo = ref(false);
|
|
73
62
|
|
|
74
|
-
|
|
75
63
|
//Composables
|
|
76
64
|
const {
|
|
77
65
|
organisationId,
|
|
@@ -88,14 +76,14 @@ const {
|
|
|
88
76
|
validity,
|
|
89
77
|
rubriquesFilterArrayIds,
|
|
90
78
|
isInit,
|
|
91
|
-
beneficiaries
|
|
79
|
+
beneficiaries,
|
|
80
|
+
emissionGroups
|
|
92
81
|
} = useAdvancedParamInit(props, false);
|
|
93
82
|
|
|
94
83
|
//Computed
|
|
95
84
|
const orgaArray = computed(() => organisationId.value ? [organisationId.value] : []);
|
|
96
85
|
const withVideo = computed(() => false === onlyVideo.value ? undefined : true);
|
|
97
86
|
|
|
98
|
-
|
|
99
87
|
//Watch
|
|
100
88
|
watch(() => props.routeOnlyVideo, () =>{
|
|
101
89
|
onlyVideo.value = "true" === props.routeOnlyVideo;
|
package/src/locale/de.ts
CHANGED
|
@@ -418,4 +418,6 @@ export default {
|
|
|
418
418
|
"Emission - Not available for listeners": "Sendung für Hörer nicht sichtbar",
|
|
419
419
|
"Emission - Not available explanation": "Diese Sendung ist für Hörer nicht sichtbar, da sie so konfiguriert wurde, dass ihre Episoden nicht veröffentlicht werden. Diese Konfiguration ist in den erweiterten Einstellungen der Show verfügbar.",
|
|
420
420
|
"Filters - Beneficiaries": "Nach Referenzen der Rechteinhaber",
|
|
421
|
+
"Filter - Emission groups": "Nach Broadcast-Gruppen",
|
|
422
|
+
"Search - Emission groups placeholder": "Filtern Sie Gruppen nach Namen"
|
|
421
423
|
}
|
package/src/locale/en.ts
CHANGED
|
@@ -421,4 +421,6 @@ export default {
|
|
|
421
421
|
"Emission - Not available for listeners": "Broadcast not visible to listeners",
|
|
422
422
|
"Emission - Not available explanation": "This show is not visible to listeners because it has been configured so that its episodes are not published. This configuration is available in the advanced settings of the show.",
|
|
423
423
|
"Filters - Beneficiaries": "By rights holder references",
|
|
424
|
+
"Filter - Emission groups": "By broadcast groups",
|
|
425
|
+
"Search - Emission groups placeholder": "Filter groups by name"
|
|
424
426
|
};
|
package/src/locale/es.ts
CHANGED
|
@@ -419,4 +419,6 @@ export default {
|
|
|
419
419
|
"Emission - Not available for listeners": "Transmisión no visible para los oyentes",
|
|
420
420
|
"Emission - Not available explanation": "Este programa no es visible para los oyentes porque ha sido configurado para que sus episodios no se publiquen. Esta configuración está disponible en la configuración avanzada del programa.",
|
|
421
421
|
"Filters - Beneficiaries": "Por referencias de titulares de derechos",
|
|
422
|
+
"Filter - Emission groups": "Por grupos de difusión",
|
|
423
|
+
"Search - Emission groups placeholder": "Filtrar grupos por nombre"
|
|
422
424
|
}
|
package/src/locale/fr.ts
CHANGED
|
@@ -21,7 +21,7 @@ export default {
|
|
|
21
21
|
"Please set an animator": "Merci de sélectionner ou de créer un animateur.",
|
|
22
22
|
"Term of use": "Conditions Générales d'Utilisation",
|
|
23
23
|
"Producted by : ": "Produit par : ",
|
|
24
|
-
"Loading podcasts ...": "Chargement des épisodes
|
|
24
|
+
"Loading podcasts ...": "Chargement des épisodes…",
|
|
25
25
|
"All podcasts": "Tous les épisodes",
|
|
26
26
|
Error: "Erreur",
|
|
27
27
|
Upload: "Téléverser",
|
|
@@ -68,7 +68,7 @@ export default {
|
|
|
68
68
|
"Loading productors ...": "Chargement des producteurs en cours...",
|
|
69
69
|
"Loading emissions ...": "Chargement des émissions en cours...",
|
|
70
70
|
"Emission name image": "Image de l'émission {name}",
|
|
71
|
-
"Loading content ...": "Chargement en cours
|
|
71
|
+
"Loading content ...": "Chargement en cours…",
|
|
72
72
|
Episode: "Épisode",
|
|
73
73
|
"Episode name image": "Image de l'épisode {name}",
|
|
74
74
|
"More episodes of this emission": "Plus d'épisodes de cette émission",
|
|
@@ -427,5 +427,7 @@ export default {
|
|
|
427
427
|
"Silent stream":"Flux silencieux",
|
|
428
428
|
"Emission - Not available for listeners": "Émission non visible pour les auditeurs",
|
|
429
429
|
"Emission - Not available explanation": "Cette émission n'est pas visible pour les auditeurs car elle a été configurée pour que ses épisodes ne soient pas publiés. Cette configuration est disponible dans les paramètres avancés de l'émission.",
|
|
430
|
-
"Filters - Beneficiaries": "Par références ayants-droit"
|
|
430
|
+
"Filters - Beneficiaries": "Par références ayants-droit",
|
|
431
|
+
"Filters - Emission groups": "Par groupes d'émissions",
|
|
432
|
+
"Search - Emission groups placeholder": "Filtrer les groupes par nom"
|
|
431
433
|
};
|
package/src/locale/it.ts
CHANGED
|
@@ -415,4 +415,6 @@ export default{
|
|
|
415
415
|
"Emission - Not available for listeners": "Trasmissione non visibile agli ascoltatori",
|
|
416
416
|
"Emission - Not available explanation": "Questo programma non è visibile agli ascoltatori perché è stato configurato in modo che i suoi episodi non vengano pubblicati. Questa configurazione è disponibile nelle impostazioni avanzate dello spettacolo.",
|
|
417
417
|
"Filters - Beneficiaries": "Per riferimenti del titolare dei diritti",
|
|
418
|
+
"Filter - Emission groups": "Per gruppi di trasmissione",
|
|
419
|
+
"Search - Emission groups placeholder": "Filtra i gruppi per nome"
|
|
418
420
|
};
|
package/src/locale/sl.ts
CHANGED
|
@@ -410,4 +410,6 @@ export default {
|
|
|
410
410
|
"Emission - Not available for listeners": "Oddaja ni vidna poslušalcem",
|
|
411
411
|
"Emission - Not available explanation": "Ta oddaja ni vidna poslušalcem, ker je bila konfigurirana tako, da njene epizode niso objavljene. Ta konfiguracija je na voljo v naprednih nastavitvah oddaje.",
|
|
412
412
|
"Filters - Beneficiaries": "Po referencah imetnikov pravic",
|
|
413
|
+
"Filter - Emission groups": "Po oddajnih skupinah",
|
|
414
|
+
"Search - Emission groups placeholder": "Filtrirajte skupine po imenu"
|
|
413
415
|
}
|