actions.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { StoreState } from 'app/types';
  2. import { ThunkAction } from 'redux-thunk';
  3. import { getBackendSrv } from 'app/core/services/backend_srv';
  4. import appEvents from 'app/core/app_events';
  5. import { loadPluginDashboards } from '../../plugins/state/actions';
  6. import {
  7. DashboardAcl,
  8. DashboardAclDTO,
  9. PermissionLevel,
  10. DashboardAclUpdateDTO,
  11. NewDashboardAclItem,
  12. } from 'app/types/acl';
  13. export enum ActionTypes {
  14. LoadDashboardPermissions = 'LOAD_DASHBOARD_PERMISSIONS',
  15. LoadStarredDashboards = 'LOAD_STARRED_DASHBOARDS',
  16. }
  17. export interface LoadDashboardPermissionsAction {
  18. type: ActionTypes.LoadDashboardPermissions;
  19. payload: DashboardAcl[];
  20. }
  21. export interface LoadStarredDashboardsAction {
  22. type: ActionTypes.LoadStarredDashboards;
  23. payload: DashboardAcl[];
  24. }
  25. export type Action = LoadDashboardPermissionsAction | LoadStarredDashboardsAction;
  26. type ThunkResult<R> = ThunkAction<R, StoreState, undefined, any>;
  27. export const loadDashboardPermissions = (items: DashboardAclDTO[]): LoadDashboardPermissionsAction => ({
  28. type: ActionTypes.LoadDashboardPermissions,
  29. payload: items,
  30. });
  31. export function getDashboardPermissions(id: number): ThunkResult<void> {
  32. return async dispatch => {
  33. const permissions = await getBackendSrv().get(`/api/dashboards/id/${id}/permissions`);
  34. dispatch(loadDashboardPermissions(permissions));
  35. };
  36. }
  37. function toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {
  38. return {
  39. userId: item.userId,
  40. teamId: item.teamId,
  41. role: item.role,
  42. permission: item.permission,
  43. };
  44. }
  45. export function updateDashboardPermission(
  46. dashboardId: number,
  47. itemToUpdate: DashboardAcl,
  48. level: PermissionLevel
  49. ): ThunkResult<void> {
  50. return async (dispatch, getStore) => {
  51. const { dashboard } = getStore();
  52. const itemsToUpdate = [];
  53. for (const item of dashboard.permissions) {
  54. if (item.inherited) {
  55. continue;
  56. }
  57. const updated = toUpdateItem(item);
  58. // if this is the item we want to update, update it's permission
  59. if (itemToUpdate === item) {
  60. updated.permission = level;
  61. }
  62. itemsToUpdate.push(updated);
  63. }
  64. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  65. await dispatch(getDashboardPermissions(dashboardId));
  66. };
  67. }
  68. export function removeDashboardPermission(dashboardId: number, itemToDelete: DashboardAcl): ThunkResult<void> {
  69. return async (dispatch, getStore) => {
  70. const dashboard = getStore().dashboard;
  71. const itemsToUpdate = [];
  72. for (const item of dashboard.permissions) {
  73. if (item.inherited || item === itemToDelete) {
  74. continue;
  75. }
  76. itemsToUpdate.push(toUpdateItem(item));
  77. }
  78. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  79. await dispatch(getDashboardPermissions(dashboardId));
  80. };
  81. }
  82. export function addDashboardPermission(dashboardId: number, newItem: NewDashboardAclItem): ThunkResult<void> {
  83. return async (dispatch, getStore) => {
  84. const { dashboard } = getStore();
  85. const itemsToUpdate = [];
  86. for (const item of dashboard.permissions) {
  87. if (item.inherited) {
  88. continue;
  89. }
  90. itemsToUpdate.push(toUpdateItem(item));
  91. }
  92. itemsToUpdate.push({
  93. userId: newItem.userId,
  94. teamId: newItem.teamId,
  95. role: newItem.role,
  96. permission: newItem.permission,
  97. });
  98. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  99. await dispatch(getDashboardPermissions(dashboardId));
  100. };
  101. }
  102. export function importDashboard(data, dashboardTitle: string): ThunkResult<void> {
  103. return async dispatch => {
  104. await getBackendSrv().post('/api/dashboards/import', data);
  105. appEvents.emit('alert-success', ['Dashboard Imported', dashboardTitle]);
  106. dispatch(loadPluginDashboards());
  107. };
  108. }
  109. export function removeDashboard(uri: string): ThunkResult<void> {
  110. return async dispatch => {
  111. await getBackendSrv().delete(`/api/dashboards/${uri}`);
  112. dispatch(loadPluginDashboards());
  113. };
  114. }