Packages

phoenix_kit

1.7.21
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
phoenix_kit lib phoenix_kit_web live settings organization.html.heex
Raw

lib/phoenix_kit_web/live/settings/organization.html.heex

<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title="{@project_title} - Organization"
current_path={@current_path}
project_title={@project_title}
current_locale={@current_locale}
>
<div class="container mx-auto px-4 py-6">
<%!-- Header --%>
<div class="flex items-center gap-4 mb-6">
<.link
navigate={PhoenixKit.Utils.Routes.path("/admin/settings")}
class="btn btn-ghost btn-sm"
>
<.icon name="hero-arrow-left" class="w-4 h-4" />
</.link>
<div>
<h1 class="text-3xl font-bold">{gettext("Organization Settings")}</h1>
<p class="text-base-content/60 mt-1">
{gettext("Company information shared across Legal and Billing modules")}
</p>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<%!-- Company Information --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">{gettext("Company Information")}</h2>
<p class="text-sm text-base-content/60">
{gettext("Used in legal documents and invoices")}
</p>
<form phx-submit="save_company" class="space-y-4 mt-4">
<%!-- Company Name (required) --%>
<div class="form-control">
<label class="label">
<span class="label-text">
{gettext("Company Name")} <span class="text-error">*</span>
</span>
</label>
<input
type="text"
name="company_name"
value={@company_name}
class="input input-bordered"
placeholder={gettext("Your Company Name")}
required
/>
</div>
<%!-- Country (required, first for dynamic subdivision label) --%>
<div class="form-control">
<label class="label">
<span class="label-text">
{gettext("Country")} <span class="text-error">*</span>
</span>
</label>
<select
name="company_country"
class="select select-bordered"
phx-change="country_changed"
required
>
<option value="">{gettext("Select country...")}</option>
<%= for {name, code} <- @countries do %>
<option value={code} selected={@company_country == code}>
{name}
</option>
<% end %>
</select>
</div>
<div class="divider">{gettext("Address")}</div>
<%!-- Street Address (required) --%>
<div class="form-control">
<label class="label">
<span class="label-text">
{gettext("Street Address")} <span class="text-error">*</span>
</span>
</label>
<input
type="text"
name="company_address_line1"
value={@company_address_line1}
class="input input-bordered"
placeholder={gettext("123 Business Street")}
required
/>
</div>
<%!-- Address Line 2 (optional) --%>
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("Address Line 2")}</span>
</label>
<input
type="text"
name="company_address_line2"
value={@company_address_line2}
class="input input-bordered"
placeholder={gettext("Suite, Floor, Building (optional)")}
/>
</div>
<%!-- City + State row --%>
<div class="grid grid-cols-2 gap-4">
<div class="form-control">
<label class="label">
<span class="label-text">
{gettext("City")} <span class="text-error">*</span>
</span>
</label>
<input
type="text"
name="company_city"
value={@company_city}
class="input input-bordered"
placeholder={gettext("City")}
required
/>
</div>
<div class="form-control">
<label class="label">
<span class="label-text">{@subdivision_label}</span>
</label>
<input
type="text"
name="company_state"
value={@company_state}
class="input input-bordered"
placeholder={gettext("(optional)")}
/>
</div>
</div>
<%!-- Postal Code --%>
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("Postal Code")}</span>
</label>
<input
type="text"
name="company_postal_code"
value={@company_postal_code}
class="input input-bordered font-mono w-40"
placeholder="10115"
/>
</div>
<div class="divider">{gettext("Tax & Registration")}</div>
<%!-- VAT Number (required) --%>
<div class="form-control">
<label class="label">
<span class="label-text">
{gettext("VAT Number")} <span class="text-error">*</span>
</span>
</label>
<input
type="text"
name="company_vat"
value={@company_vat}
class="input input-bordered font-mono"
placeholder={
if @eu_country, do: "#{@company_country}123456789", else: gettext("Tax ID")
}
required
/>
<%= if @eu_country do %>
<label class="label">
<span class="label-text-alt text-info">
<.icon name="hero-information-circle" class="w-4 h-4 inline" />
{gettext("EU VAT format required (e.g., %{country}123456789)",
country: @company_country
)}
</span>
</label>
<% end %>
</div>
<%!-- Registration Number (optional) --%>
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("Registration Number")}</span>
</label>
<input
type="text"
name="company_registration"
value={@company_registration}
class="input input-bordered font-mono"
placeholder={gettext("Business registration number (optional)")}
/>
</div>
<div class="card-actions justify-end mt-4">
<button type="submit" class="btn btn-primary">
<.icon name="hero-check" class="w-4 h-4" />
{gettext("Save Company Info")}
</button>
</div>
</form>
</div>
</div>
<%!-- Bank Details --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">{gettext("Bank Details")}</h2>
<p class="text-sm text-base-content/60">
{gettext("For bank transfer payments on invoices")}
</p>
<form phx-submit="save_bank" class="space-y-4 mt-4">
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("Bank Name")}</span>
</label>
<input
type="text"
name="bank_name"
value={@bank_name}
class="input input-bordered"
placeholder={gettext("Bank Name")}
/>
</div>
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("IBAN")}</span>
</label>
<input
type="text"
name="bank_iban"
value={@bank_iban}
class="input input-bordered font-mono"
placeholder="EE00 0000 0000 0000 0000"
/>
<label class="label">
<span class="label-text-alt text-base-content/50">
{gettext("International Bank Account Number")}
</span>
</label>
</div>
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("SWIFT/BIC")}</span>
</label>
<input
type="text"
name="bank_swift"
value={@bank_swift}
class="input input-bordered font-mono w-40"
placeholder="XXXXEEHH"
/>
<label class="label">
<span class="label-text-alt text-base-content/50">
{gettext("8 or 11 characters")}
</span>
</label>
</div>
<div class="card-actions justify-end mt-4">
<button type="submit" class="btn btn-primary">
<.icon name="hero-check" class="w-4 h-4" />
{gettext("Save Bank Details")}
</button>
</div>
</form>
</div>
</div>
<%!-- Site URL (from General Settings) --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<div class="flex items-center justify-between">
<h2 class="card-title">{gettext("Site URL")}</h2>
<.link
navigate={
PhoenixKit.Utils.Routes.path("/admin/settings", locale: @current_locale_base)
}
class="btn btn-sm btn-primary"
>
<.icon name="hero-pencil-square" class="w-4 h-4" />
{gettext("Edit in General")}
</.link>
</div>
<p class="text-sm text-base-content/60">
{gettext("Used in legal documents and sitemap generation")}
</p>
<div class="bg-base-200 rounded-lg p-4 mt-4">
<%= if @site_url != "" do %>
<div class="flex items-center gap-2">
<.icon name="hero-globe-alt" class="w-5 h-5 text-primary" />
<a href={@site_url} target="_blank" class="link link-primary">
{@site_url}
</a>
</div>
<% else %>
<div class="flex items-center gap-2 text-base-content/60">
<.icon name="hero-globe-alt" class="w-5 h-5" />
<span class="italic">{gettext("Not configured")}</span>
</div>
<% end %>
</div>
</div>
</div>
</div>
<%!-- Info Alert --%>
<div class="alert alert-info mt-6">
<.icon name="hero-information-circle" class="w-6 h-6" />
<div>
<p class="font-semibold">{gettext("Shared across modules")}</p>
<p class="text-sm">
{gettext(
"This information is used by the Legal module for legal documents and by the Billing module for invoices and receipts."
)}
</p>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>