@atlaskit/link-datasource 1.17.0 → 1.17.2

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 (36) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/analytics/constants.js +1 -1
  3. package/dist/cjs/hooks/useAssetsClient.js +7 -4
  4. package/dist/cjs/hooks/useValidateAqlText.js +5 -2
  5. package/dist/cjs/services/cmdbService.js +50 -35
  6. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +8 -0
  7. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +59 -34
  8. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/index.js +18 -6
  9. package/dist/cjs/ui/jira-issues-modal/basic-filters/utils/index.js +2 -1
  10. package/dist/es2019/analytics/constants.js +1 -1
  11. package/dist/es2019/hooks/useAssetsClient.js +8 -4
  12. package/dist/es2019/hooks/useValidateAqlText.js +6 -2
  13. package/dist/es2019/services/cmdbService.js +27 -12
  14. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +8 -0
  15. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +57 -27
  16. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/index.js +16 -6
  17. package/dist/es2019/ui/jira-issues-modal/basic-filters/utils/index.js +2 -1
  18. package/dist/esm/analytics/constants.js +1 -1
  19. package/dist/esm/hooks/useAssetsClient.js +7 -4
  20. package/dist/esm/hooks/useValidateAqlText.js +5 -2
  21. package/dist/esm/services/cmdbService.js +50 -35
  22. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +8 -0
  23. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +60 -35
  24. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/index.js +18 -6
  25. package/dist/esm/ui/jira-issues-modal/basic-filters/utils/index.js +2 -1
  26. package/dist/types/analytics/generated/analytics.types.d.ts +41 -1
  27. package/dist/types/services/cmdbService.d.ts +8 -4
  28. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +1 -0
  29. package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.d.ts +2 -1
  30. package/dist/types/ui/jira-issues-modal/basic-filters/ui/index.d.ts +1 -1
  31. package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +41 -1
  32. package/dist/types-ts4.5/services/cmdbService.d.ts +8 -4
  33. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +1 -0
  34. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.d.ts +2 -1
  35. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/index.d.ts +1 -1
  36. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.17.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#43143](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43143) [`de7541cc6ab`](https://bitbucket.org/atlassian/atlassian-frontend/commits/de7541cc6ab) - Reset filter selection when site selection changes and fixes a bug when selecting filter values.
