@atlaskit/smart-card 19.1.20 → 19.1.23

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 (56) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/state/actions/index.js +11 -4
  3. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +7 -3
  4. package/dist/cjs/state/helpers.js +26 -4
  5. package/dist/cjs/utils/analytics/analytics.js +3 -2
  6. package/dist/cjs/version.json +1 -1
  7. package/dist/cjs/view/CardWithUrl/component.js +4 -2
  8. package/dist/cjs/view/FlexibleCard/components/blocks/element-group/index.js +19 -2
  9. package/dist/cjs/view/FlexibleCard/components/blocks/footer-block/index.js +19 -0
  10. package/dist/cjs/view/FlexibleCard/components/blocks/metadata-block/index.js +6 -25
  11. package/dist/cjs/view/FlexibleCard/components/blocks/utils.js +1 -1
  12. package/dist/cjs/view/FlexibleCard/components/elements/avatar-group/index.js +5 -3
  13. package/dist/cjs/view/FlexibleCard/components/elements/badge/index.js +4 -4
  14. package/dist/cjs/view/FlexibleCard/components/elements/lozenge/index.js +1 -1
  15. package/dist/cjs/view/FlexibleCard/components/utils.js +19 -2
  16. package/dist/cjs/view/HoverCard/components/hover-card-content.js +2 -1
  17. package/dist/cjs/view/HoverCard/utils.js +6 -3
  18. package/dist/es2019/state/actions/index.js +12 -6
  19. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +6 -3
  20. package/dist/es2019/state/helpers.js +25 -3
  21. package/dist/es2019/utils/analytics/analytics.js +3 -2
  22. package/dist/es2019/version.json +1 -1
  23. package/dist/es2019/view/CardWithUrl/component.js +5 -3
  24. package/dist/es2019/view/FlexibleCard/components/blocks/element-group/index.js +48 -1
  25. package/dist/es2019/view/FlexibleCard/components/blocks/footer-block/index.js +16 -1
  26. package/dist/es2019/view/FlexibleCard/components/blocks/metadata-block/index.js +6 -33
  27. package/dist/es2019/view/FlexibleCard/components/blocks/utils.js +1 -0
  28. package/dist/es2019/view/FlexibleCard/components/elements/avatar-group/index.js +6 -1
  29. package/dist/es2019/view/FlexibleCard/components/elements/badge/index.js +7 -2
  30. package/dist/es2019/view/FlexibleCard/components/elements/lozenge/index.js +1 -0
  31. package/dist/es2019/view/FlexibleCard/components/utils.js +17 -1
  32. package/dist/es2019/view/HoverCard/components/hover-card-content.js +2 -1
  33. package/dist/es2019/view/HoverCard/utils.js +4 -3
  34. package/dist/esm/state/actions/index.js +12 -5
  35. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +8 -4
  36. package/dist/esm/state/helpers.js +19 -3
  37. package/dist/esm/utils/analytics/analytics.js +3 -2
  38. package/dist/esm/version.json +1 -1
  39. package/dist/esm/view/CardWithUrl/component.js +5 -3
  40. package/dist/esm/view/FlexibleCard/components/blocks/element-group/index.js +19 -3
  41. package/dist/esm/view/FlexibleCard/components/blocks/footer-block/index.js +19 -1
  42. package/dist/esm/view/FlexibleCard/components/blocks/metadata-block/index.js +6 -26
  43. package/dist/esm/view/FlexibleCard/components/blocks/utils.js +1 -1
  44. package/dist/esm/view/FlexibleCard/components/elements/avatar-group/index.js +5 -3
  45. package/dist/esm/view/FlexibleCard/components/elements/badge/index.js +4 -4
  46. package/dist/esm/view/FlexibleCard/components/elements/lozenge/index.js +1 -1
  47. package/dist/esm/view/FlexibleCard/components/utils.js +15 -1
  48. package/dist/esm/view/HoverCard/components/hover-card-content.js +2 -1
  49. package/dist/esm/view/HoverCard/utils.js +4 -3
  50. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +3 -1
  51. package/dist/types/state/helpers.d.ts +3 -0
  52. package/dist/types/state/hooks/useSmartLink.d.ts +1 -1
  53. package/dist/types/utils/analytics/analytics.d.ts +1 -1
  54. package/dist/types/utils/analytics/types.d.ts +1 -0
  55. package/dist/types/view/FlexibleCard/components/utils.d.ts +1 -0
  56. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 19.1.23
