@atlaskit/link-datasource 1.24.7 → 1.24.9

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 (89) hide show
  1. package/CHANGELOG.md +14 -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/confluence-search-modal/confluence-search-container/index.js +48 -0
  11. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/messages.js +14 -0
  12. package/dist/cjs/ui/confluence-search-modal/modal/index.js +223 -30
  13. package/dist/cjs/ui/confluence-search-modal/modal/messages.js +4 -4
  14. package/dist/cjs/ui/confluence-search-modal/types.js +5 -0
  15. package/dist/cjs/ui/issue-like-table/column-picker/concatenated-menu-list.js +2 -1
  16. package/dist/cjs/ui/issue-like-table/drag-column-preview.js +2 -1
  17. package/dist/cjs/ui/issue-like-table/index.js +2 -1
  18. package/dist/cjs/ui/issue-like-table/styled.js +2 -1
  19. package/dist/cjs/ui/jira-issues-modal/modal/index.js +9 -1
  20. package/dist/cjs/ui/jira-issues-modal/modal/messages.js +5 -0
  21. package/dist/cjs/ui/jira-issues-modal/mode-switcher/index.js +1 -0
  22. package/dist/es2019/ui/assets-modal/modal/render-assets-content/initial-state-view/index.js +2 -1
  23. package/dist/es2019/ui/common/error-state/access-required.js +2 -1
  24. package/dist/es2019/ui/common/error-state/loading-error.js +2 -1
  25. package/dist/es2019/ui/common/error-state/messages.js +0 -11
  26. package/dist/es2019/ui/common/error-state/modal-loading-error.js +4 -10
  27. package/dist/es2019/ui/common/error-state/no-instances.js +2 -1
  28. package/dist/es2019/ui/common/error-state/no-results.js +2 -1
  29. package/dist/es2019/ui/common/initial-state-view/index.js +2 -1
  30. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +35 -0
  31. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/messages.js +8 -0
  32. package/dist/es2019/ui/confluence-search-modal/modal/index.js +210 -27
  33. package/dist/es2019/ui/confluence-search-modal/modal/messages.js +4 -4
  34. package/dist/es2019/ui/confluence-search-modal/types.js +1 -0
  35. package/dist/es2019/ui/issue-like-table/column-picker/concatenated-menu-list.js +2 -1
  36. package/dist/es2019/ui/issue-like-table/drag-column-preview.js +2 -1
  37. package/dist/es2019/ui/issue-like-table/index.js +2 -1
  38. package/dist/es2019/ui/issue-like-table/styled.js +2 -1
  39. package/dist/es2019/ui/jira-issues-modal/modal/index.js +7 -1
  40. package/dist/es2019/ui/jira-issues-modal/modal/messages.js +5 -0
  41. package/dist/es2019/ui/jira-issues-modal/mode-switcher/index.js +1 -0
  42. package/dist/esm/ui/assets-modal/modal/render-assets-content/initial-state-view/index.js +2 -1
  43. package/dist/esm/ui/common/error-state/access-required.js +2 -1
  44. package/dist/esm/ui/common/error-state/loading-error.js +2 -1
  45. package/dist/esm/ui/common/error-state/messages.js +0 -11
  46. package/dist/esm/ui/common/error-state/modal-loading-error.js +5 -12
  47. package/dist/esm/ui/common/error-state/no-instances.js +2 -1
  48. package/dist/esm/ui/common/error-state/no-results.js +2 -1
  49. package/dist/esm/ui/common/initial-state-view/index.js +2 -1
  50. package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +38 -0
  51. package/dist/esm/ui/confluence-search-modal/confluence-search-container/messages.js +8 -0
  52. package/dist/esm/ui/confluence-search-modal/modal/index.js +225 -30
  53. package/dist/esm/ui/confluence-search-modal/modal/messages.js +4 -4
  54. package/dist/esm/ui/confluence-search-modal/types.js +1 -0
  55. package/dist/esm/ui/issue-like-table/column-picker/concatenated-menu-list.js +2 -1
  56. package/dist/esm/ui/issue-like-table/drag-column-preview.js +2 -1
  57. package/dist/esm/ui/issue-like-table/index.js +2 -1
  58. package/dist/esm/ui/issue-like-table/styled.js +2 -1
  59. package/dist/esm/ui/jira-issues-modal/modal/index.js +9 -1
  60. package/dist/esm/ui/jira-issues-modal/modal/messages.js +5 -0
  61. package/dist/esm/ui/jira-issues-modal/mode-switcher/index.js +1 -0
  62. package/dist/types/common/types.d.ts +3 -6
  63. package/dist/types/ui/common/error-state/messages.d.ts +0 -10
  64. package/dist/types/ui/common/error-state/modal-loading-error.d.ts +3 -2
  65. package/dist/types/ui/confluence-search-modal/confluence-search-container/index.d.ts +9 -0
  66. package/dist/types/ui/confluence-search-modal/confluence-search-container/messages.d.ts +7 -0
  67. package/dist/types/ui/confluence-search-modal/index.d.ts +2 -2
  68. package/dist/types/ui/confluence-search-modal/modal/index.d.ts +2 -2
  69. package/dist/types/ui/confluence-search-modal/modal/messages.d.ts +1 -1
  70. package/dist/types/ui/confluence-search-modal/types.d.ts +22 -0
  71. package/dist/types/ui/jira-issues-modal/index.d.ts +2 -2
  72. package/dist/types/ui/jira-issues-modal/modal/index.d.ts +3 -13
  73. package/dist/types/ui/jira-issues-modal/modal/messages.d.ts +5 -0
  74. package/dist/types/ui/jira-issues-modal/types.d.ts +5 -1
  75. package/dist/types-ts4.5/common/types.d.ts +3 -6
  76. package/dist/types-ts4.5/ui/common/error-state/messages.d.ts +0 -10
  77. package/dist/types-ts4.5/ui/common/error-state/modal-loading-error.d.ts +3 -2
  78. package/dist/types-ts4.5/ui/confluence-search-modal/confluence-search-container/index.d.ts +9 -0
  79. package/dist/types-ts4.5/ui/confluence-search-modal/confluence-search-container/messages.d.ts +7 -0
  80. package/dist/types-ts4.5/ui/confluence-search-modal/index.d.ts +2 -2
  81. package/dist/types-ts4.5/ui/confluence-search-modal/modal/index.d.ts +2 -2
  82. package/dist/types-ts4.5/ui/confluence-search-modal/modal/messages.d.ts +1 -1
  83. package/dist/types-ts4.5/ui/confluence-search-modal/types.d.ts +22 -0
  84. package/dist/types-ts4.5/ui/jira-issues-modal/index.d.ts +2 -2
  85. package/dist/types-ts4.5/ui/jira-issues-modal/modal/index.d.ts +3 -13
  86. package/dist/types-ts4.5/ui/jira-issues-modal/modal/messages.d.ts +5 -0
  87. package/dist/types-ts4.5/ui/jira-issues-modal/types.d.ts +5 -1
  88. package/examples-helpers/buildConfluenceSearchTable.tsx +77 -0
  89. package/package.json +4 -4
