Commit: {syncResult.commitHash.substring( - 0, - 7, - )}{syncResult.commitHash + ? syncResult.commitHash.substring(0, 7) + : "-"}
diff --git a/packages/frontend/src/lib/components/alerts/AlertPreview.svelte b/packages/frontend/src/lib/components/alerts/AlertPreview.svelte index cca52a64..14d11e90 100644 --- a/packages/frontend/src/lib/components/alerts/AlertPreview.svelte +++ b/packages/frontend/src/lib/components/alerts/AlertPreview.svelte @@ -56,7 +56,10 @@ const timeRangeOptions: PreviewRange[] = ["1d", "7d", "14d", "30d"]; + let loadSeq = 0; + async function loadPreview() { + const requestId = ++loadSeq; loading = true; error = null; @@ -71,12 +74,16 @@ previewRange: timeRange, }); + if (requestId !== loadSeq) return; data = response.preview; } catch (e) { + if (requestId !== loadSeq) return; error = e instanceof Error ? e.message : "Failed to load preview"; toastStore.error(error); } finally { - loading = false; + if (requestId === loadSeq) { + loading = false; + } } } diff --git a/packages/frontend/src/lib/components/custom-dashboards/DashboardContainer.svelte b/packages/frontend/src/lib/components/custom-dashboards/DashboardContainer.svelte index cff4022a..3bf56a59 100644 --- a/packages/frontend/src/lib/components/custom-dashboards/DashboardContainer.svelte +++ b/packages/frontend/src/lib/components/custom-dashboards/DashboardContainer.svelte @@ -131,11 +131,17 @@ const colW = colWidthPx(); const rowStride = ROW_HEIGHT_PX + ROW_GAP_PX; - // Convert pixel delta into "stored" 12-col units regardless of viewport. - // This way resizing on a tablet (6 visible cols) still updates the - // logical width in the canonical 12-col reference space. - const visibleDeltaCols = Math.round(dx / (colW + COL_GAP_PX)); - const storedDeltaCols = Math.round((visibleDeltaCols / effectiveCols) * 12); + // Width resize only makes sense on the canonical 12-col desktop grid. + // Below 12 effective columns the visible->stored conversion snaps the + // logical width by whole rows (a single visible column maps to 12/effectiveCols + // stored units), which makes resizing erratic and unusable on tablet/mobile. + // In those breakpoints we keep the stored width unchanged and allow only + // height resizing. + let storedDeltaCols = 0; + if (effectiveCols >= 12) { + const visibleDeltaCols = Math.round(dx / (colW + COL_GAP_PX)); + storedDeltaCols = visibleDeltaCols; + } const deltaRows = Math.round(dy / rowStride); const newW = Math.min(12, Math.max(resizeState.minW, resizeState.startW + storedDeltaCols)); diff --git a/packages/frontend/src/lib/components/exceptions/ExceptionDetailsDialog.svelte b/packages/frontend/src/lib/components/exceptions/ExceptionDetailsDialog.svelte index e14ba261..db519286 100644 --- a/packages/frontend/src/lib/components/exceptions/ExceptionDetailsDialog.svelte +++ b/packages/frontend/src/lib/components/exceptions/ExceptionDetailsDialog.svelte @@ -93,8 +93,15 @@ function viewErrorGroup() { if (exception) { - // Navigate to error group page - goto(`/dashboard/errors?fingerprint=${exception.exception.fingerprint}&organizationId=${organizationId}`); + // Navigate to the error groups list filtered to this exception. + // The list page reads the `search` param (ILIKE on exception type/message); + // it does not read a `fingerprint` param, so use the exception type as the + // search term to land on the matching group. + const params = new URLSearchParams({ + organizationId, + search: exception.exception.exceptionType, + }); + goto(`/dashboard/errors?${params.toString()}`); onClose(); } } diff --git a/packages/frontend/src/lib/components/notification-channels/ChannelsList.svelte b/packages/frontend/src/lib/components/notification-channels/ChannelsList.svelte index b0533fff..88614f12 100644 --- a/packages/frontend/src/lib/components/notification-channels/ChannelsList.svelte +++ b/packages/frontend/src/lib/components/notification-channels/ChannelsList.svelte @@ -42,18 +42,9 @@ import TestTube from '@lucide/svelte/icons/test-tube'; import Bell from '@lucide/svelte/icons/bell'; - let channels = $state