@atlaskit/link-datasource 0.14.4

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 (245) hide show
  1. package/CHANGELOG.md +233 -0
  2. package/README.md +3 -0
  3. package/dist/cjs/hooks/useDatasourceTableState.js +133 -0
  4. package/dist/cjs/index.js +19 -0
  5. package/dist/cjs/services/getAvailableJiraSites.js +65 -0
  6. package/dist/cjs/services/makeGetJqlAutocompleteData.js +66 -0
  7. package/dist/cjs/services/makeGetJqlSuggestionsData.js +55 -0
  8. package/dist/cjs/ui/issue-like-table/column-picker/index.js +93 -0
  9. package/dist/cjs/ui/issue-like-table/column-picker/types.js +5 -0
  10. package/dist/cjs/ui/issue-like-table/draggable-table-heading.js +182 -0
  11. package/dist/cjs/ui/issue-like-table/empty-state/index.js +127 -0
  12. package/dist/cjs/ui/issue-like-table/empty-state/priority.js +28 -0
  13. package/dist/cjs/ui/issue-like-table/empty-state/type.js +51 -0
  14. package/dist/cjs/ui/issue-like-table/empty-state/types.js +5 -0
  15. package/dist/cjs/ui/issue-like-table/index.js +300 -0
  16. package/dist/cjs/ui/issue-like-table/render-type/boolean/index.js +30 -0
  17. package/dist/cjs/ui/issue-like-table/render-type/boolean/messages.js +20 -0
  18. package/dist/cjs/ui/issue-like-table/render-type/date-time/index.js +47 -0
  19. package/dist/cjs/ui/issue-like-table/render-type/icon/index.js +34 -0
  20. package/dist/cjs/ui/issue-like-table/render-type/index.js +63 -0
  21. package/dist/cjs/ui/issue-like-table/render-type/link/index.js +56 -0
  22. package/dist/cjs/ui/issue-like-table/render-type/number/index.js +24 -0
  23. package/dist/cjs/ui/issue-like-table/render-type/status/index.js +28 -0
  24. package/dist/cjs/ui/issue-like-table/render-type/tag/index.js +27 -0
  25. package/dist/cjs/ui/issue-like-table/render-type/text/index.js +23 -0
  26. package/dist/cjs/ui/issue-like-table/render-type/user/index.js +36 -0
  27. package/dist/cjs/ui/issue-like-table/render-type/user/messages.js +15 -0
  28. package/dist/cjs/ui/issue-like-table/styled.js +12 -0
  29. package/dist/cjs/ui/issue-like-table/types.js +5 -0
  30. package/dist/cjs/ui/issue-like-table/useIsOnScreen.js +32 -0
  31. package/dist/cjs/ui/jira-issues/modal/basic-search-input/index.js +52 -0
  32. package/dist/cjs/ui/jira-issues/modal/basic-search-input/messages.js +15 -0
  33. package/dist/cjs/ui/jira-issues/modal/index.js +267 -0
  34. package/dist/cjs/ui/jira-issues/modal/jira-search-container/buildJQL.js +27 -0
  35. package/dist/cjs/ui/jira-issues/modal/jira-search-container/index.js +116 -0
  36. package/dist/cjs/ui/jira-issues/modal/jira-search-container/messages.js +15 -0
  37. package/dist/cjs/ui/jira-issues/modal/jql-editor/index.js +41 -0
  38. package/dist/cjs/ui/jira-issues/modal/messages.js +45 -0
  39. package/dist/cjs/ui/jira-issues/modal/mode-switcher/index.js +97 -0
  40. package/dist/cjs/ui/jira-issues/modal/site-selector/index.js +55 -0
  41. package/dist/cjs/ui/jira-issues/modal/site-selector/messages.js +20 -0
  42. package/dist/cjs/ui/jira-issues/table-footer/index.js +68 -0
  43. package/dist/cjs/ui/jira-issues/table-footer/messages.js +25 -0
  44. package/dist/cjs/ui/jira-issues/table-footer/sync-info/index.js +79 -0
  45. package/dist/cjs/ui/jira-issues/table-footer/sync-info/messages.js +20 -0
  46. package/dist/cjs/ui/jira-issues/tableView.js +64 -0
  47. package/dist/cjs/ui/jira-issues/types.js +5 -0
  48. package/dist/cjs/version.json +5 -0
  49. package/dist/es2019/hooks/useDatasourceTableState.js +77 -0
  50. package/dist/es2019/index.js +2 -0
  51. package/dist/es2019/services/getAvailableJiraSites.js +20 -0
  52. package/dist/es2019/services/makeGetJqlAutocompleteData.js +19 -0
  53. package/dist/es2019/services/makeGetJqlSuggestionsData.js +11 -0
  54. package/dist/es2019/ui/issue-like-table/column-picker/index.js +77 -0
  55. package/dist/es2019/ui/issue-like-table/column-picker/types.js +1 -0
  56. package/dist/es2019/ui/issue-like-table/draggable-table-heading.js +166 -0
  57. package/dist/es2019/ui/issue-like-table/empty-state/index.js +113 -0
  58. package/dist/es2019/ui/issue-like-table/empty-state/priority.js +32 -0
  59. package/dist/es2019/ui/issue-like-table/empty-state/type.js +46 -0
  60. package/dist/es2019/ui/issue-like-table/empty-state/types.js +1 -0
  61. package/dist/es2019/ui/issue-like-table/index.js +259 -0
  62. package/dist/es2019/ui/issue-like-table/render-type/boolean/index.js +21 -0
  63. package/dist/es2019/ui/issue-like-table/render-type/boolean/messages.js +13 -0
  64. package/dist/es2019/ui/issue-like-table/render-type/date-time/index.js +37 -0
  65. package/dist/es2019/ui/issue-like-table/render-type/icon/index.js +27 -0
  66. package/dist/es2019/ui/issue-like-table/render-type/index.js +55 -0
  67. package/dist/es2019/ui/issue-like-table/render-type/link/index.js +38 -0
  68. package/dist/es2019/ui/issue-like-table/render-type/number/index.js +15 -0
  69. package/dist/es2019/ui/issue-like-table/render-type/status/index.js +19 -0
  70. package/dist/es2019/ui/issue-like-table/render-type/tag/index.js +18 -0
  71. package/dist/es2019/ui/issue-like-table/render-type/text/index.js +14 -0
  72. package/dist/es2019/ui/issue-like-table/render-type/user/index.js +29 -0
  73. package/dist/es2019/ui/issue-like-table/render-type/user/messages.js +8 -0
  74. package/dist/es2019/ui/issue-like-table/styled.js +6 -0
  75. package/dist/es2019/ui/issue-like-table/types.js +1 -0
  76. package/dist/es2019/ui/issue-like-table/useIsOnScreen.js +17 -0
  77. package/dist/es2019/ui/jira-issues/modal/basic-search-input/index.js +42 -0
  78. package/dist/es2019/ui/jira-issues/modal/basic-search-input/messages.js +8 -0
  79. package/dist/es2019/ui/jira-issues/modal/index.js +227 -0
  80. package/dist/es2019/ui/jira-issues/modal/jira-search-container/buildJQL.js +20 -0
  81. package/dist/es2019/ui/jira-issues/modal/jira-search-container/index.js +90 -0
  82. package/dist/es2019/ui/jira-issues/modal/jira-search-container/messages.js +8 -0
  83. package/dist/es2019/ui/jira-issues/modal/jql-editor/index.js +33 -0
  84. package/dist/es2019/ui/jira-issues/modal/messages.js +38 -0
  85. package/dist/es2019/ui/jira-issues/modal/mode-switcher/index.js +90 -0
  86. package/dist/es2019/ui/jira-issues/modal/site-selector/index.js +43 -0
  87. package/dist/es2019/ui/jira-issues/modal/site-selector/messages.js +13 -0
  88. package/dist/es2019/ui/jira-issues/table-footer/index.js +78 -0
  89. package/dist/es2019/ui/jira-issues/table-footer/messages.js +18 -0
  90. package/dist/es2019/ui/jira-issues/table-footer/sync-info/index.js +59 -0
  91. package/dist/es2019/ui/jira-issues/table-footer/sync-info/messages.js +13 -0
  92. package/dist/es2019/ui/jira-issues/tableView.js +57 -0
  93. package/dist/es2019/ui/jira-issues/types.js +1 -0
  94. package/dist/es2019/version.json +5 -0
  95. package/dist/esm/hooks/useDatasourceTableState.js +125 -0
  96. package/dist/esm/index.js +2 -0
  97. package/dist/esm/services/getAvailableJiraSites.js +57 -0
  98. package/dist/esm/services/makeGetJqlAutocompleteData.js +58 -0
  99. package/dist/esm/services/makeGetJqlSuggestionsData.js +47 -0
  100. package/dist/esm/ui/issue-like-table/column-picker/index.js +85 -0
  101. package/dist/esm/ui/issue-like-table/column-picker/types.js +1 -0
  102. package/dist/esm/ui/issue-like-table/draggable-table-heading.js +173 -0
  103. package/dist/esm/ui/issue-like-table/empty-state/index.js +118 -0
  104. package/dist/esm/ui/issue-like-table/empty-state/priority.js +20 -0
  105. package/dist/esm/ui/issue-like-table/empty-state/type.js +43 -0
  106. package/dist/esm/ui/issue-like-table/empty-state/types.js +1 -0
  107. package/dist/esm/ui/issue-like-table/index.js +292 -0
  108. package/dist/esm/ui/issue-like-table/render-type/boolean/index.js +21 -0
  109. package/dist/esm/ui/issue-like-table/render-type/boolean/messages.js +13 -0
  110. package/dist/esm/ui/issue-like-table/render-type/date-time/index.js +38 -0
  111. package/dist/esm/ui/issue-like-table/render-type/icon/index.js +25 -0
  112. package/dist/esm/ui/issue-like-table/render-type/index.js +55 -0
  113. package/dist/esm/ui/issue-like-table/render-type/link/index.js +44 -0
  114. package/dist/esm/ui/issue-like-table/render-type/number/index.js +15 -0
  115. package/dist/esm/ui/issue-like-table/render-type/status/index.js +19 -0
  116. package/dist/esm/ui/issue-like-table/render-type/tag/index.js +18 -0
  117. package/dist/esm/ui/issue-like-table/render-type/text/index.js +14 -0
  118. package/dist/esm/ui/issue-like-table/render-type/user/index.js +27 -0
  119. package/dist/esm/ui/issue-like-table/render-type/user/messages.js +8 -0
  120. package/dist/esm/ui/issue-like-table/styled.js +4 -0
  121. package/dist/esm/ui/issue-like-table/types.js +1 -0
  122. package/dist/esm/ui/issue-like-table/useIsOnScreen.js +25 -0
  123. package/dist/esm/ui/jira-issues/modal/basic-search-input/index.js +43 -0
  124. package/dist/esm/ui/jira-issues/modal/basic-search-input/messages.js +8 -0
  125. package/dist/esm/ui/jira-issues/modal/index.js +255 -0
  126. package/dist/esm/ui/jira-issues/modal/jira-search-container/buildJQL.js +20 -0
  127. package/dist/esm/ui/jira-issues/modal/jira-search-container/index.js +104 -0
  128. package/dist/esm/ui/jira-issues/modal/jira-search-container/messages.js +8 -0
  129. package/dist/esm/ui/jira-issues/modal/jql-editor/index.js +31 -0
  130. package/dist/esm/ui/jira-issues/modal/messages.js +38 -0
  131. package/dist/esm/ui/jira-issues/modal/mode-switcher/index.js +88 -0
  132. package/dist/esm/ui/jira-issues/modal/site-selector/index.js +44 -0
  133. package/dist/esm/ui/jira-issues/modal/site-selector/messages.js +13 -0
  134. package/dist/esm/ui/jira-issues/table-footer/index.js +60 -0
  135. package/dist/esm/ui/jira-issues/table-footer/messages.js +18 -0
  136. package/dist/esm/ui/jira-issues/table-footer/sync-info/index.js +68 -0
  137. package/dist/esm/ui/jira-issues/table-footer/sync-info/messages.js +13 -0
  138. package/dist/esm/ui/jira-issues/tableView.js +55 -0
  139. package/dist/esm/ui/jira-issues/types.js +1 -0
  140. package/dist/esm/version.json +5 -0
  141. package/dist/types/hooks/useDatasourceTableState.d.ts +13 -0
  142. package/dist/types/index.d.ts +2 -0
  143. package/dist/types/services/getAvailableJiraSites.d.ts +6 -0
  144. package/dist/types/services/makeGetJqlAutocompleteData.d.ts +6 -0
  145. package/dist/types/services/makeGetJqlSuggestionsData.d.ts +5 -0
  146. package/dist/types/ui/issue-like-table/column-picker/index.d.ts +3 -0
  147. package/dist/types/ui/issue-like-table/column-picker/types.d.ts +6 -0
  148. package/dist/types/ui/issue-like-table/draggable-table-heading.d.ts +12 -0
  149. package/dist/types/ui/issue-like-table/empty-state/index.d.ts +6 -0
  150. package/dist/types/ui/issue-like-table/empty-state/priority.d.ts +6 -0
  151. package/dist/types/ui/issue-like-table/empty-state/type.d.ts +6 -0
  152. package/dist/types/ui/issue-like-table/empty-state/types.d.ts +2 -0
  153. package/dist/types/ui/issue-like-table/index.d.ts +15 -0
  154. package/dist/types/ui/issue-like-table/render-type/boolean/index.d.ts +8 -0
  155. package/dist/types/ui/issue-like-table/render-type/boolean/messages.d.ts +12 -0
  156. package/dist/types/ui/issue-like-table/render-type/date-time/index.d.ts +10 -0
  157. package/dist/types/ui/issue-like-table/render-type/icon/index.d.ts +8 -0
  158. package/dist/types/ui/issue-like-table/render-type/index.d.ts +2 -0
  159. package/dist/types/ui/issue-like-table/render-type/link/index.d.ts +8 -0
  160. package/dist/types/ui/issue-like-table/render-type/number/index.d.ts +8 -0
  161. package/dist/types/ui/issue-like-table/render-type/status/index.d.ts +8 -0
  162. package/dist/types/ui/issue-like-table/render-type/tag/index.d.ts +9 -0
  163. package/dist/types/ui/issue-like-table/render-type/text/index.d.ts +8 -0
  164. package/dist/types/ui/issue-like-table/render-type/user/index.d.ts +11 -0
  165. package/dist/types/ui/issue-like-table/render-type/user/messages.d.ts +7 -0
  166. package/dist/types/ui/issue-like-table/styled.d.ts +5 -0
  167. package/dist/types/ui/issue-like-table/types.d.ts +38 -0
  168. package/dist/types/ui/issue-like-table/useIsOnScreen.d.ts +1 -0
  169. package/dist/types/ui/jira-issues/modal/basic-search-input/index.d.ts +12 -0
  170. package/dist/types/ui/jira-issues/modal/basic-search-input/messages.d.ts +7 -0
  171. package/dist/types/ui/jira-issues/modal/index.d.ts +13 -0
  172. package/dist/types/ui/jira-issues/modal/jira-search-container/buildJQL.d.ts +7 -0
  173. package/dist/types/ui/jira-issues/modal/jira-search-container/index.d.ts +7 -0
  174. package/dist/types/ui/jira-issues/modal/jira-search-container/messages.d.ts +7 -0
  175. package/dist/types/ui/jira-issues/modal/jql-editor/index.d.ts +8 -0
  176. package/dist/types/ui/jira-issues/modal/messages.d.ts +37 -0
  177. package/dist/types/ui/jira-issues/modal/mode-switcher/index.d.ts +12 -0
  178. package/dist/types/ui/jira-issues/modal/site-selector/index.d.ts +10 -0
  179. package/dist/types/ui/jira-issues/modal/site-selector/messages.d.ts +12 -0
  180. package/dist/types/ui/jira-issues/table-footer/index.d.ts +7 -0
  181. package/dist/types/ui/jira-issues/table-footer/messages.d.ts +17 -0
  182. package/dist/types/ui/jira-issues/table-footer/sync-info/index.d.ts +4 -0
  183. package/dist/types/ui/jira-issues/table-footer/sync-info/messages.d.ts +12 -0
  184. package/dist/types/ui/jira-issues/tableView.d.ts +3 -0
  185. package/dist/types/ui/jira-issues/types.d.ts +14 -0
  186. package/dist/types-ts4.5/hooks/useDatasourceTableState.d.ts +13 -0
  187. package/dist/types-ts4.5/index.d.ts +2 -0
  188. package/dist/types-ts4.5/services/getAvailableJiraSites.d.ts +6 -0
  189. package/dist/types-ts4.5/services/makeGetJqlAutocompleteData.d.ts +6 -0
  190. package/dist/types-ts4.5/services/makeGetJqlSuggestionsData.d.ts +5 -0
  191. package/dist/types-ts4.5/ui/issue-like-table/column-picker/index.d.ts +3 -0
  192. package/dist/types-ts4.5/ui/issue-like-table/column-picker/types.d.ts +6 -0
  193. package/dist/types-ts4.5/ui/issue-like-table/draggable-table-heading.d.ts +12 -0
  194. package/dist/types-ts4.5/ui/issue-like-table/empty-state/index.d.ts +6 -0
  195. package/dist/types-ts4.5/ui/issue-like-table/empty-state/priority.d.ts +6 -0
  196. package/dist/types-ts4.5/ui/issue-like-table/empty-state/type.d.ts +6 -0
  197. package/dist/types-ts4.5/ui/issue-like-table/empty-state/types.d.ts +2 -0
  198. package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +15 -0
  199. package/dist/types-ts4.5/ui/issue-like-table/render-type/boolean/index.d.ts +8 -0
  200. package/dist/types-ts4.5/ui/issue-like-table/render-type/boolean/messages.d.ts +12 -0
  201. package/dist/types-ts4.5/ui/issue-like-table/render-type/date-time/index.d.ts +10 -0
  202. package/dist/types-ts4.5/ui/issue-like-table/render-type/icon/index.d.ts +8 -0
  203. package/dist/types-ts4.5/ui/issue-like-table/render-type/index.d.ts +2 -0
  204. package/dist/types-ts4.5/ui/issue-like-table/render-type/link/index.d.ts +8 -0
  205. package/dist/types-ts4.5/ui/issue-like-table/render-type/number/index.d.ts +8 -0
  206. package/dist/types-ts4.5/ui/issue-like-table/render-type/status/index.d.ts +8 -0
  207. package/dist/types-ts4.5/ui/issue-like-table/render-type/tag/index.d.ts +9 -0
  208. package/dist/types-ts4.5/ui/issue-like-table/render-type/text/index.d.ts +8 -0
  209. package/dist/types-ts4.5/ui/issue-like-table/render-type/user/index.d.ts +11 -0
  210. package/dist/types-ts4.5/ui/issue-like-table/render-type/user/messages.d.ts +7 -0
  211. package/dist/types-ts4.5/ui/issue-like-table/styled.d.ts +5 -0
  212. package/dist/types-ts4.5/ui/issue-like-table/types.d.ts +38 -0
  213. package/dist/types-ts4.5/ui/issue-like-table/useIsOnScreen.d.ts +1 -0
  214. package/dist/types-ts4.5/ui/jira-issues/modal/basic-search-input/index.d.ts +12 -0
  215. package/dist/types-ts4.5/ui/jira-issues/modal/basic-search-input/messages.d.ts +7 -0
  216. package/dist/types-ts4.5/ui/jira-issues/modal/index.d.ts +13 -0
  217. package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/buildJQL.d.ts +7 -0
  218. package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/index.d.ts +7 -0
  219. package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/messages.d.ts +7 -0
  220. package/dist/types-ts4.5/ui/jira-issues/modal/jql-editor/index.d.ts +8 -0
  221. package/dist/types-ts4.5/ui/jira-issues/modal/messages.d.ts +37 -0
  222. package/dist/types-ts4.5/ui/jira-issues/modal/mode-switcher/index.d.ts +12 -0
  223. package/dist/types-ts4.5/ui/jira-issues/modal/site-selector/index.d.ts +10 -0
  224. package/dist/types-ts4.5/ui/jira-issues/modal/site-selector/messages.d.ts +12 -0
  225. package/dist/types-ts4.5/ui/jira-issues/table-footer/index.d.ts +7 -0
  226. package/dist/types-ts4.5/ui/jira-issues/table-footer/messages.d.ts +17 -0
  227. package/dist/types-ts4.5/ui/jira-issues/table-footer/sync-info/index.d.ts +4 -0
  228. package/dist/types-ts4.5/ui/jira-issues/table-footer/sync-info/messages.d.ts +12 -0
  229. package/dist/types-ts4.5/ui/jira-issues/tableView.d.ts +3 -0
  230. package/dist/types-ts4.5/ui/jira-issues/types.d.ts +14 -0
  231. package/examples-helpers/buildIssueLikeTable.tsx +88 -0
  232. package/examples-helpers/buildJiraIssuesTable.tsx +31 -0
  233. package/examples-helpers/images.json +4 -0
  234. package/examples-helpers/mockAutocompleteData.ts +54 -0
  235. package/examples-helpers/mockJiraAvailableSites.ts +27 -0
  236. package/examples-helpers/mockJiraData.ts +546 -0
  237. package/examples-helpers/mockJqlSmartLinkData.ts +72 -0
  238. package/examples-helpers/mockSmartLinkData.ts +67 -0
  239. package/examples-helpers/mockSuggestionData.ts +17 -0
  240. package/examples-helpers/setupDatasourcesMocks.ts +199 -0
  241. package/examples-helpers/setupModalExampleMocks.ts +32 -0
  242. package/examples-helpers/smartLinkCustomClient.ts +26 -0
  243. package/package.json +118 -0
  244. package/report.api.md +98 -0
  245. package/tmp/api-report-tmp.d.ts +64 -0
