@atlaskit/smart-card 18.0.19 → 18.0.22

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 (30) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/extractors/hover/extractMetadata.js +31 -0
  3. package/dist/cjs/providers/editor/transformer.js +0 -6
  4. package/dist/cjs/utils/flexible.js +1 -1
  5. package/dist/cjs/version.json +1 -1
  6. package/dist/cjs/view/FlexibleCard/components/elements/link/index.js +13 -4
  7. package/dist/cjs/view/FlexibleCard/components/utils.js +10 -3
  8. package/dist/cjs/view/HoverCard/index.js +11 -2
  9. package/dist/cjs/view/HoverCard/utils.js +36 -0
  10. package/dist/es2019/extractors/hover/extractMetadata.js +18 -0
  11. package/dist/es2019/providers/editor/transformer.js +0 -4
  12. package/dist/es2019/utils/flexible.js +1 -1
  13. package/dist/es2019/version.json +1 -1
  14. package/dist/es2019/view/FlexibleCard/components/elements/link/index.js +21 -18
  15. package/dist/es2019/view/FlexibleCard/components/utils.js +6 -3
  16. package/dist/es2019/view/HoverCard/index.js +27 -18
  17. package/dist/es2019/view/HoverCard/utils.js +27 -0
  18. package/dist/esm/extractors/hover/extractMetadata.js +22 -0
  19. package/dist/esm/providers/editor/transformer.js +0 -6
  20. package/dist/esm/utils/flexible.js +1 -1
  21. package/dist/esm/version.json +1 -1
  22. package/dist/esm/view/FlexibleCard/components/elements/link/index.js +8 -5
  23. package/dist/esm/view/FlexibleCard/components/utils.js +5 -1
  24. package/dist/esm/view/HoverCard/index.js +10 -3
  25. package/dist/esm/view/HoverCard/utils.js +27 -0
  26. package/dist/types/extractors/hover/extractMetadata.d.ts +3 -0
  27. package/dist/types/view/FlexibleCard/components/utils.d.ts +2 -1
  28. package/dist/types/view/HoverCard/types.d.ts +5 -0
  29. package/dist/types/view/HoverCard/utils.d.ts +2 -0
  30. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 18.0.22
4
+
5
+ ### Patch Changes
6
+
7
+ - [`8b9f08cbc1c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8b9f08cbc1c) - [ux] Default representation for Slack links was changed from 'block' to 'inline'
8
+ - [`f4811ca8c6a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f4811ca8c6a) - add provider based metadata to hover previews
9
+
10
+ ## 18.0.21
11
+
12
+ ### Patch Changes
13
+
14
+ - [`ffaf122189e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ffaf122189e) - Flexible UI: TitleBlock is now composory to display Flexible UI on Smart Links
15
+
16
+ ## 18.0.20
17
+
18
+ ### Patch Changes
19
+
20
+ - [`451f99db28a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/451f99db28a) - Flexible UI: Improve link title truncate to support url string
21
+
3
22
  ## 18.0.19
4
23
 
5
24
  ### Patch Changes
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractMetadata = void 0;
7
+
8
+ var _constants = require("../../constants");
9
+
10
+ var elementNamesToItems = function elementNamesToItems(elementNames) {
11
+ return elementNames.filter(function (element) {
12
+ return element in _constants.ElementName;
13
+ }).map(function (elementName) {
14
+ return {
15
+ name: elementName,
16
+ testId: "".concat(elementName.toLowerCase(), "-metadata-element")
17
+ };
18
+ });
19
+ };
20
+
21
+ var extractMetadata = function extractMetadata(jsonLd) {
22
+ var _jsonLd$metadata, _metadata$primary, _metadata$secondary;
23
+
24
+ var metadata = (_jsonLd$metadata = jsonLd.metadata) !== null && _jsonLd$metadata !== void 0 ? _jsonLd$metadata : [];
25
+ return {
26
+ primary: elementNamesToItems((_metadata$primary = metadata.primary) !== null && _metadata$primary !== void 0 ? _metadata$primary : []),
27
+ secondary: elementNamesToItems((_metadata$secondary = metadata.secondary) !== null && _metadata$secondary !== void 0 ? _metadata$secondary : [])
28
+ };
29
+ };
30
+
31
+ exports.extractMetadata = extractMetadata;
@@ -23,10 +23,6 @@ var isJwmView = function isJwmView(url) {
23
23
  return url.match(/^https:\/\/.*?\/jira\/core\/projects\/[^\/]+?\/(timeline|calendar|list|board)\/?/);
24
24
  };
25
25
 
