Class: Carnival::BaseAdminPresenter

Inherits:
Object
  • Object
show all
Includes:
Dsl
Defined in:
app/presenters/carnival/base_admin_presenter.rb

Constant Summary collapse

DEFAULT_CSV_RECORDS_PER_CHUNK =
500

Instance Method Summary collapse

Constructor Details

#initializeBaseAdminPresenter

Returns a new instance of BaseAdminPresenter.



8
9
10
11
12
13
14
15
# File 'app/presenters/carnival/base_admin_presenter.rb', line 8

def initialize
  return unless model_class.present?

  @klass_service = KlassService.new model_class
  @advanced_search_parser = Presenters::AdvancedSearchParser.new(@klass_service)
  @validators = [Carnival::PresenterValidators::FieldValidator]
  validates
end

Instance Method Details

#actionsObject



53
54
55
# File 'app/presenters/carnival/base_admin_presenter.rb', line 53

def actions
  @@actions[presenter_class_name]
end

#actions_for_pageObject



65
66
67
# File 'app/presenters/carnival/base_admin_presenter.rb', line 65

def actions_for_page
  filter_actions([:new], :page)
end

#actions_for_recordObject



61
62
63
# File 'app/presenters/carnival/base_admin_presenter.rb', line 61

def actions_for_record
  filter_actions([:show, :edit, :destroy], :record)
end

#advanced_search_fieldsObject



214
215
216
217
# File 'app/presenters/carnival/base_admin_presenter.rb', line 214

def advanced_search_fields
  fields = @@fields[presenter_class_name]
  @advanced_search_parser.get_advanced_search_fields fields
end

#batch_actionsObject



57
58
59
# File 'app/presenters/carnival/base_admin_presenter.rb', line 57

def batch_actions
  @@batch_actions[presenter_class_name]
end

#build_relation_field(field, model_object) ⇒ Object



179
180
181
182
183
184
185
# File 'app/presenters/carnival/base_admin_presenter.rb', line 179

def build_relation_field(field, model_object)
  if is_relation_belongs_to?(field.name)
    model_object.send("#{field.name}_build")
  else
    model_object.send(field.name).build
  end
end

#controller_class_nameObject



149
150
151
# File 'app/presenters/carnival/base_admin_presenter.rb', line 149

def controller_class_name
  "#{controller_name}_controller".classify
end

#controller_nameObject



153
154
155
156
157
158
159
# File 'app/presenters/carnival/base_admin_presenter.rb', line 153

def controller_name
  if is_namespaced?
    "#{extract_namespace}/#{controller_resource_name}".underscore
  else
    controller_resource_name
  end
end

#controller_to_field(field) ⇒ Object



331
332
333
# File 'app/presenters/carnival/base_admin_presenter.rb', line 331

def controller_to_field(field)
  "#{extract_namespace}::#{field.name.to_s.classify.pluralize}Controller".constantize.new
end

#csv_for_record(record) ⇒ Object



367
368
369
370
371
372
373
# File 'app/presenters/carnival/base_admin_presenter.rb', line 367

def csv_for_record(record)
  CSV.generate do |csv|
    csv << fields_for_action(:csv).keys.map do |field|
      render_field(field, record)[:value]
    end
  end
end

#csv_records_per_chunkObject



362
363
364
365
# File 'app/presenters/carnival/base_admin_presenter.rb', line 362

def csv_records_per_chunk
  @@csv_records_per_chunk[presenter_class_name] ||
    DEFAULT_CSV_RECORDS_PER_CHUNK
end

#date_filter_fieldObject



219
220
221
222
223
224
225
226
227
228
# File 'app/presenters/carnival/base_admin_presenter.rb', line 219

def date_filter_field
  date_field = nil
  @@fields[presenter_class_name].each do |key, field|
    if field.date_filter?
      date_field = field
      break
    end
  end
  date_field
end

#default_scopeObject



199
200
201
202
203
# File 'app/presenters/carnival/base_admin_presenter.rb', line 199

def default_scope
  return if scopes.empty?
  @@scopes[presenter_class_name].values.find(&:default?) ||
    @@scopes[presenter_class_name].values.first
end

#default_sort_directionObject



210
211
212
# File 'app/presenters/carnival/base_admin_presenter.rb', line 210

