Browse Source

feat(guides): remove some guides (#34228)

Reducing the number of pop-up notifications to reduce noise during onboarding
Stephen Cefali 2 years ago
parent
commit
da45af00af

+ 4 - 91
static/app/components/assistant/getGuidesContent.tsx

@@ -11,37 +11,13 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
   return [
   return [
     {
     {
       guide: 'issue',
       guide: 'issue',
-      requiredTargets: ['issue_title', 'exception'],
+      requiredTargets: ['issue_number', 'exception'],
       steps: [
       steps: [
-        {
-          title: t("Let's Get This Over With"),
-          target: 'issue_title',
-          description: t(
-            `No one likes a product tour. But stick with us, and you'll find it a
-              whole lot easier to use Sentry's Issue details page.`
-          ),
-        },
-        {
-          title: t('Resolve Your Issues'),
-          target: 'resolve',
-          description: t(
-            'So you fixed your problem? Congrats. Hit resolve to make it all go away.'
-          ),
-        },
-        {
-          title: t('Deal With It Later, Or Never'),
-          target: 'ignore_delete_discard',
-          description: t(
-            `Just can't deal with this Issue right now? Ignore it. Saving it for later?
-                Star it. Want it gone and out of your life forever?
-                Delete that sh*t.`
-          ),
-        },
         {
         {
           title: t('Identify Your Issues'),
           title: t('Identify Your Issues'),
           target: 'issue_number',
           target: 'issue_number',
           description: tct(
           description: tct(
-            `You've got a lot of Issues. That's fine. Use the Issue number in your commit message,
+            `You have Issues. That's fine. Use the Issue number in your commit message,
                 and we'll automatically resolve the Issue when your code is deployed. [link:Learn more]`,
                 and we'll automatically resolve the Issue when your code is deployed. [link:Learn more]`,
             {link: <ExternalLink href="https://docs.sentry.io/product/releases/" />}
             {link: <ExternalLink href="https://docs.sentry.io/product/releases/" />}
           ),
           ),
@@ -60,14 +36,6 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
             }
             }
           ),
           ),
         },
         },
-        {
-          title: t('Find Information You Can Use'),
-          target: 'tags',
-          description: t(
-            `So many bugs, so little time. When you've got bugs as far as the mouse can scroll,
-                search and filter Events with tags or visualize Issues with a heat map.`
-          ),
-        },
         {
         {
           title: t('Narrow Down Suspects'),
           title: t('Narrow Down Suspects'),
           target: 'exception',
           target: 'exception',
@@ -137,7 +105,7 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
           title: t('Transactions'),
           title: t('Transactions'),
           target: 'trace_view_guide_row',
           target: 'trace_view_guide_row',
           description: t(
           description: t(
-            `Get an overview of every transaction. You can quickly see all the transactions in a trace alongside the project, transaction duration, and any related errors.`
+            `You can quickly see all the transactions in a trace alongside the project, transaction duration, and any related errors.`
           ),
           ),
         },
         },
         {
         {
@@ -149,7 +117,7 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
     },
     },
     {
     {
       guide: 'span_op_breakdowns_and_tag_explorer',
       guide: 'span_op_breakdowns_and_tag_explorer',
-      requiredTargets: ['span_op_breakdowns_filter', 'span_op_relative_breakdowns'],
+      requiredTargets: ['span_op_breakdowns_filter'],
       steps: [
       steps: [
         {
         {
           title: t('Filter by Span Operation'),
           title: t('Filter by Span Operation'),
@@ -158,18 +126,6 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
             'You can now filter these transaction events based on http, db, browser or resource operation.'
             'You can now filter these transaction events based on http, db, browser or resource operation.'
           ),
           ),
         },
         },
-        {
-          title: t('Span Operation Breakdown'),
-          target: 'span_op_relative_breakdowns',
-          description: tct(
-            'By default, you can now see how each transaction is broken down by operation. Click the spans to filter. [link:Learn more]',
-            {
-              link: (
-                <ExternalLink href="https://docs.sentry.io/product/performance/event-detail/#operations-breakdown" />
-              ),
-            }
-          ),
-        },
         {
         {
           title: t('Suspect Tags'),
           title: t('Suspect Tags'),
           target: 'tag_explorer',
           target: 'tag_explorer',
@@ -184,28 +140,6 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
         },
         },
       ],
       ],
     },
     },
-    {
-      guide: 'team_key_transactions',
-      requiredTargets: ['team_key_transaction_header'],
-      steps: [
-        {
-          title: t('Key Transactions'),
-          target: 'team_key_transaction_header',
-          description: t(
-            'Software development is a team sport. Key Transactions allow you to mark important transactions and share them with your team.'
-          ),
-          nextText: t('Great'),
-        },
-        {
-          title: t('Migrating Key Transactions'),
-          target: 'team_key_transaction_existing',
-          description: t(
-            'To migrate your previous key transactions, you will have to mark them as a key transaction again for your team. Sorry about that.'
-          ),
-          nextText: t('Fine'),
-        },
-      ],
-    },
     {
     {
       guide: 'project_transaction_threshold',
       guide: 'project_transaction_threshold',
       requiredTargets: ['project_transaction_threshold'],
       requiredTargets: ['project_transaction_threshold'],
@@ -253,27 +187,6 @@ export default function getGuidesContent(orgSlug: string | null): GuidesContent
         },
         },
       ],
       ],
     },
     },