8
+
9
+ ## 1.17.1
10
+
11
+ ### Patch Changes
12
+
13
+ - [#43132](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43132) [`3e2792d125e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/3e2792d125e) - added operational events for Assets Config Modal
14
+ - Updated dependencies
15
+
3
16
  ## 1.17.0
4
17
 
5
18
  ### Minor Changes
@@ -7,5 +7,5 @@ exports.packageMetaData = exports.EVENT_CHANNEL = void 0;
7
7
  var EVENT_CHANNEL = exports.EVENT_CHANNEL = 'media';
8
8
  var packageMetaData = exports.packageMetaData = {
9
9
  packageName: "@atlaskit/link-datasource",
10
- packageVersion: "1.17.0"
10
+ packageVersion: "1.17.2"
11
11
  };
@@ -9,6 +9,7 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
11
  var _react = require("react");
12
+ var _analytics = require("../analytics");
12
13
  var _cmdbService = require("../services/cmdbService");
13
14
  var handleAssetsClientErrors = function handleAssetsClientErrors(errorSetter, error) {
14
15
  if (error instanceof Error) {
@@ -50,6 +51,8 @@ var useAssetsClient = exports.useAssetsClient = function useAssetsClient(initial
50
51
  _useState16 = (0, _slicedToArray2.default)(_useState15, 2),
51
52
  objectSchemasError = _useState16[0],
52
53
  setObjectSchemasError = _useState16[1];
54
+ var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
55
+ fireEvent = _useDatasourceAnalyti.fireEvent;
53
56
 
54
57
  /*
55
58
  * We wrap this in nested try/catch blocks because we want to handle
@@ -66,7 +69,7 @@ var useAssetsClient = exports.useAssetsClient = function useAssetsClient(initial
66
69
  setWorkspaceError(undefined);
67
70
  _context.prev = 2;
68
71
  _context.next = 5;
69
- return (0, _cmdbService.getWorkspaceId)();
72
+ return (0, _cmdbService.getWorkspaceId)(fireEvent);
70
73
  case 5:
71
74
  _workspaceId = _context.sent;
72
75
  setWorkspaceId(_workspaceId);
@@ -77,7 +80,7 @@ var useAssetsClient = exports.useAssetsClient = function useAssetsClient(initial
77
80
  }
78
81
  _context.prev = 8;
79
82
  _context.next = 11;
80
- return (0, _cmdbService.fetchObjectSchema)(_workspaceId, initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId);
83
+ return (0, _cmdbService.fetchObjectSchema)(_workspaceId, initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId, fireEvent);
81
84
  case 11:
82
85
  fetchedObjectSchema = _context.sent;
83
86
  setExistingObjectSchema(fetchedObjectSchema);
@@ -90,7 +93,7 @@ var useAssetsClient = exports.useAssetsClient = function useAssetsClient(initial
90
93
  case 18:
91
94
  _context.prev = 18;
92
95
  _context.next = 21;
93
- return (0, _cmdbService.fetchObjectSchemas)(_workspaceId);
96
+ return (0, _cmdbService.fetchObjectSchemas)(_workspaceId, undefined, fireEvent);
94
97
  case 21:
95
98
  fetchedObjectSchemasResponse = _context.sent;
96
99
  setObjectSchemas(fetchedObjectSchemasResponse.values);
@@ -118,7 +121,7 @@ var useAssetsClient = exports.useAssetsClient = function useAssetsClient(initial
118
121
  }
119
122
  }, _callee, null, [[2, 31, 34, 37], [8, 15], [18, 26]]);
120
123
  }))();
121
- }, [initialParameters]);
124
+ }, [initialParameters, fireEvent]);
122
125
  return {
123
126
  workspaceId: workspaceId,
124
127
  workspaceError: workspaceError,
@@ -9,6 +9,7 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
11
  var _react = require("react");
12
+ var _analytics = require("../analytics");
12
13
  var _cmdbService = require("../services/cmdbService");
13
14
  var useValidateAqlText = exports.useValidateAqlText = function useValidateAqlText(workspaceId) {
14
15
  var _useState = (0, _react.useState)(false),
@@ -23,6 +24,8 @@ var useValidateAqlText = exports.useValidateAqlText = function useValidateAqlTex
23
24
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
24
25
  error = _useState6[0],
25
26
  setError = _useState6[1];
27
+ var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
28
+ fireEvent = _useDatasourceAnalyti.fireEvent;
26
29
  var validateAqlText = (0, _react.useCallback)( /*#__PURE__*/function () {
27
30
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(aql) {
28
31
  var isValid, message, _validateAqlResponse$, validateAqlResponse;
@@ -37,7 +40,7 @@ var useValidateAqlText = exports.useValidateAqlText = function useValidateAqlTex
37
40
  _context.next = 7;
38
41
  return (0, _cmdbService.validateAql)(workspaceId, {
39
42
  qlQuery: aql
40
- });
43
+ }, fireEvent);
41
44
  case 7:
42
45
  validateAqlResponse = _context.sent;
43
46
  setIsValidAqlText(validateAqlResponse.isValid);
@@ -71,7 +74,7 @@ var useValidateAqlText = exports.useValidateAqlText = function useValidateAqlTex
71
74
  return function (_x) {
72
75
  return _ref.apply(this, arguments);
73
76
  };
74
- }(), [workspaceId]);
77
+ }(), [workspaceId, fireEvent]);
75
78
  return {
76
79
  isValidAqlText: isValidAqlText,
77
80
  validateAqlText: validateAqlText,
@@ -10,7 +10,7 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
10
10
  var _linkingCommon = require("@atlaskit/linking-common");
11
11
  var _cmdbService = require("./cmdbService.utils");
12
12
  var getWorkspaceId = exports.getWorkspaceId = /*#__PURE__*/function () {
13
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
13
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(fireEvent) {
14
14
  var url, _workspaceDetailsResp, workspaceDetailsResponse, error;
15
15
  return _regenerator.default.wrap(function _callee$(_context) {
16
16
  while (1) switch (_context.prev = _context.next) {
@@ -27,32 +27,35 @@ var getWorkspaceId = exports.getWorkspaceId = /*#__PURE__*/function () {
27
27
  }
28
28
  throw new _cmdbService.PermissionError('No workspace results found');
29
29
  case 7:
30
+ fireEvent && fireEvent('operational.getWorkspaceId.success', {});
30
31
  return _context.abrupt("return", workspaceDetailsResponse.results[0].id);
31
- case 10:
32
- _context.prev = 10;
32
+ case 11:
33
+ _context.prev = 11;
33
34
  _context.t0 = _context["catch"](1);
34
35
  error = (0, _cmdbService.mapFetchErrors)(_context.t0);
35
36
  if (error instanceof _cmdbService.FetchError) {
36
- // TODO Fire error operational event for workspace here before remapping to PermissionError
37
- // Only 429 and 5xx errors will be treated as FetchErrors otherwise PermissionError
37
+ fireEvent && fireEvent('operational.getWorkspaceId.failed', {
38
+ statusCodeGroup: (0, _cmdbService.getStatusCodeGroup)(error)
39
+ });
40
+ // Only 429 and5xx errors will be treated as FetchErrors otherwise PermissionError
38
41
  if ((0, _cmdbService.getStatusCodeGroup)(error) !== '5xx' && error.statusCode !== 429) {
39
42
  error = new _cmdbService.PermissionError('Failed to fetch workspace');
40
43
  }
41
44
  }
42
45
  throw error;
43
- case 15:
46
+ case 16:
44
47
  case "end":
45
48
  return _context.stop();
46
49
  }
47
- }, _callee, null, [[1, 10]]);
50
+ }, _callee, null, [[1, 11]]);
48
51
  }));