def default_sort_direction
  default_sortable_field.default_sort_direction
end

#default_sortable_fieldObject



205
206
207
208
# File 'app/presenters/carnival/base_admin_presenter.rb', line 205

def default_sortable_field
  @@fields[presenter_class_name].values.find(&:default_sortable?) ||
    @@fields[presenter_class_name].values.first
end

#field_type(field) ⇒ Object



261
262
263
264
265
266
267
268
269
# File 'app/presenters/carnival/base_admin_presenter.rb', line 261

def field_type(field)
  type = model_class.columns_hash[field.to_s].try(:type)
  if relation_field?(field.to_sym) then :relation
  elsif type == :date || type == :datetime then type
  elsif type == :number || type == :float then :number
  elsif type == :integer and model_class.const_defined? field.upcase and field != :id then :enum
  else type
  end
end

#fieldsObject



77
78
79
# File 'app/presenters/carnival/base_admin_presenter.rb', line 77

def fields
  @@fields[presenter_class_name]
end

#fields_for_action(action) ⇒ Object



89
90
91
92
93
94
95
96
97
# File 'app/presenters/carnival/base_admin_presenter.rb', line 89

def fields_for_action(action)
  fields_action = {}
  @@fields[presenter_class_name].each do |key, field|
    if field.valid_for_action?(action)
      fields_action[key] = field
    end
  end
  fields_action
end

#form_for(action) ⇒ Object



99
100
101
102
103
104
105
106
107
108
# File 'app/presenters/carnival/base_admin_presenter.rb', line 99

def form_for(action)
  if @@forms[presenter_class_name].present? &&
     @@forms[presenter_class_name][action].present?
    form =  @@forms[presenter_class_name][action]
  else
    form = Carnival::Form.new(action)
  end
  form.fields = fields_for_action(action)
  form
end

#full_model_nameObject



137
138
139
140
141
142
143
144
145
146
147
# File 'app/presenters/carnival/base_admin_presenter.rb', line 137

def full_model_name
  if Carnival::Config.use_full_model_name == false and !is_from_carnival?
    return model_name
  end

  if @@model_names[presenter_class_name].nil?
    self.class.to_s.gsub("Presenter", "").underscore
  else
    @@model_names[presenter_class_name]
  end
end

#get_association(association) ⇒ Object



243
244
245
# File 'app/presenters/carnival/base_admin_presenter.rb', line 243

def get_association(association)
  @klass_service.get_association(association)
end

#get_association_from_field(field) ⇒ Object



304
305
306
307
# File 'app/presenters/carnival/base_admin_presenter.rb', line 304

def get_association_from_field(field)
  field = get_field(field)
  field.specified_association? ? field.association_name : field.name
end

#get_class_for(field) ⇒ Object



313
314
315
# File 'app/presenters/carnival/base_admin_presenter.rb', line 313

def get_class_for field
  @klass_service.related_class field
end

#get_field(field) ⇒ Object



81
82
83
84
85
86
87
# File 'app/presenters/carnival/base_admin_presenter.rb', line 81

def get_field(field)
  if field.respond_to? :to_sym
    @@fields[presenter_class_name][field.to_sym]
  else
    field
  end
end


309
310
311
# File 'app/presenters/carnival/base_admin_presenter.rb', line 309

def get_related_class relation_name
  @klass_service.related_class_file_name relation_name
end


300
301
302
# File 'app/presenters/carnival/base_admin_presenter.rb', line 300

def get_related_class_for_field(field_name)
  get_related_class get_association_from_field(field_name)
end

#has_action?(action) ⇒ Boolean

Returns:

  • (Boolean)


69
70
71
# File 'app/presenters/carnival/base_admin_presenter.rb', line 69

def has_action?(action)
  @@actions[presenter_class_name].present? && @@actions[presenter_class_name][action].present?
end

#has_batch_actions?Boolean

Returns:

  • (Boolean)


27
28
29
30
31
32
33
# File 'app/presenters/carnival/base_admin_presenter.rb', line 27

def has_batch_actions?
  if @@batch_actions[presenter_class_name].present?
    @@batch_actions[presenter_class_name].keys.size > 0
  else
    false
  end
end

#index_asObject



49
50
51
# File 'app/presenters/carnival/base_admin_presenter.rb', line 49

