Class: Carnival::BaseAdminPresenter

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

Constant Summary collapse

@@index_as =
{}
@@actions =
{}
@@batch_actions =
{}
@@items_per_page =
{}
@@model_names =
{}
@@fields =
{}
@@scopes =
{}
@@forms =
{}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params) ⇒ BaseAdminPresenter

Returns a new instance of BaseAdminPresenter.



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

def initialize(params)
  @controller = params[:controller]

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

Class Method Details

.action(name, params = {}) ⇒ Object



33
34
35
36
# File 'app/presenters/carnival/base_admin_presenter.rb', line 33

def self.action(name, params = {})
  @@actions[presenter_class_name] ||= {}
  @@actions[presenter_class_name][name] = Carnival::Action.new(name, params)
end

.batch_action(name, params = {}) ⇒ Object



39
40
41
42
# File 'app/presenters/carnival/base_admin_presenter.rb', line 39

def self.batch_action(name, params = {})
  @@batch_actions[presenter_class_name] ||= {}
  @@batch_actions[presenter_class_name][name] = Carnival::BatchAction.new(self.new({}), name, params)
end

.index_as(type) ⇒ Object



28
29
30
# File 'app/presenters/carnival/base_admin_presenter.rb', line 28

def self.index_as(type)
  @@index_as[presenter_class_name] = type
end

.items_per_page(per_page) ⇒ Object



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

def self.items_per_page(per_page)
  @@items_per_page[presenter_class_name] ||= {}
  @@items_per_page[presenter_class_name][:items_per_page] = per_page
end

Instance Method Details

#actionsObject



82
83
84
# File 'app/presenters/carnival/base_admin_presenter.rb', line 82

def actions
  @@actions[presenter_class_name]
end

#actions_for_pageObject



94
95
96
# File 'app/presenters/carnival/base_admin_presenter.rb', line 94

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

#actions_for_recordObject



90
91
92
# File 'app/presenters/carnival/base_admin_presenter.rb', line 90

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

#advanced_search_fieldsObject



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

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

#batch_actionsObject



86
87
88
# File 'app/presenters/carnival/base_admin_presenter.rb', line 86

def batch_actions
  @@batch_actions[presenter_class_name]
end

#build_relation_field(field, model_object) ⇒ Object



226
227
228
229
230
231
232
# File 'app/presenters/carnival/base_admin_presenter.rb', line 226

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



180
181
182
# File 'app/presenters/carnival/base_admin_presenter.rb', line 180

def controller_class_name
  @controller.class.name
end

#controller_nameObject



184
185
186
187
188
189
190
191
# File 'app/presenters/carnival/base_admin_presenter.rb', line 184

def controller_name
  namespace = extract_namespace
  if namespace.present?
    "#{extract_namespace.downcase}/#{@controller.controller_name}"
  else
    @controller.controller_name
  end
end

#controller_to_field(field) ⇒ Object



393
394
395
# File 'app/presenters/carnival/base_admin_presenter.rb', line 393

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

#controller_to_field_sym(field) ⇒ Object



397
398
399
# File 'app/presenters/carnival/base_admin_presenter.rb', line 397

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

#date_filter_fieldObject



283
284
285
286
287
288
289
290
291
292
# File 'app/presenters/carnival/base_admin_presenter.rb', line 283

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



248
249
250
251
252
253
254
# File 'app/presenters/carnival/base_admin_presenter.rb', line 248

def default_scope
  return if scopes.empty?
  @@scopes[presenter_class_name].each do |key, scope|
    return scope if scope.default?
  end
  @@scopes[presenter_class_name].values.first
end

#default_sort_directionObject



266
267
268
# File 'app/presenters/carnival/base_admin_presenter.rb', line 266

def default_sort_direction
  default_sortable_field.default_sort_direction
end

#default_sortable_fieldObject



256
257
258
259
260
261
262
263
264
# File 'app/presenters/carnival/base_admin_presenter.rb', line 256

def default_sortable_field
  default_field = nil
  @@fields[presenter_class_name].each do |key, field|
    default_field = field if field.default_sortable?
    break
  end
  default_field = @@fields[presenter_class_name].first[1] if default_field.nil?
  default_field
end

#field_type(field) ⇒ Object



325
326
327
328
329
330
331
332
333
# File 'app/presenters/carnival/base_admin_presenter.rb', line 325

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



111
112
113
# File 'app/presenters/carnival/base_admin_presenter.rb', line 111

def fields
  @@fields[presenter_class_name]
end

#fields_for_action(action) ⇒ Object



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

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



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

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

#full_model_nameObject



168
169
170
171
172
173
174
175
176
177
178
# File 'app/presenters/carnival/base_admin_presenter.rb', line 168

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



307
308
309
# File 'app/presenters/carnival/base_admin_presenter.rb', line 307

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

#get_association_from_field(field) ⇒ Object



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

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

#get_class_for(field) ⇒ Object



377
378
379
# File 'app/presenters/carnival/base_admin_presenter.rb', line 377

def get_class_for field
  @klass_service.related_class field
end

#get_field(field) ⇒ Object



115
116
117
118
119
120
121
# File 'app/presenters/carnival/base_admin_presenter.rb', line 115

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


373
374
375
# File 'app/presenters/carnival/base_admin_presenter.rb', line 373

def get_related_class relation_name
  @klass_service.related_class_file_name relation_name
end


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