49
- return function getWorkspaceId() {
52
+ return function getWorkspaceId(_x) {
50
53
  return _ref.apply(this, arguments);
51
54
  };
52
55
  }();
53
56
  var validateAql = exports.validateAql = /*#__PURE__*/function () {
54
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(workspaceId, data) {
55
- var url, error;
57
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(workspaceId, data, fireEvent) {
58
+ var url, response, error;
56
59
  return _regenerator.default.wrap(function _callee2$(_context2) {
57
60
  while (1) switch (_context2.prev = _context2.next) {
58
61
  case 0:
@@ -64,31 +67,35 @@ var validateAql = exports.validateAql = /*#__PURE__*/function () {
64
67
  context: 'SMART_LINKS'
65
68
  }, undefined, [200, 201, 202, 203, 204]);
66
69
  case 4:
67
- return _context2.abrupt("return", _context2.sent);
68
- case 7:
69
- _context2.prev = 7;
70
+ response = _context2.sent;
71
+ fireEvent && fireEvent('operational.validateAql.success', {});
72
+ return _context2.abrupt("return", response);
73
+ case 9:
74
+ _context2.prev = 9;
70
75
  _context2.t0 = _context2["catch"](1);
71
76
  error = (0, _cmdbService.mapFetchErrors)(_context2.t0);
72
77
  if (error instanceof _cmdbService.FetchError) {
73
- // TODO Fire error operational event for aql here before remapping to PermissionError
78
+ fireEvent && fireEvent('operational.validateAql.failed', {
79
+ statusCodeGroup: (0, _cmdbService.getStatusCodeGroup)(error)
80
+ });
74
81
  if (error.statusCode === 401 || error.statusCode === 403) {
75
82
  error = new _cmdbService.PermissionError('Failed to fetch object schemas');
76
83
  }
77
84
  }
78
85
  throw error;
79
- case 12:
86
+ case 14:
80
87
  case "end":
81
88
  return _context2.stop();
82
89
  }
83
- }, _callee2, null, [[1, 7]]);
90
+ }, _callee2, null, [[1, 9]]);
84
91
  }));
85
- return function validateAql(_x, _x2) {
92
+ return function validateAql(_x2, _x3, _x4) {
86
93
  return _ref2.apply(this, arguments);
87
94
  };
88
95
  }();