def index_as
  @@index_as[presenter_class_name] ||= :table
end

#is_from_carnival?Boolean

Returns:

  • (Boolean)


133
134
135
# File 'app/presenters/carnival/base_admin_presenter.rb', line 133

def is_from_carnival?
  self.class.to_s.include? 'Carnival::'
end

#is_one_to_one_relation?(field_name) ⇒ Boolean

Returns:

  • (Boolean)


276
277
278
279
280
# File 'app/presenters/carnival/base_admin_presenter.rb', line 276

def is_one_to_one_relation?(field_name)
  field = get_field(field_name)
  @klass_service.is_a_belongs_to_relation?(field.association_name) ||
    @klass_service.is_a_has_one_relation?(field.association_name)
end

#is_relation_belongs_to?(field) ⇒ Boolean

Returns:

  • (Boolean)


251
252
253
# File 'app/presenters/carnival/base_admin_presenter.rb', line 251

def is_relation_belongs_to?(field)
  model_class.reflect_on_association(field.to_sym).macro == :belongs_to
end

#is_relation_has_many?(field) ⇒ Boolean

Returns:

  • (Boolean)


255
256
257
258
259
# File 'app/presenters/carnival/base_admin_presenter.rb', line 255

def is_relation_has_many?(field)
  field = get_field(field)
  association = @klass_service.relation_type(field.association_name || field.name)
  association.to_s.include? 'many'
end

#items_per_pageObject



35
36
37
38
39
40
41
# File 'app/presenters/carnival/base_admin_presenter.rb', line 35

def items_per_page
  @@items_per_page[presenter_class_name] ||= {}
  unless @@items_per_page[presenter_class_name][:items_per_page].present? and @@items_per_page[presenter_class_name][:items_per_page] > 0
    @@items_per_page[presenter_class_name][:items_per_page] = Carnival::Config.items_per_page
  end
  @@items_per_page[presenter_class_name][:items_per_page]
end

#join_tablesObject



165
166
167
168
169
# File 'app/presenters/carnival/base_admin_presenter.rb', line 165

def join_tables
  @@fields[presenter_class_name].map do |key, field|
    field.association_name if relation_field? key.to_sym
  end
end

#load_dependent_select_options_pathObject



335
336
337
338
339
340
341
# File 'app/presenters/carnival/base_admin_presenter.rb', line 335

def load_dependent_select_options_path
  if extract_namespace.present?
    "/#{extract_namespace.downcase}/carnival-base/load_dependent_select_options"
  else
    '/carnival-base/load_dependent_select_options'
  end
end

#model_classObject



230
231
232
# File 'app/presenters/carnival/base_admin_presenter.rb', line 230

def model_class
  full_model_name.classify.constantize rescue nil
end

#model_nameObject



110
111
112
113
114
115
116
117
118
119
120
# File 'app/presenters/carnival/base_admin_presenter.rb', line 110

def model_name
  if @@model_names[presenter_class_name].nil?
    self.class.to_s.split('::').last.gsub('Presenter', '').underscore
  else
    if @@model_names[presenter_class_name].include?('/')
      @@model_names[presenter_class_name].split('/').last
    else
      @@model_names[presenter_class_name]
    end
  end
end

#model_params(params) ⇒ Object



122
123
124
# File 'app/presenters/carnival/base_admin_presenter.rb', line 122

def model_params(params)
  params.select { |key, _| key != 'action' && key != 'controller' }
end

#model_path(action, extra_params = {}) ⇒ Object



126
127
128
129
130
131
# File 'app/presenters/carnival/base_admin_presenter.rb', line 126

def model_path(action, extra_params = {})
  params = extra_params.reverse_merge(
    controller: controller_name, action: action
  ).merge(only_path: true)
  url_for(params)
end

#must_render_field?(nested_in, field, model_object) ⇒ Boolean

Returns:

  • (Boolean)


187
188
189
190
191
192
193
194
195
196
197
# File 'app/presenters/carnival/base_admin_presenter.rb', line 187

def must_render_field?(nested_in, field, model_object)
  return true unless nested_in.present?
  if field.as == :partial
    true
  elsif nested_in.class == model_object.send(field.name).class ||
        nested_in.class.name.underscore.split('/').last == field.name
    false
  else
    true
  end
end

