@bigbinary/neeto-editor-frontend 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/app/javascript/src/translations/ar.json +2 -1
  2. package/app/javascript/src/translations/bg.json +2 -1
  3. package/app/javascript/src/translations/ca.json +2 -1
  4. package/app/javascript/src/translations/cs.json +2 -1
  5. package/app/javascript/src/translations/da.json +2 -1
  6. package/app/javascript/src/translations/de.json +2 -1
  7. package/app/javascript/src/translations/en.json +2 -1
  8. package/app/javascript/src/translations/es-MX.json +2 -1
  9. package/app/javascript/src/translations/es.json +2 -1
  10. package/app/javascript/src/translations/et.json +2 -1
  11. package/app/javascript/src/translations/fi.json +2 -1
  12. package/app/javascript/src/translations/fil.json +2 -1
  13. package/app/javascript/src/translations/fr.json +2 -1
  14. package/app/javascript/src/translations/he.json +2 -1
  15. package/app/javascript/src/translations/hi.json +2 -1
  16. package/app/javascript/src/translations/hr.json +2 -1
  17. package/app/javascript/src/translations/hu.json +2 -1
  18. package/app/javascript/src/translations/id.json +2 -1
  19. package/app/javascript/src/translations/it.json +2 -1
  20. package/app/javascript/src/translations/ja.json +2 -1
  21. package/app/javascript/src/translations/ko.json +2 -1
  22. package/app/javascript/src/translations/lv.json +2 -1
  23. package/app/javascript/src/translations/nl.json +2 -1
  24. package/app/javascript/src/translations/pl.json +2 -1
  25. package/app/javascript/src/translations/pt-BR.json +2 -1
  26. package/app/javascript/src/translations/pt.json +2 -1
  27. package/app/javascript/src/translations/ro.json +2 -1
  28. package/app/javascript/src/translations/ru.json +2 -1
  29. package/app/javascript/src/translations/sk.json +2 -1
  30. package/app/javascript/src/translations/sl.json +2 -1
  31. package/app/javascript/src/translations/sv.json +2 -1
  32. package/app/javascript/src/translations/th.json +2 -1
  33. package/app/javascript/src/translations/tr.json +2 -1
  34. package/app/javascript/src/translations/uk.json +2 -1
  35. package/app/javascript/src/translations/vi.json +2 -1
  36. package/app/javascript/src/translations/zh-CN.json +2 -1
  37. package/app/javascript/src/translations/zh-TW.json +2 -1
  38. package/dist/.ready +1 -1
  39. package/dist/Attachments.js +4 -4
  40. package/dist/Editor.js +8 -8
  41. package/dist/EditorContent.js +2 -2
  42. package/dist/FormikEditor.js +8 -8
  43. package/dist/Menu.js +6 -6
  44. package/dist/{chunk-UwzgbfZD.js → chunk-71BzByG6.js} +2 -1
  45. package/dist/chunk-71BzByG6.js.map +1 -0
  46. package/dist/{chunk-C_4zmIBQ.js → chunk-B-DmzF0q.js} +3 -3
  47. package/dist/{chunk-C_4zmIBQ.js.map → chunk-B-DmzF0q.js.map} +1 -1
  48. package/dist/{chunk-BozdxlzB.js → chunk-BE7om7ts.js} +2 -2
  49. package/dist/{chunk-BozdxlzB.js.map → chunk-BE7om7ts.js.map} +1 -1
  50. package/dist/{chunk-CLjWv4gG.js → chunk-BEopbFak.js} +5 -5
  51. package/dist/{chunk-CLjWv4gG.js.map → chunk-BEopbFak.js.map} +1 -1
  52. package/dist/chunk-BFj2DeQe.js +24 -0
  53. package/dist/chunk-BFj2DeQe.js.map +1 -0
  54. package/dist/{chunk-DwQ7NJtm.js → chunk-BlvmXrHo.js} +5 -5
  55. package/dist/chunk-BlvmXrHo.js.map +1 -0
  56. package/dist/{chunk-AexVHCkr.js → chunk-Bq_ijJy6.js} +5 -5
  57. package/dist/{chunk-AexVHCkr.js.map → chunk-Bq_ijJy6.js.map} +1 -1
  58. package/dist/{chunk-yBvbLjSM.js → chunk-Bqh1Tsc6.js} +3 -3
  59. package/dist/{chunk-yBvbLjSM.js.map → chunk-Bqh1Tsc6.js.map} +1 -1
  60. package/dist/{chunk-Bktpw5vs.js → chunk-Bskj5cbo.js} +6 -6
  61. package/dist/{chunk-Bktpw5vs.js.map → chunk-Bskj5cbo.js.map} +1 -1
  62. package/dist/{chunk-GA-wADEN.js → chunk-CMfrTj8Z.js} +3 -3
  63. package/dist/{chunk-GA-wADEN.js.map → chunk-CMfrTj8Z.js.map} +1 -1
  64. package/dist/chunk-CXFFqMSB.js +21232 -0
  65. package/dist/chunk-CXFFqMSB.js.map +1 -0
  66. package/dist/{chunk-D37Dlp9s.js → chunk-CYmA2oQ8.js} +5 -5
  67. package/dist/{chunk-D37Dlp9s.js.map → chunk-CYmA2oQ8.js.map} +1 -1
  68. package/dist/{chunk-CNIDH-FD.js → chunk-Dwn1Kihg.js} +2 -2
  69. package/dist/{chunk-CNIDH-FD.js.map → chunk-Dwn1Kihg.js.map} +1 -1
  70. package/dist/{chunk-BIgc5m-h.js → chunk-EjoZ4e18.js} +4 -4
  71. package/dist/{chunk-BIgc5m-h.js.map → chunk-EjoZ4e18.js.map} +1 -1
  72. package/dist/{chunk-CivYrffM.js → chunk-PFB_80PR.js} +4 -4
  73. package/dist/{chunk-CivYrffM.js.map → chunk-PFB_80PR.js.map} +1 -1
  74. package/dist/{chunk-BHi0J28T.js → chunk-Verd5n0p.js} +7 -6
  75. package/dist/chunk-Verd5n0p.js.map +1 -0
  76. package/dist/cjs/Attachments.cjs.js +4 -4
  77. package/dist/cjs/Editor.cjs.js +8 -8
  78. package/dist/cjs/EditorContent.cjs.js +2 -2
  79. package/dist/cjs/FormikEditor.cjs.js +8 -8
  80. package/dist/cjs/Menu.cjs.js +6 -6
  81. package/dist/cjs/chunk-BIjq_wPr.cjs.js +21279 -0
  82. package/dist/cjs/chunk-BIjq_wPr.cjs.js.map +1 -0
  83. package/dist/cjs/{chunk-Cr0FBhRs.cjs.js → chunk-BhQA4bH9.cjs.js} +7 -6
  84. package/dist/cjs/chunk-BhQA4bH9.cjs.js.map +1 -0
  85. package/dist/cjs/{chunk-BfHU_Ynq.cjs.js → chunk-CE1t-vbx.cjs.js} +5 -5
  86. package/dist/cjs/{chunk-BfHU_Ynq.cjs.js.map → chunk-CE1t-vbx.cjs.js.map} +1 -1
  87. package/dist/cjs/{chunk-CKbuSSOi.cjs.js → chunk-CVJLunrU.cjs.js} +6 -6
  88. package/dist/cjs/{chunk-CKbuSSOi.cjs.js.map → chunk-CVJLunrU.cjs.js.map} +1 -1
  89. package/dist/cjs/{chunk-Niprqtd_.cjs.js → chunk-CgYpFN-j.cjs.js} +3 -3
  90. package/dist/cjs/{chunk-Niprqtd_.cjs.js.map → chunk-CgYpFN-j.cjs.js.map} +1 -1
  91. package/dist/cjs/{chunk-CfiRFXt2.cjs.js → chunk-Crr-dv3q.cjs.js} +4 -3
  92. package/dist/cjs/{chunk-CfiRFXt2.cjs.js.map → chunk-Crr-dv3q.cjs.js.map} +1 -1
  93. package/dist/cjs/chunk-CvnWF5Pm.cjs.js +26 -0
  94. package/dist/cjs/chunk-CvnWF5Pm.cjs.js.map +1 -0
  95. package/dist/cjs/{chunk-Df43FB6u.cjs.js → chunk-D-AVd9c9.cjs.js} +5 -5
  96. package/dist/cjs/{chunk-Df43FB6u.cjs.js.map → chunk-D-AVd9c9.cjs.js.map} +1 -1
  97. package/dist/cjs/{chunk-CpQ8t9br.cjs.js → chunk-D2INvafM.cjs.js} +3 -3
  98. package/dist/cjs/{chunk-CpQ8t9br.cjs.js.map → chunk-D2INvafM.cjs.js.map} +1 -1
  99. package/dist/cjs/{chunk-DuwgLqpD.cjs.js → chunk-DIpshzqU.cjs.js} +5 -5
  100. package/dist/cjs/{chunk-DuwgLqpD.cjs.js.map → chunk-DIpshzqU.cjs.js.map} +1 -1
  101. package/dist/cjs/{chunk-BxKa_XOs.cjs.js → chunk-DO6eyguX.cjs.js} +2 -1
  102. package/dist/cjs/chunk-DO6eyguX.cjs.js.map +1 -0
  103. package/dist/cjs/{chunk-CAaxrndK.cjs.js → chunk-DOiH1lXw.cjs.js} +4 -4
  104. package/dist/cjs/{chunk-CAaxrndK.cjs.js.map → chunk-DOiH1lXw.cjs.js.map} +1 -1
  105. package/dist/cjs/{chunk-Ct6vCCZ0.cjs.js → chunk-DnoebPXq.cjs.js} +5 -4
  106. package/dist/cjs/chunk-DnoebPXq.cjs.js.map +1 -0
  107. package/dist/cjs/{chunk-Df33Mipq.cjs.js → chunk-DoDh8RsI.cjs.js} +2 -2
  108. package/dist/cjs/{chunk-Df33Mipq.cjs.js.map → chunk-DoDh8RsI.cjs.js.map} +1 -1
  109. package/dist/cjs/{chunk-CQ-j2kAX.cjs.js → chunk-G_6vNGIP.cjs.js} +2 -2
  110. package/dist/cjs/{chunk-CQ-j2kAX.cjs.js.map → chunk-G_6vNGIP.cjs.js.map} +1 -1
  111. package/dist/cjs/{chunk-CkSG3yNC.cjs.js → chunk-z7T8oExT.cjs.js} +3 -3
  112. package/dist/cjs/{chunk-CkSG3yNC.cjs.js.map → chunk-z7T8oExT.cjs.js.map} +1 -1
  113. package/dist/cjs/constants.cjs.js +2 -2
  114. package/dist/cjs/index.cjs.js +8 -8
  115. package/dist/cjs/utils.cjs.js +3 -3
  116. package/dist/cjs/v2/Attachments.cjs.js +4 -4
  117. package/dist/cjs/v2/Editor.cjs.js +654 -25
  118. package/dist/cjs/v2/Editor.cjs.js.map +1 -1
  119. package/dist/cjs/v2/EditorContent.cjs.js +3 -3
  120. package/dist/cjs/v2/FormikEditor.cjs.js +9 -9
  121. package/dist/cjs/v2/Menu.cjs.js +4 -4
  122. package/dist/cjs/v2/constants.cjs.js +2 -2
  123. package/dist/cjs/v2/index.cjs.js +8 -8
  124. package/dist/cjs/v2/utils.cjs.js +3 -3
  125. package/dist/constants.js +2 -2
  126. package/dist/editor-stats.html +1 -1
  127. package/dist/index.js +8 -8
  128. package/dist/utils.js +3 -3
  129. package/dist/v2/Attachments.js +4 -4
  130. package/dist/v2/Editor.js +658 -29
  131. package/dist/v2/Editor.js.map +1 -1
  132. package/dist/v2/EditorContent.js +3 -3
  133. package/dist/v2/FormikEditor.js +9 -9
  134. package/dist/v2/Menu.js +4 -4
  135. package/dist/v2/constants.js +2 -2
  136. package/dist/v2/editor-content-styles.js +1 -1
  137. package/dist/v2/editor-content.min.css +1 -1
  138. package/dist/v2/index.js +8 -8
  139. package/dist/v2/styles.css +1 -1
  140. package/dist/v2/styles.js +1 -1
  141. package/dist/v2/utils.js +3 -3
  142. package/package.json +10 -9
  143. package/dist/chunk-BHi0J28T.js.map +0 -1
  144. package/dist/chunk-DwQ7NJtm.js.map +0 -1
  145. package/dist/chunk-UwzgbfZD.js.map +0 -1
  146. package/dist/cjs/chunk-BxKa_XOs.cjs.js.map +0 -1
  147. package/dist/cjs/chunk-Cr0FBhRs.cjs.js.map +0 -1
  148. package/dist/cjs/chunk-Ct6vCCZ0.cjs.js.map +0 -1