89
96
  var fetchObjectSchema = exports.fetchObjectSchema = /*#__PURE__*/function () {
90
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(workspaceId, schemaId) {
91
- var url, error;
97
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(workspaceId, schemaId, fireEvent) {
98
+ var url, response, error;
92
99
  return _regenerator.default.wrap(function _callee3$(_context3) {
93
100
  while (1) switch (_context3.prev = _context3.next) {
94
101
  case 0:
@@ -97,31 +104,35 @@ var fetchObjectSchema = exports.fetchObjectSchema = /*#__PURE__*/function () {
97
104
  _context3.next = 4;
98
105
  return (0, _linkingCommon.request)('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
99
106
  case 4:
100
- return _context3.abrupt("return", _context3.sent);
101
- case 7:
102
- _context3.prev = 7;
107
+ response = _context3.sent;
108
+ fireEvent && fireEvent('operational.objectSchema.success', {});
109
+ return _context3.abrupt("return", response);
110
+ case 9:
111
+ _context3.prev = 9;
103
112
  _context3.t0 = _context3["catch"](1);
104
113
  error = (0, _cmdbService.mapFetchErrors)(_context3.t0);
105
114
  if (error instanceof _cmdbService.FetchError) {
106
- // TODO Fire error operational event for object schema here before remapping to PermissionError
115
+ fireEvent && fireEvent('operational.objectSchema.failed', {
116
+ statusCodeGroup: (0, _cmdbService.getStatusCodeGroup)(error)
117
+ });
107
118
  if (error.statusCode === 401 || error.statusCode === 403) {
108
119
  error = new _cmdbService.PermissionError('Failed to fetch object schemas');
109
120
  }
110
121
  }
111
122
  throw error;
112
- case 12:
123
+ case 14:
113
124
  case "end":
114
125
  return _context3.stop();
115
126
  }
116
- }, _callee3, null, [[1, 7]]);
127
+ }, _callee3, null, [[1, 9]]);
117
128
  }));
118
- return function fetchObjectSchema(_x3, _x4) {
129
+ return function fetchObjectSchema(_x5, _x6, _x7) {
119
130
  return _ref3.apply(this, arguments);
120
131
  };
121
132
  }();
122
133
  var fetchObjectSchemas = exports.fetchObjectSchemas = /*#__PURE__*/function () {
123
- var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(workspaceId, query) {
124
- var queryParams, url, error;
134
+ var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(workspaceId, query, fireEvent) {
135
+ var queryParams, url, response, error;
125
136
  return _regenerator.default.wrap(function _callee4$(_context4) {
126
137
  while (1) switch (_context4.prev = _context4.next) {
127
138
  case 0:
@@ -134,25 +145,29 @@ var fetchObjectSchemas = exports.fetchObjectSchemas = /*#__PURE__*/function () {
134
145
  _context4.next = 8;
135
146
  return (0, _linkingCommon.request)('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
136
147
  case 8:
137
- return _context4.abrupt("return", _context4.sent);
138
- case 11:
139
- _context4.prev = 11;
148
+ response = _context4.sent;
149
+ fireEvent && fireEvent('operational.objectSchemas.success', {});
150
+ return _context4.abrupt("return", response);
151
+ case 13:
152
+ _context4.prev = 13;
140
153
  _context4.t0 = _context4["catch"](5);
141
154
  error = (0, _cmdbService.mapFetchErrors)(_context4.t0);
142
155
  if (error instanceof _cmdbService.FetchError) {
143
- // TODO Fire error operational event for object schemas here before remapping to PermissionError
156
+ fireEvent && fireEvent('operational.objectSchemas.failed', {
157
+ statusCodeGroup: (0, _cmdbService.getStatusCodeGroup)(error)
158
+ });
144
159
  if (error.statusCode === 401 || error.statusCode === 403) {
145
160
  error = new _cmdbService.PermissionError('Failed to fetch object schemas');
146
161
  }
147
162
  }
148
163
  throw error;
149
- case 16:
164
+ case 18:
150
165
  case "end":
151
166
  return _context4.stop();
152
167
  }
153
- }, _callee4, null, [[5, 11]]);
168
+ }, _callee4, null, [[5, 13]]);
154
169
  }));
155
- return function fetchObjectSchemas(_x5, _x6) {
170
+ return function fetchObjectSchemas(_x8, _x9, _x10) {
156
171
  return _ref4.apply(this, arguments);
157
172
  };
158
173
  }();
@@ -112,12 +112,20 @@ var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref
112
112
  }
113
113
  }, _callee, null, [[5, 24]]);
114
114
  })), [cloudId, filterOptions, filterType, getFieldValues]);
