@atlaskit/profilecard 15.8.2 → 16.1.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 (67) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/cjs/client/ProfileCardClient.js +33 -0
  3. package/dist/cjs/client/TeamCentralCardClient.js +162 -0
  4. package/dist/cjs/client/UserProfileCardClient.js +1 -1
  5. package/dist/cjs/client/index.js +1 -1
  6. package/dist/cjs/components/Team/TeamProfileCard.js +5 -5
  7. package/dist/cjs/components/User/ProfileCard.js +26 -9
  8. package/dist/cjs/components/User/ProfileCardResourced.js +16 -8
  9. package/dist/cjs/components/User/ProfileCardTrigger.js +15 -8
  10. package/dist/cjs/components/User/ReportingLinesDetails.js +90 -0
  11. package/dist/cjs/components/User/index.js +4 -4
  12. package/dist/cjs/i18n/index.js +42 -42
  13. package/dist/cjs/index.js +23 -23
  14. package/dist/cjs/internal/relative-date.js +1 -1
  15. package/dist/cjs/messages.js +12 -2
  16. package/dist/cjs/mocks/mock-profile-client.js +42 -3
  17. package/dist/cjs/mocks/reporting-lines-data.js +28 -0
  18. package/dist/cjs/mocks/simple-mock-clients.js +1 -1
  19. package/dist/cjs/mocks/util.js +1 -1
  20. package/dist/cjs/styled/Card.js +1 -1
  21. package/dist/cjs/styled/Error.js +1 -1
  22. package/dist/cjs/styled/ReportingLines.js +38 -0
  23. package/dist/cjs/styled/TeamCard.js +1 -1
  24. package/dist/cjs/styled/constants.js +1 -1
  25. package/dist/cjs/util/analytics.js +2 -2
  26. package/dist/cjs/util/config.js +1 -1
  27. package/dist/cjs/version.json +1 -1
  28. package/dist/es2019/client/ProfileCardClient.js +25 -0
  29. package/dist/es2019/client/TeamCentralCardClient.js +109 -0
  30. package/dist/es2019/components/Team/TeamProfileCard.js +1 -1
  31. package/dist/es2019/components/User/ProfileCard.js +16 -4
  32. package/dist/es2019/components/User/ProfileCardResourced.js +13 -6
  33. package/dist/es2019/components/User/ProfileCardTrigger.js +12 -6
  34. package/dist/es2019/components/User/ReportingLinesDetails.js +71 -0
  35. package/dist/es2019/messages.js +11 -1
  36. package/dist/es2019/mocks/mock-profile-client.js +25 -0
  37. package/dist/es2019/mocks/reporting-lines-data.js +14 -0
  38. package/dist/es2019/styled/ReportingLines.js +28 -0
  39. package/dist/es2019/util/analytics.js +1 -1
  40. package/dist/es2019/version.json +1 -1
  41. package/dist/esm/client/ProfileCardClient.js +32 -0
  42. package/dist/esm/client/TeamCentralCardClient.js +147 -0
  43. package/dist/esm/components/Team/TeamProfileCard.js +1 -1
  44. package/dist/esm/components/User/ProfileCard.js +20 -4
  45. package/dist/esm/components/User/ProfileCardResourced.js +16 -8
  46. package/dist/esm/components/User/ProfileCardTrigger.js +15 -8
  47. package/dist/esm/components/User/ReportingLinesDetails.js +73 -0
  48. package/dist/esm/messages.js +11 -1
  49. package/dist/esm/mocks/mock-profile-client.js +42 -3
  50. package/dist/esm/mocks/reporting-lines-data.js +16 -0
  51. package/dist/esm/styled/ReportingLines.js +12 -0
  52. package/dist/esm/util/analytics.js +1 -1
  53. package/dist/esm/version.json +1 -1
  54. package/dist/types/client/ProfileCardClient.d.ts +4 -1
  55. package/dist/types/client/TeamCentralCardClient.d.ts +22 -0
  56. package/dist/types/components/Error/ErrorIllustration.d.ts +1 -0
  57. package/dist/types/components/Team/TeamLoadingState.d.ts +1 -0
  58. package/dist/types/components/Team/TeamProfileCard.d.ts +1 -0
  59. package/dist/types/components/User/ProfileCardResourced.d.ts +2 -2
  60. package/dist/types/components/User/ProfileCardTrigger.d.ts +2 -2
  61. package/dist/types/components/User/ReportingLinesDetails.d.ts +7 -0
  62. package/dist/types/components/User/UserLoadingState.d.ts +1 -0
  63. package/dist/types/messages.d.ts +10 -0
  64. package/dist/types/mocks/reporting-lines-data.d.ts +2 -0
  65. package/dist/types/styled/ReportingLines.d.ts +6 -0
  66. package/dist/types/types.d.ts +32 -1
  67. package/package.json +6 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # @atlaskit/profilecard
