@atlaskit/link-datasource 2.5.5 → 2.5.6

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 (25) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/ui/common/modal/datasource-context/DatasourceContext.js +18 -0
  3. package/dist/cjs/ui/common/modal/datasource-context/DatasourceContextProvider.js +35 -0
  4. package/dist/cjs/ui/confluence-search-modal/modal/ModalOld.js +451 -0
  5. package/dist/cjs/ui/confluence-search-modal/modal/index.js +18 -23
  6. package/dist/cjs/ui/datasources-table-in-modal-preview/index.js +26 -0
  7. package/dist/es2019/ui/common/modal/datasource-context/DatasourceContext.js +9 -0
  8. package/dist/es2019/ui/common/modal/datasource-context/DatasourceContextProvider.js +27 -0
  9. package/dist/es2019/ui/confluence-search-modal/modal/ModalOld.js +426 -0
  10. package/dist/es2019/ui/confluence-search-modal/modal/index.js +33 -37
  11. package/dist/es2019/ui/datasources-table-in-modal-preview/index.js +20 -0
  12. package/dist/esm/ui/common/modal/datasource-context/DatasourceContext.js +9 -0
  13. package/dist/esm/ui/common/modal/datasource-context/DatasourceContextProvider.js +26 -0
  14. package/dist/esm/ui/confluence-search-modal/modal/ModalOld.js +447 -0
  15. package/dist/esm/ui/confluence-search-modal/modal/index.js +19 -24
  16. package/dist/esm/ui/datasources-table-in-modal-preview/index.js +19 -0
  17. package/dist/types/ui/common/modal/datasource-context/DatasourceContext.d.ts +11 -0
  18. package/dist/types/ui/common/modal/datasource-context/DatasourceContextProvider.d.ts +10 -0
  19. package/dist/types/ui/confluence-search-modal/modal/ModalOld.d.ts +3 -0
  20. package/dist/types/ui/datasources-table-in-modal-preview/index.d.ts +20 -0
  21. package/dist/types-ts4.5/ui/common/modal/datasource-context/DatasourceContext.d.ts +11 -0
  22. package/dist/types-ts4.5/ui/common/modal/datasource-context/DatasourceContextProvider.d.ts +10 -0
  23. package/dist/types-ts4.5/ui/confluence-search-modal/modal/ModalOld.d.ts +3 -0
  24. package/dist/types-ts4.5/ui/datasources-table-in-modal-preview/index.d.ts +20 -0
  25. package/package.json +8 -5