115
+ var reset = (0, _react.useCallback)(function () {
116
+ setStatus('empty');
117
+ setFilterOptions([]);
118
+ setTotalCount(0);
119
+ setNextPageCursor(undefined);
120
+ initialData.current = undefined;
121
+ }, []);
115
122
  return {
116
123
  filterOptions: filterOptions,
117
124
  fetchFilterOptions: fetchFilterOptions,
118
125
  totalCount: totalCount,
119
126
  pageCursor: nextPageCursor,
120
127
  status: status,
128
+ reset: reset,
121
129
  errors: status === 'rejected' ? errors : []
122
130
  };
123
131
  };
@@ -13,6 +13,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
13
13
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
14
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
15
  var _react = _interopRequireWildcard(require("react"));
16
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
16
17
  var _reactIntlNext = require("react-intl-next");
17
18
  var _useDebounce = require("use-debounce");
18
19
  var _select = require("@atlaskit/select");
@@ -38,6 +39,8 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
38
39
  selection = _ref.selection,
39
40
  _ref$onSelectionChang = _ref.onSelectionChange,
40
41
  onSelectionChange = _ref$onSelectionChang === void 0 ? function () {} : _ref$onSelectionChang,
42
+ _ref$onReset = _ref.onReset,
43
+ resetSelection = _ref$onReset === void 0 ? function () {} : _ref$onReset,
41
44
  _ref$isDisabled = _ref.isDisabled,
42
45
  isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled;
43
46
  var _useIntl = (0, _reactIntlNext.useIntl)(),
@@ -50,10 +53,13 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
50
53
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
51
54
  selectedOptions = _useState4[0],
52
55
  setSelectedOptions = _useState4[1];
53
- var _useState5 = (0, _react.useState)(selectedOptions),
56
+ var _useState5 = (0, _react.useState)([]),
54
57
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
55
58
  sortedOptions = _useState6[0],
56
59
  setSortedOptions = _useState6[1];
