@atlaskit/link-datasource 1.24.6 → 1.24.8

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 (96) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/ui/assets-modal/modal/render-assets-content/initial-state-view/index.js +2 -1
  3. package/dist/cjs/ui/common/error-state/access-required.js +2 -1
  4. package/dist/cjs/ui/common/error-state/loading-error.js +2 -1
  5. package/dist/cjs/ui/common/error-state/messages.js +0 -11
  6. package/dist/cjs/ui/common/error-state/modal-loading-error.js +5 -13
  7. package/dist/cjs/ui/common/error-state/no-instances.js +2 -1
  8. package/dist/cjs/ui/common/error-state/no-results.js +2 -1
  9. package/dist/cjs/ui/common/initial-state-view/index.js +2 -1
  10. package/dist/cjs/ui/common/modal/content-container/index.js +35 -0
  11. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +48 -0
  12. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/messages.js +14 -0
  13. package/dist/cjs/ui/confluence-search-modal/modal/index.js +206 -42
  14. package/dist/cjs/ui/confluence-search-modal/modal/messages.js +4 -4
  15. package/dist/cjs/ui/confluence-search-modal/types.js +5 -0
  16. package/dist/cjs/ui/issue-like-table/column-picker/concatenated-menu-list.js +2 -1
  17. package/dist/cjs/ui/issue-like-table/drag-column-preview.js +2 -1
  18. package/dist/cjs/ui/issue-like-table/index.js +4 -1
  19. package/dist/cjs/ui/issue-like-table/styled.js +2 -1
  20. package/dist/cjs/ui/jira-issues-modal/modal/index.js +14 -21
  21. package/dist/cjs/ui/jira-issues-modal/modal/messages.js +5 -0
  22. package/dist/cjs/ui/jira-issues-modal/mode-switcher/index.js +1 -0
  23. package/dist/es2019/ui/assets-modal/modal/render-assets-content/initial-state-view/index.js +2 -1
  24. package/dist/es2019/ui/common/error-state/access-required.js +2 -1
  25. package/dist/es2019/ui/common/error-state/loading-error.js +2 -1
  26. package/dist/es2019/ui/common/error-state/messages.js +0 -11
  27. package/dist/es2019/ui/common/error-state/modal-loading-error.js +4 -10
  28. package/dist/es2019/ui/common/error-state/no-instances.js +2 -1
  29. package/dist/es2019/ui/common/error-state/no-results.js +2 -1
  30. package/dist/es2019/ui/common/initial-state-view/index.js +2 -1
  31. package/dist/es2019/ui/common/modal/content-container/index.js +30 -0
  32. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +35 -0
  33. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/messages.js +8 -0
  34. package/dist/es2019/ui/confluence-search-modal/modal/index.js +191 -41
  35. package/dist/es2019/ui/confluence-search-modal/modal/messages.js +4 -4
  36. package/dist/es2019/ui/confluence-search-modal/types.js +1 -0
  37. package/dist/es2019/ui/issue-like-table/column-picker/concatenated-menu-list.js +2 -1
  38. package/dist/es2019/ui/issue-like-table/drag-column-preview.js +2 -1
  39. package/dist/es2019/ui/issue-like-table/index.js +7 -1
  40. package/dist/es2019/ui/issue-like-table/styled.js +2 -1
  41. package/dist/es2019/ui/jira-issues-modal/modal/index.js +14 -23
  42. package/dist/es2019/ui/jira-issues-modal/modal/messages.js +5 -0
  43. package/dist/es2019/ui/jira-issues-modal/mode-switcher/index.js +1 -0
  44. package/dist/esm/ui/assets-modal/modal/render-assets-content/initial-state-view/index.js +2 -1
  45. package/dist/esm/ui/common/error-state/access-required.js +2 -1
  46. package/dist/esm/ui/common/error-state/loading-error.js +2 -1
  47. package/dist/esm/ui/common/error-state/messages.js +0 -11
  48. package/dist/esm/ui/common/error-state/modal-loading-error.js +5 -12
  49. package/dist/esm/ui/common/error-state/no-instances.js +2 -1
  50. package/dist/esm/ui/common/error-state/no-results.js +2 -1
  51. package/dist/esm/ui/common/initial-state-view/index.js +2 -1
  52. package/dist/esm/ui/common/modal/content-container/index.js +29 -0
  53. package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +38 -0
  54. package/dist/esm/ui/confluence-search-modal/confluence-search-container/messages.js +8 -0
  55. package/dist/esm/ui/confluence-search-modal/modal/index.js +210 -44
  56. package/dist/esm/ui/confluence-search-modal/modal/messages.js +4 -4
  57. package/dist/esm/ui/confluence-search-modal/types.js +1 -0
  58. package/dist/esm/ui/issue-like-table/column-picker/concatenated-menu-list.js +2 -1
  59. package/dist/esm/ui/issue-like-table/drag-column-preview.js +2 -1
  60. package/dist/esm/ui/issue-like-table/index.js +4 -1
  61. package/dist/esm/ui/issue-like-table/styled.js +2 -1
  62. package/dist/esm/ui/jira-issues-modal/modal/index.js +16 -23
  63. package/dist/esm/ui/jira-issues-modal/modal/messages.js +5 -0
  64. package/dist/esm/ui/jira-issues-modal/mode-switcher/index.js +1 -0
  65. package/dist/types/common/types.d.ts +3 -6
  66. package/dist/types/ui/common/error-state/messages.d.ts +0 -10
  67. package/dist/types/ui/common/error-state/modal-loading-error.d.ts +3 -2
  68. package/dist/types/ui/common/modal/content-container/index.d.ts +8 -0
  69. package/dist/types/ui/confluence-search-modal/confluence-search-container/index.d.ts +9 -0
  70. package/dist/types/ui/confluence-search-modal/confluence-search-container/messages.d.ts +7 -0
  71. package/dist/types/ui/confluence-search-modal/index.d.ts +2 -2
  72. package/dist/types/ui/confluence-search-modal/modal/index.d.ts +2 -2
  73. package/dist/types/ui/confluence-search-modal/modal/messages.d.ts +1 -1
  74. package/dist/types/ui/confluence-search-modal/types.d.ts +12 -0
  75. package/dist/types/ui/jira-issues-modal/index.d.ts +2 -2
  76. package/dist/types/ui/jira-issues-modal/modal/index.d.ts +3 -13
  77. package/dist/types/ui/jira-issues-modal/modal/messages.d.ts +5 -0
  78. package/dist/types/ui/jira-issues-modal/types.d.ts +5 -1
  79. package/dist/types-ts4.5/common/types.d.ts +3 -6
  80. package/dist/types-ts4.5/ui/common/error-state/messages.d.ts +0 -10
  81. package/dist/types-ts4.5/ui/common/error-state/modal-loading-error.d.ts +3 -2
  82. package/dist/types-ts4.5/ui/common/modal/content-container/index.d.ts +8 -0
  83. package/dist/types-ts4.5/ui/confluence-search-modal/confluence-search-container/index.d.ts +9 -0
  84. package/dist/types-ts4.5/ui/confluence-search-modal/confluence-search-container/messages.d.ts +7 -0
  85. package/dist/types-ts4.5/ui/confluence-search-modal/index.d.ts +2 -2
  86. package/dist/types-ts4.5/ui/confluence-search-modal/modal/index.d.ts +2 -2
  87. package/dist/types-ts4.5/ui/confluence-search-modal/modal/messages.d.ts +1 -1
  88. package/dist/types-ts4.5/ui/confluence-search-modal/types.d.ts +12 -0
  89. package/dist/types-ts4.5/ui/jira-issues-modal/index.d.ts +2 -2
  90. package/dist/types-ts4.5/ui/jira-issues-modal/modal/index.d.ts +3 -13
  91. package/dist/types-ts4.5/ui/jira-issues-modal/modal/messages.d.ts +5 -0
  92. package/dist/types-ts4.5/ui/jira-issues-modal/types.d.ts +5 -1
  93. package/examples-helpers/buildConfluenceSearchTable.tsx +77 -0
  94. package/examples-helpers/mockSmartLinkData.ts +44 -0
  95. package/examples-helpers/smartLinkCustomClient.ts +31 -20
  96. package/package.json +3 -3
