actions.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import { ThunkAction } from 'redux-thunk';
  2. import { getBackendSrv } from 'app/core/services/backend_srv';
  3. import { StoreState, Team, TeamGroup, TeamMember } from 'app/types';
  4. import { updateNavIndex, UpdateNavIndexAction } from 'app/core/actions';
  5. import { buildNavModel } from './navModel';
  6. export enum ActionTypes {
  7. LoadTeams = 'LOAD_TEAMS',
  8. LoadTeam = 'LOAD_TEAM',
  9. SetSearchQuery = 'SET_TEAM_SEARCH_QUERY',
  10. SetSearchMemberQuery = 'SET_TEAM_MEMBER_SEARCH_QUERY',
  11. LoadTeamMembers = 'TEAM_MEMBERS_LOADED',
  12. LoadTeamGroups = 'TEAM_GROUPS_LOADED',
  13. }
  14. export interface LoadTeamsAction {
  15. type: ActionTypes.LoadTeams;
  16. payload: Team[];
  17. }
  18. export interface LoadTeamAction {
  19. type: ActionTypes.LoadTeam;
  20. payload: Team;
  21. }
  22. export interface LoadTeamMembersAction {
  23. type: ActionTypes.LoadTeamMembers;
  24. payload: TeamMember[];
  25. }
  26. export interface LoadTeamGroupsAction {
  27. type: ActionTypes.LoadTeamGroups;
  28. payload: TeamGroup[];
  29. }
  30. export interface SetSearchQueryAction {
  31. type: ActionTypes.SetSearchQuery;
  32. payload: string;
  33. }
  34. export interface SetSearchMemberQueryAction {
  35. type: ActionTypes.SetSearchMemberQuery;
  36. payload: string;
  37. }
  38. export type Action =
  39. | LoadTeamsAction
  40. | SetSearchQueryAction
  41. | LoadTeamAction
  42. | LoadTeamMembersAction
  43. | SetSearchMemberQueryAction
  44. | LoadTeamGroupsAction;
  45. type ThunkResult<R> = ThunkAction<R, StoreState, undefined, Action | UpdateNavIndexAction>;
  46. const teamsLoaded = (teams: Team[]): LoadTeamsAction => ({
  47. type: ActionTypes.LoadTeams,
  48. payload: teams,
  49. });
  50. const teamLoaded = (team: Team): LoadTeamAction => ({
  51. type: ActionTypes.LoadTeam,
  52. payload: team,
  53. });
  54. const teamMembersLoaded = (teamMembers: TeamMember[]): LoadTeamMembersAction => ({
  55. type: ActionTypes.LoadTeamMembers,
  56. payload: teamMembers,
  57. });
  58. const teamGroupsLoaded = (teamGroups: TeamGroup[]): LoadTeamGroupsAction => ({
  59. type: ActionTypes.LoadTeamGroups,
  60. payload: teamGroups,
  61. });
  62. export const setSearchMemberQuery = (searchQuery: string): SetSearchMemberQueryAction => ({
  63. type: ActionTypes.SetSearchMemberQuery,
  64. payload: searchQuery,
  65. });
  66. export const setSearchQuery = (searchQuery: string): SetSearchQueryAction => ({
  67. type: ActionTypes.SetSearchQuery,
  68. payload: searchQuery,
  69. });
  70. export function loadTeams(): ThunkResult<void> {
  71. return async dispatch => {
  72. const response = await getBackendSrv().get('/api/teams/search', { perpage: 1000, page: 1 });
  73. dispatch(teamsLoaded(response.teams));
  74. };
  75. }
  76. export function loadTeam(id: number): ThunkResult<void> {
  77. return async dispatch => {
  78. const response = await getBackendSrv().get(`/api/teams/${id}`);
  79. dispatch(teamLoaded(response));
  80. dispatch(updateNavIndex(buildNavModel(response)));
  81. };
  82. }
  83. export function loadTeamMembers(): ThunkResult<void> {
  84. return async (dispatch, getStore) => {
  85. const team = getStore().team.team;
  86. const response = await getBackendSrv().get(`/api/teams/${team.id}/members`);
  87. dispatch(teamMembersLoaded(response));
  88. };
  89. }
  90. export function addTeamMember(id: number): ThunkResult<void> {
  91. return async (dispatch, getStore) => {
  92. const team = getStore().team.team;
  93. await getBackendSrv().post(`/api/teams/${team.id}/members`, { userId: id });
  94. dispatch(loadTeamMembers());
  95. };
  96. }
  97. export function removeTeamMember(id: number): ThunkResult<void> {
  98. return async (dispatch, getStore) => {
  99. const team = getStore().team.team;
  100. await getBackendSrv().delete(`/api/teams/${team.id}/members/${id}`);
  101. dispatch(loadTeamMembers());
  102. };
  103. }
  104. export function updateTeam(name: string, email: string): ThunkResult<void> {
  105. return async (dispatch, getStore) => {
  106. const team = getStore().team.team;
  107. await getBackendSrv().put(`/api/teams/${team.id}`, { name, email });
  108. dispatch(loadTeam(team.id));
  109. };
  110. }
  111. export function loadTeamGroups(): ThunkResult<void> {
  112. return async (dispatch, getStore) => {
  113. const team = getStore().team.team;
  114. const response = await getBackendSrv().get(`/api/teams/${team.id}/groups`);
  115. dispatch(teamGroupsLoaded(response));
  116. };
  117. }
  118. export function addTeamGroup(groupId: string): ThunkResult<void> {
  119. return async (dispatch, getStore) => {
  120. const team = getStore().team.team;
  121. await getBackendSrv().post(`/api/teams/${team.id}/groups`, { groupId: groupId });
  122. dispatch(loadTeamGroups());
  123. };
  124. }
  125. export function removeTeamGroup(groupId: string): ThunkResult<void> {
  126. return async (dispatch, getStore) => {
  127. const team = getStore().team.team;
  128. await getBackendSrv().delete(`/api/teams/${team.id}/groups/${groupId}`);
  129. dispatch(loadTeamGroups());
  130. };
  131. }
  132. export function deleteTeam(id: number): ThunkResult<void> {
  133. return async dispatch => {
  134. await getBackendSrv().delete(`/api/teams/${id}`);
  135. dispatch(loadTeams());
  136. };
  137. }
  138. export function updateTeamMember(member: TeamMember): ThunkResult<void> {
  139. return async dispatch => {
  140. await getBackendSrv().put(`/api/teams/${member.teamId}/members/${member.userId}`, {
  141. permission: member.permission,
  142. });
  143. dispatch(loadTeamMembers());
  144. };
  145. }