Skip to content

Commit 05e5a35

Browse files
committed
Separate snippet screenshot controller
1 parent 720ef15 commit 05e5a35

File tree

13 files changed

+125
-30
lines changed

13 files changed

+125
-30
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Share::SnippetScreenshotsController < ApplicationController
2+
def show
3+
@snippet = Snippet.find(params[:snippet_id])
4+
5+
render layout: false
6+
end
7+
8+
def new
9+
@snippet = Snippet.find(params[:snippet_id])
10+
end
11+
12+
def create
13+
@snippet = Snippet.find(params[:snippet_id])
14+
@snippet.attach_screenshot_from_base64(params[:screenshot])
15+
redirect_to share_snippet_url(@snippet), notice: "Screenshot attached."
16+
end
17+
end

app/controllers/share/snippets_controller.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def create
3232
@snippet = Snippet.new(snippet_params)
3333

3434
if @snippet.save
35-
redirect_to share_snippet_url(@snippet), notice: "Snippet was successfully created."
35+
redirect_to share_snippet_redirect_url(@snippet), notice: "Snippet was successfully created."
3636
else
3737
render :new, status: :unprocessable_entity
3838
end
@@ -43,7 +43,8 @@ def update
4343
@snippet = Snippet.find(params[:id])
4444
if @snippet.update(snippet_params)
4545
@snippet.attach_screenshot_from_base64(params[:screenshot]) if params[:screenshot]
46-
redirect_to share_snippet_url(@snippet), notice: "Snippet was successfully updated.", status: :see_other
46+
47+
redirect_to share_snippet_redirect_url(@snippet), notice: "Snippet was successfully updated.", status: :see_other
4748
else
4849
render :edit, status: :unprocessable_entity
4950
end
@@ -58,6 +59,15 @@ def destroy
5859

5960
private
6061

62+
def share_snippet_redirect_url(snippet)
63+
case params[:commit]
64+
when "Share"
65+
new_share_snippet_screenshot_url(snippet)
66+
else
67+
share_snippet_url(snippet)
68+
end
69+
end
70+
6171
# Only allow a list of trusted parameters through.
6272
def snippet_params
6373
params.fetch(:snippet, {}).permit(:filename, :source, :language)

