Class: EmployeesController
- Inherits:
-
CrmController
- Object
- ActionController::Base
- ApplicationController
- CrmController
- EmployeesController
- Includes:
- Controllers::RequireTurboFrame
- Defined in:
- app/controllers/employees_controller.rb
Overview
Controller: employees.
Constant Summary collapse
- TAB_ACTIONS =
Tab fragments never render standalone — non-frame hits redirect to show ?tab=.
%i[tab_main tab_praises tab_training tab_goals tab_strengths tab_reviews tab_sales_commissions tab_subordinates tab_assets tab_public_reviews tab_preferences tab_system tab_work_schedule tab_hr_budgets tab_scheduler].freeze
Constants included from Controllers::ReferenceFindable
Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS
Constants included from Controllers::AnalyticsEvents
Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY
Constants included from Controllers::ErrorRendering
Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES
Instance Method Summary collapse
-
#become ⇒ void
Signs the current CRM user in as the employee's account.
-
#create ⇒ void
Creates an employee from submitted params.
-
#destroy ⇒ void
Destroys the employee along with their login account.
-
#do_training_request ⇒ void
Applies the submitted training topic selections, requesting new ones and removing unselected requests.
-
#edit ⇒ void
Renders the employee edit form.
-
#edit_preferences ⇒ void
Renders the employee preferences form.
-
#edit_scheduler_profile ⇒ void
Renders the scheduler profile form.
-
#edit_watch_list ⇒ Object
GET /employees/:id/edit_watch_list.
-
#home ⇒ void
Redirects to the CRM home page.
-
#index ⇒ void
Lists employees, searchable and sortable via Ransack.
-
#new ⇒ void
Renders the new employee form.
-
#reset_sales_watch ⇒ void
Queues a rebuild of the employee's customer sales watch.
-
#show ⇒ void
Shows an employee profile, loading its grouped training topics.
-
#signature_preview ⇒ Object
GET /employees/:id/signature_preview Returns the rendered signature HTML for live preview on the employee form.
-
#tab_assets ⇒ void
Renders the assets tab fragment.
-
#tab_goals ⇒ void
Renders the goals tab fragment.
-
#tab_hr_budgets ⇒ void
Renders the HR budgets tab fragment.
-
#tab_main ⇒ Object
Tab actions for turbo-tabs lazy loading.
-
#tab_praises ⇒ void
Renders the praises tab fragment.
-
#tab_preferences ⇒ void
Renders the preferences tab fragment.
-
#tab_public_reviews ⇒ void
Renders the public reviews tab fragment with survey enrollments.
-
#tab_reviews ⇒ void
Renders the reviews tab fragment with the employee's review history.
-
#tab_sales_commissions ⇒ void
Renders the sales commissions tab fragment, paginated.
-
#tab_scheduler ⇒ void
Renders the scheduler tab fragment with Google Calendar and Zoom status.
-
#tab_strengths ⇒ void
Renders the strengths tab fragment.
-
#tab_subordinates ⇒ void
Renders the subordinates tab fragment with the employee's direct reports.
-
#tab_system ⇒ void
Renders the system tab fragment.
-
#tab_training ⇒ void
Renders the training tab fragment, grouped by topic category.
-
#tab_work_schedule ⇒ void
Renders the work schedule tab fragment.
-
#training_request ⇒ Object
Replaced by tab_training def training @employee = Employee.find params[:id] authorize! :read, Employee load_employee_topics end.
-
#update ⇒ void
Updates an employee from submitted params.
-
#update_mcp_access ⇒ Object
Admin-only: set which MCP services (tool groups) this employee's account may reach.
-
#update_preferences ⇒ void
Saves the employee preferences form.
-
#update_scheduler_profile ⇒ void
Saves the employee's scheduler profile settings.
-
#update_watch_list ⇒ void
Saves the current user's watch list selections and monitoring toggles.
Methods included from Controllers::RequireTurboFrame
require_in_pane_tab_frames, require_turbo_frame
Methods inherited from CrmController
#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie, #touch_employee_last_seen
Methods inherited from ApplicationController
#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y
Methods included from Controllers::ReturnPathHandling
#check_for_return_path, #redirect_to_return_path_or_default
Methods included from Controllers::AnalyticsEvents
#consume_queued_analytics_events, #registration_lead_type, #track_event
Methods included from Controllers::DeviceDetection
Methods included from Controllers::SubdomainDetection
#is_crm_request?, #is_www_request?, #json_request?
Methods included from Controllers::TurboSafeRedirect
Methods included from Controllers::TrackingDetection
#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?
Methods included from Controllers::AcceleratedFileSending
#send_file_accelerated, #send_upload_accelerated
Methods included from Controllers::ErrorRendering
#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback
Methods included from Controllers::TurnstileVerification
#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!
Methods included from Controllers::CloudflareCaching
edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session
Methods included from Controllers::Webpackable
#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?
Methods included from Controllers::Localizable
#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale
Methods included from Controllers::Authenticable
#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak
Methods included from UrlsHelper
#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?
Instance Method Details
#become ⇒ void
This method returns an undefined value.
Signs the current CRM user in as the employee's account.
376 377 378 379 380 381 382 383 384 385 |
# File 'app/controllers/employees_controller.rb', line 376 def become @employee = Employee.find(params[:id]) :become, @employee # Honest strategy label for AuthTrail — programmatic sign_in without a warden # strategy would otherwise be logged as `database_authenticatable`. See # config/initializers/authtrail.rb. request.env[AUTHTRAIL_TRACKED_STRATEGY_ENV_KEY] = 'employee_become' sign_in(:account, @employee.account) redirect_to customers_path end |
#create ⇒ void
This method returns an undefined value.
Creates an employee from submitted params.
341 342 343 344 345 346 347 348 349 |
# File 'app/controllers/employees_controller.rb', line 341 def create @employee = Employee.new(params[:employee]) :create, @employee if @employee.save redirect_to employees_url else render action: 'new', status: :unprocessable_content end end |
#destroy ⇒ void
This method returns an undefined value.
Destroys the employee along with their login account.
365 366 367 368 369 370 371 372 |
# File 'app/controllers/employees_controller.rb', line 365 def destroy employee = Employee.find(params[:id]) :destroy, @employee account = employee.account account.destroy employee.destroy redirect_to employees_url end |
#do_training_request ⇒ void
This method returns an undefined value.
Applies the submitted training topic selections, requesting new ones and
removing unselected requests.
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 |
# File 'app/controllers/employees_controller.rb', line 463 def do_training_request @employee = Employee.find params[:id] topic_ids = params[:topics] || [] # Unselected/unchecked value which were previously requested are now destroyed removable_employee_topics = @employee.employee_topics.where(state: 'requested').where.not(topic_id: topic_ids) removable_employee_topics_size = removable_employee_topics.size removable_employee_topics.destroy_all # New topic are linked new_employee_topics = [] topic_ids.each do |topic_id| new_employee_topic = @employee.employee_topics.where(topic_id: topic_id).first_or_create(state: 'requested') new_employee_topic.request new_employee_topics << new_employee_topic end flash[:info] = "#{new_employee_topics.size} training requests in queue. #{removable_employee_topics_size} removed. We will contact your manager to coordinate training." redirect_to employee_path(tab: "training") end |
#edit ⇒ void
This method returns an undefined value.
Renders the employee edit form.
316 317 318 319 |
# File 'app/controllers/employees_controller.rb', line 316 def edit @employee = Employee.find(params[:id]) :update, @employee end |
#edit_preferences ⇒ void
This method returns an undefined value.
Renders the employee preferences form.
42 43 44 45 |
# File 'app/controllers/employees_controller.rb', line 42 def edit_preferences @employee = Employee.find(params[:id]) (:update_preferences, @employee) end |
#edit_scheduler_profile ⇒ void
This method returns an undefined value.
Renders the scheduler profile form.
280 281 282 283 284 285 286 287 288 289 |
# File 'app/controllers/employees_controller.rb', line 280 def edit_scheduler_profile @employee = Employee.find(params[:id]) (:update_scheduler, @employee) @profile = @employee.scheduler_profile || @employee.build_scheduler_profile( slug: @employee.full_name.parameterize, timezone: 'America/Chicago' ) @gcal_status = TimeOffRequests::GoogleAuthService.check_status(@employee) @zoom_status = check_zoom_status(@employee) end |
#edit_watch_list ⇒ Object
GET /employees/:id/edit_watch_list
Two render modes:
-
Turbo-frame request (Turbo-Frame: modal header) — invoked by the
"Edit Watch List" link in the Communications offcanvas / Home /
Activities menus. Renders the bottom-sliding offcanvas partial
into the<turbo-frame id="modal">slot in the CRM layout. The
auto-offcanvasStimulus controller shows the panel on connect.
No layout wrapper — we don't want to ship the entire CRM chrome
inside the frame.(The frame id is still "modal" because the layout slot is
reused for any modal-or-offcanvas-style on-demand surface; the
name predates this change. Keeping it stable avoids touching
every other consumer of the slot.) -
Normal HTML request — direct URL navigation still renders the
full standalone page (employees/edit_watch_list.html.erb) so
deep links / bookmarks keep working.
405 406 407 408 409 |
# File 'app/controllers/employees_controller.rb', line 405 def edit_watch_list return unless turbo_frame_request? render partial: 'edit_watch_list_offcanvas', layout: false end |
#home ⇒ void
This method returns an undefined value.
Redirects to the CRM home page.
15 16 17 |
# File 'app/controllers/employees_controller.rb', line 15 def home redirect_to crm_home_path end |
#index ⇒ void
This method returns an undefined value.
Lists employees, searchable and sortable via Ransack.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'app/controllers/employees_controller.rb', line 21 def index # What you can see depends on your privileges. params[:q] ||= { inactive_true: '0' } @q = Employee.ransack(params[:q]) if @q.sorts.blank? @q.sorts = if params.dig(:q, :employee_record_next_birthday_gteq).present? || params.dig(:q, :employee_record_next_birthday_lteq).present? 'employee_record_next_birthday' elsif params.dig(:q, :employee_record_next_work_anniversary_gteq).present? || params.dig(:q, :employee_record_next_work_anniversary_lteq).present? 'employee_record_next_work_anniversary' else 'full_name' end end @employees = @q.result.joins(:employee_record).with_associations respond_to do |format| format.html end end |
#new ⇒ void
This method returns an undefined value.
Renders the new employee form.
309 310 311 312 |
# File 'app/controllers/employees_controller.rb', line 309 def new @employee = ::Employee.new :create, @employee end |
#reset_sales_watch ⇒ void
This method returns an undefined value.
Queues a rebuild of the employee's customer sales watch.
439 440 441 442 443 444 445 |
# File 'app/controllers/employees_controller.rb', line 439 def reset_sales_watch @employee = Employee.find(params[:id]) :manage, @employee CustomerWatchWorker.perform_async('employee_id' => @employee.id) flash[:info] = 'Sales watch reset queued for employee' redirect_to_return_path_or_default employee_path(@employee) end |
#show ⇒ void
This method returns an undefined value.
Shows an employee profile, loading its grouped training topics.
83 84 85 86 87 88 89 90 91 |
# File 'app/controllers/employees_controller.rb', line 83 def show @employee = Employee.find(params[:id]) load_employee_topics respond_to do |format| format.html end end |
#signature_preview ⇒ Object
GET /employees/:id/signature_preview
Returns the rendered signature HTML for live preview on the employee form.
Accepts query params to override boolean settings without saving.
324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
# File 'app/controllers/employees_controller.rb', line 324 def signature_preview @employee = Employee.find(params[:id]) :update, @employee # Temporarily override employee_record booleans for the preview record = @employee.employee_record record.hide_signature_call_text_me_directly = params[:hide_signature_call_text_me_directly] == '1' if params.key?(:hide_signature_call_text_me_directly) record.hide_signature_pbx_extension = params[:hide_signature_pbx_extension] == '1' if params.key?(:hide_signature_pbx_extension) record.scheduler_link_type = params[:scheduler_link_type] if params.key?(:scheduler_link_type) record.calendly_link = params[:calendly_link] if params.key?(:calendly_link) theme = params[:theme]&.to_sym || :default render partial: 'communications/signature', locals: { sender_party: @employee, theme: theme }, layout: false end |
#tab_assets ⇒ void
This method returns an undefined value.
Renders the assets tab fragment.
195 196 197 198 199 200 201 202 |
# File 'app/controllers/employees_controller.rb', line 195 def tab_assets @employee = Employee.find(params[:id]) (:read_assets, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_goals ⇒ void
This method returns an undefined value.
Renders the goals tab fragment.
132 133 134 135 136 137 138 139 |
# File 'app/controllers/employees_controller.rb', line 132 def tab_goals @employee = Employee.find(params[:id]) (:read_goals, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_hr_budgets ⇒ void
This method returns an undefined value.
Renders the HR budgets tab fragment.
251 252 253 254 255 256 257 258 |
# File 'app/controllers/employees_controller.rb', line 251 def tab_hr_budgets @employee = Employee.find(params[:id]) (:read_hr_budgets, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_main ⇒ Object
Tab actions for turbo-tabs lazy loading
94 95 96 97 98 99 100 101 |
# File 'app/controllers/employees_controller.rb', line 94 def tab_main @employee = Employee.find(params[:id]) (:read_main, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_praises ⇒ void
This method returns an undefined value.
Renders the praises tab fragment.
105 106 107 108 109 110 111 112 |
# File 'app/controllers/employees_controller.rb', line 105 def tab_praises @employee = Employee.find(params[:id]) (:read_praises, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_preferences ⇒ void
This method returns an undefined value.
Renders the preferences tab fragment.
218 219 220 221 222 223 224 225 |
# File 'app/controllers/employees_controller.rb', line 218 def tab_preferences @employee = Employee.find(params[:id]) (:read_preferences, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_public_reviews ⇒ void
This method returns an undefined value.
Renders the public reviews tab fragment with survey enrollments.
206 207 208 209 210 211 212 213 214 |
# File 'app/controllers/employees_controller.rb', line 206 def tab_public_reviews @employee = Employee.find(params[:id]) (:read_public_reviews, @employee) @enrollments = @employee.survey_enrollments.includes(:survey, :party).order(enrollment_date: :desc).load respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_reviews ⇒ void
This method returns an undefined value.
Renders the reviews tab fragment with the employee's review history.
154 155 156 157 158 159 160 161 162 |
# File 'app/controllers/employees_controller.rb', line 154 def tab_reviews @employee = Employee.find(params[:id]) (:read_reviews, @employee) @reviews = @employee.employee_record.employee_reviews.includes(:employee_record, :reviewer).order(review_date: :desc).load respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_sales_commissions ⇒ void
This method returns an undefined value.
Renders the sales commissions tab fragment, paginated.
166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'app/controllers/employees_controller.rb', line 166 def tab_sales_commissions @employee = Employee.find(params[:id]) (:read_sales_commissions, @employee) @pagy, @sales_commissions = pagy( SalesCommission.where(employee_id: @employee.id).with_employee_name.with_rate.order(commission_date: :desc), limit: 20 ) updater_ids = @sales_commissions.filter_map(&:updater_id).uniq @updaters = Employee.where(id: updater_ids).index_by(&:id) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_scheduler ⇒ void
This method returns an undefined value.
Renders the scheduler tab fragment with Google Calendar and Zoom status.
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
# File 'app/controllers/employees_controller.rb', line 262 def tab_scheduler @employee = Employee.find(params[:id]) (:read_scheduler, @employee) @profile = @employee.scheduler_profile || @employee.build_scheduler_profile( slug: @employee.full_name.parameterize, timezone: 'America/Chicago' ) @gcal_status = TimeOffRequests::GoogleAuthService.check_status(@employee) @zoom_status = check_zoom_status(@employee) @work_schedule = @employee.work_schedules.effective_on(Date.current).first respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_strengths ⇒ void
This method returns an undefined value.
Renders the strengths tab fragment.
143 144 145 146 147 148 149 150 |
# File 'app/controllers/employees_controller.rb', line 143 def tab_strengths @employee = Employee.find(params[:id]) (:read_strengths, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_subordinates ⇒ void
This method returns an undefined value.
Renders the subordinates tab fragment with the employee's direct reports.
183 184 185 186 187 188 189 190 191 |
# File 'app/controllers/employees_controller.rb', line 183 def tab_subordinates @employee = Employee.find(params[:id]) (:read_subordinates, @employee) @direct_reports = @employee.managed_employees.active_employees.order(:full_name).load respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_system ⇒ void
This method returns an undefined value.
Renders the system tab fragment.
229 230 231 232 233 234 235 236 |
# File 'app/controllers/employees_controller.rb', line 229 def tab_system @employee = Employee.find(params[:id]) (:read_system, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_training ⇒ void
This method returns an undefined value.
Renders the training tab fragment, grouped by topic category.
116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'app/controllers/employees_controller.rb', line 116 def tab_training @employee = Employee.find(params[:id]) (:read_training, @employee) params[:q] = { state_in: %w[assigned requested] } if params[:q].blank? @q = @employee.employee_topics.joins(topic: :topic_category) .merge(Topic.sorted).ransack(params[:q]) employee_topics = @q.result @employee_topics_grouped = employee_topics.group_by { |pt| pt.topic.topic_category } respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#tab_work_schedule ⇒ void
This method returns an undefined value.
Renders the work schedule tab fragment.
240 241 242 243 244 245 246 247 |
# File 'app/controllers/employees_controller.rb', line 240 def tab_work_schedule @employee = Employee.find(params[:id]) (:read_work_schedule, @employee) respond_to do |format| format.html { render layout: should_render_layout? } format.turbo_stream end end |
#training_request ⇒ Object
Replaced by tab_training
def training
@employee = Employee.find params[:id]
authorize! :read, Employee
load_employee_topics
end
453 454 455 456 457 458 |
# File 'app/controllers/employees_controller.rb', line 453 def training_request @employee = Employee.find params[:id] available_topics = Topic.active.where(applies_to_employee: true).sorted @employee_topics_indexed = @employee.employee_topics.joins(:topic).merge(available_topics).index_by(&:topic_id) @topics_grouped = available_topics.group_by(&:topic_category) end |
#update ⇒ void
This method returns an undefined value.
Updates an employee from submitted params.
353 354 355 356 357 358 359 360 361 |
# File 'app/controllers/employees_controller.rb', line 353 def update @employee = Employee.find(params[:id]) :update, @employee if @employee.update(params[:employee]) redirect_to employee_path(@employee) else render action: 'edit', status: :unprocessable_content end end |
#update_mcp_access ⇒ Object
Admin-only: set which MCP services (tool groups) this employee's account may
reach. Nobody but admins declares :manage_mcp_access, and admins get it via
CrmAbility's can :manage, :all, so this is admin-gated by construction.
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'app/controllers/employees_controller.rb', line 62 def update_mcp_access @employee = Employee.find(params[:id]) (:manage_mcp_access, @employee) account = @employee.account return redirect_to(employee_path(@employee), alert: 'Employee has no login account.') if account.nil? # Unchecked boxes submit nothing, so a fully-cleared list arrives as no key at # all — Array() turns that into [], which means "fall back to the default set" # rather than "deny everything" (see Account#effective_mcp_services). services = Array(params.dig(:account, :permitted_mcp_services)).map(&:to_s).compact_blank if account.update(permitted_mcp_services: services) redirect_to employee_path(@employee, anchor: 'system'), notice: 'MCP tool access updated.' else redirect_to employee_path(@employee, anchor: 'system'), alert: account.errors..to_sentence end end |
#update_preferences ⇒ void
This method returns an undefined value.
Saves the employee preferences form.
49 50 51 52 53 54 55 56 57 |
# File 'app/controllers/employees_controller.rb', line 49 def update_preferences @employee = Employee.find(params[:id]) (:update_preferences, @employee) if @employee.update(params[:employee]) redirect_to_return_path_or_default employee_path(@employee) else render :edit_preferences, status: :unprocessable_content end end |
#update_scheduler_profile ⇒ void
This method returns an undefined value.
Saves the employee's scheduler profile settings.
293 294 295 296 297 298 299 300 301 302 303 304 305 |
# File 'app/controllers/employees_controller.rb', line 293 def update_scheduler_profile @employee = Employee.find(params[:id]) (:update_scheduler, @employee) @profile = @employee.scheduler_profile || @employee.build_scheduler_profile if @profile.update(scheduler_profile_params) redirect_to employee_path(@employee, tab: 'scheduler'), notice: 'Scheduler settings updated.' else @gcal_status = TimeOffRequests::GoogleAuthService.check_status(@employee) @zoom_status = check_zoom_status(@employee) render :edit_scheduler_profile, status: :unprocessable_content end end |
#update_watch_list ⇒ void
This method returns an undefined value.
Saves the current user's watch list selections and monitoring toggles.
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 |
# File 'app/controllers/employees_controller.rb', line 413 def update_watch_list @employee = Employee.find(params[:employee_id]) @employee.selected_watch_list_employee_ids = params[:watch_list_employee_ids] @employee.selected_watch_list_role_ids = params[:watch_list_role_ids] @employee.monitor_group_sms_numbers = params[:monitor_group_sms_numbers].to_boolean @employee.monitor_unlinked_extensions = params[:monitor_unlinked_extensions].to_boolean @employee.save respond_to do |format| # Modal-driven submit (the common path now): close the dialog + # surface a flash in #notice_area without a full page navigation. # `flash.now` because there's no follow-up request to consume a # standard `flash` — see update_watch_list.turbo_stream.erb. format.turbo_stream do flash.now[:info] = 'Watch list updated' end # Standalone-page fallback: legacy direct-URL submit (no modal), # still redirect-with-flash so the user lands somewhere sensible. format.html do flash[:info] = 'Watch list updated' redirect_to_return_path_or_default edit_watch_list_employee_path(@context_user) end end end |