Skip to content

Commit

Permalink
Fix turbo_stream tag and use correct Content-Type
Browse files Browse the repository at this point in the history
  • Loading branch information
treagod committed Apr 8, 2024
1 parent 28f119f commit 4221439
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 29 deletions.
12 changes: 6 additions & 6 deletions spec/marten-turbo/template/tag/turbo_stream_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ describe MartenTurbo::Template::Tag::TurboStream do
end

it "raises if turbo_stream does not define a target_id" do
parser = Marten::Template::Parser.new("{% turbo_stream.append %}")
parser = Marten::Template::Parser.new("{% turbo_stream 'append' %}")

expect_raises(
Marten::Template::Errors::InvalidSyntax,
"Malformed turbo_stream tag: you must define a target id"
"Malformed turbo_stream tag: you must define an action and a target id"
) do
MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream.append")
MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream 'append'")
end
end

Expand All @@ -35,15 +35,15 @@ describe MartenTurbo::Template::Tag::TurboStream do
Marten::Template::Errors::InvalidSyntax,
"Unclosed tags, expected: end_turbostream"
) do
MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream.append 'tags' do")
MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream 'append' 'tags' do")
end
end
end

describe "#render" do
it "properly renders a turbo-stream tag with the correct action and target" do
parser = Marten::Template::Parser.new("")
tag = MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream.remove 'my-id'")
tag = MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream 'remove' 'my-id'")

content = tag.render(Marten::Template::Context.new)
content.should contain "<turbo-stream action=\"remove\" target=\"my-id\">"
Expand All @@ -54,7 +54,7 @@ describe MartenTurbo::Template::Tag::TurboStream do
tag_model = Tag.create!(name: "Marten Turbo")

parser = Marten::Template::Parser.new("")
tag = MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream.remove tag")
tag = MartenTurbo::Template::Tag::TurboStream.new(parser, "turbo_stream 'remove' tag")

context = Marten::Template::Context{"tag" => tag_model}

Expand Down
9 changes: 1 addition & 8 deletions src/marten_turbo/handlers/concerns/turbo_streamable.cr
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,12 @@ module MartenTurbo
context : Hash | NamedTuple | Nil | Marten::Template::Context = nil,
status : ::HTTP::Status | Int32 = 200
)
render(turbo_stream_name.not_nil!, context: context, status: status)
render(turbo_stream_name.not_nil!, context: context, status: status, content_type: "text/vnd.turbo-stream.html")
end

def turbo_stream_name : String | Nil
self.class.turbo_stream_name
end

def render_turbo_stream(
context : Hash | NamedTuple | Nil | Marten::Template::Context = nil,
status : ::HTTP::Status | Int32 = 200
)
render(turbo_stream_name.not_nil!, context: context, status: status)
end
end
end
end
1 change: 1 addition & 0 deletions src/marten_turbo/template/tag.cr
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module MartenTurbo
module Template
module Tag
Marten::Template::Tag.register "dom_id", DomId
Marten::Template::Tag.register "turbo_stream", TurboStream
end
end
end
24 changes: 9 additions & 15 deletions src/marten_turbo/template/tag/turbo_stream.cr
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,22 @@ module MartenTurbo
include Identifiable

@turbo_stream_nodes : Marten::Template::NodeSet?
@action : String
@action_filter : Marten::Template::FilterExpression
@target_id : Marten::Template::Variable

def initialize(parser : Marten::Template::Parser, source : String)
parts = split_smartly(source)

tag_name_parts = parts[0].split(".")

if tag_name_parts.size != 2
if parts.size < 3
raise Marten::Template::Errors::InvalidSyntax.new(
"Malformed turbo_stream tag: you must define an action"
"Malformed turbo_stream tag: you must define an action and a target id"
)
end

@action = tag_name_parts[1]
@action_filter = Marten::Template::FilterExpression.new(parts[1])

if parts.size < 2
raise Marten::Template::Errors::InvalidSyntax.new(
"Malformed turbo_stream tag: you must define a target id"
)
end

@target_id = Marten::Template::Variable.new(parts[1])
@target_id = Marten::Template::Variable.new(parts[2])

if parts[-1] == "do"
@turbo_stream_nodes = parser.parse(up_to: {"end_turbostream"})
Expand All @@ -57,15 +50,16 @@ module MartenTurbo
TEMPLATE_TAG
end

private def render_turbo_stream_tag(target_id, content)
private def render_turbo_stream_tag(action, target_id, content)
<<-TURBO_STREAM_TAG
<turbo-stream action="#{@action}" target="#{target_id}">
<turbo-stream action="#{action}" target="#{target_id}">
#{render_template_tag(content)}
</turbo-stream>
TURBO_STREAM_TAG
end

def render(context : Marten::Template::Context) : String
action = @action_filter.resolve(context).to_s
content = if turbo_stream_nodes = @turbo_stream_nodes
turbo_stream_nodes.render(context)
else
Expand Down Expand Up @@ -98,7 +92,7 @@ module MartenTurbo
content = template.render(context)
end

render_turbo_stream_tag(create_dom_id(@target_id.resolve(context)), content)
render_turbo_stream_tag(action, create_dom_id(@target_id.resolve(context)), content)
end
end
end
Expand Down

0 comments on commit 4221439

Please sign in to comment.