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:
Diffstat (limited to 'app/helpers/nav/new_dropdown_helper.rb')
-rw-r--r--app/helpers/nav/new_dropdown_helper.rb188
1 files changed, 188 insertions, 0 deletions
diff --git a/app/helpers/nav/new_dropdown_helper.rb b/app/helpers/nav/new_dropdown_helper.rb
new file mode 100644
index 00000000000..b952aeacb13
--- /dev/null
+++ b/app/helpers/nav/new_dropdown_helper.rb
@@ -0,0 +1,188 @@
+# frozen_string_literal: true
+
+module Nav
+ module NewDropdownHelper
+ def new_dropdown_view_model(group:, project:)
+ return unless current_user
+
+ menu_sections = []
+
+ if group&.persisted?
+ menu_sections.push(group_menu_section(group))
+ elsif project&.persisted?
+ menu_sections.push(project_menu_section(project))
+ end
+
+ menu_sections.push(general_menu_section)
+
+ {
+ title: _("New..."),
+ menu_sections: menu_sections.select { |x| x.fetch(:menu_items).any? }
+ }
+ end
+
+ def new_repo_experiment_text
+ experiment(:new_repo, user: current_user) do |e|
+ e.use { _('New project') }
+ e.try { _('New project/repository') }
+ end.run
+ end
+
+ private
+
+ def group_menu_section(group)
+ menu_items = []
+
+ if can?(current_user, :create_projects, group)
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'new_project',
+ title: new_repo_experiment_text,
+ href: new_project_path(namespace_id: group.id),
+ data: { track_experiment: 'new_repo', track_event: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' }
+ )
+ )
+ end
+
+ if can?(current_user, :create_subgroup, group)
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'new_subgroup',
+ title: _('New subgroup'),
+ href: new_group_path(parent_id: group.id),
+ data: { track_event: 'click_link_new_subgroup', track_label: 'plus_menu_dropdown' }
+ )
+ )
+ end
+
+ menu_items.push(create_epic_menu_item(group))
+
+ if Gitlab::Experimentation.active?(:invite_members_new_dropdown) && can?(current_user, :admin_group_member, group)
+ menu_items.push(
+ invite_members_menu_item(
+ href: group_group_members_path(group)
+ )
+ )
+ end
+
+ {
+ title: _('This group'),
+ menu_items: menu_items.compact
+ }
+ end
+
+ def project_menu_section(project)
+ menu_items = []
+ merge_project = merge_request_source_project_for_project(project)
+
+ if show_new_issue_link?(project)
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'new_issue',
+ title: _('New issue'),
+ href: new_project_issue_path(project),
+ data: { track_event: 'click_link_new_issue', track_label: 'plus_menu_dropdown', qa_selector: 'new_issue_link' }
+ )
+ )
+ end
+
+ if merge_project
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'new_mr',
+ title: _('New merge request'),
+ href: project_new_merge_request_path(merge_project),
+ data: { track_event: 'click_link_new_mr', track_label: 'plus_menu_dropdown' }
+ )
+ )
+ end
+
+ if can?(current_user, :create_snippet, project)
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'new_snippet',
+ title: _('New snippet'),
+ href: new_project_snippet_path(project),
+ data: { track_event: 'click_link_new_snippet_project', track_label: 'plus_menu_dropdown' }
+ )
+ )
+ end
+
+ if Gitlab::Experimentation.active?(:invite_members_new_dropdown) && can_import_members?
+ menu_items.push(
+ invite_members_menu_item(
+ href: project_project_members_path(project)
+ )
+ )
+ end
+
+ {
+ title: _('This project'),
+ menu_items: menu_items
+ }
+ end
+
+ def general_menu_section
+ menu_items = []
+
+ if current_user.can_create_project?
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'general_new_project',
+ title: new_repo_experiment_text,
+ href: new_project_path,
+ data: { track_experiment: 'new_repo', track_event: 'click_link_new_project', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_project_link' }
+ )
+ )
+ end
+
+ if current_user.can_create_group?
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'general_new_group',
+ title: _('New group'),
+ href: new_group_path,
+ data: { track_event: 'click_link_new_group', track_label: 'plus_menu_dropdown' }
+ )
+ )
+ end
+
+ if current_user.can?(:create_snippet)
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'general_new_snippet',
+ title: _('New snippet'),
+ href: new_snippet_path,
+ data: { track_event: 'click_link_new_snippet_parent', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_snippet_link' }
+ )
+ )
+ end
+
+ {
+ title: _('GitLab'),
+ menu_items: menu_items
+ }
+ end
+
+ def invite_members_menu_item(href:)
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'invite',
+ title: s_('InviteMember|Invite members'),
+ emoji: ('shaking_hands' if experiment_enabled?(:invite_members_new_dropdown)),
+ href: href,
+ data: {
+ track_event: 'click_link',
+ track_label: tracking_label,
+ track_property: experiment_tracking_category_and_group(:invite_members_new_dropdown)
+ }
+ )
+ end
+
+ # Overridden in EE
+ def create_epic_menu_item(group)
+ nil
+ end
+ end
+end
+
+Nav::NewDropdownHelper.prepend_mod