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

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 (191) 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 +134 -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 +138 -0
  44. package/lib/website/mirrormedia/custom/block-renderer/background-video-block.js +148 -0
  45. package/lib/website/mirrormedia/custom/block-renderer/color-box-block.js +106 -0
  46. package/lib/website/mirrormedia/custom/block-renderer/divider-block.js +24 -0
  47. package/lib/website/mirrormedia/custom/block-renderer/embedded-code-block.js +63 -0
  48. package/lib/website/mirrormedia/custom/block-renderer/image-block.js +47 -0
  49. package/lib/website/mirrormedia/custom/block-renderer/info-box-block.js +103 -0
  50. package/lib/website/mirrormedia/custom/block-renderer/media-block.js +65 -0
  51. package/lib/website/mirrormedia/custom/block-renderer/related-post-block.js +51 -0
  52. package/lib/website/mirrormedia/custom/block-renderer/side-index-block.js +119 -0
  53. package/lib/website/mirrormedia/custom/block-renderer/slideshow-block.js +71 -0
  54. package/lib/website/mirrormedia/custom/block-renderer/table-block.js +455 -0
  55. package/lib/website/mirrormedia/custom/entity-decorator/annotation-decorator.js +86 -0
  56. package/lib/website/mirrormedia/custom/entity-decorator/link-decorator.js +39 -0
  57. package/lib/website/mirrormedia/custom/selector/align-selector.js +71 -0
  58. package/lib/website/mirrormedia/custom/selector/image-selector.js +427 -0
  59. package/lib/website/mirrormedia/custom/selector/pagination.js +82 -0
  60. package/lib/website/mirrormedia/custom/selector/post-selector.js +318 -0
  61. package/lib/website/mirrormedia/custom/selector/search-box.js +46 -0
  62. package/lib/website/mirrormedia/custom/selector/video-selector.js +282 -0
  63. package/lib/website/mirrormedia/draft-editor/block-renderer-fn.js +117 -0
  64. package/lib/website/mirrormedia/draft-editor/entity-decorator.js +16 -0
  65. package/lib/website/mirrormedia/draft-editor/index.js +799 -0
  66. package/lib/website/mirrormedia/draft-renderer/block-renderer-fn.js +117 -0
  67. package/lib/website/mirrormedia/draft-renderer/entity-decorator.js +16 -0
  68. package/lib/website/mirrormedia/draft-renderer/index.js +160 -0
  69. package/lib/website/readr/custom/block-renderer/background-image-block.js +138 -0
  70. package/lib/website/readr/custom/block-renderer/background-video-block.js +148 -0
  71. package/lib/website/readr/custom/block-renderer/color-box-block.js +106 -0
  72. package/lib/website/readr/custom/block-renderer/divider-block.js +24 -0
  73. package/lib/website/readr/custom/block-renderer/embedded-code-block.js +63 -0
  74. package/lib/website/readr/custom/block-renderer/image-block.js +47 -0
  75. package/lib/website/readr/custom/block-renderer/info-box-block.js +103 -0
  76. package/lib/website/readr/custom/block-renderer/media-block.js +65 -0
  77. package/lib/website/readr/custom/block-renderer/related-post-block.js +51 -0
  78. package/lib/website/readr/custom/block-renderer/side-index-block.js +119 -0
  79. package/lib/website/readr/custom/block-renderer/slideshow-block.js +71 -0
  80. package/lib/website/readr/custom/block-renderer/table-block.js +455 -0
  81. package/lib/website/readr/custom/entity-decorator/annotation-decorator.js +86 -0
  82. package/lib/website/readr/custom/entity-decorator/link-decorator.js +39 -0
  83. package/lib/website/readr/custom/selector/align-selector.js +71 -0
  84. package/lib/website/readr/custom/selector/image-selector.js +427 -0
  85. package/lib/website/readr/custom/selector/pagination.js +82 -0
  86. package/lib/website/readr/custom/selector/post-selector.js +318 -0
  87. package/lib/website/readr/custom/selector/search-box.js +46 -0
  88. package/lib/website/readr/custom/selector/video-selector.js +282 -0
  89. package/lib/website/readr/draft-editor/block-renderer-fn.js +117 -0
  90. package/lib/website/readr/draft-editor/entity-decorator.js +16 -0
  91. package/lib/website/readr/draft-editor/index.js +799 -0
  92. package/lib/website/readr/draft-renderer/block-renderer-fn.js +117 -0
  93. package/lib/website/readr/draft-renderer/entity-decorator.js +16 -0
  94. package/lib/website/readr/draft-renderer/index.js +160 -0
  95. package/package.json +1 -1
  96. package/lib/draft-js/block-renderer/background-image-block.tsx +0 -113
  97. package/lib/draft-js/block-renderer/background-video-block.tsx +0 -120
  98. package/lib/draft-js/block-renderer/color-box-block.tsx +0 -85
  99. package/lib/draft-js/block-renderer/divider-block.tsx +0 -12
  100. package/lib/draft-js/block-renderer/embedded-code-block.tsx +0 -65
  101. package/lib/draft-js/block-renderer/image-block.tsx +0 -41
  102. package/lib/draft-js/block-renderer/info-box-block.tsx +0 -85
  103. package/lib/draft-js/block-renderer/media-block.tsx +0 -36
  104. package/lib/draft-js/block-renderer/related-post-block.tsx +0 -47
  105. package/lib/draft-js/block-renderer/side-index-block.tsx +0 -113
  106. package/lib/draft-js/block-renderer/slideshow-block.tsx +0 -62
  107. package/lib/draft-js/block-renderer/table-block.tsx +0 -488
  108. package/lib/draft-js/buttons/annotation.tsx +0 -113
  109. package/lib/draft-js/buttons/background-color.tsx +0 -125
  110. package/lib/draft-js/buttons/background-image.tsx +0 -276
  111. package/lib/draft-js/buttons/background-video.tsx +0 -275
  112. package/lib/draft-js/buttons/color-box.tsx +0 -207
  113. package/lib/draft-js/buttons/divider.tsx +0 -56
  114. package/lib/draft-js/buttons/embedded-code.tsx +0 -126
  115. package/lib/draft-js/buttons/enlarge.tsx +0 -11
  116. package/lib/draft-js/buttons/font-color.tsx +0 -113
  117. package/lib/draft-js/buttons/image.tsx +0 -71
  118. package/lib/draft-js/buttons/info-box.tsx +0 -170
  119. package/lib/draft-js/buttons/link.tsx +0 -103
  120. package/lib/draft-js/buttons/media.tsx +0 -120
  121. package/lib/draft-js/buttons/related-post.tsx +0 -81
  122. package/lib/draft-js/buttons/selector/align-selector.tsx +0 -65
  123. package/lib/draft-js/buttons/selector/image-selector.tsx +0 -485
  124. package/lib/draft-js/buttons/selector/pagination.tsx +0 -83
  125. package/lib/draft-js/buttons/selector/post-selector.tsx +0 -367
  126. package/lib/draft-js/buttons/selector/search-box.tsx +0 -39
  127. package/lib/draft-js/buttons/selector/video-selector.tsx +0 -312
  128. package/lib/draft-js/buttons/side-index.tsx +0 -257
  129. package/lib/draft-js/buttons/slideshow.tsx +0 -81
  130. package/lib/draft-js/buttons/table.tsx +0 -63
  131. package/lib/draft-js/buttons/text-align.tsx +0 -88
  132. package/lib/draft-js/editor/basic-editor.tsx +0 -384
  133. package/lib/draft-js/editor/block-redender-fn.tsx +0 -77
  134. package/lib/draft-js/editor/entity-decorator.tsx +0 -7
  135. package/lib/draft-js/editor/modifier.tsx +0 -71
  136. package/lib/draft-js/entity-decorator/annotation-decorator.tsx +0 -81
  137. package/lib/draft-js/entity-decorator/link-decorator.tsx +0 -27
  138. package/lib/website/mirrormedia/custom/block-renderer/background-image-block.tsx +0 -128
  139. package/lib/website/mirrormedia/custom/block-renderer/background-video-block.tsx +0 -135
  140. package/lib/website/mirrormedia/custom/block-renderer/color-box-block.tsx +0 -98
  141. package/lib/website/mirrormedia/custom/block-renderer/divider-block.tsx +0 -12
  142. package/lib/website/mirrormedia/custom/block-renderer/embedded-code-block.tsx +0 -65
  143. package/lib/website/mirrormedia/custom/block-renderer/image-block.tsx +0 -41
  144. package/lib/website/mirrormedia/custom/block-renderer/info-box-block.tsx +0 -98
  145. package/lib/website/mirrormedia/custom/block-renderer/media-block.tsx +0 -36
  146. package/lib/website/mirrormedia/custom/block-renderer/related-post-block.tsx +0 -47
  147. package/lib/website/mirrormedia/custom/block-renderer/side-index-block.tsx +0 -125
  148. package/lib/website/mirrormedia/custom/block-renderer/slideshow-block.tsx +0 -62
  149. package/lib/website/mirrormedia/custom/block-renderer/table-block.tsx +0 -537
  150. package/lib/website/mirrormedia/custom/entity-decorator/annotation-decorator.tsx +0 -81
  151. package/lib/website/mirrormedia/custom/entity-decorator/link-decorator.tsx +0 -27
  152. package/lib/website/mirrormedia/custom/selector/align-selector.tsx +0 -65
  153. package/lib/website/mirrormedia/custom/selector/image-selector.tsx +0 -485
  154. package/lib/website/mirrormedia/custom/selector/pagination.tsx +0 -83
  155. package/lib/website/mirrormedia/custom/selector/post-selector.tsx +0 -367
  156. package/lib/website/mirrormedia/custom/selector/search-box.tsx +0 -39
  157. package/lib/website/mirrormedia/custom/selector/video-selector.tsx +0 -310
  158. package/lib/website/mirrormedia/draft-editor/block-redender-fn.tsx +0 -77
  159. package/lib/website/mirrormedia/draft-editor/entity-decorator.tsx +0 -7
  160. package/lib/website/mirrormedia/draft-editor/index.tsx +0 -909
  161. package/lib/website/mirrormedia/draft-renderer/block-redender-fn.tsx +0 -77
  162. package/lib/website/mirrormedia/draft-renderer/entity-decorator.tsx +0 -7
  163. package/lib/website/mirrormedia/draft-renderer/index-deprecated.tsx +0 -43
  164. package/lib/website/mirrormedia/draft-renderer/index.tsx +0 -150
  165. package/lib/website/readr/custom/block-renderer/background-image-block.tsx +0 -128
  166. package/lib/website/readr/custom/block-renderer/background-video-block.tsx +0 -135
  167. package/lib/website/readr/custom/block-renderer/color-box-block.tsx +0 -98
  168. package/lib/website/readr/custom/block-renderer/divider-block.tsx +0 -12
  169. package/lib/website/readr/custom/block-renderer/embedded-code-block.tsx +0 -65
  170. package/lib/website/readr/custom/block-renderer/image-block.tsx +0 -41
  171. package/lib/website/readr/custom/block-renderer/info-box-block.tsx +0 -98
  172. package/lib/website/readr/custom/block-renderer/media-block.tsx +0 -36
  173. package/lib/website/readr/custom/block-renderer/related-post-block.tsx +0 -47
  174. package/lib/website/readr/custom/block-renderer/side-index-block.tsx +0 -125
  175. package/lib/website/readr/custom/block-renderer/slideshow-block.tsx +0 -62
  176. package/lib/website/readr/custom/block-renderer/table-block.tsx +0 -537
  177. package/lib/website/readr/custom/entity-decorator/annotation-decorator.tsx +0 -81
  178. package/lib/website/readr/custom/entity-decorator/link-decorator.tsx +0 -27
  179. package/lib/website/readr/custom/selector/align-selector.tsx +0 -65
  180. package/lib/website/readr/custom/selector/image-selector.tsx +0 -485
  181. package/lib/website/readr/custom/selector/pagination.tsx +0 -83
  182. package/lib/website/readr/custom/selector/post-selector.tsx +0 -367
  183. package/lib/website/readr/custom/selector/search-box.tsx +0 -39
  184. package/lib/website/readr/custom/selector/video-selector.tsx +0 -310
  185. package/lib/website/readr/draft-editor/block-redender-fn.tsx +0 -77
  186. package/lib/website/readr/draft-editor/entity-decorator.tsx +0 -7
  187. package/lib/website/readr/draft-editor/index.tsx +0 -909
  188. package/lib/website/readr/draft-renderer/block-redender-fn.tsx +0 -77
  189. package/lib/website/readr/draft-renderer/entity-decorator.tsx +0 -7
  190. package/lib/website/readr/draft-renderer/index-deprecated.tsx +0 -43
  191. package/lib/website/readr/draft-renderer/index.tsx +0 -150
