Skip to content

Commit ca3e7ef

Browse files
feat: unlimited entries on activities
1 parent 5380d9c commit ca3e7ef

5 files changed

Lines changed: 43 additions & 11 deletions

File tree

lib/atomic/activities/activity.ex

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ defmodule Atomic.Activities.Activity do
99
alias Atomic.Location
1010
alias Atomic.Organizations.Organization
1111

12-
@required_fields ~w(title description start finish maximum_entries enrolled organization_id)a
13-
@optional_fields ~w()a
12+
@required_fields ~w(title description start finish enrolled organization_id)a
13+
@optional_fields ~w(maximum_entries)a
1414

1515
@derive {
1616
Flop.Schema,
@@ -29,7 +29,7 @@ defmodule Atomic.Activities.Activity do
2929
field :start, :naive_datetime
3030
field :finish, :naive_datetime
3131

32-
field :maximum_entries, :integer
32+
field :maximum_entries, :integer, default: nil
3333
field :enrolled, :integer, default: 0
3434

3535
field :image, Uploaders.Post.Type
@@ -102,6 +102,8 @@ defmodule Atomic.Activities.Activity do
102102
end
103103
end
104104

105+
def validate_enrollments_values(_enrolled, nil, changeset), do: changeset
106+
105107
def validate_enrollments_values(enrolled, maximum_entries, changeset) do
106108
if enrolled > maximum_entries do
107109
add_error(changeset, :maximum_entries, gettext("maximum number of enrollments reached"))

lib/atomic_web/live/activity_live/form_component.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ defmodule AtomicWeb.ActivityLive.FormComponent do
2424
|> assign_form(changeset)
2525
|> assign(:description_modal, false)
2626
|> assign(:maximum_entries_modal, false)
27+
|> assign(:has_max_capacity?, true)
2728
|> assign(:has_description?, initial_description)
2829
|> allow_upload(:image, accept: Uploaders.Post.extension_whitelist(), max_entries: 1)}
2930
end
@@ -72,6 +73,13 @@ defmodule AtomicWeb.ActivityLive.FormComponent do
7273
|> assign(:maximum_entries_modal, not socket.assigns.maximum_entries_modal)}
7374
end
7475

76+
@impl true
77+
def handle_event("remove_max_capacity", _, socket) do
78+
{:noreply, socket
79+
|> assign(:has_max_capacity?, false)
80+
|> assign(:maximum_entries_modal, not socket.assigns.maximum_entries_modal)}
81+
end
82+
7583
defp save_activity(socket, :new, activity_params) do
7684
case Activities.create_activity_with_post(activity_params, &consume_image_data(socket, &1)) do
7785
{:ok, _activity} ->

lib/atomic_web/live/activity_live/form_component.html.heex

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,36 @@
8787
Capacity
8888
</label>
8989
<.button id="capacity_button" type="button" class="lg:w-full flex flex-col items-start px-3 py-3 border-gray-300 rounded-md bg-white text-gray-300 group atomic-button atomic-button--primary-outline focus-within:bg-white" phx-click="toggle_maximum_entries_modal" phx-target={@myself}>
90-
<.field
90+
<%= if @has_max_capacity? do %>
91+
<.field
92+
class="text-sm p-0 bg-transparent border-none shadow-none cursor-pointer focus:outline-none focus:ring-0 focus:border-transparent text-gray-900"
93+
type="number"
94+
field={@form[:maximum_entries]}
95+
label="Maximum entries"
96+
placeholder="Choose maximum entries"
97+
readonly
98+
required
99+
label_class="hidden"
100+
wrapper_class="m-0"
101+
error_class="text-danger-600 placeholder-danger-700"
102+
error_label_class="text-danger-700"
103+
/>
104+
<% else %>
105+
<.field
91106
class="text-sm p-0 bg-transparent border-none shadow-none cursor-pointer focus:outline-none focus:ring-0 focus:border-transparent text-gray-900"
92107
type="number"
93108
field={@form[:maximum_entries]}
94109
label="Maximum entries"
95-
placeholder="Choose maximum entries"
110+
placeholder="Unlimited"
96111
readonly
112+
value="nil"
97113
required
98114
label_class="hidden"
99115
wrapper_class="m-0"
100116
error_class="text-danger-600 placeholder-danger-700"
101117
error_label_class="text-danger-700"
102118
/>
119+
<% end %>
103120
</.button>
104121

