@atlaskit/link-datasource 1.19.8 → 1.19.10

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 (45) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/analytics/constants.js +1 -1
  3. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/messages.js +14 -0
  4. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +34 -10
  5. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.js +24 -9
  6. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +1 -4
  7. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +3 -2
  8. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/index.js +1 -3
  9. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/menu-list/messages.js +3 -2
  10. package/dist/cjs/ui/jira-issues-modal/basic-filters/utils/extractValuesFromNonComplexJQL.js +11 -3
  11. package/dist/cjs/ui/jira-issues-modal/jira-search-container/index.js +27 -18
  12. package/dist/cjs/ui/jira-issues-modal/modal/index.js +4 -1
  13. package/dist/es2019/analytics/constants.js +1 -1
  14. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/messages.js +8 -0
  15. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +25 -4
  16. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.js +21 -3
  17. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +1 -3
  18. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +3 -2
  19. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/index.js +1 -3
  20. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/menu-list/messages.js +3 -2
  21. package/dist/es2019/ui/jira-issues-modal/basic-filters/utils/extractValuesFromNonComplexJQL.js +11 -1
  22. package/dist/es2019/ui/jira-issues-modal/jira-search-container/index.js +12 -6
  23. package/dist/es2019/ui/jira-issues-modal/modal/index.js +4 -1
  24. package/dist/esm/analytics/constants.js +1 -1
  25. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/messages.js +8 -0
  26. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +33 -9
  27. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.js +24 -9
  28. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +1 -4
  29. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +3 -2
  30. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/index.js +1 -3
  31. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/menu-list/messages.js +3 -2
  32. package/dist/esm/ui/jira-issues-modal/basic-filters/utils/extractValuesFromNonComplexJQL.js +11 -3
  33. package/dist/esm/ui/jira-issues-modal/jira-search-container/index.js +26 -17
  34. package/dist/esm/ui/jira-issues-modal/modal/index.js +4 -1
  35. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/messages.d.ts +7 -0
  36. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +3 -1
  37. package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.d.ts +1 -2
  38. package/dist/types/ui/jira-issues-modal/basic-filters/ui/index.d.ts +1 -2
  39. package/dist/types/ui/jira-issues-modal/jira-search-container/index.d.ts +1 -0
  40. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/messages.d.ts +7 -0
  41. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +3 -1
  42. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.d.ts +1 -2
  43. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/index.d.ts +1 -2
  44. package/dist/types-ts4.5/ui/jira-issues-modal/jira-search-container/index.d.ts +1 -0
  45. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.19.10
