Packages
phoenix_kit
1.7.192
1.7.210
1.7.209
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/phoenix_kit_web/live/settings/organization.html.heex
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
socket={@socket}
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={gettext("Organization Settings")}
page_subtitle={gettext("Company information shared across Legal and Billing modules")}
current_path={@current_path}
project_title={@project_title}
current_locale={@current_locale}
>
<div class="container mx-auto px-4 py-6">
<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 gap-0.5">
<h2 class="card-title">
<.icon name="hero-building-office-2" class="w-5 h-5" />
{gettext("Company Information")}
</h2>
<p class="text-sm text-base-content/60 flex-none">
{gettext("Used in legal documents and invoices")}
</p>
<form phx-submit="save_company" class="space-y-4">
<%!-- Row: Company Name + Country --%>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<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 w-full"
placeholder={gettext("Your Company Name")}
required
/>
</div>
<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 w-full"
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>
<div class="divider text-xs">{gettext("Address")}</div>
<%!-- Row: Street Address --%>
<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 w-full"
placeholder={gettext("123 Business Street")}
required
/>
</div>
<%!-- Row: Address Line 2 --%>
<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 w-full"
placeholder={gettext("Suite, Floor, Building (optional)")}
/>
</div>
<%!-- Row: City + State/Province + Postal Code --%>
<div class="grid grid-cols-3 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 w-full"
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 w-full"
placeholder={gettext("(optional)")}
/>
</div>
<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 w-full font-mono"
placeholder="10115"
/>
</div>
</div>
<div class="divider text-xs">{gettext("Tax & Registration")}</div>
<%!-- Row: VAT Number + Registration Number --%>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<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 w-full 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 format: %{country}123456789", country: @company_country)}
</span>
</label>
<% end %>
</div>
<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 w-full font-mono"
placeholder={gettext("Business reg. number (optional)")}
/>
</div>
</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>
<%!-- Right column: Bank + Tax + Site URL stacked --%>
<div class="space-y-6">
<%!-- Bank Details --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">
<.icon name="hero-building-library" class="w-5 h-5" />
{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 w-full"
placeholder={gettext("Bank Name")}
/>
</div>
<%!-- Row: IBAN + SWIFT --%>
<div class="grid grid-cols-1 sm:grid-cols-3 gap-4">
<div class="form-control sm:col-span-2">
<label class="label">
<span class="label-text">{gettext("IBAN")}</span>
</label>
<input
type="text"
name="bank_iban"
value={@bank_iban}
class="input input-bordered w-full font-mono"
placeholder="EE00 0000 0000 0000 0000"
/>
</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 w-full font-mono"
placeholder="XXXXEEHH"
/>
</div>
</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>
<%!-- Tax Settings --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">
<.icon name="hero-receipt-percent" class="w-5 h-5" />
{gettext("Tax Settings")}
</h2>
<p class="text-sm text-base-content/60">
{gettext("Default tax rate applied across Billing and Shop modules")}
</p>
<form phx-submit="save_tax" class="space-y-4 mt-4">
<%!-- Row: Enable Tax + Tax Rate --%>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 items-end">
<div class="form-control">
<.checkbox name="tax_enabled" checked={@tax_enabled}>
<span class="font-medium">{gettext("Enable Tax")}</span>
</.checkbox>
</div>
<div class="form-control">
<label class="label">
<span class="label-text">{gettext("Default Tax Rate")}</span>
</label>
<div class="join">
<input
type="number"
name="tax_rate"
value={@tax_rate}
min="0"
max="100"
step="0.01"
class="input input-bordered join-item w-24 font-mono"
phx-change="tax_rate_changed"
phx-debounce="300"
/>
<span class="btn btn-disabled join-item">%</span>
</div>
</div>
</div>
<%= if @suggested_tax_rate do %>
<div class="alert alert-info py-2">
<.icon name="hero-light-bulb" class="w-4 h-4" />
<span class="text-sm">
{gettext("Standard rate for your country: %{rate}%",
rate: @suggested_tax_rate
)}
</span>
<button
type="button"
phx-click="apply_suggested_tax"
class="btn btn-xs btn-primary"
>
{gettext("Apply")}
</button>
</div>
<% end %>
<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 Tax Settings")}
</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">
<.icon name="hero-globe-alt" class="w-5 h-5" />
{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>
</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(
"Company info, tax settings, and bank details are shared across Legal, Billing, and Shop modules."
)}
</p>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>