Module: CrudComponents::Presenters::ColumnSelection
- Included in:
- Collection, Record
- Defined in:
- lib/crud_components/presenters/column_selection.rb
Overview
Shared "which columns are shown" logic for any presenter that exposes
available_fields (the permitted universe) and a param_prefix. Two knobs
drive it (set as @picker and @picked_columns by the including presenter):
@picker false → no picking (the fieldset governs); true → the view
participates (a collection also renders the gear).
@picked_columns :auto → read the `?cols=` submit; an Array → that exact
selection, **without ever reading the param** (the backend
already resolved it — from a persisted pref, or from the
param via {CrudComponents.selected_columns}).
The chosen selection is always intersected with available_fields — so a
forged or stale selection can only hide or reorder columns, never reveal one
the if: gate forbids. Mixed into both the collection and the record
presenter, so a column picker drives a table and a detail view alike.
Instance Method Summary collapse
-
#column_visible?(field) ⇒ Boolean
Is this column part of the current view (ticked in the picker)?.
-
#field_groups ⇒ Object
The column-picker universe grouped by source model (Pipedrive-style):
[[model, fields], …]with this collection's own model first, then each associated model in first-appearance order. -
#fields ⇒ Object
The columns actually rendered: the permitted set, narrowed and ordered by the user's selection when there is one.
-
#group_heading(group_model) ⇒ Object
A picker group's heading text and icon (no prefix), for a grouped model.
- #group_icon(group_model) ⇒ Object
-
#visible_columns ⇒ Object
The ordered column names to show, or nil for "all permitted".
Instance Method Details
#column_visible?(field) ⇒ Boolean
Is this column part of the current view (ticked in the picker)?
26 |
# File 'lib/crud_components/presenters/column_selection.rb', line 26 def column_visible?(field) = fields.include?(field) |
#field_groups ⇒ Object
The column-picker universe grouped by source model (Pipedrive-style):
[[model, fields], …] with this collection's own model first, then each
associated model in first-appearance order. So publisher,
publisher.name and publisher.founded_on cluster under Publisher.
32 33 34 35 36 |
# File 'lib/crud_components/presenters/column_selection.rb', line 32 def field_groups by_model = available_fields.group_by(&:group_model) ordered = [model, *(by_model.keys - [model])] ordered.filter_map { |m| [m, by_model[m]] if by_model[m] } end |
#fields ⇒ Object
The columns actually rendered: the permitted set, narrowed and ordered by the user's selection when there is one.
21 22 23 |
# File 'lib/crud_components/presenters/column_selection.rb', line 21 def fields @fields ||= select_visible(available_fields) end |
#group_heading(group_model) ⇒ Object
A picker group's heading text and icon (no prefix), for a grouped model.
39 |
# File 'lib/crud_components/presenters/column_selection.rb', line 39 def group_heading(group_model) = group_model.model_name.human |
#group_icon(group_model) ⇒ Object
40 |
# File 'lib/crud_components/presenters/column_selection.rb', line 40 def group_icon(group_model) = Structure.for(group_model).icon |
#visible_columns ⇒ Object
The ordered column names to show, or nil for "all permitted". The selection
is independent of the gear: a resolved Array always applies (the backend
decided it — the gear may live elsewhere, e.g. a standalone picker or a
detail view), verbatim and without reading the param. :auto reads the
?cols= submit only when a gear is rendered here (picker: true); with
no gear here, :auto means "don't narrow" (a stray ?cols= is ignored).
48 49 50 51 52 53 54 55 |
# File 'lib/crud_components/presenters/column_selection.rb', line 48 def visible_columns return @visible_columns if defined?(@visible_columns) @visible_columns = if @picked_columns.is_a?(Array) then @picked_columns elsif @picker then cols_param end end |