4
+
5
+ ### Patch Changes
6
+
7
+ - [#56769](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/56769) [`dccc142da2de`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/dccc142da2de) - Changing cloud ids with site selector resets previous JiraIssuesModal table results, basic search filters, and jql to default.
8
+ - [#57035](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/57035) [`63ab16a4d4a7`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/63ab16a4d4a7) - Update config modal logic to open in basic mode if the query is not complex.
9
+
10
+ ## 1.19.9
11
+
12
+ ### Patch Changes
13
+
14
+ - [#56564](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/56564) [`b26cc1ff959d`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b26cc1ff959d) - Add `Unassigned` option for Assignee filter dropdown.
15
+
3
16
  ## 1.19.8
4
17
 
5
18
  ### 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.19.8"
10
+ packageVersion: "1.19.10"
11
11
  };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.filterOptionMessages = void 0;
7
+ var _reactIntlNext = require("react-intl-next");
8
+ var filterOptionMessages = exports.filterOptionMessages = (0, _reactIntlNext.defineMessages)({
9
+ assigneeUnassignedFilterOption: {
10
+ id: 'linkDataSource.basic-filter.dropdown.select.assignee.unassigned',
11
+ description: 'Text to display for Unassigned assignee filter option.',
12
+ defaultMessage: 'Unassigned'
13
+ }
14
+ });
@@ -4,17 +4,28 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useFilterOptions = void 0;
7
+ exports.useFilterOptions = exports.getAssigneeUnassignedFilterOption = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
12
  var _react = require("react");
13
+ var _reactIntlNext = require("react-intl-next");
13
14
  var _useBasicFilterAGG2 = require("../../../../services/useBasicFilterAGG");
14
15
  var _transformers = require("../utils/transformers");
16
+ var _messages = require("./messages");
17
+ var getAssigneeUnassignedFilterOption = exports.getAssigneeUnassignedFilterOption = function getAssigneeUnassignedFilterOption(formatMessage) {
18
+ return {
19
+ label: formatMessage(_messages.filterOptionMessages.assigneeUnassignedFilterOption),
20
+ optionType: 'avatarLabel',
21
+ value: 'empty'
22
+ };
23
+ };
15
24
  var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref) {
16
25
  var filterType = _ref.filterType,
17
26
  cloudId = _ref.cloudId;
27
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
28
+ formatMessage = _useIntl.formatMessage;
18
29
  var _useState = (0, _react.useState)([]),
19
30
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
20
31
  filterOptions = _useState2[0],
@@ -46,6 +57,8 @@ var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref
46
57
  isRequestLikeInitialSearch,
47
58
  initialResponseData,
48
59
  response,
60
+ mappedResponse,
61
+ mappedTotalCount,
49
62
  _args = arguments;
50
63
  return _regenerator.default.wrap(function _callee$(_context) {
51
64
  while (1) switch (_context.prev = _context.next) {
@@ -84,34 +97,45 @@ var useFilterOptions = exports.useFilterOptions = function useFilterOptions(_ref
84
97
  setErrors(response.errors);
85
98
  return _context.abrupt("return");
86
99
  case 18:
100
+ mappedResponse = (0, _transformers.mapFieldValuesToFilterOptions)(response);
101
+ mappedTotalCount = (0, _transformers.mapFieldValuesToTotalCount)(response);
87
102
  if (isNewSearch) {
88
- setFilterOptions((0, _transformers.mapFieldValuesToFilterOptions)(response));
89
103
  if (isRequestLikeInitialSearch) {
90
104
  /**
91
105
  * The initial dataset is used in couple of paths, eg: when a user searches and clears the search text.
92
106
  * During these times, we dont want to fetch data again and again, hence a mini cache setup to store and provide the initial dataset
93
107
  */
94
108
  initialData.current = response;
109
+
110
+ /**
111
+ * For assignee filter option, we want `Unassigned` as an option.
112
+ * Since `Unassigned/EMPTY` is not returned by the API, we add it manually, but only for the initial list
113
+ */
114
+ if (filterType === 'assignee') {
115
+ mappedResponse.unshift(getAssigneeUnassignedFilterOption(formatMessage));
116
+ mappedTotalCount += 1;
117
+ }
95
118
  }
119
+ setFilterOptions(mappedResponse);
96
120
  } else {
97
- setFilterOptions([].concat((0, _toConsumableArray2.default)(filterOptions), (0, _toConsumableArray2.default)((0, _transformers.mapFieldValuesToFilterOptions)(response))));
121
+ setFilterOptions([].concat((0, _toConsumableArray2.default)(filterOptions), (0, _toConsumableArray2.default)(mappedResponse)));
98
122
  }
99
- setTotalCount((0, _transformers.mapFieldValuesToTotalCount)(response));
123
+ setTotalCount(mappedTotalCount);
100
124
  setNextPageCursor((0, _transformers.mapFieldValuesToPageCursor)(response));
101
125
  setStatus('resolved');
102
- _context.next = 28;
126
+ _context.next = 30;
103
127
  break;
104
- case 24:
105
- _context.prev = 24;
128
+ case 26:
129
+ _context.prev = 26;
106
130
  _context.t1 = _context["catch"](5);
107
131
  setStatus('rejected');
108
132
  setErrors([_context.t1]);
109
- case 28:
133
+ case 30:
110
134
  case "end":
111
135
  return _context.stop();
112
136
  }
113
- }, _callee, null, [[5, 24]]);
114
- })), [cloudId, filterOptions, filterType, getFieldValues]);
137
+ }, _callee, null, [[5, 26]]);
138
+ })), [cloudId, filterOptions, filterType, formatMessage, getFieldValues]);
115
139
  (0, _react.useEffect)(function () {
116
140
  if (status !== 'rejected' && errors.length !== 0) {
117
141
  setErrors([]);
@@ -6,14 +6,20 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.useHydrateJqlQuery = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
13
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
14
  var _react = require("react");
15
+ var _reactIntlNext = require("react-intl-next");
16
+ var _jqlAst = require("@atlaskit/jql-ast");
13
17
  var _useBasicFilterAGG2 = require("../../../../services/useBasicFilterAGG");
14
18
  var _extractValuesFromNonComplexJQL = require("../utils/extractValuesFromNonComplexJQL");
15
19
  var _isClauseTooComplex = require("../utils/isClauseTooComplex");
16
20
  var _transformers = require("../utils/transformers");
21
+ var _useFilterOptions = require("./useFilterOptions");
22
+ var _excluded = ["assignee"];
17
23
  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
24
  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; }
19
25
  var useHydrateJqlQuery = exports.useHydrateJqlQuery = function useHydrateJqlQuery(cloudId, jql) {
@@ -21,6 +27,8 @@ var useHydrateJqlQuery = exports.useHydrateJqlQuery = function useHydrateJqlQuer
21
27
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
22
28
  hydratedOptions = _useState2[0],
23
29
  setHydratedOptions = _useState2[1];
30
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
31
+ formatMessage = _useIntl.formatMessage;
24
32
  var _useState3 = (0, _react.useState)('empty'),
25
33
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
26
34
  status = _useState4[0],
@@ -32,7 +40,7 @@ var useHydrateJqlQuery = exports.useHydrateJqlQuery = function useHydrateJqlQuer
32
40
  var _useBasicFilterAGG = (0, _useBasicFilterAGG2.useBasicFilterAGG)(),
33
41
  getHydratedJQL = _useBasicFilterAGG.getHydratedJQL;
34
42
  var fetchHydratedJqlOptions = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
35
- var response, _extractValuesFromNon, text, summary, key, _ref2, _ref3, textFieldValue, mappedValues;
43
+ var response, _mapHydrateResponseDa, mappedHydratedAssigneeValue, restOfMappedHydratedResponse, _extractValuesFromNon, text, summary, key, extractedAssigneeValue, _ref2, _ref3, textFieldValue, mappedValues;
36
44
  return _regenerator.default.wrap(function _callee$(_context) {
37
45
  while (1) switch (_context.prev = _context.next) {
38
46
  case 0:
@@ -50,29 +58,36 @@ var useHydrateJqlQuery = exports.useHydrateJqlQuery = function useHydrateJqlQuer
50
58
  setErrors(response.errors);
51
59
  return _context.abrupt("return");
52
60
  case 9:
61
+ _mapHydrateResponseDa = (0, _transformers.mapHydrateResponseData)(response), mappedHydratedAssigneeValue = _mapHydrateResponseDa.assignee, restOfMappedHydratedResponse = (0, _objectWithoutProperties2.default)(_mapHydrateResponseDa, _excluded);
53
62
  /**
54
63
  * Hydrate logic does not return text field, hence we parse and extract value from jql
55
64
  */
56
- _extractValuesFromNon = (0, _extractValuesFromNonComplexJQL.extractValuesFromNonComplexJQL)(jql), text = _extractValuesFromNon.text, summary = _extractValuesFromNon.summary, key = _extractValuesFromNon.key;
65
+ _extractValuesFromNon = (0, _extractValuesFromNonComplexJQL.extractValuesFromNonComplexJQL)(jql), text = _extractValuesFromNon.text, summary = _extractValuesFromNon.summary, key = _extractValuesFromNon.key, extractedAssigneeValue = _extractValuesFromNon.assignee;
57
66
  _ref2 = text || summary || key || [], _ref3 = (0, _slicedToArray2.default)(_ref2, 1), textFieldValue = _ref3[0];
58
- mappedValues = _objectSpread(_objectSpread({}, (0, _transformers.mapHydrateResponseData)(response)), textFieldValue ? {
67
+ mappedValues = _objectSpread(_objectSpread({}, restOfMappedHydratedResponse), {}, {
68
+ /**
69
+ * Special handling for assignee as we need to inject Unassigned value if JQL contains EMPTY keyword for assignee
70
+ */
71
+ assignee: [].concat((0, _toConsumableArray2.default)(mappedHydratedAssigneeValue || []), (0, _toConsumableArray2.default)(extractedAssigneeValue !== null && extractedAssigneeValue !== void 0 && extractedAssigneeValue.includes(_jqlAst.OPERAND_EMPTY) // checks and adds EMPTY filter option if extracted assignee values from jql contains EMPTY
72
+ ? [(0, _useFilterOptions.getAssigneeUnassignedFilterOption)(formatMessage)] : []))
73
+ }, textFieldValue ? {
59
74
  basicInputTextValue: (0, _isClauseTooComplex.removeFuzzyCharacter)(textFieldValue)
60
75
  } : {});
61
76
  setHydratedOptions(mappedValues);
62
77
  setStatus('resolved');
63
- _context.next = 20;
78
+ _context.next = 21;
64
79
  break;
65
- case 16:
66
- _context.prev = 16;
80
+ case 17:
81
+ _context.prev = 17;
67
82
  _context.t0 = _context["catch"](0);
68
83
  setErrors([_context.t0]);
69
84
  setStatus('rejected');
70
- case 20:
85
+ case 21:
71
86
  case "end":
72
87
  return _context.stop();
73
88
  }
74
- }, _callee, null, [[0, 16]]);
75
- })), [cloudId, getHydratedJQL, jql]);
89
+ }, _callee, null, [[0, 17]]);
90
+ })), [cloudId, formatMessage, getHydratedJQL, jql]);
76
91
  (0, _react.useEffect)(function () {
77
92
  if (status !== 'rejected' && errors.length !== 0) {
78
93
  setErrors([]);
@@ -41,8 +41,6 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
41
41
  isJQLHydrating = _ref.isJQLHydrating,
42
42
  _ref$onSelectionChang = _ref.onSelectionChange,
43
43
  onSelectionChange = _ref$onSelectionChang === void 0 ? function () {} : _ref$onSelectionChang,
44
- _ref$onReset = _ref.onReset,
45
- resetSelection = _ref$onReset === void 0 ? function () {} : _ref$onReset,
46
44
  _ref$isDisabled = _ref.isDisabled,
47
45
  isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled;
48
46
  var _useIntl = (0, _reactIntlNext.useIntl)(),
@@ -192,9 +190,8 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
192
190
  setSortedOptions([]);
193
191
  setSearchTerm('');
194
192
  resetHook();
195
- resetSelection();
196
193
  }
197
- }, [cloudId, resetHook, resetSelection]);
194
+ }, [cloudId, resetHook]);
198
195
  (0, _react.useEffect)(function () {
199
196
  if (!(0, _isEqual.default)(selection, selectedOptions)) {
200
197
  setSelectedOptions(selection);
@@ -4,7 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.asyncPopupSelectMessages = void 0;
7
- var asyncPopupSelectMessages = exports.asyncPopupSelectMessages = {
7
+ var _reactIntlNext = require("react-intl-next");
8
+ var asyncPopupSelectMessages = exports.asyncPopupSelectMessages = (0, _reactIntlNext.defineMessages)({
8
9
  selectPlaceholder: {
9
10
  id: 'linkDataSource.basic-filter.dropdown.select.placeholder',
10
11
  description: 'Placeholder text to be displayed for the search input box.',
@@ -40,4 +41,4 @@ var asyncPopupSelectMessages = exports.asyncPopupSelectMessages = {
40
41
  defaultMessage: 'Show more',
41
42
  description: 'The text to show more options in dropdown'
42
43
  }
43
- };
44
+ });
@@ -16,7 +16,6 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
16
16
  var cloudId = _ref.cloudId,
17
17
  onChange = _ref.onChange,
18
18
  selections = _ref.selections,
19
- onReset = _ref.onReset,
20
19
  isJQLHydrating = _ref.isJQLHydrating;
21
20
  return /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
22
21
  xcss: basicFilterContainerStyles,
@@ -30,8 +29,7 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
30
29
  selection: selections[filter] || [],
31
30
  isJQLHydrating: isJQLHydrating,
32
31
  isDisabled: !cloudId,
33
- onSelectionChange: onChange,
34
- onReset: onReset
32
+ onSelectionChange: onChange
35
33
  });
36
34
  }));
