@atlaskit/smart-card 26.47.0 → 26.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/extractors/common/meta/extractIsTrusted.js +0 -7
  3. package/dist/cjs/i18n/cs.js +17 -21
  4. package/dist/cjs/i18n/da.js +17 -21
  5. package/dist/cjs/i18n/de.js +17 -21
  6. package/dist/cjs/i18n/en.js +17 -21
  7. package/dist/cjs/i18n/en_GB.js +17 -21
  8. package/dist/cjs/i18n/en_ZZ.js +17 -21
  9. package/dist/cjs/i18n/es.js +17 -21
  10. package/dist/cjs/i18n/fi.js +17 -21
  11. package/dist/cjs/i18n/fr.js +17 -21
  12. package/dist/cjs/i18n/hu.js +17 -21
  13. package/dist/cjs/i18n/it.js +17 -21
  14. package/dist/cjs/i18n/ja.js +17 -21
  15. package/dist/cjs/i18n/ko.js +17 -21
  16. package/dist/cjs/i18n/nb.js +17 -21
  17. package/dist/cjs/i18n/nl.js +17 -21
  18. package/dist/cjs/i18n/pl.js +17 -21
  19. package/dist/cjs/i18n/pt_BR.js +17 -21
  20. package/dist/cjs/i18n/ru.js +17 -21
  21. package/dist/cjs/i18n/sv.js +17 -21
  22. package/dist/cjs/i18n/th.js +17 -21
  23. package/dist/cjs/i18n/tr.js +17 -21
  24. package/dist/cjs/i18n/uk.js +17 -21
  25. package/dist/cjs/i18n/vi.js +17 -21
  26. package/dist/cjs/i18n/zh.js +13 -21
  27. package/dist/cjs/i18n/zh_TW.js +17 -21
  28. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/index.js +179 -0
  29. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/store.js +11 -0
  30. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/types.js +5 -0
  31. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/utils.js +131 -0
  32. package/dist/cjs/state/hooks/use-ai-summary/index.js +44 -0
  33. package/dist/cjs/utils/analytics/analytics.js +1 -1
  34. package/dist/cjs/utils/index.js +0 -5
  35. package/dist/cjs/view/FlexibleCard/components/blocks/ai-summary-block/resolved/index.js +12 -0
  36. package/dist/cjs/view/HoverCard/components/ContentContainer.js +43 -0
  37. package/dist/cjs/view/HoverCard/components/CustomPopupContainer.js +7 -1
  38. package/dist/cjs/view/HoverCard/components/HoverCardContent.js +18 -3
  39. package/dist/cjs/view/HoverCard/components/views/resolved/index.js +6 -7
  40. package/dist/cjs/view/HoverCard/styled.js +4 -2
  41. package/dist/cjs/view/HoverCard/utils.js +7 -1
  42. package/dist/cjs/view/LinkUrl/index.js +1 -1
  43. package/dist/es2019/extractors/common/meta/extractIsTrusted.js +0 -7
  44. package/dist/es2019/i18n/cs.js +17 -21
  45. package/dist/es2019/i18n/da.js +17 -21
  46. package/dist/es2019/i18n/de.js +17 -21
  47. package/dist/es2019/i18n/en.js +17 -21
  48. package/dist/es2019/i18n/en_GB.js +17 -21
  49. package/dist/es2019/i18n/en_ZZ.js +17 -21
  50. package/dist/es2019/i18n/es.js +17 -21
  51. package/dist/es2019/i18n/fi.js +17 -21
  52. package/dist/es2019/i18n/fr.js +17 -21
  53. package/dist/es2019/i18n/hu.js +17 -21
  54. package/dist/es2019/i18n/it.js +17 -21
  55. package/dist/es2019/i18n/ja.js +17 -21
  56. package/dist/es2019/i18n/ko.js +17 -21
  57. package/dist/es2019/i18n/nb.js +17 -21
  58. package/dist/es2019/i18n/nl.js +17 -21
  59. package/dist/es2019/i18n/pl.js +17 -21
  60. package/dist/es2019/i18n/pt_BR.js +17 -21
  61. package/dist/es2019/i18n/ru.js +17 -21
  62. package/dist/es2019/i18n/sv.js +17 -21
  63. package/dist/es2019/i18n/th.js +17 -21
  64. package/dist/es2019/i18n/tr.js +17 -21
  65. package/dist/es2019/i18n/uk.js +17 -21
  66. package/dist/es2019/i18n/vi.js +17 -21
  67. package/dist/es2019/i18n/zh.js +13 -21
  68. package/dist/es2019/i18n/zh_TW.js +17 -21
  69. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/index.js +71 -0
  70. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/store.js +5 -0
  71. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/types.js +1 -0
  72. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/utils.js +55 -0
  73. package/dist/es2019/state/hooks/use-ai-summary/index.js +35 -0
  74. package/dist/es2019/utils/analytics/analytics.js +1 -1
  75. package/dist/es2019/utils/index.js +0 -5
  76. package/dist/es2019/view/FlexibleCard/components/blocks/ai-summary-block/resolved/index.js +15 -1
  77. package/dist/es2019/view/HoverCard/components/ContentContainer.js +33 -0
  78. package/dist/es2019/view/HoverCard/components/CustomPopupContainer.js +8 -1
  79. package/dist/es2019/view/HoverCard/components/HoverCardContent.js +18 -6
  80. package/dist/es2019/view/HoverCard/components/views/resolved/index.js +6 -8
  81. package/dist/es2019/view/HoverCard/styled.js +4 -1
  82. package/dist/es2019/view/HoverCard/utils.js +4 -0
  83. package/dist/es2019/view/LinkUrl/index.js +1 -1
  84. package/dist/esm/extractors/common/meta/extractIsTrusted.js +0 -7
  85. package/dist/esm/i18n/cs.js +17 -21
  86. package/dist/esm/i18n/da.js +17 -21
  87. package/dist/esm/i18n/de.js +17 -21
  88. package/dist/esm/i18n/en.js +17 -21
  89. package/dist/esm/i18n/en_GB.js +17 -21
  90. package/dist/esm/i18n/en_ZZ.js +17 -21
  91. package/dist/esm/i18n/es.js +17 -21
  92. package/dist/esm/i18n/fi.js +17 -21
  93. package/dist/esm/i18n/fr.js +17 -21
  94. package/dist/esm/i18n/hu.js +17 -21
  95. package/dist/esm/i18n/it.js +17 -21
  96. package/dist/esm/i18n/ja.js +17 -21
  97. package/dist/esm/i18n/ko.js +17 -21
  98. package/dist/esm/i18n/nb.js +17 -21
  99. package/dist/esm/i18n/nl.js +17 -21
  100. package/dist/esm/i18n/pl.js +17 -21
  101. package/dist/esm/i18n/pt_BR.js +17 -21
  102. package/dist/esm/i18n/ru.js +17 -21
  103. package/dist/esm/i18n/sv.js +17 -21
  104. package/dist/esm/i18n/th.js +17 -21
  105. package/dist/esm/i18n/tr.js +17 -21
  106. package/dist/esm/i18n/uk.js +17 -21
  107. package/dist/esm/i18n/vi.js +17 -21
  108. package/dist/esm/i18n/zh.js +13 -21
  109. package/dist/esm/i18n/zh_TW.js +17 -21
  110. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/index.js +172 -0
  111. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/store.js +5 -0
  112. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/types.js +1 -0
  113. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/utils.js +123 -0
  114. package/dist/esm/state/hooks/use-ai-summary/index.js +37 -0
  115. package/dist/esm/utils/analytics/analytics.js +1 -1
  116. package/dist/esm/utils/index.js +0 -5
  117. package/dist/esm/view/FlexibleCard/components/blocks/ai-summary-block/resolved/index.js +13 -1
  118. package/dist/esm/view/HoverCard/components/ContentContainer.js +36 -0
  119. package/dist/esm/view/HoverCard/components/CustomPopupContainer.js +8 -1
  120. package/dist/esm/view/HoverCard/components/HoverCardContent.js +21 -6
  121. package/dist/esm/view/HoverCard/components/views/resolved/index.js +6 -7
  122. package/dist/esm/view/HoverCard/styled.js +4 -1
  123. package/dist/esm/view/HoverCard/utils.js +6 -0
  124. package/dist/esm/view/LinkUrl/index.js +1 -1
  125. package/dist/types/i18n/cs.d.ts +10 -14
  126. package/dist/types/i18n/da.d.ts +10 -14
  127. package/dist/types/i18n/de.d.ts +10 -14
  128. package/dist/types/i18n/en.d.ts +10 -14
  129. package/dist/types/i18n/en_GB.d.ts +10 -14
  130. package/dist/types/i18n/en_ZZ.d.ts +10 -14
  131. package/dist/types/i18n/es.d.ts +10 -14
  132. package/dist/types/i18n/fi.d.ts +10 -14
  133. package/dist/types/i18n/fr.d.ts +10 -14
  134. package/dist/types/i18n/hu.d.ts +10 -14
  135. package/dist/types/i18n/it.d.ts +10 -14
  136. package/dist/types/i18n/ja.d.ts +10 -14
  137. package/dist/types/i18n/ko.d.ts +10 -14
  138. package/dist/types/i18n/nb.d.ts +10 -14
  139. package/dist/types/i18n/nl.d.ts +10 -14
  140. package/dist/types/i18n/pl.d.ts +10 -14
  141. package/dist/types/i18n/pt_BR.d.ts +10 -14
  142. package/dist/types/i18n/ru.d.ts +10 -14
  143. package/dist/types/i18n/sv.d.ts +10 -14
  144. package/dist/types/i18n/th.d.ts +10 -14
  145. package/dist/types/i18n/tr.d.ts +10 -14
  146. package/dist/types/i18n/uk.d.ts +10 -14
  147. package/dist/types/i18n/vi.d.ts +10 -14
  148. package/dist/types/i18n/zh.d.ts +6 -14
  149. package/dist/types/i18n/zh_TW.d.ts +10 -14
  150. package/dist/types/state/hooks/use-ai-summary/ai-summary-service/index.d.ts +11 -0
  151. package/dist/types/state/hooks/use-ai-summary/ai-summary-service/store.d.ts +3 -0
  152. package/dist/types/state/hooks/use-ai-summary/ai-summary-service/types.d.ts +158 -0
  153. package/dist/types/state/hooks/use-ai-summary/ai-summary-service/utils.d.ts +3 -0
  154. package/dist/types/state/hooks/use-ai-summary/index.d.ts +9 -0
  155. package/dist/types/utils/index.d.ts +1 -1
  156. package/dist/types/view/HoverCard/components/ContentContainer.d.ts +4 -0
  157. package/dist/types/view/HoverCard/components/CustomPopupContainer.d.ts +5 -0
  158. package/dist/types/view/HoverCard/components/views/resolved/types.d.ts +3 -0
  159. package/dist/types/view/HoverCard/styled.d.ts +1 -0
  160. package/dist/types/view/HoverCard/types.d.ts +5 -0
  161. package/dist/types/view/HoverCard/utils.d.ts +2 -1
  162. package/dist/types-ts4.5/i18n/cs.d.ts +10 -14
  163. package/dist/types-ts4.5/i18n/da.d.ts +10 -14
  164. package/dist/types-ts4.5/i18n/de.d.ts +10 -14
  165. package/dist/types-ts4.5/i18n/en.d.ts +10 -14
  166. package/dist/types-ts4.5/i18n/en_GB.d.ts +10 -14
  167. package/dist/types-ts4.5/i18n/en_ZZ.d.ts +10 -14
  168. package/dist/types-ts4.5/i18n/es.d.ts +10 -14
  169. package/dist/types-ts4.5/i18n/fi.d.ts +10 -14
  170. package/dist/types-ts4.5/i18n/fr.d.ts +10 -14
  171. package/dist/types-ts4.5/i18n/hu.d.ts +10 -14
  172. package/dist/types-ts4.5/i18n/it.d.ts +10 -14
  173. package/dist/types-ts4.5/i18n/ja.d.ts +10 -14
  174. package/dist/types-ts4.5/i18n/ko.d.ts +10 -14
  175. package/dist/types-ts4.5/i18n/nb.d.ts +10 -14
  176. package/dist/types-ts4.5/i18n/nl.d.ts +10 -14
  177. package/dist/types-ts4.5/i18n/pl.d.ts +10 -14
  178. package/dist/types-ts4.5/i18n/pt_BR.d.ts +10 -14
  179. package/dist/types-ts4.5/i18n/ru.d.ts +10 -14
  180. package/dist/types-ts4.5/i18n/sv.d.ts +10 -14
  181. package/dist/types-ts4.5/i18n/th.d.ts +10 -14
  182. package/dist/types-ts4.5/i18n/tr.d.ts +10 -14
  183. package/dist/types-ts4.5/i18n/uk.d.ts +10 -14
  184. package/dist/types-ts4.5/i18n/vi.d.ts +10 -14
  185. package/dist/types-ts4.5/i18n/zh.d.ts +6 -14
  186. package/dist/types-ts4.5/i18n/zh_TW.d.ts +10 -14
  187. package/dist/types-ts4.5/state/hooks/use-ai-summary/ai-summary-service/index.d.ts +11 -0
  188. package/dist/types-ts4.5/state/hooks/use-ai-summary/ai-summary-service/store.d.ts +3 -0
  189. package/dist/types-ts4.5/state/hooks/use-ai-summary/ai-summary-service/types.d.ts +158 -0
  190. package/dist/types-ts4.5/state/hooks/use-ai-summary/ai-summary-service/utils.d.ts +3 -0
  191. package/dist/types-ts4.5/state/hooks/use-ai-summary/index.d.ts +9 -0
  192. package/dist/types-ts4.5/utils/index.d.ts +1 -1
  193. package/dist/types-ts4.5/view/HoverCard/components/ContentContainer.d.ts +4 -0
  194. package/dist/types-ts4.5/view/HoverCard/components/CustomPopupContainer.d.ts +5 -0
  195. package/dist/types-ts4.5/view/HoverCard/components/views/resolved/types.d.ts +3 -0
  196. package/dist/types-ts4.5/view/HoverCard/styled.d.ts +1 -0
  197. package/dist/types-ts4.5/view/HoverCard/types.d.ts +5 -0
  198. package/dist/types-ts4.5/view/HoverCard/utils.d.ts +2 -1
  199. package/package.json +7 -12
