From e69d400913704fa02a704a7b7542ad388efeaa65 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 1 Mar 2024 18:10:32 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/rails.gitlab-ci.yml | 4 - .../layout/empty_line_after_magic_comment.yml | 2 - .rubocop_todo/layout/line_length.yml | 3 - .rubocop_todo/rspec/context_wording.yml | 1 - .rubocop_todo/rspec/named_subject.yml | 1 - .../style/inline_disable_annotation.yml | 1 - .../javascripts/organizations/mock_data.js | 152 +----- .../organizations/mock_projects.js | 163 ++++++ .../fragments/base_project.fragment.graphql | 29 + .../fragments/project.fragment.graphql | 5 + .../graphql/queries/projects.query.graphql | 28 +- .../wikis/components/delete_wiki_modal.vue | 29 +- .../shared/wikis/components/wiki_form.vue | 59 +- .../wikis/components/wiki_more_dropdown.vue | 6 +- .../shared/wikis/components/wiki_template.vue | 92 ++++ .../javascripts/pages/shared/wikis/edit.js | 3 +- .../javascripts/pages/shared/wikis/utils.js | 3 + .../components/markdown/markdown_editor.vue | 46 ++ .../projects_list/projects_list_item.vue | 31 +- app/controllers/concerns/wiki_actions.rb | 47 +- app/helpers/wiki_helper.rb | 31 +- app/models/active_session.rb | 40 +- app/models/wiki.rb | 4 + app/models/wiki_directory.rb | 4 +- app/models/wiki_page.rb | 4 + .../packages/maven/create_package_service.rb | 6 +- .../maven/find_or_create_package_service.rb | 8 +- .../packages/npm/create_package_service.rb | 10 +- app/services/wiki_pages/create_service.rb | 3 +- app/services/wiki_pages/destroy_service.rb | 5 +- app/services/wiki_pages/update_service.rb | 3 +- .../application_setting_rate_limits.json | 2 +- .../application_settings/_ci_cd.html.haml | 4 +- app/views/shared/wikis/_form.html.haml | 6 +- app/views/shared/wikis/_main_links.html.haml | 8 +- .../shared/wikis/_pages_wiki_page.html.haml | 15 +- app/views/shared/wikis/_sidebar.html.haml | 14 +- app/views/shared/wikis/diff.html.haml | 2 +- app/views/shared/wikis/edit.html.haml | 6 +- app/views/shared/wikis/history.html.haml | 2 +- app/views/shared/wikis/pages.html.haml | 2 +- app/views/shared/wikis/show.html.haml | 4 +- app/views/shared/wikis/templates.html.haml | 25 + .../active_sessions/_active_session.html.haml | 2 + ...show_admin_mode_within_active_sessions.yml | 9 + config/routes/wiki.rb | 2 + db/fixtures/development/26_packages.rb | 3 +- doc/administration/auth/index.md | 2 + doc/administration/clusters/kas.md | 4 +- .../reference_architectures/10k_users.md | 78 ++- .../reference_architectures/2k_users.md | 51 +- .../reference_architectures/3k_users.md | 74 ++- .../reference_architectures/5k_users.md | 84 ++- .../settings/account_and_limit_settings.md | 14 + .../settings/continuous_integration.md | 7 +- doc/api/features.md | 2 +- doc/api/geo_nodes.md | 2 +- doc/api/geo_sites.md | 2 +- doc/api/graphql/reference/index.md | 1 + doc/api/license.md | 2 +- doc/api/plan_limits.md | 2 +- doc/api/settings.md | 5 +- doc/api/system_hooks.md | 2 +- doc/ci/cloud_services/aws/index.md | 21 +- doc/ci/test_cases/index.md | 6 + .../documentation/styleguide/index.md | 2 +- doc/development/documentation/workflow.md | 15 +- doc/operations/feature_flags.md | 3 +- .../escalation_policies.md | 2 + doc/operations/metrics.md | 6 +- doc/raketasks/index.md | 2 +- doc/raketasks/list_repos.md | 2 +- doc/raketasks/spdx.md | 2 +- doc/raketasks/user_management.md | 2 +- doc/raketasks/web_hooks.md | 2 +- doc/raketasks/x509_signatures.md | 2 +- doc/subscriptions/self_managed/index.md | 2 +- doc/topics/offline/index.md | 2 +- doc/topics/offline/quick_start_guide.md | 2 +- .../website_project_with_analytics/index.md | 2 +- doc/user/application_security/index.md | 47 +- doc/user/gitlab_com/index.md | 2 +- doc/user/gitlab_duo_chat.md | 67 ++- doc/user/gitlab_duo_examples.md | 514 ++++++++++++++++++ .../group/value_stream_analytics/index.md | 2 +- doc/user/project/clusters/add_eks_clusters.md | 2 +- .../project/clusters/add_existing_cluster.md | 2 +- doc/user/project/clusters/add_gke_clusters.md | 2 +- .../project/clusters/add_remove_clusters.md | 2 +- doc/user/project/clusters/cluster_access.md | 2 +- .../project/clusters/deploy_to_cluster.md | 2 +- .../clusters/gitlab_managed_clusters.md | 2 +- doc/user/project/clusters/index.md | 2 +- .../clusters/multiple_kubernetes_clusters.md | 2 +- .../repository/code_suggestions/index.md | 4 + .../project/repository/signed_commits/ssh.md | 6 +- doc/user/project/wiki/index.md | 37 ++ doc/user/ssh.md | 13 +- lib/api/settings.rb | 2 +- locale/gitlab.pot | 84 ++- spec/features/projects/wikis_spec.rb | 1 + .../user_settings/active_sessions_spec.rb | 38 ++ .../components/delete_wiki_modal_spec.js | 61 +++ .../shared/wikis/components/wiki_form_spec.js | 115 +++- .../components/wiki_more_dropdown_spec.js | 17 + .../wikis/components/wiki_template_spec.js | 53 ++ .../frontend/pages/shared/wikis/test_utils.js | 11 + .../markdown/markdown_editor_spec.js | 56 ++ .../projects_list/projects_list_item_spec.js | 46 +- .../maven/create_package_service_spec.rb | 22 +- .../find_or_create_package_service_spec.rb | 21 +- .../npm/create_package_service_spec.rb | 59 +- .../helpers/cycle_analytics_helpers.rb | 2 +- .../wiki_actions_shared_examples.rb | 8 - ..._applies_wiki_templates_shared_examples.rb | 40 ++ .../user_creates_wiki_page_shared_examples.rb | 2 + ...er_views_wiki_templates_shared_examples.rb | 68 +++ .../shared/wikis/_sidebar.html.haml_spec.rb | 6 + 118 files changed, 2211 insertions(+), 547 deletions(-) create mode 100644 app/assets/javascripts/organizations/mock_projects.js create mode 100644 app/assets/javascripts/organizations/shared/graphql/fragments/base_project.fragment.graphql create mode 100644 app/assets/javascripts/organizations/shared/graphql/fragments/project.fragment.graphql create mode 100644 app/assets/javascripts/pages/shared/wikis/components/wiki_template.vue create mode 100644 app/assets/javascripts/pages/shared/wikis/utils.js create mode 100644 app/views/shared/wikis/templates.html.haml create mode 100644 config/feature_flags/gitlab_com_derisk/show_admin_mode_within_active_sessions.yml create mode 100644 doc/user/gitlab_duo_examples.md create mode 100644 spec/frontend/pages/shared/wikis/components/delete_wiki_modal_spec.js create mode 100644 spec/frontend/pages/shared/wikis/components/wiki_template_spec.js create mode 100644 spec/frontend/pages/shared/wikis/test_utils.js create mode 100644 spec/support/shared_examples/features/wiki/user_applies_wiki_templates_shared_examples.rb create mode 100644 spec/support/shared_examples/features/wiki/user_views_wiki_templates_shared_examples.rb diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index a3db2c43ac7..9a9688ea1c0 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -503,10 +503,6 @@ rspec:coverage: optional: true - job: rspec:artifact-collector ee remainder optional: true - # Memory jobs - - job: memory-on-boot - optional: true - artifacts: false script: - run_timed_command "bundle exec scripts/merge-simplecov" coverage: '/LOC \((\d+\.\d+%)\) covered.$/' diff --git a/.rubocop_todo/layout/empty_line_after_magic_comment.yml b/.rubocop_todo/layout/empty_line_after_magic_comment.yml index 5500546069b..a53be928a9f 100644 --- a/.rubocop_todo/layout/empty_line_after_magic_comment.yml +++ b/.rubocop_todo/layout/empty_line_after_magic_comment.yml @@ -99,7 +99,6 @@ Layout/EmptyLineAfterMagicComment: - 'app/services/packages/create_package_file_service.rb' - 'app/services/packages/maven/create_package_service.rb' - 'app/services/packages/maven/find_or_create_package_service.rb' - - 'app/services/packages/npm/create_package_service.rb' - 'app/services/packages/npm/create_tag_service.rb' - 'app/services/packages/nuget/create_dependency_service.rb' - 'app/services/packages/remove_tag_service.rb' @@ -669,7 +668,6 @@ Layout/EmptyLineAfterMagicComment: - 'spec/services/packages/helm/process_file_service_spec.rb' - 'spec/services/packages/maven/create_package_service_spec.rb' - 'spec/services/packages/maven/find_or_create_package_service_spec.rb' - - 'spec/services/packages/npm/create_package_service_spec.rb' - 'spec/services/packages/npm/create_tag_service_spec.rb' - 'spec/services/packages/nuget/create_dependency_service_spec.rb' - 'spec/services/packages/pypi/create_package_service_spec.rb' diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index 18ebb34b4b2..bb14ff2a396 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -547,7 +547,6 @@ Layout/LineLength: - 'app/services/packages/maven/find_or_create_package_service.rb' - 'app/services/packages/maven/metadata/append_package_file_service.rb' - 'app/services/packages/maven/metadata/sync_service.rb' - - 'app/services/packages/npm/create_package_service.rb' - 'app/services/packages/nuget/search_service.rb' - 'app/services/packages/nuget/update_package_from_metadata_service.rb' - 'app/services/personal_access_tokens/create_service.rb' @@ -4426,9 +4425,7 @@ Layout/LineLength: - 'spec/services/packages/generic/create_package_file_service_spec.rb' - 'spec/services/packages/helm/extract_file_metadata_service_spec.rb' - 'spec/services/packages/helm/process_file_service_spec.rb' - - 'spec/services/packages/maven/find_or_create_package_service_spec.rb' - 'spec/services/packages/maven/metadata/sync_service_spec.rb' - - 'spec/services/packages/npm/create_package_service_spec.rb' - 'spec/services/packages/npm/create_tag_service_spec.rb' - 'spec/services/packages/nuget/create_dependency_service_spec.rb' - 'spec/services/packages/nuget/search_service_spec.rb' diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml index 492bec83f9a..0f8b3895dc2 100644 --- a/.rubocop_todo/rspec/context_wording.yml +++ b/.rubocop_todo/rspec/context_wording.yml @@ -2640,7 +2640,6 @@ RSpec/ContextWording: - 'spec/services/packages/maven/find_or_create_package_service_spec.rb' - 'spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb' - 'spec/services/packages/maven/metadata/sync_service_spec.rb' - - 'spec/services/packages/npm/create_package_service_spec.rb' - 'spec/services/packages/nuget/search_service_spec.rb' - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb' - 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb' diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml index 323d349a24b..8ff4ee8b544 100644 --- a/.rubocop_todo/rspec/named_subject.yml +++ b/.rubocop_todo/rspec/named_subject.yml @@ -3346,7 +3346,6 @@ RSpec/NamedSubject: - 'spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb' - 'spec/services/packages/ml_model/find_or_create_package_service_spec.rb' - 'spec/services/packages/npm/create_metadata_cache_service_spec.rb' - - 'spec/services/packages/npm/create_package_service_spec.rb' - 'spec/services/packages/npm/create_tag_service_spec.rb' - 'spec/services/packages/npm/generate_metadata_service_spec.rb' - 'spec/services/packages/nuget/create_dependency_service_spec.rb' diff --git a/.rubocop_todo/style/inline_disable_annotation.yml b/.rubocop_todo/style/inline_disable_annotation.yml index 44836664c9a..635272c724e 100644 --- a/.rubocop_todo/style/inline_disable_annotation.yml +++ b/.rubocop_todo/style/inline_disable_annotation.yml @@ -685,7 +685,6 @@ Style/InlineDisableAnnotation: - 'app/services/packages/create_package_service.rb' - 'app/services/packages/debian/generate_distribution_key_service.rb' - 'app/services/packages/debian/generate_distribution_service.rb' - - 'app/services/packages/npm/create_package_service.rb' - 'app/services/packages/nuget/create_dependency_service.rb' - 'app/services/packages/nuget/extract_remote_metadata_file_service.rb' - 'app/services/packages/nuget/process_package_file_service.rb' diff --git a/app/assets/javascripts/organizations/mock_data.js b/app/assets/javascripts/organizations/mock_data.js index 0b0554e9e8c..8571b032a04 100644 --- a/app/assets/javascripts/organizations/mock_data.js +++ b/app/assets/javascripts/organizations/mock_data.js @@ -4,6 +4,10 @@ // https://gitlab.com/gitlab-org/gitlab/-/issues/420777 // https://gitlab.com/gitlab-org/gitlab/-/issues/421441 +import { organizationProjects } from 'ee_else_ce/organizations/mock_projects'; + +export { organizationProjects }; + export const defaultOrganization = { id: 1, name: 'Default', @@ -40,154 +44,6 @@ export const organizations = [ }, ]; -export const organizationProjects = [ - { - id: 'gid://gitlab/Project/8', - nameWithNamespace: 'Twitter / Typeahead.Js', - webUrl: 'http://127.0.0.1:3000/twitter/Typeahead.Js', - topics: ['JavaScript', 'Vue.js', 'GraphQL', 'Jest', 'CSS', 'HTML'], - forksCount: 4, - avatarUrl: null, - starCount: 0, - visibility: 'public', - openMergeRequestsCount: 5, - openIssuesCount: 48, - descriptionHtml: - '

