@atlaskit/smart-card 23.8.2 → 23.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/utils/flexible.js +8 -2
  3. package/dist/cjs/version.json +1 -1
  4. package/dist/cjs/view/CardWithUrl/component.js +1 -6
  5. package/dist/cjs/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
  6. package/dist/cjs/view/FlexibleCard/components/blocks/action-group/index.js +2 -7
  7. package/dist/cjs/view/FlexibleCard/components/blocks/footer-block/index.js +17 -2
  8. package/dist/cjs/view/FlexibleCard/components/container/index.js +34 -3
  9. package/dist/cjs/view/FlexibleCard/index.js +3 -1
  10. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +15 -3
  11. package/dist/cjs/view/InlineCard/index.js +7 -0
  12. package/dist/es2019/utils/flexible.js +3 -2
  13. package/dist/es2019/version.json +1 -1
  14. package/dist/es2019/view/CardWithUrl/component.js +1 -6
  15. package/dist/es2019/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
  16. package/dist/es2019/view/FlexibleCard/components/blocks/action-group/index.js +2 -5
  17. package/dist/es2019/view/FlexibleCard/components/blocks/footer-block/index.js +11 -2
  18. package/dist/es2019/view/FlexibleCard/components/container/index.js +25 -5
  19. package/dist/es2019/view/FlexibleCard/index.js +3 -1
  20. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +13 -3
  21. package/dist/es2019/view/InlineCard/index.js +6 -0
  22. package/dist/esm/utils/flexible.js +4 -1
  23. package/dist/esm/version.json +1 -1
  24. package/dist/esm/view/CardWithUrl/component.js +1 -6
  25. package/dist/esm/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
  26. package/dist/esm/view/FlexibleCard/components/blocks/action-group/index.js +2 -7
  27. package/dist/esm/view/FlexibleCard/components/blocks/footer-block/index.js +11 -2
  28. package/dist/esm/view/FlexibleCard/components/container/index.js +34 -5
  29. package/dist/esm/view/FlexibleCard/index.js +3 -1
  30. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +15 -3
  31. package/dist/esm/view/InlineCard/index.js +6 -0
  32. package/dist/types/utils/flexible.d.ts +1 -0
  33. package/dist/types/view/Card/index.d.ts +1 -1
  34. package/dist/types/view/FlexibleCard/components/blocks/action-group/types.d.ts +1 -1
  35. package/dist/types/view/FlexibleCard/components/blocks/footer-block/types.d.ts +5 -0
  36. package/dist/types/view/FlexibleCard/components/container/types.d.ts +5 -0
  37. package/dist/types/view/FlexibleCard/types.d.ts +5 -0
  38. package/dist/types/view/HoverCard/index.d.ts +1 -1
  39. package/dist/types/view/HoverCard/types.d.ts +24 -0
  40. package/package.json +1 -1
  41. package/report.api.md +1 -0
  42. package/tmp/api-report-tmp.d.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 23.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`5c7c532de88`](https://bitbucket.org/atlassian/atlassian-frontend/commits/5c7c532de88) - [ux] Add showHoverPreview as a ui parameter to allow hover cards on flex ui links.
8
+
3
9
  ## 23.8.2
4
10
 
5
11
  ### Patch Changes
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.isFlexibleUiTitleBlock = exports.isFlexibleUiPreviewBlock = exports.isFlexibleUiElement = exports.isFlexibleUiCard = exports.isFlexibleUiBlock = void 0;
10
+ exports.isFlexibleUiTitleBlock = exports.isFlexibleUiPreviewBlock = exports.isFlexibleUiFooterBlock = exports.isFlexibleUiElement = exports.isFlexibleUiCard = exports.isFlexibleUiBlock = void 0;
11
11
 
12
12
  var _react = _interopRequireDefault(require("react"));
13
13
 
@@ -57,4 +57,10 @@ var isFlexibleUiPreviewBlock = function isFlexibleUiPreviewBlock(node) {
57
57
  return /*#__PURE__*/_react.default.isValidElement(node) && node.type === Blocks.PreviewBlock;
58
58
  };
59
59
 
60
- exports.isFlexibleUiPreviewBlock = isFlexibleUiPreviewBlock;
60
+ exports.isFlexibleUiPreviewBlock = isFlexibleUiPreviewBlock;
61
+
62
+ var isFlexibleUiFooterBlock = function isFlexibleUiFooterBlock(node) {
63
+ return /*#__PURE__*/_react.default.isValidElement(node) && node.type === Blocks.FooterBlock;
64
+ };
65
+
66
+ exports.isFlexibleUiFooterBlock = isFlexibleUiFooterBlock;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.8.2",
3
+ "version": "23.9.0",
4
4
  "sideEffects": false
5
5
  }
@@ -79,12 +79,6 @@ function CardWithUrlContent(_ref) {
79
79
  var isFlexibleUi = (0, _react.useMemo)(function () {
80
80
  return (0, _flexible.isFlexibleUiCard)(children);
81
81
  }, [children]);
82
- var showHoverPreviewFlag = (0, _linkProvider.useFeatureFlag)('showHoverPreview');
83
-
84
- if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
85
- showHoverPreview = Boolean(showHoverPreviewFlag);
86
- }
87
-
88
82
  var showAuthTooltipValue = (0, _linkProvider.useFeatureFlag)('showAuthTooltip');
89
83
  var showAuthTooltip = !!showAuthTooltipValue && showAuthTooltipValue === 'experiment';
90
84
  var enableFlexibleBlockCardFlag = Boolean((0, _linkProvider.useFeatureFlag)('enableFlexibleBlockCard')); // Setup UI handlers.
@@ -174,6 +168,7 @@ function CardWithUrlContent(_ref) {
174
168
  onClick: handleClickWrapper,
175
169
  renderers: renderers,
176
170
  ui: ui,
171
+ showHoverPreview: showHoverPreview,
177
172
  url: url,
178
173
  testId: testId,
179
174
  onResolve: onResolve,
@@ -61,14 +61,9 @@ var ActionButton = function ActionButton(_ref) {
61
61
  handler();
62
62
  };
63
63
  }, []);