@@ -1,44 +1,81 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
1
2
  /** @jsx jsx */
2
- import { Fragment, useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
4
  import { jsx } from '@emotion/react';
4
- import { FormattedMessage } from 'react-intl-next';
5
+ import { FormattedMessage, FormattedNumber } from 'react-intl-next';
6
+ import { v4 as uuidv4 } from 'uuid';
5
7
  import Button from '@atlaskit/button/standard-button';
6
8
  import { IntlMessagesProvider } from '@atlaskit/intl-messages-provider';
7
9
  import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle } from '@atlaskit/modal-dialog';
10
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
8
11
  import { Box, xcss } from '@atlaskit/primitives';
9
- import { N40 } from '@atlaskit/theme/colors';
12
+ import LinkUrl from '@atlaskit/smart-card/link-url';
13
+ import { N800 } from '@atlaskit/theme/colors';
10
14
  import { fetchMessagesForLocale } from '../../../common/utils/locale/fetch-messages-for-locale';
15
+ import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
11
16
  import i18nEN from '../../../i18n/en';
12
17
  import { getAvailableSites } from '../../../services/getAvailableSites';
18
+ import { AccessRequired } from '../../common/error-state/access-required';
19
+ import { ModalLoadingError } from '../../common/error-state/modal-loading-error';
13
20
  import { NoInstancesView } from '../../common/error-state/no-instances';
21
+ import { NoResults } from '../../common/error-state/no-results';
14
22
  import { InitialStateView } from '../../common/initial-state-view';
15
- import { BasicSearchInput } from '../../common/modal/basic-search-input';
23
+ import { ContentContainer } from '../../common/modal/content-container';
16
24
  import { SiteSelector } from '../../common/modal/site-selector';
17
- import { scrollableContainerShadowsCssComponents } from '../../issue-like-table';
25
+ import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
26
+ import ConfluenceSearchContainer from '../confluence-search-container';
18
27
  import { ConfluenceSearchInitialStateSVG } from './confluence-search-initial-state-svg';
19
28
  import { confluenceSearchModalMessages } from './messages';
