aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/javascript/activetext/index.js7
-rw-r--r--lib/active_text/attachable.rb42
-rw-r--r--lib/active_text/engine.rb12
3 files changed, 57 insertions, 4 deletions
diff --git a/app/javascript/activetext/index.js b/app/javascript/activetext/index.js
index 03cb9960cb..cdcd1d311f 100644
--- a/app/javascript/activetext/index.js
+++ b/app/javascript/activetext/index.js
@@ -25,9 +25,10 @@ addEventListener("trix-attachment-add", event => {
console.warn("Failed to store file for attachment", attachment, error)
} else {
console.log("Created blob for attachment", attributes, attachment)
- const { signed_id } = attributes
- const url = `${blobsURL}/${signed_id}/${encodeURIComponent(attachment.file.name)}`
- attachment.setAttributes({ url, signed_id })
+ attachment.setAttributes({
+ url: `${blobsURL}/${attributes.signed_id}/${encodeURIComponent(attachment.file.name)}`,
+ sgid: attributes.attachable_sgid
+ })
}
})
})
diff --git a/lib/active_text/attachable.rb b/lib/active_text/attachable.rb
index 445ee30605..3a6648331e 100644
--- a/lib/active_text/attachable.rb
+++ b/lib/active_text/attachable.rb
@@ -1,5 +1,9 @@
module ActiveText
module Attachable
+ extend ActiveSupport::Concern
+
+ LOCATOR_NAME = "attachable"
+
class << self
def from_node(node)
if attachable = attachable_from_sgid(node["sgid"])
@@ -13,12 +17,48 @@ module ActiveText
end
end
+ def from_attachable_sgid(sgid, options = {})
+ method = sgid.is_a?(Array) ? :locate_many_signed : :locate_signed
+ record = GlobalID::Locator.public_send(method, sgid, options.merge(for: LOCATOR_NAME))
+ record or raise ActiveRecord::RecordNotFound
+ end
+
private
def attachable_from_sgid(sgid)
- ::Attachable.from_attachable_sgid(sgid)
+ from_attachable_sgid(sgid)
rescue ActiveRecord::RecordNotFound
nil
end
end
+
+ class_methods do
+ def from_attachable_sgid(sgid)
+ ActiveText::Attachable.from_attachable_sgid(sgid, only: self)
+ end
+ end
+
+ def attachable_sgid
+ to_sgid(expires_in: nil, for: LOCATOR_NAME).to_s
+ end
+
+ def attachable_content_type
+ try(:content_type) || "application/octet-stream"
+ end
+
+ def previewable_attachable?
+ false
+ end
+
+ def as_json(*)
+ super.merge(attachable_sgid: attachable_sgid)
+ end
+
+ def to_active_text_attributes(attributes = {})
+ attributes.dup.tap do |attributes|
+ attributes[:sgid] = attachable_sgid
+ attributes[:content_type] = attachable_content_type
+ attributes[:previewable] = true if previewable_attachable?
+ end
+ end
end
end
diff --git a/lib/active_text/engine.rb b/lib/active_text/engine.rb
index 5b16acab04..9a1d08e1ad 100644
--- a/lib/active_text/engine.rb
+++ b/lib/active_text/engine.rb
@@ -11,6 +11,18 @@ module ActiveText
end
end
+ initializer "active_text.active_storage_extension" do
+ require "active_storage/blob"
+
+ class ActiveStorage::Blob
+ include ActiveText::Attachable
+
+ def previewable_attachable?
+ representable?
+ end
+ end
+ end
+
# FIXME: Aren't helpers supposed to load automatically?
# https://github.com/rails/rails/issues/26627 ?
initializer "active_text.helper" do