@atlaskit/link-datasource 1.26.1 → 1.26.3

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 (117) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/ui/common/modal/basic-search-input/index.js +9 -18
  3. package/dist/cjs/ui/common/modal/popup-select/index.js +217 -0
  4. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
  5. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
  6. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
  7. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
  8. package/dist/cjs/ui/common/modal/popup-select/menu-list/showMoreButton.js +36 -0
  9. package/dist/cjs/ui/common/modal/popup-select/messages.js +19 -0
  10. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +12 -13
  11. package/dist/cjs/ui/common/modal/popup-select/types.js +5 -0
  12. package/dist/cjs/ui/confluence-search-modal/basic-filters/index.js +22 -0
  13. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +18 -3
  14. package/dist/cjs/ui/confluence-search-modal/modal/index.js +11 -2
  15. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +27 -163
  16. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
  17. package/dist/cjs/ui/jira-issues-modal/jira-search-container/index.js +2 -1
  18. package/dist/es2019/ui/common/modal/basic-search-input/index.js +2 -10
  19. package/dist/es2019/ui/common/modal/popup-select/index.js +170 -0
  20. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
  21. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
  22. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
  23. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
  24. package/dist/es2019/ui/common/modal/popup-select/menu-list/showMoreButton.js +29 -0
  25. package/dist/es2019/ui/common/modal/popup-select/messages.js +13 -0
  26. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +10 -11
  27. package/dist/es2019/ui/common/modal/popup-select/types.js +1 -0
  28. package/dist/es2019/ui/confluence-search-modal/basic-filters/index.js +13 -0
  29. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +19 -4
  30. package/dist/es2019/ui/confluence-search-modal/modal/index.js +12 -2
  31. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +25 -145
  32. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
  33. package/dist/es2019/ui/jira-issues-modal/jira-search-container/index.js +2 -1
  34. package/dist/esm/ui/common/modal/basic-search-input/index.js +2 -10
  35. package/dist/esm/ui/common/modal/popup-select/index.js +207 -0
  36. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
  37. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
  38. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
  39. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
  40. package/dist/esm/ui/common/modal/popup-select/menu-list/showMoreButton.js +26 -0
  41. package/dist/esm/ui/common/modal/popup-select/messages.js +13 -0
  42. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +12 -13
  43. package/dist/esm/ui/common/modal/popup-select/types.js +1 -0
  44. package/dist/esm/ui/confluence-search-modal/basic-filters/index.js +15 -0
  45. package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +19 -4
  46. package/dist/esm/ui/confluence-search-modal/modal/index.js +12 -3
  47. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +27 -163
  48. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
  49. package/dist/esm/ui/jira-issues-modal/jira-search-container/index.js +2 -1
  50. package/dist/types/analytics/generated/analytics.types.d.ts +6 -6
  51. package/dist/types/ui/common/modal/basic-search-input/index.d.ts +1 -0
  52. package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.d.ts +1 -1
  53. package/dist/{types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select → types/ui/common/modal/popup-select}/dropdownIndicator.d.ts +1 -1
  54. package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.d.ts +1 -1
  55. package/dist/types/ui/common/modal/popup-select/index.d.ts +21 -0
  56. package/dist/types/ui/common/modal/popup-select/menu-list/errorMessage.d.ts +6 -0
  57. package/dist/types/ui/common/modal/popup-select/menu-list/index.d.ts +15 -0
  58. package/dist/{types-ts4.5/ui/jira-issues-modal/basic-filters/ui → types/ui/common/modal/popup-select}/menu-list/messages.d.ts +5 -0
  59. package/dist/types/ui/common/modal/popup-select/menu-list/noOptionsMessage.d.ts +5 -0
  60. package/dist/{types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select → types/ui/common/modal/popup-select/menu-list}/showMoreButton.d.ts +2 -1
  61. package/dist/types/ui/common/modal/popup-select/messages.d.ts +12 -0
  62. package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.d.ts +3 -2
  63. package/dist/types/ui/common/modal/popup-select/types.d.ts +22 -0
  64. package/dist/types/ui/confluence-search-modal/basic-filters/index.d.ts +5 -0
  65. package/dist/types/ui/jira-issues-modal/basic-filters/types.d.ts +0 -2
  66. package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.d.ts +0 -15
  67. package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +6 -6
  68. package/dist/types-ts4.5/ui/common/modal/basic-search-input/index.d.ts +1 -0
  69. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.d.ts +1 -1
  70. package/dist/{types/ui/jira-issues-modal/basic-filters/ui/async-popup-select → types-ts4.5/ui/common/modal/popup-select}/dropdownIndicator.d.ts +1 -1
  71. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.d.ts +1 -1
  72. package/dist/types-ts4.5/ui/common/modal/popup-select/index.d.ts +21 -0
  73. package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/errorMessage.d.ts +6 -0
  74. package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/index.d.ts +15 -0
  75. package/dist/{types/ui/jira-issues-modal/basic-filters/ui → types-ts4.5/ui/common/modal/popup-select}/menu-list/messages.d.ts +5 -0
  76. package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/noOptionsMessage.d.ts +5 -0
  77. package/dist/{types/ui/jira-issues-modal/basic-filters/ui/async-popup-select → types-ts4.5/ui/common/modal/popup-select/menu-list}/showMoreButton.d.ts +2 -1
  78. package/dist/types-ts4.5/ui/common/modal/popup-select/messages.d.ts +12 -0
  79. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.d.ts +3 -2
  80. package/dist/types-ts4.5/ui/common/modal/popup-select/types.d.ts +22 -0
  81. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/index.d.ts +5 -0
  82. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/types.d.ts +0 -2
  83. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.d.ts +0 -15
  84. package/package.json +6 -3
  85. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -22
  86. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -17
  87. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -15
  88. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +0 -8
  89. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +0 -5
  90. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/noOptionsMessage.d.ts +0 -6
  91. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +0 -8
  92. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +0 -5
  93. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/noOptionsMessage.d.ts +0 -6
  94. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
  95. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
  96. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
  97. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
  98. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
  99. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
  100. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
  101. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
  102. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
  103. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
  104. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
  105. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
  106. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
  107. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
  108. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
  109. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
  110. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
  111. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
  112. /package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.d.ts +0 -0
  113. /package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.d.ts +0 -0
  114. /package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.d.ts +0 -0
  115. /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.d.ts +0 -0
  116. /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.d.ts +0 -0
  117. /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.d.ts +0 -0
