scrivito_editors 0.30.1 → 0.40.0.rc1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -3
- data/app/assets/javascripts/redactor.js +6620 -6697
- data/app/assets/javascripts/scrivito_editors/binary_editor.js.coffee +49 -0
- data/app/assets/javascripts/scrivito_editors/date_editor.js.coffee +2 -2
- data/app/assets/javascripts/scrivito_editors/enum_editor.js.coffee +4 -1
- data/app/assets/javascripts/scrivito_editors/helpers/file_drop_zone.js.coffee +43 -0
- data/app/assets/javascripts/scrivito_editors/html_editor.js.coffee +96 -80
- data/app/assets/javascripts/scrivito_editors/image_editor.js.coffee +5 -39
- data/app/assets/javascripts/scrivito_editors/multienum_editor.js.coffee +4 -1
- data/app/assets/javascripts/scrivito_editors/placeholder.js.coffee +1 -0
- data/app/assets/javascripts/scrivito_editors/redactor_plugins/table.js +337 -0
- data/app/assets/javascripts/scrivito_editors/reference_editor.js.coffee +1 -1
- data/app/assets/javascripts/scrivito_editors/referencelist_editor.js.coffee +1 -1
- data/app/assets/javascripts/scrivito_editors/slider_editor.js.coffee +1 -1
- data/app/assets/javascripts/scrivito_editors/string_editor.js.coffee +1 -1
- data/app/assets/javascripts/scrivito_editors/text_editor.js.coffee +1 -1
- data/app/assets/javascripts/scrivito_editors_core.js +3 -1
- data/app/assets/stylesheets/{redactor.css.erb → redactor.css} +536 -596
- data/app/assets/stylesheets/scrivito_editors/binary_editor.css +14 -0
- data/app/assets/stylesheets/scrivito_editors/editors/html_editor.css +8 -5
- metadata +36 -34
- data/app/assets/fonts/redactor-font.eot +0 -0
- data/lib/scrivito_editors/version.rb +0 -3
@@ -0,0 +1,49 @@
|
|
1
|
+
$ ->
|
2
|
+
selector = '[data-scrivito-field-type=binary]:not([data-editor])'
|
3
|
+
status_indicator_class = 'image-editor-dragover'
|
4
|
+
image_container_class = 'scrivito-editor-image-container'
|
5
|
+
|
6
|
+
handle_file_upload = (event, element, file) ->
|
7
|
+
element.scrivito('save', file).then ->
|
8
|
+
element.scrivito('reload')
|
9
|
+
|
10
|
+
delete_binary = (cms_field) ->
|
11
|
+
if $(cms_field).scrivito('content')
|
12
|
+
$(cms_field).scrivito('save', null).then ->
|
13
|
+
$(cms_field).scrivito('reload')
|
14
|
+
|
15
|
+
binary_field_container = (binary_field) ->
|
16
|
+
if $(binary_field).prop('tagName') == 'IMG'
|
17
|
+
if $(binary_field).parent(".#{image_container_class}").length == 0
|
18
|
+
$(binary_field).wrap("<div class='#{image_container_class}'></div>")
|
19
|
+
$(binary_field).parent(".#{image_container_class}")
|
20
|
+
else
|
21
|
+
binary_field
|
22
|
+
|
23
|
+
add_delete_to_binary = (binary_element) ->
|
24
|
+
if $(binary_element).scrivito('content')
|
25
|
+
container = binary_field_container(binary_element)
|
26
|
+
|
27
|
+
if $(container).find('delete-binary').length == 0
|
28
|
+
delete_icon = $(
|
29
|
+
'<a href="#" class="delete-binary editing-button editing-red delete">' +
|
30
|
+
'<i class="editing-icon editing-icon-trash" /></a>'
|
31
|
+
)
|
32
|
+
|
33
|
+
delete_icon.click (event) ->
|
34
|
+
event.preventDefault()
|
35
|
+
delete_binary(binary_element)
|
36
|
+
|
37
|
+
$(container).prepend(delete_icon)
|
38
|
+
|
39
|
+
scrivito.on 'content', (content_root) ->
|
40
|
+
if scrivito.in_editable_view()
|
41
|
+
binary_elements = $(content_root).find(
|
42
|
+
"#{selector}[data-scrivito-editors-allow-delete]")
|
43
|
+
|
44
|
+
for binary_element in binary_elements
|
45
|
+
add_delete_to_binary(binary_element)
|
46
|
+
|
47
|
+
scrivito.on 'load', ->
|
48
|
+
if scrivito.in_editable_view()
|
49
|
+
scrivito.editors._file_drop_zone(selector, handle_file_upload, status_indicator_class)
|
@@ -22,7 +22,7 @@ $ ->
|
|
22
22
|
cmsField.scrivito('save', datetime)
|
23
23
|
.done ->
|
24
24
|
cmsField.trigger('save.scrivito_editors')
|
25
|
-
cmsField.
|
25
|
+
cmsField.scrivito('reload')
|
26
26
|
|
27
27
|
$('body').on 'click', '[data-scrivito-field-type="date"]:not(.hasDatepicker):not([data-editor]), [data-editor~="date"]', (event) ->
|
28
28
|
event.preventDefault()
|
@@ -42,9 +42,9 @@ $ ->
|
|
42
42
|
template()
|
43
43
|
.data('cmsField', cmsField)
|
44
44
|
.insertAfter(cmsField)
|
45
|
-
.val(content)
|
46
45
|
.keyup(onKeyup)
|
47
46
|
.datetimepicker(options)
|
47
|
+
.datetimepicker('setDate', $(cmsField).scrivito('content'))
|
48
48
|
.focus()
|
49
49
|
|
50
50
|
cmsField.hide()
|
@@ -22,7 +22,10 @@ $ ->
|
|
22
22
|
cmsField.scrivito('save', content).done ->
|
23
23
|
cmsField.trigger('save.scrivito_editors')
|
24
24
|
|
25
|
-
|
25
|
+
enumEditSelector = '[data-values][data-scrivito-field-type="enum"]' +
|
26
|
+
':not([data-editor]), [data-editor~="enum"]'
|
27
|
+
|
28
|
+
$(document).on 'click', enumEditSelector, (event) ->
|
26
29
|
cmsField = $(event.currentTarget)
|
27
30
|
selected = cmsField.scrivito('content')
|
28
31
|
values = cmsField.data('values')
|
@@ -0,0 +1,43 @@
|
|
1
|
+
fetch_file = (event) ->
|
2
|
+
data_transfer = event.originalEvent.dataTransfer
|
3
|
+
return unless data_transfer
|
4
|
+
|
5
|
+
files = data_transfer.files
|
6
|
+
if (files.length > 1)
|
7
|
+
alert('You dropped multiple files, but only one file is supported.')
|
8
|
+
return
|
9
|
+
|
10
|
+
files[0]
|
11
|
+
|
12
|
+
find_cms_field = (target) ->
|
13
|
+
if $(target).attr('data-scrivito-field-name')
|
14
|
+
$(target)
|
15
|
+
else
|
16
|
+
$(target).parent('[data-scrivito-field-name]')
|
17
|
+
|
18
|
+
scrivito.editors._file_drop_zone = (selector, callback, status_indicator_class) ->
|
19
|
+
# Disable DnD for all elements by default to prevent the user
|
20
|
+
# from accidentally opening an image in browser.
|
21
|
+
$('body').on 'dragover', -> false
|
22
|
+
$('body').on 'drop', -> false
|
23
|
+
|
24
|
+
status_indicator_class ||= 'scrivito-editor-dragover'
|
25
|
+
|
26
|
+
body_element = $('body')
|
27
|
+
body_element.on 'dragover.scrivito-editor', selector, (event) ->
|
28
|
+
event.preventDefault()
|
29
|
+
$(find_cms_field(event.target)).addClass(status_indicator_class)
|
30
|
+
|
31
|
+
body_element.on 'dragleave.scrivito-editor', selector, (event) ->
|
32
|
+
event.preventDefault()
|
33
|
+
$(find_cms_field(event.target)).removeClass(status_indicator_class)
|
34
|
+
|
35
|
+
body_element.on 'drop.scrivito-editor', selector, (event) ->
|
36
|
+
event.preventDefault()
|
37
|
+
cms_field = find_cms_field(event.target)
|
38
|
+
file = fetch_file(event)
|
39
|
+
$(cms_field).removeClass(status_indicator_class)
|
40
|
+
|
41
|
+
if file
|
42
|
+
callback(event, cms_field, file)
|
43
|
+
|
@@ -2,91 +2,95 @@
|
|
2
2
|
# attributes and provides autosave on top of the default Redactor settings.
|
3
3
|
|
4
4
|
# Check if the namespace for plugins exists and create it otherwise.
|
5
|
-
|
6
|
-
@RedactorPlugins = {}
|
5
|
+
@RedactorPlugins ||= {}
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@buttonAddFirst('close', 'Close', @closeAction)
|
14
|
-
|
15
|
-
closeAction: (buttonName, buttonDOM, buttonObj, event) ->
|
16
|
-
@.callback('blur')
|
7
|
+
# API to override Redactor options
|
8
|
+
# @api public
|
9
|
+
scrivito.editors.html_editor =
|
10
|
+
redactor:
|
11
|
+
options: {}
|
17
12
|
|
18
13
|
$ ->
|
14
|
+
# Plugin for closing the editor with a button in the toolbar.
|
15
|
+
RedactorPlugins.scrivito_editors_close = ->
|
16
|
+
init: ->
|
17
|
+
button = @button.addFirst('close', 'Close')
|
18
|
+
@button.addCallback button, -> closeEditor @
|
19
|
+
|
19
20
|
# Stores redactor options, custom settings and configures callbacks.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# This callback fires every time when content changes in Redactor.
|
52
|
-
# http://imperavi.com/redactor/docs/callbacks/#callback-changeCallback
|
53
|
-
changeCallback: ->
|
54
|
-
saveContents(@)
|
55
|
-
|
56
|
-
# This callback is triggered when Redactor loses focus.
|
57
|
-
# http://imperavi.com/redactor/docs/callbacks/#callback-blurCallback
|
58
|
-
blurCallback: ->
|
59
|
-
editor = @
|
60
|
-
editor._hasFocus = false
|
61
|
-
unless @_dropdownOpen || @_modalOpen
|
62
|
-
# workaround for issue with context menu (e. g. unlink) being neither modal nor dropdown
|
63
|
-
setTimeout ->
|
64
|
-
unless editor._hasFocus
|
65
|
-
saveContents(editor)
|
66
|
-
editor.destroy()
|
67
|
-
, 250
|
68
|
-
|
69
|
-
# This callback is triggered when a key is released.
|
70
|
-
# http://imperavi.com/redactor/docs/callbacks/#callback-keyupCallback
|
71
|
-
keyupCallback: (event) ->
|
21
|
+
scrivito.editors.html_editor.redactor.default_options =
|
22
|
+
buttons: [
|
23
|
+
'formatting', 'bold', 'italic', 'deleted', 'underline',
|
24
|
+
'unorderedlist', 'orderedlist', 'table', 'link', 'html',
|
25
|
+
]
|
26
|
+
|
27
|
+
buttonSource: true
|
28
|
+
cleanSpaces: false
|
29
|
+
cleanOnPaste: false
|
30
|
+
convertLinks: false
|
31
|
+
linkTooltip: false # disabled, causes unexpected blur on redactor 9 and 10
|
32
|
+
paragraphize: false
|
33
|
+
|
34
|
+
plugins: [
|
35
|
+
'scrivito_editors_close'
|
36
|
+
'table'
|
37
|
+
]
|
38
|
+
|
39
|
+
replaceDivs: false
|
40
|
+
tabifier: false
|
41
|
+
|
42
|
+
blurCallback: -> closeEditor @
|
43
|
+
changeCallback: -> saveContents @
|
44
|
+
destroyCallback: -> saveContents @
|
45
|
+
dropdownShowCallback: -> saveContents @
|
46
|
+
modalOpenedCallback: -> saveContents @
|
47
|
+
|
48
|
+
keyupCallback: (event) ->
|
49
|
+
key = event.keyCode || event.which
|
50
|
+
|
51
|
+
if key == 27
|
72
52
|
event.stopPropagation()
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
53
|
+
closeEditor @
|
54
|
+
else
|
55
|
+
saveContents @
|
56
|
+
|
57
|
+
initCallback: ->
|
58
|
+
cmsField = $(@.$element)
|
59
|
+
content = cmsField.scrivito('content')
|
60
|
+
@_initialScrivitoContent = content
|
61
|
+
|
62
|
+
# @code.get() is empty during init, so we get all HTML via selections
|
63
|
+
@selection.selectAll()
|
64
|
+
htmlWithSelection = @selection.getHtml()
|
65
|
+
@selection.removeMarkers()
|
66
|
+
html = @selection.getHtml()
|
67
|
+
|
68
|
+
if html != content
|
69
|
+
@code.set(content)
|
70
|
+
@selection.selectAll()
|
71
|
+
html = @selection.getHtml()
|
72
|
+
@focus.setEnd()
|
73
|
+
else
|
74
|
+
@code.set(htmlWithSelection)
|
75
|
+
@selection.restore()
|
76
|
+
|
77
|
+
@_initialRedactorContent = html
|
78
|
+
|
79
|
+
startCallback: ->
|
80
|
+
if document.getSelection().anchorNode
|
81
|
+
# see http://imperavi.com/redactor/examples/click-to-edit/
|
82
|
+
@insert.node @selection.getMarker(), false
|
83
|
+
|
84
|
+
# Close editor (implies save)
|
85
|
+
closeEditor = (editor) ->
|
86
|
+
cmsField = $(editor.$element)
|
87
|
+
editor.core.destroy()
|
88
|
+
cmsField.removeClass('scrivito_editors_redactor')
|
85
89
|
|
86
90
|
# Saves the current editor content to the CMS.
|
87
91
|
saveContents = (editor) ->
|
88
92
|
cmsField = editor.$element
|
89
|
-
content = editor
|
93
|
+
content = getCurrentContent(editor)
|
90
94
|
|
91
95
|
if content != cmsField.scrivito('content')
|
92
96
|
cmsField.scrivito('save', content).done ->
|
@@ -94,16 +98,28 @@ $ ->
|
|
94
98
|
else
|
95
99
|
$.Deferred().resolve()
|
96
100
|
|
101
|
+
getCurrentContent = (editor) ->
|
102
|
+
content = editor.code.get()
|
103
|
+
|
104
|
+
if content == editor._initialRedactorContent
|
105
|
+
content = editor._initialScrivitoContent
|
106
|
+
|
107
|
+
content
|
108
|
+
|
109
|
+
getOptions = ->
|
110
|
+
$.extend {}, scrivito.editors.html_editor.redactor.default_options,
|
111
|
+
scrivito.editors.html_editor.redactor.options
|
112
|
+
|
97
113
|
# Registers Redactor for all CMS html attributes found in the given scope of the DOM element.
|
98
114
|
addOnclickRedactorHandlers = ->
|
99
115
|
$(':root').on 'click.scrivito_editors', '[data-scrivito-field-type="html"]:not([data-editor]), [data-editor~="html"]', (event) ->
|
100
116
|
event.preventDefault()
|
101
117
|
cmsField = $(@)
|
102
118
|
|
103
|
-
unless cmsField.hasClass('
|
104
|
-
cmsField
|
105
|
-
|
106
|
-
|
119
|
+
unless cmsField.hasClass('scrivito_editors_redactor')
|
120
|
+
cmsField
|
121
|
+
.redactor(getOptions())
|
122
|
+
.addClass('scrivito_editors_redactor')
|
107
123
|
|
108
124
|
scrivito.on 'load', ->
|
109
125
|
if scrivito.in_editable_view()
|
@@ -3,27 +3,10 @@ $ ->
|
|
3
3
|
|
4
4
|
activateForFieldType = (fieldType) ->
|
5
5
|
selector = 'img[data-scrivito-field-type=' + fieldType + ']:not([data-editor])'
|
6
|
-
|
6
|
+
scrivito.editors._file_drop_zone(selector, save)
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
bodyElement.on 'dragover.image-editor', selector, (event) ->
|
11
|
-
event.preventDefault()
|
12
|
-
$(event.target).addClass(statusIndicatorClass)
|
13
|
-
|
14
|
-
bodyElement.on 'dragleave.image-editor', selector, (event) ->
|
15
|
-
event.preventDefault()
|
16
|
-
$(event.target).removeClass(statusIndicatorClass)
|
17
|
-
|
18
|
-
bodyElement.on 'drop.image-editor', selector, (event) ->
|
19
|
-
event.preventDefault()
|
20
|
-
target = $(event.target)
|
21
|
-
fieldType = target.attr('data-scrivito-field-type')
|
22
|
-
save(event, $(event.target), fieldType)
|
23
|
-
|
24
|
-
save = (event, element, fieldType) ->
|
25
|
-
file = fetchFile(event, element)
|
26
|
-
return unless file
|
8
|
+
save = (event, element, file) ->
|
9
|
+
fieldType = element.attr('data-scrivito-field-type')
|
27
10
|
|
28
11
|
createImage(file).then (obj) ->
|
29
12
|
value = switch
|
@@ -32,19 +15,7 @@ $ ->
|
|
32
15
|
else $.error('Field type must be "reference" or "linklist".')
|
33
16
|
|
34
17
|
element.scrivito('save', value).then ->
|
35
|
-
element.
|
36
|
-
|
37
|
-
fetchFile = (event, element) ->
|
38
|
-
data_transfer = event.originalEvent.dataTransfer
|
39
|
-
return unless data_transfer
|
40
|
-
|
41
|
-
files = data_transfer.files
|
42
|
-
if (files.length > 1)
|
43
|
-
alert('You dropped multiple files, but only one file is supported.')
|
44
|
-
element.removeClass(statusIndicatorClass)
|
45
|
-
return
|
46
|
-
|
47
|
-
files[0]
|
18
|
+
element.scrivito('reload')
|
48
19
|
|
49
20
|
createImage = (file) ->
|
50
21
|
name = file.name.replace(/[^a-z0-9_.$\-]/ig, '-')
|
@@ -63,9 +34,4 @@ $ ->
|
|
63
34
|
activateForFieldType('reference')
|
64
35
|
|
65
36
|
# Activate the image editor if it is explicitely selected.
|
66
|
-
|
67
|
-
|
68
|
-
# Disable DnD for all elements by default to prevent the user
|
69
|
-
# from accidentally opening an image in browser.
|
70
|
-
$('body').on 'dragover', -> false
|
71
|
-
$('body').on 'drop', -> false
|
37
|
+
scrivito.editors._file_drop_zone('[data-editor~="image"]', save,statusIndicatorClass)
|
@@ -23,7 +23,10 @@ $ ->
|
|
23
23
|
cmsField.scrivito('save', content).done ->
|
24
24
|
cmsField.trigger('save.scrivito_editors')
|
25
25
|
|
26
|
-
|
26
|
+
multienumEditSelector = '[data-values][data-scrivito-field-type="multienum"]' +
|
27
|
+
':not([data-editor]), [data-editor~="multienum"]'
|
28
|
+
|
29
|
+
$(document).on 'click', multienumEditSelector, (event) ->
|
27
30
|
cmsField = $(event.currentTarget)
|
28
31
|
selected = cmsField.scrivito('content')
|
29
32
|
values = cmsField.data('values')
|
@@ -6,6 +6,7 @@ $ ->
|
|
6
6
|
# scrivito_tag(:div, @obj, :my_attribute, data: { placeholder: 'My custom placeholder text.' })
|
7
7
|
addPlaceholder = ->
|
8
8
|
cmsFields = $('[data-scrivito-field-type]')
|
9
|
+
.not('[data-scrivito-field-type$=enum]:not([data-values])')
|
9
10
|
|
10
11
|
cmsFields.each ->
|
11
12
|
cmsField = $(@)
|