import { AppEvents, locationUtil } from '@grafana/data'; import { getBackendSrv, locationService } from '@grafana/runtime'; import { backendSrv } from 'app/core/services/backend_srv'; import { FolderState, ThunkResult } from 'app/types'; import { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel } from 'app/types/acl'; import { updateNavIndex } from 'app/core/actions'; import { buildNavModel } from './navModel'; import appEvents from 'app/core/app_events'; import { loadFolder, loadFolderPermissions } from './reducers'; export function getFolderByUid(uid: string): ThunkResult { return async (dispatch) => { const folder = await backendSrv.getFolderByUid(uid); dispatch(loadFolder(folder)); dispatch(updateNavIndex(buildNavModel(folder))); }; } export function saveFolder(folder: FolderState): ThunkResult { return async (dispatch) => { const res = await backendSrv.put(`/api/folders/${folder.uid}`, { title: folder.title, version: folder.version, }); // this should be redux action at some point appEvents.emit(AppEvents.alertSuccess, ['Folder saved']); locationService.push(`${res.url}/settings`); }; } export function deleteFolder(uid: string): ThunkResult { return async (dispatch) => { await backendSrv.delete(`/api/folders/${uid}`); locationService.push('/dashboards'); }; } export function getFolderPermissions(uid: string): ThunkResult { return async (dispatch) => { const permissions = await backendSrv.get(`/api/folders/${uid}/permissions`); dispatch(loadFolderPermissions(permissions)); }; } function toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO { return { userId: item.userId, teamId: item.teamId, role: item.role, permission: item.permission, }; } export function updateFolderPermission(itemToUpdate: DashboardAcl, level: PermissionLevel): ThunkResult { return async (dispatch, getStore) => { const folder = getStore().folder; const itemsToUpdate = []; for (const item of folder.permissions) { if (item.inherited) { continue; } const updated = toUpdateItem(item); // if this is the item we want to update, update it's permission if (itemToUpdate === item) { updated.permission = level; } itemsToUpdate.push(updated); } await backendSrv.post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate }); await dispatch(getFolderPermissions(folder.uid)); }; } export function removeFolderPermission(itemToDelete: DashboardAcl): ThunkResult { return async (dispatch, getStore) => { const folder = getStore().folder; const itemsToUpdate = []; for (const item of folder.permissions) { if (item.inherited || item === itemToDelete) { continue; } itemsToUpdate.push(toUpdateItem(item)); } await backendSrv.post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate }); await dispatch(getFolderPermissions(folder.uid)); }; } export function addFolderPermission(newItem: NewDashboardAclItem): ThunkResult { return async (dispatch, getStore) => { const folder = getStore().folder; const itemsToUpdate = []; for (const item of folder.permissions) { if (item.inherited) { continue; } itemsToUpdate.push(toUpdateItem(item)); } itemsToUpdate.push({ userId: newItem.userId, teamId: newItem.teamId, role: newItem.role, permission: newItem.permission, }); await backendSrv.post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate }); await dispatch(getFolderPermissions(folder.uid)); }; } export function createNewFolder(folderName: string): ThunkResult { return async () => { const newFolder = await getBackendSrv().post('/api/folders', { title: folderName }); appEvents.emit(AppEvents.alertSuccess, ['Folder Created', 'OK']); locationService.push(locationUtil.stripBaseFromUrl(newFolder.url)); }; }