Skip to content

Commit 6dc6181

Browse files
authored
Enable optional form fields (#193)
* Enable optional form fields * Suffix optional text and email component labels * Update gettext files
1 parent 3b511bc commit 6dc6181

File tree

16 files changed

+2096
-464
lines changed

16 files changed

+2096
-464
lines changed

assets/css/app.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
@import 'tailwindcss';
55
@import './theme.css' layer(theme);
66

7+
@plugin "daisyui" {
8+
themes: light --default;
9+
include: toggle;
10+
}
11+
712
@layer base {
813
*,
914
::after,

lib/claper/forms/field.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ defmodule Claper.Forms.Field do
44

55
@type t :: %__MODULE__{
66
name: String.t(),
7-
type: String.t()
7+
type: String.t(),
8+
required: boolean()
89
}
910

1011
@primary_key false
1112
embedded_schema do
1213
field :name, :string
1314
field :type, :string
15+
field :required, :boolean, default: true
1416
end
1517

1618
@doc false
1719
def changeset(form, attrs \\ %{}) do
1820
form
19-
|> cast(attrs, [:name, :type])
21+
|> cast(attrs, [:name, :type, :required])
2022
|> validate_required([:name, :type])
2123
end
2224
end

lib/claper/forms/form_submit.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ defmodule Claper.Forms.FormSubmit do
2525
def changeset(form_submit, attrs) do
2626
form_submit
2727
|> cast(attrs, [:attendee_identifier, :user_id, :form_id, :response])
28-
|> validate_required([:form_id])
28+
|> validate_required([:form_id, :user_id, :response])
2929
end
3030
end

lib/claper_web/live/event_live/form_component.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ defmodule ClaperWeb.EventLive.FormComponent do
6363
fieldClass="bg-gray-700 text-white"
6464
key={String.to_atom(field.name)}
6565
name={field.name}
66-
required="true"
66+
required={field.required}
6767
value={
6868
if is_nil(assigns.current_form_submit),
6969
do: ~c"",
@@ -77,7 +77,7 @@ defmodule ClaperWeb.EventLive.FormComponent do
7777
fieldClass="bg-gray-700 text-white"
7878
key={String.to_atom(field.name)}
7979
name={field.name}
80-
required="true"
80+
required={field.required}
8181
value={
8282
if is_nil(assigns.current_form_submit),
8383
do: ~c"",

lib/claper_web/live/form_live/form_component.html.heex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
name={gettext("Type")}
3535
required="true"
3636
/>
37+
<ClaperWeb.Component.Input.toggle form={i} key={:required} label={gettext("Required")} />
3738
</div>
3839
<%= if i.index >= 1 do %>
3940
<button

lib/claper_web/views/components/input_component.ex

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule ClaperWeb.Component.Input do
33
Input component for forms
44
"""
55
use ClaperWeb, :view_component
6+
use Gettext, backend: ClaperWeb.Gettext
67

78
def text(assigns) do
89
assigns =
@@ -11,6 +12,10 @@ defmodule ClaperWeb.Component.Input do
1112
|> assign_new(:autofocus, fn -> false end)
1213
|> assign_new(:placeholder, fn -> false end)
1314
|> assign_new(:readonly, fn -> false end)
15+
|> assign_new(:label, fn
16+
%{required: false, name: name} -> ~s/#{name} #{gettext("(optional)")}/
17+
%{name: name} -> name
18+
end)
1419
|> assign_new(:labelClass, fn -> "text-gray-700" end)
1520
|> assign_new(:fieldClass, fn -> "bg-white" end)
1621
|> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end)
@@ -19,7 +24,7 @@ defmodule ClaperWeb.Component.Input do
1924

2025
~H"""
2126
<div class="relative">
22-
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
27+
{label(@form, @key, @label, class: "block text-sm font-medium #{@labelClass}")}
2328
<div class="mt-1">
2429
{text_input(@form, @key,
2530
required: @required,
@@ -103,6 +108,23 @@ defmodule ClaperWeb.Component.Input do
103108
"""
104109
end
105110

111+
attr :form, Phoenix.HTML.Form, required: true
112+
attr :key, :atom, required: true
113+
attr :label, :string, default: nil
114+
attr :labelClass, :string, default: nil
115+
116+
def toggle(assigns) do
117+
~H"""
118+
<div>
119+
{@label &&
120+
PhoenixHTMLHelpers.Form.label(@form, @key, @label,
121+
class: ["block text-sm font-medium", @labelClass || "text-gray-700"]
122+
)}
123+
{PhoenixHTMLHelpers.Form.checkbox(@form, @key, class: "toggle")}
124+
</div>
125+
"""
126+
end
127+
106128
def check(assigns) do
107129
assigns =
108130
assigns
@@ -269,13 +291,17 @@ defmodule ClaperWeb.Component.Input do
269291
|> assign_new(:autofocus, fn -> false end)
270292
|> assign_new(:readonly, fn -> false end)
271293
|> assign_new(:placeholder, fn -> false end)
294+
|> assign_new(:label, fn
295+
%{required: false, name: name} -> ~s/#{name} #{gettext("(optional)")}/
296+
%{name: name} -> name
297+
end)
272298
|> assign_new(:labelClass, fn -> "text-gray-700" end)
273299
|> assign_new(:fieldClass, fn -> "bg-white" end)
274300
|> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end)
275301

276302
~H"""
277303
<div class="relative" x-data={"{input: '#{assigns.value}'}"}>
278-
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
304+
{label(@form, @key, @label, class: "block text-sm font-medium #{@labelClass}")}
279305
<div class="mt-1">
280306
{email_input(@form, @key,
281307
required: @required,

0 commit comments

Comments
 (0)