@pie-lib/editable-html-tip-tap 2.1.1 → 2.1.2-next.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 (272) hide show
  1. package/dist/components/CharacterPicker.d.ts +31 -0
  2. package/dist/components/CharacterPicker.js +131 -0
  3. package/dist/components/EditableHtml.d.ts +11 -0
  4. package/dist/components/EditableHtml.js +291 -0
  5. package/dist/components/MenuBar.d.ts +11 -0
  6. package/dist/components/MenuBar.js +462 -0
  7. package/dist/components/TiptapContainer.d.ts +11 -0
  8. package/dist/components/TiptapContainer.js +154 -0
  9. package/dist/components/characters/characterUtils.d.ts +35 -0
  10. package/dist/components/characters/characterUtils.js +465 -0
  11. package/dist/components/characters/custom-popper.d.ts +14 -0
  12. package/dist/components/characters/custom-popper.js +32 -0
  13. package/dist/components/common/done-button.d.ts +30 -0
  14. package/dist/components/common/done-button.js +26 -0
  15. package/dist/components/common/toolbar-buttons.d.ts +38 -0
  16. package/dist/components/common/toolbar-buttons.js +91 -0
  17. package/dist/components/icons/CssIcon.d.ts +11 -0
  18. package/dist/components/icons/CssIcon.js +14 -0
  19. package/dist/components/icons/RespArea.d.ts +26 -0
  20. package/dist/components/icons/RespArea.js +42 -0
  21. package/dist/components/icons/TableIcons.d.ts +14 -0
  22. package/dist/components/icons/TableIcons.js +32 -0
  23. package/dist/components/icons/TextAlign.d.ts +18 -0
  24. package/dist/components/icons/TextAlign.js +134 -0
  25. package/dist/components/image/AltDialog.d.ts +22 -0
  26. package/dist/components/image/AltDialog.js +61 -0
  27. package/dist/components/image/ImageToolbar.d.ts +24 -0
  28. package/dist/components/image/ImageToolbar.js +80 -0
  29. package/dist/components/image/InsertImageHandler.d.ts +32 -0
  30. package/dist/components/image/InsertImageHandler.js +53 -0
  31. package/dist/components/media/MediaDialog.d.ts +43 -0
  32. package/dist/components/media/MediaDialog.js +389 -0
  33. package/dist/components/media/MediaToolbar.d.ts +19 -0
  34. package/dist/components/media/MediaToolbar.js +41 -0
  35. package/dist/components/media/MediaWrapper.d.ts +19 -0
  36. package/dist/components/respArea/DragInTheBlank/DragInTheBlank.d.ts +23 -0
  37. package/dist/components/respArea/DragInTheBlank/DragInTheBlank.js +58 -0
  38. package/dist/components/respArea/DragInTheBlank/choice.d.ts +56 -0
  39. package/dist/components/respArea/DragInTheBlank/choice.js +156 -0
  40. package/dist/components/respArea/ExplicitConstructedResponse.d.ts +20 -0
  41. package/dist/components/respArea/ExplicitConstructedResponse.js +83 -0
  42. package/dist/components/respArea/InlineDropdown.d.ts +18 -0
  43. package/dist/components/respArea/InlineDropdown.js +119 -0
  44. package/dist/components/respArea/MathTemplated.d.ts +19 -0
  45. package/dist/components/respArea/MathTemplated.js +97 -0
  46. package/dist/components/respArea/ToolbarIcon.d.ts +14 -0
  47. package/dist/components/respArea/ToolbarIcon.js +17 -0
  48. package/dist/components/respArea/inlineDropdownUtils.d.ts +15 -0
  49. package/dist/components/respArea/inlineDropdownUtils.js +15 -0
  50. package/dist/constants.d.ts +13 -0
  51. package/dist/constants.js +4 -0
  52. package/dist/extensions/css.d.ts +11 -0
  53. package/dist/extensions/css.js +115 -0
  54. package/dist/extensions/custom-toolbar-wrapper.d.ts +11 -0
  55. package/dist/extensions/custom-toolbar-wrapper.js +61 -0
  56. package/dist/extensions/div-node.d.ts +10 -0
  57. package/dist/extensions/div-node.js +42 -0
  58. package/dist/extensions/ensure-empty-root-div.d.ts +14 -0
  59. package/dist/extensions/ensure-empty-root-div.js +24 -0
  60. package/dist/extensions/ensure-list-item-content-is-div.d.ts +15 -0
  61. package/dist/extensions/ensure-list-item-content-is-div.js +31 -0
  62. package/dist/extensions/extended-list-item.d.ts +13 -0
  63. package/dist/extensions/extended-list-item.js +5 -0
  64. package/dist/extensions/extended-table-cell.d.ts +10 -0
  65. package/dist/extensions/extended-table-cell.js +6 -0
  66. package/dist/extensions/extended-table.d.ts +17 -0
  67. package/dist/extensions/extended-table.js +34 -0
  68. package/dist/extensions/heading-paragraph.d.ts +17 -0
  69. package/dist/extensions/heading-paragraph.js +30 -0
  70. package/dist/extensions/image-component.d.ts +22 -0
  71. package/dist/extensions/image-component.js +220 -0
  72. package/dist/extensions/image.d.ts +10 -0
  73. package/dist/extensions/image.js +68 -0
  74. package/dist/extensions/index.d.ts +16 -0
  75. package/dist/extensions/index.js +65 -0
  76. package/dist/extensions/math.d.ts +15 -0
  77. package/dist/extensions/math.js +158 -0
  78. package/dist/extensions/media.d.ts +19 -0
  79. package/dist/extensions/media.js +149 -0
  80. package/dist/extensions/responseArea.d.ts +27 -0
  81. package/dist/extensions/responseArea.js +259 -0
  82. package/dist/index.d.ts +13 -0
  83. package/dist/index.js +7 -0
  84. package/dist/styles/editorContainerStyles.d.ts +134 -0
  85. package/dist/theme.d.ts +9 -0
  86. package/dist/utils/helper.d.ts +9 -0
  87. package/dist/utils/helper.js +27 -0
  88. package/dist/utils/size.d.ts +9 -0
  89. package/dist/utils/size.js +14 -0
  90. package/package.json +51 -38
  91. package/CHANGELOG.json +0 -32
  92. package/CHANGELOG.md +0 -2532
  93. package/LICENSE.md +0 -5
  94. package/lib/components/CharacterPicker.js +0 -195
  95. package/lib/components/CharacterPicker.js.map +0 -1
  96. package/lib/components/EditableHtml.js +0 -375
  97. package/lib/components/EditableHtml.js.map +0 -1
  98. package/lib/components/MenuBar.js +0 -693
  99. package/lib/components/MenuBar.js.map +0 -1
  100. package/lib/components/TiptapContainer.js +0 -234
  101. package/lib/components/TiptapContainer.js.map +0 -1
  102. package/lib/components/characters/characterUtils.js +0 -378
  103. package/lib/components/characters/characterUtils.js.map +0 -1
  104. package/lib/components/characters/custom-popper.js +0 -44
  105. package/lib/components/characters/custom-popper.js.map +0 -1
  106. package/lib/components/common/done-button.js +0 -34
  107. package/lib/components/common/done-button.js.map +0 -1
  108. package/lib/components/common/toolbar-buttons.js +0 -144
  109. package/lib/components/common/toolbar-buttons.js.map +0 -1
  110. package/lib/components/icons/CssIcon.js +0 -25
  111. package/lib/components/icons/CssIcon.js.map +0 -1
  112. package/lib/components/icons/RespArea.js +0 -72
  113. package/lib/components/icons/RespArea.js.map +0 -1
  114. package/lib/components/icons/TableIcons.js +0 -53
  115. package/lib/components/icons/TableIcons.js.map +0 -1
  116. package/lib/components/icons/TextAlign.js +0 -157
  117. package/lib/components/icons/TextAlign.js.map +0 -1
  118. package/lib/components/image/AltDialog.js +0 -98
  119. package/lib/components/image/AltDialog.js.map +0 -1
  120. package/lib/components/image/ImageToolbar.js +0 -137
  121. package/lib/components/image/ImageToolbar.js.map +0 -1
  122. package/lib/components/image/InsertImageHandler.js +0 -135
  123. package/lib/components/image/InsertImageHandler.js.map +0 -1
  124. package/lib/components/media/MediaDialog.js +0 -594
  125. package/lib/components/media/MediaDialog.js.map +0 -1
  126. package/lib/components/media/MediaToolbar.js +0 -74
  127. package/lib/components/media/MediaToolbar.js.map +0 -1
  128. package/lib/components/media/MediaWrapper.js +0 -67
  129. package/lib/components/media/MediaWrapper.js.map +0 -1
  130. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +0 -84
  131. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +0 -1
  132. package/lib/components/respArea/DragInTheBlank/choice.js +0 -250
  133. package/lib/components/respArea/DragInTheBlank/choice.js.map +0 -1
  134. package/lib/components/respArea/ExplicitConstructedResponse.js +0 -136
  135. package/lib/components/respArea/ExplicitConstructedResponse.js.map +0 -1
  136. package/lib/components/respArea/InlineDropdown.js +0 -165
  137. package/lib/components/respArea/InlineDropdown.js.map +0 -1
  138. package/lib/components/respArea/MathTemplated.js +0 -130
  139. package/lib/components/respArea/MathTemplated.js.map +0 -1
  140. package/lib/components/respArea/ToolbarIcon.js +0 -81
  141. package/lib/components/respArea/ToolbarIcon.js.map +0 -1
  142. package/lib/constants.js +0 -11
  143. package/lib/constants.js.map +0 -1
  144. package/lib/extensions/css.js +0 -217
  145. package/lib/extensions/css.js.map +0 -1
  146. package/lib/extensions/custom-toolbar-wrapper.js +0 -92
  147. package/lib/extensions/custom-toolbar-wrapper.js.map +0 -1
  148. package/lib/extensions/div-node.js +0 -83
  149. package/lib/extensions/div-node.js.map +0 -1
  150. package/lib/extensions/ensure-empty-root-div.js +0 -48
  151. package/lib/extensions/ensure-empty-root-div.js.map +0 -1
  152. package/lib/extensions/ensure-list-item-content-is-div.js +0 -64
  153. package/lib/extensions/ensure-list-item-content-is-div.js.map +0 -1
  154. package/lib/extensions/extended-list-item.js +0 -15
  155. package/lib/extensions/extended-list-item.js.map +0 -1
  156. package/lib/extensions/extended-table-cell.js +0 -22
  157. package/lib/extensions/extended-table-cell.js.map +0 -1
  158. package/lib/extensions/extended-table.js +0 -75
  159. package/lib/extensions/extended-table.js.map +0 -1
  160. package/lib/extensions/heading-paragraph.js +0 -61
  161. package/lib/extensions/heading-paragraph.js.map +0 -1
  162. package/lib/extensions/image-component.js +0 -348
  163. package/lib/extensions/image-component.js.map +0 -1
  164. package/lib/extensions/image.js +0 -134
  165. package/lib/extensions/image.js.map +0 -1
  166. package/lib/extensions/index.js +0 -46
  167. package/lib/extensions/index.js.map +0 -1
  168. package/lib/extensions/math.js +0 -343
  169. package/lib/extensions/math.js.map +0 -1
  170. package/lib/extensions/media.js +0 -243
  171. package/lib/extensions/media.js.map +0 -1
  172. package/lib/extensions/responseArea.js +0 -446
  173. package/lib/extensions/responseArea.js.map +0 -1
  174. package/lib/index.js +0 -30
  175. package/lib/index.js.map +0 -1
  176. package/lib/styles/editorContainerStyles.js +0 -137
  177. package/lib/styles/editorContainerStyles.js.map +0 -1
  178. package/lib/theme.js +0 -8
  179. package/lib/theme.js.map +0 -1
  180. package/lib/utils/helper.js +0 -73
  181. package/lib/utils/helper.js.map +0 -1
  182. package/lib/utils/size.js +0 -26
  183. package/lib/utils/size.js.map +0 -1
  184. package/src/__tests__/EditableHtml.test.jsx +0 -474
  185. package/src/__tests__/constants.test.js +0 -19
  186. package/src/__tests__/div-to-paragraph-conversion.test.jsx +0 -125
  187. package/src/__tests__/extensions.test.js +0 -208
  188. package/src/__tests__/index.test.jsx +0 -154
  189. package/src/__tests__/size-utils.test.js +0 -64
  190. package/src/__tests__/theme.test.js +0 -17
  191. package/src/components/CharacterPicker.jsx +0 -200
  192. package/src/components/EditableHtml.jsx +0 -438
  193. package/src/components/MenuBar.jsx +0 -549
  194. package/src/components/TiptapContainer.jsx +0 -219
  195. package/src/components/__tests__/AltDialog.test.jsx +0 -147
  196. package/src/components/__tests__/CharacterPicker.test.jsx +0 -219
  197. package/src/components/__tests__/CssIcon.test.jsx +0 -46
  198. package/src/components/__tests__/DragInTheBlank.test.jsx +0 -255
  199. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +0 -204
  200. package/src/components/__tests__/ImageToolbar.test.jsx +0 -128
  201. package/src/components/__tests__/InlineDropdown.test.jsx +0 -380
  202. package/src/components/__tests__/InsertImageHandler.test.js +0 -161
  203. package/src/components/__tests__/MediaDialog.test.jsx +0 -293
  204. package/src/components/__tests__/MediaToolbar.test.jsx +0 -74
  205. package/src/components/__tests__/MediaWrapper.test.jsx +0 -81
  206. package/src/components/__tests__/MenuBar.test.jsx +0 -249
  207. package/src/components/__tests__/RespArea.test.jsx +0 -122
  208. package/src/components/__tests__/TableIcons.test.jsx +0 -149
  209. package/src/components/__tests__/TextAlign.test.jsx +0 -167
  210. package/src/components/__tests__/TiptapContainer.test.jsx +0 -138
  211. package/src/components/__tests__/characterUtils.test.js +0 -166
  212. package/src/components/__tests__/choice.test.jsx +0 -171
  213. package/src/components/__tests__/custom-popper.test.jsx +0 -82
  214. package/src/components/__tests__/done-button.test.jsx +0 -54
  215. package/src/components/__tests__/toolbar-buttons.test.jsx +0 -234
  216. package/src/components/characters/characterUtils.js +0 -447
  217. package/src/components/characters/custom-popper.js +0 -38
  218. package/src/components/common/done-button.jsx +0 -27
  219. package/src/components/common/toolbar-buttons.jsx +0 -122
  220. package/src/components/icons/CssIcon.jsx +0 -15
  221. package/src/components/icons/RespArea.jsx +0 -71
  222. package/src/components/icons/TableIcons.jsx +0 -52
  223. package/src/components/icons/TextAlign.jsx +0 -114
  224. package/src/components/image/AltDialog.jsx +0 -82
  225. package/src/components/image/ImageToolbar.jsx +0 -99
  226. package/src/components/image/InsertImageHandler.js +0 -107
  227. package/src/components/media/MediaDialog.jsx +0 -596
  228. package/src/components/media/MediaToolbar.jsx +0 -49
  229. package/src/components/media/MediaWrapper.jsx +0 -39
  230. package/src/components/respArea/DragInTheBlank/DragInTheBlank.jsx +0 -76
  231. package/src/components/respArea/DragInTheBlank/choice.jsx +0 -256
  232. package/src/components/respArea/ExplicitConstructedResponse.jsx +0 -135
  233. package/src/components/respArea/InlineDropdown.jsx +0 -167
  234. package/src/components/respArea/MathTemplated.jsx +0 -124
  235. package/src/components/respArea/ToolbarIcon.jsx +0 -66
  236. package/src/components/respArea/__tests__/MathTemplated.test.jsx +0 -210
  237. package/src/constants.js +0 -5
  238. package/src/extensions/__tests__/css.test.js +0 -196
  239. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +0 -180
  240. package/src/extensions/__tests__/divNode.test.js +0 -87
  241. package/src/extensions/__tests__/ensure-empty-root-div.test.js +0 -57
  242. package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +0 -44
  243. package/src/extensions/__tests__/extended-list-item.test.js +0 -13
  244. package/src/extensions/__tests__/extended-table-cell.test.js +0 -22
  245. package/src/extensions/__tests__/extended-table.test.js +0 -183
  246. package/src/extensions/__tests__/image-component.test.jsx +0 -345
  247. package/src/extensions/__tests__/image.test.js +0 -237
  248. package/src/extensions/__tests__/math.test.js +0 -459
  249. package/src/extensions/__tests__/media-node-view.test.jsx +0 -298
  250. package/src/extensions/__tests__/media.test.js +0 -271
  251. package/src/extensions/__tests__/responseArea.test.js +0 -601
  252. package/src/extensions/css.js +0 -220
  253. package/src/extensions/custom-toolbar-wrapper.jsx +0 -78
  254. package/src/extensions/div-node.js +0 -86
  255. package/src/extensions/ensure-empty-root-div.js +0 -47
  256. package/src/extensions/ensure-list-item-content-is-div.js +0 -62
  257. package/src/extensions/extended-list-item.js +0 -10
  258. package/src/extensions/extended-table-cell.js +0 -19
  259. package/src/extensions/extended-table.js +0 -60
  260. package/src/extensions/heading-paragraph.js +0 -53
  261. package/src/extensions/image-component.jsx +0 -338
  262. package/src/extensions/image.js +0 -109
  263. package/src/extensions/index.js +0 -81
  264. package/src/extensions/math.js +0 -327
  265. package/src/extensions/media.js +0 -188
  266. package/src/extensions/responseArea.js +0 -401
  267. package/src/index.jsx +0 -5
  268. package/src/styles/editorContainerStyles.js +0 -145
  269. package/src/theme.js +0 -1
  270. package/src/utils/__tests__/helper.test.js +0 -126
  271. package/src/utils/helper.js +0 -69
  272. package/src/utils/size.js +0 -32
