@saooti/octopus-sdk 41.0.18 → 41.0.19

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.
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <div
3
+ class="d-flex flex-wrap border align-items-center rounded px-2"
4
+ >
5
+ <div
6
+ v-for="(tag, index) in tags"
7
+ :key="tag"
8
+ class="vs__selected p-0 my-0 mx-1"
9
+ :class="getClass(tag)"
10
+ >
11
+ <!--<button
12
+ v-if="index !== tagToEdit"-->
13
+ <button
14
+ :id="'display-input-tag-' + index"
15
+ class="btn-transparent d-flex align-items"
16
+ @click="startEditTag(index, tag)"
17
+ >
18
+ <!--<img
19
+ v-if="isOuestFranceTag(tag)"
20
+ width="20"
21
+ height="20"
22
+ class="ouest-france-logo"
23
+ title="Ouest France Logo"
24
+ aria-hidden="true"
25
+ alt=""
26
+ src="/img/ouest_france_logo.svg"
27
+ >-->
28
+ <span>{{ tag }}</span>
29
+ </button>
30
+ <!--<input
31
+ v-else
32
+ :id="'form-input-tag-' + index"
33
+ v-model="tagToEditTempValue"
34
+ :title="$t('Edit')"
35
+ @blur="finishEditTag(index)"
36
+ @keydown.enter="finishEditTag(index)"
37
+ >-->
38
+
39
+ <button class="btn-transparent" @click="removeTag(index)">
40
+ <CloseIcon />
41
+ </button>
42
+ </div>
43
+ <input
44
+ v-if="editing"
45
+ :id="'form-input-tag'"
46
+ v-model="tagToEditTempValue"
47
+ :title="$t('Edit')"
48
+ @blur="finishEditTag"
49
+ @keydown.enter="finishEditTag"
50
+ >
51
+ <button
52
+ class="btn btn-add-tag m-1"
53
+ :title="$t('Add a tag')"
54
+ @click="createNewTag"
55
+ />
56
+ </div>
57
+ </template>
58
+
59
+ <script setup lang="ts">
60
+ import { ref } from 'vue';
61
+
62
+ import CloseIcon from "vue-material-design-icons/Close.vue";
63
+
64
+ const { tags, tagClass } = defineProps<{
65
+ /** Currently selected tags */
66
+ tags: string[];
67
+ /** The class to apply to the tags */
68
+ tagClass?: string|string[]|((tag: string) => string|string[]);
69
+ }>();
70
+
71
+ const emit = defineEmits<{
72
+ /** Update tags */
73
+ (e: 'update:tags', tags: string[]): void
74
+ }>();
75
+
76
+ //const tagToEdit: Ref<number | undefined> = ref(undefined);
77
+ const editing = ref(false);
78
+ const tagToEditTempValue = ref("");
79
+
80
+ function getClass(tag: string): string|string[]|undefined {
81
+ if (typeof tagClass === 'function') {
82
+ return tagClass(tag);
83
+ } else {
84
+ return tagClass;
85
+ }
86
+ }
87
+
88
+ function removeTag(index: number): void {
89
+ const newTags = [...tags];
90
+ newTags.splice(index, 1);
91
+ console.log(index, newTags);
92
+ emit('update:tags', newTags);
93
+ }
94
+
95
+ function startEditTag(index: number, tag: string): void {
96
+ //tagToEditTempValue.value = tags[index];
97
+ //tagToEdit.value = index;
98
+ // editing.value = true;
99
+ /*nextTick(() => {
100
+ document.getElementById("form-input-tag-" + index)?.focus();
101
+ });*/
102
+ }
103
+
104
+ function finishEditTag(/*index: number*/): void {
105
+ /*if (index !== tagToEdit.value) {
106
+ return;
107
+ }
108
+ tagToEdit.value = undefined;
109
+
110
+ if (tagToEditTempValue.value.length) {
111
+ const newTags = [...tags];
112
+ newTags.splice(
113
+ index,
114
+ 1,
115
+ ...tagToEditTempValue.value.split(","),
116
+ );
117
+ emit('update:tags', newTags);
118
+ } else {
119
+ const newTags = [...tags];
120
+ newTags.splice(index, 1);
121
+ emit('update:tags', newTags);
122
+ }*/
123
+
124
+ if (tagToEditTempValue.value === '') {
125
+ return;
126
+ }
127
+
128
+ const newTags = [...tags, tagToEditTempValue.value];
129
+ tagToEditTempValue.value = '';
130
+ editing.value = false;
131
+ emit('update:tags', newTags);
132
+ }
133
+
134
+ function createNewTag(): void {
135
+ /*const newTags = [...tags, ''];
136
+ emit('update:tags', newTags);
137
+ startEditTag(tags.length - 1, '');*/
138
+ editing.value = true;
139
+ }
140
+
141
+ </script>
142
+
143
+ <style scoped lang="scss">
144
+ .btn-add-tag {
145
+ padding: 4px;
146
+ line-height: 1;
147
+
148
+ &::after {
149
+ content: "+";
150
+ color: var(--octopus-primary);
151
+ font-size: 14px;
152
+ font-weight: bold;
153
+ }
154
+ }
155
+ </style>
@@ -57,6 +57,15 @@
57
57
  {{ t("Listen to the latest episode") }}
