Browse Source

Fixes #4713 - Single select display value in trigger variable (#{ticket.abc.value}) is empty when "custom option sort" is used.

Co-authored-by: Florian Liebe <fl@zammad.com>
Rolf Schmidt 1 year ago
parent
commit
b69dd9abcc

+ 12 - 4
lib/notification_factory/renderer.rb

@@ -211,6 +211,16 @@ examples how to use
     true
   end
 
+  def select_value(attribute, key)
+    key     = Array(key)
+    options = attribute.data_option['options']
+    if options.is_a?(Array)
+      key.map { |k| options.detect { |o| o['value'] == k }&.dig('name') || k }
+    else
+      key.map { |k| options[k] || k }
+    end
+  end
+
   def display_value(object, method_name, previous_method_names, key)
     return key if method_name != 'value' ||
                   (!key.instance_of?(String) && !key.instance_of?(Array))
@@ -220,10 +230,8 @@ examples how to use
                  .where(name: previous_method_names.split('.').last)
 
     case attributes.first.data_type
-    when 'select'
-      attributes.first.data_option['options'][key] || key
-    when 'multiselect'
-      key.map { |k| attributes.first.data_option['options'][k] || k }
+    when %r{^(multi)?select$}
+      select_value(attributes.first, key)
     else
       key
     end

+ 11 - 5
spec/factories/object_manager_attribute.rb

@@ -212,17 +212,23 @@ FactoryBot.define do
   end
 
   factory :object_manager_attribute_multiselect, parent: :object_manager_attribute do
+    transient do
+      data_option_options do
+        {
+          'key_1' => 'value_1',
+          'key_2' => 'value_2',
+          'key_3' => 'value_3',
+        }
+      end
+    end
+
     default { [] }
 
     data_type { 'multiselect' }
     data_option do
       {
         'default'    => default,
-        'options'    => {
-          'key_1' => 'value_1',
-          'key_2' => 'value_2',
-          'key_3' => 'value_3',
-        },
+        'options'    => data_option_options,
         'relation'   => '',
         'nulloption' => true,
         'multiple'   => true,

+ 42 - 0
spec/lib/notification_factory/renderer_spec.rb

@@ -393,6 +393,48 @@ RSpec.describe NotificationFactory::Renderer do
           it_behaves_like 'correctly rendering the attributes'
         end
 
+        context 'with select (custom sorted) attribute on chained group object' do
+          let(:create_object_manager_attribute) do
+            create(:object_manager_attribute_select,
+                   object_lookup_id:    ObjectLookup.by_name('Group'),
+                   name:                'select',
+                   data_option_options: [{ name: 'value_1', value: 'key_1' }, { name: 'value_2', value: 'key_2' }, { name: 'value_3', value: 'key_3' }])
+          end
+          let(:template)        { '#{ticket.group.select} _SEPERATOR_ #{ticket.group.select.value}' }
+          let(:expected_render) { 'key_3 _SEPERATOR_ value_3' }
+
+          let(:ticket) { create(:ticket, customer: @user) }
+
+          before do
+            group = ticket.group
+            group.select = 'key_3'
+            group.save
+          end
+
+          it_behaves_like 'correctly rendering the attributes'
+        end
+
+        context 'with multiple multiselect (custom sorted) attribute on chained group object' do
+          let(:create_object_manager_attribute) do
+            create(:object_manager_attribute_multiselect,
+                   object_lookup_id:    ObjectLookup.by_name('Group'),
+                   name:                'multiselect',
+                   data_option_options: [{ name: 'value_1', value: 'key_1' }, { name: 'value_2', value: 'key_2' }, { name: 'value_3', value: 'key_3' }])
+          end
+          let(:template)        { '#{ticket.group.multiselect} _SEPERATOR_ #{ticket.group.multiselect.value}' }
+          let(:expected_render) { 'key_3, key_1 _SEPERATOR_ value_3, value_1' }
+
+          let(:ticket) { create(:ticket, customer: @user) }
+
+          before do
+            group = ticket.group
+            group.multiselect = %w[key_3 key_1]
+            group.save
+          end
+
+          it_behaves_like 'correctly rendering the attributes'
+        end
+
         context 'with multiple multiselect attribute on chained organization object' do
           let(:create_object_manager_attribute) do
             create(:object_manager_attribute_multiselect,