This is an automated email from the ASF dual-hosted git repository. elizabeth pushed a commit to branch refactorReports in repository https://gitbox.apache.org/repos/asf/superset.git
commit 57d0d0e4bb248d978df1621f01248605112e055b Author: AAfghahi <[email protected]> AuthorDate: Wed Aug 18 15:58:10 2021 -0400 pexdax refactor (#16333) --- .../HeaderReportActionsDropdown/index.tsx | 100 ++++++++++++++------- .../src/dashboard/components/Header/index.jsx | 57 ++++-------- .../src/explore/components/ExploreChartHeader.jsx | 32 ++----- 3 files changed, 91 insertions(+), 98 deletions(-) diff --git a/superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx b/superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx index 2ffc6f2..4d9ceb8 100644 --- a/superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx +++ b/superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx @@ -26,6 +26,7 @@ import { Menu, NoAnimationDropdown } from 'src/common/components'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import DeleteModal from 'src/components/DeleteModal'; +import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; const deleteColor = (theme: SupersetTheme) => css` color: ${theme.colors.error.base}; @@ -40,9 +41,15 @@ export default function HeaderReportActionsDropDown({ toggleActive: (data: AlertObject, checked: boolean) => void; deleteActiveReport: (data: AlertObject) => void; }) { - const reports = useSelector<any, AlertObject>(state => state.reports); + const reports: Record<number, AlertObject> = useSelector<any, AlertObject>( + state => state.reports, + ); + const user: UserWithPermissionsAndRoles = useSelector< + any, + UserWithPermissionsAndRoles + >(state => state.user || state.explore?.user); const reportsIds = Object.keys(reports); - const report = reports[reportsIds[0]]; + const report: AlertObject = reports[reportsIds[0]]; const [ currentReportDeleting, setCurrentReportDeleting, @@ -60,6 +67,23 @@ export default function HeaderReportActionsDropDown({ setCurrentReportDeleting(null); }; + const canAddReports = () => { + if (!isFeatureEnabled(FeatureFlag.ALERT_REPORTS)) { + return false; + } + if (!user) { + // this is in the case that there is an anonymous user. + return false; + } + const roles = Object.keys(user.roles || []); + const permissions = roles.map(key => + user.roles[key].filter( + perms => perms[0] === 'menu_access' && perms[1] === 'Manage', + ), + ); + return permissions[0].length > 0; + }; + const menu = () => ( <Menu selectable={false} css={{ width: '200px' }}> <Menu.Item> @@ -82,36 +106,48 @@ export default function HeaderReportActionsDropDown({ </Menu> ); - return isFeatureEnabled(FeatureFlag.ALERT_REPORTS) ? ( - <> - <NoAnimationDropdown - // ref={ref} - overlay={menu()} - trigger={['click']} - getPopupContainer={(triggerNode: any) => - triggerNode.closest('.action-button') - } + return canAddReports() ? ( + report ? ( + <> + <NoAnimationDropdown + // ref={ref} + overlay={menu()} + trigger={['click']} + getPopupContainer={(triggerNode: any) => + triggerNode.closest('.action-button') + } + > + <span role="button" className="action-button" tabIndex={0}> + <Icons.Calendar /> + </span> + </NoAnimationDropdown> + {currentReportDeleting && ( + <DeleteModal + description={t( + 'This action will permanently delete %s.', + currentReportDeleting.name, + )} + onConfirm={() => { + if (currentReportDeleting) { + handleReportDelete(currentReportDeleting); + } + }} + onHide={() => setCurrentReportDeleting(null)} + open + title={t('Delete Report?')} + /> + )} + </> + ) : ( + <span + role="button" + title={t('Schedule email report')} + tabIndex={0} + className="action-button" + onClick={showReportModal} > - <span role="button" className="action-button" tabIndex={0}> - <Icons.Calendar /> - </span> - </NoAnimationDropdown> - {currentReportDeleting && ( - <DeleteModal - description={t( - 'This action will permanently delete %s.', - currentReportDeleting.name, - )} - onConfirm={() => { - if (currentReportDeleting) { - handleReportDelete(currentReportDeleting); - } - }} - onHide={() => setCurrentReportDeleting(null)} - open - title={t('Delete Report?')} - /> - )} - </> + <Icons.Calendar /> + </span> + ) ) : null; } diff --git a/superset-frontend/src/dashboard/components/Header/index.jsx b/superset-frontend/src/dashboard/components/Header/index.jsx index b08072e..08ac0fb 100644 --- a/superset-frontend/src/dashboard/components/Header/index.jsx +++ b/superset-frontend/src/dashboard/components/Header/index.jsx @@ -164,7 +164,6 @@ class Header extends React.PureComponent { this.hidePropertiesModal = this.hidePropertiesModal.bind(this); this.showReportModal = this.showReportModal.bind(this); this.hideReportModal = this.hideReportModal.bind(this); - this.renderReportModal = this.renderReportModal.bind(this); } componentDidMount() { @@ -415,29 +414,6 @@ class Header extends React.PureComponent { this.setState({ showingReportModal: false }); } - renderReportModal() { - const attachedReportExists = !!Object.keys(this.props.reports).length; - return attachedReportExists ? ( - <HeaderReportActionsDropdown - showReportModal={this.showReportModal} - toggleActive={this.props.toggleActive} - deleteActiveReport={this.props.deleteActiveReport} - /> - ) : ( - <> - <span - role="button" - title={t('Schedule email report')} - tabIndex={0} - className="action-button" - onClick={this.showReportModal} - > - <Icons.Calendar /> - </span> - </> - ); - } - canAddReports() { if (!isFeatureEnabled(FeatureFlag.ALERT_REPORTS)) { return false; @@ -487,7 +463,6 @@ class Header extends React.PureComponent { const userCanEdit = dashboardInfo.dash_edit_perm; const userCanShare = dashboardInfo.dash_share_perm; const userCanSaveAs = dashboardInfo.dash_save_perm; - const shouldShowReport = !editMode && this.canAddReports(); const refreshLimit = dashboardInfo.common.conf.SUPERSET_DASHBOARD_PERIODICAL_REFRESH_LIMIT; const refreshWarning = @@ -585,27 +560,31 @@ class Header extends React.PureComponent { )} </div> )} - {editMode && ( + {editMode ? ( <UndoRedoKeyListeners onUndo={this.handleCtrlZ} onRedo={this.handleCtrlY} /> - )} - - {!editMode && userCanEdit && ( + ) : ( <> - <span - role="button" - title={t('Edit dashboard')} - tabIndex={0} - className="action-button" - onClick={this.toggleEditMode} - > - <Icons.EditAlt /> - </span> + {userCanEdit && ( + <span + role="button" + title={t('Edit dashboard')} + tabIndex={0} + className="action-button" + onClick={this.toggleEditMode} + > + <Icons.EditAlt /> + </span> + )} + <HeaderReportActionsDropdown + showReportModal={this.showReportModal} + toggleActive={this.props.toggleActive} + deleteActiveReport={this.props.deleteActiveReport} + /> </> )} - {shouldShowReport && this.renderReportModal()} {this.state.showingPropertiesModal && ( <PropertiesModal diff --git a/superset-frontend/src/explore/components/ExploreChartHeader.jsx b/superset-frontend/src/explore/components/ExploreChartHeader.jsx index 967ebbf..30ae52f 100644 --- a/superset-frontend/src/explore/components/ExploreChartHeader.jsx +++ b/superset-frontend/src/explore/components/ExploreChartHeader.jsx @@ -20,7 +20,6 @@ import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import PropTypes from 'prop-types'; -import Icons from 'src/components/Icons'; import { styled, t } from '@superset-ui/core'; import { Tooltip } from 'src/components/Tooltip'; import ReportModal from 'src/components/ReportModal'; @@ -113,7 +112,6 @@ export class ExploreChartHeader extends React.PureComponent { this.closePropertiesModal = this.closePropertiesModal.bind(this); this.showReportModal = this.showReportModal.bind(this); this.hideReportModal = this.hideReportModal.bind(this); - this.renderReportModal = this.renderReportModal.bind(this); } componentDidMount() { @@ -163,30 +161,6 @@ export class ExploreChartHeader extends React.PureComponent { this.setState({ showingReportModal: false }); } - renderReportModal() { - const attachedReportExists = !!Object.keys(this.props.reports).length; - return attachedReportExists ? ( - <HeaderReportActionsDropdown - showReportModal={this.showReportModal} - hideReportModal={this.hideReportModal} - toggleActive={this.props.toggleActive} - deleteActiveReport={this.props.deleteActiveReport} - /> - ) : ( - <> - <span - role="button" - title={t('Schedule email report')} - tabIndex={0} - className="action-button" - onClick={this.showReportModal} - > - <Icons.Calendar /> - </span> - </> - ); - } - canAddReports() { if (!isFeatureEnabled(FeatureFlag.ALERT_REPORTS)) { return false; @@ -293,7 +267,11 @@ export class ExploreChartHeader extends React.PureComponent { isRunning={chartStatus === 'loading'} status={CHART_STATUS_MAP[chartStatus]} /> - {this.canAddReports() && this.renderReportModal()} + <HeaderReportActionsDropdown + showReportModal={this.showReportModal} + toggleActive={this.props.toggleActive} + deleteActiveReport={this.props.deleteActiveReport} + /> <ReportModal show={this.state.showingReportModal} onHide={this.hideReportModal}
