@atlaskit/link-datasource 2.8.0 → 2.9.1

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 (50) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/hooks/useDatasourceTableState.js +54 -39
  3. package/dist/cjs/state/index.js +68 -0
  4. package/dist/cjs/ui/assets-modal/modal/index.js +8 -5
  5. package/dist/cjs/ui/common/modal/datasource-modal/createDatasourceModal.js +55 -0
  6. package/dist/cjs/ui/common/modal/datasources-table-in-modal-preview/index.js +13 -2
  7. package/dist/cjs/ui/common/modal/insert-button/index.js +5 -4
  8. package/dist/cjs/ui/confluence-search-modal/modal/index.js +36 -39
  9. package/dist/cjs/ui/datasource-table-view/datasourceTableView.js +3 -2
  10. package/dist/cjs/ui/jira-issues-modal/modal/index.js +142 -211
  11. package/dist/es2019/hooks/useDatasourceTableState.js +15 -5
  12. package/dist/es2019/state/index.js +55 -0
  13. package/dist/es2019/ui/assets-modal/modal/index.js +9 -6
  14. package/dist/es2019/ui/common/modal/datasource-context/index.js +1 -1
  15. package/dist/es2019/ui/common/modal/datasource-modal/createDatasourceModal.js +51 -0
  16. package/dist/es2019/ui/common/modal/datasources-table-in-modal-preview/index.js +9 -2
  17. package/dist/es2019/ui/common/modal/insert-button/index.js +5 -4
  18. package/dist/es2019/ui/confluence-search-modal/modal/index.js +36 -39
  19. package/dist/es2019/ui/datasource-table-view/datasourceTableView.js +4 -3
  20. package/dist/es2019/ui/jira-issues-modal/modal/index.js +134 -202
  21. package/dist/esm/hooks/useDatasourceTableState.js +54 -39
  22. package/dist/esm/state/index.js +61 -0
  23. package/dist/esm/ui/assets-modal/modal/index.js +9 -6
  24. package/dist/esm/ui/common/modal/datasource-modal/createDatasourceModal.js +48 -0
  25. package/dist/esm/ui/common/modal/datasources-table-in-modal-preview/index.js +10 -2
  26. package/dist/esm/ui/common/modal/insert-button/index.js +5 -4
  27. package/dist/esm/ui/confluence-search-modal/modal/index.js +39 -42
  28. package/dist/esm/ui/datasource-table-view/datasourceTableView.js +4 -3
  29. package/dist/esm/ui/jira-issues-modal/modal/index.js +147 -216
  30. package/dist/types/common/types.d.ts +2 -1
  31. package/dist/types/state/index.d.ts +21 -0
  32. package/dist/types/ui/common/modal/datasource-context/index.d.ts +9 -12
  33. package/dist/types/ui/common/modal/datasource-modal/createDatasourceModal.d.ts +15 -0
  34. package/dist/types/ui/common/modal/insert-button/index.d.ts +4 -2
  35. package/dist/types/ui/confluence-search-modal/basic-filters/filters/date-range-picker/PopupComponent.d.ts +1 -1
  36. package/dist/types/ui/confluence-search-modal/modal/index.d.ts +3 -4
  37. package/dist/types/ui/confluence-search-modal/types.d.ts +6 -1
  38. package/dist/types/ui/jira-issues-modal/modal/index.d.ts +3 -3
  39. package/dist/types/ui/jira-issues-modal/types.d.ts +3 -0
  40. package/dist/types-ts4.5/common/types.d.ts +2 -1
  41. package/dist/types-ts4.5/state/index.d.ts +21 -0
  42. package/dist/types-ts4.5/ui/common/modal/datasource-context/index.d.ts +9 -12
  43. package/dist/types-ts4.5/ui/common/modal/datasource-modal/createDatasourceModal.d.ts +15 -0
  44. package/dist/types-ts4.5/ui/common/modal/insert-button/index.d.ts +4 -2
  45. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/filters/date-range-picker/PopupComponent.d.ts +1 -1
  46. package/dist/types-ts4.5/ui/confluence-search-modal/modal/index.d.ts +3 -4
  47. package/dist/types-ts4.5/ui/confluence-search-modal/types.d.ts +6 -1
  48. package/dist/types-ts4.5/ui/jira-issues-modal/modal/index.d.ts +3 -3
  49. package/dist/types-ts4.5/ui/jira-issues-modal/types.d.ts +3 -0
  50. package/package.json +5 -1
@@ -12,7 +12,6 @@ var _react = require("react");
12
12
  var _react2 = require("@emotion/react");
13
13
  var _reactIntlNext = require("react-intl-next");
14
14
  var _analyticsNext = require("@atlaskit/analytics-next");
15
- var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
16
15
  var _intlMessagesProvider = require("@atlaskit/intl-messages-provider");
17
16
  var _modalDialog = require("@atlaskit/modal-dialog");
18
17
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
@@ -23,13 +22,12 @@ var _ufoExperiences = require("../../../analytics/ufoExperiences");
23
22
  var _useColumnPickerRenderedFailedUfoExperience = require("../../../analytics/ufoExperiences/hooks/useColumnPickerRenderedFailedUfoExperience");
24
23
  var _useDataRenderedUfoExperience = require("../../../analytics/ufoExperiences/hooks/useDataRenderedUfoExperience");
