@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,77 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /** @jsx jsx */
3
+ import { useCallback, useMemo } from 'react';
4
+ import { jsx } from '@emotion/react';
5
+ import Button from '@atlaskit/button/standard-button';
6
+ import BoardIcon from '@atlaskit/icon/glyph/board';
7
+ import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
8
+ import { CheckboxOption, PopupSelect } from '@atlaskit/select';
9
+ export const ColumnPicker = ({
10
+ columns,
11
+ selectedColumnKeys,
12
+ onSelectedColumnKeysChange
13
+ }) => {
14
+ const mapColumnToOption = useCallback(({
15
+ key,
16
+ title
17
+ }) => ({
18
+ label: title,
19
+ value: key
20
+ }), []);
21
+ const selectedOptions = columns.filter(({
22
+ key
23
+ }) => selectedColumnKeys.includes(key)).map(mapColumnToOption);
24
+ const allOptions = useMemo(() => {
25
+ return columns.filter(({
26
+ title,
27
+ key
28
+ }) => title).map(mapColumnToOption);
29
+ }, [columns, mapColumnToOption]);
30
+ const handleChange = useCallback(selectedOptions => {
31
+ const selectedValues = selectedOptions.map(({
32
+ value
33
+ }) => value);
34
+ selectedValues.sort((a, b) => {
35
+ const indexB = columns.findIndex(({
36
+ key
37
+ }) => key === b);
38
+ const indexA = columns.findIndex(({
39
+ key
40
+ }) => key === a);
41
+ return indexA - indexB;
42
+ });
43
+ onSelectedColumnKeysChange(selectedValues);
44
+ }, [columns, onSelectedColumnKeysChange]);
45
+ return jsx(PopupSelect, {
46
+ classNamePrefix: 'column-picker-popup',
47
+ testId: 'column-picker-popup',
48
+ components: {
49
+ Option: CheckboxOption
50
+ },
51
+ options: allOptions,
52
+ value: selectedOptions,
53
+ closeMenuOnSelect: false,
54
+ hideSelectedOptions: false,
55
+ isMulti: true,
56
+ placeholder: "Search for fields" // TODO Translate
57
+ ,
58
+ "aria-label": "Search for fields",
59
+ onChange: handleChange,
60
+ target: ({
61
+ isOpen,
62
+ ...triggerProps
63
+ }) => jsx(Button, _extends({}, triggerProps, {
64
+ isSelected: isOpen,
65
+ iconBefore: jsx("div", null, jsx(BoardIcon, {
66
+ label: "board",
67
+ size: "small"
68
+ }), jsx(ChevronDownIcon, {
69
+ label: "down",
70
+ size: "small"
71
+ })),
72
+ spacing: "compact",
73
+ appearance: "subtle",
74
+ testId: "column-picker-trigger-button"
75
+ }))
76
+ });
77
+ };
@@ -0,0 +1,166 @@
1
+ /** @jsx jsx */
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
+ import invariant from 'tiny-invariant';
5
+ import DragHandlerIcon from '@atlaskit/icon/glyph/drag-handler';
6
+ import { attachClosestEdge, extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/addon/closest-edge';
7
+ import { DropIndicator } from '@atlaskit/pragmatic-drag-and-drop-react-indicator/box';
8
+ import { draggable, dropTargetForElements, monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/element';
9
+ import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
10
+ import { TableHeading } from './styled';
11
+ const tableHeadingStyles = css({
12
+ cursor: 'grab'
13
+ });
14
+ const tableHeadingStatusStyles = {
15
+ idle: css({
16
+ ':hover': {
17
+ background: "var(--ds-surface-hovered, #091E4224)"
18
+ }
19
+ }),
20
+ dragging: css({
21
+ background: "var(--ds-background-disabled, #091E4224)",
22
+ color: "var(--ds-text-disabled, #091E424F)"
23
+ })
24
+ };
25
+ const verticallyAlignedStyles = css({
26
+ display: 'flex',
27
+ alignItems: 'center',
28
+ whiteSpace: 'nowrap'
29
+ });
30
+ const dragHandleStyles = css({
31
+ position: 'relative',
32
+ display: 'flex',
33
+ alignItems: 'center'
34
+ });
35
+ const dropTargetStyles = css({
36
+ position: 'absolute',
37
+ top: 0,
38
+ left: 0,
39
+ width: '100%'
40
+ });
41
+ const noPointerEventsStyles = css({
42
+ pointerEvents: 'none'
43
+ });
44
+ export const DraggableTableHeading = ({
45
+ children,
46
+ id,
47
+ index,
48
+ tableId,
49
+ dndPreviewHeight,
50
+ onDragPreviewStart,
51
+ onDragPreviewEnd
52
+ }) => {
53
+ const ref = useRef(null);
54
+ const [status, setStatus] = useState('idle');
55
+ const [isDraggingAnyColumn, setIsDraggingAnyColumn] = useState(false);
56
+ const [closestEdge, setClosestEdge] = useState(null);
57
+ const dropTargetRef = useRef(null);
58
+ useEffect(() => {
59
+ const cell = ref.current;
60
+ invariant(cell);
61
+ return combine(draggable({
62
+ element: cell,
63
+ getInitialData() {
64
+ return {
65
+ type: 'table-header',
66
+ id,
67
+ index,
68
+ tableId
69
+ };
70
+ },
71
+ onGenerateDragPreview() {
72
+ setStatus('preview');
73
+ onDragPreviewStart();
74
+ },
75
+ onDragStart() {
76
+ setStatus('dragging');
77
+ onDragPreviewEnd();
78
+ },
79
+ onDrop() {
80
+ setStatus('idle');
81
+ }
82
+ }));
83
+ }, [id, index, onDragPreviewEnd, onDragPreviewStart, tableId]);
84
+
85
+ // Here we handle drop target, that in our case is absolutely positioned div that covers full width and height
86
+ // of this column (has height of whole table). It sits on top of everything, but has `pointerEvents: 'none'` by default
87
+ useEffect(() => {
88
+ const dropTarget = dropTargetRef.current;
89
+ invariant(dropTarget);
90
+ return dropTargetForElements({
91
+ element: dropTarget,
92
+ getIsSticky() {
93
+ return true;
94
+ },
95
+ getData({
96
+ input,
97
+ element
98
+ }) {
99
+ const data = {
100
+ id,
101
+ index
102
+ };
103
+ return attachClosestEdge(data, {
104
+ input,
105
+ element,
106
+ allowedEdges: ['left', 'right']
107
+ });
108
+ },
109
+ canDrop(args) {
110
+ return args.source.data.type === 'table-header' && args.source.data.tableId === tableId;
111
+ },
112
+ onDrag(args) {
113
+ if (args.source.data.id !== id) {
114
+ setClosestEdge(extractClosestEdge(args.self.data));
115
+ }
116
+ },
117
+ onDragLeave() {
118
+ setClosestEdge(null);
119
+ },
120
+ onDrop() {
121
+ setClosestEdge(null);
122
+ }
123
+ });
124
+ }, [id, index, tableId]);
125
+
126
+ // During dragging anywhere we want to remove `pointerEvents: 'none'` from all the drop targets
127
+ useEffect(() => {
128
+ return monitorForElements({
129
+ canMonitor({
130
+ source
131
+ }) {
132
+ return source.data.type === 'table-header' && source.data.tableId === tableId;
133
+ },
134
+ onDragStart() {
135
+ /**
136
+ * Should cause a synchronous re-render.
137
+ */
138
+ setIsDraggingAnyColumn(true);
139
+ },
140
+ onDrop() {
141
+ setIsDraggingAnyColumn(false);
142
+ }
143
+ });
144
+ }, [tableId]);
145
+ return jsx(TableHeading, {
146
+ ref: ref,
147
+ css: [tableHeadingStyles, tableHeadingStatusStyles[status]],
148
+ "data-testid": `${id}-column-heading`
149
+ }, jsx("div", {
150
+ ref: dropTargetRef,
151
+ css: [dropTargetStyles, isDraggingAnyColumn ? null : noPointerEventsStyles],
152
+ style: {
153
+ height: `${dndPreviewHeight}px`
154
+ },
155
+ "data-testid": 'column-drop-target'
156
+ }, closestEdge && jsx(DropIndicator, {
157
+ edge: closestEdge
158
+ })), jsx("div", {
159
+ css: verticallyAlignedStyles
160
+ }, jsx("div", {
161
+ css: dragHandleStyles
162
+ }, jsx(DragHandlerIcon, {
163
+ label: `${id}-drag-icon`,
164
+ size: "medium"
165
+ })), children));
166
+ };
@@ -0,0 +1,113 @@
1
+ /** @jsx jsx */
2
+ import { useCallback } from 'react';
3
+ import { jsx } from '@emotion/react';
4
+ import { Skeleton } from '@atlaskit/linking-common';
5
+ import UserType from '../render-type/user';
6
+ import { TableHeading } from '../styled';
7
+ import Priority from './priority';
8
+ import Type from './type';
9
+ const columns = [{
10
+ key: 'type',
11
+ title: 'Type'
12
+ }, {
13
+ key: 'issue',
14
+ title: 'Key',
15
+ width: 50
16
+ }, {
17
+ key: 'summary',
18
+ title: 'Summary'
19
+ }, {
20
+ key: 'assignee',
21
+ title: 'Assignee',
22
+ width: 100
23
+ }, {
24
+ key: 'priority',
25
+ title: 'P'
26
+ }, {
27
+ key: 'status',
28
+ title: 'Status'
29
+ }, {
30
+ key: 'resolution',
31
+ title: 'Resolution'
32
+ }, {
33
+ key: 'created',
34
+ title: 'Created'
35
+ }, {
36
+ key: 'due',
37
+ title: 'Updated'
38
+ }];
39
+ const priorities = ['low', 'medium', 'high', 'medium', 'low', 'blocker', 'medium', 'blocker', 'high', 'low'];
40
+ const types = ['task', 'story', 'commit', 'epic', 'bug', 'task', 'story', 'commit', 'issue', 'epic'];
41
+ const summaryColumnWidths = [141, 208, 186, 212, 212, 151, 212, 182, 180, 147];
42
+ const statusColumnWidths = [75, 54, 66, 73, 52, 73, 55, 80, 66, 59];
43
+ const rows = new Array(10).fill(null).map((_, index) => ({
44
+ id: index,
45
+ priority: priorities[index],
46
+ type: types[index],
47
+ summaryWidth: summaryColumnWidths[index],
48
+ statusWidth: statusColumnWidths[index]
49
+ }));
50
+ export default (props => {
51
+ const renderItem = useCallback(({
52
+ key,
53
+ width
54
+ }, {
55
+ priority,
56
+ type,
57
+ summaryWidth,
58
+ statusWidth
59
+ }) => {
60
+ switch (key) {
61
+ case 'assignee':
62
+ return jsx(UserType, null, jsx(Skeleton, {
63
+ width: width,
64
+ height: 13,
65
+ borderRadius: 8
66
+ }));
67
+ case 'priority':
68
+ return jsx(Priority, {
69
+ priority: priority
70
+ });
71
+ case 'type':
72
+ return jsx(Type, {
73
+ type: type
74
+ });
75
+ case 'summary':
76
+ return jsx(Skeleton, {
77
+ appearance: "blue",
78
+ width: summaryWidth,
79
+ borderRadius: 10,
80
+ height: 13
81
+ });
82
+ case 'status':
83
+ return jsx(Skeleton, {
84
+ appearance: "blue",
85
+ width: statusWidth,
86
+ height: 16,
87
+ borderRadius: 3
88
+ });
89
+ default:
90
+ return jsx(Skeleton, {
91
+ width: width,
92
+ height: 13,
93
+ borderRadius: 8
94
+ });
95
+ }
96
+ }, []);
97
+ return jsx("table", {
98
+ "data-testid": props.testId
99
+ }, jsx("thead", null, jsx("tr", null, columns.map(({
100
+ title,
101
+ key,
102
+ width
103
+ }) => jsx(TableHeading, {
104
+ key: key,
105
+ style: {
106
+ width
107
+ }
108
+ }, title)))), jsx("tbody", null, rows.map(row => jsx("tr", {
109
+ key: row.id
110
+ }, columns.map(column => jsx("td", {
111
+ key: column.key
112
+ }, renderItem(column, row)))))));
113
+ });
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { B300, R300, Y300 } from '@atlaskit/theme/colors';
3
+ import IconType from '../render-type/icon';
4
+ // https://stackoverflow.com/questions/61099149/svg-fill-color-not-working-with-hex-colors
5
+ const replaceHashInHex = hex => hex.replace('#', '%23');
6
+ const priorityToSVGPathMap = {
7
+ low: ` <path
8
+ d="M12.5 6.1c.5-.3 1.1-.1 1.4.4.3.5.1 1.1-.3 1.3l-5 3c-.3.2-.7.2-1 0l-5-3c-.6-.2-.7-.9-.4-1.3.2-.5.9-.7 1.3-.4L8 8.8l4.5-2.7z"
9
+ fill="${replaceHashInHex(B300)}"
10
+ />`,
11
+ medium: `<path
12
+ fill="${replaceHashInHex(Y300)}"
13
+ d="M3,4h10c0.6,0,1,0.4,1,1s-0.4,1-1,1H3C2.4,6,2,5.6,2,5S2.4,4,3,4z M3,10h10c0.6,0,1,0.4,1,1s-0.4,1-1,1H3
14
+ c-0.6,0-1-0.4-1-1S2.4,10,3,10z"
15
+ />`,
16
+ high: `<path
17
+ d="M3.5 9.9c-.5.3-1.1.1-1.4-.3s-.1-1.1.4-1.4l5-3c.3-.2.7-.2 1 0l5 3c.5.3.6.9.3 1.4-.3.5-.9.6-1.4.3L8 7.2 3.5 9.9z"
18
+ fill="${replaceHashInHex(R300)}"
19
+ />`,
20
+ blocker: `<path
21
+ d="M8 15c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7zM4 7c-.6 0-1 .4-1 1s.4 1 1 1h8c.6 0 1-.4 1-1s-.4-1-1-1H4z"
22
+ fill="${replaceHashInHex(R300)}"
23
+ />`
24
+ };
25
+ export default (({
26
+ priority
27
+ }) => {
28
+ const image = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">${priorityToSVGPathMap[priority]}</svg>`;
29
+ return /*#__PURE__*/React.createElement(IconType, {
30
+ source: `data:image/svg+xml;utf8,${image}`
31
+ });
32
+ });
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import styled from '@emotion/styled';
3
+ import Bug16Icon from '@atlaskit/icon-object/glyph/bug/16';
4
+ import Commit16Icon from '@atlaskit/icon-object/glyph/commit/16';
5
+ import Epic16Icon from '@atlaskit/icon-object/glyph/epic/16';
6
+ import Issue16Icon from '@atlaskit/icon-object/glyph/issue/16';
7
+ import Story16Icon from '@atlaskit/icon-object/glyph/story/16';
8
+ import Task16Icon from '@atlaskit/icon-object/glyph/task/16';
9
+ const IconWrapper = styled.div`
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ `;
14
+ export default (({
15
+ type
16
+ }) => {
17
+ const TypeIcon = () => {
18
+ switch (type) {
19
+ case 'issue':
20
+ return /*#__PURE__*/React.createElement(Issue16Icon, {
21
+ label: 'issue'
22
+ });
23
+ case 'commit':
24
+ return /*#__PURE__*/React.createElement(Commit16Icon, {
25
+ label: 'commit'
26
+ });
27
+ case 'story':
28
+ return /*#__PURE__*/React.createElement(Story16Icon, {
29
+ label: 'story'
30
+ });
31
+ case 'epic':
32
+ return /*#__PURE__*/React.createElement(Epic16Icon, {
33
+ label: 'epic'
34
+ });
35
+ case 'bug':
36
+ return /*#__PURE__*/React.createElement(Bug16Icon, {
37
+ label: 'bug'
38
+ });
39
+ case 'task':
40
+ return /*#__PURE__*/React.createElement(Task16Icon, {
41
+ label: 'task'
42
+ });
43
+ }
44
+ };
45
+ return /*#__PURE__*/React.createElement(IconWrapper, null, /*#__PURE__*/React.createElement(TypeIcon, null));
46
+ });
@@ -0,0 +1,259 @@
1
+ /** @jsx jsx */
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
+ import invariant from 'tiny-invariant';
5
+ import { Skeleton } from '@atlaskit/linking-common';
6
+ import { autoScroller } from '@atlaskit/pragmatic-drag-and-drop-autoscroll';
7
+ import { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/addon/closest-edge';
8
+ import { reorderWithEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/util/reorder-with-edge';
9
+ import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/element';
10
+ import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
11
+ import { ColumnPicker } from './column-picker';
12
+ import { DraggableTableHeading } from './draggable-table-heading';
13
+ import TableEmptyState from './empty-state';
14
+ import { fallbackRenderType } from './render-type';
15
+ import { TableHeading } from './styled';
16
+ import { useIsOnScreen } from './useIsOnScreen';
17
+ const tableHeadStyles = css({
18
+ background: "var(--ds-surface, #FFF)",
19
+ borderTop: '2px solid transparent'
20
+ });
21
+ const columnPickerHeaderStyles = css({
22
+ width: '40px',
23
+ // TODO use some variable for that?
24
+ paddingBlock: "var(--ds-space-100, 8px)"
25
+ });
26
+ const tableDragPreviewStyles = css({
27
+ backgroundColor: "var(--ds-surface, #FFF)"
28
+ });
29
+ const containerDragPreviewStyles = css({
30
+ overflow: 'hidden'
31
+ });
32
+ function extractIndex(data) {
33
+ const {
34
+ index
35
+ } = data;
36
+ invariant(typeof index === 'number');
37
+ return index;
38
+ }
39
+ const orderColumns = (columns, visibleColumnKeys) => {
40
+ // newColumnKeyOrder contains keys of selected (visible columns only).
41
+ // In order to sort all the columns we need to insert unselected ones into this list
42
+ // We put them into their absolution position as it was in unchanged (before column move) order.
43
+ columns.forEach(({
44
+ key
45
+ }, index) => {
46
+ if (!visibleColumnKeys.includes(key)) {
47
+ visibleColumnKeys.splice(index, 0, key);
48
+ }
49
+ });
50
+ columns.sort((a, b) => {
51
+ const indexB = visibleColumnKeys.indexOf(b.key);
52
+ const indexA = visibleColumnKeys.indexOf(a.key);
53
+ return indexA - indexB;
54
+ });
55
+ return [...columns];
56
+ };
57
+ export const IssueLikeDataTableView = ({
58
+ testId,
59
+ onNextPage,
60
+ items,
61
+ columns,
62
+ renderItem = fallbackRenderType,
63
+ visibleColumnKeys,
64
+ onVisibleColumnKeysChange,
65
+ status,
66
+ hasNextPage
67
+ }) => {
68
+ var _orderedColumns$find;
69
+ const tableId = useMemo(() => Symbol('unique-id'), []);
70
+ const [lastRowElement, setLastRowElement] = useState(null);
71
+ const [isDragPreview, setIsDragPreview] = useState(false);
72
+ const isBottomOfTableVisibleRaw = useIsOnScreen(lastRowElement);
73
+ const containerRef = useRef(null);
74
+ const [orderedColumns, setOrderedColumns] = useState(() => orderColumns([...columns], [...visibleColumnKeys]));
75
+ const visibleSortedColumns = useMemo(() => visibleColumnKeys.map(visibleKey => orderedColumns.find(({
76
+ key
77
+ }) => visibleKey === key)).filter(Boolean), [orderedColumns, visibleColumnKeys]);
78
+
79
+ // TODO seems like this component can't handle some combination of incremental data retreaval.
80
+ // If data comes first, then columns and then visibleColumnKeys it blows up,
81
+ // or some other combination.
82
+
83
+ const identityColumnKey = (_orderedColumns$find = orderedColumns.find(column => column.isIdentity)) === null || _orderedColumns$find === void 0 ? void 0 : _orderedColumns$find.key;
84
+ const loadingRow = useMemo(() => ({
85
+ key: 'loading',
86
+ cells: visibleSortedColumns.map(({
87
+ key
88
+ }) => {
89
+ const content = jsx(Skeleton, {
90
+ borderRadius: "var(--ds-radius-100, 3px)",
91
+ width: '100%',
92
+ height: '20px'
93
+ });
94
+ return {
95
+ key,
96
+ content
97
+ };
98
+ })
99
+ }), [visibleSortedColumns]);
100
+ const headColumns = visibleSortedColumns.map(column => ({
101
+ key: column.key,
102
+ content: column.title,
103
+ // width: TODO Find out how we going to retrieve column width
104
+ shouldTruncate: true
105
+ }));
106
+ useEffect(() => {
107
+ if (status === 'empty' || isBottomOfTableVisibleRaw && hasNextPage && status !== 'loading') {
108
+ void onNextPage();
109
+ }
110
+ }, [isBottomOfTableVisibleRaw, status, hasNextPage, onNextPage]);
111
+ let dndPreviewHeight = 0;
112
+ if (items.length > 0 && containerRef.current) {
113
+ const containerEl = containerRef.current;
114
+ invariant(containerEl);
115
+ dndPreviewHeight = containerEl.offsetHeight;
116
+ }
117
+
118
+ // This variable contains initial Y mouse coordinate, so we can restrict
119
+ // autoScroller in X axis only
120
+ const initialAutoScrollerClientY = useRef();
121
+ useEffect(() => {
122
+ if (!onVisibleColumnKeysChange) {
123
+ return;
124
+ }
125
+ return combine(monitorForElements({
126
+ onDragStart: ({
127
+ location
128
+ }) => {
129
+ initialAutoScrollerClientY.current = location.current.input.clientY;
130
+ autoScroller.start({
131
+ input: location.current.input,
132
+ behavior: 'container-only'
133
+ });
134
+ },
135
+ onDrag: ({
136
+ location
137
+ }) => {
138
+ autoScroller.updateInput({
139
+ input: {
140
+ ...location.current.input,
141
+ clientY: initialAutoScrollerClientY.current || 0
142
+ }
143
+ });
144
+ },
145
+ onDrop({
146
+ source,
147
+ location
148
+ }) {
149
+ initialAutoScrollerClientY.current = null;
150
+ autoScroller.stop();
151
+ if (location.current.dropTargets.length === 0) {
152
+ return;
153
+ }
154
+ const target = location.current.dropTargets[0];
155
+ if (source.data.id === target.data.id) {
156
+ return;
157
+ }
158
+ if (source.data.type === 'table-header' && source.data.tableId === tableId) {
159
+ const closestEdgeOfTarget = extractClosestEdge(target.data);
160
+ invariant(closestEdgeOfTarget === 'left' || closestEdgeOfTarget === 'right');
161
+ const startIndex = extractIndex(source.data);
162
+ const indexOfTarget = extractIndex(target.data);
163
+ const newColumnKeyOrder = reorderWithEdge({
164
+ list: visibleColumnKeys,
165
+ closestEdgeOfTarget,
166
+ startIndex,
167
+ indexOfTarget,
168
+ axis: 'horizontal'
169
+ });
170
+ onVisibleColumnKeysChange === null || onVisibleColumnKeysChange === void 0 ? void 0 : onVisibleColumnKeysChange([...newColumnKeyOrder]);
171
+
172
+ // We sort columns (whole objects) according to their key order presented in newColumnKeyOrder
173
+ setOrderedColumns(columns => {
174
+ return orderColumns([...columns], [...newColumnKeyOrder]);
175
+ });
176
+ }
177
+ }
178
+ }));
179
+ }, [visibleColumnKeys, onVisibleColumnKeysChange, tableId]);
180
+ const tableRows = useMemo(() => items.map((newRowData, rowIndex) => ({
181
+ key: `${identityColumnKey && newRowData[identityColumnKey] || rowIndex}`,
182
+ cells: visibleSortedColumns.map(({
183
+ key,
184
+ type
185
+ }) => {
186
+ const value = newRowData[key];
187
+ const values = Array.isArray(value) ? value : [value];
188
+ const content = values.map(value => renderItem({
189
+ type,
190
+ value
191
+ }));
192
+ return {
193
+ key,
194
+ content
195
+ };
196
+ }),
197
+ ref: rowIndex === items.length - 1 ? el => setLastRowElement(el) : undefined
198
+ })), [identityColumnKey, renderItem, items, visibleSortedColumns]);
199
+ const rows = [...tableRows, ...(status === 'loading' ? [loadingRow] : [])];
200
+ const setIsDragPreviewOn = useCallback(() => setIsDragPreview(true), [setIsDragPreview]);
201
+ const setIsDragPreviewOff = useCallback(() => setIsDragPreview(false), [setIsDragPreview]);
202
+ const onSelectedColumnKeysChange = useCallback(newSelectedColumnKeys => {
203
+ onVisibleColumnKeysChange === null || onVisibleColumnKeysChange === void 0 ? void 0 : onVisibleColumnKeysChange(newSelectedColumnKeys);
204
+ }, [onVisibleColumnKeysChange]);
205
+ return jsx("div", {
206
+ ref: containerRef,
207
+ css: isDragPreview ? containerDragPreviewStyles : null
208
+ }, jsx("table", {
209
+ css: isDragPreview ? tableDragPreviewStyles : null,
210
+ "data-testid": testId
211
+ }, jsx("thead", {
212
+ "data-testid": testId && `${testId}--head`,
213
+ css: tableHeadStyles
214
+ }, jsx("tr", null, headColumns.map(({
215
+ key,
216
+ content
217
+ }, cellIndex) => {
218
+ if (onVisibleColumnKeysChange) {
219
+ return jsx(DraggableTableHeading, {
220
+ tableId: tableId,
221
+ key: key,
222
+ id: key,
223
+ index: cellIndex,
224
+ dndPreviewHeight: dndPreviewHeight,
225
+ onDragPreviewStart: setIsDragPreviewOn,
226
+ onDragPreviewEnd: setIsDragPreviewOff
227
+ }, content);
228
+ } else {
229
+ return jsx(TableHeading, {
230
+ key: key,
231
+ "data-testid": `${key}-column-heading`
232
+ }, content);
233
+ }
234
+ }), onVisibleColumnKeysChange && jsx("th", {
235
+ css: columnPickerHeaderStyles
236
+ }, jsx(ColumnPicker, {
237
+ columns: orderedColumns,
238
+ selectedColumnKeys: visibleColumnKeys,
239
+ onSelectedColumnKeysChange: onSelectedColumnKeysChange
240
+ })))), jsx("tbody", {
241
+ "data-testid": testId && `${testId}--body`
242
+ }, rows.map(({
243
+ key,
244
+ cells,
245
+ ref
246
+ }) => jsx("tr", {
247
+ key: key,
248
+ "data-testid": testId && `${testId}--row-${key}`,
249
+ ref: ref
250
+ }, cells.map(({
251
+ key,
252
+ content
253
+ }, cellIndex) => jsx("td", {
254
+ key: key,
255
+ "data-testid": testId && `${testId}--cell-${cellIndex}`,
256
+ colSpan: cellIndex + 1 === cells.length ? 2 : undefined
257
+ }, content)))))));
258
+ };
259
+ export const EmptyState = TableEmptyState;