@@ -1,125 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { AlertDialog } from '@keystone-ui/modals'
3
- import { EditorState } from 'draft-js'
4
- import { TextInput } from '@keystone-ui/fields'
5
- import styled from 'styled-components'
6
- import { Modifier } from '../editor/modifier'
7
-
8
- const ColorHexInput = styled(TextInput)`
9
- font-family: Georgia, serif;
10
- margin-right: 10px;
11
- padding: 10px;
12
- `
13
-
14
- export const CUSTOM_STYLE_PREFIX_BACKGROUND_COLOR = 'BACKGROUND_COLOR_'
15
-
16
- export function BackgroundColorButton(props) {
17
- const { isActive, editorState, onChange } = props
18
-
19
- const [toShowColorInput, setToShowColorInput] = useState(false)
20
- const [colorValue, setColorValue] = useState('')
21
-
22
- const promptForColor = (e) => {
23
- e.preventDefault()
24
- const selection = editorState.getSelection()
25
- if (!selection.isCollapsed()) {
26
- setToShowColorInput(true)
27
- }
28
- }
29
-
30
- const confirmColor = () => {
31
- const selection = editorState.getSelection()
32
- const contentState = editorState.getCurrentContent()
33
- let newContentState = Modifier.removeInlineStyleByPrefix(
34
- contentState,
35
- selection,
36
- CUSTOM_STYLE_PREFIX_BACKGROUND_COLOR
37
- )
38
- if (colorValue) {
39
- newContentState = Modifier.applyInlineStyle(
40
- newContentState,
41
- selection,
42
- CUSTOM_STYLE_PREFIX_BACKGROUND_COLOR + colorValue
43
- )
44
- }
45
- onChange(
46
- EditorState.push(editorState, newContentState, 'change-inline-style')
47
- )
48
-
49
- setToShowColorInput(false)
50
- setColorValue('')
51
- }
52
-
53
- const onColorInputKeyDown = (e) => {
54
- if (e.which === 13) {
55
- e.preventDefault()
56
- confirmColor()
57
- }
58
- }
59
-
60
- const removeColor = () => {
61
- const selection = editorState.getSelection()
62
-
63
- if (!selection.isCollapsed()) {
64
- const contentState = editorState.getCurrentContent()
65
- const newContentState = Modifier.removeInlineStyleByPrefix(
66
- contentState,
67
- selection,
68
- CUSTOM_STYLE_PREFIX_BACKGROUND_COLOR
69
- )
70
- onChange(
71
- EditorState.push(editorState, newContentState, 'change-inline-style')
72
- )
73
- }
74
- setToShowColorInput(false)
75
- setColorValue('')
76
- }
77
-
78
- const colorInput = (
79
- <AlertDialog
80
- title="Hex Color Code (#ffffff)"
81
- isOpen={toShowColorInput}
82
- actions={{
83
- cancel: {
84
- label: 'Cancel',
85
- action: removeColor,
86
- },
87
- confirm: {
88
- label: 'Confirm',
89
- action: confirmColor,
90
- },
91
- }}
92
- >
93
- <ColorHexInput
94
- onChange={(e) => setColorValue(e.target.value)}
95
- type="text"
96
- value={colorValue}
97
- onKeyDown={onColorInputKeyDown}
98
- />
99
- </AlertDialog>
100
- )
101
-
102
- return (
103
- <React.Fragment>
104
- {colorInput}
105
- <div
106
- className={props.className}
107
- onMouseDown={isActive ? removeColor : promptForColor}
108
- >
109
- <svg
110
- width="16"
111
- height="14"
112
- viewBox="0 0 16 14"
113
- fill="none"
114
- xmlns="http://www.w3.org/2000/svg"
115
- >
116
- <path
117
- d="M3.74443 8.75V6.78945C3.74443 6.37109 3.98306 5.98008 4.34542 5.73125L12.3911 0.229633C12.6091 0.0804726 12.8477 0 13.1453 0C13.4811 0 13.8022 0.124113 14.0409 0.345078L15.6553 1.84242C15.8939 2.06336 16 2.36305 16 2.67531C16 2.92578 15.9411 3.14727 15.779 3.37422L9.85159 10.8418C9.5835 11.1781 9.1357 11.375 8.71147 11.375H6.57264L5.85086 12.0695C5.4826 12.4113 4.8875 12.4113 4.51924 12.0695L3.02265 10.6805C2.65439 10.3387 2.65439 9.78633 3.02265 9.44453L3.74443 8.75ZM13.9466 2.73219L13.0834 1.9302L6.74646 6.26172L9.25354 8.58867L13.9466 2.73219ZM0.207107 12.7504L2.064 11.0277L4.14509 12.9582L3.23182 13.784C3.09925 13.9316 2.91954 14 2.73099 14H0.707052C0.3167 14 0 13.7074 0 13.3438V13.2152C0 13.0184 0.0745351 12.8734 0.207107 12.7504Z"
118
- fill={isActive ? '#ED8B00' : '#6b7280'}
119
- />
120
- </svg>
121
- <span> Highlight</span>
122
- </div>
123
- </React.Fragment>
124
- )
125
- }
@@ -1,276 +0,0 @@
1
- import React, { useState, useEffect } from 'react'
2
- import decorators from '../editor/entity-decorator'
3
- import {
4
- AtomicBlockUtils,
5
- EditorState,
6
- RawDraftContentState,
7
- convertToRaw,
8
- convertFromRaw,
9
- } from 'draft-js'
10
- import { BasicEditor } from '../editor/basic-editor'
11
- import { Drawer, DrawerController } from '@keystone-ui/modals'
12
- import { Button } from '@keystone-ui/button'
13
- import draftConverter from '../editor/draft-converter'
14
- import styled from 'styled-components'
15
- import {
16
- ImageSelector as DefaultImageSelector,
17
- ImageEntityWithMeta,
18
- ImageEntity,
19
- } from './selector/image-selector'
20
- import { AlignSelector } from './selector/align-selector'
21
-
22
- const Label = styled.label`
23
- display: block;
24
- font-weight: 600;
25
- margin: 10px 0;
26
- `
27
-
28
- const ImageInputText = styled.span`
29
- display: inline-block;
30
- margin-right: 10px;
31
- `
32
-
33
- type BGImageInputOnChange = ({
34
- textBlockAlign,
35
- image,
36
- rawContentState,
37
- }: {
38
- textBlockAlign: string
39
- image?: ImageEntity
40
- rawContentState: RawDraftContentState
41
- }) => void
42
-
43
- type BGImageInputType = {
44
- textBlockAlign?: string
45
- image?: ImageEntity
46
- rawContentStateForBGImageEditor?: RawDraftContentState
47
- isOpen: boolean
48
- onChange: BGImageInputOnChange
49
- onCancel: () => void
50
- ImageSelector: typeof DefaultImageSelector
51
- }
52
-
53
- export function BGImageInput(props: BGImageInputType) {
54
- const {
55
- isOpen,
56
- onChange,
57
- onCancel,
58
- textBlockAlign,
59
- image,
60
- rawContentStateForBGImageEditor,
61
- ImageSelector = DefaultImageSelector,
62
- } = props
63
-
64
- const rawContentState = rawContentStateForBGImageEditor || {
65
- blocks: [],
66
- entityMap: {},
67
- }
68
- const options = [
69
- { value: 'fixed', label: 'fixed (default)', isDisabled: false },
70
- { value: 'bottom', label: 'bottom', isDisabled: false },
71
- { value: 'left', label: 'left', isDisabled: false },
72
- { value: 'right', label: 'right', isDisabled: false },
73
- ]
74
- const initialInputValue: {
75
- textBlockAlign: string
76
- image?: ImageEntity
77
- editorStateOfBasicEditor: EditorState
78
- } = {
79
- textBlockAlign: textBlockAlign || 'fixed',
80
- image: image || undefined,
81
- // create an `editorState` from raw content state object
82
- editorStateOfBasicEditor: EditorState.createWithContent(
83
- convertFromRaw(rawContentState),
84
- decorators
85
- ),
86
- }
87
-
88
- const [inputValue, setInputValue] = useState(initialInputValue)
89
- const [toShowImageSelector, setToShowImageSelector] = useState(false)
90
-
91
- const clearInputValue = () => {
92
- setInputValue((oldInputValue) => ({
93
- ...oldInputValue,
94
- editorStateOfBasicEditor: EditorState.createWithContent(
95
- convertFromRaw({
96
- blocks: [],
97
- entityMap: {},
98
- }),
99
- decorators
100
- ),
101
- }))
102
- }
103
-
104
- const onImageSelectorChange = (
105
- selectedImagesWithMeta: ImageEntityWithMeta[]
106
- ) => {
107
- const image = selectedImagesWithMeta?.[0]?.image
108
- if (!image) {
109
- setToShowImageSelector(false)
110
- return
111
- }
112
-
113
- setInputValue((oldInputValue) => ({
114
- ...oldInputValue,
115
- image: image,
116
- }))
117
- setToShowImageSelector(false)
118
- }
119
-
120
- useEffect(() => {
121
- if (isOpen) {
122
- setInputValue(initialInputValue)
123
- }
124
- }, [isOpen])
125
-
126
- return (
127
- <>
128
- {toShowImageSelector && (
129
- <ImageSelector onChange={onImageSelectorChange} />
130
- )}
131
- <DrawerController isOpen={isOpen}>
132
- <Drawer
133
- title={`Insert Background Image`}
134
- actions={{
135
- cancel: {
136
- label: 'Cancel',
137
- action: () => {
138
- clearInputValue()
139
- onCancel()
140
- },
141
- },
142
- confirm: {
143
- label: 'Confirm',
144
- action: () => {
145
- onChange({
146
- textBlockAlign: inputValue.textBlockAlign,
147
- image: inputValue.image,
148
- // convert `contentState` of the `editorState` into raw content state object
149
- rawContentState: convertToRaw(
150
- inputValue.editorStateOfBasicEditor.getCurrentContent()
151
- ),
152
- })
153
- clearInputValue()
154
- },
155
- },
156
- }}
157
- >
158
- <Label>圖片</Label>
159
- <div>
160
- <ImageInputText>
161
- {inputValue.image?.name ? inputValue.image.name : '尚未選取圖片'}
162
- </ImageInputText>
163
- <Button
164
- type="button"
165
- onClick={() => setToShowImageSelector(true)}
166
- tone="passive"
167
- >
168
- 添加圖片
169
- </Button>
170
- </div>
171
- <AlignSelector
172
- align={inputValue.textBlockAlign}
173
- options={options}
174
- onChange={(textBlockAlign) => {
175
- setInputValue((oldInputValue) => ({
176
- ...oldInputValue,
177
- textBlockAlign,
178
- }))
179
- }}
180
- />
181
- <Label>內文</Label>
182
- <BasicEditor
183
- editorState={inputValue.editorStateOfBasicEditor}
184
- onChange={(editorStateOfBasicEditor) => {
185
- setInputValue((oldInputValue) => ({
186
- ...oldInputValue,
187
- editorStateOfBasicEditor,
188
- }))
189
- }}
190
- />
191
- </Drawer>
192
- </DrawerController>
193
- </>
194
- )
195
- }
196
-
197
- type BGImageButtonProps = {
198
- className: string
199
- editorState: EditorState
200
- onChange: ({ editorState }: { editorState: EditorState }) => void
201
- ImageSelector: typeof DefaultImageSelector
202
- }
203
-
204
- export function BGImageButton(props: BGImageButtonProps) {
205
- const [toShowInput, setToShowInput] = useState(false)
206
- const {
207
- className,
208
- editorState,
209
- onChange: onEditorStateChange,
210
- ImageSelector,
211
- } = props
212
-
213
- const onChange: BGImageInputOnChange = ({
214
- textBlockAlign,
215
- image,
216
- rawContentState,
217
- }) => {
218
- const contentState = editorState.getCurrentContent()
219
-
220
- // create an BGImage entity
221
- const contentStateWithEntity = contentState.createEntity(
222
- 'BACKGROUNDIMAGE',
223
- 'IMMUTABLE',
224
- {
225
- textBlockAlign,
226
- image,
227
- rawContentState,
228
- body: draftConverter.convertToHtml(rawContentState),
229
- }
230
- )
231
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey()
232
- const newEditorState = EditorState.set(editorState, {
233
- currentContent: contentStateWithEntity,
234
- })
235
-
236
- //The third parameter here is a space string, not an empty string
237
- //If you set an empty string, you will get an error: Unknown DraftEntity key: null
238
- onEditorStateChange(
239
- AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' ')
240
- )
241
- setToShowInput(false)
242
- }
243
-
244
- return (
245
- <React.Fragment>
246
- <BGImageInput
247
- onChange={onChange}
248
- onCancel={() => {
249
- setToShowInput(false)
250
- }}
251
- isOpen={toShowInput}
252
- ImageSelector={ImageSelector}
253
- />
254
- <div
255
- className={className}
256
- onClick={() => {
257
- setToShowInput(true)
258
- }}
259
- >
260
- <svg
261
- width="16"
262
- height="14"
263
- viewBox="0 0 16 14"
264
- fill="none"
265
- xmlns="http://www.w3.org/2000/svg"
266
- >
267
- <path
268
- d="M7.42974 10.2188C7.01697 9.80208 6.81059 9.29167 6.81059 8.6875C6.81059 8.08333 7.02783 7.57292 7.46232 7.15625C7.89681 6.73958 8.41819 6.53125 9.02648 6.53125C9.65648 6.53125 10.1887 6.73958 10.6232 7.15625C11.0577 7.57292 11.2749 8.08333 11.2749 8.6875C11.2749 9.27083 11.0577 9.77083 10.6232 10.1875C10.1887 10.6042 9.65648 10.8125 9.02648 10.8125C8.39647 10.8125 7.86422 10.6146 7.42974 10.2188ZM6.58248 11.0312C7.25594 11.6771 8.0706 12 9.02648 12C9.98235 12 10.797 11.6771 11.4705 11.0312C12.1656 10.3854 12.5132 9.60417 12.5132 8.6875C12.5132 7.77083 12.1656 6.98958 11.4705 6.34375C10.797 5.67708 9.98235 5.34375 9.02648 5.34375C8.0706 5.34375 7.25594 5.67708 6.58248 6.34375C5.90903 6.98958 5.5723 7.77083 5.5723 8.6875C5.5723 9.60417 5.90903 10.3854 6.58248 11.0312ZM4.17108 6V4H6.25662V2H11.112L12.3829 3.34375H14.5988C14.9681 3.34375 15.294 3.47917 15.5764 3.75C15.8588 4.02083 16 4.33333 16 4.6875V12.6875C16 13.0417 15.8588 13.3542 15.5764 13.625C15.294 13.875 14.9681 14 14.5988 14H3.48676C3.11745 14 2.79158 13.875 2.50916 13.625C2.22675 13.3542 2.08554 13.0417 2.08554 12.6875V6H4.17108ZM2.08554 2V0H3.48676V2H5.5723V3.34375H3.48676V5.34375H2.08554V3.34375H0V2H2.08554Z"
269
- fill="#6b7280"
270
- />
271
- </svg>
272
- <span>Background Image</span>
273
- </div>
274
- </React.Fragment>
275
- )
276
- }
@@ -1,275 +0,0 @@
1
- import React, { useState, useEffect } from 'react'
2
- import decorators from '../editor/entity-decorator'
3
- import {
4
- AtomicBlockUtils,
5
- EditorState,
6
- RawDraftContentState,
7
- convertToRaw,
8
- convertFromRaw,
9
- } from 'draft-js'
10
- import { BasicEditor } from '../editor/basic-editor'
11
- import { Drawer, DrawerController } from '@keystone-ui/modals'
12
- import { Button } from '@keystone-ui/button'
13
- import draftConverter from '../editor/draft-converter'
14
- import styled from 'styled-components'
15
- import {
16
- VideoSelector as DefaultVideoSelector,
17
- VideoEntity,
18
- VideoEntityWithMeta,
19
- } from './selector/video-selector'
20
- import { AlignSelector } from './selector/align-selector'
21
-
22
- const Label = styled.label`
23
- display: block;
24
- font-weight: 600;
25
- margin: 10px 0;
26
- `
27
-
28
- const VideoInputText = styled.span`
29
- display: inline-block;
30
- margin-right: 10px;
31
- `
32
-
33
- type BGVideoInputOnChange = ({
34
- textBlockAlign,
35
- video,
36
- rawContentState,
37
- }: {
38
- textBlockAlign: string
39
- video?: VideoEntity
40
- rawContentState: RawDraftContentState
41
- }) => void
42
-
43
- type BGVideoInputType = {
44
- textBlockAlign?: string
45
- video?: VideoEntity
46
- rawContentStateForBGVideoEditor?: RawDraftContentState
47
- isOpen: boolean
48
- onChange: BGVideoInputOnChange
49
- onCancel: () => void
50
- VideoSelector: typeof DefaultVideoSelector
51
- }
52
-
53
- export function BGVideoInput(props: BGVideoInputType) {
54
- const {
55
- isOpen,
56
- onChange,
57
- onCancel,
58
- textBlockAlign,
59
- video,
60
- rawContentStateForBGVideoEditor,
61
- VideoSelector = DefaultVideoSelector,
62
- } = props
63
- const rawContentState = rawContentStateForBGVideoEditor || {
64
- blocks: [],
65
- entityMap: {},
66
- }
67
- const options = [
68
- { value: 'fixed', label: 'fixed (default)', isDisabled: false },
69
- { value: 'bottom', label: 'bottom', isDisabled: false },
70
- { value: 'left', label: 'left', isDisabled: false },
71
- { value: 'right', label: 'right', isDisabled: false },
72
- ]
73
- const initialInputValue: {
74
- textBlockAlign: string
75
- video?: VideoEntity
76
- editorStateOfBasicEditor: EditorState
77
- } = {
78
- textBlockAlign: textBlockAlign || 'fixed',
79
- video: video || undefined,
80
- // create an `editorState` from raw content state object
81
- editorStateOfBasicEditor: EditorState.createWithContent(
82
- convertFromRaw(rawContentState),
83
- decorators
84
- ),
85
- }
86
-
87
- const [inputValue, setInputValue] = useState(initialInputValue)
88
- const [toShowVideoSelector, setToShowVideoSelector] = useState(false)
89
-
90
- const clearInputValue = () => {
91
- setInputValue((oldInputValue) => ({
92
- ...oldInputValue,
93
- editorStateOfBasicEditor: EditorState.createWithContent(
94
- convertFromRaw({
95
- blocks: [],
96
- entityMap: {},
97
- }),
98
- decorators
99
- ),
100
- }))
101
- }
102
-
103
- const onVideoSelectorChange = (
104
- selectedVideosWithMeta: VideoEntityWithMeta[]
105
- ) => {
106
- const video = selectedVideosWithMeta?.[0]?.video
107
- if (!video) {
108
- setToShowVideoSelector(false)
109
- return
110
- }
111
-
112
- setInputValue((oldInputValue) => ({
113
- ...oldInputValue,
114
- video: video,
115
- }))
116
- setToShowVideoSelector(false)
117
- }
118
-
119
- useEffect(() => {
120
- if (isOpen) {
121
- setInputValue(initialInputValue)
122
- }
123
- }, [isOpen])
124
-
125
- return (
126
- <>
127
- {toShowVideoSelector && (
128
- <VideoSelector onChange={onVideoSelectorChange} />
129
- )}
130
- <DrawerController isOpen={isOpen}>
131
- <Drawer
132
- title={`Insert Background Video`}
133
- actions={{
134
- cancel: {
135
- label: 'Cancel',
136
- action: () => {
137
- clearInputValue()
138
- onCancel()
139
- },
140
- },
141
- confirm: {
142
- label: 'Confirm',
143
- action: () => {
144
- onChange({
145
- textBlockAlign: inputValue.textBlockAlign,
146
- video: inputValue.video,
147
- // convert `contentState` of the `editorState` into raw content state object
148
- rawContentState: convertToRaw(
149
- inputValue.editorStateOfBasicEditor.getCurrentContent()
150
- ),
151
- })
152
- clearInputValue()
153
- },
154
- },
155
- }}
156
- >
157
- <Label>影片</Label>
158
- <div>
159
- <VideoInputText>
160
- {inputValue.video?.name ? inputValue.video.name : '尚未選取影片'}
161
- </VideoInputText>
162
- <Button
163
- type="button"
164
- onClick={() => setToShowVideoSelector(true)}
165
- tone="passive"
166
- >
167
- 添加影片
168
- </Button>
169
- </div>
170
- <AlignSelector
171
- align={inputValue.textBlockAlign}
172
- options={options}
173
- onChange={(textBlockAlign) => {
174
- setInputValue((oldInputValue) => ({
175
- ...oldInputValue,
176
- textBlockAlign,
177
- }))
178
- }}
179
- />
180
- <Label>內文</Label>
181
- <BasicEditor
182
- editorState={inputValue.editorStateOfBasicEditor}
183
- onChange={(editorStateOfBasicEditor) => {
184
- setInputValue((oldInputValue) => ({
185
- ...oldInputValue,
186
- editorStateOfBasicEditor,
187
- }))
188
- }}
189
- />
190
- </Drawer>
191
- </DrawerController>
192
- </>
193
- )
194
- }
195
-
196
- type BGVideoButtonProps = {
197
- className: string
198
- editorState: EditorState
199
- onChange: ({ editorState }: { editorState: EditorState }) => void
200
- VideoSelector: typeof DefaultVideoSelector
201
- }
202
-
203
- export function BGVideoButton(props: BGVideoButtonProps) {
204
- const [toShowInput, setToShowInput] = useState(false)
205
- const {
206
- className,
207
- editorState,
208
- onChange: onEditorStateChange,
209
- VideoSelector,
210
- } = props
211
-
212
- const onChange: BGVideoInputOnChange = ({
213
- textBlockAlign,
214
- video,
215
- rawContentState,
216
- }) => {
217
- const contentState = editorState.getCurrentContent()
218
-
219
- // create an BGVideo entity
220
- const contentStateWithEntity = contentState.createEntity(
221
- 'BACKGROUNDVIDEO',
222
- 'IMMUTABLE',
223
- {
224
- textBlockAlign,
225
- video,
226
- rawContentState,
227
- body: draftConverter.convertToHtml(rawContentState),
228
- }
229
- )
230
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey()
231
- const newEditorState = EditorState.set(editorState, {
232
- currentContent: contentStateWithEntity,
233
- })
234
-
235
- //The third parameter here is a space string, not an empty string
236
- //If you set an empty string, you will get an error: Unknown DraftEntity key: null
237
- onEditorStateChange(
238
- AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' ')
239
- )
240
- setToShowInput(false)
241
- }
242
-
243
- return (
244
- <React.Fragment>
245
- <BGVideoInput
246
- onChange={onChange}
247
- onCancel={() => {
248
- setToShowInput(false)
249
- }}
250
- isOpen={toShowInput}
251
- VideoSelector={VideoSelector}
252
- />
253
- <div
254
- className={className}
255
- onClick={() => {
256
- setToShowInput(true)
257
- }}
258
- >
259
- <svg
260
- width="16"
261
- height="10"
262
- viewBox="0 0 16 10"
263
- fill="none"
264
- xmlns="http://www.w3.org/2000/svg"
265
- >
266
- <path
267
- d="M10.6667 1.25V8.75C10.6667 9.44036 10.0697 10 9.33333 10H1.33333C0.596944 10 0 9.44036 0 8.75V1.25C0 0.559635 0.596944 0 1.33333 0H9.33333C10.0694 0 10.6667 0.559635 10.6667 1.25ZM16 1.65365V8.34375C16 9.00781 15.1897 9.39557 14.6003 9.01536L11.5556 7.04948V2.95052L14.6 0.982812C15.1917 0.602344 16 0.992188 16 1.65365Z"
268
- fill="#6b7280"
269
- />
270
- </svg>
271
- <span>Background Video</span>
272
- </div>
273
- </React.Fragment>
274
- )
275
- }