@atlaskit/link-datasource 0.19.0 → 0.20.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 +12 -0
- package/dist/cjs/hooks/useDatasourceTableState.js +1 -1
- package/dist/cjs/index.js +8 -4
- package/dist/cjs/ui/{datasourceTableView.js → datasource-table-view/datasourceTableView.js} +3 -3
- package/dist/cjs/ui/datasource-table-view/index.js +29 -0
- package/dist/cjs/ui/datasource-table-view/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/column-picker/index.js +8 -4
- package/dist/cjs/ui/issue-like-table/column-picker/messages.js +15 -0
- package/dist/cjs/ui/issue-like-table/index.js +4 -3
- package/dist/cjs/ui/issue-like-table/styled.js +1 -1
- package/dist/cjs/ui/jira-issues-modal/index.js +22 -266
- package/dist/cjs/ui/jira-issues-modal/modal/index.js +275 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/hooks/useDatasourceTableState.js +1 -1
- package/dist/es2019/index.js +2 -2
- package/dist/es2019/ui/{datasourceTableView.js → datasource-table-view/datasourceTableView.js} +3 -3
- package/dist/es2019/ui/datasource-table-view/index.js +12 -0
- package/dist/es2019/ui/datasource-table-view/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/column-picker/index.js +7 -3
- package/dist/es2019/ui/issue-like-table/column-picker/messages.js +8 -0
- package/dist/es2019/ui/issue-like-table/index.js +4 -3
- package/dist/es2019/ui/issue-like-table/styled.js +1 -1
- package/dist/es2019/ui/jira-issues-modal/index.js +13 -222
- package/dist/es2019/ui/jira-issues-modal/modal/index.js +223 -0
- package/dist/es2019/version.json +1 -1
- package/dist/esm/hooks/useDatasourceTableState.js +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/ui/{datasourceTableView.js → datasource-table-view/datasourceTableView.js} +3 -3
- package/dist/esm/ui/datasource-table-view/index.js +16 -0
- package/dist/esm/ui/datasource-table-view/types.js +1 -0
- package/dist/esm/ui/issue-like-table/column-picker/index.js +8 -4
- package/dist/esm/ui/issue-like-table/column-picker/messages.js +8 -0
- package/dist/esm/ui/issue-like-table/index.js +4 -3
- package/dist/esm/ui/issue-like-table/styled.js +1 -1
- package/dist/esm/ui/jira-issues-modal/index.js +17 -262
- package/dist/esm/ui/jira-issues-modal/modal/index.js +263 -0
- package/dist/esm/version.json +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/ui/datasource-table-view/datasourceTableView.d.ts +3 -0
- package/dist/types/ui/datasource-table-view/index.d.ts +4 -0
- package/dist/types/ui/{datasourceTableView.d.ts → datasource-table-view/types.d.ts} +0 -2
- package/dist/types/ui/issue-like-table/column-picker/index.d.ts +1 -1
- package/dist/types/ui/issue-like-table/column-picker/messages.d.ts +7 -0
- package/dist/types/ui/issue-like-table/column-picker/types.d.ts +1 -0
- package/dist/types/ui/jira-issues-modal/index.d.ts +4 -11
- package/dist/types/ui/jira-issues-modal/modal/index.d.ts +3 -0
- package/dist/types/ui/jira-issues-modal/types.d.ts +8 -1
- package/dist/types-ts4.5/index.d.ts +2 -2
- package/dist/types-ts4.5/ui/datasource-table-view/datasourceTableView.d.ts +3 -0
- package/dist/types-ts4.5/ui/datasource-table-view/index.d.ts +4 -0
- package/dist/types-ts4.5/ui/{datasourceTableView.d.ts → datasource-table-view/types.d.ts} +0 -2
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/types.d.ts +1 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/index.d.ts +4 -11
- package/dist/types-ts4.5/ui/jira-issues-modal/modal/index.d.ts +3 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/types.d.ts +8 -1
- package/examples-helpers/buildJiraIssuesTable.tsx +1 -1
- package/package.json +2 -2
- package/report.api.md +6 -8
- package/tmp/api-report-tmp.d.ts +4 -3
- /package/dist/cjs/ui/jira-issues-modal/{messages.js → modal/messages.js} +0 -0
- /package/dist/es2019/ui/jira-issues-modal/{messages.js → modal/messages.js} +0 -0
- /package/dist/esm/ui/jira-issues-modal/{messages.js → modal/messages.js} +0 -0
- /package/dist/types/ui/jira-issues-modal/{messages.d.ts → modal/messages.d.ts} +0 -0
- /package/dist/types-ts4.5/ui/jira-issues-modal/{messages.d.ts → modal/messages.d.ts} +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
/** @jsx jsx */
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { css, jsx } from '@emotion/react';
|
|
5
|
+
import { FormattedMessage, IntlProvider, useIntl } from 'react-intl-next';
|
|
6
|
+
import Button from '@atlaskit/button/standard-button';
|
|
7
|
+
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
8
|
+
import { B400, N0 } from '@atlaskit/theme/colors';
|
|
9
|
+
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
10
|
+
import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
|
|
11
|
+
import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
|
|
12
|
+
import LinkRenderType from '../../issue-like-table/render-type/link';
|
|
13
|
+
import { JiraSearchContainer } from '../jira-search-container';
|
|
14
|
+
import { ModeSwitcher } from '../mode-switcher';
|
|
15
|
+
import { JiraSiteSelector } from '../site-selector';
|
|
16
|
+
import { modalMessages } from './messages';
|
|
17
|
+
const dropdownContainerStyles = css({
|
|
18
|
+
display: 'flex',
|
|
19
|
+
gap: "var(--ds-space-100, 0.5rem)"
|
|
20
|
+
});
|
|
21
|
+
const contentContainerStyles = css({
|
|
22
|
+
height: '420px',
|
|
23
|
+
overflow: 'auto'
|
|
24
|
+
});
|
|
25
|
+
const placeholderSmartLinkStyles = css({
|
|
26
|
+
backgroundColor: `var(--ds-surface-raised, ${N0})`,
|
|
27
|
+
borderRadius: '3px',
|
|
28
|
+
boxShadow: '0px 1px 1px rgba(9, 30, 66, 0.25), 0px 0px 1px rgba(9, 30, 66, 0.31)',
|
|
29
|
+
color: `var(--ds-text-brand, ${B400})`,
|
|
30
|
+
padding: '0px 2px'
|
|
31
|
+
});
|
|
32
|
+
export const JiraIssuesConfigModal = props => {
|
|
33
|
+
const {
|
|
34
|
+
datasourceId,
|
|
35
|
+
parameters: initialParameters,
|
|
36
|
+
visibleColumnKeys: initialVisibleColumnKeys,
|
|
37
|
+
onCancel,
|
|
38
|
+
onInsert
|
|
39
|
+
} = props;
|
|
40
|
+
const [availableSites, setAvailableSites] = useState([]);
|
|
41
|
+
const [currentViewMode, setCurrentViewMode] = useState('issue');
|
|
42
|
+
const [cloudId, setCloudId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId);
|
|
43
|
+
const [jql, setJql] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql);
|
|
44
|
+
const isParametersSet = !!(jql && cloudId);
|
|
45
|
+
const parameters = useMemo(() => !!cloudId ? {
|
|
46
|
+
cloudId,
|
|
47
|
+
jql: jql || ''
|
|
48
|
+
} : undefined, [cloudId, jql]);
|
|
49
|
+
const {
|
|
50
|
+
reset,
|
|
51
|
+
status,
|
|
52
|
+
onNextPage,
|
|
53
|
+
responseItems,
|
|
54
|
+
hasNextPage,
|
|
55
|
+
columns,
|
|
56
|
+
defaultVisibleColumnKeys
|
|
57
|
+
} = useDatasourceTableState(datasourceId, parameters);
|
|
58
|
+
const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys || defaultVisibleColumnKeys);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
|
|
61
|
+
setVisibleColumnKeys(newVisibleColumnKeys);
|
|
62
|
+
}, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
|
|
63
|
+
const {
|
|
64
|
+
formatMessage
|
|
65
|
+
} = useIntl();
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const fetchSiteDisplayNames = async () => {
|
|
68
|
+
const jiraSites = await getAvailableJiraSites();
|
|
69
|
+
setAvailableSites(jiraSites);
|
|
70
|
+
};
|
|
71
|
+
void fetchSiteDisplayNames();
|
|
72
|
+
}, []);
|
|
73
|
+
const onSearch = useCallback(newParameters => {
|
|
74
|
+
setJql(newParameters.jql);
|
|
75
|
+
reset();
|
|
76
|
+
}, [reset]);
|
|
77
|
+
const onSiteSelection = useCallback(site => {
|
|
78
|
+
setCloudId(site.cloudId);
|
|
79
|
+
reset();
|
|
80
|
+
}, [reset]);
|
|
81
|
+
const selectedJiraSite = useMemo(() => availableSites.find(jiraSite => jiraSite.cloudId === cloudId) || availableSites[0], [availableSites, cloudId]);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (!cloudId && selectedJiraSite) {
|
|
84
|
+
setCloudId(selectedJiraSite.cloudId);
|
|
85
|
+
}
|
|
86
|
+
}, [cloudId, selectedJiraSite]);
|
|
87
|
+
const retrieveUrlForSmartCardRender = useCallback(() => {
|
|
88
|
+
var _data$key, _data$key$data;
|
|
89
|
+
const [data] = responseItems;
|
|
90
|
+
// agrement with BE that we will use `key` for rendering smartlink
|
|
91
|
+
return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : (_data$key$data = _data$key.data) === null || _data$key$data === void 0 ? void 0 : _data$key$data.url;
|
|
92
|
+
}, [responseItems]);
|
|
93
|
+
const onInsertPressed = useCallback(() => {
|
|
94
|
+
if (!isParametersSet || !jql || !selectedJiraSite) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const firstIssueUrl = retrieveUrlForSmartCardRender();
|
|
98
|
+
if (currentViewMode === 'count') {
|
|
99
|
+
onInsert({
|
|
100
|
+
type: 'inlineCard',
|
|
101
|
+
attrs: {
|
|
102
|
+
url: `${selectedJiraSite.url}/issues/${encodeURI(jql)}`
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
} else if (responseItems.length === 1 && firstIssueUrl) {
|
|
106
|
+
onInsert({
|
|
107
|
+
type: 'inlineCard',
|
|
108
|
+
attrs: {
|
|
109
|
+
url: firstIssueUrl
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
onInsert({
|
|
114
|
+
type: 'blockCard',
|
|
115
|
+
attrs: {
|
|
116
|
+
datasource: {
|
|
117
|
+
id: datasourceId,
|
|
118
|
+
parameters: {
|
|
119
|
+
cloudId,
|
|
120
|
+
jql // TODO support non JQL type
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
views: [{
|
|
124
|
+
type: 'table',
|
|
125
|
+
properties: {
|
|
126
|
+
columnKeys: visibleColumnKeys
|
|
127
|
+
}
|
|
128
|
+
}]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}, [isParametersSet, jql, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
|
|
134
|
+
const handleViewModeChange = selectedMode => {
|
|
135
|
+
setCurrentViewMode(selectedMode);
|
|
136
|
+
};
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (status === 'empty' && isParametersSet) {
|
|
139
|
+
void onNextPage();
|
|
140
|
+
}
|
|
141
|
+
}, [status, isParametersSet, onNextPage, reset]);
|
|
142
|
+
const issueLikeDataTableView = useMemo(() => jsx(IssueLikeDataTableView, {
|
|
143
|
+
testId: "jira-jql-datasource-table",
|
|
144
|
+
status: status,
|
|
145
|
+
columns: columns,
|
|
146
|
+
items: responseItems,
|
|
147
|
+
hasNextPage: hasNextPage,
|
|
148
|
+
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
149
|
+
onNextPage: onNextPage,
|
|
150
|
+
onVisibleColumnKeysChange: setVisibleColumnKeys
|
|
151
|
+
}), [columns, defaultVisibleColumnKeys, hasNextPage, onNextPage, responseItems, status, visibleColumnKeys]);
|
|
152
|
+
const renderCountModeContent = useCallback(() => {
|
|
153
|
+
const url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
154
|
+
if (status === 'empty' || !jql || !url) {
|
|
155
|
+
return jsx("span", {
|
|
156
|
+
"data-testid": `jira-jql-datasource-modal--smart-card-placeholder`,
|
|
157
|
+
css: placeholderSmartLinkStyles
|
|
158
|
+
}, jsx(FormattedMessage, modalMessages.issuesCountSmartCardPlaceholderText));
|
|
159
|
+
} else {
|
|
160
|
+
const urlWithEncodedJql = `${url}/issues/?jql=${encodeURI(jql)}`;
|
|
161
|
+
return jsx(LinkRenderType, {
|
|
162
|
+
url: urlWithEncodedJql
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}, [jql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status]);
|
|
166
|
+
const renderIssuesModeContent = useCallback(() => {
|
|
167
|
+
if (status === 'empty' || columns.length === 0) {
|
|
168
|
+
return jsx(EmptyState, {
|
|
169
|
+
testId: `jira-jql-datasource-modal--empty-state`
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
const firstIssueUrl = retrieveUrlForSmartCardRender();
|
|
173
|
+
if (responseItems.length === 1 && firstIssueUrl) {
|
|
174
|
+
return jsx(LinkRenderType, {
|
|
175
|
+
url: firstIssueUrl
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return issueLikeDataTableView;
|
|
179
|
+
}, [columns.length, issueLikeDataTableView, responseItems.length, retrieveUrlForSmartCardRender, status]);
|
|
180
|
+
return jsx(IntlProvider, {
|
|
181
|
+
locale: "en"
|
|
182
|
+
}, jsx(ModalTransition, null, jsx(Modal, {
|
|
183
|
+
testId: 'jira-jql-datasource-modal',
|
|
184
|
+
onClose: onCancel,
|
|
185
|
+
width: "x-large",
|
|
186
|
+
shouldScrollInViewport: true
|
|
187
|
+
}, jsx(ModalHeader, null, jsx(ModalTitle, null, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx("div", {
|
|
188
|
+
css: dropdownContainerStyles
|
|
189
|
+
}, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesTitleManySites, {
|
|
190
|
+
values: {
|
|
191
|
+
siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
|
|
192
|
+
}
|
|
193
|
+
})), jsx(JiraSiteSelector, {
|
|
194
|
+
testId: `jira-jql-datasource-modal--site-selector`,
|
|
195
|
+
availableSites: availableSites,
|
|
196
|
+
onSiteSelection: onSiteSelection,
|
|
197
|
+
selectedJiraSite: selectedJiraSite
|
|
198
|
+
}))), jsx(ModeSwitcher, {
|
|
199
|
+
isCompact: true,
|
|
200
|
+
options: [{
|
|
201
|
+
label: formatMessage(modalMessages.issueViewModeLabel),
|
|
202
|
+
value: 'issue'
|
|
203
|
+
}, {
|
|
204
|
+
label: formatMessage(modalMessages.countViewModeLabel),
|
|
205
|
+
value: 'count'
|
|
206
|
+
}],
|
|
207
|
+
onOptionValueChange: handleViewModeChange,
|
|
208
|
+
selectedOptionValue: currentViewMode
|
|
209
|
+
})), jsx(ModalBody, null, jsx(JiraSearchContainer, {
|
|
210
|
+
parameters: parameters,
|
|
211
|
+
onSearch: onSearch
|
|
212
|
+
}), jsx("div", {
|
|
213
|
+
css: contentContainerStyles
|
|
214
|
+
}, currentViewMode === 'count' ? renderCountModeContent() : renderIssuesModeContent())), jsx(ModalFooter, null, jsx(Button, {
|
|
215
|
+
appearance: "default",
|
|
216
|
+
onClick: onCancel
|
|
217
|
+
}, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
|
|
218
|
+
appearance: "primary",
|
|
219
|
+
onClick: onInsertPressed,
|
|
220
|
+
isDisabled: !isParametersSet || status === 'loading',
|
|
221
|
+
testId: 'jira-jql-datasource-modal--insert-button'
|
|
222
|
+
}, jsx(FormattedMessage, modalMessages.insertIssuesButtonText))))));
|
|
223
|
+
};
|
package/dist/es2019/version.json
CHANGED
|
@@ -80,7 +80,7 @@ export var useDatasourceTableState = function useDatasourceTableState(datasource
|
|
|
80
80
|
_context2.next = 5;
|
|
81
81
|
return getDatasourceData(datasourceId, {
|
|
82
82
|
parameters: parameters,
|
|
83
|
-
pageSize:
|
|
83
|
+
pageSize: 20,
|
|
84
84
|
pageCursor: nextCursor,
|
|
85
85
|
fields: fields
|
|
86
86
|
});
|
package/dist/esm/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { JiraIssuesConfigModal } from './ui/jira-issues-modal';
|
|
2
|
-
export { DatasourceTableView } from './ui/
|
|
1
|
+
export { default as JiraIssuesConfigModal } from './ui/jira-issues-modal';
|
|
2
|
+
export { default as DatasourceTableView } from './ui/datasource-table-view';
|
|
3
3
|
export { JIRA_LIST_OF_LINKS_DATASOURCE_ID } from './ui/jira-issues-modal';
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { useEffect } from 'react';
|
|
3
3
|
import { css, jsx } from '@emotion/react';
|
|
4
4
|
import Spinner from '@atlaskit/spinner';
|
|
5
|
-
import { useDatasourceTableState } from '
|
|
6
|
-
import { IssueLikeDataTableView } from '
|
|
7
|
-
import { TableFooter } from '
|
|
5
|
+
import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
|
|
6
|
+
import { IssueLikeDataTableView } from '../issue-like-table';
|
|
7
|
+
import { TableFooter } from '../table-footer';
|
|
8
8
|
var TableViewWrapperStyles = css({
|
|
9
9
|
display: 'flex',
|
|
10
10
|
flexDirection: 'column',
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { lazy, Suspense } from 'react';
|
|
2
|
+
var LazyDatasourceTableView = /*#__PURE__*/lazy(function () {
|
|
3
|
+
return import( /* webpackChunkName: "@atlaskit-internal_linkdatasource-tableview" */'./datasourceTableView').then(function (module) {
|
|
4
|
+
return {
|
|
5
|
+
default: module.DatasourceTableView
|
|
6
|
+
};
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
var DatasourceTableViewWithWrappers = function DatasourceTableViewWithWrappers(props) {
|
|
10
|
+
return /*#__PURE__*/React.createElement(Suspense, {
|
|
11
|
+
fallback: /*#__PURE__*/React.createElement("div", {
|
|
12
|
+
"data-testid": 'datasource-table-view-suspense'
|
|
13
|
+
})
|
|
14
|
+
}, /*#__PURE__*/React.createElement(LazyDatasourceTableView, props));
|
|
15
|
+
};
|
|
16
|
+
export default DatasourceTableViewWithWrappers;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -6,14 +6,18 @@ var _excluded = ["isOpen"];
|
|
|
6
6
|
/** @jsx jsx */
|
|
7
7
|
import { useCallback, useEffect, useState } from 'react';
|
|
8
8
|
import { jsx } from '@emotion/react';
|
|
9
|
+
import { useIntl } from 'react-intl-next';
|
|
9
10
|
import Button from '@atlaskit/button/standard-button';
|
|
10
11
|
import BoardIcon from '@atlaskit/icon/glyph/board';
|
|
11
12
|
import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
|
|
12
13
|
import { CheckboxOption, PopupSelect } from '@atlaskit/select';
|
|
14
|
+
import { columnPickerMessages } from './messages';
|
|
13
15
|
export var ColumnPicker = function ColumnPicker(_ref) {
|
|
14
|
-
var
|
|
16
|
+
var isDatasourceLoading = _ref.isDatasourceLoading,
|
|
17
|
+
columns = _ref.columns,
|
|
15
18
|
selectedColumnKeys = _ref.selectedColumnKeys,
|
|
16
19
|
onSelectedColumnKeysChange = _ref.onSelectedColumnKeysChange;
|
|
20
|
+
var intl = useIntl();
|
|
17
21
|
var _useState = useState([]),
|
|
18
22
|
_useState2 = _slicedToArray(_useState, 2),
|
|
19
23
|
allOptions = _useState2[0],
|
|
@@ -78,8 +82,7 @@ export var ColumnPicker = function ColumnPicker(_ref) {
|
|
|
78
82
|
closeMenuOnSelect: false,
|
|
79
83
|
hideSelectedOptions: false,
|
|
80
84
|
isMulti: true,
|
|
81
|
-
placeholder:
|
|
82
|
-
,
|
|
85
|
+
placeholder: intl.formatMessage(columnPickerMessages.search),
|
|
83
86
|
"aria-label": "Search for fields",
|
|
84
87
|
onChange: handleChange,
|
|
85
88
|
target: function target(_ref8) {
|
|
@@ -96,7 +99,8 @@ export var ColumnPicker = function ColumnPicker(_ref) {
|
|
|
96
99
|
})),
|
|
97
100
|
spacing: "compact",
|
|
98
101
|
appearance: "subtle",
|
|
99
|
-
testId: "column-picker-trigger-button"
|
|
102
|
+
testId: "column-picker-trigger-button",
|
|
103
|
+
isDisabled: isDatasourceLoading
|
|
100
104
|
}));
|
|
101
105
|
}
|
|
102
106
|
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export var columnPickerMessages = defineMessages({
|
|
3
|
+
search: {
|
|
4
|
+
id: 'linkDataSource.column-picker.search',
|
|
5
|
+
description: 'Search bar message to look for more fields',
|
|
6
|
+
defaultMessage: 'Search for fields'
|
|
7
|
+
}
|
|
8
|
+
});
|
|
@@ -81,7 +81,7 @@ function getColumnWidth(key, type) {
|
|
|
81
81
|
case 'string':
|
|
82
82
|
return BASE_WIDTH * 22;
|
|
83
83
|
default:
|
|
84
|
-
undefined;
|
|
84
|
+
return undefined;
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
|
|
@@ -123,7 +123,7 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
|
|
|
123
123
|
}).filter(Boolean);
|
|
124
124
|
}, [orderedColumns, visibleColumnKeys]);
|
|
125
125
|
|
|
126
|
-
// TODO seems like this component can't handle some combination of incremental data
|
|
126
|
+
// TODO seems like this component can't handle some combination of incremental data retrieval.
|
|
127
127
|
// If data comes first, then columns and then visibleColumnKeys it blows up,
|
|
128
128
|
// or some other combination.
|
|
129
129
|
|
|
@@ -282,7 +282,7 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
|
|
|
282
282
|
css: truncatedCellStyles
|
|
283
283
|
}, content);
|
|
284
284
|
};
|
|
285
|
-
if (onVisibleColumnKeysChange) {
|
|
285
|
+
if (onVisibleColumnKeysChange && status !== 'loading') {
|
|
286
286
|
return jsx(DraggableTableHeading, {
|
|
287
287
|
tableId: tableId,
|
|
288
288
|
key: key,
|
|
@@ -305,6 +305,7 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
|
|
|
305
305
|
}), onVisibleColumnKeysChange && jsx("th", {
|
|
306
306
|
css: columnPickerHeaderStyles
|
|
307
307
|
}, jsx(ColumnPicker, {
|
|
308
|
+
isDatasourceLoading: status === 'loading',
|
|
308
309
|
columns: orderedColumns,
|
|
309
310
|
selectedColumnKeys: visibleColumnKeys,
|
|
310
311
|
onSelectedColumnKeysChange: onSelectedColumnKeysChange
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
2
2
|
var _templateObject, _templateObject2;
|
|
3
3
|
import styled from '@emotion/styled';
|
|
4
|
-
export var Table = styled.table(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width:
|
|
4
|
+
export var Table = styled.table(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 100%;\n"])));
|
|
5
5
|
export var TableHeading = styled.th(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n padding-block: ", ";\n line-height: ", ";\n"])), "var(--ds-space-100, 8px)", "var(--ds-font-lineHeight-300, 24px)");
|
|
@@ -1,264 +1,19 @@
|
|
|
1
|
-
import
|
|
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
|
-
});
|
|
1
|
+
import React, { lazy, Suspense } from 'react';
|
|
35
2
|
export var JIRA_LIST_OF_LINKS_DATASOURCE_ID = 'd8b75300-dfda-4519-b6cd-e49abbd50401';
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
44
|
-
availableSites = _useState2[0],
|
|
45
|
-
setAvailableSites = _useState2[1];
|
|
46
|
-
var _useState3 = useState('issue'),
|
|
47
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
48
|
-
currentViewMode = _useState4[0],
|
|
49
|
-
setCurrentViewMode = _useState4[1];
|
|
50
|
-
var _useState5 = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId),
|
|
51
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
52
|
-
cloudId = _useState6[0],
|
|
53
|
-
setCloudId = _useState6[1];
|
|
54
|
-
var _useState7 = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql),
|
|
55
|
-
_useState8 = _slicedToArray(_useState7, 2),
|
|
56
|
-
jql = _useState8[0],
|
|
57
|
-
setJql = _useState8[1];
|
|
58
|
-
var isParametersSet = !!(jql && cloudId);
|
|
59
|
-
var parameters = useMemo(function () {
|
|
60
|
-
return !!cloudId ? {
|
|
61
|
-
cloudId: cloudId,
|
|
62
|
-
jql: jql || ''
|
|
63
|
-
} : undefined;
|
|
64
|
-
}, [cloudId, jql]);
|
|
65
|
-
var _useDatasourceTableSt = useDatasourceTableState(datasourceId, parameters),
|
|
66
|
-
reset = _useDatasourceTableSt.reset,
|
|
67
|
-
status = _useDatasourceTableSt.status,
|
|
68
|
-
onNextPage = _useDatasourceTableSt.onNextPage,
|
|
69
|
-
responseItems = _useDatasourceTableSt.responseItems,
|
|
70
|
-
hasNextPage = _useDatasourceTableSt.hasNextPage,
|
|
71
|
-
columns = _useDatasourceTableSt.columns,
|
|
72
|
-
defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys;
|
|
73
|
-
var _useState9 = useState(initialVisibleColumnKeys || defaultVisibleColumnKeys),
|
|
74
|
-
_useState10 = _slicedToArray(_useState9, 2),
|
|
75
|
-
visibleColumnKeys = _useState10[0],
|
|
76
|
-
setVisibleColumnKeys = _useState10[1];
|
|
77
|
-
useEffect(function () {
|
|
78
|
-
var newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
|
|
79
|
-
setVisibleColumnKeys(newVisibleColumnKeys);
|
|
80
|
-
}, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
|
|
81
|
-
var _useIntl = useIntl(),
|
|
82
|
-
formatMessage = _useIntl.formatMessage;
|
|
83
|
-
useEffect(function () {
|
|
84
|
-
var fetchSiteDisplayNames = /*#__PURE__*/function () {
|
|
85
|
-
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
86
|
-
var jiraSites;
|
|
87
|
-
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
88
|
-
while (1) switch (_context.prev = _context.next) {
|
|
89
|
-
case 0:
|
|
90
|
-
_context.next = 2;
|
|
91
|
-
return getAvailableJiraSites();
|
|
92
|
-
case 2:
|
|
93
|
-
jiraSites = _context.sent;
|
|
94
|
-
setAvailableSites(jiraSites);
|
|
95
|
-
case 4:
|
|
96
|
-
case "end":
|
|
97
|
-
return _context.stop();
|
|
98
|
-
}
|
|
99
|
-
}, _callee);
|
|
100
|
-
}));
|
|
101
|
-
return function fetchSiteDisplayNames() {
|
|
102
|
-
return _ref.apply(this, arguments);
|
|
103
|
-
};
|
|
104
|
-
}();
|
|
105
|
-
void fetchSiteDisplayNames();
|
|
106
|
-
}, []);
|
|
107
|
-
var onSearch = useCallback(function (newParameters) {
|
|
108
|
-
setJql(newParameters.jql);
|
|
109
|
-
reset();
|
|
110
|
-
}, [reset]);
|
|
111
|
-
var onSiteSelection = useCallback(function (site) {
|
|
112
|
-
setCloudId(site.cloudId);
|
|
113
|
-
reset();
|
|
114
|
-
}, [reset]);
|
|
115
|
-
var selectedJiraSite = useMemo(function () {
|
|
116
|
-
return availableSites.find(function (jiraSite) {
|
|
117
|
-
return jiraSite.cloudId === cloudId;
|
|
118
|
-
}) || availableSites[0];
|
|
119
|
-
}, [availableSites, cloudId]);
|
|
120
|
-
useEffect(function () {
|
|
121
|
-
if (!cloudId && selectedJiraSite) {
|
|
122
|
-
setCloudId(selectedJiraSite.cloudId);
|
|
123
|
-
}
|
|
124
|
-
}, [cloudId, selectedJiraSite]);
|
|
125
|
-
var retrieveUrlForSmartCardRender = useCallback(function () {
|
|
126
|
-
var _data$key, _data$key$data;
|
|
127
|
-
var _responseItems = _slicedToArray(responseItems, 1),
|
|
128
|
-
data = _responseItems[0];
|
|
129
|
-
// agrement with BE that we will use `key` for rendering smartlink
|
|
130
|
-
return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : (_data$key$data = _data$key.data) === null || _data$key$data === void 0 ? void 0 : _data$key$data.url;
|
|
131
|
-
}, [responseItems]);
|
|
132
|
-
var onInsertPressed = useCallback(function () {
|
|
133
|
-
if (!isParametersSet || !jql || !selectedJiraSite) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
var firstIssueUrl = retrieveUrlForSmartCardRender();
|
|
137
|
-
if (currentViewMode === 'count') {
|
|
138
|
-
onInsert({
|
|
139
|
-
type: 'inlineCard',
|
|
140
|
-
attrs: {
|
|
141
|
-
url: "".concat(selectedJiraSite.url, "/issues/").concat(encodeURI(jql))
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
} else if (responseItems.length === 1 && firstIssueUrl) {
|
|
145
|
-
onInsert({
|
|
146
|
-
type: 'inlineCard',
|
|
147
|
-
attrs: {
|
|
148
|
-
url: firstIssueUrl
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
} else {
|
|
152
|
-
onInsert({
|
|
153
|
-
type: 'blockCard',
|
|
154
|
-
attrs: {
|
|
155
|
-
datasource: {
|
|
156
|
-
id: datasourceId,
|
|
157
|
-
parameters: {
|
|
158
|
-
cloudId: cloudId,
|
|
159
|
-
jql: jql // TODO support non JQL type
|
|
160
|
-
},
|
|
3
|
+
var LazyJiraIssuesConfigModal = /*#__PURE__*/lazy(function () {
|
|
4
|
+
return import( /* webpackChunkName: "@atlaskit-internal_linkdatasource-jiraissuesmodal" */'./modal').then(function (module) {
|
|
5
|
+
return {
|
|
6
|
+
default: module.JiraIssuesConfigModal
|
|
7
|
+
};
|
|
8
|
+
});
|
|
9
|
+
});
|
|
161
10
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
}, [isParametersSet, jql, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
|
|
173
|
-
var handleViewModeChange = function handleViewModeChange(selectedMode) {
|
|
174
|
-
setCurrentViewMode(selectedMode);
|
|
175
|
-
};
|
|
176
|
-
useEffect(function () {
|
|
177
|
-
if (status === 'empty' && isParametersSet) {
|
|
178
|
-
void onNextPage();
|
|
179
|
-
}
|
|
180
|
-
}, [status, isParametersSet, onNextPage, reset]);
|
|
181
|
-
var issueLikeDataTableView = useMemo(function () {
|
|
182
|
-
return jsx(IssueLikeDataTableView, {
|
|
183
|
-
testId: "jira-jql-datasource-table",
|
|
184
|
-
status: status,
|
|
185
|
-
columns: columns,
|
|
186
|
-
items: responseItems,
|
|
187
|
-
hasNextPage: hasNextPage,
|
|
188
|
-
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
189
|
-
onNextPage: onNextPage,
|
|
190
|
-
onVisibleColumnKeysChange: setVisibleColumnKeys
|
|
191
|
-
});
|
|
192
|
-
}, [columns, defaultVisibleColumnKeys, hasNextPage, onNextPage, responseItems, status, visibleColumnKeys]);
|
|
193
|
-
var renderCountModeContent = useCallback(function () {
|
|
194
|
-
var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
195
|
-
if (status === 'empty' || !jql || !url) {
|
|
196
|
-
return jsx("span", {
|
|
197
|
-
"data-testid": "jira-jql-datasource-modal--smart-card-placeholder",
|
|
198
|
-
css: placeholderSmartLinkStyles
|
|
199
|
-
}, jsx(FormattedMessage, modalMessages.issuesCountSmartCardPlaceholderText));
|
|
200
|
-
} else {
|
|
201
|
-
var urlWithEncodedJql = "".concat(url, "/issues/?jql=").concat(encodeURI(jql));
|
|
202
|
-
return jsx(LinkRenderType, {
|
|
203
|
-
url: urlWithEncodedJql
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}, [jql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status]);
|
|
207
|
-
var renderIssuesModeContent = useCallback(function () {
|
|
208
|
-
if (status === 'empty' || columns.length === 0) {
|
|
209
|
-
return jsx(EmptyState, {
|
|
210
|
-
testId: "jira-jql-datasource-modal--empty-state"
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
var firstIssueUrl = retrieveUrlForSmartCardRender();
|
|
214
|
-
if (responseItems.length === 1 && firstIssueUrl) {
|
|
215
|
-
return jsx(LinkRenderType, {
|
|
216
|
-
url: firstIssueUrl
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
return issueLikeDataTableView;
|
|
220
|
-
}, [columns.length, issueLikeDataTableView, responseItems.length, retrieveUrlForSmartCardRender, status]);
|
|
221
|
-
return jsx(IntlProvider, {
|
|
222
|
-
locale: "en"
|
|
223
|
-
}, jsx(ModalTransition, null, jsx(Modal, {
|
|
224
|
-
testId: 'jira-jql-datasource-modal',
|
|
225
|
-
onClose: onCancel,
|
|
226
|
-
width: "x-large",
|
|
227
|
-
shouldScrollInViewport: true
|
|
228
|
-
}, jsx(ModalHeader, null, jsx(ModalTitle, null, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx("div", {
|
|
229
|
-
css: dropdownContainerStyles
|
|
230
|
-
}, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesTitleManySites, {
|
|
231
|
-
values: {
|
|
232
|
-
siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
|
|
233
|
-
}
|
|
234
|
-
})), jsx(JiraSiteSelector, {
|
|
235
|
-
testId: "jira-jql-datasource-modal--site-selector",
|
|
236
|
-
availableSites: availableSites,
|
|
237
|
-
onSiteSelection: onSiteSelection,
|
|
238
|
-
selectedJiraSite: selectedJiraSite
|
|
239
|
-
}))), jsx(ModeSwitcher, {
|
|
240
|
-
isCompact: true,
|
|
241
|
-
options: [{
|
|
242
|
-
label: formatMessage(modalMessages.issueViewModeLabel),
|
|
243
|
-
value: 'issue'
|
|
244
|
-
}, {
|
|
245
|
-
label: formatMessage(modalMessages.countViewModeLabel),
|
|
246
|
-
value: 'count'
|
|
247
|
-
}],
|
|
248
|
-
onOptionValueChange: handleViewModeChange,
|
|
249
|
-
selectedOptionValue: currentViewMode
|
|
250
|
-
})), jsx(ModalBody, null, jsx(JiraSearchContainer, {
|
|
251
|
-
parameters: parameters,
|
|
252
|
-
onSearch: onSearch
|
|
253
|
-
}), jsx("div", {
|
|
254
|
-
css: contentContainerStyles
|
|
255
|
-
}, currentViewMode === 'count' ? renderCountModeContent() : renderIssuesModeContent())), jsx(ModalFooter, null, jsx(Button, {
|
|
256
|
-
appearance: "default",
|
|
257
|
-
onClick: onCancel
|
|
258
|
-
}, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
|
|
259
|
-
appearance: "primary",
|
|
260
|
-
onClick: onInsertPressed,
|
|
261
|
-
isDisabled: !isParametersSet,
|
|
262
|
-
testId: 'jira-jql-datasource-modal--insert-button'
|
|
263
|
-
}, jsx(FormattedMessage, modalMessages.insertIssuesButtonText))))));
|
|
264
|
-
};
|
|
11
|
+
//
|
|
12
|
+
var JiraIssuesConfigModalWithWrappers = function JiraIssuesConfigModalWithWrappers(props) {
|
|
13
|
+
return /*#__PURE__*/React.createElement(Suspense, {
|
|
14
|
+
fallback: /*#__PURE__*/React.createElement("div", {
|
|
15
|
+
"data-testid": 'jira-jql-datasource-table-suspense'
|
|
16
|
+
})
|
|
17
|
+
}, /*#__PURE__*/React.createElement(LazyJiraIssuesConfigModal, props));
|
|
18
|
+
};
|
|
19
|
+
export default JiraIssuesConfigModalWithWrappers;
|