@@ -0,0 +1,26 @@
1
+ import React, { useMemo } from 'react';
2
+ import { useColumnResize } from '../../../issue-like-table/use-column-resize';
3
+ import { useColumnWrapping } from '../../../issue-like-table/use-column-wrapping';
4
+ import { DatasourceContext } from './DatasourceContext';
5
+ export var DatasourceContextProvider = function DatasourceContextProvider(_ref) {
6
+ var children = _ref.children,
7
+ initialColumnCustomSizes = _ref.initialColumnCustomSizes,
8
+ initialWrappedColumnKeys = _ref.initialWrappedColumnKeys;
9
+ var _useColumnResize = useColumnResize(initialColumnCustomSizes),
10
+ columnCustomSizes = _useColumnResize.columnCustomSizes,
11
+ onColumnResize = _useColumnResize.onColumnResize;
12
+ var _useColumnWrapping = useColumnWrapping(initialWrappedColumnKeys),
13
+ wrappedColumnKeys = _useColumnWrapping.wrappedColumnKeys,
14
+ onWrappedColumnChange = _useColumnWrapping.onWrappedColumnChange;
15
+ var contextValue = useMemo(function () {
16
+ return {
17
+ columnCustomSizes: columnCustomSizes,
18
+ onColumnResize: onColumnResize,
19
+ wrappedColumnKeys: wrappedColumnKeys,
20
+ onWrappedColumnChange: onWrappedColumnChange
21
+ };
22
+ }, [columnCustomSizes, onColumnResize, onWrappedColumnChange, wrappedColumnKeys]);
23
+ return /*#__PURE__*/React.createElement(DatasourceContext.Provider, {
24
+ value: contextValue
25
+ }, children);
26
+ };
@@ -0,0 +1,447 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ /** @jsx jsx */
6
+ import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+
8
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
9
+ import { jsx } from '@emotion/react';
10
+ import { FormattedMessage } from 'react-intl-next';
11
+ import Button from '@atlaskit/button/standard-button';
12
+ import { IntlMessagesProvider } from '@atlaskit/intl-messages-provider';
13
+ import { ModalBody, ModalFooter, ModalHeader, ModalTitle } from '@atlaskit/modal-dialog';
14
+ import { fg } from '@atlaskit/platform-feature-flags';
15
+ import { Box, xcss } from '@atlaskit/primitives';
16
+ import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
17
+ import { DatasourceAction, DatasourceDisplay, DatasourceSearchMethod } from '../../../analytics/types';
18
+ import { buildDatasourceAdf } from '../../../common/utils/adf';
19
+ import { fetchMessagesForLocale } from '../../../common/utils/locale/fetch-messages-for-locale';
20
+ import { useUserInteractions } from '../../../contexts/user-interactions';
21
+ import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
22
+ import i18nEN from '../../../i18n/en';
23
+ import { useAvailableSites } from '../../../services/useAvailableSites';
24
+ import { AccessRequired } from '../../common/error-state/access-required';
25
+ import { ModalLoadingError } from '../../common/error-state/modal-loading-error';
26
+ import { NoInstancesView } from '../../common/error-state/no-instances';
27
+ import { NoResults } from '../../common/error-state/no-results';
28
+ import { InitialStateView } from '../../common/initial-state-view';
29
+ import { CancelButton } from '../../common/modal/cancel-button';
30
+ import { ContentContainer } from '../../common/modal/content-container';
31
+ import { SmartCardPlaceholder, SmartLink } from '../../common/modal/count-view-smart-link';
32
+ import { DatasourceModal } from '../../common/modal/datasource-modal';
33
+ import { DisplayViewDropDown } from '../../common/modal/display-view-dropdown/display-view-drop-down';
34
+ import TableSearchCount from '../../common/modal/search-count';
35
+ import { SiteSelector } from '../../common/modal/site-selector';
36
+ import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
37
+ import { useColumnResize } from '../../issue-like-table/use-column-resize';
38
+ import { useColumnWrapping } from '../../issue-like-table/use-column-wrapping';
39
+ import { getColumnAction } from '../../issue-like-table/utils';
40
+ import ConfluenceSearchContainer from '../confluence-search-container';
41
+ import { ConfluenceSearchInitialStateSVG } from './confluence-search-initial-state-svg';
42
+ import { confluenceSearchModalMessages } from './messages';
43
+ var inputContainerStyles = xcss({
44
+ alignItems: 'baseline',
45
+ display: 'flex',
46
+ minHeight: '72px'
47
+ });
48
+ export var PlainConfluenceSearchConfigModal = function PlainConfluenceSearchConfigModal(props) {
49
+ var datasourceId = props.datasourceId,
50
+ initialColumnCustomSizes = props.columnCustomSizes,
51
+ initialWrappedColumnKeys = props.wrappedColumnKeys,
52
+ onCancel = props.onCancel,
53
+ onInsert = props.onInsert,
54
+ _props$viewMode = props.viewMode,
55
+ viewMode = _props$viewMode === void 0 ? 'table' : _props$viewMode,
56
+ initialParameters = props.parameters,
57
+ urlBeingEdited = props.url,
58
+ initialVisibleColumnKeys = props.visibleColumnKeys,
59
+ _props$disableDisplay = props.disableDisplayDropdown,
60
+ disableDisplayDropdown = _props$disableDisplay === void 0 ? false : _props$disableDisplay,
61
+ overrideParameters = props.overrideParameters;
62
+ var _useState = useState(viewMode),
63
+ _useState2 = _slicedToArray(_useState, 2),
64
+ currentViewMode = _useState2[0],
65
+ setCurrentViewMode = _useState2[1];
66
+ var _useState3 = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId),
67
+ _useState4 = _slicedToArray(_useState3, 2),
68
+ cloudId = _useState4[0],
69
+ setCloudId = _useState4[1];
70
+ var _useAvailableSites = useAvailableSites('confluence', cloudId),
71
+ availableSites = _useAvailableSites.availableSites,
72
+ selectedConfluenceSite = _useAvailableSites.selectedSite;
73
+ var _useState5 = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString),
74
+ _useState6 = _slicedToArray(_useState5, 2),
75
+ searchString = _useState6[0],
76
+ setSearchString = _useState6[1];
77
+ var _useState7 = useState(initialVisibleColumnKeys),
78
+ _useState8 = _slicedToArray(_useState7, 2),
79
+ visibleColumnKeys = _useState8[0],
80
+ setVisibleColumnKeys = _useState8[1];
81
+ var _useState9 = useState((initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.contributorAccountIds) || []),
82
+ _useState10 = _slicedToArray(_useState9, 2),
83
+ contributorAccountIds = _useState10[0],
84
+ setContributorAccountIds = _useState10[1];
85
+ var _useState11 = useState(initialParameters !== null && initialParameters !== void 0 && initialParameters.lastModified ? {
86
+ value: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.lastModified,
87
+ from: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.lastModifiedFrom,
88
+ to: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.lastModifiedTo
89
+ } : undefined),
90
+ _useState12 = _slicedToArray(_useState11, 2),
91
+ lastModified = _useState12[0],
92
+ setLastModified = _useState12[1];
93
+
94
+ // analytics related parameters
95
+ var searchCount = useRef(0);
96
+ var userInteractions = useUserInteractions();
97
+ var visibleColumnCount = useRef((visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0);
98
+ var parameters = useMemo(function () {
99
+ return _objectSpread(_objectSpread({}, initialParameters), {}, {
100
+ cloudId: cloudId || '',
101
+ searchString: searchString,
102
+ lastModified: lastModified === null || lastModified === void 0 ? void 0 : lastModified.value,
103
+ lastModifiedFrom: lastModified === null || lastModified === void 0 ? void 0 : lastModified.from,
104
+ lastModifiedTo: lastModified === null || lastModified === void 0 ? void 0 : lastModified.to,
105
+ contributorAccountIds: (contributorAccountIds === null || contributorAccountIds === void 0 ? void 0 : contributorAccountIds.length) > 0 ? contributorAccountIds : undefined
106
+ });
107
+ }, [initialParameters, cloudId, searchString, lastModified, contributorAccountIds]);
108
+ var isParametersSet = useMemo(function () {
109
+ return !!cloudId && Object.values(parameters !== null && parameters !== void 0 ? parameters : {}).filter(function (v) {
110
+ return v !== undefined;
111
+ }).length > 1;
112
+ }, [cloudId, parameters]);
113
+ var parametersToSend = useMemo(function () {
114
+ if (!isParametersSet) {
115
+ return undefined;
116
+ }
117
+ return _objectSpread(_objectSpread({}, parameters), overrideParameters !== null && overrideParameters !== void 0 ? overrideParameters : {});
118
+ }, [parameters, overrideParameters, isParametersSet]);
119
+ var _useDatasourceTableSt = useDatasourceTableState({
120
+ datasourceId: datasourceId,
121
+ parameters: parametersToSend,
122
+ fieldKeys: visibleColumnKeys
123
+ }),
124
+ reset = _useDatasourceTableSt.reset,
125
+ status = _useDatasourceTableSt.status,
126
+ onNextPage = _useDatasourceTableSt.onNextPage,
127
+ responseItems = _useDatasourceTableSt.responseItems,
128
+ hasNextPage = _useDatasourceTableSt.hasNextPage,
129
+ columns = _useDatasourceTableSt.columns,
130
+ defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys,
131
+ loadDatasourceDetails = _useDatasourceTableSt.loadDatasourceDetails,
132
+ totalCount = _useDatasourceTableSt.totalCount,
133
+ _useDatasourceTableSt2 = _useDatasourceTableSt.extensionKey,
134
+ extensionKey = _useDatasourceTableSt2 === void 0 ? null : _useDatasourceTableSt2,
135
+ destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes;
136
+ var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
137
+ fireEvent = _useDatasourceAnalyti.fireEvent;
138
+ var hasNoConfluenceSites = availableSites && availableSites.length === 0;
139
+ useEffect(function () {
140
+ if (availableSites) {
141
+ fireEvent('ui.modal.ready.datasource', {
142
+ instancesCount: availableSites.length,
143
+ schemasCount: null
144
+ });
145
+ }
146
+ }, [fireEvent, availableSites]);
147
+
148
+ // TODO: further refactoring in EDM-9573
149
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6828283
150
+ useEffect(function () {
151
+ if (selectedConfluenceSite && (!cloudId || cloudId !== selectedConfluenceSite.cloudId)) {
152
+ setCloudId(selectedConfluenceSite.cloudId);
153
+ }
154
+ }, [cloudId, selectedConfluenceSite]);
155
+
156
+ // TODO: further refactoring in EDM-9573
157
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6829171
158
+ var onSiteSelection = useCallback(function (site) {
159
+ userInteractions.add(DatasourceAction.INSTANCE_UPDATED);
160
+ setSearchString(undefined);
161
+ setLastModified(undefined);
162
+ setContributorAccountIds([]);
163
+ setCloudId(site.cloudId);
164
+ reset({
165
+ shouldForceRequest: true
166
+ });
167
+ }, [reset, userInteractions]);
168
+ useEffect(function () {
169
+ var newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
170
+ visibleColumnCount.current = newVisibleColumnKeys.length;
171
+ setVisibleColumnKeys(newVisibleColumnKeys);
172
+ }, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
173
+ var siteSelectorLabel = availableSites && availableSites.length > 1 ? confluenceSearchModalMessages.insertIssuesTitleManySites : confluenceSearchModalMessages.insertIssuesTitle;
174
+ var _useColumnResize = useColumnResize(initialColumnCustomSizes),
175
+ columnCustomSizes = _useColumnResize.columnCustomSizes,
176
+ onColumnResize = _useColumnResize.onColumnResize;
177
+ var _useColumnWrapping = useColumnWrapping(initialWrappedColumnKeys),
178
+ wrappedColumnKeys = _useColumnWrapping.wrappedColumnKeys,
179
+ onWrappedColumnChange = _useColumnWrapping.onWrappedColumnChange;
180
+
181
+ // TODO: common functionality of all modals refactor in EDM-9573
182
+ var handleVisibleColumnKeysChange = useCallback(function () {
183
+ var newVisibleColumnKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
184
+ var columnAction = getColumnAction(visibleColumnKeys || [], newVisibleColumnKeys);
185
+ userInteractions.add(columnAction);
186
+ visibleColumnCount.current = newVisibleColumnKeys.length;
187
+ setVisibleColumnKeys(newVisibleColumnKeys);
188
+ }, [visibleColumnKeys, userInteractions]);
189
+
190
+ // TODO: further refactoring in EDM-9573
191
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6798258
192
+ var confluenceSearchTable = useMemo(function () {
193
+ return jsx(ContentContainer, {
194
+ withTableBorder: true
195
+ }, jsx(IssueLikeDataTableView, {
196
+ testId: "confluence-search-datasource-table",
197
+ status: status,
198
+ columns: columns,
199
+ items: responseItems,
200
+ hasNextPage: hasNextPage,
201
+ visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
202
+ onNextPage: onNextPage,
203
+ onLoadDatasourceDetails: loadDatasourceDetails,
204
+ onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
205
+ extensionKey: extensionKey,
206
+ columnCustomSizes: columnCustomSizes,
207
+ onColumnResize: onColumnResize,
208
+ wrappedColumnKeys: wrappedColumnKeys,
209
+ onWrappedColumnChange: fg('platform.linking-platform.datasource-word_wrap') ? onWrappedColumnChange : undefined
210
+ }));
211
+ }, [status, columns, responseItems, hasNextPage, visibleColumnKeys, defaultVisibleColumnKeys, onNextPage, loadDatasourceDetails, handleVisibleColumnKeysChange, extensionKey, columnCustomSizes, onColumnResize, wrappedColumnKeys, onWrappedColumnChange]);
212
+ var resolvedWithNoResults = status === 'resolved' && !responseItems.length;
213
+ var hasConfluenceSearchParams = selectedConfluenceSite && searchString;
214
+ var selectedConfluenceSiteUrl = selectedConfluenceSite === null || selectedConfluenceSite === void 0 ? void 0 : selectedConfluenceSite.url;
215
+ var confluenceSearchUrl = useMemo(function () {
216
+ if (!selectedConfluenceSiteUrl || searchString === undefined) {
217
+ return undefined;
218
+ }
219
+ var params = new URLSearchParams();
220
+ // we are appending "text" without checking searchString as we need the url to have "text" when a user does an empty search
221
+ params.append('text', searchString);
222
+ if (contributorAccountIds.length > 0) {
223
+ params.append('contributors', contributorAccountIds.join(','));
224
+ }
225
+ if (lastModified !== null && lastModified !== void 0 && lastModified.value) {
226
+ params.append('lastModified', lastModified.value);
227
+ }
228
+ if (lastModified !== null && lastModified !== void 0 && lastModified.from) {
229
+ params.append('from', lastModified === null || lastModified === void 0 ? void 0 : lastModified.from);
230
+ }
231
+ if (lastModified !== null && lastModified !== void 0 && lastModified.to) {
232
+ params.append('to', lastModified === null || lastModified === void 0 ? void 0 : lastModified.to);
233
+ }
234
+ return "".concat(selectedConfluenceSiteUrl, "/wiki/search?").concat(params.toString());
235
+ }, [contributorAccountIds, lastModified, searchString, selectedConfluenceSiteUrl]);
236
+ var analyticsPayload = useMemo(function () {
237
+ return {
238
+ extensionKey: extensionKey,
239
+ destinationObjectTypes: destinationObjectTypes,
240
+ searchCount: searchCount.current,
241
+ actions: userInteractions.get()
242
+ };
243
+ }, [destinationObjectTypes, extensionKey, userInteractions]);
244
+ var isDataReady = (visibleColumnKeys || []).length > 0;
245
+ var fireInlineViewedEvent = useCallback(function () {
246
+ fireEvent('ui.link.viewed.count', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
247
+ searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
248
+ totalItemCount: totalCount || 0
249
+ }));
250
+ }, [analyticsPayload, fireEvent, totalCount]);
251
+ var fireTableViewedEvent = useCallback(function () {
252
+ if (isDataReady) {
253
+ fireEvent('ui.table.viewed.datasourceConfigModal', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
254
+ totalItemCount: totalCount || 0,
255
+ searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
256
+ displayedColumnCount: visibleColumnCount.current
257
+ }));
258
+ }
259
+ }, [analyticsPayload, fireEvent, totalCount, isDataReady]);
260
+ useEffect(function () {
261
+ var isResolved = status === 'resolved';
262
+ var isTableViewMode = currentViewMode === 'table';
263
+ var isInlineViewMode = currentViewMode === 'inline';
264
+ if (!isResolved) {
265
+ return;
266
+ }
267
+ if (isTableViewMode) {
268
+ fireTableViewedEvent();
269
+ } else if (isInlineViewMode) {
270
+ fireInlineViewedEvent();
271
+ }
272
+ }, [currentViewMode, fireInlineViewedEvent, fireTableViewedEvent, status]);
273
+ var renderTableModalContent = useCallback(function () {
274
+ if (status === 'rejected') {
275
+ return jsx(ModalLoadingError, null);
276
+ } else if (status === 'unauthorized') {
277
+ return jsx(AccessRequired, {
278
+ url: selectedConfluenceSiteUrl || urlBeingEdited
279
+ });
280
+ } else if (resolvedWithNoResults || status === 'forbidden') {
281
+ return jsx(NoResults, null);
282
+ } else if (status === 'empty' || !columns.length) {
283
+ // persist the empty state when making the initial /data request which contains the columns
284
+ if (hasConfluenceSearchParams !== undefined) {
285
+ return jsx(EmptyState, {
286
+ testId: "confluence-search-datasource-modal--empty-state"
287
+ });
288
+ }
289
+ return jsx(ContentContainer, null, jsx(InitialStateView, {
290
+ icon: jsx(ConfluenceSearchInitialStateSVG, null),
291
+ title: confluenceSearchModalMessages.initialViewSearchTitle,
292
+ description: confluenceSearchModalMessages.initialViewSearchDescription
293
+ }));
294
+ }
295
+ return confluenceSearchTable;
296
+ }, [columns.length, selectedConfluenceSiteUrl, confluenceSearchTable, resolvedWithNoResults, status, urlBeingEdited, hasConfluenceSearchParams]);
297
+ var renderInlineLinkModalContent = useCallback(function () {
298
+ if (status === 'unauthorized') {
299
+ return jsx(AccessRequired, {
300
+ url: selectedConfluenceSiteUrl || urlBeingEdited
301
+ });
302
+ } else if (status === 'empty' || !selectedConfluenceSiteUrl) {
303
+ return jsx(SmartCardPlaceholder, {
304
+ placeholderText: confluenceSearchModalMessages.resultsCountSmartCardPlaceholderText
305
+ });
306
+ } else {
307
+ return confluenceSearchUrl && jsx(SmartLink, {
308
+ url: confluenceSearchUrl
309
+ });
310
+ }
311
+ }, [confluenceSearchUrl, selectedConfluenceSiteUrl, status, urlBeingEdited]);
312
+ var shouldShowResultsCount = !!totalCount && currentViewMode === 'table';
313
+ var onInsertPressed = useCallback(function (e, analyticsEvent) {
314
+ var _insertButtonClickedE;
315
+ if (!isParametersSet || !cloudId || !confluenceSearchUrl) {
316
+ return;
317
+ }
318
+ var insertButtonClickedEvent = analyticsEvent.update({
319
+ actionSubjectId: 'insert',
320
+ attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
321
+ totalItemCount: totalCount || 0,
322
+ displayedColumnCount: visibleColumnCount.current,
323
+ display: currentViewMode === 'inline' ? DatasourceDisplay.DATASOURCE_INLINE : DatasourceDisplay.DATASOURCE_TABLE,
324
+ searchCount: searchCount.current,
325
+ searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
326
+ actions: userInteractions.get()
327
+ }),
328
+ eventType: 'ui'
329
+ });
330
+ var consumerEvent = (_insertButtonClickedE = insertButtonClickedEvent.clone()) !== null && _insertButtonClickedE !== void 0 ? _insertButtonClickedE : undefined;
331
+ insertButtonClickedEvent.fire(EVENT_CHANNEL);
332
+ if (currentViewMode === 'inline') {
333
+ onInsert({
334
+ type: 'inlineCard',
335
+ attrs: {
336
+ url: confluenceSearchUrl
337
+ }
338
+ }, consumerEvent);
339
+ } else {
340
+ onInsert(buildDatasourceAdf({
341
+ id: datasourceId,
342
+ parameters: _objectSpread(_objectSpread({}, parametersToSend), {}, {
343
+ cloudId: cloudId
344
+ }),
345
+ views: [{
346
+ type: 'table',
347
+ properties: {
348
+ columns: (visibleColumnKeys || []).map(function (key) {
349
+ var width = columnCustomSizes === null || columnCustomSizes === void 0 ? void 0 : columnCustomSizes[key];
350
+ var isWrapped = wrappedColumnKeys === null || wrappedColumnKeys === void 0 ? void 0 : wrappedColumnKeys.includes(key);
351
+ return _objectSpread(_objectSpread({
352
+ key: key
353
+ }, width ? {
354
+ width: width
355
+ } : {}), isWrapped ? {
356
+ isWrapped: isWrapped
357
+ } : {});
358
+ })
359
+ }
360
+ }]
361
+ }, confluenceSearchUrl), consumerEvent);
362
+ }
363
+ }, [isParametersSet, cloudId, analyticsPayload, totalCount, currentViewMode, onInsert, confluenceSearchUrl, datasourceId, parametersToSend, visibleColumnKeys, columnCustomSizes, wrappedColumnKeys, userInteractions]);
364
+ var handleViewModeChange = function handleViewModeChange(selectedMode) {
365
+ userInteractions.add(DatasourceAction.DISPLAY_VIEW_CHANGED);
366
+ setCurrentViewMode(selectedMode);
367
+ };
368
+ var onSearch = useCallback(function (newSearchString, filters) {
369
+ searchCount.current++;
370
+ userInteractions.add(DatasourceAction.QUERY_UPDATED);
371
+ if (filters) {
372
+ var editedOrCreatedBy = filters.editedOrCreatedBy,
373
+ lastModifiedList = filters.lastModified;
374
+ if (lastModifiedList) {
375
+ var updatedDateRangeOption = lastModifiedList.find(function (range) {
376
+ return range.value;
377
+ });
378
+ if ((updatedDateRangeOption === null || updatedDateRangeOption === void 0 ? void 0 : updatedDateRangeOption.optionType) === 'dateRange') {
379
+ setLastModified({
380
+ value: updatedDateRangeOption.value,
381
+ from: updatedDateRangeOption.from,
382
+ to: updatedDateRangeOption.to
383
+ });
384
+ }
385
+ }
386
+ if (editedOrCreatedBy) {
387
+ var accountIds = editedOrCreatedBy.map(function (user) {
388
+ return user.value;
389
+ });
390
+ setContributorAccountIds(accountIds);
391
+ }
392
+ }
393
+ setSearchString(newSearchString);
394
+ reset({
395
+ shouldForceRequest: true
396
+ });
397
+ }, [reset, userInteractions]);
398
+ var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading';
399
+ var getCancelButtonAnalyticsPayload = useCallback(function () {
400
+ return {
401
+ extensionKey: extensionKey,
402
+ destinationObjectTypes: destinationObjectTypes,
403
+ searchCount: searchCount.current,
404
+ actions: userInteractions.get()
405
+ };
406
+ }, [destinationObjectTypes, extensionKey, userInteractions]);
407
+ return jsx(IntlMessagesProvider, {
408
+ defaultMessages: i18nEN,
409
+ loaderFn: fetchMessagesForLocale
410
+ }, jsx(DatasourceModal, {
411
+ testId: "confluence-search-datasource-modal",
412
+ onClose: onCancel
413
+ }, jsx(ModalHeader, null, jsx(ModalTitle, null, jsx(SiteSelector, {
414
+ availableSites: availableSites,
415
+ onSiteSelection: onSiteSelection,
416
+ selectedSite: selectedConfluenceSite,
417
+ testId: "confluence-search-datasource-modal--site-selector",
418
+ label: siteSelectorLabel
419
+ })), !hasNoConfluenceSites && !disableDisplayDropdown && jsx(DisplayViewDropDown, {
420
+ onViewModeChange: handleViewModeChange,
421
+ viewMode: currentViewMode
422
+ })), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(Box, {
423
+ xcss: inputContainerStyles
424
+ }, jsx(ConfluenceSearchContainer, {
425
+ isSearching: status === 'loading',
426
+ onSearch: onSearch,
427
+ parameters: parameters
428
+ })), currentViewMode === 'inline' ? renderInlineLinkModalContent() : renderTableModalContent()) : jsx(NoInstancesView, {
429
+ title: confluenceSearchModalMessages.noAccessToConfluenceSitesTitle,
430
+ description: confluenceSearchModalMessages.noAccessToConfluenceSitesDescription,
431
+ testId: 'no-confluence-instances-content'
432
+ })), jsx(ModalFooter, null, shouldShowResultsCount && confluenceSearchUrl && jsx(TableSearchCount, {
433
+ searchCount: totalCount,
434
+ url: confluenceSearchUrl,
435
+ prefixTextType: "result",
436
+ testId: "confluence-search-datasource-modal-total-results-count"
437
+ }), jsx(CancelButton, {
438
+ onCancel: onCancel,
439
+ getAnalyticsPayload: getCancelButtonAnalyticsPayload,
440
+ testId: "confluence-search-modal--cancel-button"
441
+ }), !hasNoConfluenceSites && jsx(Button, {
442
+ appearance: "primary",
443
+ onClick: onInsertPressed,
444
+ isDisabled: isInsertDisabled,
445
+ testId: "confluence-search-datasource-modal--insert-button"
446
+ }, jsx(FormattedMessage, confluenceSearchModalMessages.insertResultsButtonText)))));
447
+ };
@@ -9,10 +9,10 @@ import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'rea
9
9
  import { jsx } from '@emotion/react';