@@ -0,0 +1,29 @@
1
+ import React, { useCallback } from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import Button from '@atlaskit/button';
4
+ import { useDatasourceAnalyticsEvents } from '../../../../../analytics';
5
+ import { asyncPopupSelectMessages } from './messages';
6
+ const ShowMoreButton = ({
7
+ onShowMore,
8
+ filterName
9
+ }) => {
10
+ const {
11
+ formatMessage
12
+ } = useIntl();
13
+ const {
14
+ fireEvent
15
+ } = useDatasourceAnalyticsEvents();
16
+ const handleShowMore = useCallback(() => {
17
+ fireEvent('ui.button.clicked.basicSearchDropdown', {
18
+ filterName,
19
+ type: 'showMore'
20
+ });
21
+ onShowMore();
22
+ }, [filterName, fireEvent, onShowMore]);
23
+ return /*#__PURE__*/React.createElement(Button, {
24
+ onClick: handleShowMore,
25
+ appearance: "link",
26
+ testId: "jlol-basic-filter-popup-select--show-more-button"
27
+ }, formatMessage(asyncPopupSelectMessages.showMoreMessage));
28
+ };
29
+ export default ShowMoreButton;
@@ -0,0 +1,13 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const asyncPopupSelectMessages = defineMessages({
3
+ selectPlaceholder: {
4
+ id: 'linkDataSource.basic-filter.dropdown.select.placeholder',
5
+ description: 'Placeholder text to be displayed for the search input box.',
6
+ defaultMessage: 'Search'
7
+ },
8
+ paginationDetails: {
9
+ id: 'linkDataSource.basic-filter.footer.pagination-details',
10
+ description: 'Text to indicate page count and total count information.',
11
+ defaultMessage: '{currentDisplayCount} of {totalCount}'
12
+ }
13
+ });
@@ -1,12 +1,10 @@
1
1
  import React, { forwardRef, useCallback } from 'react';