#parse_advanced_search(records, search_syntax) ⇒ Object



317
318
319
# File 'app/presenters/carnival/base_admin_presenter.rb', line 317

def parse_advanced_search records, search_syntax
  @advanced_search_parser.parse_advanced_search @@fields[presenter_class_name], records, search_syntax
end

#presenter_nameObject



23
24
25
# File 'app/presenters/carnival/base_admin_presenter.rb', line 23

def presenter_name
  self.class.to_s
end


321
322
323
324
325
326
327
328
# File 'app/presenters/carnival/base_admin_presenter.rb', line 321

def related_presenter(field, _not_used = nil)
  field = get_field(field)
  if field.presenter_class.present?
    field.presenter_class.constantize.new
  else
    infer_presenter(field)
  end
end

#relation_field?(field_name) ⇒ Boolean

Returns:

  • (Boolean)


234
235
236
237
238
239
240
241
# File 'app/presenters/carnival/base_admin_presenter.rb', line 234

def relation_field?(field_name)
  field = get_field(field_name)
  if field.present?
    field.specified_association? or @klass_service.relation?(field.name)
  else
    false
  end
end

#relation_model(field) ⇒ Object



271
272
273
274
# File 'app/presenters/carnival/base_admin_presenter.rb', line 271

def relation_model(field)
  field = get_field(field)
  @klass_service.get_association(field.association_name).klass
end

#relation_path(field, record) ⇒ Object



282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# File 'app/presenters/carnival/base_admin_presenter.rb', line 282

def relation_path(field, record)
  field = get_field(field)
  return nil if !relation_field?(field)
  relation_name = get_related_class_for_field(field)
  related = record.send(field.association_name)
  if related.present?
    if is_one_to_one_relation?(field)
      params = { controller: "#{extract_namespace.downcase}/#{relation_name}", action: :show, id: related.id }
    else
      params = { controller: "#{extract_namespace.downcase}/#{get_association_from_field(field)}", action: :index, advanced_search: make_relation_advanced_query_url_options(field.name, record) }
    end
    params = params.merge(only_path: true)
    generate_route_path params
  else
    '#'
  end
end

#relation_type(sym) ⇒ Object



247
248
249
# File 'app/presenters/carnival/base_admin_presenter.rb', line 247

def relation_type sym
  @klass_service.relation_type sym
end

#render_action?(record, record_action, action = nil) ⇒ Boolean

Returns:

  • (Boolean)


175
176
177
# File 'app/presenters/carnival/base_admin_presenter.rb', line 175

def render_action?(record, record_action, action = nil)
  true
end

#render_field(field_name, record) ⇒ Object



343
344
345
# File 'app/presenters/carnival/base_admin_presenter.rb', line 343

def render_field(field_name, record)
  renderer_for(field_name).render_field(record)
end

#render_field?(field, action = nil) ⇒ Boolean

Returns:

  • (Boolean)


171
172
173
# File 'app/presenters/carnival/base_admin_presenter.rb', line 171

def render_field?(field, action = nil)
  true
end

#renderer_for(field_name) ⇒ Object



347
348
349
# File 'app/presenters/carnival/base_admin_presenter.rb', line 347

def renderer_for(field_name)
  FieldRenderers::RendererCreator.create_field_renderer(self, field_name)
end

#scopesObject



73
74
75
# File 'app/presenters/carnival/base_admin_presenter.rb', line 73

def scopes
  @@scopes[presenter_class_name] || {}
end

#table_nameObject



161
162
163
# File 'app/presenters/carnival/base_admin_presenter.rb', line 161

def table_name
  model_class.table_name
end

#translate_field(field_name) ⇒ Object



351
352
353
354
355
356
357
358
359
360
# File 'app/presenters/carnival/base_admin_presenter.rb', line 351

def translate_field field_name
  field = get_field(field_name)
  if field.specified_association?
    related_class = model_class.reflect_on_association(field.association_name.to_sym).klass
    related_class.human_attribute_name(field.association_field_name)
  else
    field_key = field.name_for_translation
    model_class.human_attribute_name field_key
  end
end

#validatesObject



17
18
19
20
21
# File 'app/presenters/carnival/base_admin_presenter.rb', line 17

def validates
  @validators.each do |validator|
    validator.new(self).validates
  end
end