20
- const contentContainerStyles = xcss({
21
- display: 'grid',
22
- maxHeight: '420px',
23
- overflow: 'auto',
24
- borderBottom: `2px solid ${`var(--ds-background-accent-gray-subtler, ${N40})`}`,
25
- backgroundImage: scrollableContainerShadowsCssComponents.backgroundImage,
26
- backgroundPosition: scrollableContainerShadowsCssComponents.backgroundPosition,
27
- backgroundRepeat: scrollableContainerShadowsCssComponents.backgroundRepeat,
28
- backgroundSize: scrollableContainerShadowsCssComponents.backgroundSize,
29
- backgroundAttachment: scrollableContainerShadowsCssComponents.backgroundAttachment
29
+ const inputContainerStyles = xcss({
30
+ alignItems: 'baseline',
31
+ display: 'flex',
32
+ minHeight: '72px'
33
+ });
34
+ const searchCountStyles = xcss({
35
+ flex: 1,
36
+ fontWeight: 600
30
37
  });
31
38
  export const ConfluenceSearchConfigModal = props => {
32
39
  const {
40
+ current: modalRenderInstanceId
41
+ } = useRef(uuidv4());
42
+ const {
43
+ datasourceId,
44
+ columnCustomSizes: initialColumnCustomSizes,
45
+ wrappedColumnKeys: initialWrappedColumnKeys,
46
+ onCancel,
33
47
  parameters: initialParameters,
34
- onCancel
48
+ url: urlBeingEdited,
49
+ visibleColumnKeys: initialVisibleColumnKeys
35
50
  } = props;
36
51
  const [availableSites, setAvailableSites] = useState(undefined);
37
52
  const [cloudId, setCloudId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId);
38
- const [searchTerm, setSearchTerm] = useState('');
39
- const onSiteSelection = useCallback(site => {
40
- setCloudId(site.cloudId);
41
- }, [setCloudId]);
53
+ const [searchString, setSearchString] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString);
54
+ const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
55
+
56
+ // TODO: further refactoring in EDM-9573
57
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6829210
58
+ const parameters = useMemo(() => cloudId ? {
59
+ cloudId,
60
+ searchString
61
+ } : undefined, [cloudId, searchString /** Add more parameters when more filters are added */]);
62
+ const isParametersSet = useMemo(() => !!cloudId && Object.values(parameters !== null && parameters !== void 0 ? parameters : {}).filter(v => v !== undefined).length > 1, [cloudId, parameters]);
63
+ const {
64
+ reset,
65
+ status,
66
+ onNextPage,
67
+ responseItems,
68
+ hasNextPage,
69
+ columns,
70
+ defaultVisibleColumnKeys,
71
+ loadDatasourceDetails,
72
+ extensionKey = null,
73
+ totalCount
74
+ } = useDatasourceTableState({
75
+ datasourceId,
76
+ parameters: isParametersSet ? parameters : undefined,
77
+ fieldKeys: visibleColumnKeys
78
+ });
42
79
  const hasNoConfluenceSites = availableSites && availableSites.length === 0;
43
80
  const selectedConfluenceSite = useMemo(() => {
44
81
  if (cloudId) {
@@ -51,10 +88,24 @@ export const ConfluenceSearchConfigModal = props => {
51
88
  return (availableSites === null || availableSites === void 0 ? void 0 : availableSites.find(confluenceSite => confluenceSite.url === currentlyLoggedInSiteUrl)) || (availableSites === null || availableSites === void 0 ? void 0 : availableSites[0]);
52
89
  }
53
90
  }, [availableSites, cloudId]);
54
- const handleSearchChange = useCallback(e => {
55
- const rawSearch = e.currentTarget.value;
56
- setSearchTerm(rawSearch);
57
- }, [setSearchTerm]);
91
+
92
+ // TODO: further refactoring in EDM-9573
93
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6828283
94
+ useEffect(() => {
95
+ if (selectedConfluenceSite && (!cloudId || cloudId !== selectedConfluenceSite.cloudId)) {
96
+ setCloudId(selectedConfluenceSite.cloudId);
97
+ }
98
+ }, [cloudId, selectedConfluenceSite]);
99
+
100
+ // TODO: further refactoring in EDM-9573
101
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6829171
102
+ const onSiteSelection = useCallback(site => {
103
+ setSearchString(undefined);
104
+ setCloudId(site.cloudId);
105
+ reset({
106
+ shouldForceRequest: true
107
+ });
108
+ }, [reset]);
58
109
  useEffect(() => {
59
110
  const fetchSiteDisplayNames = async () => {
60
111
  const confluenceSites = await getAvailableSites('confluence');
@@ -64,6 +115,96 @@ export const ConfluenceSearchConfigModal = props => {
64
115
  void fetchSiteDisplayNames();
65
116
  }, []);
66
117
  const siteSelectorLabel = availableSites && availableSites.length > 1 ? confluenceSearchModalMessages.insertIssuesTitleManySites : confluenceSearchModalMessages.insertIssuesTitle;
118
+ const [columnCustomSizes, setColumnCustomSizes] = useState(initialColumnCustomSizes);
119
+ const onColumnResize = useCallback((key, width) => {
120
+ setColumnCustomSizes({
121
+ ...columnCustomSizes,
122
+ [key]: width
123
+ });
124
+ }, [columnCustomSizes]);
125
+ const [wrappedColumnKeys, setWrappedColumnKeys] = useState(initialWrappedColumnKeys);
126
+ const onWrappedColumnChange = useCallback((key, isWrapped) => {
127
+ const set = new Set(wrappedColumnKeys);
128
+ if (isWrapped) {
129
+ set.add(key);
130
+ } else {
131
+ set.delete(key);
132
+ }
133
+ setWrappedColumnKeys(Array.from(set));
134
+ }, [wrappedColumnKeys]);
135
+
136
+ // TODO: further refactoring in EDM-9573
137
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6798258
138
+ const confluenceSearchTable = useMemo(() => jsx(ContentContainer, {
139
+ withTableBorder: true
140
+ }, jsx(IssueLikeDataTableView, {
141
+ testId: "confluence-search-datasource-table",
142
+ status: status,
143
+ columns: columns,
144
+ items: responseItems,
145
+ hasNextPage: hasNextPage,
146
+ visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
147
+ onNextPage: onNextPage,
148
+ onLoadDatasourceDetails: loadDatasourceDetails,
149
+ onVisibleColumnKeysChange: setVisibleColumnKeys,
150
+ parentContainerRenderInstanceId: modalRenderInstanceId,
151
+ extensionKey: extensionKey,
152
+ columnCustomSizes: columnCustomSizes,
153
+ onColumnResize: onColumnResize,
154
+ wrappedColumnKeys: wrappedColumnKeys,
155
+ onWrappedColumnChange: getBooleanFF('platform.linking-platform.datasource-word_wrap') ? onWrappedColumnChange : undefined
156
+ })), [status, columns, responseItems, hasNextPage, visibleColumnKeys, defaultVisibleColumnKeys, onNextPage, loadDatasourceDetails, setVisibleColumnKeys, modalRenderInstanceId, extensionKey, columnCustomSizes, onColumnResize, wrappedColumnKeys, onWrappedColumnChange]);
157
+ const resolvedWithNoResults = status === 'resolved' && !responseItems.length;
158
+ const hasConfluenceSearchParams = selectedConfluenceSite && searchString;
159
+ const selectedConfluenceSiteUrl = selectedConfluenceSite === null || selectedConfluenceSite === void 0 ? void 0 : selectedConfluenceSite.url;
160
+ const confluenceSearchUrl = selectedConfluenceSiteUrl && searchString !== undefined && `${selectedConfluenceSiteUrl}/wiki/search/?text=${encodeURI(searchString)}`;
161
+ const renderModalContent = useCallback(() => {
162
+ if (status === 'rejected') {
163
+ return jsx(ModalLoadingError, null);
164
+ } else if (status === 'unauthorized') {
165
+ return jsx(AccessRequired, {
166
+ url: selectedConfluenceSiteUrl || urlBeingEdited
167
+ });
168
+ } else if (resolvedWithNoResults || status === 'forbidden') {
169
+ return jsx(NoResults, null);
170
+ } else if (status === 'empty' || !columns.length) {
171
+ // persist the empty state when making the initial /data request which contains the columns
172
+ if (hasConfluenceSearchParams !== undefined) {
173
+ return jsx(EmptyState, {
174
+ testId: `confluence-search-datasource-modal--empty-state`
175
+ });
176
+ }
177
+ return jsx(ContentContainer, null, jsx(InitialStateView, {
178
+ icon: jsx(ConfluenceSearchInitialStateSVG, null),
179
+ title: confluenceSearchModalMessages.initialViewSearchTitle,
180
+ description: confluenceSearchModalMessages.initialViewSearchDescription
181
+ }));
182
+ }
183
+ return confluenceSearchTable;
184
+ }, [columns.length, selectedConfluenceSiteUrl, confluenceSearchTable, resolvedWithNoResults, status, urlBeingEdited, hasConfluenceSearchParams]);
185
+ const shouldShowResultsCount = !!totalCount && totalCount !== 1;
186
+ const onInsertPressed = useCallback(() => {
187
+ // eslint-disable-next-line no-console
188
+ // TODO: Implement onInsert in EDM-9412
189
+ /**
190
+ * onInsert(
191
+ {
192
+ type: 'inlineCard',
193
+ attrs: {
194
+ url,
195
+ },
196
+ } as InlineCardAdf,
197
+ consumerEvent,
198
+ );
199
+ */
200
+ }, []);
201
+ const onSearch = useCallback(newSearchString => {
202
+ setSearchString(newSearchString);
203
+ reset({
204
+ shouldForceRequest: true
205
+ });
206
+ }, [reset]);
207
+ const isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading';
67
208
  return jsx(IntlMessagesProvider, {
68
209
  defaultMessages: i18nEN,
69
210
  loaderFn: fetchMessagesForLocale
@@ -78,31 +219,40 @@ export const ConfluenceSearchConfigModal = props => {
78
219
  selectedSite: selectedConfluenceSite,
79
220
  testId: "confluence-search-datasource-modal--site-selector",
80
221
  label: siteSelectorLabel
81
- }))), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(BasicSearchInput, {
82
- testId: "confluence-search-datasource-modal",
222
+ }))), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(Box, {
223
+ xcss: inputContainerStyles
224
+ }, jsx(ConfluenceSearchContainer, {
225
+ cloudId: cloudId,
83
226
  isSearching: status === 'loading',
84
- onChange: handleSearchChange,
85
- onSearch: () => {},
86
- searchTerm: searchTerm,
87
- placeholder: confluenceSearchModalMessages.searchLabel,
88
- fullWidth: true
89
- }), jsx(Box, {
90
- xcss: contentContainerStyles
91
- }, jsx(InitialStateView, {
92
- icon: jsx(ConfluenceSearchInitialStateSVG, null),
93
- title: confluenceSearchModalMessages.initialViewSearchTitle,
94
- description: confluenceSearchModalMessages.initialViewSearchDescription
95
- }))) : jsx(NoInstancesView, {
227
+ onSearch: onSearch,
228
+ initialSearchValue: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString
229
+ })), renderModalContent()) : jsx(NoInstancesView, {
96
230
  title: confluenceSearchModalMessages.noAccessToConfluenceSitesTitle,
97
231
  description: confluenceSearchModalMessages.noAccessToConfluenceSitesDescription,
98
232
  testId: 'no-confluence-instances-content'
99
- })), jsx(ModalFooter, null, jsx(Button, {
233
+ })), jsx(ModalFooter, null, shouldShowResultsCount && confluenceSearchUrl && jsx(Box, {
234
+ testId: "confluence-search-datasource-modal-total-results-count",
235
+ xcss: searchCountStyles
236
+ }, jsx(LinkUrl, {
237
+ href: confluenceSearchUrl,
238
+ target: "_blank",
239
+ testId: "item-count-url",
240
+ style: {
241
+ color: `var(--ds-text-accent-gray, ${N800})`
242
+ }
243
+ }, jsx(FormattedNumber, {
244
+ value: totalCount
245
+ }), ' ', jsx(FormattedMessage, _extends({}, confluenceSearchModalMessages.searchCountText, {
246
+ values: {
247
+ totalCount
248
+ }
249
+ })))), jsx(Button, {
100
250
  appearance: "default",
101
251
  onClick: onCancel
102
252
  }, jsx(FormattedMessage, confluenceSearchModalMessages.cancelButtonText)), !hasNoConfluenceSites && jsx(Button, {
103
253
  appearance: "primary",
104
- onClick: () => {},
105
- isDisabled: true,
254
+ onClick: onInsertPressed,
255
+ isDisabled: isInsertDisabled,
106
256
  testId: "confluence-search-datasource-modal--insert-button"
107
257
  }, jsx(FormattedMessage, confluenceSearchModalMessages.insertResultsButtonText)))));