2
2
 
3
+ ## 16.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`a5c73ccaa58`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a5c73ccaa58) - Added manager and direct reports section to profile hover card"
8
+
9
+ ## 16.0.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [`c55c736ecea`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c55c736ecea) - Patch VULN AFP-3486 AFP-3487 AFP-3488 AFP-3489
14
+
15
+ ## 16.0.1
16
+
17
+ ### Patch Changes
18
+
19
+ - [`82099b76445`](https://bitbucket.org/atlassian/atlassian-frontend/commits/82099b76445) - Add optional `testId` prop to `ProfileCardTrigger` to ease testing
20
+
21
+ ## 16.0.0
22
+
23
+ ### Major Changes
24
+
25
+ - [`47f58da5946`](https://bitbucket.org/atlassian/atlassian-frontend/commits/47f58da5946) - ED-13322, ED-13324, ED-13326, ED-13323, ED-13204: Upgrade and support react-intl@^5.18.1 including breaking API changes, types and tests in atlassian-frontend packages
26
+
27
+ What changed: Upgraded our react-intl support from ^2.6.0 to ^5.18.1. This means editor packages now rely on consumers installing ^5.18.1, otherwise editor usage of react-intl will mismatch with actual installed react-intl APIs.
28
+ Why change was made: As part of a coordinated upgrade effort across AF packages, as react-intl v2 is quite dated.
29
+ How consumer should update their code: Ensure react-intl ^5.18.1 is installed in consuming applications.
30
+
31
+ Upgrade guide: To consume atlassian-frontend packages that use react-intl5 setup a second provider for the new version, using an npm alias
32
+
33
+ ```js
34
+ "react-intl": "^2.6.0",
35
+ "react-intl-next": "npm:react-intl@^5.18.1",
36
+ ```
37
+
38
+ ```js
39
+ import { IntlProvider } from 'react-intl';
40
+ import { IntlProvider as IntlNextProvider } from 'react-intl-next';
41
+
42
+ return (
43
+ <IntlProvider
44
+ key={locale}
45
+ data-test-language={locale}
46
+ locale={locale}
47
+ defaultLocale={DEFAULT_LOCALE}
48
+ messages={messages}
49
+ >
50
+ <IntlNextProvider
51
+ key={locale}
52
+ data-test-language={locale}
53
+ locale={locale}
54
+ defaultLocale={DEFAULT_LOCALE}
55
+ messages={messages}
56
+ >
57
+ {children}
58
+ </IntlNextProvider>
59
+ </IntlProvider>
60
+ );
61
+ ```
62
+
3
63
  ## 15.8.2
4
64
 
5
65
  ### Patch Changes
@@ -7,26 +7,38 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
10
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
13
 
12
14
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
15
 
16
+ var _TeamCentralCardClient = _interopRequireDefault(require("./TeamCentralCardClient"));
17
+
14
18
  var _TeamProfileCardClient = _interopRequireDefault(require("./TeamProfileCardClient"));
15
19
 
16
20
  var _UserProfileCardClient = _interopRequireDefault(require("./UserProfileCardClient"));
17
21
 
22
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
23
+
24
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
25
+
18
26
  var ProfileCardClient = /*#__PURE__*/function () {
19
27
  function ProfileCardClient(config, clients) {
20
28
  (0, _classCallCheck2.default)(this, ProfileCardClient);
21
29
  this.userClient = (clients === null || clients === void 0 ? void 0 : clients.userClient) || new _UserProfileCardClient.default(config);
22
30
  this.teamClient = (clients === null || clients === void 0 ? void 0 : clients.teamClient) || new _TeamProfileCardClient.default(config);
31
+ this.tcClient = maybeCreateTeamCentralClient(config, clients);
23
32
  }
24
33
 
25
34
  (0, _createClass2.default)(ProfileCardClient, [{
26
35
  key: "flushCache",
27
36
  value: function flushCache() {
37
+ var _this$tcClient;
38
+
28
39
  this.userClient.flushCache();
29
40
  this.teamClient.flushCache();
41
+ (_this$tcClient = this.tcClient) === null || _this$tcClient === void 0 ? void 0 : _this$tcClient.flushCache();
30
42
  }
31
43
  }, {
32
44
  key: "getProfile",
@@ -38,9 +50,30 @@ var ProfileCardClient = /*#__PURE__*/function () {
38
50
  value: function getTeamProfile(teamId, orgId, analytics) {
39
51
  return this.teamClient.getProfile(teamId, orgId, analytics);
40
52
  }
53
+ }, {
54
+ key: "getReportingLines",
55
+ value: function getReportingLines(userId) {
56
+ var _this$tcClient2;
57
+
58
+ return ((_this$tcClient2 = this.tcClient) === null || _this$tcClient2 === void 0 ? void 0 : _this$tcClient2.getReportingLines(userId)) || Promise.resolve({
59
+ managers: [],
60
+ reports: []
61
+ });
62
+ }
41
63
  }]);
42
64
  return ProfileCardClient;
43
65
  }();
44
66
 
67
+ function maybeCreateTeamCentralClient(config, clients) {
68
+ if (clients !== null && clients !== void 0 && clients.teamCentralClient) {
69
+ return clients.teamCentralClient;
70
+ }
71
+
72
+ var teamCentralUrl = config.teamCentralUrl;
73
+ return teamCentralUrl ? new _TeamCentralCardClient.default(_objectSpread(_objectSpread({}, config), {}, {
74
+ teamCentralUrl: teamCentralUrl
75
+ })) : undefined;
76
+ }
77
+
45
78
  var _default = ProfileCardClient;
46
79
  exports.default = _default;
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
+
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+
24
+ var _CachingClient2 = _interopRequireDefault(require("./CachingClient"));
25
+
26
+ var _graphqlUtils = require("./graphqlUtils");
27
+
28
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
29
+
30
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
31
+
32
+ var buildReportingLinesQuery = function buildReportingLinesQuery(aaid) {
33
+ return {
34
+ query: "\n fragment ReportingLinesUserPII on UserPII {\n name\n picture\n }\n\n fragment ReportingLinesUserFragment on ReportingLinesUser {\n accountIdentifier\n identifierType\n pii {\n ...ReportingLinesUserPII\n }\n }\n\n query ReportingLines($aaid: String) {\n reportingLines(aaidOrHash: $aaid) {\n managers {\n ...ReportingLinesUserFragment\n }\n reports {\n ...ReportingLinesUserFragment\n }\n }\n }\n ",
35
+ variables: {
36
+ aaid: aaid
37
+ }
38
+ };
39
+ };
40
+
41
+ var TeamCentralCardClient = /*#__PURE__*/function (_CachingClient) {
42
+ (0, _inherits2.default)(TeamCentralCardClient, _CachingClient);
43
+
44
+ var _super = _createSuper(TeamCentralCardClient);
45
+
46
+ /**
47
+ * Simple circuit breaker to avoid making unnecessary calls to Team Central on auth failures
48
+ * This is to handle the case where products may have provided teamCentralUrl, but the site itself
49
+ * doesn't actually have any TC product.
50
+ *
51
+ * There's currently no way to reset this circuit breaker, but that's fine. This is meant to
52
+ * catch a pretty specific edge case.
53
+ */
54
+ function TeamCentralCardClient(options) {
55
+ var _this;
56
+
57
+ (0, _classCallCheck2.default)(this, TeamCentralCardClient);
58
+ _this = _super.call(this, options);
59
+ _this.options = options;
60
+ _this.bypassOnFailure = false;
61
+ return _this;
62
+ }
63
+
64
+ (0, _createClass2.default)(TeamCentralCardClient, [{
65
+ key: "makeRequest",
66
+ value: function () {
67
+ var _makeRequest = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(userId) {
68
+ var query, response;
69
+ return _regenerator.default.wrap(function _callee$(_context) {
70
+ while (1) {
71
+ switch (_context.prev = _context.next) {
72
+ case 0:
73
+ if (this.options.teamCentralUrl) {
74
+ _context.next = 2;
75
+ break;
76
+ }
77
+
78
+ throw new Error('options.teamCentralUrl is a required parameter for retrieving Team Central data');
79
+
80
+ case 2:
81
+ query = buildReportingLinesQuery(userId);
82
+ _context.next = 5;
83
+ return (0, _graphqlUtils.graphqlQuery)(this.options.teamCentralUrl, query);
84
+
85
+ case 5:
86
+ response = _context.sent;
87
+ return _context.abrupt("return", response.reportingLines);
88
+
89
+ case 7:
90
+ case "end":
91
+ return _context.stop();
92
+ }
93
+ }
94
+ }, _callee, this);
95
+ }));
96
+
97
+ function makeRequest(_x) {
98
+ return _makeRequest.apply(this, arguments);
99
+ }
100
+
101
+ return makeRequest;
102
+ }()
103
+ }, {
104
+ key: "getReportingLines",
105
+ value: function getReportingLines(userId) {
106
+ var _this2 = this;
107
+
108
+ if (!userId) {
109
+ return Promise.reject(new Error('userId missing'));
110
+ }
111
+
112
+ var cache = this.getCachedProfile(userId);
113
+
114
+ if (cache) {
115
+ return Promise.resolve(cache);
116
+ }
117
+
118
+ if (this.bypassOnFailure) {
119
+ return Promise.resolve({});
120
+ }
121
+
122
+ return new Promise(function (resolve) {
123
+ _this2.makeRequest(userId).then(function (data) {
124
+ var enhancedData = {
125
+ managers: _this2.filterReportingLinesUser(data === null || data === void 0 ? void 0 : data.managers),
126
+ reports: _this2.filterReportingLinesUser(data === null || data === void 0 ? void 0 : data.reports)
127
+ };
128
+
129
+ if (_this2.cache) {
130
+ _this2.setCachedProfile(userId, enhancedData);
131
+ }
132
+
133
+ resolve(enhancedData);
134
+ }).catch(function (error) {
135
+ if ((error === null || error === void 0 ? void 0 : error.status) === 401 || (error === null || error === void 0 ? void 0 : error.status) === 403) {
136
+ // Trigger circuit breaker
137
+ _this2.bypassOnFailure = true;
138
+ }
139
+ /**
140
+ * Reporting lines aren't part of the critical path of profile card.
141
+ * Just resolve with empty values instead of bubbling up the error.
142
+ */
143
+
144
+
145
+ resolve({});
146
+ });
147
+ });
148
+ }
149
+ }, {
150
+ key: "filterReportingLinesUser",
151
+ value: function filterReportingLinesUser() {
152
+ var users = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
153
+ return users.filter(function (user) {
154
+ return user.identifierType === 'ATLASSIAN_ID';
155
+ });
156
+ }
157
+ }]);
158
+ return TeamCentralCardClient;
159
+ }(_CachingClient2.default);
160
+
161
+ var _default = TeamCentralCardClient;
162
+ exports.default = _default;
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.modifyResponse = void 0;
8
+ exports.modifyResponse = exports.default = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
@@ -25,13 +25,13 @@ Object.defineProperty(exports, "UserProfileClient", {
25
25
  return _UserProfileCardClient.default;
26
26
  }
27
27
  });
