@atlaskit/smart-card 26.9.3 → 26.9.6
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 +19 -0
- package/dist/cjs/version.json +1 -1
- package/dist/cjs/view/CardWithUrl/component.js +2 -4
- package/dist/cjs/view/FlexibleCard/components/container/hover-card-control/index.js +82 -0
- package/dist/cjs/view/FlexibleCard/components/container/hover-card-control/types.js +5 -0
- package/dist/cjs/view/FlexibleCard/components/container/index.js +12 -41
- package/dist/es2019/version.json +1 -1
- package/dist/es2019/view/CardWithUrl/component.js +2 -4
- package/dist/es2019/view/FlexibleCard/components/container/hover-card-control/index.js +68 -0
- package/dist/es2019/view/FlexibleCard/components/container/hover-card-control/types.js +1 -0
- package/dist/es2019/view/FlexibleCard/components/container/index.js +14 -39
- package/dist/esm/version.json +1 -1
- package/dist/esm/view/CardWithUrl/component.js +2 -4
- package/dist/esm/view/FlexibleCard/components/container/hover-card-control/index.js +71 -0
- package/dist/esm/view/FlexibleCard/components/container/hover-card-control/types.js +1 -0
- package/dist/esm/view/FlexibleCard/components/container/index.js +14 -43
- package/dist/types/view/FlexibleCard/components/container/hover-card-control/index.d.ts +4 -0
- package/dist/types/view/FlexibleCard/components/container/hover-card-control/types.d.ts +7 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/container/hover-card-control/index.d.ts +4 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/container/hover-card-control/types.d.ts +7 -0
- package/package.json +20 -19
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @atlaskit/smart-card
|
|
2
2
|
|
|
3
|
+
## 26.9.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`e0a2c926e63`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e0a2c926e63) - [ux] Flexible Smart Links: Fix hover preview shows on mouse leave
|
|
8
|
+
|
|
9
|
+
## 26.9.5
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [`7b08013b112`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7b08013b112) - Clean up use of showAuthTooltip FF. Switch to being fully reliant on the showAuthTooltip prop.
|
|
14
|
+
- Updated dependencies
|
|
15
|
+
|
|
16
|
+
## 26.9.4
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- [`2a4926aa20a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2a4926aa20a) - [ux] Flexible Smart Links: Add hover preview show/hide delay when mouse moves inside the card
|
|
21
|
+
|
|
3
22
|
## 26.9.3
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/cjs/version.json
CHANGED
|
@@ -45,7 +45,7 @@ function Component(_ref) {
|
|
|
45
45
|
ui = _ref.ui,
|
|
46
46
|
children = _ref.children,
|
|
47
47
|
showHoverPreview = _ref.showHoverPreview,
|
|
48
|
-
|
|
48
|
+
showAuthTooltip = _ref.showAuthTooltip,
|
|
49
49
|
analyticsEvents = _ref.analyticsEvents;
|
|
50
50
|
var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
|
|
51
51
|
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
@@ -68,8 +68,6 @@ function Component(_ref) {
|
|
|
68
68
|
var isFlexibleUi = (0, _react.useMemo)(function () {
|
|
69
69
|
return (0, _flexible.isFlexibleUiCard)(children);
|
|
70
70
|
}, [children]);
|
|
71
|
-
var showAuthTooltipFeatureFlagValue = (0, _linkProvider.useFeatureFlag)('showAuthTooltip');
|
|
72
|
-
var showAuthTooltip = showAuthTooltipFeatureFlagValue !== undefined ? showAuthTooltipFeatureFlagValue === 'experiment' : showAuthTooltipProp;
|
|
73
71
|
var enableFlexibleBlockCardFlag = Boolean((0, _linkProvider.useFeatureFlag)('enableFlexibleBlockCard'));
|
|
74
72
|
var showServerActions = showServerActionsProp && platform !== 'mobile';
|
|
75
73
|
|
|
@@ -191,7 +189,7 @@ function Component(_ref) {
|
|
|
191
189
|
renderers: renderers,
|
|
192
190
|
ui: ui,
|
|
193
191
|
showHoverPreview: showHoverPreview,
|
|
194
|
-
showAuthTooltip:
|
|
192
|
+
showAuthTooltip: showAuthTooltip,
|
|
195
193
|
showServerActions: showServerActions,
|
|
196
194
|
url: url,
|
|
197
195
|
testId: testId,
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _HoverCard = require("../../../../HoverCard");
|
|
12
|
+
var _constants = require("../../../../../constants");
|
|
13
|
+
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); }
|
|
14
|
+
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; }
|
|
15
|
+
var FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
|
|
16
|
+
var HoverCardControl = function HoverCardControl(_ref) {
|
|
17
|
+
var children = _ref.children,
|
|
18
|
+
hideHoverCardPreviewButton = _ref.hideHoverCardPreviewButton,
|
|
19
|
+
isHoverPreview = _ref.isHoverPreview,
|
|
20
|
+
isAuthTooltip = _ref.isAuthTooltip,
|
|
21
|
+
showServerActions = _ref.showServerActions,
|
|
22
|
+
testId = _ref.testId,
|
|
23
|
+
url = _ref.url;
|
|
24
|
+
var _useState = (0, _react.useState)(true),
|
|
25
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
26
|
+
canOpen = _useState2[0],
|
|
27
|
+
setCanOpen = _useState2[1];
|
|
28
|
+
var mouseStopTimer = (0, _react.useRef)();
|
|
29
|
+
(0, _react.useEffect)(function () {
|
|
30
|
+
return function () {
|
|
31
|
+
if (mouseStopTimer.current) {
|
|
32
|
+
clearTimeout(mouseStopTimer.current);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}, []);
|
|
36
|
+
var onMouseLeave = (0, _react.useCallback)(function () {
|
|
37
|
+
if (mouseStopTimer.current) {
|
|
38
|
+
clearTimeout(mouseStopTimer.current);
|
|
39
|
+
}
|
|
40
|
+
}, []);
|
|
41
|
+
var onMouseMove = (0, _react.useCallback)(function (e) {
|
|
42
|
+
var _e$target$closest;
|
|
43
|
+
if (mouseStopTimer.current) {
|
|
44
|
+
clearTimeout(mouseStopTimer.current);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Never show hover card on action or when action dropdown opens.
|
|
48
|
+
// The code below can be simplified by using :is() and :has()
|
|
49
|
+
// but the pseudo-class isn't support by Firefox yet.
|
|
50
|
+
var action =
|
|
51
|
+
// Any action button group (title/footer block)
|
|
52
|
+
e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
|
|
53
|
+
(_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
|
|
54
|
+
var canOpenOnElement = isAuthTooltip && !action ||
|
|
55
|
+
// EDM-7060: For hover preview, also hide hover card on all elements
|
|
56
|
+
// except title element (link title)
|
|
57
|
+
isHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(_constants.ElementName.Title, "\"])"));
|
|
58
|
+
mouseStopTimer.current = setTimeout(function () {
|
|
59
|
+
if (canOpen !== canOpenOnElement) {
|
|
60
|
+
setCanOpen(Boolean(canOpenOnElement));
|
|
61
|
+
}
|
|
62
|
+
}, FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY);
|
|
63
|
+
}, [isAuthTooltip, isHoverPreview, canOpen]);
|
|
64
|
+
return /*#__PURE__*/_react.default.createElement(_HoverCard.HoverCard, {
|
|
65
|
+
allowEventPropagation: true,
|
|
66
|
+
canOpen: canOpen,
|
|
67
|
+
closeOnChildClick: true,
|
|
68
|
+
hidePreviewButton: hideHoverCardPreviewButton
|
|
69
|
+
// EDM-6709 extends the internal prop for showServerActions type to be
|
|
70
|
+
// an object. If we decide to use expose the type for hover preview
|
|
71
|
+
// remove the Boolean() conversion here.
|
|
72
|
+
,
|
|
73
|
+
showServerActions: Boolean(showServerActions),
|
|
74
|
+
url: url
|
|
75
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
76
|
+
onMouseLeave: onMouseLeave,
|
|
77
|
+
onMouseMove: onMouseMove,
|
|
78
|
+
"data-testid": "".concat(testId, "-hover-card-wrapper")
|
|
79
|
+
}, children));
|
|
80
|
+
};
|
|
81
|
+
var _default = HoverCardControl;
|
|
82
|
+
exports.default = _default;
|
|
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.getContainerStyles = exports.default = void 0;
|
|
9
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
9
|
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
|
|
12
10
|
var _react = _interopRequireWildcard(require("react"));
|
|
13
11
|
var _react2 = require("@emotion/react");
|
|
@@ -16,7 +14,7 @@ var _flexible = require("../../../../utils/flexible");
|
|
|
16
14
|
var _token = require("../../../../utils/token");
|
|
17
15
|
var _flexibleUiContext = require("../../../../state/flexible-ui-context");
|
|
18
16
|
var _layeredLink = _interopRequireDefault(require("./layered-link"));
|
|
19
|
-
var
|
|
17
|
+
var _hoverCardControl = _interopRequireDefault(require("./hover-card-control"));
|
|
20
18
|
var _utils = require("../../../../state/flexible-ui-context/utils");
|
|
21
19
|
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
22
20
|
/** @jsx jsx */
|
|
@@ -167,51 +165,24 @@ var Container = function Container(_ref3) {
|
|
|
167
165
|
theme = _ref3$theme === void 0 ? _constants.SmartLinkTheme.Link : _ref3$theme;
|
|
168
166
|
var context = (0, _react.useContext)(_flexibleUiContext.FlexibleUiContext);
|
|
169
167
|
var childrenOptions = getChildrenOptions(children, context);
|
|
170
|
-
var _useState = (0, _react.useState)(true),
|
|
171
|
-
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
172
|
-
hoverCardCanOpen = _useState2[0],
|
|
173
|
-
setHoverCardCanOpen = _useState2[1];
|
|
174
168
|
var canShowHoverPreview = showHoverPreview && status === 'resolved';
|
|
175
169
|
var canShowAuthTooltip = showAuthTooltip && status === 'unauthorized';
|
|
176
|
-
var
|
|
177
|
-
var _e$target$closest;
|
|
178
|
-
// Never show hover card on action or when action dropdown opens.
|
|
179
|
-
// The code below can be simplified by using :is() and :has()
|
|
180
|
-
// but the pseudo-class isn't support by Firefox yet.
|
|
181
|
-
var action =
|
|
182
|
-
// Any action button group (title/footer block)
|
|
183
|
-
e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
|
|
184
|
-
(_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
|
|
185
|
-
var canOpen = canShowAuthTooltip && !action ||
|
|
186
|
-
// EDM-7060: For hover preview, also hide hover card on all elements
|
|
187
|
-
// except title element (link title)
|
|
188
|
-
canShowHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(_constants.ElementName.Title, "\"])"));
|
|
189
|
-
if (hoverCardCanOpen !== canOpen) {
|
|
190
|
-
setHoverCardCanOpen(canOpen);
|
|
191
|
-
}
|
|
192
|
-
}, [canShowAuthTooltip, canShowHoverPreview, hoverCardCanOpen]);
|
|
193
|
-
var containerContent = (0, _react2.jsx)("div", (0, _extends2.default)({
|
|
170
|
+
var container = (0, _react2.jsx)("div", {
|
|
194
171
|
css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
|
|
195
172
|
"data-smart-link-container": true,
|
|
196
173
|
"data-testid": testId
|
|
197
|
-
},
|
|
198
|
-
onMouseOver: onMouseOver
|
|
199
|
-
} : undefined), clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
|
|
174
|
+
}, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
|
|
200
175
|
if (context !== null && context !== void 0 && context.url && (canShowHoverPreview || canShowAuthTooltip)) {
|
|
201
|
-
return (0, _react2.jsx)(
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
// remove the Boolean() conversion here.
|
|
210
|
-
,
|
|
211
|
-
showServerActions: Boolean(showServerActions)
|
|
212
|
-
}, containerContent);
|
|
176
|
+
return (0, _react2.jsx)(_hoverCardControl.default, {
|
|
177
|
+
hideHoverCardPreviewButton: hideHoverCardPreviewButton,
|
|
178
|
+
isHoverPreview: canShowHoverPreview,
|
|
179
|
+
isAuthTooltip: canShowAuthTooltip,
|
|
180
|
+
showServerActions: showServerActions,
|
|
181
|
+
testId: testId,
|
|
182
|
+
url: context.url
|
|
183
|
+
}, container);
|
|
213
184
|
}
|
|
214
|
-
return
|
|
185
|
+
return container;
|
|
215
186
|
};
|
|
216
187
|
var _default = Container;
|
|
217
188
|
exports.default = _default;
|
package/dist/es2019/version.json
CHANGED
|
@@ -35,7 +35,7 @@ function Component({
|
|
|
35
35
|
ui,
|
|
36
36
|
children,
|
|
37
37
|
showHoverPreview,
|
|
38
|
-
showAuthTooltip
|
|
38
|
+
showAuthTooltip,
|
|
39
39
|
analyticsEvents
|
|
40
40
|
}) {
|
|
41
41
|
const {
|
|
@@ -59,8 +59,6 @@ function Component({
|
|
|
59
59
|
const subproduct = getSubproduct(state.details);
|
|
60
60
|
const services = getServices(state.details);
|
|
61
61
|
let isFlexibleUi = useMemo(() => isFlexibleUiCard(children), [children]);
|
|
62
|
-
const showAuthTooltipFeatureFlagValue = useFeatureFlag('showAuthTooltip');
|
|
63
|
-
const showAuthTooltip = showAuthTooltipFeatureFlagValue !== undefined ? showAuthTooltipFeatureFlagValue === 'experiment' : showAuthTooltipProp;
|
|
64
62
|
const enableFlexibleBlockCardFlag = Boolean(useFeatureFlag('enableFlexibleBlockCard'));
|
|
65
63
|
const showServerActions = showServerActionsProp && platform !== 'mobile';
|
|
66
64
|
|
|
@@ -178,7 +176,7 @@ function Component({
|
|
|
178
176
|
renderers: renderers,
|
|
179
177
|
ui: ui,
|
|
180
178
|
showHoverPreview: showHoverPreview,
|
|
181
|
-
showAuthTooltip:
|
|
179
|
+
showAuthTooltip: showAuthTooltip,
|
|
182
180
|
showServerActions: showServerActions,
|
|
183
181
|
url: url,
|
|
184
182
|
testId: testId,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { HoverCard } from '../../../../HoverCard';
|
|
3
|
+
import { ElementName } from '../../../../../constants';
|
|
4
|
+
const FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
|
|
5
|
+
const HoverCardControl = ({
|
|
6
|
+
children,
|
|
7
|
+
hideHoverCardPreviewButton,
|
|
8
|
+
isHoverPreview,
|
|
9
|
+
isAuthTooltip,
|
|
10
|
+
showServerActions,
|
|
11
|
+
testId,
|
|
12
|
+
url
|
|
13
|
+
}) => {
|
|
14
|
+
const [canOpen, setCanOpen] = useState(true);
|
|
15
|
+
const mouseStopTimer = useRef();
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
return () => {
|
|
18
|
+
if (mouseStopTimer.current) {
|
|
19
|
+
clearTimeout(mouseStopTimer.current);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}, []);
|
|
23
|
+
const onMouseLeave = useCallback(() => {
|
|
24
|
+
if (mouseStopTimer.current) {
|
|
25
|
+
clearTimeout(mouseStopTimer.current);
|
|
26
|
+
}
|
|
27
|
+
}, []);
|
|
28
|
+
const onMouseMove = useCallback(e => {
|
|
29
|
+
var _e$target$closest;
|
|
30
|
+
if (mouseStopTimer.current) {
|
|
31
|
+
clearTimeout(mouseStopTimer.current);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Never show hover card on action or when action dropdown opens.
|
|
35
|
+
// The code below can be simplified by using :is() and :has()
|
|
36
|
+
// but the pseudo-class isn't support by Firefox yet.
|
|
37
|
+
const action =
|
|
38
|
+
// Any action button group (title/footer block)
|
|
39
|
+
e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
|
|
40
|
+
(_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
|
|
41
|
+
const canOpenOnElement = isAuthTooltip && !action ||
|
|
42
|
+
// EDM-7060: For hover preview, also hide hover card on all elements
|
|
43
|
+
// except title element (link title)
|
|
44
|
+
isHoverPreview && !action && !e.target.closest(`[data-smart-element]:not([data-smart-element="${ElementName.Title}"])`);
|
|
45
|
+
mouseStopTimer.current = setTimeout(() => {
|
|
46
|
+
if (canOpen !== canOpenOnElement) {
|
|
47
|
+
setCanOpen(Boolean(canOpenOnElement));
|
|
48
|
+
}
|
|
49
|
+
}, FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY);
|
|
50
|
+
}, [isAuthTooltip, isHoverPreview, canOpen]);
|
|
51
|
+
return /*#__PURE__*/React.createElement(HoverCard, {
|
|
52
|
+
allowEventPropagation: true,
|
|
53
|
+
canOpen: canOpen,
|
|
54
|
+
closeOnChildClick: true,
|
|
55
|
+
hidePreviewButton: hideHoverCardPreviewButton
|
|
56
|
+
// EDM-6709 extends the internal prop for showServerActions type to be
|
|
57
|
+
// an object. If we decide to use expose the type for hover preview
|
|
58
|
+
// remove the Boolean() conversion here.
|
|
59
|
+
,
|
|
60
|
+
showServerActions: Boolean(showServerActions),
|
|
61
|
+
url: url
|
|
62
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
63
|
+
onMouseLeave: onMouseLeave,
|
|
64
|
+
onMouseMove: onMouseMove,
|
|
65
|
+
"data-testid": `${testId}-hover-card-wrapper`
|
|
66
|
+
}, children));
|
|
67
|
+
};
|
|
68
|
+
export default HoverCardControl;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import _extends from "@babel/runtime/helpers/extends";
|
|
2
1
|
/** @jsx jsx */
|
|
3
|
-
import React, { useContext
|
|
2
|
+
import React, { useContext } from 'react';
|
|
4
3
|
import { css, jsx } from '@emotion/react';
|
|
5
|
-
import {
|
|
4
|
+
import { MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
|
|
6
5
|
import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock } from '../../../../utils/flexible';
|
|
7
6
|
import { tokens } from '../../../../utils/token';
|
|
8
7
|
import { FlexibleUiContext } from '../../../../state/flexible-ui-context';
|
|
9
8
|
import LayeredLink from './layered-link';
|
|
10
|
-
import
|
|
9
|
+
import HoverCardControl from './hover-card-control';
|
|
11
10
|
import { isFlexUiPreviewPresent } from '../../../../state/flexible-ui-context/utils';
|
|
12
11
|
const elevationStyles = css`
|
|
13
12
|
border: 1px solid transparent;
|
|
@@ -187,47 +186,23 @@ const Container = ({
|
|
|
187
186
|
}) => {
|
|
188
187
|
const context = useContext(FlexibleUiContext);
|
|
189
188
|
const childrenOptions = getChildrenOptions(children, context);
|
|
190
|
-
const [hoverCardCanOpen, setHoverCardCanOpen] = useState(true);
|
|
191
189
|
const canShowHoverPreview = showHoverPreview && status === 'resolved';
|
|
192
190
|
const canShowAuthTooltip = showAuthTooltip && status === 'unauthorized';
|
|
193
|
-
const
|
|
194
|
-
var _e$target$closest;
|
|
195
|
-
// Never show hover card on action or when action dropdown opens.
|
|
196
|
-
// The code below can be simplified by using :is() and :has()
|
|
197
|
-
// but the pseudo-class isn't support by Firefox yet.
|
|
198
|
-
const action =
|
|
199
|
-
// Any action button group (title/footer block)
|
|
200
|
-
e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
|
|
201
|
-
(_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
|
|
202
|
-
const canOpen = canShowAuthTooltip && !action ||
|
|
203
|
-
// EDM-7060: For hover preview, also hide hover card on all elements
|
|
204
|
-
// except title element (link title)
|
|
205
|
-
canShowHoverPreview && !action && !e.target.closest(`[data-smart-element]:not([data-smart-element="${ElementName.Title}"])`);
|
|
206
|
-
if (hoverCardCanOpen !== canOpen) {
|
|
207
|
-
setHoverCardCanOpen(canOpen);
|
|
208
|
-
}
|
|
209
|
-
}, [canShowAuthTooltip, canShowHoverPreview, hoverCardCanOpen]);
|
|
210
|
-
const containerContent = jsx("div", _extends({
|
|
191
|
+
const container = jsx("div", {
|
|
211
192
|
css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
|
|
212
193
|
"data-smart-link-container": true,
|
|
213
194
|
"data-testid": testId
|
|
214
|
-
},
|
|
215
|
-
onMouseOver
|
|
216
|
-
} : undefined), 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));
|
|
217
196
|
if (context !== null && context !== void 0 && context.url && (canShowHoverPreview || canShowAuthTooltip)) {
|
|
218
|
-
return jsx(
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
// remove the Boolean() conversion here.
|
|
227
|
-
,
|
|
228
|
-
showServerActions: Boolean(showServerActions)
|
|
229
|
-
}, containerContent);
|
|
197
|
+
return jsx(HoverCardControl, {
|
|
198
|
+
hideHoverCardPreviewButton: hideHoverCardPreviewButton,
|
|
199
|
+
isHoverPreview: canShowHoverPreview,
|
|
200
|
+
isAuthTooltip: canShowAuthTooltip,
|
|
201
|
+
showServerActions: showServerActions,
|
|
202
|
+
testId: testId,
|
|
203
|
+
url: context.url
|
|
204
|
+
}, container);
|
|
230
205
|
}
|
|
231
|
-
return
|
|
206
|
+
return container;
|
|
232
207
|
};
|
|
233
208
|
export default Container;
|
package/dist/esm/version.json
CHANGED
|
@@ -35,7 +35,7 @@ function Component(_ref) {
|
|
|
35
35
|
ui = _ref.ui,
|
|
36
36
|
children = _ref.children,
|
|
37
37
|
showHoverPreview = _ref.showHoverPreview,
|
|
38
|
-
|
|
38
|
+
showAuthTooltip = _ref.showAuthTooltip,
|
|
39
39
|
analyticsEvents = _ref.analyticsEvents;
|
|
40
40
|
var _useAnalyticsEvents = useAnalyticsEvents(),
|
|
41
41
|
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
@@ -58,8 +58,6 @@ function Component(_ref) {
|
|
|
58
58
|
var isFlexibleUi = useMemo(function () {
|
|
59
59
|
return isFlexibleUiCard(children);
|
|
60
60
|
}, [children]);
|
|
61
|
-
var showAuthTooltipFeatureFlagValue = useFeatureFlag('showAuthTooltip');
|
|
62
|
-
var showAuthTooltip = showAuthTooltipFeatureFlagValue !== undefined ? showAuthTooltipFeatureFlagValue === 'experiment' : showAuthTooltipProp;
|
|
63
61
|
var enableFlexibleBlockCardFlag = Boolean(useFeatureFlag('enableFlexibleBlockCard'));
|
|
64
62
|
var showServerActions = showServerActionsProp && platform !== 'mobile';
|
|
65
63
|
|
|
@@ -181,7 +179,7 @@ function Component(_ref) {
|
|
|
181
179
|
renderers: renderers,
|
|
182
180
|
ui: ui,
|
|
183
181
|
showHoverPreview: showHoverPreview,
|
|
184
|
-
showAuthTooltip:
|
|
182
|
+
showAuthTooltip: showAuthTooltip,
|
|
185
183
|
showServerActions: showServerActions,
|
|
186
184
|
url: url,
|
|
187
185
|
testId: testId,
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { HoverCard } from '../../../../HoverCard';
|
|
4
|
+
import { ElementName } from '../../../../../constants';
|
|
5
|
+
var FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
|
|
6
|
+
var HoverCardControl = function HoverCardControl(_ref) {
|
|
7
|
+
var children = _ref.children,
|
|
8
|
+
hideHoverCardPreviewButton = _ref.hideHoverCardPreviewButton,
|
|
9
|
+
isHoverPreview = _ref.isHoverPreview,
|
|
10
|
+
isAuthTooltip = _ref.isAuthTooltip,
|
|
11
|
+
showServerActions = _ref.showServerActions,
|
|
12
|
+
testId = _ref.testId,
|
|
13
|
+
url = _ref.url;
|
|
14
|
+
var _useState = useState(true),
|
|
15
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
16
|
+
canOpen = _useState2[0],
|
|
17
|
+
setCanOpen = _useState2[1];
|
|
18
|
+
var mouseStopTimer = useRef();
|
|
19
|
+
useEffect(function () {
|
|
20
|
+
return function () {
|
|
21
|
+
if (mouseStopTimer.current) {
|
|
22
|
+
clearTimeout(mouseStopTimer.current);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}, []);
|
|
26
|
+
var onMouseLeave = useCallback(function () {
|
|
27
|
+
if (mouseStopTimer.current) {
|
|
28
|
+
clearTimeout(mouseStopTimer.current);
|
|
29
|
+
}
|
|
30
|
+
}, []);
|
|
31
|
+
var onMouseMove = useCallback(function (e) {
|
|
32
|
+
var _e$target$closest;
|
|
33
|
+
if (mouseStopTimer.current) {
|
|
34
|
+
clearTimeout(mouseStopTimer.current);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Never show hover card on action or when action dropdown opens.
|
|
38
|
+
// The code below can be simplified by using :is() and :has()
|
|
39
|
+
// but the pseudo-class isn't support by Firefox yet.
|
|
40
|
+
var action =
|
|
41
|
+
// Any action button group (title/footer block)
|
|
42
|
+
e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
|
|
43
|
+
(_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
|
|
44
|
+
var canOpenOnElement = isAuthTooltip && !action ||
|
|
45
|
+
// EDM-7060: For hover preview, also hide hover card on all elements
|
|
46
|
+
// except title element (link title)
|
|
47
|
+
isHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(ElementName.Title, "\"])"));
|
|
48
|
+
mouseStopTimer.current = setTimeout(function () {
|
|
49
|
+
if (canOpen !== canOpenOnElement) {
|
|
50
|
+
setCanOpen(Boolean(canOpenOnElement));
|
|
51
|
+
}
|
|
52
|
+
}, FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY);
|
|
53
|
+
}, [isAuthTooltip, isHoverPreview, canOpen]);
|
|
54
|
+
return /*#__PURE__*/React.createElement(HoverCard, {
|
|
55
|
+
allowEventPropagation: true,
|
|
56
|
+
canOpen: canOpen,
|
|
57
|
+
closeOnChildClick: true,
|
|
58
|
+
hidePreviewButton: hideHoverCardPreviewButton
|
|
59
|
+
// EDM-6709 extends the internal prop for showServerActions type to be
|
|
60
|
+
// an object. If we decide to use expose the type for hover preview
|
|
61
|
+
// remove the Boolean() conversion here.
|
|
62
|
+
,
|
|
63
|
+
showServerActions: Boolean(showServerActions),
|
|
64
|
+
url: url
|
|
65
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
66
|
+
onMouseLeave: onMouseLeave,
|
|
67
|
+
onMouseMove: onMouseMove,
|
|
68
|
+
"data-testid": "".concat(testId, "-hover-card-wrapper")
|
|
69
|
+
}, children));
|
|
70
|
+
};
|
|
71
|
+
export default HoverCardControl;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
4
2
|
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
5
3
|
/** @jsx jsx */
|
|
6
|
-
import React, { useContext
|
|
4
|
+
import React, { useContext } from 'react';
|
|
7
5
|
import { css, jsx } from '@emotion/react';
|
|
8
|
-
import {
|
|
6
|
+
import { MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
|
|
9
7
|
import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock } from '../../../../utils/flexible';
|
|
10
8
|
import { tokens } from '../../../../utils/token';
|
|
11
9
|
import { FlexibleUiContext } from '../../../../state/flexible-ui-context';
|
|
12
10
|
import LayeredLink from './layered-link';
|
|
13
|
-
import
|
|
11
|
+
import HoverCardControl from './hover-card-control';
|
|
14
12
|
import { isFlexUiPreviewPresent } from '../../../../state/flexible-ui-context/utils';
|
|
15
13
|
var elevationStyles = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n border: 1px solid transparent;\n border-radius: 1.5px;\n box-shadow: ", ";\n margin: ", ";\n"])), tokens.elevation, "var(--ds-space-025, 2px)");
|
|
16
14
|
var getGap = function getGap(size) {
|
|
@@ -156,50 +154,23 @@ var Container = function Container(_ref3) {
|
|
|
156
154
|
theme = _ref3$theme === void 0 ? SmartLinkTheme.Link : _ref3$theme;
|
|
157
155
|
var context = useContext(FlexibleUiContext);
|
|
158
156
|
var childrenOptions = getChildrenOptions(children, context);
|
|
159
|
-
var _useState = useState(true),
|
|
160
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
161
|
-
hoverCardCanOpen = _useState2[0],
|
|
162
|
-
setHoverCardCanOpen = _useState2[1];
|
|
163
157
|
var canShowHoverPreview = showHoverPreview && status === 'resolved';
|
|
164
158
|
var canShowAuthTooltip = showAuthTooltip && status === 'unauthorized';
|
|
165
|
-
var
|
|
166
|
-
var _e$target$closest;
|
|
167
|
-
// Never show hover card on action or when action dropdown opens.
|
|
168
|
-
// The code below can be simplified by using :is() and :has()
|
|
169
|
-
// but the pseudo-class isn't support by Firefox yet.
|
|
170
|
-
var action =
|
|
171
|
-
// Any action button group (title/footer block)
|
|
172
|
-
e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
|
|
173
|
-
(_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
|
|
174
|
-
var canOpen = canShowAuthTooltip && !action ||
|
|
175
|
-
// EDM-7060: For hover preview, also hide hover card on all elements
|
|
176
|
-
// except title element (link title)
|
|
177
|
-
canShowHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(ElementName.Title, "\"])"));
|
|
178
|
-
if (hoverCardCanOpen !== canOpen) {
|
|
179
|
-
setHoverCardCanOpen(canOpen);
|
|
180
|
-
}
|
|
181
|
-
}, [canShowAuthTooltip, canShowHoverPreview, hoverCardCanOpen]);
|
|
182
|
-
var containerContent = jsx("div", _extends({
|
|
159
|
+
var container = jsx("div", {
|
|
183
160
|
css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
|
|
184
161
|
"data-smart-link-container": true,
|
|
185
162
|
"data-testid": testId
|
|
186
|
-
},
|
|
187
|
-
onMouseOver: onMouseOver
|
|
188
|
-
} : undefined), clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
|
|
163
|
+
}, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
|
|
189
164
|
if (context !== null && context !== void 0 && context.url && (canShowHoverPreview || canShowAuthTooltip)) {
|
|
190
|
-
return jsx(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
// remove the Boolean() conversion here.
|
|
199
|
-
,
|
|
200
|
-
showServerActions: Boolean(showServerActions)
|
|
201
|
-
}, containerContent);
|
|
165
|
+
return jsx(HoverCardControl, {
|
|
166
|
+
hideHoverCardPreviewButton: hideHoverCardPreviewButton,
|
|
167
|
+
isHoverPreview: canShowHoverPreview,
|
|
168
|
+
isAuthTooltip: canShowAuthTooltip,
|
|
169
|
+
showServerActions: showServerActions,
|
|
170
|
+
testId: testId,
|
|
171
|
+
url: context.url
|
|
172
|
+
}, container);
|
|
202
173
|
}
|
|
203
|
-
return
|
|
174
|
+
return container;
|
|
204
175
|
};
|
|
205
176
|
export default Container;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/smart-card",
|
|
3
|
-
"version": "26.9.
|
|
3
|
+
"version": "26.9.6",
|
|
4
4
|
"description": "Smart card component",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -12,14 +12,6 @@
|
|
|
12
12
|
"module": "dist/esm/index.js",
|
|
13
13
|
"module:es2019": "dist/es2019/index.js",
|
|
14
14
|
"types": "dist/types/index.d.ts",
|
|
15
|
-
"typesVersions": {
|
|
16
|
-
">=4.5 <4.9": {
|
|
17
|
-
"*": [
|
|
18
|
-
"dist/types-ts4.5/*",
|
|
19
|
-
"dist/types-ts4.5/index.d.ts"
|
|
20
|
-
]
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
15
|
"sideEffects": false,
|
|
24
16
|
"atlaskit:src": "src/index.ts",
|
|
25
17
|
"atlassian": {
|
|
@@ -45,7 +37,7 @@
|
|
|
45
37
|
"@atlaskit/link-analytics": "^8.2.0",
|
|
46
38
|
"@atlaskit/link-client-extension": "^1.5.0",
|
|
47
39
|
"@atlaskit/link-extractors": "^1.1.0",
|
|
48
|
-
"@atlaskit/linking-common": "^3.
|
|
40
|
+
"@atlaskit/linking-common": "^3.4.0",
|
|
49
41
|
"@atlaskit/linking-types": "^8.1.0",
|
|
50
42
|
"@atlaskit/logo": "^13.14.0",
|
|
51
43
|
"@atlaskit/lozenge": "^11.4.0",
|
|
@@ -79,6 +71,7 @@
|
|
|
79
71
|
"react-intl-next": "npm:react-intl@^5.18.1"
|
|
80
72
|
},
|
|
81
73
|
"devDependencies": {
|
|
74
|
+
"@af/visual-regression": "*",
|
|
82
75
|
"@atlaskit/avatar": "^21.3.0",
|
|
83
76
|
"@atlaskit/css-reset": "^6.5.0",
|
|
84
77
|
"@atlaskit/link-test-helpers": "^4.1.0",
|
|
@@ -114,6 +107,22 @@
|
|
|
114
107
|
"typescript": "~4.9.5",
|
|
115
108
|
"xhr-mock": "^2.4.0"
|
|
116
109
|
},
|
|
110
|
+
"techstack": {
|
|
111
|
+
"@repo/internal": {
|
|
112
|
+
"design-tokens": [
|
|
113
|
+
"color",
|
|
114
|
+
"spacing"
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"typesVersions": {
|
|
119
|
+
">=4.5 <4.9": {
|
|
120
|
+
"*": [
|
|
121
|
+
"dist/types-ts4.5/*",
|
|
122
|
+
"dist/types-ts4.5/index.d.ts"
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
},
|
|
117
126
|
"af:exports": {
|
|
118
127
|
"./ssr": "./src/ssr.tsx",
|
|
119
128
|
"./in-product": "./src/in-product.ts",
|
|
@@ -135,13 +144,5 @@
|
|
|
135
144
|
"type": "boolean"
|
|
136
145
|
}
|
|
137
146
|
},
|
|
138
|
-
"prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1"
|
|
139
|
-
"techstack": {
|
|
140
|
-
"@repo/internal": {
|
|
141
|
-
"design-tokens": [
|
|
142
|
-
"color",
|
|
143
|
-
"spacing"
|
|
144
|
-
]
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
+
"prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1"
|
|
147
148
|
}
|