@atlaskit/link-datasource 1.19.37 → 1.19.38

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.19.38
4
+
5
+ ### Patch Changes
6
+
7
+ - [#63865](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/63865) [`3626f73af8aa`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/3626f73af8aa) - added tooltips to datasource table items
8
+ - Updated dependencies
9
+
3
10
  ## 1.19.37
4
11
 
5
12
  ### Patch Changes
@@ -9,11 +9,13 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
13
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
14
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
14
15
  var _react = require("react");
15
16
  var _react2 = require("@emotion/react");
16
17
  var _styled = _interopRequireDefault(require("@emotion/styled"));
18
+ var _reactIntlNext = require("react-intl-next");
17
19
  var _tinyInvariant = _interopRequireDefault(require("tiny-invariant"));
18
20
  var _heading = _interopRequireDefault(require("@atlaskit/heading"));
19
21
  var _linkingCommon = require("@atlaskit/linking-common");
@@ -44,6 +46,11 @@ var tableHeadStyles = (0, _react2.css)({
44
46
  top: 0,
45
47
  zIndex: _zindex.stickyTableHeadersIndex
46
48
  });
49
+ var truncateTextStyles = (0, _react2.css)({
50
+ overflow: 'hidden',
51
+ textOverflow: 'ellipsis',
52
+ whiteSpace: 'nowrap'
53
+ });
47
54
  var ColumnPickerHeader = _styled.default.th(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\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(_colors.N40, ")"), "var(--ds-space-100, 4px)", "var(--ds-elevation-surface-current, #FFF)", tableSidePadding);
48
55
  var truncatedCellStyles = (0, _react2.css)({
49
56
  overflow: 'hidden',
@@ -213,6 +220,13 @@ function getDefaultColumnWidth(key, type) {
213
220
  return DEFAULT_WIDTH;
214
221
  }
215
222
  }
223
+ var TruncateTextTag = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
224
+ return (0, _react2.jsx)("span", (0, _extends2.default)({
225
+ css: truncateTextStyles
226
+ }, props, {
227
+ ref: ref
228
+ }), props.children);
229
+ });
216
230
  var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLikeDataTableView(_ref5) {
217
231
  var testId = _ref5.testId,
218
232
  onNextPage = _ref5.onNextPage,
@@ -233,6 +247,7 @@ var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLike
233
247
  var tableId = (0, _react.useMemo)(function () {
234
248
  return Symbol('unique-id');
235
249
  }, []);
250
+ var intl = (0, _reactIntlNext.useIntl)();
236
251
  var tableHeaderRowRef = (0, _react.useRef)(null);
237
252
  var _useState = (0, _react.useState)(null),
238
253
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -398,15 +413,29 @@ var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLike
398
413
  type = _ref11.type;
399
414
  var value = ((_newRowData$key = newRowData[key]) === null || _newRowData$key === void 0 ? void 0 : _newRowData$key.data) || newRowData[key];
400
415
  var values = Array.isArray(value) ? value : [value];
401
- var content = values.map(function (value) {
416
+ var renderedValues = values.map(function (value) {
402
417
  return renderItem({
403
418
  type: type,
404
419
  value: value
405
420
  });
406
421
  });
422
+ var stringifiedContent = values.map(function (value) {
423
+ return (0, _renderType.stringifyType)({
424
+ type: type,
425
+ value: value
426
+ }, intl.formatMessage, intl.formatDate);
427
+ }).filter(function (value) {
428
+ return value !== '';
429
+ }).join(', ');
430
+ var content = renderedValues.length === 1 ? renderedValues[0] : renderedValues;
431
+ var contentComponent = stringifiedContent ? (0, _react2.jsx)(_tooltip.default, {
432
+ tag: TruncateTextTag,
433
+ content: stringifiedContent,
434
+ testId: "issues-table-cell-tooltip"
435
+ }, content) : content;
407
436
  return {
408
437
  key: key,
409
- content: content.length === 1 ? content[0] : content,
438
+ content: contentComponent,
410
439
  width: getColumnWidth(key, type)
411
440
  };
412
441
  }),
@@ -415,7 +444,7 @@ var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLike
415
444
  } : undefined
416
445
  };
417
446
  });
