import { css } from '@emotion/css'; import React, { useMemo, useState } from 'react'; import { useAsync } from 'react-use'; import { DataFrame, GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime'; import { Alert, Button, Card, FilterInput, HorizontalGroup, Icon, IconName, TagList, useStyles2, VerticalGroup, } from '@grafana/ui'; import { getGrafanaStorage } from './storage'; import { StorageInfo, StorageView } from './types'; interface Props { root: DataFrame; onPathChange: (p: string, v?: StorageView) => void; } export function RootView({ root, onPathChange }: Props) { const styles = useStyles2(getStyles); const storage = useAsync(getGrafanaStorage().getConfig); const [searchQuery, setSearchQuery] = useState(''); let base = location.pathname; if (!base.endsWith('/')) { base += '/'; } const roots = useMemo(() => { let show = storage.value ?? []; if (searchQuery?.length) { const lower = searchQuery.toLowerCase(); show = show.filter((r) => { const v = r.config; const isMatch = v.name.toLowerCase().indexOf(lower) >= 0 || v.description.toLowerCase().indexOf(lower) >= 0; if (isMatch) { return true; } return false; }); } const base: StorageInfo[] = []; const content: StorageInfo[] = []; for (const r of show ?? []) { if (r.config.underContentRoot) { content.push(r); } else if (r.config.prefix !== 'content') { base.push(r); } } return { base, content }; }, [searchQuery, storage]); const renderRoots = (pfix: string, roots: StorageInfo[]) => { return ( {roots.map((s) => { const ok = s.ready; return ( {s.config.name} {s.config.description} {s.config.git?.remote && {s.config.git?.remote}} {s.notice?.map((notice) => ( ))} ); })} ); }; return (
{config.featureToggles.export && ( )}
{renderRoots('', roots.base)}

Content

{renderRoots('content/', roots.content)}
); } function getStyles(theme: GrafanaTheme2) { return { secondaryTextColor: css` color: ${theme.colors.text.secondary}; `, clickable: css` pointer-events: none; `, }; } function getTags(v: StorageInfo) { const tags: string[] = []; if (v.builtin) { tags.push('Builtin'); } if (!v.editable) { tags.push('Read only'); } // Error if (!v.ready) { tags.push('Not ready'); } return tags; } export function getIconName(type: string): IconName { switch (type) { case 'git': return 'code-branch'; case 'disk': return 'folder-open'; case 'sql': return 'database'; default: return 'folder-open'; } }