58
58
  </div>
59
59
  </div>
60
+
61
+ <!-- Tag list -->
62
+ <TagList
63
+ v-if="undefined !== emission.tags && 0 !== emission.tags.length"
64
+ :tag-list="emission.tags"
65
+ :orga-id="authOrgaId"
66
+ :emission-annotations="emission.annotations"
67
+ />
68
+
60
69
  <SubscribeButtons
61
70
  v-if="isPodcastmaker"
62
71
  class="mt-4"
@@ -160,6 +169,7 @@ const PodcastPlayButton = defineAsyncComponent(
160
169
  const PodcastmakerHeader = defineAsyncComponent(
161
170
  () => import("../display/podcastmaker/PodcastmakerHeader.vue"),
162
171
  );
172
+ const TagList = defineAsyncComponent(() => import("../display/podcasts/TagList.vue"));
163
173
 
164
174
 
165
175
  //Props
@@ -228,6 +238,11 @@ async function getEmissionDetails(): Promise<void> {
228
238
  loaded.value = false;
229
239
  error.value = false;
230
240
  try {
241
+ const reponse = await classicApi.fetchData<Emission>({
242
+ api: 0,
243
+ path: "emission/" + props.emissionId,
244
+ });
245
+ console.log(reponse);
231
246
  emission.value = await classicApi.fetchData<Emission>({
232
247
  api: 0,
233
248
  path: "emission/" + props.emissionId,
@@ -1,40 +1,42 @@
1
1
  <template>
2
- <section v-if="isInit" class="page-box">
3
- <slot name="new-emission" />
4
- <ProductorSearch
5
- v-model:organisation-id="organisationId"
6
- v-model:search-pattern="searchPattern"
7
- type="emission"
8
- />
9
- <AdvancedSearch
10
- v-model:monetisable="monetisable"
11
- v-model:iab-id="iabId"
12
- v-model:sort="sort"
13
- v-model:include-hidden="includeHidden"
14
- v-model:from-date="fromDate"
15
- v-model:to-date="toDate"
16
- v-model:rubrique-filter="rubriqueFilter"
17
- :search-pattern="searchPattern"
18
- :is-emission="true"
19
- :organisation-id="organisationId"
20
- />
21
- <EmissionList
22
- :show-count="true"
23
- :first="paginateFirst"
24
- :size="ps"
25
- :query="searchMinSize"
26
- :organisation-id="organisationId"
27
- :monetisable="monetisable"
28
- :before="toDate"
29
- :after="fromDate"
30
- :sort="sort"
31
- :include-hidden="includeHidden"
32
- :iab-id="iabId"
33
- :rubrique-id="rubriquesFilterArrayIds.rubriqueId"
34
- :rubriquage-id="rubriquesFilterArrayIds.rubriquageId"
35
- :no-rubriquage-id="rubriquesFilterArrayIds.noRubriquageId"
36
- />
37
- </section>
2
+ <section v-if="isInit" class="page-box">
3
+ <slot name="new-emission" />
4
+ <ProductorSearch
5
+ v-model:organisation-id="organisationId"
6
+ v-model:search-pattern="searchPattern"
7
+ type="emission"
8
+ />
9
+ <AdvancedSearch
10
+ v-model:monetisable="monetisable"
11
+ v-model:iab-id="iabId"
12
+ v-model:sort="sort"
13
+ v-model:include-hidden="includeHidden"
14
+ v-model:from-date="fromDate"
15
+ v-model:to-date="toDate"
16
+ v-model:rubrique-filter="rubriqueFilter"
17
+ v-model:beneficiaries="beneficiaries"
18
+ :search-pattern="searchPattern"
19
+ :is-emission="true"
20
+ :organisation-id="organisationId"
21
+ />
22
+ <EmissionList
23
+ :show-count="true"
24
+ :first="paginateFirst"
25
+ :size="ps"
26
+ :query="searchMinSize"
27
+ :organisation-id="organisationId"
28
+ :monetisable="monetisable"
29
+ :before="toDate"
30
+ :after="fromDate"
31
+ :sort="sort"
32
+ :include-hidden="includeHidden"
33
+ :iab-id="iabId"
34
+ :rubrique-id="rubriquesFilterArrayIds.rubriqueId"
35
+ :rubriquage-id="rubriquesFilterArrayIds.rubriquageId"
36
+ :no-rubriquage-id="rubriquesFilterArrayIds.noRubriquageId"
37
+ :beneficiaries="beneficiaries"
38
+ />
39
+ </section>
38
40
  </template>
39
41
 
40
42
  <script setup lang="ts">
@@ -43,38 +45,41 @@ import AdvancedSearch from "../display/filter/AdvancedSearch.vue";
43
45
  import {useAdvancedParamInit} from "../composable/route/useAdvancedParamInit";
44
46
  import { defineAsyncComponent } from "vue";
45
47
  const ProductorSearch = defineAsyncComponent(
46
- () => import("../display/filter/ProductorSearch.vue"),
48
+ () => import("../display/filter/ProductorSearch.vue"),
47
49
  );
48
50
 
49
51
  //Props
50
52
  const props = defineProps({
51
- pr: { default: 0, type: Number },
52
- ps: { default: 30, type: Number },
53
- routeQuery: { default: "", type: String },
54
- routeMonetisable: { default: "UNDEFINED", type: String },
55
- routeIab: { default: undefined, type: Number },
56
- routeSort: { default: "LAST_PODCAST_DESC", type: String },
57
- routeIncludeHidden: { default: "", type: String },
58
- routeFrom: { default: undefined, type: String },
59
- routeTo: { default: undefined, type: String },
60
- routeOrga: { default: undefined, type: String },
61
- routeRubriques: { default: "", type: String },
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> }
62
66
  });
63
67
 
64
68
  //Composables
65
69
  const {
66
- organisationId,
67
- searchPattern,
68
- monetisable,
69
- iabId,
70
- sort,
71
- includeHidden,
72
- fromDate,
73
- toDate,
74
- rubriqueFilter,
75
- searchMinSize,
76
- paginateFirst,
77
- rubriquesFilterArrayIds,
78
- isInit
70
+ organisationId,
71
+ searchPattern,
72
+ monetisable,
73
+ iabId,
74
+ sort,
75
+ includeHidden,
76
+ fromDate,
77
+ toDate,
78
+ rubriqueFilter,
79
+ searchMinSize,
80
+ paginateFirst,
81
+ rubriquesFilterArrayIds,
82
+ isInit,
83
+ beneficiaries
79
84
  } = useAdvancedParamInit(props, true);
80
85
  </script>
@@ -1,42 +1,44 @@
1
1
  <template>
2
- <section v-if="isInit" class="page-box">
3
- <ProductorSearch
4
- v-model:organisation-id="organisationId"
5
- v-model:search-pattern="searchPattern"
6
- />
7
- <AdvancedSearch
8
- v-model:only-video="onlyVideo"
9
- v-model:monetisable="monetisable"
10
- v-model:iab-id="iabId"
11
- v-model:sort="sort"
12
- v-model:include-hidden="includeHidden"
13
- v-model:from-date="fromDate"
14
- v-model:to-date="toDate"
15
- v-model:validity="validity"
16
- v-model:rubrique-filter="rubriqueFilter"
17
- :search-pattern="searchPattern"
18
- :is-emission="false"
19
- :organisation-id="organisationId"
20
- />
21
- <PodcastList
22
- :show-count="true"
23
- :first="paginateFirst"
24
- :size="ps"
25
- :organisation-id="orgaArray"
26
- :query="searchMinSize"
27
- :monetisable="monetisable"
28
- :before="toDate"
29
- :after="fromDate"
30
- :sort-criteria="sort"
31
- :include-hidden="includeHidden"
32
- :iab-id="iabId"
33
- :rubrique-id="rubriquesFilterArrayIds.rubriqueId"
34
- :rubriquage-id="rubriquesFilterArrayIds.rubriquageId"
35
- :no-rubriquage-id="rubriquesFilterArrayIds.noRubriquageId"
36
- :with-video="withVideo"
37
- :validity="validity"
38
- />
39
- </section>
2
+ <section v-if="isInit" class="page-box">
3
+ <ProductorSearch
4
+ v-model:organisation-id="organisationId"
5
+ v-model:search-pattern="searchPattern"
6
+ />
7
+ <AdvancedSearch
8
+ v-model:only-video="onlyVideo"
9
+ v-model:monetisable="monetisable"
10
+ v-model:iab-id="iabId"
11
+ v-model:sort="sort"
12
+ v-model:include-hidden="includeHidden"
13
+ v-model:from-date="fromDate"
14
+ v-model:to-date="toDate"
15
+ v-model:validity="validity"
16
+ v-model:rubrique-filter="rubriqueFilter"
17
+ v-model:beneficiaries="beneficiaries"
18
+ :search-pattern="searchPattern"
19
+ :is-emission="false"
20
+ :organisation-id="organisationId"
21
+ />
22
+ <PodcastList
23
+ :show-count="true"
24
+ :first="paginateFirst"
25
+ :size="ps"
26
+ :organisation-id="orgaArray"
27
+ :query="searchMinSize"
28
+ :monetisable="monetisable"
29
+ :before="toDate"
30
+ :after="fromDate"
31
+ :sort-criteria="sort"
32
+ :include-hidden="includeHidden"
33
+ :iab-id="iabId"
34
+ :rubrique-id="rubriquesFilterArrayIds.rubriqueId"
35
+ :rubriquage-id="rubriquesFilterArrayIds.rubriquageId"
36
+ :no-rubriquage-id="rubriquesFilterArrayIds.noRubriquageId"
37
+ :beneficiaries="beneficiaries"
38
+ :with-video="withVideo"
39
+ :validity="validity"
40
+ />
41
+ </section>
40
42
  </template>
41
43
 
42
44
  <script setup lang="ts">
@@ -48,19 +50,21 @@ import { computed, ref, watch } from "vue";
48
50
 
49
51
  //Props
50
52
  const props = defineProps({
51
- pr: { default: 0, type: Number },
52
- ps: { default: 30, type: Number },
53
- routeQuery: { default: "", type: String },
54
- routeMonetisable: { default: "UNDEFINED", type: String },
55
- routeIab: { default: undefined, type: Number },
56
- routeSort: { default: "DATE", type: String },
57
- routeIncludeHidden: { default: "", type: String },
58
- routeFrom: { default: undefined, type: String },
59
- routeTo: { default: undefined, type: String },
60
- routeValidity: { default: "", type: String },
61
- routeOnlyVideo: { default: "", type: String },
62
- routeOrga: { default: undefined, type: String },
63
- routeRubriques: { default: "", type: String },
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> }
64
68
  });
65
69
 
66
70
 
@@ -70,20 +74,21 @@ const onlyVideo = ref(false);
70
74
 
71
75
  //Composables
72
76
  const {
73
- organisationId,
74
- searchPattern,
75
- monetisable,
76
- iabId,
77
- sort,
78
- includeHidden,
79
- fromDate,
80
- toDate,
81
- rubriqueFilter,
82
- searchMinSize,
83
- paginateFirst,
84
- validity,
85
- rubriquesFilterArrayIds,
86
- isInit
77
+ organisationId,
78
+ searchPattern,
79
+ monetisable,
80
+ iabId,
81
+ sort,
82
+ includeHidden,
83
+ fromDate,
84
+ toDate,
85
+ rubriqueFilter,
86
+ searchMinSize,
87
+ paginateFirst,
88
+ validity,
89
+ rubriquesFilterArrayIds,
90
+ isInit,
91
+ beneficiaries
87
92
  } = useAdvancedParamInit(props, false);
88
93
 
89
94
  //Computed
@@ -93,7 +98,7 @@ const withVideo = computed(() => false === onlyVideo.value ? undefined : true);
93
98
 
94
99
  //Watch
95
100
  watch(() => props.routeOnlyVideo, () =>{
96
- onlyVideo.value = "true" === props.routeOnlyVideo;
101
+ onlyVideo.value = "true" === props.routeOnlyVideo;
97
102
  }, {immediate: true});
98
103
 
99
104
  </script>
package/src/locale/de.ts CHANGED
@@ -417,4 +417,5 @@ export default {
417
417
  "Silent stream":"Stiller Fluss",
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
+ "Filters - Beneficiaries": "Nach Referenzen der Rechteinhaber",
420
421
  }
package/src/locale/en.ts CHANGED
@@ -420,4 +420,5 @@ export default {
420
420
  "Silent stream":"Silent stream",
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
+ "Filters - Beneficiaries": "By rights holder references",
423
424
  };
package/src/locale/es.ts CHANGED
@@ -418,4 +418,5 @@ export default {
418
418
  "Silent stream":"Flujo silencioso",
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
+ "Filters - Beneficiaries": "Por referencias de titulares de derechos",
421
422
  }
package/src/locale/fr.ts CHANGED
@@ -426,5 +426,6 @@ export default {
426
426
  "Color of the QR Code": "Couleur du Qr Code",
427
427
  "Silent stream":"Flux silencieux",
428
428
  "Emission - Not available for listeners": "Émission non visible pour les auditeurs",
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."
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
431
  };
package/src/locale/it.ts CHANGED
@@ -414,4 +414,5 @@ export default{
414
414
  "Silent stream":"Flusso silenzioso",
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
+ "Filters - Beneficiaries": "Per riferimenti del titolare dei diritti",
417
418
  };
package/src/locale/sl.ts CHANGED
@@ -409,4 +409,5 @@ export default {
409
409
  "Silent stream":"Tihi tok",
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
+ "Filters - Beneficiaries": "Po referencah imetnikov pravic",
412
413
  }
@@ -9,6 +9,8 @@ import { AuthStore } from "../stores/AuthStore";
9
9
  import fetchHelper from "@/helper/fetchHelper";
10
10
  import { setupRouter } from "./utils";
11
11
 
12
+ import { ROUTE_PARAMS } from "../components/composable/route/useRouteUpdateParams";
13
+
12
14
  /*--------------------------------------------------------------------------
13
15
  Composants publics
14
16
  --------------------------------------------------------------------------*/
@@ -96,6 +98,7 @@ const routes: Array<RouteRecordRaw> = [
96
98
  routeOnlyVideo:route.query.v ?? "",
97
99
  routeOrga:route.query.o,
98
100
  routeRubriques :route.query.r ?? route.query.rubriquesId,
101
+ routeBeneficiaries: route.query[ROUTE_PARAMS.Beneficiaries],
99
102
  }),
100
103
  meta:{
101
104
  title: "Podcasts",
@@ -117,6 +120,7 @@ const routes: Array<RouteRecordRaw> = [
117
120
  routeTo: route.query.to,
118
121
  routeOrga:route.query.o,
119
122
  routeRubriques :route.query.r ?? route.query.rubriquesId,
123
+ routeBeneficiaries: route.query[ROUTE_PARAMS.Beneficiaries],
120
124
  }),
121
125
  meta:{
122
126
  title: "Emissions",
@@ -32,6 +32,8 @@ export interface Emission {
32
32
  * *Default: true*
33
33
  */
34
34
  visible?: boolean;
35
+ /** An optional list of tags */
36
+ tags?: string[];
35
37
  }
36
38
 
37
39
  export function emptyEmissionData(): Emission {
@@ -37,7 +37,9 @@ export interface Podcast {
37
37
  rssEpisode?:string;
38
38
  score?: number;
39
39
  size?: number;
40
+ /** An optional list of tags */
40
41
  tags?: Array<string>;
42
+ /** An optional list of tags for OuestFrance */
41
43
  ofTags?: Array<string>;
42
44
  title: string;
43
45
  weekDownloadCount?: number;