Skip to content

Commit 7465b6f

Browse files
davidenwanggithub-actions[bot]markstory
authored
fix(alert): Fix feature permissions on 'Create Alert' button (#21124)
* fixed hovercard * style(): Auto eslint fix * update reactnode Co-authored-by: Mark Story <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Mark Story <[email protected]>
1 parent 514c9cb commit 7465b6f

File tree

3 files changed

+50
-47
lines changed

3 files changed

+50
-47
lines changed

src/sentry/static/sentry/app/views/eventsV2/resultsHeader.tsx

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import styled from '@emotion/styled';
55
import {Organization, SavedQuery} from 'app/types';
66
import {fetchSavedQuery} from 'app/actionCreators/discoverSavedQueries';
77
import {Client} from 'app/api';
8-
import Feature from 'app/components/acl/feature';
9-
import FeatureDisabled from 'app/components/acl/featureDisabled';
10-
import Hovercard from 'app/components/hovercard';
118
import TimeSince from 'app/components/timeSince';
129
import {t} from 'app/locale';
1310
import withApi from 'app/utils/withApi';
@@ -97,21 +94,6 @@ class ResultsHeader extends React.Component<Props, State> {
9794
} = this.props;
9895
const {savedQuery, loading} = this.state;
9996

100-
const renderDisabled = p => (
101-
<Hovercard
102-
body={
103-
<FeatureDisabled
104-
features={p.features}
105-
hideHelpToggle
106-
message={t('Discover queries are disabled')}
107-
featureName={t('Discover queries')}
108-
/>
109-
}
110-
>
111-
{p.children(p)}
112-
</Hovercard>
113-
);
114-
11597
return (
11698
<Layout.Header>
11799
<Layout.HeaderContent>
@@ -128,25 +110,16 @@ class ResultsHeader extends React.Component<Props, State> {
128110
{this.renderAuthor()}
129111
</Layout.HeaderContent>
130112
<Layout.HeaderActions>
131-
<Feature
113+
<SavedQueryButtonGroup
114+
location={location}
132115
organization={organization}
133-
features={['discover-query']}
134-
hookName="feature-disabled:discover-saved-query-create"
135-
renderDisabled={renderDisabled}
136-
>
137-
{({hasFeature}) => (
138-
<SavedQueryButtonGroup
139-
location={location}
140-
organization={organization}
141-
eventView={eventView}
142-
savedQuery={savedQuery}
143-
savedQueryLoading={loading}
144-
disabled={!hasFeature || (errorCode >= 400 && errorCode < 500)}
145-
updateCallback={() => this.fetchData()}
146-
onIncompatibleAlertQuery={onIncompatibleAlertQuery}
147-
/>
148-
)}
149-
</Feature>
116+
eventView={eventView}
117+
savedQuery={savedQuery}
118+
savedQueryLoading={loading}
119+
disabled={errorCode >= 400 && errorCode < 500}
120+
updateCallback={() => this.fetchData()}
121+
onIncompatibleAlertQuery={onIncompatibleAlertQuery}
122+
/>
150123
</Layout.HeaderActions>
151124
</Layout.Header>
152125
);

src/sentry/static/sentry/app/views/eventsV2/savedQuery/index.tsx

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import Button from 'app/components/button';
1111
import DropdownButton from 'app/components/dropdownButton';
1212
import DropdownControl from 'app/components/dropdownControl';
1313
import Feature from 'app/components/acl/feature';
14+
import FeatureDisabled from 'app/components/acl/featureDisabled';
15+
import Hovercard from 'app/components/hovercard';
1416
import Input from 'app/components/forms/input';
1517
import space from 'app/styles/space';
1618
import {IconDelete} from 'app/icons';
@@ -204,8 +206,7 @@ class SavedQueryButtonGroup extends React.PureComponent<Props, State> {
204206
});
205207
};
206208

