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
- #composite_dialog? ⇒ Boolean
- #defaults_from_params ⇒ Object
- #dialog_context? ⇒ Boolean
- #dialog_form_url ⇒ Object
- #dialog_locals ⇒ Object
- #dialog_pass_through_params ⇒ Object
- #partial_for_dialog_result_style(style) ⇒ Object
- #render_composite_dialog_form(status: :ok) ⇒ Object
- #render_dialog_form(status: :ok) ⇒ Object
- #render_dialog_form_with_errors ⇒ Object
- #render_dialog_result(result_config:) ⇒ Object
- #render_dialog_success(on_success = "reload", flash_message: nil, result_config: nil) ⇒ Object
-
#resolved_dialog_config ⇒ Object
Merges page dialog defaults with action-level overrides from params.
- #resolved_dialog_page ⇒ Object
Instance Method Details
#composite_dialog? ⇒ 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_params ⇒ Object
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
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_url ⇒ Object
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_locals ⇒ Object
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_params ⇒ Object
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_errors ⇒ Object
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: } ).html_safe, layout: false end |
#resolved_dialog_config ⇒ Object
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_page ⇒ Object
100 101 102 |
# File 'app/controllers/concerns/lcp_ruby/dialog_rendering.rb', line 100 def resolved_dialog_page @page_definition || current_page end |