@atlaskit/link-datasource 1.8.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/analytics/constants.js +1 -1
  3. package/dist/cjs/common/zindex.js +8 -0
  4. package/dist/cjs/hooks/useValidateAqlText.js +21 -16
  5. package/dist/cjs/i18n/da.js +1 -1
  6. package/dist/cjs/i18n/en.js +5 -3
  7. package/dist/cjs/i18n/en_GB.js +5 -3
  8. package/dist/cjs/i18n/en_ZZ.js +5 -3
  9. package/dist/cjs/i18n/es.js +1 -1
  10. package/dist/cjs/i18n/fi.js +1 -1
  11. package/dist/cjs/i18n/fr.js +1 -1
  12. package/dist/cjs/i18n/hu.js +1 -1
  13. package/dist/cjs/i18n/it.js +1 -1
  14. package/dist/cjs/i18n/ja.js +1 -1
  15. package/dist/cjs/i18n/ko.js +1 -1
  16. package/dist/cjs/i18n/nb.js +5 -3
  17. package/dist/cjs/i18n/nl.js +1 -1
  18. package/dist/cjs/i18n/pl.js +1 -1
  19. package/dist/cjs/i18n/pt_BR.js +1 -1
  20. package/dist/cjs/i18n/ru.js +1 -1
  21. package/dist/cjs/i18n/sv.js +1 -1
  22. package/dist/cjs/i18n/tr.js +1 -1
  23. package/dist/cjs/i18n/uk.js +3 -3
  24. package/dist/cjs/i18n/vi.js +2 -2
  25. package/dist/cjs/i18n/zh.js +1 -1
  26. package/dist/cjs/i18n/zh_TW.js +1 -1
  27. package/dist/cjs/ui/assets-modal/modal/index.js +1 -1
  28. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/index.js +12 -6
  29. package/dist/cjs/ui/common/error-state/access-required.js +42 -8
  30. package/dist/cjs/ui/common/error-state/messages.js +4 -4
  31. package/dist/cjs/ui/datasource-table-view/datasourceTableView.js +3 -1
  32. package/dist/cjs/ui/issue-like-table/index.js +2 -1
  33. package/dist/cjs/ui/jira-issues-modal/modal/index.js +24 -25
  34. package/dist/cjs/ui/jira-issues-modal/modal/messages.js +2 -2
  35. package/dist/cjs/ui/jira-issues-modal/site-selector/index.js +59 -37
  36. package/dist/cjs/ui/jira-issues-modal/site-selector/messages.js +4 -9
  37. package/dist/es2019/analytics/constants.js +1 -1
  38. package/dist/es2019/common/zindex.js +2 -0
  39. package/dist/es2019/hooks/useValidateAqlText.js +8 -2
  40. package/dist/es2019/i18n/da.js +1 -1
  41. package/dist/es2019/i18n/en.js +5 -3
  42. package/dist/es2019/i18n/en_GB.js +5 -3
  43. package/dist/es2019/i18n/en_ZZ.js +5 -3
  44. package/dist/es2019/i18n/es.js +1 -1
  45. package/dist/es2019/i18n/fi.js +1 -1
  46. package/dist/es2019/i18n/fr.js +1 -1
  47. package/dist/es2019/i18n/hu.js +1 -1
  48. package/dist/es2019/i18n/it.js +1 -1
  49. package/dist/es2019/i18n/ja.js +1 -1
  50. package/dist/es2019/i18n/ko.js +1 -1
  51. package/dist/es2019/i18n/nb.js +5 -3
  52. package/dist/es2019/i18n/nl.js +1 -1
  53. package/dist/es2019/i18n/pl.js +1 -1
  54. package/dist/es2019/i18n/pt_BR.js +1 -1
  55. package/dist/es2019/i18n/ru.js +1 -1
  56. package/dist/es2019/i18n/sv.js +1 -1
  57. package/dist/es2019/i18n/tr.js +1 -1
  58. package/dist/es2019/i18n/uk.js +3 -3
  59. package/dist/es2019/i18n/vi.js +2 -2
  60. package/dist/es2019/i18n/zh.js +1 -1
  61. package/dist/es2019/i18n/zh_TW.js +1 -1
  62. package/dist/es2019/ui/assets-modal/modal/index.js +1 -1
  63. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/index.js +8 -6
  64. package/dist/es2019/ui/common/error-state/access-required.js +41 -6
  65. package/dist/es2019/ui/common/error-state/messages.js +4 -4
  66. package/dist/es2019/ui/datasource-table-view/datasourceTableView.js +3 -1
  67. package/dist/es2019/ui/issue-like-table/index.js +2 -1
  68. package/dist/es2019/ui/jira-issues-modal/modal/index.js +25 -26
  69. package/dist/es2019/ui/jira-issues-modal/modal/messages.js +2 -2
  70. package/dist/es2019/ui/jira-issues-modal/site-selector/index.js +50 -32
  71. package/dist/es2019/ui/jira-issues-modal/site-selector/messages.js +4 -9
  72. package/dist/esm/analytics/constants.js +1 -1
  73. package/dist/esm/common/zindex.js +2 -0
  74. package/dist/esm/hooks/useValidateAqlText.js +21 -16
  75. package/dist/esm/i18n/da.js +1 -1
  76. package/dist/esm/i18n/en.js +5 -3
  77. package/dist/esm/i18n/en_GB.js +5 -3
  78. package/dist/esm/i18n/en_ZZ.js +5 -3
  79. package/dist/esm/i18n/es.js +1 -1
  80. package/dist/esm/i18n/fi.js +1 -1
  81. package/dist/esm/i18n/fr.js +1 -1
  82. package/dist/esm/i18n/hu.js +1 -1
  83. package/dist/esm/i18n/it.js +1 -1
  84. package/dist/esm/i18n/ja.js +1 -1
  85. package/dist/esm/i18n/ko.js +1 -1
  86. package/dist/esm/i18n/nb.js +5 -3
  87. package/dist/esm/i18n/nl.js +1 -1
  88. package/dist/esm/i18n/pl.js +1 -1
  89. package/dist/esm/i18n/pt_BR.js +1 -1
  90. package/dist/esm/i18n/ru.js +1 -1
  91. package/dist/esm/i18n/sv.js +1 -1
  92. package/dist/esm/i18n/tr.js +1 -1
  93. package/dist/esm/i18n/uk.js +3 -3
  94. package/dist/esm/i18n/vi.js +2 -2
  95. package/dist/esm/i18n/zh.js +1 -1
  96. package/dist/esm/i18n/zh_TW.js +1 -1
  97. package/dist/esm/ui/assets-modal/modal/index.js +1 -1
  98. package/dist/esm/ui/assets-modal/search-container/aql-search-input/index.js +14 -8
  99. package/dist/esm/ui/common/error-state/access-required.js +43 -9
  100. package/dist/esm/ui/common/error-state/messages.js +4 -4
  101. package/dist/esm/ui/datasource-table-view/datasourceTableView.js +3 -1
  102. package/dist/esm/ui/issue-like-table/index.js +2 -1
  103. package/dist/esm/ui/jira-issues-modal/modal/index.js +25 -26
  104. package/dist/esm/ui/jira-issues-modal/modal/messages.js +2 -2
  105. package/dist/esm/ui/jira-issues-modal/site-selector/index.js +59 -34
  106. package/dist/esm/ui/jira-issues-modal/site-selector/messages.js +4 -9
  107. package/dist/types/common/zindex.d.ts +2 -0
  108. package/dist/types/hooks/useValidateAqlText.d.ts +6 -2
  109. package/dist/types/i18n/en.d.ts +2 -0
  110. package/dist/types/i18n/en_GB.d.ts +2 -0
  111. package/dist/types/i18n/en_ZZ.d.ts +2 -0
  112. package/dist/types/i18n/nb.d.ts +2 -0
  113. package/dist/types/types/assets/types.d.ts +4 -1
  114. package/dist/types/ui/common/error-state/access-required.d.ts +2 -2
  115. package/dist/types/ui/jira-issues-modal/site-selector/index.d.ts +0 -1
  116. package/dist/types/ui/jira-issues-modal/site-selector/messages.d.ts +1 -6
  117. package/dist/types/ui/jira-issues-modal/types.d.ts +2 -0
  118. package/dist/types-ts4.5/common/zindex.d.ts +2 -0
  119. package/dist/types-ts4.5/hooks/useValidateAqlText.d.ts +6 -2
  120. package/dist/types-ts4.5/i18n/en.d.ts +2 -0
  121. package/dist/types-ts4.5/i18n/en_GB.d.ts +2 -0
  122. package/dist/types-ts4.5/i18n/en_ZZ.d.ts +2 -0
  123. package/dist/types-ts4.5/i18n/nb.d.ts +2 -0
  124. package/dist/types-ts4.5/types/assets/types.d.ts +4 -1
  125. package/dist/types-ts4.5/ui/common/error-state/access-required.d.ts +2 -2
  126. package/dist/types-ts4.5/ui/jira-issues-modal/site-selector/index.d.ts +0 -1
  127. package/dist/types-ts4.5/ui/jira-issues-modal/site-selector/messages.d.ts +1 -6
  128. package/dist/types-ts4.5/ui/jira-issues-modal/types.d.ts +2 -0
  129. package/package.json +4 -4
  130. package/report.api.md +1 -0
  131. package/tmp/api-report-tmp.d.ts +1 -0
