@atlaskit/link-datasource 1.29.3 → 1.29.5

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 (55) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/services/mocks.js +44 -2
  3. package/dist/cjs/services/useBasicFilterAGG.js +19 -7
  4. package/dist/cjs/services/utils.js +3 -2
  5. package/dist/cjs/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +15 -3
  6. package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useBasicFilterHydration.js +79 -0
  7. package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +2 -6
  8. package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +1 -0
  9. package/dist/cjs/ui/confluence-search-modal/basic-filters/index.js +4 -2
  10. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +23 -1
  11. package/dist/cjs/ui/confluence-search-modal/modal/index.js +19 -2
  12. package/dist/cjs/ui/table-footer/powered-by-jsm-assets/index.js +1 -1
  13. package/dist/es2019/services/mocks.js +43 -1
  14. package/dist/es2019/services/useBasicFilterAGG.js +16 -6
  15. package/dist/es2019/services/utils.js +7 -0
  16. package/dist/es2019/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +15 -4
  17. package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useBasicFilterHydration.js +39 -0
  18. package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +2 -7
  19. package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +1 -0
  20. package/dist/es2019/ui/confluence-search-modal/basic-filters/index.js +4 -2
  21. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +24 -1
  22. package/dist/es2019/ui/confluence-search-modal/modal/index.js +17 -2
  23. package/dist/es2019/ui/table-footer/powered-by-jsm-assets/index.js +1 -1
  24. package/dist/esm/services/mocks.js +43 -1
  25. package/dist/esm/services/useBasicFilterAGG.js +20 -8
  26. package/dist/esm/services/utils.js +2 -1
  27. package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +16 -4
  28. package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useBasicFilterHydration.js +72 -0
  29. package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +2 -6
  30. package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +1 -0
  31. package/dist/esm/ui/confluence-search-modal/basic-filters/index.js +4 -2
  32. package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +23 -1
  33. package/dist/esm/ui/confluence-search-modal/modal/index.js +19 -2
  34. package/dist/esm/ui/table-footer/powered-by-jsm-assets/index.js +1 -1
  35. package/dist/types/services/mocks.d.ts +11 -0
  36. package/dist/types/services/useBasicFilterAGG.d.ts +2 -1
  37. package/dist/types/services/utils.d.ts +1 -0
  38. package/dist/types/ui/common/modal/popup-select/types.d.ts +4 -0
  39. package/dist/types/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.d.ts +2 -1
  40. package/dist/types/ui/confluence-search-modal/basic-filters/hooks/useBasicFilterHydration.d.ts +6 -0
  41. package/dist/types/ui/confluence-search-modal/basic-filters/index.d.ts +2 -1
  42. package/dist/types/ui/confluence-search-modal/basic-filters/types.d.ts +8 -0
  43. package/dist/types/ui/confluence-search-modal/confluence-search-container/index.d.ts +6 -2
  44. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.d.ts +2 -3
  45. package/dist/types-ts4.5/services/mocks.d.ts +11 -0
  46. package/dist/types-ts4.5/services/useBasicFilterAGG.d.ts +2 -1
  47. package/dist/types-ts4.5/services/utils.d.ts +1 -0
  48. package/dist/types-ts4.5/ui/common/modal/popup-select/types.d.ts +4 -0
  49. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.d.ts +2 -1
  50. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/hooks/useBasicFilterHydration.d.ts +6 -0
  51. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/index.d.ts +2 -1
  52. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/types.d.ts +8 -0
  53. package/dist/types-ts4.5/ui/confluence-search-modal/confluence-search-container/index.d.ts +6 -2
  54. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.d.ts +2 -3
  55. package/package.json +8 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.29.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [#94901](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/94901) [`da964fcdc828`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/da964fcdc828) - [ED-23097] Bump ADF schema to version 35.12.1
8
+ - [#95182](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/95182) [`3d3dd335b8e8`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/3d3dd335b8e8) - The internal composition of this component has changed. There is no expected change in behavior.
9
+
10
+ ## 1.29.4
11
+
12
+ ### Patch Changes
13
+
14
+ - [#92797](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/92797) [`55f4c6b7a6f0`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/55f4c6b7a6f0) - The changes here adds the logic to hydrate Edited/Created by filter values.
15
+
3
16
  ## 1.29.3
4
17
 
5
18
  ### Patch Changes
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.mockUserRecommendationsResponse = exports.mockHydrateJqlResponse = exports.mockFieldValuesResponse = void 0;
6
+ exports.mockUserRecommendationsResponse = exports.mockUserHydrationResponse = exports.mockTransformedUserHydrationResponse = exports.mockHydrateJqlResponse = exports.mockFieldValuesResponse = void 0;
7
7
  var mockHydrateJqlResponse = exports.mockHydrateJqlResponse = {
8
8
  data: {
9
9
  jira: {
@@ -282,4 +282,46 @@ var mockUserRecommendationsResponse = exports.mockUserRecommendationsResponse =
282
282
  isConfluenceExternalCollaborator: false
283
283
  }
284
284
  }]
285
- };
285
+ };
286
+ var mockUserHydrationResponse = exports.mockUserHydrationResponse = {
287
+ data: {
288
+ users: [{
289
+ accountId: '655363:d8dff7fe-efb7-4073-a3cd-12463ac79e1c',
290
+ name: 'Peter Grasevski',
291
+ picture: 'https://secure.gravatar.com/avatar/f4bb2f6eef1621e67cd136c0be9af81c?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FPG-5.png'
292
+ }, {
293
+ accountId: '62cf07378afb5805e5d46454',
294
+ name: 'Richard Wang',
295
+ picture: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62cf07378afb5805e5d46454/5d1719ab-8717-4837-9ae7-a3761c3b6604/128'
296
+ }, {
297
+ accountId: '62f3ed1ee50f2f2a39573e7f',
298
+ name: 'Luke Muller',
299
+ picture: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62f3ed1ee50f2f2a39573e7f/1bd99ace-ea01-4d41-b0ab-3e1ebc353914/128'
300
+ }, {
301
+ accountId: '6232212a62dc1e006802dea8',
302
+ name: 'Nidhin Joseph',
303
+ picture: 'https://secure.gravatar.com/avatar/815c1ee3e8e2839ef94bf90b134d1c68?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FNJ-2.png'
304
+ }]
305
+ }
306
+ };
307
+ var mockTransformedUserHydrationResponse = exports.mockTransformedUserHydrationResponse = [{
308
+ optionType: 'avatarLabel',
309
+ label: 'Peter Grasevski',
310
+ value: '655363:d8dff7fe-efb7-4073-a3cd-12463ac79e1c',
311
+ avatar: 'https://secure.gravatar.com/avatar/f4bb2f6eef1621e67cd136c0be9af81c?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FPG-5.png'
312
+ }, {
313
+ optionType: 'avatarLabel',
314
+ label: 'Richard Wang',
315
+ value: '62cf07378afb5805e5d46454',
316
+ avatar: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62cf07378afb5805e5d46454/5d1719ab-8717-4837-9ae7-a3761c3b6604/128'
317
+ }, {
318
+ optionType: 'avatarLabel',
319
+ label: 'Luke Muller',
320
+ value: '62f3ed1ee50f2f2a39573e7f',
321
+ avatar: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62f3ed1ee50f2f2a39573e7f/1bd99ace-ea01-4d41-b0ab-3e1ebc353914/128'
322
+ }, {
323
+ optionType: 'avatarLabel',
324
+ label: 'Nidhin Joseph',
325
+ value: '6232212a62dc1e006802dea8',
326
+ avatar: 'https://secure.gravatar.com/avatar/815c1ee3e8e2839ef94bf90b134d1c68?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FNJ-2.png'
327
+ }];
@@ -13,20 +13,18 @@ var _utils = require("./utils");
13
13
  var AGG_BASE_URL = '/gateway/api/graphql';
14
14
  var useBasicFilterAGG = exports.useBasicFilterAGG = function useBasicFilterAGG() {
15
15
  var requestCall = (0, _react.useCallback)( /*#__PURE__*/function () {
16
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(body) {
16
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(body, headers) {
17
17
  return _regenerator.default.wrap(function _callee$(_context) {
18
18
  while (1) switch (_context.prev = _context.next) {
19
19
  case 0:
20
- return _context.abrupt("return", (0, _linkingCommon.request)('post', AGG_BASE_URL, body, {
21
- 'X-ExperimentalApi': 'JiraJqlBuilder'
22
- }, [200, 201, 202, 203, 204]));
20
+ return _context.abrupt("return", (0, _linkingCommon.request)('post', AGG_BASE_URL, body, headers, [200, 201, 202, 203, 204]));
23
21
  case 1:
24
22
  case "end":
25
23
  return _context.stop();
26
24
  }
27
25
  }, _callee);
28
26
  }));
29
- return function (_x) {
27
+ return function (_x, _x2) {
30
28
  return _ref.apply(this, arguments);
31
29
  };
32
30
  }(), []);
@@ -38,6 +36,8 @@ var useBasicFilterAGG = exports.useBasicFilterAGG = function useBasicFilterAGG()
38
36
  },
39
37
  operationName: 'hydrate',
40
38
  query: _utils.hydrateJQLQuery
39
+ }, {
40
+ 'X-ExperimentalApi': 'JiraJqlBuilder'
41
41
  });
