@atlaskit/link-datasource 0.14.4
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 +233 -0
- package/README.md +3 -0
- package/dist/cjs/hooks/useDatasourceTableState.js +133 -0
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/services/getAvailableJiraSites.js +65 -0
- package/dist/cjs/services/makeGetJqlAutocompleteData.js +66 -0
- package/dist/cjs/services/makeGetJqlSuggestionsData.js +55 -0
- package/dist/cjs/ui/issue-like-table/column-picker/index.js +93 -0
- package/dist/cjs/ui/issue-like-table/column-picker/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/draggable-table-heading.js +182 -0
- package/dist/cjs/ui/issue-like-table/empty-state/index.js +127 -0
- package/dist/cjs/ui/issue-like-table/empty-state/priority.js +28 -0
- package/dist/cjs/ui/issue-like-table/empty-state/type.js +51 -0
- package/dist/cjs/ui/issue-like-table/empty-state/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/index.js +300 -0
- package/dist/cjs/ui/issue-like-table/render-type/boolean/index.js +30 -0
- package/dist/cjs/ui/issue-like-table/render-type/boolean/messages.js +20 -0
- package/dist/cjs/ui/issue-like-table/render-type/date-time/index.js +47 -0
- package/dist/cjs/ui/issue-like-table/render-type/icon/index.js +34 -0
- package/dist/cjs/ui/issue-like-table/render-type/index.js +63 -0
- package/dist/cjs/ui/issue-like-table/render-type/link/index.js +56 -0
- package/dist/cjs/ui/issue-like-table/render-type/number/index.js +24 -0
- package/dist/cjs/ui/issue-like-table/render-type/status/index.js +28 -0
- package/dist/cjs/ui/issue-like-table/render-type/tag/index.js +27 -0
- package/dist/cjs/ui/issue-like-table/render-type/text/index.js +23 -0
- package/dist/cjs/ui/issue-like-table/render-type/user/index.js +36 -0
- package/dist/cjs/ui/issue-like-table/render-type/user/messages.js +15 -0
- package/dist/cjs/ui/issue-like-table/styled.js +12 -0
- package/dist/cjs/ui/issue-like-table/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/useIsOnScreen.js +32 -0
- package/dist/cjs/ui/jira-issues/modal/basic-search-input/index.js +52 -0
- package/dist/cjs/ui/jira-issues/modal/basic-search-input/messages.js +15 -0
- package/dist/cjs/ui/jira-issues/modal/index.js +267 -0
- package/dist/cjs/ui/jira-issues/modal/jira-search-container/buildJQL.js +27 -0
- package/dist/cjs/ui/jira-issues/modal/jira-search-container/index.js +116 -0
- package/dist/cjs/ui/jira-issues/modal/jira-search-container/messages.js +15 -0
- package/dist/cjs/ui/jira-issues/modal/jql-editor/index.js +41 -0
- package/dist/cjs/ui/jira-issues/modal/messages.js +45 -0
- package/dist/cjs/ui/jira-issues/modal/mode-switcher/index.js +97 -0
- package/dist/cjs/ui/jira-issues/modal/site-selector/index.js +55 -0
- package/dist/cjs/ui/jira-issues/modal/site-selector/messages.js +20 -0
- package/dist/cjs/ui/jira-issues/table-footer/index.js +68 -0
- package/dist/cjs/ui/jira-issues/table-footer/messages.js +25 -0
- package/dist/cjs/ui/jira-issues/table-footer/sync-info/index.js +79 -0
- package/dist/cjs/ui/jira-issues/table-footer/sync-info/messages.js +20 -0
- package/dist/cjs/ui/jira-issues/tableView.js +64 -0
- package/dist/cjs/ui/jira-issues/types.js +5 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/hooks/useDatasourceTableState.js +77 -0
- package/dist/es2019/index.js +2 -0
- package/dist/es2019/services/getAvailableJiraSites.js +20 -0
- package/dist/es2019/services/makeGetJqlAutocompleteData.js +19 -0
- package/dist/es2019/services/makeGetJqlSuggestionsData.js +11 -0
- package/dist/es2019/ui/issue-like-table/column-picker/index.js +77 -0
- package/dist/es2019/ui/issue-like-table/column-picker/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/draggable-table-heading.js +166 -0
- package/dist/es2019/ui/issue-like-table/empty-state/index.js +113 -0
- package/dist/es2019/ui/issue-like-table/empty-state/priority.js +32 -0
- package/dist/es2019/ui/issue-like-table/empty-state/type.js +46 -0
- package/dist/es2019/ui/issue-like-table/empty-state/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/index.js +259 -0
- package/dist/es2019/ui/issue-like-table/render-type/boolean/index.js +21 -0
- package/dist/es2019/ui/issue-like-table/render-type/boolean/messages.js +13 -0
- package/dist/es2019/ui/issue-like-table/render-type/date-time/index.js +37 -0
- package/dist/es2019/ui/issue-like-table/render-type/icon/index.js +27 -0
- package/dist/es2019/ui/issue-like-table/render-type/index.js +55 -0
- package/dist/es2019/ui/issue-like-table/render-type/link/index.js +38 -0
- package/dist/es2019/ui/issue-like-table/render-type/number/index.js +15 -0
- package/dist/es2019/ui/issue-like-table/render-type/status/index.js +19 -0
- package/dist/es2019/ui/issue-like-table/render-type/tag/index.js +18 -0
- package/dist/es2019/ui/issue-like-table/render-type/text/index.js +14 -0
- package/dist/es2019/ui/issue-like-table/render-type/user/index.js +29 -0
- package/dist/es2019/ui/issue-like-table/render-type/user/messages.js +8 -0
- package/dist/es2019/ui/issue-like-table/styled.js +6 -0
- package/dist/es2019/ui/issue-like-table/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/useIsOnScreen.js +17 -0
- package/dist/es2019/ui/jira-issues/modal/basic-search-input/index.js +42 -0
- package/dist/es2019/ui/jira-issues/modal/basic-search-input/messages.js +8 -0
- package/dist/es2019/ui/jira-issues/modal/index.js +227 -0
- package/dist/es2019/ui/jira-issues/modal/jira-search-container/buildJQL.js +20 -0
- package/dist/es2019/ui/jira-issues/modal/jira-search-container/index.js +90 -0
- package/dist/es2019/ui/jira-issues/modal/jira-search-container/messages.js +8 -0
- package/dist/es2019/ui/jira-issues/modal/jql-editor/index.js +33 -0
- package/dist/es2019/ui/jira-issues/modal/messages.js +38 -0
- package/dist/es2019/ui/jira-issues/modal/mode-switcher/index.js +90 -0
- package/dist/es2019/ui/jira-issues/modal/site-selector/index.js +43 -0
- package/dist/es2019/ui/jira-issues/modal/site-selector/messages.js +13 -0
- package/dist/es2019/ui/jira-issues/table-footer/index.js +78 -0
- package/dist/es2019/ui/jira-issues/table-footer/messages.js +18 -0
- package/dist/es2019/ui/jira-issues/table-footer/sync-info/index.js +59 -0
- package/dist/es2019/ui/jira-issues/table-footer/sync-info/messages.js +13 -0
- package/dist/es2019/ui/jira-issues/tableView.js +57 -0
- package/dist/es2019/ui/jira-issues/types.js +1 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/hooks/useDatasourceTableState.js +125 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/services/getAvailableJiraSites.js +57 -0
- package/dist/esm/services/makeGetJqlAutocompleteData.js +58 -0
- package/dist/esm/services/makeGetJqlSuggestionsData.js +47 -0
- package/dist/esm/ui/issue-like-table/column-picker/index.js +85 -0
- package/dist/esm/ui/issue-like-table/column-picker/types.js +1 -0
- package/dist/esm/ui/issue-like-table/draggable-table-heading.js +173 -0
- package/dist/esm/ui/issue-like-table/empty-state/index.js +118 -0
- package/dist/esm/ui/issue-like-table/empty-state/priority.js +20 -0
- package/dist/esm/ui/issue-like-table/empty-state/type.js +43 -0
- package/dist/esm/ui/issue-like-table/empty-state/types.js +1 -0
- package/dist/esm/ui/issue-like-table/index.js +292 -0
- package/dist/esm/ui/issue-like-table/render-type/boolean/index.js +21 -0
- package/dist/esm/ui/issue-like-table/render-type/boolean/messages.js +13 -0
- package/dist/esm/ui/issue-like-table/render-type/date-time/index.js +38 -0
- package/dist/esm/ui/issue-like-table/render-type/icon/index.js +25 -0
- package/dist/esm/ui/issue-like-table/render-type/index.js +55 -0
- package/dist/esm/ui/issue-like-table/render-type/link/index.js +44 -0
- package/dist/esm/ui/issue-like-table/render-type/number/index.js +15 -0
- package/dist/esm/ui/issue-like-table/render-type/status/index.js +19 -0
- package/dist/esm/ui/issue-like-table/render-type/tag/index.js +18 -0
- package/dist/esm/ui/issue-like-table/render-type/text/index.js +14 -0
- package/dist/esm/ui/issue-like-table/render-type/user/index.js +27 -0
- package/dist/esm/ui/issue-like-table/render-type/user/messages.js +8 -0
- package/dist/esm/ui/issue-like-table/styled.js +4 -0
- package/dist/esm/ui/issue-like-table/types.js +1 -0
- package/dist/esm/ui/issue-like-table/useIsOnScreen.js +25 -0
- package/dist/esm/ui/jira-issues/modal/basic-search-input/index.js +43 -0
- package/dist/esm/ui/jira-issues/modal/basic-search-input/messages.js +8 -0
- package/dist/esm/ui/jira-issues/modal/index.js +255 -0
- package/dist/esm/ui/jira-issues/modal/jira-search-container/buildJQL.js +20 -0
- package/dist/esm/ui/jira-issues/modal/jira-search-container/index.js +104 -0
- package/dist/esm/ui/jira-issues/modal/jira-search-container/messages.js +8 -0
- package/dist/esm/ui/jira-issues/modal/jql-editor/index.js +31 -0
- package/dist/esm/ui/jira-issues/modal/messages.js +38 -0
- package/dist/esm/ui/jira-issues/modal/mode-switcher/index.js +88 -0
- package/dist/esm/ui/jira-issues/modal/site-selector/index.js +44 -0
- package/dist/esm/ui/jira-issues/modal/site-selector/messages.js +13 -0
- package/dist/esm/ui/jira-issues/table-footer/index.js +60 -0
- package/dist/esm/ui/jira-issues/table-footer/messages.js +18 -0
- package/dist/esm/ui/jira-issues/table-footer/sync-info/index.js +68 -0
- package/dist/esm/ui/jira-issues/table-footer/sync-info/messages.js +13 -0
- package/dist/esm/ui/jira-issues/tableView.js +55 -0
- package/dist/esm/ui/jira-issues/types.js +1 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/hooks/useDatasourceTableState.d.ts +13 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/services/getAvailableJiraSites.d.ts +6 -0
- package/dist/types/services/makeGetJqlAutocompleteData.d.ts +6 -0
- package/dist/types/services/makeGetJqlSuggestionsData.d.ts +5 -0
- package/dist/types/ui/issue-like-table/column-picker/index.d.ts +3 -0
- package/dist/types/ui/issue-like-table/column-picker/types.d.ts +6 -0
- package/dist/types/ui/issue-like-table/draggable-table-heading.d.ts +12 -0
- package/dist/types/ui/issue-like-table/empty-state/index.d.ts +6 -0
- package/dist/types/ui/issue-like-table/empty-state/priority.d.ts +6 -0
- package/dist/types/ui/issue-like-table/empty-state/type.d.ts +6 -0
- package/dist/types/ui/issue-like-table/empty-state/types.d.ts +2 -0
- package/dist/types/ui/issue-like-table/index.d.ts +15 -0
- package/dist/types/ui/issue-like-table/render-type/boolean/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/boolean/messages.d.ts +12 -0
- package/dist/types/ui/issue-like-table/render-type/date-time/index.d.ts +10 -0
- package/dist/types/ui/issue-like-table/render-type/icon/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/index.d.ts +2 -0
- package/dist/types/ui/issue-like-table/render-type/link/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/number/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/status/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/tag/index.d.ts +9 -0
- package/dist/types/ui/issue-like-table/render-type/text/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/user/index.d.ts +11 -0
- package/dist/types/ui/issue-like-table/render-type/user/messages.d.ts +7 -0
- package/dist/types/ui/issue-like-table/styled.d.ts +5 -0
- package/dist/types/ui/issue-like-table/types.d.ts +38 -0
- package/dist/types/ui/issue-like-table/useIsOnScreen.d.ts +1 -0
- package/dist/types/ui/jira-issues/modal/basic-search-input/index.d.ts +12 -0
- package/dist/types/ui/jira-issues/modal/basic-search-input/messages.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/index.d.ts +13 -0
- package/dist/types/ui/jira-issues/modal/jira-search-container/buildJQL.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/jira-search-container/index.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/jira-search-container/messages.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/jql-editor/index.d.ts +8 -0
- package/dist/types/ui/jira-issues/modal/messages.d.ts +37 -0
- package/dist/types/ui/jira-issues/modal/mode-switcher/index.d.ts +12 -0
- package/dist/types/ui/jira-issues/modal/site-selector/index.d.ts +10 -0
- package/dist/types/ui/jira-issues/modal/site-selector/messages.d.ts +12 -0
- package/dist/types/ui/jira-issues/table-footer/index.d.ts +7 -0
- package/dist/types/ui/jira-issues/table-footer/messages.d.ts +17 -0
- package/dist/types/ui/jira-issues/table-footer/sync-info/index.d.ts +4 -0
- package/dist/types/ui/jira-issues/table-footer/sync-info/messages.d.ts +12 -0
- package/dist/types/ui/jira-issues/tableView.d.ts +3 -0
- package/dist/types/ui/jira-issues/types.d.ts +14 -0
- package/dist/types-ts4.5/hooks/useDatasourceTableState.d.ts +13 -0
- package/dist/types-ts4.5/index.d.ts +2 -0
- package/dist/types-ts4.5/services/getAvailableJiraSites.d.ts +6 -0
- package/dist/types-ts4.5/services/makeGetJqlAutocompleteData.d.ts +6 -0
- package/dist/types-ts4.5/services/makeGetJqlSuggestionsData.d.ts +5 -0
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/index.d.ts +3 -0
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/types.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/draggable-table-heading.d.ts +12 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/index.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/priority.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/type.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/types.d.ts +2 -0
- package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +15 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/boolean/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/boolean/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/date-time/index.d.ts +10 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/icon/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/index.d.ts +2 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/link/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/number/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/status/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/tag/index.d.ts +9 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/text/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/user/index.d.ts +11 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/user/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/issue-like-table/styled.d.ts +5 -0
- package/dist/types-ts4.5/ui/issue-like-table/types.d.ts +38 -0
- package/dist/types-ts4.5/ui/issue-like-table/useIsOnScreen.d.ts +1 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/basic-search-input/index.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/basic-search-input/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/index.d.ts +13 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/buildJQL.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/index.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jql-editor/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/messages.d.ts +37 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/mode-switcher/index.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/site-selector/index.d.ts +10 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/site-selector/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/index.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/messages.d.ts +17 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/sync-info/index.d.ts +4 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/sync-info/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/tableView.d.ts +3 -0
- package/dist/types-ts4.5/ui/jira-issues/types.d.ts +14 -0
- package/examples-helpers/buildIssueLikeTable.tsx +88 -0
- package/examples-helpers/buildJiraIssuesTable.tsx +31 -0
- package/examples-helpers/images.json +4 -0
- package/examples-helpers/mockAutocompleteData.ts +54 -0
- package/examples-helpers/mockJiraAvailableSites.ts +27 -0
- package/examples-helpers/mockJiraData.ts +546 -0
- package/examples-helpers/mockJqlSmartLinkData.ts +72 -0
- package/examples-helpers/mockSmartLinkData.ts +67 -0
- package/examples-helpers/mockSuggestionData.ts +17 -0
- package/examples-helpers/setupDatasourcesMocks.ts +199 -0
- package/examples-helpers/setupModalExampleMocks.ts +32 -0
- package/examples-helpers/smartLinkCustomClient.ts +26 -0
- package/package.json +118 -0
- package/report.api.md +98 -0
- package/tmp/api-report-tmp.d.ts +64 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
// Hook which tracks if a ref is visible or not. Taken from: https://stackoverflow.com/a/65008608
|
|
5
|
+
export var useIsOnScreen = function useIsOnScreen(el) {
|
|
6
|
+
var _useState = useState(false),
|
|
7
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
8
|
+
isIntersecting = _useState2[0],
|
|
9
|
+
setIntersecting = _useState2[1];
|
|
10
|
+
var observer = useMemo(function () {
|
|
11
|
+
return new IntersectionObserver(function (_ref) {
|
|
12
|
+
var _ref2 = _slicedToArray(_ref, 1),
|
|
13
|
+
entry = _ref2[0];
|
|
14
|
+
return setIntersecting(entry.isIntersecting);
|
|
15
|
+
});
|
|
16
|
+
}, []);
|
|
17
|
+
useEffect(function () {
|
|
18
|
+
el && observer.observe(el);
|
|
19
|
+
return function () {
|
|
20
|
+
setIntersecting(false);
|
|
21
|
+
return observer.disconnect();
|
|
22
|
+
};
|
|
23
|
+
}, [observer, el]);
|
|
24
|
+
return isIntersecting;
|
|
25
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { css, jsx } from '@emotion/react';
|
|
3
|
+
import { useIntl } from 'react-intl-next';
|
|
4
|
+
import { LoadingButton } from '@atlaskit/button';
|
|
5
|
+
import SearchIcon from '@atlaskit/icon/glyph/editor/search';
|
|
6
|
+
import Textfield from '@atlaskit/textfield';
|
|
7
|
+
import { basicSearchInputMessages } from './messages';
|
|
8
|
+
var searchButtonStyles = css({
|
|
9
|
+
marginRight: "var(--ds-space-075, 6px)"
|
|
10
|
+
});
|
|
11
|
+
export var BasicSearchInput = function BasicSearchInput(_ref) {
|
|
12
|
+
var isDisabled = _ref.isDisabled,
|
|
13
|
+
isSearching = _ref.isSearching,
|
|
14
|
+
onChange = _ref.onChange,
|
|
15
|
+
onSearch = _ref.onSearch,
|
|
16
|
+
searchTerm = _ref.searchTerm,
|
|
17
|
+
_ref$testId = _ref.testId,
|
|
18
|
+
testId = _ref$testId === void 0 ? 'jira-jql-datasource-modal--basic-search-input' : _ref$testId;
|
|
19
|
+
var _useIntl = useIntl(),
|
|
20
|
+
formatMessage = _useIntl.formatMessage;
|
|
21
|
+
return jsx(Textfield, {
|
|
22
|
+
elemAfterInput: jsx(LoadingButton, {
|
|
23
|
+
appearance: "primary",
|
|
24
|
+
css: searchButtonStyles,
|
|
25
|
+
iconBefore: jsx(SearchIcon, {
|
|
26
|
+
label: formatMessage(basicSearchInputMessages.basicTextSearchLabel),
|
|
27
|
+
size: "medium"
|
|
28
|
+
}),
|
|
29
|
+
isDisabled: isDisabled,
|
|
30
|
+
isLoading: isSearching,
|
|
31
|
+
onClick: function onClick() {
|
|
32
|
+
return onSearch(searchTerm);
|
|
33
|
+
},
|
|
34
|
+
spacing: "none",
|
|
35
|
+
testId: "jira-jql-datasource-modal--basic-search-button"
|
|
36
|
+
}),
|
|
37
|
+
autoFocus: true,
|
|
38
|
+
onChange: onChange,
|
|
39
|
+
placeholder: formatMessage(basicSearchInputMessages.basicTextSearchLabel),
|
|
40
|
+
testId: testId,
|
|
41
|
+
value: searchTerm
|
|
42
|
+
});
|
|
43
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export var basicSearchInputMessages = defineMessages({
|
|
3
|
+
basicTextSearchLabel: {
|
|
4
|
+
id: 'linkDataSource.jira-issues.configmodal.basicTextSearchPlaceholder',
|
|
5
|
+
description: 'Placeholder text for the search input box',
|
|
6
|
+
defaultMessage: 'Search'
|
|
7
|
+
}
|
|
8
|
+
});
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
5
|
+
/** @jsx jsx */
|
|
6
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { css, jsx } from '@emotion/react';
|
|
8
|
+
import { FormattedMessage, IntlProvider, useIntl } from 'react-intl-next';
|
|
9
|
+
import Button from '@atlaskit/button/standard-button';
|
|
10
|
+
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
11
|
+
import { B400, N0 } from '@atlaskit/theme/colors';
|
|
12
|
+
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
13
|
+
import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
|
|
14
|
+
import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
|
|
15
|
+
import LinkRenderType from '../../issue-like-table/render-type/link';
|
|
16
|
+
import { JiraSearchContainer } from './jira-search-container';
|
|
17
|
+
import { modalMessages } from './messages';
|
|
18
|
+
import { ModeSwitcher } from './mode-switcher';
|
|
19
|
+
import { JiraSiteSelector } from './site-selector';
|
|
20
|
+
var dropdownContainerStyles = css({
|
|
21
|
+
display: 'flex',
|
|
22
|
+
gap: "var(--ds-space-100, 0.5rem)"
|
|
23
|
+
});
|
|
24
|
+
var contentContainerStyles = css({
|
|
25
|
+
height: '420px',
|
|
26
|
+
overflow: 'auto'
|
|
27
|
+
});
|
|
28
|
+
var placeholderSmartLinkStyles = css({
|
|
29
|
+
backgroundColor: "var(--ds-surface-raised, ".concat(N0, ")"),
|
|
30
|
+
borderRadius: '3px',
|
|
31
|
+
boxShadow: '0px 1px 1px rgba(9, 30, 66, 0.25), 0px 0px 1px rgba(9, 30, 66, 0.31)',
|
|
32
|
+
color: "var(--ds-text-brand, ".concat(B400, ")"),
|
|
33
|
+
padding: '0px 2px'
|
|
34
|
+
});
|
|
35
|
+
export var JiraIssuesConfigModal = function JiraIssuesConfigModal(props) {
|
|
36
|
+
var _useState = useState([]),
|
|
37
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
38
|
+
availableSites = _useState2[0],
|
|
39
|
+
setAvailableSites = _useState2[1];
|
|
40
|
+
var _useState3 = useState('issue'),
|
|
41
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
42
|
+
currentViewMode = _useState4[0],
|
|
43
|
+
setCurrentViewMode = _useState4[1];
|
|
44
|
+
var datasourceId = props.datasourceId,
|
|
45
|
+
parameters = props.parameters,
|
|
46
|
+
visibleColumnKeys = props.visibleColumnKeys,
|
|
47
|
+
onCancel = props.onCancel,
|
|
48
|
+
onInsert = props.onInsert,
|
|
49
|
+
onUpdateParameters = props.onUpdateParameters,
|
|
50
|
+
onVisibleColumnKeysChange = props.onVisibleColumnKeysChange;
|
|
51
|
+
var isParametersSet = !!(parameters && parameters.value && parameters.cloudId);
|
|
52
|
+
var _ref = parameters || {},
|
|
53
|
+
cloudId = _ref.cloudId,
|
|
54
|
+
jql = _ref.value;
|
|
55
|
+
var _useDatasourceTableSt = useDatasourceTableState(datasourceId, parameters, ['key']),
|
|
56
|
+
reset = _useDatasourceTableSt.reset,
|
|
57
|
+
status = _useDatasourceTableSt.status,
|
|
58
|
+
onNextPage = _useDatasourceTableSt.onNextPage,
|
|
59
|
+
responseItems = _useDatasourceTableSt.responseItems,
|
|
60
|
+
hasNextPage = _useDatasourceTableSt.hasNextPage,
|
|
61
|
+
columns = _useDatasourceTableSt.columns,
|
|
62
|
+
defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys;
|
|
63
|
+
var _useIntl = useIntl(),
|
|
64
|
+
formatMessage = _useIntl.formatMessage;
|
|
65
|
+
useEffect(function () {
|
|
66
|
+
var fetchSiteDisplayNames = /*#__PURE__*/function () {
|
|
67
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
68
|
+
var jiraSites;
|
|
69
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
70
|
+
while (1) switch (_context.prev = _context.next) {
|
|
71
|
+
case 0:
|
|
72
|
+
_context.next = 2;
|
|
73
|
+
return getAvailableJiraSites();
|
|
74
|
+
case 2:
|
|
75
|
+
jiraSites = _context.sent;
|
|
76
|
+
setAvailableSites(jiraSites);
|
|
77
|
+
case 4:
|
|
78
|
+
case "end":
|
|
79
|
+
return _context.stop();
|
|
80
|
+
}
|
|
81
|
+
}, _callee);
|
|
82
|
+
}));
|
|
83
|
+
return function fetchSiteDisplayNames() {
|
|
84
|
+
return _ref2.apply(this, arguments);
|
|
85
|
+
};
|
|
86
|
+
}();
|
|
87
|
+
void fetchSiteDisplayNames();
|
|
88
|
+
}, []);
|
|
89
|
+
var onSearch = useCallback(function (parameters) {
|
|
90
|
+
onUpdateParameters(parameters);
|
|
91
|
+
reset();
|
|
92
|
+
}, [reset, onUpdateParameters]);
|
|
93
|
+
var onSiteSelection = useCallback(function (site) {
|
|
94
|
+
onUpdateParameters({
|
|
95
|
+
cloudId: site.cloudId
|
|
96
|
+
});
|
|
97
|
+
reset();
|
|
98
|
+
}, [reset, onUpdateParameters]);
|
|
99
|
+
var selectedJiraSite = useMemo(function () {
|
|
100
|
+
return availableSites.find(function (jiraSite) {
|
|
101
|
+
return jiraSite.cloudId === cloudId;
|
|
102
|
+
}) || availableSites[0];
|
|
103
|
+
}, [availableSites, cloudId]);
|
|
104
|
+
useEffect(function () {
|
|
105
|
+
if (!cloudId && selectedJiraSite) {
|
|
106
|
+
onUpdateParameters({
|
|
107
|
+
cloudId: selectedJiraSite.cloudId
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}, [cloudId, onUpdateParameters, selectedJiraSite]);
|
|
111
|
+
useEffect(function () {
|
|
112
|
+
if ((visibleColumnKeys || []).length === 0 && defaultVisibleColumnKeys.length > 0) {
|
|
113
|
+
onVisibleColumnKeysChange(defaultVisibleColumnKeys);
|
|
114
|
+
}
|
|
115
|
+
}, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
|
|
116
|
+
var retrieveUrlForSmartCardRender = useCallback(function () {
|
|
117
|
+
var _data$key;
|
|
118
|
+
var _responseItems = _slicedToArray(responseItems, 1),
|
|
119
|
+
data = _responseItems[0];
|
|
120
|
+
// agrement with BE that we will use `key` for rendering smartlink
|
|
121
|
+
return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : _data$key.url;
|
|
122
|
+
}, [responseItems]);
|
|
123
|
+
var onInsertPressed = useCallback(function () {
|
|
124
|
+
if (!isParametersSet || !jql || !selectedJiraSite) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
var firstIssueUrl = retrieveUrlForSmartCardRender();
|
|
128
|
+
if (currentViewMode === 'count') {
|
|
129
|
+
onInsert({
|
|
130
|
+
type: 'inlineCard',
|
|
131
|
+
attrs: {
|
|
132
|
+
url: "".concat(selectedJiraSite.url, "/issues/").concat(encodeURI(jql))
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
} else if (responseItems.length === 1 && firstIssueUrl) {
|
|
136
|
+
onInsert({
|
|
137
|
+
type: 'inlineCard',
|
|
138
|
+
attrs: {
|
|
139
|
+
url: firstIssueUrl
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
} else {
|
|
143
|
+
onInsert({
|
|
144
|
+
type: 'blockCard',
|
|
145
|
+
attrs: {
|
|
146
|
+
datasource: {
|
|
147
|
+
id: datasourceId,
|
|
148
|
+
parameters: {
|
|
149
|
+
cloudId: cloudId,
|
|
150
|
+
jql: jql // TODO support non JQL type
|
|
151
|
+
},
|
|
152
|
+
|
|
153
|
+
views: [{
|
|
154
|
+
type: 'table',
|
|
155
|
+
properties: {
|
|
156
|
+
columnKeys: visibleColumnKeys
|
|
157
|
+
}
|
|
158
|
+
}]
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}, [isParametersSet, jql, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
|
|
164
|
+
var handleViewModeChange = function handleViewModeChange(selectedMode) {
|
|
165
|
+
setCurrentViewMode(selectedMode);
|
|
166
|
+
};
|
|
167
|
+
useEffect(function () {
|
|
168
|
+
if (status === 'empty' && isParametersSet) {
|
|
169
|
+
void onNextPage();
|
|
170
|
+
}
|
|
171
|
+
}, [status, isParametersSet, onNextPage, reset]);
|
|
172
|
+
var issueLikeDataTableView = useMemo(function () {
|
|
173
|
+
return jsx(IssueLikeDataTableView, {
|
|
174
|
+
testId: "jira-jql-datasource-table",
|
|
175
|
+
status: status,
|
|
176
|
+
columns: columns,
|
|
177
|
+
items: responseItems,
|
|
178
|
+
hasNextPage: hasNextPage,
|
|
179
|
+
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
180
|
+
onNextPage: onNextPage,
|
|
181
|
+
onVisibleColumnKeysChange: onVisibleColumnKeysChange
|
|
182
|
+
});
|
|
183
|
+
}, [columns, defaultVisibleColumnKeys, hasNextPage, onNextPage, onVisibleColumnKeysChange, responseItems, status, visibleColumnKeys]);
|
|
184
|
+
var renderCountModeContent = useCallback(function () {
|
|
185
|
+
var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
186
|
+
if (status === 'empty' || !jql || !url) {
|
|
187
|
+
return jsx("span", {
|
|
188
|
+
"data-testid": "jira-jql-datasource-modal--smart-card-placeholder",
|
|
189
|
+
css: placeholderSmartLinkStyles
|
|
190
|
+
}, jsx(FormattedMessage, modalMessages.issuesCountSmartCardPlaceholderText));
|
|
191
|
+
} else {
|
|
192
|
+
var urlWithEncodedJql = "".concat(url, "/issues/?jql=").concat(encodeURI(jql));
|
|
193
|
+
return jsx(LinkRenderType, {
|
|
194
|
+
url: urlWithEncodedJql
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}, [jql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status]);
|
|
198
|
+
var renderIssuesModeContent = useCallback(function () {
|
|
199
|
+
if (status === 'empty' || columns.length === 0) {
|
|
200
|
+
return jsx(EmptyState, {
|
|
201
|
+
testId: "jira-jql-datasource-modal--empty-state"
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
var firstIssueUrl = retrieveUrlForSmartCardRender();
|
|
205
|
+
if (responseItems.length === 1 && firstIssueUrl) {
|
|
206
|
+
return jsx(LinkRenderType, {
|
|
207
|
+
url: firstIssueUrl
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return issueLikeDataTableView;
|
|
211
|
+
}, [columns.length, issueLikeDataTableView, responseItems.length, retrieveUrlForSmartCardRender, status]);
|
|
212
|
+
return jsx(IntlProvider, {
|
|
213
|
+
locale: "en"
|
|
214
|
+
}, jsx(ModalTransition, null, jsx(Modal, {
|
|
215
|
+
testId: 'jira-jql-datasource-modal',
|
|
216
|
+
onClose: onCancel,
|
|
217
|
+
width: "x-large",
|
|
218
|
+
shouldScrollInViewport: true
|
|
219
|
+
}, jsx(ModalHeader, null, jsx(ModalTitle, null, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx("div", {
|
|
220
|
+
css: dropdownContainerStyles
|
|
221
|
+
}, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesTitleManySites, {
|
|
222
|
+
values: {
|
|
223
|
+
siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
|
|
224
|
+
}
|
|
225
|
+
})), jsx(JiraSiteSelector, {
|
|
226
|
+
testId: "jira-jql-datasource-modal--site-selector",
|
|
227
|
+
availableSites: availableSites,
|
|
228
|
+
onSiteSelection: onSiteSelection,
|
|
229
|
+
selectedJiraSite: selectedJiraSite
|
|
230
|
+
}))), jsx(ModeSwitcher, {
|
|
231
|
+
isCompact: true,
|
|
232
|
+
options: [{
|
|
233
|
+
label: formatMessage(modalMessages.issueViewModeLabel),
|
|
234
|
+
value: 'issue'
|
|
235
|
+
}, {
|
|
236
|
+
label: formatMessage(modalMessages.countViewModeLabel),
|
|
237
|
+
value: 'count'
|
|
238
|
+
}],
|
|
239
|
+
onOptionValueChange: handleViewModeChange,
|
|
240
|
+
selectedOptionValue: currentViewMode
|
|
241
|
+
})), jsx(ModalBody, null, jsx(JiraSearchContainer, {
|
|
242
|
+
parameters: parameters,
|
|
243
|
+
onSearch: onSearch
|
|
244
|
+
}), jsx("div", {
|
|
245
|
+
css: contentContainerStyles
|
|
246
|
+
}, currentViewMode === 'count' ? renderCountModeContent() : renderIssuesModeContent())), jsx(ModalFooter, null, jsx(Button, {
|
|
247
|
+
appearance: "default",
|
|
248
|
+
onClick: onCancel
|
|
249
|
+
}, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
|
|
250
|
+
appearance: "primary",
|
|
251
|
+
onClick: onInsertPressed,
|
|
252
|
+
isDisabled: !isParametersSet,
|
|
253
|
+
testId: 'jira-jql-datasource-modal--insert-button'
|
|
254
|
+
}, jsx(FormattedMessage, modalMessages.insertIssuesButtonText))))));
|
|
255
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var fuzzySearchRegExp = /^"(.+)"$/;
|
|
2
|
+
var jiraIssueKeyRegExp = /[A-Z]+-\d+/;
|
|
3
|
+
export var buildJQL = function buildJQL(input) {
|
|
4
|
+
var rawSearch = input.rawSearch,
|
|
5
|
+
_input$orderDirection = input.orderDirection,
|
|
6
|
+
orderDirection = _input$orderDirection === void 0 ? 'DESC' : _input$orderDirection,
|
|
7
|
+
_input$orderKey = input.orderKey,
|
|
8
|
+
orderKey = _input$orderKey === void 0 ? 'created' : _input$orderKey;
|
|
9
|
+
var fuzzy = !rawSearch.match(fuzzySearchRegExp) ? '*' : '';
|
|
10
|
+
var basicSearch = rawSearch.replace(/['"?*]+/g, '');
|
|
11
|
+
var baseQueryParts = rawSearch.trim() ? ["text ~ \"".concat(basicSearch).concat(fuzzy, "\""), "summary ~ \"".concat(basicSearch).concat(fuzzy, "\"")] : [];
|
|
12
|
+
if (jiraIssueKeyRegExp.test(rawSearch)) {
|
|
13
|
+
baseQueryParts.push("key = \"".concat(basicSearch, "\""));
|
|
14
|
+
}
|
|
15
|
+
var baseQueryContent = baseQueryParts.join(' OR ');
|
|
16
|
+
var baseQuery = baseQueryContent ? "(".concat(baseQueryContent, ")") : '';
|
|
17
|
+
var limiter = rawSearch !== null && rawSearch !== void 0 && rawSearch.trim() ? '' : "created >= -30d";
|
|
18
|
+
var query = [baseQuery, limiter].filter(Boolean).join(' AND ');
|
|
19
|
+
return "".concat(query, " order by ").concat(orderKey, " ").concat(orderDirection.toUpperCase());
|
|
20
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
/** @jsx jsx */
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { css, jsx } from '@emotion/react';
|
|
5
|
+
import { useIntl } from 'react-intl-next';
|
|
6
|
+
import { BasicSearchInput } from '../basic-search-input';
|
|
7
|
+
import { JiraJQLEditor } from '../jql-editor';
|
|
8
|
+
import { ModeSwitcher } from '../mode-switcher';
|
|
9
|
+
import { buildJQL } from './buildJQL';
|
|
10
|
+
import { modeSwitcherMessages } from './messages';
|
|
11
|
+
var inputContainerStyles = css({
|
|
12
|
+
alignItems: 'baseline',
|
|
13
|
+
display: 'flex',
|
|
14
|
+
gap: "var(--ds-space-250, 20px)",
|
|
15
|
+
minHeight: '60px'
|
|
16
|
+
});
|
|
17
|
+
export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
18
|
+
var parameters = props.parameters,
|
|
19
|
+
onSearch = props.onSearch;
|
|
20
|
+
var _ref = parameters || {},
|
|
21
|
+
cloudId = _ref.cloudId,
|
|
22
|
+
initialJql = _ref.value;
|
|
23
|
+
var _useIntl = useIntl(),
|
|
24
|
+
formatMessage = _useIntl.formatMessage;
|
|
25
|
+
var basicModeValue = 'basic';
|
|
26
|
+
var jqlModeValue = 'jql';
|
|
27
|
+
var _useState = useState(''),
|
|
28
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
29
|
+
basicSearchTerm = _useState2[0],
|
|
30
|
+
setBasicSearchTerm = _useState2[1];
|
|
31
|
+
var _useState3 = useState(initialJql ? jqlModeValue : basicModeValue),
|
|
32
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
33
|
+
currentSearchMode = _useState4[0],
|
|
34
|
+
setCurrentSearchMode = _useState4[1];
|
|
35
|
+
var _useState5 = useState(initialJql || ''),
|
|
36
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
37
|
+
jql = _useState6[0],
|
|
38
|
+
setJql = _useState6[1];
|
|
39
|
+
var _useState7 = useState(),
|
|
40
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
41
|
+
orderKey = _useState8[0],
|
|
42
|
+
setOrderKey = _useState8[1];
|
|
43
|
+
var _useState9 = useState(),
|
|
44
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
45
|
+
orderDirection = _useState10[0],
|
|
46
|
+
setOrderDirection = _useState10[1];
|
|
47
|
+
var onSearchModeChange = function onSearchModeChange(searchMode) {
|
|
48
|
+
setCurrentSearchMode(searchMode);
|
|
49
|
+
};
|
|
50
|
+
var handleBasicSearchChange = function handleBasicSearchChange(e) {
|
|
51
|
+
var rawSearch = e.currentTarget.value;
|
|
52
|
+
setBasicSearchTerm(rawSearch);
|
|
53
|
+
setJql(buildJQL({
|
|
54
|
+
rawSearch: rawSearch,
|
|
55
|
+
orderDirection: orderDirection,
|
|
56
|
+
orderKey: orderKey
|
|
57
|
+
}));
|
|
58
|
+
};
|
|
59
|
+
var onQueryChange = function onQueryChange(query) {
|
|
60
|
+
var _query$split$map$filt, _fragments$at, _fragments$at2, _fragments$at3;
|
|
61
|
+
// determine if order keys have been set so they can be saved and persisted when changes occur in basic search
|
|
62
|
+
var fragments = (_query$split$map$filt = query === null || query === void 0 ? void 0 : query.split(/(^| )(order by)( |$)/i).map(function (item) {
|
|
63
|
+
return item.trim();
|
|
64
|
+
}).filter(Boolean)) !== null && _query$split$map$filt !== void 0 ? _query$split$map$filt : [];
|
|
65
|
+
var hasOrder = ((_fragments$at = fragments.at(-2)) === null || _fragments$at === void 0 ? void 0 : _fragments$at.toLowerCase()) === 'order by';
|
|
66
|
+
var key = hasOrder ? (_fragments$at2 = fragments.at(-1)) === null || _fragments$at2 === void 0 ? void 0 : _fragments$at2.split(' ').at(-2) : undefined;
|
|
67
|
+
var order = hasOrder ? (_fragments$at3 = fragments.at(-1)) === null || _fragments$at3 === void 0 ? void 0 : _fragments$at3.split(' ').at(-1) : undefined;
|
|
68
|
+
|
|
69
|
+
// TODO: confirm if these are the only order keys we want to preserve - existing whiteboard logic
|
|
70
|
+
if (key && ['key', 'summary', 'assignee', 'status'].includes(key)) {
|
|
71
|
+
setOrderKey(key);
|
|
72
|
+
setOrderDirection(order);
|
|
73
|
+
}
|
|
74
|
+
setJql(query);
|
|
75
|
+
};
|
|
76
|
+
var handleSearch = function handleSearch() {
|
|
77
|
+
onSearch({
|
|
78
|
+
value: jql,
|
|
79
|
+
type: 'jql'
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
return jsx("div", {
|
|
83
|
+
css: inputContainerStyles
|
|
84
|
+
}, currentSearchMode === basicModeValue && jsx(BasicSearchInput, {
|
|
85
|
+
onChange: handleBasicSearchChange,
|
|
86
|
+
onSearch: handleSearch,
|
|
87
|
+
searchTerm: basicSearchTerm
|
|
88
|
+
}), currentSearchMode === jqlModeValue && jsx(JiraJQLEditor, {
|
|
89
|
+
cloudId: cloudId || '',
|
|
90
|
+
onChange: onQueryChange,
|
|
91
|
+
onSearch: handleSearch,
|
|
92
|
+
query: jql
|
|
93
|
+
}), jsx(ModeSwitcher, {
|
|
94
|
+
onOptionValueChange: onSearchModeChange,
|
|
95
|
+
selectedOptionValue: currentSearchMode,
|
|
96
|
+
options: [{
|
|
97
|
+
label: formatMessage(modeSwitcherMessages.basicTextSearchLabel),
|
|
98
|
+
value: basicModeValue
|
|
99
|
+
}, {
|
|
100
|
+
label: 'JQL',
|
|
101
|
+
value: jqlModeValue
|
|
102
|
+
}]
|
|
103
|
+
}));
|
|
104
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export var modeSwitcherMessages = defineMessages({
|
|
3
|
+
basicTextSearchLabel: {
|
|
4
|
+
id: 'linkDataSource.jira-issues.configmodal.basicModeText',
|
|
5
|
+
description: 'Display text for basic text search toggle button',
|
|
6
|
+
defaultMessage: 'Basic'
|
|
7
|
+
}
|
|
8
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
import { JQLEditor } from '@atlassianlabs/jql-editor';
|
|
3
|
+
import { useAutocompleteProvider } from '@atlassianlabs/jql-editor-autocomplete-rest';
|
|
4
|
+
import { makeGetJqlAutocompleteData } from '../../../../services/makeGetJqlAutocompleteData';
|
|
5
|
+
import { makeGetJqlSuggestionsData } from '../../../../services/makeGetJqlSuggestionsData';
|
|
6
|
+
export var JiraJQLEditor = function JiraJQLEditor(props) {
|
|
7
|
+
var cloudId = props.cloudId,
|
|
8
|
+
onChange = props.onChange,
|
|
9
|
+
onSearch = props.onSearch,
|
|
10
|
+
query = props.query;
|
|
11
|
+
var autocompleteProvider = useAutocompleteProvider('link-datasource', makeGetJqlAutocompleteData(cloudId), makeGetJqlSuggestionsData(cloudId));
|
|
12
|
+
|
|
13
|
+
// This is an expected (pretty strange imo) way of making sure text field is in focus when rendered
|
|
14
|
+
var inputRef = useRef({
|
|
15
|
+
focus: function focus() {}
|
|
16
|
+
});
|
|
17
|
+
useEffect(function () {
|
|
18
|
+
requestAnimationFrame(function () {
|
|
19
|
+
var _inputRef$current;
|
|
20
|
+
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
|
|
21
|
+
});
|
|
22
|
+
}, []);
|
|
23
|
+
return /*#__PURE__*/React.createElement(JQLEditor, {
|
|
24
|
+
analyticsSource: "link-datasource",
|
|
25
|
+
autocompleteProvider: autocompleteProvider,
|
|
26
|
+
onSearch: onSearch,
|
|
27
|
+
onUpdate: onChange,
|
|
28
|
+
inputRef: inputRef,
|
|
29
|
+
query: query
|
|
30
|
+
});
|
|
31
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export var modalMessages = defineMessages({
|
|
3
|
+
cancelButtonText: {
|
|
4
|
+
id: 'linkDataSource.jira-issues.configmodal.cancelButtonText',
|
|
5
|
+
description: 'Button text to close the modal with no changes being made',
|
|
6
|
+
defaultMessage: 'Cancel'
|
|
7
|
+
},
|
|
8
|
+
insertIssuesButtonText: {
|
|
9
|
+
id: 'linkDataSource.jira-issues.configmodal.insertIssuesButtonText',
|
|
10
|
+
description: 'Button text to insert the displayed content',
|
|
11
|
+
defaultMessage: 'Insert issues'
|
|
12
|
+
},
|
|
13
|
+
insertIssuesTitle: {
|
|
14
|
+
id: 'linkDataSource.jira-issues.configmodal.insertIssuesTitle',
|
|
15
|
+
description: 'Title for the Jira Issues Datasource config modal',
|
|
16
|
+
defaultMessage: 'Insert Jira issues'
|
|
17
|
+
},
|
|
18
|
+
insertIssuesTitleManySites: {
|
|
19
|
+
id: 'linkDataSource.jira-issues.configmodal.insertIssuesTitleManySites',
|
|
20
|
+
description: 'Title for the Jira Issues Datasource config modal when multiple sites are available',
|
|
21
|
+
defaultMessage: 'Insert Jira issues from {siteName}'
|
|
22
|
+
},
|
|
23
|
+
issueViewModeLabel: {
|
|
24
|
+
id: 'linkDataSource.jira-issues.configmodal.issueViewModeLabel',
|
|
25
|
+
description: 'Label for toggle to enable a view mode showing issues in a table list view',
|
|
26
|
+
defaultMessage: 'Issue view'
|
|
27
|
+
},
|
|
28
|
+
countViewModeLabel: {
|
|
29
|
+
id: 'linkDataSource.jira-issues.configmodal.countViewModeLabel',
|
|
30
|
+
description: 'Label for toggle to enable a view mode showing issues in as a total count',
|
|
31
|
+
defaultMessage: 'Count view'
|
|
32
|
+
},
|
|
33
|
+
issuesCountSmartCardPlaceholderText: {
|
|
34
|
+
id: 'linkDataSource.jira-issues.configmodal.issues',
|
|
35
|
+
description: 'Placeholder text that will be placed next to a count of jira issues',
|
|
36
|
+
defaultMessage: '### Issues'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import { N0, N20, N30A, N700 } from '@atlaskit/theme/colors';
|
|
5
|
+
var modeSwitcherStyles = css({
|
|
6
|
+
alignItems: 'center',
|
|
7
|
+
background: "var(--ds-background-neutral, ".concat(N20, ")"),
|
|
8
|
+
borderRadius: "var(--ds-space-050, 4px)",
|
|
9
|
+
boxSizing: 'border-box',
|
|
10
|
+
display: 'inline-flex',
|
|
11
|
+
gap: "var(--ds-space-050, 4px)",
|
|
12
|
+
lineHeight: "var(--ds-space-200, 16px)",
|
|
13
|
+
padding: "var(--ds-space-075, 6px)",
|
|
14
|
+
'&:disabled': {
|
|
15
|
+
opacity: '0.5'
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var compactModeSwitcherStyles = css({
|
|
19
|
+
padding: "var(--ds-space-050, 4px)",
|
|
20
|
+
gap: "var(--ds-space-025, 2px)"
|
|
21
|
+
});
|
|
22
|
+
var modeInputStyles = css({
|
|
23
|
+
display: 'none'
|
|
24
|
+
});
|
|
25
|
+
var modeSwitcherLabelStyles = css({
|
|
26
|
+
color: "var(--ds-text-subtlest, ".concat(N700, ")"),
|
|
27
|
+
fontSize: "var(--ds-space-150, 12px)",
|
|
28
|
+
fontWeight: '600',
|
|
29
|
+
textTransform: 'uppercase',
|
|
30
|
+
padding: "var(--ds-space-050, 4px)",
|
|
31
|
+
borderRadius: "var(--ds-space-050, 4px)",
|
|
32
|
+
':hover': {
|
|
33
|
+
cursor: 'pointer',
|
|
34
|
+
backgroundColor: "var(--ds-background-neutral-subtle-hovered, ".concat(N30A, ")")
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
var modeSwitcherLabelSelectedStyles = css({
|
|
38
|
+
backgroundColor: "var(--ds-background-input-pressed, ".concat(N0, ")"),
|
|
39
|
+
borderRadius: "var(--ds-space-050, 4px)",
|
|
40
|
+
boxShadow: "var(--ds-shadow-overflow, 0px 0px 1px rgba(9, 30, 66, 0.12), 0px 0px 8px rgba(9, 30, 66, 0.16))",
|
|
41
|
+
':hover': {
|
|
42
|
+
cursor: 'pointer',
|
|
43
|
+
backgroundColor: "var(--ds-background-input-pressed, ".concat(N0, ")")
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
var modeSwitcherLabelDisabledStyles = css({
|
|
47
|
+
':hover': {
|
|
48
|
+
cursor: 'not-allowed'
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
var compactModeSwitcherLabelStyles = css({
|
|
52
|
+
padding: "var(--ds-space-025, 2px)".concat(" ", "var(--ds-space-050, 4px)")
|
|
53
|
+
});
|
|
54
|
+
export var ModeSwitcher = function ModeSwitcher(props) {
|
|
55
|
+
var _options$;
|
|
56
|
+
var isCompact = props.isCompact,
|
|
57
|
+
isDisabled = props.isDisabled,
|
|
58
|
+
onOptionValueChange = props.onOptionValueChange,
|
|
59
|
+
options = props.options,
|
|
60
|
+
_props$selectedOption = props.selectedOptionValue,
|
|
61
|
+
selectedOptionValue = _props$selectedOption === void 0 ? (_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.value : _props$selectedOption;
|
|
62
|
+
var handleModeChange = function handleModeChange(event) {
|
|
63
|
+
onOptionValueChange(event.currentTarget.value);
|
|
64
|
+
};
|
|
65
|
+
return options.length > 0 ? jsx("fieldset", {
|
|
66
|
+
css: [modeSwitcherStyles, isCompact && compactModeSwitcherStyles],
|
|
67
|
+
"data-testid": "mode-toggle-container",
|
|
68
|
+
disabled: isDisabled
|
|
69
|
+
}, options.map(function (_ref) {
|
|
70
|
+
var value = _ref.value,
|
|
71
|
+
label = _ref.label;
|
|
72
|
+
var isSelected = value === selectedOptionValue;
|
|
73
|
+
return jsx("label", {
|
|
74
|
+
key: value,
|
|
75
|
+
css: [modeSwitcherLabelStyles, isCompact && compactModeSwitcherLabelStyles, isSelected && modeSwitcherLabelSelectedStyles, isDisabled && modeSwitcherLabelDisabledStyles],
|
|
76
|
+
"data-testid": "mode-toggle-".concat(value)
|
|
77
|
+
}, label, jsx("input", {
|
|
78
|
+
"aria-checked": isSelected,
|
|
79
|
+
"aria-disabled": isDisabled,
|
|
80
|
+
checked: isSelected,
|
|
81
|
+
css: modeInputStyles,
|
|
82
|
+
disabled: isDisabled,
|
|
83
|
+
onChange: handleModeChange,
|
|
84
|
+
type: "radio",
|
|
85
|
+
value: value
|
|
86
|
+
}));
|
|
87
|
+
})) : null;
|
|
88
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
var _excluded = ["triggerRef"];
|
|
4
|
+
/** @jsx jsx */
|
|
5
|
+
import { jsx } from '@emotion/react';
|
|
6
|
+
import { useIntl } from 'react-intl-next';
|
|
7
|
+
import Button from '@atlaskit/button/standard-button';
|
|
8
|
+
import DropdownMenu, { DropdownItem, DropdownItemGroup } from '@atlaskit/dropdown-menu';
|
|
9
|
+
import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
|
|
10
|
+
import { siteSelectorMessages } from './messages';
|
|
11
|
+
export var JiraSiteSelector = function JiraSiteSelector(props) {
|
|
12
|
+
var availableSites = props.availableSites,
|
|
13
|
+
onSiteSelection = props.onSiteSelection,
|
|
14
|
+
selectedJiraSite = props.selectedJiraSite,
|
|
15
|
+
testId = props.testId;
|
|
16
|
+
var intl = useIntl();
|
|
17
|
+
return jsx(DropdownMenu, {
|
|
18
|
+
spacing: "compact",
|
|
19
|
+
testId: testId,
|
|
20
|
+
trigger: function trigger(_ref) {
|
|
21
|
+
var triggerRef = _ref.triggerRef,
|
|
22
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
23
|
+
return jsx(Button, _extends({}, props, {
|
|
24
|
+
spacing: "none",
|
|
25
|
+
iconBefore: jsx(ChevronDownIcon, {
|
|
26
|
+
label: intl.formatMessage(siteSelectorMessages.dropdownChevronLabel)
|
|
27
|
+
}),
|
|
28
|
+
ref: triggerRef
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
}, jsx(DropdownItemGroup, null, availableSites.map(function (availableSite) {
|
|
32
|
+
var displayName = availableSite.displayName,
|
|
33
|
+
cloudId = availableSite.cloudId;
|
|
34
|
+
var isSelected = displayName === (selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName);
|
|
35
|
+
return jsx(DropdownItem, {
|
|
36
|
+
isSelected: isSelected,
|
|
37
|
+
key: cloudId,
|
|
38
|
+
onClick: function onClick() {
|
|
39
|
+
return onSiteSelection(availableSite);
|
|
40
|
+
},
|
|
41
|
+
testId: testId && "".concat(testId, "--dropdown-item").concat(isSelected ? '__selected' : '')
|
|
42
|
+
}, displayName);
|
|
43
|
+
})));
|
|
44
|
+
};
|