@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
@@ -1,113 +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_FONT_COLOR = 'FONT_COLOR_'
15
-
16
- export function FontColorButton(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_FONT_COLOR
37
- )
38
- if (colorValue) {
39
- newContentState = Modifier.applyInlineStyle(
40
- newContentState,
41
- selection,
42
- CUSTOM_STYLE_PREFIX_FONT_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_FONT_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
- <i className="fas fa-palette"></i>
110
- </div>
111
- </React.Fragment>
112
- )
113
- }
@@ -1,71 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { AtomicBlockUtils, EditorState } from 'draft-js'
3
-
4
- import { ImageSelector as DefaultImageSelector } from './selector/image-selector'
5
-
6
- export function ImageButton(props: {
7
- editorState: EditorState
8
- onChange: (param: EditorState) => void
9
- className?: string
10
- ImageSelector: typeof DefaultImageSelector
11
- }) {
12
- const {
13
- editorState,
14
- onChange,
15
- className,
16
- ImageSelector = DefaultImageSelector,
17
- } = props
18
-
19
- const [toShowImageSelector, setToShowImageSelector] = useState(false)
20
-
21
- const promptForImageSelector = () => {
22
- setToShowImageSelector(true)
23
- }
24
-
25
- const onImageSelectorChange = (selectedImagesWithMeta, align) => {
26
- const selected = selectedImagesWithMeta?.[0]
27
- if (!selected) {
28
- setToShowImageSelector(false)
29
- return
30
- }
31
-
32
- const contentState = editorState.getCurrentContent()
33
- const contentStateWithEntity = contentState.createEntity(
34
- 'image',
35
- 'IMMUTABLE',
36
- {
37
- ...selected?.image,
38
- desc: selected?.desc,
39
- url: selected?.url,
40
- alignment: align,
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
- setToShowImageSelector(false)
52
- }
53
-
54
- return (
55
- <React.Fragment>
56
- {toShowImageSelector && (
57
- <ImageSelector
58
- onChange={onImageSelectorChange}
59
- enableCaption={true}
60
- enableUrl={true}
61
- enableAlignment={true}
62
- />
63
- )}
64
-
65
- <div className={className} onClick={promptForImageSelector}>
66
- <i className="far fa-image"></i>
67
- <span> Image</span>
68
- </div>
69
- </React.Fragment>
70
- )
71
- }
@@ -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
- }