Browse Source

Closes #4186 - Fixes #4186 - Multiselect does not show values properly in reports.

IsaacM88 2 years ago
parent
commit
327099a953
2 changed files with 37 additions and 6 deletions
  1. 6 6
      lib/excel_sheet.rb
  2. 31 0
      spec/lib/excel_sheet_spec.rb

+ 6 - 6
lib/excel_sheet.rb

@@ -118,7 +118,7 @@ class ExcelSheet
     time.in_time_zone(@timezone).strftime('%F %T') # "2019-08-19 16:21:52"
   end
 
-  def value_lookup(record, attribute, additional)
+  def value_lookup(record, attribute, object, additional)
     value = record[attribute.to_sym]
     if attribute[-3, 3] == '_id'
       ref = attribute[0, attribute.length - 3]
@@ -143,6 +143,10 @@ class ExcelSheet
     if !value && additional && additional[attribute.to_sym]
       value = additional[attribute.to_sym]
     end
+    if object[:data_type] !~ %r{^(multi_)?tree_select$} && object[:data_option].present? && object[:data_option]['options'].present?
+      display_values = ObjectManager::Attribute.data_options_hash(object[:data_option]['options'])
+      value = Array(value).map { |v| display_values[v] }.join(',')
+    end
     if value.is_a?(Array)
       value = value.join(',')
     end
@@ -151,16 +155,12 @@ class ExcelSheet
 
   def value_convert(record, attribute, object, additional = {})
     value = if attribute
-              value_lookup(record, attribute, additional)
+              value_lookup(record, attribute, object, additional)
             else
               record
             end
     case object[:data_type]
     when 'boolean', %r{^(multi)?select$}
-      if object[:data_option].present? && object[:data_option]['options'].present?
-        value = ObjectManager::Attribute.data_options_hash(object[:data_option]['options'])[value]
-      end
-
       @worksheet.write_string(@current_row, @current_column, value) if value.present?
     when 'datetime'
       @worksheet.write_date_time(@current_row, @current_column, timestamp_in_localtime(value), @format_time) if value.present?

+ 31 - 0
spec/lib/excel_sheet_spec.rb

@@ -13,4 +13,35 @@ RSpec.describe ExcelSheet do
     end
 
   end
+
+  describe 'Multiselect does not show values properly in reports #4186', db_strategy: :reset do
+    let(:document) { described_class.new(title: 'some title', header: [], records: [], timezone: 'Europe/Berlin', locale: 'de-de') }
+    let(:ticket) { create(:ticket, '4186_select': 'key_1', '4186_tree_select': 'Incident::Hardware', '4186_multiselect': %w[key_1 key_2], '4186_multi_tree_select': ['Incident', 'Incident::Hardware']) }
+
+    before do
+      create :object_manager_attribute_select, name: '4186_select'
+      create :object_manager_attribute_tree_select, name: '4186_tree_select'
+      create :object_manager_attribute_multiselect, name: '4186_multiselect'
+      create :object_manager_attribute_multi_tree_select, name: '4186_multi_tree_select'
+      ObjectManager::Attribute.migration_execute
+
+      ticket
+    end
+
+    it 'does show select values formatted' do
+      expect(document.value_lookup(ticket, '4186_select', ObjectManager::Attribute.find_by(name: '4186_select'), nil)).to eq('value_1')
+    end
+
+    it 'does show tree select values formatted' do
+      expect(document.value_lookup(ticket, '4186_tree_select', ObjectManager::Attribute.find_by(name: '4186_tree_select'), nil)).to eq('Incident::Hardware')
+    end
+
+    it 'does show multiselect values formatted' do
+      expect(document.value_lookup(ticket, '4186_multiselect', ObjectManager::Attribute.find_by(name: '4186_multiselect'), nil)).to eq('value_1,value_2')
+    end
+
+    it 'does show multi tree select values formatted' do
+      expect(document.value_lookup(ticket, '4186_multi_tree_select', ObjectManager::Attribute.find_by(name: '4186_multi_tree_select'), nil)).to eq('Incident,Incident::Hardware')
+    end
+  end
 end