37
35
  };
@@ -4,7 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.asyncPopupSelectMessages = void 0;
7
- var asyncPopupSelectMessages = exports.asyncPopupSelectMessages = {
7
+ var _reactIntlNext = require("react-intl-next");
8
+ var asyncPopupSelectMessages = exports.asyncPopupSelectMessages = (0, _reactIntlNext.defineMessages)({
8
9
  loadingMessage: {
9
10
  id: 'linkDataSource.basic-filter.loading-message',
10
11
  defaultMessage: 'Loading...',
@@ -20,4 +21,4 @@ var asyncPopupSelectMessages = exports.asyncPopupSelectMessages = {
20
21
  defaultMessage: 'Something went wrong',
21
22
  description: 'The text for when an error occurs when loading options'
22
23
  }
23
- };
24
+ });
@@ -20,11 +20,19 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
20
20
  // Map of field keys to their respective clauses in the Jast
21
21
 
22
22
  var getFieldValues = function getFieldValues(operand) {
23
+ var mapValuesFromList = function mapValuesFromList(value) {
24
+ if (value.operandType === _jqlAst.OPERAND_TYPE_VALUE) {
25
+ return value.value;
26
+ }
27
+ // we only support EMPTY keyword atm, hence making sure if operandType is a KEYWORD, then its an EMPTY keyword
28
+ if (value.operandType === _jqlAst.OPERAND_TYPE_KEYWORD && value.value === _jqlAst.OPERAND_EMPTY) {
29
+ return value.value;
30
+ }
31
+ return undefined;
32
+ };
23
33
  switch (operand.operandType) {
24
34
  case _jqlAst.OPERAND_TYPE_LIST:
25
- return operand.values.map(function (value) {
26
- return value.operandType === _jqlAst.OPERAND_TYPE_VALUE && value.value || undefined;
27
- }).filter(function (value) {
35
+ return operand.values.map(mapValuesFromList).filter(function (value) {
28
36
  return !!value;
29
37
  });
30
38
  case _jqlAst.OPERAND_TYPE_VALUE:
@@ -5,7 +5,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.JiraSearchContainer = exports.ALLOWED_ORDER_BY_KEYS = void 0;
8
+ exports.JiraSearchContainer = exports.DEFAULT_JQL_QUERY = exports.ALLOWED_ORDER_BY_KEYS = void 0;
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
@@ -39,7 +39,7 @@ var inputContainerStyles = (0, _react2.css)({
39
39
  var basicSearchInputContainerStyles = (0, _primitives.xcss)({
40
40
  flexGrow: 1
41
41
  });
42
- var DEFAULT_JQL_QUERY = 'created >= -30d order by created DESC';
42
+ var DEFAULT_JQL_QUERY = exports.DEFAULT_JQL_QUERY = 'created >= -30d order by created DESC';
43
43
  var ALLOWED_ORDER_BY_KEYS = exports.ALLOWED_ORDER_BY_KEYS = ['key', 'summary', 'assignee', 'status', 'created'];
44
44
  var JiraSearchMethodSwitcher = _modeSwitcher.ModeSwitcher;
45
45
  var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchContainer(props) {
@@ -49,7 +49,7 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
49
49
  onSearchMethodChangeCallback = props.onSearchMethodChange,
50
50
  initialSearchMethod = props.initialSearchMethod;
51
51
  var _ref = parameters || {},
52
- cloudId = _ref.cloudId,
52
+ currentCloudId = _ref.cloudId,
53
53
  initialJql = _ref.jql;
54
54
  var _useIntl = (0, _reactIntlNext.useIntl)(),
55
55
  formatMessage = _useIntl.formatMessage;
@@ -67,22 +67,26 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
67
67
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
68
68
  jql = _useState6[0],
69
69
  setJql = _useState6[1];
70
- var _useState7 = (0, _react.useState)(false),
70
+ var _useState7 = (0, _react.useState)(currentCloudId),
71
71
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
72
- isComplexQuery = _useState8[0],
73
- setIsComplexQuery = _useState8[1];
74
- var _useState9 = (0, _react.useState)(),
72
+ cloudId = _useState8[0],
73
+ setCloudId = _useState8[1];
74
+ var _useState9 = (0, _react.useState)(false),
75
75
  _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
76
- orderKey = _useState10[0],
77
- setOrderKey = _useState10[1];
76
+ isComplexQuery = _useState10[0],
77
+ setIsComplexQuery = _useState10[1];
78
78
  var _useState11 = (0, _react.useState)(),
79
79
  _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
80
- orderDirection = _useState12[0],
81
- setOrderDirection = _useState12[1];
82
- var _useState13 = (0, _react.useState)({}),
80
+ orderKey = _useState12[0],
81
+ setOrderKey = _useState12[1];
82
+ var _useState13 = (0, _react.useState)(),
83
83
  _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
84
- filterSelections = _useState14[0],
85
- setFilterSelections = _useState14[1];
84
+ orderDirection = _useState14[0],
85
+ setOrderDirection = _useState14[1];
86
+ var _useState15 = (0, _react.useState)({}),
87
+ _useState16 = (0, _slicedToArray2.default)(_useState15, 2),
88
+ filterSelections = _useState16[0],
89
+ setFilterSelections = _useState16[1];
86
90
  var showBasicFilters = (0, _react.useMemo)(function () {
87
91
  if ((0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.datasource.show-jlol-basic-filters')) {
88
92
  return true;
@@ -191,11 +195,17 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
191
195
  setFilterSelections(updatedSelection);
192
196
  handleBasicFilterSelectionChange(updatedSelection);
193
197
  }, [handleBasicFilterSelectionChange, filterSelections]);
194
- var handleBasicFiltersReset = (0, _react.useCallback)(function () {
195
- if (Object.keys(filterSelections).length > 0) {
198
+ (0, _react.useEffect)(function () {
199
+ if (currentCloudId !== cloudId) {
200
+ setBasicSearchTerm('');
201
+ setJql(DEFAULT_JQL_QUERY);
202
+ setIsComplexQuery(false);
203
+ setOrderKey(undefined);
204
+ setOrderDirection(undefined);
196
205
  setFilterSelections({});
206
+ setCloudId(currentCloudId);
197
207
  }
198
- }, [filterSelections]);
208
+ }, [currentCloudId, cloudId]);
199
209
  return (0, _react2.jsx)("div", {
200
210
  css: inputContainerStyles,
201
211
  "data-testid": "jira-search-container"
@@ -211,7 +221,6 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
211
221
  cloudId: cloudId || '',
212
222
  onChange: handleSelectionChange,
213
223
  selections: filterSelections,
214
- onReset: handleBasicFiltersReset,
215
224
  isJQLHydrating: basicFilterHydrationStatus === 'loading'
216
225
  })), currentSearchMethod === 'jql' && (0, _react2.jsx)(_jqlEditor.JiraJQLEditor, {
217
226
  cloudId: cloudId || '',
@@ -19,6 +19,7 @@ var _uuid = require("uuid");
19
19
  var _analyticsNext = require("@atlaskit/analytics-next");
20
20
  var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
21
21
  var _modalDialog = _interopRequireWildcard(require("@atlaskit/modal-dialog"));
22
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
22
23
  var _linkUrl = _interopRequireDefault(require("@atlaskit/smart-card/link-url"));
23
24
  var _colors = require("@atlaskit/theme/colors");
24
25
  var _analytics = require("../../../analytics");
@@ -37,6 +38,7 @@ var _noResults = require("../../common/error-state/no-results");
37
38
  var _issueLikeTable = require("../../issue-like-table");
38
39
  var _link = _interopRequireDefault(require("../../issue-like-table/render-type/link"));
39
40
  var _ui = require("../basic-filters/ui");
41
+ var _isQueryTooComplex = require("../basic-filters/utils/isQueryTooComplex");
40
42
  var _initialStateView = require("../initial-state-view");
41
43
  var _jiraSearchContainer = require("../jira-search-container");
42
44
  var _modeSwitcher = require("../mode-switcher");
@@ -138,7 +140,7 @@ var PlainJiraIssuesConfigModal = exports.PlainJiraIssuesConfigModal = function P
138
140
  // analytics related parameters
139
141
  var searchCount = (0, _react.useRef)(0);
140
142
  var userInteractionActions = (0, _react.useRef)(new Set());
141
- var initialSearchMethod = 'jql'; // TODO EDM-7688 This where we can add feature that decides if it's basic or jql based on JQL content (Regexp)
143
+ var initialSearchMethod = (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.datasource.show-jlol-basic-filters') && !(0, _isQueryTooComplex.isQueryTooComplex)((initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql) || '') ? 'basic' : 'jql';
142
144
  var _useState11 = (0, _react.useState)(initialSearchMethod),
143
145
  _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
144
146
  currentSearchMethod = _useState12[0],
@@ -340,6 +342,7 @@ var PlainJiraIssuesConfigModal = exports.PlainJiraIssuesConfigModal = function P
340
342
  }, [analyticsPayload, onCancel]);
341
343
  var onSiteSelection = (0, _react.useCallback)(function (site) {
342
344
  userInteractionActions.current.add(_types.DatasourceAction.INSTANCE_UPDATED);
345
+ setJql('');
343
346
  setCloudId(site.cloudId);
344
347
  reset({
345
348
  shouldForceRequest: true
@@ -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.19.8"
4
+ packageVersion: "1.19.10"
5
5
  };
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const filterOptionMessages = defineMessages({
3
+ assigneeUnassignedFilterOption: {
4
+ id: 'linkDataSource.basic-filter.dropdown.select.assignee.unassigned',
5
+ description: 'Text to display for Unassigned assignee filter option.',
6
+ defaultMessage: 'Unassigned'
7
+ }
8
+ });
@@ -1,10 +1,20 @@
1
1
  import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { useIntl } from 'react-intl-next';
2
3
  import { useBasicFilterAGG } from '../../../../services/useBasicFilterAGG';
3
4
  import { mapFieldValuesToFilterOptions, mapFieldValuesToPageCursor, mapFieldValuesToTotalCount } from '../utils/transformers';
5
+ import { filterOptionMessages } from './messages';
6
+ export const getAssigneeUnassignedFilterOption = formatMessage => ({
7
+ label: formatMessage(filterOptionMessages.assigneeUnassignedFilterOption),
8
+ optionType: 'avatarLabel',
9
+ value: 'empty'
10
+ });
4
11
  export const useFilterOptions = ({
5
12
  filterType,
6
13
  cloudId
7
14
  }) => {
15
+ const {
16
+ formatMessage
17
+ } = useIntl();
8
18
  const [filterOptions, setFilterOptions] = useState([]);
9
19
  const [totalCount, setTotalCount] = useState(0);
10
20
  const [status, setStatus] = useState('empty');
@@ -37,26 +47,37 @@ export const useFilterOptions = ({
37
47
  setErrors(response.errors);
38
48
  return;
39
49
  }
50
+ const mappedResponse = mapFieldValuesToFilterOptions(response);
51
+ let mappedTotalCount = mapFieldValuesToTotalCount(response);
40
52
  if (isNewSearch) {
41
- setFilterOptions(mapFieldValuesToFilterOptions(response));
42
53
  if (isRequestLikeInitialSearch) {
43
54
  /**
44
55
  * The initial dataset is used in couple of paths, eg: when a user searches and clears the search text.
45
56
  * During these times, we dont want to fetch data again and again, hence a mini cache setup to store and provide the initial dataset
46
57
  */
47
58
  initialData.current = response;
59
+
60
+ /**
61
+ * For assignee filter option, we want `Unassigned` as an option.
62
+ * Since `Unassigned/EMPTY` is not returned by the API, we add it manually, but only for the initial list
63
+ */
64
+ if (filterType === 'assignee') {
65
+ mappedResponse.unshift(getAssigneeUnassignedFilterOption(formatMessage));
66
+ mappedTotalCount += 1;
67
+ }
48
68
  }
69
+ setFilterOptions(mappedResponse);
49
70
  } else {
50
- setFilterOptions([...filterOptions, ...mapFieldValuesToFilterOptions(response)]);
71
+ setFilterOptions([...filterOptions, ...mappedResponse]);
51
72
  }
52
- setTotalCount(mapFieldValuesToTotalCount(response));
73
+ setTotalCount(mappedTotalCount);
53
74
  setNextPageCursor(mapFieldValuesToPageCursor(response));
54
75
  setStatus('resolved');
55
76
  } catch (error) {
56
77
  setStatus('rejected');
57
78
  setErrors([error]);
58
79
  }
59
- }, [cloudId, filterOptions, filterType, getFieldValues]);
80
+ }, [cloudId, filterOptions, filterType, formatMessage, getFieldValues]);
60
81
  useEffect(() => {
61
82
  if (status !== 'rejected' && errors.length !== 0) {
62
83
  setErrors([]);
@@ -1,10 +1,16 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { OPERAND_EMPTY } from '@atlaskit/jql-ast';
2
4
  import { useBasicFilterAGG } from '../../../../services/useBasicFilterAGG';
3
5
  import { extractValuesFromNonComplexJQL } from '../utils/extractValuesFromNonComplexJQL';
4
6
  import { removeFuzzyCharacter } from '../utils/isClauseTooComplex';
5
7
  import { mapHydrateResponseData } from '../utils/transformers';
8
+ import { getAssigneeUnassignedFilterOption } from './useFilterOptions';
6
9
  export const useHydrateJqlQuery = (cloudId, jql) => {
7
10
  const [hydratedOptions, setHydratedOptions] = useState({});
11
+ const {
12
+ formatMessage
13
+ } = useIntl();
8
14
  const [status, setStatus] = useState('empty');
9
15
  const [errors, setErrors] = useState([]);
10
16
  const {
@@ -19,6 +25,10 @@ export const useHydrateJqlQuery = (cloudId, jql) => {
19
25
  setErrors(response.errors);
20
26
  return;
21
27
  }
28
+ const {
29
+ assignee: mappedHydratedAssigneeValue,
30
+ ...restOfMappedHydratedResponse
31
+ } = mapHydrateResponseData(response);
22
32
 
23
33
  /**
24
34
  * Hydrate logic does not return text field, hence we parse and extract value from jql
@@ -26,11 +36,19 @@ export const useHydrateJqlQuery = (cloudId, jql) => {
26
36
  const {
27
37
  text,
28
38
  summary,
29
- key
39
+ key,
40
+ assignee: extractedAssigneeValue
30
41
  } = extractValuesFromNonComplexJQL(jql);
31
42
  const [textFieldValue] = text || summary || key || [];
32
43
  const mappedValues = {
33
- ...mapHydrateResponseData(response),
44
+ ...restOfMappedHydratedResponse,
45
+ /**
46
+ * Special handling for assignee as we need to inject Unassigned value if JQL contains EMPTY keyword for assignee
47
+ */
48
+ assignee: [...(mappedHydratedAssigneeValue || []),
49
+ // all values provided by the hydrate API for assignee
50
+ ...(extractedAssigneeValue !== null && extractedAssigneeValue !== void 0 && extractedAssigneeValue.includes(OPERAND_EMPTY) // checks and adds EMPTY filter option if extracted assignee values from jql contains EMPTY
51
+ ? [getAssigneeUnassignedFilterOption(formatMessage)] : [])],
34
52
  ...(textFieldValue ? {
35
53
  basicInputTextValue: removeFuzzyCharacter(textFieldValue)
36
54
  } : {})
@@ -41,7 +59,7 @@ export const useHydrateJqlQuery = (cloudId, jql) => {
41
59
  setErrors([error]);
42
60
  setStatus('rejected');
43
61
  }
44
- }, [cloudId, getHydratedJQL, jql]);
62
+ }, [cloudId, formatMessage, getHydratedJQL, jql]);
45
63
  useEffect(() => {
46
64
  if (status !== 'rejected' && errors.length !== 0) {
47
65
  setErrors([]);
@@ -22,7 +22,6 @@ const AsyncPopupSelect = ({
22
22
  selection,
23
23
  isJQLHydrating,
24
24
  onSelectionChange = () => {},
25
- onReset: resetSelection = () => {},
26
25
  isDisabled = false
27
26
  }) => {
28
27
  const {
@@ -143,9 +142,8 @@ const AsyncPopupSelect = ({
143
142
  setSortedOptions([]);
144
143
  setSearchTerm('');
145
144
  resetHook();
146
- resetSelection();
147
145
  }
148
- }, [cloudId, resetHook, resetSelection]);
146
+ }, [cloudId, resetHook]);
149
147
  useEffect(() => {
150
148
  if (!isEqual(selection, selectedOptions)) {
151
149
  setSelectedOptions(selection);
@@ -1,4 +1,5 @@
1
- export const asyncPopupSelectMessages = {
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const asyncPopupSelectMessages = defineMessages({
2
3
  selectPlaceholder: {
3
4
  id: 'linkDataSource.basic-filter.dropdown.select.placeholder',
4
5
  description: 'Placeholder text to be displayed for the search input box.',
@@ -34,4 +35,4 @@ export const asyncPopupSelectMessages = {
34
35
  defaultMessage: 'Show more',
35
36
  description: 'The text to show more options in dropdown'
36
37
  }
37
- };
38
+ });
@@ -9,7 +9,6 @@ const BasicFilterContainer = ({
9
9
  cloudId,
10
10
  onChange,
11
11
  selections,
12
- onReset,
13
12
  isJQLHydrating
14
13
  }) => {
15
14
  return /*#__PURE__*/React.createElement(Flex, {
@@ -24,8 +23,7 @@ const BasicFilterContainer = ({
24
23
  selection: selections[filter] || [],
25
24
  isJQLHydrating: isJQLHydrating,
26
25
  isDisabled: !cloudId,
27
- onSelectionChange: onChange,
28
- onReset: onReset
26
+ onSelectionChange: onChange
29
27
  });
30
28
  }));
31
29
  };