mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 00:46:01 +00:00
message view UX
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
export let items: any[];
|
||||
export let showProcedure = false;
|
||||
export let showLine = false;
|
||||
export let showCaller = false;
|
||||
export let startLine = 0;
|
||||
|
||||
$: time0 = items[0] && new Date(items[0].time).getTime();
|
||||
@@ -25,6 +26,9 @@
|
||||
{#if showLine}
|
||||
<td class="header">Line</td>
|
||||
{/if}
|
||||
{#if showCaller}
|
||||
<td class="header">Caller</td>
|
||||
{/if}
|
||||
</tr>
|
||||
{#each items as row, index}
|
||||
<MessageViewRow
|
||||
@@ -32,6 +36,7 @@
|
||||
{index}
|
||||
{showProcedure}
|
||||
{showLine}
|
||||
{showCaller}
|
||||
{time0}
|
||||
{startLine}
|
||||
previousRow={index > 0 ? items[index - 1] : null}
|
||||
|
||||
100
packages/web/src/query/MessageViewRow.svelte
Normal file
100
packages/web/src/query/MessageViewRow.svelte
Normal file
@@ -0,0 +1,100 @@
|
||||
<script lang="ts" context="module">
|
||||
function formatDuration(duration) {
|
||||
if (duration == 0) return '0';
|
||||
if (duration < 1000) {
|
||||
return `${Math.round(duration)} ms`;
|
||||
}
|
||||
if (duration < 10000) {
|
||||
return `${Math.round(duration / 100) / 10} s`;
|
||||
}
|
||||
return `${Math.round(duration / 1000)} s`;
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
import moment from 'moment';
|
||||
import JSONTree from '../jsontree/JSONTree.svelte';
|
||||
import FontIcon from '../icons/FontIcon.svelte';
|
||||
import { plusExpandIcon } from '../icons/expandIcons';
|
||||
|
||||
export let row;
|
||||
export let index;
|
||||
export let showProcedure = false;
|
||||
export let showLine = false;
|
||||
export let showCaller = false;
|
||||
export let time0;
|
||||
export let startLine;
|
||||
|
||||
export let previousRow = null;
|
||||
|
||||
let isExpanded = false;
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
</script>
|
||||
|
||||
<tr
|
||||
class:isError={row.severity == 'error'}
|
||||
class:isDebug={row.severity == 'debug'}
|
||||
class:isActive={row.line}
|
||||
on:click={() => dispatch('messageclick', row)}
|
||||
>
|
||||
<td>{index + 1}</td>
|
||||
<td>
|
||||
<span on:click={() => (isExpanded = !isExpanded)} class="expand-button">
|
||||
<FontIcon icon={plusExpandIcon(isExpanded)} />
|
||||
</span>
|
||||
{row.message}
|
||||
</td>
|
||||
<td>{moment(row.time).format('HH:mm:ss')}</td>
|
||||
<td>{formatDuration(new Date(row.time).getTime() - time0)}</td>
|
||||
<td> {previousRow ? formatDuration(new Date(row.time).getTime() - new Date(previousRow.time).getTime()) : 'n/a'}</td>
|
||||
{#if showProcedure}
|
||||
<td>{row.procedure || ''}</td>
|
||||
{/if}
|
||||
{#if showLine}
|
||||
<td>{row.line == null ? '' : row.line + 1 + startLine}</td>
|
||||
{/if}
|
||||
{#if showCaller}
|
||||
<td>{row.caller || ''}</td>
|
||||
{/if}
|
||||
</tr>
|
||||
{#if isExpanded}
|
||||
<tr>
|
||||
<td colspan={5 + (showProcedure ? 1 : 0) + (showLine ? 1 : 0) + (showCaller ? 1 : 0)}>
|
||||
<JSONTree
|
||||
value={row}
|
||||
expanded
|
||||
onRootExpandedChanged={() => {
|
||||
isExpanded = false;
|
||||
}}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
.expand-button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
td.header {
|
||||
text-align: left;
|
||||
border-bottom: 2px solid var(--theme-border);
|
||||
background-color: var(--theme-bg-1);
|
||||
padding: 5px;
|
||||
}
|
||||
td:not(.header) {
|
||||
border-top: 1px solid var(--theme-border);
|
||||
padding: 5px;
|
||||
}
|
||||
tr.isActive:hover {
|
||||
background: var(--theme-bg-2);
|
||||
}
|
||||
tr.isError {
|
||||
color: var(--theme-icon-red);
|
||||
}
|
||||
tr.isDebug {
|
||||
color: var(--theme-font-3);
|
||||
}
|
||||
</style>
|
||||
@@ -11,7 +11,12 @@
|
||||
<HorizontalSplitter>
|
||||
<div class="container" slot="1">
|
||||
<WidgetTitle>Messages</WidgetTitle>
|
||||
<SocketMessageView eventName={runnerId ? `runner-info-${runnerId}` : null} {executeNumber} showNoMessagesAlert />
|
||||
<SocketMessageView
|
||||
eventName={runnerId ? `runner-info-${runnerId}` : null}
|
||||
{executeNumber}
|
||||
showNoMessagesAlert
|
||||
showCaller
|
||||
/>
|
||||
</div>
|
||||
<div class="container" slot="2">
|
||||
<WidgetTitle>Output files</WidgetTitle>
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
export let showProcedure = false;
|
||||
export let showLine = false;
|
||||
export let showCaller = false;
|
||||
export let eventName;
|
||||
export let executeNumber;
|
||||
export let showNoMessagesAlert = false;
|
||||
@@ -68,5 +69,5 @@
|
||||
{#if showNoMessagesAlert && (!displayedMessages || displayedMessages.length == 0)}
|
||||
<ErrorInfo message="No messages" icon="img alert" />
|
||||
{:else}
|
||||
<MessageView items={displayedMessages} on:messageclick {showProcedure} {showLine} {startLine} />
|
||||
<MessageView items={displayedMessages} on:messageclick {showProcedure} {showLine} {showCaller} {startLine} />
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user