Add CKEditor support for ActiveStorage

ActiveStorage support was added to CKEditor in version 5.1.0. However,
we can't upgrade to version 5.0.0 or later because it only supports
loading CKEditor via CDN.

So we're copying the code related to ActiveStorage instead. I tried to
move it to the `vendor/` folder, but couldn't find a way to load it from
there and if I found one I wouldn't be sure it'd work on production
environments.
This commit is contained in:
Javi Martín
2021-07-26 01:07:40 +02:00
parent 73a0a21001
commit f412ab2c9a
2 changed files with 74 additions and 0 deletions

View File

@@ -8,6 +8,7 @@ AllCops:
DisplayStyleGuide: true
Exclude:
- "db/schema.rb"
- "lib/ckeditor/backend/active_storage.rb"
DisabledByDefault: true
Bundler/DuplicatedGem:

View File

@@ -0,0 +1,73 @@
# frozen_string_literal: true
# Code copied from the ckeditor gem:
# https://github.com/galetahub/ckeditor/pull/853
module Ckeditor
module Backend
module ActiveStorage
def self.included(base)
base.send(:include, Rails.application.routes.url_helpers)
base.send(:include, InstanceMethods)
base.send(:extend, ClassMethods)
end
module ClassMethods
def self.extended(base)
base.class_eval do
before_save :apply_data
validate do
if data.nil? || file.nil?
errors.add(:data, :not_data_present, message: "data must be present")
end
end
end
end
end
module InstanceMethods
def url
rails_blob_path(self.storage_data, only_path: true)
end
def path
rails_blob_path(self.storage_data, only_path: true)
end
def styles
end
def content_type
self.storage_data.content_type
end
def content_type=(_content_type)
self.storage_data.content_type = _content_type
end
protected
def file
@file ||= storage_data
end
def blob
@blob ||= ::ActiveStorage::Blob.find(file.attachment.blob_id)
end
def apply_data
if data.is_a?(Ckeditor::Http::QqFile)
storage_data.attach(io: data, filename: data.original_filename)
else
storage_data.attach(data)
end
self.data_file_name = storage_data.blob.filename
self.data_content_type = storage_data.blob.content_type
self.data_file_size = storage_data.blob.byte_size
end
end
end
autoload :ActiveStorage, "ckeditor/backend/active_storage"
end
end