Module: FlexiAdmin::Controllers::ResourcesController

Extended by:
ActiveSupport::Concern
Defined in:
lib/flexi_admin/controllers/resources_controller.rb

Instance Method Summary collapse

Instance Method Details

#append_toastsObject



27
28
29
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 27

def append_toasts
  turbo_stream.append('toasts', partial: 'shared/toasts')
end

#autocomplete(includes: nil) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 174

def autocomplete(includes: nil)
  base_query = resource_class.with_parent(parent_instance)
                              .fulltext(params[:q])
  base_query = base_query.includes(includes) if includes.present?
  results_count = base_query.count
  results = base_query.limit(100)

  render FlexiAdmin::Components::Shared::Autocomplete::ResultsComponent.new(results:,
                                                                       results_count:,
                                                                       context_params:), layout: false
end

#bulk_actionObject



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 156

def bulk_action
  ids = JSON.parse(params[:ids])

  # Unscoped is needed to get the resources that are not deleted, archived, etc.
  # It should be ok, since we control the ids in the frontend
  @resources = resource_class.unscoped.where(id: ids)
  authorize! :edit, @resources

  bulk_processor = "#{params[:processor].gsub('-', '/').camelize}::Processor".constantize.new(@resources, params)
  result = bulk_processor.perform

  redirect_to_path result.path and return if result.result == :redirect

  flash[result.result] = FlexiAdmin::Models::Toast.new(result.message)

  reload_page
end

#context_paramsObject



58
59
60
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 58

def context_params
  @context_params ||= FlexiAdmin::Models::ContextParams.new(context_permitted_params)
end

#context_permitted_paramsObject



62
63
64
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 62

def context_permitted_params
  @context_permitted_params ||= params.permit(*FlexiAdmin::Models::ContextParams.permitted_params_keys)
end

#createObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 75

def create
  authorize! :create, resource_class

  create_service = begin
    "#{resource_class.model_name.plural.camelize}::Services::Create".constantize
  rescue NameError
    FlexiAdmin::Services::CreateResource
  end

  result = create_service.run(resource_class:, params: create_params)

  if result.valid?
    redirect_to_path polymorphic_path([:admin, result.resource])
  else
    render_new_resource_form(result.resource)
  end
end

#datalistObject



186
187
188
189
190
191
192
193
194
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 186

def datalist
  results = resource_class.fulltext(params[:q])
                          .limit(100)
                          .order(*context_params.params[:ac_fields].map(&:to_sym))
                          .pluck(*context_params.params[:ac_fields].map(&:to_sym))
                          .uniq
  render FlexiAdmin::Components::Shared::Autocomplete::ResultsComponent.new(results:,
                                                                       context_params:), layout: false
end

#editObject



108
109
110
111
112
113
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 108

def edit
  @resource = resource_class.find(params[:id])
  authorize! :update, @resource

  render_edit_resource_form(disabled: disabled?(context_params.form_disabled))
end

#handle_runtime_error(error) ⇒ Object



67
68
69
70
71
72
73
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 67

def handle_runtime_error(error)
  return BugTracker.notify(error) if true

  flash[:error] = FlexiAdmin::Models::Toast.new(error.message)

  render_toasts
end

#redirect_to_path(path) ⇒ Object



54
55
56
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 54

def redirect_to_path(path)
  render turbo_stream: turbo_stream.append('system', partial: 'shared/redirect', locals: { path: })
end

#reload_pageObject

Deprecated



47
48
49
50
51
52
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 47

def reload_page
  render turbo_stream: [
    turbo_stream.append('system', partial: 'shared/reload'),
    turbo_stream.append('toasts', partial: 'shared/toasts')
  ]
end

#render_edit_resource_form(disabled: true) ⇒ Object



134
135
136
137
138
139
140
141
142
143
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 134

def render_edit_resource_form(disabled: true)
  respond_to do |format|
    format.html do
      render turbo_stream: turbo_stream.replace(@resource.form_id, edit_form_component_instance(disabled?(disabled)))
    end
    format.turbo_stream do
      render turbo_stream: turbo_stream.replace(@resource.form_id, edit_form_component_instance(disabled?(disabled)))
    end
  end
end

#render_index(resources, target: nil) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 31

def render_index(resources, target: nil)
  target ||= context_params.frame
  respond_to do |format|
    format.html do
      component_class = "Admin::#{resource_class.name}::IndexPageComponent".constantize
      puts "component_class: #{component_class}"
      render component_class.new(resources, context_params:, scope: resource_class.to_s.downcase)
    end
    format.turbo_stream do
      component_class = "Admin::#{resource_class.name}::ResourcesComponent".constantize
      render turbo_stream: turbo_stream.replace(target, component_class.new(resources, context_params:, scope: resource_class.to_s.downcase))
    end
  end
end

#render_new_resource_form(resource) ⇒ Object



145
146
147
148
149
150
151
152
153
154
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 145

def render_new_resource_form(resource)
  respond_to do |format|
    format.html do
      render new_form_component_instance(resource)
    end
    format.turbo_stream do
      render turbo_stream: turbo_stream.replace(context_params.frame, new_form_component_instance(resource))
    end
  end
end

#render_toastsObject



23
24
25
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 23

def render_toasts
  render turbo_stream: turbo_stream.append('toasts', partial: 'shared/toasts')
end

#showObject



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 93

def show
  @resource = resource_class.find(params[:id])
  authorize! :show, @resource

  respond_to do |format|
    format.html do
      component ||= "Admin::#{resource_class.name}::Show::PageComponent".constantize
      render component.new(@resource, context_params:, scope: resource_class.to_s.downcase)
    end
    format.turbo_stream do
      render turbo_stream: turbo_stream.replace(context_params.frame)
    end
  end
end

#updateObject



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/flexi_admin/controllers/resources_controller.rb', line 115

def update
  @resource = resource_class.find(params[:id])
  authorize! :update, @resource

  update_service = begin
    "#{resource_class.model_name.plural.camelize}::Services::Update".constantize
  rescue NameError
    FlexiAdmin::Services::UpdateResource
  end

  result = update_service.run(resource: @resource, params: resource_params)

  if result.valid?
    render_edit_resource_form(disabled: disabled?(true))
  else
    render_edit_resource_form(disabled: disabled?(false))
  end
end