Class: MegaBar::FieldDisplay

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/mega_bar/field_display.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.deterministic_id(model_display_id, field_id, position = nil) ⇒ Object

Deterministic ID generation for FieldDisplays ID range: 3000-3999



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'app/models/mega_bar/field_display.rb', line 16

def self.deterministic_id(model_display_id, field_id, position = nil)
  # Include position to make field displays unique per position
  identifier = position ? "#{model_display_id}_#{field_id}_#{position}" : "#{model_display_id}_#{field_id}"
  hash = Digest::MD5.hexdigest(identifier)
  base_id = 3000 + (hash.to_i(16) % 1000)
  
  # Check for collisions and increment if needed
  while MegaBar::FieldDisplay.exists?(id: base_id)
    base_id += 1
    break if base_id >= 4000  # Don't overflow into next range
  end
  
  base_id
end

Instance Method Details

#get_model_idObject



87
88
89
90
# File 'app/models/mega_bar/field_display.rb', line 87

def get_model_id
  data_display_obj = ("MegaBar::" + self.format.to_s.classify).constantize.new
  model_id = data_display_obj.get_model_id
end

#make_data_displayObject



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
# File 'app/models/mega_bar/field_display.rb', line 48

def make_data_display
  return if self.format.to_s == 'off'
  Textbox.by_field_display_id(self.id).delete_all unless self.format == 'textbox'
  Textread.by_field_display_id(self.id).delete_all unless self.format == 'textread'
  Select.by_field_display_id(self.id).delete_all unless self.format == 'select'
  Textarea.by_field_display_id(self.id).delete_all unless self.format == 'textarea'
  Checkbox.by_field_display_id(self.id).delete_all unless self.format == 'checkbox'
  Date.by_field_display_id(self.id).delete_all unless self.format == 'date'
  obj = ("MegaBar::" + self.format.to_s.classify).constantize.where(:field_display_id => self.id).first_or_initialize()
  unless obj.id.present?
    fields = Field.by_model(get_model_id)
    fields_defaults = {}
    fields.each do |field|
      unless (field.default_value.nil? || field.default_value == 'off')
        # Only set attributes that exist in the model's schema
        if obj.respond_to?("#{field.field.parameterize.underscore}=")
          field_value = field.default_value
          
          # Special handling for date format field based on action
          if self.format == 'date' && field.field.parameterize.underscore == 'format'
            model_display_action = self.model_display.action
            if ['edit', 'new'].include?(model_display_action)
              field_value = 'datepicker'  # Override for edit/new forms
            end
            # For index/show, use the field's default_value as-is
          end
          
          fields_defaults[field.field.parameterize.underscore.to_sym] = field_value
        end
      end
    end
    fields_defaults[:field_display_id] = self.id
    fields_defaults[:checked] = 'false' if self.format == 'checkbox'
    
    data_display = obj.update(fields_defaults)
  end
  f = Field.where(id: self.field_id)
end