import React from 'react'; import { useAsync } from 'react-use'; import { DataFrame, NavModel, NavModelItem } from '@grafana/data'; import { config } from '@grafana/runtime'; import { Alert, Card, Icon, Spinner } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { getGrafanaStorage } from './storage'; export interface Props extends GrafanaRouteComponentProps<{ slug: string }> {} export function StorageFolderPage(props: Props) { const slug = props.match.params.slug ?? ''; const listing = useAsync((): Promise => { return getGrafanaStorage().list('content/' + slug); }, [slug]); const childRoot = slug.length > 0 ? `g/${slug}/` : 'g/'; const pageNav = getPageNavFromSlug(slug); const renderListing = () => { if (listing.value) { const names = listing.value.fields[0].values.toArray(); return names.map((item: string) => { let name = item; const isFolder = name.indexOf('.') < 0; const isDash = !isFolder && name.endsWith('.json'); const url = `${childRoot}${name}`; return ( {name} ); }); } if (listing.loading) { return ; } return
?
; }; const navModel = getRootContentNavModel(); return ( {!config.featureToggles.topnav && (
This page is designed assuming topnav is enabled
)} {renderListing()}
); } export function getPageNavFromSlug(slug: string) { const parts = slug.split('/'); let pageNavs: NavModelItem[] = []; let url = 'g'; let lastPageNav: NavModelItem | undefined; for (let i = 0; i < parts.length; i++) { url += `/${parts[i]}`; pageNavs.push({ text: parts[i], url, parentItem: lastPageNav }); lastPageNav = pageNavs[pageNavs.length - 1]; } return lastPageNav; } export function getRootContentNavModel(): NavModel { return { main: { text: 'C:' }, node: { text: 'Content', url: '/g' } }; } export default StorageFolderPage;