5 Коммитов

Автор SHA1 Сообщение Дата
Mattia Roccoberton
72062c1a30 v0.2.14 2020-09-10 07:40:35 +02:00
Mattia Roccoberton
c4aa91225b Minor specs improvement 2020-09-09 12:58:14 +02:00
Mattia Roccoberton
3cc6edb302 JS strict directive 2020-09-09 07:48:45 +02:00
Mattia Roccoberton
d78fb2eb9c v0.2.12 2020-09-08 18:35:23 +02:00
Mattia Roccoberton
e5db64af96 JS refactoring 2020-09-08 18:26:24 +02:00
6 изменённых файлов: 92 добавлений и 83 удалений

Просмотреть файл

@@ -1,7 +1,10 @@
(function () {
'use strict'
// --- functions --------------------------------------------------------------- // --- functions ---------------------------------------------------------------
function initQuillEditors() { function initQuillEditors() {
var default_theme = 'snow'; let default_theme = 'snow'
var default_toolbar = [ let default_toolbar = [
['bold', 'italic', 'underline'], ['bold', 'italic', 'underline'],
['link', 'blockquote', 'code-block'], ['link', 'blockquote', 'code-block'],
[{ 'script': 'sub' }, { 'script': 'super' }], [{ 'script': 'sub' }, { 'script': 'super' }],
@@ -9,46 +12,46 @@ function initQuillEditors() {
[{ 'color': [] }, { 'background': [] }], [{ 'color': [] }, { 'background': [] }],
['image'], ['image'],
['clean'], ['clean'],
]; ]
var editors = document.querySelectorAll('.quill-editor'); let editors = document.querySelectorAll('[data-aa-quill-editor]')
var registered_plugins = {}; let registered_plugins = {}
for(var i = 0; i < editors.length; i++) { for (let i = 0; i < editors.length; i++) {
var content = editors[i].querySelector('.quill-editor-content'); let content = editors[i].querySelector('[data-aa-quill-content]')
var isActive = editors[i].classList.contains('quill-editor--active'); let isActive = editors[i].classList.contains('quill-editor--active')
if (content && !isActive) { if (content && !isActive) {
// Setup editor options // Setup editor options
var options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {}; let options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {}
if(!options.theme) options.theme = default_theme; if (!options.theme) options.theme = default_theme
if(!options.modules) options.modules = {}; if (!options.modules) options.modules = {}
if(!options.modules.toolbar) options.modules.toolbar = default_toolbar; if (!options.modules.toolbar) options.modules.toolbar = default_toolbar
// Setup plugin options // Setup plugin options
var plugin_options = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {}; let plugin_options = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {}
if (plugin_options.image_uploader && plugin_options.image_uploader.server_url) { if (plugin_options.image_uploader && plugin_options.image_uploader.server_url) {
if (!registered_plugins.image_uploader) { if (!registered_plugins.image_uploader) {
Quill.register('modules/imageUploader', ImageUploader); Quill.register('modules/imageUploader', ImageUploader)
registered_plugins.image_uploader = true; registered_plugins.image_uploader = true
} }
var opts = plugin_options.image_uploader; let opts = plugin_options.image_uploader
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name); options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name)
} }
// Init editor // Init editor
editors[i]['_quill-editor'] = new Quill(content, options); editors[i]['_quill-editor'] = new Quill(content, options)
editors[i].classList += ' quill-editor--active'; editors[i].classList += ' quill-editor--active'
} }
} }
var formtastic = document.querySelector('form.formtastic'); let formtastic = document.querySelector('form.formtastic')
if (formtastic) { if (formtastic) {
formtastic.onsubmit = function() { formtastic.onsubmit = () => {
for(var i = 0; i < editors.length; i++) { for (let i = 0; i < editors.length; i++) {
var input = editors[i].querySelector('input[type="hidden"]'); let input = editors[i].querySelector('input[type="hidden"]')
if (editors[i]['_quill-editor'].editor.isBlank()) { if (editors[i]['_quill-editor'].editor.isBlank()) {
input.value = ''; input.value = ''
} else { } else {
input.value = editors[i]['_quill-editor'].root.innerHTML; input.value = editors[i]['_quill-editor'].root.innerHTML
} }
} }
}; };
@@ -59,8 +62,8 @@ function setupImageUploader(server_url, field_name) {
return { return {
upload: file => { upload: file => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const formData = new FormData(); const formData = new FormData()
formData.append(field_name || 'file_upload', file); formData.append(field_name || 'file_upload', file)
fetch(server_url, { fetch(server_url, {
body: formData, body: formData,
@@ -73,19 +76,20 @@ function setupImageUploader(server_url, field_name) {
resolve(result.url); resolve(result.url);
}) })
.catch(error => { .catch(error => {
reject('Upload failed'); reject('Upload failed')
console.error('Error: ', error); console.error('Error: ', error)
}); })
}); })
} }
} }
} }
// --- events ------------------------------------------------------------------ // --- events ------------------------------------------------------------------
$(document).ready( function() { $(document).ready(() => {
initQuillEditors(); initQuillEditors()
}); })
$(document).on('has_many_add:after', function() { $(document).on('has_many_add:after', '.has_many_container', () => {
initQuillEditors(); initQuillEditors()
}); })
})()

Просмотреть файл

@@ -5,7 +5,7 @@
text-align: initial; text-align: initial;
} }
body.active_admin .quill-editor { body.active_admin [data-aa-quill-editor] {
display: inline-block; display: inline-block;
width: calc(80% - 2px); width: calc(80% - 2px);

Просмотреть файл

@@ -2,6 +2,6 @@
module ActiveAdmin module ActiveAdmin
module QuillEditor module QuillEditor
VERSION = '0.2.10' VERSION = '0.2.14'
end end
end end

Просмотреть файл

@@ -6,9 +6,9 @@ module Formtastic
def to_html def to_html
input_wrapping do input_wrapping do
label_html << label_html <<
template.content_tag(:div, input_html_options.merge(class: 'quill-editor')) do template.content_tag(:div, input_html_options.merge('data-aa-quill-editor': '1')) do
builder.hidden_field(input_name) << builder.hidden_field(input_name) <<
template.content_tag(:div, class: 'quill-editor-content') do template.content_tag(:div, 'data-aa-quill-content': '1') do
object.send(method).try :html_safe object.send(method).try :html_safe
end end
end end

Просмотреть файл

@@ -38,10 +38,11 @@ ActiveAdmin.register Post do
end end
form do |f| form do |f|
toolbar = %w[bold italic underline link]
f.inputs 'Post' do f.inputs 'Post' do
f.input :author f.input :author
f.input :title f.input :title
f.input :description, as: :quill_editor f.input :description, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } }
f.input :category f.input :category
f.input :dt f.input :dt
f.input :position f.input :position

Просмотреть файл

@@ -17,6 +17,10 @@ RSpec.describe 'Quill editor', type: :system do
it 'updates some HTML content' do it 'updates some HTML content' do
visit "/admin/posts/#{post.id}/edit" visit "/admin/posts/#{post.id}/edit"
%w[bold italic underline link].each do |button|
expect(page).to have_css(".ql-toolbar button.ql-#{button}")
end
expect(page).to have_css('#post_description[data-aa-quill-editor]')
expect(page).to have_css('#post_description_input .ql-editor', text: 'Some content...') expect(page).to have_css('#post_description_input .ql-editor', text: 'Some content...')
find('#post_description_input .ql-editor').click find('#post_description_input .ql-editor').click
find('#post_description_input .ql-editor').base.send_keys('more text') find('#post_description_input .ql-editor').base.send_keys('more text')