71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
import { config, getBackendSrv } from '@grafana/runtime';
|
|
import { GENERAL_FOLDER_UID } from 'app/features/search/constants';
|
|
import { getGrafanaSearcher } from 'app/features/search/service/searcher';
|
|
import { NestedFolderDTO } from 'app/features/search/service/types';
|
|
import { queryResultToViewItem } from 'app/features/search/service/utils';
|
|
import { DashboardViewItem } from 'app/features/search/types';
|
|
|
|
import { contextSrv } from '../../../core/core';
|
|
import { AccessControlAction } from '../../../types';
|
|
import { getFolderURL, isSharedWithMe } from '../components/utils';
|
|
|
|
export const PAGE_SIZE = 50;
|
|
|
|
export async function listFolders(
|
|
parentUID?: string,
|
|
parentTitle?: string, // TODO: remove this when old UI is gone
|
|
page = 1,
|
|
pageSize = PAGE_SIZE
|
|
): Promise<DashboardViewItem[]> {
|
|
if (parentUID && !config.featureToggles.nestedFolders) {
|
|
return [];
|
|
}
|
|
|
|
const backendSrv = getBackendSrv();
|
|
|
|
// TODO: what to do here for unified search?
|
|
let folders: NestedFolderDTO[] = [];
|
|
if (contextSrv.hasPermission(AccessControlAction.FoldersRead)) {
|
|
folders = await backendSrv.get<NestedFolderDTO[]>('/api/folders', {
|
|
parentUid: parentUID,
|
|
page,
|
|
limit: pageSize,
|
|
});
|
|
}
|
|
|
|
return folders.map((item) => ({
|
|
kind: 'folder',
|
|
uid: item.uid,
|
|
title: item.title,
|
|
parentTitle,
|
|
parentUID,
|
|
|
|
// URLs from the backend come with subUrlPrefix already included, so match that behaviour here
|
|
url: isSharedWithMe(item.uid) ? undefined : getFolderURL(item.uid),
|
|
}));
|
|
}
|
|
|
|
export async function listDashboards(parentUID?: string, page = 1, pageSize = PAGE_SIZE): Promise<DashboardViewItem[]> {
|
|
const searcher = getGrafanaSearcher();
|
|
|
|
const dashboardsResults = await searcher.search({
|
|
kind: ['dashboard'],
|
|
query: '*',
|
|
location: parentUID || 'general',
|
|
from: (page - 1) * pageSize, // our pages are 1-indexed, so we need to -1 to convert that to correct value to skip
|
|
limit: pageSize,
|
|
});
|
|
|
|
return dashboardsResults.view.map((item) => {
|
|
const viewItem = queryResultToViewItem(item, dashboardsResults.view);
|
|
|
|
// TODO: Once we remove nestedFolders feature flag, undo this and prevent the 'general'
|
|
// parentUID from being set in searcher
|
|
if (viewItem.parentUID === GENERAL_FOLDER_UID) {
|
|
viewItem.parentUID = undefined;
|
|
}
|
|
|
|
return viewItem;
|
|
});
|
|
}
|