@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,170 +0,0 @@
1
- import React, { useState } 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 { TextInput } from '@keystone-ui/fields'
13
- import draftConverter from '../editor/draft-converter'
14
- import styled from 'styled-components'
15
-
16
- const TitleInput = styled(TextInput)`
17
- margin-top: 30px;
18
- margin-bottom: 10px;
19
- `
20
-
21
- type InfoBoxInputType = {
22
- title?: string
23
- rawContentStateForInfoBoxEditor?: RawDraftContentState
24
- isOpen: boolean
25
- onChange: ({
26
- title,
27
- rawContentState,
28
- }: {
29
- title: string
30
- rawContentState: RawDraftContentState
31
- }) => void
32
- onCancel: () => void
33
- }
34
-
35
- export function InfoBoxInput(props: InfoBoxInputType) {
36
- const {
37
- isOpen,
38
- onChange,
39
- onCancel,
40
- title,
41
- rawContentStateForInfoBoxEditor,
42
- } = props
43
- const rawContentState = rawContentStateForInfoBoxEditor || {
44
- blocks: [],
45
- entityMap: {},
46
- }
47
- const initialInputValue = {
48
- title: title || '',
49
- // create an `editorState` from raw content state object
50
- editorStateOfBasicEditor: EditorState.createWithContent(
51
- convertFromRaw(rawContentState),
52
- decorators
53
- ),
54
- }
55
-
56
- const [inputValue, setInputValue] = useState(initialInputValue)
57
-
58
- const clearInputValue = () => {
59
- setInputValue(initialInputValue)
60
- }
61
-
62
- return (
63
- <DrawerController isOpen={isOpen}>
64
- <Drawer
65
- title={`Insert Info Box`}
66
- actions={{
67
- cancel: {
68
- label: 'Cancel',
69
- action: () => {
70
- clearInputValue()
71
- onCancel()
72
- },
73
- },
74
- confirm: {
75
- label: 'Confirm',
76
- action: () => {
77
- onChange({
78
- title: inputValue.title,
79
- // convert `contentState` of the `editorState` into raw content state object
80
- rawContentState: convertToRaw(
81
- inputValue.editorStateOfBasicEditor.getCurrentContent()
82
- ),
83
- })
84
- clearInputValue()
85
- },
86
- },
87
- }}
88
- >
89
- <TitleInput
90
- onChange={(e) =>
91
- setInputValue({
92
- title: e.target.value,
93
- editorStateOfBasicEditor: inputValue.editorStateOfBasicEditor,
94
- })
95
- }
96
- type="text"
97
- placeholder="Title"
98
- value={inputValue.title}
99
- />
100
- <BasicEditor
101
- editorState={inputValue.editorStateOfBasicEditor}
102
- onChange={(editorStateOfBasicEditor) => {
103
- setInputValue({
104
- title: inputValue.title,
105
- editorStateOfBasicEditor,
106
- })
107
- }}
108
- />
109
- </Drawer>
110
- </DrawerController>
111
- )
112
- }
113
-
114
- type InfoBoxButtonProps = {
115
- className: string
116
- editorState: EditorState
117
- onChange: ({ editorState }: { editorState: EditorState }) => void
118
- }
119
-
120
- export function InfoBoxButton(props: InfoBoxButtonProps) {
121
- const [toShowInput, setToShowInput] = useState(false)
122
- const { className, editorState, onChange: onEditorStateChange } = props
123
-
124
- const onChange = ({ title, rawContentState }) => {
125
- const contentState = editorState.getCurrentContent()
126
-
127
- // create an InfoBox entity
128
- const contentStateWithEntity = contentState.createEntity(
129
- 'INFOBOX',
130
- 'IMMUTABLE',
131
- {
132
- title,
133
- rawContentState,
134
- body: draftConverter.convertToHtml(rawContentState),
135
- }
136
- )
137
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey()
138
- const newEditorState = EditorState.set(editorState, {
139
- currentContent: contentStateWithEntity,
140
- })
141
-
142
- //The third parameter here is a space string, not an empty string
143
- //If you set an empty string, you will get an error: Unknown DraftEntity key: null
144
- onEditorStateChange(
145
- AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' ')
146
- )
147
- setToShowInput(false)
148
- }
149
-
150
- return (
151
- <React.Fragment>
152
- <InfoBoxInput
153
- onChange={onChange}
154
- onCancel={() => {
155
- setToShowInput(false)
156
- }}
157
- isOpen={toShowInput}
158
- />
159
- <div
160
- className={className}
161
- onClick={() => {
162
- setToShowInput(true)
163
- }}
164
- >
165
- <i className="far"></i>
166
- <span>InfoBox</span>
167
- </div>
168
- </React.Fragment>
169
- )
170
- }
@@ -1,103 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { AlertDialog } from '@keystone-ui/modals'
3
- import { EditorState, RichUtils } from 'draft-js'
4
- import { TextInput } from '@keystone-ui/fields'
5
-
6
- const styles = {
7
- urlInput: {
8
- fontFamily: "'Georgia', serif",
9
- marginRight: 10,
10
- padding: 10,
11
- },
12
- }
13
-
14
- export function LinkButton(props) {
15
- const { isActive, editorState, onChange } = props
16
-
17
- const [toShowUrlInput, setToShowUrlInput] = useState(false)
18
- const [urlValue, setUrlValue] = useState('')
19
-
20
- const promptForLink = (e) => {
21
- e.preventDefault()
22
- const selection = editorState.getSelection()
23
- if (!selection.isCollapsed()) {
24
- setToShowUrlInput(true)
25
- }
26
- }
27
-
28
- const confirmLink = () => {
29
- const contentState = editorState.getCurrentContent()
30
- const contentStateWithEntity = contentState.createEntity(
31
- 'LINK',
32
- 'MUTABLE',
33
- { url: urlValue }
34
- )
35
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey()
36
- const newEditorState = EditorState.set(editorState, {
37
- currentContent: contentStateWithEntity,
38
- })
39
- onChange(
40
- RichUtils.toggleLink(
41
- newEditorState,
42
- newEditorState.getSelection(),
43
- entityKey
44
- )
45
- )
46
-
47
- setToShowUrlInput(false)
48
- setUrlValue('')
49
- }
50
-
51
- const onLinkInputKeyDown = (e) => {
52
- if (e.which === 13) {
53
- e.preventDefault()
54
- confirmLink()
55
- }
56
- }
57
-
58
- const removeLink = () => {
59
- const selection = editorState.getSelection()
60
- if (!selection.isCollapsed()) {
61
- onChange(RichUtils.toggleLink(editorState, selection, null))
62
- }
63
- setToShowUrlInput(false)
64
- setUrlValue('')
65
- }
66
-
67
- const urlInput = (
68
- <AlertDialog
69
- title="Insert LINK"
70
- isOpen={toShowUrlInput}
71
- actions={{
72
- cancel: {
73
- label: 'Cancel',
74
- action: removeLink,
75
- },
76
- confirm: {
77
- label: 'Confirm',
78
- action: confirmLink,
79
- },
80
- }}
81
- >
82
- <TextInput
83
- onChange={(e) => setUrlValue(e.target.value)}
84
- style={styles.urlInput}
85
- type="text"
86
- value={urlValue}
87
- onKeyDown={onLinkInputKeyDown}
88
- />
89
- </AlertDialog>
90
- )
91
-
92
- return (
93
- <React.Fragment>
94
- {urlInput}
95
- <div
96
- className={props.className}
97
- onMouseDown={isActive ? removeLink : promptForLink}
98
- >
99
- <i className="fas fa-link"></i>
100
- </div>
101
- </React.Fragment>
102
- )
103
- }
@@ -1,120 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { AlertDialog } from '@keystone-ui/modals'
3
- import { AtomicBlockUtils, EditorState } from 'draft-js'
4
- import { TextInput } from '@keystone-ui/fields'
5
-
6
- const styles = {
7
- buttons: {
8
- marginBottom: 10,
9
- display: 'flex',
10
- },
11
- urlInputContainer: {
12
- marginBottom: 10,
13
- },
14
- urlInput: {
15
- fontFamily: "'Georgia', serif",
16
- marginRight: 10,
17
- padding: 3,
18
- },
19
- button: {
20
- marginTop: '10px',
21
- marginRight: '10px',
22
- cursor: 'pointer',
23
- },
24
- }
25
-
26
- export function MediaButton(props) {
27
- const { editorState, onChange, customStyles } = props
28
-
29
- const [toShowUrlInput, setToShowUrlInput] = useState(false)
30
- const [urlValue, setUrlValue] = useState('')
31
- const [urlType, setUrlType] = useState('')
32
-
33
- const promptForMedia = (mediaType) => {
34
- setToShowUrlInput(true)
35
- setUrlValue('')
36
- setUrlType(mediaType)
37
- }
38
-
39
- const confirmMedia = () => {
40
- const contentState = editorState.getCurrentContent()
41
- const contentStateWithEntity = contentState.createEntity(
42
- urlType,
43
- 'IMMUTABLE',
44
- { src: urlValue }
45
- )
46
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey()
47
- const newEditorState = EditorState.set(editorState, {
48
- currentContent: contentStateWithEntity,
49
- })
50
-
51
- // The third parameter here is a space string, not an empty string
52
- // If you set an empty string, you will get an error: Unknown DraftEntity key: null
53
- onChange(AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '))
54
-
55
- setToShowUrlInput(false)
56
- setUrlType('')
57
- }
58
-
59
- const urlInput = (
60
- <AlertDialog
61
- title={`Insert ${urlType.toUpperCase()} LINK`}
62
- isOpen={toShowUrlInput}
63
- actions={{
64
- confirm: {
65
- label: 'Confirm',
66
- action: confirmMedia,
67
- },
68
- cancel: {
69
- label: 'Cancel',
70
- action: () => {
71
- setToShowUrlInput(false)
72
- setUrlValue('')
73
- },
74
- },
75
- }}
76
- >
77
- <TextInput
78
- onChange={(e) => setUrlValue(e.target.value)}
79
- style={styles.urlInput}
80
- type="text"
81
- value={urlValue}
82
- />
83
- </AlertDialog>
84
- )
85
-
86
- return (
87
- <React.Fragment>
88
- {urlInput}
89
- <div style={styles.buttons}>
90
- <div
91
- onClick={() => {
92
- promptForMedia('imageLink')
93
- }}
94
- style={customStyles || styles.button}
95
- >
96
- <i className="fas fa-arrow-up-right-from-square"></i>
97
- <span> Image Link</span>
98
- </div>
99
- <div
100
- onClick={() => {
101
- promptForMedia('audioLink')
102
- }}
103
- style={customStyles || styles.button}
104
- >
105
- <i className="far fa-file-audio"></i>
106
- <span> Audio Link</span>
107
- </div>
108
- <div
109
- onClick={() => {
110
- promptForMedia('videoLink')
111
- }}
112
- style={customStyles || styles.button}
113
- >
114
- <i className="far fa-file-video"></i>
115
- <span> Video Link</span>
116
- </div>
117
- </div>
118
- </React.Fragment>
119
- )
120
- }
@@ -1,81 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { AtomicBlockUtils, EditorState } from 'draft-js'
3
- import {
4
- PostSelector as DefaultPostSelector,
5
- PostEntityWithMeta,
6
- } from './selector/post-selector'
7
-
8
- type RelatedPostButtonProps = {
9
- className: string
10
- editorState: EditorState
11
- onChange: ({ editorState }: { editorState: EditorState }) => void
12
- PostSelector: typeof DefaultPostSelector
13
- }
14
-
15
- export function RelatedPostButton(props: RelatedPostButtonProps) {
16
- const {
17
- editorState,
18
- onChange,
19
- className,
20
- PostSelector = DefaultPostSelector,
21
- } = props
22
-
23
- const [toShowPostSelector, setToShowPostSelector] = useState(false)
24
-
25
- const promptForPostSelector = () => {
26
- setToShowPostSelector(true)
27
- }
28
-
29
- const onPostSelectorChange = (selected: PostEntityWithMeta[]) => {
30
- if (!selected.length) {
31
- setToShowPostSelector(false)
32
- return
33
- }
34
-
35
- const contentState = editorState.getCurrentContent()
36
- const contentStateWithEntity = contentState.createEntity(
37
- 'RELATEDPOST',
38
- 'IMMUTABLE',
39
- {
40
- posts: selected.map((ele) => ele.post),
41
- }
42
- )
43
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey()
44
- const newEditorState = EditorState.set(editorState, {
45
- currentContent: contentStateWithEntity,
46
- })
47
-
48
- // The third parameter here is a space string, not an empty string
49
- // If you set an empty string, you will get an error: Unknown DraftEntity key: null
50
- onChange(AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '))
51
- setToShowPostSelector(false)
52
- }
53
-
54
- return (
55
- <React.Fragment>
56
- {toShowPostSelector && (
57
- <PostSelector
58
- onChange={onPostSelectorChange}
59
- enableMultiSelect={true}
60
- minSelectCount={1}
61
- maxSelectCount={3}
62
- />
63
- )}
64
- <div className={className} onClick={promptForPostSelector}>
65
- <svg
66
- width="16"
67
- height="14"
68
- viewBox="0 0 16 14"
69
- fill="none"
70
- xmlns="http://www.w3.org/2000/svg"
71
- >
72
- <path
73
- d="M14.675 0H10.7917C9.45556 0 8.29445 1.11291 8.00278 2.6837C7.70833 1.11291 6.55 0 5.21389 0H1.33333C0.597222 0 0 0.718549 0 1.6042V9.81905C0 10.7047 0.597222 11.4233 1.33333 11.4233H3.825C6.66389 11.4233 7.51111 12.2387 7.91667 13.9298C7.93611 14.0234 8.06111 14.0234 8.08333 13.9298C8.49167 12.2387 9.33889 11.4233 12.175 11.4233H14.6667C15.4028 11.4233 16 10.7047 16 9.81905V1.60754C16 0.725233 15.4083 0.00668417 14.675 0ZM6.72222 8.8699C6.72222 8.9334 6.68056 8.98687 6.625 8.98687H2.17222C2.11944 8.98687 2.075 8.93674 2.075 8.8699V8.10456C2.075 8.04106 2.11667 7.98759 2.17222 7.98759H6.62778C6.68056 7.98759 6.725 8.03772 6.725 8.10456V8.8699H6.72222ZM6.72222 6.83457C6.72222 6.89807 6.68056 6.95154 6.625 6.95154H2.17222C2.11944 6.95154 2.075 6.90141 2.075 6.83457V6.06923C2.075 6.00573 2.11667 5.95226 2.17222 5.95226H6.62778C6.68056 5.95226 6.725 6.00239 6.725 6.06923V6.83457H6.72222ZM6.72222 4.79924C6.72222 4.86274 6.68056 4.91621 6.625 4.91621H2.17222C2.11944 4.91621 2.075 4.86608 2.075 4.79924V4.0339C2.075 3.9704 2.11667 3.91693 2.17222 3.91693H6.62778C6.68056 3.91693 6.725 3.96706 6.725 4.0339V4.79924H6.72222ZM13.925 8.86656C13.925 8.93005 13.8833 8.98353 13.8278 8.98353H9.375C9.32222 8.98353 9.27778 8.9334 9.27778 8.86656V8.10122C9.27778 8.03772 9.31944 7.98424 9.375 7.98424H13.8306C13.8833 7.98424 13.9278 8.03438 13.9278 8.10122V8.86656H13.925ZM13.925 6.83122C13.925 6.89472 13.8833 6.9482 13.8278 6.9482H9.375C9.32222 6.9482 9.27778 6.89807 9.27778 6.83122V6.06589C9.27778 6.00239 9.31944 5.94891 9.375 5.94891H13.8306C13.8833 5.94891 13.9278 5.99905 13.9278 6.06589V6.83122H13.925ZM13.925 4.79589C13.925 4.85939 13.8833 4.91287 13.8278 4.91287H9.375C9.32222 4.91287 9.27778 4.86274 9.27778 4.79589V4.0339C9.27778 3.9704 9.31944 3.91693 9.375 3.91693H13.8306C13.8833 3.91693 13.9278 3.96706 13.9278 4.0339V4.79589H13.925Z"
74
- fill="#6b7280"
75
- />
76
- </svg>
77
- <span>Related Post</span>
78
- </div>
79
- </React.Fragment>
80
- )
81
- }
@@ -1,65 +0,0 @@
1
- import React, { useEffect, useState } from 'react'
2
- import styled from 'styled-components'
3
- import { Select } from '@keystone-ui/fields'
4
-
5
- const Label = styled.label`
6
- display: block;
7
- margin: 10px 0;
8
- font-weight: 600;
9
- `
10
-
11
- const AlignSelect = styled(Select)`
12
- ${({ menuHeight }) => {
13
- return `margin-bottom: ${menuHeight}px;`
14
- }}
15
- `
16
-
17
- type Option = { label: string; value: string; isDisabled?: boolean }
18
- type AlignSelectorOnChangeFn = (param: string) => void
19
- type Options = Option[]
20
-
21
- export function AlignSelector(props: {
22
- align: string
23
- options: Options
24
- onChange: AlignSelectorOnChangeFn
25
- onOpen?: () => void
26
- }) {
27
- const [isOpen, setIsOpen] = useState(false)
28
- const [menuHeight, setMenuHeight] = useState(0)
29
- const { align, options, onChange, onOpen } = props
30
-
31
- useEffect(() => {
32
- const selectMenu = document.querySelector(
33
- '.css-nabggt-menu'
34
- ) as HTMLElement | null
35
-
36
- if (selectMenu) {
37
- const styles = window.getComputedStyle(selectMenu)
38
- const margin =
39
- parseFloat(styles['marginTop']) + parseFloat(styles['marginBottom'])
40
- setMenuHeight(selectMenu.offsetHeight + margin)
41
- } else {
42
- setMenuHeight(0)
43
- }
44
- if (isOpen && onOpen) {
45
- onOpen()
46
- }
47
- }, [isOpen])
48
- return (
49
- <React.Fragment>
50
- <Label htmlFor="alignment">對齊</Label>
51
- <AlignSelect
52
- id="alignment"
53
- // default align === undefined
54
- value={options.find((option) => option.value === align)}
55
- options={options}
56
- onChange={(option) => {
57
- onChange(option.value)
58
- }}
59
- onMenuOpen={() => setIsOpen(true)}
60
- onMenuClose={() => setIsOpen(false)}
61
- menuHeight={menuHeight}
62
- />
63
- </React.Fragment>
64
- )
65
- }