@atlaskit/smart-card 23.12.3 → 23.13.1

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 (62) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/extractors/common/icon/extractIcon.js +12 -6
  3. package/dist/cjs/extractors/common/icon/extractIconFromDocument.js +14 -7
  4. package/dist/cjs/extractors/common/icon/extractIconFromTask.js +25 -15
  5. package/dist/cjs/linkUrl.js +15 -0
  6. package/dist/cjs/messages.js +21 -1
  7. package/dist/cjs/utils/index.js +2 -1
  8. package/dist/cjs/version.json +1 -1
  9. package/dist/cjs/view/EmbedCard/components/ExpandedFrame.js +3 -1
  10. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +2 -1
  11. package/dist/cjs/view/InlineCard/ErroredView/index.js +4 -2
  12. package/dist/cjs/view/InlineCard/ForbiddenView/index.js +6 -3
  13. package/dist/cjs/view/InlineCard/IconAndTitleLayout/index.js +2 -1
  14. package/dist/cjs/view/InlineCard/ResolvedView/index.js +1 -0
  15. package/dist/cjs/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.js +76 -0
  16. package/dist/cjs/view/LinkUrl/LinkWarningModal/index.js +70 -0
  17. package/dist/cjs/view/LinkUrl/index.js +48 -0
  18. package/dist/cjs/view/LinkUrl/types.js +5 -0
  19. package/dist/es2019/extractors/common/icon/extractIcon.js +12 -6
  20. package/dist/es2019/extractors/common/icon/extractIconFromDocument.js +14 -7
  21. package/dist/es2019/extractors/common/icon/extractIconFromTask.js +24 -15
  22. package/dist/es2019/linkUrl.js +1 -0
  23. package/dist/es2019/messages.js +21 -1
  24. package/dist/es2019/utils/index.js +2 -1
  25. package/dist/es2019/version.json +1 -1
  26. package/dist/es2019/view/EmbedCard/components/ExpandedFrame.js +3 -1
  27. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +2 -1
  28. package/dist/es2019/view/InlineCard/ErroredView/index.js +4 -2
  29. package/dist/es2019/view/InlineCard/ForbiddenView/index.js +6 -3
  30. package/dist/es2019/view/InlineCard/IconAndTitleLayout/index.js +2 -1
  31. package/dist/es2019/view/InlineCard/ResolvedView/index.js +1 -0
  32. package/dist/es2019/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.js +49 -0
  33. package/dist/es2019/view/LinkUrl/LinkWarningModal/index.js +46 -0
  34. package/dist/es2019/view/LinkUrl/index.js +28 -0
  35. package/dist/es2019/view/LinkUrl/types.js +1 -0
  36. package/dist/esm/extractors/common/icon/extractIcon.js +12 -6
  37. package/dist/esm/extractors/common/icon/extractIconFromDocument.js +14 -7
  38. package/dist/esm/extractors/common/icon/extractIconFromTask.js +24 -15
  39. package/dist/esm/linkUrl.js +1 -0
  40. package/dist/esm/messages.js +21 -1
  41. package/dist/esm/utils/index.js +2 -1
  42. package/dist/esm/version.json +1 -1
  43. package/dist/esm/view/EmbedCard/components/ExpandedFrame.js +3 -1
  44. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +2 -1
  45. package/dist/esm/view/InlineCard/ErroredView/index.js +4 -2
  46. package/dist/esm/view/InlineCard/ForbiddenView/index.js +6 -3
  47. package/dist/esm/view/InlineCard/IconAndTitleLayout/index.js +2 -1
  48. package/dist/esm/view/InlineCard/ResolvedView/index.js +1 -0
  49. package/dist/esm/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.js +62 -0
  50. package/dist/esm/view/LinkUrl/LinkWarningModal/index.js +46 -0
  51. package/dist/esm/view/LinkUrl/index.js +33 -0
  52. package/dist/esm/view/LinkUrl/types.js +1 -0
  53. package/dist/types/extractors/common/__mocks__/withIntl.d.ts +2 -0
  54. package/dist/types/linkUrl.d.ts +2 -0
  55. package/dist/types/messages.d.ts +1 -1
  56. package/dist/types/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.d.ts +9 -0
  57. package/dist/types/view/LinkUrl/LinkWarningModal/index.d.ts +13 -0
  58. package/dist/types/view/LinkUrl/index.d.ts +4 -0
  59. package/dist/types/view/LinkUrl/types.d.ts +8 -0
  60. package/link-url/package.json +15 -0
  61. package/package.json +3 -4
  62. package/dist/types/extractors/common/__mocks__/render.d.ts +0 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 23.13.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`02d341ecf63`](https://bitbucket.org/atlassian/atlassian-frontend/commits/02d341ecf63) - [ux] Fix copy button tooltip to show Copy link, not Download
8
+
9
+ ## 23.13.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [`67cfd8e13d0`](https://bitbucket.org/atlassian/atlassian-frontend/commits/67cfd8e13d0) - LinkUrl component with built-in link safety check added
14
+
3
15
  ## 23.12.3
4
16
 
5
17
  ### Patch Changes
@@ -71,33 +71,39 @@ var extractIconByType = function extractIconByType(type, opts) {
71
71
 
72
72
  case 'atlassian:Goal':
73
73
  return opts.icon || /*#__PURE__*/_react.default.createElement(_5.default, {
74
- label: opts.title || 'goal'
74
+ label: opts.title || 'goal',
75
+ testId: "task-icon"
75
76
  });
76
77
 
77
78
  case 'atlassian:Project':
78
79
  return opts.icon || /*#__PURE__*/_react.default.createElement(_peopleGroup.default, {
79
80
  label: opts.title || 'project',
80
- size: "small"
81
+ size: "small",
82
+ testId: "project-icon"
81
83
  });
82
84
 
83
85
  case 'atlassian:SourceCodeCommit':
84
86
  return /*#__PURE__*/_react.default.createElement(_.default, {
85
- label: opts.title || 'commit'
87
+ label: opts.title || 'commit',
88
+ testId: "commit-icon"
86
89
  });
87
90
 
88
91
  case 'atlassian:SourceCodePullRequest':
89
92
  return /*#__PURE__*/_react.default.createElement(_2.default, {
90
- label: opts.title || 'pullRequest'
93
+ label: opts.title || 'pullRequest',
94
+ testId: "pull-request-icon"
91
95
  });
92
96
 
93
97
  case 'atlassian:SourceCodeReference':
94
98
  return /*#__PURE__*/_react.default.createElement(_3.default, {
95
- label: opts.title || 'reference'
99
+ label: opts.title || 'reference',
100
+ testId: "branch-icon"
96
101
  });
97
102
 
98
103
  case 'atlassian:SourceCodeRepository':
99
104
  return /*#__PURE__*/_react.default.createElement(_4.default, {
100
- label: opts.title || 'repository'
105
+ label: opts.title || 'repository',
106
+ testId: "repo-icon"
101
107
  });
102
108
 
103
109
  case 'atlassian:Task':
@@ -49,37 +49,44 @@ var documentTypeToIcon = function documentTypeToIcon(type, opts) {
49
49
  switch (type) {
50
50
  case 'schema:BlogPosting':
51
51
  return /*#__PURE__*/_react.default.createElement(_.default, {
52
- label: opts.title || 'blog'
52
+ label: opts.title || 'blog',
53
+ testId: "blog-icon"
53
54
  });
54
55
 
55
56
  case 'schema:DigitalDocument':
56
57
  return /*#__PURE__*/_react.default.createElement(_2.default, {
57
- label: opts.title || 'file'
58
+ label: opts.title || 'file',
59
+ testId: "file-icon"
58
60
  });
59
61
 
60
62
  case 'schema:TextDigitalDocument':
61
63
  return /*#__PURE__*/_react.default.createElement(_5.default, {
62
- label: opts.title || 'document'
64
+ label: opts.title || 'document',
65
+ testId: "document-icon"
63
66
  });
64
67
 
65
68
  case 'schema:PresentationDigitalDocument':
66
69
  return /*#__PURE__*/_react.default.createElement(_3.default, {
67
- label: opts.title || 'presentation'
70
+ label: opts.title || 'presentation',
71
+ testId: "presentation-icon"
68
72
  });
69
73
 
70
74
  case 'schema:SpreadsheetDigitalDocument':
71
75
  return /*#__PURE__*/_react.default.createElement(_4.default, {
72
- label: opts.title || 'spreadsheet'
76
+ label: opts.title || 'spreadsheet',
77
+ testId: "spreadsheet-icon"
73
78
  });
74
79
 
75
80
  case 'atlassian:Template':
76
81
  return /*#__PURE__*/_react.default.createElement(_documentFilled.default, {
77
- label: opts.title || 'template'
82
+ label: opts.title || 'template',
83
+ testId: "document-filled-icon"
78
84
  });
79
85
 
80
86
  case 'atlassian:UndefinedLink':
81
87
  return /*#__PURE__*/_react.default.createElement(_5.default, {
82
- label: opts.title || 'undefinedLink'
88
+ label: opts.title || 'undefinedLink',
89
+ testId: "document-icon"
83
90
  });
84
91
  }
85
92
  };
@@ -35,6 +35,11 @@ var extractIconFromTask = function extractIconFromTask(opts) {
35
35
  provider = opts.provider;
36
36
  var taskLabel = opts.title || 'task';
37
37
 
38
+ var defaultIcon = /*#__PURE__*/_react.default.createElement(_.default, {
39
+ label: taskLabel,
40
+ testId: "default-task-icon"
41
+ });
42
+
38
43
  if (provider && provider.id === _constants.JIRA_GENERATOR_ID && taskType && taskType.id) {
39
44
  var taskTypeId = taskType.id;
40
45
  var taskTypeName = taskTypeId.split('#').pop();
@@ -42,59 +47,64 @@ var extractIconFromTask = function extractIconFromTask(opts) {
42
47
  switch (taskTypeName) {
43
48
  case _constants.JIRA_TASK:
44
49
  return /*#__PURE__*/_react.default.createElement(_.default, {
45
- label: taskLabel
50
+ label: taskLabel,
51
+ testId: "jira-task-icon"
46
52
  });
47
53
 
48
54
  case _constants.JIRA_SUB_TASK:
49
55
  return /*#__PURE__*/_react.default.createElement(_2.default, {
50
- label: taskLabel
56
+ label: taskLabel,
57
+ testId: "jira-subtask-icon"
51
58
  });
52
59
 
53
60
  case _constants.JIRA_STORY:
54
61
  return /*#__PURE__*/_react.default.createElement(_3.default, {
55
- label: taskLabel
62
+ label: taskLabel,
63
+ testId: "jira-story-icon"
56
64
  });
57
65
 
58
66
  case _constants.JIRA_BUG:
59
67
  return /*#__PURE__*/_react.default.createElement(_4.default, {
60
- label: taskLabel
68
+ label: taskLabel,
69
+ testId: "jira-bug-icon"
61
70
  });
62
71
 
63
72
  case _constants.JIRA_EPIC:
64
73
  return /*#__PURE__*/_react.default.createElement(_5.default, {
65
- label: taskLabel
74
+ label: taskLabel,
75
+ testId: "jira-epic-icon"
66
76
  });
67
77
 
68
78
  case _constants.JIRA_INCIDENT:
69
79
  return /*#__PURE__*/_react.default.createElement(_6.default, {
70
- label: taskLabel
80
+ label: taskLabel,
81
+ testId: "jira-incident-icon"
71
82
  });
72
83
 
73
84
  case _constants.JIRA_SERVICE_REQUEST:
74
85
  return /*#__PURE__*/_react.default.createElement(_7.default, {
75
- label: taskLabel
86
+ label: taskLabel,
87
+ testId: "jira-service-request-icon"
76
88
  });
77
89
 
78
90
  case _constants.JIRA_CHANGE:
79
91
  return /*#__PURE__*/_react.default.createElement(_8.default, {
80
- label: taskLabel
92
+ label: taskLabel,
93
+ testId: "jira-change-icon"
81
94
  });
82
95
 
83
96
  case _constants.JIRA_PROBLEM:
84
97
  return /*#__PURE__*/_react.default.createElement(_9.default, {
85
- label: taskLabel
98
+ label: taskLabel,
99
+ testId: "jira-problem-icon"
86
100
  });
87
101
 
88
102
  case _constants.JIRA_CUSTOM_TASK_TYPE:
89
- return taskType.icon || opts.icon || provider.icon || /*#__PURE__*/_react.default.createElement(_.default, {
90
- label: taskLabel
91
- });
103
+ return taskType.icon || opts.icon || provider.icon || defaultIcon;
92
104
  }
93
105
  }
94
106
 
95
- return /*#__PURE__*/_react.default.createElement(_.default, {
96
- label: taskLabel
97
- });
107
+ return defaultIcon;
98
108
  };
99
109
 
100
110
  exports.extractIconFromTask = extractIconFromTask;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "default", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _LinkUrl.default;
12
+ }
13
+ });
14
+
15
+ var _LinkUrl = _interopRequireDefault(require("./view/LinkUrl"));
@@ -48,6 +48,11 @@ var messages = (0, _reactIntlNext.defineMessages)({
48
48
  defaultMessage: 'Close',
49
49
  description: ''
50
50
  },
51
+ check_this_link: {
52
+ id: 'fabric.linking.check_this_link',
53
+ defaultMessage: 'Check this link',
54
+ description: 'Link safety warning modal header'
55
+ },
51
56
  connect_to: {
52
57
  id: 'fabric.linking.connect_to',
53
58
  defaultMessage: 'Connect to {name}',
@@ -93,8 +98,13 @@ var messages = (0, _reactIntlNext.defineMessages)({
93
98
  defaultMessage: 'Connect to Atlassian to view more details of your work and collaborate from one place.',
94
99
  description: 'Shown when a user does not have access to a link, but can connect their external account to view the link on card view and we do not have the providers name.'
95
100
  },
101
+ continue: {
102
+ id: 'fabric.linking.continue',
103
+ defaultMessage: 'Continue',
104
+ description: 'continue'
105
+ },
96
106
  copy_url_to_clipboard: {
97
- id: 'fabric.linking.download',
107
+ id: 'fabric.linking.copy_url_to_clipboard',
98
108
  defaultMessage: 'Copy link',
99
109
  description: ''
100
110
  },
@@ -138,6 +148,11 @@ var messages = (0, _reactIntlNext.defineMessages)({
138
148
  defaultMessage: 'You don’t have access to this preview. Contact the site admin if you need access.',
139
149
  description: 'Informs the user that they cannot view this content.'
140
150
  },
151
+ go_back: {
152
+ id: 'fabric.linking.go_back',
153
+ defaultMessage: 'Go back',
154
+ description: 'go back'
155
+ },
141
156
  invalid_permissions: {
142
157
  id: 'fabric.linking.invalid_permissions',
143
158
  defaultMessage: 'Restricted content',
@@ -343,6 +358,11 @@ var messages = (0, _reactIntlNext.defineMessages)({
343
358
  defaultMessage: 'Try another account',
344
359
  description: 'Allows the user to try an action again with a different account'
345
360
  },
361
+ link_safety_warning_message: {
362
+ id: 'fabric.linking.link_safety_warning_message',
363
+ defaultMessage: 'The link {unsafeLinkText} is taking you to a different site, <a>actual link here</a>',
364
+ description: 'Link safety check warning message'
365
+ },
346
366
  unlink_account: {
347
367
  id: 'fabric.linking.unlink_account',
348
368
  defaultMessage: 'Unlink Account',
@@ -84,7 +84,8 @@ var getIconForFileType = function getIconForFileType(fileMimeType) {
84
84
  }); // because we're using dynamic loading here, TS will not be able to infer the type
85
85
 
86
86
  return /*#__PURE__*/_react.default.createElement(Icon, {
87
- label: label
87
+ label: label,
88
+ testId: "document-file-format-icon"
88
89
  });
89
90
  };
90
91
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.12.3",
3
+ "version": "23.13.1",
4
4
  "sideEffects": false
5
5
  }
@@ -89,7 +89,9 @@ var ExpandedFrame = function ExpandedFrame(_ref) {
89
89
  "data-testid": testId,
90
90
  "data-trello-do-not-use-override": testId,
91
91
  "data-is-selected": isSelected,
92
- "data-is-visible": isVisible
92
+ "data-is-visible": isVisible,
93
+ "data-wrapper-type": "default",
94
+ "data-is-interactive": isInteractive()
93
95
  }, renderHeader(), renderContent());
94
96
  }
95
97
  };
@@ -173,7 +173,8 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
173
173
  onMouseEnter: initShowCard,
174
174
  onMouseLeave: initHideCard,
175
175
  onMouseMove: setMousePosition,
176
- onClick: onChildClick
176
+ onClick: onChildClick,
177
+ "data-testid": "hover-card-trigger-wrapper"
177
178
  }), children));
