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