Skip to content

Commit f874ab2

Browse files
committed
Adds support for parameterized Ecto types
Why: * If the custom type is a parameterized type, then it is not picked up by the form builder This change addresses the need by: * Supporting parameterized types in the same fashion we support non-parameterized custom types
1 parent 0afdbf9 commit f874ab2

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

lib/kaffy/resource_form.ex

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ defmodule Kaffy.ResourceForm do
384384
disabled: opts[:readonly],
385385
aria_describedby: field
386386
)
387+
387388
_ ->
388389
text_input(form, field,
389390
class: "form-control",
@@ -456,6 +457,7 @@ defmodule Kaffy.ResourceForm do
456457
case type do
457458
:id ->
458459
number_input(form, field, opts)
460+
459461
_ ->
460462
text_input(form, field, opts)
461463
end
@@ -501,11 +503,8 @@ defmodule Kaffy.ResourceForm do
501503
def kaffy_input(conn, changeset, form, field, options) do
502504
ft = Kaffy.ResourceSchema.field_type(changeset.data.__struct__, field)
503505

504-
case Kaffy.Utils.is_module(ft) && Keyword.has_key?(ft.__info__(:functions), :render_form) do
505-
true ->
506-
ft.render_form(conn, changeset, form, field, options)
507-
508-
false ->
506+
case custom_field_type(ft) do
507+
{:ok, :default_type} ->
509508
{error_msg, error_class} = get_field_error(changeset, field)
510509
help_text = form_help_text({field, options})
511510

@@ -529,10 +528,23 @@ defmodule Kaffy.ResourceForm do
529528

530529
[label_tag, field_tag, field_feeback]
531530
end
531+
532+
{:ok, ft} ->
533+
ft.render_form(conn, changeset, form, field, options)
532534
end
533535
end
534536

535537
defp add_class(opts, class) do
536538
Keyword.update(opts, :class, class, &"#{&1} #{class}")
537539
end
540+
541+
defp custom_field_type({:parameterized, {ft, _opts}}), do: custom_field_type(ft)
542+
543+
defp custom_field_type(ft) do
544+
if Kaffy.Utils.is_module(ft) && Keyword.has_key?(ft.__info__(:functions), :render_form) do
545+
{:ok, ft}
546+
else
547+
{:ok, :default_type}
548+
end
549+
end
538550
end

lib/kaffy/resource_schema.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,20 @@ defmodule Kaffy.ResourceSchema do
179179
cond do
180180
value.__struct__ in [NaiveDateTime, DateTime, Date, Time] ->
181181
value
182+
182183
value.__struct__ in [Geo.Point] ->
183184
Kaffy.Utils.json().encode!(value, escape: :html_safe, pretty: true)
185+
184186
true ->
185187
Map.from_struct(value)
186188
|> Map.drop([:__meta__])
187189
|> Kaffy.Utils.json().encode!(escape: :html_safe, pretty: true)
188190
end
189191

192+
is_tuple(ft) && elem(ft, 0) == :parameterized ->
193+
{:parameterized, {pt, _opts}} = ft
194+
pt.render_index(conn, schema, field, options)
195+
190196
Kaffy.Utils.is_module(ft) && Keyword.has_key?(ft.__info__(:functions), :render_index) ->
191197
ft.render_index(conn, schema, field, options)
192198

@@ -216,8 +222,10 @@ defmodule Kaffy.ResourceSchema do
216222
cond do
217223
value.__struct__ in [NaiveDateTime, DateTime, Date, Time] ->
218224
value
225+
219226
value.__struct__ in [Geo.Point] ->
220227
Kaffy.Utils.json().encode!(value, escape: :html_safe, pretty: true)
228+
221229
true ->
222230
Map.from_struct(value)
223231
|> Map.drop([:__meta__])

0 commit comments

Comments
 (0)