dante2-editor 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.babelrc +20 -0
- data/.eslint +13 -0
- data/.gitignore +15 -0
- data/README.md +5 -1
- data/dante2.gemspec +2 -4
- data/{app → demo}/assets/index.html +2 -2
- data/{app → demo}/assets/license.html +1 -1
- data/{app → demo}/assets/options.html +1 -5
- data/{app → demo}/assets/store.json +0 -0
- data/demo/data/poc.js +9 -0
- data/demo/demo.js +9 -0
- data/demo/initialize.js +7 -0
- data/{app → demo}/styles/layout/layout.scss +0 -0
- data/{app → demo}/styles/layout/normalize.css +0 -0
- data/{app → demo}/styles/layout/scaffold.scss +0 -0
- data/{app → demo}/styles/layout/tooltips.scss +0 -0
- data/dist/Dante2.js +2995 -0
- data/dist/Dante2.min.js +3 -0
- data/dist/Dante2.min.js.map +1 -0
- data/dist/DanteStyles.css +2 -0
- data/dist/DanteStyles.css.map +1 -0
- data/dist/DanteStyles.js +102 -0
- data/dist/DanteStyles.min.js +2 -0
- data/dist/DanteStyles.min.js.map +1 -0
- data/dist/dante-vendors.js +48316 -0
- data/dist/dante-vendors.min.js +29 -0
- data/dist/dante-vendors.min.js.map +1 -0
- data/{app/styles/fonts/dante → dist/fonts}/dante.eot +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/dante.svg +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/dante.ttf +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/dante.woff +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/fontello.eot +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/fontello.svg +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/fontello.ttf +0 -0
- data/{app/styles/fonts/dante → dist/fonts}/fontello.woff +0 -0
- data/docs/app.css +430 -1
- data/docs/app.css.map +1 -1
- data/docs/app.js +62 -2
- data/docs/app.js.map +1 -1
- data/docs/dante-vendors.js +49513 -22
- data/docs/dante-vendors.js.map +1 -1
- data/docs/dante.css +1602 -1
- data/docs/dante.css.map +1 -1
- data/docs/dante.js +3310 -3
- data/docs/dante.js.map +1 -1
- data/docs/doc.html +3 -7
- data/docs/index.html +4 -4
- data/docs/license.html +3 -3
- data/docs/options.html +53 -0
- data/package.json +47 -17
- data/rb_lib/dante2-editor/rails.rb +15 -0
- data/{lib → rb_lib}/dante2-editor/version.rb +1 -1
- data/{lib → rb_lib}/dante2-editor.rb +0 -0
- data/src/components/blocks/embed.js +126 -0
- data/src/components/blocks/image.js +377 -0
- data/src/components/blocks/placeholder.js +68 -0
- data/src/components/blocks/video.js +80 -0
- data/src/components/dante.js +291 -0
- data/src/components/dante_editor.js +928 -0
- data/src/components/debug.js +104 -0
- data/src/components/decorators/link.js +64 -0
- data/src/components/popovers/addButton.js +318 -0
- data/src/components/popovers/image.js +188 -0
- data/src/components/popovers/link.js +107 -0
- data/src/components/popovers/toolTip.js +402 -0
- data/{app/utils/logger.coffee → src/components/wrapper.js} +0 -0
- data/{app → src}/images/dante/media-loading-placeholder.png +0 -0
- data/{app → src}/images/site/dante-demo.png +0 -0
- data/{app → src}/images/site/dante-editor-logo.png +0 -0
- data/{app → src}/images/site/github-logo.png +0 -0
- data/src/index.js +9 -0
- data/{app → src}/model/index.js +0 -0
- data/src/style.js +3 -0
- data/{app → src}/styles/dante/_animations.scss +0 -0
- data/{app → src}/styles/dante/_caption.scss +0 -0
- data/{app → src}/styles/dante/_debug.scss +0 -0
- data/{app → src}/styles/dante/_fonts.scss +0 -0
- data/{app → src}/styles/dante/_graf.scss +0 -0
- data/{app → src}/styles/dante/_icons.scss +0 -0
- data/{app → src}/styles/dante/_media.scss +0 -0
- data/{app → src}/styles/dante/_menu.scss +0 -0
- data/{app → src}/styles/dante/_needsorder.scss +0 -0
- data/{app → src}/styles/dante/_popover.scss +0 -0
- data/{app → src}/styles/dante/_post.scss +0 -0
- data/{app → src}/styles/dante/_scaffold.scss +0 -0
- data/{app → src}/styles/dante/_tooltip.scss +0 -0
- data/{app → src}/styles/dante/_utilities.scss +0 -0
- data/{app → src}/styles/dante/_variables.scss +0 -0
- data/{app → src}/styles/dante/blame.scss +0 -0
- data/{app → src}/styles/dante.scss +0 -0
- data/{app → src}/styles/draft.css +0 -0
- data/src/styles/fonts/dante/dante.eot +0 -0
- data/src/styles/fonts/dante/dante.svg +18 -0
- data/src/styles/fonts/dante/dante.ttf +0 -0
- data/src/styles/fonts/dante/dante.woff +0 -0
- data/src/styles/fonts/dante/fontello.eot +0 -0
- data/src/styles/fonts/dante/fontello.svg +36 -0
- data/src/styles/fonts/dante/fontello.ttf +0 -0
- data/src/styles/fonts/dante/fontello.woff +0 -0
- data/src/utils/find_entities.js +17 -0
- data/src/utils/html2content.js +127 -0
- data/src/utils/save_content.js +80 -0
- data/{app → src}/utils/selection.js +0 -0
- data/tools/.eslintrc +9 -0
- data/tools/amd/README.md +7 -0
- data/tools/amd/bower.json +19 -0
- data/tools/amd/build.js +36 -0
- data/tools/build-cli.js +46 -0
- data/tools/build.js +30 -0
- data/tools/buildBabel.js +32 -0
- data/tools/constants.js +10 -0
- data/tools/dist/build.js +13 -0
- data/tools/docs/build.js +12 -0
- data/tools/es/build.js +27 -0
- data/tools/exec.js +50 -0
- data/tools/fs-utils.js +35 -0
- data/tools/lib/build.js +14 -0
- data/tools/promisify.js +14 -0
- data/webpack/base.config.js +89 -0
- data/webpack/docs.config.js +147 -0
- data/webpack/webpack.config.js +78 -0
- data/webpack.config-doc.js +5 -0
- data/webpack.config.js +3 -147
- data/yarn.lock +973 -718
- metadata +108 -64
- data/app/components/App.cjsx +0 -1083
- data/app/components/blocks/embed.cjsx +0 -109
- data/app/components/blocks/image.cjsx +0 -316
- data/app/components/blocks/placeholder.cjsx +0 -60
- data/app/components/blocks/video.cjsx +0 -75
- data/app/components/debug.cjsx +0 -96
- data/app/components/decorators/link.cjsx +0 -61
- data/app/components/popovers/addButton.cjsx +0 -247
- data/app/components/popovers/image.cjsx +0 -160
- data/app/components/popovers/link.cjsx +0 -87
- data/app/components/popovers/toolTip.cjsx +0 -326
- data/app/data/poc.js +0 -15
- data/app/demo.js +0 -7
- data/app/initialize.js +0 -4
- data/app/utils/find_entities.coffee +0 -20
- data/app/utils/html2content.coffee +0 -120
- data/app/utils/save_content.coffee +0 -63
- data/lib/dante2-editor/rails.rb +0 -16
@@ -1,109 +0,0 @@
|
|
1
|
-
|
2
|
-
React = require('react')
|
3
|
-
ReactDOM = require('react-dom')
|
4
|
-
|
5
|
-
{
|
6
|
-
Entity,
|
7
|
-
RichUtils
|
8
|
-
AtomicBlockUtils
|
9
|
-
EditorBlock
|
10
|
-
} = require('draft-js')
|
11
|
-
|
12
|
-
axios = require("axios")
|
13
|
-
|
14
|
-
{ updateDataOfBlock } = require('../../model/index.js')
|
15
|
-
|
16
|
-
class EmbedBlock extends React.Component
|
17
|
-
constructor: (props) ->
|
18
|
-
super props
|
19
|
-
#api_key = "86c28a410a104c8bb58848733c82f840"
|
20
|
-
|
21
|
-
@state =
|
22
|
-
embed_data: @defaultData()
|
23
|
-
error: ""
|
24
|
-
|
25
|
-
defaultData: ->
|
26
|
-
existing_data = @.props.block.getData().toJS()
|
27
|
-
existing_data.embed_data || {}
|
28
|
-
|
29
|
-
# will update block state
|
30
|
-
updateData: =>
|
31
|
-
blockProps = @.props.blockProps
|
32
|
-
block = @.props.block
|
33
|
-
getEditorState = @props.blockProps.getEditorState
|
34
|
-
setEditorState = @props.blockProps.setEditorState
|
35
|
-
data = block.getData();
|
36
|
-
newData = data.merge(@state)
|
37
|
-
setEditorState(updateDataOfBlock(getEditorState(), block, newData))
|
38
|
-
|
39
|
-
dataForUpdate: =>
|
40
|
-
|
41
|
-
@.props.blockProps.data.toJS()
|
42
|
-
|
43
|
-
componentDidMount: =>
|
44
|
-
|
45
|
-
return unless @.props.blockProps.data
|
46
|
-
|
47
|
-
# ensure data isnt already loaded
|
48
|
-
# unless @dataForUpdate().endpoint or @dataForUpdate().provisory_text
|
49
|
-
|
50
|
-
unless @dataForUpdate().endpoint or @dataForUpdate().provisory_text
|
51
|
-
#debugger
|
52
|
-
return
|
53
|
-
|
54
|
-
axios
|
55
|
-
method: 'get'
|
56
|
-
url: "#{@dataForUpdate().endpoint}#{@dataForUpdate().provisory_text}&scheme=https"
|
57
|
-
.then (result)=>
|
58
|
-
|
59
|
-
@setState
|
60
|
-
embed_data: result.data #JSON.parse(data.responseText)
|
61
|
-
, @updateData
|
62
|
-
.catch (error)=>
|
63
|
-
|
64
|
-
@setState
|
65
|
-
error: error.response.data.error_message
|
66
|
-
console.log("TODO: error")
|
67
|
-
|
68
|
-
classForImage: ->
|
69
|
-
if @state.embed_data.images then "" else "mixtapeImage--empty u-ignoreBlock"
|
70
|
-
#if @state.embed_data.thumbnail_url then "" else "mixtapeImage--empty u-ignoreBlock"
|
71
|
-
|
72
|
-
picture: ->
|
73
|
-
if @state.embed_data.images and @state.embed_data.images.length > 0 then @state.embed_data.images[0].url else ""
|
74
|
-
|
75
|
-
render: ->
|
76
|
-
#block = @.props;
|
77
|
-
#foo = @.props.blockProps;
|
78
|
-
#data = Entity.get(block.block.getEntityAt(0)).getData();
|
79
|
-
console.log "ERROR", @state.error
|
80
|
-
return(
|
81
|
-
<span>
|
82
|
-
{
|
83
|
-
if @picture()
|
84
|
-
<a target='_blank'
|
85
|
-
className="js-mixtapeImage mixtapeImage #{@classForImage()}"
|
86
|
-
href={@state.embed_data.url}
|
87
|
-
style={{backgroundImage: "url('#{@picture()}')"}}>
|
88
|
-
</a>
|
89
|
-
}
|
90
|
-
|
91
|
-
{
|
92
|
-
if @state.error
|
93
|
-
<h2>{@state.error}</h2>
|
94
|
-
}
|
95
|
-
|
96
|
-
<a className='markup--anchor markup--mixtapeEmbed-anchor'
|
97
|
-
target='_blank' href={@state.embed_data.url}>
|
98
|
-
<strong className='markup--strong markup--mixtapeEmbed-strong'>
|
99
|
-
{@state.embed_data.title}
|
100
|
-
</strong>
|
101
|
-
<em className='markup--em markup--mixtapeEmbed-em'>
|
102
|
-
{@state.embed_data.description}
|
103
|
-
</em>
|
104
|
-
</a>
|
105
|
-
{@state.embed_data.provider_url}
|
106
|
-
</span>
|
107
|
-
)
|
108
|
-
|
109
|
-
module.exports = EmbedBlock
|
@@ -1,316 +0,0 @@
|
|
1
|
-
React = require('react')
|
2
|
-
ReactDOM = require('react-dom')
|
3
|
-
|
4
|
-
{
|
5
|
-
Entity,
|
6
|
-
RichUtils
|
7
|
-
AtomicBlockUtils
|
8
|
-
EditorBlock
|
9
|
-
EditorState
|
10
|
-
} = require('draft-js')
|
11
|
-
|
12
|
-
axios = require("axios")
|
13
|
-
|
14
|
-
{ updateDataOfBlock } = require('../../model/index.js')
|
15
|
-
|
16
|
-
|
17
|
-
class ImageBlock extends React.Component
|
18
|
-
|
19
|
-
constructor: (props) ->
|
20
|
-
super props
|
21
|
-
|
22
|
-
existing_data = @.props.block.getData().toJS()
|
23
|
-
|
24
|
-
@config = @props.blockProps.config
|
25
|
-
@file = @props.blockProps.data.get('file')
|
26
|
-
@state =
|
27
|
-
loading: false
|
28
|
-
selected: false
|
29
|
-
loading_progress: 0
|
30
|
-
enabled: false
|
31
|
-
caption: @defaultPlaceholder()
|
32
|
-
direction: existing_data.direction || "center"
|
33
|
-
width: 0
|
34
|
-
height: 0
|
35
|
-
file: null
|
36
|
-
url: @blockPropsSrc() || @defaultUrl(existing_data)
|
37
|
-
aspect_ratio: @defaultAspectRatio(existing_data)
|
38
|
-
|
39
|
-
blockPropsSrc: ()=>
|
40
|
-
# console.log @.props.blockProps.data.src
|
41
|
-
@.props.blockProps.data.src
|
42
|
-
###
|
43
|
-
debugger
|
44
|
-
block = @.props;
|
45
|
-
entity = block.block.getEntityAt(0)
|
46
|
-
if entity
|
47
|
-
data = Entity.get(entity).getData().src
|
48
|
-
else
|
49
|
-
null
|
50
|
-
###
|
51
|
-
|
52
|
-
defaultUrl: (data)=>
|
53
|
-
return data.url if data.url
|
54
|
-
|
55
|
-
if data.url
|
56
|
-
if data.file then URL.createObjectURL(data.file) else data.url
|
57
|
-
else
|
58
|
-
@props.blockProps.data.src
|
59
|
-
|
60
|
-
defaultPlaceholder: ->
|
61
|
-
@props.blockProps.config.image_caption_placeholder
|
62
|
-
|
63
|
-
defaultAspectRatio: (data)=>
|
64
|
-
if data.aspect_ratio
|
65
|
-
width: data.aspect_ratio['width']
|
66
|
-
height: data.aspect_ratio['height']
|
67
|
-
ratio: data.aspect_ratio['ratio']
|
68
|
-
else
|
69
|
-
width: 0
|
70
|
-
height: 0
|
71
|
-
ratio: 100
|
72
|
-
|
73
|
-
getAspectRatio: (w, h)->
|
74
|
-
maxWidth = 1000
|
75
|
-
maxHeight = 1000
|
76
|
-
ratio = 0
|
77
|
-
width = w # Current image width
|
78
|
-
height = h # Current image height
|
79
|
-
|
80
|
-
# Check if the current width is larger than the max
|
81
|
-
if width > maxWidth
|
82
|
-
ratio = maxWidth / width # get ratio for scaling image
|
83
|
-
height = height * ratio # Reset height to match scaled image
|
84
|
-
width = width * ratio # Reset width to match scaled image
|
85
|
-
|
86
|
-
# Check if current height is larger than max
|
87
|
-
else if height > maxHeight
|
88
|
-
ratio = maxHeight / height # get ratio for scaling image
|
89
|
-
width = width * ratio # Reset width to match scaled image
|
90
|
-
height = height * ratio # Reset height to match scaled image
|
91
|
-
|
92
|
-
fill_ratio = height / width * 100
|
93
|
-
result = { width: width, height: height, ratio: fill_ratio }
|
94
|
-
# console.log result
|
95
|
-
result
|
96
|
-
|
97
|
-
# will update block state
|
98
|
-
updateData: =>
|
99
|
-
blockProps = @.props.blockProps
|
100
|
-
block = @.props.block
|
101
|
-
getEditorState = @props.blockProps.getEditorState
|
102
|
-
setEditorState = @props.blockProps.setEditorState
|
103
|
-
data = block.getData()
|
104
|
-
newData = data.merge(@state).merge(forceUpload: false)
|
105
|
-
setEditorState(updateDataOfBlock(getEditorState(), block, newData))
|
106
|
-
|
107
|
-
replaceImg: =>
|
108
|
-
@img = new Image();
|
109
|
-
@img.src = this.refs.image_tag.src
|
110
|
-
@setState
|
111
|
-
url: @img.src
|
112
|
-
self = @
|
113
|
-
# exit only when not blob and not forceUload
|
114
|
-
return if !@img.src.includes("blob:") and !@props.block.data.get("forceUpload")
|
115
|
-
@img.onload = ()=>
|
116
|
-
@setState
|
117
|
-
width: @img.width
|
118
|
-
height: @img.height
|
119
|
-
aspect_ratio: self.getAspectRatio(@img.width, @img.height)
|
120
|
-
|
121
|
-
@handleUpload()
|
122
|
-
|
123
|
-
startLoader: =>
|
124
|
-
@setState
|
125
|
-
loading: true
|
126
|
-
|
127
|
-
stopLoader: =>
|
128
|
-
@setState
|
129
|
-
loading: false
|
130
|
-
|
131
|
-
handleUpload: =>
|
132
|
-
@startLoader()
|
133
|
-
@props.blockProps.addLock()
|
134
|
-
@updateData()
|
135
|
-
@uploadFile()
|
136
|
-
|
137
|
-
componentDidMount: ->
|
138
|
-
@replaceImg()
|
139
|
-
|
140
|
-
aspectRatio: =>
|
141
|
-
maxWidth: "#{@state.aspect_ratio.width}"
|
142
|
-
maxHeight: "#{@state.aspect_ratio.height}"
|
143
|
-
ratio: "#{@state.aspect_ratio.height}"
|
144
|
-
|
145
|
-
updateDataSelection: =>
|
146
|
-
getEditorState = @props.blockProps.getEditorState
|
147
|
-
setEditorState = @props.blockProps.setEditorState
|
148
|
-
newselection = getEditorState().getSelection().merge(
|
149
|
-
anchorKey: @.props.block.getKey()
|
150
|
-
focusKey: @.props.block.getKey()
|
151
|
-
)
|
152
|
-
|
153
|
-
setEditorState(
|
154
|
-
EditorState.forceSelection(getEditorState(), newselection)
|
155
|
-
)
|
156
|
-
|
157
|
-
handleGrafFigureSelectImg: (e)=>
|
158
|
-
e.preventDefault()
|
159
|
-
@setState
|
160
|
-
selected: true
|
161
|
-
, @updateDataSelection
|
162
|
-
|
163
|
-
#main_editor.onChange(main_editor.state.editorState)
|
164
|
-
|
165
|
-
coords: ->
|
166
|
-
maxWidth: "#{@state.aspect_ratio.width}px"
|
167
|
-
maxHeight: "#{@state.aspect_ratio.height}px"
|
168
|
-
|
169
|
-
getBase64Image: (img) ->
|
170
|
-
canvas = document.createElement("canvas")
|
171
|
-
canvas.width = img.width
|
172
|
-
canvas.height = img.height
|
173
|
-
ctx = canvas.getContext("2d")
|
174
|
-
ctx.drawImage img, 0, 0
|
175
|
-
dataURL = canvas.toDataURL("image/png")
|
176
|
-
|
177
|
-
return dataURL
|
178
|
-
|
179
|
-
formatData: ->
|
180
|
-
formData = new FormData()
|
181
|
-
if @file
|
182
|
-
#file = @.props.blockProps.data.get('file')
|
183
|
-
|
184
|
-
formData.append('file', @file)
|
185
|
-
return formData
|
186
|
-
else
|
187
|
-
formData.append('url',
|
188
|
-
@.props.blockProps.data.get("url")
|
189
|
-
)
|
190
|
-
return formData
|
191
|
-
|
192
|
-
getUploadUrl: =>
|
193
|
-
url = @config.upload_url
|
194
|
-
if typeof(url) is "function" then url() else url
|
195
|
-
|
196
|
-
|
197
|
-
uploadFile: =>
|
198
|
-
# console.log "FORM DATA:" , @formatData()
|
199
|
-
axios
|
200
|
-
method: 'post'
|
201
|
-
url: @getUploadUrl()
|
202
|
-
data: @formatData()
|
203
|
-
onUploadProgress: (e)=>
|
204
|
-
@updateProgressBar(e)
|
205
|
-
.then (result)=>
|
206
|
-
@uploadCompleted(result.data)
|
207
|
-
@props.blockProps.removeLock()
|
208
|
-
@stopLoader()
|
209
|
-
@file = null
|
210
|
-
|
211
|
-
if @config.upload_callback
|
212
|
-
@config.upload_callback(response, @)
|
213
|
-
|
214
|
-
.catch (error)=>
|
215
|
-
@props.blockProps.removeLock()
|
216
|
-
@stopLoader()
|
217
|
-
|
218
|
-
console.log("ERROR: got error uploading file #{error}")
|
219
|
-
if @config.upload_error_callback
|
220
|
-
@config.upload_error_callback(error, @)
|
221
|
-
|
222
|
-
handleUp = (json_response)=>
|
223
|
-
@uploadCompleted json_response, n
|
224
|
-
|
225
|
-
uploadCompleted: (json)=>
|
226
|
-
@setState
|
227
|
-
url: json.url
|
228
|
-
, @updateData
|
229
|
-
|
230
|
-
updateProgressBar: (e)=>
|
231
|
-
complete = @state.loading_progress
|
232
|
-
if (e.lengthComputable)
|
233
|
-
complete = e.loaded / e.total * 100
|
234
|
-
complete = complete ? complete : 0
|
235
|
-
@setState
|
236
|
-
loading_progress: complete
|
237
|
-
console.log "complete: #{complete}"
|
238
|
-
|
239
|
-
placeHolderEnabled: =>
|
240
|
-
@state.enabled or @.props.block.getText()
|
241
|
-
|
242
|
-
placeholderText: =>
|
243
|
-
return "" if @placeHolderEnabled()
|
244
|
-
"Write caption for image (optional)"
|
245
|
-
|
246
|
-
handleFocus: (e)=>
|
247
|
-
# console.log "focus on placeholder"
|
248
|
-
setTimeout =>
|
249
|
-
@setState
|
250
|
-
enabled: true
|
251
|
-
, 0
|
252
|
-
|
253
|
-
render: =>
|
254
|
-
|
255
|
-
return (
|
256
|
-
<div ref="image_tag2"
|
257
|
-
suppressContentEditableWarning={true}>
|
258
|
-
<div
|
259
|
-
className="aspectRatioPlaceholder is-locked"
|
260
|
-
style={@coords()}
|
261
|
-
onClick={@handleGrafFigureSelectImg}>
|
262
|
-
<div style={{paddingBottom: "#{@state.aspect_ratio.ratio}%" }}} className='aspect-ratio-fill'>
|
263
|
-
</div>
|
264
|
-
<img src={@state.url}
|
265
|
-
ref="image_tag"
|
266
|
-
height={@state.aspect_ratio.height}
|
267
|
-
width={@state.aspect_ratio.width}
|
268
|
-
className='graf-image'
|
269
|
-
/>
|
270
|
-
<Loader
|
271
|
-
toggle={@state.loading}
|
272
|
-
progress={@state.loading_progress}
|
273
|
-
/>
|
274
|
-
</div>
|
275
|
-
<figcaption className='imageCaption'
|
276
|
-
onMouseDown={@handleFocus}>
|
277
|
-
|
278
|
-
{
|
279
|
-
if !@state.enabled
|
280
|
-
<span className="danteDefaultPlaceholder">
|
281
|
-
{@placeholderText()}
|
282
|
-
</span>
|
283
|
-
}
|
284
|
-
|
285
|
-
<EditorBlock {...@props}
|
286
|
-
editable=true
|
287
|
-
className="imageCaption"
|
288
|
-
/>
|
289
|
-
</figcaption>
|
290
|
-
</div>
|
291
|
-
)
|
292
|
-
|
293
|
-
class Loader extends React.Component
|
294
|
-
|
295
|
-
render: ->
|
296
|
-
return (
|
297
|
-
<div>
|
298
|
-
{ if @props.toggle
|
299
|
-
<div className="image-upoader-loader">
|
300
|
-
<p>
|
301
|
-
{
|
302
|
-
if @props.progress is 100
|
303
|
-
"processing image..."
|
304
|
-
else
|
305
|
-
<span>
|
306
|
-
<span>loading</span>
|
307
|
-
{Math.round @props.progress}
|
308
|
-
</span>
|
309
|
-
}
|
310
|
-
</p>
|
311
|
-
</div>
|
312
|
-
}
|
313
|
-
</div>
|
314
|
-
)
|
315
|
-
|
316
|
-
module.exports = ImageBlock
|
@@ -1,60 +0,0 @@
|
|
1
|
-
|
2
|
-
React = require('react')
|
3
|
-
ReactDOM = require('react-dom')
|
4
|
-
|
5
|
-
{
|
6
|
-
Entity,
|
7
|
-
RichUtils
|
8
|
-
AtomicBlockUtils
|
9
|
-
EditorBlock
|
10
|
-
} = require('draft-js')
|
11
|
-
|
12
|
-
#utils = require("../../utils/utils")
|
13
|
-
|
14
|
-
|
15
|
-
class PlaceholderBlock extends React.Component
|
16
|
-
constructor: (props) ->
|
17
|
-
super props
|
18
|
-
@state =
|
19
|
-
enabled: false
|
20
|
-
data: @.props.blockProps.data.toJS()
|
21
|
-
|
22
|
-
placeholderText: =>
|
23
|
-
return "" if @state.enabled
|
24
|
-
@.props.blockProps.data.toJS().placeholder || @placeholderFromProps() || @defaultText()
|
25
|
-
#if @.props.blockProps.data then @.props.blockProps.data.placeholder else @defaultText()
|
26
|
-
|
27
|
-
|
28
|
-
placeholderFromProps: =>
|
29
|
-
@.props.block.toJS().placeholder
|
30
|
-
|
31
|
-
defaultText: =>
|
32
|
-
"write something "
|
33
|
-
|
34
|
-
componentDidMount: ->
|
35
|
-
|
36
|
-
handleFocus: (e)=>
|
37
|
-
# console.log "focus on placeholder"
|
38
|
-
setTimeout =>
|
39
|
-
@setState
|
40
|
-
enabled: true
|
41
|
-
, 0
|
42
|
-
|
43
|
-
classForDefault: =>
|
44
|
-
if !@state.enabled then "defaultValue defaultValue--root" else ""
|
45
|
-
|
46
|
-
render: ->
|
47
|
-
return(
|
48
|
-
<span className={@classForDefault()}
|
49
|
-
onMouseDown={@handleFocus}>
|
50
|
-
|
51
|
-
{@placeholderText()}
|
52
|
-
|
53
|
-
<EditorBlock {...@props}
|
54
|
-
className="imageCaption"
|
55
|
-
placeholder="escrive alalal"
|
56
|
-
/>
|
57
|
-
</span>
|
58
|
-
)
|
59
|
-
|
60
|
-
module.exports = PlaceholderBlock
|
@@ -1,75 +0,0 @@
|
|
1
|
-
|
2
|
-
React = require('react')
|
3
|
-
ReactDOM = require('react-dom')
|
4
|
-
|
5
|
-
{
|
6
|
-
Entity,
|
7
|
-
RichUtils
|
8
|
-
AtomicBlockUtils
|
9
|
-
EditorBlock
|
10
|
-
} = require('draft-js')
|
11
|
-
|
12
|
-
{ updateDataOfBlock } = require('../../model/index.js')
|
13
|
-
|
14
|
-
axios = require("axios")
|
15
|
-
|
16
|
-
class VideoBlock extends React.Component
|
17
|
-
constructor: (props) ->
|
18
|
-
super props
|
19
|
-
#api_key = "86c28a410a104c8bb58848733c82f840"
|
20
|
-
|
21
|
-
@state =
|
22
|
-
embed_data: @defaultData()
|
23
|
-
|
24
|
-
defaultData: ->
|
25
|
-
existing_data = @.props.block.getData().toJS()
|
26
|
-
existing_data.embed_data || {}
|
27
|
-
|
28
|
-
# will update block state
|
29
|
-
updateData: =>
|
30
|
-
blockProps = @.props.blockProps
|
31
|
-
block = @.props.block
|
32
|
-
getEditorState = @props.blockProps.getEditorState
|
33
|
-
setEditorState = @props.blockProps.setEditorState
|
34
|
-
data = block.getData();
|
35
|
-
newData = data.merge(@state)
|
36
|
-
setEditorState(updateDataOfBlock(getEditorState(), block, newData))
|
37
|
-
|
38
|
-
dataForUpdate: =>
|
39
|
-
@.props.blockProps.data.toJS()
|
40
|
-
|
41
|
-
componentDidMount: ->
|
42
|
-
|
43
|
-
return unless @.props.blockProps.data
|
44
|
-
# ensure data isnt already loaded
|
45
|
-
return unless @dataForUpdate().endpoint or @dataForUpdate().provisory_text
|
46
|
-
|
47
|
-
axios
|
48
|
-
method: 'get'
|
49
|
-
url: "#{@.dataForUpdate().endpoint}#{@.dataForUpdate().provisory_text}&scheme=https"
|
50
|
-
.then (result)=>
|
51
|
-
@setState
|
52
|
-
embed_data: result.data #JSON.parse(data.responseText)
|
53
|
-
, @updateData
|
54
|
-
.catch (error)=>
|
55
|
-
console.log("TODO: error")
|
56
|
-
|
57
|
-
classForImage: ->
|
58
|
-
if @state.embed_data.thumbnail_url then "" else "mixtapeImage--empty u-ignoreBlock"
|
59
|
-
|
60
|
-
render: ->
|
61
|
-
return(
|
62
|
-
<figure
|
63
|
-
className='graf--figure graf--iframe graf--first' tabIndex='0'>
|
64
|
-
<div className='iframeContainer' dangerouslySetInnerHTML={__html: @state.embed_data.html}>
|
65
|
-
</div>
|
66
|
-
<figcaption
|
67
|
-
className='imageCaption'>
|
68
|
-
<EditorBlock {...@props}
|
69
|
-
className="imageCaption"
|
70
|
-
/>
|
71
|
-
</figcaption>
|
72
|
-
</figure>
|
73
|
-
)
|
74
|
-
|
75
|
-
module.exports = VideoBlock
|
data/app/components/debug.cjsx
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
React = require('react')
|
2
|
-
|
3
|
-
class Debug extends React.Component
|
4
|
-
|
5
|
-
constructor: (options={})->
|
6
|
-
@state =
|
7
|
-
output: ""
|
8
|
-
display: "none"
|
9
|
-
|
10
|
-
handleToggleReadOnly: (e)=>
|
11
|
-
e.preventDefault()
|
12
|
-
@props.editor.toggleEditable()
|
13
|
-
return false
|
14
|
-
|
15
|
-
handleTestEmitAndDecode: (e)=>
|
16
|
-
e.preventDefault()
|
17
|
-
@.testEmitAndDecode()
|
18
|
-
|
19
|
-
handleTestEmitTEXT: (e)=>
|
20
|
-
e.preventDefault()
|
21
|
-
@.testEmitTEXT()
|
22
|
-
|
23
|
-
testEmitAndDecode: (e)=>
|
24
|
-
raw_as_json = @props.editor.emitSerializedOutput()
|
25
|
-
@props.editor.setState
|
26
|
-
editorState: @props.editor.decodeEditorContent(raw_as_json)
|
27
|
-
, @logState(JSON.stringify(raw_as_json))
|
28
|
-
false
|
29
|
-
|
30
|
-
testEmitTEXT: ()=>
|
31
|
-
text = @props.editor.getTextFromEditor()
|
32
|
-
@logState(text)
|
33
|
-
|
34
|
-
logState: (raw)=>
|
35
|
-
@setState
|
36
|
-
output: raw
|
37
|
-
, @open
|
38
|
-
|
39
|
-
toggleDisplay: (e)=>
|
40
|
-
e.preventDefault()
|
41
|
-
d = if @state.display is "block" then "none" else @state.display
|
42
|
-
@setState
|
43
|
-
display: d
|
44
|
-
|
45
|
-
open: =>
|
46
|
-
@setState
|
47
|
-
display: "block"
|
48
|
-
|
49
|
-
render: =>
|
50
|
-
return (
|
51
|
-
|
52
|
-
<div>
|
53
|
-
<div className="debugControls">
|
54
|
-
<ul>
|
55
|
-
<li>LOCKS: {@props.editor.state.locks}</li>
|
56
|
-
<li>
|
57
|
-
<a href="#" onClick={@handleToggleReadOnly}>
|
58
|
-
EDITABLE: {if @props.editor.state.read_only then 'NO' else 'YES'}
|
59
|
-
</a>
|
60
|
-
</li>
|
61
|
-
<li>
|
62
|
-
<a href="#" onClick={@handleTestEmitTEXT}>
|
63
|
-
EDITOR TEXT
|
64
|
-
</a>
|
65
|
-
</li>
|
66
|
-
|
67
|
-
<li>
|
68
|
-
<a href="#" onClick={@handleTestEmitAndDecode}>
|
69
|
-
EDITOR STATE
|
70
|
-
</a>
|
71
|
-
</li>
|
72
|
-
|
73
|
-
</ul>
|
74
|
-
</div>
|
75
|
-
|
76
|
-
<div className="debugZone" style={display: @state.display}>
|
77
|
-
<a href="#"
|
78
|
-
className="dante-debug-close close"
|
79
|
-
onClick={@toggleDisplay}
|
80
|
-
/>
|
81
|
-
|
82
|
-
<div className="debugOutput">
|
83
|
-
<h2>EDITOR OUTPUT</h2>
|
84
|
-
{
|
85
|
-
if @state.output.length > 0
|
86
|
-
<pre>
|
87
|
-
{@state.output}
|
88
|
-
</pre>
|
89
|
-
}
|
90
|
-
</div>
|
91
|
-
</div>
|
92
|
-
</div>
|
93
|
-
)
|
94
|
-
|
95
|
-
|
96
|
-
module.exports = Debug
|
@@ -1,61 +0,0 @@
|
|
1
|
-
React = require('react')
|
2
|
-
{Entity} = require('draft-js')
|
3
|
-
|
4
|
-
###
|
5
|
-
Link = (props) ->
|
6
|
-
data = Entity.get(props.entityKey).getData();
|
7
|
-
console.log props
|
8
|
-
#onMouseOver={@props.showPopLinkOver}>
|
9
|
-
#onMouseOut={@props.hidePopLinkOver}>
|
10
|
-
return (
|
11
|
-
<a href={data.url} className="markup--anchor">
|
12
|
-
{props.children}
|
13
|
-
</a>
|
14
|
-
);
|
15
|
-
###
|
16
|
-
|
17
|
-
class Link extends React.Component
|
18
|
-
|
19
|
-
constructor: (props) ->
|
20
|
-
super props
|
21
|
-
@isHover = false
|
22
|
-
|
23
|
-
_validateLink: ()=>
|
24
|
-
pattern = new RegExp('^(https?:\/\/)?'+ # protocol
|
25
|
-
'((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|'+ # domain name
|
26
|
-
'((\d{1,3}\.){3}\d{1,3}))'+ # OR ip (v4) address
|
27
|
-
'(\:\d+)?(\/[-a-z\d%_.~+]*)*'+ # port and path
|
28
|
-
'(\?[;&a-z\d%_.~+=-]*)?'+ # query string
|
29
|
-
'(\#[-a-z\d_]*)?$','i') # fragment locater
|
30
|
-
if !pattern.test(str)
|
31
|
-
alert("Please enter a valid URL.")
|
32
|
-
return false
|
33
|
-
else
|
34
|
-
return true
|
35
|
-
|
36
|
-
_checkProtocol: ()=>
|
37
|
-
console.log "xcvd"
|
38
|
-
|
39
|
-
|
40
|
-
_showPopLinkOver: (e)=>
|
41
|
-
return unless @data.showPopLinkOver
|
42
|
-
@data.showPopLinkOver(@refs.link)
|
43
|
-
|
44
|
-
_hidePopLinkOver: (e)=>
|
45
|
-
return unless @data.hidePopLinkOver
|
46
|
-
@data.hidePopLinkOver()
|
47
|
-
|
48
|
-
render: ->
|
49
|
-
@data = Entity.get(@props.entityKey).getData();
|
50
|
-
|
51
|
-
return (
|
52
|
-
<a ref="link"
|
53
|
-
href={@data.url}
|
54
|
-
className="markup--anchor"
|
55
|
-
onMouseOver={@_showPopLinkOver}
|
56
|
-
onMouseOut={@_hidePopLinkOver}>
|
57
|
-
{@props.children}
|
58
|
-
</a>
|
59
|
-
);
|
60
|
-
|
61
|
-
module.exports = Link
|