Optio et reprehenderit enim doloremque deserunt et commodi. Sed sit amet iaculis neque. Morbi vel convallis elit. Aliquam vitae arcu orci. Aenean sem velit, dapibus eget enim id, tempor lobortis orci. Pellentesque dignissim nec velit eget sagittis. Maecenas lectus sapien, tincidunt ac cursus a, aliquam eu ipsum. Aliquam posuere maximus augue, ut vehicula elit vulputate condimentum. In libero leo, vehicula nec risus in, ullamcorper convallis risus. Phasellus sit amet lectus sit amet sem volutpat cursus. Nullam facilisis nulla nec lacus pretium, in pretium ex aliquam.

', - mergeRequestsAccessLevel: { - stringValue: 'ENABLED', - }, - issuesAccessLevel: { - stringValue: 'ENABLED', - }, - forkingAccessLevel: { - stringValue: 'ENABLED', - }, - userPermissions: { - removeProject: true, - }, - maxAccessLevel: { - integerValue: 30, - }, - }, - { - id: 'gid://gitlab/Project/7', - nameWithNamespace: 'Flightjs / Flight', - webUrl: 'http://127.0.0.1:3000/flightjs/Flight', - topics: [], - forksCount: 0, - avatarUrl: null, - starCount: 0, - visibility: 'private', - openMergeRequestsCount: 10, - openIssuesCount: 37, - descriptionHtml: - '

