diff --git a/frontend/src/components/common/ErrorDetailModal.vue b/frontend/src/components/common/ErrorDetailModal.vue
new file mode 100644
index 0000000..d8281a5
--- /dev/null
+++ b/frontend/src/components/common/ErrorDetailModal.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+ {{ title }}
+
+
+ mdi-close
+
+
+
+ {{ message || '(no error message)' }}
+
+
+ {{ copied ? 'Copied' : 'Copy' }}
+
+ Close
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/settings/ImportTaskList.vue b/frontend/src/components/settings/ImportTaskList.vue
index c3edbd1..97bbebf 100644
--- a/frontend/src/components/settings/ImportTaskList.vue
+++ b/frontend/src/components/settings/ImportTaskList.vue
@@ -45,9 +45,11 @@
{{ formatBytes(item.size_bytes) }}
{{ formatDate(item.created_at) }}
-
- {{ shorten(item.error, 60) }}
-
+
@@ -100,16 +102,35 @@
+
+
+
+
diff --git a/frontend/src/components/settings/SystemActivityTab.vue b/frontend/src/components/settings/SystemActivityTab.vue
index 1db2724..f623bb0 100644
--- a/frontend/src/components/settings/SystemActivityTab.vue
+++ b/frontend/src/components/settings/SystemActivityTab.vue
@@ -59,8 +59,12 @@
{{ r.queue }} |
{{ shortTaskName(r.task_name) }} |
{{ r.target_id ?? '—' }} |
-
- {{ r.error_type }}
+ |
+
|
@@ -138,6 +142,12 @@
+
+
@@ -145,8 +155,23 @@
import { computed, onMounted, onUnmounted, ref } from 'vue'
import { useSystemActivityStore } from '../../stores/systemActivity.js'
+import ErrorDetailModal from '../common/ErrorDetailModal.vue'
import QueuesTable from './QueuesTable.vue'
+// Click-to-open modal for full error text. Replaces the unusable
+// :title="..." tooltip (operator-flagged 2026-05-26: SQLAlchemy
+// rollback + traceback content rendered as a cramped browser tooltip
+// you couldn't copy from or scroll within).
+const showErrorModal = ref(false)
+const errorModalTitle = ref('')
+const errorModalMessage = ref('')
+
+function openError(title, message) {
+ errorModalTitle.value = title || 'Error details'
+ errorModalMessage.value = message || ''
+ showErrorModal.value = true
+}
+
const store = useSystemActivityStore()
const filterQueue = ref(null)
@@ -276,5 +301,18 @@ function formatRelative(iso) {
font-feature-settings: 'tnum';
}
.fc-err { color: rgb(var(--v-theme-error, 220 80 80)); }
+.fc-err-link {
+ /* Styled as a text-only button so the error_type cell stays
+ visually identical to the prior tooltip-bearing row, but is
+ now a real clickable target with hover affordance. */
+ color: rgb(var(--v-theme-error, 220 80 80));
+ background: transparent;
+ border: 0;
+ padding: 0;
+ font: inherit;
+ text-decoration: underline dotted;
+ cursor: pointer;
+}
+.fc-err-link:hover { text-decoration: underline; }
.fc-muted { color: rgb(var(--v-theme-on-surface-variant)); }