178
179
  },
179
180
  zIndex: 511 // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
@@ -77,7 +77,8 @@ var InlineCardErroredView = /*#__PURE__*/function (_React$Component) {
77
77
  spacing: "none",
78
78
  appearance: "subtle-link",
79
79
  component: _styled.IconStyledButton,
80
- onClick: _this.handleRetry
80
+ onClick: _this.handleRetry,
81
+ role: "button"
81
82
  }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.try_again, function (formattedMessage) {
82
83
  return /*#__PURE__*/_react.default.createElement(_styled.LowercaseAppearance, null, formattedMessage);
83
84
  })));
@@ -102,7 +103,8 @@ var InlineCardErroredView = /*#__PURE__*/function (_React$Component) {
102
103
  icon: icon || /*#__PURE__*/_react.default.createElement(_Icon.AKIconWrapper, null, /*#__PURE__*/_react.default.createElement(_error.default, {
103
104
  label: "error",
104
105
  size: "small",
105
- primaryColor: "var(--ds-icon-danger, ".concat(_colors.R300, ")")
106
+ primaryColor: "var(--ds-icon-danger, ".concat(_colors.R300, ")"),
107
+ testId: "errored-view-default-icon"
106
108
  })),
107
109
  link: url,
108
110
  title: url,
@@ -54,7 +54,8 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
54
54
  var FallbackForbiddenIcon = /*#__PURE__*/_react.default.createElement(_Icon.AKIconWrapper, null, /*#__PURE__*/_react.default.createElement(_lockFilled.default, {
55
55
  label: "error",
56
56
  size: "small",
57
- primaryColor: "var(--ds-icon-danger, ".concat(_colors.R400, ")")
57
+ primaryColor: "var(--ds-icon-danger, ".concat(_colors.R400, ")"),
58
+ testId: "forbidden-view-fallback-icon"
58
59
  }));
59
60
 
60
61
  var InlineCardForbiddenView = /*#__PURE__*/function (_React$Component) {
@@ -115,7 +116,8 @@ var InlineCardForbiddenView = /*#__PURE__*/function (_React$Component) {
115
116
  appearance: "subtle-link",
116
117
  onClick: _this.handleRetry,
117
118
  component: _styled.IconStyledButton,
118
- testId: "button-connect-other-account"
119
+ testId: "button-connect-other-account",
120
+ role: "button"
119
121
  }, _this.renderForbiddenAccessMessage());
120
122
  }
