@nextcloud/vue 8.0.0-beta.6 → 8.0.0-beta.7

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 (253) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/Components/NcActionButton.cjs +1 -1
  3. package/dist/Components/NcActionButton.mjs +1 -1
  4. package/dist/Components/NcActionButtonGroup.cjs +1 -1
  5. package/dist/Components/NcActionButtonGroup.mjs +1 -1
  6. package/dist/Components/NcActionCaption.cjs +1 -1
  7. package/dist/Components/NcActionCaption.mjs +1 -1
  8. package/dist/Components/NcActionCheckbox.cjs +1 -1
  9. package/dist/Components/NcActionCheckbox.mjs +1 -1
  10. package/dist/Components/NcActionInput.cjs +1 -1
  11. package/dist/Components/NcActionInput.mjs +5 -5
  12. package/dist/Components/NcActionLink.cjs +1 -1
  13. package/dist/Components/NcActionLink.mjs +1 -1
  14. package/dist/Components/NcActionRadio.cjs +1 -1
  15. package/dist/Components/NcActionRadio.mjs +1 -1
  16. package/dist/Components/NcActionRouter.cjs +1 -1
  17. package/dist/Components/NcActionRouter.mjs +1 -1
  18. package/dist/Components/NcActionSeparator.cjs +1 -1
  19. package/dist/Components/NcActionSeparator.mjs +1 -1
  20. package/dist/Components/NcActionText.cjs +1 -1
  21. package/dist/Components/NcActionText.mjs +1 -1
  22. package/dist/Components/NcActionTextEditable.cjs +1 -1
  23. package/dist/Components/NcActionTextEditable.mjs +1 -1
  24. package/dist/Components/NcActions.cjs +1 -1
  25. package/dist/Components/NcActions.mjs +1 -1
  26. package/dist/Components/NcAppContent.cjs +1 -1
  27. package/dist/Components/NcAppContent.mjs +1 -1
  28. package/dist/Components/NcAppNavigation.cjs +1 -1
  29. package/dist/Components/NcAppNavigation.mjs +11 -11
  30. package/dist/Components/NcAppNavigationCaption.cjs +1 -1
  31. package/dist/Components/NcAppNavigationCaption.mjs +1 -1
  32. package/dist/Components/NcAppNavigationIconBullet.cjs +1 -1
  33. package/dist/Components/NcAppNavigationIconBullet.mjs +1 -1
  34. package/dist/Components/NcAppNavigationItem.cjs +1 -1
  35. package/dist/Components/NcAppNavigationItem.mjs +2 -2
  36. package/dist/Components/NcAppNavigationNew.cjs +1 -1
  37. package/dist/Components/NcAppNavigationNew.mjs +1 -1
  38. package/dist/Components/NcAppNavigationNewItem.cjs +1 -1
  39. package/dist/Components/NcAppNavigationNewItem.mjs +2 -2
  40. package/dist/Components/NcAppNavigationSettings.cjs +1 -1
  41. package/dist/Components/NcAppNavigationSettings.mjs +1 -1
  42. package/dist/Components/NcAppNavigationSpacer.cjs +1 -1
  43. package/dist/Components/NcAppNavigationSpacer.mjs +1 -1
  44. package/dist/Components/NcAppNavigationToggle.cjs +1 -1
  45. package/dist/Components/NcAppNavigationToggle.mjs +1 -1
  46. package/dist/Components/NcAppSettingsDialog.cjs +1 -1
  47. package/dist/Components/NcAppSettingsDialog.mjs +1 -1
  48. package/dist/Components/NcAppSettingsSection.cjs +1 -1
  49. package/dist/Components/NcAppSettingsSection.mjs +1 -1
  50. package/dist/Components/NcAppSidebar.cjs +1 -1
  51. package/dist/Components/NcAppSidebar.mjs +1 -1
  52. package/dist/Components/NcAppSidebarTab.cjs +1 -1
  53. package/dist/Components/NcAppSidebarTab.mjs +1 -1
  54. package/dist/Components/NcAvatar.cjs +1 -1
  55. package/dist/Components/NcAvatar.mjs +1 -1
  56. package/dist/Components/NcBreadcrumb.cjs +1 -1
  57. package/dist/Components/NcBreadcrumb.mjs +1 -1
  58. package/dist/Components/NcBreadcrumbs.cjs +1 -1
  59. package/dist/Components/NcBreadcrumbs.mjs +1 -1
  60. package/dist/Components/NcButton.cjs +1 -1
  61. package/dist/Components/NcButton.mjs +1 -1
  62. package/dist/Components/NcCheckboxRadioSwitch.cjs +1 -1
  63. package/dist/Components/NcCheckboxRadioSwitch.mjs +1 -1
  64. package/dist/Components/NcColorPicker.cjs +1 -1
  65. package/dist/Components/NcColorPicker.mjs +1 -1
  66. package/dist/Components/NcContent.cjs +1 -1
  67. package/dist/Components/NcContent.mjs +1 -1
  68. package/dist/Components/NcCounterBubble.cjs +1 -1
  69. package/dist/Components/NcCounterBubble.mjs +1 -1
  70. package/dist/Components/NcDashboardWidget.cjs +1 -1
  71. package/dist/Components/NcDashboardWidget.mjs +2 -2
  72. package/dist/Components/NcDashboardWidgetItem.cjs +1 -1
  73. package/dist/Components/NcDashboardWidgetItem.mjs +2 -2
  74. package/dist/Components/{NcDatetime.cjs → NcDateTime.cjs} +1 -1
  75. package/dist/Components/{NcDatetime.cjs.map → NcDateTime.cjs.map} +1 -1
  76. package/dist/Components/{NcDatetime.mjs → NcDateTime.mjs} +3 -3
  77. package/dist/Components/{NcDatetime.mjs.map → NcDateTime.mjs.map} +1 -1
  78. package/dist/Components/NcDateTimePicker.cjs +1 -0
  79. package/dist/Components/NcDateTimePicker.cjs.map +1 -0
  80. package/dist/Components/{NcDatetimePicker.mjs → NcDateTimePicker.mjs} +4 -4
  81. package/dist/Components/NcDateTimePicker.mjs.map +1 -0
  82. package/dist/Components/NcDateTimePickerNative.cjs +1 -1
  83. package/dist/Components/NcDateTimePickerNative.mjs +2 -2
  84. package/dist/Components/NcEllipsisedOption.cjs +1 -1
  85. package/dist/Components/NcEllipsisedOption.mjs +1 -1
  86. package/dist/Components/NcEmojiPicker.cjs +1 -1
  87. package/dist/Components/NcEmojiPicker.mjs +3 -3
  88. package/dist/Components/NcEmptyContent.cjs +1 -1
  89. package/dist/Components/NcEmptyContent.mjs +1 -1
  90. package/dist/Components/NcGuestContent.cjs +1 -1
  91. package/dist/Components/NcGuestContent.mjs +1 -1
  92. package/dist/Components/NcHeaderMenu.cjs +1 -1
  93. package/dist/Components/NcHeaderMenu.mjs +1 -1
  94. package/dist/Components/NcIconSvgWrapper.cjs +1 -1
  95. package/dist/Components/NcIconSvgWrapper.mjs +9 -12
  96. package/dist/Components/NcIconSvgWrapper.mjs.map +1 -1
  97. package/dist/Components/NcInputField.cjs +1 -1
  98. package/dist/Components/NcInputField.mjs +1 -1
  99. package/dist/Components/NcListItem.cjs +1 -1
  100. package/dist/Components/NcListItem.mjs +1 -1
  101. package/dist/Components/NcListItemIcon.cjs +1 -1
  102. package/dist/Components/NcListItemIcon.mjs +2 -2
  103. package/dist/Components/NcLoadingIcon.cjs +1 -1
  104. package/dist/Components/NcLoadingIcon.mjs +1 -1
  105. package/dist/Components/NcModal.cjs +1 -1
  106. package/dist/Components/NcModal.mjs +2 -2
  107. package/dist/Components/NcNoteCard.cjs +1 -1
  108. package/dist/Components/NcNoteCard.mjs +1 -1
  109. package/dist/Components/NcPopover.cjs +1 -1
  110. package/dist/Components/NcPopover.mjs +1 -1
  111. package/dist/Components/NcProgressBar.cjs +1 -1
  112. package/dist/Components/NcProgressBar.mjs +1 -1
  113. package/dist/Components/NcRelatedResourcesPanel.cjs +1 -1
  114. package/dist/Components/NcRelatedResourcesPanel.mjs +1 -1
  115. package/dist/Components/NcRichContenteditable.cjs +1 -1
  116. package/dist/Components/NcRichContenteditable.mjs +4 -4
  117. package/dist/Components/NcRichText.cjs +1 -1
  118. package/dist/Components/NcRichText.mjs +3 -3
  119. package/dist/Components/NcSelect.cjs +1 -1
  120. package/dist/Components/NcSelect.mjs +1 -1
  121. package/dist/Components/NcSettingsInputText.cjs +1 -1
  122. package/dist/Components/NcSettingsInputText.mjs +1 -1
  123. package/dist/Components/NcSettingsSection.cjs +1 -1
  124. package/dist/Components/NcSettingsSection.mjs +1 -1
  125. package/dist/Components/NcSettingsSelectGroup.cjs +1 -1
  126. package/dist/Components/NcSettingsSelectGroup.cjs.map +1 -1
  127. package/dist/Components/NcSettingsSelectGroup.mjs +3 -53
  128. package/dist/Components/NcSettingsSelectGroup.mjs.map +1 -1
  129. package/dist/Components/NcUserBubble.cjs +1 -1
  130. package/dist/Components/NcUserBubble.mjs +2 -2
  131. package/dist/Directives/Tooltip.cjs +1 -1
  132. package/dist/Directives/Tooltip.mjs +1 -1
  133. package/dist/Mixins/richEditor.cjs +1 -1
  134. package/dist/Mixins/richEditor.mjs +1 -1
  135. package/dist/assets/NcSettingsSelectGroup-e88cbf1a.css +21 -0
  136. package/dist/assets/{index8.css → index-66b19339.css} +1 -1
  137. package/dist/assets/{index36.css → index-7f55fed2.css} +1 -1
  138. package/dist/assets/index-82b5969a.css +21 -0
  139. package/dist/assets/{index37.css → index-a999ba9f.css} +1 -1
  140. package/dist/assets/index-ef0bca81.css +42 -0
  141. package/dist/chunks/NcAppNavigationToggle-5f3b9b9a.cjs +1 -0
  142. package/dist/chunks/NcAppNavigationToggle-5f3b9b9a.cjs.map +1 -0
  143. package/dist/chunks/{NcAppNavigationToggle-5aa396d7.mjs → NcAppNavigationToggle-86cc2542.mjs} +1 -1
  144. package/dist/chunks/NcAppNavigationToggle-86cc2542.mjs.map +1 -0
  145. package/dist/chunks/{NcInputConfirmCancel-c440e1b1.mjs → NcInputConfirmCancel-0cd93e0e.mjs} +1 -1
  146. package/dist/chunks/NcInputConfirmCancel-0cd93e0e.mjs.map +1 -0
  147. package/dist/chunks/NcInputConfirmCancel-17c8ddfb.cjs +1 -0
  148. package/dist/chunks/NcInputConfirmCancel-17c8ddfb.cjs.map +1 -0
  149. package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_357e6d0e_lang-072bbb05.cjs.map +1 -0
  150. package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_357e6d0e_lang-55016398.mjs.map +1 -0
  151. package/dist/chunks/{NcRichText-1e8854a1.cjs → NcRichText-3c54a3cc.cjs} +1 -1
  152. package/dist/chunks/{NcRichText-1e8854a1.cjs.map → NcRichText-3c54a3cc.cjs.map} +1 -1
  153. package/dist/chunks/{NcRichText-13b09624.mjs → NcRichText-bb9d3893.mjs} +1 -1
  154. package/dist/chunks/{NcRichText-13b09624.mjs.map → NcRichText-bb9d3893.mjs.map} +1 -1
  155. package/dist/chunks/NcSettingsSelectGroup-0be1fe91.mjs +58 -0
  156. package/dist/chunks/NcSettingsSelectGroup-0be1fe91.mjs.map +1 -0
  157. package/dist/chunks/NcSettingsSelectGroup-62ca94a9.cjs +1 -0
  158. package/dist/chunks/NcSettingsSelectGroup-62ca94a9.cjs.map +1 -0
  159. package/dist/chunks/{ScopeComponent-dbcd0e07.mjs → ScopeComponent-1f3a7612.mjs} +1 -1
  160. package/dist/chunks/{ScopeComponent-dbcd0e07.mjs.map → ScopeComponent-1f3a7612.mjs.map} +1 -1
  161. package/dist/chunks/{ScopeComponent-f6122f5a.cjs → ScopeComponent-4b8bd1ee.cjs} +1 -1
  162. package/dist/chunks/{ScopeComponent-f6122f5a.cjs.map → ScopeComponent-4b8bd1ee.cjs.map} +1 -1
  163. package/dist/chunks/{index-7aa3fc24.mjs → index-197226c7.mjs} +1 -1
  164. package/dist/chunks/{index-7aa3fc24.mjs.map → index-197226c7.mjs.map} +1 -1
  165. package/dist/chunks/{index-9c621303.mjs.map → index-377488aa.mjs.map} +1 -1
  166. package/dist/chunks/{index-c4cd0463.cjs.map → index-858938bd.cjs.map} +1 -1
  167. package/dist/chunks/index-cebd6e80.cjs +1 -0
  168. package/dist/chunks/index-cebd6e80.cjs.map +1 -0
  169. package/dist/chunks/referencePickerModal-6120a321.cjs +1 -0
  170. package/dist/chunks/referencePickerModal-6120a321.cjs.map +1 -0
  171. package/dist/chunks/{referencePickerModal-2b16b319.mjs → referencePickerModal-d0573462.mjs} +1 -1
  172. package/dist/chunks/{referencePickerModal-2b16b319.mjs.map → referencePickerModal-d0573462.mjs.map} +1 -1
  173. package/dist/index.cjs +1 -1
  174. package/dist/index.cjs.map +1 -1
  175. package/dist/index.mjs +69 -65
  176. package/dist/index.mjs.map +1 -1
  177. package/package.json +7 -7
  178. package/dist/Components/NcDatetimePicker.cjs +0 -1
  179. package/dist/Components/NcDatetimePicker.cjs.map +0 -1
  180. package/dist/Components/NcDatetimePicker.mjs.map +0 -1
  181. package/dist/assets/index12.css +0 -21
  182. package/dist/assets/index58.css +0 -42
  183. package/dist/chunks/NcAppNavigationToggle-5aa396d7.mjs.map +0 -1
  184. package/dist/chunks/NcAppNavigationToggle-c566f66e.cjs +0 -1
  185. package/dist/chunks/NcAppNavigationToggle-c566f66e.cjs.map +0 -1
  186. package/dist/chunks/NcInputConfirmCancel-77c2b04f.cjs +0 -1
  187. package/dist/chunks/NcInputConfirmCancel-77c2b04f.cjs.map +0 -1
  188. package/dist/chunks/NcInputConfirmCancel-c440e1b1.mjs.map +0 -1
  189. package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_357e6d0e_lang-b35c2f97.cjs.map +0 -1
  190. package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_357e6d0e_lang-b99cdc21.mjs.map +0 -1
  191. package/dist/chunks/index-12fa9b26.cjs +0 -1
  192. package/dist/chunks/index-12fa9b26.cjs.map +0 -1
  193. package/dist/chunks/referencePickerModal-44160fb3.cjs +0 -1
  194. package/dist/chunks/referencePickerModal-44160fb3.cjs.map +0 -1
  195. /package/dist/assets/{NcAppNavigationToggle.css → NcAppNavigationToggle-110970cd.css} +0 -0
  196. /package/dist/assets/{NcInputConfirmCancel.css → NcInputConfirmCancel-c1d05dd9.css} +0 -0
  197. /package/dist/assets/{NcMentionBubble.css → NcMentionBubble-67378a12.css} +0 -0
  198. /package/dist/assets/{index3.css → index-19f059f6.css} +0 -0
  199. /package/dist/assets/{index9.css → index-1d28ce70.css} +0 -0
  200. /package/dist/assets/{index29.css → index-23405a74.css} +0 -0
  201. /package/dist/assets/{index49.css → index-25b448e3.css} +0 -0
  202. /package/dist/assets/{index33.css → index-29421a2e.css} +0 -0
  203. /package/dist/assets/{index15.css → index-2cedaf24.css} +0 -0
  204. /package/dist/assets/{index53.css → index-30d74459.css} +0 -0
  205. /package/dist/assets/{index52.css → index-317f55be.css} +0 -0
  206. /package/dist/assets/{index7.css → index-34f6bb3f.css} +0 -0
  207. /package/dist/assets/{index38.css → index-37970f20.css} +0 -0
  208. /package/dist/assets/{index44.css → index-3aba62de.css} +0 -0
  209. /package/dist/assets/{index47.css → index-3b76db9b.css} +0 -0
  210. /package/dist/assets/{index28.css → index-3e8ea1d6.css} +0 -0
  211. /package/dist/assets/{index30.css → index-47fab7bf.css} +0 -0
  212. /package/dist/assets/{index16.css → index-49a0d570.css} +0 -0
  213. /package/dist/assets/{index51.css → index-4a4c1700.css} +0 -0
  214. /package/dist/assets/{index6.css → index-4a4c2637.css} +0 -0
  215. /package/dist/assets/{index27.css → index-4efbac36.css} +0 -0
  216. /package/dist/assets/{index57.css → index-6140ff62.css} +0 -0
  217. /package/dist/assets/{index41.css → index-6cb0dc4a.css} +0 -0
  218. /package/dist/assets/{index50.css → index-6f63d18f.css} +0 -0
  219. /package/dist/assets/{index18.css → index-76287c8f.css} +0 -0
  220. /package/dist/assets/{index13.css → index-7a7195d0.css} +0 -0
  221. /package/dist/assets/{index25.css → index-7e084b52.css} +0 -0
  222. /package/dist/assets/{index10.css → index-7ffde264.css} +0 -0
  223. /package/dist/assets/{index39.css → index-81f5e4c8.css} +0 -0
  224. /package/dist/assets/{index48.css → index-823ec431.css} +0 -0
  225. /package/dist/assets/{index4.css → index-852d8576.css} +0 -0
  226. /package/dist/assets/{index19.css → index-8f58dd75.css} +0 -0
  227. /package/dist/assets/{index43.css → index-935fa6f9.css} +0 -0
  228. /package/dist/assets/{index34.css → index-939ba6f0.css} +0 -0
  229. /package/dist/assets/{index31.css → index-a17dfbc4.css} +0 -0
  230. /package/dist/assets/{index56.css → index-a4a40fa3.css} +0 -0
  231. /package/dist/assets/{index24.css → index-a50a8de6.css} +0 -0
  232. /package/dist/assets/{index35.css → index-a513dcd5.css} +0 -0
  233. /package/dist/assets/{index55.css → index-a8c5cf75.css} +0 -0
  234. /package/dist/assets/{index40.css → index-afc15e11.css} +0 -0
  235. /package/dist/assets/{index23.css → index-b814f5fa.css} +0 -0
  236. /package/dist/assets/{index26.css → index-ba6ad1b4.css} +0 -0
  237. /package/dist/assets/{index14.css → index-bf10e8e1.css} +0 -0
  238. /package/dist/assets/{index22.css → index-bf46edd7.css} +0 -0
  239. /package/dist/assets/{index54.css → index-c6d7f3b0.css} +0 -0
  240. /package/dist/assets/{index20.css → index-c736204a.css} +0 -0
  241. /package/dist/assets/{index46.css → index-cb18d6f3.css} +0 -0
  242. /package/dist/assets/{index42.css → index-cb76ef23.css} +0 -0
  243. /package/dist/assets/{index32.css → index-cc70a006.css} +0 -0
  244. /package/dist/assets/{index2.css → index-dd464a52.css} +0 -0
  245. /package/dist/assets/{index11.css → index-e0ceef85.css} +0 -0
  246. /package/dist/assets/{index45.css → index-ecdb616f.css} +0 -0
  247. /package/dist/assets/{index.css → index-ee410fad.css} +0 -0
  248. /package/dist/assets/{index17.css → index-f1030e54.css} +0 -0
  249. /package/dist/assets/{index21.css → index-f6ca40ca.css} +0 -0
  250. /package/dist/assets/{index5.css → index-f8466b88.css} +0 -0
  251. /package/dist/assets/{referencePickerModal.css → referencePickerModal-41e4705a.css} +0 -0
  252. /package/dist/chunks/{index-9c621303.mjs → index-377488aa.mjs} +0 -0
  253. /package/dist/chunks/{index-c4cd0463.cjs → index-858938bd.cjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"NcRichText-1e8854a1.cjs","sources":["../../src/components/NcRichText/helpers.js","../../src/components/NcRichText/NcReferenceList.vue","../../src/components/NcRichText/autolink.js","../../src/components/NcRichText/placeholder.js","../../src/components/NcRichText/NcRichText.vue"],"sourcesContent":["/**\n * Regex pattern to match links to be resolved by the link-reference provider\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN = /(\\s|^)(https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z]+(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\\s|$)/ig\n\n/**\n * Regex pattern to identify strings as links and then making them clickable\n * Opposed to the above regex this one also matches IP addresses, which we would like to be clickable,\n * but in general resolving references for them might mostly not work,\n * as the link provider checks for local addresses and does not resolve them.\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN_AUTOLINK = /(\\s|\\(|^)((https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z0-9]+(?::[0-9]+)?(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*))(?=\\s|\\)|$)/ig\n","<template>\n\t<div v-if=\"isVisible\" class=\"widgets--list\" :class=\"{'icon-loading': loading }\">\n\t\t<div v-for=\"reference in displayedReferences\" :key=\"reference?.openGraphObject?.id\">\n\t\t\t<NcReferenceWidget :reference=\"reference\" />\n\t\t</div>\n\t</div>\n</template>\n<script>\nimport NcReferenceWidget from './NcReferenceWidget.vue'\nimport { URL_PATTERN } from './helpers.js'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcReferenceList',\n\tcomponents: {\n\t\tNcReferenceWidget,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\treferenceData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\treferences: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tcomputed: {\n\t\tisVisible() {\n\t\t\treturn this.loading || this.displayedReferences\n\t\t},\n\t\tvalues() {\n\t\t\treturn this.referenceData\n\t\t\t\t? this.referenceData\n\t\t\t\t: (this.references ? Object.values(this.references) : [])\n\t\t},\n\t\tfirstReference() {\n\t\t\treturn this.values[0] ?? null\n\t\t},\n\t\tdisplayedReferences() {\n\t\t\treturn this.values.slice(0, this.limit)\n\t\t},\n\t},\n\twatch: {\n\t\ttext: 'fetch',\n\t},\n\tmounted() {\n\t\tthis.fetch()\n\t},\n\tmethods: {\n\t\tfetch() {\n\t\t\tthis.loading = true\n\t\t\tif (this.referenceData) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!(new RegExp(URL_PATTERN).exec(this.text))) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.resolve().then((response) => {\n\t\t\t\tthis.references = response.data.ocs.data.references\n\t\t\t\tthis.loading = false\n\t\t\t}).catch((error) => {\n\t\t\t\tconsole.error('Failed to extract references', error)\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\tresolve() {\n\t\t\tconst match = (new RegExp(URL_PATTERN).exec(this.text.trim()))\n\t\t\tif (this.limit === 1 && match) {\n\t\t\t\treturn axios.get(generateOcsUrl('references/resolve', 2) + `?reference=${encodeURIComponent(match[0])}`)\n\t\t\t}\n\n\t\t\treturn axios.post(generateOcsUrl('references/extract', 2), {\n\t\t\t\ttext: this.text,\n\t\t\t\tresolve: true,\n\t\t\t\tlimit: this.limit,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.widgets--list.icon-loading {\n\tmin-height: 44px;\n}\n</style>\n","import { URL_PATTERN_AUTOLINK } from './helpers.js'\n\nimport { visit, SKIP } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nconst NcLink = {\n\tname: 'NcLink',\n\tprops: {\n\t\thref: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\trender(h) {\n\t\treturn h('a', {\n\t\t\tattrs: {\n\t\t\t\thref: this.href,\n\t\t\t\trel: 'noopener noreferrer',\n\t\t\t\ttarget: '_blank',\n\t\t\t\tclass: 'rich-text--external-link',\n\t\t\t},\n\t\t}, [this.href.trim()])\n\t},\n}\n\nexport const remarkAutolink = function({ autolink, useMarkdown }) {\n\treturn function(tree) {\n\n\t\tif (!useMarkdown || !autolink) {\n\t\t\treturn\n\t\t}\n\n\t\tvisit(tree, (node) => node.type === 'text', (node, index, parent) => {\n\t\t\tlet parsed = parseUrl(node.value)\n\t\t\tparsed = parsed.map((n) => {\n\t\t\t\tif (typeof n === 'string') {\n\t\t\t\t\treturn u('text', n)\n\t\t\t\t}\n\n\t\t\t\treturn u('link', {\n\t\t\t\t\turl: n.props.href,\n\t\t\t\t}, [u('text', n.props.href)])\n\t\t\t}).filter((x) => x)\n\n\t\t\tparent.children.splice(index, 1, ...parsed.flat())\n\t\t\treturn [SKIP, index + parsed.flat().length]\n\t\t})\n\t}\n}\n\nexport const parseUrl = (text) => {\n\tlet match = URL_PATTERN_AUTOLINK.exec(text)\n\tconst list = []\n\tlet start = 0\n\twhile (match !== null) {\n\t\tlet href = match[2]\n\t\tlet textAfter\n\t\tlet textBefore = text.substring(start, match.index + match[1].length)\n\t\tif (href[0] === ' ') {\n\t\t\ttextBefore += href[0]\n\t\t\thref = href.substring(1).trim()\n\t\t}\n\t\tconst lastChar = href[(href.length - 1)]\n\t\tif (lastChar === '.' || lastChar === ',' || lastChar === ';' || (match[0][0] === '(' && lastChar === ')')) {\n\t\t\thref = href.substring(0, href.length - 1)\n\t\t\ttextAfter = lastChar\n\t\t}\n\t\tlist.push(textBefore)\n\t\tlist.push({ component: NcLink, props: { href } })\n\t\tif (textAfter) {\n\t\t\tlist.push(textAfter)\n\t\t}\n\t\tstart = match.index + match[0].length\n\t\tmatch = URL_PATTERN_AUTOLINK.exec(text)\n\t}\n\tlist.push(text.substring(start))\n\tconst joinedText = list.map((item) => typeof item === 'string' ? item : item.props.href).join('')\n\tif (text === joinedText) {\n\t\treturn list\n\t}\n\tconsole.error('Failed to reassemble the chunked text: ' + text)\n\treturn text\n}\n","import { parseUrl } from './autolink.js'\n\nimport { visit } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nexport const remarkPlaceholder = function() {\n\treturn function(ast) {\n\t\tvisit(ast, (node) => node.type === 'text', visitor)\n\n\t\t/**\n\t\t *\n\t\t * @param {object} node The node\n\t\t * @param {number} index The index of the node\n\t\t * @param {object} parent The parent node\n\t\t */\n\t\tfunction visitor(node, index, parent) {\n\t\t\tconst placeholders = node.value.split(/(\\{[a-z\\-_.0-9]+\\})/ig)\n\t\t\t\t.map((entry, index, list) => {\n\t\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\treturn u('text', entry)\n\t\t\t\t\t}\n\t\t\t\t\tconst [, component] = matches\n\t\t\t\t\treturn u('element', {\n\t\t\t\t\t\ttagName: `#${component}`,\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\tparent.children.splice(index, 1, ...placeholders)\n\t\t}\n\t}\n}\n\nexport const prepareTextNode = ({ h, context }, text) => {\n\tif (context.autolink) {\n\t\ttext = parseUrl(text)\n\t}\n\tif (Array.isArray(text)) {\n\t\treturn text.map((entry) => {\n\t\t\tif (typeof entry === 'string') {\n\t\t\t\treturn entry\n\t\t\t}\n\t\t\tconst { component, props } = entry\n\t\t\t// do not override class of NcLink\n\t\t\tconst componentClass = component.name === 'NcLink' ? undefined : 'rich-text--component'\n\t\t\treturn h(component, {\n\t\t\t\tprops,\n\t\t\t\tclass: componentClass,\n\t\t\t})\n\t\t})\n\t}\n\treturn text\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n - @author Guido Krömer <mail@cacodaemon.de>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<docs>\n### General description\n\nThis component displays rich text with optional autolink or [Markdown support](https://www.markdownguide.org/basic-syntax/).\n\n```vue\n<template>\n\t<div>\n\t\t<textarea v-model=\"text\" />\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText\n\t\t\t:class=\"{'plain-text': !useMarkdown }\"\n\t\t\t:text=\"text\" :autolink=\"autolink\" :arguments=\"args\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\ttext: `## Hello everyone 🎉\nThe file {file} was added by {username}. Visit https://nextcloud.com to check it!\n\nSome examples for markdown syntax:\n1. **bold text**\n2. _italic text_\n3. example of \\`inline code\\`\n\n> blockquote example\n`,\n\t\t\tautolink: true,\n\t\t\tuseMarkdown: true,\n\t\t\targs: {\n\t\t\t\tfile: 'MyDocument.odt',\n\t\t\t\tusername: {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Jane Doe'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n}\n</script>\n<style lang=\"scss\">\ntextarea {\n\twidth: 100%;\n\theight: 200px;\n}\n\n.plain-text {\n\twhite-space: pre-line;\n}\n</style>\n```\n\n### Usage with NcRichContenteditable\n\nSee [NcRichContenteditable](#/Components/NcRichContenteditable) documentation for more information\n\n```vue\n<template>\n\t<div>\n\t\t<NcRichContenteditable :value.sync=\"message\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:maxlength=\"100\"\n\t\t\t:user-data=\"userData\"\n\t\t\tplaceholder=\"Try mentioning user @Test01 or inserting emoji :smile\"\n\t\t\t@submit=\"onSubmit\" />\n\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText :text=\"text\"\n\t\t\t:autolink=\"autolink\"\n\t\t\t:arguments=\"userMentions\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tmessage: '',\n\t\t\t\tautolink: true,\n\t\t\t\tuseMarkdown: true,\n\t\t\t\tuserData: {\n\t\t\t\t\tTest01: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test01',\n\t\t\t\t\t\ttitle: 'Test01',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t},\n\t\t\t\t\tTest02: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test02',\n\t\t\t\t\t\ttitle: 'Test02',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Visiting London',\n\t\t\t\t\t\t\tstatus: 'away',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test@User': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test@User',\n\t\t\t\t\t\ttitle: 'Test 03',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Having space in my name',\n\t\t\t\t\t\t\tstatus: 'online',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test Offline': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test Offline',\n\t\t\t\t\t\ttitle: 'Test Offline',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: null,\n\t\t\t\t\t\t\tstatus: 'offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: null,\n\t\t\t\t\t},\n\t\t\t\t\t'Test DND': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test DND',\n\t\t\t\t\t\ttitle: 'Test DND',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: 'Out sick',\n\t\t\t\t\t\t\tstatus: 'dnd',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Out sick',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tuserMentions: {\n\t\t\t\t\t'user-1': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test01',\n\t\t\t\t\t\t\tuser: 'Test01',\n\t\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-2': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test02',\n\t\t\t\t\t\t\tuser: 'Test02',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-3': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test 03',\n\t\t\t\t\t\t\tuser: 'Test@User',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-4': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test Offline',\n\t\t\t\t\t\t\tuser: 'Test Offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-5': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test DND',\n\t\t\t\t\t\t\tuser: 'Test DND',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttext() {\n\t\t\t\treturn this.message\n\t\t\t\t\t\t.replace('@Test01', '{user-1}')\n\t\t\t\t\t\t.replace('@Test02', '{user-2}')\n\t\t\t\t\t\t.replace('@Test@User', '{user-3}')\n\t\t\t\t\t\t.replace('@\"Test Offline\"', '{user-4}')\n\t\t\t\t\t\t.replace('@\"Test DND\"', '{user-5}')\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\tautoComplete(search, callback) {\n\t\t\t\tcallback(Object.values(this.userData))\n\t\t\t},\n\t\t\tonSubmit() {\n\t\t\t\talert(this.message)\n\t\t\t}\n\t\t}\n\t}\n</script>\n```\n</docs>\n\n<script>\nimport NcReferenceList from './NcReferenceList.vue'\nimport { remarkAutolink } from './autolink.js'\nimport { remarkPlaceholder, prepareTextNode } from './placeholder.js'\n\nimport { unified } from 'unified'\nimport markdown from 'remark-parse'\nimport breaks from 'remark-breaks'\nimport remark2rehype from 'remark-rehype'\nimport rehype2react from 'rehype-react'\nimport rehypeExternalLinks from 'rehype-external-links'\n\nexport default {\n\tname: 'NcRichText',\n\tcomponents: {\n\t\tNcReferenceList,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\targuments: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {}\n\t\t\t},\n\t\t},\n\t\treferenceLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\t/** Provide data upfront to avoid extra http request */\n\t\treferences: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tmarkdownCssClasses: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {\n\t\t\t\t\ta: 'rich-text--external-link',\n\t\t\t\t\tol: 'rich-text--ordered-list',\n\t\t\t\t\tul: 'rich-text--un-ordered-list',\n\t\t\t\t\tli: 'rich-text--list-item',\n\t\t\t\t\tstrong: 'rich-text--strong',\n\t\t\t\t\tem: 'rich-text--italic',\n\t\t\t\t\th1: 'rich-text--heading rich-text--heading-1',\n\t\t\t\t\th2: 'rich-text--heading rich-text--heading-2',\n\t\t\t\t\th3: 'rich-text--heading rich-text--heading-3',\n\t\t\t\t\th4: 'rich-text--heading rich-text--heading-4',\n\t\t\t\t\th5: 'rich-text--heading rich-text--heading-5',\n\t\t\t\t\th6: 'rich-text--heading rich-text--heading-6',\n\t\t\t\t\thr: 'rich-text--hr',\n\t\t\t\t\ttable: 'rich-text--table',\n\t\t\t\t\tpre: 'rich-text--pre',\n\t\t\t\t\tcode: 'rich-text--code',\n\t\t\t\t\tblockquote: 'rich-text--blockquote',\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tuseMarkdown: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tautolink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tmethods: {\n\t\trenderPlaintext(h) {\n\t\t\tconst context = this\n\t\t\tconst placeholders = this.text.split(/(\\{[a-z\\-_.0-9]+\\})/ig).map(function(entry, index, list) {\n\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t// just return plain string nodes as text\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn prepareTextNode({ h, context }, entry)\n\t\t\t\t}\n\t\t\t\t// return component instance if argument is an object\n\t\t\t\tconst argumentId = matches[1]\n\t\t\t\tconst argument = context.arguments[argumentId]\n\t\t\t\tif (typeof argument === 'object') {\n\t\t\t\t\tconst { component, props } = argument\n\t\t\t\t\treturn h(component, {\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (argument) {\n\t\t\t\t\treturn h('span', { class: 'rich-text--fallback' }, argument)\n\t\t\t\t}\n\t\t\t\treturn entry\n\t\t\t})\n\t\t\treturn h('div', { class: 'rich-text--wrapper' }, [\n\t\t\t\th('div', {}, placeholders.flat()),\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t\trenderMarkdown(h) {\n\t\t\tconst renderedMarkdown = unified()\n\t\t\t\t.use(markdown)\n\t\t\t\t.use(remarkAutolink, {\n\t\t\t\t\tautolink: this.autolink,\n\t\t\t\t\tuseMarkdown: this.useMarkdown,\n\t\t\t\t})\n\t\t\t\t.use(breaks)\n\t\t\t\t.use(remark2rehype, {\n\t\t\t\t\thandlers: {\n\t\t\t\t\t\tcomponent(toHast, node) {\n\t\t\t\t\t\t\treturn toHast(node, node.component, { value: node.value })\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t// .use(rehypeAddClasses, this.markdownCssClasses)\n\t\t\t\t.use(remarkPlaceholder)\n\t\t\t\t.use(rehypeExternalLinks, {\n\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\trel: ['noopener noreferrer'],\n\t\t\t\t})\n\t\t\t\t.use(rehype2react, {\n\t\t\t\t\tcreateElement: (tag, attrs, children) => {\n\t\t\t\t\t\t// unescape special symbol \"<\" for simple text nodes\n\t\t\t\t\t\tchildren = children?.map(child => typeof child === 'string'\n\t\t\t\t\t\t\t? child.replace(/&lt;/gmi, '<')\n\t\t\t\t\t\t\t: child,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tif (!tag.startsWith('#')) {\n\t\t\t\t\t\t\treturn h(tag, attrs, children)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst placeholder = this.arguments[tag.slice(1)]\n\t\t\t\t\t\tif (!placeholder) {\n\t\t\t\t\t\t\treturn h('span', { ...{ attrs }, ...{ class: 'rich-text--fallback' } }, [`{${tag.slice(1)}}`])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!placeholder.component) {\n\t\t\t\t\t\t\treturn h('span', attrs, [placeholder])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\tplaceholder.component,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t\tprops: placeholder.props,\n\t\t\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\tprefix: false,\n\t\t\t\t})\n\t\t\t\t.processSync(this.text\n\t\t\t\t\t// escape special symbol \"<\" to not treat text as HTML\n\t\t\t\t\t.replace(/</gmi, '&lt;')\n\t\t\t\t\t// unescape special symbol \">\" to parse blockquotes\n\t\t\t\t\t.replace(/&gt;/gmi, '>')\n\t\t\t\t)\n\t\t\t\t.result\n\n\t\t\treturn h('div', { class: 'rich-text--wrapper rich-text--wrapper-markdown' }, [\n\t\t\t\trenderedMarkdown,\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t},\n\trender(h) {\n\t\treturn this.useMarkdown\n\t\t\t? this.renderMarkdown(h)\n\t\t\t: this.renderPlaintext(h)\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n/* stylelint-disable-next-line scss/at-import-partial-extension */\n@import './richtext.scss';\n\na:not(.rich-text--component) {\n\ttext-decoration: underline;\n}\n</style>\n"],"names":["URL_PATTERN","URL_PATTERN_AUTOLINK","_sfc_main","NcReferenceWidget","_a","response","error","match","axios","generateOcsUrl","NcLink","h","remarkAutolink","autolink","useMarkdown","tree","visit","node","index","parent","parsed","parseUrl","n","u","x","SKIP","text","list","start","href","textAfter","textBefore","lastChar","joinedText","item","remarkPlaceholder","ast","visitor","placeholders","entry","matches","component","prepareTextNode","context","props","componentClass","NcReferenceList","argumentId","argument","renderedMarkdown","unified","markdown","breaks","remark2rehype","toHast","rehypeExternalLinks","rehype2react","tag","attrs","children","child","placeholder"],"mappings":"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"}