@@ -5,28 +5,31 @@ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
5
5
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
6
6
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
7
7
  var React = require('react');
8
- var neetoAtoms = require('@bigbinary/neeto-atoms');
9
8
  var useEditorStore = require('../chunk-CxKWZyHq.cjs.js');
10
9
  var classnames = require('classnames');
10
+ var neetoAtoms = require('@bigbinary/neeto-atoms');
11
11
  var neetoCist = require('@bigbinary/neeto-cist');
12
12
  var reactUtils = require('@bigbinary/neeto-commons-frontend/v2/react-utils');
13
13
  var ReactDOM$1 = require('react-dom');
14
- var getVideoDimension = require('../chunk-Df33Mipq.cjs.js');
15
- var constants = require('../chunk-BxKa_XOs.cjs.js');
14
+ var getVideoDimension = require('../chunk-DoDh8RsI.cjs.js');
15
+ var constants = require('../chunk-DO6eyguX.cjs.js');
16
16
  var markdown = require('../chunk-C_XHzWXy.cjs.js');
17
- require('../chunk-CQ-j2kAX.cjs.js');
17
+ require('../chunk-G_6vNGIP.cjs.js');
18
18
  var ramda = require('ramda');
19
19
  var ReactDOM = require('react-dom/server');
20
20
  var common = require('../chunk-CU6dMPZV.cjs.js');
21
21
  var jsxRuntime = require('react/jsx-runtime');
22
- var v2_Menu = require('../chunk-CAaxrndK.cjs.js');
23
- var Megaphone = require('@bigbinary/neeto-icons/misc/Megaphone');
22
+ var v2_Menu = require('../chunk-DOiH1lXw.cjs.js');
23
+ var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
24
24
  var index = require('../chunk-CJIIbW7G.cjs.js');