10
10
  import { FormattedMessage } from 'react-intl-next';
11
11
  import { withAnalyticsContext } from '@atlaskit/analytics-next';
12
- import Button from '@atlaskit/button/standard-button';
12
+ import Button from '@atlaskit/button';
13
13
  import { IntlMessagesProvider } from '@atlaskit/intl-messages-provider';
14
14
  import { ModalBody, ModalFooter, ModalHeader, ModalTitle } from '@atlaskit/modal-dialog';
15
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
15
+ import { fg } from '@atlaskit/platform-feature-flags';
16
16
  import { Box, xcss } from '@atlaskit/primitives';
17
17
  import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
18
18
  import { componentMetadata } from '../../../analytics/constants';
@@ -32,17 +32,19 @@ import { InitialStateView } from '../../common/initial-state-view';
32
32
  import { CancelButton } from '../../common/modal/cancel-button';
33
33
  import { ContentContainer } from '../../common/modal/content-container';
34
34
  import { SmartCardPlaceholder, SmartLink } from '../../common/modal/count-view-smart-link';
35
+ import { useDatasourceContext } from '../../common/modal/datasource-context/DatasourceContext';
36
+ import { DatasourceContextProvider } from '../../common/modal/datasource-context/DatasourceContextProvider';
35
37
  import { DatasourceModal } from '../../common/modal/datasource-modal';
