Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-02-16 15:08:03 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-02-16 15:08:03 +0300
commit12166c0faf75479889bc0ac432b85b9dae91552b (patch)
treefc5a3140e12c815beb6c34d44e2ad423a4f302ad /app/models/work_items
parentb1a0a71628cb4531f3b9a2999f5aa4d22f6ac5fb (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/work_items')
-rw-r--r--app/models/work_items/type.rb61
-rw-r--r--app/models/work_items/widget_definition.rb54
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