@atlaskit/link-datasource 1.19.7 → 1.19.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/analytics/constants.js +1 -1
  3. package/dist/cjs/ui/assets-modal/modal/index.js +6 -1
  4. package/dist/cjs/ui/issue-like-table/empty-state/index.js +6 -4
  5. package/dist/cjs/ui/issue-like-table/index.js +137 -62
  6. package/dist/cjs/ui/issue-like-table/styled.js +3 -1
  7. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/messages.js +14 -0
  8. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +34 -10
  9. package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.js +24 -9
  10. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +3 -2
  11. package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/menu-list/messages.js +3 -2
  12. package/dist/cjs/ui/jira-issues-modal/basic-filters/utils/extractValuesFromNonComplexJQL.js +11 -3
  13. package/dist/cjs/ui/jira-issues-modal/modal/index.js +5 -1
  14. package/dist/cjs/ui/table-footer/index.js +2 -2
  15. package/dist/es2019/analytics/constants.js +1 -1
  16. package/dist/es2019/ui/assets-modal/modal/index.js +6 -1
  17. package/dist/es2019/ui/issue-like-table/empty-state/index.js +6 -4
  18. package/dist/es2019/ui/issue-like-table/index.js +123 -11
  19. package/dist/es2019/ui/issue-like-table/styled.js +7 -5
  20. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/messages.js +8 -0
  21. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +25 -4
  22. package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.js +21 -3
  23. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +3 -2
  24. package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/menu-list/messages.js +3 -2
  25. package/dist/es2019/ui/jira-issues-modal/basic-filters/utils/extractValuesFromNonComplexJQL.js +11 -1
  26. package/dist/es2019/ui/jira-issues-modal/modal/index.js +6 -2
  27. package/dist/es2019/ui/table-footer/index.js +3 -1
  28. package/dist/esm/analytics/constants.js +1 -1
  29. package/dist/esm/ui/assets-modal/modal/index.js +6 -1
  30. package/dist/esm/ui/issue-like-table/empty-state/index.js +6 -4
  31. package/dist/esm/ui/issue-like-table/index.js +136 -61
  32. package/dist/esm/ui/issue-like-table/styled.js +3 -1
  33. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/messages.js +8 -0
  34. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +33 -9
  35. package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useHydrateJqlQuery.js +24 -9
  36. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/messages.js +3 -2
  37. package/dist/esm/ui/jira-issues-modal/basic-filters/ui/menu-list/messages.js +3 -2
  38. package/dist/esm/ui/jira-issues-modal/basic-filters/utils/extractValuesFromNonComplexJQL.js +11 -3
  39. package/dist/esm/ui/jira-issues-modal/modal/index.js +6 -2
  40. package/dist/esm/ui/table-footer/index.js +2 -2
  41. package/dist/types/ui/issue-like-table/index.d.ts +6 -0
  42. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/messages.d.ts +7 -0
  43. package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +3 -1
  44. package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +6 -0
  45. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/messages.d.ts +7 -0
  46. package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +3 -1
  47. package/package.json +1 -1
@@ -32,12 +32,12 @@ import { Table, TableHeading } from './styled';
32
32
  import { useIsOnScreen } from './useIsOnScreen';
33
33
  var tableSidePadding = "var(--ds-space-200, 16px)";
34
34
  var tableHeadStyles = css({
35
- background: "var(--ds-surface, #FFF)",
35
+ background: "var(--ds-elevation-surface-current, #FFF)",
36
36
  position: 'sticky',
37
37
  top: 0,
38
38
  zIndex: stickyTableHeadersIndex
39
39
  });
