Skip to content

Commit 2c60611

Browse files
committed
Rework turbo interaction for snippet and screenshot
1 parent 07921c8 commit 2c60611

File tree

10 files changed

+78
-58
lines changed

10 files changed

+78
-58
lines changed

app/controllers/share/snippets_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def update
5656
def destroy
5757
@snippet = Snippet.find(params[:id])
5858
@snippet.destroy!
59-
redirect_to share_snippets_url, notice: "Snippet was successfully destroyed.", status: :see_other
59+
redirect_to share_snippets_url, notice: "Your snippet has been deleted permanently".emojoy, status: :see_other
6060
end
6161

6262
private
@@ -66,7 +66,7 @@ def share_snippet_redirect_url(snippet)
6666
when "Share"
6767
new_share_snippet_screenshot_url(snippet)
6868
else
69-
share_snippet_url(snippet)
69+
edit_share_snippet_url(snippet)
7070
end
7171
end
7272

app/javascript/controllers/snippets/preview.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Controller } from '@hotwired/stimulus';
22

33
import debug from '../../utils/debug';
4+
import { debounce } from '../../utils/debounce';
45

56
const console = debug('app:javascript:controllers:snippets:preview');
67

@@ -14,7 +15,6 @@ export default class extends Controller<HTMLFormElement> {
1415
console.log('Connect!');
1516

1617
// this.element.addEventListener('turbo:submit-start', this.disable);
17-
1818
// this.element.addEventListener('turbo:submit-end', this.enable);
1919
}
2020

