forked from grafana.jool/grafana-jool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.6 KiB
90 lines
2.6 KiB
import { useMemo } from 'react';
|
|
import { useLocation } from 'react-router-dom';
|
|
import { PluginIncludeType, PluginType } from '@grafana/data';
|
|
import { CatalogPlugin, PluginDetailsTab, PluginTabIds, PluginTabLabels } from '../types';
|
|
import { usePluginConfig } from '../hooks/usePluginConfig';
|
|
import { isOrgAdmin } from '../permissions';
|
|
|
|
type ReturnType = {
|
|
error: Error | undefined;
|
|
loading: boolean;
|
|
tabs: PluginDetailsTab[];
|
|
defaultTab: string;
|
|
};
|
|
|
|
export const usePluginDetailsTabs = (plugin?: CatalogPlugin, defaultTabs: PluginDetailsTab[] = []): ReturnType => {
|
|
const { loading, error, value: pluginConfig } = usePluginConfig(plugin);
|
|
const isPublished = Boolean(plugin?.isPublished);
|
|
const { pathname } = useLocation();
|
|
|
|
const [tabs, defaultTab] = useMemo(() => {
|
|
const canConfigurePlugins = isOrgAdmin();
|
|
const tabs: PluginDetailsTab[] = [...defaultTabs];
|
|
let defaultTab;
|
|
|
|
if (isPublished) {
|
|
tabs.push({
|
|
label: PluginTabLabels.VERSIONS,
|
|
icon: 'history',
|
|
id: PluginTabIds.VERSIONS,
|
|
href: `${pathname}?page=${PluginTabIds.VERSIONS}`,
|
|
});
|
|
}
|
|
|
|
// Not extending the tabs with the config pages if the plugin is not installed
|
|
if (!pluginConfig) {
|
|
defaultTab = PluginTabIds.OVERVIEW;
|
|
return [tabs, defaultTab];
|
|
}
|
|
|
|
if (canConfigurePlugins) {
|
|
if (pluginConfig.meta.type === PluginType.app) {
|
|
if (pluginConfig.angularConfigCtrl) {
|
|
tabs.push({
|
|
label: 'Config',
|
|
icon: 'cog',
|
|
id: PluginTabIds.CONFIG,
|
|
href: `${pathname}?page=${PluginTabIds.CONFIG}`,
|
|
});
|
|
defaultTab = PluginTabIds.CONFIG;
|
|
}
|
|
|
|
if (pluginConfig.configPages) {
|
|
for (const page of pluginConfig.configPages) {
|
|
tabs.push({
|
|
label: page.title,
|
|
icon: page.icon,
|
|
id: page.id,
|
|
href: `${pathname}?page=${page.id}`,
|
|
});
|
|
if (!defaultTab) {
|
|
defaultTab = page.id;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pluginConfig.meta.includes?.find((include) => include.type === PluginIncludeType.dashboard)) {
|
|
tabs.push({
|
|
label: 'Dashboards',
|
|
icon: 'apps',
|
|
id: PluginTabIds.DASHBOARDS,
|
|
href: `${pathname}?page=${PluginTabIds.DASHBOARDS}`,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!defaultTab) {
|
|
defaultTab = PluginTabIds.OVERVIEW;
|
|
}
|
|
|
|
return [tabs, defaultTab];
|
|
}, [pluginConfig, defaultTabs, pathname, isPublished]);
|
|
|
|
return {
|
|
error,
|
|
loading,
|
|
tabs,
|
|
defaultTab,
|
|
};
|
|
};
|
|
|