@@ -23,6 +23,7 @@ var _pragmaticDragAndDropReactBeautifulDndAutoscroll = require("@atlaskit/pragma
23
23
  var _combine = require("@atlaskit/pragmatic-drag-and-drop/combine");
24
24
  var _adapter = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
25
25
  var _colors = require("@atlaskit/theme/colors");
26
+ var _typography = require("@atlaskit/theme/typography");
26
27
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
27
28
  var _ufoExperiences = require("../../analytics/ufoExperiences");
28
29
  var _zindex = require("../../common/zindex");
@@ -197,7 +198,7 @@ var noDefaultBorderStyles = (0, _react2.css)({
197
198
  borderBottom: 0
198
199
  });
199
200
  var headerStyles = (0, _react2.css)({
200
- 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)",
201
+ font: "var(--ds-font-body-UNSAFE_small, ".concat(_typography.fontFallback.body.UNSAFE_small, ")"),
201
202
  fontWeight: "var(--ds-font-weight-medium, 500)"
202
203
  });
203
204
  var headingHoverEffectStyles = (0, _react2.css)({
@@ -8,9 +8,10 @@ exports.withTablePluginPrefix = exports.withTablePluginHeaderPrefix = exports.wi
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _styled = _interopRequireDefault(require("@emotion/styled"));
10
10
  var _colors = require("@atlaskit/theme/colors");
11
+ var _typography = require("@atlaskit/theme/typography");
11
12
  var _styled$th;
12
13
  var ScrollableContainerHeight = exports.ScrollableContainerHeight = 590;
13
- var fieldTextFontSize = exports.fieldTextFontSize = "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)";
14
+ var fieldTextFontSize = exports.fieldTextFontSize = "var(--ds-font-body, ".concat(_typography.fontFallback.body.medium, ")");
14
15
  var Table = exports.Table = _styled.default.table({
15
16
  width: '100%'
16
17
  });
@@ -511,7 +511,15 @@ var PlainJiraIssuesConfigModal = exports.PlainJiraIssuesConfigModal = function P
511
511
  var selectedJiraSiteUrl = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
512
512
  if (status === 'rejected' && jqlUrl) {
513
513
  return (0, _react2.jsx)(_modalLoadingError.ModalLoadingError, {
514
- url: jqlUrl
514
+ errorMessage: jqlUrl ? (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _messages3.modalMessages.checkConnectionWithSource, {
515
+ values: {
516
+ a: function a(urlText) {
517
+ return (0, _react2.jsx)("a", {
518
+ href: jqlUrl
519
+ }, urlText);
520
+ }
521
+ }
522
+ })) : undefined
515
523
  });
516
524
  } else if (status === 'unauthorized') {
517
525
  return (0, _react2.jsx)(_accessRequired.AccessRequired, {
@@ -121,5 +121,10 @@ var modalMessages = exports.modalMessages = (0, _reactIntlNext.defineMessages)({
121
121
  id: 'linkDataSource.jira-issues.no.jira.sites.access.description',
122
122
  description: 'Description that shows in the modal when user has no access to any Jira sites',
123
123
  defaultMessage: 'To request access, contact your admin.'
124
+ },
125
+ checkConnectionWithSource: {
126
+ id: 'linkDataSource.jira-issues.checkConnectionWithSource',
127
+ 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',
128
+ defaultMessage: 'Check your connection and refresh, or <a>open this query in Jira</a> to review.'
124
129
  }
125
130
  });
@@ -88,6 +88,7 @@ var ModeSwitcher = exports.ModeSwitcher = function ModeSwitcher(props) {
88
88
  tooltipText = _ref.tooltipText;
89
89
  var isSelected = value === selectedOptionValue;
90
90
  return (0, _react2.jsx)(_tooltip.default, {
91
+ key: value,
91
92
  content: tooltipText
92
93
  }, function (tooltipProps) {
93
94
  return (0, _react2.jsx)("label", (0, _extends2.default)({}, tooltipProps, {
@@ -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
  const initialStateViewContainerStyles = css({
@@ -14,7 +15,7 @@ const svgAndTextsWrapperStyles = css({
14
15
  alignSelf: 'center'
15
16
  });
16
17
  const 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, ${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
  const urlStyles = css({
12
13
  color: `var(--ds-text-subtlest, ${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, ${fontFallback.body.medium})`
14
15
  });
15
16
  const 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 @@ const errorMessageContainerStyles = css({
18
19
  placeItems: 'center'
19
20
  });
20
21
  const 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, ${fontFallback.heading.small})`
22
23
  });
23
24
  const errorDescriptionStyles = css({
24
25
  margin: 0
@@ -44,17 +44,6 @@ export const 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,13 @@ const errorMessageContainerStyles = css({
18
18
  placeItems: 'center'
19
19
  });
20
20
  const 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, ${fontFallback.heading.small})`
22
22
  });
23
23
  const errorDescriptionStyles = css({
24
24
  margin: 0
25
25
  });
26
26
  export const ModalLoadingError = ({
27
- url
27
+ errorMessage = jsx(FormattedMessage, loadingErrorMessages.checkConnection)
28
28
  }) => {
29
29
  const {
30
30
  fireEvent
@@ -43,11 +43,5 @@ export const ModalLoadingError = ({
43
43
  css: errorMessageStyles
44
44
  }, jsx(FormattedMessage, loadingErrorMessages.unableToLoadResults)), jsx("p", {
45
45
  css: errorDescriptionStyles
46
- }, url ? jsx(FormattedMessage, _extends({}, loadingErrorMessages.checkConnectionWithSource, {
47
- values: {
48
- a: chunk => jsx("a", {
49
- href: url
50
- }, chunk)
51
- }
52
- })) : jsx(FormattedMessage, loadingErrorMessages.checkConnection))));
46
+ }, errorMessage)));
53
47
  };
@@ -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
  const 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, ${fontFallback.heading.small})`,
8
9
  marginTop: "var(--ds-space-200, 16px)"
9
10
  });
10
11
  const 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
  const noResultsContainerStyles = css({
@@ -17,7 +18,7 @@ const noResultsMessageContainerStyles = css({
17
18
  placeItems: 'center'
18
19
  });
19
20
  const 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, ${fontFallback.heading.small})`
21
22
  });
22
23
  export const NoResults = ({
23
24
  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
  const initialStateViewContainerStyles = css({
8
9
  display: 'flex',
@@ -20,7 +21,7 @@ const betaTagStyles = css({
20
21
  });
21
22
  const searchTitleStyles = css({
22
23
  color: `var(--ds-text-subtlest, ${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, ${fontFallback.heading.medium})`,
24
25
  paddingTop: "var(--ds-space-200, 16px)",
25
26
  paddingBottom: "var(--ds-space-100, 8px)",
26
27
  display: 'flex',
@@ -0,0 +1,35 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { BasicSearchInput } from '../../common/modal/basic-search-input';
3
+ import { searchMessages } from './messages';
4
+ const ConfluenceSearchContainer = ({
5
+ cloudId,
6
+ initialSearchValue,
7
+ isSearching,
8
+ onSearch
9
+ }) => {
10
+ const currentCloudId = useRef(cloudId);
11
+ const [searchBarSearchString, setSearchBarSearchString] = useState(initialSearchValue !== null && initialSearchValue !== void 0 ? initialSearchValue : '');
12
+ const handleSearchChange = useCallback(e => {
13
+ const rawSearch = e.currentTarget.value;
14
+ setSearchBarSearchString(rawSearch);
15
+ }, []);
16
+
17
+ // TODO: further refactoring in EDM-9573
18
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6827913
19
+ useEffect(() => {
20
+ if (currentCloudId.current !== cloudId) {
21
+ setSearchBarSearchString('');
22
+ currentCloudId.current = cloudId;
23
+ }
24
+ }, [cloudId]);
25
+ return /*#__PURE__*/React.createElement(BasicSearchInput, {
26
+ testId: "confluence-search-datasource-modal",
27
+ isSearching: isSearching,
28
+ onChange: handleSearchChange,
29
+ onSearch: onSearch,
30
+ searchTerm: searchBarSearchString,
31
+ placeholder: searchMessages.searchLabel,
32
+ fullWidth: true
33
+ });
34
+ };
35
+ export default ConfluenceSearchContainer;
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const searchMessages = defineMessages({
3
+ searchLabel: {
4
+ id: 'linkDataSource.confluence-search.configmodal.searchLabel',
5
+ description: 'Placeholder text for the search input box',
6
+ defaultMessage: 'Enter keywords to find pages, attachments, and more'
7
+ }
8
+ });
@@ -1,31 +1,84 @@
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';
11
+ import { Box, xcss } from '@atlaskit/primitives';
12
+ import LinkUrl from '@atlaskit/smart-card/link-url';
13
+ import { N800 } from '@atlaskit/theme/colors';
14
+ import { buildDatasourceAdf } from '../../../common/utils/adf';
8
15
  import { fetchMessagesForLocale } from '../../../common/utils/locale/fetch-messages-for-locale';
16
+ import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
9
17
  import i18nEN from '../../../i18n/en';
10
18
  import { getAvailableSites } from '../../../services/getAvailableSites';
19
+ import { AccessRequired } from '../../common/error-state/access-required';
20
+ import { ModalLoadingError } from '../../common/error-state/modal-loading-error';
11
21
  import { NoInstancesView } from '../../common/error-state/no-instances';
22
+ import { NoResults } from '../../common/error-state/no-results';
12
23
  import { InitialStateView } from '../../common/initial-state-view';
13
- import { BasicSearchInput } from '../../common/modal/basic-search-input';
14
24
  import { ContentContainer } from '../../common/modal/content-container';
15
25
  import { SiteSelector } from '../../common/modal/site-selector';
26
+ import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
27
+ import ConfluenceSearchContainer from '../confluence-search-container';
16
28
  import { ConfluenceSearchInitialStateSVG } from './confluence-search-initial-state-svg';
17
29
  import { confluenceSearchModalMessages } from './messages';
30
+ const inputContainerStyles = xcss({
31
+ alignItems: 'baseline',
32
+ display: 'flex',
33
+ minHeight: '72px'
34
+ });
35
+ const searchCountStyles = xcss({
36
+ flex: 1,
37
+ fontWeight: 600
38
+ });
18
39
  export const ConfluenceSearchConfigModal = props => {
19
40
  const {
41
+ current: modalRenderInstanceId
42
+ } = useRef(uuidv4());
43
+ const {
44
+ datasourceId,
45
+ columnCustomSizes: initialColumnCustomSizes,
46
+ wrappedColumnKeys: initialWrappedColumnKeys,
47
+ onCancel,
48
+ onInsert,
20
49
  parameters: initialParameters,
21
- onCancel
50
+ url: urlBeingEdited,
51
+ visibleColumnKeys: initialVisibleColumnKeys
22
52
  } = props;
23
53
  const [availableSites, setAvailableSites] = useState(undefined);
24
54
  const [cloudId, setCloudId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId);
25
- const [searchTerm, setSearchTerm] = useState('');
26
- const onSiteSelection = useCallback(site => {
27
- setCloudId(site.cloudId);
28
- }, [setCloudId]);
55
+ const [searchString, setSearchString] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString);
56
+ const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
57
+
58
+ // TODO: further refactoring in EDM-9573
59
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6829210
60
+ const parameters = useMemo(() => ({
61
+ ...initialParameters,
62
+ cloudId,
63
+ searchString
64
+ }), [cloudId, initialParameters, searchString /** Add more parameters when more filters are added */]);
65
+ const isParametersSet = useMemo(() => !!cloudId && Object.values(parameters !== null && parameters !== void 0 ? parameters : {}).filter(v => v !== undefined).length > 1, [cloudId, parameters]);
66
+ const {
67
+ reset,
68
+ status,
69
+ onNextPage,
70
+ responseItems,
71
+ hasNextPage,
72
+ columns,
73
+ defaultVisibleColumnKeys,
74
+ loadDatasourceDetails,
75
+ extensionKey = null,
76
+ totalCount
77
+ } = useDatasourceTableState({
78
+ datasourceId,
79
+ parameters: isParametersSet ? parameters : undefined,
80
+ fieldKeys: visibleColumnKeys
81
+ });
29
82
  const hasNoConfluenceSites = availableSites && availableSites.length === 0;
30
83
  const selectedConfluenceSite = useMemo(() => {
31
84
  if (cloudId) {
@@ -38,10 +91,24 @@ export const ConfluenceSearchConfigModal = props => {
38
91
  return (availableSites === null || availableSites === void 0 ? void 0 : availableSites.find(confluenceSite => confluenceSite.url === currentlyLoggedInSiteUrl)) || (availableSites === null || availableSites === void 0 ? void 0 : availableSites[0]);
39
92
  }
40
93
  }, [availableSites, cloudId]);
41
- const handleSearchChange = useCallback(e => {
42
- const rawSearch = e.currentTarget.value;
43
- setSearchTerm(rawSearch);
44
- }, [setSearchTerm]);
94
+
95
+ // TODO: further refactoring in EDM-9573
96
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6828283
97
+ useEffect(() => {
98
+ if (selectedConfluenceSite && (!cloudId || cloudId !== selectedConfluenceSite.cloudId)) {
99
+ setCloudId(selectedConfluenceSite.cloudId);
100
+ }
101
+ }, [cloudId, selectedConfluenceSite]);
102
+
103
+ // TODO: further refactoring in EDM-9573
104
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6829171
105
+ const onSiteSelection = useCallback(site => {
106
+ setSearchString(undefined);
107
+ setCloudId(site.cloudId);
108
+ reset({
109
+ shouldForceRequest: true
110
+ });
111
+ }, [reset]);
45
112
  useEffect(() => {
46
113
  const fetchSiteDisplayNames = async () => {
47
114
  const confluenceSites = await getAvailableSites('confluence');
@@ -51,6 +118,111 @@ export const ConfluenceSearchConfigModal = props => {
51
118
  void fetchSiteDisplayNames();
52
119
  }, []);
53
120
  const siteSelectorLabel = availableSites && availableSites.length > 1 ? confluenceSearchModalMessages.insertIssuesTitleManySites : confluenceSearchModalMessages.insertIssuesTitle;
121
+ const [columnCustomSizes, setColumnCustomSizes] = useState(initialColumnCustomSizes);
122
+ const onColumnResize = useCallback((key, width) => {
123
+ setColumnCustomSizes({
124
+ ...columnCustomSizes,
125
+ [key]: width
126
+ });
127
+ }, [columnCustomSizes]);
128
+ const [wrappedColumnKeys, setWrappedColumnKeys] = useState(initialWrappedColumnKeys);
129
+ const onWrappedColumnChange = useCallback((key, isWrapped) => {
130
+ const set = new Set(wrappedColumnKeys);
131
+ if (isWrapped) {
132
+ set.add(key);
133
+ } else {
134
+ set.delete(key);
135
+ }
136
+ setWrappedColumnKeys(Array.from(set));
137
+ }, [wrappedColumnKeys]);
138
+
139
+ // TODO: further refactoring in EDM-9573
140
+ // https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6798258
141
+ const confluenceSearchTable = useMemo(() => jsx(ContentContainer, {
142
+ withTableBorder: true
143
+ }, jsx(IssueLikeDataTableView, {
144
+ testId: "confluence-search-datasource-table",
145
+ status: status,
146
+ columns: columns,
147
+ items: responseItems,
148
+ hasNextPage: hasNextPage,
149
+ visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
150
+ onNextPage: onNextPage,
151
+ onLoadDatasourceDetails: loadDatasourceDetails,
152
+ onVisibleColumnKeysChange: setVisibleColumnKeys,
153
+ parentContainerRenderInstanceId: modalRenderInstanceId,
154
+ extensionKey: extensionKey,
155
+ columnCustomSizes: columnCustomSizes,
156
+ onColumnResize: onColumnResize,
157
+ wrappedColumnKeys: wrappedColumnKeys,
158
+ onWrappedColumnChange: getBooleanFF('platform.linking-platform.datasource-word_wrap') ? onWrappedColumnChange : undefined
159
+ })), [status, columns, responseItems, hasNextPage, visibleColumnKeys, defaultVisibleColumnKeys, onNextPage, loadDatasourceDetails, setVisibleColumnKeys, modalRenderInstanceId, extensionKey, columnCustomSizes, onColumnResize, wrappedColumnKeys, onWrappedColumnChange]);
160
+ const resolvedWithNoResults = status === 'resolved' && !responseItems.length;
161
+ const hasConfluenceSearchParams = selectedConfluenceSite && searchString;
162
+ const selectedConfluenceSiteUrl = selectedConfluenceSite === null || selectedConfluenceSite === void 0 ? void 0 : selectedConfluenceSite.url;
163
+ const confluenceSearchUrl = selectedConfluenceSiteUrl && searchString !== undefined && `${selectedConfluenceSiteUrl}/wiki/search/?text=${encodeURI(searchString)}`;
164
+ const renderModalContent = useCallback(() => {
165
+ if (status === 'rejected') {
166
+ return jsx(ModalLoadingError, null);
167
+ } else if (status === 'unauthorized') {
168
+ return jsx(AccessRequired, {
169
+ url: selectedConfluenceSiteUrl || urlBeingEdited
170
+ });
171
+ } else if (resolvedWithNoResults || status === 'forbidden') {
172
+ return jsx(NoResults, null);
173
+ } else if (status === 'empty' || !columns.length) {
174
+ // persist the empty state when making the initial /data request which contains the columns
175
+ if (hasConfluenceSearchParams !== undefined) {
176
+ return jsx(EmptyState, {
177
+ testId: `confluence-search-datasource-modal--empty-state`
178
+ });
179
+ }
180
+ return jsx(ContentContainer, null, jsx(InitialStateView, {
181
+ icon: jsx(ConfluenceSearchInitialStateSVG, null),
182
+ title: confluenceSearchModalMessages.initialViewSearchTitle,
183
+ description: confluenceSearchModalMessages.initialViewSearchDescription
184
+ }));
185
+ }
186
+ return confluenceSearchTable;
187
+ }, [columns.length, selectedConfluenceSiteUrl, confluenceSearchTable, resolvedWithNoResults, status, urlBeingEdited, hasConfluenceSearchParams]);
188
+ const shouldShowResultsCount = !!totalCount && totalCount !== 1;
189
+ const onInsertPressed = useCallback(() => {
190
+ if (!isParametersSet || !cloudId) {
191
+ return;
192
+ }
193
+ onInsert(buildDatasourceAdf({
194
+ id: datasourceId,
195
+ parameters: {
196
+ ...parameters,
197
+ cloudId
198
+ },
199
+ views: [{
200
+ type: 'table',
201
+ properties: {
202
+ columns: (visibleColumnKeys || []).map(key => {
203
+ const width = columnCustomSizes === null || columnCustomSizes === void 0 ? void 0 : columnCustomSizes[key];
204
+ const isWrapped = wrappedColumnKeys === null || wrappedColumnKeys === void 0 ? void 0 : wrappedColumnKeys.includes(key);
205
+ return {
206
+ key,
207
+ ...(width ? {
208
+ width
209
+ } : {}),
210
+ ...(isWrapped ? {
211
+ isWrapped
212
+ } : {})
213
+ };
214
+ })
215
+ }
216
+ }]
217
+ }));
218
+ }, [cloudId, isParametersSet, onInsert, datasourceId, parameters, visibleColumnKeys, columnCustomSizes, wrappedColumnKeys]);
219
+ const onSearch = useCallback(newSearchString => {
220
+ setSearchString(newSearchString);
221
+ reset({
222
+ shouldForceRequest: true
223
+ });
224
+ }, [reset]);
225
+ const isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading';
54
226
  return jsx(IntlMessagesProvider, {
55
227
  defaultMessages: i18nEN,
56
228
  loaderFn: fetchMessagesForLocale
@@ -65,29 +237,40 @@ export const ConfluenceSearchConfigModal = props => {
65
237
  selectedSite: selectedConfluenceSite,
66
238
  testId: "confluence-search-datasource-modal--site-selector",
67
239
  label: siteSelectorLabel
68
- }))), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(BasicSearchInput, {
69
- testId: "confluence-search-datasource-modal",
240
+ }))), jsx(ModalBody, null, !hasNoConfluenceSites ? jsx(Fragment, null, jsx(Box, {
241
+ xcss: inputContainerStyles
242
+ }, jsx(ConfluenceSearchContainer, {
243
+ cloudId: cloudId,
70
244
  isSearching: status === 'loading',
71
- onChange: handleSearchChange,
72
- onSearch: () => {},
73
- searchTerm: searchTerm,
74
- placeholder: confluenceSearchModalMessages.searchLabel,
75
- fullWidth: true
76
- }), jsx(ContentContainer, null, jsx(InitialStateView, {
77
- icon: jsx(ConfluenceSearchInitialStateSVG, null),
78
- title: confluenceSearchModalMessages.initialViewSearchTitle,
79
- description: confluenceSearchModalMessages.initialViewSearchDescription
80
- }))) : jsx(NoInstancesView, {
245
+ onSearch: onSearch,
246
+ initialSearchValue: initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString
247
+ })), renderModalContent()) : jsx(NoInstancesView, {
81
248
  title: confluenceSearchModalMessages.noAccessToConfluenceSitesTitle,
82
249
  description: confluenceSearchModalMessages.noAccessToConfluenceSitesDescription,
83
250
  testId: 'no-confluence-instances-content'
84
- })), jsx(ModalFooter, null, jsx(Button, {
251
+ })), jsx(ModalFooter, null, shouldShowResultsCount && confluenceSearchUrl && jsx(Box, {
252
+ testId: "confluence-search-datasource-modal-total-results-count",
253
+ xcss: searchCountStyles
254
+ }, jsx(LinkUrl, {
255
+ href: confluenceSearchUrl,
256
+ target: "_blank",
257
+ testId: "item-count-url",
258
+ style: {
259
+ color: `var(--ds-text-accent-gray, ${N800})`
260
+ }
261
+ }, jsx(FormattedNumber, {
262
+ value: totalCount
263
+ }), ' ', jsx(FormattedMessage, _extends({}, confluenceSearchModalMessages.searchCountText, {
264
+ values: {
265
+ totalCount
266
+ }
267
+ })))), jsx(Button, {
85
268
  appearance: "default",
86
269
  onClick: onCancel
87
270
  }, jsx(FormattedMessage, confluenceSearchModalMessages.cancelButtonText)), !hasNoConfluenceSites && jsx(Button, {
88
271
  appearance: "primary",
89
- onClick: () => {},
90
- isDisabled: true,
272
+ onClick: onInsertPressed,
273
+ isDisabled: isInsertDisabled,
91
274
  testId: "confluence-search-datasource-modal--insert-button"
92
275
  }, jsx(FormattedMessage, confluenceSearchModalMessages.insertResultsButtonText)))));
93
276
  };
@@ -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';
@@ -228,7 +229,7 @@ const noDefaultBorderStyles = css({
228
229
  borderBottom: 0
229
230
  });
230
231
  const headerStyles = css({
231
- 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})`,
232
233
  fontWeight: "var(--ds-font-weight-medium, 500)"
233
234
  });
234
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
  });