25
24
  var _utils = require("../../../analytics/utils");
26
- var _adf = require("../../../common/utils/adf");
27
25
  var _fetchMessagesForLocale = require("../../../common/utils/locale/fetch-messages-for-locale");
28
26
  var _datasourceExperienceId = require("../../../contexts/datasource-experience-id");
29
27
  var _userInteractions = require("../../../contexts/user-interactions");
30
- var _useDatasourceTableState = require("../../../hooks/useDatasourceTableState");
31
28
  var _en = _interopRequireDefault(require("../../../i18n/en"));
32
29
  var _useAvailableSites2 = require("../../../services/useAvailableSites");
30
+ var _state = require("../../../state");
33
31
  var _accessRequired = require("../../common/error-state/access-required");
34
32
  var _messages = require("../../common/error-state/messages");
35
33
  var _modalLoadingError = require("../../common/error-state/modal-loading-error");
@@ -40,15 +38,16 @@ var _messages2 = require("../../common/initial-state-view/messages");
40
38
  var _cancelButton = require("../../common/modal/cancel-button");
41
39
  var _contentContainer = require("../../common/modal/content-container");
42
40
  var _countViewSmartLink = require("../../common/modal/count-view-smart-link");
41
+ var _datasourceContext = require("../../common/modal/datasource-context");
43
42
  var _datasourceModal = require("../../common/modal/datasource-modal");
44
- var _useColumnResize2 = require("../../common/modal/datasources-table-in-modal-preview/use-column-resize");
45
- var _useColumnWrapping2 = require("../../common/modal/datasources-table-in-modal-preview/use-column-wrapping");
43
+ var _createDatasourceModal = require("../../common/modal/datasource-modal/createDatasourceModal");
44
+ var _datasourcesTableInModalPreview = _interopRequireDefault(require("../../common/modal/datasources-table-in-modal-preview"));
45
+ var _insertButton = require("../../common/modal/insert-button");
46
46
  var _modeSwitcher = require("../../common/modal/mode-switcher");
47
47
  var _useViewModeContext2 = require("../../common/modal/mode-switcher/useViewModeContext");
48
48
  var _searchCount = _interopRequireDefault(require("../../common/modal/search-count"));
49
49
  var _siteSelector = require("../../common/modal/site-selector");
50
50
  var _issueLikeTable = require("../../issue-like-table");
51
- var _utils2 = require("../../issue-like-table/utils");
52
51
  var _ui = require("../basic-filters/ui");
53
52
  var _isQueryTooComplex = require("../basic-filters/utils/isQueryTooComplex");
54
53
  var _jiraSearchContainer = require("../jira-search-container");
@@ -60,7 +59,6 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
60
59
  * @jsxRuntime classic
61
60
  * @jsx jsx
62
61
  */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