Dolor dicta rerum et ut eius voluptate earum qui.

', - mergeRequestsAccessLevel: { - stringValue: 'ENABLED', - }, - issuesAccessLevel: { - stringValue: 'ENABLED', - }, - forkingAccessLevel: { - stringValue: 'ENABLED', - }, - userPermissions: { - removeProject: true, - }, - maxAccessLevel: { - integerValue: 30, - }, - }, - { - id: 'gid://gitlab/Project/6', - nameWithNamespace: 'Jashkenas / Underscore', - webUrl: 'http://127.0.0.1:3000/jashkenas/Underscore', - topics: [], - forksCount: 0, - avatarUrl: null, - starCount: 0, - visibility: 'private', - openMergeRequestsCount: 0, - openIssuesCount: 34, - descriptionHtml: - '

Incidunt est aliquam autem nihil eveniet quis autem.

', - mergeRequestsAccessLevel: { - stringValue: 'ENABLED', - }, - issuesAccessLevel: { - stringValue: 'ENABLED', - }, - forkingAccessLevel: { - stringValue: 'ENABLED', - }, - userPermissions: { - removeProject: true, - }, - maxAccessLevel: { - integerValue: 30, - }, - }, - { - id: 'gid://gitlab/Project/5', - nameWithNamespace: 'Commit451 / Lab Coat', - webUrl: 'http://127.0.0.1:3000/Commit451/lab-coat', - topics: [], - forksCount: 0, - avatarUrl: null, - starCount: 0, - visibility: 'internal', - openMergeRequestsCount: 3, - openIssuesCount: 49, - descriptionHtml: - '

