Module: Labimotion::ExporterHelpers

Defined in:
lib/labimotion/helpers/exporter_helpers.rb

Overview

ExporterHelpers provides utility methods for formatting and processing export data

Constant Summary collapse

CONST_UNNAMED =

Constants

'(Unnamed)'

Instance Method Summary collapse

Instance Method Details

#expandable_field?(field_type) ⇒ Boolean

Check if field type should be expanded (DRAG_SAMPLE or DRAG_MOLECULE)

Returns:

  • (Boolean)


17
18
19
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 17

def expandable_field?(field_type)
  [Labimotion::FieldType::DRAG_SAMPLE, Labimotion::FieldType::DRAG_MOLECULE].include?(field_type)
end

#extract_value_system(sub_val, sub_field) ⇒ Object

Extract value_system from sub_val or sub_field



118
119
120
121
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 118

def extract_value_system(sub_val, sub_field)
  field_data = sub_val[sub_field['id']]
  field_data.is_a?(Hash) ? field_data['value_system'] : sub_field['value_system']
end

#find_unit_by_key(option_layers, value_system) ⇒ Object

Find unit label by field and key



124
125
126
127
128
129
130
131
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 124

def find_unit_by_key(option_layers, value_system)
  field_config = Labimotion::Units::FIELDS.find { |o| o[:field] == option_layers }
  return '' unless field_config

  units = field_config.fetch(:units, [])
  unit = units.find { |u| u[:key] == value_system }
  unit ? unit.fetch(:label, '') : ''
end

#find_unit_label(sub_val, sub_field) ⇒ Object

Find unit label for system-defined field



112
113
114
115
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 112

def find_unit_label(sub_val, sub_field)
  value_system = extract_value_system(sub_val, sub_field)
  find_unit_by_key(sub_field['option_layers'], value_system)
end

#format_default_cell(sub_val, sub_field) ⇒ Object

Format default cell



134
135
136
137
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 134

def format_default_cell(sub_val, sub_field)
  cell_data = sub_val[sub_field['id']]
  cell_data.is_a?(Hash) ? cell_data['value'].to_s : cell_data.to_s
end

#format_drag_field_cell(sub_val, sub_field) ⇒ Object

Format drag field cell (DRAG_SAMPLE or DRAG_MOLECULE), returns hyperlink or label



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 85

def format_drag_field_cell(sub_val, sub_field)
  val = sub_val[sub_field['id']]['value'] || {}
  return '' if val.blank?

  svg_url = val['el_svg'].to_s
  if svg_url.present?
    full_url = URI.join(Rails.application.config.root_url, svg_url).to_s
    { hyperlink: full_url, text: '[image link]' }
  else
    val['el_label'].to_s
  end
end

#format_expanded_cell(sub_val, exp_field) ⇒ Object

Format expanded cell for DRAG_SAMPLE or DRAG_MOLECULE with sub-headers



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 50

def format_expanded_cell(sub_val, exp_field)
  field_id = exp_field['id']
  sub_header = exp_field['sub_header']

  return '' if field_id.nil? || sub_val[field_id].nil?

  val = sub_val[field_id]['value'] || {}
  return '' if val.blank? || !val.is_a?(Hash)

  property_key = map_sub_header_to_property(sub_header)
  val[property_key].to_s
rescue StandardError => e
  Labimotion.log_exception(e)
  ''
end

#format_select_cell(sub_val, sub_field) ⇒ Object

Format select cell



99
100
101
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 99

def format_select_cell(sub_val, sub_field)
  sub_val[sub_field['id']]['value'].to_s
end

#format_system_defined_cell(sub_val, sub_field) ⇒ Object

Format system-defined cell with unit



104
105
106
107
108
109
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 104

def format_system_defined_cell(sub_val, sub_field)
  value = sub_val[sub_field['id']]['value'].to_s
  unit = find_unit_label(sub_val, sub_field)

  unit.present? ? "#{value} #{unit}" : value
end

#format_table_cell(sub_val, sub_field) ⇒ Object

Format table cell value based on field type



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 31

def format_table_cell(sub_val, sub_field)
  return '' if sub_field.fetch('id', nil).nil? || sub_val[sub_field['id']].nil?

  case sub_field['type']
  when Labimotion::FieldType::DRAG_SAMPLE, Labimotion::FieldType::DRAG_MOLECULE
    format_drag_field_cell(sub_val, sub_field)
  when Labimotion::FieldType::SELECT
    format_select_cell(sub_val, sub_field)
  when Labimotion::FieldType::SYSTEM_DEFINED
    format_system_defined_cell(sub_val, sub_field)
  else
    format_default_cell(sub_val, sub_field)
  end
rescue StandardError => e
  Labimotion.log_exception(e)
  ''
end

#generate_filename(element_name, segment_name, layer_name, field_name) ⇒ Object

Generate sanitized filename for export



22
23
24
25
26
27
28
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 22

def generate_filename(element_name, segment_name, layer_name, field_name)
  timestamp = Time.zone.now.strftime('%Y%m%d_%H%M%S')
  parts = [element_name]
  parts << segment_name unless segment_name.empty?
  parts.push(layer_name, field_name, timestamp)
  parts.join('_').gsub(/\s+/, '_').gsub(/[()]/, '(' => '[', ')' => ']')
end

#map_sub_header_to_property(sub_header) ⇒ Object

Map sub-header to property key



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 67

def map_sub_header_to_property(sub_header)
  property_map = {
    'name' => 'el_name',
    'label' => 'el_label',
    'short_label' => 'el_short_label',
    'external_label' => 'el_external_label',
    'molecular_weight' => 'el_molecular_weight',
    'smiles' => 'el_smiles',
    'inchikey' => 'el_inchikey',
    'iupac' => 'el_iupac',
    'sum_formula' => 'el_sum_formula',
    'decoupled' => 'el_decoupled'
  }

  property_map[sub_header] || "el_#{sub_header}"
end

#normalize_column_name(col_name) ⇒ Object

Normalize column name, returns CONST_UNNAMED for blank values



10
11
12
13
14
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 10

def normalize_column_name(col_name)
  return CONST_UNNAMED if col_name.nil? || col_name.to_s.strip.empty?

  col_name
end