TeamsStore.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import { types, getEnv, flow } from 'mobx-state-tree';
  2. export const TeamMember = types.model('TeamMember', {
  3. userId: types.identifier(types.number),
  4. teamId: types.number,
  5. avatarUrl: types.string,
  6. email: types.string,
  7. login: types.string,
  8. });
  9. type TeamMemberType = typeof TeamMember.Type;
  10. export interface ITeamMember extends TeamMemberType {}
  11. export const TeamGroup = types.model('TeamGroup', {
  12. groupId: types.identifier(types.string),
  13. teamId: types.number,
  14. });
  15. type TeamGroupType = typeof TeamGroup.Type;
  16. export interface ITeamGroup extends TeamGroupType {}
  17. export const Team = types
  18. .model('Team', {
  19. id: types.identifier(types.number),
  20. name: types.string,
  21. avatarUrl: types.string,
  22. email: types.string,
  23. memberCount: types.number,
  24. search: types.optional(types.string, ''),
  25. members: types.optional(types.map(TeamMember), {}),
  26. groups: types.optional(types.map(TeamGroup), {}),
  27. })
  28. .views(self => ({
  29. get filteredMembers() {
  30. let members = this.members.values();
  31. let regex = new RegExp(self.search, 'i');
  32. return members.filter(member => {
  33. return regex.test(member.login) || regex.test(member.email);
  34. });
  35. },
  36. }))
  37. .actions(self => ({
  38. setName(name: string) {
  39. self.name = name;
  40. },
  41. setEmail(email: string) {
  42. self.email = email;
  43. },
  44. setSearchQuery(query: string) {
  45. self.search = query;
  46. },
  47. update: flow(function* load() {
  48. const backendSrv = getEnv(self).backendSrv;
  49. yield backendSrv.put(`/api/teams/${self.id}`, {
  50. name: self.name,
  51. email: self.email,
  52. });
  53. }),
  54. loadMembers: flow(function* load() {
  55. const backendSrv = getEnv(self).backendSrv;
  56. const rsp = yield backendSrv.get(`/api/teams/${self.id}/members`);
  57. self.members.clear();
  58. for (let member of rsp) {
  59. self.members.set(member.userId.toString(), TeamMember.create(member));
  60. }
  61. }),
  62. removeMember: flow(function* load(member: ITeamMember) {
  63. const backendSrv = getEnv(self).backendSrv;
  64. yield backendSrv.delete(`/api/teams/${self.id}/members/${member.userId}`);
  65. // remove from store map
  66. self.members.delete(member.userId.toString());
  67. }),
  68. addMember: flow(function* load(userId: number) {
  69. const backendSrv = getEnv(self).backendSrv;
  70. yield backendSrv.post(`/api/teams/${self.id}/members`, { userId: userId });
  71. }),
  72. loadGroups: flow(function* load() {
  73. const backendSrv = getEnv(self).backendSrv;
  74. const rsp = yield backendSrv.get(`/api/teams/${self.id}/groups`);
  75. self.groups.clear();
  76. for (let group of rsp) {
  77. self.groups.set(group.groupId, TeamGroup.create(group));
  78. }
  79. }),
  80. addGroup: flow(function* load(groupId: string) {
  81. const backendSrv = getEnv(self).backendSrv;
  82. yield backendSrv.post(`/api/teams/${self.id}/groups`, { groupId: groupId });
  83. self.groups.set(
  84. groupId,
  85. TeamGroup.create({
  86. teamId: self.id,
  87. groupId: groupId,
  88. })
  89. );
  90. }),
  91. removeGroup: flow(function* load(groupId: string) {
  92. const backendSrv = getEnv(self).backendSrv;
  93. yield backendSrv.delete(`/api/teams/${self.id}/groups/${groupId}`);
  94. self.groups.delete(groupId);
  95. }),
  96. }));
  97. type TeamType = typeof Team.Type;
  98. export interface ITeam extends TeamType {}
  99. export const TeamsStore = types
  100. .model('TeamsStore', {
  101. map: types.map(Team),
  102. search: types.optional(types.string, ''),
  103. })
  104. .views(self => ({
  105. get filteredTeams() {
  106. let teams = this.map.values();
  107. let regex = new RegExp(self.search, 'i');
  108. return teams.filter(team => {
  109. return regex.test(team.name);
  110. });
  111. },
  112. }))
  113. .actions(self => ({
  114. loadTeams: flow(function* load() {
  115. const backendSrv = getEnv(self).backendSrv;
  116. const rsp = yield backendSrv.get('/api/teams/search/', { perpage: 50, page: 1 });
  117. self.map.clear();
  118. for (let team of rsp.teams) {
  119. self.map.set(team.id.toString(), Team.create(team));
  120. }
  121. }),
  122. setSearchQuery(query: string) {
  123. self.search = query;
  124. },
  125. loadById: flow(function* load(id: string) {
  126. if (self.map.has(id)) {
  127. return;
  128. }
  129. const backendSrv = getEnv(self).backendSrv;
  130. const team = yield backendSrv.get(`/api/teams/${id}`);
  131. self.map.set(id, Team.create(team));
  132. }),
  133. }));