@atlaskit/link-datasource 1.16.3 → 1.16.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 (33) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/analytics/constants.js +1 -1
  3. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +18 -11
  4. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +4 -2
  5. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/index.js +4 -0
  6. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.js +39 -2
  7. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/menu-list/index.js +6 -2
  8. package/dist/cjs/ui/jira-issues-modal/basic-search-input/index.js +1 -2
  9. package/dist/es2019/analytics/constants.js +1 -1
  10. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +5 -1
  11. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +4 -2
  12. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/index.js +5 -1
  13. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.js +33 -2
  14. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/menu-list/index.js +5 -1
  15. package/dist/es2019/ui/jira-issues-modal/basic-search-input/index.js +1 -2
  16. package/dist/esm/analytics/constants.js +1 -1
  17. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +18 -11
  18. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +4 -2
  19. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/index.js +5 -1
  20. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.js +36 -2
  21. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/menu-list/index.js +6 -2
  22. package/dist/esm/ui/jira-issues-modal/basic-search-input/index.js +1 -2
  23. package/dist/types/analytics/generated/analytics.types.d.ts +8 -1
  24. package/dist/types/services/cmdbService.utils.d.ts +1 -1
  25. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +1 -0
  26. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +6 -1
  27. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +3 -1
  28. package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +8 -1
  29. package/dist/types-ts4.5/services/cmdbService.utils.d.ts +1 -1
  30. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +1 -0
  31. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +6 -1
  32. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +3 -1
  33. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.16.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [#43103](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43103) [`effb3f0234c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/effb3f0234c) - Add ui analytics event when error UI is displayed for basic filter search.
8
+
9
+ ## 1.16.4
10
+
11
+ ### Patch Changes
12
+
13
+ - [#43137](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43137) [`4d201f9fe57`](https://bitbucket.org/atlassian/atlassian-frontend/commits/4d201f9fe57) - [ux] Updates spacing to ensure it is consistent between search input and mode switcher on toggle between JQL and Basic and when Basic Filters feature flag is on.
14
+
3
15
  ## 1.16.3
4
16
 
5
17
  ### Patch 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.16.3"
10
+ packageVersion: "1.16.5"
11
11
  };
@@ -27,10 +27,14 @@ var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref
27
27
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
28
28
  status = _useState6[0],
29
29
  setStatus = _useState6[1];
30
- var _useState7 = (0, _react.useState)(undefined),
30
+ var _useState7 = (0, _react.useState)([]),
31
31
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
32
- nextPageCursor = _useState8[0],
33
- setNextPageCursor = _useState8[1];
32
+ errors = _useState8[0],
33
+ setErrors = _useState8[1];
34
+ var _useState9 = (0, _react.useState)(undefined),
35
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
36
+ nextPageCursor = _useState10[0],
37
+ setNextPageCursor = _useState10[1];
34
38
  var initialData = (0, _react.useRef)();
35
39
  var _useBasicFilterAGG = (0, _useBasicFilterAGG2.useBasicFilterAGG)(),
36
40
  getFieldValues = _useBasicFilterAGG.getFieldValues;
@@ -73,12 +77,13 @@ var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref
73
77
  case 13:
74
78
  response = _context.t0;
75
79
  if (!(response.errors && response.errors.length > 0)) {
76
- _context.next = 17;
80
+ _context.next = 18;
77
81
  break;
78
82
  }
79
83
  setStatus('rejected');
84
+ setErrors(response.errors);
80
85
  return _context.abrupt("return");
81
- case 17:
86
+ case 18:
82
87
  if (isNewSearch) {
83
88
  setFilterOptions((0, _transformers.mapFieldValuesToFilterOptions)(response));
84
89
  if (isRequestLikeInitialSearch) {
@@ -94,23 +99,25 @@ var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref
94
99
  setTotalCount((0, _transformers.mapFieldValuesToTotalCount)(response));
95
100
  setNextPageCursor((0, _transformers.mapFieldValuesToPageCursor)(response));
96
101
  setStatus('resolved');
97
- _context.next = 26;
102
+ _context.next = 28;
98
103
  break;
99
- case 23:
100
- _context.prev = 23;
104
+ case 24:
105
+ _context.prev = 24;
101
106
  _context.t1 = _context["catch"](5);
107
+ setErrors([_context.t1]);
102
108
  setStatus('rejected');
103
- case 26:
109
+ case 28:
104
110
  case "end":
105
111
  return _context.stop();
106
112
  }
107
- }, _callee, null, [[5, 23]]);
113
+ }, _callee, null, [[5, 24]]);
108
114
  })), [cloudId, filterOptions, filterType, getFieldValues]);
