• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

MushroomObserver / mushroom-observer / 19215856351

09 Nov 2025 11:06PM UTC coverage: 95.046% (+0.02%) from 95.027%
19215856351

push

github

web-flow
Merge pull request #3409 from MushroomObserver/nimmo-phlex-interactive-image

Migrate `matrix_box`, `interactive_image` and `carousel` helpers to new Phlex components

855 of 878 new or added lines in 22 files covered. (97.38%)

9 existing lines in 2 files now uncovered.

29543 of 31083 relevant lines covered (95.05%)

697.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.55
/app/controllers/visual_groups_controller.rb
1
# frozen_string_literal: true
2

3
class VisualGroupsController < ApplicationController
1✔
4
  before_action :login_required
1✔
5

6
  # GET /visual_groups or /visual_groups.json
7
  def index
1✔
8
    @visual_model = VisualModel.find(params[:visual_model_id])
1✔
9
  end
10

11
  # GET /visual_groups/1 or /visual_groups/1.json
12
  def show
1✔
13
    @filter = params[:filter]
2✔
14
    @visual_group = VisualGroup.find(params[:id])
2✔
15
    @vals = calc_show_vals
2✔
16
    setup_pagination
2✔
17
  end
18

19
  # GET /visual_groups/new
20
  def new
1✔
21
    @visual_model = VisualModel.find(params[:visual_model_id])
1✔
22
    @visual_group = VisualGroup.new
1✔
23
  end
24

25
  # GET /visual_groups/1/edit
26
  def edit
1✔
27
    @visual_group = VisualGroup.find(params[:id])
2✔
28
    @filter = params[:filter]
2✔
29
    @filter = @visual_group.name unless @filter && @filter != ""
2✔
30
    @status = status_from_params(params)
2✔
31
    @vals = calc_edit_vals
2✔
32
    setup_pagination
2✔
33
  end
34

35
  def setup_pagination
1✔
36
    @pagination_data = PaginationData.new(
4✔
37
      number_arg: :page,
38
      number: params[:page],
39
      num_per_page: calc_layout_params["count"]
40
    )
41
    @pagination_data.num_total = @vals.length
4✔
42
    @subset = @vals[@pagination_data.from..@pagination_data.to]
4✔
43
  end
44

45
  def status_from_params(params)
1✔
46
    return "included" if params[:commit] == :visual_group_included.t
2✔
47
    return "excluded" if params[:commit] == :visual_group_excluded.t
2✔
48

49
    params[:status] || "needs_review"
2✔
50
  end
51

52
  # POST /visual_groups or /visual_groups.json
53
  def create
1✔
54
    if save_visual_group
3✔
55
      @visual_group.add_initial_images
1✔
56
      redirect_to(visual_model_visual_groups_url(@visual_group.visual_model,
1✔
57
                                                 @visual_group),
58
                  notice: :runtime_visual_group_created_at.t)
59
    else
60
      flash_object_errors(@visual_group)
2✔
61
      redirect_to(new_visual_model_visual_group_url(@visual_group.visual_model))
2✔
62
    end
63
  end
64

65
  # PATCH/PUT /visual_groups/1 or /visual_groups/1.json
66
  def update
1✔
67
    @visual_group = VisualGroup.find(params[:id])
2✔
68
    if @visual_group.update(visual_group_params)
2✔
69
      redirect_to(visual_model_visual_groups_url(@visual_group.visual_model,
1✔
70
                                                 @visual_group),
71
                  notice: :update_visual_group_success.t(
72
                    name: @visual_group.name
73
                  ))
74
    else
75
      flash_object_errors(@visual_group)
1✔
76
      redirect_to(edit_visual_group_url(@visual_group))
1✔
77
    end
78
  end
79

80
  # DELETE /visual_groups/1 or /visual_groups/1.json
81
  def destroy
1✔
82
    @visual_group = VisualGroup.find(params[:id])
1✔
83
    model = @visual_group.visual_model
1✔
84
    @visual_group.destroy
1✔
85

86
    redirect_to(visual_model_visual_groups_url(model),
1✔
87
                notice: :destroy_visual_group_success.t)
88
  end
89

90
  private
1✔
91

92
  # Only allow a list of trusted parameters through.
93
  def visual_group_params
1✔
94
    params.require(:visual_group).permit(:name, :approved, :description)
5✔
95
  end
96

97
  def calc_show_vals
1✔
98
    return unfiltered_images if !@filter || @filter == ""
2✔
99

100
    # For filtered results, get raw arrays then eager-load images
101
    raw_vals = VisualGroupImages.new(@visual_group, @filter, :included).vals
1✔
102

103
    # Extract image IDs and eager-load images
104
    image_ids = raw_vals.map(&:first)
1✔
105
    images_by_id = Image.where(id: image_ids).index_by(&:id)
1✔
106

107
    # Map back to [image, included] format
108
    raw_vals.map { |row| [images_by_id[row[0]], row[1]] }
1✔
109
  end
110

111
  def unfiltered_images
1✔
112
    @visual_group.visual_group_images.
1✔
113
      where(included: true).includes(:image).
114
      map { |vgi| [vgi.image, vgi.included] }
1✔
115
  end
116

117
  def calc_edit_vals
1✔
118
    return relevant_images if @status != "needs_review"
2✔
119

120
    # For "needs_review" status, get raw arrays then eager-load images
121
    raw_vals = VisualGroupImages.new(@visual_group, @filter, :any).vals -
1✔
122
               VisualGroupImages.new(@visual_group, @filter, :reviewed).vals
123

124
    # Extract image IDs and eager-load images
125
    image_ids = raw_vals.map(&:first)
1✔
126
    images_by_id = Image.where(id: image_ids).index_by(&:id)
1✔
127

128
    # Map back to [image, included] format
129
    raw_vals.map { |row| [images_by_id[row[0]], row[1]] }
2✔
130
  end
131

132
  def relevant_images
1✔
133
    @visual_group.visual_group_images.
1✔
134
      where(included: @status != "excluded").includes(:image).
NEW
135
      map { |vgi| [vgi.image, vgi.included] }
×
136
  end
137

138
  def save_visual_group
1✔
139
    @visual_group = VisualGroup.new(visual_group_params)
3✔
140
    @visual_group.visual_model = VisualModel.find(params[:visual_model_id])
3✔
141
    @visual_group.save
3✔
142
  end
143
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc