dante2-editor 0.3.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/dist/Dante2.js +19801 -32971
- data/dist/Dante2.min.js +6 -15
- data/dist/Dante2.min.js.map +1 -1
- data/dist/DanteStyles.css +1 -1
- data/dist/DanteStyles.js +6 -6
- data/dist/DanteStyles.min.js +1 -1
- data/dist/DanteStyles.min.js.map +1 -1
- data/dist/dante-vendors.js +10602 -28851
- data/dist/dante-vendors.min.js +6 -15
- data/dist/dante-vendors.min.js.map +1 -1
- data/dist/fonts/dante.svg +1 -0
- data/docs/app.js +10 -10
- data/docs/app.js.map +1 -1
- data/docs/dante-vendors.js +16906 -31387
- data/docs/dante-vendors.js.map +1 -1
- data/docs/dante.css +168 -0
- data/docs/dante.css.map +1 -1
- data/docs/dante.js +1593 -179
- data/docs/dante.js.map +1 -1
- data/docs/fonts/dante.svg +1 -0
- data/package.json +15 -13
- data/rb_lib/dante2-editor/version.rb +1 -1
- data/src/components/{dante.js → core/dante.js} +12 -20
- data/src/components/{debug.js → core/debug.js} +0 -0
- data/src/components/{dante_editor.js → core/editor.js} +50 -42
- data/src/components/decorators/link.js +2 -1
- data/src/components/init.js +8 -0
- data/src/components/popovers/addButton.js +7 -0
- data/src/components/popovers/toolTip.js +15 -5
- data/src/index.js +4 -3
- data/src/styles/custom.css +189 -0
- data/src/styles/dante/_icons.scss +3 -1
- data/src/styles/dante.scss +2 -0
- data/src/styles/draft.css +5 -0
- data/src/styles/fonts/dante/dante.svg +1 -0
- data/src/utils/find_entities.js +3 -2
- data/src/utils/html2content.js +3 -1
- data/webpack/base.config.js +2 -2
- data/yarn.lock +1781 -1362
- metadata +7 -6
- data/src/components/wrapper.js +0 -0
@@ -1,28 +1,21 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import ReactDOM from 'react-dom'
|
3
|
-
//import Immutable from 'immutable'
|
4
3
|
import { Map, fromJS } from 'immutable'
|
4
|
+
import DanteEditor from './editor.js'
|
5
|
+
import DanteImagePopover from '../popovers/image'
|
6
|
+
import DanteAnchorPopover from '../popovers/link'
|
7
|
+
import DanteInlineTooltip from '../popovers/addButton'
|
8
|
+
import DanteTooltip from '../popovers/toolTip'
|
5
9
|
|
6
|
-
import
|
7
|
-
|
8
|
-
import
|
9
|
-
import
|
10
|
-
|
11
|
-
//import { getSelectionRect, getSelection } from "../utils/selection.js"
|
12
|
-
import DanteInlineTooltip from './popovers/addButton'
|
13
|
-
import DanteTooltip from './popovers/toolTip'
|
14
|
-
//import Link from './decorators/link'
|
15
|
-
|
16
|
-
//import Debug from './debug'
|
17
|
-
//import findEntities from '../utils/find_entities'
|
18
|
-
import ImageBlock from './blocks/image'
|
19
|
-
import EmbedBlock from './blocks/embed'
|
20
|
-
import VideoBlock from './blocks/video'
|
21
|
-
import PlaceholderBlock from './blocks/placeholder'
|
10
|
+
import ImageBlock from '../blocks/image'
|
11
|
+
import EmbedBlock from '../blocks/embed'
|
12
|
+
import VideoBlock from '../blocks/video'
|
13
|
+
import PlaceholderBlock from '../blocks/placeholder'
|
22
14
|
|
23
15
|
import {
|
24
16
|
resetBlockWithType,
|
25
|
-
addNewBlockAt
|
17
|
+
addNewBlockAt
|
18
|
+
} from '../../model/index.js'
|
26
19
|
|
27
20
|
class Dante {
|
28
21
|
constructor(options) {
|
@@ -50,7 +43,6 @@ class Dante {
|
|
50
43
|
defaultOptions.spellcheck = false
|
51
44
|
defaultOptions.title_placeholder = "Title"
|
52
45
|
defaultOptions.body_placeholder = "Write your story"
|
53
|
-
// @defaultOptions.api_key = "86c28a410a104c8bb58848733c82f840"
|
54
46
|
|
55
47
|
defaultOptions.widgets = [{
|
56
48
|
title: 'add an image',
|
@@ -293,4 +285,4 @@ class Dante {
|
|
293
285
|
}
|
294
286
|
}
|
295
287
|
|
296
|
-
|
288
|
+
export default Dante
|
File without changes
|
@@ -7,10 +7,7 @@ import {
|
|
7
7
|
convertToRaw,
|
8
8
|
convertFromRaw,
|
9
9
|
CompositeDecorator,
|
10
|
-
|
11
|
-
getDefaultKeyBinding,
|
12
|
-
//getSelectionOffsetKeyForNode,
|
13
|
-
//KeyBindingUtil,
|
10
|
+
getDefaultKeyBinding,
|
14
11
|
ContentState,
|
15
12
|
Editor,
|
16
13
|
EditorState,
|
@@ -18,20 +15,14 @@ import {
|
|
18
15
|
RichUtils,
|
19
16
|
DefaultDraftBlockRenderMap,
|
20
17
|
SelectionState,
|
21
|
-
Modifier
|
22
|
-
//BlockMapBuilder,
|
23
|
-
//getSafeBodyFromHTML
|
18
|
+
Modifier
|
24
19
|
} from 'draft-js'
|
25
20
|
|
26
|
-
//import DraftPasteProcessor from 'draft-js/lib/DraftPasteProcessor'
|
27
|
-
|
28
21
|
import {
|
29
22
|
convertToHTML,
|
30
23
|
//, convertFromHTML
|
31
24
|
} from 'draft-convert'
|
32
25
|
|
33
|
-
//import isSoftNewlineEvent from 'draft-js/lib/isSoftNewlineEvent'
|
34
|
-
|
35
26
|
import {
|
36
27
|
addNewBlock,
|
37
28
|
resetBlockWithType,
|
@@ -39,26 +30,13 @@ import {
|
|
39
30
|
//updateTextOfBlock,
|
40
31
|
getCurrentBlock,
|
41
32
|
addNewBlockAt
|
42
|
-
} from '
|
43
|
-
|
44
|
-
//import DanteImagePopover from './popovers/image'
|
45
|
-
//import DanteAnchorPopover from './popovers/link'
|
46
|
-
|
47
|
-
//import { getSelectionRect, getSelection } from "../utils/selection.js"
|
48
|
-
//import DanteInlineTooltip from './popovers/addButton'
|
49
|
-
//import DanteTooltip from './popovers/toolTip'
|
50
|
-
import Link from './decorators/link'
|
33
|
+
} from '../../model/index.js'
|
51
34
|
|
35
|
+
import Link from '../decorators/link'
|
52
36
|
import Debug from './debug'
|
53
|
-
import findEntities from '
|
54
|
-
|
55
|
-
|
56
|
-
import EmbedBlock from './blocks/embed'
|
57
|
-
import VideoBlock from './blocks/video'
|
58
|
-
import PlaceholderBlock from './blocks/placeholder'*/
|
59
|
-
|
60
|
-
import SaveBehavior from '../utils/save_content'
|
61
|
-
import customHTML2Content from '../utils/html2content'
|
37
|
+
import findEntities from '../../utils/find_entities'
|
38
|
+
import SaveBehavior from '../../utils/save_content'
|
39
|
+
import customHTML2Content from '../../utils/html2content'
|
62
40
|
|
63
41
|
|
64
42
|
class DanteEditor extends React.Component {
|
@@ -101,6 +79,8 @@ class DanteEditor extends React.Component {
|
|
101
79
|
this.updateBlockData = this.updateBlockData.bind(this)
|
102
80
|
this.setDirection = this.setDirection.bind(this)
|
103
81
|
this.toggleEditable = this.toggleEditable.bind(this)
|
82
|
+
this.disableEditable = this.disableEditable.bind(this)
|
83
|
+
this.enableEditable = this.enableEditable.bind(this)
|
104
84
|
this.closePopOvers = this.closePopOvers.bind(this)
|
105
85
|
this.relocateTooltips = this.relocateTooltips.bind(this)
|
106
86
|
this.tooltipsWithProp = this.tooltipsWithProp.bind(this)
|
@@ -110,6 +90,7 @@ class DanteEditor extends React.Component {
|
|
110
90
|
this.showPopLinkOver = this.showPopLinkOver.bind(this)
|
111
91
|
this.hidePopLinkOver = this.hidePopLinkOver.bind(this)
|
112
92
|
this.render = this.render.bind(this)
|
93
|
+
|
113
94
|
this.decorator = new CompositeDecorator([{
|
114
95
|
strategy: findEntities.bind(null, 'LINK', this),
|
115
96
|
component: Link
|
@@ -143,7 +124,7 @@ class DanteEditor extends React.Component {
|
|
143
124
|
this.extendedBlockRenderMap = DefaultDraftBlockRenderMap.merge(this.blockRenderMap)
|
144
125
|
|
145
126
|
this.state = {
|
146
|
-
editorState: this.
|
127
|
+
editorState: EditorState.createWithContent(convertFromRaw(this.props.content)),
|
147
128
|
read_only: this.props.config.read_only,
|
148
129
|
blockRenderMap: this.extendedBlockRenderMap,
|
149
130
|
locks: 0,
|
@@ -172,6 +153,14 @@ class DanteEditor extends React.Component {
|
|
172
153
|
editorState: this.state.editorState,
|
173
154
|
editorContent: this.emitSerializedOutput()
|
174
155
|
})
|
156
|
+
|
157
|
+
// TODO: fix this amateur mode
|
158
|
+
// here we add a new contentstate with the decorator in order to get contentState
|
159
|
+
setTimeout(()=>{
|
160
|
+
let newEditorState = EditorState.set(this.decodeEditorContent(this.props.content), {decorator: this.decorator});
|
161
|
+
this.onChange(newEditorState)
|
162
|
+
}, 0)
|
163
|
+
|
175
164
|
}
|
176
165
|
|
177
166
|
initializeState() {
|
@@ -183,6 +172,12 @@ class DanteEditor extends React.Component {
|
|
183
172
|
}
|
184
173
|
}
|
185
174
|
|
175
|
+
decodeEditorContent(raw_as_json) {
|
176
|
+
const new_content = convertFromRaw(raw_as_json)
|
177
|
+
let editorState
|
178
|
+
return editorState = EditorState.createWithContent(new_content, this.decorator)
|
179
|
+
}
|
180
|
+
|
186
181
|
refreshSelection(newEditorState) {
|
187
182
|
const { editorState } = this.state
|
188
183
|
// Setting cursor position after inserting to content
|
@@ -250,7 +245,9 @@ class DanteEditor extends React.Component {
|
|
250
245
|
return this.save.editorContent = content
|
251
246
|
}
|
252
247
|
|
253
|
-
focus() {
|
248
|
+
focus() {
|
249
|
+
//debugger
|
250
|
+
}
|
254
251
|
//@props.refs.richEditor.focus()
|
255
252
|
|
256
253
|
getEditorState() {
|
@@ -263,13 +260,6 @@ class DanteEditor extends React.Component {
|
|
263
260
|
return raw
|
264
261
|
}
|
265
262
|
|
266
|
-
decodeEditorContent(raw_as_json) {
|
267
|
-
const new_content = convertFromRaw(raw_as_json)
|
268
|
-
let editorState
|
269
|
-
|
270
|
-
return editorState = EditorState.createWithContent(new_content, this.decorator)
|
271
|
-
}
|
272
|
-
|
273
263
|
//# title utils
|
274
264
|
getTextFromEditor() {
|
275
265
|
const c = this.state.editorState.getCurrentContent()
|
@@ -354,6 +344,9 @@ class DanteEditor extends React.Component {
|
|
354
344
|
getEditorState: this.getEditorState,
|
355
345
|
setEditorState: this.onChange,
|
356
346
|
addLock: this.addLock,
|
347
|
+
toggleEditable: this.toggleEditable,
|
348
|
+
disableEditable: this.disableEditable,
|
349
|
+
enableEditable: this.enableEditable,
|
357
350
|
removeLock: this.removeLock,
|
358
351
|
getLocks: this.getLocks,
|
359
352
|
config: dataBlock.options
|
@@ -405,6 +398,7 @@ class DanteEditor extends React.Component {
|
|
405
398
|
|
406
399
|
return setTimeout(() => {
|
407
400
|
const items = this.tooltipsWithProp(prop)
|
401
|
+
console.log(items)
|
408
402
|
return items.map(o => {
|
409
403
|
this.refs[o.ref].display(display)
|
410
404
|
return this.refs[o.ref].relocate()
|
@@ -571,6 +565,7 @@ class DanteEditor extends React.Component {
|
|
571
565
|
|
572
566
|
if (currentBlock.getText().length > 0) {
|
573
567
|
|
568
|
+
/*
|
574
569
|
if (blockType === "unstyled") {
|
575
570
|
// hack hackety hack
|
576
571
|
// https://github.com/facebook/draft-js/issues/304
|
@@ -590,7 +585,7 @@ class DanteEditor extends React.Component {
|
|
590
585
|
}, 0)
|
591
586
|
|
592
587
|
return true
|
593
|
-
}
|
588
|
+
}*/
|
594
589
|
|
595
590
|
if (config_block && config_block.handleEnterWithText) {
|
596
591
|
config_block.handleEnterWithText(this, currentBlock)
|
@@ -780,10 +775,22 @@ class DanteEditor extends React.Component {
|
|
780
775
|
//# read only utils
|
781
776
|
toggleEditable() {
|
782
777
|
this.closePopOvers()
|
783
|
-
|
784
778
|
return this.setState({ read_only: !this.state.read_only }, this.testEmitAndDecode)
|
785
779
|
}
|
786
780
|
|
781
|
+
disableEditable() {
|
782
|
+
console.log("in !!")
|
783
|
+
this.closePopOvers()
|
784
|
+
return this.setState({ read_only: true }, this.testEmitAndDecode)
|
785
|
+
}
|
786
|
+
|
787
|
+
enableEditable() {
|
788
|
+
this.closePopOvers()
|
789
|
+
console.log("out !!")
|
790
|
+
|
791
|
+
return this.setState({ read_only: false }, this.testEmitAndDecode)
|
792
|
+
}
|
793
|
+
|
787
794
|
closePopOvers() {
|
788
795
|
return this.tooltips.map(o => {
|
789
796
|
return this.refs[o.ref].hide()
|
@@ -870,7 +877,8 @@ class DanteEditor extends React.Component {
|
|
870
877
|
<hr className="section-divider" />
|
871
878
|
</div>
|
872
879
|
<div className="section-content">
|
873
|
-
<div ref="richEditor"
|
880
|
+
<div ref="richEditor"
|
881
|
+
className="section-inner layoutSingleColumn"
|
874
882
|
onClick={ this.focus }>
|
875
883
|
<Editor
|
876
884
|
blockRendererFn={ this.blockRenderer }
|
@@ -928,4 +936,4 @@ class DanteEditor extends React.Component {
|
|
928
936
|
}
|
929
937
|
}
|
930
938
|
|
931
|
-
|
939
|
+
export default DanteEditor
|
@@ -46,7 +46,8 @@ export default class Link extends React.Component {
|
|
46
46
|
}
|
47
47
|
|
48
48
|
render() {
|
49
|
-
this.data =
|
49
|
+
this.data = this.props.contentState.getEntity(this.props.entityKey).getData()
|
50
|
+
//Entity.get(this.props.entityKey).getData()
|
50
51
|
|
51
52
|
return (
|
52
53
|
<a
|
@@ -152,6 +152,11 @@ class DanteInlineTooltip extends React.Component {
|
|
152
152
|
return this.insertImage(fileList[0])
|
153
153
|
}
|
154
154
|
|
155
|
+
handleInsertion(e){
|
156
|
+
this.hide()
|
157
|
+
return this.props.onChange(addNewBlock(this.props.editorState, e.type, {}))
|
158
|
+
}
|
159
|
+
|
155
160
|
widgets() {
|
156
161
|
return this.props.editor.widgets
|
157
162
|
}
|
@@ -164,6 +169,8 @@ class DanteInlineTooltip extends React.Component {
|
|
164
169
|
return this.clickOnFileUpload(e, request_block)
|
165
170
|
case "placeholder":
|
166
171
|
return this.handlePlaceholder(request_block)
|
172
|
+
case "insertion":
|
173
|
+
return this.handleInsertion(request_block)
|
167
174
|
default:
|
168
175
|
return console.log(`WRONG TYPE FOR ${ request_block.widget_options.insertion }`)
|
169
176
|
}
|
@@ -207,8 +207,9 @@ class DanteTooltip extends React.Component {
|
|
207
207
|
showPopLinkOver: this.props.showPopLinkOver,
|
208
208
|
hidePopLinkOver: this.props.hidePopLinkOver
|
209
209
|
}
|
210
|
-
|
210
|
+
|
211
211
|
let entityKey = Entity.create('LINK', 'MUTABLE', opts)
|
212
|
+
//contentState.createEntity('LINK', 'MUTABLE', opts)
|
212
213
|
|
213
214
|
if (selection.isCollapsed()) {
|
214
215
|
console.log("COLLAPSED SKIPPING LINK")
|
@@ -241,16 +242,17 @@ class DanteTooltip extends React.Component {
|
|
241
242
|
if (this.refs.dante_menu_input) {
|
242
243
|
this.refs.dante_menu_input.value = ""
|
243
244
|
}
|
244
|
-
|
245
|
+
|
245
246
|
let currentBlock = getCurrentBlock(this.props.editorState)
|
246
247
|
let blockType = currentBlock.getType()
|
247
248
|
let selection = this.props.editor.state.editorState.getSelection()
|
249
|
+
let contentState = this.props.editorState.getCurrentContent()
|
248
250
|
let selectedEntity = null
|
249
251
|
let defaultUrl = null
|
250
252
|
return currentBlock.findEntityRanges(character => {
|
251
253
|
let entityKey = character.getEntity()
|
252
254
|
selectedEntity = entityKey
|
253
|
-
return entityKey !== null &&
|
255
|
+
return entityKey !== null && contentState.getEntity(entityKey).getType() === 'LINK'
|
254
256
|
}, (start, end) => {
|
255
257
|
let selStart = selection.getAnchorOffset()
|
256
258
|
let selEnd = selection.getFocusOffset()
|
@@ -260,7 +262,7 @@ class DanteTooltip extends React.Component {
|
|
260
262
|
}
|
261
263
|
|
262
264
|
if (start === selStart && end === selEnd) {
|
263
|
-
defaultUrl =
|
265
|
+
defaultUrl = contentState.getEntity(selectedEntity).getData().url
|
264
266
|
return this.refs.dante_menu_input.value = defaultUrl
|
265
267
|
}
|
266
268
|
})
|
@@ -296,11 +298,14 @@ class DanteTooltip extends React.Component {
|
|
296
298
|
/>
|
297
299
|
})
|
298
300
|
}
|
301
|
+
|
299
302
|
<DanteTooltipLink
|
300
303
|
editorState={ this.props.editorState }
|
301
304
|
enableLinkMode={ this._enableLinkMode }
|
302
305
|
/>
|
303
|
-
|
306
|
+
|
307
|
+
|
308
|
+
{ this.inlineItems().map( (item, i) => {
|
304
309
|
return <DanteTooltipItem
|
305
310
|
key={ i }
|
306
311
|
item={ item }
|
@@ -398,5 +403,10 @@ class DanteTooltipLink extends React.Component {
|
|
398
403
|
}
|
399
404
|
}
|
400
405
|
|
406
|
+
|
407
|
+
|
408
|
+
|
409
|
+
|
410
|
+
|
401
411
|
export default DanteTooltip
|
402
412
|
|
data/src/index.js
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
|
2
|
-
import Dante from './components/
|
3
|
-
import DanteEditor from './components/dante_editor'
|
2
|
+
import {DanteEditor, Dante} from './components/init.js'
|
4
3
|
|
4
|
+
window.Dante = Dante
|
5
|
+
window.DanteEditor = DanteEditor
|
5
6
|
|
6
|
-
|
7
|
+
export {
|
7
8
|
Dante,
|
8
9
|
DanteEditor
|
9
10
|
}
|
@@ -0,0 +1,189 @@
|
|
1
|
+
.signature {
|
2
|
+
position: relative;
|
3
|
+
display: table;
|
4
|
+
float: left;
|
5
|
+
margin-bottom: 20px;
|
6
|
+
}
|
7
|
+
|
8
|
+
.signature img {
|
9
|
+
float: left;
|
10
|
+
margin-right: 30px;
|
11
|
+
margin-bottom: 0!important;
|
12
|
+
height: 100px;
|
13
|
+
width: 100px;
|
14
|
+
border-radius: 50px;
|
15
|
+
}
|
16
|
+
|
17
|
+
.signature .text {
|
18
|
+
width: 100%;
|
19
|
+
display: table-cell;
|
20
|
+
vertical-align: middle;
|
21
|
+
}
|
22
|
+
|
23
|
+
.signature .text p {
|
24
|
+
margin-bottom: 0!important;
|
25
|
+
}
|
26
|
+
|
27
|
+
.dante-clearfix:after {
|
28
|
+
clear:both
|
29
|
+
}
|
30
|
+
.dante-clearfix:before{
|
31
|
+
display: table;
|
32
|
+
content: " ";
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
.dropdown .btn {
|
38
|
+
color: #BEC2CC;
|
39
|
+
padding: 0 10px;
|
40
|
+
width: auto;
|
41
|
+
font-size: 12px;
|
42
|
+
}
|
43
|
+
|
44
|
+
.text-toolbar button {
|
45
|
+
position: relative;
|
46
|
+
float: left;
|
47
|
+
height: 40px;
|
48
|
+
width: 40px;
|
49
|
+
background: transparent;
|
50
|
+
border: 0;
|
51
|
+
padding: 0;
|
52
|
+
cursor: pointer;
|
53
|
+
padding: 0;
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
// dropdown
|
58
|
+
|
59
|
+
.dropdown {
|
60
|
+
float: left;
|
61
|
+
}
|
62
|
+
|
63
|
+
.dropdown, .dropup {
|
64
|
+
position: relative;
|
65
|
+
}
|
66
|
+
|
67
|
+
.dropdown .btn {
|
68
|
+
color: #BEC2CC;
|
69
|
+
padding: 0 10px;
|
70
|
+
width: auto;
|
71
|
+
font-size: 12px;
|
72
|
+
}
|
73
|
+
|
74
|
+
.dante-menu-button.visible-overflow{
|
75
|
+
overflow:visible;
|
76
|
+
}
|
77
|
+
|
78
|
+
.dante-menu-button button {
|
79
|
+
position: relative;
|
80
|
+
float: left;
|
81
|
+
height: 40px;
|
82
|
+
width: 40px;
|
83
|
+
background: transparent !important;
|
84
|
+
border: 0;
|
85
|
+
padding: 0;
|
86
|
+
cursor: pointer;
|
87
|
+
padding: 0;
|
88
|
+
}
|
89
|
+
|
90
|
+
.dropdown .dropdown-menu {
|
91
|
+
background: #2A2B32;
|
92
|
+
padding: 0;
|
93
|
+
max-height: 300px;
|
94
|
+
overflow-y: auto;
|
95
|
+
width: auto;
|
96
|
+
min-width: 60px;
|
97
|
+
}
|
98
|
+
|
99
|
+
.open>.dropdown-menu {
|
100
|
+
display: block;
|
101
|
+
}
|
102
|
+
|
103
|
+
.dropdown-menu {
|
104
|
+
position: absolute;
|
105
|
+
top: 100%;
|
106
|
+
left: 0;
|
107
|
+
z-index: 1000;
|
108
|
+
display: none;
|
109
|
+
float: left;
|
110
|
+
min-width: 160px;
|
111
|
+
padding: 5px 0;
|
112
|
+
margin: 2px 0 0;
|
113
|
+
font-size: 14px;
|
114
|
+
text-align: left;
|
115
|
+
list-style: none;
|
116
|
+
background-color: #fff;
|
117
|
+
-webkit-background-clip: padding-box;
|
118
|
+
background-clip: padding-box;
|
119
|
+
border: 1px solid #ccc;
|
120
|
+
border: 1px solid rgba(0,0,0,.15);
|
121
|
+
border-radius: 4px;
|
122
|
+
-webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
|
123
|
+
box-shadow: 0 6px 12px rgba(0,0,0,.175);
|
124
|
+
}
|
125
|
+
|
126
|
+
.dropdown .dropdown-menu li {
|
127
|
+
border-bottom: 1px solid #383943;
|
128
|
+
}
|
129
|
+
|
130
|
+
.editor .container .content-edit .text-toolbar .dropdown .dropdown-menu li a {
|
131
|
+
color: #BEC2CC;
|
132
|
+
font-size: 12px;
|
133
|
+
padding: 0 10px;
|
134
|
+
line-height: 30px;
|
135
|
+
}
|
136
|
+
|
137
|
+
.dropdown-menu>li>a {
|
138
|
+
display: block;
|
139
|
+
padding: 3px 20px;
|
140
|
+
clear: both;
|
141
|
+
font-weight: 400;
|
142
|
+
line-height: 1.42857143;
|
143
|
+
color: #fff;
|
144
|
+
white-space: nowrap;
|
145
|
+
}
|
146
|
+
|
147
|
+
.btn-default.active, .btn-default:active, .open>.dropdown-toggle.btn-default {
|
148
|
+
color: #fff;
|
149
|
+
background-color: #e6e6e6;
|
150
|
+
border-color: #adadad;
|
151
|
+
}
|
152
|
+
|
153
|
+
.btn-default.active, .btn-default:active, .open>.dropdown-toggle.btn-default {
|
154
|
+
background-image: none;
|
155
|
+
}
|
156
|
+
|
157
|
+
.btn-default.active, .btn-default:active, .open>.dropdown-toggle.btn-default {
|
158
|
+
color: #fff;
|
159
|
+
background-color: #e6e6e6;
|
160
|
+
border-color: #adadad;
|
161
|
+
}
|
162
|
+
|
163
|
+
.btn-default {
|
164
|
+
color: #fff;
|
165
|
+
background-color: #fff;
|
166
|
+
border-color: #ccc;
|
167
|
+
}
|
168
|
+
|
169
|
+
.btn {
|
170
|
+
display: inline-block;
|
171
|
+
padding: 6px 12px;
|
172
|
+
margin-bottom: 0;
|
173
|
+
font-size: 14px;
|
174
|
+
font-weight: 400;
|
175
|
+
line-height: 1.42857143;
|
176
|
+
text-align: center;
|
177
|
+
white-space: nowrap;
|
178
|
+
vertical-align: middle;
|
179
|
+
-ms-touch-action: manipulation;
|
180
|
+
touch-action: manipulation;
|
181
|
+
cursor: pointer;
|
182
|
+
-webkit-user-select: none;
|
183
|
+
-moz-user-select: none;
|
184
|
+
-ms-user-select: none;
|
185
|
+
user-select: none;
|
186
|
+
background-image: none;
|
187
|
+
border: 1px solid transparent;
|
188
|
+
border-radius: 4px;
|
189
|
+
}
|
@@ -45,11 +45,13 @@
|
|
45
45
|
line-height: 1;
|
46
46
|
|
47
47
|
// Better Font Rendering
|
48
|
-
|
48
|
+
-webkit-font-smoothing: antialiased;
|
49
49
|
-moz-osx-font-smoothing: grayscale;
|
50
50
|
}
|
51
51
|
}
|
52
52
|
|
53
|
+
.dante-icon-divider:before { content: "\e904"; }
|
54
|
+
|
53
55
|
.dante-icon-image-center:before { content: "\e900"; }
|
54
56
|
.dante-icon-image-fill:before { content: "\e901"; }
|
55
57
|
.dante-icon-image-left:before { content: "\e902"; }
|
data/src/styles/dante.scss
CHANGED
data/src/styles/draft.css
CHANGED
@@ -18,6 +18,11 @@
|
|
18
18
|
position: relative;
|
19
19
|
}
|
20
20
|
|
21
|
+
// HACK FOR ISSUE https://github.com/facebook/draft-js/issues/304 , proposal from @bradbumbalough
|
22
|
+
.DraftEditor-root {
|
23
|
+
overflow: auto;
|
24
|
+
}
|
25
|
+
|
21
26
|
/**
|
22
27
|
* Zero-opacity background used to allow focus in IE. Otherwise, clicks
|
23
28
|
* fall through to the placeholder.
|
@@ -15,4 +15,5 @@
|
|
15
15
|
<glyph unicode="" glyph-name="image-fill" horiz-adv-x="1152" d="M128 128h896v-96h-896v96zM0 896h1152v-672h-1152v672z" />
|
16
16
|
<glyph unicode="" glyph-name="image-left" horiz-adv-x="1152" d="M256 128h896v-96h-896v96zM768 320h384v-96h-384v96zM0 704h672v-480h-672v480zM768 512h384v-96h-384v96zM768 704h384v-96h-384v96zM256 896h896v-96h-896v96z" />
|
17
17
|
<glyph unicode="" glyph-name="image-wide" horiz-adv-x="1152" d="M128 128h896v-96h-896v96zM0 704h1152v-480h-1152v480zM128 896h896v-96h-896v96z" />
|
18
|
+
<glyph unicode="" glyph-name="divider" d="M0 13v6c0 0.552 0.448 1 1 1h30c0.552 0 1-0.448 1-1v-6c0-0.552-0.448-1-1-1h-30c-0.552 0-1 0.448-1 1z" />
|
18
19
|
</font></defs></svg>
|
data/src/utils/find_entities.js
CHANGED
@@ -5,11 +5,12 @@ const findEntities = (entityType, instance, contentBlock, callback) => {
|
|
5
5
|
return contentBlock.findEntityRanges((function(_this) {
|
6
6
|
return function(character) {
|
7
7
|
var entityKey, opts, res
|
8
|
+
let contentState = instance.state.editorState.getCurrentContent()
|
8
9
|
entityKey = character.getEntity()
|
9
|
-
return (res = entityKey !== null &&
|
10
|
+
return (res = entityKey !== null && contentState.getEntity(entityKey).getType() === entityType, res ? (opts = {
|
10
11
|
showPopLinkOver: instance.showPopLinkOver,
|
11
12
|
hidePopLinkOver: instance.hidePopLinkOver
|
12
|
-
},
|
13
|
+
}, contentState.mergeEntityData(entityKey, opts)) : void 0, res)
|
13
14
|
}
|
14
15
|
})(this), callback)
|
15
16
|
}
|
data/src/utils/html2content.js
CHANGED
@@ -89,11 +89,13 @@ let customHTML2Content = function(HTML, blockRn){
|
|
89
89
|
// use DraftJS converter to do initial conversion. I don't provide DOMBuilder and
|
90
90
|
// blockRenderMap arguments here since it should fall back to its default ones, which are fine
|
91
91
|
console.log(tempDoc.body.innerHTML)
|
92
|
-
let
|
92
|
+
let content = convertFromHTML(tempDoc.body.innerHTML,
|
93
93
|
getSafeBodyFromHTML,
|
94
94
|
blockRn
|
95
95
|
)
|
96
96
|
|
97
|
+
let contentBlocks = content.contentBlocks
|
98
|
+
|
97
99
|
// now replace <blockquote /> ContentBlocks with 'atomic' ones
|
98
100
|
contentBlocks = contentBlocks.map(function(block){
|
99
101
|
let newBlock
|
data/webpack/base.config.js
CHANGED
@@ -47,10 +47,10 @@ const baseConfig = {
|
|
47
47
|
loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader!sass-loader' })
|
48
48
|
},
|
49
49
|
|
50
|
-
{ test: path.resolve("./src/components/dante_editor.js"),
|
50
|
+
{ test: path.resolve("./src/components/core/dante_editor.js"),
|
51
51
|
loaders: ["expose-loader?DanteEditor", "babel-loader?presets[]=es2015"]},
|
52
52
|
|
53
|
-
{ test: path.resolve("./src/components/dante.js"),
|
53
|
+
{ test: path.resolve("./src/components/core/dante.js"),
|
54
54
|
loaders: ["expose-loader?Dante", "babel-loader?presets[]=es2015"]},
|
55
55
|
|
56
56
|
{
|