@atlaskit/smart-card 26.2.0 → 26.2.2

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 (178) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/extractors/block/index.js +5 -4
  3. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -2
  4. package/dist/cjs/i18n/cs.js +4 -0
  5. package/dist/cjs/i18n/da.js +4 -0
  6. package/dist/cjs/i18n/de.js +4 -0
  7. package/dist/cjs/i18n/en_ZZ.js +54 -4
  8. package/dist/cjs/i18n/es.js +4 -0
  9. package/dist/cjs/i18n/fi.js +5 -0
  10. package/dist/cjs/i18n/fr.js +4 -0
  11. package/dist/cjs/i18n/hu.js +4 -0
  12. package/dist/cjs/i18n/it.js +4 -0
  13. package/dist/cjs/i18n/ja.js +4 -0
  14. package/dist/cjs/i18n/ko.js +4 -0
  15. package/dist/cjs/i18n/nb.js +4 -0
  16. package/dist/cjs/i18n/nl.js +4 -0
  17. package/dist/cjs/i18n/pl.js +4 -0
  18. package/dist/cjs/i18n/pt_BR.js +4 -0
  19. package/dist/cjs/i18n/ru.js +4 -0
  20. package/dist/cjs/i18n/sv.js +4 -0
  21. package/dist/cjs/i18n/th.js +4 -0
  22. package/dist/cjs/i18n/tr.js +4 -0
  23. package/dist/cjs/i18n/uk.js +4 -0
  24. package/dist/cjs/i18n/vi.js +4 -0
  25. package/dist/cjs/i18n/zh.js +4 -0
  26. package/dist/cjs/i18n/zh_TW.js +4 -0
  27. package/dist/cjs/messages.js +6 -0
  28. package/dist/cjs/state/actions/index.js +27 -11
  29. package/dist/cjs/state/hooks/use-resolve/index.js +28 -12
  30. package/dist/cjs/utils/analytics/SmartLinkAnalyticsContext.js +47 -0
  31. package/dist/cjs/version.json +1 -1
  32. package/dist/cjs/view/BlockCard/actions/PreviewAction.js +4 -2
  33. package/dist/cjs/view/BlockCard/index.js +3 -1
  34. package/dist/cjs/view/CardWithUrl/component.js +13 -3
  35. package/dist/cjs/view/FlexibleCard/components/actions/action/preview-action/index.js +7 -1
  36. package/dist/cjs/view/FlexibleCard/components/actions/utils.js +1 -1
  37. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +21 -2
  38. package/dist/cjs/view/HoverCard/components/views/resolved/index.js +26 -3
  39. package/dist/es2019/extractors/block/index.js +5 -4
  40. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -2
  41. package/dist/es2019/i18n/cs.js +4 -0
  42. package/dist/es2019/i18n/da.js +4 -0
  43. package/dist/es2019/i18n/de.js +4 -0
  44. package/dist/es2019/i18n/en_ZZ.js +54 -4
  45. package/dist/es2019/i18n/es.js +4 -0
  46. package/dist/es2019/i18n/fi.js +5 -0
  47. package/dist/es2019/i18n/fr.js +4 -0
  48. package/dist/es2019/i18n/hu.js +4 -0
  49. package/dist/es2019/i18n/it.js +4 -0
  50. package/dist/es2019/i18n/ja.js +4 -0
  51. package/dist/es2019/i18n/ko.js +4 -0
  52. package/dist/es2019/i18n/nb.js +4 -0
  53. package/dist/es2019/i18n/nl.js +4 -0
  54. package/dist/es2019/i18n/pl.js +4 -0
  55. package/dist/es2019/i18n/pt_BR.js +4 -0
  56. package/dist/es2019/i18n/ru.js +4 -0
  57. package/dist/es2019/i18n/sv.js +4 -0
  58. package/dist/es2019/i18n/th.js +4 -0
  59. package/dist/es2019/i18n/tr.js +4 -0
  60. package/dist/es2019/i18n/uk.js +4 -0
  61. package/dist/es2019/i18n/vi.js +4 -0
  62. package/dist/es2019/i18n/zh.js +4 -0
  63. package/dist/es2019/i18n/zh_TW.js +4 -0
  64. package/dist/es2019/messages.js +6 -0
  65. package/dist/es2019/state/actions/index.js +32 -12
  66. package/dist/es2019/state/hooks/use-resolve/index.js +28 -12
  67. package/dist/es2019/utils/analytics/SmartLinkAnalyticsContext.js +35 -0
  68. package/dist/es2019/version.json +1 -1
  69. package/dist/es2019/view/BlockCard/actions/PreviewAction.js +17 -13
  70. package/dist/es2019/view/BlockCard/index.js +3 -1
  71. package/dist/es2019/view/CardWithUrl/component.js +9 -2
  72. package/dist/es2019/view/FlexibleCard/components/actions/action/preview-action/index.js +7 -1
  73. package/dist/es2019/view/FlexibleCard/components/actions/utils.js +1 -1
  74. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +21 -2
  75. package/dist/es2019/view/HoverCard/components/views/resolved/index.js +36 -11
  76. package/dist/esm/extractors/block/index.js +5 -4
  77. package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -2
  78. package/dist/esm/i18n/cs.js +4 -0
  79. package/dist/esm/i18n/da.js +4 -0
  80. package/dist/esm/i18n/de.js +4 -0
  81. package/dist/esm/i18n/en_ZZ.js +54 -4
  82. package/dist/esm/i18n/es.js +4 -0
  83. package/dist/esm/i18n/fi.js +5 -0
  84. package/dist/esm/i18n/fr.js +4 -0
  85. package/dist/esm/i18n/hu.js +4 -0
  86. package/dist/esm/i18n/it.js +4 -0
  87. package/dist/esm/i18n/ja.js +4 -0
  88. package/dist/esm/i18n/ko.js +4 -0
  89. package/dist/esm/i18n/nb.js +4 -0
  90. package/dist/esm/i18n/nl.js +4 -0
  91. package/dist/esm/i18n/pl.js +4 -0
  92. package/dist/esm/i18n/pt_BR.js +4 -0
  93. package/dist/esm/i18n/ru.js +4 -0
  94. package/dist/esm/i18n/sv.js +4 -0
  95. package/dist/esm/i18n/th.js +4 -0
  96. package/dist/esm/i18n/tr.js +4 -0
  97. package/dist/esm/i18n/uk.js +4 -0
  98. package/dist/esm/i18n/vi.js +4 -0
  99. package/dist/esm/i18n/zh.js +4 -0
  100. package/dist/esm/i18n/zh_TW.js +4 -0
  101. package/dist/esm/messages.js +6 -0
  102. package/dist/esm/state/actions/index.js +27 -11
  103. package/dist/esm/state/hooks/use-resolve/index.js +28 -12
  104. package/dist/esm/utils/analytics/SmartLinkAnalyticsContext.js +36 -0
  105. package/dist/esm/version.json +1 -1
  106. package/dist/esm/view/BlockCard/actions/PreviewAction.js +4 -2
  107. package/dist/esm/view/BlockCard/index.js +3 -1
  108. package/dist/esm/view/CardWithUrl/component.js +11 -2
  109. package/dist/esm/view/FlexibleCard/components/actions/action/preview-action/index.js +7 -1
  110. package/dist/esm/view/FlexibleCard/components/actions/utils.js +1 -1
  111. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +21 -2
  112. package/dist/esm/view/HoverCard/components/views/resolved/index.js +26 -3
  113. package/dist/types/extractors/block/index.d.ts +2 -2
  114. package/dist/types/extractors/block/types.d.ts +1 -0
  115. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  116. package/dist/types/i18n/cs.d.ts +4 -0
  117. package/dist/types/i18n/da.d.ts +4 -0
  118. package/dist/types/i18n/de.d.ts +4 -0
  119. package/dist/types/i18n/en_ZZ.d.ts +50 -0
  120. package/dist/types/i18n/es.d.ts +4 -0
  121. package/dist/types/i18n/fi.d.ts +5 -0
  122. package/dist/types/i18n/fr.d.ts +4 -0
  123. package/dist/types/i18n/hu.d.ts +4 -0
  124. package/dist/types/i18n/it.d.ts +4 -0
  125. package/dist/types/i18n/ja.d.ts +4 -0
  126. package/dist/types/i18n/ko.d.ts +4 -0
  127. package/dist/types/i18n/nb.d.ts +4 -0
  128. package/dist/types/i18n/nl.d.ts +4 -0
  129. package/dist/types/i18n/pl.d.ts +4 -0
  130. package/dist/types/i18n/pt_BR.d.ts +4 -0
  131. package/dist/types/i18n/ru.d.ts +4 -0
  132. package/dist/types/i18n/sv.d.ts +4 -0
  133. package/dist/types/i18n/th.d.ts +4 -0
  134. package/dist/types/i18n/tr.d.ts +4 -0
  135. package/dist/types/i18n/uk.d.ts +4 -0
  136. package/dist/types/i18n/vi.d.ts +4 -0
  137. package/dist/types/i18n/zh.d.ts +4 -0
  138. package/dist/types/i18n/zh_TW.d.ts +4 -0
  139. package/dist/types/messages.d.ts +1 -1
  140. package/dist/types/utils/analytics/SmartLinkAnalyticsContext.d.ts +9 -0
  141. package/dist/types/view/BlockCard/actions/PreviewAction.d.ts +2 -1
  142. package/dist/types/view/BlockCard/views/ResolvedView.d.ts +2 -0
  143. package/dist/types/view/CardWithUrl/component.d.ts +1 -1
  144. package/dist/types/view/HoverCard/components/views/resolved/index.d.ts +1 -1
  145. package/dist/types-ts4.5/extractors/block/index.d.ts +2 -2
  146. package/dist/types-ts4.5/extractors/block/types.d.ts +1 -0
  147. package/dist/types-ts4.5/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  148. package/dist/types-ts4.5/i18n/cs.d.ts +4 -0
  149. package/dist/types-ts4.5/i18n/da.d.ts +4 -0
  150. package/dist/types-ts4.5/i18n/de.d.ts +4 -0
  151. package/dist/types-ts4.5/i18n/en_ZZ.d.ts +50 -0
  152. package/dist/types-ts4.5/i18n/es.d.ts +4 -0
  153. package/dist/types-ts4.5/i18n/fi.d.ts +5 -0
  154. package/dist/types-ts4.5/i18n/fr.d.ts +4 -0
  155. package/dist/types-ts4.5/i18n/hu.d.ts +4 -0
  156. package/dist/types-ts4.5/i18n/it.d.ts +4 -0
  157. package/dist/types-ts4.5/i18n/ja.d.ts +4 -0
  158. package/dist/types-ts4.5/i18n/ko.d.ts +4 -0
  159. package/dist/types-ts4.5/i18n/nb.d.ts +4 -0
  160. package/dist/types-ts4.5/i18n/nl.d.ts +4 -0
  161. package/dist/types-ts4.5/i18n/pl.d.ts +4 -0
  162. package/dist/types-ts4.5/i18n/pt_BR.d.ts +4 -0
  163. package/dist/types-ts4.5/i18n/ru.d.ts +4 -0
  164. package/dist/types-ts4.5/i18n/sv.d.ts +4 -0
  165. package/dist/types-ts4.5/i18n/th.d.ts +4 -0
  166. package/dist/types-ts4.5/i18n/tr.d.ts +4 -0
  167. package/dist/types-ts4.5/i18n/uk.d.ts +4 -0
  168. package/dist/types-ts4.5/i18n/vi.d.ts +4 -0
  169. package/dist/types-ts4.5/i18n/zh.d.ts +4 -0
  170. package/dist/types-ts4.5/i18n/zh_TW.d.ts +4 -0
  171. package/dist/types-ts4.5/messages.d.ts +1 -1
  172. package/dist/types-ts4.5/utils/analytics/SmartLinkAnalyticsContext.d.ts +9 -0
  173. package/dist/types-ts4.5/view/BlockCard/actions/PreviewAction.d.ts +2 -1
  174. package/dist/types-ts4.5/view/BlockCard/views/ResolvedView.d.ts +2 -0
  175. package/dist/types-ts4.5/view/CardWithUrl/component.d.ts +1 -1
  176. package/dist/types-ts4.5/view/HoverCard/components/views/resolved/index.d.ts +1 -1
  177. package/package.json +11 -3
  178. package/tmp/api-report-tmp.d.ts +0 -909
