Packages
phoenix_kit
1.7.82
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/modules/customer_service/web/edit.html.heex
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={if @action == :new, do: "New Ticket", else: "Edit Ticket"}
current_path={@url_path}
project_title={@project_title}
>
<div class="container mx-auto px-4 py-6 max-w-3xl">
<.admin_page_header back={PhoenixKit.Utils.Routes.path("/admin/customer-service/tickets")} />
<div class="card bg-base-100 shadow">
<div class="card-body">
<h1 class="card-title text-2xl mb-6">
{if @action == :new, do: "New Ticket", else: "Edit Ticket"}
</h1>
<.form for={@form} phx-change="validate" phx-submit="save" class="space-y-6">
<%!-- Customer (for new tickets) --%>
<%= if @action == :new do %>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Customer</span>
</label>
<select name="ticket[user_uuid]" class="select select-bordered w-full">
<option value="">Current User (You)</option>
<%= for user <- @all_users do %>
<option value={user.uuid}>{user.email}</option>
<% end %>
</select>
<label class="label">
<span class="label-text-alt text-base-content/50">
Select the customer this ticket is for
</span>
</label>
</div>
<% end %>
<%!-- Title --%>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Title</span>
<span class="label-text-alt text-error">Required</span>
</label>
<input
type="text"
name="ticket[title]"
value={@form[:title].value}
class={"input input-bordered w-full #{if @form[:title].errors != [], do: "input-error"}"}
placeholder="Brief description of the issue"
required
/>
<%= if @form[:title].errors != [] do %>
<label class="label">
<span class="label-text-alt text-error">
{Enum.map(@form[:title].errors, fn {msg, _} -> msg end) |> Enum.join(", ")}
</span>
</label>
<% end %>
</div>
<%!-- Description --%>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Description</span>
<span class="label-text-alt text-error">Required</span>
</label>
<textarea
name="ticket[description]"
class={"textarea textarea-bordered w-full h-40 #{if @form[:description].errors != [], do: "textarea-error"}"}
placeholder="Describe the issue in detail..."
required
>{@form[:description].value}</textarea>
<%= if @form[:description].errors != [] do %>
<label class="label">
<span class="label-text-alt text-error">
{Enum.map(@form[:description].errors, fn {msg, _} -> msg end) |> Enum.join(", ")}
</span>
</label>
<% end %>
</div>
<%!-- Assignment (for edit) --%>
<%= if @action == :edit do %>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Assigned To</span>
</label>
<select name="ticket[assigned_to_uuid]" class="select select-bordered w-full">
<option value="">Unassigned</option>
<%= for user <- @staff_users do %>
<option
value={user.uuid}
selected={to_string(@form[:assigned_to_uuid].value) == to_string(user.uuid)}
>
{user.email}
</option>
<% end %>
</select>
</div>
<%!-- Status (for edit) --%>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Status</span>
</label>
<select name="ticket[status]" class="select select-bordered w-full">
<option value="open" selected={@form[:status].value == "open"}>Open</option>
<option value="in_progress" selected={@form[:status].value == "in_progress"}>
In Progress
</option>
<option value="resolved" selected={@form[:status].value == "resolved"}>
Resolved
</option>
<option value="closed" selected={@form[:status].value == "closed"}>Closed</option>
</select>
</div>
<% end %>
<%!-- Attachments (for new tickets) --%>
<%= if @action == :new and @attachments_enabled do %>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Attachments</span>
<span class="label-text-alt text-base-content/50">Optional</span>
</label>
<%= if Enum.any?(@pending_files) do %>
<div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-3">
<%= for file <- @pending_files do %>
<div class="relative group border rounded-lg overflow-hidden">
<%= if file.file_type == "image" do %>
<img
src={
PhoenixKit.Modules.Storage.get_public_url_by_variant(
file,
"thumbnail"
)
}
alt={file.original_file_name}
class="w-full h-20 object-cover"
/>
<% else %>
<div class="w-full h-20 flex items-center justify-center bg-base-200">
<.icon name="hero-document" class="w-6 h-6 text-base-content/50" />
</div>
<% end %>
<div class="p-1">
<div class="text-xs truncate">{file.original_file_name}</div>
</div>
<button
type="button"
phx-click="remove_pending_file"
phx-value-uuid={file.uuid}
class="absolute top-1 right-1 btn btn-circle btn-xs btn-error opacity-0 group-hover:opacity-100 transition-opacity"
>
<.icon name="hero-x-mark" class="w-3 h-3" />
</button>
</div>
<% end %>
</div>
<% end %>
<button
type="button"
phx-click="open_media_selector"
class="btn btn-outline btn-sm w-fit"
>
<.icon name="hero-paper-clip" class="w-4 h-4" />
{if Enum.any?(@pending_files), do: "Add More Files", else: "Attach Files"}
</button>
</div>
<% end %>
<%!-- Actions --%>
<div class="flex justify-end gap-3 pt-4">
<.link
navigate={PhoenixKit.Utils.Routes.path("/admin/customer-service/tickets")}
class="btn btn-ghost"
>
Cancel
</.link>
<button type="submit" class="btn btn-primary">
{if @action == :new, do: "Create Ticket", else: "Save Changes"}
</button>
</div>
</.form>
</div>
</div>
<%!-- Media Selector Modal (for new tickets) --%>
<%= if @action == :new and @attachments_enabled do %>
<.live_component
module={PhoenixKitWeb.Live.Components.MediaSelectorModal}
id="new-ticket-media-selector"
show={@show_media_selector}
mode={:multiple}
selected_uuids={@pending_file_uuids}
phoenix_kit_current_user={@current_user}
/>
<% end %>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>