28
+ exports.default = void 0;
28
29
  Object.defineProperty(exports, "modifyResponse", {
29
30
  enumerable: true,
30
31
  get: function get() {
31
32
  return _UserProfileCardClient.modifyResponse;
32
33
  }
33
34
  });
34
- exports.default = void 0;
35
35
 
36
36
  var _CachingClient = _interopRequireDefault(require("./CachingClient"));
37
37
 
@@ -19,7 +19,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
19
19
 
20
20
  var _react = _interopRequireWildcard(require("react"));
21
21
 
22
- var _reactIntl = require("react-intl");
22
+ var _reactIntlNext = require("react-intl-next");
23
23
 
24
24
  var _avatarGroup = _interopRequireDefault(require("@atlaskit/avatar-group"));
25
25
 
@@ -103,7 +103,7 @@ var TeamMembers = function TeamMembers(_ref) {
103
103
 
104
104
  isMoreMembersOpen.current = !isOpen;
105
105
  }, [analytics, count]);
106
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_TeamCard.MemberCount, null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, (0, _extends2.default)({}, message, {
106
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_TeamCard.MemberCount, null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, message, {
107
107
  values: {
108
108
  count: count
109
109
  }
@@ -256,7 +256,7 @@ var TeamProfilecardContent = function TeamProfilecardContent(_ref5) {
256
256
  viewProfileLink = _ref5.viewProfileLink,
257
257
  viewProfileOnClick = _ref5.viewProfileOnClick;
258
258
  var allActions = [{
259
- label: /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.teamViewProfile),
259
+ label: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.teamViewProfile),
260
260
  link: viewProfileLink,
261
261
  callback: viewProfileOnClick,
262
262
  id: 'view-profile'
@@ -320,12 +320,12 @@ var ErrorMessage = function ErrorMessage(_ref6) {
320
320
  }, [analytics, clientFetchProfile]);
321
321
  return /*#__PURE__*/_react.default.createElement(_Error.ErrorWrapper, {
322
322
  "data-testid": "team-profilecard-error"
323
- }, /*#__PURE__*/_react.default.createElement(_Error2.ErrorIllustration, null), /*#__PURE__*/_react.default.createElement(_Error.TeamErrorTitle, null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.teamErrorTitle)), /*#__PURE__*/_react.default.createElement(_Error.TeamErrorText, null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.teamErrorText)), clientFetchProfile && /*#__PURE__*/_react.default.createElement(_TeamCard.ActionButtons, null, /*#__PURE__*/_react.default.createElement(_TeamCard.WrappedButton, null, /*#__PURE__*/_react.default.createElement(_loadingButton.default, {
323
+ }, /*#__PURE__*/_react.default.createElement(_Error2.ErrorIllustration, null), /*#__PURE__*/_react.default.createElement(_Error.TeamErrorTitle, null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.teamErrorTitle)), /*#__PURE__*/_react.default.createElement(_Error.TeamErrorText, null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.teamErrorText)), clientFetchProfile && /*#__PURE__*/_react.default.createElement(_TeamCard.ActionButtons, null, /*#__PURE__*/_react.default.createElement(_TeamCard.WrappedButton, null, /*#__PURE__*/_react.default.createElement(_loadingButton.default, {
324
324
  testId: "client-fetch-profile-button",
325
325
  shouldFitContainer: true,
326
326
  onClick: retry,
327
327
  isLoading: isLoading
328
- }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.teamErrorButton)))));
328
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.teamErrorButton)))));
329
329
  };
