Module: LcpRuby::DialogRendering

Extended by:
ActiveSupport::Concern
Included in:
DialogsController, ResourcesController, SavedFiltersController
Defined in:
app/controllers/concerns/lcp_ruby/dialog_rendering.rb

Constant Summary collapse

DIALOG_PASS_THROUGH_KEYS =

Pass-through URL params that should survive the dialog form POST round-trip. Used by export and other dialogs that need context from the opening URL.

%w[
  source_presenter batch selection_mode batch_token sort
].freeze

Instance Method Summary collapse

Instance Method Details

#composite_dialog?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 65

def composite_dialog?
  resolved_dialog_page&.composite?
end

#defaults_from_paramsObject



159
160
161
162
163
164
165
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 159

def defaults_from_params
  return {} unless params[:defaults].present?

  allowed = current_model_definition.fields.map(&:name)
  allowed += current_model_definition.associations.map(&:foreign_key).compact
  params[:defaults].permit(*allowed).to_h
end

#dialog_context?Boolean

Returns:

  • (Boolean)


5
6
7
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 5

def dialog_context?
  params[:_dialog].present? || is_a?(LcpRuby::DialogsController)
end

#dialog_form_urlObject



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 121

def dialog_form_url
  if is_a?(LcpRuby::DialogsController)
    page_name = params[:page_name]
    pass_through = dialog_pass_through_params
    if @record.respond_to?(:persisted?) && @record.persisted?
      lcp_ruby.dialog_update_path(page_name: page_name, id: @record.id, **pass_through)
    else
      lcp_ruby.dialog_create_path(page_name: page_name, **pass_through)
    end
  else
    if @record.respond_to?(:new_record?) && @record.new_record?
      resources_path
    else
      resource_path(@record)
    end
  end
end

#dialog_localsObject



87
88
89
90
91
92
93
94
95
96
97
98
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 87

def dialog_locals
  locals = {
    record: @record,
    page: resolved_dialog_page,
    dialog_config: resolved_dialog_config,
    presenter: current_presenter,
    model_definition: current_model_definition,
    layout_builder: @layout_builder
  }
  locals[:form_actions] = @form_actions if defined?(@form_actions) && @form_actions
  locals
end

#dialog_pass_through_paramsObject



145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 145

def dialog_pass_through_params
  result = {}
  DIALOG_PASS_THROUGH_KEYS.each do |key|
    result[key] = params[key] if params[key].present?
  end
  # Pass nested params (f[...], cf[...], ids[], excluded_ids[])
  result[:f] = params[:f].to_unsafe_h if params[:f].present?
  result[:qs] = params[:qs] if params[:qs].present?
  result[:cf] = params[:cf].to_unsafe_h if params[:cf].present?
  result["ids"] = params[:ids] if params[:ids].present?
  result["excluded_ids"] = params[:excluded_ids] if params[:excluded_ids].present?
  result
end

#partial_for_dialog_result_style(style) ⇒ Object



55
56
57
58
59
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 55

def partial_for_dialog_result_style(style)
  case style.to_s
  when "single_secret" then "lcp_ruby/dialogs/show_secret"
  end
end

#render_composite_dialog_form(status: :ok) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 69

def render_composite_dialog_form(status: :ok)
  page = resolved_dialog_page
  main_zone = page.main_zone

  @dialog_zone_data = {}
  page.zones.each do |zone|
    next if zone == main_zone
    next unless zone_accessible?(zone)

    @dialog_zone_data[zone] = resolve_zone_data(zone)
  end

  render html: render_to_string(
    partial: "lcp_ruby/dialogs/dialog_composite_frame",
    locals: dialog_locals.merge(zone_data: @dialog_zone_data, page: page)
  ).html_safe, layout: false, status: status
end

#render_dialog_form(status: :ok) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 9

def render_dialog_form(status: :ok)
  @layout_builder = Presenter::LayoutBuilder.new(current_presenter, current_model_definition)

  if composite_dialog?
    return render_composite_dialog_form(status: status)
  end

  render html: render_to_string(
    partial: "lcp_ruby/dialogs/dialog_frame",
    locals: dialog_locals
  ).html_safe, layout: false, status: status
end

#render_dialog_form_with_errorsObject



61
62
63
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 61

def render_dialog_form_with_errors
  render_dialog_form(status: :unprocessable_content)
end

#render_dialog_result(result_config:) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 33

def render_dialog_result(result_config:)
  cfg = (result_config || {}).transform_keys(&:to_s)

  partial_path = cfg["partial"].presence || partial_for_dialog_result_style(cfg["style"])
  unless partial_path
    raise LcpRuby::MetadataError,
      "dialog_behavior 'show_result' requires result.style or result.partial " \
      "(got style=#{cfg["style"].inspect}, partial=#{cfg["partial"].inspect})"
  end

  locals = {
    record: @record,
    field: cfg["field"],
    title_key: cfg["title_key"],
    warning_key: cfg["warning_key"],
    result_config: cfg
  }

  render html: render_to_string(partial: partial_path, locals: locals).html_safe,
         layout: false
end

#render_dialog_success(on_success = "reload", flash_message: nil, result_config: nil) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 22

def render_dialog_success(on_success = "reload", flash_message: nil, result_config: nil)
  if on_success == "show_result"
    return render_dialog_result(result_config: result_config)
  end

  render html: render_to_string(
    partial: "lcp_ruby/dialogs/success",
    locals: { on_success: on_success, flash_message: flash_message }
  ).html_safe, layout: false
end

#resolved_dialog_configObject

Merges page dialog defaults with action-level overrides from params. Priority: action override (params) > page config > system defaults.



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 106

def resolved_dialog_config
  page = resolved_dialog_page
  base = {
    "size" => page.dialog_size,
    "closable" => page.dialog_closable?,
    "title_key" => page.dialog_title_key,
    "stimulus_controller" => page.dialog_config["stimulus_controller"]
  }

  # Action-level overrides passed via query params (allowlisted keys only)
  allowed_keys = %w[size closable title_key]
  overrides = (params[:dialog_config]&.permit(*allowed_keys)&.to_h || {})
  base.merge(overrides).compact
end

#resolved_dialog_pageObject



100
101
102
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 100

def resolved_dialog_page
  @page_definition || current_page
end