|
|
|
@ -16,13 +16,14 @@ import { RecentlyDeletedActions } from './components/RecentlyDeletedActions'; |
|
|
|
|
import { RecentlyDeletedEmptyState } from './components/RecentlyDeletedEmptyState'; |
|
|
|
|
import { SearchView } from './components/SearchView'; |
|
|
|
|
import { getFolderPermissions } from './permissions'; |
|
|
|
|
import { setAllSelection } from './state'; |
|
|
|
|
import { setAllSelection, useHasSelection } from './state'; |
|
|
|
|
|
|
|
|
|
const RecentlyDeletedPage = memo(() => { |
|
|
|
|
const dispatch = useDispatch(); |
|
|
|
|
const styles = useStyles2(getStyles); |
|
|
|
|
|
|
|
|
|
const [searchState, stateManager] = useRecentlyDeletedStateManager(); |
|
|
|
|
const hasSelection = useHasSelection(); |
|
|
|
|
|
|
|
|
|
const { canEditFolders, canEditDashboards } = getFolderPermissions(); |
|
|
|
|
const canSelect = canEditFolders || canEditDashboards; |
|
|
|
@ -42,26 +43,33 @@ const RecentlyDeletedPage = memo(() => { |
|
|
|
|
return ( |
|
|
|
|
<Page navId="dashboards/recently-deleted"> |
|
|
|
|
<Page.Contents className={styles.pageContents}> |
|
|
|
|
<FilterInput |
|
|
|
|
placeholder={t('recentlyDeleted.filter.placeholder', 'Search for dashboards')} |
|
|
|
|
value={searchState.query} |
|
|
|
|
escapeRegex={false} |
|
|
|
|
onChange={stateManager.onQueryChange} |
|
|
|
|
/> |
|
|
|
|
<ActionRow |
|
|
|
|
state={searchState} |
|
|
|
|
getTagOptions={stateManager.getTagOptions} |
|
|
|
|
getSortOptions={getGrafanaSearcher().getSortOptions} |
|
|
|
|
sortPlaceholder={getGrafanaSearcher().sortPlaceholder} |
|
|
|
|
onLayoutChange={stateManager.onLayoutChange} |
|
|
|
|
onSortChange={stateManager.onSortChange} |
|
|
|
|
onTagFilterChange={stateManager.onTagFilterChange} |
|
|
|
|
onDatasourceChange={stateManager.onDatasourceChange} |
|
|
|
|
onPanelTypeChange={stateManager.onPanelTypeChange} |
|
|
|
|
onSetIncludePanels={stateManager.onSetIncludePanels} |
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
<RecentlyDeletedActions /> |
|
|
|
|
<div> |
|
|
|
|
<FilterInput |
|
|
|
|
placeholder={t('recentlyDeleted.filter.placeholder', 'Search for dashboards')} |
|
|
|
|
value={searchState.query} |
|
|
|
|
escapeRegex={false} |
|
|
|
|
onChange={stateManager.onQueryChange} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
{hasSelection ? ( |
|
|
|
|
<RecentlyDeletedActions /> |
|
|
|
|
) : ( |
|
|
|
|
<div className={styles.filters}> |
|
|
|
|
<ActionRow |
|
|
|
|
state={searchState} |
|
|
|
|
getTagOptions={stateManager.getTagOptions} |
|
|
|
|
getSortOptions={getGrafanaSearcher().getSortOptions} |
|
|
|
|
sortPlaceholder={getGrafanaSearcher().sortPlaceholder} |
|
|
|
|
onLayoutChange={stateManager.onLayoutChange} |
|
|
|
|
onSortChange={stateManager.onSortChange} |
|
|
|
|
onTagFilterChange={stateManager.onTagFilterChange} |
|
|
|
|
onDatasourceChange={stateManager.onDatasourceChange} |
|
|
|
|
onPanelTypeChange={stateManager.onPanelTypeChange} |
|
|
|
|
onSetIncludePanels={stateManager.onSetIncludePanels} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
)} |
|
|
|
|
|
|
|
|
|
<div className={styles.subView}> |
|
|
|
|
<AutoSizer> |
|
|
|
@ -84,16 +92,24 @@ const RecentlyDeletedPage = memo(() => { |
|
|
|
|
|
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => ({ |
|
|
|
|
pageContents: css({ |
|
|
|
|
display: 'grid', |
|
|
|
|
gridTemplateRows: 'auto auto auto 1fr', |
|
|
|
|
display: 'flex', |
|
|
|
|
flexDirection: 'column', |
|
|
|
|
gap: theme.spacing(1), |
|
|
|
|
height: '100%', |
|
|
|
|
rowGap: theme.spacing(1), |
|
|
|
|
}), |
|
|
|
|
|
|
|
|
|
// AutoSizer needs an element to measure the full height available
|
|
|
|
|
subView: css({ |
|
|
|
|
height: '100%', |
|
|
|
|
}), |
|
|
|
|
|
|
|
|
|
filters: css({ |
|
|
|
|
display: 'none', |
|
|
|
|
|
|
|
|
|
[theme.breakpoints.up('md')]: { |
|
|
|
|
display: 'block', |
|
|
|
|
}, |
|
|
|
|
}), |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
RecentlyDeletedPage.displayName = 'RecentlyDeletedPage'; |
|
|
|
|