Class: Www::RoomPlansController

Inherits:
ApplicationController show all
Defined in:
app/controllers/www/room_plans_controller.rb

Overview

noinspection RailsChecklist01

Constant Summary collapse

PREFAB_SHAPES =

Prefab shapes.

{
  square: [
    { x: 243.84296513045595, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 731.5288953913679 },
    { x: 243.84296513045595, y: 731.5288953913679 }
  ],
  l_shape: [
    { x: 243.84296513045595, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 487.6859302609119 },
    { x: 487.6859302609119, y: 487.6859302609119 },
    { x: 487.6859302609119, y: 731.5288953913679 },
    { x: 243.84296513045595, y: 731.5288953913679 }
  ],
  t_shape: [
    { x: 243.84296513045595, y: 243.84296513045595 },
    { x: 975.3718605218238, y: 243.84296513045595 },
    { x: 975.3718605218238, y: 487.6859302609119 },
    { x: 731.5288953913679, y: 487.6859302609119 },
    { x: 731.5288953913679, y: 731.5288953913679 },
    { x: 487.6859302609119, y: 731.5288953913679 },
    { x: 487.6859302609119, y: 487.6859302609119 },
    { x: 243.84296513045595, y: 487.6859302609119 }
  ]
}.freeze

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

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

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

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

#clonevoid

This method returns an undefined value.

Duplicates the current room plan.



119
120
121
# File 'app/controllers/www/room_plans_controller.rb', line 119

def clone
  duplicate_room(@room_plan)
end

#createvoid

This method returns an undefined value.

Creates a room plan from the selected prefab shape (or a square default).



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/controllers/www/room_plans_controller.rb', line 83

def create
  @room_plan = @context_user.room_plans.new(
    units: 'ftin',
    points: params[:prefab].present? ? Www::RoomPlansController::PREFAB_SHAPES[params[:prefab].to_sym] : Www::RoomPlansController::PREFAB_SHAPES[:square],
    heated_area: [],
    heated_area_offset: 4
  )

  if @room_plan.save
    if params[:room_configuration_id]
      room_configuration = @context_user.room_configurations.find(params[:room_configuration_id])
      room_configuration&.update(room_plan_id: @room_plan.id)
    end
    redirect_to edit_room_plan_path(@room_plan, room_configuration_id: params[:room_configuration_id], return: params[:return])
  else
    redirect_to www_room_plans_path
  end
end

#destroyvoid

This method returns an undefined value.

Deletes the room plan, if it's ok to delete.



126
127
128
129
130
131
132
133
134
# File 'app/controllers/www/room_plans_controller.rb', line 126

def destroy
  if @room_plan&.ok_to_delete?
    @room_plan.destroy
    flash[:info] = 'Plan was successfully deleted'
  else
    flash[:error] = 'Plan cannot be deleted because it is referenced by one or more rooms/heated spaces.'
  end
  redirect_to www_room_plans_path
end

#duplicate_room(room) ⇒ void

This method returns an undefined value.

Duplicates a room plan (and its fixtures) for the current user, and
redirects to editing the copy.

Parameters:

  • room (RoomPlan, nil)

    the room plan to duplicate



159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'app/controllers/www/room_plans_controller.rb', line 159

def duplicate_room(room)
  new_room = @context_user.room_plans.create({
                                               **(room&.attributes&.except('id')&.symbolize_keys or {}),
                                               step: 1,
                                               parent_room: room&.id
                                             })

  room&.fixtures&.each do |f|
    f_id = DesignToolFixture.where(class_key: f['key']).pick(:id)
    new_room.room_plan_fixtures.build(design_tool_fixture_id: f_id, fixture_data: f) if f_id
  end
  new_room.save
  redirect_to edit_room_plan_path(new_room)
end

#editvoid

This method returns an undefined value.

Renders the design-tool editor for a room plan, unless it's locked.



68
69
70
71
72
73
74
75
76
77
78
# File 'app/controllers/www/room_plans_controller.rb', line 68

def edit
  if @room_plan.editing_locked?
    flash[:error] = "Plan is locked, please cancel the room/heated space's installation plan request, remove it from the cart or duplicate the room/heated space then edit it's plan."
    redirect_to my_room_path(@room_configuration)
  # elsif params[:share_key]
  #   redirect_to edit_room_plan_path(@room_plan&.id, return: params[:return])
  else
    response.headers['Cache-Control'] = 'private, no-cache, no-store'
    render :edit, layout: 'www/cms_page_fullscreen_blank' if @room_plan
  end
end