25
+ var i18n = require('i18next');
26
+ var reactFileIcon_esm = require('../chunk-BhQA4bH9.cjs.js');
27
+ var v2_Attachments = require('../chunk-DnoebPXq.cjs.js');
28
+ var FileIcon = require('../chunk-Crr-dv3q.cjs.js');
25
29
  var lucideReact = require('lucide-react');
26
- var CopyToClipboardButton = require('@bigbinary/neeto-molecules/v2/CopyToClipboardButton');
27
30
  var reactI18next = require('react-i18next');
28
- var i18n = require('i18next');
29
- var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
31
+ var Megaphone = require('@bigbinary/neeto-icons/misc/Megaphone');
32
+ var CopyToClipboardButton = require('@bigbinary/neeto-molecules/v2/CopyToClipboardButton');
30
33
  require('@babel/runtime/helpers/readOnlyError');
31
34
  var tippy = require('tippy.js');
32
35
  var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
@@ -36,7 +39,6 @@ var _getPrototypeOf = require('@babel/runtime/helpers/getPrototypeOf');
36
39
  var _inherits = require('@babel/runtime/helpers/inherits');
37
40
  var emojiMart = require('emoji-mart');
38
41
  var initializers = require('@bigbinary/neeto-commons-frontend/v2/initializers');
39
- var reactFileIcon_esm = require('../chunk-Cr0FBhRs.cjs.js');
40
42
  var Tippy = require('@tippyjs/react');
41
43
  var TextP = require('@bigbinary/neeto-icons/TextP');
42
44
  var TextH1 = require('@bigbinary/neeto-icons/TextH1');
@@ -61,12 +63,10 @@ var Underline = require('@bigbinary/neeto-icons/Underline');
61
63
  var Link$1 = require('@bigbinary/neeto-icons/Link');
62
64
  var Attachment = require('@bigbinary/neeto-icons/Attachment');
63
65
  var MessageSquare = require('@bigbinary/neeto-icons/MessageSquare');
64
- var File = require('@bigbinary/neeto-icons/File');
65
- var FileIcon = require('../chunk-CfiRFXt2.cjs.js');
66
+ var File$1 = require('@bigbinary/neeto-icons/File');
66
67
  var _typeof = require('@babel/runtime/helpers/typeof');
67
68
  var Search = require('@bigbinary/neeto-molecules/v2/Search');
68
69
  var formik = require('@bigbinary/neeto-atoms/formik');
69
- var v2_Attachments = require('../chunk-Ct6vCCZ0.cjs.js');
70
70
  require('axios');
71
71
  require('@bigbinary/neeto-commons-frontend/react-utils');
72
72
  require('zustand');
@@ -81,6 +81,7 @@ require('react-colorful');
81
81
  require('@bigbinary/neeto-image-uploader-frontend/v2/ImageUploader');
82
82
  require('zustand/shallow');
83
83
  require('@bigbinary/neeto-molecules/v2/DynamicVariables');
84
+ require('@bigbinary/neeto-commons-frontend/v2/react-utils/useOnClickOutside');
84
85
  require('@bigbinary/neeto-icons/LeftAlign');
85
86
  require('@bigbinary/neeto-icons/CenterAlign');
86
87
  require('@bigbinary/neeto-icons/RightAlign');
@@ -93,7 +94,6 @@ require('@bigbinary/neeto-icons/AspectRatio169');
93
94
  require('@bigbinary/neeto-icons/AspectRatio916');
94
95
  require('@bigbinary/neeto-icons/AspectRatio43');
95
96
  require('@bigbinary/neeto-icons/AspectRatio32');
96
- require('@bigbinary/neeto-commons-frontend/v2/react-utils/useOnClickOutside');
97
97
 
98
98
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
99
99
 
@@ -104,9 +104,9 @@ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefault(_objectWith
104
104
  var React__default = /*#__PURE__*/_interopDefault(React);
105
105
  var classnames__default = /*#__PURE__*/_interopDefault(classnames);
106
106
  var ReactDOM__default = /*#__PURE__*/_interopDefault(ReactDOM);
107
+ var _asyncToGenerator__default = /*#__PURE__*/_interopDefault(_asyncToGenerator);
107
108
  var Megaphone__default = /*#__PURE__*/_interopDefault(Megaphone);
108
109
  var CopyToClipboardButton__default = /*#__PURE__*/_interopDefault(CopyToClipboardButton);
109
- var _asyncToGenerator__default = /*#__PURE__*/_interopDefault(_asyncToGenerator);
110
110
  var tippy__default = /*#__PURE__*/_interopDefault(tippy);
111
111
  var _classCallCheck__default = /*#__PURE__*/_interopDefault(_classCallCheck);
112
112
  var _createClass__default = /*#__PURE__*/_interopDefault(_createClass);
@@ -137,7 +137,7 @@ var Underline__default = /*#__PURE__*/_interopDefault(Underline);
137
137
  var Link__default = /*#__PURE__*/_interopDefault(Link$1);
138
138
  var Attachment__default = /*#__PURE__*/_interopDefault(Attachment);
139
139
  var MessageSquare__default = /*#__PURE__*/_interopDefault(MessageSquare);
140
- var File__default = /*#__PURE__*/_interopDefault(File);
140
+ var File__default = /*#__PURE__*/_interopDefault(File$1);
141
141
  var _typeof__default = /*#__PURE__*/_interopDefault(_typeof);
142
142
  var Search__default = /*#__PURE__*/_interopDefault(Search);
143
143
 
@@ -196,6 +196,604 @@ var CharacterCountWrapper = function CharacterCountWrapper(_ref) {
196
196
  });
197
197
  };
198
198
 