@@ -1,7 +1,9 @@
1
1
  import { useCallback } from 'react';
2
+ import { unstable_batchedUpdates } from 'react-dom';
2
3
  import { addMetadataToExperience } from '../../analytics';
3
4
  import { getStatus } from '../../helpers';
4
5
  import { ACTION_ERROR, ACTION_ERROR_FALLBACK, ACTION_RELOADING, ACTION_RESOLVED, ACTION_UPDATE_METADATA_STATUS, APIError, cardAction } from '@atlaskit/linking-common';
6
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
5
7
  import { ERROR_MESSAGE_FATAL, ERROR_MESSAGE_METADATA, ERROR_MESSAGE_OAUTH } from '../../actions/constants';
6
8
  import { getUnauthorizedJsonLd } from '../../../utils/jsonld';
7
9
  import { SmartLinkStatus } from '../../../constants';
@@ -75,6 +77,20 @@ const useResolve = () => {
75
77
  }
76
78
  }
77
79
  }, [getState, setMetadataStatus, dispatch]);
80
+ const handleResolvedLinkSuccess = useCallback((resourceUrl, response, isReloading, isMetadataRequest) => {
81
+ //if a link resolves normally, metadata will also always be resolved
82
+ setMetadataStatus(resourceUrl, 'resolved');
83
+ // Dispatch Analytics and resolved card action - including unauthorized states.
84
+ if (isReloading) {
85
+ dispatch(cardAction(ACTION_RELOADING, {
86
+ url: resourceUrl
87
+ }, response));
88
+ } else {
89
+ dispatch(cardAction(ACTION_RESOLVED, {
90
+ url: resourceUrl
91
+ }, response, undefined, undefined, isMetadataRequest));
92
+ }
93
+ }, [setMetadataStatus, dispatch]);
78
94
  const handleResolvedLinkResponse = useCallback((resourceUrl, response, isReloading = false, isMetadataRequest) => {
79
95
  const hostname = new URL(resourceUrl).hostname;
80
96
  const nextStatus = response ? getStatus(response) : 'fatal';
@@ -97,20 +113,20 @@ const useResolve = () => {
97
113
  handleResolvedLinkError(resourceUrl, new APIError('error', hostname, ERROR_MESSAGE_METADATA), response, isMetadataRequest);
98
114
  return;
99
115
  }
100
-
101
- //if a link resolves normally, metadata will also always be resolved
102
- setMetadataStatus(resourceUrl, 'resolved');
103
- // Dispatch Analytics and resolved card action - including unauthorized states.
104
- if (isReloading) {
105
- dispatch(cardAction(ACTION_RELOADING, {
106
- url: resourceUrl
107
- }, response));
116
+ if (getBooleanFF('platform.linking-platform.smart-card.enable-analytics-context')) {
117
+ /**
118
+ * Using unstable_batchedUpdates because this store update happens async and trigers a rerender
119
+ * more info:
120
+ * https://github.com/facebook/react/blob/v18.2.0/packages/use-sync-external-store/src/useSyncExternalStoreShimClient.js#L113
121
+ * https://react-redux.js.org/api/batch
122
+ */
123
+ unstable_batchedUpdates(() => {
124
+ handleResolvedLinkSuccess(resourceUrl, response, isReloading, isMetadataRequest);
125
+ });
108
126
  } else {
109
- dispatch(cardAction(ACTION_RESOLVED, {
110
- url: resourceUrl
111
- }, response, undefined, undefined, isMetadataRequest));
127
+ handleResolvedLinkSuccess(resourceUrl, response, isReloading, isMetadataRequest);
112
128
  }
113
- }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported, setMetadataStatus]);
129
+ }, [handleResolvedLinkError, handleResolvedLinkSuccess, hasAuthFlowSupported]);
114
130
  return useCallback(async (url, isReloading = false, isMetadataRequest = false, id = '') => {
115
131
  const {
116
132
  details
@@ -0,0 +1,35 @@
1
+ import React, { useMemo } from 'react';
2
+ import { AnalyticsContext } from '@atlaskit/analytics-next';
3
+ import { getResolvedAttributes, getUrlAttributes } from '@atlaskit/link-analytics/resolved-attributes';
4
+ import { isFlexibleUiCard } from '../flexible';
5
+ import { CardDisplay } from '../../constants';
6
+ import { useSmartCardState as useSmartLinkState } from '../../state/store';
7
+ export const SmartLinkAnalyticsContext = ({
8
+ children,
9
+ url,
10
+ appearance,
11
+ id
12
+ }) => {
13
+ const {
14
+ details,
15
+ status
16
+ } = useSmartLinkState(url);
17
+ const resolvedAttributes = getResolvedAttributes({
18
+ url
19
+ }, details, status);
20
+ const {
21
+ urlHash
22
+ } = getUrlAttributes(url);
23
+ const isFlexibleUi = useMemo(() => isFlexibleUiCard(children), [children]);
24
+ const display = isFlexibleUi ? CardDisplay.Flexible : appearance;
25
+ return /*#__PURE__*/React.createElement(AnalyticsContext, {
26
+ data: {
27
+ attributes: {
28
+ ...resolvedAttributes,
29
+ urlHash,
30
+ display,
31
+ id
32
+ }
33
+ }
34
+ }, children);
35
+ };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.2.0",
3
+ "version": "26.2.2",
4
4
  "sideEffects": false
5
5
  }
@@ -49,17 +49,21 @@ However src, details, icon, title, and providerName are STRONGLY encouraged
49
49
 
50
50
  export default (({
51
51
  details,
52
+ enableImprovedPreviewAction,
52
53
  ...rest
53
- }) => ({
54
- id: 'preview-content',
55
- text: /*#__PURE__*/React.createElement(FormattedMessage, messages.preview),
56
- promise: props => previewFunction({
57
- popupMountPointId: 'twp-editor-preview-iframe',
58
- providerName: 'Preview',
59
- showModal: true,
60
- iframeName: 'twp-editor-preview-iframe',
61
- onClose: () => {},
62
- ...props,
63
- ...rest
64
- })
65
- }));
54
+ }) => {
55
+ const previewText = enableImprovedPreviewAction ? messages.preview_improved : messages.preview;
56
+ return {
57
+ id: 'preview-content',
58
+ text: /*#__PURE__*/React.createElement(FormattedMessage, previewText),
59
+ promise: props => previewFunction({
60
+ popupMountPointId: 'twp-editor-preview-iframe',
61
+ providerName: 'Preview',
62
+ showModal: true,
63
+ iframeName: 'twp-editor-preview-iframe',
64
+ onClose: () => {},
65
+ ...props,
66
+ ...rest
67
+ })
68
+ };
69
+ });
@@ -22,6 +22,7 @@ import FlexibleForbiddenView from './views/flexible/FlexibleForbiddenView';
22
22
  import { tokens } from '../../utils/token';