def get_related_class_for_field (field_name)
  get_related_class get_association_from_field(field_name)
end

#has_action?(action) ⇒ Boolean

Returns:

  • (Boolean)


98
99
100
# File 'app/presenters/carnival/base_admin_presenter.rb', line 98

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

#has_batch_actions?Boolean

Returns:

  • (Boolean)


44
45
46
47
48
49
50
# File 'app/presenters/carnival/base_admin_presenter.rb', line 44

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



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

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

#index_as_grid?Boolean

Returns:

  • (Boolean)


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

def index_as_grid?
  index_as == :grid
end

#index_as_list?Boolean

Returns:

  • (Boolean)


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

def index_as_list?
  index_as == :list
end

#index_as_table?Boolean

Returns:

  • (Boolean)


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

def index_as_table?
  index_as == :table
end

#is_from_carnival?Boolean

Returns:

  • (Boolean)


164
165
166
# File 'app/presenters/carnival/base_admin_presenter.rb', line 164

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

#is_one_to_one_relation?(field_name) ⇒ Boolean

Returns:

  • (Boolean)


340
341
342
343
344
# File 'app/presenters/carnival/base_admin_presenter.rb', line 340

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)


315
316
317
# File 'app/presenters/carnival/base_admin_presenter.rb', line 315

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)


319
320
321
322
323
# File 'app/presenters/carnival/base_admin_presenter.rb', line 319

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



58
59
60
61
62
63
64
# File 'app/presenters/carnival/base_admin_presenter.rb', line 58

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



210
211
212
213
214
215
216
# File 'app/presenters/carnival/base_admin_presenter.rb', line 210

def join_tables
  joins = []
  @@fields[presenter_class_name].each do |key, field|
    joins << field.association_name if relation_field? key.to_sym
  end
  joins
end

#load_dependent_select_options_pathObject



400
401
402
403
404
405
406
# File 'app/presenters/carnival/base_admin_presenter.rb', line 400

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



294
295
296
# File 'app/presenters/carnival/base_admin_presenter.rb', line 294

def model_class
  full_model_name.classify.constantize rescue nil
end

#model_nameObject



141
142
143
144
145
146
147
148
149
150
151
# File 'app/presenters/carnival/base_admin_presenter.rb', line 141

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



153
154
155
# File 'app/presenters/carnival/base_admin_presenter.rb', line 153

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

#model_path(action, extra_params = nil) ⇒ Object



157
158
159
160
161
162
# File 'app/presenters/carnival/base_admin_presenter.rb', line 157

def model_path(action, extra_params=nil)
  params = {controller: controller_name, action: action}
  params = params.merge(extra_params) if extra_params.present?
  params = params.merge(:only_path => true)
  url_for(params)
end

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

Returns:

  • (Boolean)


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

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

#parse_advanced_search(records, search_syntax) ⇒ Object



381
382
383
# File 'app/presenters/carnival/base_admin_presenter.rb', line 381

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

#presenter_to_field(field, record) ⇒ Object



385
386
387
# File 'app/presenters/carnival/base_admin_presenter.rb', line 385

def presenter_to_field field, record
  "#{extract_namespace}::#{field.name.to_s.singularize.classify}Presenter".constantize.send("new", :controller => controller_to_field(field))
end

#presenter_to_field_sym(field) ⇒ Object



389
390
391
# File 'app/presenters/carnival/base_admin_presenter.rb', line 389

def presenter_to_field_sym field
  "#{extract_namespace}::#{field.to_s.singularize.classify}Presenter".constantize.send("new", :controller => controller_to_field_sym(field))
end

#relation_field?(field_name) ⇒ Boolean

Returns:

  • (Boolean)


298
299
300
301
302
303
304
305
# File 'app/presenters/carnival/base_admin_presenter.rb', line 298

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



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

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

#relation_path(field, record) ⇒ Object



346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'app/presenters/carnival/base_admin_presenter.rb', line 346

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)
  unless related.nil?
    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)
    return generate_route_path params
  else
    '#'
  end
end

#relation_type(sym) ⇒ Object



311
312
313
# File 'app/presenters/carnival/base_admin_presenter.rb', line 311

def relation_type sym
  @klass_service.relation_type sym
end

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

Returns:

  • (Boolean)


222
223
224
# File 'app/presenters/carnival/base_admin_presenter.rb', line 222

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

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

Returns:

  • (Boolean)


218
219
220
# File 'app/presenters/carnival/base_admin_presenter.rb', line 218

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

#scopesObject



107
108
109
# File 'app/presenters/carnival/base_admin_presenter.rb', line 107

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

#searchable_fieldsObject



197
198
199
200
201
202
203
204
205
206
207
208
# File 'app/presenters/carnival/base_admin_presenter.rb', line 197

def searchable_fields
  searchable_fields = {}
  @@fields[presenter_class_name].each do |key, field|
    if relation_field? key
      field_name = "#{field.name.pluralize}.name"
    else
      field_name = "#{self.table_name}.#{field.name}"
    end
    searchable_fields[field_name] = field if field.searchable?
  end
  searchable_fields
end

#sortable_fieldsObject



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

def sortable_fields
  sortable_fields = {}
  @@fields[presenter_class_name].each do |key, field|
    sortable_fields[key] = field if field.sortable?
  end
  sortable_fields
end

#table_nameObject



193
194
195
# File 'app/presenters/carnival/base_admin_presenter.rb', line 193

def table_name
  model_class.table_name
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