@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.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/utils/flexible.js +8 -2
- package/dist/cjs/version.json +1 -1
- package/dist/cjs/view/CardWithUrl/component.js +1 -6
- package/dist/cjs/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
- package/dist/cjs/view/FlexibleCard/components/blocks/action-group/index.js +2 -7
- package/dist/cjs/view/FlexibleCard/components/blocks/footer-block/index.js +17 -2
- package/dist/cjs/view/FlexibleCard/components/container/index.js +34 -3
- package/dist/cjs/view/FlexibleCard/index.js +3 -1
- package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +15 -3
- package/dist/cjs/view/InlineCard/index.js +7 -0
- package/dist/es2019/utils/flexible.js +3 -2
- package/dist/es2019/version.json +1 -1
- package/dist/es2019/view/CardWithUrl/component.js +1 -6
- package/dist/es2019/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
- package/dist/es2019/view/FlexibleCard/components/blocks/action-group/index.js +2 -5
- package/dist/es2019/view/FlexibleCard/components/blocks/footer-block/index.js +11 -2
- package/dist/es2019/view/FlexibleCard/components/container/index.js +25 -5
- package/dist/es2019/view/FlexibleCard/index.js +3 -1
- package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +13 -3
- package/dist/es2019/view/InlineCard/index.js +6 -0
- package/dist/esm/utils/flexible.js +4 -1
- package/dist/esm/version.json +1 -1
- package/dist/esm/view/CardWithUrl/component.js +1 -6
- package/dist/esm/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
- package/dist/esm/view/FlexibleCard/components/blocks/action-group/index.js +2 -7
- package/dist/esm/view/FlexibleCard/components/blocks/footer-block/index.js +11 -2
- package/dist/esm/view/FlexibleCard/components/container/index.js +34 -5
- package/dist/esm/view/FlexibleCard/index.js +3 -1
- package/dist/esm/view/HoverCard/components/HoverCardComponent.js +15 -3
- package/dist/esm/view/InlineCard/index.js +6 -0
- package/dist/types/utils/flexible.d.ts +1 -0
- package/dist/types/view/Card/index.d.ts +1 -1
- package/dist/types/view/FlexibleCard/components/blocks/action-group/types.d.ts +1 -1
- package/dist/types/view/FlexibleCard/components/blocks/footer-block/types.d.ts +5 -0
- package/dist/types/view/FlexibleCard/components/container/types.d.ts +5 -0
- package/dist/types/view/FlexibleCard/types.d.ts +5 -0
- package/dist/types/view/HoverCard/index.d.ts +1 -1
- package/dist/types/view/HoverCard/types.d.ts +24 -0
- package/package.json +1 -1
- package/report.api.md +1 -0
- 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;
|
package/dist/cjs/version.json
CHANGED
|
@@ -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];
|
|
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 =
|
|
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
|
-
|
|
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;
|
package/dist/es2019/version.json
CHANGED
|
@@ -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);
|
|
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
|
-
|
|
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
|
};
|
package/dist/esm/version.json
CHANGED
|
@@ -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];
|
|
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
|
-
|
|
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" | "
|
|
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
|
-
*
|
|
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
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 };
|
package/tmp/api-report-tmp.d.ts
CHANGED
|
@@ -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 }
|