@@ -41,7 +41,7 @@ export default {
41
41
  'linkDataSource.jira-issues.refresh': 'Uppdatera',
42
42
  'linkDataSource.jira-issues.unableToLoadItems': 'Det gick inte att läsa in objekten',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': 'Det gick inte att läsa in resultat',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': 'Läs mer om att söka med JQL',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': 'Läs mer om att söka med JQL.',
45
45
  'linkDataSource.modal-initial-state.searchDescription': 'Börja skriva eller använd JQL för att söka.',
46
46
  'linkDataSource.modal-initial-state.searchTitle': 'Sök efter Jira-ärenden',
47
47
  'linkDataSource.render-type.boolean.false': 'Nej',
@@ -41,7 +41,7 @@ export default {
41
41
  'linkDataSource.jira-issues.refresh': 'Yenile',
42
42
  'linkDataSource.jira-issues.unableToLoadItems': 'Öğeler yüklenemiyor',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': 'Sonuçlar yüklenemiyor',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': 'JQL ile arama yapmak hakkında daha fazla bilgi edinin',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': 'JQL ile arama yapmak hakkında daha fazla bilgi edinin.',
45
45
  'linkDataSource.modal-initial-state.searchDescription': 'Aramak için yazmaya başlayın veya JQL kullanın.',
46
46
  'linkDataSource.modal-initial-state.searchTitle': 'Jira konuları arayın',
47
47
  'linkDataSource.render-type.boolean.false': 'Hayır',
@@ -39,9 +39,9 @@ export default {
39
39
  'linkDataSource.jira-issues.configmodal.selectedJiraSiteLabel': 'Вибрано сайт {siteName}',
40
40
  'linkDataSource.jira-issues.noResultsFound': 'Немає результатів',
41
41
  'linkDataSource.jira-issues.refresh': 'Оновити',
42
- 'linkDataSource.jira-issues.unableToLoadItems': 'Не вдалося завантажити завдання',
42
+ 'linkDataSource.jira-issues.unableToLoadItems': 'Не вдалося завантажити елементи',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': 'Не вдалося завантажити результати',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': 'Докладніше про пошук засобами JQL',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': 'Докладніше про пошук засобами JQL.',
45
45
  'linkDataSource.modal-initial-state.searchDescription': 'Почніть вводити запит або скористайтеся JQL для пошуку.',
46
46
  'linkDataSource.modal-initial-state.searchTitle': 'Пошук завдань Jira',
47
47
  'linkDataSource.render-type.boolean.false': 'Ні',
@@ -49,7 +49,7 @@ export default {
49
49
  'linkDataSource.render-type.user.default.display.name': 'Не призначено',
50
50
  'linkDataSource.table-footer.date_formatter.under_one_minute': 'Синхронізовано щойно',
51
51
  'linkDataSource.table-footer.date_formatter.under_over_minute': 'Синхронізація: {date}',
52
- 'linkDataSource.table-footer.item': '{itemCount, plural, one {елемент} few {елементи} many {елементів} other {елементів}}',
52
+ 'linkDataSource.table-footer.item': '{itemCount, plural, one {елемент} few {елементи} many {елементів} other {елементи}}',
53
53
  'linkDataSource.table-footer.loading': 'Завантаження…',
54
54
  'linkDataSource.table-footer.refresh': 'Оновити'
55
55
  };
@@ -41,7 +41,7 @@ export default {
41
41
  'linkDataSource.jira-issues.refresh': 'Làm mới',
42
42
  'linkDataSource.jira-issues.unableToLoadItems': 'Không thể tải được các mục',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': 'Không tải được kết quả',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': 'Tìm hiểu thêm về việc tìm kiếm bằng JQL',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': 'Tìm hiểu thêm về việc tìm kiếm bằng JQL.',
45
45
  'linkDataSource.modal-initial-state.searchDescription': 'Bắt đầu nhập hoặc sử dụng JQL để tìm kiếm.',
46
46
  'linkDataSource.modal-initial-state.searchTitle': 'Tìm kiếm vấn đề Jira',
47
47
  'linkDataSource.render-type.boolean.false': 'Không',
@@ -49,7 +49,7 @@ export default {
49
49
  'linkDataSource.render-type.user.default.display.name': 'Chưa được chỉ định',
50
50
  'linkDataSource.table-footer.date_formatter.under_one_minute': 'Vừa mới đồng bộ',
51
51
  'linkDataSource.table-footer.date_formatter.under_over_minute': 'Đã đồng bộ trong {date}',
52
- 'linkDataSource.table-footer.item': '{itemCount, plural, other {các mục}}',
52
+ 'linkDataSource.table-footer.item': '{itemCount, plural, other {mục}}',
53
53
  'linkDataSource.table-footer.loading': 'Đang tải...',
54
54
  'linkDataSource.table-footer.refresh': 'Làm mới'
55
55
  };
@@ -41,7 +41,7 @@ export default {
41
41
  'linkDataSource.jira-issues.refresh': '刷新',
42
42
  'linkDataSource.jira-issues.unableToLoadItems': '无法加载项目',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': '无法加载结果',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': '详细了解如何使用 JQL 进行搜索',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': '详细了解如何使用 JQL 进行搜索。',
45
45
  'linkDataSource.modal-initial-state.searchDescription': '开始输入搜索内容或使用 JQL 进行搜索。',
46
46
  'linkDataSource.modal-initial-state.searchTitle': '搜索 Jira 事务',
47
47
  'linkDataSource.render-type.boolean.false': '否',
@@ -41,7 +41,7 @@ export default {
41
41
  'linkDataSource.jira-issues.refresh': '重新整理',
42
42
  'linkDataSource.jira-issues.unableToLoadItems': '無法載入項目',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': '無法載入結果',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': '進一步了解如何使用 JQL 進行搜尋',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': '進一步了解如何使用 JQL 進行搜尋。',
45
45
  'linkDataSource.modal-initial-state.searchDescription': '開始輸入或使用 JQL 進行搜尋。',
46
46
  'linkDataSource.modal-initial-state.searchTitle': '搜尋 Jira 議題',
47
47
  'linkDataSource.render-type.boolean.false': '否',
@@ -194,7 +194,7 @@ const analyticsContextAttributes = {
194
194
  };
195
195
  const analyticsContextData = {
196
196
  packageName: "@atlaskit/link-datasource",
197
- packageVersion: "1.8.0",
197
+ packageVersion: "1.9.1",
198
198
  source: 'datasourceConfigModal'
199
199
  };
200
200
  const contextData = {
@@ -1,10 +1,10 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  /** @jsx jsx */
3
- import { Fragment, useCallback, useRef } from 'react';
3
+ import { Fragment, useCallback, useRef, useState } from 'react';
4
4
  import { css, jsx } from '@emotion/react';
5
5
  import { useIntl } from 'react-intl-next';
6
6
  import { LoadingButton } from '@atlaskit/button';
7
- import { Field } from '@atlaskit/form';
7
+ import { ErrorMessage, Field } from '@atlaskit/form';
8
8
  import CheckCircleIcon from '@atlaskit/icon/glyph/check-circle';
9
9
  import CrossCircleIcon from '@atlaskit/icon/glyph/cross-circle';
10
10
  import SearchIcon from '@atlaskit/icon/glyph/editor/search';
@@ -76,6 +76,7 @@ export const AqlSearchInput = ({
76
76
  const timeout = useRef();
77
77
  const lastValue = useRef(value);
78
78
  const lastResult = useRef(Promise.resolve(undefined));
79
+ const [message, setMessage] = useState(null);
79
80
  const {
80
81
  validateAqlText
81
82
  } = useValidateAqlText(workspaceId);
@@ -85,8 +86,9 @@ export const AqlSearchInput = ({
85
86
  if (!newUnvalidatedQlQuery) {
86
87
  return undefined;
87
88
  }
88
- const isValid = await validateAqlText(newUnvalidatedQlQuery);
89
- return isValid ? undefined : 'invalid';
89
+ const validation = await validateAqlText(newUnvalidatedQlQuery);
90
+ setMessage(validation.message);
91
+ return validation.isValid ? undefined : 'invalid';
90
92
  }, [validateAqlText]);
91
93
 
92
94
  /* Debounce async validation for input, validation is also called on every field change
@@ -119,7 +121,7 @@ export const AqlSearchInput = ({
119
121
  fieldProps,
120
122
  meta,
121
123
  error
122
- }) => jsx(Textfield, _extends({}, fieldProps, {
124
+ }) => jsx(Fragment, null, jsx(Textfield, _extends({}, fieldProps, {
123
125
  elemBeforeInput: jsx("span", {
124
126
  style: {
125
127
  paddingLeft: 6,
@@ -153,5 +155,5 @@ export const AqlSearchInput = ({
153
155
  })),
154
156
  placeholder: formatMessage(searchInputMessages.placeholder),
155
157
  testId: testId
156
- }))));
158
+ })), fieldProps.value && error && message && jsx(ErrorMessage, null, message))));
157
159
  };
@@ -1,13 +1,40 @@
1
1
  /** @jsx jsx */
2
2
  import { useEffect } from 'react';
3
- import { jsx } from '@emotion/react';
3
+ import { css, jsx } from '@emotion/react';
4
4
  import { useIntl } from 'react-intl-next';
5
5
  import EmptyState from '@atlaskit/empty-state';
6
+ import { N400 } from '@atlaskit/theme/colors';
6
7
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
7
8
  import { AccessRequiredSVG } from './access-required-svg';
8
9
  import { loadingErrorMessages } from './messages';
10
+ const urlStyles = css({
11
+ color: `var(--ds-text-subtlest, ${N400})`,
12
+ fontSize: "var(--ds-font-size-100, 14px)",
13
+ lineHeight: "var(--ds-font-lineHeight-200, 20px)"
14
+ });
15
+ const descriptionMessageStyles = css({
16
+ display: 'flex',
17
+ flexDirection: 'column',
18
+ gap: "var(--ds-space-200, 16px)"
19
+ });
20
+ const iconContainerStyles = css({
21
+ marginBottom: "var(--ds-space-200, 16px)"
22
+ });
23
+ const Description = ({
24
+ message,
25
+ url
26
+ }) => {
27
+ return jsx("div", {
28
+ css: descriptionMessageStyles
29
+ }, jsx("span", {
30
+ css: urlStyles
31
+ }, url), jsx("span", null, message));
32
+ };
33
+ const IconContainer = () => jsx("div", {
34
+ css: iconContainerStyles
35
+ }, jsx(AccessRequiredSVG, null));
9
36
  export const AccessRequired = ({
10
- siteName
37
+ url
11
38
  }) => {
12
39
  const {
13
40
  formatMessage
@@ -20,11 +47,19 @@ export const AccessRequired = ({
20
47
  reason: 'access'
21
48
  });
22
49
  }, [fireEvent]);
50
+ if (url) {
51
+ return jsx(EmptyState, {
52
+ header: formatMessage(loadingErrorMessages.accessRequiredWithSite),
53
+ description: jsx(Description, {
54
+ message: formatMessage(loadingErrorMessages.accessInstructions),
55
+ url: url
56
+ }),
57
+ renderImage: IconContainer
58
+ });
59
+ }
23
60
  return jsx(EmptyState, {
24
- header: siteName ? formatMessage(loadingErrorMessages.accessRequiredWithSite, {
25
- siteName
26
- }) : formatMessage(loadingErrorMessages.accessRequired),
61
+ header: formatMessage(loadingErrorMessages.accessRequired),
27
62
  description: formatMessage(loadingErrorMessages.accessInstructions),
28
- renderImage: () => jsx(AccessRequiredSVG, null)
63
+ renderImage: IconContainer
29
64
  });
30
65
  };
@@ -2,8 +2,8 @@ import { defineMessages } from 'react-intl-next';
2
2
  export const loadingErrorMessages = defineMessages({
3
3
  accessInstructions: {
4
4
  id: 'linkDataSource.jira-issues.accessInstructions',
5
- description: "Instructions to let the user know they must contact an administrator in order to access this site's content",
6
- defaultMessage: 'To request access, contact your admin.'
5
+ description: "Instructions to let the user know they must contact their site administrator in order to access this site's content",
6
+ defaultMessage: 'To request access, contact your site administrator.'
7
7
  },
8
8
  accessRequired: {
9
9
  id: 'linkDataSource.jira-issues.accessRequired',
@@ -12,8 +12,8 @@ export const loadingErrorMessages = defineMessages({
12
12
  },
13
13
  accessRequiredWithSite: {
14
14
  id: 'linkDataSource.jira-issues.accessRequiredWithSite',
15
- description: 'Message letting user know that they do not have access to the site by name',
16
- defaultMessage: "You don't have access to {siteName}"
15
+ description: 'Message letting user know that they do not have access to the site that will be listed below this message',
16
+ defaultMessage: "You don't have access to the following site:"
17
17
  },
18
18
  checkConnection: {
19
19
  id: 'linkDataSource.jira-issues.checkConnection',
@@ -109,7 +109,9 @@ const DatasourceTableViewWithoutAnalytics = ({
109
109
  });
110
110
  }
111
111
  if (status === 'unauthorized') {
112
- return jsx(AccessRequired, null);
112
+ return jsx(AccessRequired, {
113
+ url: url
114
+ });
113
115
  }
114
116
  if (status === 'rejected') {
115
117
  return jsx(LoadingError, {
@@ -13,6 +13,7 @@ import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
13
13
  import { N40 } from '@atlaskit/theme/colors';
14
14
  import Tooltip from '@atlaskit/tooltip';
15
15
  import { startUfoExperience, succeedUfoExperience } from '../../analytics/ufoExperiences';
16
+ import { stickyTableHeadersIndex } from '../../common/zindex';
16
17
  import { ColumnPicker } from './column-picker';
17
18
  import { DragColumnPreview } from './drag-column-preview';
18
19
  import { DraggableTableHeading } from './draggable-table-heading';
@@ -25,7 +26,7 @@ const tableHeadStyles = css({
25
26
  background: "var(--ds-surface, #FFF)",
26
27
  position: 'sticky',
27
28
  top: 0,
28
- zIndex: 10
29
+ zIndex: stickyTableHeadersIndex
29
30
  });
30
31
  const ColumnPickerHeader = styled.th`
31
32
  width: 40px;
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  /** @jsx jsx */
3
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { css, jsx } from '@emotion/react';
5
5
  import { FormattedMessage, FormattedNumber, useIntl } from 'react-intl-next';
6
6
  import { v4 as uuidv4 } from 'uuid';
@@ -30,8 +30,11 @@ import { JiraSiteSelector } from '../site-selector';
30
30
  import { modalMessages } from './messages';
31
31
  const dropdownContainerStyles = css({
32
32
  display: 'flex',
33
- gap: "var(--ds-space-100, 0.5rem)"
33
+ alignItems: 'center',
34
+ gap: "var(--ds-space-100, 0.5rem)",
35
+ minHeight: '40px' // to prevent vertical shifting when site selector pops in
34
36
  });
37
+
35
38
  const contentContainerStyles = css({
36
39
  display: 'grid',
37
40
  maxHeight: '420px',
@@ -77,11 +80,12 @@ export const getColumnAction = (oldVisibleColumnKeys, newVisibleColumnKeys) => {
77
80
  export const PlainJiraIssuesConfigModal = props => {
78
81
  const {
79
82
  datasourceId,
80
- parameters: initialParameters,
81
- visibleColumnKeys: initialVisibleColumnKeys,
82
83
  onCancel,
83
84
  onInsert,
84
- viewMode = 'issue'
85
+ viewMode = 'issue',
86
+ parameters: initialParameters,
87
+ url: urlBeingEdited,
88
+ visibleColumnKeys: initialVisibleColumnKeys
85
89
  } = props;
86
90
  const [availableSites, setAvailableSites] = useState([]);
87
91
  const [currentViewMode, setCurrentViewMode] = useState(viewMode);
@@ -129,9 +133,7 @@ export const PlainJiraIssuesConfigModal = props => {
129
133
  } = useRef(uuidv4());
130
134
  const selectedJiraSite = useMemo(() => {
131
135
  if (cloudId) {
132
- // if the cloud id we're editing isn't in available sites then user is likely unauthorized for that site
133
- // TODO: unauthorized to edit flow https://product-fabric.atlassian.net/browse/EDM-7216
134
- return availableSites.find(jiraSite => jiraSite.cloudId === cloudId) || availableSites[0];
136
+ return availableSites.find(jiraSite => jiraSite.cloudId === cloudId);
135
137
  } else {
136
138
  const currentlyLoggedInSiteUrl = window.location.origin;
137
139
  return availableSites.find(jiraSite => jiraSite.url === currentlyLoggedInSiteUrl) || availableSites[0];
@@ -360,12 +362,12 @@ export const PlainJiraIssuesConfigModal = props => {
360
362
  extensionKey: extensionKey
361
363
  })), [columns, defaultVisibleColumnKeys, handleOnNextPage, handleVisibleColumnKeysChange, hasNextPage, loadDatasourceDetails, modalRenderInstanceId, responseItems, status, visibleColumnKeys, extensionKey]);
362
364
  const renderCountModeContent = useCallback(() => {
363
- const url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
365
+ const selectedJiraSiteUrl = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
364
366
  if (status === 'unauthorized') {
365
367
  return jsx(AccessRequired, {
366
- siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
368
+ url: selectedJiraSiteUrl || urlBeingEdited
367
369
  });
368
- } else if (status === 'empty' || !jql || !url) {
370
+ } else if (status === 'empty' || !jql || !selectedJiraSiteUrl) {
369
371
  return jsx("div", {
370
372
  css: smartLinkContainerStyles
371
373
  }, jsx("span", {
@@ -373,22 +375,23 @@ export const PlainJiraIssuesConfigModal = props => {
373
375
  css: placeholderSmartLinkStyles
374
376
  }, jsx(FormattedMessage, modalMessages.issuesCountSmartCardPlaceholderText)));
375
377
  } else {
376
- const urlWithEncodedJql = `${url}/issues/?jql=${encodeURI(jql)}`;
378
+ const urlWithEncodedJql = `${selectedJiraSiteUrl}/issues/?jql=${encodeURI(jql)}`;
377
379
  return jsx("div", {
378
380
  css: smartLinkContainerStyles
379
381
  }, jsx(LinkRenderType, {
380
382
  url: urlWithEncodedJql
381
383
  }));
382
384
  }
383
- }, [jql, selectedJiraSite, status]);
385
+ }, [jql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status, urlBeingEdited]);
384
386
  const renderIssuesModeContent = useCallback(() => {
387
+ const selectedJiraSiteUrl = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
385
388
  if (status === 'rejected' && jqlUrl) {
386
389
  return jsx(ModalLoadingError, {
387
390
  url: jqlUrl
388
391
  });
389
392
  } else if (status === 'unauthorized') {
390
393
  return jsx(AccessRequired, {
391
- siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
394
+ url: selectedJiraSiteUrl || urlBeingEdited
392
395
  });
393
396
  } else if (resolvedWithNoResults) {
394
397
  return jsx(NoResults, null);
@@ -411,24 +414,20 @@ export const PlainJiraIssuesConfigModal = props => {
411
414
  }));
412
415
  }
413
416
  return issueLikeDataTableView;
414
- }, [status, jqlUrl, resolvedWithNoResults, columns.length, retrieveUrlForSmartCardRender, responseItems.length, issueLikeDataTableView, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName, jql, currentSearchMethod]);
417
+ }, [columns.length, currentSearchMethod, issueLikeDataTableView, jql, jqlUrl, resolvedWithNoResults, responseItems.length, retrieveUrlForSmartCardRender, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status, urlBeingEdited]);
415
418
  return jsx(ModalTransition, null, jsx(Modal, {
416
- testId: 'jira-jql-datasource-modal',
419
+ testId: "jira-jql-datasource-modal",
417
420
  onClose: onCancel,
418
421
  width: "calc(100% - 80px)",
419
422
  shouldScrollInViewport: true
420
- }, jsx(ModalHeader, null, jsx(ModalTitle, null, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx("div", {
423
+ }, jsx(ModalHeader, null, jsx(ModalTitle, null, jsx("div", {
421
424
  css: dropdownContainerStyles
422
- }, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesTitleManySites, {
423
- values: {
424
- siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
425
- }
426
- })), jsx(JiraSiteSelector, {
427
- testId: `jira-jql-datasource-modal--site-selector`,
425
+ }, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx(Fragment, null, jsx(FormattedMessage, modalMessages.insertIssuesTitleManySites), jsx(JiraSiteSelector, {
428
426
  availableSites: availableSites,
429
427
  onSiteSelection: onSiteSelection,
430
- selectedJiraSite: selectedJiraSite
431
- }))), jsx(ModeSwitcher, {
428
+ selectedJiraSite: selectedJiraSite,
429
+ testId: "jira-jql-datasource-modal--site-selector"
430
+ })))), jsx(ModeSwitcher, {
432
431
  isCompact: true,
433
432
  options: [{
434
433
  label: formatMessage(modalMessages.issueViewModeLabel),
@@ -468,7 +467,7 @@ export const PlainJiraIssuesConfigModal = props => {
468
467
  appearance: "primary",
469
468
  onClick: onInsertPressed,
470
469
  isDisabled: isInsertDisabled,
471
- testId: 'jira-jql-datasource-modal--insert-button'
470
+ testId: "jira-jql-datasource-modal--insert-button"
472
471
  }, jsx(FormattedMessage, modalMessages.insertIssuesButtonText)))));
473
472
  };
474
473
  const analyticsContextAttributes = {
@@ -17,8 +17,8 @@ export const modalMessages = defineMessages({
17
17
  },
18
18
  insertIssuesTitleManySites: {
19
19
  id: 'linkDataSource.jira-issues.configmodal.insertIssuesTitleManySites',
20
- description: 'Title for the Jira Issues Datasource config modal when multiple sites are available',
21
- defaultMessage: 'Insert Jira issues from {siteName}'
20
+ description: 'Title for the Jira Issues modal when a user has to select a site to inserting issues from',
21
+ defaultMessage: 'Insert Jira issues from'
22
22
  },
23
23
  issueViewModeLabel: {
24
24
  id: 'linkDataSource.jira-issues.configmodal.issueViewModeLabel',
@@ -1,11 +1,16 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  /** @jsx jsx */
3
- import { jsx } from '@emotion/react';
2
+ import { useMemo } from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
4
  import { useIntl } from 'react-intl-next';
5
- import Button from '@atlaskit/button/standard-button';
6
- import DropdownMenu, { DropdownItem, DropdownItemGroup } from '@atlaskit/dropdown-menu';
7
- import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
5
+ import Select from '@atlaskit/select';
6
+ import { siteSelectorIndex } from '../../../common/zindex';
8
7
  import { siteSelectorMessages } from './messages';
8
+ const selectStyles = css({
9
+ fontSize: "var(--ds-font-size-100, 14px)",
10
+ fontWeight: "var(--ds-font-weight-medium, 500)",
11
+ lineHeight: "var(--ds-font-lineHeight-200, 20px)",
12
+ zIndex: siteSelectorIndex
13
+ });
9
14
  export const JiraSiteSelector = props => {
10
15
  const {
11
16
  availableSites,
@@ -13,32 +18,45 @@ export const JiraSiteSelector = props => {
13
18
  selectedJiraSite,
14
19
  testId
15
20
  } = props;
16
- const intl = useIntl();
17
- return jsx(DropdownMenu, {
18
- spacing: "compact",
21
+ const {
22
+ formatMessage
23
+ } = useIntl();
24
+ const onChange = newValue => {
25
+ const selectedSite = availableSites.find(site => site.cloudId === (newValue === null || newValue === void 0 ? void 0 : newValue.value));
26
+ if (selectedSite) {
27
+ onSiteSelection(selectedSite);
28
+ }
29
+ };
30
+ const availableSitesOptions = useMemo(() => availableSites.map(site => ({
31
+ label: site.displayName,
32
+ value: site.cloudId
33
+ })), [availableSites]);
34
+ const selectedSiteOption = selectedJiraSite && {
35
+ label: selectedJiraSite.displayName,
36
+ value: selectedJiraSite.cloudId
37
+ };
38
+ return jsx("span", {
39
+ "data-testid": `${testId}--trigger`
40
+ }, jsx(Select, {
41
+ css: selectStyles,
42
+ classNamePrefix: testId,
43
+ isLoading: availableSites.length === 0,
44
+ onChange: onChange,
45
+ options: availableSitesOptions,
46
+ placeholder: formatMessage(siteSelectorMessages.chooseSite),
47
+ styles: {
48
+ // prevents the popup menu with available sites from being too narrow
49
+ // if the selected site is much shorter than the other options
50
+ menu: ({
51
+ width,
52
+ ...css
53
+ }) => ({
54
+ ...css,
55
+ minWidth: '100%',
56
+ width: 'max-content'
57
+ })
58
+ },
19
59
  testId: testId,
20
- trigger: ({
21
- triggerRef,
22
- ...props
23
- }) => jsx(Button, _extends({}, props, {
24
- testId: `${testId}--trigger`,
25
- spacing: "none",
26
- iconBefore: jsx(ChevronDownIcon, {
27
- label: intl.formatMessage(siteSelectorMessages.dropdownChevronLabel)
28
- }),
29
- ref: triggerRef
30
- }))
31
- }, jsx(DropdownItemGroup, null, availableSites.map(availableSite => {
32
- const {
33
- displayName,
34
- cloudId
35
- } = availableSite;
36
- const isSelected = displayName === (selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName);
37
- return jsx(DropdownItem, {
38
- isSelected: isSelected,
39
- key: cloudId,
40
- onClick: () => onSiteSelection(availableSite),
41
- testId: testId && `${testId}--dropdown-item${isSelected ? '__selected' : ''}`
42
- }, displayName);
43
- })));
60
+ value: selectedSiteOption
61
+ }));
44
62
  };
@@ -1,13 +1,8 @@
1
1
  import { defineMessages } from 'react-intl-next';
2
2
  export const siteSelectorMessages = defineMessages({
3
- dropdownChevronLabel: {
4
- id: 'linkDataSource.jira-issues.configmodal.dropdownChevronLabel',
5
- description: 'Label for button that reveals more available site options to choose from',
6
- defaultMessage: 'Pick jira site'
7
- },
8
- selectedJiraSiteLabel: {
9
- id: 'linkDataSource.jira-issues.configmodal.selectedJiraSiteLabel',
10
- description: 'Label for a check icon declaring which option is selected',
11
- defaultMessage: '{siteName} is selected'
3
+ chooseSite: {
4
+ id: 'linkDataSource.jira-issues.configmodal.chooseSite',
5
+ description: 'Label for input letting user know they have to choose a site',
6
+ defaultMessage: 'Choose site'
12
7
  }
13
8
  });
@@ -1,5 +1,5 @@
1
1
  export var EVENT_CHANNEL = 'media';
2
2
  export var packageMetaData = {
3
3
  packageName: "@atlaskit/link-datasource",
4
- packageVersion: "1.8.0"
4
+ packageVersion: "1.9.1"
5
5
  };
@@ -0,0 +1,2 @@
1
+ export var stickyTableHeadersIndex = 10;
2
+ export var siteSelectorIndex = stickyTableHeadersIndex + 1;
@@ -3,7 +3,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  import { useCallback, useState } from 'react';
5
5
  import { validateAql } from '../services/cmdbService';
6
- export var useValidateAqlText = function useValidateAqlText(workspaceId, hostname) {
6
+ export var useValidateAqlText = function useValidateAqlText(workspaceId) {
7
7
  var _useState = useState(false),
8
8
  _useState2 = _slicedToArray(_useState, 2),
9
9
  loading = _useState2[0],
@@ -18,43 +18,48 @@ export var useValidateAqlText = function useValidateAqlText(workspaceId, hostnam
18
18
  setError = _useState6[1];
19
19
  var validateAqlText = useCallback( /*#__PURE__*/function () {
20
20
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(aql) {
21
- var isValid, validateAqlResponse;
21
+ var isValid, message, _validateAqlResponse$, validateAqlResponse;
22
22
  return _regeneratorRuntime.wrap(function _callee$(_context) {
23
23
  while (1) switch (_context.prev = _context.next) {
24
24
  case 0:
25
25
  setLoading(true);
26
26
  setError(undefined);
27
27
  isValid = false;
28
- _context.prev = 3;
29
- _context.next = 6;
28
+ message = null;
29
+ _context.prev = 4;
30
+ _context.next = 7;
30
31
  return validateAql(workspaceId, {
31
32
  qlQuery: aql
32
33
  });
33
- case 6:
34
+ case 7:
34
35
  validateAqlResponse = _context.sent;
35
36
  setIsValidAqlText(validateAqlResponse.isValid);
36
37
  isValid = validateAqlResponse.isValid;
37
- _context.next = 14;
38
+ message = ((_validateAqlResponse$ = validateAqlResponse.errors) === null || _validateAqlResponse$ === void 0 ? void 0 : _validateAqlResponse$.iql) || null;
39
+ _context.next = 16;
38
40
  break;
39
- case 11:
40
- _context.prev = 11;
41
- _context.t0 = _context["catch"](3);
41
+ case 13:
42
+ _context.prev = 13;
43
+ _context.t0 = _context["catch"](4);
42
44
  if (_context.t0 instanceof Error) {
43
45
  setError(_context.t0);
44
46
  } else {
45
47
  setError(new Error('Unexpected error occured'));
46
48
  }
47
- case 14:
48
- _context.prev = 14;
49
+ case 16:
50
+ _context.prev = 16;
49
51
  setLoading(false);
50
- return _context.finish(14);
51
- case 17:
52
- return _context.abrupt("return", isValid);
53
- case 18:
52
+ return _context.finish(16);
53
+ case 19:
54
+ return _context.abrupt("return", {
55
+ isValid: isValid,
56
+ message: message
57
+ });
58
+ case 20:
54
59
  case "end":
55
60
  return _context.stop();
56
61
  }
57
- }, _callee, null, [[3, 11, 14, 17]]);
62
+ }, _callee, null, [[4, 13, 16, 19]]);
58
63
  }));
59
64
  return function (_x) {
60
65
  return _ref.apply(this, arguments);
@@ -41,7 +41,7 @@ export default {
41
41
  'linkDataSource.jira-issues.refresh': 'Opdater',
42
42
  'linkDataSource.jira-issues.unableToLoadItems': 'Kunne ikke indlæse elementer',
43
43
  'linkDataSource.jira-issues.unableToLoadResults': 'Kunne ikke indlæse resultater',
44
- 'linkDataSource.modal-initial-state.learnMoreLink': 'Få mere at vide om søgning med JQL',
44
+ 'linkDataSource.modal-initial-state.learnMoreLink': 'Få mere at vide om at søge med JQL.',
45
45
  'linkDataSource.modal-initial-state.searchDescription': 'Begynd at indtaste, eller brug JQL til at søge.',
46
46
  'linkDataSource.modal-initial-state.searchTitle': 'Søg efter Jira-sager',
47
47
  'linkDataSource.render-type.boolean.false': 'Nej',
@@ -21,13 +21,14 @@ export default {
21
21
  'linkDataSource.column-picker.no-all-items-shown-message.line-1': 'Your search returned too many results.',
22
22
  'linkDataSource.column-picker.no-all-items-shown-message.line-2': 'Try again with more specific keywords.',
23
23
  'linkDataSource.column-picker.search': 'Search for fields',
24
+ 'linkDataSource.column-picker.tooltip': 'Configure columns',
24
25
  'linkDataSource.jira-issues.accessInstructions': 'To request access, contact your admin.',
25
26
  'linkDataSource.jira-issues.accessRequired': "You don't have access to this site",
26
27
  'linkDataSource.jira-issues.accessRequiredWithSite': "You don't have access to {siteName}",
27
28
  'linkDataSource.jira-issues.checkConnection': 'Check your connection and refresh, or try again later.',
28
29
  'linkDataSource.jira-issues.checkConnectionWithSource': 'Check your connection and refresh, or <a>open this query in Jira</a> to review.',
29
30
  'linkDataSource.jira-issues.configmodal.basicModeText': 'Basic',
30
- 'linkDataSource.jira-issues.configmodal.basicTextSearchPlaceholder': 'Search',
31
+ 'linkDataSource.jira-issues.configmodal.basicTextSearchPlaceholder': 'Search for issues by keyword',
31
32
  'linkDataSource.jira-issues.configmodal.cancelButtonText': 'Cancel',
32
33
  'linkDataSource.jira-issues.configmodal.countViewModeLabel': 'Count view',
33
34
  'linkDataSource.jira-issues.configmodal.dropdownChevronLabel': 'Pick jira site',
@@ -42,8 +43,9 @@ export default {
42
43
  'linkDataSource.jira-issues.refresh': 'Refresh',
43
44
  'linkDataSource.jira-issues.unableToLoadItems': 'Unable to load items',
44
45
  'linkDataSource.jira-issues.unableToLoadResults': 'Unable to load results',
45
- 'linkDataSource.modal-initial-state.learnMoreLink': 'Learn more about searching with JQL',
46
- 'linkDataSource.modal-initial-state.searchDescription': 'Start typing or use JQL to search.',
46
+ 'linkDataSource.modal-initial-state.beta': 'Beta',
47
+ 'linkDataSource.modal-initial-state.learnMoreLink': 'Learn how to search with JQL',
48
+ 'linkDataSource.modal-initial-state.searchDescription': 'Use JQL (Jira Query Language) to search for issues.',
47
49
  'linkDataSource.modal-initial-state.searchTitle': 'Search for Jira issues',
48
50
  'linkDataSource.render-type.boolean.false': 'No',
49
51
  'linkDataSource.render-type.boolean.true': 'Yes',