Sint eos dolorem impedit rerum et.

', - mergeRequestsAccessLevel: { - stringValue: 'ENABLED', - }, - issuesAccessLevel: { - stringValue: 'ENABLED', - }, - forkingAccessLevel: { - stringValue: 'ENABLED', - }, - userPermissions: { - removeProject: true, - }, - maxAccessLevel: { - integerValue: 30, - }, - }, - { - id: 'gid://gitlab/Project/1', - nameWithNamespace: 'Toolbox / Gitlab Smoke Tests', - webUrl: 'http://127.0.0.1:3000/toolbox/gitlab-smoke-tests', - topics: [], - forksCount: 0, - avatarUrl: null, - starCount: 0, - visibility: 'internal', - openMergeRequestsCount: 20, - openIssuesCount: 34, - descriptionHtml: - '

Veritatis error laboriosam libero autem.

', - mergeRequestsAccessLevel: { - stringValue: 'ENABLED', - }, - issuesAccessLevel: { - stringValue: 'ENABLED', - }, - forkingAccessLevel: { - stringValue: 'ENABLED', - }, - userPermissions: { - removeProject: false, - }, - maxAccessLevel: { - integerValue: 30, - }, - }, -]; - export const organizationGroups = [ { id: 'gid://gitlab/Group/29', diff --git a/app/assets/javascripts/organizations/mock_projects.js b/app/assets/javascripts/organizations/mock_projects.js new file mode 100644 index 00000000000..8442e029a37 --- /dev/null +++ b/app/assets/javascripts/organizations/mock_projects.js @@ -0,0 +1,163 @@ +/* eslint-disable @gitlab/require-i18n-strings */ + +// This is temporary mock data that will be removed when completing the following: +// https://gitlab.com/gitlab-org/gitlab/-/issues/420777 +// https://gitlab.com/gitlab-org/gitlab/-/issues/421441 + +export const organizationProjects = [ + { + id: 'gid://gitlab/Project/8', + nameWithNamespace: 'Twitter / Typeahead.Js', + webUrl: 'http://127.0.0.1:3000/twitter/Typeahead.Js', + topics: ['JavaScript', 'Vue.js', 'GraphQL', 'Jest', 'CSS', 'HTML'], + forksCount: 4, + avatarUrl: null, + starCount: 0, + visibility: 'public', + openMergeRequestsCount: 5, + openIssuesCount: 48, + descriptionHtml: + '

