From 5a28d77e9a28138f42312d62f1c5ec92310ae865 Mon Sep 17 00:00:00 2001 From: Thomas Hackl Date: Wed, 7 Jan 2026 14:39:31 +0100 Subject: Resolve "Kurz-URLs: Nach Erstellung wird der Link nicht in die Zwischenablage kopiert" Closes #6121 Merge request studip/studip!4652 --- lib/classes/JsonApi/Schemas/ShortUrl.php | 18 ++++++++++++++++++ resources/vue/apps/short-urls/ShortUrlLink.vue | 4 +++- resources/vue/apps/short-urls/ShortUrlList.vue | 18 +++++++----------- resources/vue/store/pinia/shortUrlsStore.js | 25 +++++++++---------------- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/lib/classes/JsonApi/Schemas/ShortUrl.php b/lib/classes/JsonApi/Schemas/ShortUrl.php index ff7e90b..0313bf4 100644 --- a/lib/classes/JsonApi/Schemas/ShortUrl.php +++ b/lib/classes/JsonApi/Schemas/ShortUrl.php @@ -19,6 +19,24 @@ final class ShortUrl extends SchemaProvider } /** + * @param \Forum\Category $resource + */ + public function hasResourceMeta($resource): bool + { + return true; + } + + /** + * @param \Forum\Category $resource + */ + public function getResourceMeta($resource) + { + return [ + 'alias-link' => \URLHelper::getLink('dispatch.php/u/r/' . $resource->alias, [], true) + ]; + } + + /** * @param \ShortUrl $resource */ public function getAttributes($resource, ContextInterface $context): iterable diff --git a/resources/vue/apps/short-urls/ShortUrlLink.vue b/resources/vue/apps/short-urls/ShortUrlLink.vue index f2a168a..dacf1fe 100644 --- a/resources/vue/apps/short-urls/ShortUrlLink.vue +++ b/resources/vue/apps/short-urls/ShortUrlLink.vue @@ -52,7 +52,9 @@ function openDialog() { } async function save() { - await store.storeShortUrl(newLink.value); + const data = await store.storeShortUrl(newLink.value); + + navigator.clipboard.writeText(STUDIP.URLHelper.getURL(data.meta['alias-link'], {}, true)); closeDialog(); } diff --git a/resources/vue/apps/short-urls/ShortUrlList.vue b/resources/vue/apps/short-urls/ShortUrlList.vue index a575772..0325fc8 100644 --- a/resources/vue/apps/short-urls/ShortUrlList.vue +++ b/resources/vue/apps/short-urls/ShortUrlList.vue @@ -51,7 +51,7 @@ @@ -70,7 +70,7 @@ @qrcode="createQrCode(shortUrl)" @edit="editShortUrl(shortUrl)" @delete="store.deleteShortUrl(shortUrl.id)" - @copy="copyToClipboard(shortUrl.attributes.alias)" + @copy="copyToClipboard(shortUrl.meta['alias-link'])" /> @@ -145,13 +145,8 @@ const formatDate = (datestring) => { .join(' '); } -const getAliasLink = (alias) => { - return STUDIP.URLHelper.getURL('dispatch.php/u/r/' + alias, {}, true); -} - -const copyToClipboard = (alias) => { - const shortUrl = getAliasLink(alias); - navigator.clipboard.writeText(shortUrl); +const copyToClipboard = (link) => { + navigator.clipboard.writeText(STUDIP.URLHelper.getURL(link, {}, true)); STUDIP.Report.success($gettext('Sie finden den Link in der Zwischenablage')); } @@ -159,7 +154,7 @@ const copyToClipboard = (alias) => { * Create a QR code and trigger download as png. */ const createQrCode = (shortLink) => { - qrUrl.value = getAliasLink(shortLink.attributes.alias); + qrUrl.value = STUDIP.URLHelper.getURL(shortLink.meta['alias-link'], {}, true); nextTick().then(() => { const png = qrcode.value.querySelector('canvas').toDataURL('image/png'); const link = document.createElement('a'); @@ -179,7 +174,8 @@ const closeEditDialog = () => { } const save = async () => { - await store.storeShortUrl(currentlyEditing.value); + const data = await store.storeShortUrl(currentlyEditing.value); + copyToClipboard(data.meta['alias-link']); closeEditDialog(); } diff --git a/resources/vue/store/pinia/shortUrlsStore.js b/resources/vue/store/pinia/shortUrlsStore.js index 6b972c2..7e63867 100644 --- a/resources/vue/store/pinia/shortUrlsStore.js +++ b/resources/vue/store/pinia/shortUrlsStore.js @@ -21,28 +21,21 @@ export const useShortUrlsStore = defineStore('shortUrls', () => { return shortUrls.value.find(item => item.id === id); } - function storeShortUrl(shortUrl) { + async function storeShortUrl(shortUrl) { const index = shortUrls.value.findIndex(item => item.id === shortUrl.id); + let response = {}; // Not found in store, create a new entry. if (index === -1) { - STUDIP.jsonapi.withPromises().post('short-urls', {data: {data: shortUrl}}) - .then(response => { - shortUrls.value.push(response.data) - STUDIP.Report.success($gettext('Der Kurzlink wurde gespeichert.')); - }) - .catch(error => STUDIP.Report.error($gettext('Fehler beim Erstellen des Kurzlinks'), error)); - + response = await STUDIP.jsonapi.withPromises().post('short-urls', {data: {data: shortUrl}}); + shortUrls.value.push(response.data); } else { - STUDIP.jsonapi.withPromises().patch(`short-urls/${shortUrl.id}`, {data: {data: shortUrl}}) - .then(response => { - shortUrls.value[index] = response.data; - STUDIP.Report.success($gettext('Der Kurzlink wurde gespeichert.')); - }) - .catch(error => { - STUDIP.Report.error($gettext('Fehler beim Speichern des Kurzlinks'), error) - }); + response = await STUDIP.jsonapi.withPromises().patch(`short-urls/${shortUrl.id}`, {data: {data: shortUrl}}); + shortUrls.value[index] = response.data; } + + STUDIP.Report.success($gettext('Der Kurzlink wurde gespeichert.')); + return response.data; } function deleteShortUrl(id) { -- cgit v1.0