36
38
  import { DisplayViewDropDown } from '../../common/modal/display-view-dropdown/display-view-drop-down';
37
39
  import TableSearchCount from '../../common/modal/search-count';
38
40
  import { SiteSelector } from '../../common/modal/site-selector';
39
- import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
40
- import { useColumnResize } from '../../issue-like-table/use-column-resize';
41
- import { useColumnWrapping } from '../../issue-like-table/use-column-wrapping';
41
+ import DatasourcesTableUsingContext from '../../datasources-table-in-modal-preview';
42
+ import { EmptyState } from '../../issue-like-table';
42
43
  import { getColumnAction } from '../../issue-like-table/utils';
43
44
  import ConfluenceSearchContainer from '../confluence-search-container';
44
45
  import { ConfluenceSearchInitialStateSVG } from './confluence-search-initial-state-svg';
45
46
  import { confluenceSearchModalMessages } from './messages';
47
+ import { PlainConfluenceSearchConfigModal as PlainConfluenceSearchConfigModalOld } from './ModalOld';
46
48
  var inputContainerStyles = xcss({
47
49
  alignItems: 'baseline',
48
50
  display: 'flex',
@@ -50,8 +52,6 @@ var inputContainerStyles = xcss({
50
52
  });
51
53
  export var PlainConfluenceSearchConfigModal = function PlainConfluenceSearchConfigModal(props) {
52
54
  var datasourceId = props.datasourceId,
53
- initialColumnCustomSizes = props.columnCustomSizes,
54
- initialWrappedColumnKeys = props.wrappedColumnKeys,
55
55
  onCancel = props.onCancel,
56
56
  onInsert = props.onInsert,
57
57
  _props$viewMode = props.viewMode,
@@ -174,12 +174,6 @@ export var PlainConfluenceSearchConfigModal = function PlainConfluenceSearchConf
174
174
  setVisibleColumnKeys(newVisibleColumnKeys);
175
175
  }, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
176
176
  var siteSelectorLabel = availableSites && availableSites.length > 1 ? confluenceSearchModalMessages.insertIssuesTitleManySites : confluenceSearchModalMessages.insertIssuesTitle;
177
- var _useColumnResize = useColumnResize(initialColumnCustomSizes),
178
- columnCustomSizes = _useColumnResize.columnCustomSizes,
179
- onColumnResize = _useColumnResize.onColumnResize;
180
- var _useColumnWrapping = useColumnWrapping(initialWrappedColumnKeys),
181
- wrappedColumnKeys = _useColumnWrapping.wrappedColumnKeys,
182
- onWrappedColumnChange = _useColumnWrapping.onWrappedColumnChange;
183
177
 
184
178
  // TODO: common functionality of all modals refactor in EDM-9573
185
179
  var handleVisibleColumnKeysChange = useCallback(function () {
@@ -189,13 +183,10 @@ export var PlainConfluenceSearchConfigModal = function PlainConfluenceSearchConf
189
183
  visibleColumnCount.current = newVisibleColumnKeys.length;
190
184
  setVisibleColumnKeys(newVisibleColumnKeys);
191
185
  }, [visibleColumnKeys, userInteractions]);
192
-
193
- // TODO: further refactoring in EDM-9573
194
- // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6798258
195
186
  var confluenceSearchTable = useMemo(function () {
196
187
  return jsx(ContentContainer, {
197
188
  withTableBorder: true
198
- }, jsx(IssueLikeDataTableView, {
189
+ }, jsx(DatasourcesTableUsingContext, {
199
190
  testId: "confluence-search-datasource-table",
200
191
  status: status,
201
192
  columns: columns,
@@ -205,13 +196,9 @@ export var PlainConfluenceSearchConfigModal = function PlainConfluenceSearchConf
205
196
  onNextPage: onNextPage,
206
197
  onLoadDatasourceDetails: loadDatasourceDetails,
207
198
  onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
208
- extensionKey: extensionKey,
209
- columnCustomSizes: columnCustomSizes,
210
- onColumnResize: onColumnResize,
211
- wrappedColumnKeys: wrappedColumnKeys,
212
- onWrappedColumnChange: getBooleanFF('platform.linking-platform.datasource-word_wrap') ? onWrappedColumnChange : undefined
199
+ extensionKey: extensionKey
213
200
  }));
214
- }, [status, columns, responseItems, hasNextPage, visibleColumnKeys, defaultVisibleColumnKeys, onNextPage, loadDatasourceDetails, handleVisibleColumnKeysChange, extensionKey, columnCustomSizes, onColumnResize, wrappedColumnKeys, onWrappedColumnChange]);
201
+ }, [status, columns, responseItems, hasNextPage, visibleColumnKeys, defaultVisibleColumnKeys, onNextPage, loadDatasourceDetails, handleVisibleColumnKeysChange, extensionKey]);
215
202
  var resolvedWithNoResults = status === 'resolved' && !responseItems.length;
216
203
  var hasConfluenceSearchParams = selectedConfluenceSite && searchString;
217
204
  var selectedConfluenceSiteUrl = selectedConfluenceSite === null || selectedConfluenceSite === void 0 ? void 0 : selectedConfluenceSite.url;
@@ -313,6 +300,9 @@ export var PlainConfluenceSearchConfigModal = function PlainConfluenceSearchConf
313
300
  }