Optio et reprehenderit enim doloremque deserunt et commodi. Sed sit amet iaculis neque. Morbi vel convallis elit. Aliquam vitae arcu orci. Aenean sem velit, dapibus eget enim id, tempor lobortis orci. Pellentesque dignissim nec velit eget sagittis. Maecenas lectus sapien, tincidunt ac cursus a, aliquam eu ipsum. Aliquam posuere maximus augue, ut vehicula elit vulputate condimentum. In libero leo, vehicula nec risus in, ullamcorper convallis risus. Phasellus sit amet lectus sit amet sem volutpat cursus. Nullam facilisis nulla nec lacus pretium, in pretium ex aliquam.

', + archived: false, + mergeRequestsAccessLevel: { + stringValue: 'ENABLED', + }, + issuesAccessLevel: { + stringValue: 'ENABLED', + }, + forkingAccessLevel: { + stringValue: 'ENABLED', + }, + userPermissions: { + removeProject: true, + }, + maxAccessLevel: { + integerValue: 30, + }, + __typename: 'Project', + }, + { + id: 'gid://gitlab/Project/7', + nameWithNamespace: 'Flightjs / Flight', + webUrl: 'http://127.0.0.1:3000/flightjs/Flight', + topics: [], + forksCount: 0, + avatarUrl: null, + starCount: 0, + visibility: 'private', + openMergeRequestsCount: 10, + openIssuesCount: 37, + descriptionHtml: + '

