diff --git a/doc/user/analytics/analytics_dashboards.md b/doc/user/analytics/analytics_dashboards.md index 63f5b2812e997c711eda2d9b823aa3758e529406..860e4ca85d790a00d2d888c00125626bbb439727 100644 --- a/doc/user/analytics/analytics_dashboards.md +++ b/doc/user/analytics/analytics_dashboards.md @@ -154,9 +154,10 @@ To change the location of a group's dashboards: ### Project dashboards -Dashboards are usually defined in the project where the analytics data is being retrieved from. +By default custom dashboards are saved to the current project, because +dashboards are usually defined in the project where the analytics data is retrieved from. However, you can also have a separate project for dashboards. -This is recommended if you want to enforce specific access rules to the dashboard definitions or share dashboards across multiple projects. +This setup is recommended if you want to enforce specific access rules to the dashboard definitions or share dashboards across multiple projects. NOTE: You can share dashboards only between projects that are located in the same group. diff --git a/ee/app/helpers/analytics/analytics_dashboards_helper.rb b/ee/app/helpers/analytics/analytics_dashboards_helper.rb index 6c318dc8f94286768667d0e5c428e1dd66836faa..ce29bb7d04016217c5b23e6feb8278e393ea028c 100644 --- a/ee/app/helpers/analytics/analytics_dashboards_helper.rb +++ b/ee/app/helpers/analytics/analytics_dashboards_helper.rb @@ -110,16 +110,20 @@ def managed_cluster_purchased?(project) end def project_dashboard_pointer(project) - project.analytics_dashboards_pointer.target_project + if project.analytics_dashboards_pointer.present? + project.analytics_dashboards_pointer.target_project + else + project + end end def group_dashboard_pointer(group) + return unless group.analytics_dashboards_pointer.present? + group.all_projects.find_by_id(group.analytics_dashboards_pointer.target_project_id) end def analytics_dashboard_pointer_project(namespace) - return unless namespace.analytics_dashboards_pointer - pointer_project = project?(namespace) ? project_dashboard_pointer(namespace) : group_dashboard_pointer(namespace) return unless pointer_project diff --git a/ee/app/views/projects/settings/analytics/_custom_dashboard_projects.html.haml b/ee/app/views/projects/settings/analytics/_custom_dashboard_projects.html.haml index 40aa7070f2c3b3a4ce7709af4354f8eaba99f6e4..2c69f852aebadf7c65c979f4034598d2bab50af4 100644 --- a/ee/app/views/projects/settings/analytics/_custom_dashboard_projects.html.haml +++ b/ee/app/views/projects/settings/analytics/_custom_dashboard_projects.html.haml @@ -13,7 +13,9 @@ = link_to _('Learn more.'), help_page_path('user/analytics/analytics_dashboards', anchor: 'change-the-location-of-dashboards'), target: '_blank', rel: 'noopener noreferrer' .settings-content %h4= s_('ProjectSettings|Analytics Dashboards') - %p= safe_format(s_('ProjectSettings|Select the project containing %{link_start}Analytics Dashboards%{link_end} configuration files.'), tag_pair(dashboards_link, :link_start, :link_end)) + %p + %span= safe_format(s_('ProjectSettings|Select the project containing %{link_start}Analytics Dashboards%{link_end} configuration files.'), tag_pair(dashboards_link, :link_start, :link_end)) + %span= s_('ProjectSettings|By default the current project is used.') = gitlab_ui_form_for @project, url: project_settings_analytics_path(@project, anchor: 'js-analytics-dashboards-settings'), html: { class: 'fieldset-form', data: { testid: 'analytics-dashboards-settings' } } do |form| = form_errors(@project) diff --git a/ee/spec/features/projects/product_analytics/dashboards_shared_examples.rb b/ee/spec/features/projects/product_analytics/dashboards_shared_examples.rb index bca5b14b654c966d23e426abc5b73108d6b513a4..08a81ab9542050e7d6fc5dfb4e5ae9a30cbdccb5 100644 --- a/ee/spec/features/projects/product_analytics/dashboards_shared_examples.rb +++ b/ee/spec/features/projects/product_analytics/dashboards_shared_examples.rb @@ -74,16 +74,6 @@ end end - shared_examples 'does not render the new dashboard button' do - before do - visit_page - end - - it do - expect(page).not_to have_content(s_('Analytics|New dashboard')) - end - end - context 'with the required application settings' do before do stub_application_setting(product_analytics_enabled?: true) @@ -288,7 +278,7 @@ end end - context 'and custom dashboards is configured' do + context 'and a custom dashboard pointer is set' do before do create(:analytics_dashboards_pointer, :project_based, project: project) end @@ -296,8 +286,8 @@ it_behaves_like 'renders the new dashboard button' end - context 'and custom dashboards is not configured' do - it_behaves_like 'does not render the new dashboard button' + context 'and the default custom dashboard location is used' do + it_behaves_like 'renders the new dashboard button' end end end diff --git a/ee/spec/helpers/analytics/analytics_dashboards_helper_spec.rb b/ee/spec/helpers/analytics/analytics_dashboards_helper_spec.rb index cede2bddece291cf26a3ab3a7a1007b4b3923d3c..98ff27883c7eb5377bb5b10e7839c3f539564ce0 100644 --- a/ee/spec/helpers/analytics/analytics_dashboards_helper_spec.rb +++ b/ee/spec/helpers/analytics/analytics_dashboards_helper_spec.rb @@ -8,7 +8,6 @@ let_it_be_with_refind(:group) { create(:group) } # rubocop:disable RSpec/FactoryBot/AvoidCreate let_it_be_with_refind(:project) { create(:project, group: group) } # rubocop:disable RSpec/FactoryBot/AvoidCreate let_it_be(:user) { build_stubbed(:user) } - let_it_be(:pointer) { create(:analytics_dashboards_pointer, :project_based, project: project) } # rubocop:disable RSpec/FactoryBot/AvoidCreate let_it_be(:group_pointer) { create(:analytics_dashboards_pointer, namespace: group, target_project: project) } # rubocop:disable RSpec/FactoryBot/AvoidCreate let_it_be(:add_on) { create(:gitlab_subscription_add_on, :product_analytics) } # rubocop:disable RSpec/FactoryBot/AvoidCreate @@ -56,16 +55,16 @@ subject(:data) { helper.analytics_dashboards_list_app_data(project) } - def expected_data(has_permission) + def expected_data(has_permission, pointer_project = project) { is_project: 'true', is_group: 'false', namespace_id: project.id, dashboard_project: { - id: pointer.target_project.id, - full_path: pointer.target_project.full_path, - name: pointer.target_project.name, - default_branch: pointer.target_project.default_branch + id: pointer_project.id, + full_path: pointer_project.full_path, + name: pointer_project.name, + default_branch: pointer_project.default_branch }.to_json, can_configure_project_settings: user_can_admin_project.to_s, can_select_gitlab_managed_provider: 'false', @@ -113,6 +112,14 @@ def expected_data(has_permission) expect(data).to include({ overview_counts_aggregation_enabled: "true" }) end end + + context 'with a dashboard pointer' do + let_it_be(:pointer) { create(:analytics_dashboards_pointer, :project_based, project: project) } # rubocop:disable RSpec/FactoryBot/AvoidCreate + + it 'returns the pointer target project in the expected data' do + expect(data).to eq(expected_data(false, pointer.target_project)) + end + end end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 0ac48d65e85cff6ae2929f7b30f22ae4552aea57..bed65d9ffe546244d1b6f7ca88494a6c44cb73bf 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -41426,6 +41426,9 @@ msgstr "" msgid "ProjectSettings|Build, test, and deploy your changes. Does not apply to project integrations." msgstr "" +msgid "ProjectSettings|By default the current project is used." +msgstr "" + msgid "ProjectSettings|Checkbox is visible and selected by default." msgstr ""