actions.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Services & Utils
  2. import { getBackendSrv } from 'app/core/services/backend_srv';
  3. import { actionCreatorFactory, noPayloadActionCreatorFactory } from 'app/core/redux';
  4. import { createSuccessNotification } from 'app/core/copy/appNotification';
  5. // Actions
  6. import { loadPluginDashboards } from '../../plugins/state/actions';
  7. import { notifyApp } from 'app/core/actions';
  8. // Types
  9. import {
  10. ThunkResult,
  11. DashboardAcl,
  12. DashboardAclDTO,
  13. PermissionLevel,
  14. DashboardAclUpdateDTO,
  15. NewDashboardAclItem,
  16. MutableDashboard,
  17. DashboardInitError,
  18. } from 'app/types';
  19. export const loadDashboardPermissions = actionCreatorFactory<DashboardAclDTO[]>('LOAD_DASHBOARD_PERMISSIONS').create();
  20. export const dashboardInitFetching = noPayloadActionCreatorFactory('DASHBOARD_INIT_FETCHING').create();
  21. export const dashboardInitServices = noPayloadActionCreatorFactory('DASHBOARD_INIT_SERVICES').create();
  22. export const dashboardInitSlow = noPayloadActionCreatorFactory('SET_DASHBOARD_INIT_SLOW').create();
  23. export const dashboardInitCompleted = actionCreatorFactory<MutableDashboard>('DASHBOARD_INIT_COMLETED').create();
  24. /*
  25. * Unrecoverable init failure (fetch or model creation failed)
  26. */
  27. export const dashboardInitFailed = actionCreatorFactory<DashboardInitError>('DASHBOARD_INIT_FAILED').create();
  28. /*
  29. * When leaving dashboard, resets state
  30. * */
  31. export const cleanUpDashboard = noPayloadActionCreatorFactory('DASHBOARD_CLEAN_UP').create();
  32. export function getDashboardPermissions(id: number): ThunkResult<void> {
  33. return async dispatch => {
  34. const permissions = await getBackendSrv().get(`/api/dashboards/id/${id}/permissions`);
  35. dispatch(loadDashboardPermissions(permissions));
  36. };
  37. }
  38. function toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {
  39. return {
  40. userId: item.userId,
  41. teamId: item.teamId,
  42. role: item.role,
  43. permission: item.permission,
  44. };
  45. }
  46. export function updateDashboardPermission(
  47. dashboardId: number,
  48. itemToUpdate: DashboardAcl,
  49. level: PermissionLevel
  50. ): ThunkResult<void> {
  51. return async (dispatch, getStore) => {
  52. const { dashboard } = getStore();
  53. const itemsToUpdate = [];
  54. for (const item of dashboard.permissions) {
  55. if (item.inherited) {
  56. continue;
  57. }
  58. const updated = toUpdateItem(item);
  59. // if this is the item we want to update, update it's permission
  60. if (itemToUpdate === item) {
  61. updated.permission = level;
  62. }
  63. itemsToUpdate.push(updated);
  64. }
  65. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  66. await dispatch(getDashboardPermissions(dashboardId));
  67. };
  68. }
  69. export function removeDashboardPermission(dashboardId: number, itemToDelete: DashboardAcl): ThunkResult<void> {
  70. return async (dispatch, getStore) => {
  71. const dashboard = getStore().dashboard;
  72. const itemsToUpdate = [];
  73. for (const item of dashboard.permissions) {
  74. if (item.inherited || item === itemToDelete) {
  75. continue;
  76. }
  77. itemsToUpdate.push(toUpdateItem(item));
  78. }
  79. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  80. await dispatch(getDashboardPermissions(dashboardId));
  81. };
  82. }
  83. export function addDashboardPermission(dashboardId: number, newItem: NewDashboardAclItem): ThunkResult<void> {
  84. return async (dispatch, getStore) => {
  85. const { dashboard } = getStore();
  86. const itemsToUpdate = [];
  87. for (const item of dashboard.permissions) {
  88. if (item.inherited) {
  89. continue;
  90. }
  91. itemsToUpdate.push(toUpdateItem(item));
  92. }
  93. itemsToUpdate.push({
  94. userId: newItem.userId,
  95. teamId: newItem.teamId,
  96. role: newItem.role,
  97. permission: newItem.permission,
  98. });
  99. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  100. await dispatch(getDashboardPermissions(dashboardId));
  101. };
  102. }
  103. export function importDashboard(data, dashboardTitle: string): ThunkResult<void> {
  104. return async dispatch => {
  105. await getBackendSrv().post('/api/dashboards/import', data);
  106. dispatch(notifyApp(createSuccessNotification('Dashboard Imported', dashboardTitle)));
  107. dispatch(loadPluginDashboards());
  108. };
  109. }
  110. export function removeDashboard(uri: string): ThunkResult<void> {
  111. return async dispatch => {
  112. await getBackendSrv().delete(`/api/dashboards/${uri}`);
  113. dispatch(loadPluginDashboards());
  114. };
  115. }