1
+ {"version":3,"file":"NcRichText-3c54a3cc.cjs","sources":["../../src/components/NcRichText/helpers.js","../../src/components/NcRichText/NcReferenceList.vue","../../src/components/NcRichText/autolink.js","../../src/components/NcRichText/placeholder.js","../../src/components/NcRichText/NcRichText.vue"],"sourcesContent":["/**\n * Regex pattern to match links to be resolved by the link-reference provider\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN = /(\\s|^)(https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z]+(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\\s|$)/ig\n\n/**\n * Regex pattern to identify strings as links and then making them clickable\n * Opposed to the above regex this one also matches IP addresses, which we would like to be clickable,\n * but in general resolving references for them might mostly not work,\n * as the link provider checks for local addresses and does not resolve them.\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN_AUTOLINK = /(\\s|\\(|^)((https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z0-9]+(?::[0-9]+)?(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*))(?=\\s|\\)|$)/ig\n","<template>\n\t<div v-if=\"isVisible\" class=\"widgets--list\" :class=\"{'icon-loading': loading }\">\n\t\t<div v-for=\"reference in displayedReferences\" :key=\"reference?.openGraphObject?.id\">\n\t\t\t<NcReferenceWidget :reference=\"reference\" />\n\t\t</div>\n\t</div>\n</template>\n<script>\nimport NcReferenceWidget from './NcReferenceWidget.vue'\nimport { URL_PATTERN } from './helpers.js'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcReferenceList',\n\tcomponents: {\n\t\tNcReferenceWidget,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\treferenceData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\treferences: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tcomputed: {\n\t\tisVisible() {\n\t\t\treturn this.loading || this.displayedReferences\n\t\t},\n\t\tvalues() {\n\t\t\treturn this.referenceData\n\t\t\t\t? this.referenceData\n\t\t\t\t: (this.references ? Object.values(this.references) : [])\n\t\t},\n\t\tfirstReference() {\n\t\t\treturn this.values[0] ?? null\n\t\t},\n\t\tdisplayedReferences() {\n\t\t\treturn this.values.slice(0, this.limit)\n\t\t},\n\t},\n\twatch: {\n\t\ttext: 'fetch',\n\t},\n\tmounted() {\n\t\tthis.fetch()\n\t},\n\tmethods: {\n\t\tfetch() {\n\t\t\tthis.loading = true\n\t\t\tif (this.referenceData) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!(new RegExp(URL_PATTERN).exec(this.text))) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.resolve().then((response) => {\n\t\t\t\tthis.references = response.data.ocs.data.references\n\t\t\t\tthis.loading = false\n\t\t\t}).catch((error) => {\n\t\t\t\tconsole.error('Failed to extract references', error)\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\tresolve() {\n\t\t\tconst match = (new RegExp(URL_PATTERN).exec(this.text.trim()))\n\t\t\tif (this.limit === 1 && match) {\n\t\t\t\treturn axios.get(generateOcsUrl('references/resolve', 2) + `?reference=${encodeURIComponent(match[0])}`)\n\t\t\t}\n\n\t\t\treturn axios.post(generateOcsUrl('references/extract', 2), {\n\t\t\t\ttext: this.text,\n\t\t\t\tresolve: true,\n\t\t\t\tlimit: this.limit,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.widgets--list.icon-loading {\n\tmin-height: 44px;\n}\n</style>\n","import { URL_PATTERN_AUTOLINK } from './helpers.js'\n\nimport { visit, SKIP } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nconst NcLink = {\n\tname: 'NcLink',\n\tprops: {\n\t\thref: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\trender(h) {\n\t\treturn h('a', {\n\t\t\tattrs: {\n\t\t\t\thref: this.href,\n\t\t\t\trel: 'noopener noreferrer',\n\t\t\t\ttarget: '_blank',\n\t\t\t\tclass: 'rich-text--external-link',\n\t\t\t},\n\t\t}, [this.href.trim()])\n\t},\n}\n\nexport const remarkAutolink = function({ autolink, useMarkdown }) {\n\treturn function(tree) {\n\n\t\tif (!useMarkdown || !autolink) {\n\t\t\treturn\n\t\t}\n\n\t\tvisit(tree, (node) => node.type === 'text', (node, index, parent) => {\n\t\t\tlet parsed = parseUrl(node.value)\n\t\t\tparsed = parsed.map((n) => {\n\t\t\t\tif (typeof n === 'string') {\n\t\t\t\t\treturn u('text', n)\n\t\t\t\t}\n\n\t\t\t\treturn u('link', {\n\t\t\t\t\turl: n.props.href,\n\t\t\t\t}, [u('text', n.props.href)])\n\t\t\t}).filter((x) => x)\n\n\t\t\tparent.children.splice(index, 1, ...parsed.flat())\n\t\t\treturn [SKIP, index + parsed.flat().length]\n\t\t})\n\t}\n}\n\nexport const parseUrl = (text) => {\n\tlet match = URL_PATTERN_AUTOLINK.exec(text)\n\tconst list = []\n\tlet start = 0\n\twhile (match !== null) {\n\t\tlet href = match[2]\n\t\tlet textAfter\n\t\tlet textBefore = text.substring(start, match.index + match[1].length)\n\t\tif (href[0] === ' ') {\n\t\t\ttextBefore += href[0]\n\t\t\thref = href.substring(1).trim()\n\t\t}\n\t\tconst lastChar = href[(href.length - 1)]\n\t\tif (lastChar === '.' || lastChar === ',' || lastChar === ';' || (match[0][0] === '(' && lastChar === ')')) {\n\t\t\thref = href.substring(0, href.length - 1)\n\t\t\ttextAfter = lastChar\n\t\t}\n\t\tlist.push(textBefore)\n\t\tlist.push({ component: NcLink, props: { href } })\n\t\tif (textAfter) {\n\t\t\tlist.push(textAfter)\n\t\t}\n\t\tstart = match.index + match[0].length\n\t\tmatch = URL_PATTERN_AUTOLINK.exec(text)\n\t}\n\tlist.push(text.substring(start))\n\tconst joinedText = list.map((item) => typeof item === 'string' ? item : item.props.href).join('')\n\tif (text === joinedText) {\n\t\treturn list\n\t}\n\tconsole.error('Failed to reassemble the chunked text: ' + text)\n\treturn text\n}\n","import { parseUrl } from './autolink.js'\n\nimport { visit } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nexport const remarkPlaceholder = function() {\n\treturn function(ast) {\n\t\tvisit(ast, (node) => node.type === 'text', visitor)\n\n\t\t/**\n\t\t *\n\t\t * @param {object} node The node\n\t\t * @param {number} index The index of the node\n\t\t * @param {object} parent The parent node\n\t\t */\n\t\tfunction visitor(node, index, parent) {\n\t\t\tconst placeholders = node.value.split(/(\\{[a-z\\-_.0-9]+\\})/ig)\n\t\t\t\t.map((entry, index, list) => {\n\t\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\treturn u('text', entry)\n\t\t\t\t\t}\n\t\t\t\t\tconst [, component] = matches\n\t\t\t\t\treturn u('element', {\n\t\t\t\t\t\ttagName: `#${component}`,\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\tparent.children.splice(index, 1, ...placeholders)\n\t\t}\n\t}\n}\n\nexport const prepareTextNode = ({ h, context }, text) => {\n\tif (context.autolink) {\n\t\ttext = parseUrl(text)\n\t}\n\tif (Array.isArray(text)) {\n\t\treturn text.map((entry) => {\n\t\t\tif (typeof entry === 'string') {\n\t\t\t\treturn entry\n\t\t\t}\n\t\t\tconst { component, props } = entry\n\t\t\t// do not override class of NcLink\n\t\t\tconst componentClass = component.name === 'NcLink' ? undefined : 'rich-text--component'\n\t\t\treturn h(component, {\n\t\t\t\tprops,\n\t\t\t\tclass: componentClass,\n\t\t\t})\n\t\t})\n\t}\n\treturn text\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n - @author Guido Krömer <mail@cacodaemon.de>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<docs>\n### General description\n\nThis component displays rich text with optional autolink or [Markdown support](https://www.markdownguide.org/basic-syntax/).\n\n```vue\n<template>\n\t<div>\n\t\t<textarea v-model=\"text\" />\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText\n\t\t\t:class=\"{'plain-text': !useMarkdown }\"\n\t\t\t:text=\"text\" :autolink=\"autolink\" :arguments=\"args\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\ttext: `## Hello everyone 🎉\nThe file {file} was added by {username}. Visit https://nextcloud.com to check it!\n\nSome examples for markdown syntax:\n1. **bold text**\n2. _italic text_\n3. example of \\`inline code\\`\n\n> blockquote example\n`,\n\t\t\tautolink: true,\n\t\t\tuseMarkdown: true,\n\t\t\targs: {\n\t\t\t\tfile: 'MyDocument.odt',\n\t\t\t\tusername: {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Jane Doe'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n}\n</script>\n<style lang=\"scss\">\ntextarea {\n\twidth: 100%;\n\theight: 200px;\n}\n\n.plain-text {\n\twhite-space: pre-line;\n}\n</style>\n```\n\n### Usage with NcRichContenteditable\n\nSee [NcRichContenteditable](#/Components/NcRichContenteditable) documentation for more information\n\n```vue\n<template>\n\t<div>\n\t\t<NcRichContenteditable :value.sync=\"message\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:maxlength=\"100\"\n\t\t\t:user-data=\"userData\"\n\t\t\tplaceholder=\"Try mentioning user @Test01 or inserting emoji :smile\"\n\t\t\t@submit=\"onSubmit\" />\n\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText :text=\"text\"\n\t\t\t:autolink=\"autolink\"\n\t\t\t:arguments=\"userMentions\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tmessage: '',\n\t\t\t\tautolink: true,\n\t\t\t\tuseMarkdown: true,\n\t\t\t\tuserData: {\n\t\t\t\t\tTest01: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test01',\n\t\t\t\t\t\ttitle: 'Test01',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t},\n\t\t\t\t\tTest02: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test02',\n\t\t\t\t\t\ttitle: 'Test02',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Visiting London',\n\t\t\t\t\t\t\tstatus: 'away',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test@User': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test@User',\n\t\t\t\t\t\ttitle: 'Test 03',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Having space in my name',\n\t\t\t\t\t\t\tstatus: 'online',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test Offline': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test Offline',\n\t\t\t\t\t\ttitle: 'Test Offline',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: null,\n\t\t\t\t\t\t\tstatus: 'offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: null,\n\t\t\t\t\t},\n\t\t\t\t\t'Test DND': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test DND',\n\t\t\t\t\t\ttitle: 'Test DND',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: 'Out sick',\n\t\t\t\t\t\t\tstatus: 'dnd',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Out sick',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tuserMentions: {\n\t\t\t\t\t'user-1': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test01',\n\t\t\t\t\t\t\tuser: 'Test01',\n\t\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-2': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test02',\n\t\t\t\t\t\t\tuser: 'Test02',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-3': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test 03',\n\t\t\t\t\t\t\tuser: 'Test@User',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-4': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test Offline',\n\t\t\t\t\t\t\tuser: 'Test Offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-5': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test DND',\n\t\t\t\t\t\t\tuser: 'Test DND',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttext() {\n\t\t\t\treturn this.message\n\t\t\t\t\t\t.replace('@Test01', '{user-1}')\n\t\t\t\t\t\t.replace('@Test02', '{user-2}')\n\t\t\t\t\t\t.replace('@Test@User', '{user-3}')\n\t\t\t\t\t\t.replace('@\"Test Offline\"', '{user-4}')\n\t\t\t\t\t\t.replace('@\"Test DND\"', '{user-5}')\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\tautoComplete(search, callback) {\n\t\t\t\tcallback(Object.values(this.userData))\n\t\t\t},\n\t\t\tonSubmit() {\n\t\t\t\talert(this.message)\n\t\t\t}\n\t\t}\n\t}\n</script>\n```\n</docs>\n\n<script>\nimport NcReferenceList from './NcReferenceList.vue'\nimport { remarkAutolink } from './autolink.js'\nimport { remarkPlaceholder, prepareTextNode } from './placeholder.js'\n\nimport { unified } from 'unified'\nimport markdown from 'remark-parse'\nimport breaks from 'remark-breaks'\nimport remark2rehype from 'remark-rehype'\nimport rehype2react from 'rehype-react'\nimport rehypeExternalLinks from 'rehype-external-links'\n\nexport default {\n\tname: 'NcRichText',\n\tcomponents: {\n\t\tNcReferenceList,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\targuments: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {}\n\t\t\t},\n\t\t},\n\t\treferenceLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\t/** Provide data upfront to avoid extra http request */\n\t\treferences: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tmarkdownCssClasses: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {\n\t\t\t\t\ta: 'rich-text--external-link',\n\t\t\t\t\tol: 'rich-text--ordered-list',\n\t\t\t\t\tul: 'rich-text--un-ordered-list',\n\t\t\t\t\tli: 'rich-text--list-item',\n\t\t\t\t\tstrong: 'rich-text--strong',\n\t\t\t\t\tem: 'rich-text--italic',\n\t\t\t\t\th1: 'rich-text--heading rich-text--heading-1',\n\t\t\t\t\th2: 'rich-text--heading rich-text--heading-2',\n\t\t\t\t\th3: 'rich-text--heading rich-text--heading-3',\n\t\t\t\t\th4: 'rich-text--heading rich-text--heading-4',\n\t\t\t\t\th5: 'rich-text--heading rich-text--heading-5',\n\t\t\t\t\th6: 'rich-text--heading rich-text--heading-6',\n\t\t\t\t\thr: 'rich-text--hr',\n\t\t\t\t\ttable: 'rich-text--table',\n\t\t\t\t\tpre: 'rich-text--pre',\n\t\t\t\t\tcode: 'rich-text--code',\n\t\t\t\t\tblockquote: 'rich-text--blockquote',\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tuseMarkdown: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tautolink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tmethods: {\n\t\trenderPlaintext(h) {\n\t\t\tconst context = this\n\t\t\tconst placeholders = this.text.split(/(\\{[a-z\\-_.0-9]+\\})/ig).map(function(entry, index, list) {\n\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t// just return plain string nodes as text\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn prepareTextNode({ h, context }, entry)\n\t\t\t\t}\n\t\t\t\t// return component instance if argument is an object\n\t\t\t\tconst argumentId = matches[1]\n\t\t\t\tconst argument = context.arguments[argumentId]\n\t\t\t\tif (typeof argument === 'object') {\n\t\t\t\t\tconst { component, props } = argument\n\t\t\t\t\treturn h(component, {\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (argument) {\n\t\t\t\t\treturn h('span', { class: 'rich-text--fallback' }, argument)\n\t\t\t\t}\n\t\t\t\treturn entry\n\t\t\t})\n\t\t\treturn h('div', { class: 'rich-text--wrapper' }, [\n\t\t\t\th('div', {}, placeholders.flat()),\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t\trenderMarkdown(h) {\n\t\t\tconst renderedMarkdown = unified()\n\t\t\t\t.use(markdown)\n\t\t\t\t.use(remarkAutolink, {\n\t\t\t\t\tautolink: this.autolink,\n\t\t\t\t\tuseMarkdown: this.useMarkdown,\n\t\t\t\t})\n\t\t\t\t.use(breaks)\n\t\t\t\t.use(remark2rehype, {\n\t\t\t\t\thandlers: {\n\t\t\t\t\t\tcomponent(toHast, node) {\n\t\t\t\t\t\t\treturn toHast(node, node.component, { value: node.value })\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t// .use(rehypeAddClasses, this.markdownCssClasses)\n\t\t\t\t.use(remarkPlaceholder)\n\t\t\t\t.use(rehypeExternalLinks, {\n\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\trel: ['noopener noreferrer'],\n\t\t\t\t})\n\t\t\t\t.use(rehype2react, {\n\t\t\t\t\tcreateElement: (tag, attrs, children) => {\n\t\t\t\t\t\t// unescape special symbol \"<\" for simple text nodes\n\t\t\t\t\t\tchildren = children?.map(child => typeof child === 'string'\n\t\t\t\t\t\t\t? child.replace(/&lt;/gmi, '<')\n\t\t\t\t\t\t\t: child,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tif (!tag.startsWith('#')) {\n\t\t\t\t\t\t\treturn h(tag, attrs, children)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst placeholder = this.arguments[tag.slice(1)]\n\t\t\t\t\t\tif (!placeholder) {\n\t\t\t\t\t\t\treturn h('span', { ...{ attrs }, ...{ class: 'rich-text--fallback' } }, [`{${tag.slice(1)}}`])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!placeholder.component) {\n\t\t\t\t\t\t\treturn h('span', attrs, [placeholder])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\tplaceholder.component,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t\tprops: placeholder.props,\n\t\t\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\tprefix: false,\n\t\t\t\t})\n\t\t\t\t.processSync(this.text\n\t\t\t\t\t// escape special symbol \"<\" to not treat text as HTML\n\t\t\t\t\t.replace(/</gmi, '&lt;')\n\t\t\t\t\t// unescape special symbol \">\" to parse blockquotes\n\t\t\t\t\t.replace(/&gt;/gmi, '>')\n\t\t\t\t)\n\t\t\t\t.result\n\n\t\t\treturn h('div', { class: 'rich-text--wrapper rich-text--wrapper-markdown' }, [\n\t\t\t\trenderedMarkdown,\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t},\n\trender(h) {\n\t\treturn this.useMarkdown\n\t\t\t? this.renderMarkdown(h)\n\t\t\t: this.renderPlaintext(h)\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n/* stylelint-disable-next-line scss/at-import-partial-extension */\n@import './richtext.scss';\n\na:not(.rich-text--component) {\n\ttext-decoration: underline;\n}\n</style>\n"],"names":["URL_PATTERN","URL_PATTERN_AUTOLINK","_sfc_main","NcReferenceWidget","_a","response","error","match","axios","generateOcsUrl","NcLink","h","remarkAutolink","autolink","useMarkdown","tree","visit","node","index","parent","parsed","parseUrl","n","u","x","SKIP","text","list","start","href","textAfter","textBefore","lastChar","joinedText","item","remarkPlaceholder","ast","visitor","placeholders","entry","matches","component","prepareTextNode","context","props","componentClass","NcReferenceList","argumentId","argument","renderedMarkdown","unified","markdown","breaks","remark2rehype","toHast","rehypeExternalLinks","rehype2react","tag","attrs","children","child","placeholder"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { N as y } from "./referencePickerModal-2b16b319.mjs";
1
+ import { N as y } from "./referencePickerModal-d0573462.mjs";
2
2
  import f from "@nextcloud/axios";
3
3
  import { generateOcsUrl as d } from "@nextcloud/router";
4
4
  import { n as g } from "./_plugin-vue2_normalizer-5b4c43a4.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"NcRichText-13b09624.mjs","sources":["../../src/components/NcRichText/helpers.js","../../src/components/NcRichText/NcReferenceList.vue","../../src/components/NcRichText/autolink.js","../../src/components/NcRichText/placeholder.js","../../src/components/NcRichText/NcRichText.vue"],"sourcesContent":["/**\n * Regex pattern to match links to be resolved by the link-reference provider\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN = /(\\s|^)(https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z]+(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\\s|$)/ig\n\n/**\n * Regex pattern to identify strings as links and then making them clickable\n * Opposed to the above regex this one also matches IP addresses, which we would like to be clickable,\n * but in general resolving references for them might mostly not work,\n * as the link provider checks for local addresses and does not resolve them.\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN_AUTOLINK = /(\\s|\\(|^)((https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z0-9]+(?::[0-9]+)?(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*))(?=\\s|\\)|$)/ig\n","<template>\n\t<div v-if=\"isVisible\" class=\"widgets--list\" :class=\"{'icon-loading': loading }\">\n\t\t<div v-for=\"reference in displayedReferences\" :key=\"reference?.openGraphObject?.id\">\n\t\t\t<NcReferenceWidget :reference=\"reference\" />\n\t\t</div>\n\t</div>\n</template>\n<script>\nimport NcReferenceWidget from './NcReferenceWidget.vue'\nimport { URL_PATTERN } from './helpers.js'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcReferenceList',\n\tcomponents: {\n\t\tNcReferenceWidget,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\treferenceData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\treferences: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tcomputed: {\n\t\tisVisible() {\n\t\t\treturn this.loading || this.displayedReferences\n\t\t},\n\t\tvalues() {\n\t\t\treturn this.referenceData\n\t\t\t\t? this.referenceData\n\t\t\t\t: (this.references ? Object.values(this.references) : [])\n\t\t},\n\t\tfirstReference() {\n\t\t\treturn this.values[0] ?? null\n\t\t},\n\t\tdisplayedReferences() {\n\t\t\treturn this.values.slice(0, this.limit)\n\t\t},\n\t},\n\twatch: {\n\t\ttext: 'fetch',\n\t},\n\tmounted() {\n\t\tthis.fetch()\n\t},\n\tmethods: {\n\t\tfetch() {\n\t\t\tthis.loading = true\n\t\t\tif (this.referenceData) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!(new RegExp(URL_PATTERN).exec(this.text))) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.resolve().then((response) => {\n\t\t\t\tthis.references = response.data.ocs.data.references\n\t\t\t\tthis.loading = false\n\t\t\t}).catch((error) => {\n\t\t\t\tconsole.error('Failed to extract references', error)\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\tresolve() {\n\t\t\tconst match = (new RegExp(URL_PATTERN).exec(this.text.trim()))\n\t\t\tif (this.limit === 1 && match) {\n\t\t\t\treturn axios.get(generateOcsUrl('references/resolve', 2) + `?reference=${encodeURIComponent(match[0])}`)\n\t\t\t}\n\n\t\t\treturn axios.post(generateOcsUrl('references/extract', 2), {\n\t\t\t\ttext: this.text,\n\t\t\t\tresolve: true,\n\t\t\t\tlimit: this.limit,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.widgets--list.icon-loading {\n\tmin-height: 44px;\n}\n</style>\n","import { URL_PATTERN_AUTOLINK } from './helpers.js'\n\nimport { visit, SKIP } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nconst NcLink = {\n\tname: 'NcLink',\n\tprops: {\n\t\thref: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\trender(h) {\n\t\treturn h('a', {\n\t\t\tattrs: {\n\t\t\t\thref: this.href,\n\t\t\t\trel: 'noopener noreferrer',\n\t\t\t\ttarget: '_blank',\n\t\t\t\tclass: 'rich-text--external-link',\n\t\t\t},\n\t\t}, [this.href.trim()])\n\t},\n}\n\nexport const remarkAutolink = function({ autolink, useMarkdown }) {\n\treturn function(tree) {\n\n\t\tif (!useMarkdown || !autolink) {\n\t\t\treturn\n\t\t}\n\n\t\tvisit(tree, (node) => node.type === 'text', (node, index, parent) => {\n\t\t\tlet parsed = parseUrl(node.value)\n\t\t\tparsed = parsed.map((n) => {\n\t\t\t\tif (typeof n === 'string') {\n\t\t\t\t\treturn u('text', n)\n\t\t\t\t}\n\n\t\t\t\treturn u('link', {\n\t\t\t\t\turl: n.props.href,\n\t\t\t\t}, [u('text', n.props.href)])\n\t\t\t}).filter((x) => x)\n\n\t\t\tparent.children.splice(index, 1, ...parsed.flat())\n\t\t\treturn [SKIP, index + parsed.flat().length]\n\t\t})\n\t}\n}\n\nexport const parseUrl = (text) => {\n\tlet match = URL_PATTERN_AUTOLINK.exec(text)\n\tconst list = []\n\tlet start = 0\n\twhile (match !== null) {\n\t\tlet href = match[2]\n\t\tlet textAfter\n\t\tlet textBefore = text.substring(start, match.index + match[1].length)\n\t\tif (href[0] === ' ') {\n\t\t\ttextBefore += href[0]\n\t\t\thref = href.substring(1).trim()\n\t\t}\n\t\tconst lastChar = href[(href.length - 1)]\n\t\tif (lastChar === '.' || lastChar === ',' || lastChar === ';' || (match[0][0] === '(' && lastChar === ')')) {\n\t\t\thref = href.substring(0, href.length - 1)\n\t\t\ttextAfter = lastChar\n\t\t}\n\t\tlist.push(textBefore)\n\t\tlist.push({ component: NcLink, props: { href } })\n\t\tif (textAfter) {\n\t\t\tlist.push(textAfter)\n\t\t}\n\t\tstart = match.index + match[0].length\n\t\tmatch = URL_PATTERN_AUTOLINK.exec(text)\n\t}\n\tlist.push(text.substring(start))\n\tconst joinedText = list.map((item) => typeof item === 'string' ? item : item.props.href).join('')\n\tif (text === joinedText) {\n\t\treturn list\n\t}\n\tconsole.error('Failed to reassemble the chunked text: ' + text)\n\treturn text\n}\n","import { parseUrl } from './autolink.js'\n\nimport { visit } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nexport const remarkPlaceholder = function() {\n\treturn function(ast) {\n\t\tvisit(ast, (node) => node.type === 'text', visitor)\n\n\t\t/**\n\t\t *\n\t\t * @param {object} node The node\n\t\t * @param {number} index The index of the node\n\t\t * @param {object} parent The parent node\n\t\t */\n\t\tfunction visitor(node, index, parent) {\n\t\t\tconst placeholders = node.value.split(/(\\{[a-z\\-_.0-9]+\\})/ig)\n\t\t\t\t.map((entry, index, list) => {\n\t\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\treturn u('text', entry)\n\t\t\t\t\t}\n\t\t\t\t\tconst [, component] = matches\n\t\t\t\t\treturn u('element', {\n\t\t\t\t\t\ttagName: `#${component}`,\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\tparent.children.splice(index, 1, ...placeholders)\n\t\t}\n\t}\n}\n\nexport const prepareTextNode = ({ h, context }, text) => {\n\tif (context.autolink) {\n\t\ttext = parseUrl(text)\n\t}\n\tif (Array.isArray(text)) {\n\t\treturn text.map((entry) => {\n\t\t\tif (typeof entry === 'string') {\n\t\t\t\treturn entry\n\t\t\t}\n\t\t\tconst { component, props } = entry\n\t\t\t// do not override class of NcLink\n\t\t\tconst componentClass = component.name === 'NcLink' ? undefined : 'rich-text--component'\n\t\t\treturn h(component, {\n\t\t\t\tprops,\n\t\t\t\tclass: componentClass,\n\t\t\t})\n\t\t})\n\t}\n\treturn text\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n - @author Guido Krömer <mail@cacodaemon.de>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<docs>\n### General description\n\nThis component displays rich text with optional autolink or [Markdown support](https://www.markdownguide.org/basic-syntax/).\n\n```vue\n<template>\n\t<div>\n\t\t<textarea v-model=\"text\" />\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText\n\t\t\t:class=\"{'plain-text': !useMarkdown }\"\n\t\t\t:text=\"text\" :autolink=\"autolink\" :arguments=\"args\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\ttext: `## Hello everyone 🎉\nThe file {file} was added by {username}. Visit https://nextcloud.com to check it!\n\nSome examples for markdown syntax:\n1. **bold text**\n2. _italic text_\n3. example of \\`inline code\\`\n\n> blockquote example\n`,\n\t\t\tautolink: true,\n\t\t\tuseMarkdown: true,\n\t\t\targs: {\n\t\t\t\tfile: 'MyDocument.odt',\n\t\t\t\tusername: {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Jane Doe'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n}\n</script>\n<style lang=\"scss\">\ntextarea {\n\twidth: 100%;\n\theight: 200px;\n}\n\n.plain-text {\n\twhite-space: pre-line;\n}\n</style>\n```\n\n### Usage with NcRichContenteditable\n\nSee [NcRichContenteditable](#/Components/NcRichContenteditable) documentation for more information\n\n```vue\n<template>\n\t<div>\n\t\t<NcRichContenteditable :value.sync=\"message\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:maxlength=\"100\"\n\t\t\t:user-data=\"userData\"\n\t\t\tplaceholder=\"Try mentioning user @Test01 or inserting emoji :smile\"\n\t\t\t@submit=\"onSubmit\" />\n\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText :text=\"text\"\n\t\t\t:autolink=\"autolink\"\n\t\t\t:arguments=\"userMentions\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tmessage: '',\n\t\t\t\tautolink: true,\n\t\t\t\tuseMarkdown: true,\n\t\t\t\tuserData: {\n\t\t\t\t\tTest01: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test01',\n\t\t\t\t\t\ttitle: 'Test01',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t},\n\t\t\t\t\tTest02: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test02',\n\t\t\t\t\t\ttitle: 'Test02',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Visiting London',\n\t\t\t\t\t\t\tstatus: 'away',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test@User': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test@User',\n\t\t\t\t\t\ttitle: 'Test 03',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Having space in my name',\n\t\t\t\t\t\t\tstatus: 'online',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test Offline': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test Offline',\n\t\t\t\t\t\ttitle: 'Test Offline',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: null,\n\t\t\t\t\t\t\tstatus: 'offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: null,\n\t\t\t\t\t},\n\t\t\t\t\t'Test DND': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test DND',\n\t\t\t\t\t\ttitle: 'Test DND',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: 'Out sick',\n\t\t\t\t\t\t\tstatus: 'dnd',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Out sick',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tuserMentions: {\n\t\t\t\t\t'user-1': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test01',\n\t\t\t\t\t\t\tuser: 'Test01',\n\t\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-2': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test02',\n\t\t\t\t\t\t\tuser: 'Test02',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-3': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test 03',\n\t\t\t\t\t\t\tuser: 'Test@User',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-4': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test Offline',\n\t\t\t\t\t\t\tuser: 'Test Offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-5': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test DND',\n\t\t\t\t\t\t\tuser: 'Test DND',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttext() {\n\t\t\t\treturn this.message\n\t\t\t\t\t\t.replace('@Test01', '{user-1}')\n\t\t\t\t\t\t.replace('@Test02', '{user-2}')\n\t\t\t\t\t\t.replace('@Test@User', '{user-3}')\n\t\t\t\t\t\t.replace('@\"Test Offline\"', '{user-4}')\n\t\t\t\t\t\t.replace('@\"Test DND\"', '{user-5}')\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\tautoComplete(search, callback) {\n\t\t\t\tcallback(Object.values(this.userData))\n\t\t\t},\n\t\t\tonSubmit() {\n\t\t\t\talert(this.message)\n\t\t\t}\n\t\t}\n\t}\n</script>\n```\n</docs>\n\n<script>\nimport NcReferenceList from './NcReferenceList.vue'\nimport { remarkAutolink } from './autolink.js'\nimport { remarkPlaceholder, prepareTextNode } from './placeholder.js'\n\nimport { unified } from 'unified'\nimport markdown from 'remark-parse'\nimport breaks from 'remark-breaks'\nimport remark2rehype from 'remark-rehype'\nimport rehype2react from 'rehype-react'\nimport rehypeExternalLinks from 'rehype-external-links'\n\nexport default {\n\tname: 'NcRichText',\n\tcomponents: {\n\t\tNcReferenceList,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\targuments: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {}\n\t\t\t},\n\t\t},\n\t\treferenceLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\t/** Provide data upfront to avoid extra http request */\n\t\treferences: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tmarkdownCssClasses: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {\n\t\t\t\t\ta: 'rich-text--external-link',\n\t\t\t\t\tol: 'rich-text--ordered-list',\n\t\t\t\t\tul: 'rich-text--un-ordered-list',\n\t\t\t\t\tli: 'rich-text--list-item',\n\t\t\t\t\tstrong: 'rich-text--strong',\n\t\t\t\t\tem: 'rich-text--italic',\n\t\t\t\t\th1: 'rich-text--heading rich-text--heading-1',\n\t\t\t\t\th2: 'rich-text--heading rich-text--heading-2',\n\t\t\t\t\th3: 'rich-text--heading rich-text--heading-3',\n\t\t\t\t\th4: 'rich-text--heading rich-text--heading-4',\n\t\t\t\t\th5: 'rich-text--heading rich-text--heading-5',\n\t\t\t\t\th6: 'rich-text--heading rich-text--heading-6',\n\t\t\t\t\thr: 'rich-text--hr',\n\t\t\t\t\ttable: 'rich-text--table',\n\t\t\t\t\tpre: 'rich-text--pre',\n\t\t\t\t\tcode: 'rich-text--code',\n\t\t\t\t\tblockquote: 'rich-text--blockquote',\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tuseMarkdown: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tautolink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tmethods: {\n\t\trenderPlaintext(h) {\n\t\t\tconst context = this\n\t\t\tconst placeholders = this.text.split(/(\\{[a-z\\-_.0-9]+\\})/ig).map(function(entry, index, list) {\n\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t// just return plain string nodes as text\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn prepareTextNode({ h, context }, entry)\n\t\t\t\t}\n\t\t\t\t// return component instance if argument is an object\n\t\t\t\tconst argumentId = matches[1]\n\t\t\t\tconst argument = context.arguments[argumentId]\n\t\t\t\tif (typeof argument === 'object') {\n\t\t\t\t\tconst { component, props } = argument\n\t\t\t\t\treturn h(component, {\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (argument) {\n\t\t\t\t\treturn h('span', { class: 'rich-text--fallback' }, argument)\n\t\t\t\t}\n\t\t\t\treturn entry\n\t\t\t})\n\t\t\treturn h('div', { class: 'rich-text--wrapper' }, [\n\t\t\t\th('div', {}, placeholders.flat()),\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t\trenderMarkdown(h) {\n\t\t\tconst renderedMarkdown = unified()\n\t\t\t\t.use(markdown)\n\t\t\t\t.use(remarkAutolink, {\n\t\t\t\t\tautolink: this.autolink,\n\t\t\t\t\tuseMarkdown: this.useMarkdown,\n\t\t\t\t})\n\t\t\t\t.use(breaks)\n\t\t\t\t.use(remark2rehype, {\n\t\t\t\t\thandlers: {\n\t\t\t\t\t\tcomponent(toHast, node) {\n\t\t\t\t\t\t\treturn toHast(node, node.component, { value: node.value })\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t// .use(rehypeAddClasses, this.markdownCssClasses)\n\t\t\t\t.use(remarkPlaceholder)\n\t\t\t\t.use(rehypeExternalLinks, {\n\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\trel: ['noopener noreferrer'],\n\t\t\t\t})\n\t\t\t\t.use(rehype2react, {\n\t\t\t\t\tcreateElement: (tag, attrs, children) => {\n\t\t\t\t\t\t// unescape special symbol \"<\" for simple text nodes\n\t\t\t\t\t\tchildren = children?.map(child => typeof child === 'string'\n\t\t\t\t\t\t\t? child.replace(/&lt;/gmi, '<')\n\t\t\t\t\t\t\t: child,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tif (!tag.startsWith('#')) {\n\t\t\t\t\t\t\treturn h(tag, attrs, children)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst placeholder = this.arguments[tag.slice(1)]\n\t\t\t\t\t\tif (!placeholder) {\n\t\t\t\t\t\t\treturn h('span', { ...{ attrs }, ...{ class: 'rich-text--fallback' } }, [`{${tag.slice(1)}}`])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!placeholder.component) {\n\t\t\t\t\t\t\treturn h('span', attrs, [placeholder])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\tplaceholder.component,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t\tprops: placeholder.props,\n\t\t\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\tprefix: false,\n\t\t\t\t})\n\t\t\t\t.processSync(this.text\n\t\t\t\t\t// escape special symbol \"<\" to not treat text as HTML\n\t\t\t\t\t.replace(/</gmi, '&lt;')\n\t\t\t\t\t// unescape special symbol \">\" to parse blockquotes\n\t\t\t\t\t.replace(/&gt;/gmi, '>')\n\t\t\t\t)\n\t\t\t\t.result\n\n\t\t\treturn h('div', { class: 'rich-text--wrapper rich-text--wrapper-markdown' }, [\n\t\t\t\trenderedMarkdown,\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t},\n\trender(h) {\n\t\treturn this.useMarkdown\n\t\t\t? this.renderMarkdown(h)\n\t\t\t: this.renderPlaintext(h)\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n/* stylelint-disable-next-line scss/at-import-partial-extension */\n@import './richtext.scss';\n\na:not(.rich-text--component) {\n\ttext-decoration: underline;\n}\n</style>\n"],"names":["URL_PATTERN","URL_PATTERN_AUTOLINK","_sfc_main","NcReferenceWidget","_a","response","error","match","axios","generateOcsUrl","NcLink","h","remarkAutolink","autolink","useMarkdown","tree","visit","node","index","parent","parsed","parseUrl","n","u","x","SKIP","text","list","start","href","textAfter","textBefore","lastChar","joinedText","item","remarkPlaceholder","ast","visitor","placeholders","entry","matches","component","prepareTextNode","context","props","componentClass","NcReferenceList","argumentId","argument","renderedMarkdown","unified","markdown","breaks","remark2rehype","toHast","rehypeExternalLinks","rehype2react","tag","attrs","children","child","placeholder"],"mappings":"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"}
1
+ {"version":3,"file":"NcRichText-bb9d3893.mjs","sources":["../../src/components/NcRichText/helpers.js","../../src/components/NcRichText/NcReferenceList.vue","../../src/components/NcRichText/autolink.js","../../src/components/NcRichText/placeholder.js","../../src/components/NcRichText/NcRichText.vue"],"sourcesContent":["/**\n * Regex pattern to match links to be resolved by the link-reference provider\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN = /(\\s|^)(https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z]+(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\\s|$)/ig\n\n/**\n * Regex pattern to identify strings as links and then making them clickable\n * Opposed to the above regex this one also matches IP addresses, which we would like to be clickable,\n * but in general resolving references for them might mostly not work,\n * as the link provider checks for local addresses and does not resolve them.\n *\n * @type {RegExp}\n */\nexport const URL_PATTERN_AUTOLINK = /(\\s|\\(|^)((https?:\\/\\/)((?:[-A-Z0-9+_]+\\.)+[-A-Z0-9]+(?::[0-9]+)?(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*))(?=\\s|\\)|$)/ig\n","<template>\n\t<div v-if=\"isVisible\" class=\"widgets--list\" :class=\"{'icon-loading': loading }\">\n\t\t<div v-for=\"reference in displayedReferences\" :key=\"reference?.openGraphObject?.id\">\n\t\t\t<NcReferenceWidget :reference=\"reference\" />\n\t\t</div>\n\t</div>\n</template>\n<script>\nimport NcReferenceWidget from './NcReferenceWidget.vue'\nimport { URL_PATTERN } from './helpers.js'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcReferenceList',\n\tcomponents: {\n\t\tNcReferenceWidget,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\treferenceData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\treferences: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tcomputed: {\n\t\tisVisible() {\n\t\t\treturn this.loading || this.displayedReferences\n\t\t},\n\t\tvalues() {\n\t\t\treturn this.referenceData\n\t\t\t\t? this.referenceData\n\t\t\t\t: (this.references ? Object.values(this.references) : [])\n\t\t},\n\t\tfirstReference() {\n\t\t\treturn this.values[0] ?? null\n\t\t},\n\t\tdisplayedReferences() {\n\t\t\treturn this.values.slice(0, this.limit)\n\t\t},\n\t},\n\twatch: {\n\t\ttext: 'fetch',\n\t},\n\tmounted() {\n\t\tthis.fetch()\n\t},\n\tmethods: {\n\t\tfetch() {\n\t\t\tthis.loading = true\n\t\t\tif (this.referenceData) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!(new RegExp(URL_PATTERN).exec(this.text))) {\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.resolve().then((response) => {\n\t\t\t\tthis.references = response.data.ocs.data.references\n\t\t\t\tthis.loading = false\n\t\t\t}).catch((error) => {\n\t\t\t\tconsole.error('Failed to extract references', error)\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\tresolve() {\n\t\t\tconst match = (new RegExp(URL_PATTERN).exec(this.text.trim()))\n\t\t\tif (this.limit === 1 && match) {\n\t\t\t\treturn axios.get(generateOcsUrl('references/resolve', 2) + `?reference=${encodeURIComponent(match[0])}`)\n\t\t\t}\n\n\t\t\treturn axios.post(generateOcsUrl('references/extract', 2), {\n\t\t\t\ttext: this.text,\n\t\t\t\tresolve: true,\n\t\t\t\tlimit: this.limit,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.widgets--list.icon-loading {\n\tmin-height: 44px;\n}\n</style>\n","import { URL_PATTERN_AUTOLINK } from './helpers.js'\n\nimport { visit, SKIP } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nconst NcLink = {\n\tname: 'NcLink',\n\tprops: {\n\t\thref: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\trender(h) {\n\t\treturn h('a', {\n\t\t\tattrs: {\n\t\t\t\thref: this.href,\n\t\t\t\trel: 'noopener noreferrer',\n\t\t\t\ttarget: '_blank',\n\t\t\t\tclass: 'rich-text--external-link',\n\t\t\t},\n\t\t}, [this.href.trim()])\n\t},\n}\n\nexport const remarkAutolink = function({ autolink, useMarkdown }) {\n\treturn function(tree) {\n\n\t\tif (!useMarkdown || !autolink) {\n\t\t\treturn\n\t\t}\n\n\t\tvisit(tree, (node) => node.type === 'text', (node, index, parent) => {\n\t\t\tlet parsed = parseUrl(node.value)\n\t\t\tparsed = parsed.map((n) => {\n\t\t\t\tif (typeof n === 'string') {\n\t\t\t\t\treturn u('text', n)\n\t\t\t\t}\n\n\t\t\t\treturn u('link', {\n\t\t\t\t\turl: n.props.href,\n\t\t\t\t}, [u('text', n.props.href)])\n\t\t\t}).filter((x) => x)\n\n\t\t\tparent.children.splice(index, 1, ...parsed.flat())\n\t\t\treturn [SKIP, index + parsed.flat().length]\n\t\t})\n\t}\n}\n\nexport const parseUrl = (text) => {\n\tlet match = URL_PATTERN_AUTOLINK.exec(text)\n\tconst list = []\n\tlet start = 0\n\twhile (match !== null) {\n\t\tlet href = match[2]\n\t\tlet textAfter\n\t\tlet textBefore = text.substring(start, match.index + match[1].length)\n\t\tif (href[0] === ' ') {\n\t\t\ttextBefore += href[0]\n\t\t\thref = href.substring(1).trim()\n\t\t}\n\t\tconst lastChar = href[(href.length - 1)]\n\t\tif (lastChar === '.' || lastChar === ',' || lastChar === ';' || (match[0][0] === '(' && lastChar === ')')) {\n\t\t\thref = href.substring(0, href.length - 1)\n\t\t\ttextAfter = lastChar\n\t\t}\n\t\tlist.push(textBefore)\n\t\tlist.push({ component: NcLink, props: { href } })\n\t\tif (textAfter) {\n\t\t\tlist.push(textAfter)\n\t\t}\n\t\tstart = match.index + match[0].length\n\t\tmatch = URL_PATTERN_AUTOLINK.exec(text)\n\t}\n\tlist.push(text.substring(start))\n\tconst joinedText = list.map((item) => typeof item === 'string' ? item : item.props.href).join('')\n\tif (text === joinedText) {\n\t\treturn list\n\t}\n\tconsole.error('Failed to reassemble the chunked text: ' + text)\n\treturn text\n}\n","import { parseUrl } from './autolink.js'\n\nimport { visit } from 'unist-util-visit'\nimport { u } from 'unist-builder'\n\nexport const remarkPlaceholder = function() {\n\treturn function(ast) {\n\t\tvisit(ast, (node) => node.type === 'text', visitor)\n\n\t\t/**\n\t\t *\n\t\t * @param {object} node The node\n\t\t * @param {number} index The index of the node\n\t\t * @param {object} parent The parent node\n\t\t */\n\t\tfunction visitor(node, index, parent) {\n\t\t\tconst placeholders = node.value.split(/(\\{[a-z\\-_.0-9]+\\})/ig)\n\t\t\t\t.map((entry, index, list) => {\n\t\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\treturn u('text', entry)\n\t\t\t\t\t}\n\t\t\t\t\tconst [, component] = matches\n\t\t\t\t\treturn u('element', {\n\t\t\t\t\t\ttagName: `#${component}`,\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\tparent.children.splice(index, 1, ...placeholders)\n\t\t}\n\t}\n}\n\nexport const prepareTextNode = ({ h, context }, text) => {\n\tif (context.autolink) {\n\t\ttext = parseUrl(text)\n\t}\n\tif (Array.isArray(text)) {\n\t\treturn text.map((entry) => {\n\t\t\tif (typeof entry === 'string') {\n\t\t\t\treturn entry\n\t\t\t}\n\t\t\tconst { component, props } = entry\n\t\t\t// do not override class of NcLink\n\t\t\tconst componentClass = component.name === 'NcLink' ? undefined : 'rich-text--component'\n\t\t\treturn h(component, {\n\t\t\t\tprops,\n\t\t\t\tclass: componentClass,\n\t\t\t})\n\t\t})\n\t}\n\treturn text\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n - @author Guido Krömer <mail@cacodaemon.de>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<docs>\n### General description\n\nThis component displays rich text with optional autolink or [Markdown support](https://www.markdownguide.org/basic-syntax/).\n\n```vue\n<template>\n\t<div>\n\t\t<textarea v-model=\"text\" />\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText\n\t\t\t:class=\"{'plain-text': !useMarkdown }\"\n\t\t\t:text=\"text\" :autolink=\"autolink\" :arguments=\"args\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\ttext: `## Hello everyone 🎉\nThe file {file} was added by {username}. Visit https://nextcloud.com to check it!\n\nSome examples for markdown syntax:\n1. **bold text**\n2. _italic text_\n3. example of \\`inline code\\`\n\n> blockquote example\n`,\n\t\t\tautolink: true,\n\t\t\tuseMarkdown: true,\n\t\t\targs: {\n\t\t\t\tfile: 'MyDocument.odt',\n\t\t\t\tusername: {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Jane Doe'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n}\n</script>\n<style lang=\"scss\">\ntextarea {\n\twidth: 100%;\n\theight: 200px;\n}\n\n.plain-text {\n\twhite-space: pre-line;\n}\n</style>\n```\n\n### Usage with NcRichContenteditable\n\nSee [NcRichContenteditable](#/Components/NcRichContenteditable) documentation for more information\n\n```vue\n<template>\n\t<div>\n\t\t<NcRichContenteditable :value.sync=\"message\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:maxlength=\"100\"\n\t\t\t:user-data=\"userData\"\n\t\t\tplaceholder=\"Try mentioning user @Test01 or inserting emoji :smile\"\n\t\t\t@submit=\"onSubmit\" />\n\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"autolink\" type=\"checkbox\">Autolink</NcCheckboxRadioSwitch>\n\t\t<NcCheckboxRadioSwitch :checked.sync=\"useMarkdown\" type=\"checkbox\">Use Markdown</NcCheckboxRadioSwitch>\n\n\t\t<NcRichText :text=\"text\"\n\t\t\t:autolink=\"autolink\"\n\t\t\t:arguments=\"userMentions\"\n\t\t\t:use-markdown=\"useMarkdown\" />\n\t</div>\n</template>\n<script>\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tmessage: '',\n\t\t\t\tautolink: true,\n\t\t\t\tuseMarkdown: true,\n\t\t\t\tuserData: {\n\t\t\t\t\tTest01: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test01',\n\t\t\t\t\t\ttitle: 'Test01',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t},\n\t\t\t\t\tTest02: {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test02',\n\t\t\t\t\t\ttitle: 'Test02',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Visiting London',\n\t\t\t\t\t\t\tstatus: 'away',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test@User': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test@User',\n\t\t\t\t\t\ttitle: 'Test 03',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\t\tmessage: 'Having space in my name',\n\t\t\t\t\t\t\tstatus: 'online',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t\t},\n\t\t\t\t\t'Test Offline': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test Offline',\n\t\t\t\t\t\ttitle: 'Test Offline',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: null,\n\t\t\t\t\t\t\tstatus: 'offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: null,\n\t\t\t\t\t},\n\t\t\t\t\t'Test DND': {\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: 'Test DND',\n\t\t\t\t\t\ttitle: 'Test DND',\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\t\tmessage: 'Out sick',\n\t\t\t\t\t\t\tstatus: 'dnd',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubline: 'Out sick',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tuserMentions: {\n\t\t\t\t\t'user-1': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test01',\n\t\t\t\t\t\t\tuser: 'Test01',\n\t\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-2': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test02',\n\t\t\t\t\t\t\tuser: 'Test02',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-3': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test 03',\n\t\t\t\t\t\t\tuser: 'Test@User',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-4': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test Offline',\n\t\t\t\t\t\t\tuser: 'Test Offline',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'user-5': {\n\t\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tdisplayName: 'Test DND',\n\t\t\t\t\t\t\tuser: 'Test DND',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttext() {\n\t\t\t\treturn this.message\n\t\t\t\t\t\t.replace('@Test01', '{user-1}')\n\t\t\t\t\t\t.replace('@Test02', '{user-2}')\n\t\t\t\t\t\t.replace('@Test@User', '{user-3}')\n\t\t\t\t\t\t.replace('@\"Test Offline\"', '{user-4}')\n\t\t\t\t\t\t.replace('@\"Test DND\"', '{user-5}')\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\tautoComplete(search, callback) {\n\t\t\t\tcallback(Object.values(this.userData))\n\t\t\t},\n\t\t\tonSubmit() {\n\t\t\t\talert(this.message)\n\t\t\t}\n\t\t}\n\t}\n</script>\n```\n</docs>\n\n<script>\nimport NcReferenceList from './NcReferenceList.vue'\nimport { remarkAutolink } from './autolink.js'\nimport { remarkPlaceholder, prepareTextNode } from './placeholder.js'\n\nimport { unified } from 'unified'\nimport markdown from 'remark-parse'\nimport breaks from 'remark-breaks'\nimport remark2rehype from 'remark-rehype'\nimport rehype2react from 'rehype-react'\nimport rehypeExternalLinks from 'rehype-external-links'\n\nexport default {\n\tname: 'NcRichText',\n\tcomponents: {\n\t\tNcReferenceList,\n\t},\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\targuments: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {}\n\t\t\t},\n\t\t},\n\t\treferenceLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\t/** Provide data upfront to avoid extra http request */\n\t\treferences: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\tmarkdownCssClasses: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => {\n\t\t\t\treturn {\n\t\t\t\t\ta: 'rich-text--external-link',\n\t\t\t\t\tol: 'rich-text--ordered-list',\n\t\t\t\t\tul: 'rich-text--un-ordered-list',\n\t\t\t\t\tli: 'rich-text--list-item',\n\t\t\t\t\tstrong: 'rich-text--strong',\n\t\t\t\t\tem: 'rich-text--italic',\n\t\t\t\t\th1: 'rich-text--heading rich-text--heading-1',\n\t\t\t\t\th2: 'rich-text--heading rich-text--heading-2',\n\t\t\t\t\th3: 'rich-text--heading rich-text--heading-3',\n\t\t\t\t\th4: 'rich-text--heading rich-text--heading-4',\n\t\t\t\t\th5: 'rich-text--heading rich-text--heading-5',\n\t\t\t\t\th6: 'rich-text--heading rich-text--heading-6',\n\t\t\t\t\thr: 'rich-text--hr',\n\t\t\t\t\ttable: 'rich-text--table',\n\t\t\t\t\tpre: 'rich-text--pre',\n\t\t\t\t\tcode: 'rich-text--code',\n\t\t\t\t\tblockquote: 'rich-text--blockquote',\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tuseMarkdown: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tautolink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tmethods: {\n\t\trenderPlaintext(h) {\n\t\t\tconst context = this\n\t\t\tconst placeholders = this.text.split(/(\\{[a-z\\-_.0-9]+\\})/ig).map(function(entry, index, list) {\n\t\t\t\tconst matches = entry.match(/^\\{([a-z\\-_.0-9]+)\\}$/i)\n\t\t\t\t// just return plain string nodes as text\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn prepareTextNode({ h, context }, entry)\n\t\t\t\t}\n\t\t\t\t// return component instance if argument is an object\n\t\t\t\tconst argumentId = matches[1]\n\t\t\t\tconst argument = context.arguments[argumentId]\n\t\t\t\tif (typeof argument === 'object') {\n\t\t\t\t\tconst { component, props } = argument\n\t\t\t\t\treturn h(component, {\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (argument) {\n\t\t\t\t\treturn h('span', { class: 'rich-text--fallback' }, argument)\n\t\t\t\t}\n\t\t\t\treturn entry\n\t\t\t})\n\t\t\treturn h('div', { class: 'rich-text--wrapper' }, [\n\t\t\t\th('div', {}, placeholders.flat()),\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t\trenderMarkdown(h) {\n\t\t\tconst renderedMarkdown = unified()\n\t\t\t\t.use(markdown)\n\t\t\t\t.use(remarkAutolink, {\n\t\t\t\t\tautolink: this.autolink,\n\t\t\t\t\tuseMarkdown: this.useMarkdown,\n\t\t\t\t})\n\t\t\t\t.use(breaks)\n\t\t\t\t.use(remark2rehype, {\n\t\t\t\t\thandlers: {\n\t\t\t\t\t\tcomponent(toHast, node) {\n\t\t\t\t\t\t\treturn toHast(node, node.component, { value: node.value })\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t// .use(rehypeAddClasses, this.markdownCssClasses)\n\t\t\t\t.use(remarkPlaceholder)\n\t\t\t\t.use(rehypeExternalLinks, {\n\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\trel: ['noopener noreferrer'],\n\t\t\t\t})\n\t\t\t\t.use(rehype2react, {\n\t\t\t\t\tcreateElement: (tag, attrs, children) => {\n\t\t\t\t\t\t// unescape special symbol \"<\" for simple text nodes\n\t\t\t\t\t\tchildren = children?.map(child => typeof child === 'string'\n\t\t\t\t\t\t\t? child.replace(/&lt;/gmi, '<')\n\t\t\t\t\t\t\t: child,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tif (!tag.startsWith('#')) {\n\t\t\t\t\t\t\treturn h(tag, attrs, children)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst placeholder = this.arguments[tag.slice(1)]\n\t\t\t\t\t\tif (!placeholder) {\n\t\t\t\t\t\t\treturn h('span', { ...{ attrs }, ...{ class: 'rich-text--fallback' } }, [`{${tag.slice(1)}}`])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!placeholder.component) {\n\t\t\t\t\t\t\treturn h('span', attrs, [placeholder])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\tplaceholder.component,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t\tprops: placeholder.props,\n\t\t\t\t\t\t\t\tclass: 'rich-text--component',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\tprefix: false,\n\t\t\t\t})\n\t\t\t\t.processSync(this.text\n\t\t\t\t\t// escape special symbol \"<\" to not treat text as HTML\n\t\t\t\t\t.replace(/</gmi, '&lt;')\n\t\t\t\t\t// unescape special symbol \">\" to parse blockquotes\n\t\t\t\t\t.replace(/&gt;/gmi, '>')\n\t\t\t\t)\n\t\t\t\t.result\n\n\t\t\treturn h('div', { class: 'rich-text--wrapper rich-text--wrapper-markdown' }, [\n\t\t\t\trenderedMarkdown,\n\t\t\t\tthis.referenceLimit > 0\n\t\t\t\t\t? h('div', { class: 'rich-text--reference-widget' }, [\n\t\t\t\t\t\th(NcReferenceList, { props: { text: this.text, referenceData: this.references } }),\n\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t])\n\t\t},\n\t},\n\trender(h) {\n\t\treturn this.useMarkdown\n\t\t\t? this.renderMarkdown(h)\n\t\t\t: this.renderPlaintext(h)\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n/* stylelint-disable-next-line scss/at-import-partial-extension */\n@import './richtext.scss';\n\na:not(.rich-text--component) {\n\ttext-decoration: underline;\n}\n</style>\n"],"names":["URL_PATTERN","URL_PATTERN_AUTOLINK","_sfc_main","NcReferenceWidget","_a","response","error","match","axios","generateOcsUrl","NcLink","h","remarkAutolink","autolink","useMarkdown","tree","visit","node","index","parent","parsed","parseUrl","n","u","x","SKIP","text","list","start","href","textAfter","textBefore","lastChar","joinedText","item","remarkPlaceholder","ast","visitor","placeholders","entry","matches","component","prepareTextNode","context","props","componentClass","NcReferenceList","argumentId","argument","renderedMarkdown","unified","markdown","breaks","remark2rehype","toHast","rehypeExternalLinks","rehype2react","tag","attrs","children","child","placeholder"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import "../assets/NcSettingsSelectGroup-e88cbf1a.css";
2
+ import o from "../Components/NcSelect.mjs";
3
+ import { t as i } from "./l10n-9a5a6afc.mjs";
4
+ import { l } from "./l10n-05baf7da.mjs";
5
+ import { G as a } from "./GenRandomId-1e1b509a.mjs";
6
+ import n from "@nextcloud/axios";
7
+ import { generateOcsUrl as u } from "@nextcloud/router";
8
+ import { debounce as p } from "debounce";
9
+ import { n as d } from "./_plugin-vue2_normalizer-5b4c43a4.mjs";
10
+ const c = { name: "NcSettingsSelectGroup", components: { NcSelect: o }, mixins: [l], props: { label: { type: String, required: !0 }, placeholder: { type: String, default: "" }, id: { type: String, default: () => "action-" + a(), validator: (e) => e.trim() !== "" }, value: { type: Array, default: () => [] }, disabled: { type: Boolean, default: !1 } }, emits: ["input", "error"], data() {
11
+ return { groups: {}, randId: a(), errorMessage: "" };
12
+ }, computed: { hasError() {
13
+ return this.errorMessage !== "";
14
+ }, filteredValue() {
15
+ return this.value.filter((e) => e !== "" && typeof e == "string");
16
+ }, inputValue() {
17
+ return this.filteredValue.map((e) => typeof this.groups[e] > "u" ? { id: e, displayname: e } : this.groups[e]);
18
+ }, groupsArray() {
19
+ return Object.values(this.groups).filter((e) => !this.value.includes(e.id));
20
+ } }, watch: { value: { handler() {
21
+ const e = Object.keys(this.groups);
22
+ this.filteredValue.filter((t) => !e.includes(t)).forEach((t) => {
23
+ this.loadGroup(t);
24
+ });
25
+ }, immediate: !0 } }, async mounted() {
26
+ const e = `${appName}:${appVersion}/initialGroups`;
27
+ let t = window.sessionStorage.getItem(e);
28
+ t ? (t = Object.fromEntries(JSON.parse(t).map((r) => [r.id, r])), this.groups = { ...this.groups, ...t }) : (await this.loadGroup(""), window.sessionStorage.setItem(e, JSON.stringify(Object.values(this.groups))));
29
+ }, methods: { update(e) {
30
+ const t = e.map((r) => r.id);
31
+ this.$emit("input", t);
32
+ }, async loadGroup(e) {
33
+ try {
34
+ e = typeof e == "string" ? encodeURI(e) : "";
35
+ const t = await n.get(u(`cloud/groups/details?search=${e}&limit=10`, 2));
36
+ if (this.errorMessage !== "" && window.setTimeout(() => {
37
+ this.errorMessage = "";
38
+ }, 5e3), Object.keys(t.data.ocs.data.groups).length > 0) {
39
+ const r = Object.fromEntries(t.data.ocs.data.groups.map((s) => [s.id, s]));
40
+ return this.groups = { ...this.groups, ...r }, !0;
41
+ }
42
+ } catch (t) {
43
+ this.$emit("error", t), this.errorMessage = i("Unable to search the group");
44
+ }
45
+ return !1;
46
+ }, filterGroups(e, t, r) {
47
+ return `${t || ""} ${e.id}`.toLocaleLowerCase().indexOf(r.toLocaleLowerCase()) > -1;
48
+ }, onSearch: p(function(e) {
49
+ this.loadGroup(e);
50
+ }, 200) } };
51
+ var m = function() {
52
+ var e = this, t = e._self._c;
53
+ return t("div", [e.label ? t("label", { staticClass: "hidden-visually", attrs: { for: e.id } }, [e._v(e._s(e.label))]) : e._e(), t("NcSelect", { attrs: { value: e.inputValue, options: e.groupsArray, placeholder: e.placeholder || e.label, "filter-by": e.filterGroups, "input-id": e.id, limit: 5, label: "displayname", multiple: !0, "close-on-select": !1, disabled: e.disabled }, on: { input: e.update, search: e.onSearch } }), t("div", { directives: [{ name: "show", rawName: "v-show", value: e.hasError, expression: "hasError" }], staticClass: "select-group-error" }, [e._v(" " + e._s(e.errorMessage) + " ")])], 1);
54
+ }, h = [], g = d(c, m, h, !1, null, "5a35ccce", null, null);
55
+ const _ = g.exports;
56
+ export {
57
+ _ as N
58
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NcSettingsSelectGroup-0be1fe91.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ var y=require("../assets/NcSettingsSelectGroup-e88cbf1a.css");const a=require("../Components/NcSelect.cjs"),o=require("./l10n-46d0c1c0.cjs"),l=require("./l10n-dacb6440.cjs"),i=require("./GenRandomId-67df40eb.cjs"),u=require("@nextcloud/axios"),n=require("@nextcloud/router"),d=require("debounce"),p=require("./_plugin-vue2_normalizer-764a4c12.cjs");const c={name:"NcSettingsSelectGroup",components:{NcSelect:a},mixins:[l.l10n],props:{label:{type:String,required:!0},placeholder:{type:String,default:""},id:{type:String,default:()=>"action-"+i.GenRandomId(),validator:e=>e.trim()!==""},value:{type:Array,default:()=>[]},disabled:{type:Boolean,default:!1}},emits:["input","error"],data(){return{groups:{},randId:i.GenRandomId(),errorMessage:""}},computed:{hasError(){return this.errorMessage!==""},filteredValue(){return this.value.filter(e=>e!==""&&typeof e=="string")},inputValue(){return this.filteredValue.map(e=>typeof this.groups[e]>"u"?{id:e,displayname:e}:this.groups[e])},groupsArray(){return Object.values(this.groups).filter(e=>!this.value.includes(e.id))}},watch:{value:{handler(){const e=Object.keys(this.groups);this.filteredValue.filter(r=>!e.includes(r)).forEach(r=>{this.loadGroup(r)})},immediate:!0}},async mounted(){const e=`${appName}:${appVersion}/initialGroups`;let r=window.sessionStorage.getItem(e);r?(r=Object.fromEntries(JSON.parse(r).map(t=>[t.id,t])),this.groups={...this.groups,...r}):(await this.loadGroup(""),window.sessionStorage.setItem(e,JSON.stringify(Object.values(this.groups))))},methods:{update(e){const r=e.map(t=>t.id);this.$emit("input",r)},async loadGroup(e){try{e=typeof e=="string"?encodeURI(e):"";const r=await u.get(n.generateOcsUrl(`cloud/groups/details?search=${e}&limit=10`,2));if(this.errorMessage!==""&&window.setTimeout(()=>{this.errorMessage=""},5e3),Object.keys(r.data.ocs.data.groups).length>0){const t=Object.fromEntries(r.data.ocs.data.groups.map(s=>[s.id,s]));return this.groups={...this.groups,...t},!0}}catch(r){this.$emit("error",r),this.errorMessage=o.t("Unable to search the group")}return!1},filterGroups(e,r,t){return`${r||""} ${e.id}`.toLocaleLowerCase().indexOf(t.toLocaleLowerCase())>-1},onSearch:d.debounce(function(e){this.loadGroup(e)},200)}};var h=function(){var e=this,r=e._self._c;return r("div",[e.label?r("label",{staticClass:"hidden-visually",attrs:{for:e.id}},[e._v(e._s(e.label))]):e._e(),r("NcSelect",{attrs:{value:e.inputValue,options:e.groupsArray,placeholder:e.placeholder||e.label,"filter-by":e.filterGroups,"input-id":e.id,limit:5,label:"displayname",multiple:!0,"close-on-select":!1,disabled:e.disabled},on:{input:e.update,search:e.onSearch}}),r("div",{directives:[{name:"show",rawName:"v-show",value:e.hasError,expression:"hasError"}],staticClass:"select-group-error"},[e._v(" "+e._s(e.errorMessage)+" ")])],1)},g=[],m=p.normalizeComponent(c,h,g,!1,null,"5a35ccce",null,null);const f=m.exports;exports.NcSettingsSelectGroup=f;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NcSettingsSelectGroup-62ca94a9.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  const t = (e) => {
2
2
  e.mounted ? Array.isArray(e.mounted) || (e.mounted = [e.mounted]) : e.mounted = [], e.mounted.push(function() {
3
- this.$el.setAttribute("data-v-3b4361d", "");
3
+ this.$el.setAttribute("data-v-14e4fb1", "");
4
4
  });
5
5
  };
6
6
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"ScopeComponent-dbcd0e07.mjs","sources":["../../src/utils/ScopeComponent.js"],"sourcesContent":["/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst ScopeComponent = (Component) => {\n\t// Init mounted vue if none\n\tif (!Component.mounted) {\n\t\tComponent.mounted = []\n\t} else if (!Array.isArray(Component.mounted)) {\n\t\tComponent.mounted = [Component.mounted]\n\t}\n\n\t// Inject root scoping function\n\tComponent.mounted.push(function() {\n\t\tthis.$el.setAttribute(`data-v-${SCOPE_VERSION}`, '')\n\t})\n}\n\nexport default ScopeComponent\n"],"names":["ScopeComponent","Component"],"mappings":"AAsBK,MAACA,IAAkBC,CAAAA,MAAc;AAEhCA,EAAAA,EAAU,UAEH,MAAM,QAAQA,EAAU,OAAO,MAC1CA,EAAU,UAAU,CAACA,EAAU,OAAO,KAFtCA,EAAU,UAAU,CAAE,GAMvBA,EAAU,QAAQ,KAAK,WAAW;AACjC,SAAK,IAAI,aAAa,kBAA2B,EAAE;AAAA,EACrD,CAAE;AACF;"}
1
+ {"version":3,"file":"ScopeComponent-1f3a7612.mjs","sources":["../../src/utils/ScopeComponent.js"],"sourcesContent":["/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst ScopeComponent = (Component) => {\n\t// Init mounted vue if none\n\tif (!Component.mounted) {\n\t\tComponent.mounted = []\n\t} else if (!Array.isArray(Component.mounted)) {\n\t\tComponent.mounted = [Component.mounted]\n\t}\n\n\t// Inject root scoping function\n\tComponent.mounted.push(function() {\n\t\tthis.$el.setAttribute(`data-v-${SCOPE_VERSION}`, '')\n\t})\n}\n\nexport default ScopeComponent\n"],"names":["ScopeComponent","Component"],"mappings":"AAsBK,MAACA,IAAkBC,CAAAA,MAAc;AAEhCA,EAAAA,EAAU,UAEH,MAAM,QAAQA,EAAU,OAAO,MAC1CA,EAAU,UAAU,CAACA,EAAU,OAAO,KAFtCA,EAAU,UAAU,CAAE,GAMvBA,EAAU,QAAQ,KAAK,WAAW;AACjC,SAAK,IAAI,aAAa,kBAA2B,EAAE;AAAA,EACrD,CAAE;AACF;"}
@@ -1 +1 @@
1
- "use strict";const t=e=>{e.mounted?Array.isArray(e.mounted)||(e.mounted=[e.mounted]):e.mounted=[],e.mounted.push(function(){this.$el.setAttribute("data-v-3b4361d","")})};exports.ScopeComponent=t;
1
+ "use strict";const t=e=>{e.mounted?Array.isArray(e.mounted)||(e.mounted=[e.mounted]):e.mounted=[],e.mounted.push(function(){this.$el.setAttribute("data-v-14e4fb1","")})};exports.ScopeComponent=t;
@@ -1 +1 @@
1
- {"version":3,"file":"ScopeComponent-f6122f5a.cjs","sources":["../../src/utils/ScopeComponent.js"],"sourcesContent":["/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst ScopeComponent = (Component) => {\n\t// Init mounted vue if none\n\tif (!Component.mounted) {\n\t\tComponent.mounted = []\n\t} else if (!Array.isArray(Component.mounted)) {\n\t\tComponent.mounted = [Component.mounted]\n\t}\n\n\t// Inject root scoping function\n\tComponent.mounted.push(function() {\n\t\tthis.$el.setAttribute(`data-v-${SCOPE_VERSION}`, '')\n\t})\n}\n\nexport default ScopeComponent\n"],"names":["ScopeComponent","Component"],"mappings":"aAsBK,MAACA,EAAkBC,GAAc,CAEhCA,EAAU,QAEH,MAAM,QAAQA,EAAU,OAAO,IAC1CA,EAAU,QAAU,CAACA,EAAU,OAAO,GAFtCA,EAAU,QAAU,CAAE,EAMvBA,EAAU,QAAQ,KAAK,UAAW,CACjC,KAAK,IAAI,aAAa,iBAA2B,EAAE,CACrD,CAAE,CACF"}
1
+ {"version":3,"file":"ScopeComponent-4b8bd1ee.cjs","sources":["../../src/utils/ScopeComponent.js"],"sourcesContent":["/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst ScopeComponent = (Component) => {\n\t// Init mounted vue if none\n\tif (!Component.mounted) {\n\t\tComponent.mounted = []\n\t} else if (!Array.isArray(Component.mounted)) {\n\t\tComponent.mounted = [Component.mounted]\n\t}\n\n\t// Inject root scoping function\n\tComponent.mounted.push(function() {\n\t\tthis.$el.setAttribute(`data-v-${SCOPE_VERSION}`, '')\n\t})\n}\n\nexport default ScopeComponent\n"],"names":["ScopeComponent","Component"],"mappings":"aAsBK,MAACA,EAAkBC,GAAc,CAEhCA,EAAU,QAEH,MAAM,QAAQA,EAAU,OAAO,IAC1CA,EAAU,QAAU,CAACA,EAAU,OAAO,GAFtCA,EAAU,QAAU,CAAE,EAMvBA,EAAU,QAAQ,KAAK,UAAW,CACjC,KAAK,IAAI,aAAa,iBAA2B,EAAE,CACrD,CAAE,CACF"}
@@ -1,4 +1,4 @@
1
- import "../assets/index48.css";
1
+ import "../assets/index-49a0d570.css";
2
2
  import S from "../Components/NcActions.mjs";
3
3
  import g from "../Components/NcActionLink.mjs";
4
4
  import y from "../Components/NcButton.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index-7aa3fc24.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index-197226c7.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-9c621303.mjs","sources":["../../src/components/NcRichContenteditable/NcMentionBubble.vue","../../src/mixins/richEditor/index.js"],"sourcesContent":["<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n-->\n\n<template>\n\t<span :class=\"{'mention-bubble--primary': primary}\"\n\t\tclass=\"mention-bubble\"\n\t\tcontenteditable=\"false\">\n\t\t<span class=\"mention-bubble__wrapper\">\n\t\t\t<span class=\"mention-bubble__content\">\n\t\t\t\t<!-- Avatar or icon -->\n\t\t\t\t<span :class=\"[icon, `mention-bubble__icon--${avatarUrl ? 'with-avatar' : ''}`]\"\n\t\t\t\t\t:style=\"avatarUrl ? { backgroundImage: `url(${avatarUrl})` } : null\"\n\t\t\t\t\tclass=\"mention-bubble__icon\" />\n\n\t\t\t\t<!-- Title -->\n\t\t\t\t<span role=\"heading\" class=\"mention-bubble__title\" :title=\"title\" />\n\t\t\t</span>\n\n\t\t\t<!-- Selectable text for copy/paste -->\n\t\t\t<span role=\"none\" class=\"mention-bubble__select\">{{ mentionText }}</span>\n\t\t</span>\n\t</span>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcMentionBubble',\n\n\tprops: {\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticonUrl: {\n\t\t\ttype: [String, null],\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\tavatarUrl() {\n\t\t\tif (this.iconUrl) {\n\t\t\t\treturn this.iconUrl\n\t\t\t}\n\n\t\t\treturn this.id && this.source === 'users'\n\t\t\t\t? this.getAvatarUrl(this.id, 44)\n\t\t\t\t: null\n\t\t},\n\t\tmentionText() {\n\t\t\treturn !this.id.includes(' ') && !this.id.includes('/')\n\t\t\t\t? `@${this.id}`\n\t\t\t\t: `@\"${this.id}\"`\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetAvatarUrl(user, size) {\n\t\t\treturn generateUrl('/avatar/{user}/{size}', {\n\t\t\t\tuser,\n\t\t\t\tsize,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$bubble-height: 20px;\n$bubble-max-width: 150px;\n$bubble-padding: 2px;\n$bubble-avatar-size: $bubble-height - 2 * $bubble-padding;\n\n.mention-bubble {\n\t&--primary &__content {\n\t\tcolor: var(--color-primary-element-text);\n\t\tbackground-color: var(--color-primary-element);\n\t}\n\n\t&__wrapper {\n\t\tmax-width: $bubble-max-width;\n\t\t// Align with text\n\t\theight: $bubble-height - $bubble-padding;\n\t\tvertical-align: text-bottom;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\toverflow: hidden;\n\t\talign-items: center;\n\t\tmax-width: 100%;\n\t\theight: $bubble-height ;\n\t\t-webkit-user-select: none;\n\t\tuser-select: none;\n\t\tpadding-right: $bubble-padding * 3;\n\t\tpadding-left: $bubble-padding;\n\t\tborder-radius: math.div($bubble-height, 2);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\twidth: $bubble-avatar-size;\n\t\theight: $bubble-avatar-size;\n\t\tborder-radius: math.div($bubble-avatar-size, 2);\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $bubble-avatar-size - 2 * $bubble-padding;\n\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tmargin-left: $bubble-padding;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Put title in ::before so it is not selectable\n\t\t&::before {\n\t\t\tcontent: attr(title);\n\t\t}\n\t}\n\n\t// Hide the mention id so it is selectable\n\t&__select {\n\t\tposition: absolute;\n\t\tz-index: -1;\n\t\tleft: -1000px;\n\t}\n}\n\n</style>\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport NcMentionBubble from '../../components/NcRichContenteditable/NcMentionBubble.vue'\nimport Linkify from '../../utils/Linkify.js'\n\nimport escapeHtml from 'escape-html'\nimport stripTags from 'striptags'\nimport Vue from 'vue'\n\n// Beginning or whitespace. Non-capturing group\nconst MENTION_START = '(?:^|\\\\s)'\n// Anything that is not text or end-of-line. Non-capturing group\nconst MENTION_END = '(?:[^a-z]|$)'\nexport const USERID_REGEX = new RegExp(`${MENTION_START}(@[a-zA-Z0-9_.@\\\\-']+)(${MENTION_END})`, 'gi')\nexport const USERID_REGEX_WITH_SPACE = new RegExp(`${MENTION_START}(@&quot;[a-zA-Z0-9 _.@\\\\-']+&quot;)(${MENTION_END})`, 'gi')\n\nexport default {\n\tprops: {\n\t\tuserData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Convert the value string to html for the inner content\n\t\t *\n\t\t * @param {string} value the content without html\n\t\t * @return {string} rendered html\n\t\t */\n\t\trenderContent(value) {\n\t\t\t// Sanitize the value prop\n\t\t\tconst sanitizedValue = escapeHtml(value)\n\n\t\t\t// Extract all the userIds\n\t\t\tconst splitValue = sanitizedValue.split(USERID_REGEX)\n\t\t\t\t.map(part => part.split(USERID_REGEX_WITH_SPACE)).flat()\n\n\t\t\t// Replace userIds by html\n\t\t\treturn splitValue\n\t\t\t\t.map(part => {\n\t\t\t\t\t// When splitting, the string is always putting the userIds\n\t\t\t\t\t// on the the uneven indexes. We only want to generate the mentions html\n\t\t\t\t\tif (!part.startsWith('@')) {\n\t\t\t\t\t\t// This part doesn't contain a mention, let's make sure links are parsed\n\t\t\t\t\t\treturn Linkify(part)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Extracting the id, nuking the leading @ and all \"\n\t\t\t\t\tconst id = part.slice(1).replace(/&quot;/gi, '')\n\t\t\t\t\t// Compiling template and prepend with the space we removed during the split\n\t\t\t\t\treturn ' ' + this.genSelectTemplate(id)\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.replace(/\\n/gmi, '<br>')\n\t\t\t\t.replace(/&amp;/gmi, '&')\n\t\t},\n\n\t\t/**\n\t\t * Convert the innerHtml content to a string with mentions as text\n\t\t *\n\t\t * @param {string} content the content without html\n\t\t * @return {string}\n\t\t */\n\t\tparseContent(content) {\n\t\t\tlet text = content.replace(/<br>/gmi, '\\n')\n\t\t\ttext = text.replace(/&nbsp;/gmi, ' ')\n\t\t\ttext = text.replace(/&amp;/gmi, '&')\n\n\t\t\t// Convert the mentions to text only\n\t\t\t// first we replace divs with new lines\n\t\t\ttext = text.replace(/<\\/div>/gmi, '\\n')\n\t\t\t// then we remove all leftover html\n\t\t\ttext = stripTags(text, '<div>')\n\t\t\ttext = stripTags(text)\n\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Generate an autocompletion popup entry template\n\t\t *\n\t\t * @param {string} value the value to match against the userData\n\t\t * @return {string}\n\t\t */\n\t\tgenSelectTemplate(value) {\n\t\t\t// The value returned by this function will replace the trigger '@'\n\t\t\t// and the search text, so when there is no match we simply return\n\t\t\t// '@' and the text.\n\t\t\tif (typeof value === 'undefined') {\n\t\t\t\treturn `${this.autocompleteTribute.current.collection.trigger}${this.autocompleteTribute.current.mentionText}`\n\t\t\t}\n\n\t\t\tconst data = this.userData[value]\n\n\t\t\t// Fallback to @mention in case no data matches\n\t\t\tif (!data) {\n\t\t\t\t// return `@${value}`\n\t\t\t\treturn !value.includes(' ') && !value.includes('/')\n\t\t\t\t\t? `@${value}`\n\t\t\t\t\t: `@\"${value}\"`\n\t\t\t}\n\n\t\t\t// Return template and make sure we strip of new lines and tabs\n\t\t\treturn this.renderComponentHtml(data, NcMentionBubble).replace(/[\\n\\t]/gmi, '')\n\t\t},\n\n\t\t/**\n\t\t * Render a component and return its html content\n\t\t *\n\t\t * @param {object} propsData the props to pass to the component\n\t\t * @param {object} component the component to render\n\t\t * @return {string} the rendered html\n\t\t */\n\t\trenderComponentHtml(propsData, component) {\n\t\t\tconst View = Vue.extend(component)\n\t\t\tconst Item = new View({\n\t\t\t\tpropsData,\n\t\t\t})\n\n\t\t\t// Prepare mountpoint\n\t\t\tconst wrapper = document.createElement('div')\n\t\t\tconst mount = document.createElement('div')\n\t\t\twrapper.style.display = 'none'\n\t\t\twrapper.appendChild(mount)\n\t\t\tdocument.body.appendChild(wrapper)\n\n\t\t\t// Mount and get raw html\n\t\t\tItem.$mount(mount)\n\t\t\tconst renderedHtml = wrapper.innerHTML\n\n\t\t\t// Destroy\n\t\t\tItem.$destroy()\n\t\t\twrapper.remove()\n\n\t\t\treturn renderedHtml\n\t\t},\n\t},\n}\n"],"names":["_sfc_main","user","size","generateUrl","MENTION_START","MENTION_END","USERID_REGEX","USERID_REGEX_WITH_SPACE","richEditor","value","escapeHtml","part","Linkify","id","content","text","stripTags","data","NcMentionBubble","propsData","component","View","Vue","Item","wrapper","mount","renderedHtml"],"mappings":"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"}
1
+ {"version":3,"file":"index-377488aa.mjs","sources":["../../src/components/NcRichContenteditable/NcMentionBubble.vue","../../src/mixins/richEditor/index.js"],"sourcesContent":["<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n-->\n\n<template>\n\t<span :class=\"{'mention-bubble--primary': primary}\"\n\t\tclass=\"mention-bubble\"\n\t\tcontenteditable=\"false\">\n\t\t<span class=\"mention-bubble__wrapper\">\n\t\t\t<span class=\"mention-bubble__content\">\n\t\t\t\t<!-- Avatar or icon -->\n\t\t\t\t<span :class=\"[icon, `mention-bubble__icon--${avatarUrl ? 'with-avatar' : ''}`]\"\n\t\t\t\t\t:style=\"avatarUrl ? { backgroundImage: `url(${avatarUrl})` } : null\"\n\t\t\t\t\tclass=\"mention-bubble__icon\" />\n\n\t\t\t\t<!-- Title -->\n\t\t\t\t<span role=\"heading\" class=\"mention-bubble__title\" :title=\"title\" />\n\t\t\t</span>\n\n\t\t\t<!-- Selectable text for copy/paste -->\n\t\t\t<span role=\"none\" class=\"mention-bubble__select\">{{ mentionText }}</span>\n\t\t</span>\n\t</span>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcMentionBubble',\n\n\tprops: {\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticonUrl: {\n\t\t\ttype: [String, null],\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\tavatarUrl() {\n\t\t\tif (this.iconUrl) {\n\t\t\t\treturn this.iconUrl\n\t\t\t}\n\n\t\t\treturn this.id && this.source === 'users'\n\t\t\t\t? this.getAvatarUrl(this.id, 44)\n\t\t\t\t: null\n\t\t},\n\t\tmentionText() {\n\t\t\treturn !this.id.includes(' ') && !this.id.includes('/')\n\t\t\t\t? `@${this.id}`\n\t\t\t\t: `@\"${this.id}\"`\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetAvatarUrl(user, size) {\n\t\t\treturn generateUrl('/avatar/{user}/{size}', {\n\t\t\t\tuser,\n\t\t\t\tsize,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$bubble-height: 20px;\n$bubble-max-width: 150px;\n$bubble-padding: 2px;\n$bubble-avatar-size: $bubble-height - 2 * $bubble-padding;\n\n.mention-bubble {\n\t&--primary &__content {\n\t\tcolor: var(--color-primary-element-text);\n\t\tbackground-color: var(--color-primary-element);\n\t}\n\n\t&__wrapper {\n\t\tmax-width: $bubble-max-width;\n\t\t// Align with text\n\t\theight: $bubble-height - $bubble-padding;\n\t\tvertical-align: text-bottom;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\toverflow: hidden;\n\t\talign-items: center;\n\t\tmax-width: 100%;\n\t\theight: $bubble-height ;\n\t\t-webkit-user-select: none;\n\t\tuser-select: none;\n\t\tpadding-right: $bubble-padding * 3;\n\t\tpadding-left: $bubble-padding;\n\t\tborder-radius: math.div($bubble-height, 2);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\twidth: $bubble-avatar-size;\n\t\theight: $bubble-avatar-size;\n\t\tborder-radius: math.div($bubble-avatar-size, 2);\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $bubble-avatar-size - 2 * $bubble-padding;\n\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tmargin-left: $bubble-padding;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Put title in ::before so it is not selectable\n\t\t&::before {\n\t\t\tcontent: attr(title);\n\t\t}\n\t}\n\n\t// Hide the mention id so it is selectable\n\t&__select {\n\t\tposition: absolute;\n\t\tz-index: -1;\n\t\tleft: -1000px;\n\t}\n}\n\n</style>\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport NcMentionBubble from '../../components/NcRichContenteditable/NcMentionBubble.vue'\nimport Linkify from '../../utils/Linkify.js'\n\nimport escapeHtml from 'escape-html'\nimport stripTags from 'striptags'\nimport Vue from 'vue'\n\n// Beginning or whitespace. Non-capturing group\nconst MENTION_START = '(?:^|\\\\s)'\n// Anything that is not text or end-of-line. Non-capturing group\nconst MENTION_END = '(?:[^a-z]|$)'\nexport const USERID_REGEX = new RegExp(`${MENTION_START}(@[a-zA-Z0-9_.@\\\\-']+)(${MENTION_END})`, 'gi')\nexport const USERID_REGEX_WITH_SPACE = new RegExp(`${MENTION_START}(@&quot;[a-zA-Z0-9 _.@\\\\-']+&quot;)(${MENTION_END})`, 'gi')\n\nexport default {\n\tprops: {\n\t\tuserData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Convert the value string to html for the inner content\n\t\t *\n\t\t * @param {string} value the content without html\n\t\t * @return {string} rendered html\n\t\t */\n\t\trenderContent(value) {\n\t\t\t// Sanitize the value prop\n\t\t\tconst sanitizedValue = escapeHtml(value)\n\n\t\t\t// Extract all the userIds\n\t\t\tconst splitValue = sanitizedValue.split(USERID_REGEX)\n\t\t\t\t.map(part => part.split(USERID_REGEX_WITH_SPACE)).flat()\n\n\t\t\t// Replace userIds by html\n\t\t\treturn splitValue\n\t\t\t\t.map(part => {\n\t\t\t\t\t// When splitting, the string is always putting the userIds\n\t\t\t\t\t// on the the uneven indexes. We only want to generate the mentions html\n\t\t\t\t\tif (!part.startsWith('@')) {\n\t\t\t\t\t\t// This part doesn't contain a mention, let's make sure links are parsed\n\t\t\t\t\t\treturn Linkify(part)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Extracting the id, nuking the leading @ and all \"\n\t\t\t\t\tconst id = part.slice(1).replace(/&quot;/gi, '')\n\t\t\t\t\t// Compiling template and prepend with the space we removed during the split\n\t\t\t\t\treturn ' ' + this.genSelectTemplate(id)\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.replace(/\\n/gmi, '<br>')\n\t\t\t\t.replace(/&amp;/gmi, '&')\n\t\t},\n\n\t\t/**\n\t\t * Convert the innerHtml content to a string with mentions as text\n\t\t *\n\t\t * @param {string} content the content without html\n\t\t * @return {string}\n\t\t */\n\t\tparseContent(content) {\n\t\t\tlet text = content.replace(/<br>/gmi, '\\n')\n\t\t\ttext = text.replace(/&nbsp;/gmi, ' ')\n\t\t\ttext = text.replace(/&amp;/gmi, '&')\n\n\t\t\t// Convert the mentions to text only\n\t\t\t// first we replace divs with new lines\n\t\t\ttext = text.replace(/<\\/div>/gmi, '\\n')\n\t\t\t// then we remove all leftover html\n\t\t\ttext = stripTags(text, '<div>')\n\t\t\ttext = stripTags(text)\n\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Generate an autocompletion popup entry template\n\t\t *\n\t\t * @param {string} value the value to match against the userData\n\t\t * @return {string}\n\t\t */\n\t\tgenSelectTemplate(value) {\n\t\t\t// The value returned by this function will replace the trigger '@'\n\t\t\t// and the search text, so when there is no match we simply return\n\t\t\t// '@' and the text.\n\t\t\tif (typeof value === 'undefined') {\n\t\t\t\treturn `${this.autocompleteTribute.current.collection.trigger}${this.autocompleteTribute.current.mentionText}`\n\t\t\t}\n\n\t\t\tconst data = this.userData[value]\n\n\t\t\t// Fallback to @mention in case no data matches\n\t\t\tif (!data) {\n\t\t\t\t// return `@${value}`\n\t\t\t\treturn !value.includes(' ') && !value.includes('/')\n\t\t\t\t\t? `@${value}`\n\t\t\t\t\t: `@\"${value}\"`\n\t\t\t}\n\n\t\t\t// Return template and make sure we strip of new lines and tabs\n\t\t\treturn this.renderComponentHtml(data, NcMentionBubble).replace(/[\\n\\t]/gmi, '')\n\t\t},\n\n\t\t/**\n\t\t * Render a component and return its html content\n\t\t *\n\t\t * @param {object} propsData the props to pass to the component\n\t\t * @param {object} component the component to render\n\t\t * @return {string} the rendered html\n\t\t */\n\t\trenderComponentHtml(propsData, component) {\n\t\t\tconst View = Vue.extend(component)\n\t\t\tconst Item = new View({\n\t\t\t\tpropsData,\n\t\t\t})\n\n\t\t\t// Prepare mountpoint\n\t\t\tconst wrapper = document.createElement('div')\n\t\t\tconst mount = document.createElement('div')\n\t\t\twrapper.style.display = 'none'\n\t\t\twrapper.appendChild(mount)\n\t\t\tdocument.body.appendChild(wrapper)\n\n\t\t\t// Mount and get raw html\n\t\t\tItem.$mount(mount)\n\t\t\tconst renderedHtml = wrapper.innerHTML\n\n\t\t\t// Destroy\n\t\t\tItem.$destroy()\n\t\t\twrapper.remove()\n\n\t\t\treturn renderedHtml\n\t\t},\n\t},\n}\n"],"names":["_sfc_main","user","size","generateUrl","MENTION_START","MENTION_END","USERID_REGEX","USERID_REGEX_WITH_SPACE","richEditor","value","escapeHtml","part","Linkify","id","content","text","stripTags","data","NcMentionBubble","propsData","component","View","Vue","Item","wrapper","mount","renderedHtml"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-c4cd0463.cjs","sources":["../../src/components/NcRichContenteditable/NcMentionBubble.vue","../../src/mixins/richEditor/index.js"],"sourcesContent":["<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n-->\n\n<template>\n\t<span :class=\"{'mention-bubble--primary': primary}\"\n\t\tclass=\"mention-bubble\"\n\t\tcontenteditable=\"false\">\n\t\t<span class=\"mention-bubble__wrapper\">\n\t\t\t<span class=\"mention-bubble__content\">\n\t\t\t\t<!-- Avatar or icon -->\n\t\t\t\t<span :class=\"[icon, `mention-bubble__icon--${avatarUrl ? 'with-avatar' : ''}`]\"\n\t\t\t\t\t:style=\"avatarUrl ? { backgroundImage: `url(${avatarUrl})` } : null\"\n\t\t\t\t\tclass=\"mention-bubble__icon\" />\n\n\t\t\t\t<!-- Title -->\n\t\t\t\t<span role=\"heading\" class=\"mention-bubble__title\" :title=\"title\" />\n\t\t\t</span>\n\n\t\t\t<!-- Selectable text for copy/paste -->\n\t\t\t<span role=\"none\" class=\"mention-bubble__select\">{{ mentionText }}</span>\n\t\t</span>\n\t</span>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcMentionBubble',\n\n\tprops: {\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticonUrl: {\n\t\t\ttype: [String, null],\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\tavatarUrl() {\n\t\t\tif (this.iconUrl) {\n\t\t\t\treturn this.iconUrl\n\t\t\t}\n\n\t\t\treturn this.id && this.source === 'users'\n\t\t\t\t? this.getAvatarUrl(this.id, 44)\n\t\t\t\t: null\n\t\t},\n\t\tmentionText() {\n\t\t\treturn !this.id.includes(' ') && !this.id.includes('/')\n\t\t\t\t? `@${this.id}`\n\t\t\t\t: `@\"${this.id}\"`\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetAvatarUrl(user, size) {\n\t\t\treturn generateUrl('/avatar/{user}/{size}', {\n\t\t\t\tuser,\n\t\t\t\tsize,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$bubble-height: 20px;\n$bubble-max-width: 150px;\n$bubble-padding: 2px;\n$bubble-avatar-size: $bubble-height - 2 * $bubble-padding;\n\n.mention-bubble {\n\t&--primary &__content {\n\t\tcolor: var(--color-primary-element-text);\n\t\tbackground-color: var(--color-primary-element);\n\t}\n\n\t&__wrapper {\n\t\tmax-width: $bubble-max-width;\n\t\t// Align with text\n\t\theight: $bubble-height - $bubble-padding;\n\t\tvertical-align: text-bottom;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\toverflow: hidden;\n\t\talign-items: center;\n\t\tmax-width: 100%;\n\t\theight: $bubble-height ;\n\t\t-webkit-user-select: none;\n\t\tuser-select: none;\n\t\tpadding-right: $bubble-padding * 3;\n\t\tpadding-left: $bubble-padding;\n\t\tborder-radius: math.div($bubble-height, 2);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\twidth: $bubble-avatar-size;\n\t\theight: $bubble-avatar-size;\n\t\tborder-radius: math.div($bubble-avatar-size, 2);\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $bubble-avatar-size - 2 * $bubble-padding;\n\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tmargin-left: $bubble-padding;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Put title in ::before so it is not selectable\n\t\t&::before {\n\t\t\tcontent: attr(title);\n\t\t}\n\t}\n\n\t// Hide the mention id so it is selectable\n\t&__select {\n\t\tposition: absolute;\n\t\tz-index: -1;\n\t\tleft: -1000px;\n\t}\n}\n\n</style>\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport NcMentionBubble from '../../components/NcRichContenteditable/NcMentionBubble.vue'\nimport Linkify from '../../utils/Linkify.js'\n\nimport escapeHtml from 'escape-html'\nimport stripTags from 'striptags'\nimport Vue from 'vue'\n\n// Beginning or whitespace. Non-capturing group\nconst MENTION_START = '(?:^|\\\\s)'\n// Anything that is not text or end-of-line. Non-capturing group\nconst MENTION_END = '(?:[^a-z]|$)'\nexport const USERID_REGEX = new RegExp(`${MENTION_START}(@[a-zA-Z0-9_.@\\\\-']+)(${MENTION_END})`, 'gi')\nexport const USERID_REGEX_WITH_SPACE = new RegExp(`${MENTION_START}(@&quot;[a-zA-Z0-9 _.@\\\\-']+&quot;)(${MENTION_END})`, 'gi')\n\nexport default {\n\tprops: {\n\t\tuserData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Convert the value string to html for the inner content\n\t\t *\n\t\t * @param {string} value the content without html\n\t\t * @return {string} rendered html\n\t\t */\n\t\trenderContent(value) {\n\t\t\t// Sanitize the value prop\n\t\t\tconst sanitizedValue = escapeHtml(value)\n\n\t\t\t// Extract all the userIds\n\t\t\tconst splitValue = sanitizedValue.split(USERID_REGEX)\n\t\t\t\t.map(part => part.split(USERID_REGEX_WITH_SPACE)).flat()\n\n\t\t\t// Replace userIds by html\n\t\t\treturn splitValue\n\t\t\t\t.map(part => {\n\t\t\t\t\t// When splitting, the string is always putting the userIds\n\t\t\t\t\t// on the the uneven indexes. We only want to generate the mentions html\n\t\t\t\t\tif (!part.startsWith('@')) {\n\t\t\t\t\t\t// This part doesn't contain a mention, let's make sure links are parsed\n\t\t\t\t\t\treturn Linkify(part)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Extracting the id, nuking the leading @ and all \"\n\t\t\t\t\tconst id = part.slice(1).replace(/&quot;/gi, '')\n\t\t\t\t\t// Compiling template and prepend with the space we removed during the split\n\t\t\t\t\treturn ' ' + this.genSelectTemplate(id)\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.replace(/\\n/gmi, '<br>')\n\t\t\t\t.replace(/&amp;/gmi, '&')\n\t\t},\n\n\t\t/**\n\t\t * Convert the innerHtml content to a string with mentions as text\n\t\t *\n\t\t * @param {string} content the content without html\n\t\t * @return {string}\n\t\t */\n\t\tparseContent(content) {\n\t\t\tlet text = content.replace(/<br>/gmi, '\\n')\n\t\t\ttext = text.replace(/&nbsp;/gmi, ' ')\n\t\t\ttext = text.replace(/&amp;/gmi, '&')\n\n\t\t\t// Convert the mentions to text only\n\t\t\t// first we replace divs with new lines\n\t\t\ttext = text.replace(/<\\/div>/gmi, '\\n')\n\t\t\t// then we remove all leftover html\n\t\t\ttext = stripTags(text, '<div>')\n\t\t\ttext = stripTags(text)\n\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Generate an autocompletion popup entry template\n\t\t *\n\t\t * @param {string} value the value to match against the userData\n\t\t * @return {string}\n\t\t */\n\t\tgenSelectTemplate(value) {\n\t\t\t// The value returned by this function will replace the trigger '@'\n\t\t\t// and the search text, so when there is no match we simply return\n\t\t\t// '@' and the text.\n\t\t\tif (typeof value === 'undefined') {\n\t\t\t\treturn `${this.autocompleteTribute.current.collection.trigger}${this.autocompleteTribute.current.mentionText}`\n\t\t\t}\n\n\t\t\tconst data = this.userData[value]\n\n\t\t\t// Fallback to @mention in case no data matches\n\t\t\tif (!data) {\n\t\t\t\t// return `@${value}`\n\t\t\t\treturn !value.includes(' ') && !value.includes('/')\n\t\t\t\t\t? `@${value}`\n\t\t\t\t\t: `@\"${value}\"`\n\t\t\t}\n\n\t\t\t// Return template and make sure we strip of new lines and tabs\n\t\t\treturn this.renderComponentHtml(data, NcMentionBubble).replace(/[\\n\\t]/gmi, '')\n\t\t},\n\n\t\t/**\n\t\t * Render a component and return its html content\n\t\t *\n\t\t * @param {object} propsData the props to pass to the component\n\t\t * @param {object} component the component to render\n\t\t * @return {string} the rendered html\n\t\t */\n\t\trenderComponentHtml(propsData, component) {\n\t\t\tconst View = Vue.extend(component)\n\t\t\tconst Item = new View({\n\t\t\t\tpropsData,\n\t\t\t})\n\n\t\t\t// Prepare mountpoint\n\t\t\tconst wrapper = document.createElement('div')\n\t\t\tconst mount = document.createElement('div')\n\t\t\twrapper.style.display = 'none'\n\t\t\twrapper.appendChild(mount)\n\t\t\tdocument.body.appendChild(wrapper)\n\n\t\t\t// Mount and get raw html\n\t\t\tItem.$mount(mount)\n\t\t\tconst renderedHtml = wrapper.innerHTML\n\n\t\t\t// Destroy\n\t\t\tItem.$destroy()\n\t\t\twrapper.remove()\n\n\t\t\treturn renderedHtml\n\t\t},\n\t},\n}\n"],"names":["_sfc_main","user","size","generateUrl","MENTION_START","MENTION_END","USERID_REGEX","USERID_REGEX_WITH_SPACE","richEditor","value","escapeHtml","part","Linkify","id","content","text","stripTags","data","NcMentionBubble","propsData","component","View","Vue","Item","wrapper","mount","renderedHtml"],"mappings":"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"}
1
+ {"version":3,"file":"index-858938bd.cjs","sources":["../../src/components/NcRichContenteditable/NcMentionBubble.vue","../../src/mixins/richEditor/index.js"],"sourcesContent":["<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n-->\n\n<template>\n\t<span :class=\"{'mention-bubble--primary': primary}\"\n\t\tclass=\"mention-bubble\"\n\t\tcontenteditable=\"false\">\n\t\t<span class=\"mention-bubble__wrapper\">\n\t\t\t<span class=\"mention-bubble__content\">\n\t\t\t\t<!-- Avatar or icon -->\n\t\t\t\t<span :class=\"[icon, `mention-bubble__icon--${avatarUrl ? 'with-avatar' : ''}`]\"\n\t\t\t\t\t:style=\"avatarUrl ? { backgroundImage: `url(${avatarUrl})` } : null\"\n\t\t\t\t\tclass=\"mention-bubble__icon\" />\n\n\t\t\t\t<!-- Title -->\n\t\t\t\t<span role=\"heading\" class=\"mention-bubble__title\" :title=\"title\" />\n\t\t\t</span>\n\n\t\t\t<!-- Selectable text for copy/paste -->\n\t\t\t<span role=\"none\" class=\"mention-bubble__select\">{{ mentionText }}</span>\n\t\t</span>\n\t</span>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'NcMentionBubble',\n\n\tprops: {\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticonUrl: {\n\t\t\ttype: [String, null],\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\tavatarUrl() {\n\t\t\tif (this.iconUrl) {\n\t\t\t\treturn this.iconUrl\n\t\t\t}\n\n\t\t\treturn this.id && this.source === 'users'\n\t\t\t\t? this.getAvatarUrl(this.id, 44)\n\t\t\t\t: null\n\t\t},\n\t\tmentionText() {\n\t\t\treturn !this.id.includes(' ') && !this.id.includes('/')\n\t\t\t\t? `@${this.id}`\n\t\t\t\t: `@\"${this.id}\"`\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetAvatarUrl(user, size) {\n\t\t\treturn generateUrl('/avatar/{user}/{size}', {\n\t\t\t\tuser,\n\t\t\t\tsize,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$bubble-height: 20px;\n$bubble-max-width: 150px;\n$bubble-padding: 2px;\n$bubble-avatar-size: $bubble-height - 2 * $bubble-padding;\n\n.mention-bubble {\n\t&--primary &__content {\n\t\tcolor: var(--color-primary-element-text);\n\t\tbackground-color: var(--color-primary-element);\n\t}\n\n\t&__wrapper {\n\t\tmax-width: $bubble-max-width;\n\t\t// Align with text\n\t\theight: $bubble-height - $bubble-padding;\n\t\tvertical-align: text-bottom;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\toverflow: hidden;\n\t\talign-items: center;\n\t\tmax-width: 100%;\n\t\theight: $bubble-height ;\n\t\t-webkit-user-select: none;\n\t\tuser-select: none;\n\t\tpadding-right: $bubble-padding * 3;\n\t\tpadding-left: $bubble-padding;\n\t\tborder-radius: math.div($bubble-height, 2);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\twidth: $bubble-avatar-size;\n\t\theight: $bubble-avatar-size;\n\t\tborder-radius: math.div($bubble-avatar-size, 2);\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $bubble-avatar-size - 2 * $bubble-padding;\n\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tmargin-left: $bubble-padding;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Put title in ::before so it is not selectable\n\t\t&::before {\n\t\t\tcontent: attr(title);\n\t\t}\n\t}\n\n\t// Hide the mention id so it is selectable\n\t&__select {\n\t\tposition: absolute;\n\t\tz-index: -1;\n\t\tleft: -1000px;\n\t}\n}\n\n</style>\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport NcMentionBubble from '../../components/NcRichContenteditable/NcMentionBubble.vue'\nimport Linkify from '../../utils/Linkify.js'\n\nimport escapeHtml from 'escape-html'\nimport stripTags from 'striptags'\nimport Vue from 'vue'\n\n// Beginning or whitespace. Non-capturing group\nconst MENTION_START = '(?:^|\\\\s)'\n// Anything that is not text or end-of-line. Non-capturing group\nconst MENTION_END = '(?:[^a-z]|$)'\nexport const USERID_REGEX = new RegExp(`${MENTION_START}(@[a-zA-Z0-9_.@\\\\-']+)(${MENTION_END})`, 'gi')\nexport const USERID_REGEX_WITH_SPACE = new RegExp(`${MENTION_START}(@&quot;[a-zA-Z0-9 _.@\\\\-']+&quot;)(${MENTION_END})`, 'gi')\n\nexport default {\n\tprops: {\n\t\tuserData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Convert the value string to html for the inner content\n\t\t *\n\t\t * @param {string} value the content without html\n\t\t * @return {string} rendered html\n\t\t */\n\t\trenderContent(value) {\n\t\t\t// Sanitize the value prop\n\t\t\tconst sanitizedValue = escapeHtml(value)\n\n\t\t\t// Extract all the userIds\n\t\t\tconst splitValue = sanitizedValue.split(USERID_REGEX)\n\t\t\t\t.map(part => part.split(USERID_REGEX_WITH_SPACE)).flat()\n\n\t\t\t// Replace userIds by html\n\t\t\treturn splitValue\n\t\t\t\t.map(part => {\n\t\t\t\t\t// When splitting, the string is always putting the userIds\n\t\t\t\t\t// on the the uneven indexes. We only want to generate the mentions html\n\t\t\t\t\tif (!part.startsWith('@')) {\n\t\t\t\t\t\t// This part doesn't contain a mention, let's make sure links are parsed\n\t\t\t\t\t\treturn Linkify(part)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Extracting the id, nuking the leading @ and all \"\n\t\t\t\t\tconst id = part.slice(1).replace(/&quot;/gi, '')\n\t\t\t\t\t// Compiling template and prepend with the space we removed during the split\n\t\t\t\t\treturn ' ' + this.genSelectTemplate(id)\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.replace(/\\n/gmi, '<br>')\n\t\t\t\t.replace(/&amp;/gmi, '&')\n\t\t},\n\n\t\t/**\n\t\t * Convert the innerHtml content to a string with mentions as text\n\t\t *\n\t\t * @param {string} content the content without html\n\t\t * @return {string}\n\t\t */\n\t\tparseContent(content) {\n\t\t\tlet text = content.replace(/<br>/gmi, '\\n')\n\t\t\ttext = text.replace(/&nbsp;/gmi, ' ')\n\t\t\ttext = text.replace(/&amp;/gmi, '&')\n\n\t\t\t// Convert the mentions to text only\n\t\t\t// first we replace divs with new lines\n\t\t\ttext = text.replace(/<\\/div>/gmi, '\\n')\n\t\t\t// then we remove all leftover html\n\t\t\ttext = stripTags(text, '<div>')\n\t\t\ttext = stripTags(text)\n\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Generate an autocompletion popup entry template\n\t\t *\n\t\t * @param {string} value the value to match against the userData\n\t\t * @return {string}\n\t\t */\n\t\tgenSelectTemplate(value) {\n\t\t\t// The value returned by this function will replace the trigger '@'\n\t\t\t// and the search text, so when there is no match we simply return\n\t\t\t// '@' and the text.\n\t\t\tif (typeof value === 'undefined') {\n\t\t\t\treturn `${this.autocompleteTribute.current.collection.trigger}${this.autocompleteTribute.current.mentionText}`\n\t\t\t}\n\n\t\t\tconst data = this.userData[value]\n\n\t\t\t// Fallback to @mention in case no data matches\n\t\t\tif (!data) {\n\t\t\t\t// return `@${value}`\n\t\t\t\treturn !value.includes(' ') && !value.includes('/')\n\t\t\t\t\t? `@${value}`\n\t\t\t\t\t: `@\"${value}\"`\n\t\t\t}\n\n\t\t\t// Return template and make sure we strip of new lines and tabs\n\t\t\treturn this.renderComponentHtml(data, NcMentionBubble).replace(/[\\n\\t]/gmi, '')\n\t\t},\n\n\t\t/**\n\t\t * Render a component and return its html content\n\t\t *\n\t\t * @param {object} propsData the props to pass to the component\n\t\t * @param {object} component the component to render\n\t\t * @return {string} the rendered html\n\t\t */\n\t\trenderComponentHtml(propsData, component) {\n\t\t\tconst View = Vue.extend(component)\n\t\t\tconst Item = new View({\n\t\t\t\tpropsData,\n\t\t\t})\n\n\t\t\t// Prepare mountpoint\n\t\t\tconst wrapper = document.createElement('div')\n\t\t\tconst mount = document.createElement('div')\n\t\t\twrapper.style.display = 'none'\n\t\t\twrapper.appendChild(mount)\n\t\t\tdocument.body.appendChild(wrapper)\n\n\t\t\t// Mount and get raw html\n\t\t\tItem.$mount(mount)\n\t\t\tconst renderedHtml = wrapper.innerHTML\n\n\t\t\t// Destroy\n\t\t\tItem.$destroy()\n\t\t\twrapper.remove()\n\n\t\t\treturn renderedHtml\n\t\t},\n\t},\n}\n"],"names":["_sfc_main","user","size","generateUrl","MENTION_START","MENTION_END","USERID_REGEX","USERID_REGEX_WITH_SPACE","richEditor","value","escapeHtml","part","Linkify","id","content","text","stripTags","data","NcMentionBubble","propsData","component","View","Vue","Item","wrapper","mount","renderedHtml"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ var I=require("../assets/index-49a0d570.css");const f=require("../Components/NcActions.cjs"),m=require("../Components/NcActionLink.cjs"),y=require("../Components/NcButton.cjs"),U=require("../Components/NcLoadingIcon.cjs"),d=require("../Functions/usernameToColor.cjs");require("./IsMobileState-151fc57d.cjs");const o=require("@nextcloud/router");/* empty css */const M=require("./_plugin-vue2_normalizer-764a4c12.cjs");require("linkify-string"),require("escape-html"),require("striptags"),require("vue");const l=require("@nextcloud/auth"),h=require("@nextcloud/axios"),b=require("@nextcloud/capabilities"),u=require("./l10n-46d0c1c0.cjs"),N=require("vue-material-design-icons/DotsHorizontal.vue"),r=require("@nextcloud/event-bus"),w=require("@nextcloud/browser-storage"),_=require("@vueuse/components"),p={data(){return{hasStatus:!1,userStatus:{status:null,message:null,icon:null}}},methods:{async fetchUserStatus(t){var e,a;if(!t)return;const s=b.getCapabilities();if(!(!Object.prototype.hasOwnProperty.call(s,"user_status")||!s.user_status.enabled)&&l.getCurrentUser())try{const{data:i}=await h.get(o.generateOcsUrl("apps/user_status/api/v1/statuses/{userId}",{userId:t})),{status:n,message:g,icon:S}=i.ocs.data;this.userStatus.status=n,this.userStatus.message=g||"",this.userStatus.icon=S||"",this.hasStatus=!0}catch(i){if(i.response.status===404&&((a=(e=i.response.data.ocs)==null?void 0:e.data)==null?void 0:a.length)===0)return;console.error(i)}}}};const v=w.getBuilder("nextcloud").persist().build();function L(t){const s=v.getItem("user-has-avatar."+t);return typeof s=="string"?!!s:null}function c(t,s){t&&v.setItem("user-has-avatar."+t,s)}const x={name:"NcAvatar",directives:{ClickOutside:_.vOnClickOutside},components:{DotsHorizontal:N,NcActions:f,NcActionLink:m,NcButton:y,NcLoadingIcon:U},mixins:[p],props:{url:{type:String,default:void 0},iconClass:{type:String,default:void 0},user:{type:String,default:void 0},showUserStatus:{type:Boolean,default:!0},showUserStatusCompact:{type:Boolean,default:!0},preloadedUserStatus:{type:Object,default:void 0},isGuest:{type:Boolean,default:!1},displayName:{type:String,default:void 0},size:{type:Number,default:32},allowPlaceholder:{type:Boolean,default:!0},disableTooltip:{type:Boolean,default:!1},disableMenu:{type:Boolean,default:!1},tooltipMessage:{type:String,default:null},isNoUser:{type:Boolean,default:!1},menuContainer:{type:[String,Object,Element,Boolean],default:"body"}},data(){return{avatarUrlLoaded:null,avatarSrcSetLoaded:null,userDoesNotExist:!1,isAvatarLoaded:!1,isMenuLoaded:!1,contactsMenuLoading:!1,contactsMenuActions:[],contactsMenuOpenState:!1}},computed:{avatarAriaLabel(){var t,s;if(this.hasMenu)return this.hasStatus&&this.showUserStatus&&this.showUserStatusCompact?u.t("Avatar of {displayName}, {status}",{displayName:(t=this.displayName)!=null?t:this.user,status:this.userStatus.status}):u.t("Avatar of {displayName}",{displayName:(s=this.displayName)!=null?s:this.user})},canDisplayUserStatus(){return this.showUserStatus&&this.hasStatus&&["online","away","dnd"].includes(this.userStatus.status)},showUserStatusIconOnAvatar(){return this.showUserStatus&&this.showUserStatusCompact&&this.hasStatus&&this.userStatus.status!=="dnd"&&this.userStatus.icon},getUserIdentifier(){return this.isDisplayNameDefined?this.displayName:this.isUserDefined?this.user:""},isUserDefined(){return typeof this.user<"u"},isDisplayNameDefined(){return typeof this.displayName<"u"},isUrlDefined(){return typeof this.url<"u"},hasMenu(){var t;return this.disableMenu?!1:this.isMenuLoaded?this.menu.length>0:!(this.user===((t=l.getCurrentUser())==null?void 0:t.uid)||this.userDoesNotExist||this.url)},shouldShowPlaceholder(){return this.allowPlaceholder&&this.userDoesNotExist},avatarStyle(){return{"--size":this.size+"px",lineHeight:this.size+"px",fontSize:Math.round(this.size*.45)+"px"}},initialsWrapperStyle(){const{r:t,g:s,b:e}=d(this.getUserIdentifier);return{backgroundColor:`rgba(${t}, ${s}, ${e}, 0.1)`}},initialsStyle(){const{r:t,g:s,b:e}=d(this.getUserIdentifier);return{color:`rgb(${t}, ${s}, ${e})`}},tooltip(){return this.disableTooltip?!1:this.tooltipMessage?this.tooltipMessage:this.displayName},initials(){let t;if(this.shouldShowPlaceholder){const s=this.getUserIdentifier,e=s.indexOf(" ");s===""?t="?":(t=String.fromCodePoint(s.codePointAt(0)),e!==-1&&(t=t.concat(String.fromCodePoint(s.codePointAt(e+1)))))}return t.toUpperCase()},menu(){const t=this.contactsMenuActions.map(e=>({href:e.hyperlink,icon:e.icon,text:e.title}));function s(e){const a=document.createTextNode(e),i=document.createElement("p");return i.appendChild(a),i.innerHTML}return this.showUserStatus&&(this.userStatus.icon||this.userStatus.message)?[{href:"#",icon:`data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><text x='0' y='14' font-size='14'>${s(this.userStatus.icon)}</text></svg>`,text:`${this.userStatus.message}`}].concat(t):t}},watch:{url(){this.userDoesNotExist=!1,this.loadAvatarUrl()},user(){this.userDoesNotExist=!1,this.isMenuLoaded=!1,this.loadAvatarUrl()}},mounted(){this.loadAvatarUrl(),r.subscribe("settings:avatar:updated",this.loadAvatarUrl),r.subscribe("settings:display-name:updated",this.loadAvatarUrl),this.showUserStatus&&this.user&&!this.isNoUser&&(this.preloadedUserStatus?(this.userStatus.status=this.preloadedUserStatus.status||"",this.userStatus.message=this.preloadedUserStatus.message||"",this.userStatus.icon=this.preloadedUserStatus.icon||"",this.hasStatus=this.preloadedUserStatus.status!==null):this.fetchUserStatus(this.user),r.subscribe("user_status:status.updated",this.handleUserStatusUpdated))},beforeDestroy(){r.unsubscribe("settings:avatar:updated",this.loadAvatarUrl),r.unsubscribe("settings:display-name:updated",this.loadAvatarUrl),this.showUserStatus&&this.user&&!this.isNoUser&&r.unsubscribe("user_status:status.updated",this.handleUserStatusUpdated)},methods:{t:u.t,handleUserStatusUpdated(t){this.user===t.userId&&(this.userStatus={status:t.status,icon:t.icon,message:t.message})},async toggleMenu(){this.hasMenu&&(this.contactsMenuOpenState||await this.fetchContactsMenu(),this.contactsMenuOpenState=!this.contactsMenuOpenState)},closeMenu(){this.contactsMenuOpenState=!1},async fetchContactsMenu(){this.contactsMenuLoading=!0;try{const t=encodeURIComponent(this.user),{data:s}=await h.post(o.generateUrl("contactsmenu/findOne"),`shareType=0&shareWith=${t}`);this.contactsMenuActions=s.topAction?[s.topAction].concat(s.actions):s.actions}catch{this.contactsMenuOpenState=!1}this.contactsMenuLoading=!1,this.isMenuLoaded=!0},loadAvatarUrl(){if(this.isAvatarLoaded=!1,!this.isUrlDefined&&(!this.isUserDefined||this.isNoUser)){this.isAvatarLoaded=!0,this.userDoesNotExist=!0;return}if(this.isUrlDefined){this.updateImageIfValid(this.url);return}if(this.size<=64){const t=this.avatarUrlGenerator(this.user,64),s=[t+" 1x",this.avatarUrlGenerator(this.user,512)+" 8x"].join(", ");this.updateImageIfValid(t,s)}else{const t=this.avatarUrlGenerator(this.user,512);this.updateImageIfValid(t)}},avatarUrlGenerator(t,s){var n;const e=window.getComputedStyle(document.body).getPropertyValue("--background-invert-if-dark")==="invert(100%)";let a="/avatar/{user}/{size}"+(e?"/dark":"");this.isGuest&&(a="/avatar/guest/{user}/{size}"+(e?"/dark":""));let i=o.generateUrl(a,{user:t,size:s});return t===((n=l.getCurrentUser())==null?void 0:n.uid)&&typeof oc_userconfig<"u"&&(i+="?v="+oc_userconfig.avatar.version),i},updateImageIfValid(t,s=null){const e=L(this.user);if(this.isUserDefined&&typeof e=="boolean"){this.isAvatarLoaded=!0,this.avatarUrlLoaded=t,s&&(this.avatarSrcSetLoaded=s),e===!1&&(this.userDoesNotExist=!0);return}const a=new Image;a.onload=()=>{this.avatarUrlLoaded=t,s&&(this.avatarSrcSetLoaded=s),this.isAvatarLoaded=!0,c(this.user,!0)},a.onerror=()=>{console.debug("Invalid avatar url",t),this.avatarUrlLoaded=null,this.avatarSrcSetLoaded=null,this.userDoesNotExist=!0,this.isAvatarLoaded=!1,c(this.user,!1)},s&&(a.srcset=s),a.src=t}}};var A=function(){var t=this,s=t._self._c;return s("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.closeMenu,expression:"closeMenu"}],ref:"main",staticClass:"avatardiv popovermenu-wrapper",class:{"avatardiv--unknown":t.userDoesNotExist,"avatardiv--with-menu":t.hasMenu,"avatardiv--with-menu-loading":t.contactsMenuLoading},style:t.avatarStyle,attrs:{title:t.tooltip,tabindex:t.hasMenu?"0":void 0,"aria-label":t.avatarAriaLabel,role:t.hasMenu?"button":void 0},on:{click:t.toggleMenu,keydown:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.toggleMenu.apply(null,arguments)}}},[t._t("icon",function(){return[t.iconClass?s("div",{staticClass:"avatar-class-icon",class:t.iconClass}):t.isAvatarLoaded&&!t.userDoesNotExist?s("img",{attrs:{src:t.avatarUrlLoaded,srcset:t.avatarSrcSetLoaded,alt:""}}):t._e()]}),t.hasMenu&&!t.menu.length?s("NcButton",{staticClass:"action-item action-item__menutoggle",attrs:{"aria-label":t.t("Open contact menu"),type:"tertiary-no-background"},scopedSlots:t._u([{key:"icon",fn:function(){return[t.contactsMenuLoading?s("NcLoadingIcon"):s("DotsHorizontal",{attrs:{size:20}})]},proxy:!0}],null,!1,2617833509)}):t.hasMenu?s("NcActions",{attrs:{"force-menu":"","manual-open":"",type:"tertiary-no-background",container:t.menuContainer,open:t.contactsMenuOpenState},scopedSlots:t._u([t.contactsMenuLoading?{key:"icon",fn:function(){return[s("NcLoadingIcon")]},proxy:!0}:null],null,!0)},t._l(t.menu,function(e,a){return s("NcActionLink",{key:a,attrs:{href:e.href,icon:e.icon}},[t._v(" "+t._s(e.text)+" ")])}),1):t._e(),t.showUserStatusIconOnAvatar?s("div",{staticClass:"avatardiv__user-status avatardiv__user-status--icon"},[t._v(" "+t._s(t.userStatus.icon)+" ")]):t.canDisplayUserStatus?s("div",{staticClass:"avatardiv__user-status",class:"avatardiv__user-status--"+t.userStatus.status}):t._e(),t.userDoesNotExist&&!(t.iconClass||t.$slots.icon)?s("div",{staticClass:"avatardiv__initials-wrapper",style:t.initialsWrapperStyle},[s("div",{staticClass:"unknown",style:t.initialsStyle},[t._v(" "+t._s(t.initials)+" ")])]):t._e()],2)},C=[],D=M.normalizeComponent(x,A,C,!1,null,"5a1a428c",null,null);const k=D.exports;exports.NcAvatar=k,exports.userStatus=p;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cebd6e80.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}