actions.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { getBackendSrv } from 'app/core/services/backend_srv';
  2. import { StoreState } from 'app/types';
  3. import { ThunkAction } from 'redux-thunk';
  4. import { FolderDTO, FolderState } from 'app/types';
  5. import {
  6. DashboardAcl,
  7. DashboardAclDTO,
  8. PermissionLevel,
  9. DashboardAclUpdateDTO,
  10. NewDashboardAclItem,
  11. } from 'app/types/acl';
  12. import { updateNavIndex, updateLocation } from 'app/core/actions';
  13. import { buildNavModel } from './navModel';
  14. import appEvents from 'app/core/app_events';
  15. export enum ActionTypes {
  16. LoadFolder = 'LOAD_FOLDER',
  17. SetFolderTitle = 'SET_FOLDER_TITLE',
  18. SaveFolder = 'SAVE_FOLDER',
  19. LoadFolderPermissions = 'LOAD_FOLDER_PERMISSONS',
  20. }
  21. export interface LoadFolderAction {
  22. type: ActionTypes.LoadFolder;
  23. payload: FolderDTO;
  24. }
  25. export interface SetFolderTitleAction {
  26. type: ActionTypes.SetFolderTitle;
  27. payload: string;
  28. }
  29. export interface LoadFolderPermissionsAction {
  30. type: ActionTypes.LoadFolderPermissions;
  31. payload: DashboardAcl[];
  32. }
  33. export type Action = LoadFolderAction | SetFolderTitleAction | LoadFolderPermissionsAction;
  34. type ThunkResult<R> = ThunkAction<R, StoreState, undefined, any>;
  35. export const loadFolder = (folder: FolderDTO): LoadFolderAction => ({
  36. type: ActionTypes.LoadFolder,
  37. payload: folder,
  38. });
  39. export const setFolderTitle = (newTitle: string): SetFolderTitleAction => ({
  40. type: ActionTypes.SetFolderTitle,
  41. payload: newTitle,
  42. });
  43. export const loadFolderPermissions = (items: DashboardAclDTO[]): LoadFolderPermissionsAction => ({
  44. type: ActionTypes.LoadFolderPermissions,
  45. payload: items,
  46. });
  47. export function getFolderByUid(uid: string): ThunkResult<void> {
  48. return async dispatch => {
  49. const folder = await getBackendSrv().getFolderByUid(uid);
  50. dispatch(loadFolder(folder));
  51. dispatch(updateNavIndex(buildNavModel(folder)));
  52. };
  53. }
  54. export function saveFolder(folder: FolderState): ThunkResult<void> {
  55. return async dispatch => {
  56. const res = await getBackendSrv().put(`/api/folders/${folder.uid}`, {
  57. title: folder.title,
  58. version: folder.version,
  59. });
  60. // this should be redux action at some point
  61. appEvents.emit('alert-success', ['Folder saved']);
  62. dispatch(updateLocation({ path: `${res.url}/settings` }));
  63. };
  64. }
  65. export function deleteFolder(uid: string): ThunkResult<void> {
  66. return async dispatch => {
  67. await getBackendSrv().deleteFolder(uid, true);
  68. dispatch(updateLocation({ path: `dashboards` }));
  69. };
  70. }
  71. export function getFolderPermissions(uid: string): ThunkResult<void> {
  72. return async dispatch => {
  73. const permissions = await getBackendSrv().get(`/api/folders/${uid}/permissions`);
  74. dispatch(loadFolderPermissions(permissions));
  75. };
  76. }
  77. function toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {
  78. return {
  79. userId: item.userId,
  80. teamId: item.teamId,
  81. role: item.role,
  82. permission: item.permission,
  83. };
  84. }
  85. export function updateFolderPermission(itemToUpdate: DashboardAcl, level: PermissionLevel): ThunkResult<void> {
  86. return async (dispatch, getStore) => {
  87. const folder = getStore().folder;
  88. const itemsToUpdate = [];
  89. for (const item of folder.permissions) {
  90. if (item.inherited) {
  91. continue;
  92. }
  93. const updated = toUpdateItem(item);
  94. // if this is the item we want to update, update it's permission
  95. if (itemToUpdate === item) {
  96. updated.permission = level;
  97. }
  98. itemsToUpdate.push(updated);
  99. }
  100. await getBackendSrv().post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate });
  101. await dispatch(getFolderPermissions(folder.uid));
  102. };
  103. }
  104. export function removeFolderPermission(itemToDelete: DashboardAcl): ThunkResult<void> {
  105. return async (dispatch, getStore) => {
  106. const folder = getStore().folder;
  107. const itemsToUpdate = [];
  108. for (const item of folder.permissions) {
  109. if (item.inherited || item === itemToDelete) {
  110. continue;
  111. }
  112. itemsToUpdate.push(toUpdateItem(item));
  113. }
  114. await getBackendSrv().post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate });
  115. await dispatch(getFolderPermissions(folder.uid));
  116. };
  117. }
  118. export function addFolderPermission(newItem: NewDashboardAclItem): ThunkResult<void> {
  119. return async (dispatch, getStore) => {
  120. const folder = getStore().folder;
  121. const itemsToUpdate = [];
  122. for (const item of folder.permissions) {
  123. if (item.inherited) {
  124. continue;
  125. }
  126. itemsToUpdate.push(toUpdateItem(item));
  127. }
  128. itemsToUpdate.push({
  129. userId: newItem.userId,
  130. teamId: newItem.teamId,
  131. role: newItem.role,
  132. permission: newItem.permission,
  133. });
  134. await getBackendSrv().post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate });
  135. await dispatch(getFolderPermissions(folder.uid));
  136. };
  137. }