@atlaskit/teams-client 4.21.0 → 4.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/common/utils/permissions/constants.js +55 -8
  3. package/dist/cjs/common/utils/permissions/has-permission.js +4 -3
  4. package/dist/cjs/common/utils/permissions/types.js +3 -3
  5. package/dist/cjs/common/utils/ufo/constants.js +1 -1
  6. package/dist/cjs/common/utils/ufo/index.js +2 -2
  7. package/dist/cjs/services/legion-client/index.js +241 -196
  8. package/dist/cjs/services/main.js +592 -540
  9. package/dist/cjs/services/sentry/utils/get-sentry-config.js +1 -1
  10. package/dist/es2019/common/utils/permissions/constants.js +56 -8
  11. package/dist/es2019/common/utils/permissions/has-permission.js +4 -3
  12. package/dist/es2019/common/utils/permissions/types.js +3 -3
  13. package/dist/es2019/common/utils/ufo/constants.js +1 -1
  14. package/dist/es2019/common/utils/ufo/index.js +2 -2
  15. package/dist/es2019/services/legion-client/index.js +12 -2
  16. package/dist/es2019/services/main.js +13 -0
  17. package/dist/es2019/services/sentry/utils/get-sentry-config.js +1 -1
  18. package/dist/esm/common/utils/permissions/constants.js +55 -8
  19. package/dist/esm/common/utils/permissions/has-permission.js +4 -3
  20. package/dist/esm/common/utils/permissions/types.js +3 -3
  21. package/dist/esm/common/utils/ufo/constants.js +1 -1
  22. package/dist/esm/common/utils/ufo/index.js +2 -2
  23. package/dist/esm/services/legion-client/index.js +241 -196
  24. package/dist/esm/services/main.js +592 -540
  25. package/dist/esm/services/sentry/utils/get-sentry-config.js +1 -1
  26. package/dist/types/common/utils/permissions/constants.d.ts +3 -3
  27. package/dist/types/common/utils/permissions/has-permission.d.ts +3 -2
  28. package/dist/types/common/utils/permissions/types.d.ts +1 -1
  29. package/dist/types/common/utils/ufo/constants.d.ts +2 -2
  30. package/dist/types/services/legion-client/index.d.ts +3 -1
  31. package/dist/types/services/main.d.ts +8 -0
  32. package/dist/types-ts4.5/common/utils/permissions/constants.d.ts +3 -3
  33. package/dist/types-ts4.5/common/utils/permissions/has-permission.d.ts +3 -2
  34. package/dist/types-ts4.5/common/utils/permissions/types.d.ts +4 -1
  35. package/dist/types-ts4.5/common/utils/ufo/constants.d.ts +3 -1
  36. package/dist/types-ts4.5/services/legion-client/index.d.ts +3 -1
  37. package/dist/types-ts4.5/services/main.d.ts +8 -0
  38. package/package.json +1 -4