63
- var DEFAULT_VIEW_MODE = 'table';
64
62
  var getDisplayValue = function getDisplayValue(currentViewMode, itemCount) {
65
63
  if (currentViewMode === 'table') {
66
64
  return _types.DatasourceDisplay.DATASOURCE_TABLE;
@@ -68,81 +66,55 @@ var getDisplayValue = function getDisplayValue(currentViewMode, itemCount) {
68
66
  return itemCount === 1 ? _types.DatasourceDisplay.INLINE : _types.DatasourceDisplay.DATASOURCE_INLINE;
69
67
  };
70
68
  var jqlSupportDocumentLink = 'https://support.atlassian.com/jira-service-management-cloud/docs/use-advanced-search-with-jira-query-language-jql/';
69
+ var isValidParameters = function isValidParameters(parameters) {
70
+ return typeof (parameters === null || parameters === void 0 ? void 0 : parameters.jql) === 'string' && parameters.jql.length > 0 && typeof (parameters === null || parameters === void 0 ? void 0 : parameters.cloudId) === 'string' && parameters.cloudId.length > 0;
71
+ };
71
72
  var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
72
- var datasourceId = props.datasourceId,
73
- initialColumnCustomSizes = props.columnCustomSizes,
74
- initialWrappedColumnKeys = props.wrappedColumnKeys,
75
- onCancel = props.onCancel,
76
- onInsert = props.onInsert,
77
- initialParameters = props.parameters,
78
- urlBeingEdited = props.url,
79
- initialVisibleColumnKeys = props.visibleColumnKeys;
73
+ var onCancel = props.onCancel,
74
+ urlBeingEdited = props.url;
75
+ var _useDatasourceContext = (0, _datasourceContext.useDatasourceContext)(),
76
+ visibleColumnCount = _useDatasourceContext.visibleColumnCount,
77
+ visibleColumnKeys = _useDatasourceContext.visibleColumnKeys,
78
+ parameters = _useDatasourceContext.parameters,
79
+ setParameters = _useDatasourceContext.setParameters,
80
+ tableState = _useDatasourceContext.tableState;
81
+ var reset = tableState.reset,
82
+ status = tableState.status,
83
+ responseItems = tableState.responseItems,
84
+ columns = tableState.columns,
85
+ totalCount = tableState.totalCount,
86
+ _tableState$extension = tableState.extensionKey,
87
+ extensionKey = _tableState$extension === void 0 ? null : _tableState$extension,
88
+ destinationObjectTypes = tableState.destinationObjectTypes;
89
+ var _ref = parameters !== null && parameters !== void 0 ? parameters : {},
90
+ cloudId = _ref.cloudId,
91
+ jql = _ref.jql;
92
+ var _useState = (0, _react.useState)(jql),
93
+ _useState2 = (0, _slicedToArray2.default)(_useState, 1),
94
+ initialJql = _useState2[0];
80
95
  var _useViewModeContext = (0, _useViewModeContext2.useViewModeContext)(),
81
96
  currentViewMode = _useViewModeContext.currentViewMode;
82
- var _useState = (0, _react.useState)(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId),
83
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
84
- cloudId = _useState2[0],
85
- setCloudId = _useState2[1];
86
97
  var _useAvailableSites = (0, _useAvailableSites2.useAvailableSites)('jira', cloudId),
87
98
  availableSites = _useAvailableSites.availableSites,
88
99
  selectedJiraSite = _useAvailableSites.selectedSite;
89
- var _useState3 = (0, _react.useState)(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql),
100
+ var _useState3 = (0, _react.useState)(jql),
90
101
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
91
- jql = _useState4[0],
92
- setJql = _useState4[1];
93
- var _useState5 = (0, _react.useState)(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql),
94
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
95
- searchBarJql = _useState6[0],
96
- setSearchBarJql = _useState6[1];
97
- var _useState7 = (0, _react.useState)(initialVisibleColumnKeys),
98
- _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
99
- visibleColumnKeys = _useState8[0],
100
- setVisibleColumnKeys = _useState8[1];
102
+ searchBarJql = _useState4[0],
103
+ setSearchBarJql = _useState4[1];
101
104
 
102
105
  // analytics related parameters
103
106
  var searchCount = (0, _react.useRef)(0);
104
107
  var userInteractions = (0, _userInteractions.useUserInteractions)();
105
108
  var initialSearchMethod =
106
109
  // eslint-disable-next-line @atlaskit/platform/no-preconditioning
107
- (0, _platformFeatureFlags.fg)('platform.linking-platform.datasource.show-jlol-basic-filters') && !(0, _isQueryTooComplex.isQueryTooComplex)((initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql) || '') ? 'basic' : 'jql';
108
- var _useState9 = (0, _react.useState)(initialSearchMethod),
109
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
110
- currentSearchMethod = _useState10[0],
111
- setCurrentSearchMethod = _useState10[1];
110
+ (0, _platformFeatureFlags.fg)('platform.linking-platform.datasource.show-jlol-basic-filters') && !(0, _isQueryTooComplex.isQueryTooComplex)(initialJql || '') ? 'basic' : 'jql';
111
+ var _useState5 = (0, _react.useState)(initialSearchMethod),
112
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
113
+ currentSearchMethod = _useState6[0],
114
+ setCurrentSearchMethod = _useState6[1];
112
115
  var searchMethodSearchedWith = (0, _react.useRef)(null);
113
- var visibleColumnCount = (0, _react.useRef)((visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0);
114
116
  var basicFilterSelectionsSearchedWith = (0, _react.useRef)({});
115
117
  var isSearchedWithComplexQuery = (0, _react.useRef)(false);
116
- var parameters = (0, _react.useMemo)(function () {
117
- return !!cloudId ? {
118
- cloudId: cloudId,
119
- jql: jql || ''
120
- } : undefined;
121
- }, [cloudId, jql]);
122
- var isParametersSet = !!(jql && cloudId);
123
- var _useColumnResize = (0, _useColumnResize2.useColumnResize)(initialColumnCustomSizes),
124
- columnCustomSizes = _useColumnResize.columnCustomSizes,
125
- onColumnResize = _useColumnResize.onColumnResize;
126
- var _useColumnWrapping = (0, _useColumnWrapping2.useColumnWrapping)(initialWrappedColumnKeys),
127
- wrappedColumnKeys = _useColumnWrapping.wrappedColumnKeys,
128
- onWrappedColumnChange = _useColumnWrapping.onWrappedColumnChange;
129
- var _useDatasourceTableSt = (0, _useDatasourceTableState.useDatasourceTableState)({
130
- datasourceId: datasourceId,
131
- parameters: isParametersSet ? parameters : undefined,
132
- fieldKeys: visibleColumnKeys
133
- }),
134
- reset = _useDatasourceTableSt.reset,
135
- status = _useDatasourceTableSt.status,
136
- onNextPage = _useDatasourceTableSt.onNextPage,
137
- responseItems = _useDatasourceTableSt.responseItems,
138
- hasNextPage = _useDatasourceTableSt.hasNextPage,
139
- columns = _useDatasourceTableSt.columns,
140
- defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys,
141
- loadDatasourceDetails = _useDatasourceTableSt.loadDatasourceDetails,
142
- totalCount = _useDatasourceTableSt.totalCount,
143
- _useDatasourceTableSt2 = _useDatasourceTableSt.extensionKey,
144
- extensionKey = _useDatasourceTableSt2 === void 0 ? null : _useDatasourceTableSt2,
145
- destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes;
146
118
  var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
147
119
  fireEvent = _useDatasourceAnalyti.fireEvent;
148
120
  var experienceId = (0, _datasourceExperienceId.useDatasourceExperienceId)();
@@ -154,7 +126,6 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
154
126
  }, [destinationObjectTypes, extensionKey]);
155
127
  var resolvedWithNoResults = status === 'resolved' && !responseItems.length;
156
128
  var jqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURI(jql));