4
+
5
+ ### Patch Changes
6
+
7
+ - [`f538640e3a5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f538640e3a5) - fix: Previously the .reload() action would not propagate changes through to the smart-card state in some scenarios. This has been amended by making it an explicit Redux action.
8
+ - Updated dependencies
9
+
10
+ ## 19.1.22
11
+
12
+ ### Patch Changes
13
+
14
+ - [`c6978e3a40c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c6978e3a40c) - This update adds Destination product and subproduct (core, servicedesk, software, etc.) analytics now available in the Smart Link ui card clicked event. At the time of writing, only Jira links have this functionality.
15
+
16
+ ## 19.1.21
17
+
18
+ ### Patch Changes
19
+
20
+ - [`b39f43e68c3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b39f43e68c3) - [ux] Hover Preview: Add CreatedBy to 3P link metadata
21
+
22
+ [ux] Flexible UI: Text based elements now wrap and truncate within metadata group.
23
+
3
24
  ## 19.1.20
4
25
 
5
26
  ### Patch Changes
@@ -92,6 +92,7 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
92
92
  }
93
93
  }, [hasData, status, dispatch, details]);
94
94
  var handleResolvedLinkResponse = (0, _react.useCallback)(function (resourceUrl, response) {
95
+ var isReloading = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
95
96
  var hostname = new URL(resourceUrl).hostname;
96
97
  var nextStatus = response ? (0, _helpers.getStatus)(response) : 'fatal'; // If we require authorization & do not have an authFlow available,
97
98
  // throw an error and render as a normal blue link.
@@ -108,9 +109,15 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
108
109
  } // Dispatch Analytics and resolved card action - including unauthorized states.
109
110
 
110
111
 
111
- dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVED, {
112
- url: resourceUrl
113
- }, response));
112
+ if (isReloading) {
113
+ dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RELOADING, {
114
+ url: resourceUrl
115
+ }, response));
116
+ } else {
117
+ dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVED, {
118
+ url: resourceUrl
119
+ }, response));
120
+ }
114
121
  }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported]);
115
122
  var resolve = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
116
123
  var resourceUrl,
@@ -129,7 +136,7 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
129
136
  }
130
137
 
131
138
  return _context.abrupt("return", connections.client.fetchData(resourceUrl).then(function (response) {
132
- return handleResolvedLinkResponse(resourceUrl, response);
139
+ return handleResolvedLinkResponse(resourceUrl, response, isReloading);
133
140
  }).catch(function (error) {
134
141
  return handleResolvedLinkError(resourceUrl, error);
135
142
  }));
@@ -36,6 +36,8 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
36
36
  var extractedDefinitionId = (0, _helpers.getDefinitionId)(state.details);
37
37
  var extractedExtensionKey = (0, _helpers.getExtensionKey)(state.details);
38
38
  var extractedResourceType = (0, _helpers.getResourceType)(state.details);
39
+ var extractedSubproduct = (0, _helpers.getSubproduct)(state.details);
40
+ var extractedProduct = (0, _helpers.getProduct)(state.details);
39
41
  /** Contains all ui analytics events */
40
42
 
41
43
  var ui = (0, _react.useMemo)(function () {
@@ -72,6 +74,7 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
72
74
  * This fires an event that represents when a user clicks on a Smart Link.
73
75
  * @param id The unique ID for this Smart Link.
74
76
  * @param display Whether the card was an Inline, Block, Embed or Flexible UI.
77
+ * @param status What status the Smart Link is currently in (e.g. resolved, unresolved)
75
78
  * @param definitionId The definitionId of the Smart Link resolver invoked.
76
79
  * @param extensionKey The extensionKey of the Smart Link resovler invoked.
77
80
  * @param isModifierKeyPressed Whether a modifier key was pressed when clicking the Smart Link.
@@ -87,8 +90,9 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
87
90
  var extensionKey = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : extractedExtensionKey;
88
91
  var isModifierKeyPressed = arguments.length > 5 ? arguments[5] : undefined;
89
92
  var location = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : defaultLocation;
90
- var destinationProduct = arguments.length > 7 ? arguments[7] : undefined;
91
- return dispatchAnalytics((0, _analytics.uiCardClickedEvent)(id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct));
93
+ var destinationProduct = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : extractedProduct;
94
+ var destinationSubproduct = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : extractedSubproduct;
95
+ return dispatchAnalytics((0, _analytics.uiCardClickedEvent)(id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct, destinationSubproduct));
92
96
  },
93
97
 
94
98
  /**
@@ -198,7 +202,7 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
198
202
  return dispatchAnalytics((0, _analytics.uiHoverCardDismissedEvent)(id, previewDisplay, hoverTime, definitionId, extensionKey, previewInvokeMethod));
199
203
  }
200
204
  };
201
- }, [defaultId, defaultLocation, extractedDefinitionId, extractedExtensionKey, dispatchAnalytics]);
205
+ }, [extractedDefinitionId, extractedExtensionKey, dispatchAnalytics, defaultId, defaultLocation, extractedProduct, extractedSubproduct]);
202
206
  /** Contains all operational analytics events */
203
207
 
204
208
  var operational = (0, _react.useMemo)(function () {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isVisible = exports.isFinalState = exports.isAccessible = exports.hasResolved = exports.getStatus = exports.getServices = exports.getResourceType = exports.getExtensionKey = exports.getDefinitionId = exports.getClickUrl = exports.getByDefinitionId = void 0;
6
+ exports.isVisible = exports.isFinalState = exports.isAccessible = exports.hasResolved = exports.getSubproduct = exports.getStatus = exports.getServices = exports.getResourceType = exports.getProduct = exports.getExtensionKey = exports.getDefinitionId = exports.getClickUrl = exports.getByDefinitionId = void 0;
7
7
 
8
8
  var _extractVisitUrl = require("../extractors/common/primitives/extractVisitUrl");
9
9
 
@@ -32,23 +32,45 @@ var getClickUrl = function getClickUrl(url, jsonLd) {
32
32
  exports.getClickUrl = getClickUrl;
33
33
 
34
34
  var getDefinitionId = function getDefinitionId(details) {
35
- return details && details.meta && details.meta.definitionId;
35
+ var _details$meta;
36
+
37
+ return details === null || details === void 0 ? void 0 : (_details$meta = details.meta) === null || _details$meta === void 0 ? void 0 : _details$meta.definitionId;
36
38
  };
37
39
 
38
40
  exports.getDefinitionId = getDefinitionId;
39
41
 
40
42
  var getExtensionKey = function getExtensionKey(details) {
41
- return details && details.meta && details.meta.key;
43
+ var _details$meta2;
44
+
45
+ return details === null || details === void 0 ? void 0 : (_details$meta2 = details.meta) === null || _details$meta2 === void 0 ? void 0 : _details$meta2.key;
42
46
  };
43
47
 
44
48
  exports.getExtensionKey = getExtensionKey;
45
49
 
46
50
  var getResourceType = function getResourceType(details) {
47
- return details && details.meta && details.meta.resourceType;
51
+ var _details$meta3;
52
+
53
+ return details === null || details === void 0 ? void 0 : (_details$meta3 = details.meta) === null || _details$meta3 === void 0 ? void 0 : _details$meta3.resourceType;
48
54
  };
49
55
 
50
56
  exports.getResourceType = getResourceType;
51
57
 
58
+ var getProduct = function getProduct(details) {
59
+ var _details$meta4;
60
+
61
+ return details === null || details === void 0 ? void 0 : (_details$meta4 = details.meta) === null || _details$meta4 === void 0 ? void 0 : _details$meta4.product;
62
+ };
63
+
64
+ exports.getProduct = getProduct;
65
+
66
+ var getSubproduct = function getSubproduct(details) {
67
+ var _details$meta5;
68
+
69
+ return details === null || details === void 0 ? void 0 : (_details$meta5 = details.meta) === null || _details$meta5 === void 0 ? void 0 : _details$meta5.subproduct;
70
+ };
71
+
72
+ exports.getSubproduct = getSubproduct;
73
+
52
74
  var getServices = function getServices(details) {
53
75
  return details && details.meta.auth || [];
54
76
  };
@@ -235,7 +235,7 @@ var uiAuthAlternateAccountEvent = function uiAuthAlternateAccountEvent(display,
235
235
 
236
236
  exports.uiAuthAlternateAccountEvent = uiAuthAlternateAccountEvent;
237
237
 
238
- var uiCardClickedEvent = function uiCardClickedEvent(id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct) {
238
+ var uiCardClickedEvent = function uiCardClickedEvent(id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct, destinationSubproduct) {
239
239
  return {
240
240
  action: 'clicked',
241
241
  actionSubject: 'smartLink',
@@ -249,7 +249,8 @@ var uiCardClickedEvent = function uiCardClickedEvent(id, display, status, defini
249
249
  display: display,
250
250
  isModifierKeyPressed: isModifierKeyPressed,
251
251
  location: location,
252
- destinationProduct: destinationProduct
252
+ destinationProduct: destinationProduct,
253
+ destinationSubproduct: destinationSubproduct
253
254
  })
254
255
  };
255
256
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "19.1.20",
3
+ "version": "19.1.23",
4
4
  "sideEffects": false
5
5
  }
@@ -68,6 +68,8 @@ function CardWithUrlContent(_ref) {
68
68
  var definitionId = (0, _helpers.getDefinitionId)(state.details);
69
69
  var extensionKey = (0, _helpers.getExtensionKey)(state.details);
70
70
  var resourceType = (0, _helpers.getResourceType)(state.details);
71
+ var product = (0, _helpers.getProduct)(state.details);
72
+ var subproduct = (0, _helpers.getSubproduct)(state.details);
71
73
  var services = (0, _helpers.getServices)(state.details);
72
74
  var isFlexibleUi = (0, _react.useMemo)(function () {
73
75
  return (0, _flexible.isFlexibleUiCard)(children);
@@ -79,14 +81,14 @@ function CardWithUrlContent(_ref) {
79
81
  }, [state.details, url]);
80
82
  var handleClickWrapper = (0, _react.useCallback)(function (event) {
81
83
  var isModifierKeyPressed = (0, _utils.isSpecialEvent)(event);
82
- analytics.ui.cardClickedEvent(id, isFlexibleUi ? 'flexible' : appearance, state.status, definitionId, extensionKey, isModifierKeyPressed);
84
+ analytics.ui.cardClickedEvent(id, isFlexibleUi ? 'flexible' : appearance, state.status, definitionId, extensionKey, isModifierKeyPressed, undefined, product, subproduct);
83
85
 
84
86
  if (onClick) {
85
87
  onClick(event);
86
88
  } else if (!isFlexibleUi) {
87
89
  handleClick(event);
88
90
  }
89
- }, [id, state.status, analytics.ui, appearance, definitionId, extensionKey, onClick, handleClick, isFlexibleUi]);
91
+ }, [id, state.status, analytics.ui, appearance, definitionId, extensionKey, onClick, handleClick, isFlexibleUi, product, subproduct]);
90
92
  var handleAuthorize = (0, _react.useCallback)(function () {
91
93
  return actions.authorize(appearance);
92
94
  }, [actions, appearance]);
@@ -17,7 +17,9 @@ var _constants = require("../../../../../constants");
17
17
 
18
18
  var _utils = require("../utils");
19
19
 
20
- var _templateObject, _templateObject2, _templateObject3;
20
+ var _utils2 = require("../../utils");
21
+
22
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
21
23
 
22
24
  var getAlignmentStyles = function getAlignmentStyles(align) {
23
25
  switch (align) {
@@ -30,8 +32,23 @@ var getAlignmentStyles = function getAlignmentStyles(align) {
30
32
  }
31
33
  };
32
34
 
35
+ var getGapStyles = function getGapStyles(size, align) {
36
+ var gap = (0, _utils.getGapSize)(size);
37
+
38
+ if (align === _constants.SmartLinkAlignment.Right) {
39
+ return (0, _core.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n > span {\n margin-left: ", "rem;\n &:first-child {\n margin-left: initial;\n }\n }\n "])), gap);
40
+ }
41
+
42
+ return (0, _core.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n > span {\n margin-right: ", "rem;\n &:last-child {\n margin-right: initial;\n }\n }\n "])), gap);
43
+ };
44
+
45
+ var getHorizontalDirectionStyles = function getHorizontalDirectionStyles(size, align) {
46
+ var lineHeight = (0, _utils2.getMaxLineHeight)(size);
47
+ return (0, _core.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n display: block;\n vertical-align: middle;\n ", "\n\n > span, > div {\n vertical-align: middle;\n\n &[data-smart-element-date-time],\n &[data-smart-element-text] {\n // Show all/wrapped/truncated\n display: inline;\n }\n }\n\n ", "\n "])), (0, _utils2.getTruncateStyles)(1, lineHeight + 'rem'), getGapStyles(size, align));
48
+ };
49
+
33
50
  var getElementGroupStyles = function getElementGroupStyles(direction, size, align, width) {
34
- return (0, _core.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n ", "\n min-width: 10%;\n ", "\n"])), (0, _utils.getBaseStyles)(direction, size), getAlignmentStyles(align), width === _constants.SmartLinkWidth.Flexible ? "flex: 1 3;" : '');
51
+ return (0, _core.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n ", "\n min-width: 10%;\n ", "\n ", "\n"])), (0, _utils.getBaseStyles)(direction, size), getAlignmentStyles(align), width === _constants.SmartLinkWidth.Flexible ? "flex: 1 3;" : '', direction === _constants.SmartLinkDirection.Horizontal ? getHorizontalDirectionStyles(size, align) : '');
35
52
  };
36
53
  /**
37
54
  * Creates a group of Action components. Accepts an array of Actions, in addition to some styling
@@ -9,8 +9,12 @@ exports.default = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
12
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
+
12
14
  var _react = _interopRequireDefault(require("react"));
13
15
 
16
+ var _core = require("@emotion/core");
17
+
14
18
  var _constants = require("../../../../../constants");
15
19
 
16
20
  var _block = _interopRequireDefault(require("../block"));
@@ -21,6 +25,16 @@ var _elements = require("../../elements");
21
25
 
22
26
  var _actionGroup = _interopRequireDefault(require("../action-group"));
23
27
 
28
+ var _templateObject;
29
+
30
+ var getActionGroupStyles = function getActionGroupStyles(size) {
31
+ if (size === _constants.SmartLinkSize.XLarge) {
32
+ // The biggest height of the action button exceeds the max line-height
33
+ // of the elements causing the action on the block with x-large size to
34
+ // get cut at the bottom.
35
+ return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n max-height: 2rem;\n "])));
36
+ }
37
+ };
24
38
  /**
25
39
  * Represents a FooterBlock, designed to contain elements and actions that should appear
26
40
  * at the bottom of a link card.
@@ -28,9 +42,13 @@ var _actionGroup = _interopRequireDefault(require("../action-group"));
28
42
  * @param {FooterBlockProps} FooterBlockProps
29
43
  * @see Block
30
44
  */
45
+
46
+
31
47
  var FooterBlock = function FooterBlock(props) {
32
48
  var status = props.status,
33
49
  actions = props.actions,
50
+ _props$size = props.size,
51
+ size = _props$size === void 0 ? _constants.SmartLinkSize.Medium : _props$size,
34
52
  _props$testId = props.testId,
35
53
  testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId;
36
54
 
@@ -46,6 +64,7 @@ var FooterBlock = function FooterBlock(props) {
46
64
  testId: "smart-element-group-actions",
47
65
  align: _constants.SmartLinkAlignment.Right,
48
66
  direction: _constants.SmartLinkDirection.Horizontal,
67
+ overrideCss: getActionGroupStyles(size),
49
68
  width: _constants.SmartLinkWidth.Flexible
50
69
  }, /*#__PURE__*/_react.default.createElement(_actionGroup.default, {
51
70
  items: actions,
@@ -25,6 +25,8 @@ var _block = _interopRequireDefault(require("../block"));
25
25
 
26
26
  var _elementGroup = _interopRequireDefault(require("../element-group"));
27
27
 
28
+ var _utils2 = require("../../utils");
29
+
28
30
  var _excluded = ["maxLines", "status", "testId", "primary", "secondary"];
29
31
 
30
32
  var _templateObject;
@@ -36,31 +38,10 @@ var MINIMUM_MAX_LINES = 1;
36
38
  var getElementGroupStyles = function getElementGroupStyles(size, maxLines) {
37
39
  // MetadataBlock allows metadata elements to be displayed in
38
40
  // multiple lines, with maximum of 2 lines.
39
- // a) We need the height of the line to be equal on both left and right
40
- // sides so they line up nicely.
41
- // b) There is no way to truncate non-text elements nicely. Here
42
- // it's fix max height of the element group so that anything that is
43
- // overflown will not be visible.
44
- var lineHeight = getLineHeight(size);
45
- var gap = (0, _utils.getGapSize)(size);
46
- var gapHeight = gap * (maxLines - 1);
47
- var height = lineHeight * maxLines + gapHeight;
48
- return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n flex-wrap: wrap;\n line-height: ", "rem;\n max-height: ", "rem;\n > span,\n > div {\n min-height: ", "rem;\n max-height: ", "rem;\n line-height: ", "rem;\n }\n "])), lineHeight, height, lineHeight, lineHeight, lineHeight);
49
- };
50
-
51
- var getLineHeight = function getLineHeight(size) {
52
- // The maximum height of all elements in specific size.
53
- // These heights belongs to AvatarGroup.
54
- switch (size) {
55
- case _constants.SmartLinkSize.XLarge:
56
- case _constants.SmartLinkSize.Large:
57
- return 1.75;
58
-
59
- case _constants.SmartLinkSize.Medium:
60
- case _constants.SmartLinkSize.Small:
61
- default:
62
- return 1.5;
63
- }
41
+ // We need the height of the line to be equal on both left and right
42
+ // sides so they line up nicely.
43
+ var lineHeight = (0, _utils2.getMaxLineHeight)(size);
44
+ return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n line-height: ", "rem;\n ", "\n "])), lineHeight, (0, _utils2.getTruncateStyles)(maxLines, lineHeight + 'rem'));
64
45
  };
65
46
 
66
47
  var getMaxLines = function getMaxLines(maxLines) {
@@ -82,7 +82,7 @@ var getGapSize = function getGapSize(size) {
82
82
  exports.getGapSize = getGapSize;
83
83
 
84
84
  var getBaseStyles = function getBaseStyles(direction, size) {
85
- return (0, _core.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n gap: ", "rem;\n line-height: 1rem;\n min-width: 0;\n overflow: hidden;\n ", ";\n &:empty {\n display: none;\n }\n & > * {\n min-width: 0;\n }\n & > [data-fit-to-content] {\n min-width: fit-content;\n }\n"])), getGapSize(size), getDirectionStyles(direction));
85
+ return (0, _core.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n align-items: center;\n display: flex;\n gap: ", "rem;\n line-height: 1rem;\n min-width: 0;\n overflow: hidden;\n ", ";\n &:empty {\n display: none;\n }\n & > * {\n min-width: 0;\n }\n & > [data-fit-to-content] {\n min-width: fit-content;\n }\n"])), getGapSize(size), getDirectionStyles(direction));
86
86
  };
87
87
 
88
88
  exports.getBaseStyles = getBaseStyles;
@@ -17,21 +17,23 @@ var _avatarGroup = _interopRequireDefault(require("@atlaskit/avatar-group"));
17
17
 
18
18
  var _constants = require("../../../../../constants");
19
19
 
20
- var _templateObject;
20
+ var _templateObject, _templateObject2;
21
21
 
22
22
  var MAX_COUNT = 4;
23
23
 
24
24
  var getStyles = function getStyles(size) {
25
+ var styles = (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: inline-flex;\n "])));
26
+
25
27
  switch (size) {
26
28
  case _constants.SmartLinkSize.XLarge:
27
29
  case _constants.SmartLinkSize.Large:
28
30
  // Default AK small size
29
- return;
31
+ return styles;
30
32
 
31
33
  case _constants.SmartLinkSize.Medium:
32
34
  case _constants.SmartLinkSize.Small:
33
35
  default:
34
- return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n li {\n span,\n svg {\n max-height: 1.25rem;\n max-width: 1.25rem;\n }\n }\n "])));
36
+ return (0, _core.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n li {\n span,\n svg {\n max-height: 1.25rem;\n max-width: 1.25rem;\n }\n }\n "])), styles);
35
37
  }
36
38
  };
37
39
  /**
@@ -29,9 +29,9 @@ var _atlaskitIcon = _interopRequireDefault(require("../../common/atlaskit-icon")
29
29
 
30
30
  var _templateObject, _templateObject2, _templateObject3, _messageMapper;
31
31
 
32
- var badgeStyles = (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n align-items: center;\n display: flex;\n min-width: fit-content;\n"])));
33
- var iconStyles = (0, _core.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n color: ", ";\n ", "\n span,\n svg {\n line-height: 0;\n }\n"])), _token.tokens.badgeIcon, (0, _utils.getIconSizeStyles)('1rem'));
34
- var labelStyles = (0, _core.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n color: ", ";\n font-size: 0.75rem;\n line-height: 1rem;\n padding-left: 0.125rem;\n"])), _token.tokens.badgeText);
32
+ var badgeStyles = (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n align-items: center;\n display: inline-flex;\n min-width: fit-content;\n"])));
33
+ var iconStyles = (0, _core.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n color: ", ";\n line-height: 0;\n vertical-align: middle;\n ", "\n img,\n span,\n svg {\n line-height: 0;\n vertical-align: middle;\n }\n"])), _token.tokens.badgeIcon, (0, _utils.getIconSizeStyles)('1rem'));
34
+ var labelStyles = (0, _core.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n color: ", ";\n font-size: 0.75rem;\n line-height: 1rem;\n padding-left: 0.125rem;\n vertical-align: middle;\n"])), _token.tokens.badgeText);
35
35
  var messageMapper = (_messageMapper = {}, (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityBlocker, _messages.messages.priority_blocker), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityCritical, _messages.messages.priority_critical), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityHigh, _messages.messages.priority_high), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityHighest, _messages.messages.priority_highest), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityLow, _messages.messages.priority_low), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityLowest, _messages.messages.priority_lowest), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityMajor, _messages.messages.priority_major), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityMedium, _messages.messages.priority_medium), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityMinor, _messages.messages.priority_minor), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityTrivial, _messages.messages.priority_trivial), (0, _defineProperty2.default)(_messageMapper, _constants.IconType.PriorityUndefined, _messages.messages.priority_undefined), _messageMapper);
36
36
 
37
37
  var getFormattedMessageFromIcon = function getFormattedMessageFromIcon(icon) {
@@ -93,7 +93,7 @@ var Badge = function Badge(_ref) {
93
93
  return null;
94
94
  }
95
95
 
96
- return (0, _core.jsx)("div", {
96
+ return (0, _core.jsx)("span", {
97
97
  css: [badgeStyles, overrideCss],
98
98
  "data-fit-to-content": true,
99
99
  "data-smart-element-badge": true,
@@ -17,7 +17,7 @@ var _lozenge = _interopRequireDefault(require("@atlaskit/lozenge"));
17
17
 
18
18
  var _templateObject;
19
19
 
20
- var styles = (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n line-height: inherit;\n"])));
20
+ var styles = (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: inline-flex;\n line-height: inherit;\n"])));
21
21
  /**
22
22
  * A base element that displays a Lozenge.
23
23
  * @internal
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.hasWhiteSpace = exports.getTruncateStyles = exports.getMaxLines = exports.getLinkSizeStyles = exports.getLinkLineHeight = exports.getIconWidth = exports.getIconSizeStyles = exports.getFormattedMessage = void 0;
8
+ exports.hasWhiteSpace = exports.getTruncateStyles = exports.getMaxLines = exports.getMaxLineHeight = exports.getLinkSizeStyles = exports.getLinkLineHeight = exports.getIconWidth = exports.getIconSizeStyles = exports.getFormattedMessage = void 0;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
@@ -95,6 +95,23 @@ var getLinkSizeStyles = function getLinkSizeStyles(size) {
95
95
 
96
96
  exports.getLinkSizeStyles = getLinkSizeStyles;
97
97
 
98
+ var getMaxLineHeight = function getMaxLineHeight(size) {
99
+ // The maximum line height based on all elements in specific size.
100
+ // These heights belongs to AvatarGroup.
101
+ switch (size) {
102
+ case _constants.SmartLinkSize.XLarge:
103
+ case _constants.SmartLinkSize.Large:
104
+ return 1.75;
105
+
106
+ case _constants.SmartLinkSize.Medium:
107
+ case _constants.SmartLinkSize.Small:
108
+ default:
109
+ return 1.5;
110
+ }
111
+ };
112
+
113
+ exports.getMaxLineHeight = getMaxLineHeight;
114
+
98
115
  var getMaxLines = function getMaxLines(value, defaultValue, max, min) {
99
116
  if (value > max) {
100
117
  return defaultValue;
@@ -112,7 +129,7 @@ exports.getMaxLines = getMaxLines;
112
129
  var getTruncateStyles = function getTruncateStyles(maxLines) {
113
130
  var lineHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '1rem';
114
131
  var wordBreak = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'break-word';
115
- return (0, _core.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: ", ";\n -webkit-line-clamp: ", ";\n -webkit-box-orient: vertical;\n // Fallback options\n max-height: calc(", " * ", ");\n "])), wordBreak, maxLines, maxLines, lineHeight);
132
+ return (0, _core.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: ", ";\n -webkit-line-clamp: ", ";\n -webkit-box-orient: vertical;\n // Fallback options\n @supports not (-webkit-line-clamp: 1) {\n max-height: calc(", " * ", ");\n }\n "])), wordBreak, maxLines, maxLines, lineHeight);
116
133
  };
117
134
 
118
135
  exports.getTruncateStyles = getTruncateStyles;
@@ -115,7 +115,8 @@ var HoverCardContent = function HoverCardContent(_ref) {
115
115
  actions: titleActions
116
116
  }), /*#__PURE__*/_react.default.createElement(_blocks.MetadataBlock, {
117
117
  primary: primary,
118
- secondary: secondary
118
+ secondary: secondary,
119
+ size: _constants.SmartLinkSize.Small
119
120
  }), body, /*#__PURE__*/_react.default.createElement(_blocks.FooterBlock, {
120
121
  actions: footerActions
121
122
  }));
@@ -4,6 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getSimulatedMetadata = exports.HOVER_CARD_ANALYTICS_DISPLAY = void 0;
7
+
8
+ var _constants = require("../../constants");
9
+
7
10
  var HOVER_CARD_ANALYTICS_DISPLAY = 'flexible';
8
11
  exports.HOVER_CARD_ANALYTICS_DISPLAY = HOVER_CARD_ANALYTICS_DISPLAY;
9
12
 
@@ -14,7 +17,7 @@ var getSimulatedMetadata = function getSimulatedMetadata() {
14
17
  case 'confluence-object-provider':
15
18
  return {
16
19
  metadata: {
17
- primary: ['AuthorGroup', 'CreatedBy', 'CommentCount', 'ReactCount'],
20
+ primary: [_constants.ElementName.AuthorGroup, _constants.ElementName.CreatedBy, _constants.ElementName.CommentCount, _constants.ElementName.ReactCount],
18
21
  secondary: []
19
22
  }
20
23
  };
@@ -22,7 +25,7 @@ var getSimulatedMetadata = function getSimulatedMetadata() {
22
25
  case 'jira-object-provider':
23
26
  return {
24
27
  metadata: {
25
- primary: ['AuthorGroup', 'State', 'Priority'],
28
+ primary: [_constants.ElementName.AuthorGroup, _constants.ElementName.State, _constants.ElementName.Priority],
26
29
  secondary: []
27
30
  }
28
31
  };
@@ -30,7 +33,7 @@ var getSimulatedMetadata = function getSimulatedMetadata() {
30
33
  default:
31
34
  return {
32
35
  metadata: {
33
- primary: ['ModifiedOn'],
36
+ primary: [_constants.ElementName.ModifiedOn, _constants.ElementName.CreatedBy],
34
37
  secondary: []
35
38
  }
36
39
  };
@@ -2,7 +2,7 @@ import { useMemo, useCallback } from 'react';
2
2
  import { auth } from '@atlaskit/outbound-auth-flow-client';
3
3
  import { APIError } from '@atlaskit/linking-common';
4
4
  import { useSmartLinkContext } from '@atlaskit/link-provider';
5
- import { ACTION_PENDING, ACTION_RESOLVED, ACTION_ERROR, ACTION_ERROR_FALLBACK, cardAction } from '@atlaskit/linking-common';
5
+ import { ACTION_PENDING, ACTION_RESOLVED, ACTION_ERROR, ACTION_ERROR_FALLBACK, ACTION_RELOADING, cardAction } from '@atlaskit/linking-common';
6
6
  import { getDefinitionId, getByDefinitionId, getServices, getStatus, getExtensionKey } from '../helpers';
7
7
  import { ERROR_MESSAGE_OAUTH, ERROR_MESSAGE_FATAL } from './constants';
8
8
  import * as measure from '../../utils/performance';
@@ -65,7 +65,7 @@ export const useSmartCardActions = (id, url, analytics) => {
65
65
  }
66
66
  }
67
67
  }, [hasData, status, dispatch, details]);
68
- const handleResolvedLinkResponse = useCallback((resourceUrl, response) => {
68
+ const handleResolvedLinkResponse = useCallback((resourceUrl, response, isReloading = false) => {
69
69
  const hostname = new URL(resourceUrl).hostname;
70
70
  const nextStatus = response ? getStatus(response) : 'fatal'; // If we require authorization & do not have an authFlow available,
71
71
  // throw an error and render as a normal blue link.
@@ -82,16 +82,22 @@ export const useSmartCardActions = (id, url, analytics) => {
82
82
  } // Dispatch Analytics and resolved card action - including unauthorized states.
83
83
 
84
84
 
85
- dispatch(cardAction(ACTION_RESOLVED, {
86
- url: resourceUrl
87
- }, response));
85
+ if (isReloading) {
86
+ dispatch(cardAction(ACTION_RELOADING, {
87
+ url: resourceUrl
88
+ }, response));
89
+ } else {
90
+ dispatch(cardAction(ACTION_RESOLVED, {
91
+ url: resourceUrl
92
+ }, response));
93
+ }
88
94
  }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported]);
89
95
  const resolve = useCallback(async (resourceUrl = url, isReloading = false) => {
90
96
  // Request JSON-LD data for the card from ORS, iff it has extended
91
97
  // its cache lifespan OR there is no data for it currently. Once the data
92
98
  // has come back asynchronously, dispatch the resolved action for the card.
93
99
  if (isReloading || !hasData) {
94
- return connections.client.fetchData(resourceUrl).then(response => handleResolvedLinkResponse(resourceUrl, response)).catch(error => handleResolvedLinkError(resourceUrl, error));
100
+ return connections.client.fetchData(resourceUrl).then(response => handleResolvedLinkResponse(resourceUrl, response, isReloading)).catch(error => handleResolvedLinkError(resourceUrl, error));
95
101
  } else {
96
102
  addMetadataToExperience('smart-link-rendered', id, {
97
103
  cached: true
@@ -2,7 +2,7 @@ import { useMemo } from 'react';
2
2
  import { getUrl } from '@atlaskit/linking-common';
3
3
  import { uiAuthEvent, uiAuthAlternateAccountEvent, uiCardClickedEvent, uiActionClickedEvent, uiClosedAuthEvent, uiRenderSuccessEvent, uiHoverCardViewedEvent, uiHoverCardDismissedEvent, uiHoverCardOpenLinkClickedEvent, invokeSucceededEvent, invokeFailedEvent, connectSucceededEvent, connectFailedEvent, trackAppAccountConnected, screenAuthPopupEvent, instrumentEvent } from '../../utils/analytics';
4
4
  import { failUfoExperience, startUfoExperience, succeedUfoExperience } from './ufoExperiences';
5
- import { getDefinitionId, getExtensionKey, getResourceType } from '../helpers';
5
+ import { getDefinitionId, getExtensionKey, getResourceType, getSubproduct, getProduct } from '../helpers';
6
6
  import { useSmartLinkContext } from '@atlaskit/link-provider';
7
7
  /**
8
8
  * This hook provides usage of Smart Link analytics outside of the Card component.
@@ -24,6 +24,8 @@ export const useSmartLinkAnalytics = (url, dispatchAnalytics, id, defaultLocatio
24
24
  const extractedDefinitionId = getDefinitionId(state.details);
25
25
  const extractedExtensionKey = getExtensionKey(state.details);
26
26
  const extractedResourceType = getResourceType(state.details);
27
+ const extractedSubproduct = getSubproduct(state.details);
28
+ const extractedProduct = getProduct(state.details);
27
29
  /** Contains all ui analytics events */
28
30
 
29
31
  const ui = useMemo(() => ({
@@ -51,6 +53,7 @@ export const useSmartLinkAnalytics = (url, dispatchAnalytics, id, defaultLocatio
51
53
  * This fires an event that represents when a user clicks on a Smart Link.
52
54
  * @param id The unique ID for this Smart Link.
53
55
  * @param display Whether the card was an Inline, Block, Embed or Flexible UI.
56
+ * @param status What status the Smart Link is currently in (e.g. resolved, unresolved)
54
57
  * @param definitionId The definitionId of the Smart Link resolver invoked.
55
58
  * @param extensionKey The extensionKey of the Smart Link resovler invoked.
56
59
  * @param isModifierKeyPressed Whether a modifier key was pressed when clicking the Smart Link.
@@ -58,7 +61,7 @@ export const useSmartLinkAnalytics = (url, dispatchAnalytics, id, defaultLocatio
58
61
  * @param destinationProduct The product the Smart Link is linked to.
59
62
  * @returns
60
63
  */
61
- cardClickedEvent: (id = defaultId, display, status, definitionId = extractedDefinitionId, extensionKey = extractedExtensionKey, isModifierKeyPressed, location = defaultLocation, destinationProduct) => dispatchAnalytics(uiCardClickedEvent(id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct)),
64
+ cardClickedEvent: (id = defaultId, display, status, definitionId = extractedDefinitionId, extensionKey = extractedExtensionKey, isModifierKeyPressed, location = defaultLocation, destinationProduct = extractedProduct, destinationSubproduct = extractedSubproduct) => dispatchAnalytics(uiCardClickedEvent(id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct, destinationSubproduct)),
62
65
 
63
66
  /**
64
67
  * This fires an event that represents when a user clicks on a Smart Link action.
@@ -141,7 +144,7 @@ export const useSmartLinkAnalytics = (url, dispatchAnalytics, id, defaultLocatio
141
144
  * @returns
142
145
  */
143
146
  hoverCardDismissedEvent: (previewDisplay, hoverTime, previewInvokeMethod, id = defaultId, definitionId = extractedDefinitionId, extensionKey = extractedExtensionKey) => dispatchAnalytics(uiHoverCardDismissedEvent(id, previewDisplay, hoverTime, definitionId, extensionKey, previewInvokeMethod))
144
- }), [defaultId, defaultLocation, extractedDefinitionId, extractedExtensionKey, dispatchAnalytics]);
147
+ }), [extractedDefinitionId, extractedExtensionKey, dispatchAnalytics, defaultId, defaultLocation, extractedProduct, extractedSubproduct]);
145
148
  /** Contains all operational analytics events */
146
149
 
147
150
  const operational = useMemo(() => ({