23
23
  import { css, jsx } from '@emotion/react';
24
24
  import { handleClickCommon } from './utils/handlers';
25
+ import { useFeatureFlag } from '@atlaskit/link-provider';
25
26
  export { default as PreviewAction } from './actions/PreviewAction';
26
27
  export { ForbiddenAction, AuthorizeAction, BlockCardResolvedView, BlockCardResolvingView, BlockCardUnauthorisedView, BlockCardForbiddenView, BlockCardErroredView, BlockCardNotFoundView };
27
28
  const flexibleBlockCardElevationStyle = css`
@@ -63,6 +64,7 @@ export const BlockCard = ({
63
64
  handleInvoke,
64
65
  extensionKey
65
66
  };
67
+ const enableImprovedPreviewAction = Boolean(useFeatureFlag('enableImprovedPreviewAction'));
66
68
  if (enableFlexibleBlockCard) {
67
69
  const ui = {
68
70
  hideElevation: true
@@ -143,7 +145,7 @@ export const BlockCard = ({
143
145
  isSelected: isSelected
144
146
  });
145
147
  case 'resolved':
146
- const resolvedViewProps = extractBlockProps(data, meta, extractorOpts, renderers, platform);
148
+ const resolvedViewProps = extractBlockProps(data, meta, extractorOpts, renderers, platform, enableImprovedPreviewAction);
147
149
  if (onResolve) {
148
150
  onResolve({
149
151
  title: resolvedViewProps.title,
@@ -1,6 +1,7 @@
1
1
  import React, { useEffect, useCallback, useMemo } from 'react';
2
2
  import { useAnalyticsEvents } from '@atlaskit/analytics-next';
3
3
  import { useFeatureFlag } from '@atlaskit/link-provider';
4
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
4
5
  import { isSpecialEvent } from '../../utils';
5
6
  import * as measure from '../../utils/performance';
6
7
  import { getDefinitionId, getServices, isFinalState, getClickUrl, getResourceType, getExtensionKey, getSubproduct, getProduct } from '../../state/helpers';
@@ -12,7 +13,8 @@ import { isFlexibleUiCard } from '../../utils/flexible';
12
13
  import FlexibleCard from '../FlexibleCard';
13
14
  import { CardDisplay } from '../../constants';
14
15
  import { fireLinkClickedEvent } from '../../utils/analytics/click';
15
- export function CardWithUrlContent({
16
+ import { SmartLinkAnalyticsContext } from '../../utils/analytics/SmartLinkAnalyticsContext';
17
+ function Component({
16
18
  id,
17
19
  url,
18
20
  isSelected,
@@ -255,4 +257,9 @@ export function CardWithUrlContent({
255
257
  onIframeFocus: onIframeFocus
256
258
  });
257
259
  }
258
- }
260
+ }
261
+ export const CardWithUrlContent = props => getBooleanFF('platform.linking-platform.smart-card.enable-analytics-context') ? /*#__PURE__*/React.createElement(SmartLinkAnalyticsContext, {
262
+ url: props.url,
263
+ appearance: props.appearance,
264
+ id: props.id
265
+ }, /*#__PURE__*/React.createElement(Component, props)) : /*#__PURE__*/React.createElement(Component, props);
@@ -4,6 +4,9 @@ import Action from '../index';
4
4
  import { useFlexibleUiAnalyticsContext } from '../../../../../../state/flexible-ui-context';
5
5
  import { useSmartLinkAnalytics } from '../../../../../../state';
6
6
  import { openPreviewModal } from '../../../../../EmbedModal/utils';
7
+ import { FormattedMessage } from 'react-intl-next';
8
+ import { messages } from '../../../../../../messages';
9
+ import { useFeatureFlag } from '@atlaskit/link-provider';
7
10
  const PreviewAction = props => {
8
11
  const {
9
12
  appearance,
@@ -20,6 +23,8 @@ const PreviewAction = props => {
20
23
  } = props;
21
24
  const defaultAnalytics = useSmartLinkAnalytics(url, () => {});
22
25
  const analytics = useFlexibleUiAnalyticsContext() || defaultAnalytics;
26
+ const enableImprovedPreviewAction = Boolean(useFeatureFlag('enableImprovedPreviewAction'));
27
+ const previewText = enableImprovedPreviewAction ? messages.preview_improved : messages.preview;
23
28
  if (src && url) {
24
29
  const embedModal = () => openPreviewModal({
25
30
  title,
@@ -37,7 +42,8 @@ const PreviewAction = props => {
37
42
  if (onClick) {
38
43
  onClick();
39
44
  }
40
- }
45
+ },
46
+ content: /*#__PURE__*/React.createElement(FormattedMessage, previewText)
41
47
  };
42
48
  return /*#__PURE__*/React.createElement(Action, _extends({}, action, {
43
49
  appearance: appearance,
@@ -46,7 +46,7 @@ const actionMappings = {
46
46
  testId: 'smart-action-preview-action',
47
47
  content: /*#__PURE__*/React.createElement(FormattedMessage, messages.preview),
48
48
  icon: /*#__PURE__*/React.createElement(VidFullScreenOnIcon, {
49
- label: "Full screen view"
49
+ label: "Open preview"
50
50
  }),
51
51
  tooltipMessage: /*#__PURE__*/React.createElement(FormattedMessage, messages.preview)
52
52
  }
@@ -1,5 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  /** @jsx jsx */
3
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
3
4
  import Popup from '@atlaskit/popup';
4
5
  import { jsx } from '@emotion/react';
5
6
  import React, { useCallback, useMemo, useRef } from 'react';
@@ -9,9 +10,11 @@ import { useSmartCardState as useLinkState } from '../../../state/store';
9
10
  import HoverCardContent from '../components/HoverCardContent';
10
11
  import { CARD_GAP_PX, HOVER_CARD_Z_INDEX } from '../styled';
11
12
  import { CardDisplay } from '../../../constants';
13
+ import { SmartLinkAnalyticsContext } from '../../../utils/analytics/SmartLinkAnalyticsContext';
12
14
  export const HoverCardComponent = ({
13
15
  children,
14
16
  url,
17
+ id,
15
18
  analyticsHandler,
16
19
  analytics,
17
20
  canOpen = true,
@@ -112,7 +115,23 @@ export const HoverCardComponent = ({
112
115
  }, [closeOnChildClick, hideCard]);
113
116
  const content = useCallback(({
114
117
  update
115
- }) => jsx(HoverCardContent, {
118
+ }) => getBooleanFF('platform.linking-platform.smart-card.enable-analytics-context') ? jsx(SmartLinkAnalyticsContext, {
119
+ url: url,
120
+ appearance: CardDisplay.HoverCardPreview,
121
+ id: id
122
+ }, jsx(HoverCardContent, {
123
+ onMouseEnter: initShowCard,
124
+ onMouseLeave: initHideCard,
125
+ analytics: analytics,
126
+ cardActions: filteredActions,
127
+ cardState: linkState,
128
+ onActionClick: onActionClick,
129
+ onResolve: update,
130
+ renderers: renderers,
131
+ showServerActions: showServerActions,
132
+ url: url,
133
+ id: id
134
+ })) : jsx(HoverCardContent, {
116
135
  onMouseEnter: initShowCard,
117
136
  onMouseLeave: initHideCard,
118
137
  analytics: analytics,
@@ -123,7 +142,7 @@ export const HoverCardComponent = ({
123
142
  renderers: renderers,
124
143
  showServerActions: showServerActions,
125
144
  url: url
126
- }), [analytics, initHideCard, initShowCard, filteredActions, linkState, onActionClick, renderers, showServerActions, url]);
145
+ }), [analytics, initHideCard, initShowCard, filteredActions, linkState, onActionClick, renderers, showServerActions, url, id]);
127
146
  const trigger = useCallback(triggerProps => jsx("span", {
128
147
  ref: parentSpan
129
148
  }, jsx("span", _extends({}, triggerProps, {
@@ -8,17 +8,41 @@ import FlexibleCard from '../../../../FlexibleCard';
8
8
  import { getSimulatedMetadata, toActionableMetadata } from '../../../utils';
9
9
  import SnippetOrPreview from '../../SnippetOrPreview';
10
10
  import { extractMetadata } from '../../../../../extractors/hover/extractMetadata';
11
- export const toFooterActions = (cardActions, onActionClick) => cardActions.map(action => ({
12
- content: action.text,
13
- name: ActionName.CustomAction,
14
- onClick: () => {
15
- if (onActionClick) {
16
- onActionClick(action.id);
11
+ import { messages } from '../../../../../messages';
12
+ import { FormattedMessage } from 'react-intl-next';
13
+ export const toFooterActions = (cardActions, onActionClick, enableImprovedPreviewAction) => {
14
+ const appearance = enableImprovedPreviewAction ? {
15
+ appearance: 'primary'
16
+ } : undefined;
17
+ const previewText = enableImprovedPreviewAction ? messages.preview_improved : messages.preview;
18
+ return cardActions.map(action => {
19
+ if (action.id === 'preview-content') {
20
+ return {
21
+ content: /*#__PURE__*/React.createElement(FormattedMessage, previewText),
22
+ name: ActionName.CustomAction,
23
+ onClick: () => {
24
+ if (onActionClick) {
25
+ onActionClick(action.id);
26
+ }
27
+ return action.invoke();
28
+ },
29
+ testId: action.id,
30
+ ...appearance
31
+ };
17
32
  }
18
- return action.invoke();
19
- },
20
- testId: action.id
21
- }));
33
+ return {
34
+ content: action.text,
35
+ name: ActionName.CustomAction,
36
+ onClick: () => {
37
+ if (onActionClick) {
38
+ onActionClick(action.id);
39
+ }
40
+ return action.invoke();
41
+ },
42
+ testId: action.id
43
+ };
44
+ });
45
+ };
22
46
  const HoverCardResolvedView = ({
23
47
  flexibleCardProps,
24
48
  titleBlockProps,
@@ -32,6 +56,7 @@ const HoverCardResolvedView = ({
32
56
  }) => {
33
57
  var _cardState$details;
34
58
  const showActionableElement = useFeatureFlag('enableActionableElement');
59
+ const enableImprovedPreviewAction = useFeatureFlag('enableImprovedPreviewAction');
35
60
  useEffect(() => {
36
61
  // Since this hover view is only rendered on resolved status,
37
62
  // there is no need to check for statuses.
@@ -40,7 +65,7 @@ const HoverCardResolvedView = ({
40
65
  status: cardState.status
41
66
  });
42
67
  }, [analytics.ui, cardState.status]);
43
- const footerActions = useMemo(() => toFooterActions(cardActions, onActionClick), [cardActions, onActionClick]);
68
+ const footerActions = useMemo(() => toFooterActions(cardActions, onActionClick, Boolean(enableImprovedPreviewAction)), [cardActions, onActionClick, enableImprovedPreviewAction]);
44
69
  const data = (_cardState$details = cardState.details) === null || _cardState$details === void 0 ? void 0 : _cardState$details.data;
45
70
  const {
46
71
  primary,
@@ -28,7 +28,7 @@ var extractBlockDetails = function extractBlockDetails(jsonLd) {
28
28
  return !!detail;
29
29
  });
30
30
  };
31
- export var extractBlockActions = function extractBlockActions(props, jsonLd, opts, platform, meta) {
31
+ export var extractBlockActions = function extractBlockActions(props, jsonLd, opts, platform, meta, enableImprovedPreviewAction) {
32
32
  if (opts) {
33
33
  var handleInvoke = opts.handleInvoke;
34
34
  var actions = extractActions(jsonLd, handleInvoke);
@@ -36,7 +36,8 @@ export var extractBlockActions = function extractBlockActions(props, jsonLd, opt
36
36
  viewProps: props,
37
37
  jsonLd: jsonLd,
38
38
  platform: platform,
39
- meta: meta
39
+ meta: meta,
40
+ enableImprovedPreviewAction: enableImprovedPreviewAction
40
41
  }));
41
42
 
42
43
  // The previewAction should always be the last action
@@ -67,7 +68,7 @@ export var extractBlockUsers = function extractBlockUsers(jsonLd) {
67
68
  return updatedByMembers || createdByMembers;
68
69
  }
69
70
  };
70
- export var extractBlockProps = function extractBlockProps(jsonLd, meta, opts, renderers, platform) {
71
+ export var extractBlockProps = function extractBlockProps(jsonLd, meta, opts, renderers, platform, enableImprovedPreviewAction) {
71
72
  var props = {
72
73
  link: extractLink(jsonLd),
73
74
  title: extractTitle(jsonLd),
@@ -83,6 +84,6 @@ export var extractBlockProps = function extractBlockProps(jsonLd, meta, opts, re
83
84
  isTrusted: extractIsTrusted(meta)
84
85
  };
85
86
  return _objectSpread(_objectSpread({}, props), {}, {
86
- actions: extractBlockActions(props, jsonLd, opts, platform, meta)
87
+ actions: extractBlockActions(props, jsonLd, opts, platform, meta, enableImprovedPreviewAction)
87
88
  });
88
89
  };
@@ -57,7 +57,8 @@ export var extractPreviewAction = function extractPreviewAction(_ref) {
57
57
  _ref$source = _ref.source,
58
58
  source = _ref$source === void 0 ? 'block' : _ref$source,
59
59
  analytics = _ref.analytics,
60
- meta = _ref.meta;
60
+ meta = _ref.meta,
61
+ enableImprovedPreviewAction = _ref.enableImprovedPreviewAction;
61
62
  // Extract metadata from view props & raw JSON-LD.
62
63
  var metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
63
64
  var metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
@@ -76,7 +77,8 @@ export var extractPreviewAction = function extractPreviewAction(_ref) {
76
77
  onViewActionClick: function onViewActionClick() {
77
78
  handleInvoke(getInvokeOpts(key, 'ViewAction'));
78
79
  },
79
- isSupportTheming: extractIsSupportTheming(meta)
80
+ isSupportTheming: extractIsSupportTheming(meta),
81
+ enableImprovedPreviewAction: enableImprovedPreviewAction
80
82
  }));
81
83
  // Setup props to go through proper Redux 'invocation' flow
82
84
  // for analytics, further state management if required in future.
@@ -47,6 +47,7 @@ export default {
47
47
  'fabric.linking.more_actions': 'Další akce',
48
48
  'fabric.linking.not_found_description': 'Odkaz se nepodařilo najít. Zkontrolujte adresu URL a zkuste ji upravit nebo vložit znovu.',
49
49
  'fabric.linking.not_found_title': 'Jejda. Tento odkaz se nepodařilo najít.',
50
+ 'fabric.linking.open_issue_in_jira': 'Otevřít požadavek v Jira',
50
51
  'fabric.linking.open_link_in_a_new_tab': 'Otevřít odkaz na nové kartě',
51
52
  'fabric.linking.owned_by': 'Vlastník: {context}',
52
53
  'fabric.linking.pending_request': 'Vaše žádost o přístup čeká na vyřízení.',
@@ -77,6 +78,9 @@ export default {
77
78
  'fabric.linking.save': 'Uložit',
78
79
  'fabric.linking.srclink': 'Zobrazit v',
79
80
  'fabric.linking.srclinkunknown': 'Zobrazit originál',
81
+ 'fabric.linking.status_change_load_error': 'Načtení stavů a přechodů se nezdařilo',
82
+ 'fabric.linking.status_change_permission_error': 'K provedení přechodu tohoto požadavku nemáte oprávnění.',
83
+ 'fabric.linking.status_change_update_error': 'Aktualizace stavu se nezdařila',
80
84
  'fabric.linking.try_again': 'Zkusit znovu',
81
85
  'fabric.linking.try_another_account': 'Zkuste jiný účet',
82
86
  'fabric.linking.unlink_account': 'Odpojit účet',
@@ -47,6 +47,7 @@ export default {
47
47
  'fabric.linking.more_actions': 'Flere handlinger',
48
48
  'fabric.linking.not_found_description': 'Vi kunne ikke finde linket. Kontrollér og rediger URL-adressen, eller indsæt den igen.',
49
49
  'fabric.linking.not_found_title': 'Ups. Vi kan ikke finde dette link!',
50
+ 'fabric.linking.open_issue_in_jira': 'Åbn sag i Jira',
50
51
  'fabric.linking.open_link_in_a_new_tab': 'Åbn link i en ny fane',
51
52
  'fabric.linking.owned_by': 'Ejet af {context}',
52
53
  'fabric.linking.pending_request': 'Din anmodning om adgang afventer behandling',
@@ -77,6 +78,9 @@ export default {
77
78
  'fabric.linking.save': 'Gem',
78
79
  'fabric.linking.srclink': 'Vis i',
79
80
  'fabric.linking.srclinkunknown': 'Vis original',
81
+ 'fabric.linking.status_change_load_error': 'Vi kunne ikke indlæse statusser og overførsler',
82
+ 'fabric.linking.status_change_permission_error': 'Du har ikke tilladelse til at overføre denne sag.',
83
+ 'fabric.linking.status_change_update_error': 'Vi kunne ikke opdatere statussen',
80
84
  'fabric.linking.try_again': 'Prøv igen',
81
85
  'fabric.linking.try_another_account': 'Prøv en anden konto',
82
86
  'fabric.linking.unlink_account': 'Fjern link til konto',
@@ -47,6 +47,7 @@ export default {
47
47
  'fabric.linking.more_actions': 'Weitere Aktionen',
48
48
  'fabric.linking.not_found_description': 'Der Link konnte nicht gefunden werden. Überprüfen Sie die URL und versuchen Sie die Bearbeitung oder das Einfügen erneut.',
49
49
  'fabric.linking.not_found_title': 'Oh! Diese Verknüpfung konnte nicht gefunden werden!',
50
+ 'fabric.linking.open_issue_in_jira': 'Vorgang in Jira öffnen',
50
51
  'fabric.linking.open_link_in_a_new_tab': 'Link in neuer Registerkarte öffnen',
51
52
  'fabric.linking.owned_by': 'Besitzer: {context}',
52
53
  'fabric.linking.pending_request': 'Ihre Zugriffsanfrage ist ausstehend.',
@@ -77,6 +78,9 @@ export default {
77
78
  'fabric.linking.save': 'Speichern',
78
79
  'fabric.linking.srclink': 'Anzeigen in',
79
80
  'fabric.linking.srclinkunknown': 'Original anzeigen',
81
+ 'fabric.linking.status_change_load_error': 'Status und Übergänge konnten nicht geladen werden',
82
+ 'fabric.linking.status_change_permission_error': 'Sie sind nicht berechtigt, diesen Vorgang weiterzugeben.',
83
+ 'fabric.linking.status_change_update_error': 'Der Status konnte nicht aktualisiert werden',
80
84
  'fabric.linking.try_again': 'Versuchen Sie es erneut.',
81
85
  'fabric.linking.try_another_account': 'Versuchen Sie es mit einem anderen Konto erneut.',
82
86
  'fabric.linking.unlink_account': 'Kontoverknüpfung löschen',
@@ -7,21 +7,54 @@
7
7
  */
8
8
  //
9
9
  export default {
10
+ 'fabric.linking.actions': '⁣⁢Actions؜‌‌⁠‌⁡‌‌؜⁣⁤',
11
+ 'fabric.linking.add_account': '⁣⁢Add account‌‍‌⁡⁠⁠‌‌⁡‌⁠⁣⁤',
12
+ 'fabric.linking.cancel': '⁣⁢Cancel؜⁡‌‌؜⁡‌‌⁠‍‍‍⁣⁤',
10
13
  'fabric.linking.cannot_connect': "⁣⁢Can't connect, try again‌‍‍⁡؜؜⁡‌⁡⁣⁤",
11
14
  'fabric.linking.cannot_find_link': "⁣⁢Can't find link⁡‌‌‌‌⁡‍⁡⁣⁤",
12
- 'fabric.linking.click_to_join': '⁣⁢Join {context} to view this issue‌⁡؜⁡⁠⁠⁣⁤',
15
+ 'fabric.linking.check_this_link': '⁣⁢Check this link‌‌؜‌⁡⁠؜⁡‌‍؜⁣⁤',
16
+ 'fabric.linking.click_to_join': '⁣⁢Join {context}؜⁠⁠‌⁠‍؜‌⁠‍⁣⁤',
17
+ 'fabric.linking.click_to_join_description': "⁣⁢You've been approved, so you can join {context} right away.‌‌؜⁠⁠⁡‌⁡⁡⁣⁤",
18
+ 'fabric.linking.close': '⁣⁢Close⁠‍؜⁡⁡‍‍⁠؜⁣⁤',
19
+ 'fabric.linking.connect_account_description': "⁣⁢We'll open a new page to help you connect your {name} account⁠⁠⁡‌⁠؜⁠‍‍⁣⁤",
13
20
  'fabric.linking.connect_link_account': '⁣⁢Connect to preview‌‍‍‍⁠‍⁠‌⁡‌‍‍⁣⁤',
21
+ 'fabric.linking.connect_link_account_card_view': '⁣⁢Connect⁡؜⁠‍‍⁣⁤',
22
+ 'fabric.linking.connect_link_account_card_view_description': '⁣⁢To show a preview of this link, connect your {context} account.‌‍‍‌‍‍‍؜‌؜⁣⁤',
23
+ 'fabric.linking.connect_link_account_card_view_name': '⁣⁢Connect your {context} account‍؜⁡‌⁠⁡؜‍‍⁠⁡⁠‌⁣⁤',
24
+ 'fabric.linking.connect_to': '⁣⁢Connect to {name}؜‌؜⁡‌؜‍⁡‌‍⁣⁤',
25
+ 'fabric.linking.connect_unauthorised_account_action': '⁣⁢Connect to {context}‌⁠⁠⁡‌؜‌؜⁣⁤',
26
+ 'fabric.linking.connect_unauthorised_account_description': '⁣⁢Connect to Atlassian to view more details of your work and collaborate from one place.⁠⁡؜⁡؜⁡⁡‌؜‍؜‌‍⁣⁤',
27
+ 'fabric.linking.continue': '⁣⁢Continue‌؜⁡؜⁠⁡⁠‌؜⁠⁣⁤',
28
+ 'fabric.linking.copy_url_to_clipboard': '⁣⁢Copy link⁡‍⁠‍‌‍⁡⁠⁣⁤',
29
+ 'fabric.linking.couldnt_load_link': "⁣⁢We couldn't load this link for an unknown reason.؜‍⁡⁡؜‌‌؜⁡؜⁣⁤",
14
30
  'fabric.linking.create_on_absolute': '⁣⁢Created on {context}‍؜⁠؜‍⁠؜؜؜؜⁣⁤',
15
31
  'fabric.linking.create_on_relative': '⁣⁢Created {context}؜؜‌‌‌⁡⁠؜⁣⁤',
16
32
  'fabric.linking.created_by': '⁣⁢Created by {context}⁠‌؜‍؜‍⁠⁡؜؜⁡⁣⁤',
17
33
  'fabric.linking.delete': '⁣⁢Delete‍⁡؜؜‍؜⁡‌⁠⁠⁣⁤',
34
+ 'fabric.linking.download': '⁣⁢Download‌‍‍؜⁠؜⁡⁡‍⁣⁤',
18
35
  'fabric.linking.edit': '⁣⁢Edit‌⁠⁠‍؜‌⁡‍‍⁠⁣⁤',
19
36
  'fabric.linking.forbidden_access': '⁣⁢Your access is forbidden؜‌⁠؜⁡‌؜⁠‌‍‌⁣⁤',
20
- 'fabric.linking.invalid_permissions': '⁣⁢Restricted link, try another account‍⁠⁠؜‌؜⁡‌⁡‍‍⁡⁣⁤',
37
+ 'fabric.linking.forbidden_description': '⁣⁢You don’t have access to this preview. Contact the site admin if you need access.‍⁠‍‍⁠؜‌‌⁣⁤',
38
+ 'fabric.linking.go_back': '⁣⁢Go back‌‍‌‌‍⁡؜⁡؜‌‍⁣⁤',
39
+ 'fabric.linking.invalid_permissions': '⁣⁢Restricted content‌⁡‌؜⁠⁡؜‍⁡⁣⁤',
40
+ 'fabric.linking.invalid_permissions_description': "⁣⁢You'll need to request access or try a different account to view this preview.⁠‌‍‌⁡⁠؜؜⁠؜؜⁣⁤",
41
+ 'fabric.linking.join_to_view': '⁣⁢Join {context} to view this issue⁠‍‌⁠؜⁠⁡‌⁣⁤',
42
+ 'fabric.linking.learn_more_about_smart_links': '⁣⁢Learn more about Smart Links.⁡‌⁡‌؜⁠⁡‍‌⁠⁡؜‌⁡⁣⁤',
43
+ 'fabric.linking.link_safety_warning_message': '⁣⁢The link {unsafeLinkText} is taking you to a different site, <a>actual link here</a>؜‌؜‍⁠‍‌⁣⁤',
44
+ 'fabric.linking.loading': '⁣⁢Loading...‍‍‌⁠⁠؜‌⁡‌‍‍‌⁣⁤',
21
45
  'fabric.linking.modified_on_absolute': '⁣⁢Updated on {context}⁡⁠‌؜‌؜⁠⁠؜⁣⁤',
22
46
  'fabric.linking.modified_on_relative': '⁣⁢Updated {context}⁠‌؜‍‌؜‌؜⁠‌⁣⁤',
23
47
  'fabric.linking.more_actions': '⁣⁢More actions‌⁡‌‌‌‍⁠‍⁡؜‌⁣⁤',
48
+ 'fabric.linking.not_found_description': "⁣⁢We couldn't find the link. Check the url and try editing or paste again.؜⁠‍⁠⁠‍؜‌⁠؜⁠‍‍؜⁠⁡⁠⁡⁣⁤",
49
+ 'fabric.linking.not_found_title': "⁣⁢Uh oh. We can't find this link!؜⁠‍⁠‍؜؜⁡‍‍‍⁣⁤",
50
+ 'fabric.linking.open_issue_in_jira': '⁣⁢Open issue in Jira‍؜⁠؜؜‍‌‍⁠⁣⁤',
51
+ 'fabric.linking.open_link_in_a_new_tab': '⁣⁢Open link in a new tab؜⁡‍‍⁠⁡‍‌⁣⁤',
52
+ 'fabric.linking.owned_by': '⁣⁢Owned by {context}⁠‍‍⁣⁤',
24
53
  'fabric.linking.pending_request': '⁣⁢Your access request is pending⁡⁠‌⁠⁣⁤',
54
+ 'fabric.linking.preview': '⁣⁢Full screen view‍‍‌‌‍؜⁡‌؜⁡‌⁡‌؜‌⁣⁤',
55
+ 'fabric.linking.preview_close': '⁣⁢Close preview⁡‍‍‍‌‌‍؜‌؜⁠⁣⁤',
56
+ 'fabric.linking.preview_max_size': '⁣⁢View full screen‌؜‍‍‌‍⁣⁤',
57
+ 'fabric.linking.preview_min_size': '⁣⁢Close full screen⁠⁠‍⁡⁠⁠‌‌⁣⁤',
25
58
  'fabric.linking.priority_blocker': '⁣⁢Blocker‌⁠‍⁠‍‌‍‍⁣⁤',
26
59
  'fabric.linking.priority_critical': '⁣⁢Critical؜‍‌⁠⁠؜⁠‌‌‍‍؜؜⁡⁣⁤',
27
60
  'fabric.linking.priority_high': '⁣⁢High‍⁠⁠‌؜‍⁡‍⁠⁣⁤',
@@ -33,7 +66,24 @@ export default {
33
66
  'fabric.linking.priority_minor': '⁣⁢Minor⁠⁠‍؜‍⁠⁣⁤',
34
67
  'fabric.linking.priority_trivial': '⁣⁢Trivial⁡‌⁠؜؜‍؜⁡⁡⁠⁡⁡⁡⁣⁤',
35
68
  'fabric.linking.priority_undefined': '⁣⁢Undefined⁠⁡⁡؜‌⁡⁠‍⁠⁡⁠⁣⁤',
36
- 'fabric.linking.request_access': '⁣⁢Request access to {context} to view this issue⁠⁠⁠‌‌‌‌؜⁡‌⁣⁤',
69
+ 'fabric.linking.request_access': '⁣⁢Request access؜‌؜‌‍‌‌⁠⁡⁣⁤',
70
+ 'fabric.linking.request_access_description': '⁣⁢Request access to {context} view this preview.؜‌‌⁡‌‍‌‍⁣⁤',
71
+ 'fabric.linking.request_access_pending': '⁣⁢Access pending؜؜⁠؜؜؜⁠‌‍؜؜‌؜⁣⁤',
72
+ 'fabric.linking.request_access_pending_description': '⁣⁢Your access request is pending.‌⁠⁡⁠‍؜⁡‍؜‍؜؜‌⁣⁤',
73
+ 'fabric.linking.request_access_to_view': '⁣⁢Request access to {context} to view this issue؜⁠⁡⁡‍⁡⁠‍⁣⁤',
37
74
  'fabric.linking.request_denied': '⁣⁢Your access request was denied؜‌⁡⁠‍⁡؜⁡‌‍⁣⁤',
38
- 'fabric.linking.updated_by': '⁣⁢Modified by {context}؜⁠‍‍⁡⁡‌⁡‌⁣⁤'
75
+ 'fabric.linking.request_denied_description': '⁣⁢Your access request was denied. Contact the site admin if you still need access.⁡⁡⁠⁡‌⁡‍؜⁡‌⁡؜؜⁣⁤',
76
+ 'fabric.linking.restricted_link': '⁣⁢Restricted link, try another account؜‌‍⁡⁠‌‌‌⁡‍⁣⁤',
77
+ 'fabric.linking.retry': '⁣⁢Retry؜‌⁠⁠‍⁠‍⁣⁤',
78
+ 'fabric.linking.save': '⁣⁢Save⁠‌‍‌⁠⁠؜⁠⁠؜⁣⁤',
79
+ 'fabric.linking.srclink': '⁣⁢View in؜‌‌⁡‍؜⁠‌⁠‌؜‌‍؜⁣⁤',
80
+ 'fabric.linking.srclinkunknown': '⁣⁢View Original؜‌‌⁡⁡‍⁠⁠⁡‌‍‍؜‌⁡⁣⁤',
81
+ 'fabric.linking.status_change_load_error': '⁣⁢We couldn’t load the statuses and transitions⁠⁡‍؜⁡‍⁠⁣⁤',
82
+ 'fabric.linking.status_change_permission_error': '⁣⁢You don’t have permission to transition this issue.⁡‍⁠‌‍‌؜؜⁣⁤',
83
+ 'fabric.linking.status_change_update_error': '⁣⁢We couldn’t update the status⁠‌⁠‍⁠‍‍⁡⁠‍‌⁠⁡‌‍⁣⁤',
84
+ 'fabric.linking.try_again': '⁣⁢Try again؜؜؜⁠‍⁠‌⁡‌⁣⁤',
85
+ 'fabric.linking.try_another_account': '⁣⁢Try another account؜‌؜؜‍‍؜‌⁠⁠⁠⁠⁣⁤',
86
+ 'fabric.linking.unlink_account': '⁣⁢Unlink Account⁠⁡⁡‌⁡⁣⁤',
87
+ 'fabric.linking.updated_by': '⁣⁢Modified by {context}؜⁠‍‍⁡⁡‌⁡‌⁣⁤',
88
+ 'fabric.linking.view': '⁣⁢View⁡‍⁠‍⁠؜؜⁠⁡؜‌‌⁣⁤'
39
89
  };
@@ -47,6 +47,7 @@ export default {
47
47
  'fabric.linking.more_actions': 'Más acciones',
48
48
  'fabric.linking.not_found_description': 'No hemos encontrado el enlace. Comprueba la URL y prueba a editarla, o pégala de nuevo.',
49
49
  'fabric.linking.not_found_title': '¡Vaya! No encontramos este enlace',
50
+ 'fabric.linking.open_issue_in_jira': 'Abrir incidencia en Jira',
50
51
  'fabric.linking.open_link_in_a_new_tab': 'Abrir enlace en una nueva pestaña',
51
52
  'fabric.linking.owned_by': 'Propiedad de {context}',
52
53
  'fabric.linking.pending_request': 'Tu solicitud de acceso está pendiente',
@@ -77,6 +78,9 @@ export default {
77
78
  'fabric.linking.save': 'Guardar',
78
79
  'fabric.linking.srclink': 'Ver en',
79
80
  'fabric.linking.srclinkunknown': 'Ver original',
81
+ 'fabric.linking.status_change_load_error': 'No hemos podido cargar los estados ni las transiciones',
82
+ 'fabric.linking.status_change_permission_error': 'No tienes permiso para realizar la transición de esta incidencia.',
83
+ 'fabric.linking.status_change_update_error': 'No hemos podido actualizar el estado',
80
84
  'fabric.linking.try_again': 'Volver a intentarlo',
81
85
  'fabric.linking.try_another_account': 'Probar otra cuenta',
82
86
  'fabric.linking.unlink_account': 'Desvincular cuenta',
@@ -47,7 +47,9 @@ export default {
47
47
  'fabric.linking.more_actions': 'Lisää toimintoja',
48
48
  'fabric.linking.not_found_description': 'Linkkiä ei löytynyt. Tarkista URL-osoite ja muokkaa tai liitä uudelleen.',
49
49
  'fabric.linking.not_found_title': 'Oho. Emme löydä tätä linkkiä!',
50
+ 'fabric.linking.open_issue_in_jira': 'Avaa asia Jirassa',
50
51
  'fabric.linking.open_link_in_a_new_tab': 'Avaa linkki uudessa välilehdessä',
52
+ 'fabric.linking.owned_by': 'Omistaja: {context}',
51
53
  'fabric.linking.pending_request': 'Käyttöoikeuspyyntösi on vireillä',
52
54
  'fabric.linking.preview': 'Koko näytön näkymä',
53
55
  'fabric.linking.preview_close': 'Sulje esikatselu',
@@ -76,6 +78,9 @@ export default {
76
78
  'fabric.linking.save': 'Tallenna',
77
79
  'fabric.linking.srclink': 'Näytä kohteessa',
78
80
  'fabric.linking.srclinkunknown': 'Näytä alkuperäinen',
81
+ 'fabric.linking.status_change_load_error': 'Tiloja ja siirtymiä ei voitu ladata',
82
+ 'fabric.linking.status_change_permission_error': 'Sinulla ei ole oikeuksia siirtää tätä asiaa.',
83
+ 'fabric.linking.status_change_update_error': 'Tilan päivitys epäonnistui',
79
84
  'fabric.linking.try_again': 'Yritä uudelleen',
80
85
  'fabric.linking.try_another_account': 'Kokeile toista tiliä',
81
86
  'fabric.linking.unlink_account': 'Poista tilin linkitys',
@@ -47,6 +47,7 @@ export default {
47
47
  'fabric.linking.more_actions': "Plus d'actions",
48
48
  'fabric.linking.not_found_description': "Lien introuvable. Cliquez sur l'URL et essayez de la modifier, ou collez-la de nouveau.",
49
49
  'fabric.linking.not_found_title': 'Oups, ce lien est introuvable !',
50
+ 'fabric.linking.open_issue_in_jira': 'Ouvrir le ticket dans Jira',
50
51
  'fabric.linking.open_link_in_a_new_tab': 'Ouvrir le lien dans un nouvel onglet',
51
52
  'fabric.linking.owned_by': 'Propriétaire : {context}',
52
53
  'fabric.linking.pending_request': "Votre demande d'accès est en attente",
@@ -77,6 +78,9 @@ export default {
77
78
  'fabric.linking.save': 'Enregistrer',
78
79
  'fabric.linking.srclink': 'Afficher dans',
79
80
  'fabric.linking.srclinkunknown': "Afficher l'original",
81
+ 'fabric.linking.status_change_load_error': 'Impossible de charger les états et les transitions',
82
+ 'fabric.linking.status_change_permission_error': "Vous n'avez pas l'autorisation de transitionner ce ticket.",
83
+ 'fabric.linking.status_change_update_error': "Impossible de mettre à jour l'état",
80
84
  'fabric.linking.try_again': 'Réessayez',
81
85
  'fabric.linking.try_another_account': 'Essayez un autre compte',
82
86
  'fabric.linking.unlink_account': 'Dissocier le compte',