Skip to content

Commit 653c46a

Browse files
committed
feature/Create snippet from rails views
1 parent 4e9b30e commit 653c46a

File tree

6 files changed

+93
-8
lines changed

6 files changed

+93
-8
lines changed

app/controllers/snippets_controller.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,13 @@ def show
123123
end
124124

125125
def new
126-
@page_title = 'New Snippet'
126+
@snippet = Snippet.new
127127

128128
if params[:folder_id]
129129
@folder_id = params[:folder_id]
130130
@redirect_url = params[:redirect_url]
131131
end
132-
@folders = current_user.folders.to_json
132+
@folders = current_user.folders
133133
end
134134

135135
def create
@@ -148,9 +148,9 @@ def create
148148
end
149149

150150
if snippet.save
151-
render json: { snippet: snippet.serialize(current_user) }
151+
head :ok
152152
else
153-
render json: { errors: snippet.errors.full_messages }, status: 400
153+
render partial: 'shared/errors', locals: { resource: snippet }, status: :bad_request
154154
end
155155
end
156156

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Controller } from 'stimulus';
2+
3+
export default class extends Controller {
4+
static targets = ["code", "languages", "highlightedBody"];
5+
6+
connect() {
7+
this.addLanguagesToSelect()
8+
}
9+
10+
highlight(event) {
11+
const rawCode = event.currentTarget.value
12+
const highlightedCode = hljs.highlight('ruby', rawCode).value
13+
14+
this.codeTarget.innerHTML = highlightedCode
15+
this.highlightedBodyTarget.value = highlightedCode
16+
}
17+
18+
addLanguagesToSelect() {
19+
hljs.listLanguages().forEach(language => {
20+
const option = document.createElement('option')
21+
option.text = language
22+
option.value = language
23+
24+
this.languagesTarget.add(option)
25+
})
26+
}
27+
}

app/javascript/controllers/snippets_controller.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Controller } from 'stimulus';
22
import axios from 'axios';
33

44
export default class extends Controller {
5-
static targets = ["moveButton", "listItem"];
5+
static targets = ["moveButton", "listItem", "errors"];
66

77

88
initialize() {
@@ -16,6 +16,17 @@ export default class extends Controller {
1616
}
1717
}
1818

19+
onCreateSuccess(event) {
20+
console.log('yay')
21+
window.location.href = '/'
22+
}
23+
24+
onCreateError(event) {
25+
console.log('noo')
26+
const [data, status, xhr] = event.detail;
27+
this.errorsTarget.innerHTML = xhr.response;
28+
}
29+
1930
view_snippet(event) {
2031
event.stopPropagation()
2132
const snippetUrl = event.currentTarget.dataset.snippetUrl

app/models/snippet.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class Snippet < ApplicationRecord
88
validates_presence_of :description
99
validate :owner_folder_presence
1010

11+
attr_accessor :folder_id
12+
1113
# TODO: Don't call serializers from model - just instantiate in controller
1214
def serializable(current_user)
1315
SnippetSerializer.new(self, scope: current_user)

app/views/shared/_errors.html.erb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<ul style="color: #86181d; border: 1px solid lightgray; font-weight: 100; padding: 6px; list-style-position:inside; border-radius: 2px; background-color: #f9bbbb; font-size: 14px;">
2+
<% resource.errors.full_messages.each do |message| %>
3+
<li><%= message %></li>
4+
<% end %>
5+
</ul>

app/views/snippets/new.html.erb

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,43 @@
1-
<new-snippet
2-
:folders="<%= @folders %>"/>
3-
</new-snippet>
1+
<div data-controller="tabs" class="card--container-padding card--container">
2+
<div class="tabs--headers-container">
3+
<div><h1></h1></div>
4+
<div class="tabs--headers-wrapper">
5+
<div data-target="tabs.tab" data-action="click->tabs#change" class="tabs--header tabs--header-active">
6+
<span>Write</span>
7+
</div>
8+
<div data-target="tabs.tab" data-action="click->tabs#change" class="tabs--header">
9+
<span>Preview</span>
10+
</div>
11+
</div>
12+
</div>
13+
14+
<div data-controller="highlight snippets">
15+
<div data-target="snippets.errors"></div>
16+
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onCreateSuccess ajax:error->snippets#onCreateError" } } do |f| %>
17+
<div class="tabs-details">
18+
<div data-target="tabs.panel">
19+
<%= f.text_field :description, { class: "new-snippet--description", placeholder: "Snippet description..." } %>
20+
<%= f.text_area :body, { data: { action: "input->highlight#highlight" }, class: "new-snippet--body", placeholder: "Snippet body..." } %>
21+
<%= f.text_area :highlighted_body, { data: { target: "highlight.highlightedBody" }, class: "hidden" } %>
22+
</div>
23+
24+
<div data-target="tabs.panel" class="hidden">
25+
<pre class="code-highlight">
26+
<code data-target="highlight.code"></code>
27+
</pre>
28+
</div>
29+
</div>
30+
31+
<div class="create-snippet--options-wrapper">
32+
<%= f.select :folder_id, options_from_collection_for_select(@folders, :id, :name) %>
33+
<%= f.select :language, [], {}, { data: { target: "highlight.languages" } } %>
34+
<%# <select v-model="snippetParams.language">
35+
<option v-for="language in languages" :key="language" :value="language">{{ language }}</option>
36+
</select> %>
37+
38+
<%= f.submit 'SAVE', class: "button--cta-new" %>
39+
</div>
40+
<% end %>
41+
42+
</div>
43+
</div>

0 commit comments

Comments
 (0)