blob: 6461b38c8a227c2b3a04a5a29ca84f8699fc3356 (
plain)
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 | class ComplianceControlSetsController < ChouetteController
  include PolicyChecker
  defaults resource_class: ComplianceControlSet
  include RansackDateFilter
  before_action only: [:index] { set_date_time_params("updated_at", DateTime) }
  respond_to :html
  def index
    index! do |format|
      format.html {
        @compliance_control_sets = decorate_compliance_control_sets(@compliance_control_sets)
      }
    end
  end
  def show
    show! do |format|
      # But now nobody is aware anymore that `format.html` passes a parameter into the block
      format.html { show_for_html }
    end
  end
  def clone
    ComplianceControlSetCloner.new.copy(params[:id], current_organisation.id)
    flash[:notice] = I18n.t("compliance_control_sets.errors.operation_in_progress")
    redirect_to(compliance_control_sets_path)
  end
  protected
  def begin_of_association_chain
    current_organisation
  end
  private
  def collection
    @compliance_control_sets ||= begin
      scope = end_of_association_chain.all
      scope = self.ransack_period_range(scope: scope, error_message: t('imports.filters.error_period_filter'), query: :where_updated_at_between)
      @q_for_form = scope.ransack(params[:q])
      compliance_control_sets = @q_for_form.result
      compliance_control_sets = joins_with_associated_objects(compliance_control_sets).order(sort_column + ' ' + sort_direction) if sort_column && sort_direction
      compliance_control_sets = compliance_control_sets.paginate(page: params[:page], per_page: 30)
    end
  end
  def decorate_compliance_control_sets(compliance_control_sets)
    ComplianceControlSetDecorator.decorate(compliance_control_sets)
  end
  def decorate_compliance_controls(compliance_controls)
    ComplianceControlDecorator.decorate(compliance_controls)
  end
  def compliance_control_set_params
    params.require(:compliance_control_set).permit(:name, :id)
  end
  def show_for_html
    @q_controls_form        = @compliance_control_set.compliance_controls.ransack(params[:q])
    @compliance_control_set = @compliance_control_set.decorate
    compliance_controls    =
      decorate_compliance_controls( @q_controls_form.result)
      .group_by(&:compliance_control_block)
    @direct_compliance_controls        = compliance_controls.delete nil
    @blocks_to_compliance_controls_map = compliance_controls
  end
  def sort_column
    case params[:sort]
      when 'name' then 'lower(compliance_control_sets.name)'
      when 'owner_jdc' then 'lower(organisations.name)'
      when 'control_numbers' then 'COUNT(compliance_controls.id)'
      else
        ComplianceControlSet.column_names.include?(params[:sort]) ? params[:sort] : 'lower(compliance_control_sets.name)'
    end
  end
  def joins_with_associated_objects(collection)
    # dont know if this is the right way to do it but since we need to join table deoending of the params
    # it was to avoid loading associated objects if we don't need them
    case params[:sort]
      when 'owner_jdc'
        collection.joins("LEFT JOIN organisations ON compliance_control_sets.organisation_id = organisations.id")
      when 'control_numbers'
        collection.joins("LEFT JOIN compliance_controls ON compliance_controls.compliance_control_set_id = compliance_control_sets.id").group(:id)
      else
        collection
    end
  end
  def sort_direction
    %w[asc desc].include?(params[:direction]) ?  params[:direction] : 'asc'
  end
end
 |