Dolor dicta rerum et ut eius voluptate earum qui.

', + archived: false, + mergeRequestsAccessLevel: { + stringValue: 'ENABLED', + }, + issuesAccessLevel: { + stringValue: 'ENABLED', + }, + forkingAccessLevel: { + stringValue: 'ENABLED', + }, + userPermissions: { + removeProject: true, + }, + maxAccessLevel: { + integerValue: 30, + }, + __typename: 'Project', + }, + { + id: 'gid://gitlab/Project/6', + nameWithNamespace: 'Jashkenas / Underscore', + webUrl: 'http://127.0.0.1:3000/jashkenas/Underscore', + topics: [], + forksCount: 0, + avatarUrl: null, + starCount: 0, + visibility: 'private', + openMergeRequestsCount: 0, + openIssuesCount: 34, + descriptionHtml: + '

Incidunt est aliquam autem nihil eveniet quis autem.

', + archived: false, + mergeRequestsAccessLevel: { + stringValue: 'ENABLED', + }, + issuesAccessLevel: { + stringValue: 'ENABLED', + }, + forkingAccessLevel: { + stringValue: 'ENABLED', + }, + userPermissions: { + removeProject: true, + }, + maxAccessLevel: { + integerValue: 30, + }, + __typename: 'Project', + }, + { + id: 'gid://gitlab/Project/5', + nameWithNamespace: 'Commit451 / Lab Coat', + webUrl: 'http://127.0.0.1:3000/Commit451/lab-coat', + topics: [], + forksCount: 0, + avatarUrl: null, + starCount: 0, + visibility: 'internal', + openMergeRequestsCount: 3, + openIssuesCount: 49, + descriptionHtml: + '

Sint eos dolorem impedit rerum et.

', + archived: true, + mergeRequestsAccessLevel: { + stringValue: 'ENABLED', + }, + issuesAccessLevel: { + stringValue: 'ENABLED', + }, + forkingAccessLevel: { + stringValue: 'ENABLED', + }, + userPermissions: { + removeProject: true, + }, + maxAccessLevel: { + integerValue: 30, + }, + __typename: 'Project', + }, + { + id: 'gid://gitlab/Project/1', + nameWithNamespace: 'Toolbox / Gitlab Smoke Tests', + webUrl: 'http://127.0.0.1:3000/toolbox/gitlab-smoke-tests', + topics: [], + forksCount: 0, + avatarUrl: null, + starCount: 0, + visibility: 'internal', + openMergeRequestsCount: 20, + openIssuesCount: 34, + descriptionHtml: + '

Veritatis error laboriosam libero autem.

