@mirrormedia/lilith-draft-editor 1.0.0-beta → 1.0.0-beta4

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 (171) hide show
  1. package/lib/draft-js/block-renderer/background-image-block.js +123 -0
  2. package/lib/draft-js/block-renderer/background-video-block.js +133 -0
  3. package/lib/draft-js/block-renderer/color-box-block.js +92 -0
  4. package/lib/draft-js/block-renderer/divider-block.js +24 -0
  5. package/lib/draft-js/block-renderer/embedded-code-block.js +63 -0
  6. package/lib/draft-js/block-renderer/image-block.js +47 -0
  7. package/lib/draft-js/block-renderer/info-box-block.js +89 -0
  8. package/lib/draft-js/block-renderer/media-block.js +65 -0
  9. package/lib/draft-js/block-renderer/related-post-block.js +51 -0
  10. package/lib/draft-js/block-renderer/side-index-block.js +103 -0
  11. package/lib/draft-js/block-renderer/slideshow-block.js +71 -0
  12. package/lib/draft-js/block-renderer/table-block.js +408 -0
  13. package/lib/draft-js/buttons/annotation.js +117 -0
  14. package/lib/draft-js/buttons/background-color.js +123 -0
  15. package/lib/draft-js/buttons/background-image.js +222 -0
  16. package/lib/draft-js/buttons/background-video.js +222 -0
  17. package/lib/draft-js/buttons/color-box.js +172 -0
  18. package/lib/draft-js/buttons/divider.js +63 -0
  19. package/lib/draft-js/buttons/embedded-code.js +109 -0
  20. package/lib/draft-js/buttons/enlarge.js +24 -0
  21. package/lib/draft-js/buttons/font-color.js +116 -0
  22. package/lib/draft-js/buttons/image.js +68 -0
  23. package/lib/draft-js/buttons/info-box.js +147 -0
  24. package/lib/draft-js/buttons/link.js +107 -0
  25. package/lib/draft-js/buttons/media.js +121 -0
  26. package/lib/draft-js/buttons/related-post.js +71 -0
  27. package/lib/draft-js/buttons/selector/align-selector.js +71 -0
  28. package/lib/draft-js/buttons/selector/image-selector.js +428 -0
  29. package/lib/draft-js/buttons/selector/pagination.js +82 -0
  30. package/lib/draft-js/buttons/selector/post-selector.js +317 -0
  31. package/lib/draft-js/buttons/selector/search-box.js +46 -0
  32. package/lib/draft-js/buttons/selector/video-selector.js +284 -0
  33. package/lib/draft-js/buttons/side-index.js +200 -0
  34. package/lib/draft-js/buttons/slideshow.js +71 -0
  35. package/lib/draft-js/buttons/table.js +67 -0
  36. package/lib/draft-js/buttons/text-align.js +88 -0
  37. package/lib/draft-js/editor/basic-editor.js +366 -0
  38. package/lib/draft-js/editor/block-renderer-fn.js +117 -0
  39. package/lib/draft-js/editor/entity-decorator.js +16 -0
  40. package/lib/draft-js/editor/modifier.js +68 -0
  41. package/lib/draft-js/entity-decorator/annotation-decorator.js +86 -0
  42. package/lib/draft-js/entity-decorator/link-decorator.js +39 -0
  43. package/lib/website/mirrormedia/custom/block-renderer/background-image-block.js +91 -0
  44. package/lib/website/mirrormedia/custom/block-renderer/background-video-block.js +91 -0
  45. package/lib/website/mirrormedia/custom/block-renderer/color-box-block.js +84 -0
  46. package/lib/website/mirrormedia/custom/block-renderer/info-box-block.js +84 -0
  47. package/lib/website/mirrormedia/custom/block-renderer/side-index-block.js +90 -0
  48. package/lib/website/mirrormedia/custom/block-renderer/table-block.js +408 -0
  49. package/lib/website/mirrormedia/custom/selector/align-selector.js +71 -0
  50. package/lib/website/mirrormedia/custom/selector/image-selector.js +427 -0
  51. package/lib/website/mirrormedia/custom/selector/pagination.js +82 -0
  52. package/lib/website/mirrormedia/custom/selector/post-selector.js +318 -0
  53. package/lib/website/mirrormedia/custom/selector/search-box.js +46 -0
  54. package/lib/website/mirrormedia/custom/selector/video-selector.js +282 -0
  55. package/lib/website/mirrormedia/draft-editor/block-renderer-fn.js +117 -0
  56. package/lib/website/mirrormedia/draft-editor/entity-decorator.js +18 -0
  57. package/lib/website/mirrormedia/draft-editor/index.js +799 -0
  58. package/lib/website/mirrormedia/index.js +1 -4
  59. package/lib/website/readr/custom/block-renderer/background-image-block.js +91 -0
  60. package/lib/website/readr/custom/block-renderer/background-video-block.js +91 -0
  61. package/lib/website/readr/custom/block-renderer/color-box-block.js +84 -0
  62. package/lib/website/readr/custom/block-renderer/info-box-block.js +84 -0
  63. package/lib/website/readr/custom/block-renderer/side-index-block.js +90 -0
  64. package/lib/website/readr/custom/block-renderer/table-block.js +408 -0
  65. package/lib/website/readr/custom/selector/align-selector.js +71 -0
  66. package/lib/website/readr/custom/selector/image-selector.js +427 -0
  67. package/lib/website/readr/custom/selector/pagination.js +82 -0
  68. package/lib/website/readr/custom/selector/post-selector.js +318 -0
  69. package/lib/website/readr/custom/selector/search-box.js +46 -0
  70. package/lib/website/readr/custom/selector/video-selector.js +282 -0
  71. package/lib/website/readr/draft-editor/block-renderer-fn.js +117 -0
  72. package/lib/website/readr/draft-editor/entity-decorator.js +18 -0
  73. package/lib/website/readr/draft-editor/index.js +799 -0
  74. package/lib/website/readr/index.js +1 -4
  75. package/package.json +3 -2
  76. package/lib/draft-js/block-renderer/background-image-block.tsx +0 -113
  77. package/lib/draft-js/block-renderer/background-video-block.tsx +0 -120
  78. package/lib/draft-js/block-renderer/color-box-block.tsx +0 -85
  79. package/lib/draft-js/block-renderer/divider-block.tsx +0 -12
  80. package/lib/draft-js/block-renderer/embedded-code-block.tsx +0 -65
  81. package/lib/draft-js/block-renderer/image-block.tsx +0 -41
  82. package/lib/draft-js/block-renderer/info-box-block.tsx +0 -85
  83. package/lib/draft-js/block-renderer/media-block.tsx +0 -36
  84. package/lib/draft-js/block-renderer/related-post-block.tsx +0 -47
  85. package/lib/draft-js/block-renderer/side-index-block.tsx +0 -113
  86. package/lib/draft-js/block-renderer/slideshow-block.tsx +0 -62
  87. package/lib/draft-js/block-renderer/table-block.tsx +0 -488
  88. package/lib/draft-js/buttons/annotation.tsx +0 -113
  89. package/lib/draft-js/buttons/background-color.tsx +0 -125
  90. package/lib/draft-js/buttons/background-image.tsx +0 -276
  91. package/lib/draft-js/buttons/background-video.tsx +0 -275
  92. package/lib/draft-js/buttons/color-box.tsx +0 -207
  93. package/lib/draft-js/buttons/divider.tsx +0 -56
  94. package/lib/draft-js/buttons/embedded-code.tsx +0 -126
  95. package/lib/draft-js/buttons/enlarge.tsx +0 -11
  96. package/lib/draft-js/buttons/font-color.tsx +0 -113
  97. package/lib/draft-js/buttons/image.tsx +0 -71
  98. package/lib/draft-js/buttons/info-box.tsx +0 -170
  99. package/lib/draft-js/buttons/link.tsx +0 -103
  100. package/lib/draft-js/buttons/media.tsx +0 -120
  101. package/lib/draft-js/buttons/related-post.tsx +0 -81
  102. package/lib/draft-js/buttons/selector/align-selector.tsx +0 -65
  103. package/lib/draft-js/buttons/selector/image-selector.tsx +0 -485
  104. package/lib/draft-js/buttons/selector/pagination.tsx +0 -83
  105. package/lib/draft-js/buttons/selector/post-selector.tsx +0 -367
  106. package/lib/draft-js/buttons/selector/search-box.tsx +0 -39
  107. package/lib/draft-js/buttons/selector/video-selector.tsx +0 -312
  108. package/lib/draft-js/buttons/side-index.tsx +0 -257
  109. package/lib/draft-js/buttons/slideshow.tsx +0 -81
  110. package/lib/draft-js/buttons/table.tsx +0 -63
  111. package/lib/draft-js/buttons/text-align.tsx +0 -88
  112. package/lib/draft-js/editor/basic-editor.tsx +0 -384
  113. package/lib/draft-js/editor/block-redender-fn.tsx +0 -77
  114. package/lib/draft-js/editor/entity-decorator.tsx +0 -7
  115. package/lib/draft-js/editor/modifier.tsx +0 -71
  116. package/lib/draft-js/entity-decorator/annotation-decorator.tsx +0 -81
  117. package/lib/draft-js/entity-decorator/link-decorator.tsx +0 -27
  118. package/lib/website/mirrormedia/custom/block-renderer/background-image-block.tsx +0 -128
  119. package/lib/website/mirrormedia/custom/block-renderer/background-video-block.tsx +0 -135
  120. package/lib/website/mirrormedia/custom/block-renderer/color-box-block.tsx +0 -98
  121. package/lib/website/mirrormedia/custom/block-renderer/divider-block.tsx +0 -12
  122. package/lib/website/mirrormedia/custom/block-renderer/embedded-code-block.tsx +0 -65
  123. package/lib/website/mirrormedia/custom/block-renderer/image-block.tsx +0 -41
  124. package/lib/website/mirrormedia/custom/block-renderer/info-box-block.tsx +0 -98
  125. package/lib/website/mirrormedia/custom/block-renderer/media-block.tsx +0 -36
  126. package/lib/website/mirrormedia/custom/block-renderer/related-post-block.tsx +0 -47
  127. package/lib/website/mirrormedia/custom/block-renderer/side-index-block.tsx +0 -125
  128. package/lib/website/mirrormedia/custom/block-renderer/slideshow-block.tsx +0 -62
  129. package/lib/website/mirrormedia/custom/block-renderer/table-block.tsx +0 -537
  130. package/lib/website/mirrormedia/custom/entity-decorator/annotation-decorator.tsx +0 -81
  131. package/lib/website/mirrormedia/custom/entity-decorator/link-decorator.tsx +0 -27
  132. package/lib/website/mirrormedia/custom/selector/align-selector.tsx +0 -65
  133. package/lib/website/mirrormedia/custom/selector/image-selector.tsx +0 -485
  134. package/lib/website/mirrormedia/custom/selector/pagination.tsx +0 -83
  135. package/lib/website/mirrormedia/custom/selector/post-selector.tsx +0 -367
  136. package/lib/website/mirrormedia/custom/selector/search-box.tsx +0 -39
  137. package/lib/website/mirrormedia/custom/selector/video-selector.tsx +0 -310
  138. package/lib/website/mirrormedia/draft-editor/block-redender-fn.tsx +0 -77
  139. package/lib/website/mirrormedia/draft-editor/entity-decorator.tsx +0 -7
  140. package/lib/website/mirrormedia/draft-editor/index.tsx +0 -909
  141. package/lib/website/mirrormedia/draft-renderer/block-redender-fn.tsx +0 -77
  142. package/lib/website/mirrormedia/draft-renderer/entity-decorator.tsx +0 -7
  143. package/lib/website/mirrormedia/draft-renderer/index-deprecated.tsx +0 -43
  144. package/lib/website/mirrormedia/draft-renderer/index.tsx +0 -150
  145. package/lib/website/readr/custom/block-renderer/background-image-block.tsx +0 -128
  146. package/lib/website/readr/custom/block-renderer/background-video-block.tsx +0 -135
  147. package/lib/website/readr/custom/block-renderer/color-box-block.tsx +0 -98
  148. package/lib/website/readr/custom/block-renderer/divider-block.tsx +0 -12
  149. package/lib/website/readr/custom/block-renderer/embedded-code-block.tsx +0 -65
  150. package/lib/website/readr/custom/block-renderer/image-block.tsx +0 -41
  151. package/lib/website/readr/custom/block-renderer/info-box-block.tsx +0 -98
  152. package/lib/website/readr/custom/block-renderer/media-block.tsx +0 -36
  153. package/lib/website/readr/custom/block-renderer/related-post-block.tsx +0 -47
  154. package/lib/website/readr/custom/block-renderer/side-index-block.tsx +0 -125
  155. package/lib/website/readr/custom/block-renderer/slideshow-block.tsx +0 -62
  156. package/lib/website/readr/custom/block-renderer/table-block.tsx +0 -537
  157. package/lib/website/readr/custom/entity-decorator/annotation-decorator.tsx +0 -81
  158. package/lib/website/readr/custom/entity-decorator/link-decorator.tsx +0 -27
  159. package/lib/website/readr/custom/selector/align-selector.tsx +0 -65
  160. package/lib/website/readr/custom/selector/image-selector.tsx +0 -485
  161. package/lib/website/readr/custom/selector/pagination.tsx +0 -83
  162. package/lib/website/readr/custom/selector/post-selector.tsx +0 -367
  163. package/lib/website/readr/custom/selector/search-box.tsx +0 -39
  164. package/lib/website/readr/custom/selector/video-selector.tsx +0 -310
  165. package/lib/website/readr/draft-editor/block-redender-fn.tsx +0 -77
  166. package/lib/website/readr/draft-editor/entity-decorator.tsx +0 -7
  167. package/lib/website/readr/draft-editor/index.tsx +0 -909
  168. package/lib/website/readr/draft-renderer/block-redender-fn.tsx +0 -77
  169. package/lib/website/readr/draft-renderer/entity-decorator.tsx +0 -7
  170. package/lib/website/readr/draft-renderer/index-deprecated.tsx +0 -43
  171. package/lib/website/readr/draft-renderer/index.tsx +0 -150
