Module: Redmine::Acts::Customizable::InstanceMethods

Defined in:
lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



45
46
47
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 45

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#available_custom_fieldsObject



49
50
51
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 49

def available_custom_fields
  CustomField.where("type = '#{self.class.name}CustomField'").sorted.to_a
end

#custom_field_value(c) ⇒ Object



120
121
122
123
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 120

def custom_field_value(c)
  field_id = (c.is_a?(CustomField) ? c.id : c.to_i)
  custom_field_values.detect {|v| v.custom_field_id == field_id }.try(:value)
end

#custom_field_valuesObject



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 80

def custom_field_values
  @custom_field_values ||= available_custom_fields.collect do |field|
    x = CustomFieldValue.new
    x.custom_field = field
    x.customized = self
    if field.multiple?
      values = custom_values.select { |v| v.custom_field == field }
      if values.empty?
        values << custom_values.build(:customized => self, :custom_field => field)
      end
      x.instance_variable_set("@value", values.map(&:value))
    else
      cv = custom_values.detect { |v| v.custom_field == field }
      cv ||= custom_values.build(:customized => self, :custom_field => field)
      x.instance_variable_set("@value", cv.value)
    end
    x.value_was = x.value.dup if x.value
    x
  end
end

#custom_field_values=(values) ⇒ Object

Sets the values of the object’s custom fields values is a hash like => ‘foo’, 2 => ‘bar’



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 68

def custom_field_values=(values)
  values = values.stringify_keys

  custom_field_values.each do |custom_field_value|
    key = custom_field_value.custom_field_id.to_s
    if values.has_key?(key)
      custom_field_value.value = values[key]
    end
  end
  @custom_field_values_changed = true
end

#custom_field_values_changed?Boolean

Returns:

  • (Boolean)


105
106
107
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 105

def custom_field_values_changed?
  @custom_field_values_changed == true
end

#custom_fields=(values) ⇒ Object

Sets the values of the object’s custom fields values is an array like [=> 1, ‘value’ => ‘foo’, => 2, ‘value’ => ‘bar’]



55
56
57
58
59
60
61
62
63
64
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 55

def custom_fields=(values)
  values_to_hash = values.inject({}) do |hash, v|
    v = v.stringify_keys
    if v['id'] && v.has_key?('value')
      hash[v['id']] = v['value']
    end
    hash
  end
  self.custom_field_values = values_to_hash
end

#custom_value_for(c) ⇒ Object



115
116
117
118
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 115

def custom_value_for(c)
  field_id = (c.is_a?(CustomField) ? c.id : c.to_i)
  custom_values.detect {|v| v.custom_field_id == field_id }
end

#reassign_custom_field_valuesObject



154
155
156
157
158
159
160
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 154

def reassign_custom_field_values
  if @custom_field_values
    values = @custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h}
    @custom_field_values = nil
    self.custom_field_values = values
  end
end

#reload(*args) ⇒ Object



167
168
169
170
171
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 167

def reload(*args)
  @custom_field_values = nil
  @custom_field_values_changed = false
  super
end

#reset_custom_values!Object



162
163
164
165
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 162

def reset_custom_values!
  @custom_field_values = nil
  @custom_field_values_changed = true
end

#save_custom_field_valuesObject



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 131

def save_custom_field_values
  target_custom_values = []
  custom_field_values.each do |custom_field_value|
    if custom_field_value.value.is_a?(Array)
      custom_field_value.value.each do |v|
        target = custom_values.detect {|cv| cv.custom_field == custom_field_value.custom_field && cv.value == v}
        target ||= custom_values.build(:customized => self, :custom_field => custom_field_value.custom_field, :value => v)
        target_custom_values << target
      end
    else
      target = custom_values.detect {|cv| cv.custom_field == custom_field_value.custom_field}
      target ||= custom_values.build(:customized => self, :custom_field => custom_field_value.custom_field)
      target.value = custom_field_value.value
      target_custom_values << target
    end
  end
  self.custom_values = target_custom_values
  custom_values.each(&:save)
  touch if !saved_changes? && custom_values.any?(&:saved_changes?)
  @custom_field_values_changed = false
  true
end

#set_custom_field_default?(custom_value) ⇒ Boolean

Should the default custom field value be set for the given custom_value? By default, default custom field value is set for new objects only

Returns:

  • (Boolean)


111
112
113
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 111

def set_custom_field_default?(custom_value)
  new_record?
end

#validate_custom_field_valuesObject



125
126
127
128
129
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 125

def validate_custom_field_values
  if new_record? || custom_field_values_changed?
    custom_field_values.each(&:validate_value)
  end
end

#visible_custom_field_valuesObject



101
102
103
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 101

def visible_custom_field_values
  custom_field_values.select(&:visible?)
end