60
+ var currentSiteCloudId = (0, _react.useRef)(cloudId);
61
+ var sortPaginatedResults = (0, _react.useRef)(false); // this is to track pagination for sorting purpose
62
+
57
63
  var _useFilterOptions = (0, _useFilterOptions2.useFilterOptions)({
58
64
  filterType: filterType,
59
65
  cloudId: cloudId
@@ -63,6 +69,7 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
63
69
  totalCount = _useFilterOptions.totalCount,
64
70
  status = _useFilterOptions.status,
65
71
  pageCursor = _useFilterOptions.pageCursor,
72
+ resetHook = _useFilterOptions.reset,
66
73
  errors = _useFilterOptions.errors;
67
74
  var _useDebouncedCallback = (0, _useDebounce.useDebouncedCallback)(function (searchString) {
68
75
  fetchFilterOptions({
@@ -90,14 +97,12 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
90
97
  return _ref2.apply(this, arguments);
91
98
  };
92
99
  }(), [handleDebouncedFetchFilterOptions, searchTerm]);
93
- var handleOptionSelection = function handleOptionSelection(newValue) {
94
- setSelectedOptions(newValue);
100
+ var handleOptionSelection = (0, _react.useCallback)(function (newValue) {
95
101
  onSelectionChange(newValue);
96
- };
102
+ }, [onSelectionChange]);
97
103
  var sortOptionsOnPopupOpen = (0, _react.useCallback)(function () {
98
104
  if (selectedOptions.length === 0) {
99
- setSortedOptions(filterOptions);
100
- return;
105
+ return setSortedOptions(filterOptions);
101
106
  }
102
107
  var nonSelectedOptions = filterOptions.filter(function (option) {
103
108
  return !selectedOptions.find(function (selectedOption) {
@@ -105,37 +110,41 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
105
110
  });
106
111
  });
107
112
  var newOptions = [].concat((0, _toConsumableArray2.default)(selectedOptions), (0, _toConsumableArray2.default)(nonSelectedOptions));
108
- setSortedOptions(newOptions);
109
- }, [selectedOptions, filterOptions]);
113
+ if (!(0, _isEqual.default)(newOptions, sortedOptions)) {
114
+ setSortedOptions(newOptions);
115
+ }
116
+ }, [selectedOptions, filterOptions, sortedOptions]);
110
117
  var sortOptionsOnResolve = (0, _react.useCallback)(function () {
111
- var newOptions = filterOptions.filter(function (option) {
112
- return !sortedOptions.find(function (sortedOption) {
113
- return sortedOption.value === option.value;
114
- });
115
- });
116
- var shouldSetSortOptions = false;
117
- if (sortedOptions.length !== filterOptions.length) {
118
- shouldSetSortOptions = true;
119
- } else {
120
- sortedOptions.forEach(function (sortedOption) {
121
- if (!filterOptions.some(function (filterOption) {
122
- return filterOption.value === sortedOption.value;
123
- })) {
124
- shouldSetSortOptions = true;
125
- }
126
- });
118
+ // sortedOptions is empty initially, this will take care of setting the initial value and bring the selected items to the top
119
+ if (sortedOptions.length === 0) {
120
+ return sortOptionsOnPopupOpen();
121
+ }
122
+
123
+ // when the user is searching, we want the search result to be displayed as it is, and the select component will take care of marking the selected items
124
+ if (searchTerm) {
125
+ sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
126
+ return setSortedOptions(filterOptions);
127
127
  }
128
- if (shouldSetSortOptions) {
129
- var sortedOptionsFiltered = sortedOptions.filter(function (sortedOption) {
130
- return filterOptions.some(function (filterOption) {
131
- return filterOption.value === sortedOption.value;
128
+
129
+ // this block handles the pagination, where on pagination, we will just append newOptions to the current list
130
+ if (sortPaginatedResults.current) {
131
+ var newOptions = filterOptions.filter(function (option) {
132
+ return !sortedOptions.find(function (sortedOption) {
133
+ return sortedOption.value === option.value;
132
134
  });
133
135
  });
134
- setSortedOptions([].concat((0, _toConsumableArray2.default)(sortedOptionsFiltered), (0, _toConsumableArray2.default)(newOptions)));
136
+ if (newOptions.length > 0) {
137
+ setSortedOptions([].concat((0, _toConsumableArray2.default)(sortedOptions), (0, _toConsumableArray2.default)(newOptions)));
138
+ }
139
+ sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
140
+ return;
135
141
  }
136
- }, [filterOptions, sortedOptions]);
142
+ sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
143
+ sortOptionsOnPopupOpen();
144
+ }, [filterOptions, searchTerm, sortOptionsOnPopupOpen, sortedOptions]);
137
145
  var handleShowMore = (0, _react.useCallback)(function () {
138
146
  if (pageCursor) {
147
+ sortPaginatedResults.current = true;
139
148
  fetchFilterOptions({
140
149
  pageCursor: pageCursor,
141
150
  searchString: searchTerm
@@ -156,15 +165,31 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
156
165
  if (status === 'resolved') {
157
166
  sortOptionsOnResolve();
158
167
  }
159
- }, [sortOptionsOnResolve, status]);
168
+ // eslint-disable-next-line react-hooks/exhaustive-deps
169
+ }, [status]); // we only want the sortOptionsOnResolve to run when there is a status change
170
+
171
+ (0, _react.useEffect)(function () {
172
+ if (currentSiteCloudId.current !== cloudId) {
173
+ currentSiteCloudId.current = cloudId;
174
+ setSortedOptions([]);
175
+ setSearchTerm('');
176
+ resetHook();
177
+ resetSelection();
178
+ }
179
+ }, [cloudId, resetHook, resetSelection]);
180
+ (0, _react.useEffect)(function () {
181
+ if (!(0, _isEqual.default)(selection, selectedOptions)) {
182
+ setSelectedOptions(selection);
183
+ }
184
+ }, [selectedOptions, selection]);
160
185
  var filterOptionsLength = filterOptions.length;
161
186
  var isError = status === 'rejected';
162
187
  var isLoading = status === 'loading' || status === 'empty';
163
188
  var isLoadingMore = status === 'loadingMore';
164
189
  var isEmpty = status === 'resolved' && filterOptionsLength === 0;
165
190
  var popupSelectOptions = isLoading || isError ? [] : sortedOptions; // if not set to [], then on loading, no loading UI will be shown
166
- var areAllResultsLoaded = filterOptions.length === totalCount;
167
- var shouldShowFooter = (status === 'resolved' || isLoadingMore) && filterOptions.length > 0; // footer should not disappear when there is an inline spinner for loading more data
191
+ var areAllResultsLoaded = filterOptionsLength === totalCount;
192
+ var shouldShowFooter = (status === 'resolved' || isLoadingMore) && filterOptionsLength > 0; // footer should not disappear when there is an inline spinner for loading more data
168
193
  var shouldDisplayShowMoreButton = status === 'resolved' && !!pageCursor && !areAllResultsLoaded;
169
194
  return /*#__PURE__*/_react.default.createElement(_select.PopupSelect, {
170
195
  isMulti: true,
@@ -223,7 +248,7 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
223
248
  }));
224
249
  },
225
250
  footer: shouldShowFooter && /*#__PURE__*/_react.default.createElement(_footer.default, {
226
- currentDisplayCount: filterOptionsLength,
251
+ currentDisplayCount: popupSelectOptions.length,
227
252
  totalCount: totalCount
228
253
  })
229
254
  });
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
11
  var _react = _interopRequireWildcard(require("react"));
11
12
  var _primitives = require("@atlaskit/primitives");
@@ -13,6 +14,8 @@ var _utils = require("../utils");
13
14
  var _asyncPopupSelect = _interopRequireDefault(require("./async-popup-select"));
14
15
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
16
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
+ 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) { (0, _defineProperty2.default)(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; }
16
19
  var availableBasicFilterTypes = ['project', 'issuetype', 'status', 'assignee'];
17
20
  var basicFilterContainerStyles = (0, _primitives.xcss)({
18
21
  paddingLeft: "var(--ds-space-100, 8px)"
@@ -20,7 +23,7 @@ var basicFilterContainerStyles = (0, _primitives.xcss)({
20
23
  var BasicFilterContainer = function BasicFilterContainer(_ref) {
21
24
  var jql = _ref.jql,
22
25
  cloudId = _ref.cloudId;
23
- var _useState = (0, _react.useState)([]),
26
+ var _useState = (0, _react.useState)({}),
24
27
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
25
28
  selection = _useState2[0],
26
29
  setSelection = _useState2[1];
@@ -29,9 +32,15 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
29
32
  // hydrate hook call goes in here
30
33
  }
31
34
  }, [jql]);
32
- var handleSelectionChange = (0, _react.useCallback)(function (options) {
33
- setSelection(options);
34
- }, [setSelection]);
35
+ var handleSelectionChange = (0, _react.useCallback)(function (options, filter) {
36
+ var updatedSelection = _objectSpread(_objectSpread({}, selection), {}, (0, _defineProperty2.default)({}, filter, options));
37
+ setSelection(updatedSelection);
38
+ }, [selection]);
39
+ var handleReset = (0, _react.useCallback)(function () {
40
+ if (Object.keys(selection).length > 0) {
41
+ setSelection({});
42
+ }
43
+ }, [selection]);
35
44
  return /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
36
45
  xcss: basicFilterContainerStyles,
37
46
  gap: "space.100",
@@ -41,9 +50,12 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
41
50
  cloudId: cloudId,
42
51
  filterType: filter,
43
52
  key: filter,
44
- selection: selection,
53
+ selection: selection[filter] || [],
45
54
  isDisabled: !cloudId,
46
- onSelectionChange: handleSelectionChange
55
+ onSelectionChange: function onSelectionChange(options) {
56
+ return handleSelectionChange(options, filter);
57
+ },
58
+ onReset: handleReset
47
59
  });
48
60
  }));