@@ -7,13 +7,10 @@ exports.default = void 0;
7
7
 
8
8
  var _draftEditor = _interopRequireDefault(require("./draft-editor"));
9
9
 
10
- var _draftRenderer = _interopRequireDefault(require("./draft-renderer"));
11
-
12
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
11
 
14
12
  const Readr = {
15
- DraftEditor: _draftEditor.default,
16
- DraftRenderer: _draftRenderer.default
13
+ DraftEditor: _draftEditor.default
17
14
  };
18
15
  var _default = Readr;
19
16
  exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirrormedia/lilith-draft-editor",
3
- "version": "1.0.0-beta",
3
+ "version": "1.0.0-beta4",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -22,7 +22,8 @@
22
22
  ],
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "draft-js": "^0.11.7"
25
+ "draft-js": "^0.11.7",
26
+ "@mirrormedia/lilith-draft-renderer": "1.0.0-beta4"
26
27
  },
27
28
  "peerDependencies": {
28
29
  "react": "18.1.0",
@@ -1,113 +0,0 @@
1
- import React, { useState } from 'react'
2
- import styled from 'styled-components'
3
- import { ContentBlock, ContentState } from 'draft-js'
4
- import draftConverter from '../editor/draft-converter'
5
- import { BGImageInput } from '../buttons/background-image'
6
-
7
- const BGImageRenderWrapper = styled.div`
8
- padding: 30px;
9
- position: relative;
10
- width: 100%;
11
- height: 100%;
12
- background-image: url(${({ image }) => image});
13
- background-size: cover;
14
- background-position: center center;
15
- ${({ textBlockAlign }) => {
16
- if (textBlockAlign === 'left') {
17
- return `padding-right: 50%;`
18
- } else if (textBlockAlign === 'right') {
19
- return `padding-left: 50%;`
20
- } else if (textBlockAlign === 'bottom') {
21
- return `padding-top: 50%;`
22
- }
23
- }}
24
- `
25
-
26
- const BGImageRenderBody = styled.div`
27
- background: rgba(0, 0, 0, 0.5);
28
- padding: 4px 20px;
29
- margin-bottom: 10px;
30
- `
31
-
32
- const BGImageRenderButton = styled.span`
33
- cursor: pointer;
34
- background-color: white;
35
- padding: 6px;
36
- border-radius: 6px;
37
- `
38
-
39
- type BGImageBlockProps = {
40
- block: ContentBlock
41
- blockProps: {
42
- onEditStart: () => void
43
- onEditFinish: ({
44
- entityKey,
45
- entityData,
46
- }: {
47
- entityKey?: string
48
- entityData?: Record<string, unknown>
49
- }) => void
50
- }
51
- contentState: ContentState
52
- }
53
-
54
- export function BGImageBlock(props: BGImageBlockProps) {
55
- const [toShowInput, setToShowInput] = useState(false)
56
- const { block, blockProps, contentState } = props
57
- const { onEditStart, onEditFinish } = blockProps
58
- const entityKey = block.getEntityAt(0)
59
- const entity = contentState.getEntity(entityKey)
60
- const { textBlockAlign, image, body, rawContentState } = entity.getData()
61
- const onChange = ({
62
- textBlockAlign: newTextBlockAlign,
63
- image: newImage,
64
- rawContentState: newRawContentState,
65
- }) => {
66
- // close `BGImageInput`
67
- setToShowInput(false)
68
- onEditFinish({
69
- entityKey,
70
- entityData: {
71
- textBlockAlign: newTextBlockAlign,
72
- image: newImage,
73
- body: draftConverter.convertToHtml(newRawContentState),
74
- rawContentState: newRawContentState,
75
- },
76
- })
77
- }
78
-
79
- return (
80
- <React.Fragment>
81
- <BGImageInput
82
- textBlockAlign={textBlockAlign}
83
- image={image}
84
- rawContentStateForBGImageEditor={rawContentState}
85
- onChange={onChange}
86
- onCancel={() => {
87
- onEditFinish({})
88
- setToShowInput(false)
89
- }}
90
- isOpen={toShowInput}
91
- />
92
- <BGImageRenderWrapper
93
- image={image?.imageFile?.url}
94
- textBlockAlign={textBlockAlign}
95
- >
96
- <BGImageRenderBody dangerouslySetInnerHTML={{ __html: body }} />
97
- <div>
98
- <BGImageRenderButton
99
- onClick={() => {
100
- // call `onEditStart` prop as we are trying to update the BGImage entity
101
- onEditStart()
102
- // open `BGImageInput`
103
- setToShowInput(true)
104
- }}
105
- >
106
- <i className="fa-solid fa-pen"></i>
107
- <span>Modify</span>
108
- </BGImageRenderButton>
109
- </div>
110
- </BGImageRenderWrapper>
111
- </React.Fragment>
112
- )
113
- }
@@ -1,120 +0,0 @@
1
- import React, { useState } from 'react'
2
- import styled from 'styled-components'
3
- import { ContentBlock, ContentState } from 'draft-js'
4
- import draftConverter from '../editor/draft-converter'
5
- import { BGVideoInput } from '../buttons/background-video'
6
-
7
- const BGVideoRenderWrapper = styled.div`
8
- position: relative;
9
- padding: 30px;
10
- width: 100%;
11
- ${({ textBlockAlign }) => {
12
- if (textBlockAlign === 'left') {
13
- return `padding-right: 50%;`
14
- } else if (textBlockAlign === 'right') {
15
- return `padding-left: 50%;`
16
- } else if (textBlockAlign === 'bottom') {
17
- return `padding-top: 50%;`
18
- }
19
- }}
20
- `
21
-
22
- const BGVideoRednerVideo = styled.video`
23
- position: absolute;
24
- width: 100%;
25
- height: 100%;
26
- top: 0;
27
- left: 0;
28
- z-index: -1;
29
- background-color: black;
30
- `
31
-
32
- const BGVideoRenderBody = styled.div`
33
- background: rgba(0, 0, 0, 0.5);
34
- padding: 4px 20px;
35
- margin-bottom: 10px;
36
- `
37
-
38
- const BGVideoRenderButton = styled.span`
39
- cursor: pointer;
40
- background-color: white;
41
- padding: 6px;
42
- border-radius: 6px;
43
- `
44
-
45
- type BGVideoBlockProps = {
46
- block: ContentBlock
47
- blockProps: {
48
- onEditStart: () => void
49
- onEditFinish: ({
50
- entityKey,
51
- entityData,
52
- }: {
53
- entityKey?: string
54
- entityData?: Record<string, unknown>
55
- }) => void
56
- }
57
- contentState: ContentState
58
- }
59
-
60
- export function BGVideoBlock(props: BGVideoBlockProps) {
61
- const [toShowInput, setToShowInput] = useState(false)
62
- const { block, blockProps, contentState } = props
63
- const { onEditStart, onEditFinish } = blockProps
64
- const entityKey = block.getEntityAt(0)
65
- const entity = contentState.getEntity(entityKey)
66
- const { textBlockAlign, video, body, rawContentState } = entity.getData()
67
- const onChange = ({
68
- textBlockAlign: newTextBlockAlign,
69
- video: newVideo,
70
- rawContentState: newRawContentState,
71
- }) => {
72
- // close `BGVideoInput`
73
- setToShowInput(false)
74
- onEditFinish({
75
- entityKey,
76
- entityData: {
77
- textBlockAlign: newTextBlockAlign,
78
- video: newVideo,
79
- body: draftConverter.convertToHtml(newRawContentState),
80
- rawContentState: newRawContentState,
81
- },
82
- })
83
- }
84
-
85
- return (
86
- <React.Fragment>
87
- <BGVideoInput
88
- textBlockAlign={textBlockAlign}
89
- video={video}
90
- rawContentStateForBGVideoEditor={rawContentState}
91
- onChange={onChange}
92
- onCancel={() => {
93
- onEditFinish({})
94
- setToShowInput(false)
95
- }}
96
- isOpen={toShowInput}
97
- />
98
- <BGVideoRenderWrapper textBlockAlign={textBlockAlign}>
99
- <BGVideoRednerVideo muted autoPlay loop>
100
- <source src={video?.videoSrc} />
101
- <source src={video?.videoFile?.url} />
102
- </BGVideoRednerVideo>
103
- <BGVideoRenderBody dangerouslySetInnerHTML={{ __html: body }} />
104
- <div>
105
- <BGVideoRenderButton
106
- onClick={() => {
107
- // call `onEditStart` prop as we are trying to update the BGVideo entity
108
- onEditStart()
109
- // open `BGVideoInput`
110
- setToShowInput(true)
111
- }}
112
- >
113
- <i className="fa-solid fa-pen"></i>
114
- <span>Modify</span>
115
- </BGVideoRenderButton>
116
- </div>
117
- </BGVideoRenderWrapper>
118
- </React.Fragment>
119
- )
120
- }
@@ -1,85 +0,0 @@
1
- import React, { useState } from 'react'
2
- import styled from 'styled-components'
3
- import { ContentBlock, ContentState } from 'draft-js'
4
- import draftConverter from '../editor/draft-converter'
5
- import { ColorBoxInput } from '../buttons/color-box'
6
-
7
- const ColorBoxRenderWrapper = styled.div`
8
- background-color: ${(props) => (props.color ? props.color : '#F5F4F3')};
9
- padding: 30px;
10
- position: relative;
11
- color: white;
12
- `
13
-
14
- const ColorBoxRenderButton = styled.div`
15
- cursor: pointer;
16
- `
17
-
18
- type ColorBoxBlockProps = {
19
- block: ContentBlock
20
- blockProps: {
21
- onEditStart: () => void
22
- onEditFinish: ({
23
- entityKey,
24
- entityData,
25
- }: {
26
- entityKey?: string
27
- entityData?: Record<string, unknown>
28
- }) => void
29
- }
30
- contentState: ContentState
31
- }
32
-
33
- export function ColorBoxBlock(props: ColorBoxBlockProps) {
34
- const [toShowInput, setToShowInput] = useState(false)
35
- const { block, blockProps, contentState } = props
36
- const { onEditStart, onEditFinish } = blockProps
37
- const entityKey = block.getEntityAt(0)
38
- const entity = contentState.getEntity(entityKey)
39
- const { color, body, rawContentState } = entity.getData()
40
- const onChange = ({
41
- color: newColor,
42
- rawContentState: newRawContentState,
43
- }) => {
44
- // close `ColorBoxInput`
45
- setToShowInput(false)
46
-
47
- onEditFinish({
48
- entityKey,
49
- entityData: {
50
- color: newColor,
51
- body: draftConverter.convertToHtml(newRawContentState),
52
- rawContentState: newRawContentState,
53
- },
54
- })
55
- }
56
-
57
- return (
58
- <React.Fragment>
59
- <ColorBoxInput
60
- color={color}
61
- rawContentStateForColorBoxEditor={rawContentState}
62
- onChange={onChange}
63
- onCancel={() => {
64
- onEditFinish({})
65
- setToShowInput(false)
66
- }}
67
- isOpen={toShowInput}
68
- />
69
- <ColorBoxRenderWrapper color={color}>
70
- <div dangerouslySetInnerHTML={{ __html: body }} />
71
- <ColorBoxRenderButton
72
- onClick={() => {
73
- // call `onEditStart` prop as we are trying to update the ColorBox entity
74
- onEditStart()
75
- // open `ColorBoxInput`
76
- setToShowInput(true)
77
- }}
78
- >
79
- <i className="fa-solid fa-pen"></i>
80
- <span>Modify</span>
81
- </ColorBoxRenderButton>
82
- </ColorBoxRenderWrapper>
83
- </React.Fragment>
84
- )
85
- }
@@ -1,12 +0,0 @@
1
- import React from 'react'
2
- import styled from 'styled-components'
3
-
4
- const Divider = styled.hr`
5
- box-sizing: border-box;
6
- border-width: 1px;
7
- border-style: inset;
8
- `
9
-
10
- export const DividerBlock = () => {
11
- return <Divider />
12
- }
@@ -1,65 +0,0 @@
1
- import React, { useEffect, useRef } from 'react'
2
- import { DraftEntityInstance } from 'draft-js'
3
- import { Block, Caption } from '../buttons/embedded-code'
4
-
5
- export const EmbeddedCodeBlock = (entity: DraftEntityInstance) => {
6
- const { caption, embeddedCode } = entity.getData()
7
- const embedded = useRef(null)
8
-
9
- useEffect(() => {
10
- if (!embedded.current) return
11
- const node: HTMLElement = embedded.current
12
-
13
- const fragment = document.createDocumentFragment()
14
-
15
- // `embeddedCode` is a string, which may includes
16
- // multiple '<script>' tags and other html tags.
17
- // For executing '<script>' tags on the browser,
18
- // we need to extract '<script>' tags from `embeddedCode` string first.
19
- //
20
- // The approach we have here is to parse html string into elements,
21
- // and we could use DOM element built-in functions,
22
- // such as `querySelectorAll` method, to query '<script>' elements,
23
- // and other non '<script>' elements.
24
- const parser = new DOMParser()
25
- const ele = parser.parseFromString(
26
- `<div id="draft-embed">${embeddedCode}</div>`,
27
- 'text/html'
28
- )
29
- const scripts = ele.querySelectorAll('script')
30
- const nonScripts = ele.querySelectorAll('div#draft-embed > :not(script)')
31
-
32
- nonScripts.forEach((ele) => {
33
- fragment.appendChild(ele)
34
- })
35
-
36
- scripts.forEach((s) => {
37
- const scriptEle = document.createElement('script')
38
- const attrs = s.attributes
39
- for (let i = 0; i < attrs.length; i++) {
40
- scriptEle.setAttribute(attrs[i].name, attrs[i].value)
41
- }
42
- scriptEle.text = s.text || ''
43
- fragment.appendChild(scriptEle)
44
- })
45
-
46
- node.appendChild(fragment)
47
- }, [embeddedCode])
48
-
49
- return (
50
- <div>
51
- {
52
- // WORKAROUND:
53
- // The following `<input>` is to solve [issue 153](https://github.com/mirror-media/openwarehouse-k6/issues/153).
54
- // If the emebed code generates `<input>` or `<textarea>` and appends them onto DOM,
55
- // and then the generated `<input>` or `<textarea>` will hijack the users' cursors.
56
- // It will cause that users could not edit the DraftJS Editor anymore.
57
- // The following phony `<input>` is used to prevent the generated `<input>` or `<textare>` from
58
- // hijacking the users' cursors.
59
- }
60
- <input hidden disabled />
61
- <Block ref={embedded} />
62
- {caption ? <Caption>{caption}</Caption> : null}
63
- </div>
64
- )
65
- }
@@ -1,41 +0,0 @@
1
- import React from 'react'
2
- import styled from 'styled-components'
3
- import { DraftEntityInstance } from 'draft-js'
4
-
5
- const Image = styled.img`
6
- width: 100%;
7
- `
8
-
9
- const Figure = styled.figure`
10
- margin-block: unset;
11
- margin-inline: unset;
12
- margin: 0 10px;
13
- `
14
-
15
- const Anchor = styled.a`
16
- text-decoration: none;
17
- `
18
-
19
- export function ImageBlock(entity: DraftEntityInstance) {
20
- const { desc, imageFile, resized, url } = entity.getData()
21
-
22
- let imgBlock = (
23
- <Figure>
24
- <Image
25
- src={resized?.w800}
26
- onError={(e) => (e.currentTarget.src = imageFile?.url)}
27
- />
28
- <figcaption>{desc}</figcaption>
29
- </Figure>
30
- )
31
-
32
- if (url) {
33
- imgBlock = (
34
- <Anchor href={url} target="_blank">
35
- {imgBlock}
36
- </Anchor>
37
- )
38
- }
39
-
40
- return imgBlock
41
- }
@@ -1,85 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { ContentBlock, ContentState } from 'draft-js'
3
- import styled from 'styled-components'
4
- import draftConverter from '../editor/draft-converter'
5
- import { InfoBoxInput } from '../buttons/info-box'
6
-
7
- const InfoBoxRenderWrapper = styled.div`
8
- background-color: #f5f4f3;
9
- padding: 30px;
10
- position: relative;
11
- `
12
-
13
- const InfoBoxRenderButton = styled.div`
14
- cursor: pointer;
15
- `
16
-
17
- type InfoBoxBlockProps = {
18
- block: ContentBlock
19
- blockProps: {
20
- onEditStart: () => void
21
- onEditFinish: ({
22
- entityKey,
23
- entityData,
24
- }: {
25
- entityKey?: string
26
- entityData?: Record<string, unknown>
27
- }) => void
28
- }
29
- contentState: ContentState
30
- }
31
-
32
- export function InfoBoxBlock(props: InfoBoxBlockProps) {
33
- const [toShowInput, setToShowInput] = useState(false)
34
- const { block, blockProps, contentState } = props
35
- const { onEditStart, onEditFinish } = blockProps
36
- const entityKey = block.getEntityAt(0)
37
- const entity = contentState.getEntity(entityKey)
38
- const { title, body, rawContentState } = entity.getData()
39
- const onChange = ({
40
- title: newTitle,
41
- rawContentState: newRawContentState,
42
- }) => {
43
- // close `InfoBoxInput`
44
- setToShowInput(false)
45
-
46
- onEditFinish({
47
- entityKey,
48
- entityData: {
49
- title: newTitle,
50
- body: draftConverter.convertToHtml(newRawContentState),
51
- rawContentState: newRawContentState,
52
- },
53
- })
54
- }
55
-
56
- return (
57
- <React.Fragment>
58
- <InfoBoxInput
59
- title={title}
60
- rawContentStateForInfoBoxEditor={rawContentState}
61
- onChange={onChange}
62
- onCancel={() => {
63
- onEditFinish({})
64
- setToShowInput(false)
65
- }}
66
- isOpen={toShowInput}
67
- />
68
- <InfoBoxRenderWrapper>
69
- <h2>{title}</h2>
70
- <div dangerouslySetInnerHTML={{ __html: body }} />
71
- <InfoBoxRenderButton
72
- onClick={() => {
73
- // call `onEditStart` prop as we are trying to update the InfoBox entity
74
- onEditStart()
75
- // open `InfoBoxInput`
76
- setToShowInput(true)
77
- }}
78
- >
79
- <i className="fa-solid fa-pen"></i>
80
- <span>Modify</span>
81
- </InfoBoxRenderButton>
82
- </InfoBoxRenderWrapper>
83
- </React.Fragment>
84
- )
85
- }
@@ -1,36 +0,0 @@
1
- import React from 'react'
2
- import { DraftEntityInstance } from 'draft-js'
3
-
4
- const styles = {
5
- media: {
6
- width: '100%',
7
- },
8
- }
9
-
10
- const Audio = (props) => {
11
- return <audio controls src={props.src} style={styles.media} />
12
- }
13
-
14
- const Image = (props) => {
15
- return <img src={props.src} style={styles.media} />
16
- }
17
-
18
- const Video = (props) => {
19
- return <video controls src={props.src} style={styles.media} />
20
- }
21
-
22
- export const MediaBlock = (entity: DraftEntityInstance) => {
23
- const { src } = entity.getData()
24
- const type = entity.getType()
25
-
26
- let media
27
- if (type === 'audioLink') {
28
- media = <Audio src={src} />
29
- } else if (type === 'imageLink') {
30
- media = <Image src={src} />
31
- } else if (type === 'videoLink') {
32
- media = <Video src={src} />
33
- }
34
-
35
- return media
36
- }
@@ -1,47 +0,0 @@
1
- import React from 'react'
2
- import styled from 'styled-components'
3
- import { DraftEntityInstance } from 'draft-js'
4
-
5
- const RelatedPostRenderWrapper = styled.div`
6
- display: flex;
7
- width: 100%;
8
- `
9
-
10
- const RelatedPostItem = styled.div`
11
- flex: 0 0 33.3333%;
12
- border: 1px solid rgba(0, 0, 0, 0.05);
13
- `
14
-
15
- const RelatedPostImage = styled.img`
16
- display: block;
17
- width: 100%;
18
- aspect-ratio: 2;
19
- object-fit: cover;
20
- `
21
-
22
- const RelatedPostTitle = styled.p`
23
- margin: 0;
24
- padding: 12px;
25
- `
26
-
27
- export function RelatedPostBlock(entity: DraftEntityInstance) {
28
- const { posts } = entity.getData()
29
-
30
- return (
31
- <React.Fragment>
32
- <RelatedPostRenderWrapper>
33
- {posts.map((post) => (
34
- <RelatedPostItem key={post.id}>
35
- <RelatedPostImage
36
- src={post.heroImage?.resized?.original}
37
- onError={(e) =>
38
- (e.currentTarget.src = post.heroImage?.imageFile?.url)
39
- }
40
- />
41
- <RelatedPostTitle>{post.name}</RelatedPostTitle>
42
- </RelatedPostItem>
43
- ))}
44
- </RelatedPostRenderWrapper>
45
- </React.Fragment>
46
- )
47
- }