@@ -36,7 +36,7 @@ function getSentryConfig(options) {
36
36
  return _objectSpread(_objectSpread(_objectSpread({}, otherOptions), DEFAULT_SENTRY_CONFIG), {}, {
37
37
  // Standalone __VERSION__ is set from `bin/set-release-version.sh`
38
38
  // when building to deploy to production
39
- release: "".concat("@atlaskit/teams-client", "@").concat("4.20.0") ||
39
+ release: "".concat("@atlaskit/teams-client", "@").concat("4.23.0") ||
40
40
  // @ts-ignore Jira - window.BUILD_KEY
41
41
  window.BUILD_KEY || ( // @ts-ignore Confluence - window.__buildInfo
42
42
  (_window$__buildInfo = window.__buildInfo) === null || _window$__buildInfo === void 0 ? void 0 : _window$__buildInfo.FRONTEND_VERSION) || '---',
@@ -1,6 +1,6 @@
1
1
  import FeatureGates from '@atlaskit/feature-gate-js-client';
2
2
  import { fg } from '@atlaskit/platform-feature-flags';
3
- export const allPermissions = (defaultPermission, isMember) => ({
3
+ export const allPermissions = (defaultPermission, isMember, isOrgAdmin) => ({
4
4
  ADD_MEMBER_TO_TEAM: defaultPermission,
5
5
  JOIN_TEAM: defaultPermission,
6
6
  REQUEST_TO_JOIN: defaultPermission,
@@ -17,9 +17,12 @@ export const allPermissions = (defaultPermission, isMember) => ({
17
17
  DELETE_TEAM: defaultPermission,
18
18
  EDIT_TEAM_SETTINGS: defaultPermission,
19
19
  EDIT_TEAM_MEMBERSHIP: defaultPermission,
20
+ EDIT_TEAM_TYPE: defaultPermission && isOrgAdmin,
20
21
  REMOVE_AGENT_FROM_TEAM: defaultPermission,
21
22
  ADD_AGENT_TO_TEAM: defaultPermission,
22
- ARCHIVE_TEAM: defaultPermission && isMember
23
+ ARCHIVE_TEAM: defaultPermission && isMember,
24
+ UNARCHIVE_TEAM: false,
25
+ CAN_EDIT_HIERARCHY: defaultPermission && isMember
23
26
  });
24
27
  export const vanityActions = ['EDIT_DESCRIPTION', 'EDIT_TEAM_NAME', 'EDIT_PROFILE_HEADER', 'EDIT_TEAM_LINK'];
25
28
  export const openPermissions = permission => ({
@@ -39,30 +42,75 @@ export const SCIMSyncTeamPermissions = (isMember, isOrgAdmin, source) => ({
39
42
  EDIT_TEAM_LINK: isMember || isOrgAdmin,
40
43
  EDIT_TEAM_NAME: isOrgAdmin && source === 'ATLASSIAN_GROUP' && fg('enable_edit_team_name_external_type_teams')
41
44
  });
42
- export const getPermissionMap = (settings, permission, isMember, isOrgAdmin, source) => {
45
+
46
+ /**
47
+ * Returns permission map for disbanded teams
48
+ * Only UNARCHIVE_TEAM action is allowed based on team settings and user permissions
49
+ */
50
+ const getDisbandedTeamPermissionMap = (settings, permission, isMember, isOrgAdmin) => {
51
+ const newTeamProfileEnabled = FeatureGates.getExperimentValue('new_team_profile', 'isEnabled', false);
52
+ const isArchiveTeamEnabled = fg('legion-enable-archive-teams') && newTeamProfileEnabled;
53
+
54
+ // Base permission map - all actions disabled for disbanded teams
55
+ const basePermissions = allPermissions(false, false, false);
56
+
57
+ // UNARCHIVE_TEAM permission based on team settings
58
+ let canUnarchive = false;
59
+ if (isArchiveTeamEnabled) {
60
+ if (settings === 'EXTERNAL') {
61
+ // For EXTERNAL teams, only org admins can unarchive
62
+ canUnarchive = isOrgAdmin;
63
+ } else if (settings === 'OPEN' || settings === 'MEMBER_INVITE') {
64
+ // For OPEN and MEMBER_INVITE teams, members with FULL_WRITE can unarchive
65
+ canUnarchive = isMember && permission === 'FULL_WRITE';
66
+ }
67
+ }
68
+ return {
69
+ ...basePermissions,
70
+ CAN_EDIT_HIERARCHY: false,
71
+ UNARCHIVE_TEAM: canUnarchive,
72
+ DELETE_TEAM: canUnarchive
73
+ };
74
+ };
75
+
76
+ /**
77
+ * Returns permission map for active teams based on team settings
78
+ */
79
+ const getActiveTeamPermissionMap = (settings, permission, isMember, isOrgAdmin, source) => {
43
80
  const newTeamProfileEnabled = FeatureGates.getExperimentValue('new_team_profile', 'isEnabled', false);
44
81
  const isArchiveTeamEnabled = fg('legion-enable-archive-teams') && newTeamProfileEnabled;
45
82
  if (settings === 'OPEN') {
46
83
  return {
47
- ...allPermissions(permission === 'FULL_WRITE', isMember),
84
+ ...allPermissions(permission === 'FULL_WRITE', isMember, isOrgAdmin),
48
85
  ...openPermissions(permission),
49
86
  ARCHIVE_TEAM: isArchiveTeamEnabled && permission === 'FULL_WRITE' && isMember
50
87
  };
51
88
  }
52
89
  if (settings === 'MEMBER_INVITE') {
53
90
  return {
54
- ...allPermissions(permission === 'FULL_WRITE', isMember),
91
+ ...allPermissions(permission === 'FULL_WRITE', isMember, isOrgAdmin),
55
92
  ...inviteOnlyPermissions(permission),
56
93
  ARCHIVE_TEAM: isArchiveTeamEnabled && permission === 'FULL_WRITE' && isMember
57
94
  };
58
95
  } else if (settings === 'EXTERNAL') {
59
96
  return {
60
- ...allPermissions(false, isMember),
97
+ ...allPermissions(false, isMember, isOrgAdmin),
61
98
  ...SCIMSyncTeamPermissions(isMember, isOrgAdmin, source),
62
99
  ADD_AGENT_TO_TEAM: newTeamProfileEnabled && (isMember || isOrgAdmin),
63
100
  REMOVE_AGENT_FROM_TEAM: newTeamProfileEnabled && (isMember || isOrgAdmin),
64
- ARCHIVE_TEAM: isArchiveTeamEnabled && isOrgAdmin
101
+ ARCHIVE_TEAM: isArchiveTeamEnabled && isOrgAdmin,
102
+ EDIT_TEAM_TYPE: isOrgAdmin,
103
+ CAN_EDIT_HIERARCHY: permission === 'FULL_WRITE' && isOrgAdmin
65
104
  };
66
105
  }
67
- return allPermissions(false, false);
106
+ return allPermissions(false, false, false);
107
+ };
108
+ export const getPermissionMap = (settings, permission, isMember, isOrgAdmin, source, state) => {
109
+ // Handle disbanded teams with special permission map
110
+ if (state === 'DISBANDED') {
111
+ return getDisbandedTeamPermissionMap(settings, permission, isMember, isOrgAdmin);
112
+ }
113
+
114
+ // For active teams (or when state is not provided), use existing logic
115
+ return getActiveTeamPermissionMap(settings, permission, isMember, isOrgAdmin, source);
68
116
  };
@@ -1,6 +1,6 @@
1
1
  import { isMember } from '../team';
2
2
  import { getPermissionMap, vanityActions } from './constants';
3
- export function hasPermission(action, settings, permission, isPeopleBrowseEnabled, currentUserMembership, teamVisibilityPermissions, source) {
3
+ export function hasPermission(action, settings, permission, isPeopleBrowseEnabled, currentUserMembership, teamVisibilityPermissions, source, state) {
4
4
  if (!isPeopleBrowseEnabled && !vanityActions.includes(action)) {
5
5
  return false;
6
6
  }
@@ -11,14 +11,15 @@ export function hasPermission(action, settings, permission, isPeopleBrowseEnable
11
11
  teamPermission: permission,
12
12
  isMemberOfTeam,
13
13
  isOrgAdmin,
14
- source
14
+ source,
15
+ state
15
16
  });
16
17
  }
17
18
  /**
18
19
  * Determines if a user has permission perform a given action on a team
19
20
  */
20
21
  export function userCan(action, options) {
21
- return getPermissionMap(options.membershipSettings, options.teamPermission, options.isMemberOfTeam, options.isOrgAdmin, options.source)[action];
22
+ return getPermissionMap(options.membershipSettings, options.teamPermission, options.isMemberOfTeam, options.isOrgAdmin, options.source, options.state)[action];
22
23
  }
23
24
 
24
25
  /**
@@ -1,5 +1,5 @@
1
- export const AllTeamActions = ['ADD_MEMBER_TO_TEAM', 'JOIN_TEAM', 'REQUEST_TO_JOIN', 'CANCEL_JOIN_REQUEST', 'APPROVE_JOIN_REQUEST', 'REJECT_JOIN_REQUEST', 'REMOVE_MEMBER_FROM_TEAM', 'CANCEL_INVITE', 'LEAVE_TEAM', 'REMOVE_AGENT_FROM_TEAM', 'ADD_AGENT_TO_TEAM',
1
+ export const AllTeamActions = ['ADD_MEMBER_TO_TEAM', 'JOIN_TEAM', 'REQUEST_TO_JOIN', 'CANCEL_JOIN_REQUEST', 'APPROVE_JOIN_REQUEST', 'REJECT_JOIN_REQUEST', 'REMOVE_MEMBER_FROM_TEAM', 'CANCEL_INVITE', 'LEAVE_TEAM', 'REMOVE_AGENT_FROM_TEAM', 'ADD_AGENT_TO_TEAM', 'CAN_EDIT_HIERARCHY',
2
2
  // Visual
3
- 'EDIT_TEAM_NAME', 'EDIT_DESCRIPTION', 'EDIT_PROFILE_HEADER', 'EDIT_TEAM_LINK', 'EDIT_TEAM_SETTINGS', 'EDIT_TEAM_MEMBERSHIP',
3
+ 'EDIT_TEAM_NAME', 'EDIT_DESCRIPTION', 'EDIT_PROFILE_HEADER', 'EDIT_TEAM_LINK', 'EDIT_TEAM_SETTINGS', 'EDIT_TEAM_MEMBERSHIP', 'EDIT_TEAM_TYPE',
4
4
  // Serious
5
- 'DELETE_TEAM', 'ARCHIVE_TEAM'];
5
+ 'DELETE_TEAM', 'ARCHIVE_TEAM', 'UNARCHIVE_TEAM'];
@@ -1,6 +1,6 @@
1
1
  import { ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
2
  import { TeamsUFOExperience } from './index';
3
- const TeamsClientExperienceKeyList = ['getAllTeams', 'getTeamById', 'updateTeamById', 'querySettings', 'queryFeatureFlags', 'queryTeamMemberships', 'queryUser', 'inviteUsersToTeam', 'getMyTeamMembership', 'getTeamLinksByTeamId', 'createTeamLink', 'updateTeamLink', 'deleteTeamLink', 'reorderTeamLink', 'acceptTeamInvitation', 'declineTeamInvitation', 'selfJoinTeam', 'cancelJoinRequest', 'acceptJoinRequest', 'declineJoinRequest', 'deleteTeamMembership', 'revokeTeamInvite', 'deleteTeam', 'archiveTeam', 'isSingleFullMemberTeam', 'createTeam', 'createTeamContainers', 'createExternalTeam', 'getProfileWithMutability', 'getIsSiteAdmin', 'addUsersToTeam', 'removeTeamMemberships', 'getRecommendedProducts', 'joinOrRequestDefaultAccessToProductsBulk', 'getReadMediaToken', 'getWriteUserMediaToken', 'updateUserHeaderImage', 'getWriteTeamMediaToken', 'getSoftDeletedTeamById', 'restoreTeam', 'getUserInSiteUserBase', 'getLinkedTeamsBulk', 'getTeamProfileDetails', 'getUserContainers', 'getPermissions', 'getUserManageConfig', 'getMyAvatarUploadedStatus', 'deleteUserAvatar', 'getTeamLinkIcons', 'getTeamInSlack', 'getOrgScope', 'restoreTeamToSyncedGroup', 'getTeamAndGroupDiff', 'linkExistingTeamToGroup', 'fetchUserAvatarInfo', 'getOrgEligibilityForManagedTeams', 'updateUser', 'updateUserAvatar', 'disconnectTeamInSlack', 'updateTeamInSlack', 'getUserTenure', 'getAriFromUrl', 'getWebLinkTitle', 'addAgentToTeam', 'getTeamEnabledSites', 'assignTeamsToSites', 'removeAgentTeamAssociation', 'getAssignedTeams', 'setTeamSiteAssignmentPermission', 'getUnassignedTeams', 'getTeamSiteAssignmentOrgDetails', 'getTeamsToBeClonedToJsmSites', 'getReportingLines'];
3
+ const TeamsClientExperienceKeyList = ['getAllTeams', 'getTeamById', 'updateTeamById', 'querySettings', 'queryFeatureFlags', 'queryTeamMemberships', 'queryUser', 'inviteUsersToTeam', 'getMyTeamMembership', 'getTeamLinksByTeamId', 'createTeamLink', 'updateTeamLink', 'deleteTeamLink', 'reorderTeamLink', 'acceptTeamInvitation', 'declineTeamInvitation', 'selfJoinTeam', 'cancelJoinRequest', 'acceptJoinRequest', 'declineJoinRequest', 'deleteTeamMembership', 'revokeTeamInvite', 'deleteTeam', 'archiveTeam', 'unarchiveTeam', 'unlinkTeamFromGroup', 'isSingleFullMemberTeam', 'createTeam', 'createTeamContainers', 'createExternalTeam', 'getProfileWithMutability', 'getIsSiteAdmin', 'addUsersToTeam', 'removeTeamMemberships', 'getRecommendedProducts', 'joinOrRequestDefaultAccessToProductsBulk', 'getReadMediaToken', 'getWriteUserMediaToken', 'updateUserHeaderImage', 'getWriteTeamMediaToken', 'getSoftDeletedTeamById', 'restoreTeam', 'getUserInSiteUserBase', 'getLinkedTeamsBulk', 'getTeamProfileDetails', 'getUserContainers', 'getPermissions', 'getUserManageConfig', 'getMyAvatarUploadedStatus', 'deleteUserAvatar', 'getTeamLinkIcons', 'getTeamInSlack', 'getOrgScope', 'restoreTeamToSyncedGroup', 'getTeamAndGroupDiff', 'linkExistingTeamToGroup', 'fetchUserAvatarInfo', 'getOrgEligibilityForManagedTeams', 'updateUser', 'updateUserAvatar', 'disconnectTeamInSlack', 'updateTeamInSlack', 'getUserTenure', 'getAriFromUrl', 'getWebLinkTitle', 'addAgentToTeam', 'getTeamEnabledSites', 'assignTeamsToSites', 'removeAgentTeamAssociation', 'getAssignedTeams', 'setTeamSiteAssignmentPermission', 'getUnassignedTeams', 'getTeamSiteAssignmentOrgDetails', 'getTeamsToBeClonedToJsmSites', 'getReportingLines'];
4
4
  export const TEAMS_CLIENT_EXPERIENCES = new Map([...TeamsClientExperienceKeyList.map(key => [key,
5
5
  // camelCase to kebab-case
6
6
  new TeamsUFOExperience(`teams-client-${key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}`, {
@@ -27,7 +27,7 @@ export class TeamsUFOExperience extends UFOExperience {
27
27
  return super.failure({
28
28
  metadata: {
29
29
  error: createErrorMetadata(error),
30
- packageVersion: "4.20.0",
30
+ packageVersion: "4.23.0",
31
31
  packageName: "@atlaskit/teams-client"
32
32
  }
33
33
  });
@@ -35,7 +35,7 @@ export class TeamsUFOExperience extends UFOExperience {
35
35
  return super.failure({
36
36
  metadata: {
37
37
  error: 'unknown error',
38
- packageVersion: "4.20.0",
38
+ packageVersion: "4.23.0",
39
39
  packageName: "@atlaskit/teams-client"
40
40
  }
41
41
  });
@@ -251,6 +251,15 @@ export class LegionClient extends RestClient {
251
251
  const siteId = this.getCloudId();
252
252
  return this.postResourceRaw(`${v4UrlPath}/archive?siteId=${siteId}`, JSON.stringify([this.trimTeamARI(teamId)]));
253
253
  }
254
+ async unArchiveTeam(teamId) {
255
+ const siteId = this.getCloudId();
256
+ return this.postResourceRaw(`${v4UrlPath}/unarchive?siteId=${siteId}`, JSON.stringify([this.trimTeamARI(teamId)]));
257
+ }
258
+ async unlinkTeamFromGroup(teamId, membershipSettings) {
259
+ return this.patchResource(`${v4UrlPath}/${this.trimTeamARI(teamId)}`, {
260
+ membershipSettings
261
+ });
262
+ }
254
263
 
255
264
  /**
256
265
  * @private
@@ -261,7 +270,7 @@ export class LegionClient extends RestClient {
261
270
  const members = await this.getResource(`${v4UrlPath}/${this.trimTeamARI(teamId)}/members?size=2&membershipState=FULL_MEMBER&siteId=${this.getCloudId()}`);
262
271
  return members.entities.length === 1;
263
272
  }
264
- async createTeam(displayName, originQuery, members, membershipSettings = 'OPEN') {
273
+ async createTeam(displayName, originQuery, members, membershipSettings = 'OPEN', typeId) {
265
274
  const organizationId = this.getContext().orgId;
266
275
  if (!organizationId) {
267
276
  const err = new Error('Organization ID is required');
@@ -275,7 +284,8 @@ export class LegionClient extends RestClient {
275
284
  membershipSettings: membershipSettings,
276
285
  siteId: this.getCloudId(),
277
286
  organizationId: organizationId,
278
- members: [...new Set(members)]
287
+ members: [...new Set(members)],
288
+ typeId
279
289
  });
280
290
  return this.mapTeamCreateResponseV4ToTeam(legionTeam);
281
291
  }
@@ -350,6 +350,19 @@ export class TeamsClient {
350
350
  async archiveTeam(teamId) {
351
351
  return this.measurePerformance('archiveTeam', () => this._legionClient.archiveTeam(teamId));
352
352
  }
353
+ /**
354
+ * Unarchive a team
355
+ */
356
+ async unarchiveTeam(teamId) {
357
+ return this.measurePerformance('unarchiveTeam', () => this._legionClient.unArchiveTeam(teamId));
358
+ }
359
+
360
+ /**
361
+ * Unlink a team from group
362
+ */
363
+ async unlinkTeamFromGroup(teamId) {
364
+ return this.measurePerformance('unlinkTeamFromGroup', () => this._legionClient.unlinkTeamFromGroup(teamId, 'MEMBER_INVITE'));
365
+ }
353
366
 
354
367
  /**
355
368
  * @private
@@ -28,7 +28,7 @@ export function getSentryConfig(options) {
28
28
  ...DEFAULT_SENTRY_CONFIG,
29
29
  // Standalone __VERSION__ is set from `bin/set-release-version.sh`
30
30
  // when building to deploy to production
31
- release: `${"@atlaskit/teams-client"}@${"4.20.0"}` ||
31
+ release: `${"@atlaskit/teams-client"}@${"4.23.0"}` ||
32
32
  // @ts-ignore Jira - window.BUILD_KEY
33
33
  window.BUILD_KEY || ( // @ts-ignore Confluence - window.__buildInfo
34
34
  (_window$__buildInfo = window.__buildInfo) === null || _window$__buildInfo === void 0 ? void 0 : _window$__buildInfo.FRONTEND_VERSION) || '---',
@@ -3,7 +3,7 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
3
3
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
4
  import FeatureGates from '@atlaskit/feature-gate-js-client';
5
5
  import { fg } from '@atlaskit/platform-feature-flags';
6
- export var allPermissions = function allPermissions(defaultPermission, isMember) {
6
+ export var allPermissions = function allPermissions(defaultPermission, isMember, isOrgAdmin) {
7
7
  return {
8
8
  ADD_MEMBER_TO_TEAM: defaultPermission,
9
9
  JOIN_TEAM: defaultPermission,
@@ -21,9 +21,12 @@ export var allPermissions = function allPermissions(defaultPermission, isMember)
21
21
  DELETE_TEAM: defaultPermission,
22
22
  EDIT_TEAM_SETTINGS: defaultPermission,
23
23
  EDIT_TEAM_MEMBERSHIP: defaultPermission,
24
+ EDIT_TEAM_TYPE: defaultPermission && isOrgAdmin,
24
25
  REMOVE_AGENT_FROM_TEAM: defaultPermission,
25
26
  ADD_AGENT_TO_TEAM: defaultPermission,
26
- ARCHIVE_TEAM: defaultPermission && isMember
27
+ ARCHIVE_TEAM: defaultPermission && isMember,
28
+ UNARCHIVE_TEAM: false,
29
+ CAN_EDIT_HIERARCHY: defaultPermission && isMember
27
30
  };
28
31
  };
29
32
  export var vanityActions = ['EDIT_DESCRIPTION', 'EDIT_TEAM_NAME', 'EDIT_PROFILE_HEADER', 'EDIT_TEAM_LINK'];
@@ -50,24 +53,68 @@ export var SCIMSyncTeamPermissions = function SCIMSyncTeamPermissions(isMember,
50
53
  EDIT_TEAM_NAME: isOrgAdmin && source === 'ATLASSIAN_GROUP' && fg('enable_edit_team_name_external_type_teams')
51
54
  };
52
55
  };
53
- export var getPermissionMap = function getPermissionMap(settings, permission, isMember, isOrgAdmin, source) {
56
+
57
+ /**
58
+ * Returns permission map for disbanded teams
59
+ * Only UNARCHIVE_TEAM action is allowed based on team settings and user permissions
60
+ */
61
+ var getDisbandedTeamPermissionMap = function getDisbandedTeamPermissionMap(settings, permission, isMember, isOrgAdmin) {
62
+ var newTeamProfileEnabled = FeatureGates.getExperimentValue('new_team_profile', 'isEnabled', false);
63
+ var isArchiveTeamEnabled = fg('legion-enable-archive-teams') && newTeamProfileEnabled;
64
+
65
+ // Base permission map - all actions disabled for disbanded teams
66
+ var basePermissions = allPermissions(false, false, false);
67
+
68
+ // UNARCHIVE_TEAM permission based on team settings
69
+ var canUnarchive = false;
70
+ if (isArchiveTeamEnabled) {
71
+ if (settings === 'EXTERNAL') {
72
+ // For EXTERNAL teams, only org admins can unarchive
73
+ canUnarchive = isOrgAdmin;
74
+ } else if (settings === 'OPEN' || settings === 'MEMBER_INVITE') {
75
+ // For OPEN and MEMBER_INVITE teams, members with FULL_WRITE can unarchive
76
+ canUnarchive = isMember && permission === 'FULL_WRITE';
77
+ }
78
+ }
79
+ return _objectSpread(_objectSpread({}, basePermissions), {}, {
80
+ CAN_EDIT_HIERARCHY: false,
81
+ UNARCHIVE_TEAM: canUnarchive,
82
+ DELETE_TEAM: canUnarchive
83
+ });
84
+ };
85
+
86
+ /**
87
+ * Returns permission map for active teams based on team settings
88
+ */
89
+ var getActiveTeamPermissionMap = function getActiveTeamPermissionMap(settings, permission, isMember, isOrgAdmin, source) {
54
90
  var newTeamProfileEnabled = FeatureGates.getExperimentValue('new_team_profile', 'isEnabled', false);
55
91
  var isArchiveTeamEnabled = fg('legion-enable-archive-teams') && newTeamProfileEnabled;
56
92
  if (settings === 'OPEN') {
57
- return _objectSpread(_objectSpread(_objectSpread({}, allPermissions(permission === 'FULL_WRITE', isMember)), openPermissions(permission)), {}, {
93
+ return _objectSpread(_objectSpread(_objectSpread({}, allPermissions(permission === 'FULL_WRITE', isMember, isOrgAdmin)), openPermissions(permission)), {}, {
58
94
  ARCHIVE_TEAM: isArchiveTeamEnabled && permission === 'FULL_WRITE' && isMember
59
95
  });
60
96
  }
61
97
  if (settings === 'MEMBER_INVITE') {
62
- return _objectSpread(_objectSpread(_objectSpread({}, allPermissions(permission === 'FULL_WRITE', isMember)), inviteOnlyPermissions(permission)), {}, {
98
+ return _objectSpread(_objectSpread(_objectSpread({}, allPermissions(permission === 'FULL_WRITE', isMember, isOrgAdmin)), inviteOnlyPermissions(permission)), {}, {
63
99
  ARCHIVE_TEAM: isArchiveTeamEnabled && permission === 'FULL_WRITE' && isMember
64
100
  });
65
101
  } else if (settings === 'EXTERNAL') {
66
- return _objectSpread(_objectSpread(_objectSpread({}, allPermissions(false, isMember)), SCIMSyncTeamPermissions(isMember, isOrgAdmin, source)), {}, {
102
+ return _objectSpread(_objectSpread(_objectSpread({}, allPermissions(false, isMember, isOrgAdmin)), SCIMSyncTeamPermissions(isMember, isOrgAdmin, source)), {}, {
67
103
  ADD_AGENT_TO_TEAM: newTeamProfileEnabled && (isMember || isOrgAdmin),
68
104
  REMOVE_AGENT_FROM_TEAM: newTeamProfileEnabled && (isMember || isOrgAdmin),
69
- ARCHIVE_TEAM: isArchiveTeamEnabled && isOrgAdmin
105
+ ARCHIVE_TEAM: isArchiveTeamEnabled && isOrgAdmin,
106
+ EDIT_TEAM_TYPE: isOrgAdmin,
107
+ CAN_EDIT_HIERARCHY: permission === 'FULL_WRITE' && isOrgAdmin
70
108
  });
71
109
  }
72
- return allPermissions(false, false);
110
+ return allPermissions(false, false, false);
111
+ };
112
+ export var getPermissionMap = function getPermissionMap(settings, permission, isMember, isOrgAdmin, source, state) {
113
+ // Handle disbanded teams with special permission map
114
+ if (state === 'DISBANDED') {
115
+ return getDisbandedTeamPermissionMap(settings, permission, isMember, isOrgAdmin);
116
+ }
117
+
118
+ // For active teams (or when state is not provided), use existing logic
119
+ return getActiveTeamPermissionMap(settings, permission, isMember, isOrgAdmin, source);
73
120
  };
@@ -1,6 +1,6 @@
1
1
  import { isMember } from '../team';
2
2
  import { getPermissionMap, vanityActions } from './constants';
3
- export function hasPermission(action, settings, permission, isPeopleBrowseEnabled, currentUserMembership, teamVisibilityPermissions, source) {
3
+ export function hasPermission(action, settings, permission, isPeopleBrowseEnabled, currentUserMembership, teamVisibilityPermissions, source, state) {
4
4
  if (!isPeopleBrowseEnabled && !vanityActions.includes(action)) {
5
5
  return false;
6
6
  }
@@ -11,14 +11,15 @@ export function hasPermission(action, settings, permission, isPeopleBrowseEnable
11
11
  teamPermission: permission,
12
12
  isMemberOfTeam: isMemberOfTeam,
13
13
  isOrgAdmin: isOrgAdmin,
14
- source: source
14
+ source: source,
15
+ state: state
15
16
  });
16
17
  }
17
18
  /**
18
19
  * Determines if a user has permission perform a given action on a team
19
20
  */
20
21
  export function userCan(action, options) {
21
- return getPermissionMap(options.membershipSettings, options.teamPermission, options.isMemberOfTeam, options.isOrgAdmin, options.source)[action];
22
+ return getPermissionMap(options.membershipSettings, options.teamPermission, options.isMemberOfTeam, options.isOrgAdmin, options.source, options.state)[action];
22
23
  }
23
24
 
24
25
  /**
@@ -1,5 +1,5 @@
1
- export var AllTeamActions = ['ADD_MEMBER_TO_TEAM', 'JOIN_TEAM', 'REQUEST_TO_JOIN', 'CANCEL_JOIN_REQUEST', 'APPROVE_JOIN_REQUEST', 'REJECT_JOIN_REQUEST', 'REMOVE_MEMBER_FROM_TEAM', 'CANCEL_INVITE', 'LEAVE_TEAM', 'REMOVE_AGENT_FROM_TEAM', 'ADD_AGENT_TO_TEAM',
1
+ export var AllTeamActions = ['ADD_MEMBER_TO_TEAM', 'JOIN_TEAM', 'REQUEST_TO_JOIN', 'CANCEL_JOIN_REQUEST', 'APPROVE_JOIN_REQUEST', 'REJECT_JOIN_REQUEST', 'REMOVE_MEMBER_FROM_TEAM', 'CANCEL_INVITE', 'LEAVE_TEAM', 'REMOVE_AGENT_FROM_TEAM', 'ADD_AGENT_TO_TEAM', 'CAN_EDIT_HIERARCHY',
2
2
  // Visual
3
- 'EDIT_TEAM_NAME', 'EDIT_DESCRIPTION', 'EDIT_PROFILE_HEADER', 'EDIT_TEAM_LINK', 'EDIT_TEAM_SETTINGS', 'EDIT_TEAM_MEMBERSHIP',
3
+ 'EDIT_TEAM_NAME', 'EDIT_DESCRIPTION', 'EDIT_PROFILE_HEADER', 'EDIT_TEAM_LINK', 'EDIT_TEAM_SETTINGS', 'EDIT_TEAM_MEMBERSHIP', 'EDIT_TEAM_TYPE',
4
4
  // Serious
5
- 'DELETE_TEAM', 'ARCHIVE_TEAM'];
5
+ 'DELETE_TEAM', 'ARCHIVE_TEAM', 'UNARCHIVE_TEAM'];
@@ -1,7 +1,7 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
2
  import { ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
3
3
  import { TeamsUFOExperience } from './index';
4
- var TeamsClientExperienceKeyList = ['getAllTeams', 'getTeamById', 'updateTeamById', 'querySettings', 'queryFeatureFlags', 'queryTeamMemberships', 'queryUser', 'inviteUsersToTeam', 'getMyTeamMembership', 'getTeamLinksByTeamId', 'createTeamLink', 'updateTeamLink', 'deleteTeamLink', 'reorderTeamLink', 'acceptTeamInvitation', 'declineTeamInvitation', 'selfJoinTeam', 'cancelJoinRequest', 'acceptJoinRequest', 'declineJoinRequest', 'deleteTeamMembership', 'revokeTeamInvite', 'deleteTeam', 'archiveTeam', 'isSingleFullMemberTeam', 'createTeam', 'createTeamContainers', 'createExternalTeam', 'getProfileWithMutability', 'getIsSiteAdmin', 'addUsersToTeam', 'removeTeamMemberships', 'getRecommendedProducts', 'joinOrRequestDefaultAccessToProductsBulk', 'getReadMediaToken', 'getWriteUserMediaToken', 'updateUserHeaderImage', 'getWriteTeamMediaToken', 'getSoftDeletedTeamById', 'restoreTeam', 'getUserInSiteUserBase', 'getLinkedTeamsBulk', 'getTeamProfileDetails', 'getUserContainers', 'getPermissions', 'getUserManageConfig', 'getMyAvatarUploadedStatus', 'deleteUserAvatar', 'getTeamLinkIcons', 'getTeamInSlack', 'getOrgScope', 'restoreTeamToSyncedGroup', 'getTeamAndGroupDiff', 'linkExistingTeamToGroup', 'fetchUserAvatarInfo', 'getOrgEligibilityForManagedTeams', 'updateUser', 'updateUserAvatar', 'disconnectTeamInSlack', 'updateTeamInSlack', 'getUserTenure', 'getAriFromUrl', 'getWebLinkTitle', 'addAgentToTeam', 'getTeamEnabledSites', 'assignTeamsToSites', 'removeAgentTeamAssociation', 'getAssignedTeams', 'setTeamSiteAssignmentPermission', 'getUnassignedTeams', 'getTeamSiteAssignmentOrgDetails', 'getTeamsToBeClonedToJsmSites', 'getReportingLines'];
4
+ var TeamsClientExperienceKeyList = ['getAllTeams', 'getTeamById', 'updateTeamById', 'querySettings', 'queryFeatureFlags', 'queryTeamMemberships', 'queryUser', 'inviteUsersToTeam', 'getMyTeamMembership', 'getTeamLinksByTeamId', 'createTeamLink', 'updateTeamLink', 'deleteTeamLink', 'reorderTeamLink', 'acceptTeamInvitation', 'declineTeamInvitation', 'selfJoinTeam', 'cancelJoinRequest', 'acceptJoinRequest', 'declineJoinRequest', 'deleteTeamMembership', 'revokeTeamInvite', 'deleteTeam', 'archiveTeam', 'unarchiveTeam', 'unlinkTeamFromGroup', 'isSingleFullMemberTeam', 'createTeam', 'createTeamContainers', 'createExternalTeam', 'getProfileWithMutability', 'getIsSiteAdmin', 'addUsersToTeam', 'removeTeamMemberships', 'getRecommendedProducts', 'joinOrRequestDefaultAccessToProductsBulk', 'getReadMediaToken', 'getWriteUserMediaToken', 'updateUserHeaderImage', 'getWriteTeamMediaToken', 'getSoftDeletedTeamById', 'restoreTeam', 'getUserInSiteUserBase', 'getLinkedTeamsBulk', 'getTeamProfileDetails', 'getUserContainers', 'getPermissions', 'getUserManageConfig', 'getMyAvatarUploadedStatus', 'deleteUserAvatar', 'getTeamLinkIcons', 'getTeamInSlack', 'getOrgScope', 'restoreTeamToSyncedGroup', 'getTeamAndGroupDiff', 'linkExistingTeamToGroup', 'fetchUserAvatarInfo', 'getOrgEligibilityForManagedTeams', 'updateUser', 'updateUserAvatar', 'disconnectTeamInSlack', 'updateTeamInSlack', 'getUserTenure', 'getAriFromUrl', 'getWebLinkTitle', 'addAgentToTeam', 'getTeamEnabledSites', 'assignTeamsToSites', 'removeAgentTeamAssociation', 'getAssignedTeams', 'setTeamSiteAssignmentPermission', 'getUnassignedTeams', 'getTeamSiteAssignmentOrgDetails', 'getTeamsToBeClonedToJsmSites', 'getReportingLines'];
5
5
  export var TEAMS_CLIENT_EXPERIENCES = new Map(_toConsumableArray(TeamsClientExperienceKeyList.map(function (key) {
6
6
  return [key,
7
7
  // camelCase to kebab-case
@@ -45,7 +45,7 @@ export var TeamsUFOExperience = /*#__PURE__*/function (_UFOExperience) {
45
45
  return _superPropGet(TeamsUFOExperience, "failure", this, 3)([{
46
46
  metadata: {
47
47
  error: createErrorMetadata(error),
48
- packageVersion: "4.20.0",
48
+ packageVersion: "4.23.0",
49
49
  packageName: "@atlaskit/teams-client"
50
50
  }
51
51
  }]);
@@ -53,7 +53,7 @@ export var TeamsUFOExperience = /*#__PURE__*/function (_UFOExperience) {
53
53
  return _superPropGet(TeamsUFOExperience, "failure", this, 3)([{
54
54
  metadata: {
55
55
  error: 'unknown error',
56
- packageVersion: "4.20.0",
56
+ packageVersion: "4.23.0",
57
57
  packageName: "@atlaskit/teams-client"
58
58
  }
59
59
  }]);