@saooti/octopus-sdk 40.2.0-SNAPSHOT → 40.2.2-SNAPSHOT
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +1 -0
- package/package.json +1 -1
- package/src/components/display/live/LiveList.vue +1 -1
- package/src/components/display/live/RadioList.vue +1 -1
- package/src/components/display/podcasts/PodcastModuleBox.vue +120 -122
- package/src/components/display/sharing/ShareAnonymous.vue +0 -1
- package/src/components/display/sharing/ShareDistribution.vue +8 -27
- package/src/components/display/sharing/ShareNewsletter.vue +10 -21
- package/src/components/display/sharing/ShareSocialsButtons.vue +0 -30
- package/src/components/form/ClassicCopyButton.vue +65 -0
- package/src/components/misc/ClassicNav.vue +1 -2
- package/src/components/misc/modal/ClipboardModal.vue +9 -11
- package/src/components/pages/EmissionPage.vue +37 -39
- package/src/components/pages/PlaylistPage.vue +1 -1
- package/src/components/pages/RadioPage.vue +1 -1
- package/src/components/pages/VideoPage.vue +0 -1
- 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 +2 -0
- package/src/locale/it.ts +2 -0
- package/src/locale/sl.ts +2 -0
- package/src/style/bootstrap.scss +6 -14
package/index.ts
CHANGED
|
@@ -95,6 +95,7 @@ export const getClassicInputText = () => import("./src/components/form/ClassicIn
|
|
|
95
95
|
export const getClassicEmojiPicker = () => import("./src/components/form/ClassicEmojiPicker.vue");
|
|
96
96
|
export const getClassicContentEditable = () => import("./src/components/form/ClassicContentEditable.vue");
|
|
97
97
|
export const getSwiperList = () => import("./src/components/display/list/SwiperList.vue");
|
|
98
|
+
export const getClassicCopyButton = () => import("./src/components/form/ClassicCopyButton.vue");
|
|
98
99
|
|
|
99
100
|
|
|
100
101
|
//Composable
|
package/package.json
CHANGED
|
@@ -1,118 +1,130 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<section v-if="podcast" class="module-box">
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
<RecordingItemButton
|
|
4
|
+
v-if="!!podcastConference && isLiveReadyToRecord && isOctopusAndAnimator"
|
|
5
|
+
:podcast="podcast"
|
|
6
|
+
:live="true"
|
|
7
|
+
:recording="podcastConference"
|
|
8
|
+
@delete-item="removeDeleted"
|
|
9
|
+
@validate-podcast="$emit('updatePodcast', $event)"
|
|
10
|
+
/>
|
|
11
|
+
<EditBox
|
|
12
|
+
v-else-if="editRight && isEditBox"
|
|
13
|
+
:podcast="podcast"
|
|
14
|
+
:display-studio-access="isDebriefing"
|
|
15
|
+
@validate-podcast="$emit('updatePodcast', $event)"
|
|
16
|
+
/>
|
|
17
|
+
<div class="mb-2 w-100">
|
|
18
|
+
<PodcastImage
|
|
19
|
+
:class="[
|
|
20
|
+
isLiveReadyToRecord &&
|
|
21
|
+
podcastConference &&
|
|
22
|
+
'null' !== podcastConference &&
|
|
23
|
+
podcastConference.status
|
|
24
|
+
? podcastConference.status.toLowerCase() + '-shadow'
|
|
25
|
+
: '',
|
|
26
|
+
]"
|
|
27
|
+
class="me-3"
|
|
28
|
+
:hide-play="isLiveReadyToRecord"
|
|
29
|
+
:podcast="podcast"
|
|
30
|
+
:playing-podcast="playingPodcast"
|
|
31
|
+
:fetch-conference="podcastConference"
|
|
32
|
+
:is-animator-live="isOctopusAndAnimator"
|
|
33
|
+
/>
|
|
34
|
+
<div class="d-flex justify-content-between flex-wrap mb-2">
|
|
35
|
+
<time
|
|
36
|
+
v-if="0 !== date.length" :class="!isLiveReady ? 'me-5' : ''"
|
|
37
|
+
:datetime="podcast.pubDate">
|
|
38
|
+
{{ date }}
|
|
39
|
+
</time>
|
|
40
|
+
<div v-if="isLiveReady" class="text-danger">
|
|
41
|
+
{{ $t("Episode record in live") }}
|
|
42
|
+
</div>
|
|
43
|
+
<div class="d-flex flex-column align-items-end flex-grow-1">
|
|
44
|
+
<time :datetime="durationIso">
|
|
45
|
+
{{ duration }}
|
|
26
46
|
</time>
|
|
27
|
-
<
|
|
28
|
-
{{ $t("Episode record in live") }}
|
|
29
|
-
</div>
|
|
30
|
-
<div class="d-flex flex-column align-items-end flex-grow-1">
|
|
31
|
-
<time :datetime="durationIso">
|
|
32
|
-
{{ duration }}
|
|
33
|
-
</time>
|
|
34
|
-
<ShareAnonymous v-if="!editRight" :podcast="podcast" :organisation-id="podcast.organisation.id"/>
|
|
35
|
-
</div>
|
|
47
|
+
<ShareAnonymous v-if="!editRight" :podcast="podcast" :organisation-id="podcast.organisation.id"/>
|
|
36
48
|
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
</div>
|
|
50
|
+
<h2 class="mb-3">
|
|
51
|
+
{{ podcast.title }}
|
|
52
|
+
</h2>
|
|
53
|
+
<PodcastPlannedSpinner v-if="isPlannedInProcessor"/>
|
|
54
|
+
<Countdown v-if="isCounter" :time-remaining="timeRemaining" />
|
|
55
|
+
<!-- eslint-disable vue/no-v-html -->
|
|
56
|
+
<div
|
|
57
|
+
class="description-text html-wysiwyg-content"
|
|
58
|
+
v-html="urlify(podcast.description)"
|
|
59
|
+
/>
|
|
60
|
+
<!-- eslint-enable -->
|
|
61
|
+
<div class="my-3">
|
|
62
|
+
<div class="mb-1">
|
|
63
|
+
{{ $t("Emission") + " : " }}
|
|
64
|
+
<router-link
|
|
65
|
+
:to="{
|
|
66
|
+
name: 'emission',
|
|
67
|
+
params: { emissionId: podcast.emission.emissionId },
|
|
68
|
+
}"
|
|
69
|
+
:title="$t('Series name page', { name: podcast.emission.name })"
|
|
70
|
+
>
|
|
71
|
+
{{ podcast.emission.name }}
|
|
72
|
+
</router-link>
|
|
73
|
+
</div>
|
|
74
|
+
<ParticipantDescription :participants="podcast.animators" />
|
|
75
|
+
<ParticipantDescription
|
|
76
|
+
:participants="podcast.guests"
|
|
77
|
+
:is-guest="true"
|
|
46
78
|
/>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
:
|
|
53
|
-
|
|
54
|
-
params: { emissionId: podcast.emission.emissionId },
|
|
55
|
-
}"
|
|
56
|
-
:title="$t('Series name page', { name: podcast.emission.name })"
|
|
57
|
-
>
|
|
58
|
-
{{ podcast.emission.name }}
|
|
59
|
-
</router-link>
|
|
60
|
-
</div>
|
|
61
|
-
<ParticipantDescription :participants="podcast.animators" />
|
|
62
|
-
<ParticipantDescription
|
|
63
|
-
:participants="podcast.guests"
|
|
64
|
-
:is-guest="true"
|
|
65
|
-
/>
|
|
66
|
-
<div v-if="!isPodcastmaker" class="mb-1">
|
|
67
|
-
{{ $t("Producted by : ") }}
|
|
68
|
-
<router-link
|
|
69
|
-
:to="{
|
|
70
|
-
name: 'productor',
|
|
71
|
-
params: { productorId: podcast.organisation.id },
|
|
72
|
-
}"
|
|
73
|
-
>
|
|
74
|
-
{{ podcast.organisation.name }}
|
|
75
|
-
</router-link>
|
|
76
|
-
</div>
|
|
77
|
-
<div v-if="'' !== photoCredit" class="mb-1">
|
|
78
|
-
{{ $t("Photo credits") + " : " + photoCredit }}
|
|
79
|
-
</div>
|
|
80
|
-
<div v-if="'' !== audioCredit" class="mb-1">
|
|
81
|
-
{{ $t("Audio credits") + " : " + audioCredit }}
|
|
82
|
-
</div>
|
|
83
|
-
<div v-if="'' !== authorCredit" class="mb-1">
|
|
84
|
-
{{ $t("Author credits") + " : " + authorCredit }}
|
|
85
|
-
</div>
|
|
86
|
-
<a
|
|
87
|
-
v-if="podcast.article && !isGarRole"
|
|
88
|
-
class="btn d-flex align-items-center my-2 w-fit-content mb-1"
|
|
89
|
-
:href="podcast.article"
|
|
90
|
-
rel="noreferrer noopener"
|
|
91
|
-
target="_blank"
|
|
92
|
-
:title="$t('New window', {text : $t('See associated article')})"
|
|
79
|
+
<div v-if="!isPodcastmaker" class="mb-1">
|
|
80
|
+
{{ $t("Producted by : ") }}
|
|
81
|
+
<router-link
|
|
82
|
+
:to="{
|
|
83
|
+
name: 'productor',
|
|
84
|
+
params: { productorId: podcast.organisation.id },
|
|
85
|
+
}"
|
|
93
86
|
>
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
87
|
+
{{ podcast.organisation.name }}
|
|
88
|
+
</router-link>
|
|
89
|
+
</div>
|
|
90
|
+
<div v-if="'' !== photoCredit" class="mb-1">
|
|
91
|
+
{{ $t("Photo credits") + " : " + photoCredit }}
|
|
92
|
+
</div>
|
|
93
|
+
<div v-if="'' !== audioCredit" class="mb-1">
|
|
94
|
+
{{ $t("Audio credits") + " : " + audioCredit }}
|
|
95
|
+
</div>
|
|
96
|
+
<div v-if="'' !== authorCredit" class="mb-1">
|
|
97
|
+
{{ $t("Author credits") + " : " + authorCredit }}
|
|
98
|
+
</div>
|
|
99
|
+
<a
|
|
100
|
+
v-if="podcast.article && !isGarRole"
|
|
101
|
+
class="btn d-flex align-items-center my-2 w-fit-content mb-1"
|
|
102
|
+
:href="podcast.article"
|
|
103
|
+
rel="noreferrer noopener"
|
|
104
|
+
target="_blank"
|
|
105
|
+
:title="$t('New window', {text : $t('See associated article')})"
|
|
106
|
+
>
|
|
107
|
+
<NewspaperVariantOutlineIcon class="me-1" />
|
|
108
|
+
<div>{{ $t("See associated article") }}</div>
|
|
109
|
+
</a>
|
|
110
|
+
<PodcastPlayBar
|
|
111
|
+
v-if="isProgressBar"
|
|
112
|
+
:podcast="podcast"
|
|
113
|
+
/>
|
|
114
|
+
<div v-if="editRight && !isPodcastmaker">
|
|
115
|
+
<div
|
|
116
|
+
v-if="
|
|
117
|
+
podcast.annotations && 'RSS' === podcast.annotations.SOURCE_KIND
|
|
118
|
+
"
|
|
119
|
+
class="me-5 text-secondary"
|
|
120
|
+
>
|
|
121
|
+
{{ $t("From RSS") }}
|
|
115
122
|
</div>
|
|
123
|
+
<ErrorMessage v-if="'' !== errorMessage" :message="errorMessage" />
|
|
124
|
+
</div>
|
|
125
|
+
<div class="d-flex align-items-center flex-wrap">
|
|
126
|
+
<LikeSection :edit-right="editRight" :podcast="podcast" />
|
|
127
|
+
<DownloadPodcastButton v-if="isDownloadButton" :podcast="podcast" />
|
|
116
128
|
</div>
|
|
117
129
|
</div>
|
|
118
130
|
</div>
|
|
@@ -135,20 +147,6 @@
|
|
|
135
147
|
:window-width="1000"
|
|
136
148
|
:justify-center="false"
|
|
137
149
|
/>
|
|
138
|
-
<RecordingItemButton
|
|
139
|
-
v-if="!!podcastConference && isLiveReadyToRecord && isOctopusAndAnimator"
|
|
140
|
-
:podcast="podcast"
|
|
141
|
-
:live="true"
|
|
142
|
-
:recording="podcastConference"
|
|
143
|
-
@delete-item="removeDeleted"
|
|
144
|
-
@validate-podcast="$emit('updatePodcast', $event)"
|
|
145
|
-
/>
|
|
146
|
-
<EditBox
|
|
147
|
-
v-else-if="editRight && isEditBox"
|
|
148
|
-
:podcast="podcast"
|
|
149
|
-
:display-studio-access="isDebriefing"
|
|
150
|
-
@validate-podcast="$emit('updatePodcast', $event)"
|
|
151
|
-
/>
|
|
152
150
|
</section>
|
|
153
151
|
</template>
|
|
154
152
|
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
<div class="text-primary hide-small-screen text-break">
|
|
9
9
|
{{ rss }}
|
|
10
10
|
</div>
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
<ClassicCopyButton
|
|
12
|
+
:text="$t('Copy')"
|
|
13
|
+
:text-after-copy="$t('Copied!')"
|
|
14
|
+
:data-to-copy="rss"
|
|
15
|
+
:snackbar-text="$t('Link in clipboard')"
|
|
16
|
+
/>
|
|
14
17
|
</div>
|
|
15
18
|
<RssSection v-if="emission" :emission="emission" />
|
|
16
19
|
<div class="sharing-distribution-container">
|
|
@@ -27,15 +30,11 @@
|
|
|
27
30
|
/>{{ platform.title }}
|
|
28
31
|
</router-link>
|
|
29
32
|
</div>
|
|
30
|
-
<SnackBar
|
|
31
|
-
v-if="lazyLoadingSnackbar"
|
|
32
|
-
ref="snackbar"
|
|
33
|
-
position="bottom-left"
|
|
34
|
-
/>
|
|
35
33
|
</section>
|
|
36
34
|
</template>
|
|
37
35
|
|
|
38
36
|
<script lang="ts">
|
|
37
|
+
import ClassicCopyButton from "../../form/ClassicCopyButton.vue";
|
|
39
38
|
import RadiolineIcon from "../../icons/RadiolineIcon.vue";
|
|
40
39
|
import TuninIcon from "../../icons/TuninIcon.vue";
|
|
41
40
|
import PodcastAddictIcon from "../../icons/PodcastAddictIcon.vue";
|
|
@@ -49,8 +48,6 @@ import YoutubeIcon from "vue-material-design-icons/Youtube.vue";
|
|
|
49
48
|
import SpotifyIcon from "vue-material-design-icons/Spotify.vue";
|
|
50
49
|
import { useApiStore } from "../../../stores/ApiStore";
|
|
51
50
|
import classicApi from "../../../api/classicApi";
|
|
52
|
-
import SnackBar from "../../misc/SnackBar.vue";
|
|
53
|
-
import displayHelper from "../../../helper/displayHelper";
|
|
54
51
|
import { Emission } from "@/stores/class/general/emission";
|
|
55
52
|
|
|
56
53
|
import { defineComponent, defineAsyncComponent } from "vue";
|
|
@@ -60,7 +57,6 @@ const RssSection = defineAsyncComponent(
|
|
|
60
57
|
);
|
|
61
58
|
export default defineComponent({
|
|
62
59
|
components: {
|
|
63
|
-
SnackBar,
|
|
64
60
|
RssSection,
|
|
65
61
|
SpotifyIcon,
|
|
66
62
|
YoutubeIcon,
|
|
@@ -73,6 +69,7 @@ export default defineComponent({
|
|
|
73
69
|
PodcastAddictIcon,
|
|
74
70
|
TuninIcon,
|
|
75
71
|
RadiolineIcon,
|
|
72
|
+
ClassicCopyButton
|
|
76
73
|
},
|
|
77
74
|
props: {
|
|
78
75
|
emissionId: { default: undefined, type: Number },
|
|
@@ -82,7 +79,6 @@ export default defineComponent({
|
|
|
82
79
|
return {
|
|
83
80
|
emission: undefined as Emission | undefined,
|
|
84
81
|
rss: "" as string,
|
|
85
|
-
lazyLoadingSnackbar: false as boolean,
|
|
86
82
|
};
|
|
87
83
|
},
|
|
88
84
|
computed: {
|
|
@@ -159,9 +155,6 @@ export default defineComponent({
|
|
|
159
155
|
},
|
|
160
156
|
|
|
161
157
|
methods: {
|
|
162
|
-
onCopyCode(link: string, callback: () => void){
|
|
163
|
-
displayHelper.onCopyCode(link, callback);
|
|
164
|
-
},
|
|
165
158
|
getUrl(platform: string): string {
|
|
166
159
|
return `/main/priv/distribution/${platform}/${this.emissionId}`;
|
|
167
160
|
},
|
|
@@ -175,18 +168,6 @@ export default defineComponent({
|
|
|
175
168
|
if (!this.$props.emissionId || this.$props.emissionId <= 0) return;
|
|
176
169
|
this.rss = `${this.apiUrl}rss/emission/${this.emissionId}.rss`;
|
|
177
170
|
},
|
|
178
|
-
afterCopy(): void {
|
|
179
|
-
if (!this.lazyLoadingSnackbar) {
|
|
180
|
-
this.lazyLoadingSnackbar = true;
|
|
181
|
-
setTimeout(() => {
|
|
182
|
-
this.afterCopy();
|
|
183
|
-
}, 500);
|
|
184
|
-
} else {
|
|
185
|
-
(this.$refs.snackbar as InstanceType<typeof SnackBar>).open(
|
|
186
|
-
this.$t("Link in clipboard"),
|
|
187
|
-
);
|
|
188
|
-
}
|
|
189
|
-
},
|
|
190
171
|
},
|
|
191
172
|
});
|
|
192
173
|
</script>
|
|
@@ -31,22 +31,19 @@
|
|
|
31
31
|
<div class="border p-3" v-html="newsletterHtml" />
|
|
32
32
|
<!-- eslint-enable -->
|
|
33
33
|
</div>
|
|
34
|
-
<
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
</button>
|
|
34
|
+
<ClassicCopyButton
|
|
35
|
+
:text="$t('Copy code')"
|
|
36
|
+
:text-after-copy="$t('Code copied!')"
|
|
37
|
+
:data-to-copy="newsletterHtml"
|
|
38
|
+
/>
|
|
40
39
|
<div>{{ $t("And paste it in your newsletter") }}</div>
|
|
41
|
-
<SnackBar ref="snackbar" position="bottom-left" />
|
|
42
40
|
</div>
|
|
43
41
|
</template>
|
|
44
42
|
|
|
45
43
|
<script lang="ts">
|
|
46
|
-
import
|
|
44
|
+
import ClassicCopyButton from "../../form/ClassicCopyButton.vue";
|
|
47
45
|
import { VSwatches } from "vue3-swatches";
|
|
48
46
|
import "vue3-swatches/dist/style.css";
|
|
49
|
-
import displayHelper from "../../../helper/displayHelper";
|
|
50
47
|
import { Podcast } from "@/stores/class/general/podcast";
|
|
51
48
|
import { defineComponent } from "vue";
|
|
52
49
|
import { useSaveFetchStore } from "../../../stores/SaveFetchStore";
|
|
@@ -58,7 +55,7 @@ export default defineComponent({
|
|
|
58
55
|
name: "SahreNewsletter",
|
|
59
56
|
|
|
60
57
|
components: {
|
|
61
|
-
|
|
58
|
+
ClassicCopyButton,
|
|
62
59
|
VSwatches,
|
|
63
60
|
},
|
|
64
61
|
|
|
@@ -98,10 +95,10 @@ export default defineComponent({
|
|
|
98
95
|
shareText: this.$t("Listen this episode"),
|
|
99
96
|
emissionHtml: `<tr><td style="padding:5px 0;">
|
|
100
97
|
<div style="display:flex; margin-top:5px;">
|
|
101
|
-
<div style="font-size:
|
|
98
|
+
<div style="font-size:16px; color:${
|
|
102
99
|
this.arrayColors[1].color
|
|
103
100
|
}; margin-right:5px;text-wrap: nowrap;">${this.$t("Emission")} :</div>
|
|
104
|
-
<a href="${this.shareUrl}" style="font-size:
|
|
101
|
+
<a href="${this.shareUrl}" style="font-size: 16px;color: ${
|
|
105
102
|
this.arrayColors[0].color
|
|
106
103
|
};overflow: hidden;text-overflow: ellipsis;white-space: nowrap;">${
|
|
107
104
|
this.podcast.emission.name
|
|
@@ -154,7 +151,7 @@ export default defineComponent({
|
|
|
154
151
|
<td valign="top" width="30%" rowspan="7" style="padding-right:5px;"><img width="100%" src="${
|
|
155
152
|
this.newsletterInfo.imageUrl
|
|
156
153
|
}" style="border-radius: 4px;"></td>
|
|
157
|
-
<td valign="top" width="70%" style="padding:5px 0;"><div style="margin-top:5px;font-size:
|
|
154
|
+
<td valign="top" width="70%" style="padding:5px 0;"><div style="margin-top:5px;font-size: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-weight:bold;${
|
|
158
155
|
this.newsletterInfo.colorTitle
|
|
159
156
|
}">${this.newsletterInfo.title}</div></td>
|
|
160
157
|
</tr>${this.newsletterInfo.emissionHtml}
|
|
@@ -184,14 +181,6 @@ export default defineComponent({
|
|
|
184
181
|
},
|
|
185
182
|
methods: {
|
|
186
183
|
...mapActions(useSaveFetchStore, ["getOrgaAttributes"]),
|
|
187
|
-
onCopyCode(link: string, callback: () => void){
|
|
188
|
-
displayHelper.onCopyCode(link, callback);
|
|
189
|
-
},
|
|
190
|
-
afterCopy(): void {
|
|
191
|
-
(this.$refs.snackbar as InstanceType<typeof SnackBar>).open(
|
|
192
|
-
this.$t("Data in clipboard"),
|
|
193
|
-
);
|
|
194
|
-
},
|
|
195
184
|
async initData(): Promise<void> {
|
|
196
185
|
const orgaId = this.authOrgaId;
|
|
197
186
|
if (!orgaId?.length) {
|
|
@@ -17,23 +17,6 @@
|
|
|
17
17
|
</a>
|
|
18
18
|
</template>
|
|
19
19
|
<slot name="additional-buttons"/>
|
|
20
|
-
<!-- <div v-if="shareAiAuth" class="d-flex flex-column ms-4">
|
|
21
|
-
<h3 class="mb-2">
|
|
22
|
-
{{ $t("Generate a social media post (with AI)") }}
|
|
23
|
-
</h3>
|
|
24
|
-
<div class="d-flex align-items-center justify-content-center">
|
|
25
|
-
<router-link
|
|
26
|
-
class="btn share-btn mb-2 text-dark"
|
|
27
|
-
:title="$t('Generate a social media post (with AI)')"
|
|
28
|
-
:to="{
|
|
29
|
-
name: 'advancedShare',
|
|
30
|
-
params: { podcastId: podcast.podcastId },
|
|
31
|
-
}"
|
|
32
|
-
>
|
|
33
|
-
<CreationIcon />
|
|
34
|
-
</router-link>
|
|
35
|
-
</div>
|
|
36
|
-
</div> -->
|
|
37
20
|
</div>
|
|
38
21
|
</section>
|
|
39
22
|
</template>
|
|
@@ -70,20 +53,7 @@ export default defineComponent({
|
|
|
70
53
|
...mapState(useAuthStore, [
|
|
71
54
|
"isGarRole",
|
|
72
55
|
"authOrgaId"
|
|
73
|
-
/* "authOrganisation",
|
|
74
|
-
"isRoleProduction" */
|
|
75
56
|
]),
|
|
76
|
-
/* shareAiAuth(): boolean {
|
|
77
|
-
return (
|
|
78
|
-
!this.isPodcastmaker &&
|
|
79
|
-
undefined !== this.authOrgaId &&
|
|
80
|
-
undefined !== this.podcast &&
|
|
81
|
-
this.isRoleProduction &&
|
|
82
|
-
(this.authOrganisation.attributes?.["openAi.active"] as
|
|
83
|
-
| string
|
|
84
|
-
| undefined) === "true"
|
|
85
|
-
);
|
|
86
|
-
}, */
|
|
87
57
|
arrayShareButtons() {
|
|
88
58
|
return [
|
|
89
59
|
{
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<button
|
|
4
|
+
:class="classBtn"
|
|
5
|
+
@click="onCopyCode(afterCopy)"
|
|
6
|
+
>
|
|
7
|
+
{{ textDisplayed }}
|
|
8
|
+
</button>
|
|
9
|
+
<SnackBar
|
|
10
|
+
v-if="lazyLoadingSnackbar"
|
|
11
|
+
ref="snackbar"
|
|
12
|
+
position="bottom-left"
|
|
13
|
+
/>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script lang="ts">
|
|
18
|
+
import SnackBar from "../misc/SnackBar.vue";
|
|
19
|
+
import displayHelper from "../../helper/displayHelper";
|
|
20
|
+
import { defineComponent } from "vue";
|
|
21
|
+
export default defineComponent({
|
|
22
|
+
name: "ClassicCopyButton",
|
|
23
|
+
|
|
24
|
+
components: {
|
|
25
|
+
SnackBar,
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
props: {
|
|
29
|
+
text: { default: undefined, type: String },
|
|
30
|
+
textAfterCopy: { default: undefined, type: String },
|
|
31
|
+
dataToCopy: { default: undefined, type: String },
|
|
32
|
+
snackbarText: { default: undefined, type: String },
|
|
33
|
+
classBtn: { default: "btn btn-primary w-fit-content my-3", type: String },
|
|
34
|
+
},
|
|
35
|
+
data() {
|
|
36
|
+
return {
|
|
37
|
+
hasBeenCopied: false as boolean,
|
|
38
|
+
lazyLoadingSnackbar: false as boolean,
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
computed:{
|
|
42
|
+
textDisplayed(){
|
|
43
|
+
return this.hasBeenCopied ? this.textAfterCopy : this.text;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
methods: {
|
|
47
|
+
onCopyCode(callback: () => void){
|
|
48
|
+
displayHelper.onCopyCode(this.dataToCopy??"", callback);
|
|
49
|
+
},
|
|
50
|
+
afterCopy(): void {
|
|
51
|
+
this.hasBeenCopied = true;
|
|
52
|
+
if (!this.lazyLoadingSnackbar) {
|
|
53
|
+
this.lazyLoadingSnackbar = true;
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
this.afterCopy();
|
|
56
|
+
}, 500);
|
|
57
|
+
} else {
|
|
58
|
+
(this.$refs.snackbar as InstanceType<typeof SnackBar>).open(
|
|
59
|
+
this.snackbarText ?? this.$t("Data in clipboard"),
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
@@ -96,7 +96,6 @@ export default defineComponent({
|
|
|
96
96
|
|
|
97
97
|
.octopus-nav.light .octopus-nav-item {
|
|
98
98
|
border: 0;
|
|
99
|
-
flex-grow: 0;
|
|
100
99
|
}
|
|
101
100
|
|
|
102
101
|
.octopus-nav-link {
|
|
@@ -127,7 +126,7 @@ export default defineComponent({
|
|
|
127
126
|
.octopus-nav.light .octopus-nav-link {
|
|
128
127
|
font-weight: bold;
|
|
129
128
|
background:var(--octopus-border-default);
|
|
130
|
-
|
|
129
|
+
&.active{
|
|
131
130
|
border-bottom-color: var(--octopus-primary);
|
|
132
131
|
background: transparent;
|
|
133
132
|
color: var(--octopus-primary);
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
<p class="d-flex justify-content-between align-items-center">
|
|
9
9
|
{{ $t("Rss feed:") }}
|
|
10
10
|
<span id="LINK">{{ link }}</span>
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
<ClassicCopyButton
|
|
12
|
+
:text="$t('Copy')"
|
|
13
|
+
:text-after-copy="$t('Copied!')"
|
|
14
|
+
:data-to-copy="link"
|
|
15
|
+
:snackbar-text="$t('Link in clipboard')"
|
|
16
|
+
/>
|
|
14
17
|
</p>
|
|
15
18
|
<RssSection
|
|
16
19
|
v-if="emission && undefined !== authOrgaId"
|
|
@@ -21,9 +24,9 @@
|
|
|
21
24
|
</template>
|
|
22
25
|
|
|
23
26
|
<script lang="ts">
|
|
27
|
+
import ClassicCopyButton from "../../form/ClassicCopyButton.vue";
|
|
24
28
|
import ClassicModal from "../modal/ClassicModal.vue";
|
|
25
29
|
import { Emission } from "@/stores/class/general/emission";
|
|
26
|
-
import displayHelper from "../../../helper/displayHelper";
|
|
27
30
|
import { defineComponent, defineAsyncComponent } from "vue";
|
|
28
31
|
import { useAuthStore } from "../../../stores/AuthStore";
|
|
29
32
|
import { mapState } from "pinia";
|
|
@@ -35,25 +38,20 @@ export default defineComponent({
|
|
|
35
38
|
components: {
|
|
36
39
|
RssSection,
|
|
37
40
|
ClassicModal,
|
|
41
|
+
ClassicCopyButton
|
|
38
42
|
},
|
|
39
43
|
props: {
|
|
40
44
|
link: { default: "", type: String },
|
|
41
45
|
emission: { default: undefined, type: Object as () => Emission },
|
|
42
46
|
},
|
|
43
|
-
emits: ["close"
|
|
47
|
+
emits: ["close"],
|
|
44
48
|
computed: {
|
|
45
49
|
...mapState(useAuthStore, ["authOrgaId"]),
|
|
46
50
|
},
|
|
47
51
|
methods: {
|
|
48
|
-
onCopyCode(link: string, callback: () => void){
|
|
49
|
-
displayHelper.onCopyCode(link, callback);
|
|
50
|
-
},
|
|
51
52
|
closePopup(): void {
|
|
52
53
|
this.$emit("close");
|
|
53
54
|
},
|
|
54
|
-
afterCopy(): void {
|
|
55
|
-
this.$emit("copy");
|
|
56
|
-
},
|
|
57
55
|
},
|
|
58
56
|
});
|
|
59
57
|
</script>
|
|
@@ -11,50 +11,48 @@
|
|
|
11
11
|
:class="isPodcastmaker ? 'page-element-podcastmaker' : ''"
|
|
12
12
|
>
|
|
13
13
|
<section class="module-box">
|
|
14
|
-
<div class="d-flex mb-2">
|
|
15
|
-
<div class="w-100">
|
|
16
|
-
<img
|
|
17
|
-
v-lazy="useProxyImageUrl(emission.imageUrl, '250')"
|
|
18
|
-
width="250"
|
|
19
|
-
height="250"
|
|
20
|
-
role="presentation"
|
|
21
|
-
alt=""
|
|
22
|
-
:title="$t('Emission name image', { name: name })"
|
|
23
|
-
class="img-box img-box-podcast mb-3 flex-column justify-content-start align-items-start position-relative flex-shrink-0 float-start me-3"
|
|
24
|
-
/>
|
|
25
|
-
<div class="d-flex align-items-center justify-content-between">
|
|
26
|
-
<h2>{{ name }}</h2>
|
|
27
|
-
<ShareAnonymous v-if="!editRight" class="d-flex justify-content-end flex-grow-1" :emission="emission" :organisation-id="emission.orga.id"/>
|
|
28
|
-
</div>
|
|
29
|
-
<!-- eslint-disable vue/no-v-html -->
|
|
30
|
-
<p
|
|
31
|
-
class="html-wysiwyg-content description-text"
|
|
32
|
-
v-html="urlify(description)"
|
|
33
|
-
/>
|
|
34
|
-
<!-- eslint-enable -->
|
|
35
|
-
<div v-if="lastPodcast" class="d-flex align-items-center mt-3">
|
|
36
|
-
<PodcastPlayButton
|
|
37
|
-
:podcast="lastPodcast"
|
|
38
|
-
:just-buttons="true"
|
|
39
|
-
/>
|
|
40
|
-
<div class="ms-2 fw-bold">
|
|
41
|
-
{{ $t("Listen to the latest episode") }}
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
<SubscribeButtons
|
|
45
|
-
v-if="isPodcastmaker"
|
|
46
|
-
class="mt-4"
|
|
47
|
-
:emission="emission"
|
|
48
|
-
:window-width="1000"
|
|
49
|
-
:justify-center="false"
|
|
50
|
-
/>
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
14
|
<EditBox
|
|
54
15
|
v-if="editRight && !isPodcastmaker"
|
|
55
16
|
:emission="emission"
|
|
56
17
|
@is-updated="getEmissionDetails"
|
|
57
18
|
/>
|
|
19
|
+
<div class="w-100 mb-2">
|
|
20
|
+
<img
|
|
21
|
+
v-lazy="useProxyImageUrl(emission.imageUrl, '250')"
|
|
22
|
+
width="250"
|
|
23
|
+
height="250"
|
|
24
|
+
role="presentation"
|
|
25
|
+
alt=""
|
|
26
|
+
:title="$t('Emission name image', { name: name })"
|
|
27
|
+
class="img-box img-box-podcast mb-3 flex-column justify-content-start align-items-start position-relative flex-shrink-0 float-start me-3"
|
|
28
|
+
/>
|
|
29
|
+
<div class="d-flex align-items-center justify-content-between">
|
|
30
|
+
<h2>{{ name }}</h2>
|
|
31
|
+
<ShareAnonymous v-if="!editRight" class="d-flex justify-content-end flex-grow-1" :emission="emission" :organisation-id="emission.orga.id"/>
|
|
32
|
+
</div>
|
|
33
|
+
<!-- eslint-disable vue/no-v-html -->
|
|
34
|
+
<p
|
|
35
|
+
class="html-wysiwyg-content description-text"
|
|
36
|
+
v-html="urlify(description)"
|
|
37
|
+
/>
|
|
38
|
+
<!-- eslint-enable -->
|
|
39
|
+
<div v-if="lastPodcast" class="d-flex align-items-center mt-3">
|
|
40
|
+
<PodcastPlayButton
|
|
41
|
+
:podcast="lastPodcast"
|
|
42
|
+
:just-buttons="true"
|
|
43
|
+
/>
|
|
44
|
+
<div class="ms-2 fw-bold">
|
|
45
|
+
{{ $t("Listen to the latest episode") }}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<SubscribeButtons
|
|
49
|
+
v-if="isPodcastmaker"
|
|
50
|
+
class="mt-4"
|
|
51
|
+
:emission="emission"
|
|
52
|
+
:window-width="1000"
|
|
53
|
+
:justify-center="false"
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
58
56
|
</section>
|
|
59
57
|
<ShareSocialsButtons
|
|
60
58
|
v-if="pageParameters.isShareButtons"
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
:class="isPodcastmaker ? 'page-element-podcastmaker' : ''"
|
|
12
12
|
>
|
|
13
13
|
<section class="module-box">
|
|
14
|
+
<EditBox v-if="editRight && !isPodcastmaker" :playlist="playlist" />
|
|
14
15
|
<div class="mb-5 mt-3 description-text">
|
|
15
16
|
<img
|
|
16
17
|
v-lazy="useProxyImageUrl(playlist.imageUrl, '250')"
|
|
@@ -29,7 +30,6 @@
|
|
|
29
30
|
<p class="html-wysiwyg-content" v-html="urlify(description)" />
|
|
30
31
|
<!-- eslint-enable -->
|
|
31
32
|
</div>
|
|
32
|
-
<EditBox v-if="editRight && !isPodcastmaker" :playlist="playlist" />
|
|
33
33
|
</section>
|
|
34
34
|
<SharePlayer
|
|
35
35
|
v-if="!isPodcastmaker && editRight"
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<RadioImage :radio="radio" />
|
|
17
17
|
<div class="d-flex align-items-center justify-content-between">
|
|
18
18
|
<h2>{{ radio.name }}</h2>
|
|
19
|
-
<ShareAnonymous
|
|
19
|
+
<ShareAnonymous class="d-flex justify-content-end flex-grow-1" :organisation-id="radio.organisationId"/>
|
|
20
20
|
</div>
|
|
21
21
|
<div v-if="radio.description">
|
|
22
22
|
{{ radio.description }}
|
|
@@ -96,7 +96,6 @@ import ClassicLoading from "../form/ClassicLoading.vue";
|
|
|
96
96
|
import classicApi from "../../api/classicApi";
|
|
97
97
|
import { Podcast } from "@/stores/class/general/podcast";
|
|
98
98
|
import ClassicNav from "../misc/ClassicNav.vue";
|
|
99
|
-
import {useErrorHandler} from "../composable/useErrorHandler";
|
|
100
99
|
import {useSeoTitleUrl} from "../composable/route/useSeoTitleUrl";
|
|
101
100
|
import {usePodcastView} from "../composable/podcasts/usePodcastView";
|
|
102
101
|
import { computed, defineAsyncComponent, onBeforeUnmount, Ref, ref, watch } from "vue";
|
package/src/locale/de.ts
CHANGED
package/src/locale/en.ts
CHANGED
package/src/locale/es.ts
CHANGED
package/src/locale/fr.ts
CHANGED
package/src/locale/it.ts
CHANGED
package/src/locale/sl.ts
CHANGED
package/src/style/bootstrap.scss
CHANGED
|
@@ -20,7 +20,7 @@ input:not([class^="vs__"]), button:not([class^="vs__"]), select:not([class^="vs_
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
h1,.h1{
|
|
23
|
-
font-size: 1.
|
|
23
|
+
font-size: 1.5rem;
|
|
24
24
|
text-align: center;
|
|
25
25
|
color: var(--octopus-gray-text);
|
|
26
26
|
margin-bottom: 1rem;
|
|
@@ -32,35 +32,27 @@ input:not([class^="vs__"]), button:not([class^="vs__"]), select:not([class^="vs_
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
h2,.h2{
|
|
35
|
-
font-size: 1.
|
|
35
|
+
font-size: 1.1rem;
|
|
36
36
|
|
|
37
37
|
@media (width <= 500px){
|
|
38
38
|
font-size: 1rem;
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
.big-h2{
|
|
43
|
-
font-size: 1.5rem;
|
|
44
|
-
|
|
45
|
-
@media (width <= 500px){
|
|
46
|
-
font-size: 1.1rem;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
42
|
h3,.h3{
|
|
51
|
-
font-size: 1.
|
|
43
|
+
font-size: 1.05rem;
|
|
52
44
|
}
|
|
53
45
|
|
|
54
46
|
h4,.h4{
|
|
55
|
-
font-size:
|
|
47
|
+
font-size: 1rem;
|
|
56
48
|
}
|
|
57
49
|
|
|
58
50
|
h5,.h5{
|
|
59
|
-
font-size: .
|
|
51
|
+
font-size: .80rem;
|
|
60
52
|
}
|
|
61
53
|
|
|
62
54
|
h6,.h6{
|
|
63
|
-
font-size: .
|
|
55
|
+
font-size: .60rem;
|
|
64
56
|
display: flex;
|
|
65
57
|
align-items: center;
|
|
66
58
|
font-weight: normal;
|