@atlaskit/link-datasource 1.26.2 → 1.27.0

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 (155) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/ui/common/modal/basic-search-input/index.js +9 -18
  3. package/dist/cjs/ui/common/modal/count-view-smart-link/index.js +40 -0
  4. package/dist/cjs/ui/{jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.js → common/modal/display-view-dropdown/display-view-drop-down.js} +29 -13
  5. package/dist/cjs/ui/common/modal/display-view-dropdown/messages.js +58 -0
  6. package/dist/cjs/ui/common/modal/popup-select/index.js +217 -0
  7. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
  8. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
  9. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
  10. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
  11. package/dist/cjs/ui/common/modal/popup-select/menu-list/showMoreButton.js +36 -0
  12. package/dist/cjs/ui/common/modal/popup-select/messages.js +19 -0
  13. package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +12 -13
  14. package/dist/cjs/ui/common/modal/popup-select/types.js +5 -0
  15. package/dist/cjs/ui/confluence-search-modal/basic-filters/index.js +22 -0
  16. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +18 -3
  17. package/dist/cjs/ui/confluence-search-modal/modal/index.js +114 -45
  18. package/dist/cjs/ui/confluence-search-modal/modal/messages.js +5 -0
  19. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +27 -163
  20. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
  21. package/dist/cjs/ui/jira-issues-modal/jira-search-container/index.js +2 -1
  22. package/dist/cjs/ui/jira-issues-modal/modal/index.js +8 -23
  23. package/dist/cjs/ui/jira-issues-modal/modal/messages.js +0 -20
  24. package/dist/es2019/ui/common/modal/basic-search-input/index.js +2 -10
  25. package/dist/es2019/ui/common/modal/count-view-smart-link/index.js +30 -0
  26. package/dist/es2019/ui/common/modal/display-view-dropdown/display-view-drop-down.js +71 -0
  27. package/dist/es2019/ui/common/modal/display-view-dropdown/messages.js +52 -0
  28. package/dist/es2019/ui/common/modal/popup-select/index.js +170 -0
  29. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
  30. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
  31. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
  32. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
  33. package/dist/es2019/ui/common/modal/popup-select/menu-list/showMoreButton.js +29 -0
  34. package/dist/es2019/ui/common/modal/popup-select/messages.js +13 -0
  35. package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +10 -11
  36. package/dist/es2019/ui/common/modal/popup-select/types.js +1 -0
  37. package/dist/es2019/ui/confluence-search-modal/basic-filters/index.js +13 -0
  38. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +19 -4
  39. package/dist/es2019/ui/confluence-search-modal/modal/index.js +98 -31
  40. package/dist/es2019/ui/confluence-search-modal/modal/messages.js +5 -0
  41. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +25 -145
  42. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
  43. package/dist/es2019/ui/jira-issues-modal/jira-search-container/index.js +2 -1
  44. package/dist/es2019/ui/jira-issues-modal/modal/index.js +9 -24
  45. package/dist/es2019/ui/jira-issues-modal/modal/messages.js +0 -20
  46. package/dist/esm/ui/common/modal/basic-search-input/index.js +2 -10
  47. package/dist/esm/ui/common/modal/count-view-smart-link/index.js +32 -0
  48. package/dist/esm/ui/common/modal/display-view-dropdown/display-view-drop-down.js +73 -0
  49. package/dist/esm/ui/common/modal/display-view-dropdown/messages.js +52 -0
  50. package/dist/esm/ui/common/modal/popup-select/index.js +207 -0
  51. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
  52. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
  53. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
  54. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
  55. package/dist/esm/ui/common/modal/popup-select/menu-list/showMoreButton.js +26 -0
  56. package/dist/esm/ui/common/modal/popup-select/messages.js +13 -0
  57. package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +12 -13
  58. package/dist/esm/ui/common/modal/popup-select/types.js +1 -0
  59. package/dist/esm/ui/confluence-search-modal/basic-filters/index.js +15 -0
  60. package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +19 -4
  61. package/dist/esm/ui/confluence-search-modal/modal/index.js +114 -45
  62. package/dist/esm/ui/confluence-search-modal/modal/messages.js +5 -0
  63. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +27 -163
  64. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
  65. package/dist/esm/ui/jira-issues-modal/jira-search-container/index.js +2 -1
  66. package/dist/esm/ui/jira-issues-modal/modal/index.js +9 -24
  67. package/dist/esm/ui/jira-issues-modal/modal/messages.js +0 -20
  68. package/dist/types/analytics/generated/analytics.types.d.ts +6 -6
  69. package/dist/types/common/types.d.ts +5 -5
  70. package/dist/types/ui/common/modal/basic-search-input/index.d.ts +1 -0
  71. package/dist/types/ui/common/modal/count-view-smart-link/index.d.ts +9 -0
  72. package/dist/types/ui/common/modal/display-view-dropdown/display-view-drop-down.d.ts +8 -0
  73. package/dist/types/ui/common/modal/display-view-dropdown/messages.d.ts +42 -0
  74. package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.d.ts +1 -1
  75. 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
  76. package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.d.ts +1 -1
  77. package/dist/types/ui/common/modal/popup-select/index.d.ts +21 -0
  78. package/dist/types/ui/common/modal/popup-select/menu-list/errorMessage.d.ts +6 -0
  79. package/dist/types/ui/common/modal/popup-select/menu-list/index.d.ts +15 -0
  80. package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.d.ts +5 -0
  81. package/dist/types/ui/common/modal/popup-select/menu-list/noOptionsMessage.d.ts +5 -0
  82. 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
  83. package/dist/types/ui/common/modal/popup-select/messages.d.ts +12 -0
  84. package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.d.ts +3 -2
  85. package/dist/types/ui/common/modal/popup-select/types.d.ts +22 -0
  86. package/dist/types/ui/confluence-search-modal/basic-filters/index.d.ts +5 -0
  87. package/dist/types/ui/confluence-search-modal/modal/messages.d.ts +5 -0
  88. package/dist/types/ui/confluence-search-modal/types.d.ts +2 -2
  89. package/dist/types/ui/jira-issues-modal/basic-filters/types.d.ts +0 -2
  90. package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.d.ts +0 -15
  91. package/dist/types/ui/jira-issues-modal/modal/messages.d.ts +0 -20
  92. package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +6 -6
  93. package/dist/types-ts4.5/common/types.d.ts +5 -5
  94. package/dist/types-ts4.5/ui/common/modal/basic-search-input/index.d.ts +1 -0
  95. package/dist/types-ts4.5/ui/common/modal/count-view-smart-link/index.d.ts +9 -0
  96. package/dist/types-ts4.5/ui/common/modal/display-view-dropdown/display-view-drop-down.d.ts +8 -0
  97. package/dist/types-ts4.5/ui/common/modal/display-view-dropdown/messages.d.ts +42 -0
  98. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.d.ts +1 -1
  99. 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
  100. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.d.ts +1 -1
  101. package/dist/types-ts4.5/ui/common/modal/popup-select/index.d.ts +21 -0
  102. package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/errorMessage.d.ts +6 -0
  103. package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/index.d.ts +15 -0
  104. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.d.ts +5 -0
  105. package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/noOptionsMessage.d.ts +5 -0
  106. 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
  107. package/dist/types-ts4.5/ui/common/modal/popup-select/messages.d.ts +12 -0
  108. package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.d.ts +3 -2
  109. package/dist/types-ts4.5/ui/common/modal/popup-select/types.d.ts +22 -0
  110. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/index.d.ts +5 -0
  111. package/dist/types-ts4.5/ui/confluence-search-modal/modal/messages.d.ts +5 -0
  112. package/dist/types-ts4.5/ui/confluence-search-modal/types.d.ts +2 -2
  113. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/types.d.ts +0 -2
  114. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.d.ts +0 -15
  115. package/dist/types-ts4.5/ui/jira-issues-modal/modal/messages.d.ts +0 -20
  116. package/examples-helpers/mockSmartLinkData.ts +49 -0
  117. package/examples-helpers/smartLinkCustomClient.ts +8 -3
  118. package/package.json +6 -3
  119. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -22
  120. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -17
  121. package/dist/es2019/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.js +0 -55
  122. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -15
  123. package/dist/esm/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.js +0 -57
  124. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +0 -8
  125. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +0 -5
  126. package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/noOptionsMessage.d.ts +0 -6
  127. package/dist/types/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.d.ts +0 -8
  128. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +0 -8
  129. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +0 -5
  130. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/noOptionsMessage.d.ts +0 -6
  131. package/dist/types-ts4.5/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.d.ts +0 -8
  132. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
  133. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
  134. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
  135. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
  136. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
  137. /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
  138. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
  139. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
  140. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
  141. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
  142. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
  143. /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
  144. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
  145. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
  146. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
  147. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
  148. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
  149. /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
  150. /package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.d.ts +0 -0
  151. /package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.d.ts +0 -0
  152. /package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.d.ts +0 -0
  153. /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.d.ts +0 -0
  154. /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.d.ts +0 -0
  155. /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,170 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
