scrivito_editors 0.0.12 → 0.0.13

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 (26) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/app/assets/fonts/redactor-font.eot +0 -0
  4. data/app/assets/javascripts/redactor.js +844 -415
  5. data/app/assets/javascripts/scrivito_editors/date_editor.js.coffee +1 -1
  6. data/app/assets/javascripts/scrivito_editors/enum_editor.js.coffee +1 -1
  7. data/app/assets/javascripts/scrivito_editors/html_editor.js.coffee +1 -1
  8. data/app/assets/javascripts/scrivito_editors/image_editor.js.coffee +72 -0
  9. data/app/assets/javascripts/scrivito_editors/link_editor.js.coffee +124 -0
  10. data/app/assets/javascripts/scrivito_editors/linklist_editor.js.coffee +1 -1
  11. data/app/assets/javascripts/scrivito_editors/multienum_editor.js.coffee +1 -1
  12. data/app/assets/javascripts/scrivito_editors/reference_editor.js.coffee +1 -1
  13. data/app/assets/javascripts/scrivito_editors/referencelist_editor.js.coffee +1 -1
  14. data/app/assets/javascripts/scrivito_editors/slider_editor.js.coffee +1 -1
  15. data/app/assets/javascripts/scrivito_editors/string_editor.js.coffee +5 -3
  16. data/app/assets/javascripts/scrivito_editors/text_editor.js.coffee +2 -2
  17. data/app/assets/javascripts/scrivito_editors.js +2 -7
  18. data/app/assets/javascripts/scrivito_editors_addons.js +4 -0
  19. data/app/assets/javascripts/scrivito_editors_core.js +3 -0
  20. data/app/assets/stylesheets/redactor.css.erb +66 -53
  21. data/app/assets/stylesheets/scrivito_editors/editors/image_editor.css +7 -0
  22. data/app/assets/stylesheets/scrivito_editors/editors/link_editor.css +80 -0
  23. data/app/assets/stylesheets/scrivito_editors.css +2 -2
  24. data/lib/scrivito_editors/version.rb +1 -1
  25. metadata +23 -4
  26. data/app/assets/javascripts/jquery_additions/jquery_center.js.coffee +0 -6
@@ -27,7 +27,7 @@ $ ->
27
27
  cmsField.trigger('save.scrivito_editors')
28
28
  cmsField.trigger('scrivito_reload')
29
29
 
30
- $('body').on 'click', '[data-scrivito-field-type="date"]:not(.hasDatepicker):not([data-editor]), [data-editor="date"]', (event) ->
30
+ $('body').on 'click', '[data-scrivito-field-type="date"]:not(.hasDatepicker):not([data-editor]), [data-editor~="date"]', (event) ->
31
31
  event.preventDefault()
32
32
 
33
33
  cmsField = $(this)
@@ -22,7 +22,7 @@ $ ->
22
22
  cmsField.scrivito('save', content).done ->
23
23
  cmsField.trigger('save.scrivito_editors')
24
24
 
25
- $(document).on 'click', '[data-scrivito-field-type="enum"]:not([data-editor]), [data-editor="enum"]', (event) ->
25
+ $(document).on 'click', '[data-scrivito-field-type="enum"]:not([data-editor]), [data-editor~="enum"]', (event) ->
26
26
  cmsField = $(event.currentTarget)
27
27
  selected = cmsField.scrivito('content')
28
28
  values = cmsField.data('values')
@@ -77,7 +77,7 @@ $ ->
77
77
 
78
78
  # Registers Redactor for all CMS html attributes found in the given scope of the DOM element.
79
79
  addOnclickRedactorHandlers = (domElement) ->
80
- domElement.on 'click', '[data-scrivito-field-type="html"]:not([data-editor]), [data-editor="html"]', (event) ->
80
+ domElement.on 'click', '[data-scrivito-field-type="html"]:not([data-editor]), [data-editor~="html"]', (event) ->
81
81
  event.preventDefault()
82
82
  cmsField = $(@)
83
83
 