109
115
  return {
110
116
  filterOptions: filterOptions,
111
117
  fetchFilterOptions: fetchFilterOptions,
112
118
  totalCount: totalCount,
113
119
  pageCursor: nextPageCursor,
114
- status: status
120
+ status: status,
121
+ errors: status === 'rejected' ? errors : []
115
122
  };
116
123
  };
@@ -58,7 +58,8 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
58
58
  fetchFilterOptions = _useFilterOptions.fetchFilterOptions,
59
59
  totalCount = _useFilterOptions.totalCount,
60
60
  status = _useFilterOptions.status,
61
- pageCursor = _useFilterOptions.pageCursor;
61
+ pageCursor = _useFilterOptions.pageCursor,
62
+ errors = _useFilterOptions.errors;
62
63
  var _useDebouncedCallback = (0, _useDebounce.useDebouncedCallback)(function (searchString) {
63
64
  fetchFilterOptions({
64
65
  searchString: searchString
@@ -152,7 +153,8 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
152
153
  isLoading: isLoading,
153
154
  isLoadingMore: isLoadingMore,
154
155
  showMore: shouldDisplayShowMoreButton,
155
- handleShowMore: handleShowMore
156
+ handleShowMore: handleShowMore,
157
+ errors: errors
156
158
  }));
157
159
  },
158
160
  DropdownIndicator: _dropdownIndicator.default,
@@ -14,6 +14,9 @@ var _asyncPopupSelect = _interopRequireDefault(require("./async-popup-select"));
14
14
  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
15
  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; }
16
16
  var availableBasicFilterTypes = ['project', 'issuetype', 'status', 'assignee'];
17
+ var basicFilterContainerStyles = (0, _primitives.xcss)({
18
+ paddingLeft: "var(--ds-space-100, 8px)"
19
+ });
17
20
  var BasicFilterContainer = function BasicFilterContainer(_ref) {
18
21
  var jql = _ref.jql,
19
22
  cloudId = _ref.cloudId;
@@ -27,6 +30,7 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
27
30
  }, [jql]);
28
31
  var handleSelectionChange = function handleSelectionChange() {};
29
32
  return /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
33
+ xcss: basicFilterContainerStyles,
30
34
  gap: "space.100",
31
35
  testId: "jlol-basic-filter-container"