314
301
  }, [confluenceSearchUrl, selectedConfluenceSiteUrl, status, urlBeingEdited]);
315
302
  var shouldShowResultsCount = !!totalCount && currentViewMode === 'table';
303
+ var _useDatasourceContext = useDatasourceContext(),
304
+ columnCustomSizes = _useDatasourceContext.columnCustomSizes,
305
+ wrappedColumnKeys = _useDatasourceContext.wrappedColumnKeys;
316
306
  var onInsertPressed = useCallback(function (e, analyticsEvent) {
317
307
  var _insertButtonClickedE;
318
308
  if (!isParametersSet || !cloudId || !confluenceSearchUrl) {
@@ -458,5 +448,10 @@ var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
458
448
  attributes: _objectSpread({}, analyticsContextAttributes)
459
449
  });
460
450
  export var ConfluenceSearchConfigModal = withAnalyticsContext(contextData)(function (props) {
461
- return jsx(DatasourceExperienceIdProvider, null, jsx(UserInteractionsProvider, null, jsx(PlainConfluenceSearchConfigModal, props)));
451
+ return jsx(DatasourceExperienceIdProvider, null, jsx(UserInteractionsProvider, null, fg('platform.linking-platform.datasources.use-refactored-config-modal') ? jsx(DatasourceContextProvider, {
452
+ initialColumnCustomSizes: props.columnCustomSizes,
453
+ initialWrappedColumnKeys: props.wrappedColumnKeys
454
+ }, jsx(PlainConfluenceSearchConfigModal, props)) :
455
+ // TODO on cleanup 'use-refactored-config-modal' ff, delete `ModalOld.tsx` as well
456
+ jsx(PlainConfluenceSearchConfigModalOld, props)));
462
457
  });
@@ -0,0 +1,19 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React from 'react';
3
+ import { fg } from '@atlaskit/platform-feature-flags';
4
+ import { useDatasourceContext } from '../common/modal/datasource-context/DatasourceContext';
5
+ import { IssueLikeDataTableView } from '../issue-like-table';
6
+ var Table = function Table(props) {
7
+ var _useDatasourceContext = useDatasourceContext(),
8
+ columnCustomSizes = _useDatasourceContext.columnCustomSizes,
9
+ onColumnResize = _useDatasourceContext.onColumnResize,
10
+ wrappedColumnKeys = _useDatasourceContext.wrappedColumnKeys,
11
+ onWrappedColumnChange = _useDatasourceContext.onWrappedColumnChange;
12
+ return /*#__PURE__*/React.createElement(IssueLikeDataTableView, _extends({}, props, {
13
+ columnCustomSizes: columnCustomSizes,
14
+ onColumnResize: onColumnResize,
15
+ wrappedColumnKeys: wrappedColumnKeys,
16
+ onWrappedColumnChange: fg('platform.linking-platform.datasource-word_wrap') ? onWrappedColumnChange : undefined
17
+ }));
18
+ };
19
+ export default Table;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { type ColumnSizesMap } from '../../../issue-like-table/types';
3
+ type DatasourceContextStore = {
4
+ columnCustomSizes?: ColumnSizesMap;
5
+ onColumnResize: (key: string, width: number) => void;
6
+ wrappedColumnKeys?: string[];
7
+ onWrappedColumnChange: (key: string, isWrapped: boolean) => void;
8
+ };
9
+ export declare const DatasourceContext: React.Context<DatasourceContextStore | null>;
10
+ export declare const useDatasourceContext: () => DatasourceContextStore;
11
+ export {};
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { type ColumnSizesMap } from '../../../issue-like-table/types';
3
+ type Props = {
4
+ initialColumnCustomSizes?: ColumnSizesMap | undefined;
5
+ initialWrappedColumnKeys?: string[] | undefined;
6
+ };
7
+ export declare const DatasourceContextProvider: ({ children, initialColumnCustomSizes, initialWrappedColumnKeys, }: Props & {
8
+ children: React.ReactNode;
9
+ }) => JSX.Element;
10
+ export {};
@@ -0,0 +1,3 @@
1
+ import { jsx } from '@emotion/react';
2
+ import { type ConfluenceSearchConfigModalProps } from '../types';
3
+ export declare const PlainConfluenceSearchConfigModal: (props: ConfluenceSearchConfigModalProps) => jsx.JSX.Element;
@@ -0,0 +1,20 @@
1
+ /// <reference types="react" />
2
+ import type { DatasourceDataResponseItem, DatasourceResponseSchemaProperty, DatasourceTableStatusType } from '@atlaskit/linking-types';
3
+ import type { NextPageType } from '../../hooks/useDatasourceTableState';
4
+ import { type TableViewPropsRenderType } from '../issue-like-table/types';
5
+ export interface DatasourcesTableProps {
6
+ testId?: string;
7
+ extensionKey?: string | null;
8
+ columns: DatasourceResponseSchemaProperty[];
9
+ visibleColumnKeys: string[];
10
+ hasNextPage: boolean;
11
+ status: DatasourceTableStatusType;
12
+ items: DatasourceDataResponseItem[];
13
+ onNextPage: NextPageType;
14
+ onLoadDatasourceDetails: () => void;
15
+ renderItem?: TableViewPropsRenderType;
16
+ onVisibleColumnKeysChange?: (visibleColumnKeys: string[]) => void;
17
+ scrollableContainerHeight?: number;
18
+ }
19
+ declare const Table: (props: DatasourcesTableProps) => JSX.Element;
20
+ export default Table;