157
- var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading';
158
129
  var shouldShowIssueCount = !!totalCount && totalCount !== 1 && currentViewMode === 'table';
159
130
  var isDataReady = (visibleColumnKeys || []).length > 0;
160
131
  var hasNoJiraSites = availableSites && availableSites.length === 0;
@@ -181,16 +152,21 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
181
152
  canBeLink: currentViewMode === 'inline',
182
153
  extensionKey: extensionKey
183
154
  });
184
- (0, _react.useEffect)(function () {
185
- var newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
186
- visibleColumnCount.current = newVisibleColumnKeys.length;
187
- setVisibleColumnKeys(newVisibleColumnKeys);
188
- }, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
155
+
156
+ /**
157
+ * If the selected Jira site changes, update the cloudId in the parameters
158
+ * This is mainly useful for setting the initial cloudId after the site selection loads
159
+ */
189
160
  (0, _react.useEffect)(function () {
190
161
  if (selectedJiraSite && (!cloudId || cloudId !== selectedJiraSite.cloudId)) {
191
- setCloudId(selectedJiraSite.cloudId);
162
+ setParameters(function () {
163
+ return {
164
+ jql: '',
165
+ cloudId: selectedJiraSite.cloudId
166
+ };
167
+ });
192
168
  }
193
- }, [cloudId, selectedJiraSite]);
169
+ }, [cloudId, selectedJiraSite, setParameters]);
194
170
  var fireSingleItemViewedEvent = (0, _react.useCallback)(function () {
195
171
  fireEvent('ui.link.viewed.singleItem', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
196
172
  searchMethod: (0, _utils.mapSearchMethod)(searchMethodSearchedWith.current)
@@ -210,7 +186,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
210
186
  displayedColumnCount: visibleColumnCount.current
211
187
  }));
212
188
  }
213
- }, [analyticsPayload, fireEvent, totalCount, isDataReady]);
189
+ }, [isDataReady, fireEvent, analyticsPayload, totalCount, visibleColumnCount]);
214
190
  var fireIssueViewAnalytics = (0, _react.useCallback)(function () {
215
191
  if (!totalCount) {
216
192
  return;
@@ -235,10 +211,10 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
235
211
  }
236
212
  }, [currentViewMode, status, fireIssueViewAnalytics, fireCountViewedEvent]);
237
213
  (0, _useColumnPickerRenderedFailedUfoExperience.useColumnPickerRenderedFailedUfoExperience)(status, experienceId);
238
- var onSearch = (0, _react.useCallback)(function (newParameters, _ref) {
239
- var searchMethod = _ref.searchMethod,
240
- basicFilterSelections = _ref.basicFilterSelections,
241
- isQueryComplex = _ref.isQueryComplex;
214
+ var onSearch = (0, _react.useCallback)(function (newParameters, _ref2) {
215
+ var searchMethod = _ref2.searchMethod,
216
+ basicFilterSelections = _ref2.basicFilterSelections,
217
+ isQueryComplex = _ref2.isQueryComplex;
242
218
  searchCount.current++;
243
219
  searchMethodSearchedWith.current = searchMethod;
244
220
  basicFilterSelectionsSearchedWith.current = basicFilterSelections;
@@ -246,19 +222,26 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
246
222
  if (jql !== newParameters.jql) {
247
223
  userInteractions.add(_types.DatasourceAction.QUERY_UPDATED);
248
224
  }
249
- setJql(newParameters.jql);
225
+ setParameters(function (state) {
226
+ return state && newParameters.jql ? {
227
+ cloudId: state.cloudId,
228
+ jql: newParameters.jql
229
+ } : undefined;
230
+ });
250
231
  reset({
251
232
  shouldForceRequest: true
252
233
  });
253
- }, [jql, reset, userInteractions]);
234
+ }, [jql, reset, userInteractions, setParameters]);
254
235
  var onSiteSelection = (0, _react.useCallback)(function (site) {
255
236
  userInteractions.add(_types.DatasourceAction.INSTANCE_UPDATED);
256
- setJql('');
257
- setCloudId(site.cloudId);
237
+ setParameters({
238
+ jql: '',
239
+ cloudId: site.cloudId
240
+ });
258
241
  reset({
259
242
  shouldForceRequest: true
260
243
  });
261
- }, [reset, userInteractions]);
244
+ }, [reset, userInteractions, setParameters]);
262
245
  var retrieveUrlForSmartCardRender = (0, _react.useCallback)(function () {
263
246
  var _data$key;
264
247
  var _responseItems = (0, _slicedToArray2.default)(responseItems, 1),
@@ -266,120 +249,6 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
266
249
  // agreement with BE that we will use `key` for rendering smartlink
267
250
  return data === null || data === void 0 || (_data$key = data.key) === null || _data$key === void 0 || (_data$key = _data$key.data) === null || _data$key === void 0 ? void 0 : _data$key.url;
268
251
  }, [responseItems]);