32
36
  }, availableBasicFilterTypes.map(function (filter) {
@@ -1,16 +1,53 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.default = void 0;
8
- var _react = _interopRequireDefault(require("react"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _useDebounce = require("use-debounce");
9
12
  var _error = _interopRequireDefault(require("@atlaskit/icon/glyph/error"));
10
13
  var _colors = require("@atlaskit/theme/colors");
14
+ var _analytics = require("../../../../../analytics");
15
+ var _asyncPopupSelect = require("../async-popup-select");
11
16
  var _messages = require("./messages");
12
17
  var _selectMessage = _interopRequireDefault(require("./selectMessage"));
13
- var CustomErrorMessage = function CustomErrorMessage() {
18
+ 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); }
19
+ 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; }
20
+ var getErrorReasonType = function getErrorReasonType(errors) {
21
+ var _ref = errors || [],
22
+ _ref2 = (0, _slicedToArray2.default)(_ref, 1),
23
+ error = _ref2[0];
24
+ if (error instanceof Error) {
25
+ return 'network';
26
+ }
27
+ if (errors && errors.length > 0) {
28
+ return 'agg';
29
+ }
30
+ return 'unknown';
31
+ };
32
+ var CustomErrorMessage = function CustomErrorMessage(_ref3) {
33
+ var filterType = _ref3.filterType,
34
+ errors = _ref3.errors;
35
+ var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
36
+ fireEvent = _useDatasourceAnalyti.fireEvent;
37
+
38
+ /**
39
+ * Debounce is required because our search is debounced
40
+ * ref: ./noOptionsMessage.tsx
41
+ */
42
+ var _useDebouncedCallback = (0, _useDebounce.useDebouncedCallback)(function () {
43
+ fireEvent('ui.error.shown.basicSearchDropdown', {
44
+ filterType: filterType,
45
+ reason: getErrorReasonType(errors)
46
+ });
47
+ }, _asyncPopupSelect.SEARCH_DEBOUNCE_MS),
48
+ _useDebouncedCallback2 = (0, _slicedToArray2.default)(_useDebouncedCallback, 1),
49
+ debouncedAnalyticsCallback = _useDebouncedCallback2[0];
50
+ (0, _react.useEffect)(debouncedAnalyticsCallback, [debouncedAnalyticsCallback]);
14
51
  return /*#__PURE__*/_react.default.createElement(_selectMessage.default, {
15
52
  icon: /*#__PURE__*/_react.default.createElement(_error.default, {
16
53
  primaryColor: "var(--ds-icon, ".concat(_colors.N500, ")"),
@@ -14,13 +14,14 @@ var _showMoreButton = _interopRequireDefault(require("../async-popup-select/show
14
14
  var _errorMessage = _interopRequireDefault(require("./errorMessage"));
15
15
  var _loadingMessage = _interopRequireDefault(require("./loadingMessage"));
16
16
  var _noOptionsMessage = _interopRequireDefault(require("./noOptionsMessage"));
17
- var _excluded = ["filterType", "isLoading", "isLoadingMore", "isError", "isEmpty", "showMore", "handleShowMore", "children"];
17
+ var _excluded = ["filterType", "isLoading", "isLoadingMore", "isError", "isEmpty", "errors", "showMore", "handleShowMore", "children"];
18
18
  var CustomMenuList = function CustomMenuList(_ref) {
19
19
  var filterType = _ref.filterType,
20
20
  isLoading = _ref.isLoading,
21
21
  isLoadingMore = _ref.isLoadingMore,
22
22
  isError = _ref.isError,
23
23
  isEmpty = _ref.isEmpty,
24
+ errors = _ref.errors,
24
25
  showMore = _ref.showMore,
25
26
  handleShowMore = _ref.handleShowMore,
26
27
  children = _ref.children,
@@ -39,7 +40,10 @@ var CustomMenuList = function CustomMenuList(_ref) {
39
40
  return /*#__PURE__*/_react.default.createElement(_loadingMessage.default, null);
40
41
  }
41
42
  if (isError) {
42
- return /*#__PURE__*/_react.default.createElement(_errorMessage.default, null);
43
+ return /*#__PURE__*/_react.default.createElement(_errorMessage.default, {
44
+ filterType: filterType,
45
+ errors: errors
46
+ });
43
47
  }
44
48
  if (isEmpty) {
45
49
  return /*#__PURE__*/_react.default.createElement(_noOptionsMessage.default, {
@@ -17,8 +17,7 @@ var searchButtonStyles = (0, _react.css)({
17
17
  marginRight: "var(--ds-space-075, 6px)"
18
18
  });
19
19
  var formStyles = (0, _react.css)({
20
- flex: 1,
21
- paddingRight: "var(--ds-space-100, 8px)"
20
+ flex: 1
22
21
  });
23
22
  var BasicSearchInput = exports.BasicSearchInput = function BasicSearchInput(_ref) {
24
23
  var isDisabled = _ref.isDisabled,
@@ -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.16.3"
4
+ packageVersion: "1.16.5"
5
5
  };
@@ -8,6 +8,7 @@ export const useFilterOptions = ({
8
8
  const [filterOptions, setFilterOptions] = useState([]);
9
9
  const [totalCount, setTotalCount] = useState(0);
10
10
  const [status, setStatus] = useState('empty');
11
+ const [errors, setErrors] = useState([]);
11
12
  const [nextPageCursor, setNextPageCursor] = useState(undefined);
12
13
  const initialData = useRef();
13
14
  const {
@@ -33,6 +34,7 @@ export const useFilterOptions = ({
33
34
  });
34
35
  if (response.errors && response.errors.length > 0) {
35
36
  setStatus('rejected');
37
+ setErrors(response.errors);
36
38
  return;
37
39
  }
38
40
  if (isNewSearch) {
@@ -51,6 +53,7 @@ export const useFilterOptions = ({
51
53
  setNextPageCursor(mapFieldValuesToPageCursor(response));
52
54
  setStatus('resolved');
53
55
  } catch (error) {
56
+ setErrors([error]);
54
57
  setStatus('rejected');
55
58
  }
56
59
  }, [cloudId, filterOptions, filterType, getFieldValues]);
@@ -59,6 +62,7 @@ export const useFilterOptions = ({
59
62
  fetchFilterOptions,
60
63
  totalCount,
61
64
  pageCursor: nextPageCursor,
62
- status
65
+ status,
66
+ errors: status === 'rejected' ? errors : []
63
67
  };
64
68
  };
@@ -32,7 +32,8 @@ const AsyncPopupSelect = ({
32
32
  fetchFilterOptions,
33
33
  totalCount,
34
34
  status,
35
- pageCursor
35
+ pageCursor,
36
+ errors
36
37
  } = useFilterOptions({
37
38
  filterType,
38
39
  cloudId
@@ -114,7 +115,8 @@ const AsyncPopupSelect = ({
114
115
  isLoading: isLoading,
115
116
  isLoadingMore: isLoadingMore,
116
117
  showMore: shouldDisplayShowMoreButton,
117
- handleShowMore: handleShowMore
118
+ handleShowMore: handleShowMore,
119
+ errors: errors
118
120
  })),
119
121
  DropdownIndicator: CustomDropdownIndicator,
120
122
  LoadingIndicator: undefined,
@@ -1,8 +1,11 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { Flex } from '@atlaskit/primitives';
2
+ import { Flex, xcss } from '@atlaskit/primitives';
3
3
  import { isValidJql } from '../utils';
4
4
  import AsyncPopupSelect from './async-popup-select';
5
5
  const availableBasicFilterTypes = ['project', 'issuetype', 'status', 'assignee'];
6
+ const basicFilterContainerStyles = xcss({
7
+ paddingLeft: "var(--ds-space-100, 8px)"
8
+ });
6
9
  const BasicFilterContainer = ({
7
10
  jql,
8
11
  cloudId
@@ -15,6 +18,7 @@ const BasicFilterContainer = ({
15
18
  }, [jql]);
16
19
  const handleSelectionChange = () => {};
17
20
  return /*#__PURE__*/React.createElement(Flex, {
21
+ xcss: basicFilterContainerStyles,
18
22
  gap: "space.100",
19
23
  testId: "jlol-basic-filter-container"
20
24
  }, availableBasicFilterTypes.map(filter => /*#__PURE__*/React.createElement(AsyncPopupSelect, {
@@ -1,9 +1,40 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
+ import { useDebouncedCallback } from 'use-debounce';
2
3
  import ErrorIcon from '@atlaskit/icon/glyph/error';
3
4
  import { N500 } from '@atlaskit/theme/colors';
5
+ import { useDatasourceAnalyticsEvents } from '../../../../../analytics';
6
+ import { SEARCH_DEBOUNCE_MS } from '../async-popup-select';
4
7
  import { asyncPopupSelectMessages } from './messages';
5
8
  import CustomSelectMessage from './selectMessage';
6
- const CustomErrorMessage = () => {
9
+ const getErrorReasonType = errors => {
10
+ const [error] = errors || [];
11
+ if (error instanceof Error) {
12
+ return 'network';
13
+ }
14
+ if (errors && errors.length > 0) {
15
+ return 'agg';
16
+ }
17
+ return 'unknown';
18
+ };
19
+ const CustomErrorMessage = ({
20
+ filterType,
21
+ errors
22
+ }) => {
23
+ const {
24
+ fireEvent
25
+ } = useDatasourceAnalyticsEvents();
26
+
27
+ /**
28
+ * Debounce is required because our search is debounced
29
+ * ref: ./noOptionsMessage.tsx
30
+ */
31
+ const [debouncedAnalyticsCallback] = useDebouncedCallback(() => {
32
+ fireEvent('ui.error.shown.basicSearchDropdown', {
33
+ filterType,
34
+ reason: getErrorReasonType(errors)
35
+ });
36
+ }, SEARCH_DEBOUNCE_MS);
37
+ useEffect(debouncedAnalyticsCallback, [debouncedAnalyticsCallback]);
7
38
  return /*#__PURE__*/React.createElement(CustomSelectMessage, {
8
39
  icon: /*#__PURE__*/React.createElement(ErrorIcon, {
9
40
  primaryColor: `var(--ds-icon, ${N500})`,
@@ -12,6 +12,7 @@ const CustomMenuList = ({
12
12
  isLoadingMore,
13
13
  isError,
14
14
  isEmpty,
15
+ errors,
15
16
  showMore,
16
17
  handleShowMore,
17
18
  children,
@@ -29,7 +30,10 @@ const CustomMenuList = ({
29
30
  return /*#__PURE__*/React.createElement(CustomDropdownLoadingMessage, null);
30
31
  }
31
32
  if (isError) {
32
- return /*#__PURE__*/React.createElement(CustomErrorMessage, null);
33
+ return /*#__PURE__*/React.createElement(CustomErrorMessage, {
34
+ filterType: filterType,
35
+ errors: errors
36
+ });
33
37
  }
34
38
  if (isEmpty) {
35
39
  return /*#__PURE__*/React.createElement(CustomNoOptionsMessage, {
@@ -9,8 +9,7 @@ const searchButtonStyles = css({
9
9
  marginRight: "var(--ds-space-075, 6px)"
10
10
  });
11
11
  const formStyles = css({
12
- flex: 1,
13
- paddingRight: "var(--ds-space-100, 8px)"
12
+ flex: 1
14
13
  });
15
14
  export const BasicSearchInput = ({
16
15
  isDisabled,
@@ -1,5 +1,5 @@
1
1
  export var EVENT_CHANNEL = 'media';
2
2
  export var packageMetaData = {
3
3
  packageName: "@atlaskit/link-datasource",
4
- packageVersion: "1.16.3"
4
+ packageVersion: "1.16.5"
5
5
  };
@@ -20,10 +20,14 @@ export var useFilterOptions = function useFilterOptions(_ref) {
20
20
  _useState6 = _slicedToArray(_useState5, 2),
21
21
  status = _useState6[0],
22
22
  setStatus = _useState6[1];
23
- var _useState7 = useState(undefined),
23
+ var _useState7 = useState([]),
24
24
  _useState8 = _slicedToArray(_useState7, 2),
25
- nextPageCursor = _useState8[0],
26
- setNextPageCursor = _useState8[1];
25
+ errors = _useState8[0],
26
+ setErrors = _useState8[1];
27
+ var _useState9 = useState(undefined),
28
+ _useState10 = _slicedToArray(_useState9, 2),
29
+ nextPageCursor = _useState10[0],
30
+ setNextPageCursor = _useState10[1];
27
31
  var initialData = useRef();
28
32
  var _useBasicFilterAGG = useBasicFilterAGG(),
29
33
  getFieldValues = _useBasicFilterAGG.getFieldValues;
@@ -66,12 +70,13 @@ export var useFilterOptions = function useFilterOptions(_ref) {
66
70
  case 13:
67
71
  response = _context.t0;
68
72
  if (!(response.errors && response.errors.length > 0)) {
69
- _context.next = 17;
73
+ _context.next = 18;
70
74
  break;
71
75
  }
72
76
  setStatus('rejected');
77
+ setErrors(response.errors);
73
78
  return _context.abrupt("return");
74
- case 17:
79
+ case 18:
75
80
  if (isNewSearch) {
76
81
  setFilterOptions(mapFieldValuesToFilterOptions(response));
77
82
  if (isRequestLikeInitialSearch) {
@@ -87,23 +92,25 @@ export var useFilterOptions = function useFilterOptions(_ref) {
87
92
  setTotalCount(mapFieldValuesToTotalCount(response));
88
93
  setNextPageCursor(mapFieldValuesToPageCursor(response));
89
94
  setStatus('resolved');
90
- _context.next = 26;
95
+ _context.next = 28;
91
96
  break;
92
- case 23:
93
- _context.prev = 23;
97
+ case 24:
98
+ _context.prev = 24;
94
99
  _context.t1 = _context["catch"](5);
100
+ setErrors([_context.t1]);
95
101
  setStatus('rejected');
96
- case 26:
102
+ case 28:
97
103
  case "end":
98
104
  return _context.stop();
99
105
  }
100
- }, _callee, null, [[5, 23]]);
106
+ }, _callee, null, [[5, 24]]);
101
107
  })), [cloudId, filterOptions, filterType, getFieldValues]);
102
108
  return {
103
109
  filterOptions: filterOptions,
104
110
  fetchFilterOptions: fetchFilterOptions,
105
111
  totalCount: totalCount,
106
112
  pageCursor: nextPageCursor,
107
- status: status
113
+ status: status,
114
+ errors: status === 'rejected' ? errors : []
108
115
  };
109
116
  };
@@ -48,7 +48,8 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
48
48
  fetchFilterOptions = _useFilterOptions.fetchFilterOptions,
49
49
  totalCount = _useFilterOptions.totalCount,
50
50
  status = _useFilterOptions.status,
51
- pageCursor = _useFilterOptions.pageCursor;
51
+ pageCursor = _useFilterOptions.pageCursor,
52
+ errors = _useFilterOptions.errors;
52
53
  var _useDebouncedCallback = useDebouncedCallback(function (searchString) {
53
54
  fetchFilterOptions({
54
55
  searchString: searchString
@@ -142,7 +143,8 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
142
143
  isLoading: isLoading,
143
144
  isLoadingMore: isLoadingMore,
144
145
  showMore: shouldDisplayShowMoreButton,
145
- handleShowMore: handleShowMore
146
+ handleShowMore: handleShowMore,
147
+ errors: errors
146
148
  }));
147
149
  },
148
150
  DropdownIndicator: CustomDropdownIndicator,
@@ -1,9 +1,12 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import React, { useEffect, useState } from 'react';
3
- import { Flex } from '@atlaskit/primitives';
3
+ import { Flex, xcss } from '@atlaskit/primitives';
4
4
  import { isValidJql } from '../utils';
5
5
  import AsyncPopupSelect from './async-popup-select';
6
6
  var availableBasicFilterTypes = ['project', 'issuetype', 'status', 'assignee'];
7
+ var basicFilterContainerStyles = xcss({
8
+ paddingLeft: "var(--ds-space-100, 8px)"
9
+ });
7
10
  var BasicFilterContainer = function BasicFilterContainer(_ref) {
8
11
  var jql = _ref.jql,
9
12
  cloudId = _ref.cloudId;
@@ -17,6 +20,7 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
17
20
  }, [jql]);
18
21
  var handleSelectionChange = function handleSelectionChange() {};
19
22
  return /*#__PURE__*/React.createElement(Flex, {
23
+ xcss: basicFilterContainerStyles,
20
24
  gap: "space.100",
21
25
  testId: "jlol-basic-filter-container"
22
26
  }, availableBasicFilterTypes.map(function (filter) {
@@ -1,9 +1,43 @@
1
- import React from 'react';
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import React, { useEffect } from 'react';
3
+ import { useDebouncedCallback } from 'use-debounce';
2
4
  import ErrorIcon from '@atlaskit/icon/glyph/error';
3
5
  import { N500 } from '@atlaskit/theme/colors';
6
+ import { useDatasourceAnalyticsEvents } from '../../../../../analytics';
7
+ import { SEARCH_DEBOUNCE_MS } from '../async-popup-select';
4
8
  import { asyncPopupSelectMessages } from './messages';
5
9
  import CustomSelectMessage from './selectMessage';
6
- var CustomErrorMessage = function CustomErrorMessage() {
10
+ var getErrorReasonType = function getErrorReasonType(errors) {
11
+ var _ref = errors || [],
12
+ _ref2 = _slicedToArray(_ref, 1),
13
+ error = _ref2[0];
14
+ if (error instanceof Error) {
15
+ return 'network';
16
+ }
17
+ if (errors && errors.length > 0) {
18
+ return 'agg';
19
+ }
20
+ return 'unknown';
21
+ };
22
+ var CustomErrorMessage = function CustomErrorMessage(_ref3) {
23
+ var filterType = _ref3.filterType,
24
+ errors = _ref3.errors;
25
+ var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
26
+ fireEvent = _useDatasourceAnalyti.fireEvent;
27
+
28
+ /**
29
+ * Debounce is required because our search is debounced
30
+ * ref: ./noOptionsMessage.tsx
31
+ */
32
+ var _useDebouncedCallback = useDebouncedCallback(function () {
33
+ fireEvent('ui.error.shown.basicSearchDropdown', {
34
+ filterType: filterType,
35
+ reason: getErrorReasonType(errors)
36
+ });
37
+ }, SEARCH_DEBOUNCE_MS),
38
+ _useDebouncedCallback2 = _slicedToArray(_useDebouncedCallback, 1),
39
+ debouncedAnalyticsCallback = _useDebouncedCallback2[0];
40
+ useEffect(debouncedAnalyticsCallback, [debouncedAnalyticsCallback]);
7
41
  return /*#__PURE__*/React.createElement(CustomSelectMessage, {
8
42
  icon: /*#__PURE__*/React.createElement(ErrorIcon, {
9
43
  primaryColor: "var(--ds-icon, ".concat(N500, ")"),
@@ -1,5 +1,5 @@
1
1
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
- var _excluded = ["filterType", "isLoading", "isLoadingMore", "isError", "isEmpty", "showMore", "handleShowMore", "children"];
2
+ var _excluded = ["filterType", "isLoading", "isLoadingMore", "isError", "isEmpty", "errors", "showMore", "handleShowMore", "children"];
3
3
  import React from 'react';
4
4
  import { Flex } from '@atlaskit/primitives';
5
5
  import { components } from '@atlaskit/select';
@@ -14,6 +14,7 @@ var CustomMenuList = function CustomMenuList(_ref) {
14
14
  isLoadingMore = _ref.isLoadingMore,
15
15
  isError = _ref.isError,
16
16
  isEmpty = _ref.isEmpty,
17
+ errors = _ref.errors,
17
18
  showMore = _ref.showMore,
18
19
  handleShowMore = _ref.handleShowMore,
19
20
  children = _ref.children,
@@ -32,7 +33,10 @@ var CustomMenuList = function CustomMenuList(_ref) {
32
33
  return /*#__PURE__*/React.createElement(CustomDropdownLoadingMessage, null);
33
34
  }
34
35
  if (isError) {
35
- return /*#__PURE__*/React.createElement(CustomErrorMessage, null);
36
+ return /*#__PURE__*/React.createElement(CustomErrorMessage, {
37
+ filterType: filterType,
38
+ errors: errors
39
+ });
36
40
  }
37
41
  if (isEmpty) {
38
42
  return /*#__PURE__*/React.createElement(CustomNoOptionsMessage, {
@@ -9,8 +9,7 @@ var searchButtonStyles = css({
9
9
  marginRight: "var(--ds-space-075, 6px)"
10
10
  });
11
11
  var formStyles = css({
12
- flex: 1,
13
- paddingRight: "var(--ds-space-100, 8px)"
12
+ flex: 1
14
13
  });
15
14
  export var BasicSearchInput = function BasicSearchInput(_ref) {
16
15
  var isDisabled = _ref.isDisabled,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generates Typescript types for analytics events from analytics.spec.yaml
5
5
  *
6
- * @codegen <<SignedSource::ea736210c3d6e0528843ce49cebf0610>>
6
+ * @codegen <<SignedSource::ddaee20abebe8b4891d75f243120dce8>>
7
7
  * @codegenCommand yarn workspace @atlassian/analytics-tooling run analytics:codegen link-datasource
8
8
  */
9
9
  export type PackageMetaDataType = {
@@ -85,6 +85,10 @@ export type LinkViewedCountAttributesType = {
85
85
  export type EmptyResultShownBasicSearchDropdownAttributesType = {
86
86
  filterType: 'project' | 'assignee' | 'issuetype' | 'status';
87
87
  };
88
+ export type ErrorShownBasicSearchDropdownAttributesType = {
89
+ filterType: 'project' | 'assignee' | 'issuetype' | 'status';
90
+ reason: 'agg' | 'network' | 'unknown';
91
+ };
88
92
  export type AqlEditorSearchedAttributesType = {};
89
93
  export type AnalyticsEventAttributes = {
90
94
  /**
@@ -138,6 +142,9 @@ export type AnalyticsEventAttributes = {
138
142
  /**
139
143
  * Fired when the basic filter search results are empty */
140
144
  'ui.emptyResult.shown.basicSearchDropdown': EmptyResultShownBasicSearchDropdownAttributesType;
145
+ /**
146
+ * Fired when the basic filter search dropdown shows an error UI */
147
+ 'ui.error.shown.basicSearchDropdown': ErrorShownBasicSearchDropdownAttributesType;
141
148
  /**
142
149
  * Fired when search is initiated via the search icon or enter key press for aql editor input field. */
143
150
  'ui.aqlEditor.searched': AqlEditorSearchedAttributesType;
@@ -1,5 +1,5 @@
1
1
  export declare const mapFetchErrors: (error: any) => Error;
2
- export declare const getStatusCodeGroup: (error: Error) => "1xx" | "3xx" | "4xx" | "5xx" | "unknown";
2
+ export declare const getStatusCodeGroup: (error: Error) => "unknown" | "1xx" | "3xx" | "4xx" | "5xx";
3
3
  export declare class PermissionError extends Error {
4
4
  constructor(message: string);
5
5
  }
@@ -13,6 +13,7 @@ export interface FilterOptionsState {
13
13
  totalCount: number;
14
14
  pageCursor?: string;
15
15
  status: 'empty' | 'loading' | 'resolved' | 'rejected' | 'loadingMore';
16
+ errors: unknown[];
16
17
  }
17
18
  export declare const useFilterOptions: ({ filterType, cloudId, }: FilterOptionsProps) => FilterOptionsState;
18
19
  export {};
@@ -1,3 +1,8 @@
1
1
  /// <reference types="react" />
2
- declare const CustomErrorMessage: () => JSX.Element;
2
+ import { FilterOptionsState } from '../../hooks/useFilterOptions';
3
+ import { BasicFilterFieldType } from '../../types';
4
+ declare const CustomErrorMessage: ({ filterType, errors, }: {
5
+ filterType: BasicFilterFieldType;
6
+ errors?: unknown[] | undefined;
7
+ }) => JSX.Element;
3
8
  export default CustomErrorMessage;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { MenuListComponentProps } from '@atlaskit/select';
3
+ import { FilterOptionsState } from '../../hooks/useFilterOptions';
3
4
  import { BasicFilterFieldType, SelectOption } from '../../types';
4
5
  type CustomProps = {
5
6
  isError?: boolean;
@@ -9,6 +10,7 @@ type CustomProps = {
9
10
  showMore?: boolean;
10
11
  handleShowMore: () => void;
11
12
  filterType: BasicFilterFieldType;
13
+ errors?: FilterOptionsState['errors'];
12
14
  };
13
- declare const CustomMenuList: ({ filterType, isLoading, isLoadingMore, isError, isEmpty, showMore, handleShowMore, children, ...props }: MenuListComponentProps<SelectOption, true> & CustomProps) => JSX.Element;
15
+ declare const CustomMenuList: ({ filterType, isLoading, isLoadingMore, isError, isEmpty, errors, showMore, handleShowMore, children, ...props }: MenuListComponentProps<SelectOption, true> & CustomProps) => JSX.Element;
14
16
  export default CustomMenuList;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generates Typescript types for analytics events from analytics.spec.yaml
5
5
  *
6
- * @codegen <<SignedSource::ea736210c3d6e0528843ce49cebf0610>>
6
+ * @codegen <<SignedSource::ddaee20abebe8b4891d75f243120dce8>>
7
7
  * @codegenCommand yarn workspace @atlassian/analytics-tooling run analytics:codegen link-datasource
8
8
  */
9
9
  export type PackageMetaDataType = {
@@ -85,6 +85,10 @@ export type LinkViewedCountAttributesType = {
85
85
  export type EmptyResultShownBasicSearchDropdownAttributesType = {
86
86
  filterType: 'project' | 'assignee' | 'issuetype' | 'status';
87
87
  };
88
+ export type ErrorShownBasicSearchDropdownAttributesType = {
89
+ filterType: 'project' | 'assignee' | 'issuetype' | 'status';
90
+ reason: 'agg' | 'network' | 'unknown';
91
+ };
88
92
  export type AqlEditorSearchedAttributesType = {};
89
93
  export type AnalyticsEventAttributes = {
90
94
  /**
@@ -138,6 +142,9 @@ export type AnalyticsEventAttributes = {
138
142
  /**
139
143
  * Fired when the basic filter search results are empty */
140
144
  'ui.emptyResult.shown.basicSearchDropdown': EmptyResultShownBasicSearchDropdownAttributesType;
145
+ /**
146
+ * Fired when the basic filter search dropdown shows an error UI */
147
+ 'ui.error.shown.basicSearchDropdown': ErrorShownBasicSearchDropdownAttributesType;
141
148
  /**
142
149
  * Fired when search is initiated via the search icon or enter key press for aql editor input field. */
143
150
  'ui.aqlEditor.searched': AqlEditorSearchedAttributesType;
@@ -1,5 +1,5 @@
1
1
  export declare const mapFetchErrors: (error: any) => Error;
2
- export declare const getStatusCodeGroup: (error: Error) => "1xx" | "3xx" | "4xx" | "5xx" | "unknown";
2
+ export declare const getStatusCodeGroup: (error: Error) => "unknown" | "1xx" | "3xx" | "4xx" | "5xx";
3
3
  export declare class PermissionError extends Error {
4
4
  constructor(message: string);
5
5
  }
@@ -13,6 +13,7 @@ export interface FilterOptionsState {
13
13
  totalCount: number;
14
14
  pageCursor?: string;
15
15
  status: 'empty' | 'loading' | 'resolved' | 'rejected' | 'loadingMore';
16
+ errors: unknown[];
16
17
  }
17
18
  export declare const useFilterOptions: ({ filterType, cloudId, }: FilterOptionsProps) => FilterOptionsState;
18
19
  export {};
@@ -1,3 +1,8 @@
1
1
  /// <reference types="react" />
2
- declare const CustomErrorMessage: () => JSX.Element;
2
+ import { FilterOptionsState } from '../../hooks/useFilterOptions';
3
+ import { BasicFilterFieldType } from '../../types';
4
+ declare const CustomErrorMessage: ({ filterType, errors, }: {
5
+ filterType: BasicFilterFieldType;
6
+ errors?: unknown[] | undefined;
7
+ }) => JSX.Element;
3
8
  export default CustomErrorMessage;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { MenuListComponentProps } from '@atlaskit/select';
3
+ import { FilterOptionsState } from '../../hooks/useFilterOptions';
3
4
  import { BasicFilterFieldType, SelectOption } from '../../types';
4
5
  type CustomProps = {
5
6
  isError?: boolean;
@@ -9,6 +10,7 @@ type CustomProps = {
9
10
  showMore?: boolean;
10
11
  handleShowMore: () => void;
11
12
  filterType: BasicFilterFieldType;
13
+ errors?: FilterOptionsState['errors'];
12
14
  };
13
- declare const CustomMenuList: ({ filterType, isLoading, isLoadingMore, isError, isEmpty, showMore, handleShowMore, children, ...props }: MenuListComponentProps<SelectOption, true> & CustomProps) => JSX.Element;
15
+ declare const CustomMenuList: ({ filterType, isLoading, isLoadingMore, isError, isEmpty, errors, showMore, handleShowMore, children, ...props }: MenuListComponentProps<SelectOption, true> & CustomProps) => JSX.Element;
14
16
  export default CustomMenuList;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "1.16.3",
3
+ "version": "1.16.5",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -33,7 +33,7 @@
33
33
  "@atlaskit/adf-schema": "^32.0.0",
34
34
  "@atlaskit/analytics-next": "^9.1.3",
35
35
  "@atlaskit/avatar": "^21.4.0",
36
- "@atlaskit/button": "^16.15.0",
36
+ "@atlaskit/button": "^16.16.0",
37
37
  "@atlaskit/editor-prosemirror": "1.1.0",
38
38
  "@atlaskit/empty-state": "^7.5.0",
39
39
  "@atlaskit/form": "^9.0.0",