Skip to content

Commit a267990

Browse files
authored
Merge pull request #10 from DefactoSoftware/matthijs/class-conditional
Add class/2 for conditional checking
2 parents 0b636f3 + 805045d commit a267990

File tree

4 files changed

+73
-5
lines changed

4 files changed

+73
-5
lines changed

lib/ex_css_modules/ex_css_modules.ex

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,28 @@ defmodule ExCSSModules do
4343
def class(definition, classes) do
4444
definition
4545
|> class_name(classes)
46-
|> class_attribute
46+
|> class_attribute()
4747
end
4848

4949
@doc """
50-
Returns the class name from the definition map is value is true.
50+
If `value` is truthy, read the class definitions and maps them to a class attribute.
51+
When `value` is falsy return nil.
52+
53+
## Examples
54+
iex> class(%{ "hello" => "world"}, "hello", true)
55+
{:safe, ~s(class="world")}
56+
57+
iex> class(%{ "hello" => "world"}, "hello", false)
58+
nil
59+
"""
60+
def class(definition, classes, value) do
61+
definition
62+
|> class_name(classes, value)
63+
|> class_attribute()
64+
end
65+
66+
@doc """
67+
Returns the class name from the definition map if value is true.
5168
5269
## Examples
5370
iex> class_name(%{"hello" => "world"}, "hello", true)
@@ -63,7 +80,7 @@ defmodule ExCSSModules do
6380
end
6481

6582
@doc """
66-
Returns the class name from the definition map is the second argument
83+
Returns the class name from the definition map if the second argument
6784
in the tuple is true.
6885
6986
## Examples
@@ -89,12 +106,15 @@ defmodule ExCSSModules do
89106
90107
iex> class_name(%{"hello" => "world", "foo" => "bar"}, [{"hello", true}, {"foo", false}])
91108
"world"
109+
110+
iex> class_name(%{"hello" => "world", "foo" => "bar"}, [{"hello", false}])
111+
nil
92112
"""
93113
def class_name(definition, keys) when is_list(keys) do
94114
keys
95115
|> Enum.map(&class_name(definition, &1))
96116
|> Enum.reject(&is_nil/1)
97-
|> Enum.join(" ")
117+
|> join_class_name()
98118
end
99119

100120
@doc """
@@ -139,5 +159,9 @@ defmodule ExCSSModules do
139159
end
140160
end
141161

162+
defp class_attribute(nil), do: nil
142163
defp class_attribute(class), do: HTML.raw(~s(class="#{class}"))
164+
165+
defp join_class_name(list) when length(list) == 0, do: nil
166+
defp join_class_name(list), do: Enum.join(list, " ")
143167
end

lib/ex_css_modules/view.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ defmodule ExCSSModules.View do
4040
def stylesheet, do: ExCSSModules.stylesheet(@stylesheet)
4141

4242
def class(key), do: stylesheet() |> ExCSSModules.class(key)
43+
def class(key, value), do: stylesheet() |> ExCSSModules.class(key, value)
4344

4445
def class_name(key) do
4546
ExCSSModules.class_name(stylesheet(), key)

test/ex_css_modules/ex_css_modules_test.exs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,33 @@ defmodule ExCSSModulesTest do
1919
end
2020
end
2121

22+
describe "class/2" do
23+
test "returns a class attribute for an existing classname" do
24+
assert ExCSSModules.class(
25+
%{"hello" => "world"},
26+
"hello"
27+
) == {:safe, ~s(class="world")}
28+
end
29+
30+
test "returns nil for a non existing classname" do
31+
assert ExCSSModules.class(%{"hello" => "world"}, "foo") == nil
32+
end
33+
end
34+
35+
describe "class/3" do
36+
test "returns a class attribute for an existing classname when value is true" do
37+
assert ExCSSModules.class(
38+
%{"hello" => "world"},
39+
"hello",
40+
true
41+
) == {:safe, ~s(class="world")}
42+
end
43+
44+
test "returns nil for an existing classname when value is false" do
45+
assert ExCSSModules.class(%{"hello" => "world"}, "hello", false) == nil
46+
end
47+
end
48+
2249
describe "class_name/3" do
2350
test "returns the definition when value is true" do
2451
assert ExCSSModules.class_name(
@@ -63,6 +90,13 @@ defmodule ExCSSModulesTest do
6390
) == "world"
6491
end
6592

93+
test "returns nil for an existing classname when value is false" do
94+
assert ExCSSModules.class_name(
95+
%{"hello" => "world", "foo" => "bar"},
96+
[{"hello", false}]
97+
) == nil
98+
end
99+
66100
test "defaults to nil" do
67101
assert ExCSSModules.class_name(%{}, "hello") == nil
68102
end

test/ex_css_modules/view_test.exs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,18 @@ defmodule ExCSSModules.ViewTest do
6161
end
6262

6363
describe "class/1" do
64-
test "creates a safe Phoenix HTML class based on the stylesheet" do
64+
test "calls the class/2 method on ExCSSModules" do
6565
assert ViewModuleTest.class("title") ==
6666
ExCSSModules.class(@example_stylesheet, "title")
6767
end
6868
end
69+
70+
describe "class/2" do
71+
test "calls the class/3 method on ExCSSModules" do
72+
assert ViewModuleTest.class("title", true) ==
73+
ExCSSModules.class(@example_stylesheet, "title", true)
74+
assert ViewModuleTest.class("title", false) ==
75+
ExCSSModules.class(@example_stylesheet, "title", false)
76+
end
77+
end
6978
end

0 commit comments

Comments
 (0)