@atlaskit/link-datasource 7.8.1 → 7.9.0

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,26 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 7.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`cdcc836eb6f91`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cdcc836eb6f91) -
8
+ Add support for the new `objectReference` datasource type (`{ url, text?, avatarUrl? }`). Behind
9
+ `astral_assets_macro_table_ui_uplift` it renders as an `AvatarTag` with a Smart Link hover card
10
+ that opens in a new tab; when the gate is off it falls back to the existing link render type.
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
16
+ ## 7.8.2
17
+
18
+ ### Patch Changes
19
+
20
+ - [`1a4bf8ba80113`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1a4bf8ba80113) -
21
+ Remove the `platform_lp_sllv_preserve_assets_columns` feature gate and permanently preserve
22
+ selected Assets columns when editing AQL within the same object schema.
23
+
3
24
  ## 7.8.1
4
25
 
5
26
  ### Patch Changes
@@ -165,7 +165,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
165
165
  // newly selected ones - refetching for them, and throwing away the results just received. The
166
166
  // re-render this schedules is discarded before commit, so the hook only ever sees the reconciled
167
167
  // selection.
168
- if ((0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns && status === 'resolved' && columns.length > 0) {
168
+ if (hasPreservedColumns && status === 'resolved' && columns.length > 0) {
169
169
  var availableKeys = new Set(columns.map(function (_ref) {
170
170
  var key = _ref.key;
171
171
  return key;
@@ -241,7 +241,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
241
241
  }, []);
242
242
  (0, _react.useEffect)(function () {
243
243
  // A preserved selection owns the columns, so restoring the saved or default ones would undo it
244
- if ((0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns) {
244
+ if (hasPreservedColumns) {
245
245
  return;
246
246
  }
247
247
  var newVisibleColumnKeys = initialVisibleColumnKeys && initialVisibleColumnKeys.length > 0 && apiVersion === VERSION_TWO ? initialVisibleColumnKeys : defaultVisibleColumnKeys;
@@ -251,7 +251,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
251
251
  // The response described none of the requested fields, so there is nothing valid to keep and
252
252
  // no reported defaults to fall back to. Give up preserving and re-request the schema's own
253
253
  // defaults. This one has to stay an effect because it issues a request.
254
- if (!(0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') || !hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
254
+ if (!hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
255
255
  return;
256
256
  }
257
257
  setHasPreservedColumns(false);
@@ -339,7 +339,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
339
339
  }
340
340
  // An empty selection has nothing worth preserving, and keeping it would stop the
341
341
  // response's defaults from being adopted
342
- var shouldPreserveColumns = (0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') && schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
342
+ var shouldPreserveColumns = schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
343
343
  setHasPreservedColumns(shouldPreserveColumns);
344
344
  setAql(searchAql);
345
345
  setSchemaId(searchSchemaId);
@@ -109,6 +109,7 @@ var RenderAssetsContent = exports.RenderAssetsContent = function RenderAssetsCon
109
109
  return /*#__PURE__*/React.createElement(_stack.Stack, {
110
110
  space: "space.200"
111
111
  }, status !== 'empty' && /*#__PURE__*/React.createElement(_heading.default, {
112
+ as: "h2",
112
113
  size: "xsmall"
113
114
  }, /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _messages.modalMessages.tablePreviewText)), renderAssetsContentView());
114
115
  }
@@ -126,6 +126,7 @@ var AssetsSearchContainer = exports.AssetsSearchContainer = function AssetsSearc
126
126
  }, /*#__PURE__*/React.createElement(_closeButton.CloseButton, {
127
127
  onClick: onCancel
128
128
  })))), (0, _fg.fg)('astral_assets_macro_table_ui_uplift') ? /*#__PURE__*/React.createElement(_heading.default, {
129
+ as: "h2",
129
130
  size: "xsmall"
130
131
  }, /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _messages.modalMessages.filterObjectsText)) : null, /*#__PURE__*/React.createElement(_styled.FormRowContainer, null, /*#__PURE__*/React.createElement(_aqlSearchInput.AqlSearchInput, {
131
132
  value: (_initialSearchData$aq = initialSearchData.aql) !== null && _initialSearchData$aq !== void 0 ? _initialSearchData$aq : DEFAULT_AQL_QUERY,
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = exports.OBJECT_REFERENCE_TYPE_TEST_ID = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactIntl = require("react-intl");
12
+ var _anchor = require("@atlaskit/primitives/compiled/anchor");
13
+ var _useSmartLinkDestinationUrl = require("@atlaskit/smart-card/hook/use-smart-link-destination-url");
14
+ var _hover = require("@atlaskit/smart-card/hover");
15
+ var _avatarTag = _interopRequireDefault(require("@atlaskit/tag/avatar-tag"));
16
+ var _teamsAvatar = _interopRequireDefault(require("@atlaskit/teams-avatar/teams-avatar"));
17
+ var _messages = require("../link/messages");
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
19
+ var OBJECT_REFERENCE_TYPE_TEST_ID = exports.OBJECT_REFERENCE_TYPE_TEST_ID = 'link-datasource-render-type--object-reference';
20
+
21
+ /**
22
+ * Renders an `objectReference` datasource value as an avatar tag that links to the referenced
23
+ * object. Behaves like the `link` render type (opens in a new tab, shows a Smart Link hover card,
24
+ * honours cross-product URL wrapping) but with the look and feel of an `AvatarTag`.
25
+ */
26
+ var ObjectReferenceRenderType = function ObjectReferenceRenderType(_ref) {
27
+ var url = _ref.url,
28
+ text = _ref.text,
29
+ avatarUrl = _ref.avatarUrl,
30
+ _ref$testId = _ref.testId,
31
+ testId = _ref$testId === void 0 ? OBJECT_REFERENCE_TYPE_TEST_ID : _ref$testId;
32
+ var _useIntl = (0, _reactIntl.useIntl)(),
33
+ formatMessage = _useIntl.formatMessage;
34
+ var destinationUrl = (0, _useSmartLinkDestinationUrl.useSmartLinkDestinationUrl)(url);
35
+ var newWindowLabel = formatMessage(_messages.messages.opensInNewTab);
36
+
37
+ // `AvatarTag` provides the controlled avatar props (size, appearance, border colour); we only
38
+ // supply the image source and accessible name.
39
+ var avatar = (0, _react.useMemo)(function () {
40
+ return function (props) {
41
+ return /*#__PURE__*/_react.default.createElement(_teamsAvatar.default, (0, _extends2.default)({}, props, {
42
+ src: avatarUrl,
43
+ name: text,
44
+ testId: "".concat(testId, "--avatar")
45
+ }));
46
+ };
47
+ }, [avatarUrl, text, testId]);
48
+ var linkComponent = (0, _react.useMemo)(function () {
49
+ return function (props) {
50
+ return /*#__PURE__*/_react.default.createElement(_anchor.Anchor, (0, _extends2.default)({}, props, {
51
+ target: "_blank",
52
+ rel: "noopener noreferrer",
53
+ newWindowLabel: newWindowLabel
54
+ }));
55
+ };
56
+ }, [newWindowLabel]);
57
+
58
+ // url can be undefined before data is fetched whilst adding a new column to display
59
+ if (!url) {
60
+ return null;
61
+ }
62
+ return /*#__PURE__*/_react.default.createElement(_hover.HoverCard, {
63
+ url: url
64
+ }, /*#__PURE__*/_react.default.createElement(_avatarTag.default, {
65
+ type: "other",
66
+ text: text,
67
+ href: destinationUrl,
68
+ isRemovable: false,
69
+ avatar: avatar,
70
+ linkComponent: linkComponent,
71
+ testId: testId
72
+ }));
73
+ };
74
+ var _default_1 = /*#__PURE__*/_react.default.memo(ObjectReferenceRenderType);
75
+ var _default = exports.default = _default_1;
@@ -7,12 +7,14 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.renderType = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _react = _interopRequireDefault(require("react"));
10
+ var _fg = require("@atlaskit/platform-feature-flags/fg");
10
11
  var _boolean = _interopRequireDefault(require("./boolean"));
11
12
  var _dateRange = _interopRequireDefault(require("./date-range"));
12
13
  var _dateTime = _interopRequireDefault(require("./date-time"));
13
14
  var _icon = _interopRequireDefault(require("./icon"));
14
15
  var _link = _interopRequireDefault(require("./link"));
15
16
  var _number = _interopRequireDefault(require("./number"));
17
+ var _objectReference = _interopRequireDefault(require("./object-reference"));
16
18
  var _richtext = _interopRequireDefault(require("./richtext"));
17
19
  var _status = _interopRequireDefault(require("./status"));
18
20
  var _tag = _interopRequireDefault(require("./tag"));
@@ -64,6 +66,16 @@ var renderType = exports.renderType = function renderType(item) {
64
66
  number: numberValue
65
67
  });
66
68
  });
69
+ case 'objectReference':
70
+ return item.values.map(function (objectReferenceValue) {
71
+ return (0, _fg.fg)('astral_assets_macro_table_ui_uplift') ? /*#__PURE__*/_react.default.createElement(_objectReference.default, (0, _extends2.default)({
72
+ key: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url
73
+ }, objectReferenceValue)) : /*#__PURE__*/_react.default.createElement(_link.default, {
74
+ key: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url,
75
+ url: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url,
76
+ text: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.text
77
+ });
78
+ });
67
79
  case 'status':
68
80
  return item.values.map(function (statusValue) {
69
81
  return /*#__PURE__*/_react.default.createElement(_status.default, statusValue);
@@ -43,6 +43,7 @@ var stringifyType = exports.stringifyType = function stringifyType(_ref, formatM
43
43
  return adfPlainText || '';
44
44
  }
45
45
  case 'link':
46
+ case 'objectReference':
46
47
  default:
47
48
  return '';
48
49
  }
@@ -135,7 +135,7 @@ const PlainAssetsConfigModal = props => {
135
135
  // newly selected ones - refetching for them, and throwing away the results just received. The
136
136
  // re-render this schedules is discarded before commit, so the hook only ever sees the reconciled
137
137
  // selection.
138
- if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns && status === 'resolved' && columns.length > 0) {
138
+ if (hasPreservedColumns && status === 'resolved' && columns.length > 0) {
139
139
  const availableKeys = new Set(columns.map(({
140
140
  key
141
141
  }) => key));
@@ -209,7 +209,7 @@ const PlainAssetsConfigModal = props => {
209
209
  }, []);
210
210
  useEffect(() => {
211
211
  // A preserved selection owns the columns, so restoring the saved or default ones would undo it
212
- if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns) {
212
+ if (hasPreservedColumns) {
213
213
  return;
214
214
  }
215
215
  const newVisibleColumnKeys = initialVisibleColumnKeys && initialVisibleColumnKeys.length > 0 && apiVersion === VERSION_TWO ? initialVisibleColumnKeys : defaultVisibleColumnKeys;
@@ -219,7 +219,7 @@ const PlainAssetsConfigModal = props => {
219
219
  // The response described none of the requested fields, so there is nothing valid to keep and
220
220
  // no reported defaults to fall back to. Give up preserving and re-request the schema's own
221
221
  // defaults. This one has to stay an effect because it issues a request.
222
- if (!fg('platform_lp_sllv_preserve_assets_columns') || !hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
222
+ if (!hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
223
223
  return;
224
224
  }
225
225
  setHasPreservedColumns(false);
@@ -305,7 +305,7 @@ const PlainAssetsConfigModal = props => {
305
305
  }
306
306
  // An empty selection has nothing worth preserving, and keeping it would stop the
307
307
  // response's defaults from being adopted
308
- const shouldPreserveColumns = fg('platform_lp_sllv_preserve_assets_columns') && schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
308
+ const shouldPreserveColumns = schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
309
309
  setHasPreservedColumns(shouldPreserveColumns);
310
310
  setAql(searchAql);
311
311
  setSchemaId(searchSchemaId);
@@ -90,6 +90,7 @@ export const RenderAssetsContent = props => {
90
90
  return /*#__PURE__*/React.createElement(Stack, {
91
91
  space: "space.200"
92
92
  }, status !== 'empty' && /*#__PURE__*/React.createElement(Heading, {
93
+ as: "h2",
93
94
  size: "xsmall"
94
95
  }, /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.tablePreviewText)), renderAssetsContentView());
95
96
  }
@@ -121,6 +121,7 @@ export const AssetsSearchContainer = props => {
121
121
  }, /*#__PURE__*/React.createElement(CloseButton, {
122
122
  onClick: onCancel
123
123
  })))), fg('astral_assets_macro_table_ui_uplift') ? /*#__PURE__*/React.createElement(Heading, {
124
+ as: "h2",
124
125
  size: "xsmall"
125
126
  }, /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.filterObjectsText)) : null, /*#__PURE__*/React.createElement(FormRowContainer, null, /*#__PURE__*/React.createElement(AqlSearchInput, {
126
127
  value: (_initialSearchData$aq = initialSearchData.aql) !== null && _initialSearchData$aq !== void 0 ? _initialSearchData$aq : DEFAULT_AQL_QUERY,
@@ -0,0 +1,59 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useMemo } from 'react';
3
+ import { useIntl } from 'react-intl';
4
+ import { Anchor } from '@atlaskit/primitives/compiled/anchor';
5
+ import { useSmartLinkDestinationUrl } from '@atlaskit/smart-card/hook/use-smart-link-destination-url';
6
+ import { HoverCard } from '@atlaskit/smart-card/hover';
7
+ import AvatarTag from '@atlaskit/tag/avatar-tag';
8
+ import TeamAvatar from '@atlaskit/teams-avatar/teams-avatar';
9
+ import { messages } from '../link/messages';
10
+ export const OBJECT_REFERENCE_TYPE_TEST_ID = 'link-datasource-render-type--object-reference';
11
+
12
+ /**
13
+ * Renders an `objectReference` datasource value as an avatar tag that links to the referenced
14
+ * object. Behaves like the `link` render type (opens in a new tab, shows a Smart Link hover card,
15
+ * honours cross-product URL wrapping) but with the look and feel of an `AvatarTag`.
16
+ */
17
+ const ObjectReferenceRenderType = ({
18
+ url,
19
+ text,
20
+ avatarUrl,
21
+ testId = OBJECT_REFERENCE_TYPE_TEST_ID
22
+ }) => {
23
+ const {
24
+ formatMessage
25
+ } = useIntl();
26
+ const destinationUrl = useSmartLinkDestinationUrl(url);
27
+ const newWindowLabel = formatMessage(messages.opensInNewTab);
28
+
29
+ // `AvatarTag` provides the controlled avatar props (size, appearance, border colour); we only
30
+ // supply the image source and accessible name.
31
+ const avatar = useMemo(() => props => /*#__PURE__*/React.createElement(TeamAvatar, _extends({}, props, {
32
+ src: avatarUrl,
33
+ name: text,
34
+ testId: `${testId}--avatar`
35
+ })), [avatarUrl, text, testId]);
36
+ const linkComponent = useMemo(() => props => /*#__PURE__*/React.createElement(Anchor, _extends({}, props, {
37
+ target: "_blank",
38
+ rel: "noopener noreferrer",
39
+ newWindowLabel: newWindowLabel
40
+ })), [newWindowLabel]);
41
+
42
+ // url can be undefined before data is fetched whilst adding a new column to display
43
+ if (!url) {
44
+ return null;
45
+ }
46
+ return /*#__PURE__*/React.createElement(HoverCard, {
47
+ url: url
48
+ }, /*#__PURE__*/React.createElement(AvatarTag, {
49
+ type: "other",
50
+ text: text,
51
+ href: destinationUrl,
52
+ isRemovable: false,
53
+ avatar: avatar,
54
+ linkComponent: linkComponent,
55
+ testId: testId
56
+ }));
57
+ };
58
+ const _default_1 = /*#__PURE__*/React.memo(ObjectReferenceRenderType);
59
+ export default _default_1;
@@ -1,11 +1,13 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
3
4
  import BooleanRenderType from './boolean';
4
5
  import DateRangeRenderType from './date-range';
5
6
  import DateTimeRenderType from './date-time';
6
7
  import IconRenderType from './icon';
7
8
  import LinkRenderType from './link';
8
9
  import NumberRenderType from './number';
10
+ import ObjectReferenceRenderType from './object-reference';
9
11
  import RichTextRenderType from './richtext';
10
12
  import StatusRenderType from './status';
11
13
  import TagRenderType from './tag';
@@ -43,6 +45,14 @@ export const renderType = item => {
43
45
  return item.values.map(numberValue => /*#__PURE__*/React.createElement(NumberRenderType, {
44
46
  number: numberValue
45
47
  }));
48
+ case 'objectReference':
49
+ return item.values.map(objectReferenceValue => fg('astral_assets_macro_table_ui_uplift') ? /*#__PURE__*/React.createElement(ObjectReferenceRenderType, _extends({
50
+ key: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url
51
+ }, objectReferenceValue)) : /*#__PURE__*/React.createElement(LinkRenderType, {
52
+ key: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url,
53
+ url: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url,
54
+ text: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.text
55
+ }));
46
56
  case 'status':
47
57
  return item.values.map(statusValue => /*#__PURE__*/React.createElement(StatusRenderType, statusValue));
48
58
  case 'string':
@@ -38,6 +38,7 @@ export const stringifyType = ({
38
38
  return adfPlainText || '';
39
39
  }
40
40
  case 'link':
41
+ case 'objectReference':
41
42
  default:
42
43
  return '';
43
44
  }
@@ -157,7 +157,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
157
157
  // newly selected ones - refetching for them, and throwing away the results just received. The
158
158
  // re-render this schedules is discarded before commit, so the hook only ever sees the reconciled
159
159
  // selection.
160
- if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns && status === 'resolved' && columns.length > 0) {
160
+ if (hasPreservedColumns && status === 'resolved' && columns.length > 0) {
161
161
  var availableKeys = new Set(columns.map(function (_ref) {
162
162
  var key = _ref.key;
163
163
  return key;
@@ -233,7 +233,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
233
233
  }, []);
234
234
  useEffect(function () {
235
235
  // A preserved selection owns the columns, so restoring the saved or default ones would undo it
236
- if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns) {
236
+ if (hasPreservedColumns) {
237
237
  return;
238
238
  }
239
239
  var newVisibleColumnKeys = initialVisibleColumnKeys && initialVisibleColumnKeys.length > 0 && apiVersion === VERSION_TWO ? initialVisibleColumnKeys : defaultVisibleColumnKeys;
@@ -243,7 +243,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
243
243
  // The response described none of the requested fields, so there is nothing valid to keep and
244
244
  // no reported defaults to fall back to. Give up preserving and re-request the schema's own
245
245
  // defaults. This one has to stay an effect because it issues a request.
246
- if (!fg('platform_lp_sllv_preserve_assets_columns') || !hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
246
+ if (!hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
247
247
  return;
248
248
  }
249
249
  setHasPreservedColumns(false);
@@ -331,7 +331,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
331
331
  }
332
332
  // An empty selection has nothing worth preserving, and keeping it would stop the
333
333
  // response's defaults from being adopted
334
- var shouldPreserveColumns = fg('platform_lp_sllv_preserve_assets_columns') && schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
334
+ var shouldPreserveColumns = schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
335
335
  setHasPreservedColumns(shouldPreserveColumns);
336
336
  setAql(searchAql);
337
337
  setSchemaId(searchSchemaId);
@@ -100,6 +100,7 @@ export var RenderAssetsContent = function RenderAssetsContent(props) {
100
100
  return /*#__PURE__*/React.createElement(Stack, {
101
101
  space: "space.200"
102
102
  }, status !== 'empty' && /*#__PURE__*/React.createElement(Heading, {
103
+ as: "h2",
103
104
  size: "xsmall"
104
105
  }, /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.tablePreviewText)), renderAssetsContentView());
105
106
  }
@@ -117,6 +117,7 @@ export var AssetsSearchContainer = function AssetsSearchContainer(props) {
117
117
  }, /*#__PURE__*/React.createElement(CloseButton, {
118
118
  onClick: onCancel
119
119
  })))), fg('astral_assets_macro_table_ui_uplift') ? /*#__PURE__*/React.createElement(Heading, {
120
+ as: "h2",
120
121
  size: "xsmall"
121
122
  }, /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.filterObjectsText)) : null, /*#__PURE__*/React.createElement(FormRowContainer, null, /*#__PURE__*/React.createElement(AqlSearchInput, {
122
123
  value: (_initialSearchData$aq = initialSearchData.aql) !== null && _initialSearchData$aq !== void 0 ? _initialSearchData$aq : DEFAULT_AQL_QUERY,
@@ -0,0 +1,66 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useMemo } from 'react';
3
+ import { useIntl } from 'react-intl';
4
+ import { Anchor } from '@atlaskit/primitives/compiled/anchor';
5
+ import { useSmartLinkDestinationUrl } from '@atlaskit/smart-card/hook/use-smart-link-destination-url';
6
+ import { HoverCard } from '@atlaskit/smart-card/hover';
7
+ import AvatarTag from '@atlaskit/tag/avatar-tag';
8
+ import TeamAvatar from '@atlaskit/teams-avatar/teams-avatar';
9
+ import { messages } from '../link/messages';
10
+ export var OBJECT_REFERENCE_TYPE_TEST_ID = 'link-datasource-render-type--object-reference';
11
+
12
+ /**
13
+ * Renders an `objectReference` datasource value as an avatar tag that links to the referenced
14
+ * object. Behaves like the `link` render type (opens in a new tab, shows a Smart Link hover card,
15
+ * honours cross-product URL wrapping) but with the look and feel of an `AvatarTag`.
16
+ */
17
+ var ObjectReferenceRenderType = function ObjectReferenceRenderType(_ref) {
18
+ var url = _ref.url,
19
+ text = _ref.text,
20
+ avatarUrl = _ref.avatarUrl,
21
+ _ref$testId = _ref.testId,
22
+ testId = _ref$testId === void 0 ? OBJECT_REFERENCE_TYPE_TEST_ID : _ref$testId;
23
+ var _useIntl = useIntl(),
24
+ formatMessage = _useIntl.formatMessage;
25
+ var destinationUrl = useSmartLinkDestinationUrl(url);
26
+ var newWindowLabel = formatMessage(messages.opensInNewTab);
27
+
28
+ // `AvatarTag` provides the controlled avatar props (size, appearance, border colour); we only
29
+ // supply the image source and accessible name.
30
+ var avatar = useMemo(function () {
31
+ return function (props) {
32
+ return /*#__PURE__*/React.createElement(TeamAvatar, _extends({}, props, {
33
+ src: avatarUrl,
34
+ name: text,
35
+ testId: "".concat(testId, "--avatar")
36
+ }));
37
+ };
38
+ }, [avatarUrl, text, testId]);
39
+ var linkComponent = useMemo(function () {
40
+ return function (props) {
41
+ return /*#__PURE__*/React.createElement(Anchor, _extends({}, props, {
42
+ target: "_blank",
43
+ rel: "noopener noreferrer",
44
+ newWindowLabel: newWindowLabel
45
+ }));
46
+ };
47
+ }, [newWindowLabel]);
48
+
49
+ // url can be undefined before data is fetched whilst adding a new column to display
50
+ if (!url) {
51
+ return null;
52
+ }
53
+ return /*#__PURE__*/React.createElement(HoverCard, {
54
+ url: url
55
+ }, /*#__PURE__*/React.createElement(AvatarTag, {
56
+ type: "other",
57
+ text: text,
58
+ href: destinationUrl,
59
+ isRemovable: false,
60
+ avatar: avatar,
61
+ linkComponent: linkComponent,
62
+ testId: testId
63
+ }));
64
+ };
65
+ var _default_1 = /*#__PURE__*/React.memo(ObjectReferenceRenderType);
66
+ export default _default_1;
@@ -1,11 +1,13 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
3
4
  import BooleanRenderType from './boolean';
4
5
  import DateRangeRenderType from './date-range';
5
6
  import DateTimeRenderType from './date-time';
6
7
  import IconRenderType from './icon';
7
8
  import LinkRenderType from './link';
8
9
  import NumberRenderType from './number';
10
+ import ObjectReferenceRenderType from './object-reference';
9
11
  import RichTextRenderType from './richtext';
10
12
  import StatusRenderType from './status';
11
13
  import TagRenderType from './tag';
@@ -57,6 +59,16 @@ export var renderType = function renderType(item) {
57
59
  number: numberValue
58
60
  });
59
61
  });
62
+ case 'objectReference':
63
+ return item.values.map(function (objectReferenceValue) {
64
+ return fg('astral_assets_macro_table_ui_uplift') ? /*#__PURE__*/React.createElement(ObjectReferenceRenderType, _extends({
65
+ key: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url
66
+ }, objectReferenceValue)) : /*#__PURE__*/React.createElement(LinkRenderType, {
67
+ key: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url,
68
+ url: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.url,
69
+ text: objectReferenceValue === null || objectReferenceValue === void 0 ? void 0 : objectReferenceValue.text
70
+ });
71
+ });
60
72
  case 'status':
61
73
  return item.values.map(function (statusValue) {
62
74
  return /*#__PURE__*/React.createElement(StatusRenderType, statusValue);
@@ -37,6 +37,7 @@ export var stringifyType = function stringifyType(_ref, formatMessage, formatDat
37
37
  return adfPlainText || '';
38
38
  }
39
39
  case 'link':
40
+ case 'objectReference':
40
41
  default:
41
42
  return '';
42
43
  }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { ObjectReference } from '@atlaskit/linking-types/datasource';
3
+ interface ObjectReferenceProps extends ObjectReference {
4
+ testId?: string;
5
+ }
6
+ export declare const OBJECT_REFERENCE_TYPE_TEST_ID = "link-datasource-render-type--object-reference";
7
+ declare const _default_1: React.MemoExoticComponent<({ url, text, avatarUrl, testId }: ObjectReferenceProps) => React.JSX.Element | null>;
8
+ export default _default_1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "7.8.1",
3
+ "version": "7.9.0",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -53,7 +53,7 @@
53
53
  "@atlaskit/dropdown-menu": "^21.0.0",
54
54
  "@atlaskit/editor-prosemirror": "^9.0.0",
55
55
  "@atlaskit/empty-state": "^12.2.0",
56
- "@atlaskit/feature-gate-js-client": "^7.0.0",
56
+ "@atlaskit/feature-gate-js-client": "^7.1.0",
57
57
  "@atlaskit/flag": "^19.0.0",
58
58
  "@atlaskit/form": "^18.3.0",
59
59
  "@atlaskit/heading": "^8.0.0",
@@ -69,7 +69,7 @@
69
69
  "@atlaskit/link-client-extension": "^8.0.0",
70
70
  "@atlaskit/link-provider": "^6.0.0",
71
71
  "@atlaskit/linking-common": "^13.0.0",
72
- "@atlaskit/linking-types": "^16.0.0",
72
+ "@atlaskit/linking-types": "^16.1.0",
73
73
  "@atlaskit/logo": "^23.3.0",
74
74
  "@atlaskit/lozenge": "^17.0.0",
75
75
  "@atlaskit/modal-dialog": "^17.1.0",
@@ -91,6 +91,7 @@
91
91
  "@atlaskit/smart-user-picker": "^12.8.0",
92
92
  "@atlaskit/spinner": "^20.4.0",
93
93
  "@atlaskit/tag": "^17.0.0",
94
+ "@atlaskit/teams-avatar": "^4.2.0",
94
95
  "@atlaskit/textfield": "^10.3.0",
95
96
  "@atlaskit/theme": "^28.2.0",
96
97
  "@atlaskit/toggle": "^17.3.0",
@@ -98,7 +99,7 @@
98
99
  "@atlaskit/tooltip": "^24.4.0",
99
100
  "@atlaskit/top-layer": "^7.0.0",
100
101
  "@atlaskit/ufo": "^2.0.0",
101
- "@atlaskit/user-picker": "^14.3.0",
102
+ "@atlaskit/user-picker": "^14.4.0",
102
103
  "@atlaskit/visually-hidden": "^4.4.0",
103
104
  "@atlaskit/width-detector": "^7.2.0",
104
105
  "@babel/runtime": "^7.0.0",
@@ -127,7 +128,7 @@
127
128
  "@atlaskit/link-test-helpers": "^11.2.0",
128
129
  "@atlaskit/radio": "^10.2.0",
129
130
  "@atlaskit/ssr": "workspace:^",
130
- "@atlaskit/textarea": "^10.2.0",
131
+ "@atlaskit/textarea": "^10.3.0",
131
132
  "@atlassian/a11y-jest-testing": "^0.17.0",
132
133
  "@atlassian/a11y-playwright-testing": "^0.13.0",
133
134
  "@atlassian/experiment-test-utils": "^0.2.0",
@@ -166,9 +167,6 @@
166
167
  "linking_platform_link_datasource_unit_compliant": {
167
168
  "type": "boolean"
168
169
  },
169
- "platform_lp_sllv_preserve_assets_columns": {
170
- "type": "boolean"
171
- },
172
170
  "platform_lp_sllv_on_request_settled": {
173
171
  "type": "boolean"
174
172
  },