3
+ import isEqual from 'lodash/isEqual';
4
+ import { useIntl } from 'react-intl-next';
5
+ import { CheckboxOption, PopupSelect } from '@atlaskit/select';
6
+ import { useDatasourceAnalyticsEvents } from '../../../../analytics';
7
+ import CustomControl from './control';
8
+ import CustomDropdownIndicator from './dropdownIndicator';
9
+ import PopupFooter from './footer';
10
+ import formatOptionLabel from './formatOptionLabel';
11
+ import CustomMenuList from './menu-list';
12
+ import { asyncPopupSelectMessages } from './messages';
13
+ import PopupTrigger from './trigger';
14
+ // Needed to disable filtering from react-select
15
+ const noFilterOptions = () => true;
16
+ export const FilterPopupSelect = ({
17
+ filterName,
18
+ totalCount,
19
+ status,
20
+ buttonLabel,
21
+ showLoading = false,
22
+ isDisabled = false,
23
+ showHydrating = false,
24
+ shouldShowFooter = true,
25
+ menuListProps,
26
+ options,
27
+ selectedOptions,
28
+ onSelectionChange,
29
+ onInputChange,
30
+ onMenuClose,
31
+ onMenuOpen
32
+ }) => {
33
+ const {
34
+ formatMessage
35
+ } = useIntl();
36
+ const {
37
+ fireEvent
38
+ } = useDatasourceAnalyticsEvents();
39
+ const [searchTerm, setSearchTerm] = useState('');
40
+ const [sortedOptions, setSortedOptions] = useState([]);
41
+ const sortPaginatedResults = useRef(false); // this is to track pagination for sorting purpose
42
+
43
+ const sortOptionsOnPopupOpen = useCallback(() => {
44
+ if (selectedOptions.length === 0) {
45
+ return setSortedOptions(options);
46
+ }
47
+ const nonSelectedOptions = options.filter(option => !selectedOptions.find(selectedOption => selectedOption.value === option.value));
48
+ const newOptions = [...selectedOptions, ...nonSelectedOptions];
49
+ if (!isEqual(newOptions, sortedOptions)) {
50
+ setSortedOptions(newOptions);
51
+ }
52
+ }, [selectedOptions, options, sortedOptions]);
53
+ const sortOptionsOnResolve = useCallback(() => {
54
+ // 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
55
+ if (searchTerm) {
56
+ sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
57
+ return setSortedOptions(options);
58
+ }
59
+
60
+ // sortedOptions is empty initially, this will take care of setting the initial value and bring the selected items to the top
61
+ if (sortedOptions.length === 0) {
62
+ return sortOptionsOnPopupOpen();
63
+ }
64
+
65
+ // this block handles the pagination, where on pagination, we will just append newOptions to the current list
66
+ if (sortPaginatedResults.current) {
67
+ const newOptions = options.filter(option => !sortedOptions.find(sortedOption => sortedOption.value === option.value));
68
+ if (newOptions.length > 0) {
69
+ setSortedOptions([...sortedOptions, ...newOptions]);
70
+ }
71
+ sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
72
+ return;
73
+ }
74
+ sortPaginatedResults.current = false; // set to false to indicate pagination resolve action is completed from the sorting perspective
75
+ sortOptionsOnPopupOpen();
76
+ }, [options, searchTerm, sortOptionsOnPopupOpen, sortedOptions]);
77
+ const handleMenuOpen = useCallback(() => {
78
+ if (status === 'resolved') {
79
+ sortOptionsOnPopupOpen();
80
+ }
81
+ fireEvent('ui.dropdown.opened.basicSearchDropdown', {
82
+ filterName,
83
+ selectionCount: selectedOptions.length
84
+ });
85
+ onMenuOpen === null || onMenuOpen === void 0 ? void 0 : onMenuOpen();
86
+ }, [filterName, fireEvent, onMenuOpen, selectedOptions.length, sortOptionsOnPopupOpen, status]);
87
+ const handleMenuClose = useCallback(() => {
88
+ /**
89
+ * Clearing the search is to ensure that the sortOptionsOnPopupOpen logic does not mess up.
90
+ * Without this, when the user opens, sortOptionsOnPopupOpen will inject the selected options to the list and the list count and values will be off
91
+ */
92
+ if (searchTerm) {
93
+ setSearchTerm('');
94
+ }
95
+ onMenuClose === null || onMenuClose === void 0 ? void 0 : onMenuClose();
96
+ fireEvent('ui.dropdown.closed.basicSearchDropdown', {
97
+ filterName,
98
+ selectionCount: selectedOptions.length
99
+ });
100
+ }, [filterName, fireEvent, onMenuClose, searchTerm, selectedOptions.length]);
101
+ const handleInputChange = useCallback(async (newSearchTerm, actionMeta) => {
102
+ if (actionMeta.action === 'input-change' && newSearchTerm !== searchTerm) {
103
+ setSearchTerm(newSearchTerm);
104
+ onInputChange(newSearchTerm, actionMeta);
105
+ }
106
+ }, [onInputChange, searchTerm]);
107
+ useEffect(() => {
108
+ if (status === 'resolved') {
109
+ sortOptionsOnResolve();
110
+ }
111
+ // eslint-disable-next-line react-hooks/exhaustive-deps
112
+ }, [status]); // we only want the sortOptionsOnResolve to run when there is a status change
113
+
114
+ useEffect(() => {
115
+ if (status === 'loadingMore') {
116
+ sortPaginatedResults.current = true;
117
+ }
118
+ }, [status]);
119
+ return /*#__PURE__*/React.createElement(PopupSelect, {
120
+ isMulti: true,
121
+ maxMenuWidth: 300,
122
+ minMenuWidth: 300,
123
+ testId: `${filterName}-popup-select`,
124
+ inputId: `${filterName}-popup-select--input`
125
+ /*
126
+ this threshold controls the display of the search control (input field for search)
127
+ if this threshold is less than 0, when typing a search string that returns no results it will not remove the search control
128
+ 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
129
+ */,
130
+ searchThreshold: -1,
131
+ inputValue: searchTerm,
132
+ closeMenuOnSelect: false,
133
+ hideSelectedOptions: false,
134
+ isLoading: showLoading,
135
+ placeholder: formatMessage(asyncPopupSelectMessages.selectPlaceholder),
136
+ menuListProps: menuListProps,
137
+ components: {
138
+ Option: CheckboxOption,
139
+ Control: CustomControl,
140
+ MenuList: CustomMenuList,
141
+ DropdownIndicator: CustomDropdownIndicator,
142
+ LoadingIndicator: undefined,
143
+ // disables the three ... indicator in the searchbox when picker is loading
144
+ IndicatorSeparator: undefined // disables the | separator between search input and icon
145
+ },
146
+ options: sortedOptions,
147
+ value: selectedOptions,
148
+ filterOption: noFilterOptions,
149
+ formatOptionLabel: formatOptionLabel,
150
+ onChange: onSelectionChange,
151
+ onInputChange: handleInputChange,
152
+ onOpen: handleMenuOpen,
153
+ onClose: handleMenuClose,
154
+ target: ({
155
+ isOpen,
156
+ ...triggerProps
157
+ }) => /*#__PURE__*/React.createElement(PopupTrigger, _extends({}, triggerProps, {
158
+ label: buttonLabel,
159
+ selectedOptions: selectedOptions,
160
+ isSelected: isOpen,
161
+ isDisabled: isDisabled,
162
+ isLoading: showHydrating,
163
+ testId: filterName
164
+ })),
165
+ footer: shouldShowFooter && /*#__PURE__*/React.createElement(PopupFooter, {
166
+ currentDisplayCount: options.length,
167
+ totalCount: totalCount
168
+ })
169
+ });
170
+ };
@@ -3,7 +3,7 @@ import { useDebouncedCallback } from 'use-debounce';
3
3
  import ErrorIcon from '@atlaskit/icon/glyph/error';
