Skip to content

Commit 3de8e46

Browse files
committed
test: cover attaching existing blobs
1 parent d34cf20 commit 3de8e46

File tree

5 files changed

+103
-4
lines changed

5 files changed

+103
-4
lines changed

app/controllers/better_together/content/blocks_controller.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ def index
1616
end
1717

1818
def create
19-
@block = resource_class.new(block_params)
19+
@block = resource_class.new(block_params.except(:media_signed_id))
20+
attach_signed_media(@block)
2021

2122
if @block.save
2223
redirect_to content_block_path(@block), notice: 'Block was successfully created.'
@@ -26,8 +27,11 @@ def create
2627
end
2728

2829
def update
30+
@block.assign_attributes(block_params.except(:media_signed_id))
31+
attach_signed_media(@block)
32+
2933
respond_to do |format|
30-
if @block.update(block_params)
34+
if @block.save
3135
redirect_to edit_content_block_path(@block), notice: 'Block was successfully updated.'
3236
else
3337
format.turbo_stream do
@@ -54,7 +58,7 @@ def destroy
5458

5559
def block_params
5660
params.require(:block).permit(
57-
:type, :media, :identifier,
61+
:type, :media, :media_signed_id, :identifier,
5862
*resource_class.localized_block_attributes,
5963
*resource_class.storext_keys
6064
)
@@ -64,6 +68,11 @@ def set_block
6468
@block = set_resource_instance
6569
end
6670

71+
def attach_signed_media(record)
72+
signed_id = params.dig(:block, :media_signed_id)
73+
record.media.attach(signed_id) if signed_id.present?
74+
end
75+
6776
def resource_class
6877
BetterTogether::Content::Block
6978
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Controller } from "@hotwired/stimulus"
2+
// import { Modal } from "bootstrap"
3+
4+
export default class extends Controller {
5+
static targets = ["modal", "signedIdField"]
6+
7+
connect() {
8+
this.modal = new bootstrap.Modal(this.modalTarget)
9+
}
10+
11+
open() {
12+
this.modal.show()
13+
}
14+
15+
select(event) {
16+
const { signedId, url } = event.currentTarget.dataset
17+
this.signedIdFieldTarget.value = signedId
18+
const previewController = this.application.getControllerForElementAndIdentifier(this.element, "better_together--image-preview")
19+
if (previewController && typeof previewController.previewFromUrl === "function") {
20+
previewController.previewFromUrl(url)
21+
}
22+
this.modal.hide()
23+
}
24+
}

app/javascript/controllers/better_together/image_preview_controller.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ export default class extends Controller {
8080
this.updateHeight(); // Update the height of the container
8181
}
8282

83+
previewFromUrl(url) {
84+
this.existingImageUrl = url;
85+
this.clearInput();
86+
this.previewExistingImage();
87+
this.deleteFieldTarget.value = '0';
88+
this.updateDeleteButtonState();
89+
}
90+
8391
toggleDelete() {
8492
if (this.deleteFieldTarget.value === '0' && (this.inputTarget.files.length > 0 || this.existingImageUrl)) {
8593
this.deleteFieldTarget.value = '1'; // Mark for deletion

app/views/better_together/content/blocks/fields/_image.html.erb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
<%- scope = local_assigns[:scope] ? local_assigns[:scope] : BetterTogether::Content::Block.block_name %>
3-
<div class="image-fields" data-controller="better_together--image-preview">
3+
<div class="image-fields" data-controller="better_together--image-preview better_together--image-library">
44
<%= label_tag do %>
55
<%= block.class.human_attribute_name('media') %>
66
<% if block.media.attached? %>
@@ -9,6 +9,8 @@
99
<% end %>
1010
<div class="input-group">
1111
<%= file_field_tag "#{scope}[media]", required: !block.media.attached?, accept: acceptable_image_file_types, "data-better_together--image-preview-target" => "input", data: { 'action' => "better_together--image-preview#preview" }, class: "form-control" %>
12+
<%= button_tag 'Choose from library',
13+
{ type: 'button', class: 'btn btn-outline-secondary', data: { action: 'better_together--image-library#open' } } %>
1214
<%= hidden_field_tag "#{scope}[remove_media]", { value: '0' }, "data-better_together--image-preview-target" => "deleteField" %>
1315
<%= button_tag t('globals.clear'),
1416
{
@@ -23,11 +25,33 @@
2325
"data-better_together--image-preview-target" => "deleteButton",
2426
} %>
2527
</div>
28+
<%= hidden_field_tag "#{scope}[media_signed_id]", nil, "data-better_together--image-library-target" => 'signedIdField' %>
2629
<!-- Image preview container (empty initially) -->
2730
<div class="my-3 text-center" data-better_together--image-preview-target="preview" data-url="<%= block.media.url if block.media.attached? %>">
2831
<!-- The image preview will be dynamically inserted here -->
2932
</div>
3033

34+
<div class="modal fade" tabindex="-1" data-better_together--image-library-target="modal">
35+
<div class="modal-dialog modal-lg">
36+
<div class="modal-content">
37+
<div class="modal-header">
38+
<h5 class="modal-title">Choose from library</h5>
39+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
40+
</div>
41+
<div class="modal-body">
42+
<div class="row g-2">
43+
<% BetterTogether::Upload.with_creator(current_person).each do |upload| %>
44+
<% next unless upload.content_type.start_with?('image/') %>
45+
<div class="col-3">
46+
<%= image_tag upload.url, class: 'img-fluid', data: { action: 'click->better_together--image-library#select', signed_id: upload.file.blob.signed_id, url: upload.url } %>
47+
</div>
48+
<% end %>
49+
</div>
50+
</div>
51+
</div>
52+
</div>
53+
</div>
54+
3155
<div class="row row-cols-1 row-cols-sm-2 align-items-end">
3256
<div class="col mb-3 pb-3 border-bottom">
3357
<%= render partial: 'better_together/content/blocks/fields/shared/translatable_string_field', locals: { model: block, attribute: 'alt_text', scope: } %>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'Content Blocks', type: :request do
6+
describe 'POST /content/blocks' do
7+
let(:user) { create(:better_together_user, :confirmed, :platform_manager) }
8+
9+
before do
10+
login(user)
11+
end
12+
13+
it 'attaches existing blob when media_signed_id is provided' do
14+
blob = ActiveStorage::Blob.create_and_upload!(
15+
io: StringIO.new('fake image'),
16+
filename: 'test.png',
17+
content_type: 'image/png'
18+
)
19+
20+
expect {
21+
post better_together.content_blocks_path, params: {
22+
block: {
23+
type: 'BetterTogether::Content::Image',
24+
media_signed_id: blob.signed_id
25+
}
26+
}
27+
}.to change(BetterTogether::Content::Image, :count).by(1)
28+
29+
block = BetterTogether::Content::Image.last
30+
expect(block.media).to be_attached
31+
expect(block.media.blob).to eq(blob)
32+
end
33+
end
34+
end

0 commit comments

Comments
 (0)