269
- var onInsertPressed = (0, _react.useCallback)(function (e, analyticsEvent) {
270
- var _insertButtonClickedE;
271
- if (!isParametersSet || !jql || !selectedJiraSite) {
272
- return;
273
- }
274
-
275
- // During insertion, we want the JQL of the datasource to be whatever is in the search bar,
276
- // even if the user didn't previously click search
277
- var upToDateJql = searchBarJql !== null && searchBarJql !== void 0 ? searchBarJql : jql;
278
- var upToDateJqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURIComponent(upToDateJql));
279
- var filterSelectionCount = _ui.availableBasicFilterTypes.reduce(function (current, filter) {
280
- var _basicFilterSelection;
281
- return _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, "".concat(filter, "BasicFilterSelectionCount"), ((_basicFilterSelection = basicFilterSelectionsSearchedWith.current[filter]) === null || _basicFilterSelection === void 0 ? void 0 : _basicFilterSelection.length) || 0));
282
- }, {});
283
- var insertButtonClickedEvent = analyticsEvent.update({
284
- actionSubjectId: 'insert',
285
- attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
286
- totalItemCount: totalCount || 0,
287
- displayedColumnCount: visibleColumnCount.current,
288
- display: getDisplayValue(currentViewMode, totalCount || 0),
289
- searchCount: searchCount.current,
290
- searchMethod: (0, _utils.mapSearchMethod)(searchMethodSearchedWith.current),
291
- actions: userInteractions.get(),
292
- isQueryComplex: isSearchedWithComplexQuery.current
293
- }, searchMethodSearchedWith.current === 'basic' ? _objectSpread({}, filterSelectionCount) : {}),
294
- eventType: 'ui'
295
- });
296
-
297
- // additional event for tracking in confluence against JIM
298
- var macroInsertedEvent = analyticsEvent.clone();
299
- macroInsertedEvent === null || macroInsertedEvent === void 0 || macroInsertedEvent.update({
300
- eventType: 'track',
301
- action: 'inserted',
302
- actionSubject: 'macro',
303
- actionSubjectId: 'jlol',
304
- attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
305
- totalItemCount: totalCount || 0,
306
- displayedColumnCount: visibleColumnCount.current,
307
- display: getDisplayValue(currentViewMode, totalCount || 0),
308
- searchCount: searchCount.current,
309
- searchMethod: (0, _utils.mapSearchMethod)(searchMethodSearchedWith.current),
310
- actions: userInteractions.get()
311
- })
312
- });
313
- var consumerEvent = (_insertButtonClickedE = insertButtonClickedEvent.clone()) !== null && _insertButtonClickedE !== void 0 ? _insertButtonClickedE : undefined;
314
- insertButtonClickedEvent.fire(_analytics.EVENT_CHANNEL);
315
- var firstIssueUrl = retrieveUrlForSmartCardRender();
316
- if (currentViewMode === 'inline') {
317
- macroInsertedEvent === null || macroInsertedEvent === void 0 || macroInsertedEvent.fire(_analytics.EVENT_CHANNEL);
318
- var url = responseItems.length === 1 ? firstIssueUrl : upToDateJqlUrl;
319
- onInsert({
320
- type: 'inlineCard',
321
- attrs: {
322
- url: url
323
- }
324
- }, consumerEvent);
325
- } else {
326
- onInsert((0, _adf.buildDatasourceAdf)({
327
- id: datasourceId,
328
- parameters: {
329
- cloudId: cloudId,
330
- jql: upToDateJql // TODO support non JQL type
331
- },
332
- views: [{
333
- type: 'table',
334
- properties: {
335
- columns: (visibleColumnKeys || []).map(function (key) {
336
- var width = columnCustomSizes === null || columnCustomSizes === void 0 ? void 0 : columnCustomSizes[key];
337
- var isWrapped = wrappedColumnKeys === null || wrappedColumnKeys === void 0 ? void 0 : wrappedColumnKeys.includes(key);
338
- return _objectSpread(_objectSpread({
339
- key: key
340
- }, width ? {
341
- width: width
342
- } : {}), isWrapped ? {
343
- isWrapped: isWrapped
344
- } : {});
345
- })
346
- }
347
- }]
348
- }, upToDateJqlUrl), consumerEvent);
349
- }
350
- }, [isParametersSet, jql, selectedJiraSite, searchBarJql, analyticsPayload, totalCount, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys, columnCustomSizes, wrappedColumnKeys, userInteractions]);
351
- var handleOnNextPage = (0, _react.useCallback)(function () {
352
- var onNextPageProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
353
- userInteractions.add(_types.DatasourceAction.NEXT_PAGE_SCROLLED);
354
- onNextPage(onNextPageProps);
355
- }, [onNextPage, userInteractions]);
356
- var handleVisibleColumnKeysChange = (0, _react.useCallback)(function () {
357
- var newVisibleColumnKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
358
- var columnAction = (0, _utils2.getColumnAction)(visibleColumnKeys || [], newVisibleColumnKeys);
359
- userInteractions.add(columnAction);
360
- visibleColumnCount.current = newVisibleColumnKeys.length;
361
- setVisibleColumnKeys(newVisibleColumnKeys);
362
- }, [visibleColumnKeys, userInteractions]);
363
- var issueLikeDataTableView = (0, _react.useMemo)(function () {
364
- return (0, _react2.jsx)(_contentContainer.ContentContainer, {
365
- withTableBorder: true
366
- }, (0, _react2.jsx)(_issueLikeTable.IssueLikeDataTableView, {
367
- testId: "jira-datasource-table",
368
- status: status,
369
- columns: columns,
370
- items: responseItems,
371
- hasNextPage: hasNextPage,
372
- visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
373
- onNextPage: handleOnNextPage,
374
- onLoadDatasourceDetails: loadDatasourceDetails,
375
- onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
376
- extensionKey: extensionKey,
377
- columnCustomSizes: columnCustomSizes,
378
- onColumnResize: onColumnResize,
379
- wrappedColumnKeys: wrappedColumnKeys,
380
- onWrappedColumnChange: (0, _platformFeatureFlags.fg)('platform.linking-platform.datasource-word_wrap') ? onWrappedColumnChange : undefined
381
- }));
382
- }, [status, columns, responseItems, hasNextPage, visibleColumnKeys, defaultVisibleColumnKeys, handleOnNextPage, loadDatasourceDetails, handleVisibleColumnKeysChange, extensionKey, columnCustomSizes, onColumnResize, wrappedColumnKeys, onWrappedColumnChange]);
383
252
  var renderCountModeContent = (0, _react.useCallback)(function () {
384
253
  var selectedJiraSiteUrl = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
385
254
  if (status === 'unauthorized') {
@@ -439,8 +308,12 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
439
308
  } : undefined
440
309
  }));