49
61
  };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.isValidJql = void 0;
7
7
  var _jqlAst = require("@atlaskit/jql-ast");
8
8
  var isValidJql = exports.isValidJql = function isValidJql(jql) {
9
+ var _jast$errors;
9
10
  var jast = new _jqlAst.JastBuilder().build(jql);
10
- return jast.errors.length === 0;
11
+ return (jast === null || jast === void 0 || (_jast$errors = jast.errors) === null || _jast$errors === void 0 ? void 0 : _jast$errors.length) === 0;
11
12
  };
@@ -1,5 +1,5 @@
1
1
  export const EVENT_CHANNEL = 'media';
2
2
  export const packageMetaData = {
3
3
  packageName: "@atlaskit/link-datasource",
4
- packageVersion: "1.17.0"
4
+ packageVersion: "1.17.2"
5
5
  };
@@ -1,4 +1,5 @@
1
1
  import { useEffect, useState } from 'react';
2
+ import { useDatasourceAnalyticsEvents } from '../analytics';
2
3
  import { fetchObjectSchema, fetchObjectSchemas, getWorkspaceId } from '../services/cmdbService';
3
4
  const handleAssetsClientErrors = (errorSetter, error) => {
4
5
  if (error instanceof Error) {
@@ -16,6 +17,9 @@ export const useAssetsClient = initialParameters => {
16
17
  const [objectSchemas, setObjectSchemas] = useState();
17
18
  const [totalObjectSchemas, setTotalObjectSchemas] = useState();
18
19
  const [objectSchemasError, setObjectSchemasError] = useState();
20
+ const {
21
+ fireEvent
22
+ } = useDatasourceAnalyticsEvents();
19
23
 
20
24
  /*
21
25
  * We wrap this in nested try/catch blocks because we want to handle
@@ -27,19 +31,19 @@ export const useAssetsClient = initialParameters => {
27
31
  setLoading(true);
28
32
  setWorkspaceError(undefined);
29
33
  try {
30
- const workspaceId = await getWorkspaceId();
34
+ const workspaceId = await getWorkspaceId(fireEvent);
31
35
  setWorkspaceId(workspaceId);
32
36
  // Check schema from initial parameters still exists and fetch name/permissions for schema select
33
37
  if (initialParameters !== null && initialParameters !== void 0 && initialParameters.schemaId) {
34
38
  try {
35
- const fetchedObjectSchema = await fetchObjectSchema(workspaceId, initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId);
39
+ const fetchedObjectSchema = await fetchObjectSchema(workspaceId, initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId, fireEvent);
36
40
  setExistingObjectSchema(fetchedObjectSchema);
37
41
  } catch (fetchObjectSchemaError) {
38
42
  handleAssetsClientErrors(setExistingObjectSchemaError, fetchObjectSchemaError);
39
43
  }
40
44
  }
41
45
  try {
42
- const fetchedObjectSchemasResponse = await fetchObjectSchemas(workspaceId);
46
+ const fetchedObjectSchemasResponse = await fetchObjectSchemas(workspaceId, undefined, fireEvent);
43
47
  setObjectSchemas(fetchedObjectSchemasResponse.values);
44
48
  setTotalObjectSchemas(fetchedObjectSchemasResponse.total);
45
49
  } catch (fetchObjectSchemasError) {
@@ -51,7 +55,7 @@ export const useAssetsClient = initialParameters => {
51
55
  setLoading(false);
52
56
  }
53
57
  })();
54
- }, [initialParameters]);
58
+ }, [initialParameters, fireEvent]);
55
59
  return {
56
60
  workspaceId,
57
61
  workspaceError,
@@ -1,9 +1,13 @@
1
1
  import { useCallback, useState } from 'react';
2
+ import { useDatasourceAnalyticsEvents } from '../analytics';
2
3
  import { validateAql } from '../services/cmdbService';
3
4
  export const useValidateAqlText = workspaceId => {
4
5
  const [loading, setLoading] = useState(false);
5
6
  const [isValidAqlText, setIsValidAqlText] = useState(false);
6
7
  const [error, setError] = useState();
8
+ const {
9
+ fireEvent
10
+ } = useDatasourceAnalyticsEvents();
7
11
  const validateAqlText = useCallback(async aql => {
8
12
  setLoading(true);
9
13
  setError(undefined);
@@ -13,7 +17,7 @@ export const useValidateAqlText = workspaceId => {
13
17
  var _validateAqlResponse$;
14
18
  const validateAqlResponse = await validateAql(workspaceId, {
15
19
  qlQuery: aql
16
- });
20
+ }, fireEvent);
17
21
  setIsValidAqlText(validateAqlResponse.isValid);
18
22
  isValid = validateAqlResponse.isValid;
19
23
  message = ((_validateAqlResponse$ = validateAqlResponse.errors) === null || _validateAqlResponse$ === void 0 ? void 0 : _validateAqlResponse$.iql) || null;
@@ -30,7 +34,7 @@ export const useValidateAqlText = workspaceId => {
30
34
  isValid,
31
35
  message
32
36
  };
33
- }, [workspaceId]);
37
+ }, [workspaceId, fireEvent]);
34
38
  return {
35
39
  isValidAqlText,
36
40
  validateAqlText,