$ -> # This file integrates contenteditable for string attributes. onKey = (event) -> cmsField = $(event.currentTarget) key = event.keyCode || event.which switch key when 13 # Enter if !isNewlineAllowed(cmsField) event.preventDefault() cmsField.blur() when 27 # Esc event.stopPropagation() cmsField.blur() onInput = (event) -> cmsField = $(event.currentTarget) save(cmsField, false) onBlur = (event) -> cmsField = $(event.currentTarget) save(cmsField, true).done -> if cmsField.attr('data-reload') == 'true' cmsField.scrivito('reload') save = (cmsField, andClose) -> cleanUp(cmsField) clone = cmsFieldAndPastedContent(cmsField).clone() clone.find('div:not(:has(br))').before('\n') clone.find('br').replaceWith('\n') content = clone.text() clone.remove() if andClose cmsField.text(content) # Save only if the content has changed. if content != cmsField.scrivito('content') cmsField.scrivito('save', content).done -> cmsField.trigger('save.scrivito_editors') else $.Deferred().resolve() cleanUp = (cmsField) -> siblings = cmsFieldAndPastedContent(cmsField) pasted = siblings.not(cmsField) if pasted.length > 0 pasted.remove() cmsField.text(siblings.text()) cmsFieldAndPastedContent = (cmsField) -> siblingsBefore = cmsField.data('scrivito_editors_siblings_before_edit') siblings = cmsField.siblings() needsReset = !siblingsBefore || siblings.filter(siblingsBefore).length < siblingsBefore.length if needsReset cmsField.data('scrivito_editors_siblings_before_edit', siblings) else cmsField.siblings().addBack().not(siblingsBefore) _deprecationLogged = false isNewlineAllowed = (cmsField) -> if cmsField.data('editor') == 'text' if !_deprecationLogged console.warn 'Scrivito editors: data-editor="text" is deprecated, please use data-editor="string" data-newlines="true" instead.' _deprecationLogged = true return true return true if cmsField.data('newlines') == true return false if cmsField.data('newlines') == false cmsField.css('white-space').match /pre/ DOUBLE_CLICK_MS = 300 editSelector = ''' [data-scrivito-field-type="string"]:not([data-editor]), [data-editor~="string"], [data-editor~="text"] ''' initialize = -> $(':root').on 'mouseenter', editSelector, (event) -> cmsField = $(@) unless cmsField.attr('contenteditable')? if isNewlineAllowed(cmsField) html = cmsField.html() htmlNl2Br = html.replace(/\n/g, '
') if html != htmlNl2Br cmsField.html(htmlNl2Br) cmsField .attr('contenteditable', true) .blur(onBlur) .keypress(onKey) .keyup(onKey) if cmsField.attr('data-autosave') != 'false' cmsField.on('input', onInput) $(':root').on 'click', editSelector, (event) -> cmsField = $(@) cleanUp(cmsField) # Prevent editable link strings from being opened on click, but allow an enforcing double click unless event.timeStamp - cmsField.data('scrivito_editors_last_click') < DOUBLE_CLICK_MS event.preventDefault() cmsField.data('scrivito_editors_last_click', event.timeStamp) scrivito.on 'load', -> if scrivito.in_editable_view() initialize()