2 Коммитов

Автор SHA1 Сообщение Дата
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
4 изменённых файлов: 84 добавлений и 82 удалений

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

@@ -1,91 +1,93 @@
// --- functions --------------------------------------------------------------- (function () {
function initQuillEditors() { // --- functions ---------------------------------------------------------------
var default_theme = 'snow'; function initQuillEditors() {
var default_toolbar = [ let default_theme = 'snow'
['bold', 'italic', 'underline'], let default_toolbar = [
['link', 'blockquote', 'code-block'], ['bold', 'italic', 'underline'],
[{ 'script': 'sub'}, { 'script': 'super' }], ['link', 'blockquote', 'code-block'],
[{ 'align': [] }, { list: 'ordered' }, { list: 'bullet' }], [{ 'script': 'sub' }, { 'script': 'super' }],
[{ 'color': [] }, { 'background': [] }], [{ 'align': [] }, { list: 'ordered' }, { list: 'bullet' }],
['image'], [{ 'color': [] }, { 'background': [] }],
['clean'], ['image'],
]; ['clean'],
var editors = document.querySelectorAll('.quill-editor'); ]
var registered_plugins = {}; let editors = document.querySelectorAll('[data-aa-quill-editor]')
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
}
let opts = plugin_options.image_uploader
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name)
} }
var opts = plugin_options.image_uploader;
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'
}
}
let formtastic = document.querySelector('form.formtastic')
if (formtastic) {
formtastic.onsubmit = () => {
for (let i = 0; i < editors.length; i++) {
let input = editors[i].querySelector('input[type="hidden"]')
if (editors[i]['_quill-editor'].editor.isBlank()) {
input.value = ''
} else {
input.value = editors[i]['_quill-editor'].root.innerHTML
}
}
};
} }
} }
var formtastic = document.querySelector('form.formtastic'); function setupImageUploader(server_url, field_name) {
if(formtastic) { return {
formtastic.onsubmit = function() { upload: file => {
for(var i = 0; i < editors.length; i++) { return new Promise((resolve, reject) => {
var input = editors[i].querySelector('input[type="hidden"]'); const formData = new FormData()
if (editors[i]['_quill-editor'].editor.isBlank()) { formData.append(field_name || 'file_upload', file)
input.value = '';
} else {
input.value = editors[i]['_quill-editor'].root.innerHTML;
}
}
};
}
}
function setupImageUploader(server_url, field_name) { fetch(server_url, {
return { body: formData,
upload: file => { headers: {
return new Promise((resolve, reject) => { 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
const formData = new FormData(); },
formData.append(field_name || 'file_upload', file); method: 'POST'
}).then(response => response.json())
fetch(server_url, { .then(result => {
body: formData, resolve(result.url);
headers: { })
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content') .catch(error => {
}, reject('Upload failed')
method: 'POST' console.error('Error: ', error)
}).then(response => response.json()) })
.then(result => {
resolve(result.url);
}) })
.catch(error => { }
reject('Upload failed');
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.12'
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