diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-16 15:08:03 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-16 15:08:03 +0300 |
commit | 12166c0faf75479889bc0ac432b85b9dae91552b (patch) | |
tree | fc5a3140e12c815beb6c34d44e2ad423a4f302ad /app/models/work_items | |
parent | b1a0a71628cb4531f3b9a2999f5aa4d22f6ac5fb (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/work_items')
-rw-r--r-- | app/models/work_items/type.rb | 61 | ||||
-rw-r--r-- | app/models/work_items/widget_definition.rb | 54 |
2 files changed, 58 insertions, 57 deletions
diff --git a/app/models/work_items/type.rb b/app/models/work_items/type.rb index 258a86d7316..6a619dbab21 100644 --- a/app/models/work_items/type.rb +++ b/app/models/work_items/type.rb @@ -35,56 +35,6 @@ module WorkItems key_result: { name: TYPE_NAMES[:key_result], icon_name: 'issue-type-keyresult', enum_value: 6 } ## EE-only }.freeze - WIDGETS_FOR_TYPE = { - issue: [ - Widgets::Assignees, - Widgets::Labels, - Widgets::Description, - Widgets::Hierarchy, - Widgets::StartAndDueDate, - Widgets::Milestone, - Widgets::Notes - ], - incident: [ - Widgets::Description, - Widgets::Hierarchy, - Widgets::Notes - ], - test_case: [ - Widgets::Description, - Widgets::Notes - ], - requirement: [ - Widgets::Description, - Widgets::Notes - ], - task: [ - Widgets::Assignees, - Widgets::Labels, - Widgets::Description, - Widgets::Hierarchy, - Widgets::StartAndDueDate, - Widgets::Milestone, - Widgets::Notes - ], - objective: [ - Widgets::Assignees, - Widgets::Labels, - Widgets::Description, - Widgets::Hierarchy, - Widgets::Milestone, - Widgets::Notes - ], - key_result: [ - Widgets::Assignees, - Widgets::Labels, - Widgets::Description, - Widgets::Hierarchy, - Widgets::StartAndDueDate, - Widgets::Notes - ] - }.freeze - # A list of types user can change between - both original and new # type must be included in this list. This is needed for legacy issues # where it's possible to switch between issue and incident. @@ -98,6 +48,9 @@ module WorkItems belongs_to :namespace, optional: true has_many :work_items, class_name: 'Issue', foreign_key: :work_item_type_id, inverse_of: :work_item_type + has_many :widget_definitions, foreign_key: :work_item_type_id, inverse_of: :work_item_type + has_many :enabled_widget_definitions, -> { where(disabled: false) }, foreign_key: :work_item_type_id, + inverse_of: :work_item_type, class_name: 'WorkItems::WidgetDefinition' before_validation :strip_whitespace @@ -112,10 +65,6 @@ module WorkItems scope :order_by_name_asc, -> { order(arel_table[:name].lower.asc) } scope :by_type, ->(base_type) { where(base_type: base_type) } - def self.available_widgets - WIDGETS_FOR_TYPE.values.flatten.uniq - end - def self.default_by_type(type) found_type = find_by(namespace_id: nil, base_type: type) return found_type if found_type @@ -138,7 +87,7 @@ module WorkItems end def widgets - WIDGETS_FOR_TYPE[base_type.to_sym] + enabled_widget_definitions.filter_map(&:widget_class) end def supports_assignee? @@ -156,5 +105,3 @@ module WorkItems end end end - -WorkItems::Type.prepend_mod diff --git a/app/models/work_items/widget_definition.rb b/app/models/work_items/widget_definition.rb new file mode 100644 index 00000000000..5d4414e95d8 --- /dev/null +++ b/app/models/work_items/widget_definition.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +module WorkItems + class WidgetDefinition < ApplicationRecord + self.table_name = 'work_item_widget_definitions' + + belongs_to :namespace, optional: true + belongs_to :work_item_type, class_name: 'WorkItems::Type', inverse_of: :widget_definitions + + validates :name, presence: true + validates :name, uniqueness: { case_sensitive: false, scope: [:namespace_id, :work_item_type_id] } + validates :name, length: { maximum: 255 } + + scope :enabled, -> { where(disabled: false) } + scope :global, -> { where(namespace: nil) } + + enum widget_type: { + assignees: 0, + description: 1, + hierarchy: 2, + labels: 3, + milestone: 4, + notes: 5, + start_and_due_date: 6, + health_status: 7, # EE-only + weight: 8, # EE-only + iteration: 9, # EE-only + progress: 10, # EE-only + status: 11, # EE-only + requirement_legacy: 12, # EE-only + test_reports: 13 # EE-only + } + + def self.available_widgets + global.enabled.filter_map(&:widget_class).uniq + end + + def self.widget_classes + WorkItems::WidgetDefinition.widget_types.keys.filter_map do |type| + WorkItems::Widgets.const_get(type.camelize, false) + rescue NameError + nil + end + end + + def widget_class + return unless widget_type + + WorkItems::Widgets.const_get(widget_type.camelize, false) + rescue NameError + nil + end + end +end |