Skip to content

Commit d3507bb

Browse files
committed
feature/Use codemirror languages and mimes
1 parent a24c3f2 commit d3507bb

File tree

16 files changed

+223
-176
lines changed

16 files changed

+223
-176
lines changed

app/controllers/folders_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def show
4242
@page_title = @folder.name
4343
@display_popover = true
4444
@snippets = @folder.snippets
45+
@languages = Language.all.to_json
4546

4647
@snippets = @snippets.where('description ILIKE ?', "%#{params[:search]}%") if params[:search].present?
4748

app/controllers/home_controller.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ class HomeController < ApplicationController
22
def index
33
@display_popover = true
44

5+
@languages = Language.order(name: :asc).to_json
6+
57
if user_signed_in?
68
@page_title = 'Feed'
79
@snippets = current_user

app/controllers/modals/snippets_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def new
55
@snippet = Snippet.new
66
@folders = current_user.folders
77
@languages = Language.order(name: :asc)
8-
@javascript = @languages.find_by_slug('javascript')
8+
@javascript = @languages.find_by_name('JavaScript')
99
end
1010

1111
def edit

app/controllers/snippets_controller.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ def index
66
@user = User.find_by(id: params[:user_id]) || current_user
77
@display_popover = true
88
@snippets = @user.filed_snippets.includes(:user, :folders)
9+
@languages = Language.all.to_json
910

1011
# TODO: Extract this logic to model/service
1112
@snippets = @snippets.where('description ILIKE ?', "%#{params[:search]}%") if params[:search]
@@ -90,6 +91,7 @@ def current_folder
9091

9192
def show
9293
@page_title = "Snippet"
94+
@languages = Language.all.to_json
9395
@snippet = Snippet.includes(comments: :user).find_by(id: params[:id])
9496

9597
unless @snippet && @snippet.visible_to?(current_user)
@@ -127,6 +129,7 @@ def create
127129

128130
if snippet.save
129131
@display_popover = true
132+
@languages = Language.all.to_json
130133

131134
partial = if request.referer == snippet_path(snippet)
132135
'snippets/snippet'
@@ -162,6 +165,7 @@ def update
162165
end
163166

164167
@display_popover = true
168+
@languages = Language.all.to_json
165169
element = render_to_string partial: partial, locals: { snippet: snippet }
166170

167171
render json: { client_id: snippet.client_id, folder_id: snippet_params[:folder_id], element: element }

app/controllers/users_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def show
1313
@followers = @user.followers
1414
@following = @user.following
1515
@display_popover = true
16+
@languages = Language.all.to_json
1617

1718
# need to change current implementation to hit specific user snippets endpoint so can optionally show private ones
1819
if @user == current_user
Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { Controller } from 'stimulus';
22
import CodeMirror from 'codemirror';
3-
// import 'codemirror/theme/duotone-dark.css'
3+
import 'codemirror/mode/meta.js'
44

