@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.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/ui/common/modal/basic-search-input/index.js +9 -18
- package/dist/cjs/ui/common/modal/count-view-smart-link/index.js +40 -0
- 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
- package/dist/cjs/ui/common/modal/display-view-dropdown/messages.js +58 -0
- package/dist/cjs/ui/common/modal/popup-select/index.js +217 -0
- package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
- package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
- package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
- package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
- package/dist/cjs/ui/common/modal/popup-select/menu-list/showMoreButton.js +36 -0
- package/dist/cjs/ui/common/modal/popup-select/messages.js +19 -0
- package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +12 -13
- package/dist/cjs/ui/common/modal/popup-select/types.js +5 -0
- package/dist/cjs/ui/confluence-search-modal/basic-filters/index.js +22 -0
- package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +18 -3
- package/dist/cjs/ui/confluence-search-modal/modal/index.js +114 -45
- package/dist/cjs/ui/confluence-search-modal/modal/messages.js +5 -0
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +27 -163
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
- package/dist/cjs/ui/jira-issues-modal/jira-search-container/index.js +2 -1
- package/dist/cjs/ui/jira-issues-modal/modal/index.js +8 -23
- package/dist/cjs/ui/jira-issues-modal/modal/messages.js +0 -20
- package/dist/es2019/ui/common/modal/basic-search-input/index.js +2 -10
- package/dist/es2019/ui/common/modal/count-view-smart-link/index.js +30 -0
- package/dist/es2019/ui/common/modal/display-view-dropdown/display-view-drop-down.js +71 -0
- package/dist/es2019/ui/common/modal/display-view-dropdown/messages.js +52 -0
- package/dist/es2019/ui/common/modal/popup-select/index.js +170 -0
- package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
- package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
- package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
- package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
- package/dist/es2019/ui/common/modal/popup-select/menu-list/showMoreButton.js +29 -0
- package/dist/es2019/ui/common/modal/popup-select/messages.js +13 -0
- package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +10 -11
- package/dist/es2019/ui/common/modal/popup-select/types.js +1 -0
- package/dist/es2019/ui/confluence-search-modal/basic-filters/index.js +13 -0
- package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +19 -4
- package/dist/es2019/ui/confluence-search-modal/modal/index.js +98 -31
- package/dist/es2019/ui/confluence-search-modal/modal/messages.js +5 -0
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +25 -145
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
- package/dist/es2019/ui/jira-issues-modal/jira-search-container/index.js +2 -1
- package/dist/es2019/ui/jira-issues-modal/modal/index.js +9 -24
- package/dist/es2019/ui/jira-issues-modal/modal/messages.js +0 -20
- package/dist/esm/ui/common/modal/basic-search-input/index.js +2 -10
- package/dist/esm/ui/common/modal/count-view-smart-link/index.js +32 -0
- package/dist/esm/ui/common/modal/display-view-dropdown/display-view-drop-down.js +73 -0
- package/dist/esm/ui/common/modal/display-view-dropdown/messages.js +52 -0
- package/dist/esm/ui/common/modal/popup-select/index.js +207 -0
- package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/errorMessage.js +3 -3
- package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/index.js +6 -5
- package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.js +5 -0
- package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/noOptionsMessage.js +3 -3
- package/dist/esm/ui/common/modal/popup-select/menu-list/showMoreButton.js +26 -0
- package/dist/esm/ui/common/modal/popup-select/messages.js +13 -0
- package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.js +12 -13
- package/dist/esm/ui/common/modal/popup-select/types.js +1 -0
- package/dist/esm/ui/confluence-search-modal/basic-filters/index.js +15 -0
- package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +19 -4
- package/dist/esm/ui/confluence-search-modal/modal/index.js +114 -45
- package/dist/esm/ui/confluence-search-modal/modal/messages.js +5 -0
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +27 -163
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +0 -15
- package/dist/esm/ui/jira-issues-modal/jira-search-container/index.js +2 -1
- package/dist/esm/ui/jira-issues-modal/modal/index.js +9 -24
- package/dist/esm/ui/jira-issues-modal/modal/messages.js +0 -20
- package/dist/types/analytics/generated/analytics.types.d.ts +6 -6
- package/dist/types/common/types.d.ts +5 -5
- package/dist/types/ui/common/modal/basic-search-input/index.d.ts +1 -0
- package/dist/types/ui/common/modal/count-view-smart-link/index.d.ts +9 -0
- package/dist/types/ui/common/modal/display-view-dropdown/display-view-drop-down.d.ts +8 -0
- package/dist/types/ui/common/modal/display-view-dropdown/messages.d.ts +42 -0
- package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.d.ts +1 -1
- 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
- package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.d.ts +1 -1
- package/dist/types/ui/common/modal/popup-select/index.d.ts +21 -0
- package/dist/types/ui/common/modal/popup-select/menu-list/errorMessage.d.ts +6 -0
- package/dist/types/ui/common/modal/popup-select/menu-list/index.d.ts +15 -0
- package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.d.ts +5 -0
- package/dist/types/ui/common/modal/popup-select/menu-list/noOptionsMessage.d.ts +5 -0
- 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
- package/dist/types/ui/common/modal/popup-select/messages.d.ts +12 -0
- package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.d.ts +3 -2
- package/dist/types/ui/common/modal/popup-select/types.d.ts +22 -0
- package/dist/types/ui/confluence-search-modal/basic-filters/index.d.ts +5 -0
- package/dist/types/ui/confluence-search-modal/modal/messages.d.ts +5 -0
- package/dist/types/ui/confluence-search-modal/types.d.ts +2 -2
- package/dist/types/ui/jira-issues-modal/basic-filters/types.d.ts +0 -2
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.d.ts +0 -15
- package/dist/types/ui/jira-issues-modal/modal/messages.d.ts +0 -20
- package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +6 -6
- package/dist/types-ts4.5/common/types.d.ts +5 -5
- package/dist/types-ts4.5/ui/common/modal/basic-search-input/index.d.ts +1 -0
- package/dist/types-ts4.5/ui/common/modal/count-view-smart-link/index.d.ts +9 -0
- package/dist/types-ts4.5/ui/common/modal/display-view-dropdown/display-view-drop-down.d.ts +8 -0
- package/dist/types-ts4.5/ui/common/modal/display-view-dropdown/messages.d.ts +42 -0
- package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.d.ts +1 -1
- 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
- package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.d.ts +1 -1
- package/dist/types-ts4.5/ui/common/modal/popup-select/index.d.ts +21 -0
- package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/errorMessage.d.ts +6 -0
- package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/index.d.ts +15 -0
- package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/messages.d.ts +5 -0
- package/dist/types-ts4.5/ui/common/modal/popup-select/menu-list/noOptionsMessage.d.ts +5 -0
- 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
- package/dist/types-ts4.5/ui/common/modal/popup-select/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/trigger.d.ts +3 -2
- package/dist/types-ts4.5/ui/common/modal/popup-select/types.d.ts +22 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/index.d.ts +5 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/modal/messages.d.ts +5 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/types.d.ts +2 -2
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/types.d.ts +0 -2
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.d.ts +0 -15
- package/dist/types-ts4.5/ui/jira-issues-modal/modal/messages.d.ts +0 -20
- package/examples-helpers/mockSmartLinkData.ts +49 -0
- package/examples-helpers/smartLinkCustomClient.ts +8 -3
- package/package.json +6 -3
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -22
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -17
- package/dist/es2019/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.js +0 -55
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/showMoreButton.js +0 -15
- package/dist/esm/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.js +0 -57
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +0 -8
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +0 -5
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/menu-list/noOptionsMessage.d.ts +0 -6
- package/dist/types/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.d.ts +0 -8
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/errorMessage.d.ts +0 -8
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/index.d.ts +0 -5
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/menu-list/noOptionsMessage.d.ts +0 -6
- package/dist/types-ts4.5/ui/jira-issues-modal/modal/jira-display-view-dropdown/jira-display-view-drop-down.d.ts +0 -8
- /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
- /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
- /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
- /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
- /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
- /package/dist/cjs/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
- /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
- /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
- /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
- /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
- /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
- /package/dist/es2019/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
- /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/control.js +0 -0
- /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/dropdownIndicator.js +0 -0
- /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.js +0 -0
- /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/formatOptionLabel.js +0 -0
- /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.js +0 -0
- /package/dist/esm/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.js +0 -0
- /package/dist/types/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.d.ts +0 -0
- /package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.d.ts +0 -0
- /package/dist/types/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/selectMessage.d.ts +0 -0
- /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui/async-popup-select → common/modal/popup-select}/footer.d.ts +0 -0
- /package/dist/types-ts4.5/ui/{jira-issues-modal/basic-filters/ui → common/modal/popup-select}/menu-list/loadingMessage.d.ts +0 -0
- /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 '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
44
|
+
filterName: filterName,
|
|
45
45
|
errors: errors
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
if (isEmpty) {
|
|
49
49
|
return /*#__PURE__*/React.createElement(CustomNoOptionsMessage, {
|
|
50
|
-
|
|
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 '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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: `${
|
|
49
|
-
},
|
|
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: `${
|
|
56
|
+
testId: `${tiggerButtonTestId}--button`
|
|
58
57
|
}, /*#__PURE__*/React.createElement(Flex, null, /*#__PURE__*/React.createElement(Box, {
|
|
59
58
|
xcss: triggerButtonLabelStyles
|
|
60
|
-
},
|
|
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)))), [
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
}
|
|
287
|
-
|
|
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
|
-
}))
|
|
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
|
-
})),
|
|
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
|
});
|