#finishvoid

This method returns an undefined value.

Redirects to the room configuration's quote flow (or the quote builder,
for a standalone room plan) once the design is finished.



140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'app/controllers/www/room_plans_controller.rb', line 140

def finish
  if @room_configuration
    redirect_to complete_room_plan_tool_my_room_path(@room_configuration, request.query_parameters), notice: 'Plan was successfully updated.'
  elsif @room_plan
    redirect_to quote_builder_path(
      request.query_parameters.merge(
        custom_room_plan: @room_plan.id,
        heated_area: @room_plan&.heated_sq_ft&.round(2), # quote builder heated_area is different from room_plan
        room_area: @room_plan&.room_area&.round(2)
      )
    )
  end
end

#indexObject

GET /room_plans



40
41
42
# File 'app/controllers/www/room_plans_controller.rb', line 40

def index
  @room_plans = @context_user.room_plans.order('room_plans.updated_at DESC').includes(:room_configurations)
end

#newvoid

This method returns an undefined value.

Renders the "start a new room plan" template picker.



55
56
57
58
59
60
61
62
63
# File 'app/controllers/www/room_plans_controller.rb', line 55

def new
  @rp_templates = ShowcaseLegacy.joins(:room_plan).includes(:room_plan, :room_type, :digital_assets)
  room_types_raw = @rp_templates.select(&:room_type).map { |sc| [sc.room_type_id, sc.room_type.name] }.uniq
  preferred_order = ['Bathroom', 'Shower/Sauna', 'Kitchen']

  preferred, others = room_types_raw.partition { |(_id, name)| preferred_order.include?(name) }
  preferred_sorted = preferred_order.filter_map { |name| preferred.find { |(_id, n)| n == name } }
  @room_types = preferred_sorted + others.sort_by(&:last)
end

#set_room_planvoid

This method returns an undefined value.

Loads @room_plan/@room_configuration, falling back to a shared or
legacy showcase template when the user has no matching room plan.



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'app/controllers/www/room_plans_controller.rb', line 178

def set_room_plan
  begin
    @room_plan = @context_user.room_plans.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    room_plan_original = nil

    room_plan_original = RoomPlan.find(RhcParamSet.find_by(md5_hash_key: params[:share_key])&.processed_parameters&.dig('custom_room_plan')) if params[:share_key]

    if params[:showcase_id]
      legacy = ShowcaseLegacy.find_by(id: params[:showcase_id])
      if legacy
        # `?showcase_id=` is a legacy inbound-link param — the current "Design
        # Your Own" CTA links to /room_plans/new, so anything still arriving
        # with showcase_id is an old external link (e.g. years-old Pinterest
        # pins). After the showcases-v2 migration the showcase's public home
        # is its FloorPlanDisplay page, so 301 these old links there instead
        # of dead-ending an anonymous visitor on the room-plans index. Mirrors
        # the same fallback in Www::ShowcasesController#set_showcase.
        if (fpd = FloorPlanDisplay.find_by(custom_slug: legacy.slug))
          redirect_to www_floor_plan_display_path(fpd), status: :moved_permanently, allow_other_host: false and return
        end

        # No public display for this legacy showcase — fall back to cloning its
        # template plan into the visitor's session for interactive editing.
        if legacy.room_plan_id.present?
          room_plan_original = RoomPlan.find_by(id: legacy.room_plan_id)
          duplicate_room(room_plan_original) and return if room_plan_original
        end
      end
    end

    if room_plan_original
      duplicate_room(room_plan_original)
    else
      flash[:error] = 'Plan could not be found. Session may have expired. Please sign in or start again.'
      redirect_to www_room_plans_path
    end
  end

  return unless @room_plan

  @room_configuration = if params[:room_configuration_id]
                          @context_user.room_configurations.find(params[:room_configuration_id])
                        else
                          @room_plan.room_configurations.last
                        end
end

#showObject

GET /room_plans/1



45
46
47
48
49
50
# File 'app/controllers/www/room_plans_controller.rb', line 45

def show
  respond_to do |format|
    format.json { render json: @room_plan.serialize_state }
    format.html
  end
end

#updatevoid

This method returns an undefined value.

Saves the design-tool's serialized room plan state.



105
106
107
108
109
110
111
112
113
114
# File 'app/controllers/www/room_plans_controller.rb', line 105

def update
  body = JSON.parse(request.body.read)

  if body['rp'].present? && !@room_plan.editing_locked?
    @room_plan.save_state(body['rp'])
    head :accepted
  else
    head :not_acceptable
  end
end