330
330
 
331
331
  var TeamProfileCard = function TeamProfileCard(props) {
@@ -27,7 +27,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
27
27
 
28
28
  var _react = _interopRequireDefault(require("react"));
29
29
 
30
- var _reactIntl = require("react-intl");
30
+ var _reactIntlNext = require("react-intl-next");
31
31
 
32
32
  var _avatar = _interopRequireDefault(require("@atlaskit/avatar"));
33
33
 
@@ -55,6 +55,8 @@ var _Error = require("../Error");
55
55
 
56
56
  var _Icon = require("../Icon");
57
57
 
58
+ var _ReportingLinesDetails = _interopRequireDefault(require("./ReportingLinesDetails"));
59
+
58
60
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
59
61
 
60
62
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
@@ -148,6 +150,8 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
148
150
  }, {
149
151
  key: "renderCardDetailsDefault",
150
152
  value: function renderCardDetailsDefault() {
153
+ var _this4 = this;
154
+
151
155
  var _this$props2 = this.props,
152
156
  meta = _this$props2.meta,
153
157
  location = _this$props2.location,
@@ -163,7 +167,15 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
163
167
  icon: "companyName"
164
168
  }, companyName), /*#__PURE__*/_react.default.createElement(_Icon.IconLabel, {
165
169
  icon: "location"
166
- }, location));
170
+ }, location), /*#__PURE__*/_react.default.createElement(_ReportingLinesDetails.default, {
171
+ reportingLines: this.props.reportingLines,
172
+ reportingLinesProfileUrl: this.props.reportingLinesProfileUrl,
173
+ onReportingLinesClick: this.props.onReportingLinesClick,
174
+ analytics: this.props.analytics,
175
+ getDuration: function getDuration() {
176
+ return _this4.durationSince(_this4.timeOpen);
177
+ }
178
+ }));
167
179
  }
