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, DRAG_MOLECULE or DRAG_ELEMENT)

Returns:

  • (Boolean)


17
18
19
20
21
22
23
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 17

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

#extract_value_system(sub_val, sub_field) ⇒ Object

Extract value_system from sub_val or sub_field



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

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



139
140
141
142
143
144
145
146
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 139

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



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

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



149
150
151
152
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 149

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



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 91

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_element_cell(sub_val, sub_field) ⇒ Object

Format drag_element cell — a linked element has no structure image, so the short label is the cell text



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

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

  val['el_label'].present? ? val['el_label'].to_s : val['el_name'].to_s
end

#format_expanded_cell(sub_val, exp_field) ⇒ Object

Format expanded cell for DRAG_SAMPLE or DRAG_MOLECULE with sub-headers



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 56

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



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

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



119
120
121
122
123
124
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 119

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



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 35

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::DRAG_ELEMENT
    format_element_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



26
27
28
29
30
31
32
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 26

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



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/labimotion/helpers/exporter_helpers.rb', line 73

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