@pie-lib/editable-html-tip-tap 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _core = require("@material-ui/core");
15
+
16
+ var _styles = require("@material-ui/core/styles");
17
+
18
+ var AlertDialog = function AlertDialog(_ref) {
19
+ var text = _ref.text,
20
+ title = _ref.title,
21
+ onClose = _ref.onClose,
22
+ onConfirm = _ref.onConfirm,
23
+ open = _ref.open,
24
+ onCloseText = _ref.onCloseText,
25
+ onConfirmText = _ref.onConfirmText,
26
+ classes = _ref.classes;
27
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
28
+ open: open,
29
+ onClose: onClose
30
+ }, title && /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, {
31
+ className: classes.heading
32
+ }, title), text && /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_core.DialogContentText, {
33
+ className: classes.subheading
34
+ }, text)), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, onClose && /*#__PURE__*/_react["default"].createElement(_core.Button, {
35
+ onClick: onClose,
36
+ color: "primary"
37
+ }, onCloseText), onConfirm && /*#__PURE__*/_react["default"].createElement(_core.Button, {
38
+ autoFocus: true,
39
+ onClick: onConfirm,
40
+ color: "primary"
41
+ }, onConfirmText)));
42
+ };
43
+
44
+ AlertDialog.defaultProps = {
45
+ onCloseText: 'CANCEL',
46
+ onConfirmText: 'OK'
47
+ };
48
+ AlertDialog.propTypes = {
49
+ text: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object]),
50
+ title: _propTypes["default"].string,
51
+ onClose: _propTypes["default"].func,
52
+ onConfirm: _propTypes["default"].func,
53
+ open: _propTypes["default"].bool,
54
+ onConfirmText: _propTypes["default"].string,
55
+ onCloseText: _propTypes["default"].string,
56
+ classes: _propTypes["default"].object
57
+ };
58
+
59
+ var styles = function styles() {
60
+ return {
61
+ heading: {
62
+ '& h2': {
63
+ fontSize: 'max(1.25rem, 18px)'
64
+ }
65
+ },
66
+ subheading: {
67
+ fontSize: 'max(1rem, 14px)'
68
+ }
69
+ };
70
+ };
71
+
72
+ var _default = (0, _styles.withStyles)(styles)(AlertDialog);
73
+
74
+ exports["default"] = _default;
75
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hbGVydC1kaWFsb2cuanN4Il0sIm5hbWVzIjpbIkFsZXJ0RGlhbG9nIiwidGV4dCIsInRpdGxlIiwib25DbG9zZSIsIm9uQ29uZmlybSIsIm9wZW4iLCJvbkNsb3NlVGV4dCIsIm9uQ29uZmlybVRleHQiLCJjbGFzc2VzIiwiaGVhZGluZyIsInN1YmhlYWRpbmciLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJvYmplY3QiLCJmdW5jIiwiYm9vbCIsInN0eWxlcyIsImZvbnRTaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFNQSxXQUFXLEdBQUcsU0FBZEEsV0FBYztBQUFBLE1BQUdDLElBQUgsUUFBR0EsSUFBSDtBQUFBLE1BQVNDLEtBQVQsUUFBU0EsS0FBVDtBQUFBLE1BQWdCQyxPQUFoQixRQUFnQkEsT0FBaEI7QUFBQSxNQUF5QkMsU0FBekIsUUFBeUJBLFNBQXpCO0FBQUEsTUFBb0NDLElBQXBDLFFBQW9DQSxJQUFwQztBQUFBLE1BQTBDQyxXQUExQyxRQUEwQ0EsV0FBMUM7QUFBQSxNQUF1REMsYUFBdkQsUUFBdURBLGFBQXZEO0FBQUEsTUFBc0VDLE9BQXRFLFFBQXNFQSxPQUF0RTtBQUFBLHNCQUNsQixnQ0FBQyxZQUFEO0FBQVEsSUFBQSxJQUFJLEVBQUVILElBQWQ7QUFBb0IsSUFBQSxPQUFPLEVBQUVGO0FBQTdCLEtBQ0dELEtBQUssaUJBQUksZ0NBQUMsaUJBQUQ7QUFBYSxJQUFBLFNBQVMsRUFBRU0sT0FBTyxDQUFDQztBQUFoQyxLQUEwQ1AsS0FBMUMsQ0FEWixFQUVHRCxJQUFJLGlCQUNILGdDQUFDLG1CQUFELHFCQUNFLGdDQUFDLHVCQUFEO0FBQW1CLElBQUEsU0FBUyxFQUFFTyxPQUFPLENBQUNFO0FBQXRDLEtBQW1EVCxJQUFuRCxDQURGLENBSEosZUFPRSxnQ0FBQyxtQkFBRCxRQUNHRSxPQUFPLGlCQUNOLGdDQUFDLFlBQUQ7QUFBUSxJQUFBLE9BQU8sRUFBRUEsT0FBakI7QUFBMEIsSUFBQSxLQUFLLEVBQUM7QUFBaEMsS0FDR0csV0FESCxDQUZKLEVBTUdGLFNBQVMsaUJBQ1IsZ0NBQUMsWUFBRDtBQUFRLElBQUEsU0FBUyxNQUFqQjtBQUFrQixJQUFBLE9BQU8sRUFBRUEsU0FBM0I7QUFBc0MsSUFBQSxLQUFLLEVBQUM7QUFBNUMsS0FDR0csYUFESCxDQVBKLENBUEYsQ0FEa0I7QUFBQSxDQUFwQjs7QUF1QkFQLFdBQVcsQ0FBQ1csWUFBWixHQUEyQjtBQUN6QkwsRUFBQUEsV0FBVyxFQUFFLFFBRFk7QUFFekJDLEVBQUFBLGFBQWEsRUFBRTtBQUZVLENBQTNCO0FBS0FQLFdBQVcsQ0FBQ1ksU0FBWixHQUF3QjtBQUN0QlgsRUFBQUEsSUFBSSxFQUFFWSxzQkFBVUMsU0FBVixDQUFvQixDQUFDRCxzQkFBVUUsTUFBWCxFQUFtQkYsc0JBQVVHLE1BQTdCLENBQXBCLENBRGdCO0FBRXRCZCxFQUFBQSxLQUFLLEVBQUVXLHNCQUFVRSxNQUZLO0FBR3RCWixFQUFBQSxPQUFPLEVBQUVVLHNCQUFVSSxJQUhHO0FBSXRCYixFQUFBQSxTQUFTLEVBQUVTLHNCQUFVSSxJQUpDO0FBS3RCWixFQUFBQSxJQUFJLEVBQUVRLHNCQUFVSyxJQUxNO0FBTXRCWCxFQUFBQSxhQUFhLEVBQUVNLHNCQUFVRSxNQU5IO0FBT3RCVCxFQUFBQSxXQUFXLEVBQUVPLHNCQUFVRSxNQVBEO0FBUXRCUCxFQUFBQSxPQUFPLEVBQUVLLHNCQUFVRztBQVJHLENBQXhCOztBQVdBLElBQU1HLE1BQU0sR0FBRyxTQUFUQSxNQUFTO0FBQUEsU0FBTztBQUNwQlYsSUFBQUEsT0FBTyxFQUFFO0FBQ1AsY0FBUTtBQUNOVyxRQUFBQSxRQUFRLEVBQUU7QUFESjtBQURELEtBRFc7QUFNcEJWLElBQUFBLFVBQVUsRUFBRTtBQUNWVSxNQUFBQSxRQUFRLEVBQUU7QUFEQTtBQU5RLEdBQVA7QUFBQSxDQUFmOztlQVdlLHdCQUFXRCxNQUFYLEVBQW1CbkIsV0FBbkIsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgQnV0dG9uLCBEaWFsb2csIERpYWxvZ0FjdGlvbnMsIERpYWxvZ0NvbnRlbnQsIERpYWxvZ0NvbnRlbnRUZXh0LCBEaWFsb2dUaXRsZSB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlJztcbmltcG9ydCB7IHdpdGhTdHlsZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuXG5jb25zdCBBbGVydERpYWxvZyA9ICh7IHRleHQsIHRpdGxlLCBvbkNsb3NlLCBvbkNvbmZpcm0sIG9wZW4sIG9uQ2xvc2VUZXh0LCBvbkNvbmZpcm1UZXh0LCBjbGFzc2VzIH0pID0+IChcbiAgPERpYWxvZyBvcGVuPXtvcGVufSBvbkNsb3NlPXtvbkNsb3NlfT5cbiAgICB7dGl0bGUgJiYgPERpYWxvZ1RpdGxlIGNsYXNzTmFtZT17Y2xhc3Nlcy5oZWFkaW5nfT57dGl0bGV9PC9EaWFsb2dUaXRsZT59XG4gICAge3RleHQgJiYgKFxuICAgICAgPERpYWxvZ0NvbnRlbnQ+XG4gICAgICAgIDxEaWFsb2dDb250ZW50VGV4dCBjbGFzc05hbWU9e2NsYXNzZXMuc3ViaGVhZGluZ30+e3RleHR9PC9EaWFsb2dDb250ZW50VGV4dD5cbiAgICAgIDwvRGlhbG9nQ29udGVudD5cbiAgICApfVxuICAgIDxEaWFsb2dBY3Rpb25zPlxuICAgICAge29uQ2xvc2UgJiYgKFxuICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e29uQ2xvc2V9IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgIHtvbkNsb3NlVGV4dH1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICApfVxuICAgICAge29uQ29uZmlybSAmJiAoXG4gICAgICAgIDxCdXR0b24gYXV0b0ZvY3VzIG9uQ2xpY2s9e29uQ29uZmlybX0gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAge29uQ29uZmlybVRleHR9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgKX1cbiAgICA8L0RpYWxvZ0FjdGlvbnM+XG4gIDwvRGlhbG9nPlxuKTtcblxuQWxlcnREaWFsb2cuZGVmYXVsdFByb3BzID0ge1xuICBvbkNsb3NlVGV4dDogJ0NBTkNFTCcsXG4gIG9uQ29uZmlybVRleHQ6ICdPSycsXG59O1xuXG5BbGVydERpYWxvZy5wcm9wVHlwZXMgPSB7XG4gIHRleHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNvbmZpcm06IFByb3BUeXBlcy5mdW5jLFxuICBvcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25Db25maXJtVGV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25DbG9zZVRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuXG5jb25zdCBzdHlsZXMgPSAoKSA9PiAoe1xuICBoZWFkaW5nOiB7XG4gICAgJyYgaDInOiB7XG4gICAgICBmb250U2l6ZTogJ21heCgxLjI1cmVtLCAxOHB4KScsXG4gICAgfSxcbiAgfSxcbiAgc3ViaGVhZGluZzoge1xuICAgIGZvbnRTaXplOiAnbWF4KDFyZW0sIDE0cHgpJyxcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcykoQWxlcnREaWFsb2cpO1xuIl19
package/lib/theme.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.primary = void 0;
7
+ var primary = '#304ffe';
8
+ exports.primary = primary;
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90aGVtZS5qcyJdLCJuYW1lcyI6WyJwcmltYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTyxJQUFNQSxPQUFPLEdBQUcsU0FBaEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgcHJpbWFyeSA9ICcjMzA0ZmZlJztcbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@pie-lib/editable-html-tip-tap",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "license": "ISC",
6
+ "main": "lib/index.js",
7
+ "module": "src/index.jsx",
8
+ "author": "pie-framework developers",
9
+ "dependencies": {
10
+ "@material-ui/core": "^3.8.3",
11
+ "@material-ui/icons": "^3.0.2",
12
+ "@material-ui/styles": "^3.0.0-alpha.10",
13
+ "@pie-lib/drag": "^2.22.1",
14
+ "@pie-lib/math-input": "^6.31.1",
15
+ "@pie-lib/math-rendering": "^3.22.1",
16
+ "@pie-lib/math-toolbar": "^1.31.1",
17
+ "@pie-lib/render-ui": "^4.35.1",
18
+ "@tiptap/core": "3.0.9",
19
+ "@tiptap/extension-color": "3.0.9",
20
+ "@tiptap/extension-list-item": "3.0.9",
21
+ "@tiptap/extension-table": "3.0.9",
22
+ "@tiptap/extension-table-cell": "3.0.9",
23
+ "@tiptap/extension-table-header": "3.0.9",
24
+ "@tiptap/extension-table-row": "3.0.9",
25
+ "@tiptap/extension-text-style": "3.0.9",
26
+ "@tiptap/extension-superscript": "3.0.9",
27
+ "@tiptap/extension-subscript": "3.0.9",
28
+ "@tiptap/extension-text-align": "3.0.9",
29
+ "@tiptap/extension-image": "3.0.9",
30
+ "@tiptap/pm": "3.0.9",
31
+ "@tiptap/react": "3.0.9",
32
+ "@tiptap/starter-kit": "3.0.9",
33
+ "tippy.js": "latest",
34
+ "change-case": "^3.0.2",
35
+ "classnames": "^2.2.6",
36
+ "debug": "^4.1.1",
37
+ "immutable": "^4.0.0-rc.12",
38
+ "keycode": "^2.2.0",
39
+ "lodash": "^4.17.11",
40
+ "prop-types": "^15.6.2",
41
+ "react-attr-converter": "^0.3.1",
42
+ "react-jss": "^8.6.1",
43
+ "react-portal": "^4.2.0",
44
+ "slate": "^0.36.2",
45
+ "slate-dev-environment": "^0.2.0",
46
+ "slate-edit-list": "^0.11.3",
47
+ "slate-edit-table": "^0.17.0",
48
+ "slate-html-serializer": "^0.6.12",
49
+ "slate-plain-serializer": "^0.5.26",
50
+ "slate-prop-types": "^0.4.38",
51
+ "slate-react": "^0.14.3",
52
+ "slate-schema-violations": "^0.1.39",
53
+ "slate-soft-break": "^0.8.1",
54
+ "to-style": "^1.3.3"
55
+ },
56
+ "devDependencies": {
57
+ "@pie-framework/mathquill": "^1.1.3",
58
+ "react": "18.2.0",
59
+ "react-dom": "18.2.0"
60
+ },
61
+ "peerDependencies": {
62
+ "react": "18.2.0"
63
+ },
64
+ "publishConfig": {
65
+ "access": "public"
66
+ },
67
+ "gitHead": "ff5ec2ebe11110b7652812a10c6dc230f08e12cb",
68
+ "scripts": {}
69
+ }
@@ -0,0 +1,363 @@
1
+ import React from 'react';
2
+ import { htmlToValue, valueToHtml } from '../index';
3
+ import { Editor } from '../editor';
4
+ import { shallow, configure } from 'enzyme';
5
+ import debug from 'debug';
6
+
7
+ import { mockComponents } from './utils';
8
+
9
+ const log = debug('@pie-lib:editable-html:test');
10
+
11
+ const value = htmlToValue('hi');
12
+
13
+ const resizeWindow = (width, height) => {
14
+ window.innerWidth = width;
15
+ window.innerHeight = height;
16
+ window.dispatchEvent(new Event('resize'));
17
+ };
18
+ jest.mock('@pie-lib/math-toolbar', () => ({}));
19
+ jest.mock('@pie-lib/math-input', () => {
20
+ HorizontalKeypad: () => <div>HorizontalKeypad</div>;
21
+ });
22
+
23
+ expect.extend({
24
+ toEqualHtml(value, html) {
25
+ const v = valueToHtml(value);
26
+ const pass = v === html;
27
+
28
+ return {
29
+ pass,
30
+ message: () => `expected ${html} to match ${v}`,
31
+ };
32
+ },
33
+ });
34
+
35
+ describe('logic', () => {
36
+ test('onFocus/onBlur saves the value', async () => {
37
+ const wrapper = shallow(
38
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
39
+ );
40
+
41
+ await wrapper.instance().onFocus();
42
+
43
+ const v = htmlToValue('hi');
44
+
45
+ expect(wrapper.state('stashedValue')).toEqualHtml('<div>hi</div>');
46
+
47
+ wrapper.instance().onChange({ value: htmlToValue('new value') });
48
+
49
+ expect(wrapper.state('value')).toEqualHtml('<div>new value</div>');
50
+
51
+ return wrapper
52
+ .instance()
53
+ .onBlur({})
54
+ .then(() => {
55
+ expect(wrapper.state('value')).toEqualHtml('<div>new value</div>');
56
+ });
57
+ });
58
+ });
59
+
60
+ test('onFocus does not change focus if related target is a button from language keypad', async () => {
61
+ const wrapper = shallow(
62
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
63
+ );
64
+
65
+ const event = {
66
+ relatedTarget: {
67
+ tagName: 'button',
68
+ },
69
+ };
70
+
71
+ const change = {
72
+ focus: jest.fn(),
73
+ };
74
+
75
+ wrapper.instance().keypadInteractionDetected = true;
76
+
77
+ await wrapper.instance().onFocus(event, change);
78
+
79
+ expect(change.focus).not.toHaveBeenCalled();
80
+ });
81
+
82
+ test('onFocus changes focus if related target is not a button from language keypad', async () => {
83
+ const wrapper = shallow(
84
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
85
+ );
86
+
87
+ const event = {
88
+ relatedTarget: {
89
+ tagName: 'div',
90
+ },
91
+ };
92
+
93
+ const change = {
94
+ focus: jest.fn(),
95
+ };
96
+
97
+ await wrapper.instance().onFocus(event, change);
98
+
99
+ expect(change.focus).toHaveBeenCalled();
100
+ });
101
+
102
+ test('onFocus stashes the value', async () => {
103
+ const wrapper = shallow(
104
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
105
+ );
106
+
107
+ await wrapper.instance().onFocus();
108
+
109
+ expect(wrapper.state('stashedValue')).toEqualHtml('<div>hi</div>');
110
+ });
111
+
112
+ test('onBlur does not set focusToolbar if related target is RawDoneButton', async () => {
113
+ const wrapper = shallow(
114
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
115
+ );
116
+
117
+ const toolbarElement = document.createElement('div');
118
+ const relatedTarget = document.createElement('button');
119
+ relatedTarget.className = 'RawDoneButton';
120
+ toolbarElement.className = 'toolbar';
121
+ toolbarElement.appendChild(relatedTarget);
122
+
123
+ wrapper.instance().toolbarRef = toolbarElement;
124
+ wrapper.instance().doneButtonRef.current = relatedTarget;
125
+
126
+ const event = { relatedTarget };
127
+
128
+ await wrapper.instance().onBlur(event);
129
+
130
+ expect(wrapper.state('focusToolbar')).toBe(false);
131
+ });
132
+
133
+ test('handleToolbarFocus sets focusToolbar to true', () => {
134
+ const wrapper = shallow(
135
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
136
+ );
137
+
138
+ wrapper.instance().handleToolbarFocus();
139
+ expect(wrapper.state('focusToolbar')).toBe(true);
140
+ });
141
+
142
+ test('handleToolbarBlur sets focusToolbar to false if toolbar does not contain focus', (done) => {
143
+ const wrapper = shallow(
144
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
145
+ );
146
+
147
+ wrapper.instance().toolbarContainsFocus = jest.fn().mockReturnValue(false);
148
+
149
+ wrapper.instance().handleToolbarBlur();
150
+
151
+ setTimeout(() => {
152
+ expect(wrapper.state('focusToolbar')).toBe(false);
153
+ done();
154
+ }, 20);
155
+ });
156
+
157
+ test('handleToolbarBlur does not set focusToolbar to false if toolbar contains focus', (done) => {
158
+ const wrapper = shallow(
159
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
160
+ );
161
+
162
+ wrapper.instance().toolbarContainsFocus = jest.fn().mockReturnValue(true);
163
+
164
+ wrapper.setState({ focusToolbar: true });
165
+
166
+ wrapper.instance().handleToolbarBlur();
167
+
168
+ setTimeout(() => {
169
+ expect(wrapper.state('focusToolbar')).toBe(true);
170
+ done();
171
+ }, 20);
172
+ });
173
+
174
+ test('toolbarContainsFocus correctly detects focus within toolbar', () => {
175
+ const wrapper = shallow(
176
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
177
+ );
178
+
179
+ const toolbarElement = document.createElement('div');
180
+ const activeElement = document.createElement('button');
181
+ toolbarElement.appendChild(activeElement);
182
+
183
+ Object.defineProperty(document, 'activeElement', {
184
+ value: activeElement,
185
+ configurable: true,
186
+ });
187
+
188
+ wrapper.instance().toolbarRef = toolbarElement;
189
+
190
+ expect(wrapper.instance().toolbarContainsFocus()).toBe(true);
191
+
192
+ Object.defineProperty(document, 'activeElement', {
193
+ value: document.createElement('div'),
194
+ configurable: true,
195
+ });
196
+
197
+ expect(wrapper.instance().toolbarContainsFocus()).toBe(false);
198
+ });
199
+
200
+ test('onBlur sets focusToolbar to true if related target is within toolbar', async () => {
201
+ const wrapper = shallow(
202
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
203
+ );
204
+
205
+ const toolbarElement = document.createElement('div');
206
+ const relatedTarget = document.createElement('button');
207
+ toolbarElement.className = 'toolbar';
208
+ toolbarElement.appendChild(relatedTarget);
209
+
210
+ wrapper.instance().toolbarRef = toolbarElement;
211
+
212
+ const event = { relatedTarget };
213
+
214
+ await wrapper.instance().onBlur(event);
215
+
216
+ expect(wrapper.state('focusToolbar')).toBe(true);
217
+ });
218
+
219
+ describe('buildSizeStyle', () => {
220
+ const wrapper = (extras) => {
221
+ const props = Object.assign({}, extras);
222
+ return shallow(
223
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} {...props} />,
224
+ );
225
+ };
226
+
227
+ it('builds width with px', () => {
228
+ const w = wrapper({ width: 100 });
229
+ expect(w.instance().buildSizeStyle()).toEqual({
230
+ width: '100px',
231
+ height: undefined,
232
+ minHeight: undefined,
233
+ maxHeight: undefined,
234
+ });
235
+ });
236
+
237
+ it('returns undefined for % ', () => {
238
+ const w = wrapper({ height: '100%', width: '100%' });
239
+ expect(w.instance().buildSizeStyle()).toEqual({
240
+ width: undefined,
241
+ height: undefined,
242
+ minHeight: undefined,
243
+ maxHeight: undefined,
244
+ });
245
+ });
246
+
247
+ it('builds height', () => {
248
+ const w = wrapper({ height: 100 });
249
+ expect(w.instance().buildSizeStyle()).toEqual({
250
+ width: undefined,
251
+ height: '100px',
252
+ minHeight: undefined,
253
+ maxHeight: undefined,
254
+ });
255
+ });
256
+
257
+ it('builds minHeight', () => {
258
+ const w = wrapper({ minHeight: 100 });
259
+ expect(w.instance().buildSizeStyle()).toEqual({
260
+ width: undefined,
261
+ height: undefined,
262
+ minHeight: '100px',
263
+ maxHeight: undefined,
264
+ });
265
+ });
266
+
267
+ it('builds maxHeight', () => {
268
+ const w = wrapper({ maxHeight: 100 });
269
+ expect(w.instance().buildSizeStyle()).toEqual({
270
+ width: undefined,
271
+ height: undefined,
272
+ minHeight: undefined,
273
+ maxHeight: '100px',
274
+ });
275
+ });
276
+
277
+ it('builds width with calc()', () => {
278
+ const w = wrapper({ width: 'calc(10em + 42px)' });
279
+ expect(w.instance().buildSizeStyle()).toEqual({
280
+ width: 'calc(10em + 42px)',
281
+ height: undefined,
282
+ minHeight: undefined,
283
+ maxHeight: undefined,
284
+ });
285
+ });
286
+
287
+ it('builds width with ch', () => {
288
+ const w = wrapper({ width: '9ch' });
289
+ expect(w.instance().buildSizeStyle()).toEqual({
290
+ width: '9ch',
291
+ height: undefined,
292
+ minHeight: undefined,
293
+ maxHeight: undefined,
294
+ });
295
+ });
296
+
297
+ it('builds', () => {
298
+ const w = wrapper({});
299
+ expect(w.instance().buildSizeStyle()).toEqual({
300
+ width: undefined,
301
+ height: undefined,
302
+ minHeight: undefined,
303
+ maxHeight: undefined,
304
+ });
305
+ });
306
+ });
307
+
308
+ describe('onResize', () => {
309
+ it('should display html of current state on Resize', () => {
310
+ const wrapper = shallow(
311
+ <Editor editorRef={jest.fn()} value={value} classes={{}} onChange={jest.fn()} onRef={jest.fn()} />,
312
+ );
313
+
314
+ resizeWindow(500, 300);
315
+ expect(wrapper.state('value')).toEqualHtml('<div>hi</div>');
316
+
317
+ wrapper.instance().onChange({ value: htmlToValue('new value') });
318
+ resizeWindow(1024, 768);
319
+ expect(wrapper.state('value')).toEqualHtml('<div>new value</div>');
320
+
321
+ resizeWindow(500, 300);
322
+ expect(wrapper.state('value')).toEqualHtml('<div>new value</div>');
323
+ });
324
+ });
325
+
326
+ describe('MathMl', () => {
327
+ beforeEach(() => {});
328
+
329
+ it('should not call runSerializationOnMarkup if mathMl props are not there', () => {
330
+ const runSerializationOnMarkup = jest.fn();
331
+
332
+ const wrapper = shallow(
333
+ <Editor
334
+ editorRef={jest.fn()}
335
+ value={value}
336
+ classes={{}}
337
+ onChange={jest.fn()}
338
+ onRef={jest.fn()}
339
+ runSerializationOnMarkup={runSerializationOnMarkup}
340
+ />,
341
+ );
342
+
343
+ expect(runSerializationOnMarkup).not.toHaveBeenCalled();
344
+ });
345
+
346
+ it('should call runSerializationOnMarkup if mmlEditing or mmlOutput are true', () => {
347
+ const runSerializationOnMarkup = jest.fn();
348
+
349
+ const wrapper = shallow(
350
+ <Editor
351
+ editorRef={jest.fn()}
352
+ value={value}
353
+ classes={{}}
354
+ onChange={jest.fn()}
355
+ onRef={jest.fn()}
356
+ runSerializationOnMarkup={runSerializationOnMarkup}
357
+ mathMlOptions={{ mmlOutput: true }}
358
+ />,
359
+ );
360
+
361
+ expect(runSerializationOnMarkup).toHaveBeenCalled();
362
+ });
363
+ });