2
2
  import styled from '@emotion/styled';
3
- import { FormattedMessage } from 'react-intl-next';
4
3
  import Badge from '@atlaskit/badge';
5
4
  import Button from '@atlaskit/button/standard-button';
6
5
  import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
7
6
  import { Box, Flex, xcss } from '@atlaskit/primitives';
8
7
  import Spinner from '@atlaskit/spinner';
9
- import { asyncPopupSelectMessages } from './messages';
10
8
  const triggerButtonLabelStyles = xcss({
11
9
  textOverflow: 'ellipsis',
12
10
  overflow: 'hidden',
@@ -31,22 +29,23 @@ export const LoadingStateAnimationWrapper = styled.div({
31
29
  }
32
30
  });
33
31
  const PopupTrigger = /*#__PURE__*/forwardRef(({
34
- filterType,
35
32
  isSelected,
36
33
  isDisabled,
37
34
  isLoading,
38
- selectedOptions
35
+ selectedOptions,
36
+ testId,
37
+ label
39
38
  }, ref) => {
40
39
  const [firstOption] = selectedOptions || [];
41
40
  const hasOptions = selectedOptions && selectedOptions.length > 0;
42
41
  const showButtonLoading = !isDisabled && isLoading;
43
- const testId = `jlol-basic-filter-${filterType}-trigger`;
42
+ const tiggerButtonTestId = `${testId}-trigger`;
44
43
  const LoadingButton = useCallback(() => /*#__PURE__*/React.createElement(LoadingStateAnimationWrapper, null, /*#__PURE__*/React.createElement(Button, {
45
44
  iconAfter: /*#__PURE__*/React.createElement(Spinner, {
46
45
  size: 'xsmall'
47
46
  }),
48
- testId: `${testId}--loading-button`
49
- }, /*#__PURE__*/React.createElement(FormattedMessage, asyncPopupSelectMessages[`${filterType}Label`]))), [filterType, testId]);
47
+ testId: `${tiggerButtonTestId}--loading-button`
48
+ }, label)), [label, tiggerButtonTestId]);
50
49
  const DefaultButton = useCallback(() => /*#__PURE__*/React.createElement(Button, {
51
50
  appearance: "default",
52
51
  isSelected: isSelected || hasOptions,
@@ -54,15 +53,15 @@ const PopupTrigger = /*#__PURE__*/forwardRef(({
54
53
  iconAfter: /*#__PURE__*/React.createElement(ChevronDownIcon, {
55
54
  label: ""
56
55
  }),
57
- testId: `${testId}--button`
56
+ testId: `${tiggerButtonTestId}--button`
58
57
  }, /*#__PURE__*/React.createElement(Flex, null, /*#__PURE__*/React.createElement(Box, {
59
58
  xcss: triggerButtonLabelStyles
60
- }, /*#__PURE__*/React.createElement(FormattedMessage, asyncPopupSelectMessages[`${filterType}Label`]), firstOption && /*#__PURE__*/React.createElement(React.Fragment, null, ": ", firstOption.label)), selectedOptions && selectedOptions.length > 1 && /*#__PURE__*/React.createElement(Flex, {
59
+ }, label, firstOption && /*#__PURE__*/React.createElement(React.Fragment, null, ": ", firstOption.label)), selectedOptions && selectedOptions.length > 1 && /*#__PURE__*/React.createElement(Flex, {
61
60
  xcss: badgeStyles,
62
61
  alignItems: "center"
63
62
  }, /*#__PURE__*/React.createElement(Badge, {
64
63
  appearance: "primary"
65
- }, "+", selectedOptions.length - 1)))), [filterType, firstOption, hasOptions, isDisabled, isSelected, selectedOptions, testId]);
64
+ }, "+", selectedOptions.length - 1)))), [firstOption, hasOptions, isDisabled, isSelected, label, selectedOptions, tiggerButtonTestId]);
66
65
 
