grafana/public/app/features/storage/StorageFolderPage.tsx

82 lines
2.4 KiB
TypeScript
Raw Normal View History

import React from 'react';
2022-07-14 17:36:17 -05:00
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';
2022-07-14 17:36:17 -05:00
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 ?? '';
2022-07-14 17:36:17 -05:00
const listing = useAsync((): Promise<DataFrame | undefined> => {
return getGrafanaStorage().list('content/' + slug);
2022-07-14 17:36:17 -05:00
}, [slug]);
const childRoot = slug.length > 0 ? `g/${slug}/` : 'g/';
const pageNav = getPageNavFromSlug(slug);
2022-07-14 17:36:17 -05:00
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}`;
2022-07-14 17:36:17 -05:00
return (
<Card key={name} href={isFolder || isDash ? url : undefined}>
2022-07-14 17:36:17 -05:00
<Card.Heading>{name}</Card.Heading>
<Card.Figure>
<Icon name={isFolder ? 'folder' : isDash ? 'gf-grid' : 'file-alt'} size="sm" />
</Card.Figure>
</Card>
);
});
}
if (listing.loading) {
return <Spinner />;
}
return <div>?</div>;
};
const navModel = getRootContentNavModel();
2022-07-14 17:36:17 -05:00
return (
<Page navModel={navModel} pageNav={pageNav}>
{!config.featureToggles.topnav && (
<div>
<Alert title="Enable the topnav feature toggle">This page is designed assuming topnav is enabled</Alert>
</div>
2022-07-14 17:36:17 -05:00
)}
{renderListing()}
</Page>
2022-07-14 17:36:17 -05:00
);
}
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;
}
2022-07-14 17:36:17 -05:00
export function getRootContentNavModel(): NavModel {
return { main: { text: 'C:' }, node: { text: 'Content', url: '/g' } };
}
2022-07-14 17:36:17 -05:00
export default StorageFolderPage;