Skip to content

Commit 3c6c2b4

Browse files
committed
Clean up forms V1 error trapping
1 parent b401be6 commit 3c6c2b4

File tree

1 file changed

+79
-58
lines changed

1 file changed

+79
-58
lines changed

lib/petal_components/form.ex

+79-58
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ defmodule PetalComponents.Form do
243243
attr(:rest, :global, include: @form_attrs)
244244

245245
def text_input(assigns) do
246-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
246+
errors = used_input_errors(assigns)
247+
assigns = assign_defaults(assigns, text_input_classes(errors))
247248

248249
~H"""
249250
{Form.text_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -257,7 +258,8 @@ defmodule PetalComponents.Form do
257258
attr(:rest, :global, include: @form_attrs)
258259

259260
def email_input(assigns) do
260-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
261+
errors = used_input_errors(assigns)
262+
assigns = assign_defaults(assigns, text_input_classes(errors))
261263

262264
~H"""
263265
{Form.email_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -271,7 +273,8 @@ defmodule PetalComponents.Form do
271273
attr(:rest, :global, include: @form_attrs)
272274

273275
def number_input(assigns) do
274-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
276+
errors = used_input_errors(assigns)
277+
assigns = assign_defaults(assigns, text_input_classes(errors))
275278

276279
~H"""
277280
{Form.number_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -285,7 +288,8 @@ defmodule PetalComponents.Form do
285288
attr(:rest, :global, include: @form_attrs)
286289

287290
def password_input(assigns) do
288-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
291+
errors = used_input_errors(assigns)
292+
assigns = assign_defaults(assigns, text_input_classes(errors))
289293

290294
~H"""
291295
{Form.password_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -299,7 +303,8 @@ defmodule PetalComponents.Form do
299303
attr(:rest, :global, include: @form_attrs)
300304

301305
def search_input(assigns) do
302-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
306+
errors = used_input_errors(assigns)
307+
assigns = assign_defaults(assigns, text_input_classes(errors))
303308

304309
~H"""
305310
{Form.search_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -313,7 +318,8 @@ defmodule PetalComponents.Form do
313318
attr(:rest, :global, include: @form_attrs)
314319

315320
def telephone_input(assigns) do
316-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
321+
errors = used_input_errors(assigns)
322+
assigns = assign_defaults(assigns, text_input_classes(errors))
317323

318324
~H"""
319325
{Form.telephone_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -327,7 +333,8 @@ defmodule PetalComponents.Form do
327333
attr(:rest, :global, include: @form_attrs)
328334

329335
def url_input(assigns) do
330-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
336+
errors = used_input_errors(assigns)
337+
assigns = assign_defaults(assigns, text_input_classes(errors))
331338

332339
~H"""
333340
{Form.url_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -341,7 +348,8 @@ defmodule PetalComponents.Form do
341348
attr(:rest, :global, include: @form_attrs)
342349

343350
def time_input(assigns) do
344-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
351+
errors = used_input_errors(assigns)
352+
assigns = assign_defaults(assigns, text_input_classes(errors))
345353

346354
~H"""
347355
{Form.time_input(@form, @field, [class: @classes, bob: "yo"] ++ Map.to_list(@rest))}
@@ -355,7 +363,8 @@ defmodule PetalComponents.Form do
355363
attr(:rest, :global, include: @form_attrs)
356364

357365
def time_select(assigns) do
358-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
366+
errors = used_input_errors(assigns)
367+
assigns = assign_defaults(assigns, text_input_classes(errors))
359368

360369
~H"""
361370
<div class="pc-time-select">
@@ -371,7 +380,8 @@ defmodule PetalComponents.Form do
371380
attr(:rest, :global, include: @form_attrs)
372381

373382
def datetime_local_input(assigns) do
374-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
383+
errors = used_input_errors(assigns)
384+
assigns = assign_defaults(assigns, text_input_classes(errors))
375385

376386
~H"""
377387
{Form.datetime_local_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -385,7 +395,8 @@ defmodule PetalComponents.Form do
385395
attr(:rest, :global, include: @form_attrs)
386396

387397
def datetime_select(assigns) do
388-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
398+
errors = used_input_errors(assigns)
399+
assigns = assign_defaults(assigns, text_input_classes(errors))
389400

390401
~H"""
391402
<div class="pc-datetime-select">
@@ -401,7 +412,8 @@ defmodule PetalComponents.Form do
401412
attr(:rest, :global, include: @form_attrs)
402413

403414
def date_select(assigns) do
404-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
415+
errors = used_input_errors(assigns)
416+
assigns = assign_defaults(assigns, text_input_classes(errors))
405417

406418
~H"""
407419
<div class="pc-date-select">
@@ -417,7 +429,8 @@ defmodule PetalComponents.Form do
417429
attr(:rest, :global, include: @form_attrs)
418430

419431
def date_input(assigns) do
420-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
432+
errors = used_input_errors(assigns)
433+
assigns = assign_defaults(assigns, text_input_classes(errors))
421434

422435
~H"""
423436
{Form.date_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -431,7 +444,8 @@ defmodule PetalComponents.Form do
431444
attr(:rest, :global, include: @form_attrs)
432445

433446
def color_input(assigns) do
434-
assigns = assign_defaults(assigns, color_input_classes(field_has_errors?(assigns)))
447+
errors = used_input_errors(assigns)
448+
assigns = assign_defaults(assigns, color_input_classes(errors))
435449

436450
~H"""
437451
{Form.color_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -445,7 +459,8 @@ defmodule PetalComponents.Form do
445459
attr(:rest, :global, include: @form_attrs)
446460

447461
def file_input(assigns) do
448-
assigns = assign_defaults(assigns, file_input_classes(field_has_errors?(assigns)))
462+
errors = used_input_errors(assigns)
463+
assigns = assign_defaults(assigns, file_input_classes(errors))
449464

450465
~H"""
451466
{Form.file_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -459,7 +474,8 @@ defmodule PetalComponents.Form do
459474
attr(:rest, :global, include: @form_attrs)
460475

461476
def range_input(assigns) do
462-
assigns = assign_defaults(assigns, range_input_classes(field_has_errors?(assigns)))
477+
errors = used_input_errors(assigns)
478+
assigns = assign_defaults(assigns, range_input_classes(errors))
463479

464480
~H"""
465481
{Form.range_input(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -473,7 +489,8 @@ defmodule PetalComponents.Form do
473489
attr(:rest, :global, include: @form_attrs)
474490

475491
def textarea(assigns) do
476-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
492+
errors = used_input_errors(assigns)
493+
assigns = assign_defaults(assigns, text_input_classes(errors))
477494

478495
~H"""
479496
{Form.textarea(@form, @field, [class: @classes, rows: "4"] ++ Map.to_list(@rest))}
@@ -488,7 +505,8 @@ defmodule PetalComponents.Form do
488505
attr(:rest, :global, include: @form_attrs)
489506

490507
def select(assigns) do
491-
assigns = assign_defaults(assigns, select_classes(field_has_errors?(assigns)))
508+
errors = used_input_errors(assigns)
509+
assigns = assign_defaults(assigns, select_classes(errors))
492510

493511
~H"""
494512
{Form.select(@form, @field, @options, [class: @classes] ++ Map.to_list(@rest))}
@@ -505,7 +523,8 @@ defmodule PetalComponents.Form do
505523
)
506524

507525
def checkbox(assigns) do
508-
assigns = assign_defaults(assigns, checkbox_classes(field_has_errors?(assigns)))
526+
errors = used_input_errors(assigns)
527+
assigns = assign_defaults(assigns, checkbox_classes(errors))
509528

510529
~H"""
511530
{Form.checkbox(@form, @field, [class: @classes] ++ Map.to_list(@rest))}
@@ -522,9 +541,11 @@ defmodule PetalComponents.Form do
522541
attr(:rest, :global, include: @form_attrs)
523542

524543
def checkbox_group(assigns) do
544+
errors = used_input_errors(assigns)
545+
525546
assigns =
526547
assigns
527-
|> assign_defaults(checkbox_classes(field_has_errors?(assigns)))
548+
|> assign_defaults(checkbox_classes(errors))
528549
|> assign_new(:checked, fn ->
529550
values =
530551
case Phoenix.HTML.Form.input_value(assigns[:form], assigns[:field]) do
@@ -576,7 +597,8 @@ defmodule PetalComponents.Form do
576597
attr(:rest, :global, include: @checkbox_form_attrs)
577598

578599
def switch(assigns) do
579-
assigns = assign_defaults(assigns, switch_classes(field_has_errors?(assigns)))
600+
errors = used_input_errors(assigns)
601+
assigns = assign_defaults(assigns, switch_classes(errors))
580602

581603
~H"""
582604
<label class={["pc-switch", "pc-switch--#{@size}"]}>
@@ -587,8 +609,8 @@ defmodule PetalComponents.Form do
587609
"""
588610
end
589611

590-
defp switch_classes(has_errors) do
591-
"#{if has_errors, do: "has-error", else: ""} sr-only peer"
612+
defp switch_classes(errors) do
613+
"#{if errors != [], do: "has-error", else: ""} sr-only peer"
592614
end
593615

594616
attr(:form, :any, default: nil, doc: "")
@@ -599,7 +621,8 @@ defmodule PetalComponents.Form do
599621
attr(:rest, :global, include: @form_attrs)
600622

601623
def radio(assigns) do
602-
assigns = assign_defaults(assigns, radio_classes(field_has_errors?(assigns)))
624+
errors = used_input_errors(assigns)
625+
assigns = assign_defaults(assigns, radio_classes(errors))
603626

604627
~H"""
605628
{Form.radio_button(@form, @field, @value, [class: @classes] ++ Map.to_list(@rest))}
@@ -615,9 +638,11 @@ defmodule PetalComponents.Form do
615638
attr(:rest, :global, include: @form_attrs)
616639

617640
def radio_group(assigns) do
641+
errors = used_input_errors(assigns)
642+
618643
assigns =
619644
assigns
620-
|> assign_defaults(radio_classes(field_has_errors?(assigns)))
645+
|> assign_defaults(radio_classes(errors))
621646

622647
~H"""
623648
<div class={radio_group_layout_classes(%{layout: @layout})}>
@@ -636,7 +661,8 @@ defmodule PetalComponents.Form do
636661
attr(:rest, :global, include: @form_attrs)
637662

638663
def hidden_input(assigns) do
639-
assigns = assign_defaults(assigns, text_input_classes(field_has_errors?(assigns)))
664+
errors = used_input_errors(assigns)
665+
assigns = assign_defaults(assigns, text_input_classes(errors))
640666

641667
~H"""
642668
{Form.hidden_input(@form, @field, Map.to_list(@rest))}
@@ -650,18 +676,14 @@ defmodule PetalComponents.Form do
650676
def form_field_error(assigns) do
651677
assigns =
652678
assigns
653-
|> assign(:translated_errors, generated_translated_errors(assigns.form, assigns.field))
679+
|> assign(:translated_errors, generated_translated_errors(assigns))
654680

655681
~H"""
656-
<%= if field_has_errors?(assigns) and used_input?(@form[@field]) do %>
657-
<div class={@class}>
658-
<%= for translated_error <- @translated_errors do %>
659-
<div class="pc-form-field-error invalid-feedback">
660-
{translated_error}
661-
</div>
662-
<% end %>
682+
<div :if={@translated_errors != []} class={@class}>
683+
<div :for={translated_error <- @translated_errors} class="pc-form-field-error invalid-feedback">
684+
{translated_error}
663685
</div>
664-
<% end %>
686+
</div>
665687
"""
666688
end
667689

@@ -678,10 +700,10 @@ defmodule PetalComponents.Form do
678700
"""
679701
end
680702

681-
defp generated_translated_errors(form, field) do
703+
defp generated_translated_errors(assigns) do
682704
translate_error = translator_from_config() || (&translate_error/1)
683705

684-
Keyword.get_values(form.errors || [], field)
706+
used_input_errors(assigns)
685707
|> Enum.map(fn error ->
686708
translate_error.(error)
687709
end)
@@ -731,38 +753,40 @@ defmodule PetalComponents.Form do
731753
end
732754

733755
defp label_classes(assigns) do
756+
errors = used_input_errors(assigns)
757+
734758
type_classes =
735759
if Enum.member?(["checkbox", "radio"], assigns[:type]) do
736760
"pc-label--for-checkbox"
737761
else
738762
""
739763
end
740764

741-
"#{if field_has_errors?(assigns), do: "has-error", else: ""} #{type_classes} #{assigns[:class] || ""} pc-label"
765+
"#{if errors != [], do: "has-error", else: ""} #{type_classes} #{assigns[:class] || ""} pc-label"
742766
end
743767

744-
defp text_input_classes(has_error) do
745-
"#{if has_error, do: "has-error", else: ""} pc-text-input"
768+
defp text_input_classes(errors) do
769+
"#{if errors != [], do: "has-error", else: ""} pc-text-input"
746770
end
747771

748-
defp select_classes(has_error) do
749-
"#{if has_error, do: "has-error", else: ""} pc-select"
772+
defp select_classes(errors) do
773+
"#{if errors != [], do: "has-error", else: ""} pc-select"
750774
end
751775

752-
defp file_input_classes(has_error) do
753-
"#{if has_error, do: "has-error", else: ""} pc-file-input"
776+
defp file_input_classes(errors) do
777+
"#{if errors != [], do: "has-error", else: ""} pc-file-input"
754778
end
755779

756-
defp color_input_classes(has_error) do
757-
"#{if has_error, do: "has-error", else: ""} pc-color-input"
780+
defp color_input_classes(errors) do
781+
"#{if errors != [], do: "has-error", else: ""} pc-color-input"
758782
end
759783

760-
defp range_input_classes(has_error) do
761-
"#{if has_error, do: "has-error", else: ""} pc-range-input"
784+
defp range_input_classes(errors) do
785+
"#{if errors != [], do: "has-error", else: ""} pc-range-input"
762786
end
763787

764-
defp checkbox_classes(has_error) do
765-
"#{if has_error, do: "has-error", else: ""} pc-checkbox"
788+
defp checkbox_classes(errors) do
789+
"#{if errors != [], do: "has-error", else: ""} pc-checkbox"
766790
end
767791

768792
defp checkbox_group_layout_classes(assigns) do
@@ -805,16 +829,13 @@ defmodule PetalComponents.Form do
805829
end
806830
end
807831

808-
defp radio_classes(has_error) do
809-
"#{if has_error, do: "has-error", else: ""} pc-radio"
832+
defp radio_classes(errors) do
833+
"#{if errors != [], do: "has-error", else: ""} pc-radio"
810834
end
811835

812-
defp field_has_errors?(%{form: form, field: field}) when is_map(form) do
813-
case Keyword.get_values(form.errors || [], field) do
814-
[] -> false
815-
_ -> used_input?(form[field])
816-
end
836+
defp used_input_errors(%{form: form, field: field}) when not is_nil(form) do
837+
if used_input?(form[field]), do: form[field].errors, else: []
817838
end
818839

819-
defp field_has_errors?(_), do: false
840+
defp used_input_errors(_), do: []
820841
end

0 commit comments

Comments
 (0)