@saooti/octopus-sdk 41.1.15 → 41.2.1

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 (44) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/index.ts +29 -2
  3. package/package.json +1 -1
  4. package/src/api/groupsApi.ts +214 -0
  5. package/src/api/podcastApi.ts +47 -9
  6. package/src/components/buttons/ActionButton.vue +99 -0
  7. package/src/components/buttons/index.ts +5 -0
  8. package/src/components/composable/route/types.ts +11 -3
  9. package/src/components/composable/route/useAdvancedParamInit.ts +40 -13
  10. package/src/components/composable/useErrorHandler.ts +3 -2
  11. package/src/components/composable/useNotifications.ts +50 -0
  12. package/src/components/display/emission/EmissionGroupChooser.vue +56 -0
  13. package/src/components/display/emission/EmissionList.vue +8 -2
  14. package/src/components/display/filter/AdvancedSearch.vue +83 -23
  15. package/src/components/display/list/ListPaginate.vue +4 -1
  16. package/src/components/display/podcasts/PodcastList.vue +12 -5
  17. package/src/components/display/podcasts/PodcastPlayButton.vue +2 -2
  18. package/src/components/display/podcasts/TagList.vue +4 -1
  19. package/src/components/form/ClassicMultiselect.vue +43 -37
  20. package/src/components/icons.ts +13 -0
  21. package/src/components/misc/ClassicAlert.vue +8 -1
  22. package/src/components/misc/ClassicBigChip.vue +84 -0
  23. package/src/components/misc/ClassicDataTable.vue +98 -0
  24. package/src/components/misc/ClassicDataTable_Internal.vue +132 -0
  25. package/src/components/misc/ClassicHelpButton.vue +3 -3
  26. package/src/components/misc/ClassicNotifications.vue +23 -0
  27. package/src/components/misc/ClassicPopover.vue +1 -0
  28. package/src/components/pages/EmissionPage.vue +2 -2
  29. package/src/components/pages/EmissionsPage.vue +10 -15
  30. package/src/components/pages/PodcastPage.vue +1 -1
  31. package/src/components/pages/PodcastsPage.vue +8 -20
  32. package/src/helper/fetchHelper.ts +1 -0
  33. package/src/locale/de.ts +2 -0
  34. package/src/locale/en.ts +2 -0
  35. package/src/locale/es.ts +2 -0
  36. package/src/locale/fr.ts +5 -3
  37. package/src/locale/it.ts +2 -0
  38. package/src/locale/sl.ts +2 -0
  39. package/src/router/router.ts +14 -288
  40. package/src/router/routes.ts +236 -0
  41. package/src/router/utils.ts +43 -2
  42. package/src/stores/class/general/emission.ts +8 -2
  43. package/src/style/_variables.scss +3 -0
  44. 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="relative ? 'page-element' : ''"
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
- relative?: boolean;
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?: boolean;
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: { default: 0, type: Number },
54
- ps: { default: 30, type: Number },
55
- routeQuery: { default: "", type: String },
56
- routeMonetisable: { default: "UNDEFINED", type: String },
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>
@@ -115,7 +115,7 @@ const props = defineProps<{
115
115
  playingPodcast?: Podcast;
116
116
  podcastId: number;
117
117
  /** When true, display emission title in podcastmaker header */
118
- useEmissionTitle?: boolean;
118
+ useEmissionTitle: boolean;
119
119
  }>();
120
120
 
121
121
 
@@ -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
- pr: { default: 0, type: Number },
54
- ps: { default: 30, type: Number },
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;
@@ -114,6 +114,7 @@ export default {
114
114
  // remove empty array for stats #12323
115
115
  if (
116
116
  undefined !== value &&
117
+ null !== value &&
117
118
  "" !== value &&
118
119
  (!Array.isArray(value) || (Array.isArray(value) && value.length))
119
120
  ) {
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
  }