@@ -43,7 +43,11 @@ export default class extends Controller<HTMLFormElement> {
4343

4444
preview = (): void => {
4545
console.log('Start preview!');
46-
this.clickPreviewButton();
46+
47+
// Click the preview button after 0 delay to submit in the next tick
48+
setTimeout(() => {
49+
this.clickPreviewButton();
50+
});
4751
};
4852

4953
clickPreviewButton = (): void => {

app/views/share/snippet_screenshots/form.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ def view_template
1717
method: :post,
1818
class: "grid-content",
1919
data: {
20-
controller: "snippet-screenshot"
20+
controller: "snippet-screenshot",
21+
turbo_frame: "_top"
2122
}
2223
) do |form|
2324
errors
2425

2526
render CodeBlock::Snippet.new(snippet, screenshot: true, data: {snippet_screenshot_target: "snippet"})
2627

2728
fieldset do
28-
plain form.button "Share", class: "button primary"
29+
plain form.button "Share", class: "button primary", data: {snippet_screenshot_target: "submitButton"}
2930
end
3031
end
3132
end

app/views/share/snippet_screenshots/new.html.erb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<%= render Pages::Header.new(title: "Snippet Screenshot") %>
22
<div class="section-content container py-gap">
3-
<%= render Share::SnippetScreenshots::Form.new(@snippet) %>
3+
<%= turbo_frame_tag :snippet_form do %>
4+
<%= render Share::SnippetScreenshots::Form.new(@snippet) %>
5+
<% end %>
46

57
<br>
68

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
<%= render Pages::Header.new(title: "Edit snippet") %>
1+
<%= render Pages::Header.new(title: "Snippet Share") %>
22
<div class="section-content container py-gap">
3-
<%= render Share::Snippets::Form.new(@snippet) %>
3+
<%= turbo_frame_tag :snippet_form do %>
4+
<%= render Share::Snippets::Form.new(@snippet) %>
5+
<% end %>
46

57
<br>
68

app/views/share/snippets/form.rb

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ class Share::Snippets::Form < ApplicationComponent
33
include Phlex::Rails::Helpers::FormWith
44
include Phlex::Rails::Helpers::TurboFrameTag
55
include Phlex::Rails::Helpers::Pluralize
6+
include Phlex::Rails::Helpers::TurboStream
7+
include PhlexConcerns::FlexBlock
68

79
attr_accessor :snippet
810

@@ -11,6 +13,7 @@ def initialize(snippet)
1113
end
1214

1315
def view_template
16+
turbo_stream.update "flash", partial: "application/flash"
1417
form_with(
1518
model: [:share, snippet],
1619
class: "grid-content",
@@ -21,25 +24,25 @@ def view_template
2124
) do |form|
2225
errors
2326

24-
language_select(form, data: {action: "change->snippet-preview#preview"})
25-
26-
turbo_frame_tag dom_id(snippet, :code_block), class: "snippet-frame grid-cols-12" do
27+
div(class: "grid-cols-12") do
2728
div(class: "snippet-background") do
2829
render CodeBlock::Container.new(language: language, class: "snippet") do
2930
render CodeBlock::Header.new do
3031
label(class: "sr-only", for: "snippet[filename]") { "Filename" }
3132
input(type: "text", name: "snippet[filename]", value: filename)
3233
end
3334

34-
render CodeBlock::Body.new(data: {controller: "snippet-editor"}) do
35-
div(class: "grid-stack") do
36-
render CodeBlock::Code.new(source, language: language, data: {snippet_editor_target: "source"})
37-
label(class: "sr-only", for: "snippet[source]") { "Source" }
38-
div(class: "code-editor autogrow-wrapper") do
39-
textarea(
40-
name: "snippet[source]",
41-
data: {snippet_editor_target: "textarea"}
42-
) { source }
35+
turbo_frame_tag dom_id(snippet, :code_block) do
36+
render CodeBlock::Body.new(data: {controller: "snippet-editor"}) do
37+
div(class: "grid-stack") do
38+
render CodeBlock::Code.new(source, language: language, data: {snippet_editor_target: "source"})
39+
label(class: "sr-only", for: "snippet[source]") { "Source" }
40+
div(class: "code-editor autogrow-wrapper") do
41+
textarea(
42+
name: "snippet[source]",
43+
data: {snippet_editor_target: "textarea"}
44+
) { source }
45+
end
4346
end
4447
end
4548
end
@@ -48,19 +51,23 @@ def view_template
4851
end
4952

5053
fieldset do
51-
plain form.submit class: "button primary"
52-
whitespace
53-
plain form.submit "Share", class: "button secondary"
54-
whitespace
55-
plain form.submit "Preview",
56-
class: "button secondary hidden",
57-
formaction: form_path,
58-
formmethod: "get",
59-
formnovalidate: true,
60-
data: {
61-
snippet_preview_target: "previewButton",
62-
turbo_frame: dom_id(snippet, :code_block)
63-
}
54+
flex_block do
55+
plain form.submit "Share", class: "button primary"
56+
57+
plain form.submit "Save", class: "button secondary"
58+
59+
plain form.submit "Preview",
60+
class: "button secondary hidden",
61+
formaction: form_path,
62+
formmethod: "get",
63+
formnovalidate: true,
64+
data: {
65+
snippet_preview_target: "previewButton",
66+
turbo_frame: dom_id(snippet, :code_block)
67+
}
68+
69+
language_select(form, data: {action: "change->snippet-preview#preview"})
70+
end
6471
end
6572
end
6673
end
@@ -106,7 +113,9 @@ def language_select(form, data: {})
106113

107114
def language_select_options
108115
[%w[Auto auto]] +
109-
Rouge::Lexer.all.map { |lexer|
116+
Rouge::Lexer.all
117+
.sort_by { |lexer| lexer.title }
118+
.map { |lexer|
110119
[lexer.title, lexer.tag]
111120
}
112121
end

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<%= render Pages::Header.new(title: "New Snippet") %>
22
<div class="section-content container py-gap">
3-
<%= render Share::Snippets::Form.new(@snippet) %>
3+
<%= turbo_frame_tag :snippet_form do %>
4+
<%= render Share::Snippets::Form.new(@snippet) %>
5+
<% end %>
46

57
<br>
68

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<%= render Pages::Header.new(title: "Snippet") %>
22
<div class="section-content container py-gap">
3-
<%= render CodeBlock::Snippet.new(@snippet) %>
3+
<%= turbo_frame_tag :snippet_form do %>
4+
<%= render CodeBlock::Snippet.new(@snippet) %>
5+
<% end %>
46

57
<div>
68
<%= link_to "Edit this snippet", edit_share_snippet_path(@snippet) %> |

spec/requests/share/snippets_spec.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050
}.to change(Snippet, :count).by(1)
5151
end
5252

53-
it "redirects to the created snippet" do
53+
it "redirects back to the edit page" do
5454
post share_snippets_url, params: {snippet: {source: "puts \"Hello!\"", language: "ruby"}}
55-
expect(response).to redirect_to(share_snippet_url(Snippet.last))
55+
expect(response).to redirect_to(edit_share_snippet_url(Snippet.last))
5656
end
5757
end
5858

@@ -87,11 +87,11 @@
8787
expect(snippet.source).to eq("puts \"Goodbye!\"")
8888
end
8989

90-
it "redirects to the snippet" do
90+
it "redirects back to the edit page" do
9191
snippet = FactoryBot.create(:snippet)
9292
patch share_snippet_url(snippet), params: {snippet: {source: "puts \"Goodbye!\""}}
9393
snippet.reload
94-
expect(response).to redirect_to(share_snippet_url(snippet))
94+
expect(response).to redirect_to(edit_share_snippet_url(snippet))
9595
end
9696
end
9797

spec/system/snippets_spec.rb

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,34 @@
1212

1313
click_link "New snippet"
1414

15-
fill_in "snippet[filename]", with: "app/models/user.rb"
15+
fill_in "snippet[filename]", with: "app/models/blog.rb"
1616
select "Ruby", from: "Language"
1717

18-
find("[data-controller=snippet-editor]").click
18+
find(".code-editor").click
1919

20-
fill_in "snippet[source]", with: "class User\nend"
20+
fill_in "snippet[source]", with: "class Blog\nend"
2121

22-
click_button "Create Snippet"
22+
click_button "Save"
2323

24-
expect(page).to have_content("Snippet was successfully created.")
24+
expect(page).to have_content("Your snippet has been saved")
2525

2626
snippet = Snippet.last
27-
expect(snippet.source).to eq("class User\nend")
27+
expect(snippet.source).to eq("class Blog\nend")
2828
expect(snippet.language).to eq("ruby")
29-
expect(snippet.filename).to eq("app/models/user.rb")
29+
expect(snippet.filename).to eq("app/models/blog.rb")
3030

31-
click_link "Edit"
31+
fill_in "snippet[filename]", with: "lib/models/blog.rb"
3232

33-
fill_in "snippet[filename]", with: "app/models/admin_user.rb"
33+
find(".code-editor").click
34+
fill_in "snippet[source]", with: "class Blog\n has_many :posts\nend"
3435

35-
find("[data-controller=snippet-editor]").click
36-
fill_in "snippet[source]", with: "class User\n has_many :posts\nend"
36+
click_button "Save"
3737

38-
click_button "Update Snippet"
38+
expect(page).to have_content("Your snippet has been saved")
3939

40-
expect(page).to have_content("Snippet was successfully updated.")
40+
click_link "Back to snippets"
4141

42-
snippet.reload
43-
expect(snippet.source).to eq("class User\n has_many :posts\nend")
44-
expect(snippet.language).to eq("ruby")
45-
expect(snippet.filename).to eq("app/models/admin_user.rb")
42+
expect(page).to have_content("lib/models/blog.rb")
43+
expect(page).to have_content("class Blog\n has_many :posts\nend")
4644
end
4745
end

0 commit comments

Comments
 (0)