199
+ var NODE_NAME = "attachment";
200
+
201
+ // Files larger than this are shown as a chip, never as an inline preview.
202
+ var DEFAULT_INLINE_PREVIEW_MAX_SIZE = 20 * 1024 * 1024;
203
+ var PDF_THUMBNAIL_WIDTH = 800;
204
+ var PREVIEW_TYPES = {
205
+ IMAGE: "image",
206
+ VIDEO: "video",
207
+ PDF: "pdf"
208
+ };
209
+ var INLINE_PREVIEW_IMAGE_TYPES = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/webp"];
210
+ var PDF_CONTENT_TYPE = "application/pdf";
211
+
212
+ var _excluded$5 = ["data"];
213
+ function _regenerator$4() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2$4(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = false, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = true, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), true), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2$4(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2$4(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2$4(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2$4(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2$4(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2$4(u), _regeneratorDefine2$4(u, o, "Generator"), _regeneratorDefine2$4(u, n, function () { return this; }), _regeneratorDefine2$4(u, "toString", function () { return "[object Generator]"; }), (_regenerator$4 = function _regenerator() { return { w: i, m: f }; })(); }
214
+ function _regeneratorDefine2$4(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2$4 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2$4(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2$4(e, r, n, t); }
215
+
216
+ // pdf.js normally runs in a web worker loaded from a separate file, which a
217
+ // host app bundling this package can't be relied on to serve. Exposing the
218
+ // worker module on `globalThis.pdfjsWorker` makes pdf.js run it in-page.
219
+ var loadPdfjs = /*#__PURE__*/function () {
220
+ var _ref = _asyncToGenerator__default.default(/*#__PURE__*/_regenerator$4().m(function _callee() {
221
+ var _globalThis$pdfjsWork;
222
+ var _yield$Promise$all, _yield$Promise$all2, pdfjs, worker;
223
+ return _regenerator$4().w(function (_context) {
224
+ while (1) switch (_context.n) {
225
+ case 0:
226
+ _context.n = 1;
227
+ return Promise.all([Promise.resolve().then(function () { return require('../chunk-BIjq_wPr.cjs.js'); }), Promise.resolve().then(function () { return require('../chunk-CvnWF5Pm.cjs.js'); })]);
228
+ case 1:
229
+ _yield$Promise$all = _context.v;
230
+ _yield$Promise$all2 = _slicedToArray__default.default(_yield$Promise$all, 2);
231
+ pdfjs = _yield$Promise$all2[0];
232
+ worker = _yield$Promise$all2[1];
233
+ (_globalThis$pdfjsWork = globalThis.pdfjsWorker) !== null && _globalThis$pdfjsWork !== void 0 ? _globalThis$pdfjsWork : globalThis.pdfjsWorker = worker;
234
+ return _context.a(2, pdfjs);
235
+ }
236
+ }, _callee);
237
+ }));
238
+ return function loadPdfjs() {
239
+ return _ref.apply(this, arguments);
240
+ };
241
+ }();
242
+ var canvasToBlob = function canvasToBlob(canvas) {
243
+ return new Promise(function (resolve) {
244
+ return canvas.toBlob(resolve, "image/png");
245
+ });
246
+ };
247
+ var getPreviewType = function getPreviewType(_ref2, maxSize) {
248
+ var contentType = _ref2.contentType,
249
+ size = _ref2.size,
250
+ thumbnailUrl = _ref2.thumbnailUrl;
251
+ if (!contentType || neetoCist.isPresent(size) && Number(size) > maxSize) return null;
252
+ if (INLINE_PREVIEW_IMAGE_TYPES.includes(contentType)) {
253
+ return PREVIEW_TYPES.IMAGE;
254
+ }
255
+ if (contentType.startsWith("video/")) return PREVIEW_TYPES.VIDEO;
256
+ if (contentType === PDF_CONTENT_TYPE && neetoCist.isPresent(thumbnailUrl)) {
257
+ return PREVIEW_TYPES.PDF;
258
+ }
259
+ return null;
260
+ };
261
+ var getPreviewSrc = function getPreviewSrc(_ref3, previewType) {
262
+ var url = _ref3.url,
263
+ thumbnailUrl = _ref3.thumbnailUrl;
264
+ return previewType === PREVIEW_TYPES.PDF ? thumbnailUrl : url;
265
+ };
266
+ var uploadFile = /*#__PURE__*/function () {
267
+ var _ref4 = _asyncToGenerator__default.default(/*#__PURE__*/_regenerator$4().m(function _callee2(file, endpoint) {
268
+ var _data$blob_url, _data$signed_id;
269
+ var _yield$DirectUpload$c, _yield$DirectUpload$c2, data, response;
270
+ return _regenerator$4().w(function (_context2) {
271
+ while (1) switch (_context2.n) {
272
+ case 0:
273
+ _context2.n = 1;
274
+ return new reactFileIcon_esm.DirectUpload({
275
+ file: file,
276
+ url: endpoint
277
+ }).create();
278
+ case 1:
279
+ _yield$DirectUpload$c = _context2.v;
280
+ _yield$DirectUpload$c2 = _yield$DirectUpload$c.data;
281
+ data = _yield$DirectUpload$c2 === void 0 ? {} : _yield$DirectUpload$c2;
282
+ response = _objectWithoutProperties__default.default(_yield$DirectUpload$c, _excluded$5);
283
+ return _context2.a(2, {
284
+ url: (_data$blob_url = data.blob_url) !== null && _data$blob_url !== void 0 ? _data$blob_url : response.blob_url,
285
+ signedId: (_data$signed_id = data.signed_id) !== null && _data$signed_id !== void 0 ? _data$signed_id : response.signed_id
286
+ });
287
+ }
288
+ }, _callee2);
289
+ }));
290
+ return function uploadFile(_x, _x2) {
291
+ return _ref4.apply(this, arguments);
292
+ };
293
+ }();
294
+ var generatePdfThumbnail = /*#__PURE__*/function () {
295
+ var _ref5 = _asyncToGenerator__default.default(/*#__PURE__*/_regenerator$4().m(function _callee3(file) {
296
+ var pdfjs, pdf, page, _page$getViewport, width, viewport, canvas, blob, name, _t, _t2;
297
+ return _regenerator$4().w(function (_context3) {
298
+ while (1) switch (_context3.p = _context3.n) {
299
+ case 0:
300
+ _context3.n = 1;
301
+ return loadPdfjs();
302
+ case 1:
303
+ pdfjs = _context3.v;
304
+ _t = pdfjs;
305
+ _context3.n = 2;
306
+ return file.arrayBuffer();
307
+ case 2:
308
+ _t2 = _context3.v;
309
+ _context3.n = 3;
310
+ return _t.getDocument.call(_t, {
311
+ data: _t2
312
+ }).promise;
313
+ case 3:
314
+ pdf = _context3.v;
315
+ _context3.p = 4;
316
+ _context3.n = 5;
317
+ return pdf.getPage(1);
318
+ case 5:
319
+ page = _context3.v;
320
+ _page$getViewport = page.getViewport({
321
+ scale: 1
322
+ }), width = _page$getViewport.width;
323
+ viewport = page.getViewport({
324
+ scale: PDF_THUMBNAIL_WIDTH / width
325
+ });
326
+ canvas = document.createElement("canvas");
327
+ canvas.width = viewport.width;
328
+ canvas.height = viewport.height;
329
+ _context3.n = 6;
330
+ return page.render({
331
+ canvasContext: canvas.getContext("2d"),
332
+ viewport: viewport
333
+ }).promise;
334
+ case 6:
335
+ _context3.n = 7;
336
+ return canvasToBlob(canvas);
337
+ case 7:
338
+ blob = _context3.v;
339
+ if (blob) {
340
+ _context3.n = 8;
341
+ break;
342
+ }
343
+ return _context3.a(2, null);
344
+ case 8:
345
+ name = "".concat(file.name.replace(/\.pdf$/i, ""), "-preview.png");
346
+ return _context3.a(2, new File([blob], name, {
347
+ type: "image/png"
348
+ }));
349
+ case 9:
350
+ _context3.p = 9;
351
+ pdf.destroy();
352
+ return _context3.f(9);
353
+ case 10:
354
+ return _context3.a(2);
355
+ }
356
+ }, _callee3, null, [[4,, 9, 10]]);
357
+ }));
358
+ return function generatePdfThumbnail(_x3) {
359
+ return _ref5.apply(this, arguments);
360
+ };
361
+ }();
362
+ var findNodePosByUploadId = function findNodePosByUploadId(doc, uploadId) {
363
+ var foundPos = -1;
364
+ doc.descendants(function (node, pos) {
365
+ var _node$attrs;
366
+ if (foundPos !== -1) return false;
367
+ if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.uploadId) === uploadId) foundPos = pos;
368
+ return foundPos === -1;
369
+ });
370
+ return foundPos;
371
+ };
372
+ var countAttachmentNodes = function countAttachmentNodes(doc, nodeName) {
373
+ var count = 0;
374
+ doc.descendants(function (node) {
375
+ if (node.type.name === nodeName) count += 1;
376
+ });
377
+ return count;
378
+ };
379
+
380
+ var Preview = /*#__PURE__*/React.lazy(function () {
381
+ return Promise.resolve().then(function () { return require('../chunk-CE1t-vbx.cjs.js'); });
382
+ });
383
+ var AttachmentComponent = function AttachmentComponent(_ref) {
384
+ var node = _ref.node,
385
+ extension = _ref.extension,
386
+ editor = _ref.editor,
387
+ deleteNode = _ref.deleteNode;
388
+ var _useTranslation = reactI18next.useTranslation(),
389
+ t = _useTranslation.t;
390
+ var _useState = React.useState(false),
391
+ _useState2 = _slicedToArray__default.default(_useState, 2),
392
+ isPreviewOpen = _useState2[0],
393
+ setIsPreviewOpen = _useState2[1];
394
+ var _node$attrs = node.attrs,
395
+ url = _node$attrs.url,
396
+ filename = _node$attrs.filename,
397
+ contentType = _node$attrs.contentType,
398
+ size = _node$attrs.size,
399
+ signedId = _node$attrs.signedId,
400
+ uploadId = _node$attrs.uploadId;
401
+ var attachment = {
402
+ url: url,
403
+ filename: filename,
404
+ contentType: contentType,
405
+ size: size,
406
+ signedId: signedId
407
+ };
408
+ var previewType = getPreviewType(node.attrs, extension.options.previewMaxSize);
409
+ var previewSrc = getPreviewSrc(node.attrs, previewType);
410
+ var canView = v2_Attachments.checkPreviewAvailability(contentType);
411
+ var actions = [canView && {
412
+ key: "view",
413
+ icon: lucideReact.Eye,
414
+ label: t("neetoEditor.attachments.view"),
415
+ onClick: function onClick() {
416
+ return setIsPreviewOpen(true);
417
+ }
418
+ }, {
419
+ key: "download",
420
+ icon: lucideReact.Download,
421
+ label: t("neetoEditor.common.download"),
422
+ onClick: function onClick() {
423
+ return v2_Attachments.downloadFile(url, filename);
424
+ }
425
+ }, {
426
+ key: "open",
427
+ icon: lucideReact.ExternalLink,
428
+ label: t("neetoEditor.common.openInNewTab"),
429
+ onClick: function onClick() {
430
+ return window.open(url, "_blank", "noopener,noreferrer");
431
+ }
432
+ }, editor.isEditable && {
433
+ key: "delete",
434
+ icon: lucideReact.Trash2,
435
+ label: t("neetoEditor.menu.delete"),
436
+ onClick: deleteNode
437
+ }].filter(Boolean);
438
+ if (uploadId) {
439
+ return /*#__PURE__*/jsxRuntime.jsx(useEditorStore.NodeViewWrapper, {
440
+ className: "neeto-editor__attachment neeto-editor__attachment--uploading",
441
+ "data-testid": "neeto-editor-attachment-uploading",
442
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
443
+ className: "neeto-editor__attachment-file",
444
+ children: [/*#__PURE__*/jsxRuntime.jsx(neetoAtoms.Spinner, {}), /*#__PURE__*/jsxRuntime.jsx("span", {
445
+ className: "neeto-editor__attachment-name",
446
+ children: filename
447
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
448
+ className: "neeto-editor__attachment-size",
449
+ children: t("neetoEditor.attachments.uploading")
450
+ })]
451
+ })
452
+ });
453
+ }
454
+ return /*#__PURE__*/jsxRuntime.jsxs(useEditorStore.NodeViewWrapper, {
455
+ "data-drag-handle": true,
456
+ className: "neeto-editor__attachment",
457
+ "data-testid": "neeto-editor-attachment",
458
+ children: [previewType && /*#__PURE__*/jsxRuntime.jsx("div", {
459
+ className: "neeto-editor__attachment-preview",
460
+ onClick: previewType === PREVIEW_TYPES.VIDEO ? neetoCist.noop : function () {
461
+ return setIsPreviewOpen(true);
462
+ },
463
+ children: previewType === PREVIEW_TYPES.VIDEO ? /*#__PURE__*/jsxRuntime.jsx("video", {
464
+ controls: true,
465
+ playsInline: true,
466
+ preload: "metadata",
467
+ src: previewSrc
468
+ }) : /*#__PURE__*/jsxRuntime.jsx("img", {
469
+ alt: filename,
470
+ draggable: false,
471
+ src: previewSrc
472
+ })
473
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
474
+ className: "neeto-editor__attachment-file",
475
+ children: [/*#__PURE__*/jsxRuntime.jsx(FileIcon.File, {
476
+ className: "neeto-editor__attachment-icon",
477
+ fileName: filename
478
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
479
+ className: "neeto-editor__attachment-name",
480
+ children: filename
481
+ }), size && /*#__PURE__*/jsxRuntime.jsx("span", {
482
+ className: "neeto-editor__attachment-size",
483
+ children: FileIcon.convertToFileSize(Number(size))
484
+ }), /*#__PURE__*/jsxRuntime.jsx("div", {
485
+ className: "neeto-editor__attachment-actions",
486
+ children: actions.map(function (_ref2) {
487
+ var key = _ref2.key,
488
+ icon = _ref2.icon,
489
+ label = _ref2.label,
490
+ onClick = _ref2.onClick;
491
+ return /*#__PURE__*/jsxRuntime.jsx(neetoAtoms.Tooltip, {
492
+ content: label,
493
+ position: "top",
494
+ children: /*#__PURE__*/jsxRuntime.jsx(neetoAtoms.Button, {
495
+ icon: icon,
496
+ onClick: onClick,
497
+ "aria-label": label,
498
+ "data-testid": "neeto-editor-attachment-".concat(key, "-button"),
499
+ size: "sm",
500
+ variant: "ghost"
501
+ })
502
+ }, key);
503
+ })
504
+ })]
505
+ }), /*#__PURE__*/jsxRuntime.jsx(React.Suspense, {
506
+ fallback: /*#__PURE__*/jsxRuntime.jsx("span", {}),
507
+ children: isPreviewOpen && /*#__PURE__*/jsxRuntime.jsx(Preview, {
508
+ attachments: [attachment],
509
+ selectedAttachment: attachment,
510
+ setDidFetchPreviewBundle: neetoCist.noop,
511
+ setSelectedAttachment: neetoCist.noop,
512
+ onClose: function onClose() {
513
+ return setIsPreviewOpen(false);
514
+ }
515
+ })
516
+ })]
517
+ });
518
+ };
519
+
520
+ function ownKeys$j(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
521
+ function _objectSpread$j(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$j(Object(t), true).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$j(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
522
+ function _regenerator$3() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2$3(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = false, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = true, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), true), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2$3(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2$3(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2$3(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2$3(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2$3(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2$3(u), _regeneratorDefine2$3(u, o, "Generator"), _regeneratorDefine2$3(u, n, function () { return this; }), _regeneratorDefine2$3(u, "toString", function () { return "[object Generator]"; }), (_regenerator$3 = function _regenerator() { return { w: i, m: f }; })(); }
523
+ function _regeneratorDefine2$3(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2$3 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2$3(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2$3(e, r, n, t); }
524
+ var dataAttribute = function dataAttribute(name, attribute) {
525
+ return {
526
+ "default": null,
527
+ parseHTML: function parseHTML(element) {
528
+ return element.getAttribute(attribute);
529
+ },
530
+ renderHTML: function renderHTML(attributes) {
531
+ return attributes[name] ? _defineProperty__default.default({}, attribute, attributes[name]) : {};
532
+ }
533
+ };
534
+ };
535
+ var uploadThumbnail = /*#__PURE__*/function () {
536
+ var _ref2 = _asyncToGenerator__default.default(/*#__PURE__*/_regenerator$3().m(function _callee(file, endpoint) {
537
+ var thumbnail, _t, _t2;
538
+ return _regenerator$3().w(function (_context) {
539
+ while (1) switch (_context.p = _context.n) {
540
+ case 0:
541
+ _context.p = 0;
542
+ _context.n = 1;
543
+ return generatePdfThumbnail(file);
544
+ case 1:
545
+ thumbnail = _context.v;
546
+ if (!thumbnail) {
547
+ _context.n = 3;
548
+ break;
549
+ }
550
+ _context.n = 2;
551
+ return uploadFile(thumbnail, endpoint);
552
+ case 2:
553
+ _t = _context.v.url;
554
+ _context.n = 4;
555
+ break;
556
+ case 3:
557
+ _t = null;
558
+ case 4:
559
+ return _context.a(2, _t);
560
+ case 5:
561
+ _context.p = 5;
562
+ _t2 = _context.v;
563
+ // A missing thumbnail only means the PDF is shown as a chip.
564
+ // eslint-disable-next-line no-console
565
+ console.error("Failed to generate the PDF thumbnail", _t2);
566
+ return _context.a(2, null);
567
+ }
568
+ }, _callee, null, [[0, 5]]);
569
+ }));
570
+ return function uploadThumbnail(_x, _x2) {
571
+ return _ref2.apply(this, arguments);
572
+ };
573
+ }();
574
+ var AttachmentExtension = useEditorStore.Node.create({
575
+ name: NODE_NAME,
576
+ group: "block",
577
+ atom: true,
578
+ draggable: true,
579
+ selectable: true,
580
+ addOptions: function addOptions() {
581
+ return {
582
+ config: {},
583
+ previewMaxSize: DEFAULT_INLINE_PREVIEW_MAX_SIZE,
584
+ getExternalAttachmentsCount: function getExternalAttachmentsCount() {
585
+ return 0;
586
+ },
587
+ setIsUploading: function setIsUploading() {}
588
+ };
589
+ },
590
+ addStorage: function addStorage() {
591
+ return {
592
+ pendingUploadsCount: 0
593
+ };
594
+ },
595
+ addAttributes: function addAttributes() {
596
+ return {
597
+ url: dataAttribute("url", "data-url"),
598
+ filename: dataAttribute("filename", "data-filename"),
599
+ contentType: dataAttribute("contentType", "data-content-type"),
600
+ size: dataAttribute("size", "data-size"),
601
+ signedId: dataAttribute("signedId", "data-signed-id"),
602
+ thumbnailUrl: dataAttribute("thumbnailUrl", "data-thumbnail-url"),
603
+ uploadId: {
604
+ "default": null,
605
+ rendered: false
606
+ }
607
+ };
608
+ },
609
+ parseHTML: function parseHTML() {
610
+ return [{
611
+ tag: "div[data-attachment]"
612
+ }];
613
+ },
614
+ renderHTML: function renderHTML(_ref3) {
615
+ var node = _ref3.node,
616
+ HTMLAttributes = _ref3.HTMLAttributes;
617
+ var _node$attrs = node.attrs,
618
+ url = _node$attrs.url,
619
+ filename = _node$attrs.filename,
620
+ size = _node$attrs.size;
621
+
622
+ // Still uploading: leave nothing behind in the saved HTML.
623
+ if (!url) return ["span"];
624
+ var previewType = getPreviewType(node.attrs, this.options.previewMaxSize);
625
+ var linkAttrs = {
626
+ href: url,
627
+ target: "_blank",
628
+ rel: "noopener noreferrer"
629
+ };
630
+ var previewSrc = getPreviewSrc(node.attrs, previewType);
631
+ var preview = previewType === PREVIEW_TYPES.VIDEO ? ["video", {
632
+ src: previewSrc,
633
+ controls: true,
634
+ playsinline: true,
635
+ preload: "metadata"
636
+ }] : ["a", linkAttrs, ["img", {
637
+ src: previewSrc,
638
+ alt: filename,
639
+ loading: "lazy"
640
+ }]];
641
+ var file = ["a", _objectSpread$j(_objectSpread$j({}, linkAttrs), {}, {
642
+ "class": "neeto-editor__attachment-file"
643
+ }), ["span", {
644
+ "class": "neeto-editor__attachment-name"
645
+ }, filename]].concat(_toConsumableArray__default.default(size ? [["span", {
646
+ "class": "neeto-editor__attachment-size"
647
+ }, FileIcon.convertToFileSize(Number(size))]] : []));
648
+ return ["div", _objectSpread$j(_objectSpread$j({}, HTMLAttributes), {}, {
649
+ "data-attachment": "",
650
+ "class": "neeto-editor__attachment"
651
+ })].concat(_toConsumableArray__default.default(previewType ? [["div", {
652
+ "class": "neeto-editor__attachment-preview"
653
+ }, preview]] : []), [file]);
654
+ },
655
+ addNodeView: function addNodeView() {
656
+ return useEditorStore.ReactNodeViewRenderer(AttachmentComponent);
657
+ },
658
+ addCommands: function addCommands() {
659
+ var _this = this;
660
+ return {
661
+ uploadAttachments: function uploadAttachments(files, position) {
662
+ return function (_ref4) {
663
+ var editor = _ref4.editor;
664
+ _this.storage.uploadFiles(editor, Array.from(files), position);
665
+ return true;
666
+ };
667
+ }
668
+ };
669
+ },
670
+ onCreate: function onCreate() {
671
+ var options = this.options,
672
+ storage = this.storage;
673
+ var config = v2_Attachments.buildFileUploadConfig(options.config);
674
+ var endpoint = config.directUploadEndpoint;
675
+ var updateUploadingState = function updateUploadingState(delta) {
676
+ storage.pendingUploadsCount += delta;
677
+ options.setIsUploading(storage.pendingUploadsCount > 0);
678
+ };
679
+ var replacePlaceholder = function replacePlaceholder(editor, uploadId, attrs) {
680
+ if (editor.isDestroyed) return;
681
+ var state = editor.state,
682
+ view = editor.view;
683
+ var pos = findNodePosByUploadId(state.doc, uploadId);
684
+ if (pos === -1) return; // Removed by the user while uploading.
685
+
686
+ var node = state.doc.nodeAt(pos);
687
+ var tr = attrs ? state.tr.setNodeMarkup(pos, undefined, _objectSpread$j(_objectSpread$j({}, node.attrs), attrs)) : state.tr["delete"](pos, pos + node.nodeSize);
688
+ view.dispatch(tr.setMeta("addToHistory", false));
689
+ };
690
+ var uploadPlaceholder = /*#__PURE__*/function () {
691
+ var _ref6 = _asyncToGenerator__default.default(/*#__PURE__*/_regenerator$3().m(function _callee2(editor, _ref5) {
692
+ var file, uploadId, shouldGenerateThumbnail, _yield$Promise$all, _yield$Promise$all2, uploaded, thumbnailUrl, _t3;
693
+ return _regenerator$3().w(function (_context2) {
694
+ while (1) switch (_context2.p = _context2.n) {
695
+ case 0:
696
+ file = _ref5.file, uploadId = _ref5.uploadId;
697
+ _context2.p = 1;
698
+ shouldGenerateThumbnail = file.type === PDF_CONTENT_TYPE && file.size <= options.previewMaxSize;
699
+ _context2.n = 2;
700
+ return Promise.all([uploadFile(file, endpoint), shouldGenerateThumbnail ? uploadThumbnail(file, endpoint) : null]);
701
+ case 2:
702
+ _yield$Promise$all = _context2.v;
703
+ _yield$Promise$all2 = _slicedToArray__default.default(_yield$Promise$all, 2);
704
+ uploaded = _yield$Promise$all2[0];
705
+ thumbnailUrl = _yield$Promise$all2[1];
706
+ replacePlaceholder(editor, uploadId, _objectSpread$j(_objectSpread$j({}, uploaded), {}, {
707
+ thumbnailUrl: thumbnailUrl,
708
+ uploadId: null
709
+ }));
710
+ _context2.n = 4;
711
+ break;
712
+ case 3:
713
+ _context2.p = 3;
714
+ _t3 = _context2.v;
715
+ // eslint-disable-next-line no-console
716
+ console.error("Attachment upload failed", _t3);
717
+ replacePlaceholder(editor, uploadId, null);
718
+ neetoAtoms.Toastr.error(i18n.t("neetoEditor.error.uploadFileFailed"));
719
+ case 4:
720
+ _context2.p = 4;
721
+ updateUploadingState(-1);
722
+ return _context2.f(4);
723
+ case 5:
724
+ return _context2.a(2);
725
+ }
726
+ }, _callee2, null, [[1, 3, 4, 5]]);
727
+ }));
728
+ return function uploadPlaceholder(_x3, _x4) {
729
+ return _ref6.apply(this, arguments);
730
+ };
731
+ }();
732
+ storage.uploadFiles = function (editor, files, position) {
733
+ var selectedFiles = FileIcon.selectFiles({
734
+ previousAttachmentsCount: countAttachmentNodes(editor.state.doc, NODE_NAME) + options.getExternalAttachmentsCount(),
735
+ config: config,
736
+ files: files
737
+ });
738
+ if (ramda.isEmpty(selectedFiles)) return;
739
+ var placeholders = selectedFiles.map(function (file) {
740
+ return {
741
+ file: file,
742
+ uploadId: reactFileIcon_esm.getRandomString()
743
+ };
744
+ });
745
+ var nodes = placeholders.map(function (_ref7) {
746
+ var file = _ref7.file,
747
+ uploadId = _ref7.uploadId;
748
+ return {
749
+ type: NODE_NAME,
750
+ attrs: {
751
+ uploadId: uploadId,
752
+ filename: file.name,
753
+ contentType: file.type,
754
+ size: file.size
755
+ }
756
+ };
757
+ });
758
+ editor.chain().focus().insertContentAt(position !== null && position !== void 0 ? position : editor.state.selection, nodes).run();
759
+ updateUploadingState(placeholders.length);
760
+ placeholders.forEach(function (placeholder) {
761
+ return uploadPlaceholder(editor, placeholder);
762
+ });
763
+ };
764
+ },
765
+ addProseMirrorPlugins: function addProseMirrorPlugins() {
766
+ var editor = this.editor,
767
+ storage = this.storage;
768
+ return [new index.Plugin({
769
+ props: {
770
+ handleDrop: function handleDrop(view, event, _slice, moved) {
771
+ var _event$dataTransfer$f, _event$dataTransfer;
772
+ var files = Array.from((_event$dataTransfer$f = (_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.files) !== null && _event$dataTransfer$f !== void 0 ? _event$dataTransfer$f : []);
773
+ if (moved || ramda.isEmpty(files)) return false;
774
+ var coordinates = view.posAtCoords({
775
+ left: event.clientX,
776
+ top: event.clientY
777
+ });
778
+ event.preventDefault();
779
+ storage.uploadFiles(editor, files, coordinates === null || coordinates === void 0 ? void 0 : coordinates.pos);
780
+ return true;
781
+ },
782
+ // Pasted images are handled by the image extension.
783
+ handlePaste: function handlePaste(_view, event) {
784
+ var _event$clipboardData$, _event$clipboardData;
785
+ var files = Array.from((_event$clipboardData$ = (_event$clipboardData = event.clipboardData) === null || _event$clipboardData === void 0 ? void 0 : _event$clipboardData.files) !== null && _event$clipboardData$ !== void 0 ? _event$clipboardData$ : []).filter(function (file) {
786
+ return !/image/i.test(file.type);
787
+ });
788
+ if (ramda.isEmpty(files)) return false;
789
+ storage.uploadFiles(editor, files);
790
+ return true;
791
+ }
792
+ }
793
+ })];
794
+ }
795
+ });
796
+
199
797
  var HighlightInternal = useEditorStore.Extension.create({
200
798
  name: "HighlightInternal",
201
799
  addOptions: function addOptions() {
@@ -4898,7 +5496,8 @@ var useCustomExtensions = function useCustomExtensions(_ref) {
4898
5496
  collaborationProvider = _ref.collaborationProvider,
4899
5497
  setIsNeetoKbArticleActive = _ref.setIsNeetoKbArticleActive,
4900
5498
  containerRef = _ref.containerRef,
4901
- appendSuggestionsToBody = _ref.appendSuggestionsToBody;
5499
+ appendSuggestionsToBody = _ref.appendSuggestionsToBody,
5500
+ inlineAttachmentsOptions = _ref.inlineAttachmentsOptions;
4902
5501
  var customExtensions = [EditorContainer.configure({
4903
5502
  containerRef: containerRef,
4904
5503
  appendSuggestionsToBody: appendSuggestionsToBody
@@ -4945,6 +5544,9 @@ var useCustomExtensions = function useCustomExtensions(_ref) {
4945
5544
  if (options.includes(constants.EDITOR_OPTIONS.VIDEO_UPLOAD)) {
4946
5545
  customExtensions.push(UnifiedVideoExtension);
4947
5546
  }
5547
+ if (options.includes(constants.EDITOR_OPTIONS.INLINE_ATTACHMENTS)) {
5548
+ customExtensions.push(AttachmentExtension.configure(inlineAttachmentsOptions));
5549
+ }
4948
5550
  if (options.includes(constants.EDITOR_OPTIONS.NEETO_KB_ARTICLE)) {
4949
5551
  customExtensions.push(DeletedArticleDecoration.configure({
4950
5552
  deletedArticleIds: new Set()
@@ -6039,7 +6641,7 @@ var _excluded = ["addonCommands", "addons", "attachments", "attachmentsConfig",
6039
6641
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6040
6642
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6041
6643
  var Editor$1 = function Editor(_ref, ref) {
6042
- var _wrapperRef$current;
6644
+ var _attachmentsConfig$re, _attachmentsConfig$re2, _wrapperRef$current;
6043
6645
  var _ref$addonCommands = _ref.addonCommands,
6044
6646
  addonCommands = _ref$addonCommands === void 0 ? [] : _ref$addonCommands,
6045
6647
  _ref$addons = _ref.addons,
@@ -6128,6 +6730,10 @@ var Editor$1 = function Editor(_ref, ref) {
6128
6730
  var wrapperRef = React.useRef(null);
6129
6731
  var isArticleOptActive = addons.includes(constants.EDITOR_OPTIONS.NEETO_KB_ARTICLE);
6130
6732
  var isAttachmentsActive = addons.includes(constants.EDITOR_OPTIONS.ATTACHMENTS);
6733
+ var isInlineAttachmentsActive = addons.includes(constants.EDITOR_OPTIONS.INLINE_ATTACHMENTS);
6734
+
6735
+ // Inline attachments reuse the attachments toolbar button and slash command.
6736
+ var menuAddons = isInlineAttachmentsActive && !isAttachmentsActive ? [].concat(_toConsumableArray__default.default(addons), [constants.EDITOR_OPTIONS.ATTACHMENTS]) : addons;
6131
6737
  var isMediaUploaderActive = addons.includes(constants.EDITOR_OPTIONS.IMAGE_UPLOAD) || addons.includes(constants.EDITOR_OPTIONS.VIDEO_UPLOAD);
6132
6738
  var isFixedMenuActive = menuType === "fixed";
6133
6739
  var isBubbleMenuActive = menuType === "bubble";
@@ -6154,13 +6760,23 @@ var Editor$1 = function Editor(_ref, ref) {
6154
6760
  neetoKbArticleState = _useState8[0],
6155
6761
  setNeetoKbArticleState = _useState8[1];
6156
6762
  var addAttachmentsRef = React.useRef(null);
6763
+ var inlineAttachmentInputRef = React.useRef(null);
6764
+ var attachmentsCountRef = React.useRef(attachments.length);
6765
+ attachmentsCountRef.current = attachments.length;
6157
6766
  var attachmentProps = {
6158
6767
  handleUploadAttachments: function handleUploadAttachments() {
6159
- var _addAttachmentsRef$cu;
6160
- return (_addAttachmentsRef$cu = addAttachmentsRef.current) === null || _addAttachmentsRef$cu === void 0 ? void 0 : _addAttachmentsRef$cu.handleUploadAttachments();
6768
+ var _inlineAttachmentInpu, _addAttachmentsRef$cu;
6769
+ return isInlineAttachmentsActive ? (_inlineAttachmentInpu = inlineAttachmentInputRef.current) === null || _inlineAttachmentInpu === void 0 ? void 0 : _inlineAttachmentInpu.click() : (_addAttachmentsRef$cu = addAttachmentsRef.current) === null || _addAttachmentsRef$cu === void 0 ? void 0 : _addAttachmentsRef$cu.handleUploadAttachments();
6161
6770
  },
6162
6771
  isDisabled: isAttachmentsUploading
6163
6772
  };
6773
+ var inlineAttachmentsOptions = {
6774
+ config: attachmentsConfig,
6775
+ getExternalAttachmentsCount: function getExternalAttachmentsCount() {
6776
+ return attachmentsCountRef.current;
6777
+ },
6778
+ setIsUploading: setIsAttachmentsUploading
6779
+ };
6164
6780
  var debouncedOnChangeHandler = reactUtils.useFuncDebounce(function (_ref2) {
6165
6781
  var editor = _ref2.editor;
6166
6782
  if (!editor.isDestroyed) onChange(editor.getHTML());
@@ -6183,7 +6799,7 @@ var Editor$1 = function Editor(_ref, ref) {
6183
6799
  mentions: mentions,
6184
6800
  variables: variables,
6185
6801
  isSlashCommandsActive: isSlashCommandsActive,
6186
- options: [].concat(_toConsumableArray__default.default(defaults), _toConsumableArray__default.default(addons)),
6802
+ options: [].concat(_toConsumableArray__default.default(defaults), _toConsumableArray__default.default(menuAddons)),
6187
6803
  addonCommands: addonCommands,
6188
6804
  onSubmit: onSubmit,
6189
6805
  keyboardShortcuts: keyboardShortcuts,
@@ -6196,7 +6812,8 @@ var Editor$1 = function Editor(_ref, ref) {
6196
6812
  collaborationProvider: collaborationProvider,
6197
6813
  setIsNeetoKbArticleActive: setNeetoKbArticleState,
6198
6814
  containerRef: wrapperRef,
6199
- appendSuggestionsToBody: appendSuggestionsToBody
6815
+ appendSuggestionsToBody: appendSuggestionsToBody,
6816
+ inlineAttachmentsOptions: inlineAttachmentsOptions
6200
6817
  });
6201
6818
  getVideoDimension.useEditorWarnings({
6202
6819
  initialValue: initialValue
@@ -6281,6 +6898,10 @@ var Editor$1 = function Editor(_ref, ref) {
6281
6898
  if (!editor || !deletedArticlesHook.deletedArticleIds.size) return;
6282
6899
  editor.commands.updateDeletedArticles(deletedArticlesHook.deletedArticleIds);
6283
6900
  }, [editor, deletedArticlesHook.deletedArticleIds]);
6901
+ var handleInlineAttachmentsChange = function handleInlineAttachmentsChange(event) {
6902
+ editor === null || editor === void 0 || editor.commands.uploadAttachments(event.target.files);
6903
+ event.target.value = null;
6904
+ };
6284
6905
  useEditorStore.EditorView.prototype.updateState = function updateState(state) {
6285
6906
  if (!this.docView) return;
6286
6907
  this.updateStateInner(state, this.state.plugins !== state.plugins);
@@ -6300,7 +6921,6 @@ var Editor$1 = function Editor(_ref, ref) {
6300
6921
  children: /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
6301
6922
  children: [menuType !== "none" && /*#__PURE__*/jsxRuntime.jsx(v2_Menu.Menu, {
6302
6923
  addonCommands: addonCommands,
6303
- addons: addons,
6304
6924
  attachmentProps: attachmentProps,
6305
6925
  defaults: defaults,
6306
6926
  editor: editor,
@@ -6312,6 +6932,7 @@ var Editor$1 = function Editor(_ref, ref) {
6312
6932
  showAssetLibrary: showAssetLibrary,
6313
6933
  tooltips: tooltips,
6314
6934
  variables: variables,
6935
+ addons: menuAddons,
6315
6936
  className: menuClassName,
6316
6937
  containerRef: wrapperRef,
6317
6938
  isIndependant: isMenuIndependent,
@@ -6337,10 +6958,18 @@ var Editor$1 = function Editor(_ref, ref) {
6337
6958
  video: false
6338
6959
  });
6339
6960
  }
6340
- }), isAttachmentsActive && /*#__PURE__*/jsxRuntime.jsx(v2_Attachments.Attachments, _objectSpread({
6961
+ }), isInlineAttachmentsActive && /*#__PURE__*/jsxRuntime.jsx("input", {
6962
+ hidden: true,
6963
+ "data-testid": "neeto-editor-inline-attachments-input",
6964
+ multiple: ((_attachmentsConfig$re = attachmentsConfig.restrictions) === null || _attachmentsConfig$re === void 0 ? void 0 : _attachmentsConfig$re.maxNumberOfFiles) !== 1,
6965
+ ref: inlineAttachmentInputRef,
6966
+ type: "file",
6967
+ accept: (_attachmentsConfig$re2 = attachmentsConfig.restrictions) === null || _attachmentsConfig$re2 === void 0 || (_attachmentsConfig$re2 = _attachmentsConfig$re2.allowedFileTypes) === null || _attachmentsConfig$re2 === void 0 ? void 0 : _attachmentsConfig$re2.join(","),
6968
+ onChange: handleInlineAttachmentsChange
6969
+ }), isAttachmentsActive && (!isInlineAttachmentsActive || neetoCist.isNotEmpty(attachments)) && /*#__PURE__*/jsxRuntime.jsx(v2_Attachments.Attachments, _objectSpread({
6341
6970
  attachments: attachments,
6342
6971
  config: attachmentsConfig,
6343
- dragDropRef: wrapperRef,
6972
+ dragDropRef: isInlineAttachmentsActive ? null : wrapperRef,
6344
6973
  isIndependent: false,
6345
6974
  ref: addAttachmentsRef,
6346
6975
  setIsUploading: setIsAttachmentsUploading,