diff --git a/web/server/vue-cli/src/components/Report/Report.vue b/web/server/vue-cli/src/components/Report/Report.vue index 5419c2b338..91827f556f 100644 --- a/web/server/vue-cli/src/components/Report/Report.vue +++ b/web/server/vue-cli/src/components/Report/Report.vue @@ -521,6 +521,7 @@ class AdvancedLineWidget extends WidgetType { toDOM() { this.container = document.createElement("div"); + this.container.style.userSelect = "text"; const vnode = h(ReportStepMessage, this.data); vnode.appContext = this.appContext; @@ -537,7 +538,7 @@ class AdvancedLineWidget extends WidgetType { } ignoreEvent() { - return false; + return true; } } diff --git a/web/server/vue-cli/src/components/Report/ReportStepMessage.vue b/web/server/vue-cli/src/components/Report/ReportStepMessage.vue index ecc541d67d..22fcfc8938 100644 --- a/web/server/vue-cli/src/components/Report/ReportStepMessage.vue +++ b/web/server/vue-cli/src/components/Report/ReportStepMessage.vue @@ -51,6 +51,18 @@ + + import { ReportStepEnumIcon } from "@/components/Icons"; import { getCssColor } from "@/utilities/colors"; -import { computed } from "vue"; +import { computed, ref } from "vue"; const props = defineProps({ id: { type: [ String, Number ], required: true }, @@ -125,6 +137,22 @@ function showNextReport() { function showDocumentation() { window.open(props.docUrl, "_blank"); } + +const isCopied = ref(false); + +async function copyToClipboard() { + try { + await navigator.clipboard.writeText(props.value); + isCopied.value = true; + + // Reset the icon back to the copy glyph after a short delay. + setTimeout(() => { + isCopied.value = false; + }, 2000); + } catch (error) { + console.warn("Clipboard copy failed: ", error); + } +}