40
- var ColumnPickerHeader = styled.th(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 56px;\n z-index: 10;\n position: sticky;\n right: calc(-1 * ", ");\n background-color: ", ";\n border-bottom: 2px solid ", "; /* It is required to have solid (not half-transparent) color because of this gradient business below */\n\n padding-right: ", ";\n\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0) 0%,\n ", " 10%\n );\n vertical-align: middle; /* Keeps dropdown button in the middle */\n &:last-of-type {\n padding-right: ", ";\n }\n text-align: right; /* In case when TH itself is bigger we want to keep picker at the right side */\n"])), tableSidePadding, "var(--ds-surface, #FFF)", "var(--ds-border, ".concat(N40, ")"), "var(--ds-space-100, 4px)", "var(--ds-surface, #FFF)", tableSidePadding);
40
+ var ColumnPickerHeader = styled.th(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 56px;\n z-index: 10;\n position: sticky;\n right: calc(-1 * ", ");\n background-color: ", ";\n border-bottom: 2px solid ", "; /* It is required to have solid (not half-transparent) color because of this gradient business below */\n\n padding-right: ", ";\n\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0) 0%,\n ", " 10%\n );\n vertical-align: middle; /* Keeps dropdown button in the middle */\n &:last-of-type {\n padding-right: ", ";\n }\n text-align: right; /* In case when TH itself is bigger we want to keep picker at the right side */\n"])), tableSidePadding, "var(--ds-elevation-surface-current, #FFF)", "var(--ds-border, ".concat(N40, ")"), "var(--ds-space-100, 4px)", "var(--ds-elevation-surface-current, #FFF)", tableSidePadding);
41
41
  var truncatedCellStyles = css({
42
42
  overflow: 'hidden',
43
43
  textOverflow: 'ellipsis',
@@ -45,19 +45,94 @@ var truncatedCellStyles = css({
45
45
  borderRight: "0.5px solid ".concat("var(--ds-border, ".concat(N40, ")")),
46
46
  borderBottom: "0.5px solid ".concat("var(--ds-border, ".concat(N40, ")")),
47
47
  '&:first-child': {
48
- paddingLeft: "var(--ds-space-100, 4px)"
48
+ paddingLeft: "var(--ds-space-100, 8px)"
49
49
  },
50
50
  '&:last-child': {
51
51
  borderRight: 0,
52
- paddingRight: "var(--ds-space-100, 4px)"
52
+ paddingRight: "var(--ds-space-100, 8px)"
53
53
  }
54
54
  });
55
55
  var tableContainerStyles = css({
56
- borderRadius: 'inherit'
56
+ borderRadius: 'inherit',
57
+ borderBottomLeftRadius: 0,
58
+ borderBottomRightRadius: 0
57
59
  });
60
+
61
+ /**
62
+ * Following section deals with slight gradient shadows that we add
63
+ * on all four sides when there is more content in that direction.
64
+ *
65
+ * We do that by applying two gradients to the background -
66
+ * one is "static" ('local') and other is "sticky" ('scroll'). \
67
+ * "Static" one makes a white color gradient, that when window is at the end of scrollable area goes on top
68
+ * of "sticky" (gray) one, dominating and hence disabling sticky one.
69
+ */
70
+
71
+ var shadowColor = "var(--ds-shadow-overflow-perimeter, rgba(0, 0, 0, 0.1))";
72
+ var shadowColorLight = "var(--ds-shadow-overflow-perimeter, rgba(0, 0, 0, 0.05))";
73
+ var leftWhiteOverrideGradient = {
74
+ background: "\n linear-gradient(\n 90deg,\n ".concat("var(--ds-elevation-surface-current, #FFF)", " 30%,\n rgba(255, 255, 255, 0)\n ) left center"),
75
+ size: "40px 100%",
76
+ attachment: "local"
77
+ };
78
+ var topWhiteOverrideGradient = {
79
+ background: "\n linear-gradient(\n 0deg,\n rgba(255, 255, 255, 0),\n ".concat("var(--ds-elevation-surface-current, #FFF)", " 30%\n ) top center"),
80
+ size: "100% 100px",
81
+ attachment: "local"
82
+ };
83
+ var rightWhiteOverrideGradient = {
84
+ background: "\n linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0),\n ".concat("var(--ds-elevation-surface-current, #FFF)", " 70%\n ) right center"),
85
+ size: "40px 100%",
86
+ attachment: "local"
87
+ };
88
+ var bottomWhiteOverride = {
89
+ background: "\n linear-gradient(\n 0deg,\n ".concat("var(--ds-elevation-surface-current, #FFF)", " 30%,\n rgba(255, 255, 255, 0)\n ) bottom center"),
90
+ size: "100% 40px",
91
+ attachment: "local"
92
+ };
93
+ var leftShadowGradient = {
94
+ background: "\n linear-gradient(\n 90deg,\n ".concat(shadowColor, ",\n rgba(0, 0, 0, 0)\n ) left center"),
95
+ size: "14px 100%",
96
+ attachment: "scroll"
97
+ };
98
+ var topShadowGradient = {
99
+ background: "\n linear-gradient(\n 0deg,\n rgba(0, 0, 0, 0),\n ".concat(shadowColorLight, "\n ) 0 52px"),
100
+ size: "100% 14px",
101
+ attachment: "scroll"
102
+ };
103
+ var rightShadowGradient = {
104
+ background: "\n linear-gradient(\n 90deg,\n rgba(0, 0, 0, 0),\n ".concat(shadowColor, "\n ) right center"),
105
+ size: "14px 100%",
106
+ attachment: "scroll"
107
+ };
108
+ var bottomShadowGradient = {
109
+ background: "\n linear-gradient(\n 0deg,\n ".concat(shadowColorLight, ",\n rgba(0, 0, 0, 0)\n ) bottom center"),
110
+ size: "100% 10px",
111
+ attachment: "scroll"
112
+ };
113
+ var shadows = [leftWhiteOverrideGradient, leftShadowGradient, rightWhiteOverrideGradient, rightShadowGradient, topWhiteOverrideGradient, topShadowGradient, bottomWhiteOverride, bottomShadowGradient];
114
+ export var scrollableContainerShadowsCssComponents = {
115
+ background: shadows.map(function (_ref) {
116
+ var background = _ref.background;
117
+ return background;
118
+ }).join(','),
119
+ backgroundRepeat: 'no-repeat',
120
+ backgroundSize: shadows.map(function (_ref2) {
121
+ var size = _ref2.size;
122
+ return size;
123
+ }).join(','),
124
+ backgroundAttachment: shadows.map(function (_ref3) {
125
+ var attachment = _ref3.attachment;
126
+ return attachment;
127
+ }).join(',')
128
+ };
58
129
  var scrollableContainerStyles = css({
59
130
  overflow: 'auto',
60
- boxSizing: 'border-box'
131
+ boxSizing: 'border-box',
132
+ background: scrollableContainerShadowsCssComponents.background,
133
+ backgroundRepeat: scrollableContainerShadowsCssComponents.backgroundRepeat,
134
+ backgroundSize: scrollableContainerShadowsCssComponents.backgroundSize,
135
+ backgroundAttachment: scrollableContainerShadowsCssComponents.backgroundAttachment
61
136
  });
62
137
  var tableStyles = css({
63
138
  // These styles are needed to prevent thead bottom border from scrolling away.
@@ -93,11 +168,11 @@ var BASE_WIDTH = 8;
93
168
  var DEFAULT_WIDTH = BASE_WIDTH * 22;
94
169
  export var COLUMN_MIN_WIDTH = BASE_WIDTH * 3;
95
170
  var keyBasedWidthMap = {
96
- priority: BASE_WIDTH * 4,
171
+ priority: BASE_WIDTH * 5,
97
172
  status: BASE_WIDTH * 18,
98
173
  summary: BASE_WIDTH * 45,
99
174
  description: BASE_WIDTH * 31.25,
100
- type: BASE_WIDTH * 4,
175
+ type: BASE_WIDTH * 5,
101
176
  key: BASE_WIDTH * 13
102
177
  };
103
178
  function getDefaultColumnWidth(key, type) {
@@ -109,28 +184,28 @@ function getDefaultColumnWidth(key, type) {
109
184
  case 'date':
110
185
  return BASE_WIDTH * 14;
111
186
  case 'icon':
112
- return BASE_WIDTH * 4;
187
+ return BASE_WIDTH * 5;
113
188
  default:
114
189
  return DEFAULT_WIDTH;
115
190
  }
116
191
  }
117
- export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
118
- var testId = _ref.testId,
119
- onNextPage = _ref.onNextPage,
120
- onLoadDatasourceDetails = _ref.onLoadDatasourceDetails,
121
- items = _ref.items,
122
- columns = _ref.columns,
123
- _ref$renderItem = _ref.renderItem,
124
- renderItem = _ref$renderItem === void 0 ? fallbackRenderType : _ref$renderItem,
125
- visibleColumnKeys = _ref.visibleColumnKeys,
126
- onVisibleColumnKeysChange = _ref.onVisibleColumnKeysChange,
127
- columnCustomSizes = _ref.columnCustomSizes,
128
- onColumnResize = _ref.onColumnResize,
129
- status = _ref.status,
130
- hasNextPage = _ref.hasNextPage,
131
- scrollableContainerHeight = _ref.scrollableContainerHeight,
132
- parentContainerRenderInstanceId = _ref.parentContainerRenderInstanceId,
133
- extensionKey = _ref.extensionKey;
192
+ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref4) {
193
+ var testId = _ref4.testId,
194
+ onNextPage = _ref4.onNextPage,
195
+ onLoadDatasourceDetails = _ref4.onLoadDatasourceDetails,
196
+ items = _ref4.items,
197
+ columns = _ref4.columns,
198
+ _ref4$renderItem = _ref4.renderItem,
199
+ renderItem = _ref4$renderItem === void 0 ? fallbackRenderType : _ref4$renderItem,
200
+ visibleColumnKeys = _ref4.visibleColumnKeys,
201
+ onVisibleColumnKeysChange = _ref4.onVisibleColumnKeysChange,
202
+ columnCustomSizes = _ref4.columnCustomSizes,
203
+ onColumnResize = _ref4.onColumnResize,
204
+ status = _ref4.status,
205
+ hasNextPage = _ref4.hasNextPage,
206
+ scrollableContainerHeight = _ref4.scrollableContainerHeight,
207
+ parentContainerRenderInstanceId = _ref4.parentContainerRenderInstanceId,
208
+ extensionKey = _ref4.extensionKey;
134
209
  var tableId = useMemo(function () {
135
210
  return Symbol('unique-id');
136
211
  }, []);
@@ -165,8 +240,8 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
165
240
  }, [parentContainerRenderInstanceId, status]);
166
241
  var visibleSortedColumns = useMemo(function () {
167
242
  return visibleColumnKeys.map(function (visibleKey) {
168
- return orderedColumns.find(function (_ref2) {
169
- var key = _ref2.key;
243
+ return orderedColumns.find(function (_ref5) {
244
+ var key = _ref5.key;
170
245
  return visibleKey === key;
171
246
  });
172
247
  }).filter(Boolean);
@@ -181,10 +256,10 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
181
256
  return (columnCustomSizes === null || columnCustomSizes === void 0 ? void 0 : columnCustomSizes[key]) || getDefaultColumnWidth(key, type);
182
257
  }, [columnCustomSizes]);
183
258
  var headerColumns = useMemo(function () {
184
- return visibleSortedColumns.map(function (_ref3) {
185
- var key = _ref3.key,
186
- title = _ref3.title,
187
- type = _ref3.type;
259
+ return visibleSortedColumns.map(function (_ref6) {
260
+ var key = _ref6.key,
261
+ title = _ref6.title,
262
+ type = _ref6.type;
188
263
  return {
189
264
  key: key,
190
265
  content: title,
@@ -226,9 +301,9 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
226
301
  return;
227
302
  }
228
303
  return combine(monitorForElements({
229
- onDragStart: function onDragStart(_ref4) {
230
- var location = _ref4.location,
231
- source = _ref4.source;
304
+ onDragStart: function onDragStart(_ref7) {
305
+ var location = _ref7.location,
306
+ source = _ref7.source;
232
307
  initialAutoScrollerClientY.current = location.current.input.clientY;
233
308
  if (source.data.type === 'table-header') {
234
309
  var _containerRef$current;
@@ -244,9 +319,9 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
244
319
  });
245
320
  }
246
321
  },
247
- onDrag: function onDrag(_ref5) {
248
- var location = _ref5.location,
249
- source = _ref5.source;
322
+ onDrag: function onDrag(_ref8) {
323
+ var location = _ref8.location,
324
+ source = _ref8.source;
250
325
  if (source.data.type === 'table-header') {
251
326
  var _containerRef$current2;
252
327
  autoScroller.updateInput({
@@ -256,9 +331,9 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
256
331
  });
257
332
  }
258
333
  },
259
- onDrop: function onDrop(_ref6) {
260
- var source = _ref6.source,
261
- location = _ref6.location;
334
+ onDrop: function onDrop(_ref9) {
335
+ var source = _ref9.source,
336
+ location = _ref9.location;
262
337
  autoScroller.stop();
263
338
  if (location.current.dropTargets.length === 0) {
264
339
  return;
@@ -293,10 +368,10 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
293
368
  return items.map(function (newRowData, rowIndex) {
294
369
  return {
295
370
  key: "".concat(identityColumnKey && newRowData[identityColumnKey] && newRowData[identityColumnKey].data || rowIndex),
296
- cells: visibleSortedColumns.map(function (_ref7) {
371
+ cells: visibleSortedColumns.map(function (_ref10) {
297
372
  var _newRowData$key;
298
- var key = _ref7.key,
299
- type = _ref7.type;
373
+ var key = _ref10.key,
374
+ type = _ref10.type;
300
375
  var value = ((_newRowData$key = newRowData[key]) === null || _newRowData$key === void 0 ? void 0 : _newRowData$key.data) || newRowData[key];
301
376
  var values = Array.isArray(value) ? value : [value];
302
377
  var content = values.map(function (value) {
@@ -397,10 +472,10 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
397
472
  css: [noDefaultBorderStyles, tableHeadStyles]
398
473
  }, jsx("tr", {
399
474
  ref: tableHeaderRowRef
400
- }, headerColumns.map(function (_ref9, cellIndex) {
401
- var key = _ref9.key,
402
- content = _ref9.content,
403
- width = _ref9.width;
475
+ }, headerColumns.map(function (_ref12, cellIndex) {
476
+ var key = _ref12.key,
477
+ content = _ref12.content,
478
+ width = _ref12.width;
404
479
  var heading = jsx(Tooltip, {
405
480
  content: content,
406
481
  tag: "span",
@@ -411,10 +486,10 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
411
486
  }, content));
412
487
  if (onVisibleColumnKeysChange && hasData) {
413
488
  var _containerRef$current3;
414
- var previewRows = tableRows.map(function (_ref10) {
415
- var cells = _ref10.cells;
416
- var cell = cells.find(function (_ref11) {
417
- var cellKey = _ref11.key;
489
+ var previewRows = tableRows.map(function (_ref13) {
490
+ var cells = _ref13.cells;
491
+ var cell = cells.find(function (_ref14) {
492
+ var cellKey = _ref14.key;
418
493
  return cellKey === key;
419
494
  });
420
495
  if (cell) {
@@ -456,18 +531,18 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
456
531
  })))), jsx("tbody", {
457
532
  css: noDefaultBorderStyles,
458
533
  "data-testid": testId && "".concat(testId, "--body")
459
- }, rows.map(function (_ref12) {
460
- var key = _ref12.key,
461
- cells = _ref12.cells,
462
- ref = _ref12.ref;
534
+ }, rows.map(function (_ref15) {
535
+ var key = _ref15.key,
536
+ cells = _ref15.cells,
537
+ ref = _ref15.ref;
463
538
  return jsx("tr", {
464
539
  key: key,
465
540
  "data-testid": testId && "".concat(testId, "--row-").concat(key),
466
541
  ref: ref
467
- }, cells.map(function (_ref13, cellIndex) {
468
- var cellKey = _ref13.key,
469
- content = _ref13.content,
470
- width = _ref13.width;
542
+ }, cells.map(function (_ref16, cellIndex) {
543
+ var cellKey = _ref16.key,
544
+ content = _ref16.content,
545
+ width = _ref16.width;
471
546
  var loadingRowStyle = shouldUseWidth ? {
472
547
  width: width
473
548
  } : {
@@ -476,7 +551,7 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref) {
476
551
  // extra padding is required around skeleton loader to avoid vertical jumps when data loads
477
552
  if (key !== null && key !== void 0 && key.includes('loading')) {
478
553
  loadingRowStyle = _objectSpread(_objectSpread({}, loadingRowStyle), {}, {
479
- paddingBlock: "var(--ds-space-100, 12px)"
554
+ paddingBlock: "var(--ds-space-100, 8px)"
480
555
  });
481
556
  }
482
557
  return jsx("td", {
@@ -5,4 +5,6 @@ import { N40 } from '@atlaskit/theme/colors';
5
5
  export var ScrollableContainerHeight = 590;
6
6
  export var FieldTextFontSize = '14px';
7
7
  export var Table = styled.table(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 100%;\n"])));
8
- export var TableHeading = styled.th(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n line-height: ", ";\n border-right: 0.5px solid ", ";\n border-bottom: 2px solid ", ";\n height: calc(52px - ", " * 2 - 2px);\n vertical-align: bottom;\n\n &.has-column-picker:nth-last-of-type(2) {\n border-right: 0;\n }\n\n &:first-child {\n padding-left: ", ";\n }\n\n &:last-child {\n border-right: 0;\n }\n\n & [data-testid='datasource-header-content--container'] {\n width: 100%;\n padding: ", " ", ";\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n white-space: normal;\n overflow: hidden;\n max-height: 2.5rem;\n word-wrap: break-word;\n\n &:hover {\n background: ", ";\n border-radius: 3px;\n }\n }\n"])), "var(--ds-font-lineHeight-300, 16px)", "var(--ds-border, ".concat(N40, ")"), "var(--ds-border, ".concat(N40, ")"), "var(--ds-space-050, 4px)", "var(--ds-space-100, 4px)", "var(--ds-space-100, 4px)", "var(--ds-space-050, 2px)", "var(--ds-background-input-hovered, #F7F8F9)");
8
+ var lineHeight = "var(--ds-font-lineHeight-300, 24px)";
9
+ var verticalPadding = "var(--ds-space-025, 2px)";
10
+ export var TableHeading = styled.th(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n line-height: ", ";\n padding: ", " ", ";\n border-right: 0.5px solid ", ";\n border-bottom: 2px solid ", ";\n height: calc(", " * 2 + ", " * 2);\n vertical-align: bottom;\n\n &.has-column-picker:nth-last-of-type(2) {\n border-right: 0;\n }\n\n &:first-child {\n padding-left: ", ";\n }\n\n &:last-child {\n border-right: 0;\n }\n\n & [data-testid='datasource-header-content--container'] {\n width: 100%;\n padding: ", " ", ";\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n white-space: normal;\n overflow: hidden;\n word-wrap: break-word;\n\n &:hover {\n background: ", ";\n border-radius: 3px;\n }\n }\n"])), lineHeight, verticalPadding, "var(--ds-space-050, 4px)", "var(--ds-border, ".concat(N40, ")"), "var(--ds-border, ".concat(N40, ")"), lineHeight, verticalPadding, "var(--ds-space-050, 4px)", verticalPadding, "var(--ds-space-050, 4px)", "var(--ds-background-input-hovered, #F7F8F9)");
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var filterOptionMessages = defineMessages({
3
+ assigneeUnassignedFilterOption: {
4
+ id: 'linkDataSource.basic-filter.dropdown.select.assignee.unassigned',
5
+ description: 'Text to display for Unassigned assignee filter option.',
6
+ defaultMessage: 'Unassigned'
7
+ }
8
+ });
@@ -3,11 +3,22 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import _regeneratorRuntime from "@babel/runtime/regenerator";
5
5
  import { useCallback, useEffect, useRef, useState } from 'react';
6
+ import { useIntl } from 'react-intl-next';
6
7
  import { useBasicFilterAGG } from '../../../../services/useBasicFilterAGG';
7
8
  import { mapFieldValuesToFilterOptions, mapFieldValuesToPageCursor, mapFieldValuesToTotalCount } from '../utils/transformers';
9
+ import { filterOptionMessages } from './messages';
10
+ export var getAssigneeUnassignedFilterOption = function getAssigneeUnassignedFilterOption(formatMessage) {
11
+ return {
12
+ label: formatMessage(filterOptionMessages.assigneeUnassignedFilterOption),
13
+ optionType: 'avatarLabel',
14
+ value: 'empty'
15
+ };
16
+ };
8
17
  export var useFilterOptions = function useFilterOptions(_ref) {
9
18
  var filterType = _ref.filterType,
10
19
  cloudId = _ref.cloudId;
20
+ var _useIntl = useIntl(),
21
+ formatMessage = _useIntl.formatMessage;
11
22
  var _useState = useState([]),
12
23
  _useState2 = _slicedToArray(_useState, 2),
13
24
  filterOptions = _useState2[0],
@@ -39,6 +50,8 @@ export var useFilterOptions = function useFilterOptions(_ref) {
39
50
  isRequestLikeInitialSearch,
40
51
  initialResponseData,
41
52
  response,
53
+ mappedResponse,
54
+ mappedTotalCount,
42
55
  _args = arguments;
43
56
  return _regeneratorRuntime.wrap(function _callee$(_context) {
44
57
  while (1) switch (_context.prev = _context.next) {
@@ -77,34 +90,45 @@ export var useFilterOptions = function useFilterOptions(_ref) {
77
90
  setErrors(response.errors);
78
91
  return _context.abrupt("return");
79
92
  case 18:
93
+ mappedResponse = mapFieldValuesToFilterOptions(response);
94
+ mappedTotalCount = mapFieldValuesToTotalCount(response);
80
95
  if (isNewSearch) {
81
- setFilterOptions(mapFieldValuesToFilterOptions(response));
82
96
  if (isRequestLikeInitialSearch) {
83
97
  /**
84
98
  * The initial dataset is used in couple of paths, eg: when a user searches and clears the search text.
85
99
  * During these times, we dont want to fetch data again and again, hence a mini cache setup to store and provide the initial dataset
86
100
  */
87
101
  initialData.current = response;
102
+
103
+ /**
104
+ * For assignee filter option, we want `Unassigned` as an option.
105
+ * Since `Unassigned/EMPTY` is not returned by the API, we add it manually, but only for the initial list
106
+ */
107
+ if (filterType === 'assignee') {
108
+ mappedResponse.unshift(getAssigneeUnassignedFilterOption(formatMessage));
109
+ mappedTotalCount += 1;
110
+ }
88
111
  }
112
+ setFilterOptions(mappedResponse);
89
113
  } else {
90
- setFilterOptions([].concat(_toConsumableArray(filterOptions), _toConsumableArray(mapFieldValuesToFilterOptions(response))));
114
+ setFilterOptions([].concat(_toConsumableArray(filterOptions), _toConsumableArray(mappedResponse)));
91
115
  }
92
- setTotalCount(mapFieldValuesToTotalCount(response));
116
+ setTotalCount(mappedTotalCount);
93
117
  setNextPageCursor(mapFieldValuesToPageCursor(response));
94
118
  setStatus('resolved');
95
- _context.next = 28;
119
+ _context.next = 30;
96
120
  break;
97
- case 24:
98
- _context.prev = 24;
121
+ case 26:
122
+ _context.prev = 26;
99
123
  _context.t1 = _context["catch"](5);
100
124
  setStatus('rejected');
101
125
  setErrors([_context.t1]);
102
- case 28:
126
+ case 30:
103
127
  case "end":
104
128
  return _context.stop();
105
129
  }
106
- }, _callee, null, [[5, 24]]);
107
- })), [cloudId, filterOptions, filterType, getFieldValues]);
130
+ }, _callee, null, [[5, 26]]);
131
+ })), [cloudId, filterOptions, filterType, formatMessage, getFieldValues]);
108
132
  useEffect(function () {
109
133
  if (status !== 'rejected' && errors.length !== 0) {
110
134
  setErrors([]);
@@ -1,19 +1,27 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
1
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
4
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
5
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
6
+ var _excluded = ["assignee"];
4
7
  import _regeneratorRuntime from "@babel/runtime/regenerator";
5
8
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
9
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
10
  import { useCallback, useEffect, useState } from 'react';
11
+ import { useIntl } from 'react-intl-next';
12
+ import { OPERAND_EMPTY } from '@atlaskit/jql-ast';
8
13
  import { useBasicFilterAGG } from '../../../../services/useBasicFilterAGG';
9
14
  import { extractValuesFromNonComplexJQL } from '../utils/extractValuesFromNonComplexJQL';
10
15
  import { removeFuzzyCharacter } from '../utils/isClauseTooComplex';
11
16
  import { mapHydrateResponseData } from '../utils/transformers';
17
+ import { getAssigneeUnassignedFilterOption } from './useFilterOptions';
12
18
  export var useHydrateJqlQuery = function useHydrateJqlQuery(cloudId, jql) {
13
19
  var _useState = useState({}),
14
20
  _useState2 = _slicedToArray(_useState, 2),
15
21
  hydratedOptions = _useState2[0],
16
22
  setHydratedOptions = _useState2[1];
23
+ var _useIntl = useIntl(),
24
+ formatMessage = _useIntl.formatMessage;
17
25
  var _useState3 = useState('empty'),
18
26
  _useState4 = _slicedToArray(_useState3, 2),
19
27
  status = _useState4[0],
@@ -25,7 +33,7 @@ export var useHydrateJqlQuery = function useHydrateJqlQuery(cloudId, jql) {
25
33
  var _useBasicFilterAGG = useBasicFilterAGG(),
26
34
  getHydratedJQL = _useBasicFilterAGG.getHydratedJQL;
27
35
  var fetchHydratedJqlOptions = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
28
- var response, _extractValuesFromNon, text, summary, key, _ref2, _ref3, textFieldValue, mappedValues;
36
+ var response, _mapHydrateResponseDa, mappedHydratedAssigneeValue, restOfMappedHydratedResponse, _extractValuesFromNon, text, summary, key, extractedAssigneeValue, _ref2, _ref3, textFieldValue, mappedValues;
29
37
  return _regeneratorRuntime.wrap(function _callee$(_context) {
30
38
  while (1) switch (_context.prev = _context.next) {
31
39
  case 0:
@@ -43,29 +51,36 @@ export var useHydrateJqlQuery = function useHydrateJqlQuery(cloudId, jql) {
43
51
  setErrors(response.errors);
44
52
  return _context.abrupt("return");
45
53
  case 9:
54
+ _mapHydrateResponseDa = mapHydrateResponseData(response), mappedHydratedAssigneeValue = _mapHydrateResponseDa.assignee, restOfMappedHydratedResponse = _objectWithoutProperties(_mapHydrateResponseDa, _excluded);
46
55
  /**
47
56
  * Hydrate logic does not return text field, hence we parse and extract value from jql
48
57
  */
49
- _extractValuesFromNon = extractValuesFromNonComplexJQL(jql), text = _extractValuesFromNon.text, summary = _extractValuesFromNon.summary, key = _extractValuesFromNon.key;
58
+ _extractValuesFromNon = extractValuesFromNonComplexJQL(jql), text = _extractValuesFromNon.text, summary = _extractValuesFromNon.summary, key = _extractValuesFromNon.key, extractedAssigneeValue = _extractValuesFromNon.assignee;
50
59
  _ref2 = text || summary || key || [], _ref3 = _slicedToArray(_ref2, 1), textFieldValue = _ref3[0];
51
- mappedValues = _objectSpread(_objectSpread({}, mapHydrateResponseData(response)), textFieldValue ? {
60
+ mappedValues = _objectSpread(_objectSpread({}, restOfMappedHydratedResponse), {}, {
61
+ /**
62
+ * Special handling for assignee as we need to inject Unassigned value if JQL contains EMPTY keyword for assignee
63
+ */
64
+ assignee: [].concat(_toConsumableArray(mappedHydratedAssigneeValue || []), _toConsumableArray(extractedAssigneeValue !== null && extractedAssigneeValue !== void 0 && extractedAssigneeValue.includes(OPERAND_EMPTY) // checks and adds EMPTY filter option if extracted assignee values from jql contains EMPTY
65
+ ? [getAssigneeUnassignedFilterOption(formatMessage)] : []))
66
+ }, textFieldValue ? {
52
67
  basicInputTextValue: removeFuzzyCharacter(textFieldValue)
53
68
  } : {});
54
69
  setHydratedOptions(mappedValues);
55
70
  setStatus('resolved');
56
- _context.next = 20;
71
+ _context.next = 21;
57
72
  break;
58
- case 16:
59
- _context.prev = 16;
73
+ case 17:
74
+ _context.prev = 17;
60
75
  _context.t0 = _context["catch"](0);
61
76
  setErrors([_context.t0]);
62
77
  setStatus('rejected');
63
- case 20:
78
+ case 21:
64
79
  case "end":
65
80
  return _context.stop();
66
81
  }
67
- }, _callee, null, [[0, 16]]);
68
- })), [cloudId, getHydratedJQL, jql]);
82
+ }, _callee, null, [[0, 17]]);
83
+ })), [cloudId, formatMessage, getHydratedJQL, jql]);
69
84
  useEffect(function () {
70
85
  if (status !== 'rejected' && errors.length !== 0) {
71
86
  setErrors([]);
@@ -1,4 +1,5 @@
1
- export var asyncPopupSelectMessages = {
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var asyncPopupSelectMessages = defineMessages({
2
3
  selectPlaceholder: {
3
4
  id: 'linkDataSource.basic-filter.dropdown.select.placeholder',
4
5
  description: 'Placeholder text to be displayed for the search input box.',
@@ -34,4 +35,4 @@ export var asyncPopupSelectMessages = {
34
35
  defaultMessage: 'Show more',
35
36
  description: 'The text to show more options in dropdown'
36
37
  }
37
- };
38
+ });
@@ -1,4 +1,5 @@
1
- export var asyncPopupSelectMessages = {
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var asyncPopupSelectMessages = defineMessages({
2
3
  loadingMessage: {
3
4
  id: 'linkDataSource.basic-filter.loading-message',
4
5
  defaultMessage: 'Loading...',
@@ -14,4 +15,4 @@ export var asyncPopupSelectMessages = {
14
15
  defaultMessage: 'Something went wrong',
15
16
  description: 'The text for when an error occurs when loading options'
16
17
  }
17
- };
18
+ });
@@ -14,11 +14,19 @@ import { isQueryTooComplex } from './isQueryTooComplex';
14
14
  // Map of field keys to their respective clauses in the Jast
15
15
 
16
16
  var getFieldValues = function getFieldValues(operand) {
17
+ var mapValuesFromList = function mapValuesFromList(value) {
18
+ if (value.operandType === OPERAND_TYPE_VALUE) {
19
+ return value.value;
20
+ }
21
+ // we only support EMPTY keyword atm, hence making sure if operandType is a KEYWORD, then its an EMPTY keyword
22
+ if (value.operandType === OPERAND_TYPE_KEYWORD && value.value === OPERAND_EMPTY) {
23
+ return value.value;
24
+ }
25
+ return undefined;
26
+ };
17
27
  switch (operand.operandType) {
18
28
  case OPERAND_TYPE_LIST:
19
- return operand.values.map(function (value) {
20
- return value.operandType === OPERAND_TYPE_VALUE && value.value || undefined;
21
- }).filter(function (value) {
29
+ return operand.values.map(mapValuesFromList).filter(function (value) {
22
30
  return !!value;
23
31
  });
24
32
  case OPERAND_TYPE_VALUE:
@@ -29,7 +29,7 @@ import { AccessRequired } from '../../common/error-state/access-required';
29
29
  import { ModalLoadingError } from '../../common/error-state/modal-loading-error';
30
30
  import { NoInstancesView } from '../../common/error-state/no-instances';
31
31
  import { NoResults } from '../../common/error-state/no-results';
32
- import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
32
+ import { EmptyState, IssueLikeDataTableView, scrollableContainerShadowsCssComponents } from '../../issue-like-table';
33
33
  import LinkRenderType from '../../issue-like-table/render-type/link';
34
34
  import { availableBasicFilterTypes } from '../basic-filters/ui';
35
35
  import { InitialStateView } from '../initial-state-view';
@@ -53,7 +53,11 @@ var contentContainerStyles = css({
53
53
  display: 'grid',
54
54
  maxHeight: '420px',
55
55
  overflow: 'auto',
56
- borderBottom: "2px solid ".concat("var(--ds-background-accent-gray-subtler, ".concat(N40, ")"))
56
+ borderBottom: "2px solid ".concat("var(--ds-background-accent-gray-subtler, ".concat(N40, ")")),
57
+ background: scrollableContainerShadowsCssComponents.background,
58
+ backgroundRepeat: scrollableContainerShadowsCssComponents.backgroundRepeat,
59
+ backgroundSize: scrollableContainerShadowsCssComponents.backgroundSize,
60
+ backgroundAttachment: scrollableContainerShadowsCssComponents.backgroundAttachment
57
61
  });
58
62
  var placeholderSmartLinkStyles = css({
59
63
  backgroundColor: "var(--ds-surface-raised, ".concat(N0, ")"),
@@ -14,8 +14,8 @@ import LinkUrl from '@atlaskit/smart-card/link-url';
14
14
  import { N0, N40, N800, N90 } from '@atlaskit/theme/colors';
15
15
  import { footerMessages } from './messages';
16
16
  import { SyncInfo } from './sync-info';
17
- var FooterWrapper = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 0 ", ";\n box-sizing: border-box;\n border-radius: inherit;\n background: ", ";\n"])), "var(--ds-space-200, 16px)", "var(--ds-background-input, ".concat(N0, ")"));
18
- var TopBorderWrapper = styled.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n box-sizing: border-box;\n justify-content: space-between;\n padding: ", " 0;\n border-top: 2px solid ", ";\n"])), "var(--ds-space-250, 20px)", "var(--ds-background-accent-gray-subtler, ".concat(N40, ")"));
17
+ var FooterWrapper = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 0 ", ";\n box-sizing: border-box;\n border-radius: inherit;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n background: ", ";\n border-top: 2px solid ", ";\n"])), "var(--ds-space-200, 16px)", "var(--ds-background-input, ".concat(N0, ")"), "var(--ds-background-accent-gray-subtler, ".concat(N40, ")"));
18
+ var TopBorderWrapper = styled.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n box-sizing: border-box;\n justify-content: space-between;\n padding: ", " 0;\n"])), "var(--ds-space-250, 20px)");
19
19
  var ItemCounterWrapper = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n display: flex;\n align-self: center;\n"])));
20
20
  var SyncWrapper = styled.div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n color: ", ";\n"])), "var(--ds-text-accent-gray, ".concat(N90, ")"));
21
21
  var SyncTextWrapper = styled.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n margin-right: 5px;\n font-size: 12px;\n"])));
@@ -3,6 +3,12 @@ import { Ref } from 'react';
3
3
  import { jsx } from '@emotion/react';
4
4
  import { DatasourceResponseSchemaProperty } from '@atlaskit/linking-types/datasource';
5
5
  import { IssueLikeDataTableViewProps } from './types';
6
+ export declare const scrollableContainerShadowsCssComponents: {
7
+ background: string;
8
+ backgroundRepeat: string;
9
+ backgroundSize: string;
10
+ backgroundAttachment: string;
11
+ };
6
12
  export interface RowType {
7
13
  cells: Array<RowCellType>;
8
14
  key?: string;
@@ -0,0 +1,7 @@
1
+ export declare const filterOptionMessages: {
2
+ assigneeUnassignedFilterOption: {
3
+ id: string;
4
+ description: string;
5
+ defaultMessage: string;
6
+ };
7
+ };
@@ -1,4 +1,5 @@
1
- import { BasicFilterFieldType, SelectOption } from '../types';
1
+ import { IntlShape } from 'react-intl-next';
2
+ import { AvatarLabelOption, BasicFilterFieldType, SelectOption } from '../types';
2
3
  interface FilterOptionsProps {
3
4
  filterType: BasicFilterFieldType;
4
5
  cloudId: string;
@@ -16,5 +17,6 @@ export interface FilterOptionsState {
16
17
  status: 'empty' | 'loading' | 'resolved' | 'rejected' | 'loadingMore';
17
18
  errors: unknown[];
18
19
  }
20
+ export declare const getAssigneeUnassignedFilterOption: (formatMessage: IntlShape['formatMessage']) => AvatarLabelOption;
19
21
  export declare const useFilterOptions: ({ filterType, cloudId, }: FilterOptionsProps) => FilterOptionsState;
20
22
  export {};