105122
<div class="mt-4 flex-grow">
@@ -128,13 +145,17 @@
128145
<.modal :if={@maximum_entries_modal} id="maximum_entries_modal" show on_cancel={JS.push("toggle_maximum_entries_modal", target: @myself)}>
129146
<div class="w-full h-full">
130147
<div class="">
131-
<.field class="" type="number" field={@form[:maximum_entries]} placeholder="Choose maximum entries" />
148+
<%= if @has_max_capacity? do %>
149+
<.field class="" type="number" field={@form[:maximum_entries]} placeholder="Choose maximum entries" />
150+
<% else %>
151+
<.field class="" type="number" value="nil" field={@form[:maximum_entries]} placeholder="Unlimited"/>
152+
<% end %>
132153
</div>
133154
<div class="flex gap-3">
134155
<.button type="button" phx-click="toggle_maximum_entries_modal" phx-target={@myself}>
135156
Close
136157
</.button>
137-
<.button type="button" phx-click="" phx-target={@myself}>
158+
<.button type="button" phx-target={@myself} phx-click="remove_max_capacity">
138159
Remove limit
139160
</.button>
140161
</div>

lib/atomic_web/live/activity_live/show.html.heex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
<div class="flex items-center gap-2">
8282
<.icon name="hero-user-group" class="h-5 w-5 text-gray-700" />
8383
<p class="font-medium">
84-
<%= @activity.enrolled %> / <%= @activity.maximum_entries %>
84+
<%= @activity.enrolled %> <%= if @activity.maximum_entries, do: "/ #{@activity.maximum_entries}" %>
8585
</p>
8686
</div>
8787
</.link>
@@ -199,7 +199,8 @@
199199
<h2 class="mb-4 flex-1 select-none truncate text-lg font-semibold text-zinc-900">Participants</h2>
200200
<div class="border-t border-l">
201201
<.table items={@participants} meta={@meta} filter={[]}>
202-
<:col :let={participant} label="Name"><%= participant.name %></:col>
202+
<:col :let={participant} label="Name"><.link navigate={~p"/profile/#{participant.slug}"} class="hover:underline"><%= participant.name %></.link>
203+
</:col>
203204
<:col :let={participant} label="Email"><%= participant.email %></:col>
204205
<:col :let={participant} label="Phone number"><%= participant.phone_number %></:col>
205206
</.table>
@@ -219,7 +220,7 @@
219220
<!-- Ticket show modal -->
220221
<.modal :if={@live_action in [:ticket] and @enrolled?} id="ticket-modal" show on_cancel={JS.patch(~p"/activities/#{@activity.id}")}>
221222
<div class="w-full flex flex-col gap-2 text-center place-items-center">
222-
<p class="text-md font-semibold text-gray-900">
223+
<p class="text-md font-semibold text-gray-900 sm:w-1/2">
223224
<%= gettext("Show this code to the staff present at the activity to register your presence.") %>
224225
</p>
225226
<%= draw_ticket_qr_code(@enrollment_id) |> raw %>

priv/repo/migrations/20221022010100_create_activities.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ defmodule Atomic.Repo.Migrations.CreateActivities do
1111
add :start, :naive_datetime, null: false
1212
add :finish, :naive_datetime, null: false
1313

14-
add :maximum_entries, :integer, null: false
14+
add :maximum_entries, :integer, null: true
1515
add :enrolled, :integer, default: 0, null: false
1616

1717
add :image, :string

0 commit comments

Comments
 (0)