@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,90 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import { useIntl } from 'react-intl-next';
|
|
5
|
+
import { BasicSearchInput } from '../basic-search-input';
|
|
6
|
+
import { JiraJQLEditor } from '../jql-editor';
|
|
7
|
+
import { ModeSwitcher } from '../mode-switcher';
|
|
8
|
+
import { buildJQL } from './buildJQL';
|
|
9
|
+
import { modeSwitcherMessages } from './messages';
|
|
10
|
+
const inputContainerStyles = css({
|
|
11
|
+
alignItems: 'baseline',
|
|
12
|
+
display: 'flex',
|
|
13
|
+
gap: "var(--ds-space-250, 20px)",
|
|
14
|
+
minHeight: '60px'
|
|
15
|
+
});
|
|
16
|
+
export const JiraSearchContainer = props => {
|
|
17
|
+
const {
|
|
18
|
+
parameters,
|
|
19
|
+
onSearch
|
|
20
|
+
} = props;
|
|
21
|
+
const {
|
|
22
|
+
cloudId,
|
|
23
|
+
value: initialJql
|
|
24
|
+
} = parameters || {};
|
|
25
|
+
const {
|
|
26
|
+
formatMessage
|
|
27
|
+
} = useIntl();
|
|
28
|
+
const basicModeValue = 'basic';
|
|
29
|
+
const jqlModeValue = 'jql';
|
|
30
|
+
const [basicSearchTerm, setBasicSearchTerm] = useState('');
|
|
31
|
+
const [currentSearchMode, setCurrentSearchMode] = useState(initialJql ? jqlModeValue : basicModeValue);
|
|
32
|
+
const [jql, setJql] = useState(initialJql || '');
|
|
33
|
+
const [orderKey, setOrderKey] = useState();
|
|
34
|
+
const [orderDirection, setOrderDirection] = useState();
|
|
35
|
+
const onSearchModeChange = searchMode => {
|
|
36
|
+
setCurrentSearchMode(searchMode);
|
|
37
|
+
};
|
|
38
|
+
const handleBasicSearchChange = e => {
|
|
39
|
+
const rawSearch = e.currentTarget.value;
|
|
40
|
+
setBasicSearchTerm(rawSearch);
|
|
41
|
+
setJql(buildJQL({
|
|
42
|
+
rawSearch,
|
|
43
|
+
orderDirection,
|
|
44
|
+
orderKey
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
const onQueryChange = query => {
|
|
48
|
+
var _query$split$map$filt, _fragments$at, _fragments$at2, _fragments$at3;
|
|
49
|
+
// determine if order keys have been set so they can be saved and persisted when changes occur in basic search
|
|
50
|
+
const fragments = (_query$split$map$filt = query === null || query === void 0 ? void 0 : query.split(/(^| )(order by)( |$)/i).map(item => item.trim()).filter(Boolean)) !== null && _query$split$map$filt !== void 0 ? _query$split$map$filt : [];
|
|
51
|
+
const hasOrder = ((_fragments$at = fragments.at(-2)) === null || _fragments$at === void 0 ? void 0 : _fragments$at.toLowerCase()) === 'order by';
|
|
52
|
+
const key = hasOrder ? (_fragments$at2 = fragments.at(-1)) === null || _fragments$at2 === void 0 ? void 0 : _fragments$at2.split(' ').at(-2) : undefined;
|
|
53
|
+
const order = hasOrder ? (_fragments$at3 = fragments.at(-1)) === null || _fragments$at3 === void 0 ? void 0 : _fragments$at3.split(' ').at(-1) : undefined;
|
|
54
|
+
|
|
55
|
+
// TODO: confirm if these are the only order keys we want to preserve - existing whiteboard logic
|
|
56
|
+
if (key && ['key', 'summary', 'assignee', 'status'].includes(key)) {
|
|
57
|
+
setOrderKey(key);
|
|
58
|
+
setOrderDirection(order);
|
|
59
|
+
}
|
|
60
|
+
setJql(query);
|
|
61
|
+
};
|
|
62
|
+
const handleSearch = () => {
|
|
63
|
+
onSearch({
|
|
64
|
+
value: jql,
|
|
65
|
+
type: 'jql'
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
return jsx("div", {
|
|
69
|
+
css: inputContainerStyles
|
|
70
|
+
}, currentSearchMode === basicModeValue && jsx(BasicSearchInput, {
|
|
71
|
+
onChange: handleBasicSearchChange,
|
|
72
|
+
onSearch: handleSearch,
|
|
73
|
+
searchTerm: basicSearchTerm
|
|
74
|
+
}), currentSearchMode === jqlModeValue && jsx(JiraJQLEditor, {
|
|
75
|
+
cloudId: cloudId || '',
|
|
76
|
+
onChange: onQueryChange,
|
|
77
|
+
onSearch: handleSearch,
|
|
78
|
+
query: jql
|
|
79
|
+
}), jsx(ModeSwitcher, {
|
|
80
|
+
onOptionValueChange: onSearchModeChange,
|
|
81
|
+
selectedOptionValue: currentSearchMode,
|
|
82
|
+
options: [{
|
|
83
|
+
label: formatMessage(modeSwitcherMessages.basicTextSearchLabel),
|
|
84
|
+
value: basicModeValue
|
|
85
|
+
}, {
|
|
86
|
+
label: 'JQL',
|
|
87
|
+
value: jqlModeValue
|
|
88
|
+
}]
|
|
89
|
+
}));
|
|
90
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export const 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,33 @@
|
|
|
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 const JiraJQLEditor = props => {
|
|
7
|
+
const {
|
|
8
|
+
cloudId,
|
|
9
|
+
onChange,
|
|
10
|
+
onSearch,
|
|
11
|
+
query
|
|
12
|
+
} = props;
|
|
13
|
+
const autocompleteProvider = useAutocompleteProvider('link-datasource', makeGetJqlAutocompleteData(cloudId), makeGetJqlSuggestionsData(cloudId));
|
|
14
|
+
|
|
15
|
+
// This is an expected (pretty strange imo) way of making sure text field is in focus when rendered
|
|
16
|
+
const inputRef = useRef({
|
|
17
|
+
focus: () => {}
|
|
18
|
+
});
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
requestAnimationFrame(() => {
|
|
21
|
+
var _inputRef$current;
|
|
22
|
+
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
|
|
23
|
+
});
|
|
24
|
+
}, []);
|
|
25
|
+
return /*#__PURE__*/React.createElement(JQLEditor, {
|
|
26
|
+
analyticsSource: "link-datasource",
|
|
27
|
+
autocompleteProvider: autocompleteProvider,
|
|
28
|
+
onSearch: onSearch,
|
|
29
|
+
onUpdate: onChange,
|
|
30
|
+
inputRef: inputRef,
|
|
31
|
+
query: query
|
|
32
|
+
});
|
|
33
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export const 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,90 @@
|
|
|
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
|
+
const modeSwitcherStyles = css({
|
|
6
|
+
alignItems: 'center',
|
|
7
|
+
background: `var(--ds-background-neutral, ${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
|
+
const compactModeSwitcherStyles = css({
|
|
19
|
+
padding: "var(--ds-space-050, 4px)",
|
|
20
|
+
gap: "var(--ds-space-025, 2px)"
|
|
21
|
+
});
|
|
22
|
+
const modeInputStyles = css({
|
|
23
|
+
display: 'none'
|
|
24
|
+
});
|
|
25
|
+
const modeSwitcherLabelStyles = css({
|
|
26
|
+
color: `var(--ds-text-subtlest, ${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, ${N30A})`
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const modeSwitcherLabelSelectedStyles = css({
|
|
38
|
+
backgroundColor: `var(--ds-background-input-pressed, ${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, ${N0})`
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
const modeSwitcherLabelDisabledStyles = css({
|
|
47
|
+
':hover': {
|
|
48
|
+
cursor: 'not-allowed'
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const compactModeSwitcherLabelStyles = css({
|
|
52
|
+
padding: `${"var(--ds-space-025, 2px)"} ${"var(--ds-space-050, 4px)"}`
|
|
53
|
+
});
|
|
54
|
+
export const ModeSwitcher = props => {
|
|
55
|
+
var _options$;
|
|
56
|
+
const {
|
|
57
|
+
isCompact,
|
|
58
|
+
isDisabled,
|
|
59
|
+
onOptionValueChange,
|
|
60
|
+
options,
|
|
61
|
+
selectedOptionValue = (_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.value
|
|
62
|
+
} = props;
|
|
63
|
+
const handleModeChange = event => {
|
|
64
|
+
onOptionValueChange(event.currentTarget.value);
|
|
65
|
+
};
|
|
66
|
+
return options.length > 0 ? jsx("fieldset", {
|
|
67
|
+
css: [modeSwitcherStyles, isCompact && compactModeSwitcherStyles],
|
|
68
|
+
"data-testid": "mode-toggle-container",
|
|
69
|
+
disabled: isDisabled
|
|
70
|
+
}, options.map(({
|
|
71
|
+
value,
|
|
72
|
+
label
|
|
73
|
+
}) => {
|
|
74
|
+
const isSelected = value === selectedOptionValue;
|
|
75
|
+
return jsx("label", {
|
|
76
|
+
key: value,
|
|
77
|
+
css: [modeSwitcherLabelStyles, isCompact && compactModeSwitcherLabelStyles, isSelected && modeSwitcherLabelSelectedStyles, isDisabled && modeSwitcherLabelDisabledStyles],
|
|
78
|
+
"data-testid": `mode-toggle-${value}`
|
|
79
|
+
}, label, jsx("input", {
|
|
80
|
+
"aria-checked": isSelected,
|
|
81
|
+
"aria-disabled": isDisabled,
|
|
82
|
+
checked: isSelected,
|
|
83
|
+
css: modeInputStyles,
|
|
84
|
+
disabled: isDisabled,
|
|
85
|
+
onChange: handleModeChange,
|
|
86
|
+
type: "radio",
|
|
87
|
+
value: value
|
|
88
|
+
}));
|
|
89
|
+
})) : null;
|
|
90
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
/** @jsx jsx */
|
|
3
|
+
import { jsx } from '@emotion/react';
|
|
4
|
+
import { useIntl } from 'react-intl-next';
|
|
5
|
+
import Button from '@atlaskit/button/standard-button';
|
|
6
|
+
import DropdownMenu, { DropdownItem, DropdownItemGroup } from '@atlaskit/dropdown-menu';
|
|
7
|
+
import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
|
|
8
|
+
import { siteSelectorMessages } from './messages';
|
|
9
|
+
export const JiraSiteSelector = props => {
|
|
10
|
+
const {
|
|
11
|
+
availableSites,
|
|
12
|
+
onSiteSelection,
|
|
13
|
+
selectedJiraSite,
|
|
14
|
+
testId
|
|
15
|
+
} = props;
|
|
16
|
+
const intl = useIntl();
|
|
17
|
+
return jsx(DropdownMenu, {
|
|
18
|
+
spacing: "compact",
|
|
19
|
+
testId: testId,
|
|
20
|
+
trigger: ({
|
|
21
|
+
triggerRef,
|
|
22
|
+
...props
|
|
23
|
+
}) => jsx(Button, _extends({}, props, {
|
|
24
|
+
spacing: "none",
|
|
25
|
+
iconBefore: jsx(ChevronDownIcon, {
|
|
26
|
+
label: intl.formatMessage(siteSelectorMessages.dropdownChevronLabel)
|
|
27
|
+
}),
|
|
28
|
+
ref: triggerRef
|
|
29
|
+
}))
|
|
30
|
+
}, jsx(DropdownItemGroup, null, availableSites.map(availableSite => {
|
|
31
|
+
const {
|
|
32
|
+
displayName,
|
|
33
|
+
cloudId
|
|
34
|
+
} = availableSite;
|
|
35
|
+
const isSelected = displayName === (selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName);
|
|
36
|
+
return jsx(DropdownItem, {
|
|
37
|
+
isSelected: isSelected,
|
|
38
|
+
key: cloudId,
|
|
39
|
+
onClick: () => onSiteSelection(availableSite),
|
|
40
|
+
testId: testId && `${testId}--dropdown-item${isSelected ? '__selected' : ''}`
|
|
41
|
+
}, displayName);
|
|
42
|
+
})));
|
|
43
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export const siteSelectorMessages = defineMessages({
|
|
3
|
+
dropdownChevronLabel: {
|
|
4
|
+
id: 'linkDataSource.jira-issues.configmodal.dropdownChevronLabel',
|
|
5
|
+
description: 'Label for button that reveals more available site options to choose from',
|
|
6
|
+
defaultMessage: 'Pick jira site'
|
|
7
|
+
},
|
|
8
|
+
selectedJiraSiteLabel: {
|
|
9
|
+
id: 'linkDataSource.jira-issues.configmodal.selectedJiraSiteLabel',
|
|
10
|
+
description: 'Label for a check icon declaring which option is selected',
|
|
11
|
+
defaultMessage: '{siteName} is selected'
|
|
12
|
+
}
|
|
13
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
/** @jsx jsx */
|
|
3
|
+
import { Fragment, useEffect, useState } from 'react';
|
|
4
|
+
import { jsx } from '@emotion/react';
|
|
5
|
+
import styled from '@emotion/styled';
|
|
6
|
+
import { FormattedMessage, useIntl } from 'react-intl-next';
|
|
7
|
+
import Button from '@atlaskit/button';
|
|
8
|
+
import Heading from '@atlaskit/heading';
|
|
9
|
+
import RefreshIcon from '@atlaskit/icon/glyph/refresh';
|
|
10
|
+
import { N0, N40, N800, N90 } from '@atlaskit/theme/colors';
|
|
11
|
+
import { footerMessages } from './messages';
|
|
12
|
+
import { SyncInfo } from './sync-info';
|
|
13
|
+
const FooterWrapper = styled.div`
|
|
14
|
+
display: flex;
|
|
15
|
+
justify-content: space-between;
|
|
16
|
+
width: 100%;
|
|
17
|
+
padding: ${"var(--ds-space-250, 20px)"} 0;
|
|
18
|
+
position: sticky;
|
|
19
|
+
bottom: 0;
|
|
20
|
+
background: ${`var(--ds-background-input, ${N0})`};
|
|
21
|
+
border-top-style: solid;
|
|
22
|
+
border-top-color: ${`var(--ds-background-neutral, ${N40})`};
|
|
23
|
+
margin-top: -2px;
|
|
24
|
+
align-self: center;
|
|
25
|
+
`;
|
|
26
|
+
const IssueCounterWrapper = styled.div`
|
|
27
|
+
margin-left: 10px;
|
|
28
|
+
display: flex;
|
|
29
|
+
align-self: center;
|
|
30
|
+
color: ${`var(--ds-text-accent-gray, ${N800})`};
|
|
31
|
+
`;
|
|
32
|
+
const SyncWrapper = styled.div`
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
color: ${`var(--ds-text-accent-gray, ${N90})`};
|
|
36
|
+
`;
|
|
37
|
+
const SyncTextWrapper = styled.div`
|
|
38
|
+
margin-right: 5px;
|
|
39
|
+
`;
|
|
40
|
+
export const TableFooter = ({
|
|
41
|
+
issueCount,
|
|
42
|
+
onRefresh,
|
|
43
|
+
isLoading
|
|
44
|
+
}) => {
|
|
45
|
+
const intl = useIntl();
|
|
46
|
+
const [lastSyncTime, setLastSyncTime] = useState(new Date());
|
|
47
|
+
const showIssueCount = issueCount && issueCount > 0 ? true : issueCount === 0 ? !isLoading : false;
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (isLoading) {
|
|
50
|
+
setLastSyncTime(new Date());
|
|
51
|
+
}
|
|
52
|
+
}, [isLoading]);
|
|
53
|
+
|
|
54
|
+
// If only one of the two is passed in, still show the other one (Note: We keep the div encapsulating the one not shown to
|
|
55
|
+
// ensure correct positioning since 'justify-content: space-between' is used).
|
|
56
|
+
return onRefresh || showIssueCount ? jsx(FooterWrapper, {
|
|
57
|
+
"data-testid": "table-footer"
|
|
58
|
+
}, jsx(IssueCounterWrapper, null, showIssueCount && jsx(Heading, {
|
|
59
|
+
testId: "issue-count",
|
|
60
|
+
level: 'h400'
|
|
61
|
+
}, jsx(FormattedMessage, _extends({}, footerMessages.issueText, {
|
|
62
|
+
values: {
|
|
63
|
+
issueCount
|
|
64
|
+
}
|
|
65
|
+
})))), jsx(SyncWrapper, null, onRefresh && jsx(Fragment, null, jsx(SyncTextWrapper, {
|
|
66
|
+
"data-testid": "sync-text"
|
|
67
|
+
}, isLoading ? jsx(FormattedMessage, footerMessages.loadingText) : jsx(SyncInfo, {
|
|
68
|
+
lastSyncTime: lastSyncTime
|
|
69
|
+
})), jsx(Button, {
|
|
70
|
+
onClick: onRefresh,
|
|
71
|
+
appearance: "subtle",
|
|
72
|
+
iconBefore: jsx(RefreshIcon, {
|
|
73
|
+
label: intl.formatMessage(footerMessages.refreshLabel)
|
|
74
|
+
}),
|
|
75
|
+
isDisabled: isLoading,
|
|
76
|
+
testId: "refresh-button"
|
|
77
|
+
})))) : null;
|
|
78
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export const footerMessages = defineMessages({
|
|
3
|
+
issueText: {
|
|
4
|
+
id: 'linkDataSource.jira-issues.table-footer.issue',
|
|
5
|
+
description: 'Text that appears after issue count number if there is only 1 issue.',
|
|
6
|
+
defaultMessage: '{issueCount} {issueCount, plural, one {issue} other {issues}}'
|
|
7
|
+
},
|
|
8
|
+
loadingText: {
|
|
9
|
+
id: 'linkDataSource.jira-issues.table-footer.loading',
|
|
10
|
+
description: 'Text that appears when table is loading.',
|
|
11
|
+
defaultMessage: 'Loading...'
|
|
12
|
+
},
|
|
13
|
+
refreshLabel: {
|
|
14
|
+
id: 'linkDataSource.jira-issues.table-footer.refresh',
|
|
15
|
+
description: 'Label for refresh icon',
|
|
16
|
+
defaultMessage: 'Refresh'
|
|
17
|
+
}
|
|
18
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { FormattedDate, FormattedMessage, FormattedRelativeTime } from 'react-intl-next';
|
|
4
|
+
import { messages } from './messages';
|
|
5
|
+
const SECONDS_IN_MIN = 60;
|
|
6
|
+
const SECONDS_IN_HR = SECONDS_IN_MIN * 60;
|
|
7
|
+
const SECONDS_IN_DAY = SECONDS_IN_HR * 24;
|
|
8
|
+
const WithUpdatedLabel = formattedDate => {
|
|
9
|
+
const i18nMessage = formattedDate ? messages.overOneMinuteText : messages.underOneMinuteText;
|
|
10
|
+
return /*#__PURE__*/React.createElement(FormattedMessage, _extends({}, i18nMessage, {
|
|
11
|
+
values: {
|
|
12
|
+
date: formattedDate
|
|
13
|
+
}
|
|
14
|
+
}));
|
|
15
|
+
};
|
|
16
|
+
export const SyncInfo = ({
|
|
17
|
+
lastSyncTime
|
|
18
|
+
}) => {
|
|
19
|
+
const calculateTimeDiff = useCallback(() => Math.floor((Date.now() - lastSyncTime.getTime()) / 1000), [lastSyncTime]);
|
|
20
|
+
const [secondsSinceUpdate, setSecondsSinceUpdate] = useState(calculateTimeDiff());
|
|
21
|
+
const totalDays = Math.floor(secondsSinceUpdate / SECONDS_IN_DAY);
|
|
22
|
+
const totalHours = Math.floor(secondsSinceUpdate / SECONDS_IN_HR);
|
|
23
|
+
const totalMinutes = Math.floor(secondsSinceUpdate / SECONDS_IN_MIN);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
setSecondsSinceUpdate(calculateTimeDiff());
|
|
26
|
+
const interval = setInterval(() => setSecondsSinceUpdate(calculateTimeDiff()), 1000);
|
|
27
|
+
return () => clearInterval(interval);
|
|
28
|
+
}, [lastSyncTime, calculateTimeDiff]);
|
|
29
|
+
if (totalMinutes >= 1 && totalMinutes < 60) {
|
|
30
|
+
return /*#__PURE__*/React.createElement(FormattedRelativeTime, {
|
|
31
|
+
value: -totalMinutes,
|
|
32
|
+
style: "long",
|
|
33
|
+
unit: "minute"
|
|
34
|
+
}, WithUpdatedLabel);
|
|
35
|
+
}
|
|
36
|
+
if (totalHours >= 1 && totalHours < 24) {
|
|
37
|
+
return /*#__PURE__*/React.createElement(FormattedRelativeTime, {
|
|
38
|
+
value: -totalHours,
|
|
39
|
+
style: "long",
|
|
40
|
+
unit: "hour"
|
|
41
|
+
}, WithUpdatedLabel);
|
|
42
|
+
}
|
|
43
|
+
if (totalDays >= 1 && totalDays < 8) {
|
|
44
|
+
return /*#__PURE__*/React.createElement(FormattedRelativeTime, {
|
|
45
|
+
value: -totalDays,
|
|
46
|
+
style: "long",
|
|
47
|
+
unit: "day"
|
|
48
|
+
}, WithUpdatedLabel);
|
|
49
|
+
}
|
|
50
|
+
if (totalDays >= 8) {
|
|
51
|
+
return /*#__PURE__*/React.createElement(FormattedDate, {
|
|
52
|
+
year: "numeric",
|
|
53
|
+
month: "short",
|
|
54
|
+
day: "2-digit",
|
|
55
|
+
value: lastSyncTime
|
|
56
|
+
}, WithUpdatedLabel);
|
|
57
|
+
}
|
|
58
|
+
return WithUpdatedLabel();
|
|
59
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export const messages = defineMessages({
|
|
3
|
+
underOneMinuteText: {
|
|
4
|
+
id: 'linkDataSource.jira-issues.table-footer.date_formatter.under_one_minute',
|
|
5
|
+
defaultMessage: 'Synced just now',
|
|
6
|
+
description: 'A text to indicate the last data fetch time was under a minute.'
|
|
7
|
+
},
|
|
8
|
+
overOneMinuteText: {
|
|
9
|
+
id: 'linkDataSource.jira-issues.table-footer.date_formatter.under_over_minute',
|
|
10
|
+
defaultMessage: 'Synced {date}',
|
|
11
|
+
description: 'A text to indicate the last data fetch time was over a minute.'
|
|
12
|
+
}
|
|
13
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import Spinner from '@atlaskit/spinner';
|
|
5
|
+
import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
|
|
6
|
+
import { IssueLikeDataTableView } from '../issue-like-table';
|
|
7
|
+
import { TableFooter } from './table-footer';
|
|
8
|
+
const TableViewWrapperStyles = css({
|
|
9
|
+
display: 'flex',
|
|
10
|
+
flexDirection: 'column',
|
|
11
|
+
width: '100%',
|
|
12
|
+
height: '100%',
|
|
13
|
+
position: 'relative',
|
|
14
|
+
padding: "var(--ds-space-200, 16px)",
|
|
15
|
+
paddingBottom: 0,
|
|
16
|
+
boxSizing: 'border-box'
|
|
17
|
+
});
|
|
18
|
+
export const JiraIssuesTableView = ({
|
|
19
|
+
datasourceId,
|
|
20
|
+
parameters,
|
|
21
|
+
visibleColumnKeys,
|
|
22
|
+
onVisibleColumnKeysChange
|
|
23
|
+
}) => {
|
|
24
|
+
const {
|
|
25
|
+
reset,
|
|
26
|
+
status,
|
|
27
|
+
onNextPage,
|
|
28
|
+
responseItems,
|
|
29
|
+
hasNextPage,
|
|
30
|
+
columns,
|
|
31
|
+
defaultVisibleColumnKeys,
|
|
32
|
+
totalIssueCount
|
|
33
|
+
} = useDatasourceTableState(datasourceId, parameters);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (onVisibleColumnKeysChange && (visibleColumnKeys || []).length === 0 && defaultVisibleColumnKeys.length > 0) {
|
|
36
|
+
onVisibleColumnKeysChange(defaultVisibleColumnKeys);
|
|
37
|
+
}
|
|
38
|
+
}, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
|
|
39
|
+
return columns.length > 0 ? jsx("div", {
|
|
40
|
+
css: TableViewWrapperStyles
|
|
41
|
+
}, jsx(IssueLikeDataTableView, {
|
|
42
|
+
testId: 'jira-issues-table-view',
|
|
43
|
+
hasNextPage: hasNextPage,
|
|
44
|
+
items: responseItems,
|
|
45
|
+
onNextPage: onNextPage,
|
|
46
|
+
status: status,
|
|
47
|
+
columns: columns,
|
|
48
|
+
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
49
|
+
onVisibleColumnKeysChange: onVisibleColumnKeysChange
|
|
50
|
+
}), jsx(TableFooter, {
|
|
51
|
+
issueCount: totalIssueCount,
|
|
52
|
+
onRefresh: reset,
|
|
53
|
+
isLoading: status === 'loading'
|
|
54
|
+
})) : jsx(Spinner, {
|
|
55
|
+
testId: 'jira-issues-table-view-spinner'
|
|
56
|
+
});
|
|
57
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|