-    {
-      guide: 'release_stages',
-      requiredTargets: ['release_stages'],
-      dateThreshold: new Date('2021-05-01'),
-      steps: [
-        {
-          title: t('Adoption Filter'),
-          target: 'release_stages',
-          description: tct(
-            'Select an environment and search for `release.stage:adopted` to filter out releases with low adoption. [br] [link:Learn more]',
-            {
-              br: <br />,
-              link: (
-                <ExternalLink href="https://docs.sentry.io/product/releases/usage/sorting-filtering/#filtering-releases" />
-              ),
-            }
-          ),
-          nextText: t('Got it'),
-        },
-      ],
-    },
     {
     {
       guide: 'new_page_filters',
       guide: 'new_page_filters',
       requiredTargets: ['new_page_filter_button'],
       requiredTargets: ['new_page_filter_button'],

+ 22 - 25
static/app/components/discover/transactionsTable.tsx

@@ -2,7 +2,6 @@ import * as React from 'react';
 import styled from '@emotion/styled';
 import styled from '@emotion/styled';
 import {Location, LocationDescriptor, Query} from 'history';
 import {Location, LocationDescriptor, Query} from 'history';
 
 
-import GuideAnchor from 'sentry/components/assistant/guideAnchor';
 import SortLink from 'sentry/components/gridEditable/sortLink';
 import SortLink from 'sentry/components/gridEditable/sortLink';
 import Link from 'sentry/components/links/link';
 import Link from 'sentry/components/links/link';
 import LoadingIndicator from 'sentry/components/loadingIndicator';
 import LoadingIndicator from 'sentry/components/loadingIndicator';
@@ -67,30 +66,28 @@ class TransactionsTable extends React.PureComponent<Props> {
       if (column.key === 'span_ops_breakdown.relative') {
       if (column.key === 'span_ops_breakdown.relative') {
         return (
         return (
           <HeadCellContainer key={index}>
           <HeadCellContainer key={index}>
-            <GuideAnchor target="span_op_relative_breakdowns">
-              <SortLink
-                align={align}
-                title={
-                  title === t('operation duration') ? (
-                    <React.Fragment>
-                      {title}
-                      <StyledIconQuestion
-                        size="xs"
-                        position="top"
-                        title={t(
-                          `Span durations are summed over the course of an entire transaction. Any overlapping spans are only counted once.`
-                        )}
-                      />
-                    </React.Fragment>
-                  ) : (
-                    title
-                  )
-                }
-                direction={undefined}
-                canSort={false}
-                generateSortLink={generateSortLink}
-              />
-            </GuideAnchor>
+            <SortLink
+              align={align}
+              title={
+                title === t('operation duration') ? (
+                  <React.Fragment>
+                    {title}
+                    <StyledIconQuestion
+                      size="xs"
+                      position="top"
+                      title={t(
+                        `Span durations are summed over the course of an entire transaction. Any overlapping spans are only counted once.`
+                      )}
+                    />
+                  </React.Fragment>
+                ) : (
+                  title
+                )
+              }
+              direction={undefined}
+              canSort={false}
+              generateSortLink={generateSortLink}
+            />
           </HeadCellContainer>
           </HeadCellContainer>
         );
         );
       }
       }

+ 18 - 22
static/app/components/eventOrGroupTitle.tsx

@@ -1,7 +1,6 @@
 import {Fragment} from 'react';
 import {Fragment} from 'react';
 import styled from '@emotion/styled';
 import styled from '@emotion/styled';
 
 
-import GuideAnchor from 'sentry/components/assistant/guideAnchor';
 import ProjectsStore from 'sentry/stores/projectsStore';
 import ProjectsStore from 'sentry/stores/projectsStore';
 import overflowEllipsis from 'sentry/styles/overflowEllipsis';
 import overflowEllipsis from 'sentry/styles/overflowEllipsis';
 import {BaseGroup, GroupTombstone, Organization} from 'sentry/types';
 import {BaseGroup, GroupTombstone, Organization} from 'sentry/types';
@@ -26,7 +25,6 @@ function EventOrGroupTitle({
   organization,
   organization,
   data,
   data,
   withStackTracePreview,
   withStackTracePreview,
-  hasGuideAnchor,
   grouping = false,
   grouping = false,
   className,
   className,
 }: Props) {
 }: Props) {
@@ -43,26 +41,24 @@ function EventOrGroupTitle({
 
 
   return (
   return (
     <Wrapper className={className} hasGroupingTreeUI={hasGroupingTreeUI}>
     <Wrapper className={className} hasGroupingTreeUI={hasGroupingTreeUI}>
-      <GuideAnchor disabled={!hasGuideAnchor} target="issue_title" position="bottom">
-        {withStackTracePreview ? (
-          <StyledStacktracePreview
-            organization={organization}
-            issueId={groupID ? groupID : id}
-            groupingCurrentLevel={groupingCurrentLevel}
-            // we need eventId and projectSlug only when hovering over Event, not Group
-            // (different API call is made to get the stack trace then)
-            eventId={eventID}
-            projectSlug={eventID ? ProjectsStore.getById(projectID)?.slug : undefined}
-            hasGroupingStacktraceUI={hasGroupingStacktraceUI}
-          >
-            {treeLabel ? <EventTitleTreeLabel treeLabel={treeLabel} /> : title}
-          </StyledStacktracePreview>
-        ) : treeLabel ? (
-          <EventTitleTreeLabel treeLabel={treeLabel} />
-        ) : (
-          title
-        )}
-      </GuideAnchor>
+      {withStackTracePreview ? (
+        <StyledStacktracePreview
+          organization={organization}
+          issueId={groupID ? groupID : id}
+          groupingCurrentLevel={groupingCurrentLevel}
+          // we need eventId and projectSlug only when hovering over Event, not Group
+          // (different API call is made to get the stack trace then)
+          eventId={eventID}
+          projectSlug={eventID ? ProjectsStore.getById(projectID)?.slug : undefined}
+          hasGroupingStacktraceUI={hasGroupingStacktraceUI}
+        >
+          {treeLabel ? <EventTitleTreeLabel treeLabel={treeLabel} /> : title}
+        </StyledStacktracePreview>
+      ) : treeLabel ? (
+        <EventTitleTreeLabel treeLabel={treeLabel} />
+      ) : (
+        title
+      )}
       {subtitle && (
       {subtitle && (
         <Fragment>
         <Fragment>
           <Spacer />
           <Spacer />

+ 1 - 8
static/app/components/group/sidebar.tsx

@@ -6,7 +6,6 @@ import keyBy from 'lodash/keyBy';
 import pickBy from 'lodash/pickBy';
 import pickBy from 'lodash/pickBy';
 
 
 import {Client} from 'sentry/api';
 import {Client} from 'sentry/api';
-import GuideAnchor from 'sentry/components/assistant/guideAnchor';
 import EnvironmentPageFilter from 'sentry/components/environmentPageFilter';
 import EnvironmentPageFilter from 'sentry/components/environmentPageFilter';
 import ErrorBoundary from 'sentry/components/errorBoundary';
 import ErrorBoundary from 'sentry/components/errorBoundary';
 import ExternalIssueList from 'sentry/components/group/externalIssuesList';
 import ExternalIssueList from 'sentry/components/group/externalIssuesList';
@@ -210,13 +209,7 @@ class BaseGroupSidebar extends Component<Props, State> {
 
 
         {this.renderPluginIssue()}
         {this.renderPluginIssue()}
 
 
-        <SidebarSection
-          title={
-            <GuideAnchor target="tags" position="bottom">
-              {t('Tags')}
-            </GuideAnchor>
-          }
-        >
+        <SidebarSection title={t('Tags')}>
           {!tagsWithTopValues ? (
           {!tagsWithTopValues ? (
             <TagPlaceholders>
             <TagPlaceholders>
               <Placeholder height="40px" />
               <Placeholder height="40px" />

+ 6 - 8
static/app/views/performance/table.tsx

@@ -325,14 +325,12 @@ class _Table extends Component<Props, State> {
       if (teamKeyTransactionColumn) {
       if (teamKeyTransactionColumn) {
         if (isHeader) {
         if (isHeader) {
           const star = (
           const star = (
-            <GuideAnchor target="team_key_transaction_header" position="top">
-              <IconStar
-                key="keyTransaction"
-                color="yellow300"
-                isSolid
-                data-test-id="team-key-transaction-header"
-              />
-            </GuideAnchor>
+            <IconStar
+              key="keyTransaction"
+              color="yellow300"
+              isSolid
+              data-test-id="team-key-transaction-header"
+            />
           );
           );
           return [this.renderHeadCell(tableData?.meta, teamKeyTransactionColumn, star)];
           return [this.renderHeadCell(tableData?.meta, teamKeyTransactionColumn, star)];
         }
         }

+ 17 - 23
static/app/views/releases/list/index.tsx

@@ -547,29 +547,23 @@ class ReleasesList extends AsyncView<Props, State> {
                 position="bottom"
                 position="bottom"
                 disabled={!hasReleasesSetup}
                 disabled={!hasReleasesSetup}
               >
               >
-                <GuideAnchor
-                  target="release_stages"
-                  position="bottom"
-                  disabled={!showReleaseAdoptionStages}
-                >
-                  <StyledSmartSearchBar
-                    searchSource="releases"
-                    query={this.getQuery()}
-                    placeholder={t('Search by version, build, package, or stage')}
-                    maxSearchItems={5}
-                    hasRecentSearches={false}
-                    supportedTags={{
-                      ...SEMVER_TAGS,
-                      release: {
-                        key: 'release',
-                        name: 'release',
-                      },
-                    }}
-                    supportedTagType={ItemType.PROPERTY}
-                    onSearch={this.handleSearch}
-                    onGetTagValues={this.getTagValues}
-                  />
-                </GuideAnchor>
+                <StyledSmartSearchBar
+                  searchSource="releases"
+                  query={this.getQuery()}
+                  placeholder={t('Search by version, build, package, or stage')}
+                  maxSearchItems={5}
+                  hasRecentSearches={false}
+                  supportedTags={{
+                    ...SEMVER_TAGS,
+                    release: {
+                      key: 'release',
+                      name: 'release',
+                    },
+                  }}
+                  supportedTagType={ItemType.PROPERTY}
+                  onSearch={this.handleSearch}
+                  onGetTagValues={this.getTagValues}
+                />
               </GuideAnchor>
               </GuideAnchor>
               <ReleasesStatusOptions
               <ReleasesStatusOptions
                 selected={activeStatus}
                 selected={activeStatus}

+ 10 - 10
tests/js/spec/components/assistant/guideAnchor.spec.jsx

@@ -24,13 +24,13 @@ describe('GuideAnchor', function () {
   it('renders, advances, and finishes', async function () {
   it('renders, advances, and finishes', async function () {
     render(
     render(
       <div>
       <div>
-        <GuideAnchor target="issue_title" />
+        <GuideAnchor target="issue_number" />
         <GuideAnchor target="exception" />
         <GuideAnchor target="exception" />
       </div>
       </div>
     );
     );
 
 
     GuideStore.fetchSucceeded(serverGuide);
     GuideStore.fetchSucceeded(serverGuide);
-    expect(await screen.findByText("Let's Get This Over With")).toBeInTheDocument();
+    expect(await screen.findByText('Identify Your Issues')).toBeInTheDocument();
 
 
     // XXX(epurkhiser): Skip pointer event checks due to a bug with how Popper
     // XXX(epurkhiser): Skip pointer event checks due to a bug with how Popper
     // renders the hovercard with pointer-events: none. See [0]
     // renders the hovercard with pointer-events: none. See [0]
@@ -44,7 +44,7 @@ describe('GuideAnchor', function () {
     });
     });
 
 
     expect(await screen.findByText('Narrow Down Suspects')).toBeInTheDocument();
     expect(await screen.findByText('Narrow Down Suspects')).toBeInTheDocument();
-    expect(screen.queryByText("Let's Get This Over With")).not.toBeInTheDocument();
+    expect(screen.queryByText('Identify Your Issues')).not.toBeInTheDocument();
 
 
     // Clicking on the button in the last step should finish the guide.
     // Clicking on the button in the last step should finish the guide.
     const finishMock = MockApiClient.addMockResponse({
     const finishMock = MockApiClient.addMockResponse({
@@ -71,13 +71,13 @@ describe('GuideAnchor', function () {
   it('dismisses', async function () {
   it('dismisses', async function () {
     render(
     render(
       <div>
       <div>
-        <GuideAnchor target="issue_title" />
+        <GuideAnchor target="issue_number" />
         <GuideAnchor target="exception" />
         <GuideAnchor target="exception" />
       </div>
       </div>
     );
     );
 
 
     GuideStore.fetchSucceeded(serverGuide);
     GuideStore.fetchSucceeded(serverGuide);
-    expect(await screen.findByText("Let's Get This Over With")).toBeInTheDocument();
+    expect(await screen.findByText('Identify Your Issues')).toBeInTheDocument();
 
 
     const dismissMock = MockApiClient.addMockResponse({
     const dismissMock = MockApiClient.addMockResponse({
       method: 'PUT',
       method: 'PUT',
@@ -99,7 +99,7 @@ describe('GuideAnchor', function () {
       })
       })
     );
     );
 
 
-    expect(screen.queryByText("Let's Get This Over With")).not.toBeInTheDocument();
+    expect(screen.queryByText('Identify Your Issues')).not.toBeInTheDocument();
   });
   });
 
 
   it('renders no container when inactive', function () {
   it('renders no container when inactive', function () {
@@ -127,16 +127,16 @@ describe('GuideAnchor', function () {
   it('if forceHide is true, do not render guide', async function () {
   it('if forceHide is true, do not render guide', async function () {
     render(
     render(
       <div>
       <div>
-        <GuideAnchor target="issue_title" />
+        <GuideAnchor target="issue_number" />
         <GuideAnchor target="exception" />
         <GuideAnchor target="exception" />
       </div>
       </div>
     );
     );
 
 
     GuideStore.fetchSucceeded(serverGuide);
     GuideStore.fetchSucceeded(serverGuide);
-    expect(await screen.findByText("Let's Get This Over With")).toBeInTheDocument();
+    expect(await screen.findByText('Identify Your Issues')).toBeInTheDocument();
     GuideStore.setForceHide(true);
     GuideStore.setForceHide(true);
-    expect(screen.queryByText("Let's Get This Over With")).not.toBeInTheDocument();
+    expect(screen.queryByText('Identify Your Issues')).not.toBeInTheDocument();
     GuideStore.setForceHide(false);
     GuideStore.setForceHide(false);
-    expect(await screen.findByText("Let's Get This Over With")).toBeInTheDocument();
+    expect(await screen.findByText('Identify Your Issues')).toBeInTheDocument();
   });
   });
 });
 });

+ 1 - 1
tests/js/spec/components/streamGroup.spec.jsx

@@ -54,7 +54,7 @@ describe('StreamGroup', function () {
     await tick();
     await tick();
 
 
     expect(component.find('GuideAnchor').exists()).toBe(true);
     expect(component.find('GuideAnchor').exists()).toBe(true);
-    expect(component.find('GuideAnchor')).toHaveLength(3);
+    expect(component.find('GuideAnchor')).toHaveLength(2);
     expect(component).toSnapshot();
     expect(component).toSnapshot();
   });
   });
 
 

+ 1 - 1
tests/js/spec/stores/guideStore.spec.jsx

@@ -25,7 +25,7 @@ describe('GuideStore', function () {
       },
       },
       {guide: 'issue_stream', seen: true},
       {guide: 'issue_stream', seen: true},
     ];
     ];
-    GuideStore.registerAnchor('issue_title');
+    GuideStore.registerAnchor('issue_number');
     GuideStore.registerAnchor('exception');
     GuideStore.registerAnchor('exception');
     GuideStore.registerAnchor('breadcrumbs');
     GuideStore.registerAnchor('breadcrumbs');
     GuideStore.registerAnchor('issue_stream');
     GuideStore.registerAnchor('issue_stream');