4
4
  import { N500 } from '@atlaskit/theme/colors';
5
5
  import { useDatasourceAnalyticsEvents } from '../../../../../analytics';
6
- import { SEARCH_DEBOUNCE_MS } from '../async-popup-select';
6
+ import { SEARCH_DEBOUNCE_MS } from '../../../../jira-issues-modal/basic-filters/ui/async-popup-select';
7
7
  import { asyncPopupSelectMessages } from './messages';
8
8
  import CustomSelectMessage from './selectMessage';
9
9
  const getErrorReasonType = errors => {
@@ -17,7 +17,7 @@ const getErrorReasonType = errors => {
17
17
  return 'unknown';
18
18
  };
19
19
  const CustomErrorMessage = ({
20
- filterType,
20
+ filterName,
21
21
  errors
22
22
  }) => {
23
23
  const {
@@ -30,7 +30,7 @@ const CustomErrorMessage = ({
30
30
  */
31
31
  const [debouncedAnalyticsCallback] = useDebouncedCallback(() => {
32
32
  fireEvent('ui.error.shown.basicSearchDropdown', {
33
- filterType,
33
+ filterName,
34
34
  reason: getErrorReasonType(errors)
35
35
  });
36
36
  }, SEARCH_DEBOUNCE_MS);
@@ -2,10 +2,10 @@ import React from 'react';
2
2
  import { Box, Flex, xcss } from '@atlaskit/primitives';
3
3
  import { components } from '@atlaskit/select';
4
4
  import Spinner from '@atlaskit/spinner';
5
- import ShowMoreButton from '../async-popup-select/showMoreButton';
6
5
  import CustomErrorMessage from './errorMessage';
7
6
  import CustomDropdownLoadingMessage from './loadingMessage';
8
7
  import CustomNoOptionsMessage from './noOptionsMessage';
8
+ import ShowMoreButton from './showMoreButton';
9
9
  const inlineSpinnerStyles = xcss({
10
10
  paddingTop: 'space.075'
11
11
  });
@@ -18,7 +18,7 @@ const CustomMenuList = ({
18
18
  ...props
19
19
  }) => {
20
20
  const {
21
- filterType,
21
+ filterName,
22
22
  isLoading,
23
23
  isLoadingMore,
24
24
  isError,
@@ -41,19 +41,20 @@ const CustomMenuList = ({
41
41
  }
42
42
  if (isError) {
43
43
  return /*#__PURE__*/React.createElement(CustomErrorMessage, {
44
- filterType: filterType,
44
+ filterName: filterName,
45
45
  errors: errors
46
46
  });
47
47
  }
48
48
  if (isEmpty) {
49
49
  return /*#__PURE__*/React.createElement(CustomNoOptionsMessage, {
50
- filterType: filterType
50
+ filterName: filterName
51
51
  });
52
52
  }
53
53
  return /*#__PURE__*/React.createElement(React.Fragment, null, children, shouldDisplayShowMore && /*#__PURE__*/React.createElement(Box, {
54
54
  xcss: showMoreButtonBoxStyles
55
55
  }, /*#__PURE__*/React.createElement(ShowMoreButton, {
56
- onShowMore: handleShowMore
56
+ onShowMore: handleShowMore,
57
+ filterName: filterName
57
58
  })), isLoadingMoreData && /*#__PURE__*/React.createElement(InlineSpinner, null));
58
59
  };
59
60
  return /*#__PURE__*/React.createElement(components.MenuList, props, renderChildren());
@@ -14,5 +14,10 @@ export const asyncPopupSelectMessages = defineMessages({
14
14
  id: 'linkDataSource.basic-filter.error-message',
15
15
  defaultMessage: 'Something went wrong',
16
16
  description: 'The text for when an error occurs when loading options'
17
+ },
18
+ showMoreMessage: {
19
+ id: 'linkDataSource.basic-filter.showMoreButton',
20
+ defaultMessage: 'Show more',
21
+ description: 'The text to show more options in dropdown'
17
22
  }
18
23
  });
@@ -3,11 +3,11 @@ import { useDebouncedCallback } from 'use-debounce';
3
3
  import QuestionCircleIcon from '@atlaskit/icon/glyph/question-circle';
4
4
  import { N500 } from '@atlaskit/theme/colors';
5
5
  import { useDatasourceAnalyticsEvents } from '../../../../../analytics';
6
- import { SEARCH_DEBOUNCE_MS } from '../async-popup-select';
6
+ import { SEARCH_DEBOUNCE_MS } from '../../../../jira-issues-modal/basic-filters/ui/async-popup-select';
7
7
  import { asyncPopupSelectMessages } from './messages';
8
8
  import CustomSelectMessage from './selectMessage';
9
9
  const CustomNoOptionsMessage = ({
10
- filterType
10
+ filterName
11
11
  }) => {
12
12
  const {
13
13
  fireEvent
@@ -21,7 +21,7 @@ const CustomNoOptionsMessage = ({
21
21
  */
22
22
  const [debouncedAnalyticsCallback] = useDebouncedCallback(() => {
23
23
  fireEvent('ui.emptyResult.shown.basicSearchDropdown', {
24
- filterType
24
+ filterName
25
25
  });
26
26
  }, SEARCH_DEBOUNCE_MS);
27
27
  useEffect(debouncedAnalyticsCallback, [debouncedAnalyticsCallback]);
@@ -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;
@@ -27,6 +27,8 @@ import { NoResults } from '../../common/error-state/no-results';
27
27
  import { InitialStateView } from '../../common/initial-state-view';
28
28
  import { CancelButton } from '../../common/modal/cancel-button';
29
29
  import { ContentContainer } from '../../common/modal/content-container';
30
+ import { SmartCardPlaceholder, SmartLink } from '../../common/modal/count-view-smart-link';
31
+ import { DisplayViewDropDown } from '../../common/modal/display-view-dropdown/display-view-drop-down';
30
32
  import { SiteSelector } from '../../common/modal/site-selector';
31
33
  import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
32
34
  import ConfluenceSearchContainer from '../confluence-search-container';
@@ -64,11 +66,13 @@ export const PlainConfluenceSearchConfigModal = props => {
64
66
  wrappedColumnKeys: initialWrappedColumnKeys,
65
67
  onCancel,
66
68
  onInsert,
69
+ viewMode = 'table',
67
70
  parameters: initialParameters,
68
71
  url: urlBeingEdited,
69
72
  visibleColumnKeys: initialVisibleColumnKeys
70
73
  } = props;
71
74
  const [availableSites, setAvailableSites] = useState(undefined);
75
+ const [currentViewMode, setCurrentViewMode] = useState(viewMode);
72
76
  const [cloudId, setCloudId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId);
73
77
  const [searchString, setSearchString] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString);
74
78
  const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
@@ -133,6 +137,7 @@ export const PlainConfluenceSearchConfigModal = props => {
133
137
  // TODO: further refactoring in EDM-9573
134
138
  // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6829171
135
139
  const onSiteSelection = useCallback(site => {
140
+ userInteractionActions.current.add(DatasourceAction.INSTANCE_UPDATED);
136
141
  setSearchString(undefined);
137
142
  setCloudId(site.cloudId);
138
143
  reset({
@@ -207,14 +212,45 @@ export const PlainConfluenceSearchConfigModal = props => {
207
212
  const resolvedWithNoResults = status === 'resolved' && !responseItems.length;
208
213
  const hasConfluenceSearchParams = selectedConfluenceSite && searchString;
209
214
  const selectedConfluenceSiteUrl = selectedConfluenceSite === null || selectedConfluenceSite === void 0 ? void 0 : selectedConfluenceSite.url;
210
- const confluenceSearchUrl = selectedConfluenceSiteUrl && searchString !== undefined && `${selectedConfluenceSiteUrl}/wiki/search/?text=${encodeURI(searchString)}`;
215
+ const confluenceSearchUrl = selectedConfluenceSiteUrl && searchString !== undefined && `${selectedConfluenceSiteUrl}/wiki/search?text=${encodeURI(searchString)}`;
211
216
  const analyticsPayload = useMemo(() => ({
212
217
  extensionKey,
213
218
  destinationObjectTypes,
214
219
  searchCount: searchCount.current,
215
220
  actions: Array.from(userInteractionActions.current)
216
221
  }), [destinationObjectTypes, extensionKey]);
217
- const renderModalContent = useCallback(() => {
222
+ const isDataReady = (visibleColumnKeys || []).length > 0;
223
+ const fireInlineViewedEvent = useCallback(() => {
224
+ fireEvent('ui.link.viewed.count', {
225
+ ...analyticsPayload,
226
+ searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
227
+ totalItemCount: totalCount || 0
228
+ });
229
+ }, [analyticsPayload, fireEvent, totalCount]);
230
+ const fireTableViewedEvent = useCallback(() => {
231
+ if (isDataReady) {
232
+ fireEvent('ui.table.viewed.datasourceConfigModal', {
233
+ ...analyticsPayload,
234
+ totalItemCount: totalCount || 0,
235
+ searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
236
+ displayedColumnCount: visibleColumnCount.current
237
+ });
238
+ }
239
+ }, [analyticsPayload, fireEvent, totalCount, isDataReady]);
240
+ useEffect(() => {
241
+ const isResolved = status === 'resolved';
242
+ const isTableViewMode = currentViewMode === 'issue' || currentViewMode === 'table';
243
+ const isInlineViewMode = currentViewMode === 'count' || currentViewMode === 'inline';
244
+ if (!isResolved) {
245
+ return;
246
+ }
247
+ if (isTableViewMode) {
248
+ fireTableViewedEvent();
249
+ } else if (isInlineViewMode) {
250
+ fireInlineViewedEvent();
251
+ }
252
+ }, [currentViewMode, fireInlineViewedEvent, fireTableViewedEvent, status]);
253
+ const renderTableModalContent = useCallback(() => {
218
254
  if (status === 'rejected') {
219
255
  return jsx(ModalLoadingError, null);
220
256
  } else if (status === 'unauthorized') {
@@ -238,7 +274,22 @@ export const PlainConfluenceSearchConfigModal = props => {
238
274
  }
239
275
  return confluenceSearchTable;
240
276
  }, [columns.length, selectedConfluenceSiteUrl, confluenceSearchTable, resolvedWithNoResults, status, urlBeingEdited, hasConfluenceSearchParams]);
241
- const shouldShowResultsCount = !!totalCount && totalCount !== 1;
277
+ const renderInlineLinkModalContent = useCallback(() => {
278
+ if (status === 'unauthorized') {
279
+ return jsx(AccessRequired, {
280
+ url: selectedConfluenceSiteUrl || urlBeingEdited
281
+ });
282
+ } else if (status === 'empty' || !selectedConfluenceSiteUrl) {
283
+ return jsx(SmartCardPlaceholder, {
284
+ placeholderText: confluenceSearchModalMessages.resultsCountSmartCardPlaceholderText
285
+ });
286
+ } else {
287
+ return confluenceSearchUrl && jsx(SmartLink, {
288
+ url: confluenceSearchUrl
289
+ });
290
+ }
291
+ }, [confluenceSearchUrl, selectedConfluenceSiteUrl, status, urlBeingEdited]);
292
+ const shouldShowResultsCount = !!totalCount && currentViewMode === 'table';
242
293
  const onInsertPressed = useCallback((e, analyticsEvent) => {
243
294
  var _insertButtonClickedE;
244
295
  if (!isParametersSet || !cloudId) {
@@ -250,7 +301,7 @@ export const PlainConfluenceSearchConfigModal = props => {
250
301
  ...analyticsPayload,
251
302
  totalItemCount: totalCount || 0,
252
303
  displayedColumnCount: visibleColumnCount.current,
253
- display: DatasourceDisplay.DATASOURCE_TABLE,
304
+ display: currentViewMode === 'inline' ? DatasourceDisplay.DATASOURCE_INLINE : DatasourceDisplay.DATASOURCE_TABLE,
254
305
  searchCount: searchCount.current,
255
306
  searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
256
307
  actions: Array.from(userInteractionActions.current)
@@ -259,32 +310,45 @@ export const PlainConfluenceSearchConfigModal = props => {
259
310
  });
260
311
  const consumerEvent = (_insertButtonClickedE = insertButtonClickedEvent.clone()) !== null && _insertButtonClickedE !== void 0 ? _insertButtonClickedE : undefined;
261
312
  insertButtonClickedEvent.fire(EVENT_CHANNEL);
262
- onInsert(buildDatasourceAdf({
263
- id: datasourceId,
264
- parameters: {
265
- ...parameters,
266
- cloudId
267
- },
268
- views: [{
269
- type: 'table',
270
- properties: {
271
- columns: (visibleColumnKeys || []).map(key => {
272
- const width = columnCustomSizes === null || columnCustomSizes === void 0 ? void 0 : columnCustomSizes[key];
273
- const isWrapped = wrappedColumnKeys === null || wrappedColumnKeys === void 0 ? void 0 : wrappedColumnKeys.includes(key);
274
- return {
275
- key,
276
- ...(width ? {
277
- width
278
- } : {}),
279
- ...(isWrapped ? {
280
- isWrapped
281
- } : {})
282
- };
283
- })
313
+ if (currentViewMode === 'inline') {
314
+ onInsert({
315
+ type: 'inlineCard',
316
+ attrs: {
317
+ url: confluenceSearchUrl
284
318
  }
285
- }]
286
- }), consumerEvent);
287
- }, [isParametersSet, cloudId, analyticsPayload, totalCount, onInsert, datasourceId, parameters, visibleColumnKeys, columnCustomSizes, wrappedColumnKeys]);
319
+ }, consumerEvent);
320
+ } else {
321
+ onInsert(buildDatasourceAdf({
322
+ id: datasourceId,
323
+ parameters: {
324
+ ...parameters,
325
+ cloudId
326
+ },
327
+ views: [{
328
+ type: 'table',
329
+ properties: {
330
+ columns: (visibleColumnKeys || []).map(key => {
331
+ const width = columnCustomSizes === null || columnCustomSizes === void 0 ? void 0 : columnCustomSizes[key];
332
+ const isWrapped = wrappedColumnKeys === null || wrappedColumnKeys === void 0 ? void 0 : wrappedColumnKeys.includes(key);
333
+ return {
334
+ key,
335
+ ...(width ? {
336
+ width
337
+ } : {}),
338
+ ...(isWrapped ? {
339
+ isWrapped
340
+ } : {})
341
+ };
342
+ })
343
+ }
344
+ }]
345
+ }), consumerEvent);
346
+ }
347
+ }, [isParametersSet, cloudId, analyticsPayload, totalCount, currentViewMode, onInsert, confluenceSearchUrl, datasourceId, parameters, visibleColumnKeys, columnCustomSizes, wrappedColumnKeys]);
348
+ const handleViewModeChange = selectedMode => {
349
+ userInteractionActions.current.add(DatasourceAction.DISPLAY_VIEW_CHANGED);
350
+ setCurrentViewMode(selectedMode);
351
+ };
288
352
  const onSearch = useCallback(newSearchString => {
289
353
  searchCount.current++;
290
354
  userInteractionActions.current.add(DatasourceAction.QUERY_UPDATED);
@@ -316,14 +380,17 @@ export const PlainConfluenceSearchConfigModal = props => {
316
380
  selectedSite: selectedConfluenceSite,
317
381
  testId: "confluence-search-datasource-modal--site-selector",
318
382
  label: siteSelectorLabel
319
- }))), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(Box, {
383
+ })), !hasNoConfluenceSites && jsx(DisplayViewDropDown, {
384
+ onViewModeChange: handleViewModeChange,
385
+ viewMode: currentViewMode
386
+ })), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(Box, {
320
387
  xcss: inputContainerStyles
321
388
  }, jsx(ConfluenceSearchContainer, {
322
389
  cloudId: cloudId,
323
390
  isSearching: status === 'loading',
324
391
  onSearch: onSearch,
325
392
  initialSearchValue: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString
326
- })), renderModalContent()) : jsx(NoInstancesView, {
393
+ })), currentViewMode === 'inline' ? renderInlineLinkModalContent() : renderTableModalContent()) : jsx(NoInstancesView, {
327
394
  title: confluenceSearchModalMessages.noAccessToConfluenceSitesTitle,
328
395
  description: confluenceSearchModalMessages.noAccessToConfluenceSitesDescription,
329
396
  testId: 'no-confluence-instances-content'
@@ -44,5 +44,10 @@ export const confluenceSearchModalMessages = defineMessages({
44
44
  id: 'linkDataSource.confluence-search.no.confluence.sites.access.description',
45
45
  description: 'Description that shows in the modal when user has no access to any Confluence sites',
46
46
  defaultMessage: 'To request access, contact your admin.'
47
+ },
48
+ resultsCountSmartCardPlaceholderText: {
49
+ id: 'linkDataSource.confluence-search.configmodal.placeholder.issues',
50
+ description: 'Placeholder text that will be placed next to a count of confluence search results',
51
+ defaultMessage: '### Results'
47
52
  }
48
53
  });