42
42
  }, [requestCall]);
43
43
  var getFieldValues = (0, _react.useCallback)(function (_ref2) {
@@ -59,6 +59,8 @@ var useBasicFilterAGG = exports.useBasicFilterAGG = function useBasicFilterAGG()
59
59
  },
60
60
  operationName: 'fieldValues',
61
61
  query: _utils.fieldValuesQuery
62
+ }, {
63
+ 'X-ExperimentalApi': 'JiraJqlBuilder'
62
64
  });
63
65
  }, [requestCall]);
64
66
  var getCurrentUserInfo = (0, _react.useCallback)(function () {
@@ -67,11 +69,21 @@ var useBasicFilterAGG = exports.useBasicFilterAGG = function useBasicFilterAGG()
67
69
  query: _utils.userQuery
68
70
  });
69
71
  }, [requestCall]);
72
+ var getUsersFromAccountIDs = (0, _react.useCallback)(function (accountIds) {
73
+ return requestCall({
74
+ variables: {
75
+ accountIds: accountIds
76
+ },
77
+ operationName: 'userHydration',
78
+ query: _utils.userHydration
79
+ });
80
+ }, [requestCall]);
70
81
  return (0, _react.useMemo)(function () {
71
82
  return {
72
83
  getHydratedJQL: getHydratedJQL,
73
84
  getFieldValues: getFieldValues,
74
- getCurrentUserInfo: getCurrentUserInfo
85
+ getCurrentUserInfo: getCurrentUserInfo,
86
+ getUsersFromAccountIDs: getUsersFromAccountIDs
75
87
  };
76
- }, [getHydratedJQL, getFieldValues, getCurrentUserInfo]);
88
+ }, [getHydratedJQL, getFieldValues, getCurrentUserInfo, getUsersFromAccountIDs]);
77
89
  };
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.userQuery = exports.hydrateJQLQuery = exports.fieldValuesQuery = void 0;
6
+ exports.userQuery = exports.userHydration = exports.hydrateJQLQuery = exports.fieldValuesQuery = void 0;
7
7
  /**
8
8
  * HELLO DEV :wave
9
9
  * If you are here to change these queries, please also remember to update the query in jira/src/packages/platform/linking/link-datasource/src/index.tsx
@@ -13,4 +13,5 @@ exports.userQuery = exports.hydrateJQLQuery = exports.fieldValuesQuery = void 0;
13
13
 
14
14
  var hydrateJQLQuery = exports.hydrateJQLQuery = "query hydrate($cloudId: ID!, $jql: String!) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n hydrateJqlQuery(query: $jql) {\n ... on JiraJqlHydratedQuery {\n fields {\n ... on JiraJqlQueryHydratedField {\n jqlTerm\n values {\n ... on JiraJqlQueryHydratedValue {\n values {\n ... on JiraJqlProjectFieldValue {\n jqlTerm\n displayName\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n jqlTerm\n displayName\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n jqlTerm\n displayName\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlUserFieldValue {\n jqlTerm\n displayName\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n jqlTerm\n displayName\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}";
15
15
  var fieldValuesQuery = exports.fieldValuesQuery = "query fieldValues($cloudId: ID!, $first: Int = 10, $jqlTerm: String!, $jql: String!, $searchString: String!, $after: String) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n fieldValues(\n first: $first\n jqlTerm: $jqlTerm\n jqlContext: $jql\n searchString: $searchString\n after: $after\n ) {\n totalCount\n pageInfo {\n endCursor\n }\n edges {\n node {\n jqlTerm\n displayName\n ... on JiraJqlProjectFieldValue {\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlUserFieldValue {\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n}";
16
- var userQuery = exports.userQuery = "query userQuery {\n me {\n user {\n id\n accountId\n }\n }\n}";
16
+ var userQuery = exports.userQuery = "query userQuery {\n me {\n user {\n id\n accountId\n }\n }\n}";
17
+ var userHydration = exports.userHydration = "query userHydration($accountIds: [ID!]!) {\n users(accountIds: $accountIds) {\n accountId\n name\n picture\n }\n}";
@@ -25,7 +25,9 @@ var EditedOrCreatedByFilter = function EditedOrCreatedByFilter(_ref) {
25
25
  var cloudId = _ref.cloudId,
26
26
  onSelectionChange = _ref.onSelectionChange,
27
27
  _ref$selection = _ref.selection,
28
- selection = _ref$selection === void 0 ? [] : _ref$selection;
28
+ selection = _ref$selection === void 0 ? [] : _ref$selection,
29
+ _ref$isHydrating = _ref.isHydrating,
30
+ isHydrating = _ref$isHydrating === void 0 ? false : _ref$isHydrating;
29
31
  var _useCurrentUserInfo = (0, _useCurrentUserInfo2.useCurrentUserInfo)(),
30
32
  user = _useCurrentUserInfo.user;
31
33
  var _useIntl = (0, _reactIntlNext.useIntl)(),
@@ -34,7 +36,9 @@ var EditedOrCreatedByFilter = function EditedOrCreatedByFilter(_ref) {
34
36
  status = _useRecommendation.status,
35
37
  filterOptions = _useRecommendation.filterOptions,
36
38
  fetchFilterOptions = _useRecommendation.fetchFilterOptions,
37
- errors = _useRecommendation.errors;
39
+ errors = _useRecommendation.errors,
40
+ resetHook = _useRecommendation.reset;
41
+ var currentSiteCloudId = (0, _react.useRef)(cloudId || '');
38
42
  var _useState = (0, _react.useState)(''),
39
43
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
40
44
  searchTerm = _useState2[0],
@@ -85,6 +89,14 @@ var EditedOrCreatedByFilter = function EditedOrCreatedByFilter(_ref) {
85
89
  var isLoading = status === 'loading' || status === 'empty';
86
90
  var isEmpty = status === 'resolved' && filterOptionsLength === 0;
87
91
  var isDisabled = !cloudId || !(user !== null && user !== void 0 && user.accountId);
92
+ (0, _react.useEffect)(function () {
93
+ if (cloudId && currentSiteCloudId.current !== cloudId) {
94
+ currentSiteCloudId.current = cloudId;
95
+ if (status === 'resolved') {
96
+ resetHook();
97
+ }
98
+ }
99
+ }, [cloudId, resetHook, status]);
88
100
  return /*#__PURE__*/_react.default.createElement(_popupSelect.FilterPopupSelect, {
89
101
  buttonLabel: formatMessage(_messages.editedOrCreatedByMessage.buttonLabel),
90
102
  filterName: filterName,
@@ -94,7 +106,7 @@ var EditedOrCreatedByFilter = function EditedOrCreatedByFilter(_ref) {
94
106
  selectedOptions: selection,
95
107
  onSelectionChange: handleOptionSelection,
96
108
  onInputChange: handleInputChange,
97
- showHydrating: false,
109
+ showHydrating: isHydrating,
98
110
  shouldShowFooter: false,
99
111
  status: status,
100
112
  onMenuOpen: handleMenuOpen,
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useBasicFilterHydration = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _react = require("react");
12
+ var _useBasicFilterAGG2 = require("../../../../services/useBasicFilterAGG");
13
+ var useBasicFilterHydration = exports.useBasicFilterHydration = function useBasicFilterHydration() {
14
+ var _useState = (0, _react.useState)('empty'),
15
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
16
+ status = _useState2[0],
17
+ setStatus = _useState2[1];
18
+ var _useBasicFilterAGG = (0, _useBasicFilterAGG2.useBasicFilterAGG)(),
19
+ getUsersFromAccountIDs = _useBasicFilterAGG.getUsersFromAccountIDs;
20
+ var _useState3 = (0, _react.useState)([]),
21
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
22
+ users = _useState4[0],
23
+ setUsers = _useState4[1];
24
+ var convertUserHydrationResponseToFilterOptions = function convertUserHydrationResponseToFilterOptions(response) {
25
+ var _response$data, _response$data2;
26
+ if (!((_response$data = response.data) !== null && _response$data !== void 0 && _response$data.users)) {
27
+ return [];
28
+ }
29
+ return (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.users.map(function (item) {
30
+ return {
31
+ optionType: 'avatarLabel',
32
+ label: item.name,
33
+ value: item.accountId,
34
+ avatar: item.picture
35
+ };
36
+ });
37
+ };
38
+ var hydrateUsersFromAccountIds = (0, _react.useCallback)( /*#__PURE__*/function () {
39
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(accountIds) {
40
+ var response;
41
+ return _regenerator.default.wrap(function _callee$(_context) {
42
+ while (1) switch (_context.prev = _context.next) {
43
+ case 0:
44
+ _context.prev = 0;
45
+ setStatus('loading');
46
+ _context.next = 4;
47
+ return getUsersFromAccountIDs(accountIds);
48
+ case 4:
49
+ response = _context.sent;
50
+ if (!(response.errors && response.errors.length > 0)) {
51
+ _context.next = 7;
52
+ break;
53
+ }
54
+ throw new Error(JSON.stringify(response.errors));
55
+ case 7:
56
+ setUsers(convertUserHydrationResponseToFilterOptions(response));
57
+ setStatus('resolved');
58
+ _context.next = 14;
59
+ break;
60
+ case 11:
61
+ _context.prev = 11;
62
+ _context.t0 = _context["catch"](0);
63
+ setStatus('rejected');
64
+ case 14:
65
+ case "end":
66
+ return _context.stop();
67
+ }
68
+ }, _callee, null, [[0, 11]]);
69
+ }));
70
+ return function (_x) {
71
+ return _ref.apply(this, arguments);
72
+ };
73
+ }(), [getUsersFromAccountIDs]);
74
+ return {
75
+ hydrateUsersFromAccountIds: hydrateUsersFromAccountIds,
76
+ status: status,
77
+ users: users
78
+ };
79
+ };
@@ -19,7 +19,7 @@ var useCurrentUserInfo = exports.useCurrentUserInfo = function useCurrentUserInf
19
19
  getCurrentUserInfoFromAGG = _useBasicFilterAGG.getCurrentUserInfo;
20
20
  var getCurrentUserInfo = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
21
21
  var _user$data;
22
- var user, _user$data2;
22
+ var user;
23
23
  return _regenerator.default.wrap(function _callee$(_context) {
24
24
  while (1) switch (_context.prev = _context.next) {
25
25
  case 0:
@@ -27,11 +27,7 @@ var useCurrentUserInfo = exports.useCurrentUserInfo = function useCurrentUserInf
27
27
  return getCurrentUserInfoFromAGG();
28
28
  case 2:
29
29
  user = _context.sent;
30
- if (user !== null && user !== void 0 && (_user$data = user.data) !== null && _user$data !== void 0 && _user$data.me.user) {
31
- setUser((_user$data2 = user.data) === null || _user$data2 === void 0 ? void 0 : _user$data2.me.user);
32
- } else {
33
- setUser(undefined);
34
- }
30
+ setUser((_user$data = user.data) === null || _user$data === void 0 || (_user$data = _user$data.me) === null || _user$data === void 0 ? void 0 : _user$data.user);
35
31
  case 4:
36
32
  case "end":
37
33
  return _context.stop();
@@ -108,6 +108,7 @@ var useRecommendation = function useRecommendation() {
108
108
  setStatus('empty');
109
109
  setFilterOptions([]);
110
110
  setErrors([]);
111
+ initialData.current = undefined;
111
112
  }, []);
112
113
  return {
113
114
  status: status,
@@ -16,7 +16,8 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
16
16
  var cloudId = _ref.cloudId,
17
17
  onChange = _ref.onChange,
18
18
  _ref$selections = _ref.selections,
19
- selections = _ref$selections === void 0 ? {} : _ref$selections;
19
+ selections = _ref$selections === void 0 ? {} : _ref$selections,
20
+ isHydrating = _ref.isHydrating;
20
21
  var editedOrCreatedBy = selections.editedOrCreatedBy;
21
22
  return /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
22
23
  xcss: basicFilterContainerStyles,
@@ -25,7 +26,8 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
25
26
  }, /*#__PURE__*/_react.default.createElement(_editedOrCreatedBy.default, {
26
27
  cloudId: cloudId,
27
28
  onSelectionChange: onChange,
28
- selection: editedOrCreatedBy || []
29
+ selection: editedOrCreatedBy || [],
30
+ isHydrating: isHydrating
29
31
  }), /*#__PURE__*/_react.default.createElement(_dateRangePicker.DateRangePicker, {
30
32
  onSelectionChange: onChange
31
33
  }));
@@ -15,6 +15,8 @@ var _primitives = require("@atlaskit/primitives");
15
15
  var _basicSearchInput = require("../../common/modal/basic-search-input");
16
16
  var _constants = require("../../common/modal/popup-select/constants");
17
17
  var _basicFilters = _interopRequireDefault(require("../basic-filters"));
18
+ var _useBasicFilterHydration = require("../basic-filters/hooks/useBasicFilterHydration");
19
+ var _types = require("../basic-filters/types");
18
20
  var _messages = require("./messages");
19
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
20
22
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -26,8 +28,13 @@ var basicSearchInputContainerStyles = (0, _primitives.xcss)({
26
28
  var ConfluenceSearchContainer = function ConfluenceSearchContainer(_ref) {
27
29
  var cloudId = _ref.cloudId,
28
30
  initialSearchValue = _ref.initialSearchValue,
31
+ initialFilterSelection = _ref.initialFilterSelection,
29
32
  isSearching = _ref.isSearching,
30
33
  onSearch = _ref.onSearch;
34
+ var _useBasicFilterHydrat = (0, _useBasicFilterHydration.useBasicFilterHydration)(),
35
+ hydrateUsersFromAccountIds = _useBasicFilterHydrat.hydrateUsersFromAccountIds,
36
+ users = _useBasicFilterHydrat.users,
37
+ status = _useBasicFilterHydrat.status;
31
38
  var currentCloudId = (0, _react.useRef)(cloudId);
32
39
  var _useState = (0, _react.useState)(initialSearchValue !== null && initialSearchValue !== void 0 ? initialSearchValue : ''),
33
40
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -67,6 +74,20 @@ var ConfluenceSearchContainer = function ConfluenceSearchContainer(_ref) {
67
74
  }
68
75
  return false;
69
76
  }, []);
77
+ (0, _react.useEffect)(function () {
78
+ var accountIds = initialFilterSelection === null || initialFilterSelection === void 0 ? void 0 : initialFilterSelection[_types.CLOLBasicFilters.editedOrCreatedBy];
79
+ var hasAccountIds = accountIds && accountIds.length > 0;
80
+ if (hasAccountIds && status === 'empty' && showBasicFilters) {
81
+ hydrateUsersFromAccountIds(accountIds);
82
+ }
83
+ }, [hydrateUsersFromAccountIds, initialFilterSelection, showBasicFilters, status]);
84
+ (0, _react.useEffect)(function () {
85
+ if (status === 'resolved') {
86
+ setFilterSelections({
87
+ editedOrCreatedBy: users
88
+ });
89
+ }
90
+ }, [users, status]);
70
91
  return /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
71
92
  alignItems: "center",
72
93
  xcss: basicSearchInputContainerStyles
@@ -81,7 +102,8 @@ var ConfluenceSearchContainer = function ConfluenceSearchContainer(_ref) {
81
102
  }), showBasicFilters && /*#__PURE__*/_react.default.createElement(_basicFilters.default, {
82
103
  cloudId: cloudId,
83
104
  selections: filterSelections,
84
- onChange: handleBasicFilterSelectionChange
105
+ onChange: handleBasicFilterSelectionChange,
106
+ isHydrating: status === 'loading'
85
107
  }));
86
108
  };
87
109
  var _default = exports.default = ConfluenceSearchContainer;
@@ -134,6 +134,11 @@ var PlainConfluenceSearchConfigModal = exports.PlainConfluenceSearchConfigModal
134
134
  contributorAccountIds: contributorAccountIds
135
135
  });
