优化 Debug EML 调试页面布局

This commit is contained in:
andy
2026-07-09 17:44:36 +08:00
parent b785e0e429
commit a2119a8d06

View File

@@ -1,18 +1,43 @@
<template> <template>
<div class="th-page debug-eml-view"> <div class="th-page debug-eml-view">
<header class="page-heading"> <header class="debug-eml-hero">
<div> <div class="debug-eml-hero__copy">
<h1>{{ t('debugEml.title') }}</h1> <h1>{{ t('debugEml.title') }}</h1>
<p>{{ t('debugEml.subtitle') }}</p> <p>{{ t('debugEml.subtitle') }}</p>
</div> </div>
<dl class="debug-eml-status-strip">
<div>
<dt>{{ t('debugEml.status') }}</dt>
<dd>{{ statusLabel }}</dd>
</div>
<div>
<dt>{{ t('debugEml.debugRunId') }}</dt>
<dd class="th-code">
{{ result?.debug_run_id ?? '-' }}
</dd>
</div>
<div>
<dt>{{ t('debugEml.backendStatus') }}</dt>
<dd class="th-code">
{{ result?.status ?? '-' }}
</dd>
</div>
</dl>
</header> </header>
<div class="debug-eml-workspace">
<aside class="debug-eml-panel">
<form <form
class="th-section debug-eml-form" class="debug-eml-card debug-eml-form"
@submit.prevent="submitUpload" @submit.prevent="submitUpload"
> >
<div class="th-section-header"> <div class="th-section-header">
<h2 class="th-section-title"> <h2 class="th-section-title">
<i
class="pi pi-upload"
aria-hidden="true"
/>
{{ t('debugEml.uploadConfig') }} {{ t('debugEml.uploadConfig') }}
</h2> </h2>
</div> </div>
@@ -65,20 +90,32 @@
class="primary-button" class="primary-button"
:disabled="submitDisabled" :disabled="submitDisabled"
> >
<i
class="pi pi-send"
aria-hidden="true"
/>
{{ busy ? t('debugEml.submitting') : t('debugEml.submit') }} {{ busy ? t('debugEml.submitting') : t('debugEml.submit') }}
</button> </button>
<span <span
v-if="selectedFile" v-if="selectedFile"
class="th-muted" class="debug-eml-selected-file"
> >
<i
class="pi pi-file"
aria-hidden="true"
/>
{{ selectedFile.name }} {{ selectedFile.name }}
</span> </span>
</div> </div>
</form> </form>
<section class="th-section debug-eml-status"> <section class="debug-eml-card debug-eml-status">
<div class="th-section-header"> <div class="th-section-header">
<h2 class="th-section-title"> <h2 class="th-section-title">
<i
class="pi pi-info-circle"
aria-hidden="true"
/>
{{ t('debugEml.executionStatus') }} {{ t('debugEml.executionStatus') }}
</h2> </h2>
</div> </div>
@@ -117,11 +154,17 @@
</small> </small>
</div> </div>
</section> </section>
</aside>
<main class="debug-eml-results">
<template v-if="result"> <template v-if="result">
<section class="th-section"> <section class="debug-eml-card">
<div class="th-section-header"> <div class="th-section-header">
<h2 class="th-section-title"> <h2 class="th-section-title">
<i
class="pi pi-sitemap"
aria-hidden="true"
/>
{{ t('debugEml.sourceTrace') }} {{ t('debugEml.sourceTrace') }}
</h2> </h2>
</div> </div>
@@ -153,9 +196,13 @@
</dl> </dl>
</section> </section>
<section class="th-section debug-eml-preview-section"> <section class="debug-eml-card debug-eml-preview-section">
<div class="th-section-header"> <div class="th-section-header">
<h2 class="th-section-title"> <h2 class="th-section-title">
<i
class="pi pi-envelope"
aria-hidden="true"
/>
{{ t('debugEml.mailPreview') }} {{ t('debugEml.mailPreview') }}
</h2> </h2>
</div> </div>
@@ -211,9 +258,13 @@
</details> </details>
</section> </section>
<section class="th-section debug-eml-result-section"> <section class="debug-eml-card debug-eml-result-section">
<div class="th-section-header"> <div class="th-section-header">
<h2 class="th-section-title"> <h2 class="th-section-title">
<i
class="pi pi-bolt"
aria-hidden="true"
/>
{{ t('debugEml.superAgentResult') }} {{ t('debugEml.superAgentResult') }}
</h2> </h2>
</div> </div>
@@ -257,15 +308,31 @@
</div> </div>
</section> </section>
<section class="th-section"> <section class="debug-eml-card">
<div class="th-section-header"> <div class="th-section-header">
<h2 class="th-section-title"> <h2 class="th-section-title">
<i
class="pi pi-code"
aria-hidden="true"
/>
{{ t('debugEml.debugPayload') }} {{ t('debugEml.debugPayload') }}
</h2> </h2>
</div> </div>
<pre>{{ formatJson(result.agentbus_like_payload) }}</pre> <pre>{{ formatJson(result.agentbus_like_payload) }}</pre>
</section> </section>
</template> </template>
<section
v-else
class="debug-eml-card debug-eml-empty-panel"
>
<div class="empty-state">
<strong>{{ t('debugEml.executionStatus') }}</strong>
<span>{{ busy ? t('debugEml.waitingSuperAgent') : t('common.noData') }}</span>
</div>
</section>
</main>
</div>
</div> </div>
</template> </template>
@@ -383,23 +450,108 @@ function formatMediaSize(sizeBytes: number | null): string {
<style scoped> <style scoped>
.debug-eml-view { .debug-eml-view {
max-width: 1320px; max-width: 1440px;
display: grid;
gap: 18px;
} }
.page-heading h1, .debug-eml-hero {
.page-heading p { display: grid;
grid-template-columns: minmax(0, 1fr) minmax(360px, 520px);
gap: 18px;
align-items: stretch;
border: 1px solid rgba(148, 163, 184, 0.24);
border-radius: 14px;
background:
linear-gradient(135deg, rgb(255 255 255 / 96%), rgb(248 250 252 / 92%)),
radial-gradient(circle at top left, rgba(37, 99, 235, 0.12), transparent 34%);
box-shadow: 0 20px 50px rgb(15 23 42 / 6%);
padding: 22px;
}
.debug-eml-hero__copy {
min-width: 0;
display: grid;
align-content: center;
gap: 8px;
}
.debug-eml-hero__copy h1,
.debug-eml-hero__copy p {
margin: 0; margin: 0;
} }
.page-heading h1 { .debug-eml-hero__copy h1 {
color: var(--th-color-slate-900); color: var(--th-color-slate-900);
font-size: 28px; font-size: 28px;
line-height: 1.2;
} }
.page-heading p { .debug-eml-hero__copy p {
margin-top: 8px; max-width: 760px;
color: var(--th-color-slate-500); color: var(--th-color-slate-500);
font-size: 14px; font-size: 14px;
line-height: 1.7;
}
.debug-eml-status-strip {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
margin: 0;
}
.debug-eml-status-strip div {
min-width: 0;
border: 1px solid rgba(148, 163, 184, 0.28);
border-radius: 10px;
background: rgb(255 255 255 / 82%);
padding: 14px;
}
.debug-eml-status-strip dt {
color: var(--th-color-slate-500);
font-size: 12px;
font-weight: 700;
}
.debug-eml-status-strip dd {
margin: 7px 0 0;
color: var(--th-color-slate-900);
font-size: 13px;
font-weight: 800;
overflow-wrap: anywhere;
}
.debug-eml-workspace {
display: grid;
grid-template-columns: minmax(300px, 360px) minmax(0, 1fr);
gap: 18px;
align-items: start;
}
.debug-eml-panel {
position: sticky;
top: calc(var(--th-topbar-height) + 18px);
display: grid;
gap: 14px;
}
.debug-eml-results {
display: grid;
gap: 16px;
min-width: 0;
}
.debug-eml-card {
display: grid;
gap: 16px;
min-width: 0;
border: 1px solid rgba(148, 163, 184, 0.25);
border-radius: 12px;
background: rgb(255 255 255 / 96%);
box-shadow: 0 12px 30px rgb(15 23 42 / 5%);
padding: 18px;
} }
.debug-eml-form, .debug-eml-form,
@@ -412,8 +564,8 @@ function formatMediaSize(sizeBytes: number | null): string {
.debug-eml-grid { .debug-eml-grid {
display: grid; display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: 1fr;
gap: 14px; gap: 13px;
} }
.debug-eml-grid label { .debug-eml-grid label {
@@ -425,12 +577,36 @@ function formatMediaSize(sizeBytes: number | null): string {
} }
.debug-eml-grid input { .debug-eml-grid input {
min-height: 38px; width: 100%;
border: 1px solid var(--th-color-slate-200); min-height: 40px;
border-radius: var(--th-radius-sm); border: 1px solid rgba(148, 163, 184, 0.45);
border-radius: 8px;
background: var(--th-color-white); background: var(--th-color-white);
color: var(--th-color-slate-900); color: var(--th-color-slate-900);
padding: 0 12px; padding: 0 12px;
font: inherit;
transition:
border-color 0.15s ease,
box-shadow 0.15s ease;
}
.debug-eml-grid input[type='file'] {
min-height: auto;
padding: 9px 10px;
color: var(--th-color-slate-600);
font-size: 12px;
}
.debug-eml-grid input:focus {
outline: none;
border-color: var(--th-color-blue-600);
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);
}
.debug-eml-grid input:disabled {
cursor: not-allowed;
background: var(--th-color-slate-50);
color: var(--th-color-slate-500);
} }
.debug-eml-actions { .debug-eml-actions {
@@ -441,19 +617,49 @@ function formatMediaSize(sizeBytes: number | null): string {
} }
.primary-button { .primary-button {
min-height: 38px; min-height: 42px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
border: 0; border: 0;
border-radius: var(--th-radius-sm); border-radius: 9px;
background: var(--th-color-blue-600); background: var(--th-color-blue-600);
color: var(--th-color-white); color: var(--th-color-white);
padding: 0 16px; padding: 0 18px;
font-weight: 800; font-weight: 800;
cursor: pointer; cursor: pointer;
box-shadow: 0 12px 22px rgba(37, 99, 235, 0.22);
transition:
transform 0.15s ease,
box-shadow 0.15s ease,
opacity 0.15s ease;
}
.primary-button:not(:disabled):hover {
transform: translateY(-1px);
box-shadow: 0 16px 28px rgba(37, 99, 235, 0.25);
} }
.primary-button:disabled { .primary-button:disabled {
cursor: not-allowed; cursor: not-allowed;
opacity: 0.55; opacity: 0.55;
box-shadow: none;
}
.debug-eml-selected-file {
min-width: 0;
display: inline-flex;
align-items: center;
gap: 7px;
border: 1px solid rgba(148, 163, 184, 0.3);
border-radius: 999px;
background: var(--th-color-slate-50);
color: var(--th-color-slate-600);
padding: 6px 10px;
font-size: 12px;
font-weight: 700;
overflow-wrap: anywhere;
} }
.empty-state { .empty-state {
@@ -465,6 +671,9 @@ function formatMediaSize(sizeBytes: number | null): string {
font-size: 13px; font-size: 13px;
padding: 24px; padding: 24px;
text-align: center; text-align: center;
border: 1px dashed rgba(148, 163, 184, 0.38);
border-radius: 10px;
background: var(--th-color-slate-50);
} }
.empty-state strong { .empty-state strong {
@@ -472,13 +681,17 @@ function formatMediaSize(sizeBytes: number | null): string {
} }
.empty-state--error { .empty-state--error {
place-items: start;
color: var(--th-color-danger); color: var(--th-color-danger);
text-align: left;
background: rgba(220, 38, 38, 0.06);
border-color: rgba(220, 38, 38, 0.22);
} }
.debug-eml-kv { .debug-eml-kv {
display: grid; display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: 1fr;
gap: 12px; gap: 10px;
margin: 0; margin: 0;
} }
@@ -488,10 +701,10 @@ function formatMediaSize(sizeBytes: number | null): string {
.debug-eml-kv div { .debug-eml-kv div {
min-width: 0; min-width: 0;
border: 1px solid var(--th-color-slate-200); border: 1px solid rgba(148, 163, 184, 0.25);
border-radius: var(--th-radius-sm); border-radius: 10px;
padding: 12px; padding: 12px;
background: var(--th-color-white); background: linear-gradient(180deg, var(--th-color-white), var(--th-color-slate-50));
} }
.debug-eml-kv dt { .debug-eml-kv dt {
@@ -510,7 +723,8 @@ function formatMediaSize(sizeBytes: number | null): string {
.debug-eml-callout { .debug-eml-callout {
margin: 0; margin: 0;
border-radius: var(--th-radius-sm); border: 1px solid rgba(37, 99, 235, 0.16);
border-radius: 10px;
background: rgba(37, 99, 235, 0.08); background: rgba(37, 99, 235, 0.08);
color: var(--th-color-blue-600); color: var(--th-color-blue-600);
padding: 12px; padding: 12px;
@@ -521,10 +735,12 @@ function formatMediaSize(sizeBytes: number | null): string {
.debug-eml-html-preview { .debug-eml-html-preview {
max-height: 520px; max-height: 520px;
overflow: auto; overflow: auto;
border: 1px solid var(--th-color-slate-200); border: 1px solid rgba(148, 163, 184, 0.28);
border-radius: var(--th-radius-sm); border-radius: 10px;
background: var(--th-color-white); background: var(--th-color-white);
padding: 16px; padding: 18px;
color: var(--th-color-slate-900);
line-height: 1.65;
} }
.debug-eml-media-list { .debug-eml-media-list {
@@ -551,11 +767,12 @@ function formatMediaSize(sizeBytes: number | null): string {
.debug-eml-media-list li { .debug-eml-media-list li {
display: grid; display: grid;
grid-template-columns: 140px minmax(0, 1fr) 220px; grid-template-columns: minmax(100px, 140px) minmax(0, 1fr) minmax(170px, 220px);
gap: 12px; gap: 12px;
align-items: center; align-items: center;
border: 1px solid var(--th-color-slate-200); border: 1px solid rgba(148, 163, 184, 0.25);
border-radius: var(--th-radius-sm); border-radius: 10px;
background: var(--th-color-slate-50);
padding: 10px 12px; padding: 10px 12px;
} }
@@ -572,8 +789,9 @@ function formatMediaSize(sizeBytes: number | null): string {
} }
.debug-eml-raw-html { .debug-eml-raw-html {
border: 1px solid var(--th-color-slate-200); border: 1px solid rgba(148, 163, 184, 0.28);
border-radius: var(--th-radius-sm); border-radius: 10px;
background: var(--th-color-slate-50);
padding: 12px; padding: 12px;
} }
@@ -588,13 +806,22 @@ pre {
max-height: 420px; max-height: 420px;
overflow: auto; overflow: auto;
margin: 0; margin: 0;
border: 1px solid var(--th-color-slate-200); border: 1px solid rgba(148, 163, 184, 0.28);
border-radius: var(--th-radius-sm); border-radius: 10px;
background: var(--th-color-slate-50); background: #0f172a;
color: var(--th-color-slate-900); color: #dbeafe;
padding: 12px; padding: 12px;
white-space: pre-wrap; white-space: pre-wrap;
overflow-wrap: anywhere; overflow-wrap: anywhere;
font-size: 12px;
line-height: 1.55;
}
.debug-eml-result-section pre,
.debug-eml-card > pre,
.debug-eml-raw-html pre {
background: #0f172a;
color: #dbeafe;
} }
.debug-eml-two-column { .debug-eml-two-column {
@@ -606,6 +833,7 @@ pre {
.debug-eml-two-column section { .debug-eml-two-column section {
display: grid; display: grid;
gap: 10px; gap: 10px;
min-width: 0;
} }
.debug-eml-warning-list { .debug-eml-warning-list {
@@ -614,7 +842,7 @@ pre {
} }
.debug-eml-warning-list li { .debug-eml-warning-list li {
border-radius: var(--th-radius-sm); border-radius: 10px;
background: rgba(245, 158, 11, 0.12); background: rgba(245, 158, 11, 0.12);
color: #92400e; color: #92400e;
padding: 10px 12px; padding: 10px 12px;
@@ -622,13 +850,62 @@ pre {
font-weight: 700; font-weight: 700;
} }
.debug-eml-empty-panel {
min-height: 360px;
align-content: center;
}
.th-section-title {
display: inline-flex;
align-items: center;
gap: 8px;
}
.th-section-title i {
color: var(--th-color-blue-600);
font-size: 14px;
}
@media (max-width: 1180px) {
.debug-eml-hero,
.debug-eml-workspace {
grid-template-columns: 1fr;
}
.debug-eml-panel {
position: static;
}
.debug-eml-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 920px) { @media (max-width: 920px) {
.debug-eml-grid, .debug-eml-status-strip,
.debug-eml-kv, .debug-eml-kv,
.debug-eml-kv--grid, .debug-eml-kv--grid,
.debug-eml-two-column, .debug-eml-two-column,
.debug-eml-media-list li { .debug-eml-media-list li {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.debug-eml-hero {
padding: 18px;
}
}
@media (max-width: 640px) {
.debug-eml-hero__copy h1 {
font-size: 24px;
}
.debug-eml-grid {
grid-template-columns: 1fr;
}
.debug-eml-card {
padding: 16px;
}
} }
</style> </style>