67
66
  /**
68
67
  * We had an issue with the popup component referencing a stale DOM ref for the trigger button.
@@ -70,7 +69,7 @@ const PopupTrigger = /*#__PURE__*/forwardRef(({
70
69
  */
71
70
  return /*#__PURE__*/React.createElement(Box, {
72
71
  ref: ref,
73
- testId: testId
72
+ testId: tiggerButtonTestId
74
73
  }, showButtonLoading ? /*#__PURE__*/React.createElement(LoadingButton, null) : /*#__PURE__*/React.createElement(DefaultButton, null));
75
74
  });
76
75
  export default PopupTrigger;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { Flex, xcss } from '@atlaskit/primitives';
3
+ const basicFilterContainerStyles = xcss({
4
+ paddingLeft: 'space.100'
5
+ });
6
+ const BasicFilterContainer = ({}) => {
7
+ return /*#__PURE__*/React.createElement(Flex, {
8
+ xcss: basicFilterContainerStyles,
9
+ gap: "space.100",
10
+ testId: "clol-basic-filter-container"
11
+ }, /*#__PURE__*/React.createElement(React.Fragment, null), /*#__PURE__*/React.createElement(React.Fragment, null));
12
+ };
13
+ export default BasicFilterContainer;
@@ -1,6 +1,12 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
3
+ import { Flex, xcss } from '@atlaskit/primitives';
2
4
  import { BasicSearchInput } from '../../common/modal/basic-search-input';
5
+ import BasicFilters from '../basic-filters';
3
6
  import { searchMessages } from './messages';
7
+ const basicSearchInputContainerStyles = xcss({
8
+ flexGrow: 1
9
+ });
4
10
  const ConfluenceSearchContainer = ({
5
11
  cloudId,
6
12
  initialSearchValue,
@@ -22,14 +28,23 @@ const ConfluenceSearchContainer = ({
22
28
  currentCloudId.current = cloudId;
23
29
  }
24
30
  }, [cloudId]);
25
- return /*#__PURE__*/React.createElement(BasicSearchInput, {
31
+ const showBasicFilters = useMemo(() => {
32
+ if (getBooleanFF('platform.linking-platform.datasource.show-clol-basic-filters')) {
33
+ return true;
34
+ }
35
+ return false;
36
+ }, []);
37
+ return /*#__PURE__*/React.createElement(Flex, {
38
+ alignItems: "center",
39
+ xcss: basicSearchInputContainerStyles
40
+ }, /*#__PURE__*/React.createElement(BasicSearchInput, {
26
41
  testId: "confluence-search-datasource-modal",
27
42
  isSearching: isSearching,
28
43
  onChange: handleSearchChange,
29
44
  onSearch: onSearch,
30
45
  searchTerm: searchBarSearchString,
31
46
  placeholder: searchMessages.searchLabel,
32
- fullWidth: true
33
- });
47
+ fullWidth: !showBasicFilters
48
+ }), showBasicFilters && /*#__PURE__*/React.createElement(BasicFilters, null));
34
49
  };
35
50
  export default ConfluenceSearchContainer;
@@ -12,7 +12,7 @@ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
12
12
  import { Box, xcss } from '@atlaskit/primitives';
13
13
  import LinkUrl from '@atlaskit/smart-card/link-url';
14
14
  import { N800 } from '@atlaskit/theme/colors';
15
- import { EVENT_CHANNEL } from '../../../analytics';
15
+ import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
16
16
  import { componentMetadata } from '../../../analytics/constants';
17
17
  import { DatasourceAction, DatasourceDisplay, DatasourceSearchMethod } from '../../../analytics/types';
18
18
  import { buildDatasourceAdf } from '../../../common/utils/adf';
@@ -103,6 +103,9 @@ export const PlainConfluenceSearchConfigModal = props => {
103
103
  parameters: isParametersSet ? parameters : undefined,
104
104
  fieldKeys: visibleColumnKeys
105
105
  });
106
+ const {
107
+ fireEvent
108
+ } = useDatasourceAnalyticsEvents();
106
109
  const hasNoConfluenceSites = availableSites && availableSites.length === 0;
