Class: Carnival::BaseAdminPresenter
- Inherits:
-
Object
- Object
- Carnival::BaseAdminPresenter
- Includes:
- Dsl
- Defined in:
- app/presenters/carnival/base_admin_presenter.rb
Constant Summary collapse
- DEFAULT_CSV_RECORDS_PER_CHUNK =
500
Instance Method Summary collapse
- #actions ⇒ Object
- #actions_for_page ⇒ Object
- #actions_for_record ⇒ Object
- #advanced_search_fields ⇒ Object
- #batch_actions ⇒ Object
- #build_relation_field(field, model_object) ⇒ Object
- #controller_class_name ⇒ Object
- #controller_name ⇒ Object
- #controller_to_field(field) ⇒ Object
- #csv_for_record(record) ⇒ Object
- #csv_records_per_chunk ⇒ Object
- #date_filter_field ⇒ Object
- #default_scope ⇒ Object
- #default_sort_direction ⇒ Object
- #default_sortable_field ⇒ Object
- #field_type(field) ⇒ Object
- #fields ⇒ Object
- #fields_for_action(action) ⇒ Object
- #form_for(action) ⇒ Object
- #full_model_name ⇒ Object
- #get_association(association) ⇒ Object
- #get_association_from_field(field) ⇒ Object
- #get_class_for(field) ⇒ Object
- #get_field(field) ⇒ Object
- #get_related_class(relation_name) ⇒ Object
- #get_related_class_for_field(field_name) ⇒ Object
- #has_action?(action) ⇒ Boolean
- #has_batch_actions? ⇒ Boolean
- #index_as ⇒ Object
-
#initialize ⇒ BaseAdminPresenter
constructor
A new instance of BaseAdminPresenter.
- #is_from_carnival? ⇒ Boolean
- #is_one_to_one_relation?(field_name) ⇒ Boolean
- #is_relation_belongs_to?(field) ⇒ Boolean
- #is_relation_has_many?(field) ⇒ Boolean
- #items_per_page ⇒ Object
- #join_tables ⇒ Object
- #load_dependent_select_options_path ⇒ Object
- #model_class ⇒ Object
- #model_name ⇒ Object
- #model_params(params) ⇒ Object
- #model_path(action, extra_params = {}) ⇒ Object
- #must_render_field?(nested_in, field, model_object) ⇒ Boolean
- #parse_advanced_search(records, search_syntax) ⇒ Object
- #presenter_name ⇒ Object
- #related_presenter(field, _not_used = nil) ⇒ Object (also: #presenter_to_field)
- #relation_field?(field_name) ⇒ Boolean
- #relation_model(field) ⇒ Object
- #relation_path(field, record) ⇒ Object
- #relation_type(sym) ⇒ Object
- #render_action?(record, record_action, action = nil) ⇒ Boolean
- #render_field(field_name, record) ⇒ Object
- #render_field?(field, action = nil) ⇒ Boolean
- #renderer_for(field_name) ⇒ Object
- #scopes ⇒ Object
- #table_name ⇒ Object
- #translate_field(field_name) ⇒ Object
- #validates ⇒ Object
Constructor Details
#initialize ⇒ BaseAdminPresenter
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
#actions ⇒ Object
53 54 55 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 53 def actions @@actions[presenter_class_name] end |
#actions_for_page ⇒ Object
65 66 67 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 65 def actions_for_page filter_actions([:new], :page) end |
#actions_for_record ⇒ Object
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_fields ⇒ Object
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_actions ⇒ Object
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_name ⇒ Object
149 150 151 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 149 def controller_class_name "#{controller_name}_controller".classify end |
#controller_name ⇒ Object
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_chunk ⇒ Object
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_field ⇒ Object
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_scope ⇒ Object
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_direction ⇒ Object
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_field ⇒ Object
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 |
#fields ⇒ Object
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_name ⇒ Object
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. 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 |
#get_related_class(relation_name) ⇒ Object
309 310 311 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 309 def relation_name @klass_service. relation_name end |
#get_related_class_for_field(field_name) ⇒ Object
300 301 302 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 300 def (field_name) get_association_from_field(field_name) end |
#has_action?(action) ⇒ 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
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_as ⇒ Object
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
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
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
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
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_page ⇒ Object
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_tables ⇒ Object
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_path ⇒ Object
335 336 337 338 339 340 341 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 335 def if extract_namespace.present? "/#{extract_namespace.downcase}/carnival-base/load_dependent_select_options" else '/carnival-base/load_dependent_select_options' end end |
#model_class ⇒ Object
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_name ⇒ Object
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
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_name ⇒ Object
23 24 25 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 23 def presenter_name self.class.to_s end |
#related_presenter(field, _not_used = nil) ⇒ Object Also known as: presenter_to_field
321 322 323 324 325 326 327 328 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 321 def (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
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 = (field) = record.send(field.association_name) if .present? if is_one_to_one_relation?(field) params = { controller: "#{extract_namespace.downcase}/#{relation_name}", action: :show, id: .id } else params = { controller: "#{extract_namespace.downcase}/#{get_association_from_field(field)}", action: :index, advanced_search: (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
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
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 |
#scopes ⇒ Object
73 74 75 |
# File 'app/presenters/carnival/base_admin_presenter.rb', line 73 def scopes @@scopes[presenter_class_name] || {} end |
#table_name ⇒ Object
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? = model_class.reflect_on_association(field.association_name.to_sym).klass .human_attribute_name(field.association_field_name) else field_key = field.name_for_translation model_class.human_attribute_name field_key end end |
#validates ⇒ Object
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 |