@@ -10,6 +10,10 @@ export default {
10
10
  'fabric.linking.access_exists_description': '要求存取權以檢視 {hostname} 的這項內容。',
11
11
  'fabric.linking.actions': '動作',
12
12
  'fabric.linking.add_account': '新增帳戶',
13
+ 'fabric.linking.ai_summarize': '總結',
14
+ 'fabric.linking.ai_summarized': '由 Atlassian Intelligence 總結',
15
+ 'fabric.linking.ai_summarized_info': '資訊品質可能會有變化。<a>深入了解</a>',
16
+ 'fabric.linking.ai_summarizing': 'Atlassian Intelligence 運作中...',
13
17
  'fabric.linking.assigned_to': '已指派給 {context}',
14
18
  'fabric.linking.cancel': '取消',
15
19
  'fabric.linking.cannot_connect': '無法連結,請再試一次',
@@ -34,16 +38,15 @@ export default {
34
38
  'fabric.linking.create_on_relative': '建立時間:{context}',
35
39
  'fabric.linking.created_by': '建立者:{context}',
36
40
  'fabric.linking.delete': '刪除',
37
- 'fabric.linking.direct_access_crossjoin': '立即加入',
38
- 'fabric.linking.direct_access_description_crossjoin': '您的團隊使用 {product} 協作,您可以立即開始使用!',
39
- 'fabric.linking.direct_access_title_crossjoin': '加入 {product} 以檢視此內容',
41
+ 'fabric.linking.direct_access': '立即加入',
42
+ 'fabric.linking.direct_access_description': '您的團隊使用 {product} 協作,您可以立即開始使用!',
43
+ 'fabric.linking.direct_access_title': '加入 {product} 以檢視此內容',
40
44
  'fabric.linking.download': '下載',
41
45
  'fabric.linking.edit': '編輯',
42
46
  'fabric.linking.follow': '追蹤',
43
47
  'fabric.linking.forbidden_access': '您的存取遭拒',
44
- 'fabric.linking.forbidden_description': '您沒有此預覽的存取權。如果您需要存取權,請連絡網站管理員。',
45
- 'fabric.linking.forbidden_description_crossjoin': '請連絡您的管理員以要求 {hostname} 存取權。',
46
- 'fabric.linking.forbidden_title_crossjoin': '您無法存取此內容',
48
+ 'fabric.linking.forbidden_description': '請連絡您的管理員以要求 {hostname} 存取權。',
49
+ 'fabric.linking.forbidden_title': '您無法存取此內容',
47
50
  'fabric.linking.generic_error_message': '發生錯誤',
48
51
  'fabric.linking.go_back': '返回',
49
52
  'fabric.linking.invalid_permissions': '受限制的內容',
@@ -57,11 +60,9 @@ export default {
57
60
  'fabric.linking.modified_on_absolute': '更新於 {context}',
58
61
  'fabric.linking.modified_on_relative': '更新時間:{context}',
59
62
  'fabric.linking.more_actions': '更多動作',
60
- 'fabric.linking.no_access_title_crossjoin': '加入 {product} 以檢視此內容',
61
- 'fabric.linking.not_found_description': '我們找不到此連結。請檢查 URL,然後試著編輯或再次貼上。',
62
- 'fabric.linking.not_found_description_crossjoin': '該頁面不存在,或在新增此連結後可能已變更。',
63
- 'fabric.linking.not_found_title': '糟糕,我們找不到此連結!',
64
- 'fabric.linking.not_found_title_crossjoin': '我們無法向您顯示此 {product} 頁面',
63
+ 'fabric.linking.no_access_title': '加入 {product} 以檢視此內容',
64
+ 'fabric.linking.not_found_description': '該頁面不存在,或在新增此連結後可能已變更。',
65
+ 'fabric.linking.not_found_title': '我們無法向您顯示此 {product} 頁面',
65
66
  'fabric.linking.open_issue_in_jira': 'Jira 中的待處理議題',
66
67
  'fabric.linking.open_link_in_a_new_tab': '在新分頁中開啟連結',
67
68
  'fabric.linking.owned_by': '負責人:{context}',
@@ -85,18 +86,13 @@ export default {
85
86
  'fabric.linking.related': '相關',
86
87
  'fabric.linking.related_work_items_not_found': '這個連結並未在其他任何位置提及。',
87
88
  'fabric.linking.request_access': '要求存取權',
88
- 'fabric.linking.request_access_crossjoin': '要求存取權',
89
- 'fabric.linking.request_access_description': '要求 {context} 的存取權以檢視此預覽。',
90
- 'fabric.linking.request_access_description_crossjoin': '您的團隊使用 {product} 來協作。向您的管理員傳送存取要求。',
91
- 'fabric.linking.request_access_pending': '存取擱置',
92
- 'fabric.linking.request_access_pending_crossjoin': '待核准',
93
- 'fabric.linking.request_access_pending_description': '您的存取要求擱置中。',
94
- 'fabric.linking.request_access_pending_description_crossjoin': '您的 {hostname} 存取要求正在等待管理員核准。',
95
- 'fabric.linking.request_access_pending_title_crossjoin': '{product} 的存取權待核准',
89
+ 'fabric.linking.request_access_description': '您的團隊使用 {product} 來協作。向您的管理員傳送存取要求。',
90
+ 'fabric.linking.request_access_pending': '待核准',
91
+ 'fabric.linking.request_access_pending_description': '您的 {hostname} 存取要求正在等待管理員核准。',
92
+ 'fabric.linking.request_access_pending_title': '{product} 的存取權待核准',
96
93
  'fabric.linking.request_access_to_view': '要求存取 {context} 以檢視此議題',
97
94
  'fabric.linking.request_denied': '您的存取要求遭拒',
98
- 'fabric.linking.request_denied_description': '您的存取要求遭到拒絕。如果您仍需要存取權,請連絡網站管理員。',
99
- 'fabric.linking.request_denied_description_crossjoin': '您的管理員並未核准您的要求,因此您無法檢視 {hostname} 的 {product} 頁面。',
95
+ 'fabric.linking.request_denied_description': '您的管理員並未核准您的要求,因此您無法檢視 {hostname} 的 {product} 頁面。',
100
96
  'fabric.linking.restricted_link': '連結受到限制,請嘗試其他帳戶',
101
97
  'fabric.linking.retry': '重試',
102
98
  'fabric.linking.save': '儲存',
@@ -0,0 +1,71 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import { readStream, addPath } from './utils';
3
+ export class AISummaryService {
4
+ constructor(props) {
5
+ _defineProperty(this, "state", {
6
+ content: '',
7
+ status: 'ready'
8
+ });
9
+ _defineProperty(this, "subscribedStateSetter", state => {});
10
+ _defineProperty(this, "fetchStream", async summaryStyle => {
11
+ const payload = {
12
+ recipient_agent_named_id: 'summary_agent',
13
+ agent_input: {
14
+ urls: [this.url],
15
+ summary_style: summaryStyle
16
+ }
17
+ };
18
+ const options = {
19
+ method: 'POST',
20
+ headers: this.config.headers,
21
+ body: JSON.stringify(payload)
22
+ };
23
+ const path = 'chat/v1/invoke_agent/stream';
24
+ const requestUrl = addPath(this.config.baseUrl, path);
25
+ const response = await fetch(requestUrl, options);
26
+ return readStream(response);
27
+ });
28
+ const defaultConfig = {
29
+ baseUrl: '/gateway/api/assist',
30
+ headers: {
31
+ 'Content-Type': 'application/json;charset=UTF-8',
32
+ 'x-experience-id': 'smart-link',
33
+ //TODO: EDM-9337 - Remove the hardcoded Confluence product name and find a way to populate the product name here
34
+ 'x-product': props.product || 'confluence'
35
+ }
36
+ };
37
+ this.config = {
38
+ baseUrl: props.baseUrl || defaultConfig.baseUrl,
39
+ headers: {
40
+ ...(props.headers || defaultConfig.headers)
41
+ }
42
+ };
43
+ this.url = props.url;
44
+ }
45
+ async summariseUrl(summaryStyle = 'short') {
46
+ this.state = {
47
+ ...this.state,
48
+ status: 'loading'
49
+ };
50
+ this.subscribedStateSetter(this.state);
51
+ const stream = await this.fetchStream(summaryStyle);
52
+ let bufferContent = '';
53
+ for await (const chunk of stream) {
54
+ if (chunk.type === 'ANSWER_PART') {
55
+ bufferContent += chunk.message.content;
56
+ this.subscribedStateSetter({
57
+ ...this.state,
58
+ content: bufferContent
59
+ });
60
+ }
61
+ }
62
+ this.state = {
63
+ status: 'done',
64
+ content: bufferContent
65
+ };
66
+ this.subscribedStateSetter(this.state);
67
+ }
68
+ subscribe(stateSetter) {
69
+ this.subscribedStateSetter = stateSetter;
70
+ }
71
+ }
@@ -0,0 +1,5 @@
1
+ import { LRUMap } from 'lru_map';
2
+ const AI_SUMMARY_CACHE_SIZE = 100;
3
+
4
+ // Contains cached mapping between url and an AISummaryService.
5
+ export const AISummariesStore = new LRUMap(AI_SUMMARY_CACHE_SIZE);
@@ -0,0 +1,55 @@
1
+ export async function* readStream(response) {
2
+ const reader = getBufferReader(response);
3
+ let doneStreaming = false;
4
+ let chunkBuffer = '';
5
+ do {
6
+ try {
7
+ const {
8
+ value,
9
+ done
10
+ } = await reader.read();
11
+ doneStreaming = done;
12
+ if (value) {
13
+ try {
14
+ const processedChunks = `${chunkBuffer}${value}`.split('\n'); // assumes that all JSON chunks are separated by a new-line;
15
+
16
+ chunkBuffer = '';
17
+ for (let chunk of processedChunks) {
18
+ try {
19
+ yield JSON.parse(chunk);
20
+ } catch (e) {
21
+ // the chunk may be incomplete, so we'll save it for the next iteration.
22
+ chunkBuffer = chunk;
23
+ }
24
+ }
25
+ } catch (e) {
26
+ const error = new Error(`Error Processing Stream Data: ${value}`);
27
+ throw error;
28
+ }
29
+ }
30
+ } catch (e) {
31
+ // If we abort the call, this exception bubbles up, so we want to catch it and exit gracefully
32
+ if (e instanceof DOMException && e.name === 'AbortError') {
33
+ doneStreaming = true;
34
+ } else {
35
+ throw e;
36
+ }
37
+ }
38
+ } while (!doneStreaming);
39
+ if (chunkBuffer) {
40
+ const error = new Error(`Not all the data was processed: ${chunkBuffer}`);
41
+ throw error;
42
+ }
43
+ }
44
+ export const getBufferReader = response => {
45
+ if (!response.body) {
46
+ throw new Error('Response body is empty');
47
+ }
48
+ return response.body.pipeThrough(new TextDecoderStream()).getReader();
49
+ };
50
+ export const addPath = (baseUrl, path) => {
51
+ const urlWithTrailingSlash = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
52
+ const pathWithoutLeadingSlash = !path.startsWith('/') ? path : path.substring(1, path.length);
53
+ const url = [urlWithTrailingSlash, pathWithoutLeadingSlash].join('');
54
+ return url;
55
+ };
@@ -0,0 +1,35 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { AISummariesStore } from './ai-summary-service/store';
3
+ import { AISummaryService } from './ai-summary-service';
4
+ export const useAISummary = props => {
5
+ const {
6
+ url
7
+ } = props;
8
+ const aISummaryService = AISummariesStore.get(url);
9
+ const isAISummaryServiceInitiated = !!aISummaryService;
10
+ const [state, setState] = useState(isAISummaryServiceInitiated ? aISummaryService.state : {
11
+ status: 'ready',
12
+ content: ''
13
+ });
14
+ const isSummarised = isAISummaryServiceInitiated && state.status === 'done';
15
+ useEffect(() => {
16
+ if (!isSummarised) {
17
+ var _AISummariesStore$get;
18
+ if (!isAISummaryServiceInitiated) {
19
+ AISummariesStore.set(url, new AISummaryService(props));
20
+ }
21
+ return (_AISummariesStore$get = AISummariesStore.get(url)) === null || _AISummariesStore$get === void 0 ? void 0 : _AISummariesStore$get.subscribe(setState);
22
+ }
23
+ }, [isSummarised, isAISummaryServiceInitiated, url, props]);
24
+ const summariseUrl = () => {
25
+ if (isAISummaryServiceInitiated) {
26
+ return aISummaryService.summariseUrl();
27
+ }
28
+ return;
29
+ };
30
+ return {
31
+ isSummarised,
32
+ summariseUrl,
33
+ state
34
+ };
35
+ };
@@ -4,7 +4,7 @@ export const ANALYTICS_CHANNEL = 'media';
4
4
  export const context = {
5
5
  componentName: 'smart-cards',
6
6
  packageName: "@atlaskit/smart-card",
7
- packageVersion: "26.47.0"
7
+ packageVersion: "26.48.0"
8
8
  };
9
9
  export let TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
10
10
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
2
  import Loadable from 'react-loadable';
3
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
4
3
  export const isCardWithData = props => !!props.data;
5
4
  export const isSpecialEvent = evt => evt.isDefaultPrevented() && (isIframe() || isSpecialKey(evt) || isSpecialClick(evt));
6
5
  export const isIframe = () => window.parent !== parent;
@@ -104,10 +103,6 @@ export const getIframeSandboxAttribute = isTrusted => {
104
103
  return undefined;
105
104
  }
106
105
  const sandboxPermissions = 'allow-downloads allow-forms allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts';
107
- const allowStorageAccess = 'allow-storage-access-by-user-activation';
108
- if (getBooleanFF('platform.linking-platform.smart-card.iframes-allow-storage-access-by-user-activation')) {
109
- return `${sandboxPermissions} ${allowStorageAccess}`;
110
- }
111
106
  return sandboxPermissions;
112
107
  };
113
108
  export const handleOnClick = handler => e => {
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { useCallback, useMemo, useState } from 'react';
3
3
  import { FormattedMessage } from 'react-intl-next';
4
4
  import { Box, Inline } from '@atlaskit/primitives';
5
- import { ActionName, SmartLinkSize, SmartLinkWidth } from '../../../../../../constants';
5
+ import { ActionName, SmartLinkSize, SmartLinkWidth, SmartLinkDirection } from '../../../../../../constants';
6
6
  import ActionGroup from '../../action-group';
7
7
  import Block from '../../block';
8
8
  import ElementGroup from '../../element-group';
@@ -10,6 +10,9 @@ import AIStateIndicator from '../ai-state-indicator';
10
10
  import { renderElementItems } from '../../utils';
11
11
  import { messages } from '../../../../../../messages';
12
12
  import AiIcon from '../../../../../common/ai-icon';
13
+ import AISummary from '../../../../../common/ai-summary';
14
+ import { useAISummary } from '../../../../../../state/hooks/use-ai-summary';
15
+ import { useFlexibleUiContext } from '../../../../../../state/flexible-ui-context';
13
16
  const AISummaryBlockResolvedView = props => {
14
17
  const {
15
18
  actions = [],
@@ -21,6 +24,14 @@ const AISummaryBlockResolvedView = props => {
21
24
  } = props;
22
25
  const [aiState, setAIState] = useState('ready');
23
26
  const metadataElements = renderElementItems(metadata);
27
+ const context = useFlexibleUiContext();
28
+ const url = (context === null || context === void 0 ? void 0 : context.url) || '';
29
+ const aiSummary = useAISummary({
30
+ url
31
+ });
32
+ const {
33
+ content
34
+ } = aiSummary.state;
24
35
  const onAIActionClick = useCallback(() => {
25
36
  setAIState('loading');
26
37
  if (onAIActionChange) {
@@ -50,7 +61,10 @@ const AISummaryBlockResolvedView = props => {
50
61
  }
51
62
  }, [onActionMenuOpenChange]);
52
63
  return /*#__PURE__*/React.createElement(Block, _extends({}, props, {
64
+ direction: SmartLinkDirection.Vertical,
53
65
  testId: `${testId}-resolved-view`
66
+ }), /*#__PURE__*/React.createElement(AISummary, {
67
+ content: content
54
68
  }), /*#__PURE__*/React.createElement(Inline, {
55
69
  alignBlock: "center",
56
70
  alignInline: "end",
@@ -0,0 +1,33 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /** @jsx jsx */
3
+ import { jsx } from '@emotion/react';
4
+ import React from 'react';
5
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
6
+ import { HoverCardContainer, popupContainerStyles } from '../styled';
7
+ import AIPrism from '../../common/ai-prism';
8
+ import { hoverCardClassName } from './HoverCardContent';
9
+ const ContentContainer = ({
10
+ children,
11
+ isAIEnabled = false,
12
+ showPrism = false,
13
+ testId,
14
+ ...props
15
+ }) => {
16
+ if (getBooleanFF('platform.linking-platform.smart-card.hover-card-ai-summaries')) {
17
+ const container = jsx("div", _extends({
18
+ className: hoverCardClassName,
19
+ css: [HoverCardContainer, isAIEnabled && showPrism ? undefined : popupContainerStyles],
20
+ "data-testid": testId
21
+ }, props), children);
22
+ return isAIEnabled ? jsx(AIPrism, {
23
+ isVisible: showPrism,
24
+ testId: `${testId}-prism`
25
+ }, container) : container;
26
+ }
27
+ return jsx("div", _extends({
28
+ className: hoverCardClassName,
29
+ css: HoverCardContainer,
30
+ "data-testid": testId
31
+ }, props), children);
32
+ };
33
+ export default ContentContainer;
@@ -1,13 +1,20 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  /** @jsx jsx */
3
3
  import React from 'react';
4
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
4
5
  import { popupContainerStyles } from '../styled';
5
6
  import { jsx } from '@emotion/react';
7
+
8
+ /**
9
+ * The purpose of this component is to hide the default Popup border.
10
+ * HoverCard border implementation is in ContentContainer where it can
11
+ * change between the default border and prism border during runtime.
12
+ */
6
13
  const CustomPopupContainer = /*#__PURE__*/React.forwardRef(({
7
14
  children,
8
15
  ...props
9
16
  }, ref) => jsx("div", _extends({
10
- css: popupContainerStyles
17
+ css: getBooleanFF('platform.linking-platform.smart-card.hover-card-ai-summaries') ? undefined : popupContainerStyles
11
18
  }, props, {
12
19
  ref: ref
13
20
  }), children));
@@ -2,14 +2,15 @@
2
2
  import { jsx } from '@emotion/react';
3
3
  import { useAnalyticsEvents } from '@atlaskit/analytics-next';
4
4
  import CopyIcon from '@atlaskit/icon/glyph/copy';
5
- import React, { useCallback, useEffect, useMemo, useRef } from 'react';
5
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import { useSmartLinkContext } from '@atlaskit/link-provider';
6
7
  import { ActionName, CardDisplay, SmartLinkPosition, SmartLinkSize } from '../../../constants';
7
8
  import { extractMetadata } from '../../../extractors/hover/extractMetadata';
8
9
  import { useSmartLinkAnalytics } from '../../../state/analytics';
9
10
  import { getExtensionKey, getServices } from '../../../state/helpers';
10
11
  import { isSpecialEvent } from '../../../utils';
11
- import { HoverCardContainer, flexibleUiOptions, titleBlockCss } from '../styled';
12
- import { getSimulatedMetadata } from '../utils';
12
+ import { flexibleUiOptions, titleBlockCss } from '../styled';
13
+ import { getSimulatedMetadata, getIsAISummaryEnabled } from '../utils';
13
14
  import HoverCardLoadingView from './views/resolving';
14
15
  import HoverCardUnauthorisedView from './views/unauthorised';
15
16
  import HoverCardResolvedView from './views/resolved';
@@ -18,6 +19,7 @@ import { messages } from '../../../messages';
18
19
  import { fireLinkClickedEvent } from '../../../utils/analytics/click';
19
20
  import { useSmartCardState } from '../../../state/store';
20
21
  import HoverCardForbiddenView from './views/forbidden';
22
+ import ContentContainer from './ContentContainer';
21
23
  export const hoverCardClassName = 'smart-links-hover-preview';
22
24
  export const getCopyAction = url => ({
23
25
  name: ActionName.CustomAction,
@@ -52,9 +54,14 @@ const HoverCardContent = ({
52
54
  const extensionKey = useMemo(() => getExtensionKey(cardState.details), [cardState.details]);
53
55
  const linkState = useSmartCardState(url);
54
56
  const linkStatus = (_linkState$status = linkState.status) !== null && _linkState$status !== void 0 ? _linkState$status : 'pending';
57
+ const {
58
+ isAdminHubAIEnabled
59
+ } = useSmartLinkContext();
60
+ const isAISummaryEnabled = getIsAISummaryEnabled(isAdminHubAIEnabled, cardState.details);
55
61
  const services = getServices(linkState.details);
56
62
  const statusRef = useRef(linkStatus);
57
63
  const analyticsRef = useRef(analytics);
64
+ const [showPrism, setShowPrism] = useState(false);
58
65
  useEffect(() => {
59
66
  /**
60
67
  * Must access current analytics object value via ref because its not stable
@@ -124,6 +131,9 @@ const HoverCardContent = ({
124
131
  analytics
125
132
  };
126
133
  const onClickStopPropagation = useCallback(e => e.stopPropagation(), []);
134
+ const onAIActionChange = useCallback(state => {
135
+ setShowPrism(state === 'loading');
136
+ }, []);
127
137
  const getCardView = cardState => {
128
138
  if (cardState.metadataStatus === 'pending') {
129
139
  return jsx(HoverCardLoadingView, {
@@ -154,19 +164,21 @@ const HoverCardContent = ({
154
164
  cardActions: cardActions,
155
165
  cardState: cardState,
156
166
  flexibleCardProps: flexibleCardProps,
167
+ isAISummaryEnabled: isAISummaryEnabled,
157
168
  onActionClick: onActionClick,
169
+ onAIActionChange: onAIActionChange,
158
170
  titleBlockProps: titleBlockProps
159
171
  });
160
172
  }
161
173
  return null;
162
174
  };
163
175
  const cardView = getCardView(cardState);
164
- return cardView ? jsx("div", {
176
+ return cardView ? jsx(ContentContainer, {
165
177
  onMouseEnter: onMouseEnter,
166
178
  onMouseLeave: onMouseLeave,
167
179
  onClick: onClickStopPropagation,
168
- className: hoverCardClassName,
169
- css: HoverCardContainer
180
+ isAIEnabled: isAISummaryEnabled,
181
+ showPrism: showPrism
170
182
  }, cardView) : null;
171
183
  };
172
184
  export default HoverCardContent;
@@ -11,7 +11,6 @@ import { messages } from '../../../../../messages';
11
11
  import { FormattedMessage } from 'react-intl-next';
12
12
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
13
13
  import { getCanBeDatasource } from '../../../../../state/helpers';
14
- import { useSmartLinkContext } from '../../../../../state';
15
14
  export const toFooterActions = (cardActions, onActionClick) => {
16
15
  const followAction = {
17
16
  hideIcon: true,
@@ -52,11 +51,13 @@ const HoverCardResolvedView = ({
52
51
  analytics,
53
52
  cardState,
54
53
  cardActions = [],
54
+ isAISummaryEnabled,
55
55
  onActionClick,
56
+ onAIActionChange,
56
57
  extensionKey,
57
58
  url
58
59
  }) => {
59
- var _cardState$details, _cardState$details2, _cardState$details2$m, _cardState$details2$m2;
60
+ var _cardState$details;
60
61
  const canBeDatasource = getCanBeDatasource(cardState.details);
61
62
  useEffect(() => {
62
63
  // Since this hover view is only rendered on resolved status,
@@ -91,10 +92,6 @@ const HoverCardResolvedView = ({
91
92
  data: data,
92
93
  fallbackElementHeight: snippetHeight.current
93
94
  });
94
- const {
95
- isAdminHubAIEnabled
96
- } = useSmartLinkContext();
97
- const showAiView = getBooleanFF('platform.linking-platform.smart-card.hover-card-ai-summaries') && isAdminHubAIEnabled && ((_cardState$details2 = cardState.details) === null || _cardState$details2 === void 0 ? void 0 : (_cardState$details2$m = _cardState$details2.meta) === null || _cardState$details2$m === void 0 ? void 0 : (_cardState$details2$m2 = _cardState$details2$m.supportedFeatures) === null || _cardState$details2$m2 === void 0 ? void 0 : _cardState$details2$m2.includes('AISummary'));
98
95
  return /*#__PURE__*/React.createElement(FlexibleCard, flexibleCardProps, imagePreview, /*#__PURE__*/React.createElement(TitleBlock, _extends({}, titleBlockProps, {
99
96
  metadataPosition: SmartLinkPosition.Top
100
97
  })), /*#__PURE__*/React.createElement(MetadataBlock, {
@@ -116,11 +113,12 @@ const HoverCardResolvedView = ({
116
113
  }), getBooleanFF('platform.linking-platform.smart-card.enable-hover-card-related-urls') && /*#__PURE__*/React.createElement(RelatedUrlsBlock, {
117
114
  url: url,
118
115
  size: SmartLinkSize.Small
119
- }), showAiView ? /*#__PURE__*/React.createElement(AISummaryBlock, {
116
+ }), isAISummaryEnabled ? /*#__PURE__*/React.createElement(AISummaryBlock, {
120
117
  metadata: [{
121
118
  name: ElementName.Provider
122
119
  }],
123
- actions: footerActions
120
+ actions: footerActions,
121
+ onAIActionChange: onAIActionChange
124
122
  }) : /*#__PURE__*/React.createElement(FooterBlock, {
125
123
  actions: footerActions,
126
124
  size: SmartLinkSize.Large,
@@ -2,6 +2,8 @@ import { css } from '@emotion/react';
2
2
  import { loadingPlaceholderClassName } from '../../index';
3
3
  import { SmartLinkSize } from '../../constants';
4
4
  import { layers } from '@atlaskit/theme/constants';
5
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
6
+
5
7
  // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
6
8
  export const HOVER_CARD_Z_INDEX = layers.modal();
7
9
  export const flexibleUiOptions = {
@@ -12,6 +14,7 @@ export const flexibleUiOptions = {
12
14
  zIndex: HOVER_CARD_Z_INDEX + 1
13
15
  };
14
16
  export const CARD_WIDTH_REM = 24;
17
+ export const NEW_CARD_WIDTH_REM = 28;
15
18
  // gap between mouse cursor and hover card
16
19
  export const CARD_GAP_PX = 10;
17
20
  const blockGap = '0.5rem';
@@ -25,7 +28,7 @@ export const HoverCardContainer = css`
25
28
  background: none;
26
29
  border-width: 0;
27
30
  box-sizing: border-box;
28
- width: ${CARD_WIDTH_REM}rem;
31
+ width: ${getBooleanFF('platform.linking-platform.smart-card.hover-card-ai-summaries') ? NEW_CARD_WIDTH_REM : CARD_WIDTH_REM}rem;
29
32
 
30
33
  .${loadingPlaceholderClassName} {
31
34
  display: none;
@@ -201,4 +201,8 @@ export const getSimulatedBetterMetadata = (extensionKey = '', data) => {
201
201
  default:
202
202
  return defaultMetadata;
203
203
  }
204
+ };
205
+ export const getIsAISummaryEnabled = (isAdminHubAIEnabled = false, response) => {
206
+ var _response$meta, _response$meta$suppor;
207
+ return Boolean(getBooleanFF('platform.linking-platform.smart-card.hover-card-ai-summaries') && isAdminHubAIEnabled && (response === null || response === void 0 ? void 0 : (_response$meta = response.meta) === null || _response$meta === void 0 ? void 0 : (_response$meta$suppor = _response$meta.supportedFeatures) === null || _response$meta$suppor === void 0 ? void 0 : _response$meta$suppor.includes('AISummary')));
204
208
  };
@@ -7,7 +7,7 @@ import { useLinkWarningModal } from './LinkWarningModal/hooks/use-link-warning-m
7
7
  import LinkWarningModal from './LinkWarningModal';
8
8
  const PACKAGE_DATA = {
9
9
  packageName: "@atlaskit/smart-card",
10
- packageVersion: "26.47.0",
10
+ packageVersion: "26.48.0",
11
11
  componentName: 'linkUrl'
12
12
  };
13
13
  const Link = withLinkClickedEvent('a');
@@ -1,10 +1,3 @@
1
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
2
1
  export var extractIsTrusted = function extractIsTrusted(meta) {
3
- if (getBooleanFF('platform.linking-platform.smart-card.fix-is-trusted-pop')) {
4
- if (!(meta !== null && meta !== void 0 && meta.key)) {
5
- return false;
6
- }
7
- return !['iframely-object-provider', 'public-object-provider'].includes(meta.key);
8
- }
9
2
  return Boolean((meta === null || meta === void 0 ? void 0 : meta.key) && meta.key !== 'iframely-object-provider');
10
3
  };
@@ -10,6 +10,10 @@ export default {
10
10
  'fabric.linking.access_exists_description': 'Požádejte o přístup k zobrazení tohoto obsahu z webu {hostname}.',
11
11
  'fabric.linking.actions': 'Akce',
12
12
  'fabric.linking.add_account': 'Přidat účet',
13
+ 'fabric.linking.ai_summarize': 'Shrnout',
14
+ 'fabric.linking.ai_summarized': 'Shrnuto pomocí Atlassian Intelligence',
15
+ 'fabric.linking.ai_summarized_info': 'Kvalita informací se může různit. <a>Další informace</a>',
16
+ 'fabric.linking.ai_summarizing': 'Atlassian Intelligence pracuje…',
13
17
  'fabric.linking.assigned_to': 'Přiřazeno k: {context}',
14
18
  'fabric.linking.cancel': 'Zrušit',
15
19
  'fabric.linking.cannot_connect': 'Nelze se připojit, zkuste to znovu.',
@@ -34,16 +38,15 @@ export default {
34
38
  'fabric.linking.create_on_relative': 'Vytvořeno: {context}',
35
39
  'fabric.linking.created_by': 'Vytvořil(a) {context}',
36
40
  'fabric.linking.delete': 'Odstranit',
37
- 'fabric.linking.direct_access_crossjoin': 'Připojit se',
38
- 'fabric.linking.direct_access_description_crossjoin': 'Váš tým spolupracuje v {product} a vy můžete tento produkt hned začít používat také!',
39
- 'fabric.linking.direct_access_title_crossjoin': 'Chcete-li si zobrazit tento obsah, připojte se k produktu {product}',
41
+ 'fabric.linking.direct_access': 'Připojit se',
42
+ 'fabric.linking.direct_access_description': 'Váš tým spolupracuje v {product} a vy můžete tento produkt hned začít používat také!',
43
+ 'fabric.linking.direct_access_title': 'Chcete-li si zobrazit tento obsah, připojte se k produktu {product}',
40
44
  'fabric.linking.download': 'Stáhnout',
41
45
  'fabric.linking.edit': 'Upravit',
42
46
  'fabric.linking.follow': 'Sledovat',
43
47
  'fabric.linking.forbidden_access': 'Přístup byl odepřen',
44
- 'fabric.linking.forbidden_description': 'K tomuto náhledu nemáte přístup. Pokud potřebujete přístup, obraťte se na správce webu.',
45
- 'fabric.linking.forbidden_description_crossjoin': 'Pokud chcete požádat přístup k webu {hostname}, kontaktujte správce.',
46
- 'fabric.linking.forbidden_title_crossjoin': 'K tomuto obsahu nemáte přístup',
48
+ 'fabric.linking.forbidden_description': 'Pokud chcete požádat přístup k webu {hostname}, kontaktujte správce.',
49
+ 'fabric.linking.forbidden_title': 'K tomuto obsahu nemáte přístup',
47
50
  'fabric.linking.generic_error_message': 'Došlo k chybě',
48
51
  'fabric.linking.go_back': 'Přejít zpět',
49
52
  'fabric.linking.invalid_permissions': 'Omezený obsah',
@@ -57,11 +60,9 @@ export default {
57
60
  'fabric.linking.modified_on_absolute': 'Aktualizováno: {context}',
58
61
  'fabric.linking.modified_on_relative': 'Aktualizováno: {context}',
59
62
  'fabric.linking.more_actions': 'Další akce',
60
- 'fabric.linking.no_access_title_crossjoin': 'Chcete-li si zobrazit tento obsah, připojte se k produktu {product}',
61
- 'fabric.linking.not_found_description': 'Odkaz se nepodařilo najít. Zkontrolujte adresu URL a zkuste ji upravit nebo vložit znovu.',
62
- 'fabric.linking.not_found_description_crossjoin': 'Stránka neexistuje nebo se po přidání tohoto odkazu mohla změnit.',
63
- 'fabric.linking.not_found_title': 'Jejda. Tento odkaz se nepodařilo najít.',
64
- 'fabric.linking.not_found_title_crossjoin': 'Tuto stránku {product} vám nemůžeme zobrazit',
63
+ 'fabric.linking.no_access_title': 'Chcete-li si zobrazit tento obsah, připojte se k produktu {product}',
64
+ 'fabric.linking.not_found_description': 'Stránka neexistuje nebo se po přidání tohoto odkazu mohla změnit.',
65
+ 'fabric.linking.not_found_title': 'Tuto stránku {product} vám nemůžeme zobrazit',
65
66
  'fabric.linking.open_issue_in_jira': 'Otevřít požadavek v Jira',
66
67
  'fabric.linking.open_link_in_a_new_tab': 'Otevřít odkaz na nové kartě',
67
68
  'fabric.linking.owned_by': 'Vlastník: {context}',
@@ -85,18 +86,13 @@ export default {
85
86
  'fabric.linking.related': 'Souvisící',
86
87
  'fabric.linking.related_work_items_not_found': 'Tento odkaz není nikde jinde zmíněn.',
87
88
  'fabric.linking.request_access': 'Požádat o přístup',
88
- 'fabric.linking.request_access_crossjoin': 'Požádat o přístup',
89
- 'fabric.linking.request_access_description': 'Pokud si chcete zobrazit tento náhled, požádejte o přístup k řešení {context}.',
90
- 'fabric.linking.request_access_description_crossjoin': 'Váš tým spolupracuje v {product}. Pošlete správci žádost o přístup.',
91
- 'fabric.linking.request_access_pending': 'Čeká se na vyřízení přístupu',
92
- 'fabric.linking.request_access_pending_crossjoin': 'Čeká na schválení',
93
- 'fabric.linking.request_access_pending_description': 'Vaše žádost o přístup čeká na vyřízení.',
94
- 'fabric.linking.request_access_pending_description_crossjoin': 'Vaše žádost o přístup z {hostname} čeká na schválení správcem.',
95
- 'fabric.linking.request_access_pending_title_crossjoin': 'Přístup k {product} čeká na vyřízení',
89
+ 'fabric.linking.request_access_description': 'Váš tým spolupracuje v {product}. Pošlete správci žádost o přístup.',
90
+ 'fabric.linking.request_access_pending': 'Čeká na schválení',
91
+ 'fabric.linking.request_access_pending_description': 'Vaše žádost o přístup z {hostname} čeká na schválení správcem.',
92
+ 'fabric.linking.request_access_pending_title': 'Přístup k {product} čeká na vyřízení',
96
93
  'fabric.linking.request_access_to_view': 'Chcete-li si zobrazit tento požadavek, požádejte o přístup ke službě {context}.',
97
94
  'fabric.linking.request_denied': 'Vaše žádost o přístup byla odmítnuta.',
98
- 'fabric.linking.request_denied_description': 'Vaše žádost o přístup byla odmítnuta. Pokud stále potřebujete přístup, obraťte se na správce webu.',
99
- 'fabric.linking.request_denied_description_crossjoin': 'Správce neschválil vaši žádost o zobrazení stránek {product} z {hostname}.',
95
+ 'fabric.linking.request_denied_description': 'Správce neschválil vaši žádost o zobrazení stránek {product} z {hostname}.',
100
96
  'fabric.linking.restricted_link': 'Omezený odkaz, zkuste jiný účet.',
101
97
  'fabric.linking.retry': 'Zkusit znovu',
102
98
  'fabric.linking.save': 'Uložit',