@@ -1,76 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { NodeViewWrapper } from '@tiptap/react';
4
- import DragDropTile from './choice';
5
- import omit from 'lodash-es/omit';
6
-
7
- export const onValueChange = (editor, node, pos, choice) => {
8
- const { tr } = editor.state;
9
-
10
- // Merge old and new attributes
11
- tr.setNodeMarkup(pos, undefined, {
12
- ...node.attrs,
13
- ...choice.value,
14
- });
15
- tr.isDone = true;
16
- editor.view.dispatch(tr);
17
- };
18
-
19
- export const onRemoveResponse = (editor, node, choice) => {
20
- const { tr } = editor.state;
21
-
22
- // Merge old and new attributes
23
- tr.setNodeMarkup(choice.pos, undefined, omit(node.attrs, ['value', 'id']));
24
- tr.isDone = true;
25
- editor.view.dispatch(tr);
26
- };
27
-
28
- const DragDrop = (props) => {
29
- const { editor, node, getPos, options, selected } = props;
30
- const { attrs: attributes } = node;
31
- const { inTable } = attributes;
32
- const pos = getPos();
33
-
34
- // console.log({nodeProps.children})
35
- return (
36
- <NodeViewWrapper
37
- className="drag-in-the-blank"
38
- data-selected={selected}
39
- style={{ display: 'inline', whiteSpace: 'normal' }}
40
- >
41
- <span
42
- {...attributes}
43
- style={{
44
- display: 'inline-flex',
45
- minHeight: '50px',
46
- minWidth: '178px',
47
- position: 'relative',
48
- margin: inTable ? '10px' : '0 10px',
49
- cursor: 'pointer',
50
- }}
51
- >
52
- <DragDropTile
53
- n={attributes}
54
- dragKey={attributes.id}
55
- targetId="0"
56
- pos={pos}
57
- value={attributes}
58
- duplicates={options.duplicates}
59
- selected={selected}
60
- onChange={(choice) => onValueChange(editor, node, pos, choice)}
61
- removeResponse={(choice) => onRemoveResponse(editor, node, choice)}
62
- ></DragDropTile>
63
- </span>
64
- </NodeViewWrapper>
65
- );
66
- };
67
-
68
- DragDrop.propTypes = {
69
- attributes: PropTypes.object,
70
- data: PropTypes.object,
71
- n: PropTypes.object,
72
- nodeProps: PropTypes.object,
73
- opts: PropTypes.object,
74
- };
75
-
76
- export default DragDrop;
@@ -1,256 +0,0 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import PropTypes from 'prop-types';
3
- import { useDraggable, useDroppable } from '@dnd-kit/core';
4
- import { color } from '@pie-lib/render-ui';
5
- import { renderMath } from '@pie-lib/math-rendering';
6
- import { styled } from '@mui/material/styles';
7
- import classnames from 'classnames';
8
-
9
- import { GripIcon } from '../../icons/RespArea';
10
-
11
- const StyledContent = styled('span')(({ theme }) => ({
12
- border: `solid 0px ${theme.palette.primary.main}`,
13
- '& mjx-frac': {
14
- fontSize: '120% !important',
15
- },
16
- }));
17
-
18
- export function BlankContent({ n, children, isDragging, isOver, dragItem, value, selected }) {
19
- const [hoveredElementSize, setHoveredElementSize] = useState(null);
20
- const elementRef = useRef(null);
21
-
22
- const handleClick = (event) => {
23
- if (!elementRef.current) return;
24
-
25
- if (elementRef.current.contains(event.target)) {
26
- elementRef.current.classList.add('selected');
27
- } else {
28
- elementRef.current.classList.remove('selected');
29
- }
30
- };
31
-
32
- useEffect(() => {
33
- document.addEventListener('click', handleClick);
34
- return () => {
35
- document.removeEventListener('click', handleClick);
36
- };
37
- }, []);
38
-
39
- useEffect(() => {
40
- if (elementRef.current && typeof renderMath === 'function') {
41
- renderMath(elementRef.current);
42
- }
43
- }, [value?.value, isOver, dragItem?.value?.value]);
44
-
45
- useEffect(() => {
46
- if (isOver && elementRef.current && !hoveredElementSize) {
47
- const node = elementRef.current;
48
- setHoveredElementSize({ width: node.offsetWidth, height: node.offsetHeight });
49
- } else if (!isOver && hoveredElementSize) {
50
- setHoveredElementSize(null);
51
- }
52
- }, [isOver, hoveredElementSize]);
53
-
54
- const label = dragItem && isOver ? dragItem.value.value : value.value || '\u00A0';
55
- const finalLabel = isDragging ? '\u00A0' : label;
56
- const hasGrip = finalLabel !== '\u00A0';
57
- const isPreview = dragItem && isOver;
58
-
59
- const borderStyle = selected
60
- ? `2px solid ${color.primaryDark()}`
61
- : isPreview
62
- ? `1px solid ${color.defaults.BORDER_DARK}`
63
- : `1px solid ${color.defaults.BORDER_LIGHT}`;
64
-
65
- return (
66
- <div
67
- ref={elementRef}
68
- className={selected ? 'selected' : undefined}
69
- style={{
70
- display: 'inline-flex',
71
- minWidth: '178px',
72
- minHeight: '36px',
73
- background: isPreview ? `${color.defaults.BORDER_LIGHT}` : `${color.defaults.WHITE}`,
74
- border: borderStyle,
75
- boxSizing: 'border-box',
76
- borderRadius: '3px',
77
- overflow: 'hidden',
78
- position: 'relative',
79
- padding: '8px 8px 8px 35px',
80
- width: hoveredElementSize ? hoveredElementSize.width : undefined,
81
- height: hoveredElementSize ? hoveredElementSize.height : undefined,
82
- touchAction: 'none',
83
- }}
84
- data-key={n.index}
85
- contentEditable={false}
86
- >
87
- {hasGrip && (
88
- <GripIcon
89
- style={{
90
- position: 'absolute',
91
- top: '6px',
92
- left: '15px',
93
- color: '#9B9B9B',
94
- }}
95
- contentEditable={false}
96
- />
97
- )}
98
- <span
99
- dangerouslySetInnerHTML={{
100
- __html: finalLabel,
101
- }}
102
- />
103
- {children}
104
- </div>
105
- );
106
- }
107
-
108
- BlankContent.propTypes = {
109
- n: PropTypes.object,
110
- children: PropTypes.node,
111
- isDragging: PropTypes.bool,
112
- isOver: PropTypes.bool,
113
- dragItem: PropTypes.object,
114
- value: PropTypes.object,
115
- selected: PropTypes.bool,
116
- };
117
-
118
- function DragDropChoice({
119
- value,
120
- disabled,
121
- instanceId,
122
- children,
123
- n,
124
- onChange,
125
- removeResponse,
126
- duplicates,
127
- pos,
128
- selected,
129
- }) {
130
- const {
131
- attributes: dragAttributes,
132
- listeners: dragListeners,
133
- setNodeRef: setDragNodeRef,
134
- isDragging,
135
- } = useDraggable({
136
- id: `drag-${n.index}`,
137
- disabled: disabled || !value?.value,
138
- data: {
139
- id: `drag-${n.index}`,
140
- value,
141
- instanceId,
142
- n,
143
- pos,
144
- opts: { duplicates },
145
- type: 'drag-in-the-blank-placed-choice',
146
- fromChoice: !value,
147
- onRemove: (draggedData) => removeResponse(draggedData),
148
- onDrop: (draggedData, dropData) => {
149
- // check if we're dropping into a blank
150
- const isValidBlank = dropData?.type === 'drag-in-the-blank-drop-choice';
151
-
152
- if (!isValidBlank) return;
153
-
154
- // place into blank
155
- onChange(draggedData);
156
-
157
- if (!duplicates && draggedData.fromChoice) {
158
- removeResponse(draggedData);
159
- }
160
- },
161
- },
162
- });
163
-
164
- const {
165
- setNodeRef: setDropNodeRef,
166
- isOver,
167
- active: dragItem,
168
- } = useDroppable({
169
- id: `drop-${n.index}`,
170
- data: {
171
- type: 'drag-in-the-blank-drop-choice',
172
- accepts: ['drag-in-the-blank-choice', 'drag-in-the-blank-placed-choice'],
173
- instanceId: instanceId,
174
- value: value,
175
- id: `drop-${n.index}`,
176
- pos,
177
- n,
178
- opts: { duplicates },
179
- onDrop: (draggedData, dropData) => {
180
- // check if we're dropping into a blank
181
- const isValidBlank = dropData?.type === 'drag-in-the-blank-drop-choice';
182
-
183
- if (!isValidBlank) return;
184
-
185
- // if the dragged and dropped data are the same, do nothing
186
- if (draggedData.value.id === dropData.value.id) return;
187
-
188
- if (draggedData.type === 'drag-in-the-blank-choice') {
189
- // place into blank
190
- onChange(draggedData);
191
-
192
- if (!duplicates && draggedData.fromChoice) {
193
- removeResponse(draggedData);
194
- }
195
- return;
196
- }
197
-
198
- // moving placed choice between blanks
199
- if (draggedData.type === 'drag-in-the-blank-placed-choice') {
200
- // clear target blank
201
- removeResponse(dropData);
202
-
203
- // set new blank value
204
- onChange(draggedData);
205
-
206
- // clear original blank - slight delay to ensure state updates correctly
207
- setTimeout(() => removeResponse(draggedData), 10);
208
- }
209
- },
210
- },
211
- });
212
-
213
- const setNodeRef = (node) => {
214
- setDragNodeRef(node);
215
- setDropNodeRef(node);
216
- };
217
-
218
- const dragContent = (
219
- <BlankContent
220
- n={n}
221
- isDragging={isDragging}
222
- isOver={isOver}
223
- dragItem={dragItem?.data?.current}
224
- value={value}
225
- selected={selected}
226
- >
227
- {children}
228
- </BlankContent>
229
- );
230
-
231
- const dragEl = !value ? (
232
- <span ref={setDropNodeRef}>{dragContent}</span>
233
- ) : (
234
- <span ref={setNodeRef} {...dragAttributes} {...dragListeners}>
235
- {dragContent}
236
- </span>
237
- );
238
-
239
- const content = <StyledContent className={classnames(isOver && 'over')}>{dragEl}</StyledContent>;
240
-
241
- return content;
242
- }
243
-
244
- DragDropChoice.propTypes = {
245
- value: PropTypes.object,
246
- disabled: PropTypes.bool,
247
- instanceId: PropTypes.string,
248
- children: PropTypes.node,
249
- n: PropTypes.object.isRequired,
250
- onChange: PropTypes.func.isRequired,
251
- removeResponse: PropTypes.func.isRequired,
252
- duplicates: PropTypes.bool,
253
- selected: PropTypes.bool,
254
- };
255
-
256
- export default DragDropChoice;
@@ -1,135 +0,0 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import { NodeViewWrapper } from '@tiptap/react';
3
- import ReactDOM from 'react-dom';
4
- import PropTypes from 'prop-types';
5
- import CustomToolbarWrapper from '../../extensions/custom-toolbar-wrapper';
6
-
7
- const ExplicitConstructedResponse = (props) => {
8
- const { editor, node, getPos, options, selected } = props;
9
- const { attrs: attributes } = node;
10
- const { value } = attributes;
11
- const { respAreaToolbar, error: errorFn } = options;
12
- const pos = getPos();
13
- const [showToolbar, setShowToolbar] = useState(false);
14
- const EcrToolbar = respAreaToolbar([node, pos], editor, () => {});
15
- const toolbarRef = useRef(null);
16
-
17
- let error;
18
-
19
- if (errorFn) {
20
- const errorValue = errorFn();
21
- const respIndex = parseInt(attributes.index, 10);
22
-
23
- error = !!errorValue?.[respIndex]?.[0];
24
- }
25
-
26
- useEffect(() => {
27
- const { selection } = editor.state;
28
- const onlyThisNodeSelected = selection.from + node.nodeSize === selection.to;
29
-
30
- if (selected) {
31
- if (onlyThisNodeSelected) {
32
- setShowToolbar(selected);
33
- }
34
- } else {
35
- setShowToolbar(selected);
36
- }
37
- }, [editor, node, selected]);
38
-
39
- useEffect(() => {
40
- const handleClickOutside = (event) => {
41
- const insideCharacterPicker =
42
- event.target.closest('.insert-character-dialog') || event.target.closest('[data-toolbar-for]');
43
-
44
- if (
45
- !insideCharacterPicker &&
46
- toolbarRef.current &&
47
- !toolbarRef.current.contains(event.target) &&
48
- !event.target.closest('[data-inline-node]')
49
- ) {
50
- setShowToolbar(false);
51
- }
52
- };
53
-
54
- if (showToolbar) {
55
- document.addEventListener('mousedown', handleClickOutside);
56
- } else {
57
- document.removeEventListener('mousedown', handleClickOutside);
58
- }
59
-
60
- return () => document.removeEventListener('mousedown', handleClickOutside);
61
- }, [showToolbar]);
62
-
63
- return (
64
- <NodeViewWrapper
65
- className="drag-in-the-blank"
66
- data-selected={selected}
67
- style={{
68
- display: 'inline-flex',
69
- minHeight: '55px',
70
- position: 'relative',
71
- cursor: 'pointer',
72
- }}
73
- >
74
- <div
75
- {...attributes}
76
- style={{
77
- display: 'inline-flex',
78
- width: '100%',
79
- minHeight: '46px',
80
- height: '46px',
81
- backgroundColor: '#FFF',
82
- border: `1px solid ${error ? 'red' : '#C0C3CF'}`,
83
- boxSizing: 'border-box',
84
- borderRadius: '4px',
85
- overflow: 'hidden',
86
- padding: '12px 21px',
87
- margin: '0 4px',
88
- minWidth: '178px',
89
- visibility: showToolbar ? 'hidden' : 'visible',
90
- }}
91
- onClick={() => setShowToolbar(true)}
92
- dangerouslySetInnerHTML={{
93
- __html: value || '<div>&nbsp;</div>',
94
- }}
95
- />
96
- {showToolbar && (
97
- <React.Fragment>
98
- <div ref={toolbarRef} className="absolute z-50 bg-white shadow-lg rounded p-2" style={{ zIndex: 1 }}>
99
- <EcrToolbar />
100
- </div>
101
- {editor._tiptapContainerEl &&
102
- ReactDOM.createPortal(
103
- <CustomToolbarWrapper
104
- deletable
105
- toolbarOpts={{ minWidth: 'auto' }}
106
- autoWidth
107
- style={{ top: -40, left: 0, right: 0 }}
108
- onDelete={() => {
109
- const { tr } = editor.state;
110
- tr.delete(pos, pos + node.nodeSize);
111
- // Prevent the debounced onBlur/onDone from firing into the
112
- // now-deleted node's stale position
113
- editor._toolbarOpened = false;
114
- editor.view.dispatch(tr);
115
- setShowToolbar(false);
116
- editor.commands.focus();
117
- }}
118
- showDone={false}
119
- />,
120
- editor._tiptapContainerEl,
121
- )}
122
- </React.Fragment>
123
- )}
124
- </NodeViewWrapper>
125
- );
126
- };
127
-
128
- ExplicitConstructedResponse.propTypes = {
129
- attributes: PropTypes.object,
130
- error: PropTypes.any,
131
- value: PropTypes.string,
132
- isFocused: PropTypes.bool,
133
- };
134
-
135
- export default ExplicitConstructedResponse;
@@ -1,167 +0,0 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import PropTypes from 'prop-types';
3
- import { NodeViewWrapper } from '@tiptap/react';
4
- import { Chevron } from '../icons/RespArea';
5
- import ReactDOM from 'react-dom';
6
- import CustomToolbarWrapper from '../../extensions/custom-toolbar-wrapper';
7
-
8
- const InlineDropdown = (props) => {
9
- const { editor, node, getPos, options, selected } = props;
10
- const { attrs: attributes } = node;
11
- const { value, error } = attributes;
12
- // TODO: Investigate
13
- // Needed because items with values inside have different positioning for some reason
14
- const html = value || '<div>&nbsp</div>';
15
- const pos = getPos();
16
- const toolbarRef = useRef(null);
17
- const toolbarEditor = useRef(null);
18
- const [showToolbar, setShowToolbar] = useState(false);
19
- const [position, setPosition] = useState({ top: 0, left: 0 });
20
- const InlineDropdownToolbar = options.respAreaToolbar([node, pos], editor, () => {});
21
-
22
- useEffect(() => {
23
- const { selection } = editor.state;
24
- const onlyThisNodeSelected = selection.from + node.nodeSize === selection.to;
25
-
26
- if (selected) {
27
- if (onlyThisNodeSelected) {
28
- setShowToolbar(selected);
29
- }
30
- } else {
31
- setShowToolbar(selected);
32
- }
33
- }, [editor, node, selected]);
34
-
35
- useEffect(() => {
36
- // Calculate position relative to selection
37
- const bodyRect = document.body.getBoundingClientRect();
38
- const { from } = editor.state.selection;
39
- const start = editor.view.coordsAtPos(from);
40
-
41
- setPosition({
42
- top: start.top + Math.abs(bodyRect.top) + 40, // shift above
43
- left: start.left,
44
- });
45
-
46
- const handleClickOutside = (event) => {
47
- const insideSomeEditor = event.target.closest('[data-toolbar-for]');
48
-
49
- if (
50
- (!insideSomeEditor || insideSomeEditor.dataset.toolbarFor !== toolbarEditor.current.instanceId) &&
51
- !editor._toolbarOpened &&
52
- toolbarRef.current &&
53
- !toolbarRef.current.contains(event.target) &&
54
- !event.target.closest('[data-inline-node]')
55
- ) {
56
- setShowToolbar(false);
57
- }
58
- };
59
-
60
- if (showToolbar) {
61
- document.addEventListener('mousedown', handleClickOutside);
62
- } else {
63
- document.removeEventListener('mousedown', handleClickOutside);
64
- }
65
-
66
- return () => document.removeEventListener('mousedown', handleClickOutside);
67
- }, [showToolbar]);
68
-
69
- return (
70
- <NodeViewWrapper
71
- className="inline-dropdown"
72
- data-selected={selected}
73
- style={{
74
- display: 'inline-flex',
75
- height: '50px',
76
- cursor: 'pointer',
77
- }}
78
- >
79
- <div
80
- style={{
81
- display: 'inline-flex',
82
- minWidth: '178px',
83
- height: '36px',
84
- background: '#FFF',
85
- border: '1px solid #C0C3CF',
86
- boxSizing: 'border-box',
87
- borderRadius: '3px',
88
- margin: '0 2px',
89
- position: 'relative',
90
- alignItems: 'center',
91
- }}
92
- onClick={() => setShowToolbar(true)}
93
- >
94
- <div
95
- style={{
96
- flex: 1,
97
- overflow: 'hidden',
98
- padding: '0 25px 0 8px',
99
- whiteSpace: 'nowrap',
100
- textOverflow: 'ellipsis',
101
- }}
102
- >
103
- <span
104
- style={{
105
- display: 'inline-block',
106
- verticalAlign: 'middle',
107
- }}
108
- dangerouslySetInnerHTML={{
109
- __html: html,
110
- }}
111
- />
112
- </div>
113
- <Chevron
114
- direction="down"
115
- style={{
116
- position: 'absolute',
117
- top: '5px',
118
- right: '5px',
119
- }}
120
- />
121
- </div>
122
- {showToolbar && (
123
- <React.Fragment>
124
- {ReactDOM.createPortal(
125
- <div ref={toolbarRef} style={{ zIndex: 1 }}>
126
- <InlineDropdownToolbar
127
- editorCallback={(instance) => {
128
- toolbarEditor.current = instance;
129
- }}
130
- />
131
- </div>,
132
- document.body,
133
- )}
134
-
135
- {editor._tiptapContainerEl &&
136
- ReactDOM.createPortal(
137
- <CustomToolbarWrapper
138
- deletable
139
- toolbarOpts={{ minWidth: 'auto' }}
140
- autoWidth
141
- style={{ top: -40, left: 0, right: 0 }}
142
- onDelete={() => {
143
- const { tr } = editor.state;
144
- tr.delete(pos, pos + node.nodeSize);
145
- // Prevent the debounced onBlur/onDone from firing into the
146
- // now-deleted node's stale position
147
- editor._toolbarOpened = false;
148
- editor.view.dispatch(tr);
149
- setShowToolbar(false);
150
- editor.commands.focus();
151
- }}
152
- showDone={false}
153
- />,
154
- editor._tiptapContainerEl,
155
- )}
156
- </React.Fragment>
157
- )}
158
- </NodeViewWrapper>
159
- );
160
- };
161
-
162
- InlineDropdown.propTypes = {
163
- attributes: PropTypes.object,
164
- selectedItem: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
165
- };
166
-
167
- export default InlineDropdown;