@@ -0,0 +1,25 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useEffect, useMemo, useState } from 'react';
3
+
4
+ // Hook which tracks if a ref is visible or not. Taken from: https://stackoverflow.com/a/65008608
5
+ export var useIsOnScreen = function useIsOnScreen(el) {
6
+ var _useState = useState(false),
7
+ _useState2 = _slicedToArray(_useState, 2),
8
+ isIntersecting = _useState2[0],
9
+ setIntersecting = _useState2[1];
10
+ var observer = useMemo(function () {
11
+ return new IntersectionObserver(function (_ref) {
12
+ var _ref2 = _slicedToArray(_ref, 1),
13
+ entry = _ref2[0];
14
+ return setIntersecting(entry.isIntersecting);
15
+ });
16
+ }, []);
17
+ useEffect(function () {
18
+ el && observer.observe(el);
19
+ return function () {
20
+ setIntersecting(false);
21
+ return observer.disconnect();
22
+ };
23
+ }, [observer, el]);
24
+ return isIntersecting;
25
+ };
@@ -0,0 +1,43 @@
1
+ /** @jsx jsx */
2
+ import { css, jsx } from '@emotion/react';
3
+ import { useIntl } from 'react-intl-next';
4
+ import { LoadingButton } from '@atlaskit/button';
5
+ import SearchIcon from '@atlaskit/icon/glyph/editor/search';
6
+ import Textfield from '@atlaskit/textfield';
7
+ import { basicSearchInputMessages } from './messages';
8
+ var searchButtonStyles = css({
9
+ marginRight: "var(--ds-space-075, 6px)"
10
+ });
11
+ export var BasicSearchInput = function BasicSearchInput(_ref) {
12
+ var isDisabled = _ref.isDisabled,
13
+ isSearching = _ref.isSearching,
14
+ onChange = _ref.onChange,
15
+ onSearch = _ref.onSearch,
16
+ searchTerm = _ref.searchTerm,
17
+ _ref$testId = _ref.testId,
18
+ testId = _ref$testId === void 0 ? 'jira-jql-datasource-modal--basic-search-input' : _ref$testId;
19
+ var _useIntl = useIntl(),
20
+ formatMessage = _useIntl.formatMessage;
21
+ return jsx(Textfield, {
22
+ elemAfterInput: jsx(LoadingButton, {
23
+ appearance: "primary",
24
+ css: searchButtonStyles,
25
+ iconBefore: jsx(SearchIcon, {
26
+ label: formatMessage(basicSearchInputMessages.basicTextSearchLabel),
27
+ size: "medium"
28
+ }),
29
+ isDisabled: isDisabled,
30
+ isLoading: isSearching,
31
+ onClick: function onClick() {
32
+ return onSearch(searchTerm);
33
+ },
34
+ spacing: "none",
35
+ testId: "jira-jql-datasource-modal--basic-search-button"
36
+ }),
37
+ autoFocus: true,
38
+ onChange: onChange,
39
+ placeholder: formatMessage(basicSearchInputMessages.basicTextSearchLabel),
40
+ testId: testId,
41
+ value: searchTerm
42
+ });
43
+ };
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var basicSearchInputMessages = defineMessages({
3
+ basicTextSearchLabel: {
4
+ id: 'linkDataSource.jira-issues.configmodal.basicTextSearchPlaceholder',
5
+ description: 'Placeholder text for the search input box',
6
+ defaultMessage: 'Search'
7
+ }
8
+ });
@@ -0,0 +1,255 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ /** @jsx jsx */
6
+ import { useCallback, useEffect, useMemo, useState } from 'react';
7
+ import { css, jsx } from '@emotion/react';
8
+ import { FormattedMessage, IntlProvider, useIntl } from 'react-intl-next';
9
+ import Button from '@atlaskit/button/standard-button';
10
+ import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
11
+ import { B400, N0 } from '@atlaskit/theme/colors';
12
+ import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
13
+ import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
14
+ import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
15
+ import LinkRenderType from '../../issue-like-table/render-type/link';
16
+ import { JiraSearchContainer } from './jira-search-container';
17
+ import { modalMessages } from './messages';
18
+ import { ModeSwitcher } from './mode-switcher';
19
+ import { JiraSiteSelector } from './site-selector';
20
+ var dropdownContainerStyles = css({
21
+ display: 'flex',
22
+ gap: "var(--ds-space-100, 0.5rem)"
23
+ });
24
+ var contentContainerStyles = css({
25
+ height: '420px',
26
+ overflow: 'auto'
27
+ });
28
+ var placeholderSmartLinkStyles = css({
29
+ backgroundColor: "var(--ds-surface-raised, ".concat(N0, ")"),
30
+ borderRadius: '3px',
31
+ boxShadow: '0px 1px 1px rgba(9, 30, 66, 0.25), 0px 0px 1px rgba(9, 30, 66, 0.31)',
32
+ color: "var(--ds-text-brand, ".concat(B400, ")"),
33
+ padding: '0px 2px'
34
+ });
35
+ export var JiraIssuesConfigModal = function JiraIssuesConfigModal(props) {
36
+ var _useState = useState([]),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ availableSites = _useState2[0],
39
+ setAvailableSites = _useState2[1];
40
+ var _useState3 = useState('issue'),
41
+ _useState4 = _slicedToArray(_useState3, 2),
42
+ currentViewMode = _useState4[0],
43
+ setCurrentViewMode = _useState4[1];
44
+ var datasourceId = props.datasourceId,
45
+ parameters = props.parameters,
46
+ visibleColumnKeys = props.visibleColumnKeys,
47
+ onCancel = props.onCancel,
48
+ onInsert = props.onInsert,
49
+ onUpdateParameters = props.onUpdateParameters,
50
+ onVisibleColumnKeysChange = props.onVisibleColumnKeysChange;
51
+ var isParametersSet = !!(parameters && parameters.value && parameters.cloudId);
52
+ var _ref = parameters || {},
53
+ cloudId = _ref.cloudId,
54
+ jql = _ref.value;
55
+ var _useDatasourceTableSt = useDatasourceTableState(datasourceId, parameters, ['key']),
56
+ reset = _useDatasourceTableSt.reset,
57
+ status = _useDatasourceTableSt.status,
58
+ onNextPage = _useDatasourceTableSt.onNextPage,
59
+ responseItems = _useDatasourceTableSt.responseItems,
60
+ hasNextPage = _useDatasourceTableSt.hasNextPage,
61
+ columns = _useDatasourceTableSt.columns,
62
+ defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys;
63
+ var _useIntl = useIntl(),
64
+ formatMessage = _useIntl.formatMessage;
65
+ useEffect(function () {
66
+ var fetchSiteDisplayNames = /*#__PURE__*/function () {
67
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
68
+ var jiraSites;
69
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
70
+ while (1) switch (_context.prev = _context.next) {
71
+ case 0:
72
+ _context.next = 2;
73
+ return getAvailableJiraSites();
74
+ case 2:
75
+ jiraSites = _context.sent;
76
+ setAvailableSites(jiraSites);
77
+ case 4:
78
+ case "end":
79
+ return _context.stop();
80
+ }
81
+ }, _callee);
82
+ }));
83
+ return function fetchSiteDisplayNames() {
84
+ return _ref2.apply(this, arguments);
85
+ };
86
+ }();
87
+ void fetchSiteDisplayNames();
88
+ }, []);
89
+ var onSearch = useCallback(function (parameters) {
90
+ onUpdateParameters(parameters);
91
+ reset();
92
+ }, [reset, onUpdateParameters]);
93
+ var onSiteSelection = useCallback(function (site) {
94
+ onUpdateParameters({
95
+ cloudId: site.cloudId
96
+ });
97
+ reset();
98
+ }, [reset, onUpdateParameters]);
99
+ var selectedJiraSite = useMemo(function () {
100
+ return availableSites.find(function (jiraSite) {
101
+ return jiraSite.cloudId === cloudId;
102
+ }) || availableSites[0];
103
+ }, [availableSites, cloudId]);
104
+ useEffect(function () {
105
+ if (!cloudId && selectedJiraSite) {
106
+ onUpdateParameters({
107
+ cloudId: selectedJiraSite.cloudId
108
+ });
109
+ }
110
+ }, [cloudId, onUpdateParameters, selectedJiraSite]);
111
+ useEffect(function () {
112
+ if ((visibleColumnKeys || []).length === 0 && defaultVisibleColumnKeys.length > 0) {
113
+ onVisibleColumnKeysChange(defaultVisibleColumnKeys);
114
+ }
115
+ }, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
116
+ var retrieveUrlForSmartCardRender = useCallback(function () {
117
+ var _data$key;
118
+ var _responseItems = _slicedToArray(responseItems, 1),
119
+ data = _responseItems[0];
120
+ // agrement with BE that we will use `key` for rendering smartlink
121
+ return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : _data$key.url;
122
+ }, [responseItems]);
123
+ var onInsertPressed = useCallback(function () {
124
+ if (!isParametersSet || !jql || !selectedJiraSite) {
125
+ return;
126
+ }
127
+ var firstIssueUrl = retrieveUrlForSmartCardRender();
128
+ if (currentViewMode === 'count') {
129
+ onInsert({
130
+ type: 'inlineCard',
131
+ attrs: {
132
+ url: "".concat(selectedJiraSite.url, "/issues/").concat(encodeURI(jql))
133
+ }
134
+ });
135
+ } else if (responseItems.length === 1 && firstIssueUrl) {
136
+ onInsert({
137
+ type: 'inlineCard',
138
+ attrs: {
139
+ url: firstIssueUrl
140
+ }
141
+ });
142
+ } else {
143
+ onInsert({
144
+ type: 'blockCard',
145
+ attrs: {
146
+ datasource: {
147
+ id: datasourceId,
148
+ parameters: {
149
+ cloudId: cloudId,
150
+ jql: jql // TODO support non JQL type
151
+ },
152
+
153
+ views: [{
154
+ type: 'table',
155
+ properties: {
156
+ columnKeys: visibleColumnKeys
157
+ }
158
+ }]
159
+ }
160
+ }
161
+ });
162
+ }
163
+ }, [isParametersSet, jql, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
164
+ var handleViewModeChange = function handleViewModeChange(selectedMode) {
165
+ setCurrentViewMode(selectedMode);
166
+ };
167
+ useEffect(function () {
168
+ if (status === 'empty' && isParametersSet) {
169
+ void onNextPage();
170
+ }
171
+ }, [status, isParametersSet, onNextPage, reset]);
172
+ var issueLikeDataTableView = useMemo(function () {
173
+ return jsx(IssueLikeDataTableView, {
174
+ testId: "jira-jql-datasource-table",
175
+ status: status,
176
+ columns: columns,
177
+ items: responseItems,
178
+ hasNextPage: hasNextPage,
179
+ visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
180
+ onNextPage: onNextPage,
181
+ onVisibleColumnKeysChange: onVisibleColumnKeysChange
182
+ });
183
+ }, [columns, defaultVisibleColumnKeys, hasNextPage, onNextPage, onVisibleColumnKeysChange, responseItems, status, visibleColumnKeys]);
184
+ var renderCountModeContent = useCallback(function () {
185
+ var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
186
+ if (status === 'empty' || !jql || !url) {
187
+ return jsx("span", {
188
+ "data-testid": "jira-jql-datasource-modal--smart-card-placeholder",
189
+ css: placeholderSmartLinkStyles
190
+ }, jsx(FormattedMessage, modalMessages.issuesCountSmartCardPlaceholderText));
191
+ } else {
192
+ var urlWithEncodedJql = "".concat(url, "/issues/?jql=").concat(encodeURI(jql));
193
+ return jsx(LinkRenderType, {
194
+ url: urlWithEncodedJql
195
+ });
196
+ }
197
+ }, [jql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status]);
198
+ var renderIssuesModeContent = useCallback(function () {
199
+ if (status === 'empty' || columns.length === 0) {
200
+ return jsx(EmptyState, {
201
+ testId: "jira-jql-datasource-modal--empty-state"
202
+ });
203
+ }
204
+ var firstIssueUrl = retrieveUrlForSmartCardRender();
205
+ if (responseItems.length === 1 && firstIssueUrl) {
206
+ return jsx(LinkRenderType, {
207
+ url: firstIssueUrl
208
+ });
209
+ }
210
+ return issueLikeDataTableView;
211
+ }, [columns.length, issueLikeDataTableView, responseItems.length, retrieveUrlForSmartCardRender, status]);
212
+ return jsx(IntlProvider, {
213
+ locale: "en"
214
+ }, jsx(ModalTransition, null, jsx(Modal, {
215
+ testId: 'jira-jql-datasource-modal',
216
+ onClose: onCancel,
217
+ width: "x-large",
218
+ shouldScrollInViewport: true
219
+ }, jsx(ModalHeader, null, jsx(ModalTitle, null, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx("div", {
220
+ css: dropdownContainerStyles
221
+ }, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesTitleManySites, {
222
+ values: {
223
+ siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
224
+ }
225
+ })), jsx(JiraSiteSelector, {
226
+ testId: "jira-jql-datasource-modal--site-selector",
227
+ availableSites: availableSites,
228
+ onSiteSelection: onSiteSelection,
229
+ selectedJiraSite: selectedJiraSite
230
+ }))), jsx(ModeSwitcher, {
231
+ isCompact: true,
232
+ options: [{
233
+ label: formatMessage(modalMessages.issueViewModeLabel),
234
+ value: 'issue'
235
+ }, {
236
+ label: formatMessage(modalMessages.countViewModeLabel),
237
+ value: 'count'
238
+ }],
239
+ onOptionValueChange: handleViewModeChange,
240
+ selectedOptionValue: currentViewMode
241
+ })), jsx(ModalBody, null, jsx(JiraSearchContainer, {
242
+ parameters: parameters,
243
+ onSearch: onSearch
244
+ }), jsx("div", {
245
+ css: contentContainerStyles
246
+ }, currentViewMode === 'count' ? renderCountModeContent() : renderIssuesModeContent())), jsx(ModalFooter, null, jsx(Button, {
247
+ appearance: "default",
248
+ onClick: onCancel
249
+ }, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
250
+ appearance: "primary",
251
+ onClick: onInsertPressed,
252
+ isDisabled: !isParametersSet,
253
+ testId: 'jira-jql-datasource-modal--insert-button'
254
+ }, jsx(FormattedMessage, modalMessages.insertIssuesButtonText))))));
255
+ };
@@ -0,0 +1,20 @@
1
+ var fuzzySearchRegExp = /^"(.+)"$/;
2
+ var jiraIssueKeyRegExp = /[A-Z]+-\d+/;
3
+ export var buildJQL = function buildJQL(input) {
4
+ var rawSearch = input.rawSearch,
5
+ _input$orderDirection = input.orderDirection,
6
+ orderDirection = _input$orderDirection === void 0 ? 'DESC' : _input$orderDirection,
7
+ _input$orderKey = input.orderKey,
8
+ orderKey = _input$orderKey === void 0 ? 'created' : _input$orderKey;
9
+ var fuzzy = !rawSearch.match(fuzzySearchRegExp) ? '*' : '';
10
+ var basicSearch = rawSearch.replace(/['"?*]+/g, '');
11
+ var baseQueryParts = rawSearch.trim() ? ["text ~ \"".concat(basicSearch).concat(fuzzy, "\""), "summary ~ \"".concat(basicSearch).concat(fuzzy, "\"")] : [];
12
+ if (jiraIssueKeyRegExp.test(rawSearch)) {
13
+ baseQueryParts.push("key = \"".concat(basicSearch, "\""));
14
+ }
15
+ var baseQueryContent = baseQueryParts.join(' OR ');
16
+ var baseQuery = baseQueryContent ? "(".concat(baseQueryContent, ")") : '';
17
+ var limiter = rawSearch !== null && rawSearch !== void 0 && rawSearch.trim() ? '' : "created >= -30d";
18
+ var query = [baseQuery, limiter].filter(Boolean).join(' AND ');
19
+ return "".concat(query, " order by ").concat(orderKey, " ").concat(orderDirection.toUpperCase());
20
+ };
@@ -0,0 +1,104 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ /** @jsx jsx */
3
+ import React, { useState } from 'react';
4
+ import { css, jsx } from '@emotion/react';
5
+ import { useIntl } from 'react-intl-next';
6
+ import { BasicSearchInput } from '../basic-search-input';
7
+ import { JiraJQLEditor } from '../jql-editor';
8
+ import { ModeSwitcher } from '../mode-switcher';
9
+ import { buildJQL } from './buildJQL';
10
+ import { modeSwitcherMessages } from './messages';
11
+ var inputContainerStyles = css({
12
+ alignItems: 'baseline',
13
+ display: 'flex',
14
+ gap: "var(--ds-space-250, 20px)",
15
+ minHeight: '60px'
16
+ });
17
+ export var JiraSearchContainer = function JiraSearchContainer(props) {
18
+ var parameters = props.parameters,
19
+ onSearch = props.onSearch;
20
+ var _ref = parameters || {},
21
+ cloudId = _ref.cloudId,
22
+ initialJql = _ref.value;
23
+ var _useIntl = useIntl(),
24
+ formatMessage = _useIntl.formatMessage;
25
+ var basicModeValue = 'basic';
26
+ var jqlModeValue = 'jql';
27
+ var _useState = useState(''),
28
+ _useState2 = _slicedToArray(_useState, 2),
29
+ basicSearchTerm = _useState2[0],
30
+ setBasicSearchTerm = _useState2[1];
31
+ var _useState3 = useState(initialJql ? jqlModeValue : basicModeValue),
32
+ _useState4 = _slicedToArray(_useState3, 2),
33
+ currentSearchMode = _useState4[0],
34
+ setCurrentSearchMode = _useState4[1];
35
+ var _useState5 = useState(initialJql || ''),
36
+ _useState6 = _slicedToArray(_useState5, 2),
37
+ jql = _useState6[0],
38
+ setJql = _useState6[1];
39
+ var _useState7 = useState(),
40
+ _useState8 = _slicedToArray(_useState7, 2),
41
+ orderKey = _useState8[0],
42
+ setOrderKey = _useState8[1];
43
+ var _useState9 = useState(),
44
+ _useState10 = _slicedToArray(_useState9, 2),
45
+ orderDirection = _useState10[0],
46
+ setOrderDirection = _useState10[1];
47
+ var onSearchModeChange = function onSearchModeChange(searchMode) {
48
+ setCurrentSearchMode(searchMode);
49
+ };
50
+ var handleBasicSearchChange = function handleBasicSearchChange(e) {
51
+ var rawSearch = e.currentTarget.value;
52
+ setBasicSearchTerm(rawSearch);
53
+ setJql(buildJQL({
54
+ rawSearch: rawSearch,
55
+ orderDirection: orderDirection,
56
+ orderKey: orderKey
57
+ }));
58
+ };
59
+ var onQueryChange = function onQueryChange(query) {
60
+ var _query$split$map$filt, _fragments$at, _fragments$at2, _fragments$at3;
61
+ // determine if order keys have been set so they can be saved and persisted when changes occur in basic search
62
+ var fragments = (_query$split$map$filt = query === null || query === void 0 ? void 0 : query.split(/(^| )(order by)( |$)/i).map(function (item) {
63
+ return item.trim();
64
+ }).filter(Boolean)) !== null && _query$split$map$filt !== void 0 ? _query$split$map$filt : [];
65
+ var hasOrder = ((_fragments$at = fragments.at(-2)) === null || _fragments$at === void 0 ? void 0 : _fragments$at.toLowerCase()) === 'order by';
66
+ var key = hasOrder ? (_fragments$at2 = fragments.at(-1)) === null || _fragments$at2 === void 0 ? void 0 : _fragments$at2.split(' ').at(-2) : undefined;
67
+ var order = hasOrder ? (_fragments$at3 = fragments.at(-1)) === null || _fragments$at3 === void 0 ? void 0 : _fragments$at3.split(' ').at(-1) : undefined;
68
+
69
+ // TODO: confirm if these are the only order keys we want to preserve - existing whiteboard logic
70
+ if (key && ['key', 'summary', 'assignee', 'status'].includes(key)) {
71
+ setOrderKey(key);
72
+ setOrderDirection(order);
73
+ }
74
+ setJql(query);
75
+ };
76
+ var handleSearch = function handleSearch() {
77
+ onSearch({
78
+ value: jql,
79
+ type: 'jql'
80
+ });
81
+ };
82
+ return jsx("div", {
83
+ css: inputContainerStyles
84
+ }, currentSearchMode === basicModeValue && jsx(BasicSearchInput, {
85
+ onChange: handleBasicSearchChange,
86
+ onSearch: handleSearch,
87
+ searchTerm: basicSearchTerm
88
+ }), currentSearchMode === jqlModeValue && jsx(JiraJQLEditor, {
89
+ cloudId: cloudId || '',
90
+ onChange: onQueryChange,
91
+ onSearch: handleSearch,
92
+ query: jql
93
+ }), jsx(ModeSwitcher, {
94
+ onOptionValueChange: onSearchModeChange,
95
+ selectedOptionValue: currentSearchMode,
96
+ options: [{
97
+ label: formatMessage(modeSwitcherMessages.basicTextSearchLabel),
98
+ value: basicModeValue
99
+ }, {
100
+ label: 'JQL',
101
+ value: jqlModeValue
102
+ }]
103
+ }));
104
+ };
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var modeSwitcherMessages = defineMessages({
3
+ basicTextSearchLabel: {
4
+ id: 'linkDataSource.jira-issues.configmodal.basicModeText',
5
+ description: 'Display text for basic text search toggle button',
6
+ defaultMessage: 'Basic'
7
+ }
8
+ });
@@ -0,0 +1,31 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import { JQLEditor } from '@atlassianlabs/jql-editor';
3
+ import { useAutocompleteProvider } from '@atlassianlabs/jql-editor-autocomplete-rest';
4
+ import { makeGetJqlAutocompleteData } from '../../../../services/makeGetJqlAutocompleteData';
5
+ import { makeGetJqlSuggestionsData } from '../../../../services/makeGetJqlSuggestionsData';
6
+ export var JiraJQLEditor = function JiraJQLEditor(props) {
7
+ var cloudId = props.cloudId,
8
+ onChange = props.onChange,
9
+ onSearch = props.onSearch,
10
+ query = props.query;
11
+ var autocompleteProvider = useAutocompleteProvider('link-datasource', makeGetJqlAutocompleteData(cloudId), makeGetJqlSuggestionsData(cloudId));
12
+
13
+ // This is an expected (pretty strange imo) way of making sure text field is in focus when rendered
14
+ var inputRef = useRef({
15
+ focus: function focus() {}
16
+ });
17
+ useEffect(function () {
18
+ requestAnimationFrame(function () {
19
+ var _inputRef$current;
20
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
21
+ });
22
+ }, []);
23
+ return /*#__PURE__*/React.createElement(JQLEditor, {
24
+ analyticsSource: "link-datasource",
25
+ autocompleteProvider: autocompleteProvider,
26
+ onSearch: onSearch,
27
+ onUpdate: onChange,
28
+ inputRef: inputRef,
29
+ query: query
30
+ });
31
+ };
@@ -0,0 +1,38 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var modalMessages = defineMessages({
3
+ cancelButtonText: {
4
+ id: 'linkDataSource.jira-issues.configmodal.cancelButtonText',
5
+ description: 'Button text to close the modal with no changes being made',
6
+ defaultMessage: 'Cancel'
7
+ },
8
+ insertIssuesButtonText: {
9
+ id: 'linkDataSource.jira-issues.configmodal.insertIssuesButtonText',
10
+ description: 'Button text to insert the displayed content',
11
+ defaultMessage: 'Insert issues'
12
+ },
13
+ insertIssuesTitle: {
14
+ id: 'linkDataSource.jira-issues.configmodal.insertIssuesTitle',
15
+ description: 'Title for the Jira Issues Datasource config modal',
16
+ defaultMessage: 'Insert Jira issues'
17
+ },
18
+ insertIssuesTitleManySites: {
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}'
22
+ },
23
+ issueViewModeLabel: {
24
+ id: 'linkDataSource.jira-issues.configmodal.issueViewModeLabel',
25
+ description: 'Label for toggle to enable a view mode showing issues in a table list view',
26
+ defaultMessage: 'Issue view'
27
+ },
28
+ countViewModeLabel: {
29
+ id: 'linkDataSource.jira-issues.configmodal.countViewModeLabel',
30
+ description: 'Label for toggle to enable a view mode showing issues in as a total count',
31
+ defaultMessage: 'Count view'
32
+ },
33
+ issuesCountSmartCardPlaceholderText: {
34
+ id: 'linkDataSource.jira-issues.configmodal.issues',
35
+ description: 'Placeholder text that will be placed next to a count of jira issues',
36
+ defaultMessage: '### Issues'
37
+ }
38
+ });
@@ -0,0 +1,88 @@
1
+ /** @jsx jsx */
2
+ import React from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
+ import { N0, N20, N30A, N700 } from '@atlaskit/theme/colors';
5
+ var modeSwitcherStyles = css({
6
+ alignItems: 'center',
7
+ background: "var(--ds-background-neutral, ".concat(N20, ")"),
8
+ borderRadius: "var(--ds-space-050, 4px)",
9
+ boxSizing: 'border-box',
10
+ display: 'inline-flex',
11
+ gap: "var(--ds-space-050, 4px)",
12
+ lineHeight: "var(--ds-space-200, 16px)",
13
+ padding: "var(--ds-space-075, 6px)",
14
+ '&:disabled': {
15
+ opacity: '0.5'
16
+ }
17
+ });
18
+ var compactModeSwitcherStyles = css({
19
+ padding: "var(--ds-space-050, 4px)",
20
+ gap: "var(--ds-space-025, 2px)"
21
+ });
22
+ var modeInputStyles = css({
23
+ display: 'none'
24
+ });
25
+ var modeSwitcherLabelStyles = css({
26
+ color: "var(--ds-text-subtlest, ".concat(N700, ")"),
27
+ fontSize: "var(--ds-space-150, 12px)",
28
+ fontWeight: '600',
29
+ textTransform: 'uppercase',
30
+ padding: "var(--ds-space-050, 4px)",
31
+ borderRadius: "var(--ds-space-050, 4px)",
32
+ ':hover': {
33
+ cursor: 'pointer',
34
+ backgroundColor: "var(--ds-background-neutral-subtle-hovered, ".concat(N30A, ")")
35
+ }
36
+ });
37
+ var modeSwitcherLabelSelectedStyles = css({
38
+ backgroundColor: "var(--ds-background-input-pressed, ".concat(N0, ")"),
39
+ borderRadius: "var(--ds-space-050, 4px)",
40
+ boxShadow: "var(--ds-shadow-overflow, 0px 0px 1px rgba(9, 30, 66, 0.12), 0px 0px 8px rgba(9, 30, 66, 0.16))",
41
+ ':hover': {
42
+ cursor: 'pointer',
43
+ backgroundColor: "var(--ds-background-input-pressed, ".concat(N0, ")")
44
+ }
45
+ });
46
+ var modeSwitcherLabelDisabledStyles = css({
47
+ ':hover': {
48
+ cursor: 'not-allowed'
49
+ }
50
+ });
51
+ var compactModeSwitcherLabelStyles = css({
52
+ padding: "var(--ds-space-025, 2px)".concat(" ", "var(--ds-space-050, 4px)")
53
+ });
54
+ export var ModeSwitcher = function ModeSwitcher(props) {
55
+ var _options$;
56
+ var isCompact = props.isCompact,
57
+ isDisabled = props.isDisabled,
58
+ onOptionValueChange = props.onOptionValueChange,
59
+ options = props.options,
60
+ _props$selectedOption = props.selectedOptionValue,
61
+ selectedOptionValue = _props$selectedOption === void 0 ? (_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.value : _props$selectedOption;
62
+ var handleModeChange = function handleModeChange(event) {
63
+ onOptionValueChange(event.currentTarget.value);
64
+ };
65
+ return options.length > 0 ? jsx("fieldset", {
66
+ css: [modeSwitcherStyles, isCompact && compactModeSwitcherStyles],
67
+ "data-testid": "mode-toggle-container",
68
+ disabled: isDisabled
69
+ }, options.map(function (_ref) {
70
+ var value = _ref.value,
71
+ label = _ref.label;
72
+ var isSelected = value === selectedOptionValue;
73
+ return jsx("label", {
74
+ key: value,
75
+ css: [modeSwitcherLabelStyles, isCompact && compactModeSwitcherLabelStyles, isSelected && modeSwitcherLabelSelectedStyles, isDisabled && modeSwitcherLabelDisabledStyles],
76
+ "data-testid": "mode-toggle-".concat(value)
77
+ }, label, jsx("input", {
78
+ "aria-checked": isSelected,
79
+ "aria-disabled": isDisabled,
80
+ checked: isSelected,
81
+ css: modeInputStyles,
82
+ disabled: isDisabled,
83
+ onChange: handleModeChange,
84
+ type: "radio",
85
+ value: value
86
+ }));
87
+ })) : null;
88
+ };
@@ -0,0 +1,44 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["triggerRef"];
4
+ /** @jsx jsx */
5
+ import { jsx } from '@emotion/react';
6
+ import { useIntl } from 'react-intl-next';
7
+ import Button from '@atlaskit/button/standard-button';
8
+ import DropdownMenu, { DropdownItem, DropdownItemGroup } from '@atlaskit/dropdown-menu';
9
+ import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
10
+ import { siteSelectorMessages } from './messages';
11
+ export var JiraSiteSelector = function JiraSiteSelector(props) {
12
+ var availableSites = props.availableSites,
13
+ onSiteSelection = props.onSiteSelection,
14
+ selectedJiraSite = props.selectedJiraSite,
15
+ testId = props.testId;
16
+ var intl = useIntl();
17
+ return jsx(DropdownMenu, {
18
+ spacing: "compact",
19
+ testId: testId,
20
+ trigger: function trigger(_ref) {
21
+ var triggerRef = _ref.triggerRef,
22
+ props = _objectWithoutProperties(_ref, _excluded);
23
+ return jsx(Button, _extends({}, props, {
24
+ spacing: "none",
25
+ iconBefore: jsx(ChevronDownIcon, {
26
+ label: intl.formatMessage(siteSelectorMessages.dropdownChevronLabel)
27
+ }),
28
+ ref: triggerRef
29
+ }));
30
+ }
31
+ }, jsx(DropdownItemGroup, null, availableSites.map(function (availableSite) {
32
+ var displayName = availableSite.displayName,
33
+ cloudId = availableSite.cloudId;
34
+ var isSelected = displayName === (selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName);
35
+ return jsx(DropdownItem, {
36
+ isSelected: isSelected,
37
+ key: cloudId,
38
+ onClick: function onClick() {
39
+ return onSiteSelection(availableSite);
40
+ },
41
+ testId: testId && "".concat(testId, "--dropdown-item").concat(isSelected ? '__selected' : '')
42
+ }, displayName);
43
+ })));
44
+ };