', + archived: false, + mergeRequestsAccessLevel: { + stringValue: 'ENABLED', + }, + issuesAccessLevel: { + stringValue: 'ENABLED', + }, + forkingAccessLevel: { + stringValue: 'ENABLED', + }, + userPermissions: { + removeProject: false, + }, + maxAccessLevel: { + integerValue: 30, + }, + __typename: 'Project', + }, +]; diff --git a/app/assets/javascripts/organizations/shared/graphql/fragments/base_project.fragment.graphql b/app/assets/javascripts/organizations/shared/graphql/fragments/base_project.fragment.graphql new file mode 100644 index 00000000000..bb1625ab53d --- /dev/null +++ b/app/assets/javascripts/organizations/shared/graphql/fragments/base_project.fragment.graphql @@ -0,0 +1,29 @@ +fragment BaseProject on Project { + id + archived + nameWithNamespace + webUrl + topics + forksCount + avatarUrl + starCount + visibility + openMergeRequestsCount + openIssuesCount + descriptionHtml + mergeRequestsAccessLevel { + stringValue + } + issuesAccessLevel { + stringValue + } + forkingAccessLevel { + stringValue + } + userPermissions { + removeProject + } + maxAccessLevel { + integerValue + } +} diff --git a/app/assets/javascripts/organizations/shared/graphql/fragments/project.fragment.graphql b/app/assets/javascripts/organizations/shared/graphql/fragments/project.fragment.graphql new file mode 100644 index 00000000000..e607313de61 --- /dev/null +++ b/app/assets/javascripts/organizations/shared/graphql/fragments/project.fragment.graphql @@ -0,0 +1,5 @@ +#import "./base_project.fragment.graphql" + +fragment Project on Project { + ...BaseProject +} diff --git a/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql b/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql index 0b7cd2680d2..578ceb4d617 100644 --- a/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql +++ b/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql @@ -1,4 +1,5 @@ #import "~/graphql_shared/fragments/page_info.fragment.graphql" +#import "ee_else_ce/organizations/shared/graphql/fragments/project.fragment.graphql" query getOrganizationProjects( $id: OrganizationsOrganizationID! @@ -11,32 +12,7 @@ query getOrganizationProjects( id projects(first: $first, last: $last, before: $before, after: $after) { nodes { - id - nameWithNamespace - webUrl - topics - forksCount - avatarUrl - starCount - visibility - openMergeRequestsCount - openIssuesCount - descriptionHtml - mergeRequestsAccessLevel { - stringValue - } - issuesAccessLevel { - stringValue - } - forkingAccessLevel { - stringValue - } - userPermissions { - removeProject - } - maxAccessLevel { - integerValue - } + ...Project } pageInfo { ...PageInfo diff --git a/app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue b/app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue index de85420a976..0c834649e4f 100644 --- a/app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue +++ b/app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue @@ -2,6 +2,7 @@ import { GlButton, GlModal, GlModalDirective } from '@gitlab/ui'; import { escape } from 'lodash'; import { s__, __, sprintf } from '~/locale'; +import { isTemplate } from '../utils'; export default { components: { @@ -15,23 +16,23 @@ export default { deleteWikiUrl: { type: String, required: true, - default: '', }, pageTitle: { type: String, required: true, - default: '', }, csrfToken: { type: String, required: true, - default: '', }, }, computed: { + isTemplate, title() { return sprintf( - s__('WikiPageConfirmDelete|Delete page %{pageTitle}?'), + this.isTemplate + ? this.$options.i18n.deleteTemplateTitle + : this.$options.i18n.deletePageTitle, { pageTitle: escape(this.pageTitle), }, @@ -40,13 +41,23 @@ export default { }, primaryProps() { return { - text: this.$options.i18n.deletePageText, + text: this.isTemplate + ? this.$options.i18n.deleteTemplateText + : this.$options.i18n.deletePageText, attributes: { variant: 'danger', 'data-testid': 'confirm-deletion-button', }, }; }, + deleteTemplateText() { + return this.isTemplate + ? this.$options.i18n.deleteTemplateText + : this.$options.i18n.deletePageText; + }, + modalBody() { + return this.isTemplate ? this.$options.i18n.modalBodyTemplate : this.$options.i18n.modalBody; + }, cancelProps() { return { text: this.$options.i18n.cancelButtonText, @@ -60,8 +71,12 @@ export default { }, }, i18n: { + deletePageTitle: s__('WikiPageConfirmDelete|Delete page "%{pageTitle}"?'), + deleteTemplateTitle: s__('WikiPageConfirmDelete|Delete template "%{pageTitle}"?'), deletePageText: s__('WikiPageConfirmDelete|Delete page'), + deleteTemplateText: s__('WikiPageConfirmDelete|Delete template'), modalBody: s__('WikiPageConfirmDelete|Are you sure you want to delete this page?'), + modalBodyTemplate: s__('WikiPageConfirmDelete|Are you sure you want to delete this template?'), cancelButtonText: __('Cancel'), }, modal: { @@ -78,7 +93,7 @@ export default { variant="danger" data-testid="delete-button" > - {{ $options.i18n.deletePageText }} + {{ deleteTemplateText }} - {{ $options.i18n.modalBody }} + {{ modalBody }}
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue index 855c7c4105f..145c38f5868 100644 --- a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue +++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue @@ -22,6 +22,8 @@ import { WIKI_FORMAT_UPDATED_ACTION, CONTENT_EDITOR_LOADED_ACTION, } from '../constants'; +import { isTemplate } from '../utils'; +import WikiTemplate from './wiki_template.vue'; const trackingMixin = Tracking.mixin({ label: WIKI_CONTENT_EDITOR_TRACKING_LABEL, @@ -62,6 +64,7 @@ export default { title: { label: s__('WikiPage|Title'), placeholder: s__('WikiPage|Page title'), + templatePlaceholder: s__('WikiPage|Template title'), helpText: { existingPage: s__( 'WikiPage|Tip: You can move this page by adding the path to the beginning of the title.', @@ -87,11 +90,14 @@ export default { value: { existingPage: s__('WikiPage|Update %{pageTitle}'), newPage: s__('WikiPage|Create %{pageTitle}'), + existingTemplate: s__('WikiPage|Update template %{pageTitle}'), + newTemplatePage: s__('WikiPage|Create template %{pageTitle}'), }, }, submitButton: { existingPage: s__('WikiPage|Save changes'), newPage: s__('WikiPage|Create page'), + newTemplate: s__('WikiPage|Create template'), }, cancel: s__('WikiPage|Cancel'), }, @@ -105,13 +111,16 @@ export default { GlLink, GlButton, MarkdownEditor, + WikiTemplate, }, mixins: [trackingMixin], - inject: ['formatOptions', 'pageInfo', 'drawioUrl'], + inject: ['formatOptions', 'pageInfo', 'drawioUrl', 'templates'], data() { + const title = window.location.href.includes('random_title=true') ? '' : getTitle(this.pageInfo); return { editingMode: 'source', - title: getTitle(this.pageInfo), + title, + pageTitle: title.replace('templates/', ''), format: getFormat(this.pageInfo), content: getContent(this.pageInfo), commitMessage: getCommitMessage(this.pageInfo), @@ -124,10 +133,17 @@ export default { 'aria-label': this.$options.i18n.content.label, id: 'wiki_content', name: 'wiki[content]', + class: 'note-textarea', }, }; }, computed: { + isTemplate, + titlePlaceholder() { + return this.isTemplate + ? this.$options.i18n.title.templatePlaceholder + : this.$options.i18n.title.placeholder; + }, autocompleteDataSources() { return gl.GfmAutoComplete?.dataSources; }, @@ -147,9 +163,12 @@ export default { ); }, commitMessageI18n() { - return this.pageInfo.persisted - ? this.$options.i18n.commitMessage.value.existingPage - : this.$options.i18n.commitMessage.value.newPage; + if (this.pageInfo.persisted) { + if (this.isTemplate) return this.$options.i18n.commitMessage.value.existingTemplate; + return this.$options.i18n.commitMessage.value.existingPage; + } + if (this.isTemplate) return this.$options.i18n.commitMessage.value.newTemplatePage; + return this.$options.i18n.commitMessage.value.newPage; }, linkExample() { return MARKDOWN_LINK_TEXT[this.format]; @@ -191,6 +210,9 @@ export default { title() { this.updateCommitMessage(); }, + pageTitle() { + this.title = this.isTemplate ? `templates/${this.pageTitle}` : this.pageTitle; + }, }, mounted() { if (!this.commitMessage) this.updateCommitMessage(); @@ -246,7 +268,7 @@ export default { if (!this.title) return; // Replace hyphens with spaces - const newTitle = this.title.replace(/-+/g, ' '); + const newTitle = this.title.replace(/-+/g, ' ').replace('templates/', ''); const newCommitMessage = sprintf(this.commitMessageI18n, { pageTitle: newTitle }, false); this.commitMessage = newCommitMessage; @@ -284,6 +306,10 @@ export default { submitFormWithShortcut() { this.$refs.form.submit(); }, + + setTemplate(template) { + this.$refs.markdownEditor.setTemplate(template); + }, }, }; @@ -309,7 +335,7 @@ export default {
-