Skip to content

Commit 32addfa

Browse files
authored
feat: add copy button for stacktrace (#260)
1 parent e4b6d16 commit 32addfa

3 files changed

Lines changed: 22 additions & 3 deletions

File tree

packages/core/playground/src/pages/devtools.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const logNotify = ref(false)
1717
const logStatus = ref<'idle' | 'loading'>('idle')
1818
const logId = ref('')
1919
const logDescription = ref('')
20+
const logStacktrace = ref('')
2021
2122
// Update form
2223
const updateId = ref('')
@@ -54,6 +55,7 @@ async function addLog() {
5455
status: logStatus.value === 'loading' ? 'loading' : undefined,
5556
id: logId.value || undefined,
5657
description: logDescription.value || undefined,
58+
stacktrace: logStacktrace.value || undefined,
5759
})
5860
}
5961
@@ -225,6 +227,10 @@ function incrementCounter() {
225227
<span op50 text-xs>Description</span>
226228
<textarea v-model="logDescription" rows="2" border="~ base" rounded px2 py1 text-sm bg-transparent outline-none resize-y />
227229
</label>
230+
<label flex="~ col gap-1" col-span-2>
231+
<span op50 text-xs>Stacktrace</span>
232+
<textarea v-model="logStacktrace" rows="3" border="~ base" rounded px2 py1 text-sm bg-transparent outline-none resize-y font-mono />
233+
</label>
228234
</div>
229235
<div flex items-center gap-3 mt2>
230236
<label flex items-center gap-1 text-xs>

packages/core/src/client/webcomponents/.generated/css.ts

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinLogs.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup lang="ts">
22
import type { DevToolsLogEntry, DevToolsLogEntryFrom, DevToolsLogLevel } from '@vitejs/devtools-kit'
33
import type { DocksContext } from '@vitejs/devtools-kit/client'
4-
import { useTimeAgo } from '@vueuse/core'
4+
import { useClipboard, useTimeAgo } from '@vueuse/core'
55
import { computed, onMounted, ref } from 'vue'
66
import { markLogsAsRead, useLogs } from '../../state/logs'
77
import FilterToggles from '../display/FilterToggles.vue'
@@ -162,6 +162,7 @@ const selectedEntry = computed(() => {
162162
})
163163
164164
const selectedTimeAgo = useTimeAgo(computed(() => selectedEntry.value?.timestamp ?? Date.now()))
165+
const { copy: copyStacktrace, copied: stacktraceCopied } = useClipboard()
165166
166167
async function openFile(entry: DevToolsLogEntry) {
167168
if (!entry.filePosition)
@@ -410,7 +411,19 @@ onMounted(() => {
410411
<div class="op50 text-xs mb-1">
411412
Stack Trace
412413
</div>
413-
<pre class="text-xs bg-gray/5 rounded p-2 of-x-auto whitespace-pre-wrap font-mono">{{ selectedEntry.stacktrace }}</pre>
414+
<div class="group relative">
415+
<pre class="text-xs bg-gray/5 rounded p-2 of-x-auto whitespace-pre-wrap font-mono">{{ selectedEntry.stacktrace }}</pre>
416+
<button
417+
class="group/bt absolute top-1.5 right-1.5 op0 group-hover:op100 p-1 rounded bg-base border border-base transition"
418+
title="Copy"
419+
@click="copyStacktrace(selectedEntry.stacktrace)"
420+
>
421+
<div
422+
:class="stacktraceCopied ? 'i-ph:check' : 'i-ph:copy'"
423+
class="op50 group-hover/bt:op100 size-3.5"
424+
/>
425+
</button>
426+
</div>
414427
</div>
415428

416429
<!-- Timers -->

0 commit comments

Comments
 (0)