121
123
 
@@ -125,7 +127,8 @@ var InlineCardForbiddenView = /*#__PURE__*/function (_React$Component) {
125
127
  appearance: "subtle-link",
126
128
  onClick: _this.handleRetry,
127
129
  component: _styled.IconStyledButton,
128
- testId: "button-connect-other-account"
130
+ testId: "button-connect-other-account",
131
+ role: "button"
129
132
  }, /*#__PURE__*/_react.default.createElement(_styled2.LozengeWrapper, null, /*#__PURE__*/_react.default.createElement(_lozenge.default, {
130
133
  appearance: 'moved'
131
134
  }, _this.renderForbiddenAccessMessage()))));
@@ -171,7 +171,8 @@ var IconAndTitleLayout = /*#__PURE__*/function (_React$Component) {
171
171
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_styled.IconTitleWrapper, {
172
172
  style: {
173
173
  color: titleColor
174
- }
174
+ },
175
+ "data-testid": testId
175
176
  }, link ? /*#__PURE__*/_react.default.createElement(_styled2.LinkAppearance, {
176
177
  href: link,
177
178
  onClick: this.handleClick,
@@ -53,6 +53,7 @@ var InlineCardResolvedView = /*#__PURE__*/function (_React$Component) {
53
53
  }
54
54
 
55
55
  return /*#__PURE__*/_react.default.createElement(_styled.LozengeBlockWrapper, null, /*#__PURE__*/_react.default.createElement(_styled.LozengeWrapper, null, /*#__PURE__*/_react.default.createElement(_lozenge.default, {
56
+ testId: "inline-card-resolved-view-lozenge",
56
57
  appearance: lozenge.appearance || 'default',
57
58
  isBold: lozenge.isBold
58
59
  }, lozenge.text)));
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useLinkWarningModal = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _url = require("@atlaskit/linking-common/url");
15
+
16
+ var useLinkWarningModal = function useLinkWarningModal() {
17
+ var _useState = (0, _react.useState)(null),
18
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
19
+ unsafeLinkText = _useState2[0],
20
+ setUnsafeLinkText = _useState2[1];
21
+
22
+ var _useState3 = (0, _react.useState)(null),
23
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
24
+ url = _useState4[0],
25
+ setUrl = _useState4[1];
26
+
27
+ var _useState5 = (0, _react.useState)(false),
28
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
29
+ isOpen = _useState6[0],
30
+ setIsOpen = _useState6[1];
31
+ /**
32
+ * It checks and warns if a link text is a URL and different from an actual link destination
33
+ */
34
+
35
+
36
+ var checkLinkSafety = function checkLinkSafety(event, href) {
37
+ var linkText = event.currentTarget.innerText;
38
+ var anchorLinkRegex = new RegExp(/^#/im);
39
+ var isAnchorLink = anchorLinkRegex.test(linkText);
40
+
41
+ if (isAnchorLink) {
42
+ return;
43
+ }
44
+
45
+ var normalisedUrlFromLinkText = (0, _url.normalizeUrl)(linkText);
46
+
47
+ if (!!normalisedUrlFromLinkText && normalisedUrlFromLinkText !== href) {
48
+ event.preventDefault();
49
+ setUnsafeLinkText(linkText);
50
+ href && setUrl(href);
51
+ setIsOpen(true);
52
+ }
53
+ };
54
+
55
+ var onClose = function onClose() {
56
+ setIsOpen(false);
57
+ setUnsafeLinkText(null);
58
+ setUrl(null);
59
+ };
60
+
61
+ var onContinue = function onContinue() {
62
+ onClose();
63
+ url && window.location.assign(url);
64
+ };
65
+
66
+ return {
67
+ checkLinkSafety: checkLinkSafety,
68
+ unsafeLinkText: unsafeLinkText,
69
+ onClose: onClose,
70
+ onContinue: onContinue,
71
+ isOpen: isOpen,
72
+ url: url
73
+ };
74
+ };
75
+
76
+ exports.useLinkWarningModal = useLinkWarningModal;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
17
+
18
+ var _modalDialog = _interopRequireWildcard(require("@atlaskit/modal-dialog"));
19
+
20
+ var _reactIntlNext = require("react-intl-next");
21
+
22
+ var _messages = require("../../../messages");
23
+
24
+ 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); }
25
+
26
+ 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; }
27
+
28
+ var WarningModal = function WarningModal(props) {
29
+ var isOpen = props.isOpen,
30
+ unsafeLinkText = props.unsafeLinkText,
31
+ url = props.url,
32
+ onClose = props.onClose,
33
+ onContinue = props.onContinue,
34
+ intl = props.intl;
35
+
36
+ var content = /*#__PURE__*/_react.default.createElement(_modalDialog.ModalTransition, null, isOpen && /*#__PURE__*/_react.default.createElement(_modalDialog.default, {
37
+ onClose: onClose,
38
+ testId: "link-with-safety-warning"
39
+ }, /*#__PURE__*/_react.default.createElement(_modalDialog.ModalHeader, null, /*#__PURE__*/_react.default.createElement(_modalDialog.ModalTitle, {
40
+ appearance: "warning"
41
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.check_this_link))), /*#__PURE__*/_react.default.createElement(_modalDialog.ModalBody, null, url && unsafeLinkText && /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _messages.messages.link_safety_warning_message, {
42
+ values: {
43
+ unsafeLinkText: unsafeLinkText,
44
+ a: function a() {
45
+ return /*#__PURE__*/_react.default.createElement("a", {
46
+ href: url,
47
+ target: "_blank",
48
+ rel: "noopener noreferrer"
49
+ }, url);
50
+ }
51
+ }
52
+ }))), /*#__PURE__*/_react.default.createElement(_modalDialog.ModalFooter, null, /*#__PURE__*/_react.default.createElement(_standardButton.default, {
53
+ appearance: "subtle",
54
+ onClick: onClose
55
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.go_back)), /*#__PURE__*/_react.default.createElement(_standardButton.default, {
56
+ appearance: "warning",
57
+ onClick: onContinue,
58
+ autoFocus: true
59
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.continue)))));
60
+
61
+ return intl ? content : /*#__PURE__*/_react.default.createElement(_reactIntlNext.IntlProvider, {
62
+ locale: "en"
63
+ }, content);
64
+ };
65
+
66
+ var _default = (0, _reactIntlNext.injectIntl)(WarningModal, {
67
+ enforceContext: false
68
+ });
69
+
70
+ exports.default = _default;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _useLinkWarningModal2 = require("./LinkWarningModal/hooks/use-link-warning-modal");
17
+
18
+ var _LinkWarningModal = _interopRequireDefault(require("./LinkWarningModal"));
19
+
20
+ var _excluded = ["href", "children", "checkSafety", "onClick", "testId"],
21
+ _excluded2 = ["checkLinkSafety"];
22
+
23
+ var LinkUrl = function LinkUrl(_ref) {
24
+ var href = _ref.href,
25
+ children = _ref.children,
26
+ _ref$checkSafety = _ref.checkSafety,
27
+ checkSafety = _ref$checkSafety === void 0 ? true : _ref$checkSafety,
28
+ _onClick = _ref.onClick,
29
+ _ref$testId = _ref.testId,
30
+ testId = _ref$testId === void 0 ? 'link-with-safety' : _ref$testId,
31
+ props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
32
+
33
+ var _useLinkWarningModal = (0, _useLinkWarningModal2.useLinkWarningModal)(),
34
+ checkLinkSafety = _useLinkWarningModal.checkLinkSafety,
35
+ linkWarningModalProps = (0, _objectWithoutProperties2.default)(_useLinkWarningModal, _excluded2);
36
+
37
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("a", (0, _extends2.default)({
38
+ "data-testid": testId,
39
+ href: href,
40
+ onClick: function onClick(e) {
41
+ checkSafety && checkLinkSafety(e, href);
42
+ _onClick && _onClick(e);
43
+ }
44
+ }, props), children), checkSafety && /*#__PURE__*/_react.default.createElement(_LinkWarningModal.default, linkWarningModalProps));
45
+ };
46
+
47
+ var _default = LinkUrl;
48
+ exports.default = _default;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -44,33 +44,39 @@ const extractIconByType = (type, opts) => {
44
44
 
45
45
  case 'atlassian:Goal':
46
46
  return opts.icon || /*#__PURE__*/React.createElement(TaskIcon, {
47
- label: opts.title || 'goal'
47
+ label: opts.title || 'goal',
48
+ testId: "task-icon"
48
49
  });
49
50
 
50
51
  case 'atlassian:Project':
51
52
  return opts.icon || /*#__PURE__*/React.createElement(ProjectIcon, {
52
53
  label: opts.title || 'project',
53
- size: "small"
54
+ size: "small",
55
+ testId: "project-icon"
54
56
  });
55
57
 
56
58
  case 'atlassian:SourceCodeCommit':
57
59
  return /*#__PURE__*/React.createElement(CommitIcon, {
58
- label: opts.title || 'commit'
60
+ label: opts.title || 'commit',
61
+ testId: "commit-icon"
59
62
  });
60
63
 
61
64
  case 'atlassian:SourceCodePullRequest':
62
65
  return /*#__PURE__*/React.createElement(PullRequestIcon, {
63
- label: opts.title || 'pullRequest'
66
+ label: opts.title || 'pullRequest',
67
+ testId: "pull-request-icon"
64
68
  });
65
69
 
66
70
  case 'atlassian:SourceCodeReference':
67
71
  return /*#__PURE__*/React.createElement(BranchIcon, {
68
- label: opts.title || 'reference'
72
+ label: opts.title || 'reference',
73
+ testId: "branch-icon"
69
74
  });
70
75
 
71
76
  case 'atlassian:SourceCodeRepository':
72
77
  return /*#__PURE__*/React.createElement(RepoIcon, {
73
- label: opts.title || 'repository'
78
+ label: opts.title || 'repository',
79
+ testId: "repo-icon"
74
80
  });
75
81
 
76
82
  case 'atlassian:Task':