108
258
  };
@@ -10,10 +10,10 @@ export const confluenceSearchModalMessages = defineMessages({
10
10
  description: 'Button text to insert the displayed content',
11
11
  defaultMessage: 'Insert results'
12
12
  },
13
- searchLabel: {
14
- id: 'linkDataSource.confluence-search.configmodal.searchLabel',
15
- description: 'Placeholder text for the search input box',
16
- defaultMessage: 'Enter keywords to find pages, attachments, and more'
13
+ searchCountText: {
14
+ id: 'linkDataSource.confluence-search.configmodal.resultsCountText',
15
+ description: 'Text that appears after search count number.',
16
+ defaultMessage: '{totalCount, plural, one {result} other {results}}'
17
17
  },
18
18
  insertIssuesTitle: {
19
19
  id: 'linkDataSource.confluence-search.configmodal.insertConfluenceTitle',
@@ -0,0 +1 @@
1
+ export {};
@@ -3,11 +3,12 @@ import _extends from "@babel/runtime/helpers/extends";
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import { FormattedMessage } from 'react-intl-next';
5
5
  import { components } from '@atlaskit/select';
6
+ import { fontFallback } from '@atlaskit/theme/typography';
6
7
  import { columnPickerMessages } from './messages';
7
8
  export const SELECT_ITEMS_MAXIMUM_THRESHOLD = 200;
8
9
  const messageStyles = css({
9
10
  color: "var(--ds-text-subtle, #44546F)",
10
- font: "var(--ds-font-body-small, normal 400 11px/16px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
11
+ font: `var(--ds-font-body-small, ${fontFallback.body.small})`,
11
12
  fontWeight: "var(--ds-font-weight-regular, 400)"
12
13
  });
13
14
  export const ConcatenatedMenuList = ({
@@ -3,6 +3,7 @@ import React from 'react';
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import styled from '@emotion/styled';
5
5
  import { N40 } from '@atlaskit/theme/colors';
6
+ import { fontFallback } from '@atlaskit/theme/typography';
6
7
  import { TableHeading } from './styled';
7
8
  const maxWidth = '200px';
8
9
  const firstLastChildOverride = `
@@ -32,7 +33,7 @@ const tableStyles = css({
32
33
  background: "var(--ds-surface, #FFF)",
33
34
  borderCollapse: 'separate',
34
35
  borderSpacing: 0,
35
- font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
36
+ font: `var(--ds-font-body, ${fontFallback.body.medium})`,
36
37
  maxWidth
37
38
  });
38
39
  export const DragColumnPreview = ({
@@ -12,6 +12,7 @@ import { autoScroller } from '@atlaskit/pragmatic-drag-and-drop-react-beautiful-
12
12
  import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
13
13
  import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
14
14
  import { N40 } from '@atlaskit/theme/colors';
15
+ import { fontFallback } from '@atlaskit/theme/typography';
15
16
  import Tooltip from '@atlaskit/tooltip';
16
17
  import { startUfoExperience, succeedUfoExperience } from '../../analytics/ufoExperiences';
17
18
  import { stickyTableHeadersIndex } from '../../common/zindex';
@@ -76,6 +77,11 @@ const TableCell = styled.td({
76
77
  [`${withTablePluginBodyPrefix('&:last-child')}`]: {
77
78
  borderRight: 0,
78
79
  paddingRight: "var(--ds-space-100, 8px)"
80
+ },
81
+ // Inline smart links are pretty opinionated about word-wrapping.
82
+ // We want it to be controlled by user, so we make it overflow and truncate by default.
83
+ ["& [data-testid='inline-card-icon-and-title'], " + "& [data-testid='button-connect-account'] > span"]: {
84
+ whiteSpace: 'unset'
79
85
  }
80
86
  });
81
87
  const tableContainerStyles = css({
@@ -223,7 +229,7 @@ const noDefaultBorderStyles = css({
223
229
  borderBottom: 0
224
230
  });
225
231
  const headerStyles = css({
226
- font: "var(--ds-font-body-UNSAFE_small, normal 400 12px/16px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
232
+ font: `var(--ds-font-body-UNSAFE_small, ${fontFallback.body.UNSAFE_small})`,
227
233
  fontWeight: "var(--ds-font-weight-medium, 500)"
228
234
  });
229
235
  const headingHoverEffectStyles = css({
@@ -1,7 +1,8 @@
1
1
  import styled from '@emotion/styled';
2
2
  import { N40 } from '@atlaskit/theme/colors';
3
+ import { fontFallback } from '@atlaskit/theme/typography';
3
4
  export const ScrollableContainerHeight = 590;
4
- export const fieldTextFontSize = "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)";
5
+ export const fieldTextFontSize = `var(--ds-font-body, ${fontFallback.body.medium})`;
5
6
  export const Table = styled.table({
6
7
  width: '100%'
7
8
  });
@@ -10,7 +10,7 @@ import { IntlMessagesProvider } from '@atlaskit/intl-messages-provider';
10
10
  import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
11
11
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
12
12
  import LinkUrl from '@atlaskit/smart-card/link-url';
13
- import { B400, N0, N40, N800 } from '@atlaskit/theme/colors';
13
+ import { B400, N0, N800 } from '@atlaskit/theme/colors';
14
14
  import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
15
15
  import { componentMetadata } from '../../../analytics/constants';
16
16
  import { DatasourceAction, DatasourceDisplay } from '../../../analytics/types';
@@ -30,8 +30,9 @@ import { NoInstancesView } from '../../common/error-state/no-instances';
30
30
  import { NoResults } from '../../common/error-state/no-results';
31
31
  import { InitialStateView } from '../../common/initial-state-view';
32
32
  import { initialStateViewMessages } from '../../common/initial-state-view/messages';
33
+ import { ContentContainer } from '../../common/modal/content-container';
33
34
  import { SiteSelector } from '../../common/modal/site-selector';
34
- import { EmptyState, IssueLikeDataTableView, scrollableContainerShadowsCssComponents } from '../../issue-like-table';
35
+ import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
35
36
  import LinkRenderType from '../../issue-like-table/render-type/link';
36
37
  import { availableBasicFilterTypes } from '../basic-filters/ui';
37
38
  import { isQueryTooComplex } from '../basic-filters/utils/isQueryTooComplex';
@@ -39,22 +40,6 @@ import { JiraSearchContainer } from '../jira-search-container';
39
40
  import { JiraDisplayViewDropDown } from './jira-display-view-dropdown/jira-display-view-drop-down';
40
41
  import { JiraInitialStateSVG } from './jira-issues-initial-state-svg';
41
42
  import { modalMessages } from './messages';
42
- const tableContainerStyles = css({
43
- borderTopLeftRadius: "var(--ds-border-radius-200, 8px)",
44
- borderTopRightRadius: "var(--ds-border-radius-200, 8px)",
45
- border: `1px solid ${`var(--ds-border, ${N40})`}`
46
- });
47
- const contentContainerStyles = css({
48
- display: 'grid',
49
- maxHeight: '420px',
50
- overflow: 'auto',
51
- borderBottom: `2px solid ${`var(--ds-background-accent-gray-subtler, ${N40})`}`,
52
- backgroundImage: scrollableContainerShadowsCssComponents.backgroundImage,
53
- backgroundPosition: scrollableContainerShadowsCssComponents.backgroundPosition,
54
- backgroundRepeat: scrollableContainerShadowsCssComponents.backgroundRepeat,
55
- backgroundSize: scrollableContainerShadowsCssComponents.backgroundSize,
56
- backgroundAttachment: scrollableContainerShadowsCssComponents.backgroundAttachment
57
- });
58
43
  const placeholderSmartLinkStyles = css({
59
44
  backgroundColor: `var(--ds-surface-raised, ${N0})`,
60
45
  borderRadius: "var(--ds-border-radius-200, 3px)",
@@ -424,8 +409,8 @@ export const PlainJiraIssuesConfigModal = props => {
424
409
  visibleColumnCount.current = newVisibleColumnKeys.length;
425
410
  setVisibleColumnKeys(newVisibleColumnKeys);
426
411
  }, [visibleColumnKeys]);
427
- const issueLikeDataTableView = useMemo(() => jsx("div", {
428
- css: [tableContainerStyles, contentContainerStyles]
412
+ const issueLikeDataTableView = useMemo(() => jsx(ContentContainer, {
413
+ withTableBorder: true
429
414
  }, jsx(IssueLikeDataTableView, {
430
415
  testId: "jira-datasource-table",
431
416
  status: status,
@@ -474,7 +459,13 @@ export const PlainJiraIssuesConfigModal = props => {
474
459
  const selectedJiraSiteUrl = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
475
460
  if (status === 'rejected' && jqlUrl) {
476
461
  return jsx(ModalLoadingError, {
477
- url: jqlUrl
462
+ errorMessage: jqlUrl ? jsx(FormattedMessage, _extends({}, modalMessages.checkConnectionWithSource, {
463
+ values: {
464
+ a: urlText => jsx("a", {
465
+ href: jqlUrl
466
+ }, urlText)
467
+ }
468
+ })) : undefined
478
469
  });
479
470
  } else if (status === 'unauthorized') {
480
471
  return jsx(AccessRequired, {
@@ -484,8 +475,8 @@ export const PlainJiraIssuesConfigModal = props => {
484
475
  return jsx(NoResults, null);
485
476
  } else if (status === 'empty' || !columns.length) {
486
477
  // persist the empty state when making the initial /data request which contains the columns
487
- return jsx("div", {
488
- css: [contentContainerStyles, !!jql && tableContainerStyles]
478
+ return jsx(ContentContainer, {
479
+ withTableBorder: !!jql
489
480
  }, !!jql ? jsx(EmptyState, {
490
481
  testId: `jira-datasource-modal--empty-state`
491
482
  }) : jsx(InitialStateView, {
@@ -115,5 +115,10 @@ export const modalMessages = defineMessages({
115
115
  id: 'linkDataSource.jira-issues.no.jira.sites.access.description',
116
116
  description: 'Description that shows in the modal when user has no access to any Jira sites',
117
117
  defaultMessage: 'To request access, contact your admin.'
118
+ },
119
+ checkConnectionWithSource: {
120
+ id: 'linkDataSource.jira-issues.checkConnectionWithSource',
121
+ description: 'Instructions to let the user know how to resolve the error that occured, or click the link provided to open the query in Jira',
122
+ defaultMessage: 'Check your connection and refresh, or <a>open this query in Jira</a> to review.'
118
123
  }
119
124
  });
@@ -82,6 +82,7 @@ export const ModeSwitcher = props => {
82
82
  }) => {
83
83
  const isSelected = value === selectedOptionValue;
84
84
  return jsx(Tooltip, {
85
+ key: value,
85
86
  content: tooltipText
86
87
  }, tooltipProps => jsx("label", _extends({}, tooltipProps, {
87
88
  key: value,
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import { useIntl } from 'react-intl-next';
5
+ import { fontFallback } from '@atlaskit/theme/typography';
5
6
  import { CrystalBallSVG } from './assets/crystal-ball-svg';
6
7
  import { initialStateViewMessages } from './messages';
7
8
  var initialStateViewContainerStyles = css({
@@ -14,7 +15,7 @@ var svgAndTextsWrapperStyles = css({
14
15
  alignSelf: 'center'
15
16
  });
16
17
  var searchTitleStyles = css({
17
- font: "var(--ds-font-heading-small, normal 600 16px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
18
+ font: "var(--ds-font-heading-small, ".concat(fontFallback.heading.small, ")"),
18
19
  paddingTop: "var(--ds-space-200, 16px)",
19
20
  paddingBottom: "var(--ds-space-100, 8px)"
20
21
  });
@@ -5,12 +5,13 @@ import { useIntl } from 'react-intl-next';
5
5
  import EmptyState from '@atlaskit/empty-state';
6
6
  import { Box, xcss } from '@atlaskit/primitives';
7
7
  import { N400 } from '@atlaskit/theme/colors';
8
+ import { fontFallback } from '@atlaskit/theme/typography';
8
9
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
9
10
  import { AccessRequiredSVG } from './access-required-svg';
10
11
  import { loadingErrorMessages } from './messages';
11
12
  var urlStyles = css({
12
13
  color: "var(--ds-text-subtlest, ".concat(N400, ")"),
13
- font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)"
14
+ font: "var(--ds-font-body, ".concat(fontFallback.body.medium, ")")
14
15
  });
15
16
  var descriptionMessageStyles = css({
16
17
  display: 'flex',
@@ -3,6 +3,7 @@ import { useEffect } from 'react';
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import { FormattedMessage } from 'react-intl-next';
5
5
  import Button from '@atlaskit/button/standard-button';
6
+ import { fontFallback } from '@atlaskit/theme/typography';
6
7
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
7
8
  import { LoadingErrorSVG } from './loading-error-svg';
8
9
  import { loadingErrorMessages } from './messages';
@@ -18,7 +19,7 @@ var errorMessageContainerStyles = css({
18
19
  placeItems: 'center'
19
20
  });
20
21
  var errorMessageStyles = css({
21
- font: "var(--ds-font-heading-small, normal 600 16px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)"
22
+ font: "var(--ds-font-heading-small, ".concat(fontFallback.heading.small, ")")
22
23
  });
23
24
  var errorDescriptionStyles = css({
24
25
  margin: 0
@@ -44,17 +44,6 @@ export var loadingErrorMessages = defineMessages({
44
44
  description: 'Instructions to let the user know how to resolve the network error that occurred or to try again at a different time',
45
45
  defaultMessage: 'Check your connection and refresh, or try again later.'
46
46
  },
47
- checkConnectionWithSourceDuplicate: {
48
- id: 'linkDataSource.checkConnectionWithSource',
49
- description: 'Instructions to let the user know how to resolve the error that occured, or click the link provided to open the query in Jira',
50
- defaultMessage: 'Check your connection and refresh, or <a>open this query in Jira</a> to review.'
51
- },
52
- //delete and remove duplicate from title above
53
- checkConnectionWithSource: {
54
- id: 'linkDataSource.jira-issues.checkConnectionWithSource',
55
- description: 'Instructions to let the user know how to resolve the error that occured, or click the link provided to open the query in Jira',
56
- defaultMessage: 'Check your connection and refresh, or <a>open this query in Jira</a> to review.'
57
- },
58
47
  noResultsFoundDuplicate: {
59
48
  id: 'linkDataSource.noResultsFound',
60
49
  description: 'Status message letting the user know their query did not have any results',
@@ -1,8 +1,8 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  /** @jsx jsx */
3
2
  import { useEffect } from 'react';
4
3
  import { css, jsx } from '@emotion/react';
5
4
  import { FormattedMessage } from 'react-intl-next';
5
+ import { fontFallback } from '@atlaskit/theme/typography';
6
6
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
7
7
  import { LoadingErrorSVG } from './loading-error-svg';
8
8
  import { loadingErrorMessages } from './messages';
@@ -18,13 +18,14 @@ var errorMessageContainerStyles = css({
18
18
  placeItems: 'center'
19
19
  });
20
20
  var errorMessageStyles = css({
21
- font: "var(--ds-font-heading-small, normal 600 16px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)"
21
+ font: "var(--ds-font-heading-small, ".concat(fontFallback.heading.small, ")")
22
22
  });
23
23
  var errorDescriptionStyles = css({
24
24
  margin: 0
25
25
  });
26
26
  export var ModalLoadingError = function ModalLoadingError(_ref) {
27
- var url = _ref.url;
27
+ var _ref$errorMessage = _ref.errorMessage,
28
+ errorMessage = _ref$errorMessage === void 0 ? jsx(FormattedMessage, loadingErrorMessages.checkConnection) : _ref$errorMessage;
28
29
  var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
29
30
  fireEvent = _useDatasourceAnalyti.fireEvent;
30
31
  useEffect(function () {
@@ -41,13 +42,5 @@ export var ModalLoadingError = function ModalLoadingError(_ref) {
41
42
  css: errorMessageStyles
42
43
  }, jsx(FormattedMessage, loadingErrorMessages.unableToLoadResults)), jsx("p", {
43
44
  css: errorDescriptionStyles
44
- }, url ? jsx(FormattedMessage, _extends({}, loadingErrorMessages.checkConnectionWithSource, {
45
- values: {
46
- a: function a(chunk) {
47
- return jsx("a", {
48
- href: url
49
- }, chunk);
50
- }
51
- }
52
- })) : jsx(FormattedMessage, loadingErrorMessages.checkConnection))));
45
+ }, errorMessage)));
53
46
  };
@@ -2,9 +2,10 @@
2
2
  import { css, jsx } from '@emotion/react';
3
3
  import { useIntl } from 'react-intl-next';
4
4
  import { Flex, xcss } from '@atlaskit/primitives';
5
+ import { fontFallback } from '@atlaskit/theme/typography';
5
6
  import { NoInstancesSvg } from './no-instances-svg';
6
7
  var titleStyles = css({
7
- font: "var(--ds-font-heading-small, normal 600 16px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
8
+ font: "var(--ds-font-heading-small, ".concat(fontFallback.heading.small, ")"),
8
9
  marginTop: "var(--ds-space-200, 16px)"
9
10
  });
10
11
  var descriptionStyles = css({
@@ -3,6 +3,7 @@ import { useEffect } from 'react';
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import { FormattedMessage } from 'react-intl-next';
5
5
  import Button from '@atlaskit/button/standard-button';
6
+ import { fontFallback } from '@atlaskit/theme/typography';
6
7
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
7
8
  import { loadingErrorMessages } from './messages';
8
9
  var noResultsContainerStyles = css({
@@ -17,7 +18,7 @@ var noResultsMessageContainerStyles = css({
17
18
  placeItems: 'center'
18
19
  });
19
20
  var noResultsMessageStyles = css({
20
- font: "var(--ds-font-heading-small, normal 600 16px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)"
21
+ font: "var(--ds-font-heading-small, ".concat(fontFallback.heading.small, ")")
21
22
  });
22
23
  export var NoResults = function NoResults(_ref) {
23
24
  var onRefresh = _ref.onRefresh;
@@ -3,6 +3,7 @@ import { css, jsx } from '@emotion/react';
3
3
  import { FormattedMessage, useIntl } from 'react-intl-next';
4
4
  import Lozenge from '@atlaskit/lozenge';
5
5
  import { N300 } from '@atlaskit/theme/colors';
6
+ import { fontFallback } from '@atlaskit/theme/typography';
6
7
  import { initialStateViewMessages } from './messages';
7
8
  var initialStateViewContainerStyles = css({
8
9
  display: 'flex',
@@ -20,7 +21,7 @@ var betaTagStyles = css({
20
21
  });
21
22
  var searchTitleStyles = css({
22
23
  color: "var(--ds-text-subtlest, ".concat(N300, ")"),
23
- font: "var(--ds-font-heading-medium, normal 500 20px/24px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
24
+ font: "var(--ds-font-heading-medium, ".concat(fontFallback.heading.medium, ")"),
24
25
  paddingTop: "var(--ds-space-200, 16px)",
25
26
  paddingBottom: "var(--ds-space-100, 8px)",
26
27
  display: 'flex',