diff --git a/front/src/components/library/AlbumDropdown.vue b/front/src/components/library/AlbumDropdown.vue index 07b7b5a7674fe67243424916b4c79dfbd077f6f9..3cc42f6efb7b7538768022bf0a2d737469ae70f3 100644 --- a/front/src/components/library/AlbumDropdown.vue +++ b/front/src/components/library/AlbumDropdown.vue @@ -20,6 +20,15 @@ <button class="ui floating dropdown circular icon basic button" :title="labels.more" v-dropdown="{direction: 'downward'}"> <i class="ellipsis vertical icon"></i> <div class="menu"> + <a + :href="object.fid" + v-if="domain != $store.getters['instance/domain']" + target="_blank" + class="basic item"> + <i class="external icon"></i> + <translate :translate-params="{domain: domain}" translate-context="Content/*/Button.Label/Verb">View on %{ domain }</translate> + </a> + <div role="button" v-if="isEmbedable" @@ -86,6 +95,7 @@ import EmbedWizard from "@/components/audio/EmbedWizard" import Modal from '@/components/semantic/Modal' import ReportMixin from '@/components/mixins/Report' +import {getDomain} from '@/utils' export default { mixins: [ReportMixin], @@ -108,6 +118,11 @@ export default { } }, computed: { + domain () { + if (this.object) { + return getDomain(this.object.fid) + } + }, labels() { return { more: this.$pgettext('*/*/Button.Label/Noun', "Moreā¦"), diff --git a/front/src/components/library/ArtistBase.vue b/front/src/components/library/ArtistBase.vue index 35b0eb02f662bf4d59efe78c984a0e326ae6e15a..f23b1311ed65b115b2462233b7791ef7b35a0b7b 100644 --- a/front/src/components/library/ArtistBase.vue +++ b/front/src/components/library/ArtistBase.vue @@ -57,6 +57,15 @@ <button class="ui floating dropdown icon button" ref="dropdown" v-dropdown> <i class="dropdown icon"></i> <div class="menu"> + <a + :href="object.fid" + v-if="domain != $store.getters['instance/domain']" + target="_blank" + class="basic item"> + <i class="external icon"></i> + <translate :translate-params="{domain: domain}" translate-context="Content/*/Button.Label/Verb">View on %{ domain }</translate> + </a> + <button role="button" v-if="publicLibraries.length > 0" @@ -137,6 +146,8 @@ import RadioButton from "@/components/radios/Button" import TagsList from "@/components/tags/List" import ReportMixin from '@/components/mixins/Report' +import {getDomain} from '@/utils' + const FETCH_URL = "albums/" export default { @@ -205,6 +216,11 @@ export default { } }, computed: { + domain () { + if (this.object) { + return getDomain(this.object.fid) + } + }, isPlayable() { return ( this.object.albums.filter(a => { diff --git a/front/src/components/library/TrackBase.vue b/front/src/components/library/TrackBase.vue index cf9a93659845098b60d37c7441876b916f970372..18c2ff5e0f476013018415d2cf3316af2ad3dc4c 100644 --- a/front/src/components/library/TrackBase.vue +++ b/front/src/components/library/TrackBase.vue @@ -44,6 +44,14 @@ <button class="ui floating dropdown circular icon basic button" :title="labels.more" v-dropdown="{direction: 'downward'}"> <i class="ellipsis vertical icon"></i> <div class="menu" style="right: 0; left: auto"> + <a + :href="track.fid" + v-if="domain != $store.getters['instance/domain']" + target="_blank" + class="basic item"> + <i class="external icon"></i> + <translate :translate-params="{domain: domain}" translate-context="Content/*/Button.Label/Verb">View on %{ domain }</translate> + </a> <div role="button" v-if="publicLibraries.length > 0" @@ -116,6 +124,7 @@ import time from "@/utils/time" import axios from "axios" import url from "@/utils/url" +import {getDomain} from '@/utils' import logger from "@/logging" import PlayButton from "@/components/audio/PlayButton" import TrackFavoriteIcon from "@/components/favorites/TrackFavoriteIcon" @@ -190,6 +199,11 @@ export default { } }, computed: { + domain () { + if (this.track) { + return getDomain(this.track.fid) + } + }, publicLibraries () { return this.libraries.filter(l => { return l.privacy_level === 'everyone' diff --git a/front/src/utils.js b/front/src/utils.js index fb7117a20aeaca00dba89006aa0afb1493d8caf5..596ec07d53bdd33a11804e8e2345a453cf5ce284 100644 --- a/front/src/utils.js +++ b/front/src/utils.js @@ -51,3 +51,9 @@ export function checkRedirectToLogin (store, router) { router.push({name: 'login', query: {next: router.currentRoute.fullPath}}) } } + +export function getDomain (url) { + let parser = document.createElement("a") + parser.href = url + return parser.hostname +} \ No newline at end of file diff --git a/front/src/views/auth/ProfileBase.vue b/front/src/views/auth/ProfileBase.vue index 2569e2ce0458b69877e1805943b52d85cdafde9c..f776322bf14c1f0590178a774e7812f6d3d46663 100644 --- a/front/src/views/auth/ProfileBase.vue +++ b/front/src/views/auth/ProfileBase.vue @@ -9,6 +9,14 @@ <button class="ui pointing dropdown icon small basic right floated button" ref="dropdown" v-dropdown="{direction: 'downward'}" style="position: absolute; right: 1em; top: 1em;"> <i class="ellipsis vertical icon"></i> <div class="menu"> + <a + :href="object.fid" + v-if="object.domain != $store.getters['instance/domain']" + target="_blank" + class="basic item"> + <i class="external icon"></i> + <translate :translate-params="{domain: object.domain}" translate-context="Content/*/Button.Label/Verb">View on %{ domain }</translate> + </a> <div role="button" class="basic item" diff --git a/front/src/views/channels/DetailBase.vue b/front/src/views/channels/DetailBase.vue index f111967524c1fba921a30ffbc5c4367b1d42de0d..7d7dc2143b4779a39cf5256315fad7c3aa04e4d5 100644 --- a/front/src/views/channels/DetailBase.vue +++ b/front/src/views/channels/DetailBase.vue @@ -84,6 +84,14 @@ <i class="code icon"></i> <translate translate-context="Content/*/Button.Label/Verb">Embed</translate> </a> + <a + :href="object.url" + v-if="object.actor.domain != $store.getters['instance/domain']" + target="_blank" + class="basic item"> + <i class="external icon"></i> + <translate :translate-params="{domain: object.actor.domain}" translate-context="Content/*/Button.Label/Verb">View on %{ domain }</translate> + </a> <div class="divider"></div> <a href="" diff --git a/front/src/views/library/DetailBase.vue b/front/src/views/library/DetailBase.vue index efd0d18fc865be9cedc3c83a392bb661bb1dfea9..16d2fc56c23b200e45100db1d738f48784fd1b1e 100644 --- a/front/src/views/library/DetailBase.vue +++ b/front/src/views/library/DetailBase.vue @@ -7,6 +7,14 @@ <button class="ui pointing dropdown icon small basic right floated button" ref="dropdown" v-dropdown="{direction: 'downward'}" style="position: absolute; right: 1em; top: 1em;"> <i class="ellipsis vertical icon"></i> <div class="menu"> + <a + :href="object.fid" + v-if="object.actor.domain != $store.getters['instance/domain']" + target="_blank" + class="basic item"> + <i class="external icon"></i> + <translate :translate-params="{domain: object.actor.domain}" translate-context="Content/*/Button.Label/Verb">View on %{ domain }</translate> + </a> <div role="button" class="basic item"