441
310
  }
442
- return issueLikeDataTableView;
443
- }, [columns.length, currentSearchMethod, issueLikeDataTableView, jql, jqlUrl, resolvedWithNoResults, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status, urlBeingEdited]);
311
+ return (0, _react2.jsx)(_contentContainer.ContentContainer, {
312
+ withTableBorder: true
313
+ }, (0, _react2.jsx)(_datasourcesTableInModalPreview.default, {
314
+ testId: "jira-datasource-table"
315
+ }));
316
+ }, [columns.length, currentSearchMethod, jql, jqlUrl, resolvedWithNoResults, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status, urlBeingEdited]);
444
317
  var siteSelectorLabel = availableSites && availableSites.length > 1 ? _messages3.modalMessages.insertIssuesTitleManySites : _messages3.modalMessages.insertIssuesTitle;
445
318
  var getCancelButtonAnalyticsPayload = (0, _react.useCallback)(function () {
446
319
  return _objectSpread(_objectSpread({}, analyticsPayload), {}, {
@@ -448,6 +321,38 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
448
321
  actions: userInteractions.get()
449
322
  });
450
323
  }, [analyticsPayload, userInteractions]);
324
+ var filterSelectionCount = _ui.availableBasicFilterTypes.reduce(function (current, filter) {
325
+ var _basicFilterSelection;
326
+ return _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, "".concat(filter, "BasicFilterSelectionCount"), ((_basicFilterSelection = basicFilterSelectionsSearchedWith.current[filter]) === null || _basicFilterSelection === void 0 ? void 0 : _basicFilterSelection.length) || 0));
327
+ }, {});
328
+ var getInsertButtonAnalyticsPayload = (0, _react.useCallback)(function () {
329
+ return _objectSpread(_objectSpread({}, analyticsPayload), {}, {
330
+ display: getDisplayValue(currentViewMode, totalCount || 0),
331
+ isQueryComplex: isSearchedWithComplexQuery.current,
332
+ searchMethod: (0, _utils.mapSearchMethod)(searchMethodSearchedWith.current),
333
+ searchCount: searchCount.current,
334
+ actions: userInteractions.get()
335
+ }, searchMethodSearchedWith.current === 'basic' ? _objectSpread({}, filterSelectionCount) : {});
336
+ }, [analyticsPayload, currentViewMode, filterSelectionCount, totalCount, userInteractions]);
337
+ var urlToInsert = (0, _react.useMemo)(function () {
338
+ var jql = parameters === null || parameters === void 0 ? void 0 : parameters.jql;
339
+ if (!jql || !(selectedJiraSite !== null && selectedJiraSite !== void 0 && selectedJiraSite.url)) {
340
+ return;
341
+ }
342
+ // During insertion, we want the JQL of the datasource to be whatever is in the search bar,
343
+ // even if the user didn't previously click search
344
+ var upToDateJql = searchBarJql !== null && searchBarJql !== void 0 ? searchBarJql : jql;
345
+ var upToDateJqlUrl = "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURIComponent(upToDateJql));
346
+ return currentViewMode === 'inline' && responseItems.length === 1 ? retrieveUrlForSmartCardRender() : upToDateJqlUrl;
347
+ }, [currentViewMode, parameters === null || parameters === void 0 ? void 0 : parameters.jql, responseItems, retrieveUrlForSmartCardRender, searchBarJql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url]);
348
+ var updateParametersBeforeInsert = function updateParametersBeforeInsert(parameters) {
349
+ return {
350
+ cloudId: parameters.cloudId,
351
+ // searchBarJql will not be null at this point, since this function is only called when user press insert button
352
+ //
353
+ jql: searchBarJql || ''
354
+ };
355
+ };
451
356
  return (0, _react2.jsx)(_intlMessagesProvider.IntlMessagesProvider, {
452
357
  defaultMessages: _en.default,
453
358
  loaderFn: _fetchMessagesForLocale.fetchMessagesForLocale
@@ -482,11 +387,11 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
482
387
  onCancel: onCancel,
483
388
  getAnalyticsPayload: getCancelButtonAnalyticsPayload,
484
389
  testId: "jira-datasource-modal--cancel-button"
485
- }), !hasNoJiraSites && (0, _react2.jsx)(_standardButton.default, {
486
- appearance: "primary",
487
- onClick: onInsertPressed,
488
- isDisabled: isInsertDisabled,
489
- testId: "jira-datasource-modal--insert-button"
390
+ }), !hasNoJiraSites && (0, _react2.jsx)(_insertButton.InsertButton, {
391
+ testId: "jira-datasource-modal--insert-button",
392
+ url: urlToInsert,
393
+ overwriteParameters: updateParametersBeforeInsert,
394
+ getAnalyticsPayload: getInsertButtonAnalyticsPayload
490
395
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _messages3.modalMessages.insertIssuesButtonText))))));
491
396
  };