55
export default class extends Controller {
66
static targets = ["wrapper", "mirror", "body", "description"];
77
static values = {
88
modes: Array,
99
code: String,
10-
mode: String,
10+
modeId: String,
1111
initialized: Boolean,
1212
readOnly: Boolean
1313
}
@@ -16,7 +16,11 @@ export default class extends Controller {
1616
if (this.shouldInitialize()) {
1717
this.initializeCodeMirror()
1818
this.setCodeMirrorValue()
19-
if (this.hasModeValue) { this.importMode(this.modeValue) }
19+
20+
if (this.hasModeIdValue) {
21+
this.importModeFromId(this.modeIdValue)
22+
}
23+
2024
this.addEventListeners()
2125
}
2226
}
@@ -38,37 +42,48 @@ export default class extends Controller {
3842

3943
updateMode(event) {
4044
const modeId = event.target.value
45+
46+
this.importModeFromId(modeId)
47+
}
48+
49+
importModeFromId(modeId) {
4150
const mode = this.modeFromId(modeId)
4251
const hasMode = Object.keys(CodeMirror.modes).includes(mode)
4352

4453
!hasMode ? this.importMode(mode) : this.setMode(mode)
4554
}
4655

47-
shouldInitialize() {
48-
return !this.initializedValue
49-
}
50-
51-
addEventListeners() {
52-
var editor = document.querySelector('.CodeMirror');
53-
54-
editor.addEventListener("click", (event) => {
55-
event.stopPropagation()
56-
})
57-
}
58-
5956
importMode(mode) {
60-
import(`codemirror/mode/${mode}/${mode}.js`)
57+
const path = mode.mode
58+
59+
import(`codemirror/mode/${path}/${path}.js`)
6160
.then(() => this.setMode(mode))
6261
.catch(console.error)
6362
}
6463

6564
setMode(mode) {
66-
this.codeMirror.setOption("mode", mode);
65+
this.codeMirror.setOption("mode", mode.mime);
6766
}
6867

6968
modeFromId(modeId) {
70-
return this.modesValue.find(mode => {
69+
const dbMode = this.modesValue.find(mode => {
7170
return Number(mode.id) === Number(modeId)
72-
}).mode
71+
})
72+
73+
return CodeMirror.modeInfo.find(mode => {
74+
return mode.name === dbMode.name
75+
})
76+
}
77+
78+
shouldInitialize() {
79+
return !this.initializedValue
80+
}
81+
82+
addEventListeners() {
83+
var editor = document.querySelector('.CodeMirror');
84+
85+
editor.addEventListener("click", (event) => {
86+
event.stopPropagation()
87+
})
7388
}
7489
}

app/models/language.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
class Language < ApplicationRecord
2-
validates_uniqueness_of :slug, :name
2+
validates_uniqueness_of :name
33
end

app/models/snippet.rb

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,6 @@ def folder_for_user(user)
1919
folders.find_by(user_id: user&.id)
2020
end
2121

22-
# TODO: Don't call serializers from model - just instantiate in controller
23-
def serializable(current_user)
24-
SnippetSerializer.new(self, scope: current_user)
25-
end
26-
27-
def serialize(current_user)
28-
serializable(current_user).to_h
29-
end
30-
31-
def simple_serializable(current_user)
32-
SimpleSnippetSerializer.new(self, scope: current_user)
33-
end
34-
35-
def simple_serialize(current_user)
36-
simple_serializable(current_user).to_h
37-
end
38-
3922
def comments_count
4023
comments.size
4124
end
@@ -48,8 +31,7 @@ def liked_by?(user)
4831
likes.find_by_user_id(user&.id).present?
4932
end
5033

51-
52-
# Prevent needing to do on the fly by saving to db
34+
# TODO: Prevent needing to do on the fly by saving to db
5335
def preview
5436
@preview ||= body.split("\n").first(15).join("\n")
5537
end

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
<div data-controller="snippets">
44
<div data-snippets-target="errors"></div>
55

6-
<div data-controller="codemirror snippets" data-codemirror-modes-value="<%= @languages.to_json %>" data-codemirror-code-value="<%= @snippet.body %>" data-codemirror-mode-value="<%= @snippet.language.slug %>" data-codemirror-initialized-value="false" data-codemirror-read-only-value="false" class="mt-4">
6+
<div data-controller="codemirror"
7+
data-codemirror-modes-value="<%= @languages.to_json %>"
8+
data-codemirror-code-value="<%= @snippet.body %>"
9+
data-codemirror-mode-id-value="<%= @snippet.language_id %>"
10+
data-codemirror-initialized-value="false"
11+
data-codemirror-read-only-value="false"
12+
class="mt-4"
13+
>
714
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onUpdateSuccess ajax:error->snippets#onUpdateError" } } do |f| %>
815
<div>
916
<%= f.text_field :description, { class: "new-snippet--description", placeholder: "Snippet title...", class: "block w-full mb-4 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 block w-full sm:text-sm border-gray-300 rounded-md" } %>

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
<h3 class="text-center">New Snippet</h3>
22

3-
<div data-controller="codemirror snippets" data-codemirror-modes-value="<%= @languages.to_json %>" class="mt-4">
3+
<div
4+
data-controller="codemirror snippets"
5+
data-codemirror-modes-value="<%= @languages.to_json %>"
6+
class="mt-4"
7+
>
48
<div data-snippets-target="errors"></div>
59
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onCreateSuccess ajax:error->snippets#onCreateError" } } do |f| %>
610
<div>

0 commit comments

Comments
 (0)