207-
renderButtonSaveAs() {
208-
const {disabled} = this.props;
209+
renderButtonSaveAs(disabled: boolean) {
209210
const {queryName} = this.state;
210211
/**
211212
* For a great UX, we should focus on `ButtonSaveInput` when `ButtonSave`
@@ -252,7 +253,7 @@ class SavedQueryButtonGroup extends React.PureComponent<Props, State> {
252253
);
253254
}
254255

255-
renderButtonSave() {
256+
renderButtonSave(disabled: boolean) {
256257
const {isNewQuery, isEditingQuery} = this.state;
257258

258259
// Existing query that hasn't been modified.
@@ -270,21 +271,21 @@ class SavedQueryButtonGroup extends React.PureComponent<Props, State> {
270271
<Button
271272
onClick={this.handleUpdateQuery}
272273
data-test-id="discover2-savedquery-button-update"
273-
disabled={this.props.disabled}
274+
disabled={disabled}
274275
>
275276
<IconUpdate />
276277
{t('Save Changes')}
277278
</Button>
278-
{this.renderButtonSaveAs()}
279+
{this.renderButtonSaveAs(disabled)}
279280
</React.Fragment>
280281
);
281282
}
282283

283284
// Is a new query enable saveas
284-
return this.renderButtonSaveAs();
285+
return this.renderButtonSaveAs(disabled);
285286
}
286287

287-
renderButtonDelete() {
288+
renderButtonDelete(disabled: boolean) {
288289
const {isNewQuery} = this.state;
289290

290291
if (isNewQuery) {
@@ -295,7 +296,7 @@ class SavedQueryButtonGroup extends React.PureComponent<Props, State> {
295296
<Button
296297
data-test-id="discover2-savedquery-button-delete"
297298
onClick={this.handleDeleteQuery}
298-
disabled={this.props.disabled}
299+
disabled={disabled}
299300
icon={<IconDelete />}
300301
/>
301302
);
@@ -319,13 +320,42 @@ class SavedQueryButtonGroup extends React.PureComponent<Props, State> {
319320

320321
render() {
321322
const {organization} = this.props;
323+
324+
const renderDisabled = p => (
325+
<Hovercard
326+
body={
327+
<FeatureDisabled
328+
features={p.features}
329+
hideHelpToggle
330+
message={t('Discover queries are disabled')}
331+
featureName={t('Discover queries')}
332+
/>
333+
}
334+
>
335+
{p.children(p)}
336+
</Hovercard>
337+
);
338+
339+
const renderQueryButton = (renderFunc: (disabled: boolean) => React.ReactNode) => {
340+
return (
341+
<Feature
342+
organization={organization}
343+
features={['discover-query']}
344+
hookName="feature-disabled:discover-saved-query-create"
345+
renderDisabled={renderDisabled}
346+
>
347+
{({hasFeature}) => renderFunc(!hasFeature || this.props.disabled)}
348+
</Feature>
349+
);
350+
};
351+
322352
return (
323353
<ButtonGroup>
324-
{this.renderButtonSave()}
354+
{renderQueryButton(disabled => this.renderButtonSave(disabled))}
325355
<Feature organization={organization} features={['incidents']}>
326356
{({hasFeature}) => hasFeature && this.renderButtonCreateAlert()}
327357
</Feature>
328-
{this.renderButtonDelete()}
358+
{renderQueryButton(disabled => this.renderButtonDelete(disabled))}
329359
</ButtonGroup>
330360
);
331361
}

tests/js/spec/views/eventsV2/savedQuery/index.spec.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ function generateWrappedComponent(
3636

3737
describe('EventsV2 > SaveQueryButtonGroup', function () {
3838
// Organization + Location does not affect state in this component
39-
const organization = TestStubs.Organization();
39+
const organization = TestStubs.Organization({features: ['discover-query']});
4040
const location = {
4141
pathname: '/organization/eventsv2/',
4242
query: {},

0 commit comments

Comments
 (0)