Files
sure/app/controllers/application_controller.rb
soky srm 560c9fbff3 Family sharing (#1272)
* Initial account sharing changes

* Update schema.rb

* Update schema.rb

* Change sharing UI to modal

* UX fixes and sharing controls

* Scope include in finances better

* Update totals.rb

* Update totals.rb

* Scope reports to finance account scope

* Update impersonation_sessions_controller_test.rb

* Review fixes

* Update schema.rb

* Update show.html.erb

* FIX db validation

* Refine edit permissions

* Review items

* Review

* Review

* Add application level helper

* Critical review

* Address remaining review items

* Fix modals

* more scoping

* linter

* small UI fix

* Fix: Sync broadcasts push unscoped balance sheet to all users

* Update sync_complete_event.rb

 The fix removes the sidebar broadcasts (which rendered unscoped account groups using family.balance_sheet without user context)
  along with the now-unused sidebar_targets, account_group, and family_balance_sheet private methods.

  The sidebar will still update correctly — when the sync completes, Family::SyncCompleteEvent#broadcast fires family.broadcast_refresh, which triggers a
  morph-based page refresh for each user with their own authenticated session, rendering properly scoped sidebar content.
2026-03-25 10:50:23 +01:00

95 lines
2.5 KiB
Ruby

class ApplicationController < ActionController::Base
include RestoreLayoutPreferences, Onboardable, Localize, AutoSync, Authentication, Invitable,
SelfHostable, StoreLocation, Impersonatable, Breadcrumbable,
FeatureGuardable, Notifiable, SafePagination
include Pundit::Authorization
include Pagy::Backend
# Pundit uses current_user by default, but this app uses Current.user
def pundit_user
Current.user
end
before_action :detect_os
before_action :set_default_chat
before_action :set_active_storage_url_options
helper_method :demo_config, :demo_host_match?, :show_demo_warning?
private
def accept_pending_invitation_for(user)
return false if user.blank?
token = session[:pending_invitation_token]
return false if token.blank?
invitation = Invitation.pending.find_by(token: token.to_s)
return false unless invitation
return false unless invitation.accept_for(user)
session.delete(:pending_invitation_token)
true
end
def store_pending_invitation_if_valid
token = params[:invitation].to_s.presence
return if token.blank?
invitation = Invitation.pending.find_by(token: token)
session[:pending_invitation_token] = token if invitation
end
def detect_os
user_agent = request.user_agent
@os = case user_agent
when /Windows/i then "windows"
when /Macintosh/i then "mac"
when /Linux/i then "linux"
when /Android/i then "android"
when /iPhone|iPad/i then "ios"
else ""
end
end
# By default, we show the user the last chat they interacted with
def set_default_chat
@last_viewed_chat = Current.user&.last_viewed_chat
@chat = @last_viewed_chat
end
def set_active_storage_url_options
ActiveStorage::Current.url_options = {
protocol: request.protocol,
host: request.host,
port: request.optional_port
}
end
def demo_config
Rails.application.config_for(:demo)
rescue RuntimeError, Errno::ENOENT, Psych::SyntaxError
nil
end
def demo_host_match?(demo = demo_config)
return false unless demo.is_a?(Hash) && demo["hosts"].present?
demo["hosts"].include?(request.host)
end
def show_demo_warning?
demo_host_match?
end
def accessible_accounts
Current.accessible_accounts
end
helper_method :accessible_accounts
def finance_accounts
Current.finance_accounts
end
helper_method :finance_accounts
end