64
- var onContainerClick = (0, _react.useCallback)(function (e) {
65
- // Stop button on click event from propagate into parent container.
66
- e.stopPropagation();
67
- }, []);
68
64
  return (0, _react2.jsx)("div", {
69
65
  css: [getButtonStyle(size, iconOnly), overrideCss],
70
- "data-testid": "".concat(testId, "-button-wrapper"),
71
- onClick: onContainerClick
66
+ "data-testid": "".concat(testId, "-button-wrapper")
72
67
  }, (0, _react2.jsx)(_tooltip.default, {
73
68
  content: tooltipMessage,
74
69
  hideTooltipOnClick: true,
@@ -68,12 +68,8 @@ var ActionGroup = function ActionGroup(_ref) {
68
68
  var _useState = (0, _react.useState)(false),
69
69
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
70
70
  isOpen = _useState2[0],
71
- setIsOpen = _useState2[1]; // Stop AK dropdown menu to propagate event on click.
71
+ setIsOpen = _useState2[1];
72
72
 
73
-
74
- var onClick = (0, _react.useCallback)(function (e) {
75
- return e.stopPropagation();
76
- }, []);
77
73
  var onOpenChange = (0, _react.useCallback)(function (attrs) {
78
74
  setIsOpen(attrs.isOpen);
79
75
 
@@ -106,8 +102,7 @@ var ActionGroup = function ActionGroup(_ref) {
106
102
  var buttonGroupElement = (0, _utils.renderActionItems)(buttonActions, size, appearance, false, onActionClick);
107
103
  return (0, _react2.jsx)("div", {
108
104
  css: styles,
109
- className: "actions-button-group",
110
- onClick: onClick
105
+ className: "actions-button-group"
111
106
  }, (0, _react2.jsx)(_buttonGroup.default, null, buttonGroupElement, dropdownItemActions.length > 0 && dropdownMenuElement && dropdownMenuElement.length > 0 ? (0, _react2.jsx)(_dropdownMenu.default, {
112
107
  isOpen: isOpen,
113
108
  onOpenChange: onOpenChange,
@@ -2,6 +2,8 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
@@ -11,7 +13,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
11
13
 
12
14
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
15
 
14
- var _react = _interopRequireDefault(require("react"));
16
+ var _react = _interopRequireWildcard(require("react"));
15
17
 
16
18
  var _react2 = require("@emotion/react");
17
19
 
@@ -27,6 +29,10 @@ var _actionGroup = _interopRequireDefault(require("../action-group"));
27
29
 
28
30
  var _templateObject;
29
31
 
32
+ 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); }
33
+
34
+ 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; }
35
+
30
36
  var getActionGroupStyles = function getActionGroupStyles(size) {
31
37
  if (size === _constants.SmartLinkSize.XLarge) {
32
38
  // The biggest height of the action button exceeds the max line-height
@@ -50,7 +56,15 @@ var FooterBlock = function FooterBlock(props) {
50
56
  _props$size = props.size,
51
57
  size = _props$size === void 0 ? _constants.SmartLinkSize.Medium : _props$size,
52
58
  _props$testId = props.testId,
53
- testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId;
59
+ testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId,
60
+ onActionMenuOpenChange = props.onActionMenuOpenChange;
61
+ var onDropdownOpenChange = (0, _react.useCallback)(function (isOpen) {
62
+ if (onActionMenuOpenChange) {
63
+ onActionMenuOpenChange({
64
+ isOpen: isOpen
65
+ });
66
+ }
67
+ }, [onActionMenuOpenChange]);
54
68
 
55
69
  if (status !== _constants.SmartLinkStatus.Resolved) {
56
70
  return null;
@@ -67,6 +81,7 @@ var FooterBlock = function FooterBlock(props) {
67
81
  overrideCss: getActionGroupStyles(size),
68
82
  width: _constants.SmartLinkWidth.Flexible
69
83
  }, /*#__PURE__*/_react.default.createElement(_actionGroup.default, {
84
+ onDropdownOpenChange: onDropdownOpenChange,
70
85
  items: actions,
71
86
  appearance: "default"
72
87
  })) : null);
@@ -9,6 +9,8 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.getContainerStyles = exports.default = void 0;
11
11
 
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
12
14
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
15
 
14
16
  var _react = _interopRequireWildcard(require("react"));
@@ -25,6 +27,8 @@ var _flexibleUiContext = require("../../../../state/flexible-ui-context");
25
27
 
26
28
  var _layeredLink = _interopRequireDefault(require("./layered-link"));
27
29
 
30
+ var _HoverCard = require("../../../HoverCard");
31
+
28
32
  var _utils = require("../../../../state/flexible-ui-context/utils");
29
33
 
30
34
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
@@ -110,7 +114,7 @@ var getContainerStyles = function getContainerStyles(size, hideBackground, hideE
110
114
 
111
115
  exports.getContainerStyles = getContainerStyles;
112
116
 
113
- var renderChildren = function renderChildren(children, containerSize, containerTheme, status, retry, onClick) {
117
+ var renderChildren = function renderChildren(children, containerSize, containerTheme, status, retry, onClick, onActionMenuOpenChange) {
114
118
  return _react.default.Children.map(children, function (child) {
115
119
  if ( /*#__PURE__*/_react.default.isValidElement(child) && (0, _flexible.isFlexibleUiBlock)(child)) {
116
120
  var blockSize = child.props.size;
@@ -124,6 +128,12 @@ var renderChildren = function renderChildren(children, containerSize, containerT
124
128
  status: status,
125
129
  theme: containerTheme
126
130
  });
131
+ } else if (onActionMenuOpenChange && (0, _flexible.isFlexibleUiFooterBlock)(child)) {
132
+ return /*#__PURE__*/_react.default.cloneElement(child, {
133
+ size: size,
134
+ status: status,
135
+ onActionMenuOpenChange: onActionMenuOpenChange
136
+ });
127
137
  }
128
138
 
129
139
  return /*#__PURE__*/_react.default.cloneElement(child, {
@@ -182,6 +192,8 @@ var Container = function Container(_ref3) {
182
192
  hideElevation = _ref3$hideElevation === void 0 ? false : _ref3$hideElevation,
183
193
  _ref3$hidePadding = _ref3.hidePadding,
184
194
  hidePadding = _ref3$hidePadding === void 0 ? false : _ref3$hidePadding,
195
+ _ref3$showHoverPrevie = _ref3.showHoverPreview,
196
+ showHoverPreview = _ref3$showHoverPrevie === void 0 ? false : _ref3$showHoverPrevie,
185
197
  onClick = _ref3.onClick,
186
198
  retry = _ref3.retry,
187
199
  _ref3$size = _ref3.size,
@@ -193,11 +205,30 @@ var Container = function Container(_ref3) {
193
205
  theme = _ref3$theme === void 0 ? _constants.SmartLinkTheme.Link : _ref3$theme;
194
206
  var context = (0, _react.useContext)(_flexibleUiContext.FlexibleUiContext);
195
207
  var childrenOptions = getChildrenOptions(children, context);
196
- return (0, _react2.jsx)("div", {
208
+
209
+ var _useState = (0, _react.useState)(true),
210
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
211
+ hoverCardCanOpen = _useState2[0],
212
+ setHoverCardCanOpen = _useState2[1];
213
+
214
+ var onActionMenuOpenChange = (0, _react.useCallback)(function (options) {
215
+ return setHoverCardCanOpen(!options.isOpen);
216
+ }, []);
217
+ var containerContent = (0, _react2.jsx)("div", {
197
218
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
198
219
  "data-smart-link-container": true,
199
220
  "data-testid": testId
200
- }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
221
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick, showHoverPreview ? onActionMenuOpenChange : undefined));
222
+
223
+ if (showHoverPreview && context !== null && context !== void 0 && context.url) {
224
+ return (0, _react2.jsx)(_HoverCard.HoverCard, {
225
+ url: context === null || context === void 0 ? void 0 : context.url,
226
+ canOpen: hoverCardCanOpen,
227
+ closeOnChildClick: true
228
+ }, containerContent);
229
+ }
230
+
231
+ return containerContent;
201
232
  };
202
233
 
203
234
  var _default = Container;
@@ -42,7 +42,8 @@ var FlexibleCard = function FlexibleCard(_ref) {
42
42
  url = _ref.url,
43
43
  onClick = _ref.onClick,
44
44
  testId = _ref.testId,
45
- analytics = _ref.analytics;
45
+ analytics = _ref.analytics,
46
+ showHoverPreview = _ref.showHoverPreview;
46
47
  var cardType = cardState.status,
47
48
  details = cardState.details;
48
49
  var status = cardType;
@@ -86,6 +87,7 @@ var FlexibleCard = function FlexibleCard(_ref) {
86
87
  }, /*#__PURE__*/_react.default.createElement(_container.default, (0, _extends2.default)({
87
88
  testId: testId
88
89
  }, ui, {
90
+ showHoverPreview: showHoverPreview,
89
91
  onClick: onClick,
90
92
  retry: retry,
91
93
  status: status
@@ -40,7 +40,11 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
40
40
  var children = _ref.children,
41
41
  url = _ref.url,
42
42
  analyticsHandler = _ref.analyticsHandler,
43
- analytics = _ref.analytics;
43
+ analytics = _ref.analytics,
44
+ _ref$canOpen = _ref.canOpen,
45
+ canOpen = _ref$canOpen === void 0 ? true : _ref$canOpen,
46
+ _ref$closeOnChildClic = _ref.closeOnChildClick,
47
+ closeOnChildClick = _ref$closeOnChildClic === void 0 ? false : _ref$closeOnChildClic;
44
48
  var delay = 300;
45
49
 
46
50
  var _React$useState = _react2.default.useState(false),
@@ -134,9 +138,16 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
134
138
  }
135
139
  }, [hideCard]); // Stop hover preview content to propagate event to parent.
136
140
 
141
+ var onChildClick = (0, _react2.useCallback)(function (e) {
142
+ e.stopPropagation();
143
+
144
+ if (closeOnChildClick) {
145
+ hideCard();
146
+ }
147
+ }, [closeOnChildClick, hideCard]);
137
148
  return (0, _react.jsx)(_popup.default, {
138
149
  testId: "hover-card",
139
- isOpen: isOpen,
150
+ isOpen: isOpen && canOpen,
140
151
  onClose: hideCard,
141
152
  placement: "bottom-start",
142
153
  offset: popupOffset.current,
@@ -161,7 +172,8 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
161
172
  }, (0, _react.jsx)("span", (0, _extends2.default)({}, triggerProps, {
162
173
  onMouseEnter: initShowCard,
163
174
  onMouseLeave: initHideCard,
164
- onMouseMove: setMousePosition
175
+ onMouseMove: setMousePosition,
176
+ onClick: onChildClick
165
177
  }), children));
166
178
  },
167
179
  zIndex: 511 // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
@@ -61,6 +61,8 @@ var _UnauthorisedView = require("./UnauthorisedView");
61
61
 
62
62
  var _extractors = require("@atlaskit/linking-common/extractors");
63
63
 
64
+ var _linkProvider = require("@atlaskit/link-provider");
65
+
64
66
  var InlineCard = function InlineCard(_ref) {
65
67
  var _details$meta;
66
68
 
@@ -81,6 +83,11 @@ var InlineCard = function InlineCard(_ref) {
81
83
  details = cardState.details;
82
84
  var cardDetails = details && details.data || (0, _jsonld.getEmptyJsonLd)();
83
85
  var testIdWithStatus = testId ? "".concat(testId, "-").concat(status, "-view") : undefined;
86
+ var showHoverPreviewFlag = (0, _linkProvider.useFeatureFlag)('showHoverPreview');
87
+
88
+ if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
89
+ showHoverPreview = Boolean(showHoverPreviewFlag);
90
+ }
84
91
 
85
92
  switch (status) {
86
93
  case 'pending':
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import * as Blocks from '../view/FlexibleCard/components/blocks';
3
- import { PreviewBlock, TitleBlock } from '../view/FlexibleCard/components/blocks';
3
+ import { PreviewBlock, TitleBlock, FooterBlock } from '../view/FlexibleCard/components/blocks';
4
4
  import * as Elements from '../view/FlexibleCard/components/elements';
5
5
  export const isFlexibleUiCard = children => {
6
6
  if (children && React.Children.toArray(children).some(child => isFlexibleUiTitleBlock(child))) {
@@ -12,4 +12,5 @@ export const isFlexibleUiCard = children => {
12
12
  export const isFlexibleUiBlock = node => /*#__PURE__*/React.isValidElement(node) && Object.values(Blocks).some(type => type === node.type);
13
13
  export const isFlexibleUiElement = node => /*#__PURE__*/React.isValidElement(node) && Object.values(Elements).some(type => type === node.type);
14
14
  export const isFlexibleUiTitleBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === TitleBlock;
15
- export const isFlexibleUiPreviewBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === PreviewBlock;
15
+ export const isFlexibleUiPreviewBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === PreviewBlock;
16
+ export const isFlexibleUiFooterBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === FooterBlock;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.8.2",
3
+ "version": "23.9.0",
4
4
  "sideEffects": false
5
5
  }
@@ -49,12 +49,6 @@ export function CardWithUrlContent({
49
49
  const subproduct = getSubproduct(state.details);
50
50
  const services = getServices(state.details);
51
51
  let isFlexibleUi = useMemo(() => isFlexibleUiCard(children), [children]);
52
- const showHoverPreviewFlag = useFeatureFlag('showHoverPreview');
53
-
54
- if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
55
- showHoverPreview = Boolean(showHoverPreviewFlag);
56
- }
57
-
58
52
  const showAuthTooltipValue = useFeatureFlag('showAuthTooltip');
59
53
  const showAuthTooltip = !!showAuthTooltipValue && showAuthTooltipValue === 'experiment';
60
54
  const enableFlexibleBlockCardFlag = Boolean(useFeatureFlag('enableFlexibleBlockCard')); // Setup UI handlers.
@@ -140,6 +134,7 @@ export function CardWithUrlContent({
140
134
  onClick: handleClickWrapper,
141
135
  renderers: renderers,
142
136
  ui: ui,
137
+ showHoverPreview: showHoverPreview,
143
138
  url: url,
144
139
  testId: testId,
145
140
  onResolve: onResolve,
@@ -63,14 +63,9 @@ const ActionButton = ({
63
63
  e.preventDefault();
64
64
  handler();
65
65
  }, []);
66
- const onContainerClick = useCallback(e => {
67
- // Stop button on click event from propagate into parent container.
68
- e.stopPropagation();
69
- }, []);
70
66
  return jsx("div", {
71
67
  css: [getButtonStyle(size, iconOnly), overrideCss],
72
- "data-testid": `${testId}-button-wrapper`,
73
- onClick: onContainerClick
68
+ "data-testid": `${testId}-button-wrapper`
74
69
  }, jsx(Tooltip, {
75
70
  content: tooltipMessage,
76
71
  hideTooltipOnClick: true,
@@ -46,9 +46,7 @@ const ActionGroup = ({
46
46
  onDropdownOpenChange,
47
47
  testId
48
48
  }) => {
49
- const [isOpen, setIsOpen] = useState(false); // Stop AK dropdown menu to propagate event on click.
50
-
51
- const onClick = useCallback(e => e.stopPropagation(), []);
49
+ const [isOpen, setIsOpen] = useState(false);
52
50
  const onOpenChange = useCallback(attrs => {
53
51
  setIsOpen(attrs.isOpen);
54
52
 
@@ -74,8 +72,7 @@ const ActionGroup = ({
74
72
  const buttonGroupElement = renderActionItems(buttonActions, size, appearance, false, onActionClick);
75
73
  return jsx("div", {
76
74
  css: styles,
77
- className: "actions-button-group",
78
- onClick: onClick
75
+ className: "actions-button-group"
79
76
  }, jsx(ButtonGroup, null, buttonGroupElement, dropdownItemActions.length > 0 && dropdownMenuElement && dropdownMenuElement.length > 0 ? jsx(DropdownMenu, {
80
77
  isOpen: isOpen,
81
78
  onOpenChange: onOpenChange,
@@ -1,5 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import React from 'react';
2
+ import React, { useCallback } from 'react';
3
3
  import { css } from '@emotion/react';
4
4
  import { SmartLinkAlignment, SmartLinkDirection, SmartLinkSize, SmartLinkStatus, SmartLinkWidth } from '../../../../../constants';
5
5
  import Block from '../block';
@@ -31,8 +31,16 @@ const FooterBlock = props => {
31
31
  status,
32
32
  actions,
33
33
  size = SmartLinkSize.Medium,
34
- testId = 'smart-footer-block'
34
+ testId = 'smart-footer-block',
35
+ onActionMenuOpenChange
35
36
  } = props;
37
+ const onDropdownOpenChange = useCallback(isOpen => {
38
+ if (onActionMenuOpenChange) {
39
+ onActionMenuOpenChange({
40
+ isOpen
41
+ });
42
+ }
43
+ }, [onActionMenuOpenChange]);
36
44
 
37
45
  if (status !== SmartLinkStatus.Resolved) {
38
46
  return null;
@@ -49,6 +57,7 @@ const FooterBlock = props => {
49
57
  overrideCss: getActionGroupStyles(size),
50
58
  width: SmartLinkWidth.Flexible
51
59
  }, /*#__PURE__*/React.createElement(ActionGroup, {
60
+ onDropdownOpenChange: onDropdownOpenChange,
52
61
  items: actions,
53
62
  appearance: "default"
54
63
  })) : null);
@@ -1,11 +1,12 @@
1
1
  /** @jsx jsx */
2
- import React, { useContext } from 'react';
2
+ import React, { useContext, useState, useCallback } from 'react';
3
3
  import { css, jsx } from '@emotion/react';
4
4
  import { MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
5
- import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock } from '../../../../utils/flexible';
5
+ import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock, isFlexibleUiFooterBlock } from '../../../../utils/flexible';
6
6
  import { tokens } from '../../../../utils/token';
7
7
  import { FlexibleUiContext } from '../../../../state/flexible-ui-context';
8
8
  import LayeredLink from './layered-link';
9
+ import { HoverCard } from '../../../HoverCard';
9
10
  import { isFlexUiPreviewPresent } from '../../../../state/flexible-ui-context/utils';
10
11
  const elevationStyles = css`
11
12
  border: 1px solid transparent;
@@ -127,7 +128,7 @@ export const getContainerStyles = (size, hideBackground, hideElevation, hidePadd
127
128
  `;
128
129
  };
129
130
 
130
- const renderChildren = (children, containerSize, containerTheme, status, retry, onClick) => React.Children.map(children, child => {
131
+ const renderChildren = (children, containerSize, containerTheme, status, retry, onClick, onActionMenuOpenChange) => React.Children.map(children, child => {
131
132
  if ( /*#__PURE__*/React.isValidElement(child) && isFlexibleUiBlock(child)) {
132
133
  const {
133
134
  size: blockSize
@@ -142,6 +143,12 @@ const renderChildren = (children, containerSize, containerTheme, status, retry,
142
143
  status,
143
144
  theme: containerTheme
144
145
  });
146
+ } else if (onActionMenuOpenChange && isFlexibleUiFooterBlock(child)) {
147
+ return /*#__PURE__*/React.cloneElement(child, {
148
+ size,
149
+ status,
150
+ onActionMenuOpenChange
151
+ });
145
152
  }
146
153
 
147
154
  return /*#__PURE__*/React.cloneElement(child, {
@@ -192,6 +199,7 @@ const Container = ({
192
199
  hideBackground = false,
193
200
  hideElevation = false,
194
201
  hidePadding = false,
202
+ showHoverPreview = false,
195
203
  onClick,
196
204
  retry,
197
205
  size = SmartLinkSize.Medium,
@@ -201,11 +209,23 @@ const Container = ({
201
209
  }) => {
202
210
  const context = useContext(FlexibleUiContext);
203
211
  const childrenOptions = getChildrenOptions(children, context);
204
- return jsx("div", {
212
+ const [hoverCardCanOpen, setHoverCardCanOpen] = useState(true);
213
+ const onActionMenuOpenChange = useCallback(options => setHoverCardCanOpen(!options.isOpen), []);
214
+ const containerContent = jsx("div", {
205
215
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
206
216
  "data-smart-link-container": true,
207
217
  "data-testid": testId
208
- }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
218
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick, showHoverPreview ? onActionMenuOpenChange : undefined));
219
+
220
+ if (showHoverPreview && context !== null && context !== void 0 && context.url) {
221
+ return jsx(HoverCard, {
222
+ url: context === null || context === void 0 ? void 0 : context.url,
223
+ canOpen: hoverCardCanOpen,
224
+ closeOnChildClick: true
225
+ }, containerContent);
226
+ }
227
+
228
+ return containerContent;
209
229
  };
210
230
 
211
231
  export default Container;
@@ -22,7 +22,8 @@ const FlexibleCard = ({
22
22
  url,
23
23
  onClick,
24
24
  testId,
25
- analytics
25
+ analytics,
26
+ showHoverPreview
26
27
  }) => {
27
28
  const {
28
29
  status: cardType,
@@ -68,6 +69,7 @@ const FlexibleCard = ({
68
69
  }, /*#__PURE__*/React.createElement(Container, _extends({
69
70
  testId: testId
70
71
  }, ui, {
72
+ showHoverPreview: showHoverPreview,
71
73
  onClick: onClick,
72
74
  retry: retry,
73
75
  status: status
@@ -14,7 +14,9 @@ export const HoverCardComponent = ({
14
14
  children,
15
15
  url,
16
16
  analyticsHandler,
17
- analytics
17
+ analytics,
18
+ canOpen = true,
19
+ closeOnChildClick = false
18
20
  }) => {
19
21
  const delay = 300;
20
22
  const [isOpen, setIsOpen] = React.useState(false);
@@ -102,9 +104,16 @@ export const HoverCardComponent = ({
102
104
  }
103
105
  }, [hideCard]); // Stop hover preview content to propagate event to parent.
104
106
 
107
+ const onChildClick = useCallback(e => {
108
+ e.stopPropagation();
109
+
110
+ if (closeOnChildClick) {
111
+ hideCard();
112
+ }
113
+ }, [closeOnChildClick, hideCard]);
105
114
  return jsx(Popup, {
106
115
  testId: "hover-card",
107
- isOpen: isOpen,
116
+ isOpen: isOpen && canOpen,
108
117
  onClose: hideCard,
109
118
  placement: "bottom-start",
110
119
  offset: popupOffset.current,
@@ -127,7 +136,8 @@ export const HoverCardComponent = ({
127
136
  }, jsx("span", _extends({}, triggerProps, {
128
137
  onMouseEnter: initShowCard,
129
138
  onMouseLeave: initHideCard,
130
- onMouseMove: setMousePosition
139
+ onMouseMove: setMousePosition,
140
+ onClick: onChildClick
131
141
  }), children)),
132
142
  zIndex: 511 // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
133
143
 
@@ -10,6 +10,7 @@ import { InlineCardResolvedView } from './ResolvedView';
10
10
  import { InlineCardResolvingView } from './ResolvingView';
11
11
  import { InlineCardUnauthorizedView } from './UnauthorisedView';
12
12
  import { extractProvider } from '@atlaskit/linking-common/extractors';
13
+ import { useFeatureFlag } from '@atlaskit/link-provider';
13
14
  export { InlineCardResolvedView, InlineCardResolvingView, InlineCardErroredView, InlineCardForbiddenView, InlineCardUnauthorizedView };
14
15
  export const InlineCard = ({
15
16
  id,
@@ -34,6 +35,11 @@ export const InlineCard = ({
34
35
  } = cardState;
35
36
  const cardDetails = details && details.data || getEmptyJsonLd();
36
37
  const testIdWithStatus = testId ? `${testId}-${status}-view` : undefined;
38
+ const showHoverPreviewFlag = useFeatureFlag('showHoverPreview');
39
+
40
+ if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
41
+ showHoverPreview = Boolean(showHoverPreviewFlag);
42
+ }
37
43
 
38
44
  switch (status) {
39
45
  case 'pending':
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import * as Blocks from '../view/FlexibleCard/components/blocks';
3
- import { PreviewBlock, TitleBlock } from '../view/FlexibleCard/components/blocks';
3
+ import { PreviewBlock, TitleBlock, FooterBlock } from '../view/FlexibleCard/components/blocks';
4
4
  import * as Elements from '../view/FlexibleCard/components/elements';
5
5
  export var isFlexibleUiCard = function isFlexibleUiCard(children) {
6
6
  if (children && React.Children.toArray(children).some(function (child) {
@@ -26,4 +26,7 @@ export var isFlexibleUiTitleBlock = function isFlexibleUiTitleBlock(node) {
26
26
  };
27
27
  export var isFlexibleUiPreviewBlock = function isFlexibleUiPreviewBlock(node) {
28
28
  return /*#__PURE__*/React.isValidElement(node) && node.type === PreviewBlock;
29
+ };
30
+ export var isFlexibleUiFooterBlock = function isFlexibleUiFooterBlock(node) {
31
+ return /*#__PURE__*/React.isValidElement(node) && node.type === FooterBlock;
29
32
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.8.2",
3
+ "version": "23.9.0",
4
4
  "sideEffects": false
5
5
  }
@@ -51,12 +51,6 @@ export function CardWithUrlContent(_ref) {
51
51
  var isFlexibleUi = useMemo(function () {
52
52
  return isFlexibleUiCard(children);
53
53
  }, [children]);
54
- var showHoverPreviewFlag = useFeatureFlag('showHoverPreview');
55
-
56
- if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
57
- showHoverPreview = Boolean(showHoverPreviewFlag);
58
- }
59
-
60
54
  var showAuthTooltipValue = useFeatureFlag('showAuthTooltip');
61
55
  var showAuthTooltip = !!showAuthTooltipValue && showAuthTooltipValue === 'experiment';
62
56
  var enableFlexibleBlockCardFlag = Boolean(useFeatureFlag('enableFlexibleBlockCard')); // Setup UI handlers.
@@ -146,6 +140,7 @@ export function CardWithUrlContent(_ref) {
146
140
  onClick: handleClickWrapper,
147
141
  renderers: renderers,
148
142
  ui: ui,
143
+ showHoverPreview: showHoverPreview,
149
144
  url: url,
150
145
  testId: testId,
151
146
  onResolve: onResolve,
@@ -42,14 +42,9 @@ var ActionButton = function ActionButton(_ref) {
42
42
  handler();
43
43
  };
44
44
  }, []);
45
- var onContainerClick = useCallback(function (e) {
46
- // Stop button on click event from propagate into parent container.
47
- e.stopPropagation();
48
- }, []);
49
45
  return jsx("div", {
50
46
  css: [getButtonStyle(size, iconOnly), overrideCss],
51
- "data-testid": "".concat(testId, "-button-wrapper"),
52
- onClick: onContainerClick
47
+ "data-testid": "".concat(testId, "-button-wrapper")
53
48
  }, jsx(Tooltip, {
54
49
  content: tooltipMessage,
55
50
  hideTooltipOnClick: true,
@@ -43,12 +43,8 @@ var ActionGroup = function ActionGroup(_ref) {
43
43
  var _useState = useState(false),
44
44
  _useState2 = _slicedToArray(_useState, 2),
45
45
  isOpen = _useState2[0],
46
- setIsOpen = _useState2[1]; // Stop AK dropdown menu to propagate event on click.
46
+ setIsOpen = _useState2[1];
47
47
 
48
-
49
- var onClick = useCallback(function (e) {
50
- return e.stopPropagation();
51
- }, []);
52
48
  var onOpenChange = useCallback(function (attrs) {
53
49
  setIsOpen(attrs.isOpen);
54
50
 
@@ -81,8 +77,7 @@ var ActionGroup = function ActionGroup(_ref) {
81
77
  var buttonGroupElement = renderActionItems(buttonActions, size, appearance, false, onActionClick);
82
78
  return jsx("div", {
83
79
  css: styles,
84
- className: "actions-button-group",
85
- onClick: onClick
80
+ className: "actions-button-group"
86
81
  }, jsx(ButtonGroup, null, buttonGroupElement, dropdownItemActions.length > 0 && dropdownMenuElement && dropdownMenuElement.length > 0 ? jsx(DropdownMenu, {
87
82
  isOpen: isOpen,
88
83
  onOpenChange: onOpenChange,
@@ -3,7 +3,7 @@ import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral
3
3
 
4
4
  var _templateObject;
5
5
 
6
- import React from 'react';
6
+ import React, { useCallback } from 'react';
7
7
  import { css } from '@emotion/react';
8
8
  import { SmartLinkAlignment, SmartLinkDirection, SmartLinkSize, SmartLinkStatus, SmartLinkWidth } from '../../../../../constants';
9
9
  import Block from '../block';
@@ -34,7 +34,15 @@ var FooterBlock = function FooterBlock(props) {
34
34
  _props$size = props.size,
35
35
  size = _props$size === void 0 ? SmartLinkSize.Medium : _props$size,
36
36
  _props$testId = props.testId,
37
- testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId;
37
+ testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId,
38
+ onActionMenuOpenChange = props.onActionMenuOpenChange;
39
+ var onDropdownOpenChange = useCallback(function (isOpen) {
40
+ if (onActionMenuOpenChange) {
41
+ onActionMenuOpenChange({
42
+ isOpen: isOpen
43
+ });
44
+ }
45
+ }, [onActionMenuOpenChange]);
38
46
 
39
47
  if (status !== SmartLinkStatus.Resolved) {
40
48
  return null;
@@ -51,6 +59,7 @@ var FooterBlock = function FooterBlock(props) {
51
59
  overrideCss: getActionGroupStyles(size),
52
60
  width: SmartLinkWidth.Flexible
53
61
  }, /*#__PURE__*/React.createElement(ActionGroup, {
62
+ onDropdownOpenChange: onDropdownOpenChange,
54
63
  items: actions,
55
64
  appearance: "default"
56
65
  })) : null);
@@ -1,15 +1,17 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
3
 
3
4
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
4
5
 
5
6
  /** @jsx jsx */
6
- import React, { useContext } from 'react';
7
+ import React, { useContext, useState, useCallback } from 'react';
7
8
  import { css, jsx } from '@emotion/react';
8
9
  import { MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
9
- import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock } from '../../../../utils/flexible';
10
+ import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock, isFlexibleUiFooterBlock } from '../../../../utils/flexible';
10
11
  import { tokens } from '../../../../utils/token';
11
12
  import { FlexibleUiContext } from '../../../../state/flexible-ui-context';
12
13
  import LayeredLink from './layered-link';
14
+ import { HoverCard } from '../../../HoverCard';
13
15
  import { isFlexUiPreviewPresent } from '../../../../state/flexible-ui-context/utils';
14
16
  var elevationStyles = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n border: 1px solid transparent;\n border-radius: 1.5px;\n box-shadow: ", ";\n margin: 2px;\n"])), tokens.elevation);
15
17
 
@@ -86,7 +88,7 @@ export var getContainerStyles = function getContainerStyles(size, hideBackground
86
88
  return css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: flex;\n gap: ", " 0;\n flex-direction: column;\n min-width: 0;\n overflow-x: hidden;\n position: relative;\n ", "\n ", "\n ", "\n ", "\n &:hover ~ .actions-button-group {\n opacity: 1;\n }\n a:focus,\n .has-action:focus {\n outline-offset: -2px;\n }\n "])), getGap(size), hideBackground ? '' : "background-color: ".concat(tokens.background, ";"), paddingCss, hideElevation ? '' : elevationStyles, clickableContainer ? clickableContainerStyles : '');
87
89
  };
88
90
 
89
- var renderChildren = function renderChildren(children, containerSize, containerTheme, status, retry, onClick) {
91
+ var renderChildren = function renderChildren(children, containerSize, containerTheme, status, retry, onClick, onActionMenuOpenChange) {
90
92
  return React.Children.map(children, function (child) {
91
93
  if ( /*#__PURE__*/React.isValidElement(child) && isFlexibleUiBlock(child)) {
92
94
  var blockSize = child.props.size;
@@ -100,6 +102,12 @@ var renderChildren = function renderChildren(children, containerSize, containerT
100
102
  status: status,
101
103
  theme: containerTheme
102
104
  });
105
+ } else if (onActionMenuOpenChange && isFlexibleUiFooterBlock(child)) {
106
+ return /*#__PURE__*/React.cloneElement(child, {
107
+ size: size,
108
+ status: status,
109
+ onActionMenuOpenChange: onActionMenuOpenChange
110
+ });
103
111
  }
104
112
 
105
113
  return /*#__PURE__*/React.cloneElement(child, {
@@ -158,6 +166,8 @@ var Container = function Container(_ref3) {
158
166
  hideElevation = _ref3$hideElevation === void 0 ? false : _ref3$hideElevation,
159
167
  _ref3$hidePadding = _ref3.hidePadding,
160
168
  hidePadding = _ref3$hidePadding === void 0 ? false : _ref3$hidePadding,
169
+ _ref3$showHoverPrevie = _ref3.showHoverPreview,
170
+ showHoverPreview = _ref3$showHoverPrevie === void 0 ? false : _ref3$showHoverPrevie,
161
171
  onClick = _ref3.onClick,
162
172
  retry = _ref3.retry,
163
173
  _ref3$size = _ref3.size,
@@ -169,11 +179,30 @@ var Container = function Container(_ref3) {
169
179
  theme = _ref3$theme === void 0 ? SmartLinkTheme.Link : _ref3$theme;
170
180
  var context = useContext(FlexibleUiContext);
171
181
  var childrenOptions = getChildrenOptions(children, context);
172
- return jsx("div", {
182
+
183
+ var _useState = useState(true),
184
+ _useState2 = _slicedToArray(_useState, 2),
185
+ hoverCardCanOpen = _useState2[0],
186
+ setHoverCardCanOpen = _useState2[1];
187
+
188
+ var onActionMenuOpenChange = useCallback(function (options) {
189
+ return setHoverCardCanOpen(!options.isOpen);
190
+ }, []);
191
+ var containerContent = jsx("div", {
173
192
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
174
193
  "data-smart-link-container": true,
175
194
  "data-testid": testId
176
- }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
195
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick, showHoverPreview ? onActionMenuOpenChange : undefined));
196
+
197
+ if (showHoverPreview && context !== null && context !== void 0 && context.url) {
198
+ return jsx(HoverCard, {
199
+ url: context === null || context === void 0 ? void 0 : context.url,
200
+ canOpen: hoverCardCanOpen,
201
+ closeOnChildClick: true
202
+ }, containerContent);
203
+ }
204
+
205
+ return containerContent;
177
206
  };
178
207
 
179
208
  export default Container;
@@ -22,7 +22,8 @@ var FlexibleCard = function FlexibleCard(_ref) {
22
22
  url = _ref.url,
23
23
  onClick = _ref.onClick,
24
24
  testId = _ref.testId,
25
- analytics = _ref.analytics;
25
+ analytics = _ref.analytics,
26
+ showHoverPreview = _ref.showHoverPreview;
26
27
  var cardType = cardState.status,
27
28
  details = cardState.details;
28
29
  var status = cardType;
@@ -66,6 +67,7 @@ var FlexibleCard = function FlexibleCard(_ref) {
66
67
  }, /*#__PURE__*/React.createElement(Container, _extends({
67
68
  testId: testId
68
69
  }, ui, {
70
+ showHoverPreview: showHoverPreview,
69
71
  onClick: onClick,
70
72
  retry: retry,
71
73
  status: status
@@ -15,7 +15,11 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
15
15
  var children = _ref.children,
16
16
  url = _ref.url,
17
17
  analyticsHandler = _ref.analyticsHandler,
18
- analytics = _ref.analytics;
18
+ analytics = _ref.analytics,
19
+ _ref$canOpen = _ref.canOpen,
20
+ canOpen = _ref$canOpen === void 0 ? true : _ref$canOpen,
21
+ _ref$closeOnChildClic = _ref.closeOnChildClick,
22
+ closeOnChildClick = _ref$closeOnChildClic === void 0 ? false : _ref$closeOnChildClic;
19
23
  var delay = 300;
20
24
 
21
25
  var _React$useState = React.useState(false),
@@ -109,9 +113,16 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
109
113
  }
110
114
  }, [hideCard]); // Stop hover preview content to propagate event to parent.
111
115
 
116
+ var onChildClick = useCallback(function (e) {
117
+ e.stopPropagation();
118
+
119
+ if (closeOnChildClick) {
120
+ hideCard();
121
+ }
122
+ }, [closeOnChildClick, hideCard]);
112
123
  return jsx(Popup, {
113
124
  testId: "hover-card",
114
- isOpen: isOpen,
125
+ isOpen: isOpen && canOpen,
115
126
  onClose: hideCard,
116
127
  placement: "bottom-start",
117
128
  offset: popupOffset.current,
@@ -136,7 +147,8 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
136
147
  }, jsx("span", _extends({}, triggerProps, {
137
148
  onMouseEnter: initShowCard,
138
149
  onMouseLeave: initHideCard,
139
- onMouseMove: setMousePosition
150
+ onMouseMove: setMousePosition,
151
+ onClick: onChildClick
140
152
  }), children));
141
153
  },
142
154
  zIndex: 511 // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
@@ -10,6 +10,7 @@ import { InlineCardResolvedView } from './ResolvedView';
10
10
  import { InlineCardResolvingView } from './ResolvingView';
11
11
  import { InlineCardUnauthorizedView } from './UnauthorisedView';
12
12
  import { extractProvider } from '@atlaskit/linking-common/extractors';
13
+ import { useFeatureFlag } from '@atlaskit/link-provider';
13
14
  export { InlineCardResolvedView, InlineCardResolvingView, InlineCardErroredView, InlineCardForbiddenView, InlineCardUnauthorizedView };
14
15
  export var InlineCard = function InlineCard(_ref) {
15
16
  var _details$meta;
@@ -31,6 +32,11 @@ export var InlineCard = function InlineCard(_ref) {
31
32
  details = cardState.details;
32
33
  var cardDetails = details && details.data || getEmptyJsonLd();
33
34
  var testIdWithStatus = testId ? "".concat(testId, "-").concat(status, "-view") : undefined;
35
+ var showHoverPreviewFlag = useFeatureFlag('showHoverPreview');
36
+
37
+ if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
38
+ showHoverPreview = Boolean(showHoverPreviewFlag);
39
+ }
34
40
 
35
41
  switch (status) {
36
42
  case 'pending':
@@ -4,3 +4,4 @@ export declare const isFlexibleUiBlock: (node: React.ReactNode) => boolean;
4
4
  export declare const isFlexibleUiElement: (node: React.ReactNode) => boolean;
5
5
  export declare const isFlexibleUiTitleBlock: (node: React.ReactNode) => boolean;
6
6
  export declare const isFlexibleUiPreviewBlock: (node: React.ReactNode) => boolean;
7
+ export declare const isFlexibleUiFooterBlock: (node: React.ReactNode) => boolean;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
2
  import { CardAppearance, CardPlatform, CardProps } from './types';
3
3
  import { WrappedComponentProps } from 'react-intl-next';
4
- export declare const Card: React.ForwardRefExoticComponent<Pick<Omit<React.PropsWithChildren<import("react-intl-next").WithIntlProps<CardProps & WrappedComponentProps<"intl">>>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "url" | "children" | "data" | "key" | "id" | "placeholder" | "onError" | "onClick" | "appearance" | "testId" | "analyticsContext" | "isSelected" | "inheritDimensions" | "ui" | "showActions" | "onResolve" | "platform" | "showHoverPreview" | "isFrameVisible" | "embedIframeRef" | "inlinePreloaderStyle" | "importer" | "container" | "analyticsEvents" | "forwardedRef"> & React.RefAttributes<any>>;
4
+ export declare const Card: React.ForwardRefExoticComponent<Pick<Omit<React.PropsWithChildren<import("react-intl-next").WithIntlProps<CardProps & WrappedComponentProps<"intl">>>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "url" | "children" | "data" | "key" | "id" | "placeholder" | "onError" | "onClick" | "appearance" | "testId" | "analyticsContext" | "isSelected" | "inheritDimensions" | "ui" | "showActions" | "showHoverPreview" | "onResolve" | "platform" | "isFrameVisible" | "embedIframeRef" | "inlinePreloaderStyle" | "importer" | "container" | "analyticsEvents" | "forwardedRef"> & React.RefAttributes<any>>;
5
5
  export type { CardAppearance, CardProps, CardPlatform };
@@ -25,7 +25,7 @@ export declare type ActionGroupProps = {
25
25
  */
26
26
  visibleButtonsNum?: number;
27
27
  /**
28
- * Callback used by the dropdown. Is called when the dropdown is opened.
28
+ * Called when the action dropdown menu (if present) is open/closed.
29
29
  */
30
30
  onDropdownOpenChange?: (isOpen: boolean) => void;
31
31
  /**
@@ -1,4 +1,5 @@
1
1
  import { ActionItem, BlockProps } from '../types';
2
+ import { OnActionMenuOpenChangeOptions } from '../types';
2
3
  export declare type FooterBlockProps = {
3
4
  /**
4
5
  * An array of actions to be displayed on the right.
@@ -7,4 +8,8 @@ export declare type FooterBlockProps = {
7
8
  * @see ActionItem
8
9
  */
9
10
  actions?: ActionItem[];
11
+ /**
12
+ * Function to be called when footer action dropdown open state is changed.
13
+ */
14
+ onActionMenuOpenChange?: (options: OnActionMenuOpenChangeOptions) => void;
10
15
  } & BlockProps;
@@ -22,6 +22,11 @@ export declare type ContainerProps = FlexibleUiOptions & {
22
22
  * serving as a hook for automated tests
23
23
  */
24
24
  testId?: string;
25
+ /**
26
+ * Determine whether or not a preview card should show up when a user hovers
27
+ * over the smartlink.
28
+ */
29
+ showHoverPreview?: Boolean;
25
30
  };
26
31
  export declare type ChildrenOptions = {
27
32
  previewOnLeft?: boolean;
@@ -71,6 +71,11 @@ export declare type FlexibleCardProps = {
71
71
  * Determines the URL of the Smart Link.
72
72
  */
73
73
  url: string;
74
+ /**
75
+ * Determine whether or not a preview card should show up when a user hovers
76
+ * over the smartlink. Default value is false.
77
+ */
78
+ showHoverPreview?: Boolean;
74
79
  };
75
80
  export declare type FlexibleUiOptions = {
76
81
  /**
@@ -1,3 +1,3 @@
1
1
  /// <reference types="react" />
2
2
  import { HoverCardProps } from './types';
3
- export declare const HoverCard: import("react").ForwardRefExoticComponent<Pick<Omit<import("react").PropsWithChildren<HoverCardProps>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & import("react").RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "url" | "children" | "key" | "id" | "analyticsContext" | "onAuthorize"> & import("react").RefAttributes<any>>;
3
+ export declare const HoverCard: import("react").ForwardRefExoticComponent<Pick<Omit<import("react").PropsWithChildren<HoverCardProps>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & import("react").RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "url" | "children" | "key" | "id" | "analyticsContext" | "onAuthorize" | "canOpen" | "closeOnChildClick"> & import("react").RefAttributes<any>>;
@@ -8,14 +8,38 @@ import { AnalyticsHandler } from '../../utils/types';
8
8
  import { ReactElement, MouseEventHandler } from 'react';
9
9
  import { JsonLd } from 'json-ld-types';
10
10
  export interface HoverCardProps extends WithAnalyticsEventsProps {
11
+ /**
12
+ * Unique ID for a hover card. Used for analytics.
13
+ */
11
14
  id?: string;
15
+ /**
16
+ * Hover card will display data from this url.
17
+ */
12
18
  url: string;
19
+ /**
20
+ * React children component over which the hover card can be triggered.
21
+ */
13
22
  children: ReactElement;
23
+ /**
24
+ * Function to be called when user is authorized to view a link.
25
+ */
14
26
  onAuthorize?: () => void;
27
+ /**
28
+ * Determines if the hover card is allowed to open. If changed from true to false while the
29
+ * hover card is open, the hover card will be closed.
30
+ */
31
+ canOpen?: boolean;
32
+ /**
33
+ * Determines if the hover card should close when the children passed in are
34
+ * clicked.
35
+ */
36
+ closeOnChildClick?: boolean;
15
37
  }
16
38
  export interface HoverCardComponentProps extends HoverCardProps {
17
39
  analyticsHandler: AnalyticsHandler;
18
40
  analytics: AnalyticsFacade;
41
+ canOpen?: boolean;
42
+ closeOnChildClick?: boolean;
19
43
  }
20
44
  export declare type PreviewDisplay = 'card' | 'embed';
21
45
  export declare type PreviewInvokeMethod = 'keyboard' | 'mouse_hover' | 'mouse_click';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.8.2",
3
+ "version": "23.9.0",
4
4
  "description": "Smart card component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
package/report.api.md CHANGED
@@ -538,6 +538,7 @@ export const FooterBlock: React_2.FC<FooterBlockProps>;
538
538
  // @public (undocumented)
539
539
  type FooterBlockProps = {
540
540
  actions?: ActionItem[];
541
+ onActionMenuOpenChange?: (options: OnActionMenuOpenChangeOptions) => void;
541
542
  } & BlockProps;
542
543
 
543
544
  export { InlineCardAdf };
@@ -419,6 +419,7 @@ export const FooterBlock: React_2.FC<FooterBlockProps>;
419
419
  // @public (undocumented)
420
420
  type FooterBlockProps = {
421
421
  actions?: ActionItem[];
422
+ onActionMenuOpenChange?: (options: OnActionMenuOpenChangeOptions) => void;
422
423
  } & BlockProps;
423
424
 
424
425
  export { InlineCardAdf }