Packages
phoenix_kit
1.7.220
1.7.220
1.7.219
1.7.218
1.7.217
1.7.216
1.7.215
1.7.214
1.7.213
1.7.212
1.7.211
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="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">
<.input
type="text"
name="company_name"
value={@company_name}
label={gettext("Company Name")}
placeholder={gettext("Your Company Name")}
required
/>
</div>
<div class="form-control">
<.select
name="company_country"
value={@company_country}
phx-change="country_changed"
required
label={gettext("Country")}
prompt={gettext("Select country...")}
options={@countries}
/>
</div>
</div>
<div class="divider text-xs">{gettext("Address")}</div>
<%!-- Row: Street Address --%>
<div class="form-control">
<.input
type="text"
name="company_address_line1"
value={@company_address_line1}
label={gettext("Street Address")}
placeholder={gettext("123 Business Street")}
required
/>
</div>
<%!-- Row: Address Line 2 --%>
<div class="form-control">
<.input
type="text"
name="company_address_line2"
value={@company_address_line2}
label={gettext("Address Line 2")}
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">
<.input
type="text"
name="company_city"
value={@company_city}
label={gettext("City")}
placeholder={gettext("City")}
required
/>
</div>
<div class="form-control">
<.input
type="text"
name="company_state"
value={@company_state}
label={@subdivision_label}
placeholder={gettext("(optional)")}
/>
</div>
<div class="form-control">
<.input
type="text"
name="company_postal_code"
value={@company_postal_code}
label={gettext("Postal Code")}
placeholder="10115"
class="font-mono"
/>
</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">
<.input
type="text"
name="company_vat"
value={@company_vat}
label={gettext("VAT Number")}
placeholder={
if @eu_country, do: "#{@company_country}123456789", else: gettext("Tax ID")
}
required
class="font-mono"
/>
<%= 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">
<.input
type="text"
name="company_registration"
value={@company_registration}
label={gettext("Registration Number")}
placeholder={gettext("Business reg. number (optional)")}
class="font-mono"
/>
</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">
<.input
type="text"
name="bank_name"
value={@bank_name}
label={gettext("Bank Name")}
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">
<.input
type="text"
name="bank_iban"
value={@bank_iban}
label={gettext("IBAN")}
placeholder="EE00 0000 0000 0000 0000"
class="font-mono"
/>
</div>
<div class="form-control">
<.input
type="text"
name="bank_swift"
value={@bank_swift}
label={gettext("SWIFT/BIC")}
placeholder="XXXXEEHH"
class="font-mono"
/>
</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="join-item w-24 font-mono"
wrapper_class="contents"
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>