1# frozen_string_literal: true
2
3# Verifies features availability based on issue type.
4# This can be used, for example, for hiding UI elements or blocking specific
5# quick actions for particular issue types;
6module IssueAvailableFeatures
7  extend ActiveSupport::Concern
8
9  class_methods do
10    # EE only features are listed on EE::IssueAvailableFeatures
11    def available_features_for_issue_types
12      {
13        assignee: %w(issue incident),
14        confidentiality: %w(issue incident),
15        time_tracking: %w(issue incident),
16        move_and_clone: %w(issue incident)
17      }.with_indifferent_access
18    end
19  end
20
21  included do
22    scope :with_feature, ->(feature) { where(issue_type: available_features_for_issue_types[feature]) }
23  end
24
25  def issue_type_supports?(feature)
26    unless self.class.available_features_for_issue_types.has_key?(feature)
27      raise ArgumentError, 'invalid feature'
28    end
29
30    self.class.available_features_for_issue_types[feature].include?(issue_type)
31  end
32end
33
34IssueAvailableFeatures.prepend_mod_with('IssueAvailableFeatures')
35IssueAvailableFeatures::ClassMethods.prepend_mod_with('IssueAvailableFeatures::ClassMethods')
36