492
397
  var analyticsContextAttributes = {
@@ -498,9 +403,35 @@ var analyticsContextData = _objectSpread(_objectSpread({}, _constants.componentM
498
403
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
499
404
  attributes: _objectSpread({}, analyticsContextAttributes)
500
405
  });
501
- var JiraIssuesConfigModal = exports.JiraIssuesConfigModal = (0, _analyticsNext.withAnalyticsContext)(contextData)(function (props) {
502
- var _props$viewMode;
503
- return (0, _react2.jsx)(_datasourceExperienceId.DatasourceExperienceIdProvider, null, (0, _react2.jsx)(_userInteractions.UserInteractionsProvider, null, (0, _platformFeatureFlags.fg)('platform-datasources-use-refactored-config-modal') ? (0, _react2.jsx)(_useViewModeContext2.DatasourceViewModeProvider, {
504
- viewMode: (_props$viewMode = props.viewMode) !== null && _props$viewMode !== void 0 ? _props$viewMode : DEFAULT_VIEW_MODE
505
- }, (0, _react2.jsx)(PlainJiraIssuesConfigModal, props)) : (0, _react2.jsx)(_ModalOld.PlainJiraIssuesConfigModalOld, props)));
506
- });
406
+ var ConnectedJiraIssueConfigModal = (0, _createDatasourceModal.createDatasourceModal)({
407
+ isValidParameters: isValidParameters,
408
+ dataProvider: 'jira-issues',
409
+ component: PlainJiraIssuesConfigModal
410
+ });
411
+ var JiraIssuesConfigModalWithExtraAnalyticsOnInsert = function JiraIssuesConfigModalWithExtraAnalyticsOnInsert(props) {
412
+ var onInsert = props.onInsert;
413
+ var onInsertWithMacroAnalytics = (0, _react.useCallback)(function (adf, analyticsEvent) {
414
+ if (analyticsEvent && adf.type === 'inlineCard') {
415
+ var macroInsertedEvent = analyticsEvent.clone();
416
+ macroInsertedEvent === null || macroInsertedEvent === void 0 || macroInsertedEvent.update({
417
+ eventType: 'track',
418
+ action: 'inserted',
419
+ actionSubject: 'macro',
420
+ actionSubjectId: 'jlol'
421
+ });
422
+ macroInsertedEvent === null || macroInsertedEvent === void 0 || macroInsertedEvent.fire(_constants.EVENT_CHANNEL);
423
+ }
424
+ onInsert(adf, analyticsEvent);
425
+ }, [onInsert]);
426
+ return (0, _react2.jsx)(_state.StoreContainer, null, (0, _react2.jsx)(ConnectedJiraIssueConfigModal, (0, _extends2.default)({}, props, {
427
+ onInsert: onInsertWithMacroAnalytics
428
+ })));
429
+ };
430
+ var JiraIssuesConfigModal = exports.JiraIssuesConfigModal = function JiraIssuesConfigModal(props) {
431
+ if ((0, _platformFeatureFlags.fg)('platform-datasources-use-refactored-config-modal')) {
432
+ return (0, _react2.jsx)(JiraIssuesConfigModalWithExtraAnalyticsOnInsert, props);
433
+ }
434
+ return (0, _react2.jsx)(_state.StoreContainer, null, (0, _react2.jsx)(_analyticsNext.AnalyticsContext, {
435
+ data: contextData
436
+ }, (0, _react2.jsx)(_datasourceExperienceId.DatasourceExperienceIdProvider, null, (0, _react2.jsx)(_userInteractions.UserInteractionsProvider, null, (0, _react2.jsx)(_ModalOld.PlainJiraIssuesConfigModalOld, props)))));
437
+ };
@@ -1,7 +1,9 @@
1
1
  import { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import isEqual from 'lodash/isEqual';
3
3
  import { DEFAULT_GET_DATASOURCE_DATA_PAGE_SIZE, useDatasourceClientExtension } from '@atlaskit/link-client-extension';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import { useDatasourceAnalyticsEvents } from '../analytics';
6
+ import { useDatasourceActions } from '../state';
5
7
  import useErrorLogger from './useErrorLogger';
6
8
  export const useDatasourceTableState = ({
7
9
  datasourceId,
@@ -16,6 +18,9 @@ export const useDatasourceTableState = ({
16
18
  } = useErrorLogger({
17
19
  datasourceId
18
20
  });
21
+ const {
22
+ onAddItems
23
+ } = useDatasourceActions();
19
24
  const idFieldCount = 1;
20
25
  const keyFieldCount = 1;
21
26
  const [initialEmptyArray] = useState([]);
@@ -26,7 +31,8 @@ export const useDatasourceTableState = ({
26
31
  });
27
32
  const [status, setStatus] = useState('empty');
28
33
  const [authDetails, setAuthDetails] = useState([]);
29
- const [responseItems, setResponseItems] = useState([]);
34
+ const [responseItems, setResponseItems] = useState(initialEmptyArray);
35
+ const [, setResponseItemIds] = useState(initialEmptyArray);
30
36
  const [hasNextPage, setHasNextPage] = useState(true);
31
37
  const [nextCursor, setNextCursor] = useState(undefined);
32
38
  const [columns, setColumns] = useState([]);
@@ -157,7 +163,6 @@ export const useDatasourceTableState = ({
157
163
  schema
158
164
  }
159
165
  } = await getDatasourceData(datasourceId, datasourceDataRequest, shouldForceRequest);
160
-
161
166
  /**
162
167
  * Let the response finish and store in cache, but throw error if signal is aborted
163
168
  */
@@ -180,6 +185,10 @@ export const useDatasourceTableState = ({
180
185
  }
181
186
  return [...currentResponseItems, ...items];
182
187
  });
188
+ if (fg('enable_datasource_react_sweet_state')) {
189
+ const newIds = onAddItems(items);
190
+ setResponseItemIds(currentIds => [...currentIds, ...newIds]);
191
+ }
183
192
  setHasNextPage(Boolean(nextPageCursor));
184
193
  if (fieldKeys.length > 0) {
185
194
  setLastRequestedFieldKeys(fieldKeys);
@@ -187,9 +196,9 @@ export const useDatasourceTableState = ({
187
196
  if ((isSchemaFromData && schema || fullSchema.properties.length > 0) && items.length > 0) {
188
197
  applySchemaProperties(schema || fullSchema, fieldKeys);
189
198
  }
190
- const isUserLoadingNextPage = (responseItems === null || responseItems === void 0 ? void 0 : responseItems.length) !== 0 && !shouldRequestFirstPage;
199
+ const isUserLoadingNextPage = responseItems.length !== 0 && !shouldRequestFirstPage;
191
200
  if (isUserLoadingNextPage) {
192
- const currentLoadedItemCount = (responseItems === null || responseItems === void 0 ? void 0 : responseItems.length) || 0;
201
+ const currentLoadedItemCount = responseItems.length;
193
202
  const newlyLoadedItemCount = (items === null || items === void 0 ? void 0 : items.length) || 0;
194
203
  fireEvent('track.nextItem.loaded', {
195
204
  extensionKey,
@@ -219,9 +228,10 @@ export const useDatasourceTableState = ({
219
228
  }
220
229
  setStatus('rejected');
221
230
  }
222
- }, [captureError, parameters, fieldKeys, nextCursor, getDatasourceData, datasourceId, responseItems, applySchemaProperties, fireEvent, fullSchema, initialEmptyArray]);
231
+ }, [captureError, parameters, fieldKeys, nextCursor, responseItems, setResponseItemIds, onAddItems, getDatasourceData, datasourceId, applySchemaProperties, fireEvent, fullSchema, initialEmptyArray]);
223
232
  const reset = useCallback(options => {
224
233
  setResponseItems(initialEmptyArray);
234
+ setResponseItemIds(initialEmptyArray);
225
235
  setHasNextPage(true);
226
236
  setNextCursor(undefined);
227
237
  setTotalCount(undefined);
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { createActionsHook, createContainer, createStateHook, createStore } from 'react-sweet-state';
3
+ import { v4 as uuidv4 } from 'uuid';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
5
+ const getInitialState = () => ({
6
+ items: {}
7
+ });
8
+ export const actions = {
9
+ onAddItems: items => ({
10
+ setState,
11
+ getState
12
+ }) => {
13
+ const oldItems = {
14
+ ...getState().items
15
+ };
16
+ const [newItemIds, newItems] = items.reduce(([ids, itemMap], item) => {
17
+ var _item$ari;
18
+ const ari = typeof ((_item$ari = item['ari']) === null || _item$ari === void 0 ? void 0 : _item$ari.data) === 'string' ? item['ari'].data : undefined;
19
+ const id = ari !== null && ari !== void 0 ? ari : uuidv4();
20
+ return [[...ids, id], {
21
+ ...itemMap,
22
+ [id]: {
23
+ ...oldItems[id],
24
+ ...item
25
+ }
26
+ }];
27
+ }, [[], oldItems]);
28
+ setState({
29
+ items: newItems
30
+ });
31
+ return newItemIds;
32
+ }
33
+ };
34
+ export const Store = createStore({
35
+ name: 'datasource-store',
36
+ initialState: getInitialState(),
37
+ actions
38
+ });
39
+ export const useDatasourceItem = createStateHook(Store, {
40
+ selector: (state, {
41
+ id
42
+ }) => state.items[id]
43
+ });
44
+ export const useDatasourceActions = createActionsHook(Store);
45
+ const Container = createContainer(Store);
46
+ export const StoreContainer = ({
47
+ children
48
+ }) => {
49
+ if (fg('enable_datasource_react_sweet_state')) {
50
+ return /*#__PURE__*/React.createElement(Container, {
51
+ scope: "datasource"
52
+ }, children);
53
+ }
54
+ return children;
55
+ };