1// Services & Utils 2import { getBackendSrv } from '@grafana/runtime'; 3import { createSuccessNotification } from 'app/core/copy/appNotification'; 4// Actions 5import { loadPluginDashboards } from '../../plugins/admin/state/actions'; 6import { cleanUpDashboard, loadDashboardPermissions } from './reducers'; 7import { notifyApp } from 'app/core/actions'; 8import { updateTimeZoneForSession, updateWeekStartForSession } from 'app/features/profile/state/reducers'; 9// Types 10import { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel, ThunkResult } from 'app/types'; 11import { cancelVariables } from '../../variables/state/actions'; 12import { getTimeSrv } from '../services/TimeSrv'; 13import { TimeZone } from '@grafana/data'; 14 15export function getDashboardPermissions(id: number): ThunkResult<void> { 16 return async (dispatch) => { 17 const permissions = await getBackendSrv().get(`/api/dashboards/id/${id}/permissions`); 18 dispatch(loadDashboardPermissions(permissions)); 19 }; 20} 21 22function toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO { 23 return { 24 userId: item.userId, 25 teamId: item.teamId, 26 role: item.role, 27 permission: item.permission, 28 }; 29} 30 31export function updateDashboardPermission( 32 dashboardId: number, 33 itemToUpdate: DashboardAcl, 34 level: PermissionLevel 35): ThunkResult<void> { 36 return async (dispatch, getStore) => { 37 const { dashboard } = getStore(); 38 const itemsToUpdate = []; 39 40 for (const item of dashboard.permissions) { 41 if (item.inherited) { 42 continue; 43 } 44 45 const updated = toUpdateItem(item); 46 47 // if this is the item we want to update, update it's permission 48 if (itemToUpdate === item) { 49 updated.permission = level; 50 } 51 52 itemsToUpdate.push(updated); 53 } 54 55 await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate }); 56 await dispatch(getDashboardPermissions(dashboardId)); 57 }; 58} 59 60export function removeDashboardPermission(dashboardId: number, itemToDelete: DashboardAcl): ThunkResult<void> { 61 return async (dispatch, getStore) => { 62 const dashboard = getStore().dashboard; 63 const itemsToUpdate = []; 64 65 for (const item of dashboard.permissions) { 66 if (item.inherited || item === itemToDelete) { 67 continue; 68 } 69 itemsToUpdate.push(toUpdateItem(item)); 70 } 71 72 await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate }); 73 await dispatch(getDashboardPermissions(dashboardId)); 74 }; 75} 76 77export function addDashboardPermission(dashboardId: number, newItem: NewDashboardAclItem): ThunkResult<void> { 78 return async (dispatch, getStore) => { 79 const { dashboard } = getStore(); 80 const itemsToUpdate = []; 81 82 for (const item of dashboard.permissions) { 83 if (item.inherited) { 84 continue; 85 } 86 itemsToUpdate.push(toUpdateItem(item)); 87 } 88 89 itemsToUpdate.push({ 90 userId: newItem.userId, 91 teamId: newItem.teamId, 92 role: newItem.role, 93 permission: newItem.permission, 94 }); 95 96 await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate }); 97 await dispatch(getDashboardPermissions(dashboardId)); 98 }; 99} 100 101export function importDashboard(data: any, dashboardTitle: string): ThunkResult<void> { 102 return async (dispatch) => { 103 await getBackendSrv().post('/api/dashboards/import', data); 104 dispatch(notifyApp(createSuccessNotification('Dashboard Imported', dashboardTitle))); 105 dispatch(loadPluginDashboards()); 106 }; 107} 108 109export function removeDashboard(uri: string): ThunkResult<void> { 110 return async (dispatch) => { 111 await getBackendSrv().delete(`/api/dashboards/${uri}`); 112 dispatch(loadPluginDashboards()); 113 }; 114} 115 116export const cleanUpDashboardAndVariables = (): ThunkResult<void> => (dispatch, getStore) => { 117 const store = getStore(); 118 const dashboard = store.dashboard.getModel(); 119 120 if (dashboard) { 121 dashboard.destroy(); 122 } 123 124 getTimeSrv().stopAutoRefresh(); 125 126 dispatch(cleanUpDashboard()); 127 dispatch(cancelVariables()); 128}; 129 130export const updateTimeZoneDashboard = (timeZone: TimeZone): ThunkResult<void> => (dispatch) => { 131 dispatch(updateTimeZoneForSession(timeZone)); 132 getTimeSrv().refreshDashboard(); 133}; 134 135export const updateWeekStartDashboard = (weekStart: string): ThunkResult<void> => (dispatch) => { 136 dispatch(updateWeekStartForSession(weekStart)); 137 getTimeSrv().refreshDashboard(); 138}; 139