@@ -0,0 +1,72 @@
1
+ $ ->
2
+ # Integrates an image drag & drop editor.
3
+
4
+ scrivito.on 'load', ->
5
+ if scrivito.in_editable_view()
6
+ # Activate the image editor for all supported field types.
7
+ activateForFieldType('linklist')
8
+ activateForFieldType('reference')
9
+
10
+ # Activate the image editor if it is explicitely selected.
11
+ activateForSelector('[data-editor~="image"]')
12
+
13
+ # Disable DnD for all elements by default to prevent the user
14
+ # from accidentally opening an image in browser.
15
+ $('body').on 'dragover', -> false
16
+ $('body').on 'drop', -> false
17
+
18
+ statusIndicatorClass = 'image-editor-dragover'
19
+
20
+ activateForFieldType = (fieldType) ->
21
+ selector = 'img[data-scrivito-field-type=' + fieldType + ']:not([data-editor])'
22
+ activateForSelector(selector)
23
+
24
+ activateForSelector = (selector) ->
25
+ bodyElement = $('body')
26
+ bodyElement.on 'dragover.image-editor', selector, (event) ->
27
+ event.preventDefault()
28
+ $(event.target).addClass(statusIndicatorClass)
29
+
30
+ bodyElement.on 'dragleave.image-editor', selector, (event) ->
31
+ event.preventDefault()
32
+ $(event.target).removeClass(statusIndicatorClass)
33
+
34
+ bodyElement.on 'drop.image-editor', selector, (event) ->
35
+ event.preventDefault()
36
+ target = $(event.target)
37
+ fieldType = target.attr('data-scrivito-field-type')
38
+ save(event, $(event.target), fieldType)
39
+
40
+ save = (event, element, fieldType) ->
41
+ file = fetchFile(event, element)
42
+ return unless file
43
+
44
+ createImage(file).then (obj) ->
45
+ value = switch
46
+ when fieldType == 'reference' then obj.id
47
+ when fieldType == 'linklist' then [{obj_id: obj.id}]
48
+ else $.error('Field type must be "reference" or "linklist".')
49
+
50
+ element.scrivito('save', value).then ->
51
+ element.trigger('scrivito_reload')
52
+
53
+ fetchFile = (event, element) ->
54
+ data_transfer = event.originalEvent.dataTransfer
55
+ return unless data_transfer
56
+
57
+ files = data_transfer.files
58
+ if (files.length > 1)
59
+ alert('You dropped multiple files, but only one file is supported.')
60
+ element.removeClass(statusIndicatorClass)
61
+ return
62
+
63
+ files[0]
64
+
65
+ createImage = (file) ->
66
+ name = file.name.replace(/[^a-z0-9_.$\-]/ig, '-')
67
+ path = '_resources/' + Math.floor(Math.random() * 1000) + '/' + name
68
+
69
+ scrivito.create_obj
70
+ blob: file
71
+ _path: path
72
+ _obj_class: 'Image'
@@ -0,0 +1,124 @@
1
+ $ ->
2
+ # An editor for CMS linklist attributes.
3
+
4
+ # Creates the DOM for one link element of the linklist and substitutes the
5
+ # title and url attribute.
6
+ template = (attributes) ->
7
+ attributes ||= {}
8
+
9
+ title = attributes['title'] || ''
10
+ url = attributes['url'] || ''
11
+
12
+ $("<ul><li>
13
+ <input type=\"text\" name=\"title\" value=\"#{title}\" placeholder=\"Title\" />
14
+ <input type=\"text\" name=\"url\" value=\"#{url}\" placeholder=\"Url\" class=\"editing-url\" />
15
+ <div class=\"actions\">
16
+ <a href=\"#\" class=\"editing-button resourcebrowser-open editing-green\">
17
+ <i class=\"editing-icon editing-icon-search\" />
18
+ </a>
19
+ </div></li></ul>")
20
+
21
+ resourcebrowserButtonTemplate = ->
22
+ icon = $('<i></i>')
23
+ .addClass('editing-icon')
24
+ .addClass('editing-icon-plus')
25
+
26
+ button = $('<button></button>')
27
+ .addClass('editing-button')
28
+ .addClass('editing-green')
29
+ .addClass('add-link')
30
+ .html(icon)
31
+
32
+ button
33
+
34
+ # Returns the closest linklist DOM element.
35
+ getCmsField = (element) ->
36
+ element.closest('[data-scrivito-field-type=link]')
37
+
38
+ # Saves the entire linklist to the CMS and stores the last successfully saved value.
39
+ save = (cmsField) ->
40
+ value = getAttributes(cmsField) || null
41
+
42
+ cmsField.scrivito('save', value).done ->
43
+ cmsField.trigger('save.scrivito_editors')
44
+
45
+ # Run when clicking the '...' button inside a li.
46
+ onOpenResourcebrowser = (event) ->
47
+ event.preventDefault()
48
+
49
+ linkItem = $(event.currentTarget).closest('li')
50
+ cmsField = getCmsField(linkItem)
51
+ filters = cmsField.data('filters') || cmsField.data('filter')
52
+
53
+ Resourcebrowser.open
54
+ selection: []
55
+ filters: filters
56
+ selectionMode: 'single'
57
+ onSave: (selection) =>
58
+ onResourcebrowserSaveLinkItem(selection, linkItem)
59
+
60
+ # Resource browser callback for saving a single link.
61
+ onResourcebrowserSaveLinkItem = (selection, linkItem) ->
62
+ url = buildUrl(selection[0])
63
+ linkItem.find('[name=url]').val(url)
64
+
65
+ # trigger save after inserting the value
66
+ cmsField = getCmsField(linkItem)
67
+ save(cmsField)
68
+
69
+ true
70
+
71
+ # Transforms an obj id into an url that can be parsed by Scrivito
72
+ # to establish an internal link.
73
+ buildUrl = (id) ->
74
+ "/#{id}"
75
+
76
+ # Collects all link attributes.
77
+ getAttributes = (cmsField) ->
78
+ items = $(cmsField).find('li')
79
+
80
+ if items.length > 0
81
+ item = $(items[0])
82
+ title = item.find('[name=title]').val()
83
+ url = item.find('[name=url]').val()
84
+
85
+ if url
86
+ 'title': title
87
+ 'url': url
88
+
89
+ # Turns the server side generated link data into the link editor using a template.
90
+ transformLinks = (cmsFields) ->
91
+ for cmsField in cmsFields
92
+ cmsField = $(cmsField)
93
+ items = cmsField.find('li')
94
+
95
+ for item in items
96
+ item = $(item)
97
+
98
+ content = template
99
+ title: item.data('title')
100
+ url: item.data('url')
101
+
102
+ item.html(content)
103
+
104
+ if items.length == 0
105
+ cmsField.append(template())
106
+
107
+ # Automatically save when focus is lost.
108
+ onBlur = (event) ->
109
+ cmsField = getCmsField($(event.currentTarget))
110
+
111
+ save(cmsField)
112
+
113
+ initialize = (root) ->
114
+ linkElements = $(root).find('[data-scrivito-field-type="link"]:not([data-editor]), [data-editor="link"]')
115
+
116
+ if linkElements.length
117
+ transformLinks(linkElements)
118
+
119
+ linkElements.on 'blur', 'li input', onBlur
120
+ linkElements.on 'click', 'a.resourcebrowser-open', onOpenResourcebrowser
121
+
122
+ # Initialize link editor and setup event callbacks.
123
+ scrivito.on 'content', (root) ->
124
+ initialize(root)
@@ -151,7 +151,7 @@ $ ->
151
151
  save(cmsField)
152
152
 
153
153
  initialize = (root) ->
154
- linklistElements = $(root).find('[data-scrivito-field-type="linklist"]:not([data-editor]), [data-editor="linklist"]')
154
+ linklistElements = $(root).find('[data-scrivito-field-type="linklist"]:not([data-editor]), [data-editor~="linklist"]')
155
155
 
156
156
  if linklistElements.length
157
157
  transformLinks(linklistElements)
@@ -23,7 +23,7 @@ $ ->
23
23
  cmsField.scrivito('save', content).done ->
24
24
  cmsField.trigger('save.scrivito_editors')
25
25
 
26
- $(document).on 'click', '[data-scrivito-field-type="multienum"]:not([data-editor]), [data-editor="multienum"]', (event) ->
26
+ $(document).on 'click', '[data-scrivito-field-type="multienum"]:not([data-editor]), [data-editor~="multienum"]', (event) ->
27
27
  cmsField = $(event.currentTarget)
28
28
  selected = cmsField.scrivito('content')
29
29
  values = cmsField.data('values')
@@ -3,7 +3,7 @@ $ ->
3
3
 
4
4
  scrivito.on 'load', ->
5
5
  if scrivito.in_editable_view()
6
- $('body').on 'click', '[data-scrivito-field-type="reference"]:not([data-editor]), [data-editor="reference"]', (event) ->
6
+ $('body').on 'click', '[data-scrivito-field-type="reference"]:not([data-editor]), [data-editor~="reference"]', (event) ->
7
7
  event.preventDefault()
8
8
 
9
9
  cmsField = $(event.currentTarget)
@@ -93,7 +93,7 @@ $ ->
93
93
  # Initialize referencelist editor and setup event callbacks.
94
94
  scrivito.on 'content', (root) ->
95
95
  if scrivito.in_editable_view()
96
- elements = $(root).find('[data-scrivito-field-type="referencelist"]:not([data-editor]), [data-editor="referencelist"]')
96
+ elements = $(root).find('[data-scrivito-field-type="referencelist"]:not([data-editor]), [data-editor~="referencelist"]')
97
97
 
98
98
  if elements.length
99
99
  transform(elements)
@@ -18,7 +18,7 @@ $ ->
18
18
  content = ui.value
19
19
  cmsField.text(ui.value)
20
20
 
21
- $('body').on 'click', '[data-editor="slider"]:not(.active)', (event) ->
21
+ $('body').on 'click', '[data-editor~="slider"]:not(.active)', (event) ->
22
22
  cmsField = $(event.currentTarget)
23
23
  content = cmsField.scrivito('content')
24
24
  min = cmsField.attr('data-min') || 1
@@ -53,7 +53,7 @@ $ ->
53
53
  cmsField.siblings().addBack().not(cmsField.data('siblings_before_edit'))
54
54
 
55
55
  initialize = ->
56
- $('body').on 'mouseenter', '[data-scrivito-field-type="string"]:not([data-editor]), [data-editor="string"]', (event) ->
56
+ $('body').on 'mouseenter', '[data-scrivito-field-type="string"]:not([data-editor]), [data-editor~="string"]', (event) ->
57
57
  cmsField = $(event.currentTarget)
58
58
 
59
59
  unless cmsField.attr('contenteditable')?
@@ -63,10 +63,12 @@ $ ->
63
63
  .blur(onBlur)
64
64
  .keypress(onKey)
65
65
  .keyup(onKey)
66
- .on('input', onInput)
66
+
67
+ if cmsField.attr('data-autosave') != 'false'
68
+ cmsField.on('input', onInput)
67
69
 
68
70
  # Prevent editable link strings to follow the link target on click.
69
- $('body').on 'click', '[data-scrivito-field-type="string"]:not([data-editor]), [data-editor="string"]', (event) ->
71
+ $('body').on 'click', '[data-scrivito-field-type="string"]:not([data-editor]), [data-editor~="string"]', (event) ->
70
72
  event.preventDefault()
71
73
 
72
74
  scrivito.on 'load', ->
@@ -51,7 +51,7 @@ $ ->
51
51
  cmsField.siblings().addBack().not(cmsField.data('siblings_before_edit'))
52
52
 
53
53
  initialize = ->
54
- $('body').on 'mouseenter', '[data-scrivito-field-type="text"]:not([data-editor]), [data-editor="text"]', (event) ->
54
+ $('body').on 'mouseenter', '[data-scrivito-field-type="text"]:not([data-editor]), [data-editor~="text"]', (event) ->
55
55
  cmsField = $(event.currentTarget)
56
56
 
57
57
  unless cmsField.attr('contenteditable')?
@@ -69,7 +69,7 @@ $ ->
69
69
  .on('input', onInput)
70
70
 
71
71
  # Prevent editable link text to follow the link target on click.
72
- $('body').on 'click', '[data-scrivito-field-type="text"]:not([data-editor]), [data-editor="text"]', (event) ->
72
+ $('body').on 'click', '[data-scrivito-field-type="text"]:not([data-editor]), [data-editor~="text"]', (event) ->
73
73
  event.preventDefault()
74
74
 
75
75
  scrivito.on 'load', ->
@@ -10,10 +10,5 @@
10
10
  // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
- //= require jquery.ui.sortable
14
- //= require jquery.ui.datepicker
15
- //= require jquery.ui.slider
16
- //= require jquery-ui-timepicker-addon.min
17
- //= require redactor
18
- //= require scrivito_resourcebrowser
19
- //= require_tree .
13
+ //= require scrivito_editors_addons
14
+ //= require scrivito_editors_core
@@ -0,0 +1,4 @@
1
+ //= require jquery-ui/sortable
2
+ //= require jquery-ui/datepicker
3
+ //= require jquery-ui/slider
4
+ //= require jquery-ui-timepicker-addon.min
@@ -0,0 +1,3 @@
1
+ //= require redactor
2
+ //= require scrivito_resourcebrowser
3
+ //= require_tree ./scrivito_editors