418
- }, [items, visibleSortedColumns, getColumnWidth, renderItem]);
447
+ }, [items, visibleSortedColumns, getColumnWidth, renderItem, intl]);
419
448
  var rows = (0, _react.useMemo)(function () {
420
449
  if (status !== 'loading') {
421
450
  return tableRows;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = exports.DATETIME_TYPE_TEST_ID = void 0;
8
+ exports.getFormattedDate = getFormattedDate;
8
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
10
11
  var _react = _interopRequireDefault(require("react"));
@@ -26,13 +27,9 @@ var timeOptions = {
26
27
  minute: '2-digit'
27
28
  };
28
29
  var DateTimeWrapper = _styled.default.span(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n font-size: ", ";\n"])), _styled2.FieldTextFontSize);
29
- var DateTimeRenderType = function DateTimeRenderType(_ref) {
30
- var value = _ref.value,
31
- _ref$testId = _ref.testId,
32
- testId = _ref$testId === void 0 ? DATETIME_TYPE_TEST_ID : _ref$testId,
33
- _ref$display = _ref.display,
34
- display = _ref$display === void 0 ? 'datetime' : _ref$display;
35
- var intl = (0, _reactIntlNext.useIntl)();
30
+ function getFormattedDate(value) {
31
+ var display = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'datetime';
32
+ var formatDate = arguments.length > 2 ? arguments[2] : undefined;
36
33
  /* In some cases we get a value of `2023-12-20` which when parsed by JS assumes meantime timezone, causing the date
37
34
  to be one day off in some timezones. We want it to display the date without converting timezones and a solution
38
35
  is to replace the hyphens with slashes. So it should be 20th Dec regardless of the timezone in this case.
@@ -41,14 +38,26 @@ var DateTimeRenderType = function DateTimeRenderType(_ref) {
41
38
  var dateValue = /^\d{4}-\d{2}-\d{2}$/.exec(value) ? value.replace(/-/g, '/') : value;
42
39
  var date = new Date(dateValue);
43
40
  if (!value || isNaN(date.getTime())) {
44
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
41
+ return '';
45
42
  }
46
43
  var options = {
47
44
  date: dateOptions,
48
45
  time: timeOptions,
49
46
  datetime: _objectSpread(_objectSpread({}, dateOptions), timeOptions)
50
47
  };
51
- var formattedString = intl.formatDate(date, options[display] || options['date']);
48
+ return formatDate(date, options[display] || options['date']);
49
+ }
50
+ var DateTimeRenderType = function DateTimeRenderType(_ref) {
51
+ var value = _ref.value,
52
+ _ref$testId = _ref.testId,
53
+ testId = _ref$testId === void 0 ? DATETIME_TYPE_TEST_ID : _ref$testId,
54
+ _ref$display = _ref.display,
55
+ display = _ref$display === void 0 ? 'datetime' : _ref$display;
56
+ var intl = (0, _reactIntlNext.useIntl)();
57
+ var formattedString = getFormattedDate(value, display, intl.formatDate);
58
+ if (formattedString === '') {
59
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
60
+ }
52
61
  return /*#__PURE__*/_react.default.createElement(DateTimeWrapper, {
53
62
  "data-testid": testId
54
63
  }, formattedString);
@@ -1,22 +1,57 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
- exports.fallbackRenderType = void 0;
8
+ exports.stringifyType = exports.fallbackRenderType = void 0;
8
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10
  var _react = _interopRequireDefault(require("react"));
10
11
  var _boolean = _interopRequireDefault(require("./boolean"));
11
- var _dateTime = _interopRequireDefault(require("./date-time"));
12
+ var _dateTime = _interopRequireWildcard(require("./date-time"));
12
13
  var _icon = _interopRequireDefault(require("./icon"));
13
14
  var _link = _interopRequireDefault(require("./link"));
14
15
  var _number = _interopRequireDefault(require("./number"));
15
- var _richtext = _interopRequireDefault(require("./richtext"));
16
+ var _richtext = _interopRequireWildcard(require("./richtext"));
16
17
  var _status = _interopRequireDefault(require("./status"));
17
18
  var _tag = _interopRequireDefault(require("./tag"));
18
19
  var _text = _interopRequireDefault(require("./text"));
19
20
  var _user = _interopRequireDefault(require("./user"));
21
+ var _messages = require("./user/messages");
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
+ var stringifyType = exports.stringifyType = function stringifyType(_ref, formatMessage, formatDate) {
25
+ var type = _ref.type,
26
+ value = _ref.value;
27
+ switch (type) {
28
+ case 'boolean':
29
+ case 'number':
30
+ return (value === null || value === void 0 ? void 0 : value.toString()) || '';
31
+ case 'date':
32
+ return (0, _dateTime.getFormattedDate)(value, 'date', formatDate);
33
+ case 'datetime':
34
+ return (0, _dateTime.getFormattedDate)(value, 'datetime', formatDate);
35
+ case 'time':
36
+ return (0, _dateTime.getFormattedDate)(value, 'time', formatDate);
37
+ case 'icon':
38
+ return (value === null || value === void 0 ? void 0 : value.label) || '';
39
+ case 'status':
40
+ return (value === null || value === void 0 ? void 0 : value.text.toString()) || '';
41
+ case 'string':
42
+ return value;
43
+ case 'tag':
44
+ return (value === null || value === void 0 ? void 0 : value.text) || '';
45
+ case 'user':
46
+ return (value === null || value === void 0 ? void 0 : value.displayName) || formatMessage(_messages.userTypeMessages.userDefaultdisplayNameValue);
47
+ case 'richtext':
48
+ var adfPlainText = (0, _richtext.parseRichText)(value);
49
+ return adfPlainText || '';
50
+ case 'link':
51
+ default:
52
+ return '';
53
+ }
54
+ };
20
55
  var fallbackRenderType = exports.fallbackRenderType = function fallbackRenderType(item) {
21
56
  var _item$value, _item$value2, _item$value3;
22
57
  switch (item.type) {
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
7
+ exports.parseRichText = exports.default = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _react = require("react");
@@ -20,22 +20,25 @@ var rootStyles = (0, _react2.css)({
20
20
  position: 'relative',
21
21
  display: 'block'
22
22
  });
23
+ var parseRichText = exports.parseRichText = function parseRichText(value) {
24
+ try {
25
+ if (value.type === 'adf') {
26
+ var adf = JSON.parse(value.text);
27
+ return _model.Node.fromJSON(_schemaDefault.defaultSchema, _objectSpread(_objectSpread({}, adf), {}, {
28
+ content: (0, _toConsumableArray2.default)(adf.content.slice(0, 2))
29
+ })).textContent;
30
+ }
31
+ return null;
32
+ } catch (e) {
33
+ // eslint-disable-next-line no-console
34
+ console.error('error parsing adf', e);
35
+ return null;
36
+ }
37
+ };
23
38
  var RichTextType = function RichTextType(_ref) {
24
39
  var value = _ref.value;
25
40
  var adfPlainText = (0, _react.useMemo)(function () {
26
- try {
27
- if (value.type === 'adf') {
28
- var adf = JSON.parse(value.text);
29
- return _model.Node.fromJSON(_schemaDefault.defaultSchema, _objectSpread(_objectSpread({}, adf), {}, {
30
- content: (0, _toConsumableArray2.default)(adf.content.slice(0, 2))
31
- })).textContent;
32
- }
33
- return null;
34
- } catch (e) {
35
- // eslint-disable-next-line no-console
36
- console.error('error parsing adf', e);
37
- return null;
38
- }
41
+ return parseRichText(value);
39
42
  }, [value]);
40
43
  if (adfPlainText) {
41
44
  return (0, _react2.jsx)("div", {
@@ -1,7 +1,9 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
1
2
  /** @jsx jsx */
2
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
4
  import { css, jsx } from '@emotion/react';
4
5
  import styled from '@emotion/styled';
6
+ import { useIntl } from 'react-intl-next';
5
7
  import invariant from 'tiny-invariant';
6
8
  import Heading from '@atlaskit/heading';
7
9
  import { Skeleton } from '@atlaskit/linking-common';
@@ -18,7 +20,7 @@ import { ColumnPicker } from './column-picker';
18
20
  import { DragColumnPreview } from './drag-column-preview';
19
21
  import { DraggableTableHeading } from './draggable-table-heading';
20
22
  import TableEmptyState from './empty-state';
21
- import { fallbackRenderType } from './render-type';
23
+ import { fallbackRenderType, stringifyType } from './render-type';
22
24
  import { Table, TableHeading } from './styled';
23
25
  import { useIsOnScreen } from './useIsOnScreen';
24
26
  const tableSidePadding = "var(--ds-space-200, 16px)";
@@ -28,6 +30,11 @@ const tableHeadStyles = css({
28
30
  top: 0,
29
31
  zIndex: stickyTableHeadersIndex
30
32
  });
33
+ const truncateTextStyles = css({
34
+ overflow: 'hidden',
35
+ textOverflow: 'ellipsis',
36
+ whiteSpace: 'nowrap'
37
+ });
31
38
  const ColumnPickerHeader = styled.th`
32
39
  width: 56px;
33
40
  z-index: 10;
@@ -251,6 +258,13 @@ function getDefaultColumnWidth(key, type) {
251
258
  return DEFAULT_WIDTH;
252
259
  }
253
260
  }
261
+ const TruncateTextTag = /*#__PURE__*/forwardRef((props, ref) => {
262
+ return jsx("span", _extends({
263
+ css: truncateTextStyles
264
+ }, props, {
265
+ ref: ref
266
+ }), props.children);
267
+ });
254
268
  export const IssueLikeDataTableView = ({
255
269
  testId,
256
270
  onNextPage,
@@ -269,6 +283,7 @@ export const IssueLikeDataTableView = ({
269
283
  extensionKey
270
284
  }) => {
271
285
  const tableId = useMemo(() => Symbol('unique-id'), []);
286
+ const intl = useIntl();
272
287
  const tableHeaderRowRef = useRef(null);
273
288
  const [lastRowElement, setLastRowElement] = useState(null);
274
289
  const [hasFullSchema, setHasFullSchema] = useState(false);
@@ -412,18 +427,28 @@ export const IssueLikeDataTableView = ({
412
427
  var _newRowData$key;
413
428
  const value = ((_newRowData$key = newRowData[key]) === null || _newRowData$key === void 0 ? void 0 : _newRowData$key.data) || newRowData[key];
414
429
  const values = Array.isArray(value) ? value : [value];
415
- const content = values.map(value => renderItem({
430
+ const renderedValues = values.map(value => renderItem({
416
431
  type,
417
432
  value
418
433
  }));
434
+ const stringifiedContent = values.map(value => stringifyType({
435
+ type,
436
+ value
437
+ }, intl.formatMessage, intl.formatDate)).filter(value => value !== '').join(', ');
438
+ const content = renderedValues.length === 1 ? renderedValues[0] : renderedValues;
439
+ const contentComponent = stringifiedContent ? jsx(Tooltip, {
440
+ tag: TruncateTextTag,
441
+ content: stringifiedContent,
442
+ testId: "issues-table-cell-tooltip"
443
+ }, content) : content;
419
444
  return {
420
445
  key,
421
- content: content.length === 1 ? content[0] : content,
446
+ content: contentComponent,
422
447
  width: getColumnWidth(key, type)
423
448
  };
424
449
  }),
425
450
  ref: rowIndex === items.length - 1 ? el => setLastRowElement(el) : undefined
426
- })), [items, visibleSortedColumns, getColumnWidth, renderItem]);
451
+ })), [items, visibleSortedColumns, getColumnWidth, renderItem, intl]);
427
452
  const rows = useMemo(() => {
428
453
  if (status !== 'loading') {
429
454
  return tableRows;
@@ -16,12 +16,7 @@ const timeOptions = {
16
16
  const DateTimeWrapper = styled.span`
17
17
  font-size: ${FieldTextFontSize};
18
18
  `;
19
- const DateTimeRenderType = ({
20
- value,
21
- testId = DATETIME_TYPE_TEST_ID,
22
- display = 'datetime'
23
- }) => {
24
- const intl = useIntl();
19
+ export function getFormattedDate(value, display = 'datetime', formatDate) {
25
20
  /* In some cases we get a value of `2023-12-20` which when parsed by JS assumes meantime timezone, causing the date
26
21
  to be one day off in some timezones. We want it to display the date without converting timezones and a solution
27
22
  is to replace the hyphens with slashes. So it should be 20th Dec regardless of the timezone in this case.
@@ -30,7 +25,7 @@ const DateTimeRenderType = ({
30
25
  const dateValue = /^\d{4}-\d{2}-\d{2}$/.exec(value) ? value.replace(/-/g, '/') : value;
31
26
  const date = new Date(dateValue);
32
27
  if (!value || isNaN(date.getTime())) {
33
- return /*#__PURE__*/React.createElement(React.Fragment, null);
28
+ return '';
34
29
  }
35
30
  const options = {
36
31
  date: dateOptions,
@@ -40,7 +35,18 @@ const DateTimeRenderType = ({
40
35
  ...timeOptions
41
36
  }
42
37
  };
43
- const formattedString = intl.formatDate(date, options[display] || options['date']);
38
+ return formatDate(date, options[display] || options['date']);
39
+ }
40
+ const DateTimeRenderType = ({
41
+ value,
42
+ testId = DATETIME_TYPE_TEST_ID,
43
+ display = 'datetime'
44
+ }) => {
45
+ const intl = useIntl();
46
+ const formattedString = getFormattedDate(value, display, intl.formatDate);
47
+ if (formattedString === '') {
48
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
49
+ }
44
50
  return /*#__PURE__*/React.createElement(DateTimeWrapper, {
45
51
  "data-testid": testId
46
52
  }, formattedString);
@@ -1,15 +1,48 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
3
  import BooleanRenderType from './boolean';
4
- import DateTimeRenderType from './date-time';
4
+ import DateTimeRenderType, { getFormattedDate } from './date-time';
5
5
  import IconRenderType from './icon';
6
6
  import LinkRenderType from './link';
7
7
  import NumberRenderType from './number';
8
- import RichTextRenderType from './richtext';
8
+ import RichTextRenderType, { parseRichText } from './richtext';
9
9
  import StatusRenderType from './status';
10
10
  import TagRenderType from './tag';
11
11
  import StringRenderType from './text';
12
12
  import UserRenderType from './user';
13
+ import { userTypeMessages } from './user/messages';
14
+ export const stringifyType = ({
15
+ type,
16
+ value
17
+ }, formatMessage, formatDate) => {
18
+ switch (type) {
19
+ case 'boolean':
20
+ case 'number':
21
+ return (value === null || value === void 0 ? void 0 : value.toString()) || '';
22
+ case 'date':
23
+ return getFormattedDate(value, 'date', formatDate);
24
+ case 'datetime':
25
+ return getFormattedDate(value, 'datetime', formatDate);
26
+ case 'time':
27
+ return getFormattedDate(value, 'time', formatDate);
28
+ case 'icon':
29
+ return (value === null || value === void 0 ? void 0 : value.label) || '';
30
+ case 'status':
31
+ return (value === null || value === void 0 ? void 0 : value.text.toString()) || '';
32
+ case 'string':
33
+ return value;
34
+ case 'tag':
35
+ return (value === null || value === void 0 ? void 0 : value.text) || '';
36
+ case 'user':
37
+ return (value === null || value === void 0 ? void 0 : value.displayName) || formatMessage(userTypeMessages.userDefaultdisplayNameValue);
38
+ case 'richtext':
39
+ const adfPlainText = parseRichText(value);
40
+ return adfPlainText || '';
41
+ case 'link':
42
+ default:
43
+ return '';
44
+ }
45
+ };
13
46
  export const fallbackRenderType = item => {
14
47
  var _item$value, _item$value2, _item$value3;
15
48
  switch (item.type) {
@@ -10,24 +10,27 @@ const rootStyles = css({
10
10
  position: 'relative',
11
11
  display: 'block'
12
12
  });
13
+ export const parseRichText = value => {
14
+ try {
15
+ if (value.type === 'adf') {
16
+ const adf = JSON.parse(value.text);
17
+ return PMNode.fromJSON(defaultSchema, {
18
+ ...adf,
19
+ content: [...adf.content.slice(0, 2)]
20
+ }).textContent;
21
+ }
22
+ return null;
23
+ } catch (e) {
24
+ // eslint-disable-next-line no-console
25
+ console.error('error parsing adf', e);
26
+ return null;
27
+ }
28
+ };
13
29
  const RichTextType = ({
14
30
  value
15
31
  }) => {
16
32
  const adfPlainText = useMemo(() => {
17
- try {
18
- if (value.type === 'adf') {
19
- const adf = JSON.parse(value.text);
20
- return PMNode.fromJSON(defaultSchema, {
21
- ...adf,
22
- content: [...adf.content.slice(0, 2)]
23
- }).textContent;
24
- }
25
- return null;
26
- } catch (e) {
27
- // eslint-disable-next-line no-console
28
- console.error('error parsing adf', e);
29
- return null;
30
- }
33
+ return parseRichText(value);
31
34
  }, [value]);
32
35
  if (adfPlainText) {
33
36
  return jsx("div", {
@@ -1,6 +1,7 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ import _extends from "@babel/runtime/helpers/extends";
4
5
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
5
6
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
6
7
  var _templateObject;
@@ -8,9 +9,10 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
8
9
  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; }
9
10
  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; }
10
11
  /** @jsx jsx */
11
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
12
+ import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';
12
13
  import { css, jsx } from '@emotion/react';
13
14
  import styled from '@emotion/styled';
15
+ import { useIntl } from 'react-intl-next';
14
16
  import invariant from 'tiny-invariant';
15
17
  import Heading from '@atlaskit/heading';
16
18
  import { Skeleton } from '@atlaskit/linking-common';
@@ -27,7 +29,7 @@ import { ColumnPicker } from './column-picker';
27
29
  import { DragColumnPreview } from './drag-column-preview';
28
30
  import { DraggableTableHeading } from './draggable-table-heading';
29
31
  import TableEmptyState from './empty-state';
30
- import { fallbackRenderType } from './render-type';
32
+ import { fallbackRenderType, stringifyType } from './render-type';
31
33
  import { Table, TableHeading } from './styled';
32
34
  import { useIsOnScreen } from './useIsOnScreen';
33
35
  var tableSidePadding = "var(--ds-space-200, 16px)";
@@ -37,6 +39,11 @@ var tableHeadStyles = css({
37
39
  top: 0,
38
40
  zIndex: stickyTableHeadersIndex
39
41
  });
42
+ var truncateTextStyles = css({
43
+ overflow: 'hidden',
44
+ textOverflow: 'ellipsis',
45
+ whiteSpace: 'nowrap'
46
+ });
40
47
  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
48
  var truncatedCellStyles = css({
42
49
  overflow: 'hidden',
@@ -206,6 +213,13 @@ function getDefaultColumnWidth(key, type) {
206
213
  return DEFAULT_WIDTH;
207
214
  }
208
215
  }
216
+ var TruncateTextTag = /*#__PURE__*/forwardRef(function (props, ref) {
217
+ return jsx("span", _extends({
218
+ css: truncateTextStyles
219
+ }, props, {
220
+ ref: ref
221
+ }), props.children);
222
+ });
209
223
  export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref5) {
210
224
  var testId = _ref5.testId,
211
225
  onNextPage = _ref5.onNextPage,
@@ -226,6 +240,7 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref5) {
226
240
  var tableId = useMemo(function () {
227
241
  return Symbol('unique-id');
228
242
  }, []);
243
+ var intl = useIntl();
229
244
  var tableHeaderRowRef = useRef(null);
230
245
  var _useState = useState(null),
231
246
  _useState2 = _slicedToArray(_useState, 2),
@@ -391,15 +406,29 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref5) {
391
406
  type = _ref11.type;
392
407
  var value = ((_newRowData$key = newRowData[key]) === null || _newRowData$key === void 0 ? void 0 : _newRowData$key.data) || newRowData[key];
393
408
  var values = Array.isArray(value) ? value : [value];
394
- var content = values.map(function (value) {
409
+ var renderedValues = values.map(function (value) {
395
410
  return renderItem({
396
411
  type: type,
397
412
  value: value
398
413
  });
399
414
  });
415
+ var stringifiedContent = values.map(function (value) {
416
+ return stringifyType({
417
+ type: type,
418
+ value: value
419
+ }, intl.formatMessage, intl.formatDate);
420
+ }).filter(function (value) {
421
+ return value !== '';
422
+ }).join(', ');
423
+ var content = renderedValues.length === 1 ? renderedValues[0] : renderedValues;
424
+ var contentComponent = stringifiedContent ? jsx(Tooltip, {
425
+ tag: TruncateTextTag,
426
+ content: stringifiedContent,
427
+ testId: "issues-table-cell-tooltip"
428
+ }, content) : content;
400
429
  return {
401
430
  key: key,
402
- content: content.length === 1 ? content[0] : content,
431
+ content: contentComponent,
403
432
  width: getColumnWidth(key, type)
404
433
  };
405
434
  }),
@@ -408,7 +437,7 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref5) {
408
437
  } : undefined
409
438
  };
410
439
  });
411
- }, [items, visibleSortedColumns, getColumnWidth, renderItem]);
440
+ }, [items, visibleSortedColumns, getColumnWidth, renderItem, intl]);
412
441
  var rows = useMemo(function () {
413
442
  if (status !== 'loading') {
414
443
  return tableRows;
@@ -19,13 +19,9 @@ var timeOptions = {
19
19
  minute: '2-digit'
20
20
  };
21
21
  var DateTimeWrapper = styled.span(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n font-size: ", ";\n"])), FieldTextFontSize);
22
- var DateTimeRenderType = function DateTimeRenderType(_ref) {
23
- var value = _ref.value,
24
- _ref$testId = _ref.testId,
25
- testId = _ref$testId === void 0 ? DATETIME_TYPE_TEST_ID : _ref$testId,
26
- _ref$display = _ref.display,
27
- display = _ref$display === void 0 ? 'datetime' : _ref$display;
28
- var intl = useIntl();
22
+ export function getFormattedDate(value) {
23
+ var display = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'datetime';
24
+ var formatDate = arguments.length > 2 ? arguments[2] : undefined;
29
25
  /* In some cases we get a value of `2023-12-20` which when parsed by JS assumes meantime timezone, causing the date
30
26
  to be one day off in some timezones. We want it to display the date without converting timezones and a solution
31
27
  is to replace the hyphens with slashes. So it should be 20th Dec regardless of the timezone in this case.
@@ -34,14 +30,26 @@ var DateTimeRenderType = function DateTimeRenderType(_ref) {
34
30
  var dateValue = /^\d{4}-\d{2}-\d{2}$/.exec(value) ? value.replace(/-/g, '/') : value;
35
31
  var date = new Date(dateValue);
36
32
  if (!value || isNaN(date.getTime())) {
37
- return /*#__PURE__*/React.createElement(React.Fragment, null);
33
+ return '';
38
34
  }
39
35
  var options = {
40
36
  date: dateOptions,
41
37
  time: timeOptions,
42
38
  datetime: _objectSpread(_objectSpread({}, dateOptions), timeOptions)
43
39
  };
44
- var formattedString = intl.formatDate(date, options[display] || options['date']);
40
+ return formatDate(date, options[display] || options['date']);
41
+ }
42
+ var DateTimeRenderType = function DateTimeRenderType(_ref) {
43
+ var value = _ref.value,
44
+ _ref$testId = _ref.testId,
45
+ testId = _ref$testId === void 0 ? DATETIME_TYPE_TEST_ID : _ref$testId,
46
+ _ref$display = _ref.display,
47
+ display = _ref$display === void 0 ? 'datetime' : _ref$display;
48
+ var intl = useIntl();
49
+ var formattedString = getFormattedDate(value, display, intl.formatDate);
50
+ if (formattedString === '') {
51
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
52
+ }
45
53
  return /*#__PURE__*/React.createElement(DateTimeWrapper, {
46
54
  "data-testid": testId
47
55
  }, formattedString);
@@ -1,15 +1,47 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
3
  import BooleanRenderType from './boolean';
4
- import DateTimeRenderType from './date-time';
4
+ import DateTimeRenderType, { getFormattedDate } from './date-time';
5
5
  import IconRenderType from './icon';
6
6
  import LinkRenderType from './link';
7
7
  import NumberRenderType from './number';
8
- import RichTextRenderType from './richtext';
8
+ import RichTextRenderType, { parseRichText } from './richtext';
9
9
  import StatusRenderType from './status';
10
10
  import TagRenderType from './tag';
11
11
  import StringRenderType from './text';
12
12
  import UserRenderType from './user';
13
+ import { userTypeMessages } from './user/messages';
14
+ export var stringifyType = function stringifyType(_ref, formatMessage, formatDate) {
15
+ var type = _ref.type,
16
+ value = _ref.value;
17
+ switch (type) {
18
+ case 'boolean':
19
+ case 'number':
20
+ return (value === null || value === void 0 ? void 0 : value.toString()) || '';
21
+ case 'date':
22
+ return getFormattedDate(value, 'date', formatDate);
23
+ case 'datetime':
24
+ return getFormattedDate(value, 'datetime', formatDate);
25
+ case 'time':
26
+ return getFormattedDate(value, 'time', formatDate);
27
+ case 'icon':
28
+ return (value === null || value === void 0 ? void 0 : value.label) || '';
29
+ case 'status':
30
+ return (value === null || value === void 0 ? void 0 : value.text.toString()) || '';
31
+ case 'string':
32
+ return value;
33
+ case 'tag':
34
+ return (value === null || value === void 0 ? void 0 : value.text) || '';
35
+ case 'user':
36
+ return (value === null || value === void 0 ? void 0 : value.displayName) || formatMessage(userTypeMessages.userDefaultdisplayNameValue);
37
+ case 'richtext':
38
+ var adfPlainText = parseRichText(value);
39
+ return adfPlainText || '';
40
+ case 'link':
41
+ default:
42
+ return '';
43
+ }
44
+ };
13
45
  export var fallbackRenderType = function fallbackRenderType(item) {
14
46
  var _item$value, _item$value2, _item$value3;
15
47
  switch (item.type) {
@@ -14,22 +14,25 @@ var rootStyles = css({
14
14
  position: 'relative',
15
15
  display: 'block'
16
16
  });
17
+ export var parseRichText = function parseRichText(value) {
18
+ try {
19
+ if (value.type === 'adf') {
20
+ var adf = JSON.parse(value.text);
21
+ return PMNode.fromJSON(defaultSchema, _objectSpread(_objectSpread({}, adf), {}, {
22
+ content: _toConsumableArray(adf.content.slice(0, 2))
23
+ })).textContent;
24
+ }
25
+ return null;
26
+ } catch (e) {
27
+ // eslint-disable-next-line no-console
28
+ console.error('error parsing adf', e);
29
+ return null;
30
+ }
31
+ };
17
32
  var RichTextType = function RichTextType(_ref) {
18
33
  var value = _ref.value;
19
34
  var adfPlainText = useMemo(function () {
20
- try {
21
- if (value.type === 'adf') {
22
- var adf = JSON.parse(value.text);
23
- return PMNode.fromJSON(defaultSchema, _objectSpread(_objectSpread({}, adf), {}, {
24
- content: _toConsumableArray(adf.content.slice(0, 2))
25
- })).textContent;
26
- }
27
- return null;
28
- } catch (e) {
29
- // eslint-disable-next-line no-console
30
- console.error('error parsing adf', e);
31
- return null;
32
- }
35
+ return parseRichText(value);
33
36
  }, [value]);
34
37
  if (adfPlainText) {
35
38
  return jsx("div", {
@@ -1,4 +1,5 @@
1
1
  /// <reference types="react" />
2
+ import { IntlShape } from 'react-intl-next';
2
3
  import { DateTimeType, DateType, TimeType } from '@atlaskit/linking-types';
3
4
  export interface DateProps {
4
5
  testId?: string;
@@ -6,5 +7,6 @@ export interface DateProps {
6
7
  display: (DateType | TimeType | DateTimeType)['type'];
7
8
  }
8
9
  export declare const DATETIME_TYPE_TEST_ID = "link-datasource-render-type--datetime";
10
+ export declare function getFormattedDate(value: string, display: string | undefined, formatDate: IntlShape['formatDate']): string;
9
11
  declare const DateTimeRenderType: ({ value, testId, display, }: DateProps) => JSX.Element;
10
12
  export default DateTimeRenderType;
@@ -1,2 +1,5 @@
1
+ import { IntlShape } from 'react-intl-next';
2
+ import { DatasourceType } from '@atlaskit/linking-types';
1
3
  import { TableViewPropsRenderType } from '../types';
4
+ export declare const stringifyType: ({ type, value }: DatasourceType, formatMessage: IntlShape['formatMessage'], formatDate: IntlShape['formatDate']) => string;
2
5
  export declare const fallbackRenderType: TableViewPropsRenderType;
@@ -1,5 +1,6 @@
1
1
  import { jsx } from '@emotion/react';
2
2
  import { RichText } from '@atlaskit/linking-types';
3
+ export declare const parseRichText: (value: RichText) => string | null;
3
4
  declare const RichTextType: ({ value }: {
4
5
  value: RichText;
5
6
  }) => jsx.JSX.Element;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="react" />
2
+ import { IntlShape } from 'react-intl-next';
2
3
  import { DateTimeType, DateType, TimeType } from '@atlaskit/linking-types';
3
4
  export interface DateProps {
4
5
  testId?: string;
@@ -6,5 +7,6 @@ export interface DateProps {
6
7
  display: (DateType | TimeType | DateTimeType)['type'];
7
8
  }
8
9
  export declare const DATETIME_TYPE_TEST_ID = "link-datasource-render-type--datetime";
10
+ export declare function getFormattedDate(value: string, display: string | undefined, formatDate: IntlShape['formatDate']): string;
9
11
  declare const DateTimeRenderType: ({ value, testId, display, }: DateProps) => JSX.Element;
10
12
  export default DateTimeRenderType;
@@ -1,2 +1,5 @@
1
+ import { IntlShape } from 'react-intl-next';
2
+ import { DatasourceType } from '@atlaskit/linking-types';
1
3
  import { TableViewPropsRenderType } from '../types';
4
+ export declare const stringifyType: ({ type, value }: DatasourceType, formatMessage: IntlShape['formatMessage'], formatDate: IntlShape['formatDate']) => string;
2
5
  export declare const fallbackRenderType: TableViewPropsRenderType;
@@ -1,5 +1,6 @@
1
1
  import { jsx } from '@emotion/react';
2
2
  import { RichText } from '@atlaskit/linking-types';
3
+ export declare const parseRichText: (value: RichText) => string | null;
3
4
  declare const RichTextType: ({ value }: {
4
5
  value: RichText;
5
6
  }) => jsx.JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "1.19.37",
3
+ "version": "1.19.38",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -55,14 +55,14 @@
55
55
  "@atlaskit/pragmatic-drag-and-drop-hitbox": "^0.12.0",
56
56
  "@atlaskit/pragmatic-drag-and-drop-react-beautiful-dnd-autoscroll": "^0.6.0",
57
57
  "@atlaskit/pragmatic-drag-and-drop-react-indicator": "^0.18.0",
58
- "@atlaskit/primitives": "^1.15.0",
58
+ "@atlaskit/primitives": "^1.16.0",
59
59
  "@atlaskit/select": "^17.0.3",
60
60
  "@atlaskit/smart-card": "^26.43.0",
61
61
  "@atlaskit/spinner": "^16.0.0",
62
62
  "@atlaskit/tag": "^12.0.0",
63
63
  "@atlaskit/textfield": "6.0.0",
64
64
  "@atlaskit/theme": "^12.6.0",
65
- "@atlaskit/tokens": "^1.32.0",
65
+ "@atlaskit/tokens": "^1.33.0",
66
66
  "@atlaskit/tooltip": "^18.1.0",
67
67
  "@atlaskit/ufo": "^0.2.4",
68
68
  "@atlassianlabs/jql-editor": "^2.0.1",