136
136
  }, [cloudId, lastModified, contributorAccountIds, initialParameters, searchString /** Add more parameters when more filters are added */]);
137
+ var initialFilterSelection = (0, _react.useMemo)(function () {
138
+ return {
139
+ editedOrCreatedBy: (initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.contributorAccountIds) || []
140
+ };
141
+ }, [initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.contributorAccountIds]);
137
142
  var isParametersSet = (0, _react.useMemo)(function () {
138
143
  return !!cloudId && Object.values(parameters !== null && parameters !== void 0 ? parameters : {}).filter(function (v) {
139
144
  return v !== undefined;
@@ -297,7 +302,18 @@ var PlainConfluenceSearchConfigModal = exports.PlainConfluenceSearchConfigModal
297
302
  var resolvedWithNoResults = status === 'resolved' && !responseItems.length;
298
303
  var hasConfluenceSearchParams = selectedConfluenceSite && searchString;
299
304
  var selectedConfluenceSiteUrl = selectedConfluenceSite === null || selectedConfluenceSite === void 0 ? void 0 : selectedConfluenceSite.url;
300
- var confluenceSearchUrl = selectedConfluenceSiteUrl && searchString !== undefined && "".concat(selectedConfluenceSiteUrl, "/wiki/search?text=").concat(encodeURI(searchString));
305
+ var confluenceSearchUrl = (0, _react.useMemo)(function () {
306
+ if (!selectedConfluenceSiteUrl || searchString === undefined) {
307
+ return undefined;
308
+ }
309
+ var params = new URLSearchParams();
310
+ // we are appending "text" without checking searchString as we need the url to have "text" when a user does an empty search
311
+ params.append('text', searchString);
312
+ if (contributorAccountIds.length > 0) {
313
+ params.append('contributors', contributorAccountIds.join(','));
314
+ }
315
+ return "".concat(selectedConfluenceSiteUrl, "/wiki/search?").concat(params.toString());
316
+ }, [contributorAccountIds, searchString, selectedConfluenceSiteUrl]);
301
317
  var analyticsPayload = (0, _react.useMemo)(function () {
302
318
  return {
303
319
  extensionKey: extensionKey,
@@ -486,7 +502,8 @@ var PlainConfluenceSearchConfigModal = exports.PlainConfluenceSearchConfigModal
486
502
  cloudId: cloudId,
487
503
  isSearching: status === 'loading',
488
504
  onSearch: onSearch,
489
- initialSearchValue: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString
505
+ initialSearchValue: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString,
506
+ initialFilterSelection: initialFilterSelection
490
507
  })), currentViewMode === 'inline' ? renderInlineLinkModalContent() : renderTableModalContent()) : (0, _react2.jsx)(_noInstances.NoInstancesView, {
491
508
  title: _messages.confluenceSearchModalMessages.noAccessToConfluenceSitesTitle,
492
509
  description: _messages.confluenceSearchModalMessages.noAccessToConfluenceSitesDescription,
@@ -12,7 +12,7 @@ var _analytics = require("../../../analytics");
12
12
  var jsmTextStyles = (0, _primitives.xcss)({
13
13
  fontSize: 'small',
14
14
  color: 'color.text.subtle',
15
- marginLeft: "var(--ds-space-075, 6px)",
15
+ marginLeft: 'space.075',
16
16
  ':hover': {
17
17
  color: 'color.link.pressed'
18
18
  }
@@ -276,4 +276,46 @@ export const mockUserRecommendationsResponse = {
276
276
  isConfluenceExternalCollaborator: false
277
277
  }
278
278
  }]
279
- };
279
+ };
280
+ export const mockUserHydrationResponse = {
281
+ data: {
282
+ users: [{
283
+ accountId: '655363:d8dff7fe-efb7-4073-a3cd-12463ac79e1c',
284
+ name: 'Peter Grasevski',
285
+ picture: 'https://secure.gravatar.com/avatar/f4bb2f6eef1621e67cd136c0be9af81c?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FPG-5.png'
286
+ }, {
287
+ accountId: '62cf07378afb5805e5d46454',
288
+ name: 'Richard Wang',
289
+ picture: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62cf07378afb5805e5d46454/5d1719ab-8717-4837-9ae7-a3761c3b6604/128'
290
+ }, {
291
+ accountId: '62f3ed1ee50f2f2a39573e7f',
292
+ name: 'Luke Muller',
293
+ picture: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62f3ed1ee50f2f2a39573e7f/1bd99ace-ea01-4d41-b0ab-3e1ebc353914/128'
294
+ }, {
295
+ accountId: '6232212a62dc1e006802dea8',
296
+ name: 'Nidhin Joseph',
297
+ picture: 'https://secure.gravatar.com/avatar/815c1ee3e8e2839ef94bf90b134d1c68?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FNJ-2.png'
298
+ }]
299
+ }
300
+ };
301
+ export const mockTransformedUserHydrationResponse = [{
302
+ optionType: 'avatarLabel',
303
+ label: 'Peter Grasevski',
304
+ value: '655363:d8dff7fe-efb7-4073-a3cd-12463ac79e1c',
305
+ avatar: 'https://secure.gravatar.com/avatar/f4bb2f6eef1621e67cd136c0be9af81c?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FPG-5.png'
306
+ }, {
307
+ optionType: 'avatarLabel',
308
+ label: 'Richard Wang',
309
+ value: '62cf07378afb5805e5d46454',
310
+ avatar: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62cf07378afb5805e5d46454/5d1719ab-8717-4837-9ae7-a3761c3b6604/128'
311
+ }, {
312
+ optionType: 'avatarLabel',
313
+ label: 'Luke Muller',
314
+ value: '62f3ed1ee50f2f2a39573e7f',
315
+ avatar: 'https://avatar-management--avatars.us-west-2.staging.public.atl-paas.net/62f3ed1ee50f2f2a39573e7f/1bd99ace-ea01-4d41-b0ab-3e1ebc353914/128'
316
+ }, {
317
+ optionType: 'avatarLabel',
318
+ label: 'Nidhin Joseph',
319
+ value: '6232212a62dc1e006802dea8',
320
+ avatar: 'https://secure.gravatar.com/avatar/815c1ee3e8e2839ef94bf90b134d1c68?d=https%3A%2F%2Favatar-management--avatars.us-west-2.staging.public.atl-paas.net%2Finitials%2FNJ-2.png'
321
+ }];
@@ -1,11 +1,9 @@
1
1
  import { useCallback, useMemo } from 'react';
2
2
  import { request } from '@atlaskit/linking-common';
3
- import { fieldValuesQuery, hydrateJQLQuery, userQuery } from './utils';
3
+ import { fieldValuesQuery, hydrateJQLQuery, userHydration, userQuery } from './utils';
4
4
  const AGG_BASE_URL = '/gateway/api/graphql';
5
5
  export const useBasicFilterAGG = () => {
6
- const requestCall = useCallback(async body => request('post', AGG_BASE_URL, body, {
7
- 'X-ExperimentalApi': 'JiraJqlBuilder'
8
- }, [200, 201, 202, 203, 204]), []);
6
+ const requestCall = useCallback(async (body, headers) => request('post', AGG_BASE_URL, body, headers, [200, 201, 202, 203, 204]), []);
9
7
  const getHydratedJQL = useCallback((cloudId, jql) => requestCall({
10
8
  variables: {
11
9
  cloudId,
@@ -13,6 +11,8 @@ export const useBasicFilterAGG = () => {
13
11
  },
14
12
  operationName: 'hydrate',
15
13
  query: hydrateJQLQuery
14
+ }, {
15
+ 'X-ExperimentalApi': 'JiraJqlBuilder'
16
16
  }), [requestCall]);
17
17
  const getFieldValues = useCallback(({
18
18
  cloudId,
@@ -31,14 +31,24 @@ export const useBasicFilterAGG = () => {
31
31
  },
32
32
  operationName: 'fieldValues',
33
33
  query: fieldValuesQuery
34
+ }, {
35
+ 'X-ExperimentalApi': 'JiraJqlBuilder'
34
36
  }), [requestCall]);
35
37
  const getCurrentUserInfo = useCallback(() => requestCall({
36
38
  operationName: 'userQuery',
37
39
  query: userQuery
38
40
  }), [requestCall]);
41
+ const getUsersFromAccountIDs = useCallback(accountIds => requestCall({
42
+ variables: {
43
+ accountIds
44
+ },
45
+ operationName: 'userHydration',
46
+ query: userHydration
47
+ }), [requestCall]);
39
48
  return useMemo(() => ({
40
49
  getHydratedJQL,
41
50
  getFieldValues,
42
- getCurrentUserInfo
43
- }), [getHydratedJQL, getFieldValues, getCurrentUserInfo]);
51
+ getCurrentUserInfo,
52
+ getUsersFromAccountIDs
53
+ }), [getHydratedJQL, getFieldValues, getCurrentUserInfo, getUsersFromAccountIDs]);
44
54
  };
@@ -125,4 +125,11 @@ export const userQuery = `query userQuery {
125
125
  accountId
126
126
  }
127
127
  }
128
+ }`;
129
+ export const userHydration = `query userHydration($accountIds: [ID!]!) {
130
+ users(accountIds: $accountIds) {
131
+ accountId
132
+ name
133
+ picture
134
+ }
128
135
  }`;
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useState } from 'react';
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { useIntl } from 'react-intl-next';
3
3
  import { useDebouncedCallback } from 'use-debounce';
