diff --git a/lib/towerops/accounts/user.ex b/lib/towerops/accounts/user.ex index 457f0c1e..48ebb04e 100644 --- a/lib/towerops/accounts/user.ex +++ b/lib/towerops/accounts/user.ex @@ -13,6 +13,7 @@ defmodule Towerops.Accounts.User do alias Ecto.Association.NotLoaded alias Towerops.Organizations.Membership + alias Towerops.Organizations.Organization @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id @@ -36,6 +37,7 @@ defmodule Towerops.Accounts.User do has_many :memberships, Membership has_many :organizations, through: [:memberships, :organization] + belongs_to :default_organization, Organization timestamps(type: :utc_datetime) end @@ -55,7 +57,7 @@ defmodule Towerops.Accounts.User do totp_verified_at: DateTime.t() | nil, last_sudo_at: DateTime.t() | nil, memberships: NotLoaded.t() | [Membership.t()], - organizations: NotLoaded.t() | [Towerops.Organizations.Organization.t()], + organizations: NotLoaded.t() | [Organization.t()], inserted_at: DateTime.t(), updated_at: DateTime.t() } @@ -107,10 +109,11 @@ defmodule Towerops.Accounts.User do """ def profile_changeset(user, attrs) do user - |> cast(attrs, [:first_name, :last_name, :timezone]) + |> cast(attrs, [:first_name, :last_name, :timezone, :default_organization_id]) |> validate_length(:first_name, max: 100) |> validate_length(:last_name, max: 100) |> validate_length(:timezone, max: 100) + |> foreign_key_constraint(:default_organization_id) end @doc """ diff --git a/lib/towerops_web/live/user_settings_live.ex b/lib/towerops_web/live/user_settings_live.ex index b28b998b..80455f14 100644 --- a/lib/towerops_web/live/user_settings_live.ex +++ b/lib/towerops_web/live/user_settings_live.ex @@ -287,8 +287,17 @@ defmodule ToweropsWeb.UserSettingsLive do end defp assign_default_organization(socket) do + user = socket.assigns.current_scope.user organizations = socket.assigns.organizations - default_org = List.first(organizations) + + # Get user's preferred default org, or fall back to first org + default_org = + if user.default_organization_id do + Enum.find(organizations, &(&1.id == user.default_organization_id)) || List.first(organizations) + else + List.first(organizations) + end + assign(socket, :default_organization, default_org) end diff --git a/lib/towerops_web/live/user_settings_live.html.heex b/lib/towerops_web/live/user_settings_live.html.heex index 70342c37..42cce6ef 100644 --- a/lib/towerops_web/live/user_settings_live.html.heex +++ b/lib/towerops_web/live/user_settings_live.html.heex @@ -251,6 +251,48 @@ + +
+ Choose which organization you see by default when logging in or navigating to pages without an organization context. +
+