Module: Alchemy::ResourcesHelper

Includes:
Admin::ResourceName
Included in:
Admin::ResourcesController
Defined in:
app/helpers/alchemy/resources_helper.rb

Instance Method Summary collapse

Methods included from Admin::ResourceName

#controller_path_array, #resource_array, #resource_model_name, #resource_name, #resources_name

Instance Method Details

#contains_relations?Boolean

Returns true if the resource contains any relations

Returns:

  • (Boolean)


144
145
146
# File 'app/helpers/alchemy/resources_helper.rb', line 144

def contains_relations?
  resource_handler.resource_relations.present?
end

#csv_value(value) ⇒ String

Returns the value prepared for a cell of a CSV export.

Spreadsheet applications evaluate a cell starting with one of these characters as a formula, turning exported content into code that runs on the machine opening the file. The tab keeps the cell text and, unlike the more common single quote, survives Excel saving and re-opening the file, which strips quotes and would reactivate the formula. It only works inside a quoted field, so the export generates with force_quotes.

A bare negative number is exempt, because spreadsheets read it as a number instead of a formula, so escaping it would only break arithmetic on the exported column. An expression like -2+3 is a formula and stays escaped.

Parameters:

  • value (Object)

Returns:

  • (String)

See Also:



120
121
122
123
124
125
# File 'app/helpers/alchemy/resources_helper.rb', line 120

def csv_value(value)
  value = value.to_s
  return value if value.match?(/\A-\d+(\.\d+)?\z/)

  value.match?(/\A[-=+@\t\r\n\uFF0D\uFF1D\uFF0B\uFF20]/) ? "\t#{value}" : value
end

#edit_resource_path(resource = nil, options = {}) ⇒ Object



50
51
52
53
# File 'app/helpers/alchemy/resources_helper.rb', line 50

def edit_resource_path(resource = nil, options = {})
  path_segments = resource_scope + [resource] || resource_array
  edit_polymorphic_path path_segments, options
end

#new_resource_path(options = {}) ⇒ Object



46
47
48
# File 'app/helpers/alchemy/resources_helper.rb', line 46

def new_resource_path(options = {})
  new_polymorphic_path (resource_scope + [resource_handler.namespaced_resource_name]), options
end

#render_attribute(resource, attribute, options = {}) ⇒ String

Returns the value from resource attribute

If the attribute has a relation, the related object's attribute value will be returned.

The output will be truncated after 50 chars. Pass another number to truncate then and pass false to disable this completely.

Parameters:

  • resource (Alchemy::Resource)
  • attribute (Hash)
  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :truncate (Hash) — default: 50

    The length of the value returned.

  • :datetime_format (Hash) — default: alchemy.default

    The format of timestamps.

  • :time_format (Hash) — default: alchemy.time

    The format of time values.

Returns:

  • (String)


74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/helpers/alchemy/resources_helper.rb', line 74

def render_attribute(resource, attribute, options = {})
  attribute_value = resource.send(attribute[:name])
  if attribute[:relation]
    record = resource.send(attribute[:relation][:name])
    value = record.present? ? record.send(attribute[:relation][:attr_method]) : Alchemy.t(:not_found)
  elsif attribute_value && attribute[:type].to_s =~ /(date|time)/
    localization_format = if attribute[:type] == :datetime
      options[:datetime_format] || :"alchemy.default"
    elsif attribute[:type] == :date
      options[:date_format] || :"alchemy.default"
    else
      options[:time_format] || :"alchemy.time"
    end
    value = l(attribute_value, format: localization_format)
  elsif attribute[:type] == :boolean
    value = attribute_value ? '<alchemy-icon name="check"></alchemy-icon>'.html_safe : nil
  else
    value = attribute_value
  end

  options.reverse_merge!(truncate: 50)
  if options[:truncate]
    value.to_s.truncate(options.fetch(:truncate, 50))
  else
    value
  end
end

#resource_attribute_field_options(attribute) ⇒ Object

Returns a options hash for simple_form input fields.



128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'app/helpers/alchemy/resources_helper.rb', line 128

def resource_attribute_field_options(attribute)
  options = {hint: resource_handler.help_text_for(attribute)}
  input_type = attribute[:type].to_s
  case input_type
  when "boolean"
    options
  when "date", "time", "datetime"
    options.merge(as: input_type)
  when "text"
    options.merge(as: "text", input_html: {rows: 4})
  else
    options.merge(as: "string")
  end
end

#resource_has_tagsObject



153
154
155
# File 'app/helpers/alchemy/resources_helper.rb', line 153

def resource_has_tags
  resource_model.respond_to?(:tag_counts) && resource_model.tag_counts.any?
end

#resource_instance_variableObject



18
19
20
# File 'app/helpers/alchemy/resources_helper.rb', line 18

def resource_instance_variable
  instance_variable_get(:"@#{resource_name}")
end

#resource_modelObject



55
56
57
# File 'app/helpers/alchemy/resources_helper.rb', line 55

def resource_model
  resource_handler.model
end

#resource_path(resource = resource_handler.namespaced_resource_name, options = {}) ⇒ Object



42
43
44
# File 'app/helpers/alchemy/resources_helper.rb', line 42

def resource_path(resource = resource_handler.namespaced_resource_name, options = {})
  resources_path(resource, options)
end

#resource_relations_namesObject

Returns an array of all resource_relations names



149
150
151
# File 'app/helpers/alchemy/resources_helper.rb', line 149

def resource_relations_names
  resource_handler.resource_relations.collect { |_k, v| v[:name].to_sym }
end

#resource_scopeObject



34
35
36
# File 'app/helpers/alchemy/resources_helper.rb', line 34

def resource_scope
  @_resource_scope ||= [resource_url_proxy].concat(resource_handler.namespace_for_scope)
end

#resource_url_proxyObject



26
27
28
29
30
31
32
# File 'app/helpers/alchemy/resources_helper.rb', line 26

def resource_url_proxy
  if resource_handler.in_engine?
    public_send(resource_handler.engine_name)
  else
    main_app
  end
end

#resource_window_sizeObject

Alchemy::ResourceHelper

Used to DRY up resource like structures in Alchemy's admin backend in combination with Alchemy::Resource

See Alchemy::Resource for examples how to initialize a resource_handler



14
15
16
# File 'app/helpers/alchemy/resources_helper.rb', line 14

def resource_window_size
  @resource_window_size ||= "480x#{100 + resource_handler.attributes.length * 40}"
end

#resources_instance_variableObject



22
23
24
# File 'app/helpers/alchemy/resources_helper.rb', line 22

def resources_instance_variable
  instance_variable_get(:"@#{resources_name}")
end

#resources_path(resource_or_name = resource_handler.namespaced_resources_name, options = {}) ⇒ Object



38
39
40
# File 'app/helpers/alchemy/resources_helper.rb', line 38

def resources_path(resource_or_name = resource_handler.namespaced_resources_name, options = {})
  polymorphic_path (resource_scope + [resource_or_name]), options
end