107
110
  const selectedConfluenceSite = useMemo(() => {
108
111
  if (cloudId) {
@@ -115,6 +118,9 @@ export const PlainConfluenceSearchConfigModal = props => {
115
118
  return (availableSites === null || availableSites === void 0 ? void 0 : availableSites.find(confluenceSite => confluenceSite.url === currentlyLoggedInSiteUrl)) || (availableSites === null || availableSites === void 0 ? void 0 : availableSites[0]);
116
119
  }
117
120
  }, [availableSites, cloudId]);
121
+ useEffect(() => {
122
+ fireEvent('screen.datasourceModalDialog.viewed', {});
123
+ }, [fireEvent]);
118
124
 
119
125
  // TODO: further refactoring in EDM-9573
120
126
  // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6828283
@@ -138,9 +144,13 @@ export const PlainConfluenceSearchConfigModal = props => {
138
144
  const confluenceSites = await getAvailableSites('confluence');
139
145
  const sortedAvailableSites = [...confluenceSites].sort((a, b) => a.displayName.localeCompare(b.displayName));
140
146
  setAvailableSites(sortedAvailableSites);
147
+ fireEvent('ui.modal.ready.datasource', {
148
+ instancesCount: sortedAvailableSites.length,
149
+ schemasCount: null
150
+ });
141
151
  };
142
152
  void fetchSiteDisplayNames();
143
- }, []);
153
+ }, [fireEvent]);
144
154
  useEffect(() => {
145
155
  const newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
146
156
  visibleColumnCount.current = newVisibleColumnKeys.length;
@@ -1,20 +1,10 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
3
2
  import isEqual from 'lodash/isEqual';
4
3
  import { useIntl } from 'react-intl-next';
5
4
  import { useDebouncedCallback } from 'use-debounce';
6
- import { CheckboxOption, PopupSelect } from '@atlaskit/select';
7
- import { useDatasourceAnalyticsEvents } from '../../../../../analytics';
5
+ import { FilterPopupSelect } from '../../../../common/modal/popup-select';
8
6
  import { useFilterOptions } from '../../hooks/useFilterOptions';
9
- import CustomMenuList from '../menu-list';
10
- import CustomControl from './control';
11
- import CustomDropdownIndicator from './dropdownIndicator';
12
- import PopupFooter from './footer';
13
- import formatOptionLabel from './formatOptionLabel';
14
7
  import { asyncPopupSelectMessages } from './messages';
15
- import PopupTrigger from './trigger';
16
- // Needed to disable filtering from react-select
17
- const noFilterOptions = () => true;
18
8
  export const SEARCH_DEBOUNCE_MS = 350;
19
9
  const AsyncPopupSelect = ({
20
10
  filterType,
@@ -27,18 +17,12 @@ const AsyncPopupSelect = ({
27
17
  const {
28
18
  formatMessage
29
19
  } = useIntl();
30
- const {
31
- fireEvent
32
- } = useDatasourceAnalyticsEvents();
33
20
  const [searchTerm, setSearchTerm] = useState('');
34
21
  const [selectedOptions, setSelectedOptions] = useState(selection);
35
- const [sortedOptions, setSortedOptions] = useState([]);
36
22
  const {
37
23
  cloudId
38
24
  } = site || {};
39
25
  const currentSiteCloudId = useRef(cloudId || '');
40
- const sortPaginatedResults = useRef(false); // this is to track pagination for sorting purpose
41
-
42
26
  const {
43
27
  filterOptions,
44
28
  fetchFilterOptions,
@@ -56,103 +40,32 @@ const AsyncPopupSelect = ({
56
40
  searchString
57
41
  });
58
42
  }, SEARCH_DEBOUNCE_MS);
59
- const handleInputChange = useCallback(async (newSearchTerm, actionMeta) => {
60
- if (actionMeta.action === 'input-change' && newSearchTerm !== searchTerm) {
61
- setSearchTerm(newSearchTerm);
62
- handleDebouncedFetchFilterOptions(newSearchTerm);
63
- }
64
- }, [handleDebouncedFetchFilterOptions, searchTerm]);
43
+ const handleInputChange = useCallback(async newSearchTerm => {
44
+ setSearchTerm(newSearchTerm);
45
+ handleDebouncedFetchFilterOptions(newSearchTerm);
46
+ }, [handleDebouncedFetchFilterOptions]);
65
47
  const handleOptionSelection = useCallback(newValue => {
66
48
  onSelectionChange(filterType, newValue);
67
49
  }, [filterType, onSelectionChange]);
68
- const sortOptionsOnPopupOpen = useCallback(() => {
69
- if (selectedOptions.length === 0) {
70
- return setSortedOptions(filterOptions);
71
- }
72
- const nonSelectedOptions = filterOptions.filter(option => !selectedOptions.find(selectedOption => selectedOption.value === option.value));
73
- const newOptions = [...selectedOptions, ...nonSelectedOptions];
74
- if (!isEqual(newOptions, sortedOptions)) {
75
- setSortedOptions(newOptions);
76
- }
77
- }, [selectedOptions, filterOptions, sortedOptions]);
78
- const sortOptionsOnResolve = useCallback(() => {
79
- // 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
80
- if (searchTerm) {
81
- sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
82
- return setSortedOptions(filterOptions);
83
- }
84
-
85
- // sortedOptions is empty initially, this will take care of setting the initial value and bring the selected items to the top
86
- if (sortedOptions.length === 0) {
87
- return sortOptionsOnPopupOpen();
88
- }
89
-
90
- // this block handles the pagination, where on pagination, we will just append newOptions to the current list
91
- if (sortPaginatedResults.current) {
92
- const newOptions = filterOptions.filter(option => !sortedOptions.find(sortedOption => sortedOption.value === option.value));
93
- if (newOptions.length > 0) {
94
- setSortedOptions([...sortedOptions, ...newOptions]);
95
- }
96
- sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
97
- return;
98
- }
99
- sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
100
- sortOptionsOnPopupOpen();
101
- }, [filterOptions, searchTerm, sortOptionsOnPopupOpen, sortedOptions]);
102
50
  const handleShowMore = useCallback(() => {
103
51
  if (pageCursor) {
104
- sortPaginatedResults.current = true;
105
52
  fetchFilterOptions({
106
53
  pageCursor,
107
54
  searchString: searchTerm
108
55
  });
109
- fireEvent('ui.button.clicked.basicSearchDropdown', {
110
- filterType,
111
- type: 'showMore'
112
- });
113
56
  }
114
- }, [fetchFilterOptions, filterType, fireEvent, pageCursor, searchTerm]);
57
+ }, [fetchFilterOptions, pageCursor, searchTerm]);
115
58
  const handleMenuOpen = useCallback(() => {
116
59
  if (status === 'empty' || status === 'rejected') {
117
60
  // if user searches and gets status as rejected, we want the dropdown to try load the request with searchString when the user reopens the dropdown
118
61
  fetchFilterOptions({
119
62
  searchString: searchTerm
120
63
  });
121
- } else if (status === 'resolved') {
122
- sortOptionsOnPopupOpen();
123
64
  }
124
- fireEvent('ui.dropdown.opened.basicSearchDropdown', {
125
- filterType,
126
- selectionCount: selectedOptions.length
127
- });
128
- }, [fetchFilterOptions, filterType, fireEvent, searchTerm, selectedOptions.length, sortOptionsOnPopupOpen, status]);
129
- const handleMenuClose = useCallback(() => {
130
- /**
131
- * Clearing the search is to ensure that the sortOptionsOnPopupOpen logic does not mess up.
132
- * Without this, when the user opens, sortOptionsOnPopupOpen will inject the selected options to the list and the list count and values will be off
133
- */
134
- if (searchTerm) {
135
- handleInputChange('', {
136
- action: 'input-change',
137
- prevInputValue: searchTerm
138
- });
139
- }
140
- fireEvent('ui.dropdown.closed.basicSearchDropdown', {
141
- filterType,
142
- selectionCount: selectedOptions.length
143
- });
144
- }, [filterType, fireEvent, handleInputChange, searchTerm, selectedOptions.length]);
145
- useEffect(() => {
146
- if (status === 'resolved') {
147
- sortOptionsOnResolve();
148
- }
149
- // eslint-disable-next-line react-hooks/exhaustive-deps
150
- }, [status]); // we only want the sortOptionsOnResolve to run when there is a status change
151
-
65
+ }, [fetchFilterOptions, searchTerm, status]);
152
66
  useEffect(() => {
153
67
  if (cloudId && currentSiteCloudId.current !== cloudId) {
154
68
  currentSiteCloudId.current = cloudId;
155
- setSortedOptions([]);
156
69
  setSearchTerm('');
157
70
  resetHook();
158
71
  }
@@ -167,29 +80,27 @@ const AsyncPopupSelect = ({
167
80
  const isLoading = status === 'loading' || status === 'empty';
168
81
  const isLoadingMore = status === 'loadingMore';
169
82
  const isEmpty = status === 'resolved' && filterOptionsLength === 0;
170
- const popupSelectOptions = isLoading || isError ? [] : sortedOptions; // if not set to [], then on loading, no loading UI will be shown
83
+ const popupSelectOptions = isLoading || isError ? [] : filterOptions; // if not set to [], then on loading, no loading UI will be shown
171
84
  const areAllResultsLoaded = filterOptionsLength === totalCount;
172
85
  const shouldShowFooter = (status === 'resolved' || isLoadingMore) && filterOptionsLength > 0; // footer should not disappear when there is an inline spinner for loading more data
173
86
  const shouldDisplayShowMoreButton = status === 'resolved' && !!pageCursor && !areAllResultsLoaded;
174
- return /*#__PURE__*/React.createElement(PopupSelect, {
175
- isMulti: true,
176
- maxMenuWidth: 300,
177
- minMenuWidth: 300,
178
- testId: "jlol-basic-filter-popup-select",
179
- inputId: "jlol-basic-filter-popup-select--input"
180
- /*
181
- this threshold controls the display of the search control (input field for search)
182
- if this threshold is less than 0, when typing a search string that returns no results it will not remove the search control
183
- if this threshold is 0 or higher, it will remove the search control when there are no results, the user will be unable to clear the search to see more results
184
- */,
185
- searchThreshold: -1,
186
- inputValue: searchTerm,
187
- closeMenuOnSelect: false,
188
- hideSelectedOptions: false,
189
- isLoading: isLoading,
190
- placeholder: formatMessage(asyncPopupSelectMessages.selectPlaceholder),
87
+ const triggerButtonLabel = formatMessage(asyncPopupSelectMessages[`${filterType}Label`]);
88
+ return /*#__PURE__*/React.createElement(FilterPopupSelect, {
89
+ filterName: `jlol-basic-filter-${filterType}`,
90
+ status: status,
91
+ showLoading: isLoading,
92
+ showHydrating: isJQLHydrating,
93
+ isDisabled: isDisabled,
94
+ totalCount: totalCount,
95
+ shouldShowFooter: shouldShowFooter,
96
+ selectedOptions: selectedOptions,
97
+ options: popupSelectOptions,
98
+ buttonLabel: triggerButtonLabel,
99
+ onInputChange: handleInputChange,
100
+ onSelectionChange: handleOptionSelection,
101
+ onMenuOpen: handleMenuOpen,
191
102
  menuListProps: {
192
- filterType,
103
+ filterName: filterType,
193
104
  isError,
194
105
  isEmpty,
195
106
  isLoading,
@@ -197,38 +108,7 @@ const AsyncPopupSelect = ({
197
108
  handleShowMore,
198
109
  errors,
199
110
  showMore: shouldDisplayShowMoreButton
200
- },
201
- components: {
202
- Option: CheckboxOption,
203
- Control: CustomControl,
204
- MenuList: CustomMenuList,
205
- DropdownIndicator: CustomDropdownIndicator,
206
- LoadingIndicator: undefined,
207
- // disables the three ... indicator in the searchbox when picker is loading
208
- IndicatorSeparator: undefined // disables the | separator between search input and icon
209
- },
210
- options: popupSelectOptions,
211
- value: selectedOptions,
212
- filterOption: noFilterOptions,
213
- formatOptionLabel: formatOptionLabel,
214
- onChange: handleOptionSelection,
215
- onInputChange: handleInputChange,
216
- onOpen: handleMenuOpen,
217
- onClose: handleMenuClose,
218
- target: ({
219
- isOpen,
220
- ...triggerProps
221
- }) => /*#__PURE__*/React.createElement(PopupTrigger, _extends({}, triggerProps, {
222
- filterType: filterType,
223
- selectedOptions: selectedOptions,
224
- isSelected: isOpen,
225
- isDisabled: isDisabled,
226
- isLoading: isJQLHydrating
227
- })),
228
- footer: shouldShowFooter && /*#__PURE__*/React.createElement(PopupFooter, {
229
- currentDisplayCount: popupSelectOptions.length,
230
- totalCount: totalCount
231
- })
111
+ }
232
112
  });
233
113
  };
234
114
  export default AsyncPopupSelect;
@@ -1,15 +1,5 @@
1
1
  import { defineMessages } from 'react-intl-next';
2
2
  export const asyncPopupSelectMessages = defineMessages({
3
- selectPlaceholder: {
4
- id: 'linkDataSource.basic-filter.dropdown.select.placeholder',
5
- description: 'Placeholder text to be displayed for the search input box.',
6
- defaultMessage: 'Search'
7
- },
8
- paginationDetails: {
9
- id: 'linkDataSource.basic-filter.footer.pagination-details',
10
- description: 'Text to indicate page count and total count information.',
11
- defaultMessage: '{currentDisplayCount} of {totalCount}'
12
- },
13
3
  projectLabel: {
14
4
  id: 'linkDataSource.basic-filter.project.label',
15
5
  description: 'Label to be displayed for project filter dropdown button.',
@@ -29,10 +19,5 @@ export const asyncPopupSelectMessages = defineMessages({
29
19
  id: 'linkDataSource.basic-filter.assignee.label',
30
20
  description: 'Label to be displayed for assignee filter dropdown button.',
31
21
  defaultMessage: 'Assignee'
32
- },
33
- showMoreMessage: {
34
- id: 'linkDataSource.basic-filter.showMoreButton',
35
- defaultMessage: 'Show more',
36
- description: 'The text to show more options in dropdown'
37
22
  }
38
23
  });
@@ -193,7 +193,8 @@ export const JiraSearchContainer = props => {
193
193
  onSearch: handleSearch,
194
194
  searchTerm: basicSearchTerm,
195
195
  placeholder: basicSearchInputMessages.basicTextSearchLabel,
196
- testId: "jira-datasource-modal"
196
+ testId: "jira-datasource-modal",
197
+ fullWidth: !showBasicFilters
197
198
  }), showBasicFilters && jsx(BasicFilters, {
198
199
  jql: searchBarJql,
199
200
  site: site,
@@ -1,10 +1,9 @@
1
1
  /** @jsx jsx */
2
- import { useMemo } from 'react';
2
+
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import { useIntl } from 'react-intl-next';
5
5
  import { LoadingButton } from '@atlaskit/button';
6
6
  import SearchIcon from '@atlaskit/icon/glyph/editor/search';
7
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
8
7
  import Textfield from '@atlaskit/textfield';
9
8
  import { useDatasourceAnalyticsEvents } from '../../../../analytics';
10
9
  import { basicSearchInputMessages } from './messages';
@@ -39,15 +38,8 @@ export var BasicSearchInput = function BasicSearchInput(_ref) {
39
38
  e.preventDefault();
40
39
  handleSearchWithAnalytics();
41
40
  };
42
- var showBasicFilters = useMemo(function () {
43
- if (getBooleanFF('platform.linking-platform.datasource.show-jlol-basic-filters')) {
44
- return true;
45
- }
46
- return false;
47
- }, []);
48
- var isFullWidth = fullWidth || !showBasicFilters;
49
41
  return jsx("form", {
50
- css: isFullWidth ? formStyles : formWithMaxWidthStyles,
42
+ css: fullWidth ? formStyles : formWithMaxWidthStyles,
51
43
  onSubmit: handleFormSubmit
52
44
  }, jsx(Textfield, {
53
45
  elemAfterInput: jsx(LoadingButton, {