168
180
  }, {
169
181
  key: "renderCardDetailsForDisabledAccount",
@@ -178,7 +190,7 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
178
190
  }, this.getDisabledAccountName()), hasDisabledAccountLozenge && /*#__PURE__*/_react.default.createElement(_Card.LozengeWrapper, null, /*#__PURE__*/_react.default.createElement(_lozenge.default, {
179
191
  appearance: "default",
180
192
  isBold: true
181
- }, status === 'inactive' && /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.inactiveAccountMsg), status === 'closed' && /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.closedAccountMsg))), /*#__PURE__*/_react.default.createElement(_Card.DisabledInfo, null, this.getDisabledAccountDesc()), status === 'inactive' && /*#__PURE__*/_react.default.createElement(_Icon.IconLabel, {
193
+ }, status === 'inactive' && /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.inactiveAccountMsg), status === 'closed' && /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.closedAccountMsg))), /*#__PURE__*/_react.default.createElement(_Card.DisabledInfo, null, this.getDisabledAccountDesc()), status === 'inactive' && /*#__PURE__*/_react.default.createElement(_Icon.IconLabel, {
182
194
  icon: "companyName"
183
195
  }, companyName));
184
196
  }
@@ -193,7 +205,7 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
193
205
  if (status === 'inactive') {
194
206
  return fullName || nickname;
195
207
  } else if (status === 'closed') {
196
- return nickname || /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.disabledAccountDefaultName);
208
+ return nickname || /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.disabledAccountDefaultName);
197
209
  }