26
- var isSlackMessage = function isSlackMessage(url) {
27
- return url.match(/^https:\/\/.+?\.slack\.com\/archives\/[CG][A-Z0-9]+\/p[0-9]+(\?.*)?$/);
28
- };
29
-
30
26
  var Transformer = /*#__PURE__*/function () {
31
27
  function Transformer() {
32
28
  (0, _classCallCheck2.default)(this, Transformer);
@@ -68,8 +64,6 @@ var Transformer = /*#__PURE__*/function () {
68
64
  value: function toAdf(url, appearance) {
69
65
  if (isJiraRoadMap(url) || isPolarisView(url) || isJwmView(url)) {
70
66
  return this.buildEmbedAdf(url);
71
- } else if (isSlackMessage(url)) {
72
- return this.buildBlockAdf(url);
73
67
  } else {
74
68
  switch (appearance) {
75
69
  case 'inline':
@@ -21,7 +21,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
21
21
 
22
22
  var isFlexibleUiCard = function isFlexibleUiCard(children) {
23
23
  if (children && _react.default.Children.toArray(children).some(function (child) {
24
- return isFlexibleUiBlock(child);
24
+ return isFlexibleUiTitleBlock(child);
25
25
  })) {
26
26
  return true;
27
27
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "18.0.19",
3
+ "version": "18.0.22",
4
4
  "sideEffects": false
5
5
  }
@@ -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
  });
@@ -9,7 +11,7 @@ exports.default = void 0;
9
11
 
10
12
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
13
 
12
- var _react = _interopRequireDefault(require("react"));
14
+ var _react = _interopRequireWildcard(require("react"));
13
15
 
14
16
  var _core = require("@emotion/core");
15
17
 
@@ -23,6 +25,10 @@ var _token = require("../../../../../utils/token");
23
25
 
24
26
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
25
27
 
28
+ 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); }
29
+
30
+ 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; }
31
+
26
32
  var DEFAULT_MAX_LINES = 2;
27
33
  var MAXIMUM_MAX_LINES = 2;
28
34
  var MINIMUM_MAX_LINES = 1;
@@ -40,9 +46,9 @@ var getThemeStyles = function getThemeStyles(theme) {
40
46
  }
41
47
  };
42
48
 
43
- var getAnchorStyles = function getAnchorStyles(size, theme, maxLines) {
49
+ var getAnchorStyles = function getAnchorStyles(size, theme, maxLines, hasSpace) {
44
50
  var sizeStyles = (0, _utils.getLinkSizeStyles)(size);
45
- return (0, _core.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n flex: 1 1 auto;\n ", "\n ", "\n // Theme should be last to be spread because it contains override values\n ", "\n "])), sizeStyles, (0, _utils.getTruncateStyles)(maxLines, (0, _utils.getLinkLineHeight)(size)), getThemeStyles(theme));
51
+ return (0, _core.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n flex: 1 1 auto;\n ", "\n ", "\n // Theme should be last to be spread because it contains override values\n ", "\n "])), sizeStyles, (0, _utils.getTruncateStyles)(maxLines, (0, _utils.getLinkLineHeight)(size), hasSpace ? 'break-word' : 'break-all'), getThemeStyles(theme));
46
52
  };
47
53
 
48
54
  var getMaxLines = function getMaxLines(maxLines) {
@@ -78,6 +84,9 @@ var Link = function Link(_ref) {
78
84
  url = _ref.url,
79
85
  onClick = _ref.onClick,
80
86
  target = _ref.target;
87
+ var hasSpace = (0, _react.useMemo)(function () {
88
+ return text ? (0, _utils.hasWhiteSpace)(text) : false;
89
+ }, [text]);
81
90
  return (0, _core.jsx)("span", {
82
91
  css: containerStyles
83
92
  }, (0, _core.jsx)(_tooltip.default, {
@@ -85,7 +94,7 @@ var Link = function Link(_ref) {
85
94
  testId: "".concat(testId, "-tooltip"),
86
95
  tag: "span"
87
96
  }, (0, _core.jsx)("a", {
88
- css: [getAnchorStyles(size, theme, getMaxLines(maxLines)), overrideCss],
97
+ css: [getAnchorStyles(size, theme, getMaxLines(maxLines), hasSpace), overrideCss],
89
98
  "data-smart-element-link": true,
90
99
  "data-testid": testId,
91
100
  onClick: onClick,
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getTruncateStyles = exports.getMaxLines = exports.getLinkSizeStyles = exports.getLinkLineHeight = exports.getIconWidth = exports.getIconSizeStyles = exports.getFormattedMessage = void 0;
8
+ exports.hasWhiteSpace = exports.getTruncateStyles = exports.getMaxLines = exports.getLinkSizeStyles = exports.getLinkLineHeight = exports.getIconWidth = exports.getIconSizeStyles = exports.getFormattedMessage = void 0;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
@@ -111,7 +111,14 @@ exports.getMaxLines = getMaxLines;
111
111
 
112
112
  var getTruncateStyles = function getTruncateStyles(maxLines) {
113
113
  var lineHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '1rem';
114
- return (0, _core.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n -webkit-line-clamp: ", ";\n -webkit-box-orient: vertical;\n // Fallback options\n max-height: calc(", " * ", ");\n "])), maxLines, maxLines, lineHeight);
114
+ var wordBreak = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'break-word';
115
+ return (0, _core.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: ", ";\n -webkit-line-clamp: ", ";\n -webkit-box-orient: vertical;\n // Fallback options\n max-height: calc(", " * ", ");\n "])), wordBreak, maxLines, maxLines, lineHeight);
115
116
  };
116
117
 
117
- exports.getTruncateStyles = getTruncateStyles;
118
+ exports.getTruncateStyles = getTruncateStyles;
119
+
120
+ var hasWhiteSpace = function hasWhiteSpace(str) {
121
+ return str.search(/\s/) >= 0;
122
+ };
123
+
124
+ exports.hasWhiteSpace = hasWhiteSpace;
@@ -41,6 +41,10 @@ var _analytics2 = require("../../state/analytics");
41
41
 
42
42
  var _helpers = require("../../state/helpers");
43
43
 
44
+ var _extractMetadata = require("../../extractors/hover/extractMetadata");
45
+
46
+ var _utils = require("./utils");
47
+
44
48
  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); }
45
49
 
46
50
  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; }
@@ -134,7 +138,9 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
134
138
  };
135
139
  }, [url, definitionId, extensionKey, analytics]);
136
140
 
137
- var cardComponent = function cardComponent() {
141
+ var CardComponent = function CardComponent() {
142
+ //TODO: EDM-3224 deleted simulated and use real JsonLd
143
+ var metadataElements = (0, _extractMetadata.extractMetadata)((0, _utils.getSimulatedMetadata)(extensionKey));
138
144
  return (0, _core.jsx)("div", {
139
145
  onMouseEnter: initShowCard,
140
146
  onMouseLeave: initHideCard,
@@ -148,6 +154,9 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
148
154
  }
149
155
  }, (0, _core.jsx)(_blocks.TitleBlock, {
150
156
  actions: [openAction]
157
+ }), (0, _core.jsx)(_blocks.MetadataBlock, {
158
+ primary: metadataElements.primary,
159
+ secondary: metadataElements.secondary
151
160
  }), (0, _core.jsx)(_blocks.SnippetBlock, null), (0, _core.jsx)(_blocks.FooterBlock, {
152
161
  actions: smartlinkActions
153
162
  })));
@@ -161,7 +170,7 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
161
170
  isOpen: isOpen,
162
171
  onClose: onClose,
163
172
  placement: "bottom-start",
164
- content: cardComponent,
173
+ content: CardComponent,
165
174
  trigger: function trigger(triggerProps) {
166
175
  return (0, _core.jsx)("span", (0, _extends2.default)({}, triggerProps, {
167
176
  onMouseEnter: initShowCard,
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getSimulatedMetadata = void 0;
7
+
8
+ var getSimulatedMetadata = function getSimulatedMetadata(extensionKey) {
9
+ switch (extensionKey) {
10
+ case 'confluence-object-provider':
11
+ return {
12
+ metadata: {
13
+ primary: ['AuthorGroup', 'CreatedBy', 'CommentCount', 'ReactCount'],
14
+ secondary: []
15
+ }
16
+ };
17
+
18
+ case 'jira-object-provider':
19
+ return {
20
+ metadata: {
21
+ primary: ['AuthorGroup', 'State', 'Priority'],
22
+ secondary: []
23
+ }
24
+ };
25
+
26
+ default:
27
+ return {
28
+ metadata: {
29
+ primary: ['ModifiedOn'],
30
+ secondary: []
31
+ }
32
+ };
33
+ }
34
+ };
35
+
36
+ exports.getSimulatedMetadata = getSimulatedMetadata;
@@ -0,0 +1,18 @@
1
+ import { ElementName } from '../../constants';
2
+
3
+ const elementNamesToItems = elementNames => {
4
+ return elementNames.filter(element => element in ElementName).map(elementName => ({
5
+ name: elementName,
6
+ testId: `${elementName.toLowerCase()}-metadata-element`
7
+ }));
8
+ };
9
+
10
+ export const extractMetadata = jsonLd => {
11
+ var _jsonLd$metadata, _metadata$primary, _metadata$secondary;
12
+
13
+ const metadata = (_jsonLd$metadata = jsonLd.metadata) !== null && _jsonLd$metadata !== void 0 ? _jsonLd$metadata : [];
14
+ return {
15
+ primary: elementNamesToItems((_metadata$primary = metadata.primary) !== null && _metadata$primary !== void 0 ? _metadata$primary : []),
16
+ secondary: elementNamesToItems((_metadata$secondary = metadata.secondary) !== null && _metadata$secondary !== void 0 ? _metadata$secondary : [])
17
+ };
18
+ };
@@ -4,8 +4,6 @@ const isPolarisView = url => url.match(/^https:\/\/.*?\/jira\/polaris\/projects\
4
4
 
5
5
  const isJwmView = url => url.match(/^https:\/\/.*?\/jira\/core\/projects\/[^\/]+?\/(timeline|calendar|list|board)\/?/);
6
6
 
7
- const isSlackMessage = url => url.match(/^https:\/\/.+?\.slack\.com\/archives\/[CG][A-Z0-9]+\/p[0-9]+(\?.*)?$/);
8
-
9
7
  export class Transformer {
10
8
  buildInlineAdf(url) {
11
9
  return {
@@ -38,8 +36,6 @@ export class Transformer {
38
36
  toAdf(url, appearance) {
39
37
  if (isJiraRoadMap(url) || isPolarisView(url) || isJwmView(url)) {
40
38
  return this.buildEmbedAdf(url);
41
- } else if (isSlackMessage(url)) {
42
- return this.buildBlockAdf(url);
43
39
  } else {
44
40
  switch (appearance) {
45
41
  case 'inline':
@@ -3,7 +3,7 @@ import * as Blocks from '../view/FlexibleCard/components/blocks';
3
3
  import { TitleBlock } from '../view/FlexibleCard/components/blocks';
4
4
  import * as Elements from '../view/FlexibleCard/components/elements';
5
5
  export const isFlexibleUiCard = children => {
6
- if (children && React.Children.toArray(children).some(child => isFlexibleUiBlock(child))) {
6
+ if (children && React.Children.toArray(children).some(child => isFlexibleUiTitleBlock(child))) {
7
7
  return true;
8
8
  }
9
9
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "18.0.19",
3
+ "version": "18.0.22",
4
4
  "sideEffects": false
5
5
  }
@@ -1,9 +1,9 @@
1
1
  /** @jsx jsx */
2
- import React from 'react';
2
+ import React, { useMemo } from 'react';
3
3
  import { css, jsx } from '@emotion/core';
4
4
  import Tooltip from '@atlaskit/tooltip';
5
5
  import { SmartLinkSize, SmartLinkTheme } from '../../../../../constants';
6
- import { getLinkLineHeight, getLinkSizeStyles, getTruncateStyles } from '../../utils';
6
+ import { getLinkLineHeight, getLinkSizeStyles, getTruncateStyles, hasWhiteSpace } from '../../utils';
7
7
  import { tokens } from '../../../../../utils/token';
8
8
  const DEFAULT_MAX_LINES = 2;
9
9
  const MAXIMUM_MAX_LINES = 2;
@@ -42,12 +42,12 @@ const getThemeStyles = theme => {
42
42
  }
43
43
  };
44
44
 
45
- const getAnchorStyles = (size, theme, maxLines) => {
45
+ const getAnchorStyles = (size, theme, maxLines, hasSpace) => {
46
46
  const sizeStyles = getLinkSizeStyles(size);
47
47
  return css`
48
48
  flex: 1 1 auto;
49
49
  ${sizeStyles}
50
- ${getTruncateStyles(maxLines, getLinkLineHeight(size))}
50
+ ${getTruncateStyles(maxLines, getLinkLineHeight(size), hasSpace ? 'break-word' : 'break-all')}
51
51
  // Theme should be last to be spread because it contains override values
52
52
  ${getThemeStyles(theme)}
53
53
  `;
@@ -82,19 +82,22 @@ const Link = ({
82
82
  url,
83
83
  onClick,
84
84
  target
85
- }) => jsx("span", {
86
- css: containerStyles
87
- }, jsx(Tooltip, {
88
- content: text,
89
- testId: `${testId}-tooltip`,
90
- tag: "span"
91
- }, jsx("a", {
92
- css: [getAnchorStyles(size, theme, getMaxLines(maxLines)), overrideCss],
93
- "data-smart-element-link": true,
94
- "data-testid": testId,
95
- onClick: onClick,
96
- href: url,
97
- target: target || '_blank'
98
- }, text)));
85
+ }) => {
86
+ const hasSpace = useMemo(() => text ? hasWhiteSpace(text) : false, [text]);
87
+ return jsx("span", {
88
+ css: containerStyles
89
+ }, jsx(Tooltip, {
90
+ content: text,
91
+ testId: `${testId}-tooltip`,
92
+ tag: "span"
93
+ }, jsx("a", {
94
+ css: [getAnchorStyles(size, theme, getMaxLines(maxLines), hasSpace), overrideCss],
95
+ "data-smart-element-link": true,
96
+ "data-testid": testId,
97
+ onClick: onClick,
98
+ href: url,
99
+ target: target || '_blank'
100
+ }, text)));
101
+ };
99
102
 
100
103
  export default Link;
@@ -107,13 +107,16 @@ export const getMaxLines = (value, defaultValue, max, min) => {
107
107
 
108
108
  return value;
109
109
  };
110
- export const getTruncateStyles = (maxLines, lineHeight = '1rem') => css`
110
+ export const getTruncateStyles = (maxLines, lineHeight = '1rem', wordBreak = 'break-word') => css`
111
111
  display: -webkit-box;
112
112
  overflow: hidden;
113
113
  text-overflow: ellipsis;
114
- word-break: break-word;
114
+ word-break: ${wordBreak};
115
115
  -webkit-line-clamp: ${maxLines};
116
116
  -webkit-box-orient: vertical;
117
117
  // Fallback options
118
118
  max-height: calc(${maxLines} * ${lineHeight});
119
- `;
119
+ `;
120
+ export const hasWhiteSpace = str => {
121
+ return str.search(/\s/) >= 0;
122
+ };
@@ -3,7 +3,7 @@ import _extends from "@babel/runtime/helpers/extends";
3
3
  /** @jsx jsx */
4
4
  import { jsx } from '@emotion/core';
5
5
  import React, { useCallback, useRef, useMemo } from 'react';
6
- import { TitleBlock, SnippetBlock, FooterBlock } from '../FlexibleCard/components/blocks';
6
+ import { TitleBlock, SnippetBlock, FooterBlock, MetadataBlock } from '../FlexibleCard/components/blocks';
7
7
  import { Card } from '../Card';
8
8
  import Popup from '@atlaskit/popup';
9
9
  import { SmartLinkSize, ActionName } from '../../constants';
@@ -15,6 +15,8 @@ import { fireSmartLinkEvent } from '../../utils/analytics';
15
15
  import { useSmartCardState as useLinkState } from '../../state/store';
16
16
  import { useSmartLinkAnalytics } from '../../state/analytics';
17
17
  import { getExtensionKey, getDefinitionId } from '../../state/helpers';
18
+ import { extractMetadata } from '../../extractors/hover/extractMetadata';
19
+ import { getSimulatedMetadata } from './utils';
18
20
  export const HoverCardComponent = ({
19
21
  children,
20
22
  url,
@@ -89,22 +91,29 @@ export const HoverCardComponent = ({
89
91
  };
90
92
  }, [url, definitionId, extensionKey, analytics]);
91
93
 
92
- const cardComponent = () => jsx("div", {
93
- onMouseEnter: initShowCard,
94
- onMouseLeave: initHideCard,
95
- css: HoverCardContainer
96
- }, jsx(Card, {
97
- appearance: "block",
98
- url: url,
99
- ui: {
100
- hideElevation: true,
101
- size: SmartLinkSize.Large
102
- }
103
- }, jsx(TitleBlock, {
104
- actions: [openAction]
105
- }), jsx(SnippetBlock, null), jsx(FooterBlock, {
106
- actions: smartlinkActions
107
- })));
94
+ const CardComponent = () => {
95
+ //TODO: EDM-3224 deleted simulated and use real JsonLd
96
+ const metadataElements = extractMetadata(getSimulatedMetadata(extensionKey));
97
+ return jsx("div", {
98
+ onMouseEnter: initShowCard,
99
+ onMouseLeave: initHideCard,
100
+ css: HoverCardContainer
101
+ }, jsx(Card, {
102
+ appearance: "block",
103
+ url: url,
104
+ ui: {
105
+ hideElevation: true,
106
+ size: SmartLinkSize.Large
107
+ }
108
+ }, jsx(TitleBlock, {
109
+ actions: [openAction]
110
+ }), jsx(MetadataBlock, {
111
+ primary: metadataElements.primary,
112
+ secondary: metadataElements.secondary
113
+ }), jsx(SnippetBlock, null), jsx(FooterBlock, {
114
+ actions: smartlinkActions
115
+ })));
116
+ };
108
117
 
109
118
  const onClose = useCallback(() => setIsOpen(false), []);
110
119
  return jsx(Popup, {
@@ -112,7 +121,7 @@ export const HoverCardComponent = ({
112
121
  isOpen: isOpen,
113
122
  onClose: onClose,
114
123
  placement: "bottom-start",
115
- content: cardComponent,
124
+ content: CardComponent,
116
125
  trigger: triggerProps => jsx("span", _extends({}, triggerProps, {
117
126
  onMouseEnter: initShowCard,
118
127
  onMouseLeave: initHideCard
@@ -0,0 +1,27 @@
1
+ export const getSimulatedMetadata = extensionKey => {
2
+ switch (extensionKey) {
3
+ case 'confluence-object-provider':
4
+ return {
5
+ metadata: {
6
+ primary: ['AuthorGroup', 'CreatedBy', 'CommentCount', 'ReactCount'],
7
+ secondary: []
8
+ }
9
+ };
10
+
11
+ case 'jira-object-provider':
12
+ return {
13
+ metadata: {
14
+ primary: ['AuthorGroup', 'State', 'Priority'],
15
+ secondary: []
16
+ }
17
+ };
18
+
19
+ default:
20
+ return {
21
+ metadata: {
22
+ primary: ['ModifiedOn'],
23
+ secondary: []
24
+ }
25
+ };
26
+ }
27
+ };
@@ -0,0 +1,22 @@
1
+ import { ElementName } from '../../constants';
2
+
3
+ var elementNamesToItems = function elementNamesToItems(elementNames) {
4
+ return elementNames.filter(function (element) {
5
+ return element in ElementName;
6
+ }).map(function (elementName) {
7
+ return {
8
+ name: elementName,
9
+ testId: "".concat(elementName.toLowerCase(), "-metadata-element")
10
+ };
11
+ });
12
+ };
13
+
14
+ export var extractMetadata = function extractMetadata(jsonLd) {
15
+ var _jsonLd$metadata, _metadata$primary, _metadata$secondary;
16
+
17
+ var metadata = (_jsonLd$metadata = jsonLd.metadata) !== null && _jsonLd$metadata !== void 0 ? _jsonLd$metadata : [];
18
+ return {
19
+ primary: elementNamesToItems((_metadata$primary = metadata.primary) !== null && _metadata$primary !== void 0 ? _metadata$primary : []),
20
+ secondary: elementNamesToItems((_metadata$secondary = metadata.secondary) !== null && _metadata$secondary !== void 0 ? _metadata$secondary : [])
21
+ };
22
+ };
@@ -13,10 +13,6 @@ var isJwmView = function isJwmView(url) {
13
13
  return url.match(/^https:\/\/.*?\/jira\/core\/projects\/[^\/]+?\/(timeline|calendar|list|board)\/?/);
14
14
  };
15
15
 
16
- var isSlackMessage = function isSlackMessage(url) {
17
- return url.match(/^https:\/\/.+?\.slack\.com\/archives\/[CG][A-Z0-9]+\/p[0-9]+(\?.*)?$/);
18
- };
19
-
20
16
  export var Transformer = /*#__PURE__*/function () {
21
17
  function Transformer() {
22
18
  _classCallCheck(this, Transformer);
@@ -58,8 +54,6 @@ export var Transformer = /*#__PURE__*/function () {
58
54
  value: function toAdf(url, appearance) {
59
55
  if (isJiraRoadMap(url) || isPolarisView(url) || isJwmView(url)) {
60
56
  return this.buildEmbedAdf(url);
61
- } else if (isSlackMessage(url)) {
62
- return this.buildBlockAdf(url);
63
57
  } else {
64
58
  switch (appearance) {
65
59
  case 'inline':
@@ -4,7 +4,7 @@ import { TitleBlock } 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) {
7
- return isFlexibleUiBlock(child);
7
+ return isFlexibleUiTitleBlock(child);
8
8
  })) {
9
9
  return true;
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "18.0.19",
3
+ "version": "18.0.22",
4
4
  "sideEffects": false
5
5
  }
@@ -3,11 +3,11 @@ import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral
3
3
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
4
4
 
5
5
  /** @jsx jsx */
6
- import React from 'react';
6
+ import React, { useMemo } from 'react';
7
7
  import { css, jsx } from '@emotion/core';
8
8
  import Tooltip from '@atlaskit/tooltip';
9
9
  import { SmartLinkSize, SmartLinkTheme } from '../../../../../constants';
10
- import { getLinkLineHeight, getLinkSizeStyles, getTruncateStyles } from '../../utils';
10
+ import { getLinkLineHeight, getLinkSizeStyles, getTruncateStyles, hasWhiteSpace } from '../../utils';
11
11
  import { tokens } from '../../../../../utils/token';
12
12
  var DEFAULT_MAX_LINES = 2;
13
13
  var MAXIMUM_MAX_LINES = 2;
@@ -26,9 +26,9 @@ var getThemeStyles = function getThemeStyles(theme) {
26
26
  }
27
27
  };
28
28
 
29
- var getAnchorStyles = function getAnchorStyles(size, theme, maxLines) {
29
+ var getAnchorStyles = function getAnchorStyles(size, theme, maxLines, hasSpace) {
30
30
  var sizeStyles = getLinkSizeStyles(size);
31
- return css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n flex: 1 1 auto;\n ", "\n ", "\n // Theme should be last to be spread because it contains override values\n ", "\n "])), sizeStyles, getTruncateStyles(maxLines, getLinkLineHeight(size)), getThemeStyles(theme));
31
+ return css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n flex: 1 1 auto;\n ", "\n ", "\n // Theme should be last to be spread because it contains override values\n ", "\n "])), sizeStyles, getTruncateStyles(maxLines, getLinkLineHeight(size), hasSpace ? 'break-word' : 'break-all'), getThemeStyles(theme));
32
32
  };
33
33
 
34
34
  var getMaxLines = function getMaxLines(maxLines) {
@@ -64,6 +64,9 @@ var Link = function Link(_ref) {
64
64
  url = _ref.url,
65
65
  onClick = _ref.onClick,
66
66
  target = _ref.target;
67
+ var hasSpace = useMemo(function () {
68
+ return text ? hasWhiteSpace(text) : false;
69
+ }, [text]);
67
70
  return jsx("span", {
68
71
  css: containerStyles
69
72
  }, jsx(Tooltip, {
@@ -71,7 +74,7 @@ var Link = function Link(_ref) {
71
74
  testId: "".concat(testId, "-tooltip"),
72
75
  tag: "span"
73
76
  }, jsx("a", {
74
- css: [getAnchorStyles(size, theme, getMaxLines(maxLines)), overrideCss],
77
+ css: [getAnchorStyles(size, theme, getMaxLines(maxLines), hasSpace), overrideCss],
75
78
  "data-smart-element-link": true,
76
79
  "data-testid": testId,
77
80
  onClick: onClick,
@@ -80,5 +80,9 @@ export var getMaxLines = function getMaxLines(value, defaultValue, max, min) {
80
80
  };
81
81
  export var getTruncateStyles = function getTruncateStyles(maxLines) {
82
82
  var lineHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '1rem';
83
- return css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n -webkit-line-clamp: ", ";\n -webkit-box-orient: vertical;\n // Fallback options\n max-height: calc(", " * ", ");\n "])), maxLines, maxLines, lineHeight);
83
+ var wordBreak = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'break-word';
84
+ return css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: ", ";\n -webkit-line-clamp: ", ";\n -webkit-box-orient: vertical;\n // Fallback options\n max-height: calc(", " * ", ");\n "])), wordBreak, maxLines, maxLines, lineHeight);
85
+ };
86
+ export var hasWhiteSpace = function hasWhiteSpace(str) {
87
+ return str.search(/\s/) >= 0;
84
88
  };
@@ -4,7 +4,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  /** @jsx jsx */
5
5
  import { jsx } from '@emotion/core';
6
6
  import React, { useCallback, useRef, useMemo } from 'react';
7
- import { TitleBlock, SnippetBlock, FooterBlock } from '../FlexibleCard/components/blocks';
7
+ import { TitleBlock, SnippetBlock, FooterBlock, MetadataBlock } from '../FlexibleCard/components/blocks';
8
8
  import { Card } from '../Card';
9
9
  import Popup from '@atlaskit/popup';
10
10
  import { SmartLinkSize, ActionName } from '../../constants';
@@ -16,6 +16,8 @@ import { fireSmartLinkEvent } from '../../utils/analytics';
16
16
  import { useSmartCardState as useLinkState } from '../../state/store';
17
17
  import { useSmartLinkAnalytics } from '../../state/analytics';
18
18
  import { getExtensionKey, getDefinitionId } from '../../state/helpers';
19
+ import { extractMetadata } from '../../extractors/hover/extractMetadata';
20
+ import { getSimulatedMetadata } from './utils';
19
21
  export var HoverCardComponent = function HoverCardComponent(_ref) {
20
22
  var children = _ref.children,
21
23
  url = _ref.url,
@@ -104,7 +106,9 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
104
106
  };
105
107
  }, [url, definitionId, extensionKey, analytics]);
106
108
 
107
- var cardComponent = function cardComponent() {
109
+ var CardComponent = function CardComponent() {
110
+ //TODO: EDM-3224 deleted simulated and use real JsonLd
111
+ var metadataElements = extractMetadata(getSimulatedMetadata(extensionKey));
108
112
  return jsx("div", {
109
113
  onMouseEnter: initShowCard,
110
114
  onMouseLeave: initHideCard,
@@ -118,6 +122,9 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
118
122
  }
119
123
  }, jsx(TitleBlock, {
120
124
  actions: [openAction]
125
+ }), jsx(MetadataBlock, {
126
+ primary: metadataElements.primary,
127
+ secondary: metadataElements.secondary
121
128
  }), jsx(SnippetBlock, null), jsx(FooterBlock, {
122
129
  actions: smartlinkActions
123
130
  })));
@@ -131,7 +138,7 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
131
138
  isOpen: isOpen,
132
139
  onClose: onClose,
133
140
  placement: "bottom-start",
134
- content: cardComponent,
141
+ content: CardComponent,
135
142
  trigger: function trigger(triggerProps) {
136
143
  return jsx("span", _extends({}, triggerProps, {
137
144
  onMouseEnter: initShowCard,
@@ -0,0 +1,27 @@
1
+ export var getSimulatedMetadata = function getSimulatedMetadata(extensionKey) {
2
+ switch (extensionKey) {
3
+ case 'confluence-object-provider':
4
+ return {
5
+ metadata: {
6
+ primary: ['AuthorGroup', 'CreatedBy', 'CommentCount', 'ReactCount'],
7
+ secondary: []
8
+ }
9
+ };
10
+
11
+ case 'jira-object-provider':
12
+ return {
13
+ metadata: {
14
+ primary: ['AuthorGroup', 'State', 'Priority'],
15
+ secondary: []
16
+ }
17
+ };
18
+
19
+ default:
20
+ return {
21
+ metadata: {
22
+ primary: ['ModifiedOn'],
23
+ secondary: []
24
+ }
25
+ };
26
+ }
27
+ };
@@ -0,0 +1,3 @@
1
+ import { MetadataOptions } from '../../view/HoverCard/types';
2
+ import { JsonLd } from 'json-ld-types';
3
+ export declare const extractMetadata: (jsonLd: JsonLd.Primitives.Property<any>) => MetadataOptions;
@@ -8,4 +8,5 @@ export declare const getIconWidth: (size?: SmartLinkSize | undefined) => string;
8
8
  export declare const getLinkLineHeight: (size: SmartLinkSize) => string;
9
9
  export declare const getLinkSizeStyles: (size: SmartLinkSize) => SerializedStyles;
10
10
  export declare const getMaxLines: (value: number, defaultValue: number, max: number, min: number) => number;
11
- export declare const getTruncateStyles: (maxLines: number, lineHeight?: string) => SerializedStyles;
11
+ export declare const getTruncateStyles: (maxLines: number, lineHeight?: string, wordBreak?: 'break-word' | 'break-all') => SerializedStyles;
12
+ export declare const hasWhiteSpace: (str: string) => boolean;
@@ -1,6 +1,11 @@
1
1
  import { WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
2
+ import { ElementItem } from '../FlexibleCard/components/blocks/types';
2
3
  export interface HoverCardProps extends WithAnalyticsEventsProps {
3
4
  url: string;
4
5
  }
5
6
  export declare type PreviewDisplay = 'card' | 'embed';
6
7
  export declare type PreviewInvokeMethod = 'keyboard' | 'mouse_hover' | 'mouse_click';
8
+ export interface MetadataOptions {
9
+ primary: Array<ElementItem>;
10
+ secondary: Array<ElementItem>;
11
+ }
@@ -0,0 +1,2 @@
1
+ import { JsonLd } from 'json-ld-types';
2
+ export declare const getSimulatedMetadata: (extensionKey: string) => JsonLd.Primitives.Property<any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "18.0.19",
3
+ "version": "18.0.22",
4
4
  "description": "Smart card component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"