Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions lib/ex_css_modules/ex_css_modules.ex
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,28 @@ defmodule ExCSSModules do
def class(definition, classes) do
definition
|> class_name(classes)
|> class_attribute
|> class_attribute()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

end

@doc """
Returns the class name from the definition map is value is true.
If `value` is truthy, read the class definitions and maps them to a class attribute.
When `value` is falsy return nil.

## Examples
iex> class(%{ "hello" => "world"}, "hello", true)
{:safe, ~s(class="world")}

iex> class(%{ "hello" => "world"}, "hello", false)
nil
"""
def class(definition, classes, value) do
definition
|> class_name(classes, value)
|> class_attribute()
end

@doc """
Returns the class name from the definition map if value is true.

## Examples
iex> class_name(%{"hello" => "world"}, "hello", true)
Expand All @@ -63,7 +80,7 @@ defmodule ExCSSModules do
end

@doc """
Returns the class name from the definition map is the second argument
Returns the class name from the definition map if the second argument
in the tuple is true.

## Examples
Expand All @@ -89,12 +106,15 @@ defmodule ExCSSModules do

iex> class_name(%{"hello" => "world", "foo" => "bar"}, [{"hello", true}, {"foo", false}])
"world"

iex> class_name(%{"hello" => "world", "foo" => "bar"}, [{"hello", false}])
nil
"""
def class_name(definition, keys) when is_list(keys) do
keys
|> Enum.map(&class_name(definition, &1))
|> Enum.reject(&is_nil/1)
|> Enum.join(" ")
|> join_class_name()
end

@doc """
Expand Down Expand Up @@ -139,5 +159,9 @@ defmodule ExCSSModules do
end
end

defp class_attribute(nil), do: nil
defp class_attribute(class), do: HTML.raw(~s(class="#{class}"))

defp join_class_name(list) when length(list) == 0, do: nil
defp join_class_name(list), do: Enum.join(list, " ")
end
1 change: 1 addition & 0 deletions lib/ex_css_modules/view.ex
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ defmodule ExCSSModules.View do
def stylesheet, do: ExCSSModules.stylesheet(@stylesheet)

def class(key), do: stylesheet() |> ExCSSModules.class(key)
def class(key, value), do: stylesheet() |> ExCSSModules.class(key, value)

def class_name(key) do
ExCSSModules.class_name(stylesheet(), key)
Expand Down
34 changes: 34 additions & 0 deletions test/ex_css_modules/ex_css_modules_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,33 @@ defmodule ExCSSModulesTest do
end
end

describe "class/2" do
test "returns a class attribute for an existing classname" do
assert ExCSSModules.class(
%{"hello" => "world"},
"hello"
) == {:safe, ~s(class="world")}
end

test "returns nil for a non existing classname" do
assert ExCSSModules.class(%{"hello" => "world"}, "foo") == nil
end
end

describe "class/3" do
test "returns a class attribute for an existing classname when value is true" do
assert ExCSSModules.class(
%{"hello" => "world"},
"hello",
true
) == {:safe, ~s(class="world")}
end

test "returns nil for an existing classname when value is false" do
assert ExCSSModules.class(%{"hello" => "world"}, "hello", false) == nil
end
end

describe "class_name/3" do
test "returns the definition when value is true" do
assert ExCSSModules.class_name(
Expand Down Expand Up @@ -63,6 +90,13 @@ defmodule ExCSSModulesTest do
) == "world"
end

test "returns nil for an existing classname when value is false" do
assert ExCSSModules.class_name(
%{"hello" => "world", "foo" => "bar"},
[{"hello", false}]
) == nil
end

test "defaults to nil" do
assert ExCSSModules.class_name(%{}, "hello") == nil
end
Expand Down
11 changes: 10 additions & 1 deletion test/ex_css_modules/view_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,18 @@ defmodule ExCSSModules.ViewTest do
end

describe "class/1" do
test "creates a safe Phoenix HTML class based on the stylesheet" do
test "calls the class/2 method on ExCSSModules" do
assert ViewModuleTest.class("title") ==
ExCSSModules.class(@example_stylesheet, "title")
end
end

describe "class/2" do
test "calls the class/3 method on ExCSSModules" do
assert ViewModuleTest.class("title", true) ==
ExCSSModules.class(@example_stylesheet, "title", true)
assert ViewModuleTest.class("title", false) ==
ExCSSModules.class(@example_stylesheet, "title", false)
end
end
end