198
210
 
199
211
  return null;
@@ -216,16 +228,16 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
216
228
  var secondSentence = null;
217
229
 
218
230
  if (relativeDateKey) {
219
- secondSentence = /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage // @ts-ignore
231
+ secondSentence = /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage // @ts-ignore
220
232
  , _messages.default["".concat(status, "AccountDescMsgHasDate").concat(relativeDateKey)]);
221
233
  } else {
222
234
  secondSentence =
223
235
  /*#__PURE__*/
224
236
  // @ts-ignore
225
- _react.default.createElement(_reactIntl.FormattedMessage, _messages.default["".concat(status, "AccountDescMsgNoDate")]);
237
+ _react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default["".concat(status, "AccountDescMsgNoDate")]);
226
238
  }
227
239
 
228
- return /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _messages.default.generalDescMsgForDisabledUser), ' ', secondSentence);
240
+ return /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.generalDescMsgForDisabledUser), ' ', secondSentence);
229
241
  }
230
242
  }, {
231
243
  key: "renderFullNameAndPublicName",
@@ -284,7 +296,8 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
284
296
  var _this$props8 = this.props,
285
297
  fullName = _this$props8.fullName,
286
298
  status = _this$props8.status,
287
- withoutElevation = _this$props8.withoutElevation;
299
+ withoutElevation = _this$props8.withoutElevation,
300
+ reportingLines = _this$props8.reportingLines;
288
301
  var cardContent = null; // @FIXME do closed users have empty fullName field?
289
302
 
290
303
  var canRender = fullName || status === 'closed';
@@ -295,10 +308,14 @@ var Profilecard = /*#__PURE__*/function (_React$PureComponent) {
295
308
  } else if (this.props.isLoading) {
296
309
  cardContent = /*#__PURE__*/_react.default.createElement(_Card.SpinnerContainer, null, /*#__PURE__*/_react.default.createElement(_spinner.default, null));
297
310
  } else if (canRender) {
311
+ var _reportingLines$manag, _reportingLines$repor;
312
+
298
313
  var isDisabledUser = status === 'inactive' || status === 'closed';
299
314
  var actions = this.renderActionsButtons();
300
315
  this.callAnalytics(_analytics.AnalyticsName.PROFILE_CARD_LOADED, {
301
- duration: this.durationSince(this.timeOpen)
316
+ duration: this.durationSince(this.timeOpen),
317
+ managersCount: (reportingLines === null || reportingLines === void 0 ? void 0 : (_reportingLines$manag = reportingLines.managers) === null || _reportingLines$manag === void 0 ? void 0 : _reportingLines$manag.length) || 0,
318
+ directReportsCount: (reportingLines === null || reportingLines === void 0 ? void 0 : (_reportingLines$repor = reportingLines.reports) === null || _reportingLines$repor === void 0 ? void 0 : _reportingLines$repor.length) || 0
302
319
  });
303
320
  cardContent = /*#__PURE__*/_react.default.createElement(_Card.CardContainer, {
304
321
  isDisabledUser: isDisabledUser,
@@ -66,7 +66,8 @@ var ProfileCardResourced = /*#__PURE__*/function (_React$PureComponent) {
66
66
  isLoading: undefined,
67
67
  hasError: false,
68
68
  error: null,
69
- data: null
69
+ data: null,
70
+ reportingLinesData: undefined
70
71
  });
71
72
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "callAnalytics", function (id) {
72
73
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -92,8 +93,9 @@ var ProfileCardResourced = /*#__PURE__*/function (_React$PureComponent) {
92
93
  hasError: false,
93
94
  data: null
94
95
  }, function () {
95
- _this.props.resourceClient.getProfile(cloudId, userId).then(function (res) {
96
- return _this.handleClientSuccess(res);
96
+ var requests = Promise.all([_this.props.resourceClient.getProfile(cloudId, userId), _this.props.resourceClient.getReportingLines(userId)]);
97
+ requests.then(function (res) {
98
+ return _this.handleClientSuccess(res[0], res[1]);
97
99
  }, function (err) {
98
100
  return _this.handleClientError(err);
99
101
  }).catch(function (err) {
@@ -139,7 +141,7 @@ var ProfileCardResourced = /*#__PURE__*/function (_React$PureComponent) {
139
141
  }
140
142
  }, {
141
143
  key: "handleClientSuccess",
142
- value: function handleClientSuccess(res) {
144
+ value: function handleClientSuccess(profileData, reportingLinesData) {
143
145
  if (!this._isMounted) {
144
146
  return;
145
147
  }
@@ -147,7 +149,8 @@ var ProfileCardResourced = /*#__PURE__*/function (_React$PureComponent) {
147
149
  this.setState({
148
150
  isLoading: false,
149
151
  hasError: false,
150
- data: res
152
+ data: profileData,
153
+ reportingLinesData: reportingLinesData
151
154
  });
152
155
  }
153
156
  }, {
@@ -170,8 +173,11 @@ var ProfileCardResourced = /*#__PURE__*/function (_React$PureComponent) {
170
173
  isLoading = _this$state.isLoading,
171
174
  hasError = _this$state.hasError,
172
175
  error = _this$state.error,
173
- data = _this$state.data;
174
- var analytics = this.props.analytics;
176
+ data = _this$state.data,
177
+ reportingLinesData = _this$state.reportingLinesData;
178
+ var _this$props3 = this.props,
179
+ analytics = _this$props3.analytics,
180
+ onReportingLinesClick = _this$props3.onReportingLinesClick;
175
181
  var isFetchingOrNotStartToFetchYet = isLoading === true || isLoading === undefined;
176
182
 
177
183
  if (isFetchingOrNotStartToFetchYet) {
@@ -187,7 +193,9 @@ var ProfileCardResourced = /*#__PURE__*/function (_React$PureComponent) {
187
193
  hasError: hasError,
188
194
  errorType: error,
189
195
  clientFetchProfile: this.clientFetchProfile,
190
- analytics: analytics
196
+ analytics: analytics,
197
+ reportingLines: reportingLinesData,
198
+ onReportingLinesClick: onReportingLinesClick
191
199
  }, data);
192
200
 
193
201
  return /*#__PURE__*/_react.default.createElement(_Card.CardWrapper, null, /*#__PURE__*/_react.default.createElement(_ProfileCard.default, (0, _extends2.default)({}, newProps, {
@@ -106,7 +106,8 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
106
106
  isLoading: undefined,
107
107
  hasError: false,
108
108
  error: null,
109
- data: null
109
+ data: null,
110
+ reportingLinesData: undefined
110
111
  });
111
112
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "clientFetchProfile", function () {
112
113
  var _this$props = _this.props,
@@ -124,8 +125,9 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
124
125
  hasError: false,
125
126
  data: null
126
127
  }, function () {
127
- _this.props.resourceClient.getProfile(cloudId || '', userId).then(function (res) {
128
- return _this.handleClientSuccess(res);
128
+ var requests = Promise.all([_this.props.resourceClient.getProfile(cloudId || '', userId), _this.props.resourceClient.getReportingLines(userId)]);
129
+ requests.then(function (res) {
130
+ return _this.handleClientSuccess(res[0], res[1]);
129
131
  }, function (err) {
130
132
  return _this.handleClientError(err);
131
133
  }).catch(function (err) {
@@ -174,7 +176,7 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
174
176
  }
175
177
  }, {
176
178
  key: "handleClientSuccess",
177
- value: function handleClientSuccess(res) {
179
+ value: function handleClientSuccess(profileData, reportingLinesData) {
178
180
  if (!this._isMounted) {
179
181
  return;
180
182
  }
@@ -182,7 +184,8 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
182
184
  this.setState({
183
185
  isLoading: false,
184
186
  hasError: false,
185
- data: res
187
+ data: profileData,
188
+ reportingLinesData: reportingLinesData
186
189
  });
187
190
  }
188
191
  }, {
@@ -206,10 +209,13 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
206
209
  }, {
207
210
  key: "renderProfileCard",
208
211
  value: function renderProfileCard() {
209
- var newProps = _objectSpread({
212
+ var newProps = _objectSpread(_objectSpread({
210
213
  clientFetchProfile: this.clientFetchProfile,
211
214
  analytics: this.props.analytics
212
- }, this.state.data);
215
+ }, this.state.data), {}, {
216
+ reportingLines: this.state.reportingLinesData,
217
+ onReportingLinesClick: this.props.onReportingLinesClick
218
+ });
213
219
 
214
220
  var wrapperProps = this.props.trigger === 'hover' ? {
215
221
  onMouseEnter: this.showProfilecard,
@@ -236,7 +242,8 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
236
242
  var ref = triggerProps.ref,
237
243
  innerProps = (0, _objectWithoutProperties2.default)(triggerProps, ["ref"]);
238
244
  return /*#__PURE__*/_react.default.createElement("span", (0, _extends2.default)({}, innerProps, _this2.containerListeners, {
239
- ref: ref
245
+ ref: ref,
246
+ "data-testid": _this2.props.testId
240
247
  }), _this2.props.children);
241
248
  },
242
249
  zIndex: _constants.layers.modal()