Dashboard: Move "add" actions into a dropdown (#85776)

* Move all add actions into a dropdown

* Hide alerts rules when editing

* Hide fav icon when editing
This commit is contained in:
Ivan Ortega Alba 2024-04-09 10:09:37 +02:00 committed by GitHub
parent e234d098e9
commit df72cfd38e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 83 additions and 82 deletions

View File

@ -30,10 +30,7 @@ describe('NavToolbarActions', () => {
setup();
expect(screen.queryByText('Save dashboard')).not.toBeInTheDocument();
expect(screen.queryByLabelText('Add visualization')).not.toBeInTheDocument();
expect(screen.queryByLabelText('Add row')).not.toBeInTheDocument();
expect(screen.queryByLabelText('Paste panel')).not.toBeInTheDocument();
expect(screen.queryByLabelText('Add library panel')).not.toBeInTheDocument();
expect(screen.queryByLabelText('Add')).not.toBeInTheDocument();
expect(await screen.findByText('Edit')).toBeInTheDocument();
expect(await screen.findByText('Share')).toBeInTheDocument();
});
@ -83,10 +80,7 @@ describe('NavToolbarActions', () => {
expect(await screen.findByText('Save dashboard')).toBeInTheDocument();
expect(await screen.findByText('Exit edit')).toBeInTheDocument();
expect(await screen.findByLabelText('Add visualization')).toBeInTheDocument();
expect(await screen.findByLabelText('Add row')).toBeInTheDocument();
expect(await screen.findByLabelText('Paste panel')).toBeInTheDocument();
expect(await screen.findByLabelText('Add library panel')).toBeInTheDocument();
expect(await screen.findByText('Add')).toBeInTheDocument();
expect(screen.queryByText('Edit')).not.toBeInTheDocument();
expect(screen.queryByText('Share')).not.toBeInTheDocument();
expect(screen.queryByText(selectors.pages.Dashboard.DashNav.playlistControls.prev)).not.toBeInTheDocument();

View File

@ -47,6 +47,7 @@ export function ToolbarActions({ dashboard }: Props) {
hasCopiedPanel: copiedPanel,
} = dashboard.useState();
const { isPlaying } = playlistSrv.useState();
const [isAddPanelMenuOpen, setIsAddPanelMenuOpen] = useState(false);
const canSaveAs = contextSrv.hasEditPermissionInFolders;
const toolbarActions: ToolbarAction[] = [];
@ -66,73 +67,7 @@ export function ToolbarActions({ dashboard }: Props) {
toolbarActions.push({
group: 'icon-actions',
condition: isEditingAndShowingDashboard,
render: () => (
<ToolbarButton
key="add-visualization"
tooltip={'Add visualization'}
icon="graph-bar"
onClick={() => {
const id = dashboard.onCreateNewPanel();
DashboardInteractions.toolbarAddButtonClicked({ item: 'add_visualization' });
locationService.partial({ editPanel: id });
}}
/>
),
});
toolbarActions.push({
group: 'icon-actions',
condition: isEditingAndShowingDashboard,
render: () => (
<ToolbarButton
key="add-library-panel"
tooltip={'Add library panel'}
icon="library-panel"
onClick={() => {
dashboard.onCreateLibPanelWidget();
DashboardInteractions.toolbarAddButtonClicked({ item: 'add_library_panel' });
}}
/>
),
});
toolbarActions.push({
group: 'icon-actions',
condition: isEditingAndShowingDashboard,
render: () => (
<ToolbarButton
key="add-row"
tooltip={'Add row'}
icon="wrap-text"
onClick={() => {
dashboard.onCreateNewRow();
DashboardInteractions.toolbarAddButtonClicked({ item: 'add_row' });
}}
/>
),
});
toolbarActions.push({
group: 'icon-actions',
condition: isEditingAndShowingDashboard,
render: () => (
<ToolbarButton
key="paste-panel"
disabled={!hasCopiedPanel}
tooltip={'Paste panel'}
icon="copy"
onClick={() => {
dashboard.pastePanel();
DashboardInteractions.toolbarAddButtonClicked({ item: 'paste_panel' });
}}
/>
),
});
toolbarActions.push({
group: 'icon-actions',
condition: uid && Boolean(meta.canStar) && isShowingDashboard,
condition: uid && Boolean(meta.canStar) && isShowingDashboard && !isEditing,
render: () => {
let desc = meta.isStarred
? t('dashboard.toolbar.unmark-favorite', 'Unmark as favorite')
@ -157,7 +92,7 @@ export function ToolbarActions({ dashboard }: Props) {
toolbarActions.push({
group: 'icon-actions',
condition: isDevEnv && uid && isShowingDashboard,
condition: isDevEnv && uid && isShowingDashboard && !isEditing,
render: () => (
<ToolbarButton
key="view-in-old-dashboard-button"
@ -174,7 +109,84 @@ export function ToolbarActions({ dashboard }: Props) {
group: 'icon-actions',
condition: meta.isSnapshot && !isEditing,
render: () => (
<GoToSnapshotOriginButton originalURL={dashboard.getInitialSaveModel()?.snapshot?.originalUrl ?? ''} />
<GoToSnapshotOriginButton
key="go-to-snapshot-origin"
originalURL={dashboard.getInitialSaveModel()?.snapshot?.originalUrl ?? ''}
/>
),
});
if (!isEditingPanel && !isEditing) {
// This adds the alert rules button and the dashboard insights button
addDynamicActions(toolbarActions, dynamicDashNavActions.right, 'icon-actions');
}
toolbarActions.push({
group: 'add-panel',
condition: isEditingAndShowingDashboard,
render: () => (
<Dropdown
key="add-panel-dropdown"
onVisibleChange={(isOpen) => {
setIsAddPanelMenuOpen(isOpen);
DashboardInteractions.toolbarAddClick();
}}
overlay={() => (
<Menu>
<Menu.Item
key="add-visualization"
testId={selectors.pages.AddDashboard.itemButton('Add new visualization menu item')}
label={t('dashboard.add-menu.visualization', 'Visualization')}
onClick={() => {
const id = dashboard.onCreateNewPanel();
DashboardInteractions.toolbarAddButtonClicked({ item: 'add_visualization' });
locationService.partial({ editPanel: id });
}}
/>
<Menu.Item
key="add-panel-lib"
testId={selectors.pages.AddDashboard.itemButton('Add new panel from panel library menu item')}
label={t('dashboard.add-menu.import', 'Import from library')}
onClick={() => {
dashboard.onCreateLibPanelWidget();
DashboardInteractions.toolbarAddButtonClicked({ item: 'add_library_panel' });
}}
/>
<Menu.Item
key="add-row"
testId={selectors.pages.AddDashboard.itemButton('Add new row menu item')}
label={t('dashboard.add-menu.row', 'Row')}
onClick={() => {
dashboard.onCreateNewRow();
DashboardInteractions.toolbarAddButtonClicked({ item: 'add_row' });
}}
/>
<Menu.Item
key="paste-panel"
disabled={!hasCopiedPanel}
testId={selectors.pages.AddDashboard.itemButton('Add new panel from clipboard menu item')}
label={t('dashboard.add-menu.paste-panel', 'Paste panel')}
onClick={() => {
dashboard.pastePanel();
DashboardInteractions.toolbarAddButtonClicked({ item: 'paste_panel' });
}}
/>
</Menu>
)}
placement="bottom"
offset={[0, 6]}
>
<Button
key="add-panel-button"
variant="primary"
size="sm"
fill="outline"
data-testid={selectors.components.PageToolbar.itemButton('Add button')}
>
<Trans i18nKey="dashboard.toolbar.add">Add</Trans>
<Icon name={isAddPanelMenuOpen ? 'angle-up' : 'angle-down'} size="lg" />
</Button>
</Dropdown>
),
});
@ -221,11 +233,6 @@ export function ToolbarActions({ dashboard }: Props) {
),
});
if (!isEditingPanel) {
// This adds the alert rules button and the dashboard insights button
addDynamicActions(toolbarActions, dynamicDashNavActions.right, 'icon-actions');
}
toolbarActions.push({
group: 'back-button',
condition: (isViewingPanel || isEditingPanel) && !isEditingLibraryPanel,