Skip to content

Commit 19c0928

Browse files
committed
WIP: Add Field::ActiveStorage
1 parent 4f1a6b7 commit 19c0928

28 files changed

Lines changed: 1479 additions & 162 deletions

app/assets/builds/administrate/application.css

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/assets/builds/administrate/application.css.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/assets/builds/administrate/application.js

Lines changed: 1011 additions & 155 deletions
Large diffs are not rendered by default.

app/assets/builds/administrate/application.js.map

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import * as ActiveStorage from "@rails/activestorage"
2+
ActiveStorage.start();
3+
4+
import "./vendor/direct_upload";

app/assets/javascripts/administrate/application.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import "./active_storage";
12
import "./add_jquery";
23
import "trix";
34
import "@rails/actiontext";
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// direct_uploads.js
2+
// https://railsguides.jp/active_storage_overview.html#example
3+
4+
addEventListener("direct-upload:initialize", event => {
5+
const { target, detail } = event
6+
const { id, file } = detail
7+
target.insertAdjacentHTML("beforebegin", `
8+
<div id="direct-upload-${id}" class="direct-upload direct-upload--pending">
9+
<div id="direct-upload-progress-${id}" class="direct-upload__progress" style="width: 0%"></div>
10+
<span class="direct-upload__filename"></span>
11+
</div>
12+
`)
13+
target.previousElementSibling.querySelector(`.direct-upload__filename`).textContent = file.name
14+
})
15+
16+
addEventListener("direct-upload:start", event => {
17+
const { id } = event.detail
18+
const element = document.getElementById(`direct-upload-${id}`)
19+
element.classList.remove("direct-upload--pending")
20+
})
21+
22+
addEventListener("direct-upload:progress", event => {
23+
const { id, progress } = event.detail
24+
const progressElement = document.getElementById(`direct-upload-progress-${id}`)
25+
progressElement.style.width = `${progress}%`
26+
})
27+
28+
addEventListener("direct-upload:error", event => {
29+
event.preventDefault()
30+
const { id, error } = event.detail
31+
const element = document.getElementById(`direct-upload-${id}`)
32+
element.classList.add("direct-upload--error")
33+
element.setAttribute("title", error)
34+
})
35+
36+
addEventListener("direct-upload:end", event => {
37+
const { id } = event.detail
38+
const element = document.getElementById(`direct-upload-${id}`)
39+
element.classList.add("direct-upload--complete")
40+
})

app/assets/stylesheets/administrate/application.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
@import "reset/normalize";
44

5+
@import "vendor/direct_upload";
56
@import "trix/dist/trix";
67
@import "@selectize/selectize/dist/css/selectize";
78
@import "@selectize/selectize/dist/css/selectize.default";
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/* direct_uploads.css */
2+
/* https://railsguides.jp/active_storage_overview.html#example */
3+
4+
.direct-upload {
5+
display: inline-block;
6+
position: relative;
7+
padding: 2px 4px;
8+
margin: 0 3px 3px 0;
9+
border: 1px solid rgba(0, 0, 0, 0.3);
10+
border-radius: 3px;
11+
font-size: 11px;
12+
line-height: 13px;
13+
}
14+
15+
.direct-upload--pending {
16+
opacity: 0.6;
17+
}
18+
19+
.direct-upload__progress {
20+
position: absolute;
21+
top: 0;
22+
left: 0;
23+
bottom: 0;
24+
opacity: 0.2;
25+
background: #0076ff;
26+
transition: width 120ms ease-out, opacity 60ms 60ms ease-in;
27+
transform: translate3d(0, 0, 0);
28+
}
29+
30+
.direct-upload--complete .direct-upload__progress {
31+
opacity: 0.4;
32+
}
33+
34+
.direct-upload--error {
35+
border-color: red;
36+
}
37+
38+
input[type=file][data-direct-upload-url][disabled] {
39+
display: none;
40+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
<div class="field-unit__label">
3+
<%= f.label field.attribute %>
4+
</div>
5+
6+
<div class="field-unit__field">
7+
<%= render field.items_renderer %>
8+
9+
<div>
10+
<% if field.attached? %>
11+
<% field.attachments.each do |attachment| %>
12+
<%= f.hidden_field field.attribute, multiple: field.many?, value: attachment.signed_id %>
13+
<% end %>
14+
<% end %>
15+
16+
<%= f.file_field field.attribute, field.file_field_options %>
17+
</div>
18+
</div>

0 commit comments

Comments
 (0)