@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,21 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import TextRenderType from '../text';
4
+ import { booleanTypeMessages } from './messages';
5
+ export const BOOLEAN_TYPE_TEST_ID = 'link-datasource-render-type--boolean';
6
+ const BooleanRenderType = ({
7
+ value,
8
+ testId = BOOLEAN_TYPE_TEST_ID
9
+ }) => {
10
+ const intl = useIntl();
11
+ if (typeof value !== 'boolean') {
12
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
13
+ }
14
+ const TRUTHY_TEXT = intl.formatMessage(booleanTypeMessages.booleanTruthyValue);
15
+ const FALSY_TEXT = intl.formatMessage(booleanTypeMessages.booleanFalsyValue);
16
+ return /*#__PURE__*/React.createElement(TextRenderType, {
17
+ text: value ? TRUTHY_TEXT : FALSY_TEXT,
18
+ testId: testId
19
+ });
20
+ };
21
+ export default BooleanRenderType;
@@ -0,0 +1,13 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const booleanTypeMessages = defineMessages({
3
+ booleanTruthyValue: {
4
+ id: 'linkDataSource.render-type.boolean.true',
5
+ description: 'Text to display for the boolean type when the value is true',
6
+ defaultMessage: 'Yes'
7
+ },
8
+ booleanFalsyValue: {
9
+ id: 'linkDataSource.render-type.boolean.false',
10
+ description: 'Text to display for the boolean type when the value is false',
11
+ defaultMessage: 'No'
12
+ }
13
+ });
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ export const DATETIME_TYPE_TEST_ID = 'link-datasource-render-type--datetime';
4
+ const dateOptions = {
5
+ month: 'short',
6
+ day: 'numeric',
7
+ year: 'numeric'
8
+ };
9
+ const timeOptions = {
10
+ hour12: false,
11
+ hour: '2-digit',
12
+ minute: '2-digit'
13
+ };
14
+ const DateTimeRenderType = ({
15
+ value,
16
+ testId = DATETIME_TYPE_TEST_ID,
17
+ display = 'datetime'
18
+ }) => {
19
+ const date = new Date(value);
20
+ const intl = useIntl();
21
+ if (!value || isNaN(date.getTime())) {
22
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
23
+ }
24
+ const options = {
25
+ date: dateOptions,
26
+ time: timeOptions,
27
+ datetime: {
28
+ ...dateOptions,
29
+ ...timeOptions
30
+ }
31
+ };
32
+ const formattedString = intl.formatDate(date, options[display] || options['date']);
33
+ return /*#__PURE__*/React.createElement("span", {
34
+ "data-testid": testId
35
+ }, formattedString);
36
+ };
37
+ export default DateTimeRenderType;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import styled from '@emotion/styled';
3
+ import Image from '@atlaskit/image';
4
+ const IconWrapper = styled.div`
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ `;
9
+ export const ICON_TYPE_TEST_ID = 'link-datasource-render-type--icon';
10
+ const IconRenderType = ({
11
+ label,
12
+ source,
13
+ testId = ICON_TYPE_TEST_ID
14
+ }) => {
15
+ const style = /svg/i.test(source) ? {
16
+ minWidth: '20px',
17
+ maxWidth: '20px'
18
+ } // having just width: '20px' shriks it when table width is reduced
19
+ : {};
20
+ return /*#__PURE__*/React.createElement(IconWrapper, null, /*#__PURE__*/React.createElement(Image, {
21
+ src: source,
22
+ alt: label,
23
+ "data-testid": testId,
24
+ style: style
25
+ }));
26
+ };
27
+ export default IconRenderType;
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import BooleanRenderType from './boolean';
3
+ import DateTimeRenderType from './date-time';
4
+ import IconRenderType from './icon';
5
+ import LinkRenderType from './link';
6
+ import NumberRenderType from './number';
7
+ import StatusRenderType from './status';
8
+ import TagRenderType from './tag';
9
+ import StringRenderType from './text';
10
+ import UserRenderType from './user';
11
+ export const fallbackRenderType = item => {
12
+ switch (item.type) {
13
+ case 'boolean':
14
+ return /*#__PURE__*/React.createElement(BooleanRenderType, {
15
+ value: item.value
16
+ });
17
+ case 'date':
18
+ return /*#__PURE__*/React.createElement(DateTimeRenderType, {
19
+ value: item.value,
20
+ display: "date"
21
+ });
22
+ case 'datetime':
23
+ return /*#__PURE__*/React.createElement(DateTimeRenderType, {
24
+ value: item.value,
25
+ display: "datetime"
26
+ });
27
+ case 'icon':
28
+ return /*#__PURE__*/React.createElement(IconRenderType, item.value);
29
+ case 'link':
30
+ return /*#__PURE__*/React.createElement(LinkRenderType, item.value);
31
+ case 'number':
32
+ return /*#__PURE__*/React.createElement(NumberRenderType, {
33
+ number: item.value
34
+ });
35
+ case 'status':
36
+ return /*#__PURE__*/React.createElement(StatusRenderType, item.value);
37
+ case 'string':
38
+ return /*#__PURE__*/React.createElement(StringRenderType, {
39
+ text: item.value
40
+ });
41
+ case 'tag':
42
+ return /*#__PURE__*/React.createElement(TagRenderType, {
43
+ text: item.value
44
+ });
45
+ case 'time':
46
+ return /*#__PURE__*/React.createElement(DateTimeRenderType, {
47
+ value: item.value,
48
+ display: "time"
49
+ });
50
+ case 'user':
51
+ return /*#__PURE__*/React.createElement(UserRenderType, item.value);
52
+ default:
53
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
54
+ }
55
+ };
@@ -0,0 +1,38 @@
1
+ import React, { useMemo } from 'react';
2
+ import { ErrorBoundary } from 'react-error-boundary';
3
+ import { Card } from '@atlaskit/smart-card';
4
+ import LinkUrl from '@atlaskit/smart-card/link-url';
5
+ import { N300 } from '@atlaskit/theme/colors';
6
+ import { h300 } from '@atlaskit/theme/typography';
7
+ const linkStyles = {
8
+ key: {
9
+ ...h300(),
10
+ color: `var(--ds-text-subtlest, ${N300})`,
11
+ fontWeight: 600
12
+ }
13
+ };
14
+ export const LINK_TYPE_TEST_ID = 'link-datasource-render-type--link';
15
+ const LinkRenderType = ({
16
+ linkType,
17
+ url,
18
+ text,
19
+ testId = LINK_TYPE_TEST_ID
20
+ }) => {
21
+ const style = useMemo(() => {
22
+ return linkType && linkStyles[linkType] || {};
23
+ }, [linkType]);
24
+ const anchor = useMemo(() => /*#__PURE__*/React.createElement(LinkUrl, {
25
+ href: url,
26
+ style: style,
27
+ "data-testid": testId
28
+ }, text || url), [style, url, text, testId]);
29
+ const SmartCard = () => /*#__PURE__*/React.createElement(ErrorBoundary, {
30
+ fallback: anchor
31
+ }, /*#__PURE__*/React.createElement(Card, {
32
+ appearance: "inline",
33
+ url: url,
34
+ testId: testId
35
+ }));
36
+ return text ? anchor : /*#__PURE__*/React.createElement(SmartCard, null);
37
+ };
38
+ export default /*#__PURE__*/React.memo(LinkRenderType);
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export const NUMBER_TYPE_TEST_ID = 'link-datasource-render-type--number';
3
+ const NumberRenderType = ({
4
+ number,
5
+ testId = NUMBER_TYPE_TEST_ID
6
+ }) => {
7
+ if (typeof number !== 'number') {
8
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
9
+ }
10
+ const formattedNumber = Number.isInteger(number) ? number : `${number.toFixed(2)}`;
11
+ return /*#__PURE__*/React.createElement("span", {
12
+ "data-testid": testId
13
+ }, formattedNumber);
14
+ };
15
+ export default NumberRenderType;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import Lozenge from '@atlaskit/lozenge';
3
+ export const STATUS_TYPE_TEST_ID = 'link-datasource-render-type--status';
4
+ const StatusRenderType = ({
5
+ text,
6
+ status,
7
+ testId = STATUS_TYPE_TEST_ID,
8
+ style
9
+ }) => {
10
+ if (!text) {
11
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
12
+ }
13
+ return /*#__PURE__*/React.createElement(Lozenge, {
14
+ appearance: status,
15
+ testId: testId,
16
+ style: style
17
+ }, text);
18
+ };
19
+ export default StatusRenderType;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { SimpleTag as Tag } from '@atlaskit/tag';
3
+ export const TAG_TYPE_TEST_ID = 'link-datasource-render-type--tag';
4
+ const TagRenderType = ({
5
+ text,
6
+ testId = TAG_TYPE_TEST_ID
7
+ }) => {
8
+ if (!text) {
9
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
10
+ }
11
+ return /*#__PURE__*/React.createElement(Tag, {
12
+ text: text,
13
+ testId: testId,
14
+ appearance: 'default',
15
+ color: 'standard'
16
+ });
17
+ };
18
+ export default TagRenderType;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ export const TEXT_TYPE_TEST_ID = 'link-datasource-render-type--text';
3
+ const TextRenderType = ({
4
+ text,
5
+ testId = TEXT_TYPE_TEST_ID
6
+ }) => {
7
+ if (!text) {
8
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
9
+ }
10
+ return /*#__PURE__*/React.createElement("span", {
11
+ "data-testid": testId
12
+ }, text);
13
+ };
14
+ export default TextRenderType;
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import styled from '@emotion/styled';
3
+ import { FormattedMessage } from 'react-intl-next';
4
+ import Avatar from '@atlaskit/avatar';
5
+ import { userTypeMessages } from './messages';
6
+ const UserWrapper = styled.div`
7
+ display: flex;
8
+ align-items: center;
9
+ `;
10
+ const AvatarWrapper = styled.div`
11
+ margin-right: 5px;
12
+ `;
13
+ export const USER_TYPE_TEST_ID = 'link-datasource-render-type--user';
14
+ const UserType = ({
15
+ avatarSource,
16
+ avatarSize = 'small',
17
+ displayName,
18
+ testId = USER_TYPE_TEST_ID,
19
+ children
20
+ }) => {
21
+ return /*#__PURE__*/React.createElement(UserWrapper, {
22
+ "data-testid": testId
23
+ }, /*#__PURE__*/React.createElement(AvatarWrapper, null, /*#__PURE__*/React.createElement(Avatar, {
24
+ appearance: "circle",
25
+ size: avatarSize,
26
+ src: avatarSource
27
+ })), children || displayName || /*#__PURE__*/React.createElement(FormattedMessage, userTypeMessages.userDefaultdisplayNameValue));
28
+ };
29
+ export default UserType;
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const userTypeMessages = defineMessages({
3
+ userDefaultdisplayNameValue: {
4
+ id: 'linkDataSource.render-type.user.default.display.name',
5
+ description: 'Text to display for the user type when no display value is provided',
6
+ defaultMessage: 'Unassigned'
7
+ }
8
+ });
@@ -0,0 +1,6 @@
1
+ import styled from '@emotion/styled';
2
+ export const TableHeading = styled.th`
3
+ position: relative;
4
+ padding-block: ${"var(--ds-space-100, 8px)"};
5
+ line-height: ${"var(--ds-font-lineHeight-300, 24px)"};
6
+ `;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { useEffect, useMemo, useState } from 'react';
2
+
3
+ // Hook which tracks if a ref is visible or not. Taken from: https://stackoverflow.com/a/65008608
4
+ export const useIsOnScreen = el => {
5
+ const [isIntersecting, setIntersecting] = useState(false);
6
+ const observer = useMemo(() => new IntersectionObserver(([entry]) => {
7
+ return setIntersecting(entry.isIntersecting);
8
+ }), []);
9
+ useEffect(() => {
10
+ el && observer.observe(el);
11
+ return () => {
12
+ setIntersecting(false);
13
+ return observer.disconnect();
14
+ };
15
+ }, [observer, el]);
16
+ return isIntersecting;
17
+ };
@@ -0,0 +1,42 @@
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
+ const searchButtonStyles = css({
9
+ marginRight: "var(--ds-space-075, 6px)"
10
+ });
11
+ export const BasicSearchInput = ({
12
+ isDisabled,
13
+ isSearching,
14
+ onChange,
15
+ onSearch,
16
+ searchTerm,
17
+ testId = 'jira-jql-datasource-modal--basic-search-input'
18
+ }) => {
19
+ const {
20
+ formatMessage
21
+ } = useIntl();
22
+ return jsx(Textfield, {
23
+ elemAfterInput: jsx(LoadingButton, {
24
+ appearance: "primary",
25
+ css: searchButtonStyles,
26
+ iconBefore: jsx(SearchIcon, {
27
+ label: formatMessage(basicSearchInputMessages.basicTextSearchLabel),
28
+ size: "medium"
29
+ }),
30
+ isDisabled: isDisabled,
31
+ isLoading: isSearching,
32
+ onClick: () => onSearch(searchTerm),
33
+ spacing: "none",
34
+ testId: "jira-jql-datasource-modal--basic-search-button"
35
+ }),
36
+ autoFocus: true,
37
+ onChange: onChange,
38
+ placeholder: formatMessage(basicSearchInputMessages.basicTextSearchLabel),
39
+ testId: testId,
40
+ value: searchTerm
41
+ });
42
+ };
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export const 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,227 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /** @jsx jsx */
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { css, jsx } from '@emotion/react';
5
+ import { FormattedMessage, IntlProvider, useIntl } from 'react-intl-next';
6
+ import Button from '@atlaskit/button/standard-button';
7
+ import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
8
+ import { B400, N0 } from '@atlaskit/theme/colors';
9
+ import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
10
+ import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
11
+ import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
12
+ import LinkRenderType from '../../issue-like-table/render-type/link';
13
+ import { JiraSearchContainer } from './jira-search-container';
14
+ import { modalMessages } from './messages';
15
+ import { ModeSwitcher } from './mode-switcher';
16
+ import { JiraSiteSelector } from './site-selector';
17
+ const dropdownContainerStyles = css({
18
+ display: 'flex',
19
+ gap: "var(--ds-space-100, 0.5rem)"
20
+ });
21
+ const contentContainerStyles = css({
22
+ height: '420px',
23
+ overflow: 'auto'
24
+ });
25
+ const placeholderSmartLinkStyles = css({
26
+ backgroundColor: `var(--ds-surface-raised, ${N0})`,
27
+ borderRadius: '3px',
28
+ boxShadow: '0px 1px 1px rgba(9, 30, 66, 0.25), 0px 0px 1px rgba(9, 30, 66, 0.31)',
29
+ color: `var(--ds-text-brand, ${B400})`,
30
+ padding: '0px 2px'
31
+ });
32
+ export const JiraIssuesConfigModal = props => {
33
+ const [availableSites, setAvailableSites] = useState([]);
34
+ const [currentViewMode, setCurrentViewMode] = useState('issue');
35
+ const {
36
+ datasourceId,
37
+ parameters,
38
+ visibleColumnKeys,
39
+ onCancel,
40
+ onInsert,
41
+ onUpdateParameters,
42
+ onVisibleColumnKeysChange
43
+ } = props;
44
+ const isParametersSet = !!(parameters && parameters.value && parameters.cloudId);
45
+ const {
46
+ cloudId,
47
+ value: jql
48
+ } = parameters || {};
49
+ const {
50
+ reset,
51
+ status,
52
+ onNextPage,
53
+ responseItems,
54
+ hasNextPage,
55
+ columns,
56
+ defaultVisibleColumnKeys
57
+ } = useDatasourceTableState(datasourceId, parameters, ['key']);
58
+ const {
59
+ formatMessage
60
+ } = useIntl();
61
+ useEffect(() => {
62
+ const fetchSiteDisplayNames = async () => {
63
+ const jiraSites = await getAvailableJiraSites();
64
+ setAvailableSites(jiraSites);
65
+ };
66
+ void fetchSiteDisplayNames();
67
+ }, []);
68
+ const onSearch = useCallback(parameters => {
69
+ onUpdateParameters(parameters);
70
+ reset();
71
+ }, [reset, onUpdateParameters]);
72
+ const onSiteSelection = useCallback(site => {
73
+ onUpdateParameters({
74
+ cloudId: site.cloudId
75
+ });
76
+ reset();
77
+ }, [reset, onUpdateParameters]);
78
+ const selectedJiraSite = useMemo(() => availableSites.find(jiraSite => jiraSite.cloudId === cloudId) || availableSites[0], [availableSites, cloudId]);
79
+ useEffect(() => {
80
+ if (!cloudId && selectedJiraSite) {
81
+ onUpdateParameters({
82
+ cloudId: selectedJiraSite.cloudId
83
+ });
84
+ }
85
+ }, [cloudId, onUpdateParameters, selectedJiraSite]);
86
+ useEffect(() => {
87
+ if ((visibleColumnKeys || []).length === 0 && defaultVisibleColumnKeys.length > 0) {
88
+ onVisibleColumnKeysChange(defaultVisibleColumnKeys);
89
+ }
90
+ }, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
91
+ const retrieveUrlForSmartCardRender = useCallback(() => {
92
+ var _data$key;
93
+ const [data] = responseItems;
94
+ // agrement with BE that we will use `key` for rendering smartlink
95
+ return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : _data$key.url;
96
+ }, [responseItems]);
97
+ const onInsertPressed = useCallback(() => {
98
+ if (!isParametersSet || !jql || !selectedJiraSite) {
99
+ return;
100
+ }
101
+ const firstIssueUrl = retrieveUrlForSmartCardRender();
102
+ if (currentViewMode === 'count') {
103
+ onInsert({
104
+ type: 'inlineCard',
105
+ attrs: {
106
+ url: `${selectedJiraSite.url}/issues/${encodeURI(jql)}`
107
+ }
108
+ });
109
+ } else if (responseItems.length === 1 && firstIssueUrl) {
110
+ onInsert({
111
+ type: 'inlineCard',
112
+ attrs: {
113
+ url: firstIssueUrl
114
+ }
115
+ });
116
+ } else {
117
+ onInsert({
118
+ type: 'blockCard',
119
+ attrs: {
120
+ datasource: {
121
+ id: datasourceId,
122
+ parameters: {
123
+ cloudId,
124
+ jql // TODO support non JQL type
125
+ },
126
+
127
+ views: [{
128
+ type: 'table',
129
+ properties: {
130
+ columnKeys: visibleColumnKeys
131
+ }
132
+ }]
133
+ }
134
+ }
135
+ });
136
+ }
137
+ }, [isParametersSet, jql, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
138
+ const handleViewModeChange = selectedMode => {
139
+ setCurrentViewMode(selectedMode);
140
+ };
141
+ useEffect(() => {
142
+ if (status === 'empty' && isParametersSet) {
143
+ void onNextPage();
144
+ }
145
+ }, [status, isParametersSet, onNextPage, reset]);
146
+ const issueLikeDataTableView = useMemo(() => jsx(IssueLikeDataTableView, {
147
+ testId: "jira-jql-datasource-table",
148
+ status: status,
149
+ columns: columns,
150
+ items: responseItems,
151
+ hasNextPage: hasNextPage,
152
+ visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
153
+ onNextPage: onNextPage,
154
+ onVisibleColumnKeysChange: onVisibleColumnKeysChange
155
+ }), [columns, defaultVisibleColumnKeys, hasNextPage, onNextPage, onVisibleColumnKeysChange, responseItems, status, visibleColumnKeys]);
156
+ const renderCountModeContent = useCallback(() => {
157
+ const url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
158
+ if (status === 'empty' || !jql || !url) {
159
+ return jsx("span", {
160
+ "data-testid": `jira-jql-datasource-modal--smart-card-placeholder`,
161
+ css: placeholderSmartLinkStyles
162
+ }, jsx(FormattedMessage, modalMessages.issuesCountSmartCardPlaceholderText));
163
+ } else {
164
+ const urlWithEncodedJql = `${url}/issues/?jql=${encodeURI(jql)}`;
165
+ return jsx(LinkRenderType, {
166
+ url: urlWithEncodedJql
167
+ });
168
+ }
169
+ }, [jql, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url, status]);
170
+ const renderIssuesModeContent = useCallback(() => {
171
+ if (status === 'empty' || columns.length === 0) {
172
+ return jsx(EmptyState, {
173
+ testId: `jira-jql-datasource-modal--empty-state`
174
+ });
175
+ }
176
+ const firstIssueUrl = retrieveUrlForSmartCardRender();
177
+ if (responseItems.length === 1 && firstIssueUrl) {
178
+ return jsx(LinkRenderType, {
179
+ url: firstIssueUrl
180
+ });
181
+ }
182
+ return issueLikeDataTableView;
183
+ }, [columns.length, issueLikeDataTableView, responseItems.length, retrieveUrlForSmartCardRender, status]);
184
+ return jsx(IntlProvider, {
185
+ locale: "en"
186
+ }, jsx(ModalTransition, null, jsx(Modal, {
187
+ testId: 'jira-jql-datasource-modal',
188
+ onClose: onCancel,
189
+ width: "x-large",
190
+ shouldScrollInViewport: true
191
+ }, jsx(ModalHeader, null, jsx(ModalTitle, null, availableSites.length < 2 ? jsx(FormattedMessage, modalMessages.insertIssuesTitle) : jsx("div", {
192
+ css: dropdownContainerStyles
193
+ }, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesTitleManySites, {
194
+ values: {
195
+ siteName: selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.displayName
196
+ }
197
+ })), jsx(JiraSiteSelector, {
198
+ testId: `jira-jql-datasource-modal--site-selector`,
199
+ availableSites: availableSites,
200
+ onSiteSelection: onSiteSelection,
201
+ selectedJiraSite: selectedJiraSite
202
+ }))), jsx(ModeSwitcher, {
203
+ isCompact: true,
204
+ options: [{
205
+ label: formatMessage(modalMessages.issueViewModeLabel),
206
+ value: 'issue'
207
+ }, {
208
+ label: formatMessage(modalMessages.countViewModeLabel),
209
+ value: 'count'
210
+ }],
211
+ onOptionValueChange: handleViewModeChange,
212
+ selectedOptionValue: currentViewMode
213
+ })), jsx(ModalBody, null, jsx(JiraSearchContainer, {
214
+ parameters: parameters,
215
+ onSearch: onSearch
216
+ }), jsx("div", {
217
+ css: contentContainerStyles
218
+ }, currentViewMode === 'count' ? renderCountModeContent() : renderIssuesModeContent())), jsx(ModalFooter, null, jsx(Button, {
219
+ appearance: "default",
220
+ onClick: onCancel
221
+ }, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
222
+ appearance: "primary",
223
+ onClick: onInsertPressed,
224
+ isDisabled: !isParametersSet,
225
+ testId: 'jira-jql-datasource-modal--insert-button'
226
+ }, jsx(FormattedMessage, modalMessages.insertIssuesButtonText))))));
227
+ };
@@ -0,0 +1,20 @@
1
+ const fuzzySearchRegExp = /^"(.+)"$/;
2
+ const jiraIssueKeyRegExp = /[A-Z]+-\d+/;
3
+ export const buildJQL = input => {
4
+ const {
5
+ rawSearch,
6
+ orderDirection = 'DESC',
7
+ orderKey = 'created'
8
+ } = input;
9
+ const fuzzy = !rawSearch.match(fuzzySearchRegExp) ? '*' : '';
10
+ const basicSearch = rawSearch.replace(/['"?*]+/g, '');
11
+ const baseQueryParts = rawSearch.trim() ? [`text ~ "${basicSearch}${fuzzy}"`, `summary ~ "${basicSearch}${fuzzy}"`] : [];
12
+ if (jiraIssueKeyRegExp.test(rawSearch)) {
13
+ baseQueryParts.push(`key = "${basicSearch}"`);
14
+ }
15
+ const baseQueryContent = baseQueryParts.join(' OR ');
16
+ const baseQuery = baseQueryContent ? `(${baseQueryContent})` : '';
17
+ const limiter = rawSearch !== null && rawSearch !== void 0 && rawSearch.trim() ? '' : `created >= -30d`;
18
+ const query = [baseQuery, limiter].filter(Boolean).join(' AND ');
19
+ return `${query} order by ${orderKey} ${orderDirection.toUpperCase()}`;
20
+ };