app/javascript/css/components/code.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
@media screen and (min-width: $screen-md) {
2020
.article-content {
21-
& .code-wrapper {
21+
& > .code-wrapper {
2222
margin-inline-start: calc(var(--space-m) * -1);
2323
margin-inline-end: calc(var(--space-m) * -1);
2424
}

app/views/components/code_block/snippet.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,26 @@ class CodeBlock::Snippet < ApplicationComponent
33
include Phlex::Rails::Helpers::DOMID
44
prepend CodeBlock::AtomAware
55

6-
attr_reader :snippet, :data
6+
attr_reader :snippet, :options
77

8-
def initialize(snippet, editing: false, data: {}, **)
8+
def initialize(snippet, screenshot: false, **options)
99
@snippet = snippet
10+
@screenshot = screenshot
11+
@options = options
1012
end
1113

1214
def view_template
13-
div(class: "snippet-background") do
14-
render CodeBlock::Article.new(source, language: language, filename: filename, class: "snippet") do |code_block|
15-
code_block.title { filename }
15+
div(class: "snippet-background", **options) do
16+
render CodeBlock::Container.new(language: language) do
17+
render CodeBlock::Header.new { title_content } if title_content.present?
18+
19+
render CodeBlock::Body.new do
20+
render CodeBlock::Code.new(source, language: language)
21+
unless screenshot?
22+
whitespace
23+
render ClipboardCopy.new(text: source)
24+
end
25+
end
1626
end
1727
end
1828
end
@@ -31,4 +41,6 @@ def source
3141
end
3242

3343
delegate :language, :filename, to: :snippet
44+
45+
def screenshot? = @screenshot
3446
end
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
class Share::SnippetScreenshots::Form < ApplicationComponent
2+
include Phlex::Rails::Helpers::DOMID
3+
include Phlex::Rails::Helpers::FormWith
4+
include Phlex::Rails::Helpers::TurboFrameTag
5+
include Phlex::Rails::Helpers::Pluralize
6+
7+
attr_accessor :snippet
8+
9+
def initialize(snippet)
10+
@snippet = snippet
11+
end
12+
13+
def view_template
14+
form_with(
15+
model: snippet,
16+
url: share_snippet_screenshot_path(snippet),
17+
method: :post,
18+
class: "grid-content",
19+
data: {
20+
controller: "snippet-screenshot"
21+
}
22+
) do |form|
23+
errors
24+
25+
render CodeBlock::Snippet.new(snippet, screenshot: true, data: {snippet_screenshot_target: "snippet"})
26+
27+
fieldset do
28+
plain form.button "Share", class: "button primary"
29+
end
30+
end
31+
end
32+
33+
private
34+
35+
def errors
36+
if snippet.errors.any?
37+
div(style: "color:red") do
38+
h2 do
39+
pluralize(snippet.errors.count, "error")
40+
plain " prohibited this snippet from being saved:"
41+
end
42+
ul do
43+
snippet.errors.each do |error|
44+
li { error.full_message }
45+
whitespace
46+
end
47+
end
48+
end
49+
end
50+
end
51+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<%= render Pages::Header.new(title: "Snippet Screenshot") %>
2+
<div class="section-content container py-gap">
3+
<%= render Share::SnippetScreenshots::Form.new(@snippet) %>
4+
5+
<br>
6+
7+
<div>
8+
<%= link_to "Back to snippets", share_snippets_path %>
9+
</div>
10+
</div>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<%- if @snippet.screenshot.attached? %>
2+
<%= image_tag @snippet.screenshot %>
3+
<%- else %>
4+
<%= link_to "Add a screenshot", new_share_snippet_screenshot_path(@snippet), class: "button primary" %>
5+
<%- end %>

app/views/share/snippets/edit.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<%= render Pages::Header.new(title: "Edit snippet") %>
22
<div class="section-content container py-gap">
3-
<%= render Share::Snippets::Form.new(snippet: @snippet) %>
3+
<%= render Share::Snippets::Form.new(@snippet) %>
44

55
<br>
66

app/views/share/snippets/form.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class Share::Snippets::Form < ApplicationComponent
66

77
attr_accessor :snippet
88

9-
def initialize(snippet:)
9+
def initialize(snippet)
1010
@snippet = snippet
1111
end
1212

@@ -15,7 +15,7 @@ def view_template
1515
model: [:share, snippet],
1616
class: "grid-content",
1717
data: {
18-
controller: "snippet-preview snippet-screenshot",
18+
controller: "snippet-preview",
1919
action: "snippet-editor:edit-finish->snippet-preview#preview"
2020
}
2121
) do |form|
@@ -24,7 +24,7 @@ def view_template
2424
language_select(form, data: {action: "change->snippet-preview#preview"})
2525

2626
turbo_frame_tag dom_id(snippet, :code_block), class: "snippet-frame grid-cols-12" do
27-
div(class: "snippet-background", data: {snippet_screenshot_target: "snippet"}) do
27+
div(class: "snippet-background") do
2828
render CodeBlock::Container.new(language: language, class: "snippet") do
2929
render CodeBlock::Header.new do
3030
label(class: "sr-only", for: "snippet[filename]") { "Filename" }
@@ -50,11 +50,7 @@ def view_template
5050
fieldset do
5151
plain form.submit class: "button primary"
5252
whitespace
53-
plain form.button "Share",
54-
class: "button secondary",
55-
data: {
56-
action: "snippet-preview#share"
57-
}
53+
plain form.submit "Share", class: "button secondary"
5854
whitespace
5955
plain form.submit "Preview",
6056
class: "button secondary hidden",

app/views/share/snippets/index.html.erb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66

77
<% @snippets.each do |snippet| %>
88
<%= link_to share_snippet_path(snippet), class: "block" do %>
9-
<% if snippet.screenshot.attached? %>
10-
<%= image_tag snippet.screenshot %>
11-
<% else %>
12-
<%= render CodeBlock::Snippet.new(snippet) %>
13-
<% end %>
9+
<%= render CodeBlock::Snippet.new(snippet) %>
1410
<% end %>
1511
<% end %>
1612
</div>

0 commit comments

Comments
 (0)