Skip to content

Commit 43a10bf

Browse files
authored
Merge pull request #105 from buggregator/feature/sentry-exceptions
Improves sentry blocks UI
2 parents 7295a7d + 4a8df2f commit 43a10bf

File tree

7 files changed

+107
-53
lines changed

7 files changed

+107
-53
lines changed

src/entities/sentry/ui/preview-card/preview-card.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const exception: Ref<Exception> = computed(() =>
6969
}
7070
7171
.preview-card__link {
72-
@apply cursor-pointer pb-2 flex-grow;
72+
@apply cursor-pointer dark:bg-gray-900 bg-gray-100 p-3 rounded-t-md border border-purple-300 dark:border-gray-400;
7373
}
7474
7575
.preview-card__title {
@@ -78,7 +78,7 @@ const exception: Ref<Exception> = computed(() =>
7878
7979
.preview-card__text {
8080
@include code-example();
81-
@apply text-sm break-all mb-3 overflow-auto text-opacity-60;
81+
@apply text-sm break-words whitespace-pre-wrap mb-3 overflow-auto text-opacity-60;
8282
}
8383
8484
.preview-card__frames {

src/entities/sentry/ui/sentry-exception/sentry-exception.vue

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,21 @@ const exceptionFrames = computed(() => {
2626
<template>
2727
<div class="sentry-exception">
2828
<slot>
29-
<h3 class="sentry-exception__title">
30-
{{ exception.type }}
31-
</h3>
29+
<header class="sentry-exception__header">
30+
<h3 class="sentry-exception__title">
31+
{{ exception.type }}
32+
</h3>
3233

33-
<pre class="sentry-exception__text" v-html="exception.value" />
34+
<pre class="sentry-exception__text" v-html="exception.value"/>
35+
</header>
3436
</slot>
3537

3638
<div v-if="exceptionFrames.length" class="sentry-exception__frames">
3739
<template
3840
v-for="(frame, index) in exceptionFrames"
3941
:key="frame.context_line"
4042
>
41-
<SentryExceptionFrame :frame="frame" :is-open="index === 0" />
43+
<SentryExceptionFrame :frame="frame" :is-open="index === 0"/>
4244
</template>
4345
</div>
4446
</div>
@@ -48,28 +50,27 @@ const exceptionFrames = computed(() => {
4850
@import "assets/mixins";
4951
5052
.sentry-exception {
51-
@apply flex flex-col;
53+
@apply flex flex-col ;
5254
}
5355
5456
.sentry-exception__link {
5557
@apply cursor-pointer pb-2 flex-grow;
5658
}
5759
58-
.sentry-exception__text {
59-
@include text-muted;
60-
@apply text-sm break-all mb-3 p-3 dark:bg-gray-800;
60+
.sentry-exception__header {
61+
@apply dark:bg-gray-900 bg-gray-100 p-3 rounded-t-md border border-purple-300 dark:border-gray-400 border-b-0;
6162
}
6263
6364
.sentry-exception__title {
64-
@apply mb-3 font-semibold;
65+
@apply mb-3 font-semibold text-lg;
6566
}
6667
6768
.sentry-exception__text {
68-
@include text-muted;
69-
@apply text-sm break-all mb-3 p-3 dark:bg-gray-800;
69+
@include code-example();
70+
@apply text-sm break-words whitespace-pre-wrap rounded text-opacity-60;
7071
}
7172
7273
.sentry-exception__frames {
73-
@apply border border-purple-200 dark:border-gray-600 flex-col justify-center w-full;
74+
@apply border border-purple-200 dark:border-gray-600 flex-col justify-center w-full border border-purple-300 dark:border-gray-400 border-t-0 rounded-b-md overflow-hidden;
7475
}
7576
</style>

src/screens/sentry/ui/sentry-page-breadcrumbs/sentry-page-breadcrumbs.vue

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ const formatDate = (timestamp: number): string =>
1717

1818
<template>
1919
<section class="sentry-page-breadcrumbs">
20-
<h3 class="sentry-page-breadcrumbs__title">breadcrumbs</h3>
20+
<h3 class="sentry-page-breadcrumbs__title">
21+
breadcrumbs
22+
23+
<span v-if="breadcrumbs.length > 0" class="sentry-page-breadcrumbs__counter">{{ breadcrumbs.length }}</span>
24+
</h3>
2125
<div class="sentry-page-breadcrumbs__in">
2226
<nav
2327
style="grid-template-columns: 1fr 100px 200px 17px"
@@ -39,7 +43,7 @@ const formatDate = (timestamp: number): string =>
3943

4044
<CodeSnippet
4145
v-if="b.data"
42-
class="mt-3"
46+
class="sentry-page-breadcrumbs__col-data"
4347
language="json"
4448
:code="b.data"
4549
/>
@@ -64,7 +68,7 @@ const formatDate = (timestamp: number): string =>
6468
</div>
6569
</div>
6670
<div class="sentry-page-breadcrumbs__col">
67-
{{ b.level }}
71+
<span class="sentry-page-breadcrumbs__col-level-badge" :class="b.level?.toLowerCase()">{{ b.level }}</span>
6872
</div>
6973
<div class="sentry-page-breadcrumbs__col">
7074
{{ formatDate(b.timestamp) }}
@@ -87,8 +91,12 @@ const formatDate = (timestamp: number): string =>
8791
@apply font-bold uppercase text-sm mb-5;
8892
}
8993
94+
.sentry-page-breadcrumbs__counter {
95+
@apply bg-purple-100 dark:bg-purple-800 text-purple-600 dark:text-purple-100 rounded-full text-xs px-2 py-1 ml-2;
96+
}
97+
9098
.sentry-page-breadcrumbs__in {
91-
@apply flex flex-col border border-purple-300 dark:border-purple-700 rounded;
99+
@apply flex flex-col border border-purple-300 dark:border-gray-400 rounded overflow-hidden;
92100
max-height: 600px;
93101
}
94102
@@ -113,6 +121,10 @@ const formatDate = (timestamp: number): string =>
113121
@apply p-3;
114122
}
115123
124+
.sentry-page-breadcrumbs__col-data {
125+
@apply mt-3 rounded-md overflow-hidden;
126+
}
127+
116128
.sentry-page-breadcrumbs__col-message {
117129
@apply font-bold;
118130
}
@@ -132,4 +144,24 @@ const formatDate = (timestamp: number): string =>
132144
.sentry-page-breadcrumbs__col-detail-value {
133145
@apply px-2 bg-purple-100 dark:bg-purple-800 rounded-r font-bold;
134146
}
147+
148+
.sentry-page-breadcrumbs__col-level-badge {
149+
@apply uppercase text-2xs font-bold rounded-full px-2 py-1;
150+
}
151+
152+
.sentry-page-breadcrumbs__col-level-badge.debug {
153+
@apply bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-100;
154+
}
155+
156+
.sentry-page-breadcrumbs__col-level-badge.error {
157+
@apply bg-red-100 dark:bg-red-800 text-red-600 dark:text-red-100;
158+
}
159+
160+
.sentry-page-breadcrumbs__col-level-badge.warning {
161+
@apply bg-yellow-100 dark:bg-yellow-800 text-yellow-600 dark:text-yellow-100;
162+
}
163+
164+
.sentry-page-breadcrumbs__col-level-badge.info {
165+
@apply bg-blue-100 dark:bg-blue-800 text-blue-600 dark:text-blue-100;
166+
}
135167
</style>

src/screens/sentry/ui/sentry-page-request/sentry-page-request.vue

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,26 @@ const normalizeHeaderValue = (value: unknown) =>
1616
<section class="sentry-page-request">
1717
<h3 class="sentry-page-request__title">request</h3>
1818

19-
<h3 v-if="request" class="sentry-page-request__url">
20-
<strong>{{ request.method || "GET" }}:</strong>
21-
{{ request.url }}
22-
</h3>
23-
24-
<h3 class="sentry-page-request__title sentry-page-request__title--sub">
25-
headers
26-
</h3>
27-
28-
<TableBase v-if="request && request.headers">
29-
<TableBaseRow
30-
v-for="(value, title) in request.headers"
31-
:key="title"
32-
:title="title"
33-
>
34-
{{ normalizeHeaderValue(value) }}
35-
</TableBaseRow>
36-
</TableBase>
19+
<div class="sentry-page-request__wrapper">
20+
<code v-if="request" class="sentry-page-request__url">
21+
<strong>{{ request.method || "GET" }}:</strong>
22+
{{ request.url }}
23+
</code>
24+
25+
<h3 class="sentry-page-request__title sentry-page-request__title--sub">
26+
headers
27+
</h3>
28+
29+
<TableBase v-if="request && request.headers">
30+
<TableBaseRow
31+
v-for="(value, title) in request.headers"
32+
:key="title"
33+
:title="title"
34+
>
35+
{{ normalizeHeaderValue(value) }}
36+
</TableBaseRow>
37+
</TableBase>
38+
</div>
3739
</section>
3840
</template>
3941

@@ -43,6 +45,10 @@ const normalizeHeaderValue = (value: unknown) =>
4345
.sentry-page-request {
4446
}
4547
48+
.sentry-page-request__wrapper {
49+
@apply dark:bg-gray-900 bg-gray-100 p-3 rounded-md border border-purple-300 dark:border-gray-400;
50+
}
51+
4652
.sentry-page-request__title {
4753
@include text-muted;
4854
@apply font-bold uppercase text-sm mb-5;

src/screens/sentry/ui/sentry-page-tags/sentry-page-tags.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ const contextsOS = computed(() => {
146146
}
147147
148148
.sentry-page-tags__labels-wrapper {
149-
@apply bg-gray-50 dark:bg-gray-900 p-4 rounded-lg;
149+
@apply bg-gray-50 dark:bg-gray-900 p-4 rounded-md border border-purple-300 dark:border-gray-400;
150150
}
151151
152152
.sentry-page-tags__label {

src/screens/sentry/ui/sentry-page/sentry-page.vue

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,20 @@ const mainException = computed(
3535
class="sentry-page__main-exception-message"
3636
v-html="mainException.value"
3737
/>
38-
</header>
3938

40-
<header
41-
v-if="event.payload.message !== ''"
42-
class="sentry-page__main-header"
43-
>
44-
<pre
45-
class="sentry-page__main-exception-message"
46-
v-html="event.payload.message"
47-
/>
4839
<p class="sentry-page__main-date">{{ formattedTimestamp }}</p>
4940
</header>
5041

5142
<SentryPageTags :payload="event.payload" class="sentry-page__section" />
5243

5344
<section v-if="mainException" class="sentry-page__section">
54-
<h3 class="sentry-page__section-title">exceptions</h3>
45+
<h3 class="sentry-page__section-title">
46+
exceptions
47+
48+
<span v-if="event?.payload?.exception?.values?.length > 0" class="sentry-page__section-title__counter">
49+
{{ event.payload.exception.values.length }}
50+
</span>
51+
</h3>
5552

5653
<div class="sentry-page__section-exceptions">
5754
<template
@@ -65,6 +62,8 @@ const mainException = computed(
6562
v-for="e in event.payload.exception.values"
6663
:key="`exception-${e.value}-${e.type}`"
6764
:exception="e"
65+
:max-frames="null"
66+
class="sentry-page__section-exceptions__exception"
6867
/>
6968
</template>
7069
</div>
@@ -126,19 +125,28 @@ const mainException = computed(
126125
}
127126
128127
.sentry-page__main-exception-message {
129-
@apply text-sm;
128+
@include code-example();
129+
@apply text-sm rounded text-opacity-60;
130130
}
131131
132132
.sentry-page__section {
133133
@apply py-5 px-4;
134134
}
135135
136-
.sentry-page__section-exceptions {
137-
@apply flex flex-col gap-y-10;
138-
}
139-
140136
.sentry-page__section-title {
141137
@include text-muted;
142138
@apply font-bold uppercase text-sm mb-5;
143139
}
140+
141+
.sentry-page__section-title__counter {
142+
@apply bg-purple-100 dark:bg-purple-800 text-purple-600 dark:text-purple-100 rounded-full text-xs px-2 py-1 ml-2;
143+
}
144+
145+
.sentry-page__section-exceptions {
146+
@apply flex flex-col -mx-4;
147+
}
148+
149+
.sentry-page__section-exceptions__exception {
150+
@apply p-4;
151+
}
144152
</style>

src/shared/ui/preview-card/preview-card-header.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
6464
:href="eventUrl"
6565
target="_blank"
6666
class="preview-card-header__tag preview-card-header__tag--json"
67+
title="Open JSON payload for this event in new tab"
6768
>
6869
JSON
6970
</a>
@@ -85,6 +86,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
8586
<div class="preview-card-header__buttons-expand">
8687
<button
8788
class="preview-card-header__button preview-card-header__button--copy"
89+
title="Copy event as PNG image to clipboard"
8890
@click="copyEvent"
8991
>
9092
<IconSvg name="copy" class="preview-card-header__button-icon" />
@@ -93,6 +95,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
9395
<div class="preview-card-header__buttons-expand-list">
9496
<button
9597
class="preview-card-header__button preview-card-header__button--copy"
98+
title="Download event as JSON file"
9699
@click="downloadFile"
97100
>
98101
<IconSvg
@@ -104,6 +107,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
104107
<button
105108
class="preview-card-header__button preview-card-header__button--copy"
106109
@click="downloadImageEvent"
110+
title="Download event as PNG image"
107111
>
108112
<IconSvg
109113
name="image-download"
@@ -116,6 +120,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
116120
<button
117121
class="preview-card-header__button preview-card-header__button--collapse"
118122
:class="{ 'preview-card-header__button--collapse-closed': !isOpen }"
123+
title="Collapse event"
119124
@click="changeView"
120125
>
121126
<IconSvg
@@ -132,6 +137,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
132137

133138
<button
134139
class="preview-card-header__button preview-card-header__button--lock"
140+
title="Lock event. Locked events will not be deleted"
135141
:class="{
136142
'preview-card-header__button--locked': isLocked,
137143
}"
@@ -142,6 +148,7 @@ const isVisibleTags = computed(() => props.tags.length > 0);
142148

143149
<button
144150
class="preview-card-header__button preview-card-header__button--delete"
151+
title="Delete event"
145152
:disabled="isLocked"
146153
@click="deleteEvent"
147154
>

0 commit comments

Comments
 (0)