Browse Source

feat(escalating): Add archived until escalating issue activity (#48173)

Scott Cooper 1 year ago
parent
commit
debc602205

+ 2 - 0
static/app/types/group.tsx

@@ -352,6 +352,8 @@ export interface GroupActivitySetIgnored extends GroupActivityBase {
     ignoreCount?: number;
     ignoreDuration?: number;
     ignoreUntil?: string;
+    /** Archived until escalating */
+    ignoreUntilEscalating?: boolean;
     ignoreUserCount?: number;
     ignoreUserWindow?: number;
     ignoreWindow?: number;

+ 61 - 0
static/app/views/issueDetails/groupActivity.spec.jsx

@@ -14,10 +14,12 @@ import GroupStore from 'sentry/stores/groupStore';
 import OrganizationStore from 'sentry/stores/organizationStore';
 import ProjectsStore from 'sentry/stores/projectsStore';
 import TeamStore from 'sentry/stores/teamStore';
+import {GroupActivityType} from 'sentry/types';
 import {GroupActivity} from 'sentry/views/issueDetails/groupActivity';
 
 describe('GroupActivity', function () {
   let project;
+  const dateCreated = '2021-10-01T15:31:38.950115Z';
 
   beforeEach(function () {
     project = TestStubs.Project();
@@ -338,4 +340,63 @@ describe('GroupActivity', function () {
       expect(deleteMock).toHaveBeenCalledTimes(1);
     });
   });
+
+  it('renders ignored', function () {
+    createWrapper({
+      activity: [
+        {
+          id: '123',
+          type: GroupActivityType.SET_IGNORED,
+          data: {
+            ignoreUntilEscalating: true,
+          },
+          user: TestStubs.User(),
+          dateCreated,
+        },
+      ],
+    });
+    expect(screen.getAllByTestId('activity-item').at(-1)).toHaveTextContent(
+      'Foo Bar ignored this issue'
+    );
+  });
+
+  it('renders archived until escalating if org has `escalating-issues-ui` feature', function () {
+    createWrapper({
+      activity: [
+        {
+          id: '123',
+          type: GroupActivityType.SET_IGNORED,
+          data: {
+            ignoreUntilEscalating: true,
+          },
+          user: TestStubs.User(),
+          dateCreated,
+        },
+      ],
+      organization: {features: ['escalating-issues-ui']},
+    });
+    expect(screen.getAllByTestId('activity-item').at(-1)).toHaveTextContent(
+      'Foo Bar archived this issue until it escalates'
+    );
+  });
+
+  it('renders ignored until it happens x times in time window', function () {
+    createWrapper({
+      activity: [
+        {
+          id: '123',
+          type: GroupActivityType.SET_IGNORED,
+          data: {
+            ignoreCount: 400,
+            ignoreWindow: 1,
+          },
+          user: TestStubs.User(),
+          dateCreated,
+        },
+      ],
+    });
+    expect(screen.getAllByTestId('activity-item').at(-1)).toHaveTextContent(
+      'Foo Bar ignored this issue until it happens 400 time(s) in 1 minute'
+    );
+  });
 });

+ 1 - 1
static/app/views/issueDetails/groupActivity.tsx

@@ -221,7 +221,7 @@ class GroupActivity extends Component<Props, State> {
                             <GroupActivityItem
                               author={<ActivityAuthor>{authorName}</ActivityAuthor>}
                               activity={item}
-                              orgSlug={organization.slug}
+                              organization={organization}
                               projectId={group.project.id}
                             />
                           }

+ 23 - 10
static/app/views/issueDetails/groupActivityItem.tsx

@@ -23,26 +23,30 @@ import {
 type Props = {
   activity: GroupActivity;
   author: React.ReactNode;
-  orgSlug: Organization['slug'];
+  organization: Organization;
   projectId: Project['id'];
 };
 
-function GroupActivityItem({activity, orgSlug, projectId, author}: Props) {
-  const issuesLink = `/organizations/${orgSlug}/issues/`;
+function GroupActivityItem({activity, organization, projectId, author}: Props) {
+  const issuesLink = `/organizations/${organization.slug}/issues/`;
+  const hasEscalatingIssuesUi = organization.features.includes('escalating-issues-ui');
 
   function getIgnoredMessage(data: GroupActivitySetIgnored['data']) {
+    const ignoredOrArchived = hasEscalatingIssuesUi ? t('archived') : t('ignored');
     if (data.ignoreDuration) {
-      return tct('[author] ignored this issue for [duration]', {
+      return tct('[author] [action] this issue for [duration]', {
         author,
+        action: ignoredOrArchived,
         duration: <Duration seconds={data.ignoreDuration * 60} />,
       });
     }
 
     if (data.ignoreCount && data.ignoreWindow) {
       return tct(
-        '[author] ignored this issue until it happens [count] time(s) in [duration]',
+        '[author] [action] this issue until it happens [count] time(s) in [duration]',
         {
           author,
+          action: ignoredOrArchived,
           count: data.ignoreCount,
           duration: <Duration seconds={data.ignoreWindow * 60} />,
         }
@@ -50,17 +54,19 @@ function GroupActivityItem({activity, orgSlug, projectId, author}: Props) {
     }
 
     if (data.ignoreCount) {
-      return tct('[author] ignored this issue until it happens [count] time(s)', {
+      return tct('[author] [action] this issue until it happens [count] time(s)', {
         author,
+        action: ignoredOrArchived,
         count: data.ignoreCount,
       });
     }
 
     if (data.ignoreUserCount && data.ignoreUserWindow) {
       return tct(
-        '[author] ignored this issue until it affects [count] user(s) in [duration]',
+        '[author] [action] this issue until it affects [count] user(s) in [duration]',
         {
           author,
+          action: ignoredOrArchived,
           count: data.ignoreUserCount,
           duration: <Duration seconds={data.ignoreUserWindow * 60} />,
         }
@@ -68,13 +74,20 @@ function GroupActivityItem({activity, orgSlug, projectId, author}: Props) {
     }
 
     if (data.ignoreUserCount) {
-      return tct('[author] ignored this issue until it affects [count] user(s)', {
+      return tct('[author] [action] this issue until it affects [count] user(s)', {
         author,
+        action: ignoredOrArchived,
         count: data.ignoreUserCount,
       });
     }
 
-    return tct('[author] ignored this issue', {author});
+    if (hasEscalatingIssuesUi && data.ignoreUntilEscalating) {
+      return tct('[author] archived this issue until it escalates', {
+        author,
+      });
+    }
+
+    return tct('[author] [action] this issue', {author, action: ignoredOrArchived});
   }
 
   function getAssignedMessage(data: GroupActivityAssigned['data']) {
@@ -331,7 +344,7 @@ function GroupActivityItem({activity, orgSlug, projectId, author}: Props) {
           author,
           ['new-events']: (
             <Link
-              to={`/organizations/${orgSlug}/issues/?query=reprocessing.original_issue_id:${oldGroupId}&referrer=group-activity-reprocesses`}
+              to={`/organizations/${organization.slug}/issues/?query=reprocessing.original_issue_id:${oldGroupId}&referrer=group-activity-reprocesses`}
             >
               {tn('See %s new event', 'See %s new events', eventCount)}
             </Link>