4
4
  import { FilterPopupSelect } from '../../../../common/modal/popup-select';
@@ -11,7 +11,8 @@ const filterName = `clol-basic-filter-${CLOLBasicFilters.editedOrCreatedBy}`;
11
11
  const EditedOrCreatedByFilter = ({
12
12
  cloudId,
13
13
  onSelectionChange,
14
- selection = []
14
+ selection = [],
15
+ isHydrating = false
15
16
  }) => {
16
17
  const {
17
18
  user
@@ -23,8 +24,10 @@ const EditedOrCreatedByFilter = ({
23
24
  status,
24
25
  filterOptions,
25
26
  fetchFilterOptions,
26
- errors
27
+ errors,
28
+ reset: resetHook
27
29
  } = useRecommendation();
30
+ const currentSiteCloudId = useRef(cloudId || '');
28
31
  const [searchTerm, setSearchTerm] = useState('');
29
32
  const [handleDebouncedFetchFilterOptions] = useDebouncedCallback(searchTerm => {
30
33
  if (cloudId && user !== null && user !== void 0 && user.accountId) {
@@ -57,6 +60,14 @@ const EditedOrCreatedByFilter = ({
57
60
  const isLoading = status === 'loading' || status === 'empty';
58
61
  const isEmpty = status === 'resolved' && filterOptionsLength === 0;
59
62
  const isDisabled = !cloudId || !(user !== null && user !== void 0 && user.accountId);
63
+ useEffect(() => {
64
+ if (cloudId && currentSiteCloudId.current !== cloudId) {
65
+ currentSiteCloudId.current = cloudId;
66
+ if (status === 'resolved') {
67
+ resetHook();
68
+ }
69
+ }
70
+ }, [cloudId, resetHook, status]);
60
71
  return /*#__PURE__*/React.createElement(FilterPopupSelect, {
61
72
  buttonLabel: formatMessage(editedOrCreatedByMessage.buttonLabel),
62
73
  filterName: filterName,
@@ -66,7 +77,7 @@ const EditedOrCreatedByFilter = ({
66
77
  selectedOptions: selection,
67
78
  onSelectionChange: handleOptionSelection,
68
79
  onInputChange: handleInputChange,
69
- showHydrating: false,
80
+ showHydrating: isHydrating,
70
81
  shouldShowFooter: false,
71
82
  status: status,
72
83
  onMenuOpen: handleMenuOpen,
@@ -0,0 +1,39 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { useBasicFilterAGG } from '../../../../services/useBasicFilterAGG';
3
+ export const useBasicFilterHydration = () => {
4
+ const [status, setStatus] = useState('empty');
5
+ const {
6
+ getUsersFromAccountIDs
7
+ } = useBasicFilterAGG();
8
+ const [users, setUsers] = useState([]);
9
+ const convertUserHydrationResponseToFilterOptions = response => {
10
+ var _response$data, _response$data2;
11
+ if (!((_response$data = response.data) !== null && _response$data !== void 0 && _response$data.users)) {
12
+ return [];
13
+ }
14
+ return (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.users.map(item => ({
15
+ optionType: 'avatarLabel',
16
+ label: item.name,
17
+ value: item.accountId,
18
+ avatar: item.picture
19
+ }));
20
+ };
21
+ const hydrateUsersFromAccountIds = useCallback(async accountIds => {
22
+ try {
23
+ setStatus('loading');
24
+ const response = await getUsersFromAccountIDs(accountIds);
25
+ if (response.errors && response.errors.length > 0) {
26
+ throw new Error(JSON.stringify(response.errors));
27
+ }
28
+ setUsers(convertUserHydrationResponseToFilterOptions(response));
29
+ setStatus('resolved');
30
+ } catch (error) {
31
+ setStatus('rejected');
32
+ }
33
+ }, [getUsersFromAccountIDs]);
34
+ return {
35
+ hydrateUsersFromAccountIds,
36
+ status,
37
+ users
38
+ };
39
+ };