From 8b573c94895dc0ac0e1d9d59cf3e8745e8b539ca Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 17 Dec 2020 11:59:07 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-7-stable-ee --- app/views/admin/appearances/_form.html.haml | 6 +- .../_account_and_limit.html.haml | 3 + .../admin/application_settings/_eks.html.haml | 5 + .../application_settings/_ip_limits.html.haml | 26 +++-- .../admin/application_settings/_kroki.html.haml | 25 +++++ .../admin/application_settings/_plantuml.html.haml | 2 +- .../admin/application_settings/_signup.html.haml | 4 +- .../_visibility_and_access.html.haml | 8 ++ .../admin/application_settings/general.html.haml | 16 +-- .../metrics_and_profiling.html.haml | 8 +- app/views/admin/dashboard/index.html.haml | 2 +- app/views/admin/dev_ops_report/show.html.haml | 2 +- app/views/admin/groups/_form.html.haml | 1 + app/views/admin/hooks/_form.html.haml | 8 +- app/views/admin/labels/index.html.haml | 2 +- app/views/admin/runners/_sort_dropdown.html.haml | 2 +- app/views/admin/runners/show.html.haml | 17 ++-- app/views/admin/users/_approve_user.html.haml | 2 +- app/views/admin/users/_modals.html.haml | 9 +- .../admin/users/_reject_pending_user.html.haml | 7 ++ app/views/admin/users/_user.html.haml | 15 ++- .../users/_user_deactivation_effects.html.haml | 18 ---- .../admin/users/_user_reject_effects.html.haml | 10 ++ app/views/admin/users/index.html.haml | 8 +- app/views/admin/users/show.html.haml | 104 ++++++++++--------- app/views/clusters/clusters/gcp/_form.html.haml | 6 +- app/views/clusters/clusters/show.html.haml | 1 + app/views/dashboard/todos/index.html.haml | 7 +- app/views/devise/confirmations/almost_there.haml | 6 +- app/views/devise/shared/_signup_box.html.haml | 9 +- .../shared/_signup_omniauth_provider_list.haml | 9 ++ .../devise/shared/_signup_omniauth_providers.haml | 12 +-- .../shared/_signup_omniauth_providers_top.haml | 3 + app/views/devise/unlocks/new.html.haml | 2 +- app/views/doorkeeper/authorizations/new.html.haml | 2 +- app/views/explore/projects/_filter.html.haml | 2 +- app/views/groups/_create_chat_team.html.haml | 6 +- app/views/groups/_home_panel.html.haml | 6 +- ...ort_group_from_another_instance_panel.html.haml | 25 +++++ .../groups/_import_group_from_file_panel.html.haml | 50 ++++++++++ app/views/groups/_import_group_pane.html.haml | 52 ---------- app/views/groups/_new_group_fields.html.haml | 16 +-- app/views/groups/_subgroups_and_projects.html.haml | 2 +- app/views/groups/dependency_proxies/_url.html.haml | 2 +- app/views/groups/dependency_proxies/show.html.haml | 2 +- app/views/groups/edit.html.haml | 9 +- app/views/groups/group_members/index.html.haml | 53 +++++----- app/views/groups/new.html.haml | 9 +- .../groups/registry/repositories/index.html.haml | 2 + app/views/groups/show.html.haml | 3 +- app/views/import/_githubish_status.html.haml | 1 + app/views/import/bulk_imports/status.html.haml | 13 ++- app/views/import/github/status.html.haml | 4 +- app/views/import/google_code/new.html.haml | 63 ------------ .../import/google_code/new_user_map.html.haml | 37 ------- app/views/import/google_code/status.html.haml | 78 --------------- app/views/import/manifest/_form.html.haml | 4 +- .../jira_connect/subscriptions/index.html.haml | 3 +- app/views/layouts/_google_analytics.html.haml | 2 +- .../layouts/_google_tag_manager_head.html.haml | 2 +- app/views/layouts/_head.html.haml | 2 +- app/views/layouts/_img_loader.html.haml | 2 +- app/views/layouts/_init_auto_complete.html.haml | 2 +- .../layouts/_init_client_detection_flags.html.haml | 2 +- app/views/layouts/_loading_hints.html.haml | 1 - app/views/layouts/_matomo.html.haml | 15 +++ app/views/layouts/_page.html.haml | 1 + app/views/layouts/_piwik.html.haml | 15 --- app/views/layouts/_snowplow.html.haml | 2 +- app/views/layouts/_startup_css_activation.haml | 2 +- app/views/layouts/_startup_js.html.haml | 2 +- app/views/layouts/errors.html.haml | 2 +- app/views/layouts/group.html.haml | 2 +- .../header/_current_user_dropdown.html.haml | 2 +- app/views/layouts/header/_default.html.haml | 3 +- app/views/layouts/jira_connect.html.haml | 4 +- app/views/layouts/nav/_breadcrumbs.html.haml | 9 +- .../layouts/nav/groups_dropdown/_show.html.haml | 4 +- .../layouts/nav/projects_dropdown/_show.html.haml | 6 +- .../layouts/nav/sidebar/_analytics_links.html.haml | 2 +- app/views/layouts/nav/sidebar/_group.html.haml | 9 +- app/views/layouts/nav/sidebar/_project.html.haml | 7 +- app/views/layouts/project.html.haml | 2 +- app/views/layouts/snippets.html.haml | 2 +- app/views/notify/issue_cloned_email.html.haml | 7 ++ app/views/notify/issue_cloned_email.text.erb | 8 ++ app/views/notify/new_release_email.html.haml | 2 +- .../notify/user_admin_rejection_email.html.haml | 5 + .../notify/user_admin_rejection_email.text.erb | 6 ++ app/views/profiles/accounts/show.html.haml | 13 +++ app/views/profiles/keys/_form.html.haml | 2 +- .../notifications/_group_settings.html.haml | 2 +- app/views/profiles/notifications/show.html.haml | 12 ++- .../personal_access_tokens/index.html.haml | 33 +++--- app/views/profiles/preferences/show.html.haml | 13 ++- .../profiles/two_factor_auths/_codes.html.haml | 27 +++-- .../profiles/two_factor_auths/codes.html.haml | 4 +- .../profiles/two_factor_auths/create.html.haml | 8 +- app/views/projects/_archived_notice.html.haml | 2 +- app/views/projects/_commit_button.html.haml | 4 +- app/views/projects/_customize_workflow.html.haml | 2 +- app/views/projects/_files.html.haml | 7 +- app/views/projects/_fork_suggestion.html.haml | 4 +- app/views/projects/_home_panel.html.haml | 4 +- app/views/projects/_import_project_pane.html.haml | 56 ++++++----- app/views/projects/_invite_members.html.haml | 8 ++ app/views/projects/_project_templates.html.haml | 10 +- .../projects/_service_desk_settings.html.haml | 1 + app/views/projects/blob/_content.html.haml | 4 - app/views/projects/blob/_viewer_switcher.html.haml | 2 +- app/views/projects/blob/edit.html.haml | 5 +- app/views/projects/blob/new.html.haml | 5 +- .../_metrics_dashboard_yml_loading.html.haml | 2 +- app/views/projects/buttons/_clone.html.haml | 6 +- app/views/projects/ci/builds/_build.html.haml | 2 +- .../projects/ci/pipeline_editor/show.html.haml | 2 + app/views/projects/commit/_commit_box.html.haml | 2 +- .../commit/_verified_signature_badge.html.haml | 2 +- .../x509/_unverified_signature_badge.html.haml | 2 +- app/views/projects/commits/_commits.html.haml | 8 +- app/views/projects/commits/show.html.haml | 2 +- app/views/projects/compare/_form.html.haml | 2 +- app/views/projects/cycle_analytics/show.html.haml | 9 +- app/views/projects/deployments/_actions.haml | 2 +- app/views/projects/deployments/_commit.html.haml | 2 +- app/views/projects/diffs/_file_header.html.haml | 4 +- .../projects/diffs/_replaced_image_diff.html.haml | 10 +- app/views/projects/diffs/_stats.html.haml | 2 +- app/views/projects/edit.html.haml | 2 +- app/views/projects/empty.html.haml | 5 +- app/views/projects/forks/index.html.haml | 2 +- app/views/projects/graphs/charts.html.haml | 2 +- app/views/projects/graphs/show.html.haml | 2 +- app/views/projects/issuable/_show.html.haml | 1 - app/views/projects/issues/_discussion.html.haml | 5 - app/views/projects/issues/_issue.html.haml | 111 +++++++++++---------- app/views/projects/issues/_new_branch.html.haml | 4 +- app/views/projects/jobs/_table.html.haml | 16 ++- app/views/projects/jobs/index.html.haml | 4 +- .../_close_reopen_draft_report_toggle.html.haml | 37 +++++++ .../merge_requests/_how_to_merge.html.haml | 56 ----------- .../merge_requests/_merge_request.html.haml | 4 +- .../projects/merge_requests/_mr_title.html.haml | 23 +++-- .../projects/merge_requests/_widget.html.haml | 2 +- .../conflicts/_commit_stats.html.haml | 15 +-- .../conflicts/_file_actions.html.haml | 16 +-- .../conflicts/_submit_form.html.haml | 2 +- .../merge_requests/conflicts/show.html.haml | 7 +- app/views/projects/merge_requests/show.html.haml | 5 +- .../merge_requests/widget/open/_error.html.haml | 2 +- app/views/projects/network/show.html.haml | 2 +- app/views/projects/new.html.haml | 5 +- app/views/projects/no_repo.html.haml | 4 +- app/views/projects/pipelines/_with_tabs.html.haml | 2 +- app/views/projects/pipelines/charts.html.haml | 13 ++- app/views/projects/pipelines/index.html.haml | 2 +- app/views/projects/pipelines/new.html.haml | 4 +- app/views/projects/pipelines/show.html.haml | 2 +- .../projects/registry/repositories/index.html.haml | 3 +- app/views/projects/registry/settings/_index.haml | 3 +- .../projects/runners/_shared_runners.html.haml | 28 ++++-- .../_detailed_help.html.haml | 2 +- .../services/slack_slash_commands/_help.html.haml | 2 +- app/views/projects/settings/ci_cd/show.html.haml | 4 +- .../projects/settings/operations/show.html.haml | 2 +- app/views/projects/show.html.haml | 2 +- app/views/projects/tags/_tag.html.haml | 3 - app/views/projects/tags/index.html.haml | 2 +- app/views/projects/tags/new.html.haml | 2 +- app/views/projects/terraform/index.html.haml | 4 +- .../tree/_truncated_notice_tree_row.html.haml | 2 +- app/views/projects/wikis/git_access.html.haml | 37 ------- .../registrations/experience_levels/show.html.haml | 8 +- app/views/registrations/welcome/show.html.haml | 14 ++- app/views/search/_filter.html.haml | 18 +--- app/views/search/_form.html.haml | 8 +- app/views/search/_results.html.haml | 31 ++---- app/views/search/_results_status.html.haml | 25 +++++ app/views/search/_sort_dropdown.html.haml | 4 +- app/views/shared/_alert_info.html.haml | 6 ++ app/views/shared/_choose_avatar_button.html.haml | 2 +- app/views/shared/_clone_panel.html.haml | 16 ++- app/views/shared/_file_picker_button.html.haml | 4 +- app/views/shared/_group_form.html.haml | 8 -- app/views/shared/_group_form_description.html.haml | 5 + app/views/shared/_issues.html.haml | 5 +- app/views/shared/_md_preview.html.haml | 2 +- app/views/shared/_merge_requests.html.haml | 5 +- .../shared/_milestones_sort_dropdown.html.haml | 2 +- app/views/shared/_no_password.html.haml | 2 +- app/views/shared/_no_ssh.html.haml | 2 +- app/views/shared/_service_settings.html.haml | 4 +- app/views/shared/_web_ide_button.html.haml | 4 +- app/views/shared/access_tokens/_table.html.haml | 2 +- app/views/shared/boards/_show.html.haml | 24 ++--- app/views/shared/deploy_tokens/_table.html.haml | 2 +- app/views/shared/groups/_dropdown.html.haml | 13 +-- .../shared/groups/_visibility_level.html.haml | 3 + app/views/shared/icons/_icon_mattermost.svg | 2 +- app/views/shared/integrations/_index.html.haml | 7 +- .../shared/issuable/_bulk_update_sidebar.html.haml | 2 +- .../shared/issuable/_close_reopen_button.html.haml | 26 ----- .../_close_reopen_draft_report_toggle.html.haml | 37 ------- .../issuable/_close_reopen_report_toggle.html.haml | 47 --------- app/views/shared/issuable/_form.html.haml | 5 +- app/views/shared/issuable/_search_bar.html.haml | 18 +++- app/views/shared/issuable/_sidebar.html.haml | 4 +- .../shared/issuable/form/_branch_chooser.html.haml | 2 +- .../shared/issuable/form/_merge_params.html.haml | 2 +- app/views/shared/issuable/form/_metadata.html.haml | 3 +- .../form/_metadata_issuable_assignee.html.haml | 2 +- .../form/_metadata_issuable_reviewer.html.haml | 8 +- .../shared/issuable/form/_type_selector.html.haml | 2 +- .../shared/issue_type/_details_header.html.haml | 40 +------- app/views/shared/labels/_sort_dropdown.html.haml | 2 +- app/views/shared/members/_group.html.haml | 2 +- app/views/shared/members/_member.html.haml | 2 +- app/views/shared/milestones/_header.html.haml | 2 +- app/views/shared/milestones/_milestone.html.haml | 2 +- app/views/shared/notes/_comment_button.html.haml | 6 +- app/views/shared/notes/_edit_form.html.haml | 4 +- app/views/shared/notes/_form.html.haml | 2 - app/views/shared/notifications/_button.html.haml | 6 +- app/views/shared/projects/_sort_dropdown.html.haml | 2 +- .../_update_protected_branch.html.haml | 4 +- app/views/shared/web_hooks/_form.html.haml | 58 +++++------ app/views/shared/web_hooks/_test_button.html.haml | 2 +- app/views/shared/wikis/_form.html.haml | 2 +- app/views/shared/wikis/_sidebar.html.haml | 14 +-- app/views/shared/wikis/git_access.html.haml | 37 +++++++ app/views/shared/wikis/git_error.html.haml | 14 +++ app/views/users/_overview.html.haml | 2 +- app/views/users/show.html.haml | 8 +- 233 files changed, 1065 insertions(+), 1213 deletions(-) create mode 100644 app/views/admin/application_settings/_kroki.html.haml create mode 100644 app/views/admin/users/_reject_pending_user.html.haml delete mode 100644 app/views/admin/users/_user_deactivation_effects.html.haml create mode 100644 app/views/admin/users/_user_reject_effects.html.haml create mode 100644 app/views/devise/shared/_signup_omniauth_provider_list.haml create mode 100644 app/views/devise/shared/_signup_omniauth_providers_top.haml create mode 100644 app/views/groups/_import_group_from_another_instance_panel.html.haml create mode 100644 app/views/groups/_import_group_from_file_panel.html.haml delete mode 100644 app/views/groups/_import_group_pane.html.haml delete mode 100644 app/views/import/google_code/new.html.haml delete mode 100644 app/views/import/google_code/new_user_map.html.haml delete mode 100644 app/views/import/google_code/status.html.haml create mode 100644 app/views/layouts/_matomo.html.haml delete mode 100644 app/views/layouts/_piwik.html.haml create mode 100644 app/views/notify/issue_cloned_email.html.haml create mode 100644 app/views/notify/issue_cloned_email.text.erb create mode 100644 app/views/notify/user_admin_rejection_email.html.haml create mode 100644 app/views/notify/user_admin_rejection_email.text.erb create mode 100644 app/views/projects/_invite_members.html.haml create mode 100644 app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml delete mode 100644 app/views/projects/merge_requests/_how_to_merge.html.haml delete mode 100644 app/views/projects/wikis/git_access.html.haml create mode 100644 app/views/search/_results_status.html.haml create mode 100644 app/views/shared/_alert_info.html.haml create mode 100644 app/views/shared/_group_form_description.html.haml create mode 100644 app/views/shared/groups/_visibility_level.html.haml delete mode 100644 app/views/shared/issuable/_close_reopen_button.html.haml delete mode 100644 app/views/shared/issuable/_close_reopen_draft_report_toggle.html.haml delete mode 100644 app/views/shared/issuable/_close_reopen_report_toggle.html.haml create mode 100644 app/views/shared/wikis/git_access.html.haml create mode 100644 app/views/shared/wikis/git_error.html.haml (limited to 'app/views') diff --git a/app/views/admin/appearances/_form.html.haml b/app/views/admin/appearances/_form.html.haml index ad3795445d1..67ac9d1c7b8 100644 --- a/app/views/admin/appearances/_form.html.haml +++ b/app/views/admin/appearances/_form.html.haml @@ -19,7 +19,7 @@ = link_to 'Remove header logo', header_logos_admin_appearances_path, data: { confirm: "Header logo will be removed. Are you sure?"}, method: :delete, class: "btn gl-button btn-danger btn-danger-secondary btn-sm" %hr = f.hidden_field :header_logo_cache - = f.file_field :header_logo, class: "" + = f.file_field :header_logo, class: "", accept: 'image/*' .hint Maximum file size is 1MB. Pages are optimized for a 28px tall header logo %hr @@ -38,7 +38,7 @@ = link_to 'Remove favicon', favicon_admin_appearances_path, data: { confirm: "Favicon will be removed. Are you sure?"}, method: :delete, class: "btn gl-button btn-danger btn-danger-secondary btn-sm" %hr = f.hidden_field :favicon_cache - = f.file_field :favicon, class: '' + = f.file_field :favicon, class: '', accept: 'image/*' .hint Maximum file size is 1MB. Image size must be 32x32px. Allowed image formats are #{favicon_extension_whitelist}. %br @@ -70,7 +70,7 @@ = link_to 'Remove logo', logo_admin_appearances_path, data: { confirm: "Logo will be removed. Are you sure?"}, method: :delete, class: "btn gl-button btn-danger btn-danger-secondary btn-sm remove-logo" %hr = f.hidden_field :logo_cache - = f.file_field :logo, class: "" + = f.file_field :logo, class: "", accept: 'image/*' .hint Maximum file size is 1MB. Pages are optimized for a 640x360 px logo. diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml index f46eb84ce8e..46155f3f670 100644 --- a/app/views/admin/application_settings/_account_and_limit.html.haml +++ b/app/views/admin/application_settings/_account_and_limit.html.haml @@ -51,6 +51,9 @@ = _('Specify an e-mail address regex pattern to identify default internal users.') = link_to _('More information'), help_page_path('user/permissions', anchor: 'setting-new-users-to-external'), target: '_blank' + .form-group + = f.label :personal_access_token_prefix, _('Personal Access Token prefix'), class: 'label-light' + = f.text_field :personal_access_token_prefix, placeholder: _('Max 20 characters'), class: 'form-control' .form-group = f.label :user_show_add_ssh_key_message, _('Prompt users to upload SSH keys'), class: 'label-bold' .form-check diff --git a/app/views/admin/application_settings/_eks.html.haml b/app/views/admin/application_settings/_eks.html.haml index 5c0e544eaad..589d754be04 100644 --- a/app/views/admin/application_settings/_eks.html.haml +++ b/app/views/admin/application_settings/_eks.html.haml @@ -24,8 +24,13 @@ .form-group = f.label :eks_access_key_id, 'Access key ID', class: 'label-bold' = f.text_field :eks_access_key_id, class: 'form-control' + .form-text.text-muted + = _('AWS Access Key. Only required if not using role instance credentials') + .form-group = f.label :eks_secret_access_key, 'Secret access key', class: 'label-bold' = f.password_field :eks_secret_access_key, autocomplete: 'off', class: 'form-control' + .form-text.text-muted + = _('AWS Secret Access Key. Only required if not using role instance credentials') = f.submit 'Save changes', class: "gl-button btn btn-success" diff --git a/app/views/admin/application_settings/_ip_limits.html.haml b/app/views/admin/application_settings/_ip_limits.html.haml index c1565cf42e1..b06070d15d4 100644 --- a/app/views/admin/application_settings/_ip_limits.html.haml +++ b/app/views/admin/application_settings/_ip_limits.html.haml @@ -2,44 +2,52 @@ = form_errors(@application_setting) %fieldset + %h5 + = _('Unauthenticated request rate limit') .form-group .form-check = f.check_box :throttle_unauthenticated_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_unauthenticated_checkbox' } - = f.label :throttle_unauthenticated_enabled, class: 'form-check-label' do + = f.label :throttle_unauthenticated_enabled, class: 'form-check-label label-bold' do Enable unauthenticated request rate limit %span.form-text.text-muted Helps reduce request volume (e.g. from crawlers or abusive bots) .form-group - = f.label :throttle_unauthenticated_requests_per_period, 'Max requests per period per IP', class: 'label-bold' + = f.label :throttle_unauthenticated_requests_per_period, 'Max unauthenticated requests per period per IP', class: 'label-bold' = f.number_field :throttle_unauthenticated_requests_per_period, class: 'form-control' .form-group - = f.label :throttle_unauthenticated_period_in_seconds, 'Rate limit period in seconds', class: 'label-bold' + = f.label :throttle_unauthenticated_period_in_seconds, 'Unauthenticated rate limit period in seconds', class: 'label-bold' = f.number_field :throttle_unauthenticated_period_in_seconds, class: 'form-control' + %hr + %h5 + = _('Authenticated API request rate limit') .form-group .form-check = f.check_box :throttle_authenticated_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_authenticated_api_checkbox' } - = f.label :throttle_authenticated_api_enabled, class: 'form-check-label' do + = f.label :throttle_authenticated_api_enabled, class: 'form-check-label label-bold' do Enable authenticated API request rate limit %span.form-text.text-muted Helps reduce request volume (e.g. from crawlers or abusive bots) .form-group - = f.label :throttle_authenticated_api_requests_per_period, 'Max requests per period per user', class: 'label-bold' + = f.label :throttle_authenticated_api_requests_per_period, 'Max authenticated API requests per period per user', class: 'label-bold' = f.number_field :throttle_authenticated_api_requests_per_period, class: 'form-control' .form-group - = f.label :throttle_authenticated_api_period_in_seconds, 'Rate limit period in seconds', class: 'label-bold' + = f.label :throttle_authenticated_api_period_in_seconds, 'Authenticated API rate limit period in seconds', class: 'label-bold' = f.number_field :throttle_authenticated_api_period_in_seconds, class: 'form-control' + %hr + %h5 + = _('Authenticated web request rate limit') .form-group .form-check = f.check_box :throttle_authenticated_web_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_authenticated_web_checkbox' } - = f.label :throttle_authenticated_web_enabled, class: 'form-check-label' do + = f.label :throttle_authenticated_web_enabled, class: 'form-check-label label-bold' do Enable authenticated web request rate limit %span.form-text.text-muted Helps reduce request volume (e.g. from crawlers or abusive bots) .form-group - = f.label :throttle_authenticated_web_requests_per_period, 'Max requests per period per user', class: 'label-bold' + = f.label :throttle_authenticated_web_requests_per_period, 'Max authenticated web requests per period per user', class: 'label-bold' = f.number_field :throttle_authenticated_web_requests_per_period, class: 'form-control' .form-group - = f.label :throttle_authenticated_web_period_in_seconds, 'Rate limit period in seconds', class: 'label-bold' + = f.label :throttle_authenticated_web_period_in_seconds, 'Authenticated web rate limit period in seconds', class: 'label-bold' = f.number_field :throttle_authenticated_web_period_in_seconds, class: 'form-control' = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_kroki.html.haml b/app/views/admin/application_settings/_kroki.html.haml new file mode 100644 index 00000000000..1547b28c651 --- /dev/null +++ b/app/views/admin/application_settings/_kroki.html.haml @@ -0,0 +1,25 @@ +- expanded = integration_expanded?('kroki_') +%section.settings.as-kroki.no-animate#js-kroki-settings{ class: ('expanded' if expanded) } + .settings-header + %h4 + = _('Kroki') + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } + = expanded ? _('Collapse') : _('Expand') + %p + = _('Allow rendering of diagrams in AsciiDoc and Markdown documents using %{link}.').html_safe % { link: link_to('Kroki', 'https://kroki.io', target: '_blank') } + .settings-content + = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-kroki-settings'), html: { class: 'fieldset-form' } do |f| + = form_errors(@application_setting) if expanded + + %fieldset + .form-group + .form-check + = f.check_box :kroki_enabled, class: 'form-check-input' + = f.label :kroki_enabled, _('Enable Kroki'), class: 'form-check-label' + .form-group + = f.label :kroki_url, 'Kroki URL', class: 'label-bold' + = f.text_field :kroki_url, class: 'form-control', placeholder: 'http://your-kroki-instance:8000' + .form-text.text-muted + = (_('When Kroki is enabled, GitLab sends diagrams to an instance of Kroki to display them as images. You can use the free public cloud instance %{kroki_public_url} or you can %{install_link} on your own infrastructure. Once you\'ve installed Kroki, make sure to update the server URL to point to your instance.') % { kroki_public_url: 'https://kroki.io', install_link: link_to('install Kroki', 'https://docs.kroki.io/kroki/setup/install/', target: '_blank') }).html_safe + + = f.submit _('Save changes'), class: "btn gl-button btn-success" diff --git a/app/views/admin/application_settings/_plantuml.html.haml b/app/views/admin/application_settings/_plantuml.html.haml index 30acb773424..77a310c73a8 100644 --- a/app/views/admin/application_settings/_plantuml.html.haml +++ b/app/views/admin/application_settings/_plantuml.html.haml @@ -18,7 +18,7 @@ = f.label :plantuml_enabled, _('Enable PlantUML'), class: 'form-check-label' .form-group = f.label :plantuml_url, 'PlantUML URL', class: 'label-bold' - = f.text_field :plantuml_url, class: 'form-control', placeholder: 'http://gitlab.your-plantuml-instance.com:8080' + = f.text_field :plantuml_url, class: 'form-control', placeholder: 'http://your-plantuml-instance:8080' .form-text.text-muted Allow rendering of = link_to "PlantUML", "http://plantuml.com" diff --git a/app/views/admin/application_settings/_signup.html.haml b/app/views/admin/application_settings/_signup.html.haml index c3deb8af99e..2f2d42e297e 100644 --- a/app/views/admin/application_settings/_signup.html.haml +++ b/app/views/admin/application_settings/_signup.html.haml @@ -11,7 +11,7 @@ = _("When enabled, any user visiting %{host} will be able to create an account.") % { host: "#{new_user_session_url(host: Gitlab.config.gitlab.host)}" } .form-group .form-check - = f.check_box :require_admin_approval_after_user_signup, class: 'form-check-input' + = f.check_box :require_admin_approval_after_user_signup, class: 'form-check-input', data: { qa_selector: 'require_admin_approval_after_user_signup_checkbox' } = f.label :require_admin_approval_after_user_signup, class: 'form-check-label' do = _('Require admin approval for new sign-ups') .form-text.text-muted @@ -77,4 +77,4 @@ = f.label :after_sign_up_text, class: 'label-bold' = f.text_area :after_sign_up_text, class: 'form-control', rows: 4 .form-text.text-muted Markdown enabled - = f.submit 'Save changes', class: "gl-button btn btn-success" + = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_visibility_and_access.html.haml b/app/views/admin/application_settings/_visibility_and_access.html.haml index 46d8a8ac9c7..709ce497132 100644 --- a/app/views/admin/application_settings/_visibility_and_access.html.haml +++ b/app/views/admin/application_settings/_visibility_and_access.html.haml @@ -66,4 +66,12 @@ .form-group = f.label field_name, "#{type.upcase} SSH keys", class: 'label-bold' = f.select field_name, key_restriction_options_for_select(type), {}, class: 'form-control' + + .form-group + %label.label-bold= s_('AdminSettings|Feed token') + .form-check + = f.check_box :disable_feed_token, class: 'form-check-input' + = f.label :disable_feed_token, class: 'form-check-label' do + = s_('AdminSettings|Disable feed token') + = f.submit _('Save changes'), class: "gl-button btn btn-success" diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index 5c3f68843a2..8f15dcac40a 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -35,7 +35,7 @@ .settings-content = render 'diff_limits' -%section.settings.as-signup.no-animate#js-signup-settings{ class: ('expanded' if expanded_by_default?) } +%section.settings.as-signup.no-animate#js-signup-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'sign_up_restrictions_settings_content' } } .settings-header %h4 = _('Sign-up restrictions') @@ -103,20 +103,10 @@ = s_('IDE|Allow live previews of JavaScript projects in the Web IDE using CodeSandbox Live Preview.') = f.submit _('Save changes'), class: "gl-button btn btn-success" -- if Feature.enabled?(:maintenance_mode) - %section.settings.no-animate#js-maintenance-mode-toggle{ class: ('expanded' if expanded_by_default?) } - .settings-header - %h4 - = _('Maintenance mode') - %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } - = expanded_by_default? ? _('Collapse') : _('Expand') - %p - = _('Prevent users from performing write operations on GitLab while performing maintenance.') - .settings-content - #js-maintenance-mode-settings - += render_if_exists 'admin/application_settings/maintenance_mode_settings_form' = render_if_exists 'admin/application_settings/elasticsearch_form' = render 'admin/application_settings/gitpod' += render 'admin/application_settings/kroki' = render 'admin/application_settings/plantuml' = render 'admin/application_settings/sourcegraph' = render_if_exists 'admin/application_settings/slack' diff --git a/app/views/admin/application_settings/metrics_and_profiling.html.haml b/app/views/admin/application_settings/metrics_and_profiling.html.haml index 9f1b7195ab7..4959e596148 100644 --- a/app/views/admin/application_settings/metrics_and_profiling.html.haml +++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml @@ -6,7 +6,7 @@ .settings-header %h4 = _('Metrics - Prometheus') - %button.btn.btn-default.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p = _('Enable and configure Prometheus metrics.') @@ -17,7 +17,7 @@ .settings-header %h4 = _('Metrics - Grafana') - %button.btn.btn-default.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p = _('Enable and configure Grafana.') @@ -28,7 +28,7 @@ .settings-header %h4 = _('Profiling - Performance bar') - %button.btn.btn-default.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p = _('Enable access to the Performance Bar for a given group.') @@ -42,7 +42,7 @@ .settings-header#usage-statistics %h4 = _('Usage statistics') - %button.btn.btn-default.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p = _('Enable or disable version check and usage ping.') diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 220a211cca6..8cc04392752 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -9,7 +9,7 @@ dismissible: true.to_s } } = notice[:message].html_safe -- if @license.present? && show_license_breakdown? +- if @license.present? .license-panel.gl-mt-5 = render_if_exists 'admin/licenses/summary' = render_if_exists 'admin/licenses/breakdown' diff --git a/app/views/admin/dev_ops_report/show.html.haml b/app/views/admin/dev_ops_report/show.html.haml index dc3bda3a994..75398f3aa21 100644 --- a/app/views/admin/dev_ops_report/show.html.haml +++ b/app/views/admin/dev_ops_report/show.html.haml @@ -3,7 +3,7 @@ .container .gl-mt-3 - - if Gitlab.ee? && Feature.enabled?(:devops_adoption_feature) && License.feature_available?(:devops_adoption) + - if Gitlab.ee? && Feature.enabled?(:devops_adoption_feature, default_enabled: true) && License.feature_available?(:devops_adoption) = render_if_exists 'admin/dev_ops_report/devops_tabs' - else = render 'report' diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml index 6174da14ac0..e4517dca6d0 100644 --- a/app/views/admin/groups/_form.html.haml +++ b/app/views/admin/groups/_form.html.haml @@ -1,6 +1,7 @@ = form_for [:admin, @group] do |f| = form_errors(@group) = render 'shared/group_form', f: f + = render 'shared/group_form_description', f: f = render_if_exists 'shared/old_repository_size_limit_setting', form: f, type: :group = render_if_exists 'admin/namespace_plan', f: f diff --git a/app/views/admin/hooks/_form.html.haml b/app/views/admin/hooks/_form.html.haml index 17bb054b869..5bc5404fada 100644 --- a/app/views/admin/hooks/_form.html.haml +++ b/app/views/admin/hooks/_form.html.haml @@ -18,28 +18,28 @@ .gl-mt-3 = form.check_box :repository_update_events, class: 'float-left' - .prepend-left-20 + .gl-ml-6 = form.label :repository_update_events, class: 'list-label' do %strong Repository update events %p.light This URL will be triggered when repository is updated %li = form.check_box :push_events, class: 'float-left' - .prepend-left-20 + .gl-ml-6 = form.label :push_events, class: 'list-label' do %strong Push events %p.light This URL will be triggered for each branch updated to the repository %li = form.check_box :tag_push_events, class: 'float-left' - .prepend-left-20 + .gl-ml-6 = form.label :tag_push_events, class: 'list-label' do %strong Tag push events %p.light This URL will be triggered when a new tag is pushed to the repository %li = form.check_box :merge_requests_events, class: 'float-left' - .prepend-left-20 + .gl-ml-6 = form.label :merge_requests_events, class: 'list-label' do %strong Merge request events %p.light diff --git a/app/views/admin/labels/index.html.haml b/app/views/admin/labels/index.html.haml index 76d37626fff..f204e620e9d 100644 --- a/app/views/admin/labels/index.html.haml +++ b/app/views/admin/labels/index.html.haml @@ -1,7 +1,7 @@ - page_title _("Labels") %div - = link_to new_admin_label_path, class: "float-right btn gl-button btn-nr btn-success" do + = link_to new_admin_label_path, class: "float-right btn gl-button btn-success" do = _('New label') %h3.page-title = _('Labels') diff --git a/app/views/admin/runners/_sort_dropdown.html.haml b/app/views/admin/runners/_sort_dropdown.html.haml index 3b3de042511..c6627ae0f27 100644 --- a/app/views/admin/runners/_sort_dropdown.html.haml +++ b/app/views/admin/runners/_sort_dropdown.html.haml @@ -3,7 +3,7 @@ .dropdown.inline.gl-ml-3 %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' } } = sorted_by - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort %li = sortable_item(sort_title_created_date, page_filter_path(sort: sort_value_created_date), sorted_by) diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml index 2c4befb1be2..06925964dc5 100644 --- a/app/views/admin/runners/show.html.haml +++ b/app/views/admin/runners/show.html.haml @@ -9,7 +9,7 @@ %span.runner-state.runner-state-specific Specific -- page_title _("Runners") +- page_title @runner.short_sha - add_to_breadcrumbs _("Runners"), admin_runners_path - breadcrumb_title "##{@runner.id}" @@ -39,17 +39,18 @@ %thead %tr %th Assigned projects - %th - @runner.runner_projects.each do |runner_project| - project = runner_project.project - if project - %tr.alert-info + %tr %td - %strong - = project.full_name - %td - .float-right - = link_to 'Disable', admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'gl-button btn btn-danger btn-sm' + .gl-alert.gl-alert-danger + = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + .gl-alert-body + %strong + = project.full_name + .gl-alert-actions + = link_to s_('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-info btn-md gl-button' %table.table.unassigned-projects %thead diff --git a/app/views/admin/users/_approve_user.html.haml b/app/views/admin/users/_approve_user.html.haml index b4d960d909c..f61c9fa4b80 100644 --- a/app/views/admin/users/_approve_user.html.haml +++ b/app/views/admin/users/_approve_user.html.haml @@ -4,4 +4,4 @@ .card-body = render partial: 'admin/users/user_approve_effects' %br - = link_to s_('AdminUsers|Approve user'), approve_admin_user_path(user), method: :put, class: "btn gl-button btn-info", data: { confirm: s_('AdminUsers|Are you sure?') } + = link_to s_('AdminUsers|Approve user'), approve_admin_user_path(user), method: :put, class: "btn gl-button btn-info", data: { confirm: s_('AdminUsers|Are you sure?'), qa_selector: 'approve_user_button' } diff --git a/app/views/admin/users/_modals.html.haml b/app/views/admin/users/_modals.html.haml index e56bbd06575..f6e7cefafe7 100644 --- a/app/views/admin/users/_modals.html.haml +++ b/app/views/admin/users/_modals.html.haml @@ -1,10 +1,5 @@ -#user-modal -#modal-texts.hidden{ "hidden": true, "aria-hidden": true } - %div{ data: { modal: "deactivate", - title: s_("AdminUsers|Deactivate User %{username}?"), - action: s_("AdminUsers|Deactivate") } } - = render partial: 'admin/users/user_deactivation_effects' - +#js-delete-user-modal +#js-modal-texts.hidden{ "hidden": true, "aria-hidden": true } %div{ data: { modal: "delete", title: s_("AdminUsers|Delete User %{username}?"), action: s_('AdminUsers|Delete user'), diff --git a/app/views/admin/users/_reject_pending_user.html.haml b/app/views/admin/users/_reject_pending_user.html.haml new file mode 100644 index 00000000000..17108427330 --- /dev/null +++ b/app/views/admin/users/_reject_pending_user.html.haml @@ -0,0 +1,7 @@ +.card.border-danger + .card-header.bg-danger.gl-text-white + = s_('AdminUsers|This user has requested access') + .card-body + = render partial: 'admin/users/user_reject_effects' + %br + = link_to s_('AdminUsers|Reject request'), reject_admin_user_path(user), method: :delete, class: "btn gl-button btn-danger", data: { confirm: s_('AdminUsers|Are you sure?') } diff --git a/app/views/admin/users/_user.html.haml b/app/views/admin/users/_user.html.haml index 679c4805280..31fd3aea94d 100644 --- a/app/views/admin/users/_user.html.haml +++ b/app/views/admin/users/_user.html.haml @@ -37,26 +37,25 @@ - elsif user.blocked? - if user.blocked_pending_approval? = link_to s_('AdminUsers|Approve'), approve_admin_user_path(user), method: :put - %button.btn.btn-default-tertiary.js-confirm-modal-button{ data: user_block_data(user, user_block_effects) } - = s_('AdminUsers|Block') + = link_to s_('AdminUsers|Reject'), reject_admin_user_path(user), method: :delete - else - = link_to _('Unblock'), unblock_admin_user_path(user), method: :put + %button.btn.btn-default-tertiary.js-confirm-modal-button{ data: user_unblock_data(user) } + = s_('AdminUsers|Unblock') - else %button.btn.btn-default-tertiary.js-confirm-modal-button{ data: user_block_data(user, user_block_effects) } = s_('AdminUsers|Block') - if user.can_be_deactivated? %li - %button.btn.btn-default-tertiary{ data: { 'gl-modal-action': 'deactivate', - url: deactivate_admin_user_path(user), - username: sanitize_name(user.name) } } + %button.btn.btn-default-tertiary.js-confirm-modal-button{ data: user_deactivation_data(user, user_deactivation_effects) } = s_('AdminUsers|Deactivate') - elsif user.deactivated? %li - = link_to _('Activate'), activate_admin_user_path(user), method: :put + %button.btn.btn-default-tertiary.js-confirm-modal-button{ data: user_activation_data(user) } + = s_('AdminUsers|Activate') - if user.access_locked? %li = link_to _('Unlock'), unlock_admin_user_path(user), method: :put, data: { confirm: _('Are you sure?') } - - if can?(current_user, :destroy_user, user) + - if can?(current_user, :destroy_user, user) && !user.blocked_pending_approval? %li.divider - if user.can_be_removed? %li diff --git a/app/views/admin/users/_user_deactivation_effects.html.haml b/app/views/admin/users/_user_deactivation_effects.html.haml deleted file mode 100644 index dc3896e18c0..00000000000 --- a/app/views/admin/users/_user_deactivation_effects.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -%p - = s_('AdminUsers|Deactivating a user has the following effects:') -%ul - %li - = s_('AdminUsers|The user will be logged out') - %li - = s_('AdminUsers|The user will not be able to access git repositories') - %li - = s_('AdminUsers|The user will not be able to access the API') - %li - = s_('AdminUsers|The user will not receive any notifications') - %li - = s_('AdminUsers|The user will not be able to use slash commands') - %li - = s_('AdminUsers|When the user logs back in, their account will reactivate as a fully active account') - %li - = s_('AdminUsers|Personal projects, group and user history will be left intact') - = render_if_exists 'admin/users/user_deactivation_effects_on_seats' diff --git a/app/views/admin/users/_user_reject_effects.html.haml b/app/views/admin/users/_user_reject_effects.html.haml new file mode 100644 index 00000000000..17b6862b0cc --- /dev/null +++ b/app/views/admin/users/_user_reject_effects.html.haml @@ -0,0 +1,10 @@ +%p + = s_('AdminUsers|Rejected users:') +%ul + %li + = s_('AdminUsers|Cannot sign in or access instance information') + %li + = s_('AdminUsers|Will be deleted') +%p + - link_start = ''.html_safe % { url: help_page_path("user/profile/account/delete_account", anchor: "associated-records") } + = s_('AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}').html_safe % { link_start: link_start, link_end: ''.html_safe } diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 2e179d2d845..b86abb893a9 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -31,7 +31,7 @@ = s_('AdminUsers|Blocked') %small.badge.badge-pill= limited_counter_with_delimiter(User.blocked) = nav_link(html_options: { class: "#{active_when(params[:filter] == 'blocked_pending_approval')} filter-blocked-pending-approval" }) do - = link_to admin_users_path(filter: "blocked_pending_approval") do + = link_to admin_users_path(filter: "blocked_pending_approval"), data: { qa_selector: 'pending_approval_tab' } do = s_('AdminUsers|Pending approval') %small.badge.badge-pill= limited_counter_with_delimiter(User.blocked_pending_approval) = nav_link(html_options: { class: active_when(params[:filter] == 'deactivated') }) do @@ -69,7 +69,11 @@ = link_to admin_users_path(sort: value, filter: params[:filter], search_query: params[:search_query]) do = title -- if @users.empty? +- if Feature.enabled?(:vue_admin_users) + #js-admin-users-app{ data: admin_users_data_attributes(@users) } + .gl-spinner-container.gl-my-7 + %span.gl-vertical-align-bottom.gl-spinner.gl-spinner-dark.gl-spinner-lg{ aria: { label: _('Loading') } } +- elsif @users.empty? .nothing-here-block.border-top-0 = s_('AdminUsers|No users found') - else diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 9c6f151a6b1..26f78ea4d6a 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -42,7 +42,7 @@ = sprite_icon('close', size: 16, css_class: 'gl-icon') %li %span.light ID: - %strong + %strong{ data: { qa_selector: 'user_id_content' } } = @user.id %li %span.light= _('Namespace ID:') @@ -158,24 +158,21 @@ .card-body = render partial: 'admin/users/user_activation_effects' %br - = link_to 'Activate user', activate_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: 'Are you sure?' } + %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: user_activation_data(@user) } + = s_('AdminUsers|Activate user') - elsif @user.can_be_deactivated? .card.border-warning .card-header.bg-warning.text-white Deactivate this user .card-body - = render partial: 'admin/users/user_deactivation_effects' + = user_deactivation_effects %br - %button.btn.gl-button.btn-warning{ data: { 'gl-modal-action': 'deactivate', - content: 'You can always re-activate their account, their data will remain intact.', - url: deactivate_admin_user_path(@user), - username: sanitize_name(@user.name) } } + %button.btn.gl-button.btn-warning.js-confirm-modal-button{ data: user_deactivation_data(@user, s_('AdminUsers|You can always re-activate their account, their data will remain intact.')) } = s_('AdminUsers|Deactivate user') - - if @user.blocked? - if @user.blocked_pending_approval? = render 'admin/users/approve_user', user: @user - = render 'admin/users/block_user', user: @user + = render 'admin/users/reject_pending_user', user: @user - else .card.border-info .card-header.gl-bg-blue-500.gl-text-white @@ -186,7 +183,8 @@ %li Log in %li Access Git repositories %br - = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: s_('AdminUsers|Are you sure?') } + %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: user_unblock_data(@user) } + = s_('AdminUsers|Unblock user') - elsif !@user.internal? = render 'admin/users/block_user', user: @user @@ -198,52 +196,52 @@ %p This user has been temporarily locked due to excessive number of failed logins. You may manually unlock the account. %br = link_to 'Unlock user', unlock_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: 'Are you sure?' } - - .card.border-danger - .card-header.bg-danger.text-white - = s_('AdminUsers|Delete user') - .card-body - - if @user.can_be_removed? && can?(current_user, :destroy_user, @user) - %p Deleting a user has the following effects: - = render 'users/deletion_guidance', user: @user - %br - %button.delete-user-button.btn.gl-button.btn-danger{ data: { 'gl-modal-action': 'delete', - delete_user_url: admin_user_path(@user), - block_user_url: block_admin_user_path(@user), - username: sanitize_name(@user.name) } } - = s_('AdminUsers|Delete user') - - else - - if @user.solo_owned_groups.present? - %p - This user is currently an owner in these groups: - %strong= @user.solo_owned_groups.map(&:name).join(', ') + - if !@user.blocked_pending_approval? + .card.border-danger + .card-header.bg-danger.text-white + = s_('AdminUsers|Delete user') + .card-body + - if @user.can_be_removed? && can?(current_user, :destroy_user, @user) + %p Deleting a user has the following effects: + = render 'users/deletion_guidance', user: @user + %br + %button.delete-user-button.btn.gl-button.btn-danger{ data: { 'gl-modal-action': 'delete', + delete_user_url: admin_user_path(@user), + block_user_url: block_admin_user_path(@user), + username: sanitize_name(@user.name) } } + = s_('AdminUsers|Delete user') + - else + - if @user.solo_owned_groups.present? + %p + This user is currently an owner in these groups: + %strong= @user.solo_owned_groups.map(&:name).join(', ') + %p + You must transfer ownership or delete these groups before you can delete this user. + - else + %p + You don't have access to delete this user. + + .card.border-danger + .card-header.bg-danger.text-white + = s_('AdminUsers|Delete user and contributions') + .card-body + - if can?(current_user, :destroy_user, @user) %p - You must transfer ownership or delete these groups before you can delete this user. + This option deletes the user and any contributions that + would usually be moved to the + = succeed "." do + = link_to "system ghost user", help_page_path("user/profile/account/delete_account") + As well as the user's personal projects, groups owned solely by + the user, and projects in them, will also be removed. Commits + to other projects are unaffected. + %br + %button.delete-user-button.btn.gl-button.btn-danger{ data: { 'gl-modal-action': 'delete-with-contributions', + delete_user_url: admin_user_path(@user, hard_delete: true), + block_user_url: block_admin_user_path(@user), + username: @user.name } } + = s_('AdminUsers|Delete user and contributions') - else %p You don't have access to delete this user. - .card.border-danger - .card-header.bg-danger.text-white - = s_('AdminUsers|Delete user and contributions') - .card-body - - if can?(current_user, :destroy_user, @user) - %p - This option deletes the user and any contributions that - would usually be moved to the - = succeed "." do - = link_to "system ghost user", help_page_path("user/profile/account/delete_account") - As well as the user's personal projects, groups owned solely by - the user, and projects in them, will also be removed. Commits - to other projects are unaffected. - %br - %button.delete-user-button.btn.gl-button.btn-danger{ data: { 'gl-modal-action': 'delete-with-contributions', - delete_user_url: admin_user_path(@user, hard_delete: true), - block_user_url: block_admin_user_path(@user), - username: @user.name } } - = s_('AdminUsers|Delete user and contributions') - - else - %p - You don't have access to delete this user. - = render partial: 'admin/users/modals' diff --git a/app/views/clusters/clusters/gcp/_form.html.haml b/app/views/clusters/clusters/gcp/_form.html.haml index d1ea7fec49d..573b96caae5 100644 --- a/app/views/clusters/clusters/gcp/_form.html.haml +++ b/app/views/clusters/clusters/gcp/_form.html.haml @@ -32,7 +32,7 @@ %button.dropdown-menu-toggle.dropdown-menu-full-width{ type: 'button', disabled: true } %span.dropdown-toggle-text = _('Select project') - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %span.form-text.text-muted   .form-group @@ -43,7 +43,7 @@ %button.dropdown-menu-toggle.dropdown-menu-full-width{ type: 'button', disabled: true } %span.dropdown-toggle-text = _('Select project to choose zone') - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %p.form-text.text-muted = s_('ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}.').html_safe % { help_link_start: help_link_start % { url: zones_link_url }, help_link_end: help_link_end } @@ -59,7 +59,7 @@ %button.dropdown-menu-toggle.dropdown-menu-full-width{ type: 'button', disabled: true } %span.dropdown-toggle-text = _('Select project and zone to choose machine type') - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %p.form-text.text-muted = s_('ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}.').html_safe % { help_link_start_machine_type: help_link_start % { url: machine_type_link_url }, help_link_start_pricing: help_link_start % { url: pricing_link_url }, help_link_end: help_link_end } diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index 6ac852af2db..cb464eeafbb 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -27,6 +27,7 @@ provider_type: @cluster.provider_type, pre_installed_knative: @cluster.knative_pre_installed? ? 'true': 'false', help_path: help_page_path('user/project/clusters/index.md', anchor: 'installing-applications'), + helm_help_path: help_page_path('user/clusters/applications.md', anchor: 'helm'), ingress_help_path: help_page_path('user/project/clusters/index.md', anchor: 'getting-the-external-endpoint'), ingress_dns_help_path: help_page_path('user/clusters/applications.md', anchor: 'pointing-your-dns-at-the-external-endpoint'), ingress_mod_security_help_path: help_page_path('user/clusters/applications.md', anchor: 'web-application-firewall-modsecurity'), diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml index 9a9fbfc1ee8..c34e457dbd9 100644 --- a/app/views/dashboard/todos/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -71,7 +71,7 @@ = sort_options_hash[@sort] - else = sort_title_recently_created - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-sort.dropdown-menu-right %li = link_to todos_filter_path(sort: sort_value_label_priority) do @@ -85,9 +85,8 @@ - if @todos.any? .js-todos-list-container{ data: { qa_selector: "todos_list_container" } } .js-todos-options{ data: { per_page: @todos.limit_value, current_page: @todos.current_page, total_pages: @todos.total_pages } } - .card.card-without-border.card-without-margin - %ul.content-list.todos-list - = render @todos + %ul.content-list.todos-list + = render @todos = paginate @todos, theme: "gitlab" .js-nothing-here-container.todos-all-done.hidden.svg-content = image_tag 'illustrations/todos_all_done.svg' diff --git a/app/views/devise/confirmations/almost_there.haml b/app/views/devise/confirmations/almost_there.haml index a1fcbea5bf2..bf321bb690b 100644 --- a/app/views/devise/confirmations/almost_there.haml +++ b/app/views/devise/confirmations/almost_there.haml @@ -1,7 +1,7 @@ -.well-confirmation.text-center.append-bottom-20 +.well-confirmation.text-center.gl-mb-6 %h1.gl-mt-0 Almost there... - %p.lead.append-bottom-20 + %p.lead.gl-mb-6 Please check your email to confirm your account %hr - if Gitlab::CurrentSettings.after_sign_up_text.present? @@ -9,6 +9,6 @@ = markdown_field(Gitlab::CurrentSettings, :after_sign_up_text) %p.text-center No confirmation email received? Please check your spam folder or -.append-bottom-20.prepend-top-20.text-center +.gl-mb-6.prepend-top-20.text-center %a.btn.btn-lg.btn-success{ href: new_user_confirmation_path } Request new confirmation email diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml index 0dc98001881..3c4cbbbc3bd 100644 --- a/app/views/devise/shared/_signup_box.html.haml +++ b/app/views/devise/shared/_signup_box.html.haml @@ -1,7 +1,12 @@ - max_first_name_length = max_last_name_length = 127 - max_username_length = 255 - min_username_length = 2 +- omniauth_providers_placement ||= :bottom + .gl-mb-3.gl-p-4.gl-border-gray-100.gl-border-1.gl-border-solid.gl-rounded-base + - if show_omniauth_providers && omniauth_providers_placement == :top + = render 'devise/shared/signup_omniauth_providers_top' + = form_for(resource, as: "new_#{resource_name}", url: url, html: { class: 'new_user gl-show-field-errors', 'aria-live' => 'assertive' }) do |f| .devise-errors = render 'devise/shared/error_messages', resource: resource @@ -23,7 +28,7 @@ .form-group = f.label :email, class: 'label-bold' = f.email_field :email, value: @invite_email, class: 'form-control middle', data: { qa_selector: 'new_user_email_field' }, required: true, title: _('Please provide a valid email address.') - .form-group.append-bottom-20#password-strength + .form-group.gl-mb-5#password-strength = f.label :password, class: 'label-bold' = f.password_field :password, class: 'form-control bottom', data: { qa_selector: 'new_user_password_field' }, required: true, pattern: ".{#{@minimum_password_length},}", title: s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length } %p.gl-field-hint.text-secondary= s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length } @@ -33,5 +38,5 @@ .submit-container = f.submit button_text, class: 'btn gl-button btn-success', data: { qa_selector: 'new_user_register_button' } = render 'devise/shared/terms_of_service_notice' - - if show_omniauth_providers + - if show_omniauth_providers && omniauth_providers_placement == :bottom = render 'devise/shared/signup_omniauth_providers' diff --git a/app/views/devise/shared/_signup_omniauth_provider_list.haml b/app/views/devise/shared/_signup_omniauth_provider_list.haml new file mode 100644 index 00000000000..ece886b3cdd --- /dev/null +++ b/app/views/devise/shared/_signup_omniauth_provider_list.haml @@ -0,0 +1,9 @@ +%label.label-bold.d-block + = _("Create an account using:") +.d-flex.justify-content-between.flex-wrap + - providers.each do |provider| + = link_to omniauth_authorize_path(:user, provider), method: :post, class: "btn gl-button gl-display-flex gl-align-items-center gl-text-left gl-mb-2 gl-p-2 omniauth-btn oauth-login #{qa_class_for_provider(provider)}", id: "oauth-login-#{provider}" do + - if provider_has_icon?(provider) + = provider_image_tag(provider) + %span.ml-2 + = label_for_provider(provider) diff --git a/app/views/devise/shared/_signup_omniauth_providers.haml b/app/views/devise/shared/_signup_omniauth_providers.haml index 68098f1865b..a653d44d694 100644 --- a/app/views/devise/shared/_signup_omniauth_providers.haml +++ b/app/views/devise/shared/_signup_omniauth_providers.haml @@ -1,13 +1,3 @@ .omniauth-divider.d-flex.align-items-center.text-center = _("or") -%label.label-bold.d-block - = _("Create an account using:") -- providers = enabled_button_based_providers -.d-flex.justify-content-between.flex-wrap - - providers.each do |provider| - - has_icon = provider_has_icon?(provider) - = link_to omniauth_authorize_path(:user, provider), method: :post, class: "gl-button btn d-flex align-items-center omniauth-btn text-left oauth-login mb-2 p-2 #{qa_class_for_provider(provider)}", id: "oauth-login-#{provider}" do - - if has_icon - = provider_image_tag(provider) - %span.ml-2 - = label_for_provider(provider) += render 'devise/shared/signup_omniauth_provider_list', providers: enabled_button_based_providers diff --git a/app/views/devise/shared/_signup_omniauth_providers_top.haml b/app/views/devise/shared/_signup_omniauth_providers_top.haml new file mode 100644 index 00000000000..1deacad88c4 --- /dev/null +++ b/app/views/devise/shared/_signup_omniauth_providers_top.haml @@ -0,0 +1,3 @@ += render 'devise/shared/signup_omniauth_provider_list', providers: experiment_enabled_button_based_providers +.omniauth-divider.d-flex.align-items-center.text-center + = _("or") diff --git a/app/views/devise/unlocks/new.html.haml b/app/views/devise/unlocks/new.html.haml index 96f4f07176e..d145ac3f359 100644 --- a/app/views/devise/unlocks/new.html.haml +++ b/app/views/devise/unlocks/new.html.haml @@ -4,7 +4,7 @@ = form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post, class: 'gl-show-field-errors' }) do |f| .devise-errors = render "devise/shared/error_messages", resource: resource - .form-group.append-bottom-20 + .form-group.gl-mb-6 = f.label :email = f.email_field :email, class: 'form-control', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', title: 'Please provide a valid email address.' .clearfix diff --git a/app/views/doorkeeper/authorizations/new.html.haml b/app/views/doorkeeper/authorizations/new.html.haml index bf17eb4fe3e..b5bfbc7bd1c 100644 --- a/app/views/doorkeeper/authorizations/new.html.haml +++ b/app/views/doorkeeper/authorizations/new.html.haml @@ -10,7 +10,7 @@ - if current_user.admin? .text-warning %p - = icon("exclamation-triangle fw") + = sprite_icon('warning-solid') = html_escape(_('You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution.')) % { client_name: tag.strong(@pre_auth.client.name) } %p - link_to_client = link_to(@pre_auth.client.name, @pre_auth.redirect_uri, target: '_blank', rel: 'noopener noreferrer') diff --git a/app/views/explore/projects/_filter.html.haml b/app/views/explore/projects/_filter.html.haml index 6fc156cf4ed..2ead8fc2cfd 100644 --- a/app/views/explore/projects/_filter.html.haml +++ b/app/views/explore/projects/_filter.html.haml @@ -10,7 +10,7 @@ = visibility_level_label(params[:visibility_level].to_i) - else = _('Any') - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right %li = link_to filter_projects_path(visibility_level: nil) do diff --git a/app/views/groups/_create_chat_team.html.haml b/app/views/groups/_create_chat_team.html.haml index 07394eec107..f141b646e69 100644 --- a/app/views/groups/_create_chat_team.html.haml +++ b/app/views/groups/_create_chat_team.html.haml @@ -1,10 +1,10 @@ .form-group .col-sm-2.col-form-label = f.label :create_chat_team do - %span.mattermost-icon + %span.gl-display-flex = custom_icon('icon_mattermost') - Mattermost - .col-sm-10 + %span.gl-ml-2 Mattermost + .col-sm-12 .form-check.js-toggle-container .js-toggle-button.form-check-input= f.check_box(:create_chat_team, { checked: false }, true, false) = f.label :create_chat_team, class: 'form-check-label' do diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml index ee08829d990..67f278a06f3 100644 --- a/app/views/groups/_home_panel.html.haml +++ b/app/views/groups/_home_panel.html.haml @@ -6,10 +6,10 @@ .row.mb-3 .home-panel-title-row.col-md-12.col-lg-6.d-flex .avatar-container.rect-avatar.s64.home-panel-avatar.gl-mr-3.float-none - = group_icon(@group, class: 'avatar avatar-tile s64', width: 64, height: 64) + = group_icon(@group, class: 'avatar avatar-tile s64', width: 64, height: 64, itemprop: 'logo') .d-flex.flex-column.flex-wrap.align-items-baseline .d-inline-flex.align-items-baseline - %h1.home-panel-title.gl-mt-3.gl-mb-2 + %h1.home-panel-title.gl-mt-3.gl-mb-2{ itemprop: 'name' } = @group.name %span.visibility-icon.text-secondary.gl-ml-2.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) } = visibility_level_icon(@group.visibility_level, options: {class: 'icon'}) @@ -34,7 +34,7 @@ - if @group.description.present? .group-home-desc.mt-1 .home-panel-description - .home-panel-description-markdown.read-more-container + .home-panel-description-markdown.read-more-container{ itemprop: 'description' } = markdown_field(@group, :description) %button.btn.btn-blank.btn-link.js-read-more-trigger.d-lg-none{ type: "button" } = _("Read more") diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml new file mode 100644 index 00000000000..c95e7c16161 --- /dev/null +++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml @@ -0,0 +1,25 @@ += form_with url: configure_import_bulk_imports_path, class: 'group-form gl-show-field-errors' do |f| + = form_errors(@group) + + .gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5 + %h4 + = s_('GroupsNew|Import groups from another instance of GitLab') + %p + = s_('GroupsNew|Provide credentials for another instance of GitLab to import your groups directly.') + .form-group.gl-display-flex.gl-flex-direction-column + = f.label :bulk_import_gitlab_url, s_('GroupsNew|GitLab source URL'), for: 'import_gitlab_url' + = f.text_field :bulk_import_gitlab_url, placeholder: 'https://gitlab.example.com', class: 'gl-form-input col-xs-12 col-sm-8', + required: true, + title: s_('GroupsNew|Please fill in GitLab source URL.'), + id: 'import_gitlab_url' + .form-group.gl-display-flex.gl-flex-direction-column + = f.label :bulk_import_gitlab_access_token, s_('GroupsNew|Personal access token'), for: 'import_gitlab_token' + .gl-font-weight-normal + - pat_link_start = ''.html_safe % { url: help_page_path('user/profile/personal_access_tokens') } + = s_('GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}.').html_safe % { link_start: pat_link_start, link_end: ''.html_safe } + = f.text_field :bulk_import_gitlab_access_token, placeholder: s_('GroupsNew|e.g. h8d3f016698e...'), class: 'gl-form-input gl-mt-3 col-xs-12 col-sm-8', + required: true, + title: s_('GroupsNew|Please fill in your personal access token.'), + id: 'import_gitlab_token' + .gl-border-gray-100.gl-border-solid.gl-border-1.gl-bg-gray-10.gl-p-5 + = f.submit s_('GroupsNew|Connect instance'), class: 'btn gl-button btn-success' diff --git a/app/views/groups/_import_group_from_file_panel.html.haml b/app/views/groups/_import_group_from_file_panel.html.haml new file mode 100644 index 00000000000..171f3e0371a --- /dev/null +++ b/app/views/groups/_import_group_from_file_panel.html.haml @@ -0,0 +1,50 @@ +- parent = @group.parent +- group_path = root_url +- group_path << parent.full_path + '/' if parent + += form_with url: import_gitlab_group_path, class: 'group-form gl-show-field-errors', multipart: true do |f| + = form_errors(@group) + + .gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5 + %h4 + = _('Import group from file') + %p + = s_('GroupsNew|Provide credentials for another instance of GitLab to import your groups directly.') + .form-group.gl-display-flex.gl-flex-direction-column + = f.label :name, _('New group name'), for: 'import_group_name' + = f.text_field :name, placeholder: s_('GroupsNew|My Awesome Group'), class: 'js-autofill-group-name gl-form-input col-xs-12 col-sm-8', + required: true, + title: _('Please fill in a descriptive name for your group.'), + autofocus: true, + id: 'import_group_name' + + .form-group.gl-display-flex.gl-flex-direction-column + = f.label :import_group_path, _('New group URL'), for: 'import_group_path' + .input-group.gl-field-error-anchor.col-xs-12.col-sm-8.gl-p-0 + .group-root-path.input-group-prepend.has-tooltip{ title: group_path, :'data-placement' => 'bottom' } + .input-group-text + %span + = root_url + - if parent + %strong= parent.full_path + '/' + = f.hidden_field :parent_id, value: parent&.id + = f.text_field :path, placeholder: 'my-awesome-group', class: 'form-control js-validate-group-path js-autofill-group-path', + id: 'import_group_path', + required: true, + pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS, + title: _('Please choose a group URL with no special characters.'), + "data-bind-in" => "#{'create_chat_team' if Gitlab.config.mattermost.enabled}" + %p.validation-error.gl-field-error.field-validation.hide + = _('Group path is already taken. Suggestions: ') + %span.gl-path-suggestions + %p.validation-success.gl-field-success.field-validation.hide= _('Group path is available.') + %p.validation-pending.gl-field-error-ignore.field-validation.hide= _('Checking group path availability...') + .form-group + = f.label :file, s_('GroupsNew|Upload file') + .gl-font-weight-normal + - import_export_link_start = ''.html_safe % { url: help_page_path('user/group/settings/import_export') } + = s_('GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here.').html_safe % { link_start: import_export_link_start, link_end: ''.html_safe } + .gl-mt-3 + = render 'shared/file_picker_button', f: f, field: :file, help_text: nil, classes: 'gl-button btn-success-secondary gl-mr-2' + .gl-border-gray-100.gl-border-solid.gl-border-1.gl-bg-gray-10.gl-p-5 + = f.submit _('Import'), class: 'btn gl-button btn-success' diff --git a/app/views/groups/_import_group_pane.html.haml b/app/views/groups/_import_group_pane.html.haml deleted file mode 100644 index 9ad8ebbb37d..00000000000 --- a/app/views/groups/_import_group_pane.html.haml +++ /dev/null @@ -1,52 +0,0 @@ -- parent = @group.parent -- group_path = root_url -- group_path << parent.full_path + '/' if parent - -= form_with url: import_gitlab_group_path, class: 'group-form gl-show-field-errors', multipart: true do |f| - = form_errors(@group) - - .row - .form-group.group-name.col-sm-12 - = f.label :name, _('Group name'), class: 'label-bold' - = f.text_field :name, placeholder: s_('GroupsNew|My Awesome Group'), class: 'js-autofill-group-name form-control input-lg', - required: true, - title: _('Please fill in a descriptive name for your group.'), - autofocus: true - - .row - .form-group.col-xs-12.col-sm-8 - = f.label :path, _('Group URL'), class: 'label-bold' - .input-group.gl-field-error-anchor - .group-root-path.input-group-prepend.has-tooltip{ title: group_path, :'data-placement' => 'bottom' } - .input-group-text - %span - = root_url - - if parent - %strong= parent.full_path + '/' - = f.hidden_field :parent_id, value: parent&.id - = f.text_field :path, placeholder: 'my-awesome-group', class: 'form-control js-validate-group-path js-autofill-group-path', - id: 'import_group_path', - required: true, - pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS, - title: _('Please choose a group URL with no special characters.'), - "data-bind-in" => "#{'create_chat_team' if Gitlab.config.mattermost.enabled}" - %p.validation-error.gl-field-error.field-validation.hide - = _('Group path is already taken. Suggestions: ') - %span.gl-path-suggestions - %p.validation-success.gl-field-success.field-validation.hide= _('Group path is available.') - %p.validation-pending.gl-field-error-ignore.field-validation.hide= _('Checking group path availability...') - - .row - .form-group.col-md-12 - = s_('GroupsNew|To copy a GitLab group between installations, navigate to the group settings page for the original installation, generate an export file, and upload it here.') - .row - .form-group.col-sm-12 - = f.label :file, s_('GroupsNew|Import a GitLab group export file'), class: 'label-bold' - %div - = render 'shared/file_picker_button', f: f, field: :file, help_text: nil - - .row - .form-actions.col-sm-12 - = f.submit s_('GroupsNew|Import group'), class: 'btn btn-success' - = link_to _('Cancel'), new_group_path, class: 'btn btn-cancel' - diff --git a/app/views/groups/_new_group_fields.html.haml b/app/views/groups/_new_group_fields.html.haml index d9706556e79..3872bbcd062 100644 --- a/app/views/groups/_new_group_fields.html.haml +++ b/app/views/groups/_new_group_fields.html.haml @@ -2,12 +2,7 @@ = render 'shared/group_form', f: f, autofocus: true .row - .form-group.group-description-holder.col-sm-12 - = f.label :avatar, _("Group avatar"), class: 'label-bold' - %div - = render 'shared/choose_avatar_button', f: f - - .form-group.col-sm-12 + .form-group.col-sm-12.gl-mb-0 %label.label-bold = _('Visibility level') %p @@ -15,8 +10,13 @@ = link_to _('View the documentation'), help_page_path("public_access/public_access"), target: '_blank' = render 'shared/visibility_level', f: f, visibility_level: default_group_visibility, can_change_visibility_level: true, form_model: @group, with_label: false - = render 'create_chat_team', f: f if Gitlab.config.mattermost.enabled - +- if Gitlab.config.mattermost.enabled + .row + = render 'create_chat_team', f: f +.row + .col-sm-4 + = render_if_exists 'shared/groups/invite_members' +.row .form-actions.col-sm-12 = f.submit _('Create group'), class: "btn btn-success" = link_to _('Cancel'), dashboard_groups_path, class: 'btn btn-cancel' diff --git a/app/views/groups/_subgroups_and_projects.html.haml b/app/views/groups/_subgroups_and_projects.html.haml index cb15fe339e1..d9ab828a83b 100644 --- a/app/views/groups/_subgroups_and_projects.html.haml +++ b/app/views/groups/_subgroups_and_projects.html.haml @@ -3,6 +3,6 @@ = render "shared/groups/empty_state" %section{ data: { hide_projects: 'false', group_id: group.id, path: group_path(group) } } - .js-groups-list-holder + .js-groups-list-holder{ data: { show_schema_markup: 'true'} } .loading-container.text-center.prepend-top-20 .spinner.spinner-md diff --git a/app/views/groups/dependency_proxies/_url.html.haml b/app/views/groups/dependency_proxies/_url.html.haml index 9242954b684..25a2442f4d4 100644 --- a/app/views/groups/dependency_proxies/_url.html.haml +++ b/app/views/groups/dependency_proxies/_url.html.haml @@ -1,4 +1,4 @@ -- proxy_url = "#{group_url(@group)}/dependency_proxy/containers" +- proxy_url = "#{group_url(@group)}#{DependencyProxy::URL_SUFFIX}" %h5.prepend-top-20= _('Dependency proxy URL') diff --git a/app/views/groups/dependency_proxies/show.html.haml b/app/views/groups/dependency_proxies/show.html.haml index ff1312eb763..2ecf92e0769 100644 --- a/app/views/groups/dependency_proxies/show.html.haml +++ b/app/views/groups/dependency_proxies/show.html.haml @@ -7,7 +7,7 @@ - link_start = ''.html_safe % { url: help_page_path('user/packages/dependency_proxy/index') } = _('Create a local proxy for storing frequently used upstream images. %{link_start}Learn more%{link_end} about dependency proxies.').html_safe % { link_start: link_start, link_end: ''.html_safe } -- if @group.public? +- if Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true) || @group.public? - if can?(current_user, :admin_dependency_proxy, @group) = form_for(@dependency_proxy, method: :put, url: group_dependency_proxy_path(@group)) do |f| .form-group diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index eafee325500..33cd90ce5d3 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -8,7 +8,7 @@ .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only{ role: 'button' } = _('Naming, visibility') - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.js-settings-toggle{ type: 'button' } = _('Collapse') %p = _('Update your group name, description, avatar, and visibility.') @@ -19,7 +19,7 @@ .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only{ role: 'button' } = _('Permissions, LFS, 2FA') - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _('Advanced permissions, Large File Storage and Two-Factor authentication settings.') @@ -32,7 +32,7 @@ .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only{ role: 'button' } = s_('GroupSettings|Badges') - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = s_('GroupSettings|Customize your group badges.') @@ -40,6 +40,7 @@ .settings-content = render 'shared/badges/badge_settings' += render_if_exists 'groups/compliance_frameworks', expanded: expanded = render_if_exists 'groups/custom_project_templates_setting' = render_if_exists 'groups/templates_setting', expanded: expanded @@ -47,7 +48,7 @@ .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only{ role: 'button' } = _('Advanced') - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _('Perform advanced options such as changing path, transferring, exporting, or removing the group.') diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml index 2a87b42ef13..a1527a74898 100644 --- a/app/views/groups/group_members/index.html.haml +++ b/app/views/groups/group_members/index.html.haml @@ -4,6 +4,7 @@ - show_access_requests = can_manage_members && @requesters.exists? - invited_active = params[:search_invited].present? || params[:invited_members_page].present? - vue_members_list_enabled = Feature.enabled?(:vue_group_members_list, @group, default_enabled: true) +- filtered_search_enabled = Feature.enabled?(:group_members_filtered_search, @group, default_enabled: true) - current_user_is_group_owner = @group && @group.has_owner?(current_user) - form_item_label_css_class = 'label-bold gl-mr-2 gl-mb-0 gl-py-2 align-self-md-center' @@ -54,20 +55,21 @@ .tab-content #tab-members.tab-pane{ class: ('active' unless invited_active) } .card.card-without-border - = render 'groups/group_members/tab_pane/header' do - = render 'groups/group_members/tab_pane/title' do - = html_escape(_('Members with access to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } - = form_tag group_group_members_path(@group), method: :get, class: 'user-search-form gl-display-flex gl-md-align-items-center gl-flex-wrap gl-flex-direction-column gl-md-flex-direction-row gl-mx-n3 gl-my-n3', data: { testid: 'user-search-form' } do - .gl-px-3.gl-py-2 - .search-control-wrap.gl-relative - = render 'shared/members/search_field' - - if can_manage_members + - unless filtered_search_enabled + = render 'groups/group_members/tab_pane/header' do + = render 'groups/group_members/tab_pane/title' do + = html_escape(_('Members with access to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } + = form_tag group_group_members_path(@group), method: :get, class: 'user-search-form gl-display-flex gl-md-align-items-center gl-flex-wrap gl-flex-direction-column gl-md-flex-direction-row gl-mx-n3 gl-my-n3', data: { testid: 'user-search-form' } do + .gl-px-3.gl-py-2 + .search-control-wrap.gl-relative + = render 'shared/members/search_field' + - if can_manage_members + = render 'groups/group_members/tab_pane/form_item' do + = label_tag '2fa', _('2FA'), class: form_item_label_css_class + = render 'shared/members/filter_2fa_dropdown' = render 'groups/group_members/tab_pane/form_item' do - = label_tag '2fa', _('2FA'), class: form_item_label_css_class - = render 'shared/members/filter_2fa_dropdown' - = render 'groups/group_members/tab_pane/form_item' do - = label_tag :sort_by, _('Sort by'), class: form_item_label_css_class - = render 'shared/members/sort_dropdown' + = label_tag :sort_by, _('Sort by'), class: form_item_label_css_class + = render 'shared/members/sort_dropdown' - if vue_members_list_enabled .js-group-members-list{ data: group_members_list_data_attributes(@group, @members) } .loading @@ -83,9 +85,10 @@ - if @group.shared_with_group_links.any? #tab-groups.tab-pane .card.card-without-border - = render 'groups/group_members/tab_pane/header' do - = render 'groups/group_members/tab_pane/title' do - = html_escape(_('Groups with access to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } + - unless filtered_search_enabled + = render 'groups/group_members/tab_pane/header' do + = render 'groups/group_members/tab_pane/title' do + = html_escape(_('Groups with access to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } - if vue_members_list_enabled .js-group-linked-list{ data: linked_groups_list_data_attributes(@group) } .loading @@ -97,11 +100,12 @@ - if show_invited_members #tab-invited-members.tab-pane{ class: ('active' if invited_active) } .card.card-without-border - = render 'groups/group_members/tab_pane/header' do - = render 'groups/group_members/tab_pane/title' do - = html_escape(_('Members invited to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } - = form_tag group_group_members_path(@group), method: :get, class: 'user-search-form', data: { testid: 'user-search-form' } do - = render 'shared/members/search_field', name: 'search_invited' + - unless filtered_search_enabled + = render 'groups/group_members/tab_pane/header' do + = render 'groups/group_members/tab_pane/title' do + = html_escape(_('Members invited to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } + = form_tag group_group_members_path(@group), method: :get, class: 'user-search-form', data: { testid: 'user-search-form' } do + = render 'shared/members/search_field', name: 'search_invited' - if vue_members_list_enabled .js-group-invited-members-list{ data: group_members_list_data_attributes(@group, @invited_members) } .loading @@ -117,9 +121,10 @@ - if show_access_requests #tab-access-requests.tab-pane .card.card-without-border - = render 'groups/group_members/tab_pane/header' do - = render 'groups/group_members/tab_pane/title' do - = html_escape(_('Users requesting access to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } + - unless filtered_search_enabled + = render 'groups/group_members/tab_pane/header' do + = render 'groups/group_members/tab_pane/title' do + = html_escape(_('Users requesting access to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: ''.html_safe, strong_end: ''.html_safe } - if vue_members_list_enabled .js-group-access-requests-list{ data: group_members_list_data_attributes(@group, @requesters) } .loading diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml index a231702012c..920a6ccd9ec 100644 --- a/app/views/groups/new.html.haml +++ b/app/views/groups/new.html.haml @@ -31,14 +31,17 @@ %span.d-none.d-sm-block= s_('GroupsNew|Import group') %span.d-block.d-sm-none= s_('GroupsNew|Import') - .tab-content.gitlab-tab-content + .tab-content.gitlab-tab-content.gl-border-none .tab-pane.js-toggle-container{ id: 'create-group-pane', class: active_when(active_tab == 'create'), role: 'tabpanel' } = form_for @group, html: { class: 'group-form gl-show-field-errors' } do |f| = render 'new_group_fields', f: f, group_name_id: 'create-group-name' - .tab-pane.js-toggle-container{ id: 'import-group-pane', class: active_when(active_tab) == 'import', role: 'tabpanel' } + .tab-pane.no-padding.js-toggle-container{ id: 'import-group-pane', class: active_when(active_tab) == 'import', role: 'tabpanel' } - if import_sources_enabled? - = render 'import_group_pane', active_tab: active_tab, autofocus: true + - if Feature.enabled?(:bulk_import) + = render 'import_group_from_another_instance_panel' + .gl-mt-7.gl-border-b-solid.gl-border-gray-100.gl-border-1 + = render 'import_group_from_file_panel' - else .nothing-here-block %h4= s_('GroupsNew|No import options available') diff --git a/app/views/groups/registry/repositories/index.html.haml b/app/views/groups/registry/repositories/index.html.haml index 21882c3e3ce..e26b8317c1c 100644 --- a/app/views/groups/registry/repositories/index.html.haml +++ b/app/views/groups/registry/repositories/index.html.haml @@ -16,4 +16,6 @@ "cleanup_policies_help_page_path" => help_page_path('user/packages/container_registry/index', anchor: 'how-the-cleanup-policy-works'), "is_admin": current_user&.admin.to_s, is_group_page: "true", + "group_path": @group.full_path, + "gid_prefix": container_repository_gid_prefix, character_error: @character_error.to_s } } diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 9d5ec5008dc..109e7c3831e 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,5 +1,6 @@ -- breadcrumb_title _("Details") - @content_class = "limit-container-width" unless fluid_layout +- page_itemtype 'https://schema.org/Organization' +- @skip_current_level_breadcrumb = true - if show_thanks_for_purchase_banner? = render_if_exists 'shared/thanks_for_purchase_banner', plan_title: plan_title, quantity: params[:purchased_quantity].to_i diff --git a/app/views/import/_githubish_status.html.haml b/app/views/import/_githubish_status.html.haml index fca73f118b3..4cf08b1d2be 100644 --- a/app/views/import/_githubish_status.html.haml +++ b/app/views/import/_githubish_status.html.haml @@ -1,3 +1,4 @@ +- add_page_specific_style 'page_bundles/import' - provider = local_assigns.fetch(:provider) - extra_data = local_assigns.fetch(:extra_data, {}) - filterable = local_assigns.fetch(:filterable, true) diff --git a/app/views/import/bulk_imports/status.html.haml b/app/views/import/bulk_imports/status.html.haml index d909f6a13f0..6757c32d1e1 100644 --- a/app/views/import/bulk_imports/status.html.haml +++ b/app/views/import/bulk_imports/status.html.haml @@ -1 +1,12 @@ -- page_title 'Bulk Import' +- add_to_breadcrumbs 'New group', admin_users_path +- add_page_specific_style 'page_bundles/import' +- breadcrumb_title _('Import groups') + +%h1.gl-my-0.gl-py-4.gl-font-size-h1.gl-border-solid.gl-border-gray-200.gl-border-0.gl-border-b-1 + = s_('BulkImport|Import groups from GitLab') +%p.gl-my-0.gl-py-5.gl-border-solid.gl-border-gray-200.gl-border-0.gl-border-b-1 + = s_('BulkImport|Importing groups from %{link}').html_safe % { link: external_link(@source_url, @source_url) } + +#import-groups-mount-element{ data: { status_path: status_import_bulk_imports_path(format: :json), + available_namespaces_path: import_available_namespaces_path(format: :json), + create_bulk_import_path: import_bulk_imports_path(format: :json) } } diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index ba6a5657d12..b62f98f5ded 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -7,4 +7,6 @@ = sprite_icon('github', css_class: 'gl-mr-2') = _('Import repositories from GitHub') -= render 'import/githubish_status', provider: 'github' +- paginatable = Feature.enabled?(:remove_legacy_github_client) + += render 'import/githubish_status', provider: 'github', paginatable: paginatable diff --git a/app/views/import/google_code/new.html.haml b/app/views/import/google_code/new.html.haml deleted file mode 100644 index 1edd224956c..00000000000 --- a/app/views/import/google_code/new.html.haml +++ /dev/null @@ -1,63 +0,0 @@ -- page_title _("Google Code import") -- header_title _("Projects"), root_path -%h3.page-title.gl-display-flex - .gl-display-flex.gl-align-items-center.gl-justify-content-center - = sprite_icon('google', css_class: 'gl-mr-2') - = _('Import projects from Google Code') -%hr - -= form_tag callback_import_google_code_path, multipart: true do - %p - = _('Follow the steps below to export your Google Code project data.') - = _("In the next step, you'll be able to select the projects you want to import.") - %ol - %li - %p - - link_to_google_takeout = link_to(_("Google Takeout"), "https://www.google.com/settings/takeout", target: '_blank', rel: 'noopener noreferrer') - = _("Go to %{link_to_google_takeout}.").html_safe % { link_to_google_takeout: link_to_google_takeout } - %li - %p - = _("Make sure you're logged into the account that owns the projects you'd like to import.") - %li - %p - = html_escape(_('Click the %{strong_open}Select none%{strong_close} button on the right, since we only need "Google Code Project Hosting".')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - %li - %p - = html_escape(_('Scroll down to %{strong_open}Google Code Project Hosting%{strong_close} and enable the switch on the right.')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - %li - %p - = html_escape(_('Choose %{strong_open}Next%{strong_close} at the bottom of the page.')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - %li - %p - = _('Leave the "File type" and "Delivery method" options on their default values.') - %li - %p - = html_escape(_('Choose %{strong_open}Create archive%{strong_close} and wait for archiving to complete.')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - %li - %p - = html_escape(_('Click the %{strong_open}Download%{strong_close} button and wait for downloading to complete.')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - %li - %p - = _('Find the downloaded ZIP file and decompress it.') - %li - %p - = html_escape(_('Find the newly extracted %{code_open}Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json%{code_close} file.')) % { code_open: ''.html_safe, code_close: ''.html_safe } - %li - %p - = html_escape(_('Upload %{code_open}GoogleCodeProjectHosting.json%{code_close} here:')) % { code_open: ''.html_safe, code_close: ''.html_safe } - %p - %input{ type: "file", name: "dump_file", id: "dump_file" } - %li - %p - = _('Do you want to customize how Google Code email addresses and usernames are imported into GitLab?') - %p - = label_tag :create_user_map_0 do - = radio_button_tag :create_user_map, 0, true - = _('No, directly import the existing email addresses and usernames.') - %p - = label_tag :create_user_map_1 do - = radio_button_tag :create_user_map, 1, false - = _('Yes, let me map Google Code users to full names or GitLab users.') - - %span - = submit_tag _('Continue to the next step'), class: "btn btn-success" diff --git a/app/views/import/google_code/new_user_map.html.haml b/app/views/import/google_code/new_user_map.html.haml deleted file mode 100644 index 833987dea4e..00000000000 --- a/app/views/import/google_code/new_user_map.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -- page_title _("User map"), _("Google Code import") -- header_title _("Projects"), root_path -%h3.page-title.gl-display-flex - .gl-display-flex.gl-align-items-center.gl-justify-content-center - = sprite_icon('google', css_class: 'gl-mr-2') - = _('Import projects from Google Code') -%hr - -= form_tag create_user_map_import_google_code_path do - %p - = _("Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import.") - %p - = html_escape(_("The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of %{code_open}:%{code_close}. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.")) % { code_open: ''.html_safe, code_close: ''.html_safe } - %ul - %li - %strong= _("Default: Directly import the Google Code email address or username") - %p - = html_escape(_('%{code_open}"johnsmith@example.com": "johnsm...@example.com"%{code_close} will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user\'s privacy.')) % { code_open: ''.html_safe, code_close: ''.html_safe } - %li - %strong= _("Map a Google Code user to a GitLab user") - %p - = html_escape(_('%{code_open}"johnsmith@example.com": "@johnsmith"%{code_close} will add "By %{link_open}@johnsmith%{link_close}" to all issues and comments originally created by johnsmith@example.com, and will set %{link_open}@johnsmith%{link_close} as the assignee on all issues originally assigned to johnsmith@example.com.')) % { code_open: ''.html_safe, code_close: ''.html_safe, link_open: ''.html_safe, link_close: ''.html_safe } - %li - %strong= _("Map a Google Code user to a full name") - %p - = html_escape(_('%{code_open}"johnsmith@example.com": "John Smith"%{code_close} will add "By John Smith" to all issues and comments originally created by johnsmith@example.com.')) % { code_open: ''.html_safe, code_close: ''.html_safe } - %li - %strong= _("Map a Google Code user to a full email address") - %p - = html_escape(_('%{code_open}"johnsmith@example.com": "johnsmith@example.com"%{code_close} will add "By %{link_open}johnsmith@example.com%{link_close}" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user\'s privacy. Use this option if you want to show the full email address.')) % { code_open: ''.html_safe, code_close: ''.html_safe, link_open: ''.html_safe, link_close: ''.html_safe } - - .form-group.row - .col-sm-12 - = text_area_tag :user_map, Gitlab::Json.pretty_generate(@user_map), class: 'form-control', rows: 15 - - .form-actions - = submit_tag _('Continue to the next step'), class: "btn btn-success" diff --git a/app/views/import/google_code/status.html.haml b/app/views/import/google_code/status.html.haml deleted file mode 100644 index 0004f0de69f..00000000000 --- a/app/views/import/google_code/status.html.haml +++ /dev/null @@ -1,78 +0,0 @@ -- page_title _("Google Code import") -- header_title _("Projects"), root_path -%h3.page-title.gl-display-flex - .gl-display-flex.gl-align-items-center.gl-justify-content-center - = sprite_icon('google', css_class: 'gl-mr-2') - = _('Import projects from Google Code') - -- if @repos.any? - %p.light - = _('Select projects you want to import.') - %p.light - - link_to_customize = link_to(_("customize"), new_user_map_import_google_code_path) - = _("Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab.").html_safe % { link_to_customize: link_to_customize } - %hr - %p - - if @incompatible_repos.any? - = button_tag class: "btn btn-import btn-success js-import-all" do - = _("Import all compatible projects") - = loading_icon(css_class: 'loading-icon') - - else - = button_tag class: "btn btn-import btn-success js-import-all" do - = _("Import all projects") - = loading_icon(css_class: 'loading-icon') - -.table-responsive - %table.table.import-jobs - %colgroup.import-jobs-from-col - %colgroup.import-jobs-to-col - %colgroup.import-jobs-status-col - %thead - %tr - %th= _("From Google Code") - %th= _("To GitLab") - %th= _("Status") - %tbody - - @already_added_projects.each do |project| - %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } - %td - = link_to project.import_source, "https://code.google.com/p/#{project.import_source}", target: "_blank", rel: 'noopener noreferrer' - %td - = link_to project.full_path, project - %td.job-status - - case project.import_status - - when 'finished' - %span - = sprite_icon('check') - = _("done") - - when 'started' - = loading_icon - = _("started") - - else - = project.human_import_status_name - - - @repos.each do |repo| - %tr{ id: "repo_#{repo.id}" } - %td - = link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank", rel: 'noopener noreferrer' - %td.import-target - #{current_user.username}/#{repo.name} - %td.import-actions.job-status - = button_tag class: "btn btn-import js-add-to-import" do - = _("Import") - = loading_icon(css_class: 'loading-icon') - - @incompatible_repos.each do |repo| - %tr{ id: "repo_#{repo.id}" } - %td - = link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank", rel: 'noopener noreferrer' - %td.import-target - %td.import-actions-job-status - = label_tag _("Incompatible Project"), nil, class: "label badge-danger" - -- if @incompatible_repos.any? - %p - = _("One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git.") - - link_to_import_flow = link_to(_("import flow"), new_import_google_code_path) - = _("Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again.").html_safe % { link_to_import_flow: link_to_import_flow } - -.js-importer-status{ data: { jobs_import_path: "#{jobs_import_google_code_path}", import_path: "#{import_google_code_path}" } } diff --git a/app/views/import/manifest/_form.html.haml b/app/views/import/manifest/_form.html.haml index 2ee964974c3..1a3b945cfe5 100644 --- a/app/views/import/manifest/_form.html.haml +++ b/app/views/import/manifest/_form.html.haml @@ -19,5 +19,5 @@ = link_to sprite_icon('question-o'), help_page_path('user/project/import/manifest') .gl-mb-3 - = submit_tag _('List available repositories'), class: 'btn btn-success' - = link_to _('Cancel'), new_project_path, class: 'btn btn-cancel' + = submit_tag _('List available repositories'), class: 'gl-button btn btn-success' + = link_to _('Cancel'), new_project_path, class: 'gl-button btn btn-default btn-cancel' diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml index 355ffabd7ec..b826a1b6fc6 100644 --- a/app/views/jira_connect/subscriptions/index.html.haml +++ b/app/views/jira_connect/subscriptions/index.html.haml @@ -62,5 +62,4 @@ = webpack_bundle_tag 'performance_bar' if performance_bar_enabled? = webpack_bundle_tag 'jira_connect_app' -= page_specific_javascript_tag('jira_connect.js') -- add_page_specific_style 'page_bundles/jira_connect' +- add_page_specific_style 'page_bundles/jira_connect', defer: false diff --git a/app/views/layouts/_google_analytics.html.haml b/app/views/layouts/_google_analytics.html.haml index e8a5359e791..759e9ef36b9 100644 --- a/app/views/layouts/_google_analytics.html.haml +++ b/app/views/layouts/_google_analytics.html.haml @@ -1,4 +1,4 @@ -= javascript_tag nonce: true do += javascript_tag do :plain var _gaq = _gaq || []; _gaq.push(['_setAccount', '#{extra_config.google_analytics_id}']); diff --git a/app/views/layouts/_google_tag_manager_head.html.haml b/app/views/layouts/_google_tag_manager_head.html.haml index ab03f1e7670..48eb9e40cc4 100644 --- a/app/views/layouts/_google_tag_manager_head.html.haml +++ b/app/views/layouts/_google_tag_manager_head.html.haml @@ -1,5 +1,5 @@ - if google_tag_manager_enabled? - = javascript_tag nonce: true do + = javascript_tag do :plain (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 1d12b30c58c..bdd506ab3be 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -88,5 +88,5 @@ = yield :meta_tags = render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id') - = render 'layouts/piwik' if extra_config.has_key?('piwik_url') && extra_config.has_key?('piwik_site_id') + = render 'layouts/matomo' if extra_config.has_key?('matomo_url') && extra_config.has_key?('matomo_site_id') = render 'layouts/snowplow' diff --git a/app/views/layouts/_img_loader.html.haml b/app/views/layouts/_img_loader.html.haml index cddcd6e0af6..f6d7d163e6f 100644 --- a/app/views/layouts/_img_loader.html.haml +++ b/app/views/layouts/_img_loader.html.haml @@ -1,4 +1,4 @@ -= javascript_tag nonce: true do += javascript_tag do :plain if ('loading' in HTMLImageElement.prototype) { document.querySelectorAll('img.lazy').forEach(img => { diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml index 82ec92988eb..509f5be8097 100644 --- a/app/views/layouts/_init_auto_complete.html.haml +++ b/app/views/layouts/_init_auto_complete.html.haml @@ -4,7 +4,7 @@ - datasources = autocomplete_data_sources(object, noteable_type) - if object - = javascript_tag nonce: true do + = javascript_tag do :plain gl = window.gl || {}; gl.GfmAutoComplete = gl.GfmAutoComplete || {}; diff --git a/app/views/layouts/_init_client_detection_flags.html.haml b/app/views/layouts/_init_client_detection_flags.html.haml index 6537b86085f..03967bbbfcf 100644 --- a/app/views/layouts/_init_client_detection_flags.html.haml +++ b/app/views/layouts/_init_client_detection_flags.html.haml @@ -1,7 +1,7 @@ - client = client_js_flags - if client - = javascript_tag nonce: true do + = javascript_tag do :plain gl = window.gl || {}; gl.client = #{client.to_json}; diff --git a/app/views/layouts/_loading_hints.html.haml b/app/views/layouts/_loading_hints.html.haml index a75b602ff6b..0ef50d1b122 100644 --- a/app/views/layouts/_loading_hints.html.haml +++ b/app/views/layouts/_loading_hints.html.haml @@ -6,6 +6,5 @@ - else %link{ { rel: 'preload', href: stylesheet_url('application'), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } %link{ { rel: 'preload', href: stylesheet_url("highlight/themes/#{user_color_scheme}"), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } -%link{ { rel: 'preload', href: asset_url("fontawesome-webfont.woff2?v=4.7.0"), as: 'font', type: 'font/woff2' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } - if Gitlab::CurrentSettings.snowplow_enabled? && Gitlab::CurrentSettings.snowplow_collector_hostname %link{ rel: 'preconnect', href: Gitlab::CurrentSettings.snowplow_collector_hostname, crossorigin: '' } diff --git a/app/views/layouts/_matomo.html.haml b/app/views/layouts/_matomo.html.haml new file mode 100644 index 00000000000..fcd3156a162 --- /dev/null +++ b/app/views/layouts/_matomo.html.haml @@ -0,0 +1,15 @@ + += javascript_tag do + :plain + var _paq = window._paq = window._paq || []; + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + (function() { + var u="//#{extra_config.matomo_url}/"; + _paq.push(['setTrackerUrl', u+'matomo.php']); + _paq.push(['setSiteId', "#{extra_config.matomo_site_id}"]); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); + })(); + + diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index f6fc49393d8..c552454caa7 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -17,6 +17,7 @@ = render_account_recovery_regular_check = render_if_exists "layouts/header/ee_subscribable_banner" = render_if_exists "shared/namespace_storage_limit_alert" + = render_if_exists "shared/new_user_signups_cap_reached_alert" = yield :customize_homepage_banner - unless @hide_breadcrumbs = render "layouts/nav/breadcrumbs" diff --git a/app/views/layouts/_piwik.html.haml b/app/views/layouts/_piwik.html.haml deleted file mode 100644 index 361a7b03180..00000000000 --- a/app/views/layouts/_piwik.html.haml +++ /dev/null @@ -1,15 +0,0 @@ - -= javascript_tag nonce: true do - :plain - var _paq = _paq || []; - _paq.push(['trackPageView']); - _paq.push(['enableLinkTracking']); - (function() { - var u="//#{extra_config.piwik_url}/"; - _paq.push(['setTrackerUrl', u+'piwik.php']); - _paq.push(['setSiteId', "#{extra_config.piwik_site_id}"]); - var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; - g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); - })(); - - diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml index d7ff5ad1094..9d14dfb3786 100644 --- a/app/views/layouts/_snowplow.html.haml +++ b/app/views/layouts/_snowplow.html.haml @@ -1,6 +1,6 @@ - return unless Gitlab::CurrentSettings.snowplow_enabled? -= javascript_tag nonce: true do += javascript_tag do :plain ;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[]; p.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments) diff --git a/app/views/layouts/_startup_css_activation.haml b/app/views/layouts/_startup_css_activation.haml index a426d686c34..5fb53385acc 100644 --- a/app/views/layouts/_startup_css_activation.haml +++ b/app/views/layouts/_startup_css_activation.haml @@ -1,6 +1,6 @@ - return unless use_startup_css? -= javascript_tag nonce: true do += javascript_tag do :plain document.querySelectorAll('link[media="print"]').forEach(linkTag => { linkTag.setAttribute('data-startupcss', 'loading'); diff --git a/app/views/layouts/_startup_js.html.haml b/app/views/layouts/_startup_js.html.haml index 9c488e4f40d..35cd191c600 100644 --- a/app/views/layouts/_startup_js.html.haml +++ b/app/views/layouts/_startup_js.html.haml @@ -1,6 +1,6 @@ - return unless page_startup_api_calls.present? || page_startup_graphql_calls.present? -= javascript_tag nonce: true do += javascript_tag do :plain var gl = window.gl || {}; gl.startup_calls = #{page_startup_api_calls.to_json}; diff --git a/app/views/layouts/errors.html.haml b/app/views/layouts/errors.html.haml index dc924a0e25d..25fe4c898ca 100644 --- a/app/views/layouts/errors.html.haml +++ b/app/views/layouts/errors.html.haml @@ -8,7 +8,7 @@ %body .page-container = yield - = javascript_tag nonce: true do + = javascript_tag do :plain (function(){ var goBackElement = document.querySelector('.js-go-back'); diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index 6d2c5870e43..58fed89dfe7 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -8,7 +8,7 @@ - content_for :page_specific_javascripts do - if current_user - = javascript_tag nonce: true do + = javascript_tag do :plain window.uploads_path = "#{group_uploads_path(@group)}"; diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml index addf2375222..d7ca93a296b 100644 --- a/app/views/layouts/header/_current_user_dropdown.html.haml +++ b/app/views/layouts/header/_current_user_dropdown.html.haml @@ -18,7 +18,7 @@ - if can?(current_user, :update_user_status, current_user) %li %button.btn.menu-item.js-set-status-modal-trigger{ type: 'button' } - - if current_user.status.present? + - if show_status_emoji?(current_user.status) || user_status_set_to_busy?(current_user.status) = s_('SetStatusModal|Edit status') - else = s_('SetStatusModal|Set status') diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 794d1589172..70ab0a56581 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -74,6 +74,7 @@ %span.gl-sr-only = s_('Nav|Help') = sprite_icon('question') + %span.notification-dot.rounded-circle.gl-absolute = sprite_icon('chevron-down', css_class: 'caret-down') .dropdown-menu.dropdown-menu-right = render 'layouts/header/help_dropdown' @@ -101,7 +102,7 @@ = sprite_icon('close', size: 12, css_class: 'close-icon js-navbar-toggle-left') - if ::Feature.enabled?(:whats_new_drawer, current_user) - #whats-new-app{ data: { storage_key: whats_new_storage_key } } + #whats-new-app{ data: { storage_key: whats_new_storage_key, versions: whats_new_versions, gitlab_dot_com: Gitlab.dev_env_org_or_com? } } - if can?(current_user, :update_user_status, current_user) .js-set-status-modal-wrapper{ data: user_status_data } diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml index 17f6e9af61a..0d4ecfc5a10 100644 --- a/app/views/layouts/jira_connect.html.haml +++ b/app/views/layouts/jira_connect.html.haml @@ -5,9 +5,11 @@ GitLab = stylesheet_link_tag 'https://unpkg.com/@atlaskit/css-reset@3.0.6/dist/bundle.css' = stylesheet_link_tag 'https://unpkg.com/@atlaskit/reduced-ui-pack@10.5.5/dist/bundle.css' + = yield :page_specific_styles + = javascript_include_tag 'https://connect-cdn.atl-paas.net/all.js' = javascript_include_tag 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js' - = yield :page_specific_styles + = Gon::Base.render_data(nonce: content_security_policy_nonce) = yield :head %body .ac-content diff --git a/app/views/layouts/nav/_breadcrumbs.html.haml b/app/views/layouts/nav/_breadcrumbs.html.haml index f0cdb3d1a51..43f1011a85b 100644 --- a/app/views/layouts/nav/_breadcrumbs.html.haml +++ b/app/views/layouts/nav/_breadcrumbs.html.haml @@ -1,6 +1,7 @@ - container = @no_breadcrumb_container ? 'container-fluid' : container_class - hide_top_links = @hide_top_links || false -- push_to_schema_breadcrumb(@breadcrumb_title, breadcrumb_title_link) +- unless @skip_current_level_breadcrumb + - push_to_schema_breadcrumb(@breadcrumb_title, breadcrumb_title_link) %nav.breadcrumbs{ role: "navigation", class: [container, @content_class] } .breadcrumbs-container{ class: ("border-bottom-0" if @no_breadcrumb_border) } @@ -16,8 +17,10 @@ - @breadcrumbs_extra_links.each do |extra| = breadcrumb_list_item link_to(extra[:text], extra[:link]) = render "layouts/nav/breadcrumbs/collapsed_dropdown", location: :after - %li - %h2.breadcrumbs-sub-title= link_to @breadcrumb_title, breadcrumb_title_link + - unless @skip_current_level_breadcrumb + %li + %h2.breadcrumbs-sub-title + = link_to @breadcrumb_title, breadcrumb_title_link %script{ type:'application/ld+json' } :plain #{schema_breadcrumb_json} diff --git a/app/views/layouts/nav/groups_dropdown/_show.html.haml b/app/views/layouts/nav/groups_dropdown/_show.html.haml index 3ce1fa6bcca..d0394451a61 100644 --- a/app/views/layouts/nav/groups_dropdown/_show.html.haml +++ b/app/views/layouts/nav/groups_dropdown/_show.html.haml @@ -3,10 +3,10 @@ .frequent-items-dropdown-sidebar.qa-groups-dropdown-sidebar %ul = nav_link(path: 'dashboard/groups#index') do - = link_to dashboard_groups_path, class: 'qa-your-groups-link' do + = link_to dashboard_groups_path, class: 'qa-your-groups-link', data: { track_label: "groups_dropdown_your_groups", track_event: "click_link" } do = _('Your groups') = nav_link(path: 'groups#explore') do - = link_to explore_groups_path do + = link_to explore_groups_path, data: { track_label: "groups_dropdown_explore_groups", track_event: "click_link" } do = _('Explore groups') .frequent-items-dropdown-content #js-groups-dropdown{ data: { user_name: current_user.username, group: group_meta } } diff --git a/app/views/layouts/nav/projects_dropdown/_show.html.haml b/app/views/layouts/nav/projects_dropdown/_show.html.haml index f2170f71532..91f999a9a74 100644 --- a/app/views/layouts/nav/projects_dropdown/_show.html.haml +++ b/app/views/layouts/nav/projects_dropdown/_show.html.haml @@ -3,13 +3,13 @@ .frequent-items-dropdown-sidebar.qa-projects-dropdown-sidebar %ul = nav_link(path: 'dashboard/projects#index') do - = link_to dashboard_projects_path, class: 'qa-your-projects-link' do + = link_to dashboard_projects_path, class: 'qa-your-projects-link', data: { track_label: "projects_dropdown_your_projects", track_event: "click_link" } do = _('Your projects') = nav_link(path: 'projects#starred') do - = link_to starred_dashboard_projects_path do + = link_to starred_dashboard_projects_path, data: { track_label: "projects_dropdown_starred_projects", track_event: "click_link" } do = _('Starred projects') = nav_link(path: 'projects#trending') do - = link_to explore_root_path do + = link_to explore_root_path, data: { track_label: "projects_dropdown_explore_projects", track_event: "click_link" } do = _('Explore projects') .frequent-items-dropdown-content #js-projects-dropdown{ data: { user_name: current_user.username, project: project_meta } } diff --git a/app/views/layouts/nav/sidebar/_analytics_links.html.haml b/app/views/layouts/nav/sidebar/_analytics_links.html.haml index a99eb8cf457..970a1d5f2c7 100644 --- a/app/views/layouts/nav/sidebar/_analytics_links.html.haml +++ b/app/views/layouts/nav/sidebar/_analytics_links.html.haml @@ -4,7 +4,7 @@ - if navbar_links.any? = nav_link(path: all_paths) do - = link_to analytics_link.link, { data: { qa_selector: 'analytics_anchor' } } do + = link_to analytics_link.link, {class: 'shortcuts-analytics', data: { qa_selector: 'analytics_anchor' } } do .nav-icon-container = sprite_icon('chart') %span.nav-item-name{ data: { qa_selector: 'analytics_link' } } diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml index 5f4b1f8ad45..efe8e57cadf 100644 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ b/app/views/layouts/nav/sidebar/_group.html.haml @@ -159,11 +159,10 @@ %span = _('General') - - if group_level_integrations? - = nav_link(controller: :integrations) do - = link_to group_settings_integrations_path(@group), title: _('Integrations') do - %span - = _('Integrations') + = nav_link(controller: :integrations) do + = link_to group_settings_integrations_path(@group), title: _('Integrations') do + %span + = _('Integrations') = nav_link(path: 'groups#projects') do = link_to projects_group_path(@group), title: _('Projects') do diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 5ff774d5d9c..5cadabd5f90 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -262,6 +262,8 @@ %span = _('Incidents') + = render_if_exists 'projects/sidebar/oncall_schedules' + - if project_nav_tab? :serverless = nav_link(controller: :functions) do = link_to project_serverless_functions_path(@project), title: _('Serverless') do @@ -322,7 +324,8 @@ = render_if_exists 'layouts/nav/sidebar/project_packages_link' - = render 'layouts/nav/sidebar/analytics_links', links: project_analytics_navbar_links(@project, current_user) + - if project_nav_tab? :analytics + = render 'layouts/nav/sidebar/analytics_links', links: project_analytics_navbar_links(@project, current_user) - if project_nav_tab?(:confluence) - confluence_url = project_wikis_confluence_path(@project) @@ -435,8 +438,6 @@ %span = _('Pages') - = render_if_exists 'projects/sidebar/settings_audit_events' - = render 'shared/sidebar_toggle_button' -# Shortcut to Project > Activity diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index 62e5431e290..2df502d2899 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -10,7 +10,7 @@ - content_for :project_javascripts do - project = @target_project || @project - if current_user - = javascript_tag nonce: true do + = javascript_tag do :plain window.uploads_path = "#{project_uploads_path(project)}"; diff --git a/app/views/layouts/snippets.html.haml b/app/views/layouts/snippets.html.haml index 6cc53ba3342..54b5ec85ccc 100644 --- a/app/views/layouts/snippets.html.haml +++ b/app/views/layouts/snippets.html.haml @@ -4,7 +4,7 @@ - content_for :page_specific_javascripts do - if snippets_upload_path - = javascript_tag nonce: true do + = javascript_tag do :plain window.uploads_path = "#{snippets_upload_path}"; diff --git a/app/views/notify/issue_cloned_email.html.haml b/app/views/notify/issue_cloned_email.html.haml new file mode 100644 index 00000000000..a9e21e74e22 --- /dev/null +++ b/app/views/notify/issue_cloned_email.html.haml @@ -0,0 +1,7 @@ +- author_link = link_to @author.name, user_url(@author) +- if @can_access_project + - string = _("%{author_link} cloned %{original_issue} to %{new_issue}.").html_safe +- else + - string = _("%{author_link} cloned %{original_issue}. You don't have access to the new project.").html_safe +%p + = string % { author_link: author_link, original_issue: issue_reference_link(@issue), new_issue: issue_reference_link(@new_issue, full: true) } diff --git a/app/views/notify/issue_cloned_email.text.erb b/app/views/notify/issue_cloned_email.text.erb new file mode 100644 index 00000000000..8d3ff14df5a --- /dev/null +++ b/app/views/notify/issue_cloned_email.text.erb @@ -0,0 +1,8 @@ +Issue was cloned. + +<% if @can_access_project %> + New issue location: + <%= project_issue_url(@new_issue.project, @new_issue) %> +<% else %> + You don't have access to the project. +<% end %> diff --git a/app/views/notify/new_release_email.html.haml b/app/views/notify/new_release_email.html.haml index 45e99f3c07a..9cef4cd85cd 100644 --- a/app/views/notify/new_release_email.html.haml +++ b/app/views/notify/new_release_email.html.haml @@ -15,4 +15,4 @@ %p %h4= _("Release notes:") - = markdown_field(@release, :description) + = markdown(@release.description, pipeline: :email, author: @release.author) diff --git a/app/views/notify/user_admin_rejection_email.html.haml b/app/views/notify/user_admin_rejection_email.html.haml new file mode 100644 index 00000000000..24d6c05fa38 --- /dev/null +++ b/app/views/notify/user_admin_rejection_email.html.haml @@ -0,0 +1,5 @@ += email_default_heading(_('Hello %{name},') % { name: @name }) +%p + = _('Your request to join %{host} has been rejected.').html_safe % { host: link_to(root_url, root_url) } +%p + = _('Please contact your GitLab administrator if you think this is an error.') diff --git a/app/views/notify/user_admin_rejection_email.text.erb b/app/views/notify/user_admin_rejection_email.text.erb new file mode 100644 index 00000000000..cc676b82934 --- /dev/null +++ b/app/views/notify/user_admin_rejection_email.text.erb @@ -0,0 +1,6 @@ +<%= _('Hello %{name},') % { name: @name } %> + +<%= _('Your request to join %{host} has been rejected.') % { host: root_url } %> + +<%= _('Please contact your GitLab administrator if you think this is an error.') %> + diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index fed40b7f119..ca64c5f57b3 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -7,6 +7,14 @@ .gl-alert-body = s_('Profiles|Some options are unavailable for LDAP accounts') +- if params[:two_factor_auth_enabled_successfully] + .gl-alert.gl-alert-success.gl-my-5{ role: 'alert' } + = sprite_icon('check-circle', size: 16, css_class: 'gl-alert-icon gl-alert-icon-no-title') + %button.gl-alert-dismiss.js-close-2fa-enabled-success-alert{ type: 'button', aria: { label: _('Close') } } + = sprite_icon('close', size: 16) + .gl-alert-body + = _('Congratulations! You have enabled Two-factor Authentication!') + .row.gl-mt-3 .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 @@ -71,6 +79,11 @@ %strong= current_user.solo_owned_groups.map(&:name).join(', ') %p = s_('Profiles|You must transfer ownership or delete these groups before you can delete your account.') + - elsif !current_user.can_remove_self? + %p + = s_('Profiles|GitLab is unable to verify your identity automatically.') + %p + = s_('Profiles|Please email %{data_request} to begin the account deletion process.').html_safe % { data_request: mail_to('personal-data-request@gitlab.com') } - else %p = s_("Profiles|You don't have access to delete this user.") diff --git a/app/views/profiles/keys/_form.html.haml b/app/views/profiles/keys/_form.html.haml index 6a420d7996a..81a543de7a3 100644 --- a/app/views/profiles/keys/_form.html.haml +++ b/app/views/profiles/keys/_form.html.haml @@ -21,7 +21,7 @@ %strong= _('Oops, are you sure?') %p= s_("Profiles|This doesn't look like a public SSH key, are you sure you want to add it? It will be publicly visible.") - %button.btn.btn-success.js-add-ssh-key-validation-confirm-submit= _("Yes, add it") + %button.btn.gl-button.btn-success.js-add-ssh-key-validation-confirm-submit= _("Yes, add it") .gl-mt-3 = f.submit s_('Profiles|Add key'), class: "gl-button btn btn-success js-add-ssh-key-validation-original-submit qa-add-key-button" diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml index ea698a296fb..b1578886098 100644 --- a/app/views/profiles/notifications/_group_settings.html.haml +++ b/app/views/profiles/notifications/_group_settings.html.haml @@ -12,5 +12,5 @@ = render 'shared/notifications/button', notification_setting: setting, emails_disabled: emails_disabled .table-section.section-30 - = form_for setting, url: profile_notifications_group_path(group), method: :put, html: { class: 'update-notifications' } do |f| + = form_for setting, url: profile_notifications_group_path(group), method: :put, html: { class: 'update-notifications gl-display-flex' } do |f| = f.select :notification_email, @user.public_verified_emails, { include_blank: 'Global notification email' }, class: 'select2 js-group-notification-email' diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 9c5cfe35cda..e1345a94fb1 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -3,10 +3,14 @@ %div - if @user.errors.any? - .gl-alert.gl-alert-danger - %ul - - @user.errors.full_messages.each do |msg| - %li= msg + .gl-alert.gl-alert-danger.gl-my-5 + %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') } + = sprite_icon('close', css_class: 'gl-icon') + = sprite_icon('error', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + .gl-alert-body + %ul + - @user.errors.full_messages.each do |msg| + %li= msg = hidden_field_tag :notification_type, 'global' .row.gl-mt-3 diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml index 11750f2a6d5..577b64ba17a 100644 --- a/app/views/profiles/personal_access_tokens/index.html.haml +++ b/app/views/profiles/personal_access_tokens/index.html.haml @@ -32,22 +32,23 @@ active_tokens: @active_personal_access_tokens, revoke_route_helper: ->(token) { revoke_profile_personal_access_token_path(token) } -%hr -.row.gl-mt-3 - .col-lg-4.profile-settings-sidebar - %h4.gl-mt-0 - = s_('AccessTokens|Feed token') - %p - = s_('AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs.') - %p - = s_('AccessTokens|It cannot be used to access any other data.') - .col-lg-8.feed-token-reset - = label_tag :feed_token, s_('AccessTokens|Feed token'), class: 'label-bold' - = text_field_tag :feed_token, current_user.feed_token, class: 'form-control js-select-on-focus', readonly: true - %p.form-text.text-muted - - reset_link = link_to s_('AccessTokens|reset it'), [:reset, :feed_token, :profile], method: :put, data: { confirm: s_('AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working.') } - - reset_message = s_('AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens.') % { link_reset_it: reset_link } - = reset_message.html_safe +- unless Gitlab::CurrentSettings.disable_feed_token + %hr + .row.gl-mt-3 + .col-lg-4.profile-settings-sidebar + %h4.gl-mt-0 + = s_('AccessTokens|Feed token') + %p + = s_('AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs.') + %p + = s_('AccessTokens|It cannot be used to access any other data.') + .col-lg-8.feed-token-reset + = label_tag :feed_token, s_('AccessTokens|Feed token'), class: 'label-bold' + = text_field_tag :feed_token, current_user.feed_token, class: 'form-control js-select-on-focus', readonly: true + %p.form-text.text-muted + - reset_link = link_to s_('AccessTokens|reset it'), [:reset, :feed_token, :profile], method: :put, data: { confirm: s_('AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working.') } + - reset_message = s_('AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens.') % { link_reset_it: reset_link } + = reset_message.html_safe - if incoming_email_token_enabled? %hr diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index ca5972f1b46..aeecb0c0d72 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -79,13 +79,12 @@ = f.check_box :show_whitespace_in_diffs, class: 'form-check-input' = f.label :show_whitespace_in_diffs, class: 'form-check-label' do = s_('Preferences|Show whitespace changes in diffs') - - if Feature.enabled?(:view_diffs_file_by_file, default_enabled: true) - .form-group.form-check - = f.check_box :view_diffs_file_by_file, class: 'form-check-input' - = f.label :view_diffs_file_by_file, class: 'form-check-label' do - = s_("Preferences|Show one file at a time on merge request's Changes tab") - .form-text.text-muted - = s_("Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser.") + .form-group.form-check + = f.check_box :view_diffs_file_by_file, class: 'form-check-input' + = f.label :view_diffs_file_by_file, class: 'form-check-label' do + = s_("Preferences|Show one file at a time on merge request's Changes tab") + .form-text.text-muted + = s_("Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser.") .form-group = f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold' = f.number_field :tab_width, diff --git a/app/views/profiles/two_factor_auths/_codes.html.haml b/app/views/profiles/two_factor_auths/_codes.html.haml index 2cb7e022912..178a9d3f8b4 100644 --- a/app/views/profiles/two_factor_auths/_codes.html.haml +++ b/app/views/profiles/two_factor_auths/_codes.html.haml @@ -1,13 +1,18 @@ -%p.slead - - lose_2fa_message = _('Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{b_start}will%{b_end} lose access to your account.') % { b_start:'', b_end:'' } - = lose_2fa_message.html_safe +- show_success_alert = local_assigns.fetch(:show_success_alert, nil) -.codes.card{ data: { qa_selector: 'codes_content' } } - %ul - - @codes.each do |code| - %li - %span.monospace{ data: { qa_selector: 'code_content' } }= code +- if Feature.enabled?(:vue_2fa_recovery_codes, current_user, default_enabled: true) + .js-2fa-recovery-codes{ data: { codes: @codes.to_json, profile_account_path: profile_account_path(two_factor_auth_enabled_successfully: show_success_alert) } } +- else + %p.slead + - lose_2fa_message = _('Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{b_start}will%{b_end} lose access to your account.') % { b_start:'', b_end:'' } + = lose_2fa_message.html_safe -.d-flex - = link_to _('Proceed'), profile_account_path, class: 'gl-button btn btn-success gl-mr-3', data: { qa_selector: 'proceed_button' } - = link_to _('Download codes'), "data:text/plain;charset=utf-8,#{CGI.escape(@codes.join("\n"))}", download: "gitlab-recovery-codes.txt", class: 'gl-button btn btn-default' + .codes.card{ data: { qa_selector: 'codes_content' } } + %ul + - @codes.each do |code| + %li + %span.monospace{ data: { qa_selector: 'code_content' } }= code + + .d-flex + = link_to _('Proceed'), profile_account_path, class: 'gl-button btn btn-success gl-mr-3', data: { qa_selector: 'proceed_button' } + = link_to _('Download codes'), "data:text/plain;charset=utf-8,#{CGI.escape(@codes.join("\n"))}", download: "gitlab-recovery-codes.txt", class: 'gl-button btn btn-default' diff --git a/app/views/profiles/two_factor_auths/codes.html.haml b/app/views/profiles/two_factor_auths/codes.html.haml index 53907ebffab..0d8c5ec5dbf 100644 --- a/app/views/profiles/two_factor_auths/codes.html.haml +++ b/app/views/profiles/two_factor_auths/codes.html.haml @@ -1,6 +1,4 @@ - page_title _('Recovery Codes'), _('Two-factor Authentication') +- add_page_specific_style 'page_bundles/profile_two_factor_auth' -%h3.page-title - = _('Two-factor Authentication Recovery codes') -%hr = render 'codes' diff --git a/app/views/profiles/two_factor_auths/create.html.haml b/app/views/profiles/two_factor_auths/create.html.haml index 5a756cca0ab..be4800024cf 100644 --- a/app/views/profiles/two_factor_auths/create.html.haml +++ b/app/views/profiles/two_factor_auths/create.html.haml @@ -1,6 +1,8 @@ - page_title _('Two-factor Authentication'), _('Account') +- add_page_specific_style 'page_bundles/profile_two_factor_auth' -.gl-alert.gl-alert-success.gl-mb-5 - = _('Congratulations! You have enabled Two-factor Authentication!') +- unless Feature.enabled?(:vue_2fa_recovery_codes, current_user, default_enabled: true) + .gl-alert.gl-alert-success.gl-mb-5 + = _('Congratulations! You have enabled Two-factor Authentication!') -= render 'codes' += render 'codes', show_success_alert: true diff --git a/app/views/projects/_archived_notice.html.haml b/app/views/projects/_archived_notice.html.haml index 522693ae24a..dcece8ab42f 100644 --- a/app/views/projects/_archived_notice.html.haml +++ b/app/views/projects/_archived_notice.html.haml @@ -1,5 +1,5 @@ - if project.archived? .text-warning.center.prepend-top-20 %p - = icon("exclamation-triangle fw") + = sprite_icon('warning-solid') = _('Archived project! Repository and other project resources are read only') diff --git a/app/views/projects/_commit_button.html.haml b/app/views/projects/_commit_button.html.haml index 5f7ed46297b..87c0933747d 100644 --- a/app/views/projects/_commit_button.html.haml +++ b/app/views/projects/_commit_button.html.haml @@ -1,7 +1,7 @@ .form-actions - = button_tag 'Commit changes', id: 'commit-changes', class: 'btn commit-btn js-commit-button btn-success qa-commit-button' + = button_tag 'Commit changes', id: 'commit-changes', class: 'gl-button btn btn-success js-commit-button qa-commit-button' = link_to 'Cancel', cancel_path, - class: 'btn btn-cancel', data: {confirm: leave_edit_message} + class: 'gl-button btn btn-default btn-cancel', data: {confirm: leave_edit_message} = render 'shared/projects/edit_information' diff --git a/app/views/projects/_customize_workflow.html.haml b/app/views/projects/_customize_workflow.html.haml index a41791f0eca..8e4e5ca93e0 100644 --- a/app/views/projects/_customize_workflow.html.haml +++ b/app/views/projects/_customize_workflow.html.haml @@ -5,4 +5,4 @@ %p Get started with GitLab by enabling features that work best for your project. From issues and wikis, to merge requests and pipelines, GitLab can help manage your workflow from idea to production! - if can?(current_user, :admin_project, @project) - = link_to "Get started", edit_project_path(@project), class: "btn btn-success" + = link_to "Get started", edit_project_path(@project), class: "gl-button btn btn-success" diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml index 81c42de13f0..88dcc74a465 100644 --- a/app/views/projects/_files.html.haml +++ b/app/views/projects/_files.html.haml @@ -3,14 +3,17 @@ - project = local_assigns.fetch(:project) { @project } - show_auto_devops_callout = show_auto_devops_callout?(@project) - add_page_startup_api_call logs_file_project_ref_path(@project, ref, @path, format: "json", offset: 0) -- if @tree.readme - - add_page_startup_api_call project_blob_path(@project, tree_join(@ref, @tree.readme.path), viewer: "rich", format: "json") +- if readme_path = @project.repository.readme_path + - add_page_startup_api_call project_blob_path(@project, tree_join(@ref, readme_path), viewer: "rich", format: "json") #tree-holder.tree-holder.clearfix .nav-block = render 'projects/tree/tree_header', tree: @tree #js-last-commit + .info-well.gl-display-none.gl-display-sm-flex.project-last-commit + .gl-spinner-container.m-auto + = loading_icon(size: 'md', color: 'dark', css_class: 'align-text-bottom') - if is_project_overview .project-buttons.gl-mb-3.js-show-on-project-root diff --git a/app/views/projects/_fork_suggestion.html.haml b/app/views/projects/_fork_suggestion.html.haml index 0b616a0c1ce..9e6ff4a5d7a 100644 --- a/app/views/projects/_fork_suggestion.html.haml +++ b/app/views/projects/_fork_suggestion.html.haml @@ -6,6 +6,6 @@ edit files in this project directly. Please fork this project, make your changes there, and submit a merge request. - = link_to 'Fork', nil, method: :post, class: 'js-fork-suggestion-button btn btn-grouped btn-inverted btn-success' - %button.js-cancel-fork-suggestion-button.btn.btn-grouped{ type: 'button' } + = link_to 'Fork', nil, method: :post, class: 'js-fork-suggestion-button gl-button btn btn-grouped btn-inverted btn-success' + %button.js-cancel-fork-suggestion-button.gl-button.btn.btn-grouped{ type: 'button' } Cancel diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 569255ec2e5..ebb0dd8b39f 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -19,7 +19,7 @@ = render_if_exists 'compliance_management/compliance_framework/compliance_framework_badge', project: @project .home-panel-metadata.d-flex.flex-wrap.text-secondary.gl-font-base.gl-font-weight-normal.gl-line-height-normal - if can?(current_user, :read_project, @project) - %span.text-secondary{ itemprop: 'identifier' } + %span.text-secondary{ itemprop: 'identifier', data: { qa_selector: 'project_id_content' } } = s_('ProjectPage|Project ID: %{project_id}') % { project_id: @project.id } - if current_user %span.access-request-links.gl-ml-3 @@ -63,7 +63,7 @@ .home-panel-home-desc.mt-1 - if @project.description.present? .home-panel-description.text-break - .home-panel-description-markdown.read-more-container{ itemprop: 'abstract' } + .home-panel-description-markdown.read-more-container{ itemprop: 'description' } = markdown_field(@project, :description) %button.btn.btn-blank.btn-link.js-read-more-trigger.d-lg-none{ type: "button" } = _("Read more") diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml index 8b94133fd8a..27d75591d3e 100644 --- a/app/views/projects/_import_project_pane.html.haml +++ b/app/views/projects/_import_project_pane.html.haml @@ -8,73 +8,77 @@ .import-buttons - if gitlab_project_import_enabled? .import_gitlab_project.has-tooltip{ data: { container: 'body' } } - = link_to new_import_gitlab_project_path, class: 'btn btn_import_gitlab_project project-submit', **tracking_attrs(track_label, 'click_button', 'gitlab_export') do - = sprite_icon('tanuki') + = link_to new_import_gitlab_project_path, class: 'gl-button btn-default btn btn_import_gitlab_project project-submit', **tracking_attrs(track_label, 'click_button', 'gitlab_export') do + .gl-button-icon + = sprite_icon('tanuki') = _("GitLab export") - if github_import_enabled? %div - = link_to new_import_github_path, class: 'btn js-import-github', **tracking_attrs(track_label, 'click_button', 'github') do - = sprite_icon('github') + = link_to new_import_github_path, class: 'gl-button btn-default btn js-import-github', **tracking_attrs(track_label, 'click_button', 'github') do + .gl-button-icon + = sprite_icon('github') GitHub - if bitbucket_import_enabled? %div - = link_to status_import_bitbucket_path, class: "btn import_bitbucket #{'how_to_import_link' unless bitbucket_import_configured?}", + = link_to status_import_bitbucket_path, class: "gl-button btn-default btn import_bitbucket #{'how_to_import_link' unless bitbucket_import_configured?}", **tracking_attrs(track_label, 'click_button', 'bitbucket_cloud') do - = sprite_icon('bitbucket') + .gl-button-icon + = sprite_icon('bitbucket') Bitbucket Cloud - unless bitbucket_import_configured? = render 'projects/bitbucket_import_modal' - if bitbucket_server_import_enabled? %div - = link_to status_import_bitbucket_server_path, class: "btn import_bitbucket", **tracking_attrs(track_label, 'click_button', 'bitbucket_server') do - = sprite_icon('bitbucket') + = link_to status_import_bitbucket_server_path, class: "gl-button btn-default btn import_bitbucket", **tracking_attrs(track_label, 'click_button', 'bitbucket_server') do + .gl-button-icon + = sprite_icon('bitbucket') Bitbucket Server %div - if gitlab_import_enabled? %div - = link_to status_import_gitlab_path, class: "btn import_gitlab #{'how_to_import_link' unless gitlab_import_configured?}", + = link_to status_import_gitlab_path, class: "gl-button btn-default btn import_gitlab #{'how_to_import_link' unless gitlab_import_configured?}", **tracking_attrs(track_label, 'click_button', 'gitlab_com') do - = sprite_icon('tanuki') + .gl-button-icon + = sprite_icon('tanuki') = _("GitLab.com") - unless gitlab_import_configured? = render 'projects/gitlab_import_modal' - - if google_code_import_enabled? - %div - = link_to new_import_google_code_path, class: 'btn import_google_code', **tracking_attrs(track_label, 'click_button', 'google_code') do - = sprite_icon('google') - Google Code - - if fogbugz_import_enabled? %div - = link_to new_import_fogbugz_path, class: 'btn import_fogbugz', **tracking_attrs(track_label, 'click_button', 'fogbugz') do - = sprite_icon('bug') + = link_to new_import_fogbugz_path, class: 'gl-button btn-default btn import_fogbugz', **tracking_attrs(track_label, 'click_button', 'fogbugz') do + .gl-button-icon + = sprite_icon('bug') FogBugz - if gitea_import_enabled? %div - = link_to new_import_gitea_path, class: 'btn import_gitea', **tracking_attrs(track_label, 'click_button', 'gitea') do - = custom_icon('gitea_logo') + = link_to new_import_gitea_path, class: 'gl-button btn-default btn import_gitea', **tracking_attrs(track_label, 'click_button', 'gitea') do + .gl-button-icon + = custom_icon('gitea_logo') Gitea - if git_import_enabled? %div - %button.btn.btn-svg.js-toggle-button.js-import-git-toggle-button{ type: "button", data: { toggle_open_class: 'active' }, **tracking_attrs(track_label, 'click_button', 'repo_url') } - = sprite_icon('link', css_class: 'gl-icon') + %button.gl-button.btn-default.btn.btn-svg.js-toggle-button.js-import-git-toggle-button{ type: "button", data: { toggle_open_class: 'active' }, **tracking_attrs(track_label, 'click_button', 'repo_url') } + .gl-button-icon + = sprite_icon('link', css_class: 'gl-icon') = _('Repo by URL') - if manifest_import_enabled? %div - = link_to new_import_manifest_path, class: 'btn import_manifest', **tracking_attrs(track_label, 'click_button', 'manifest_file') do - = sprite_icon('doc-text') + = link_to new_import_manifest_path, class: 'gl-button btn-default btn import_manifest', **tracking_attrs(track_label, 'click_button', 'manifest_file') do + .gl-button-icon + = sprite_icon('doc-text') Manifest file - if phabricator_import_enabled? %div - = link_to new_import_phabricator_path, class: 'btn import_phabricator', data: { track_label: "#{track_label}", track_event: "click_button", track_property: "phabricator" } do - = custom_icon('issues') + = link_to new_import_phabricator_path, class: 'gl-button btn-default btn import_phabricator', data: { track_label: "#{track_label}", track_event: "click_button", track_property: "phabricator" } do + .gl-button-icon + = custom_icon('issues') = _("Phabricator Tasks") diff --git a/app/views/projects/_invite_members.html.haml b/app/views/projects/_invite_members.html.haml new file mode 100644 index 00000000000..ef030cabc93 --- /dev/null +++ b/app/views/projects/_invite_members.html.haml @@ -0,0 +1,8 @@ +%h4.gl-mt-0.gl-mb-3{ data: { testid: 'invite-member-section', + track_label: 'invite_members_empty_project', + track_event: 'render' } } + = s_('InviteMember|Invite your team') +%p= s_('InviteMember|Add members to this project and start collaborating with your team.') += link_to s_('InviteMember|Invite members'), project_project_members_path(@project, sort: :access_level_desc), + class: 'gl-button btn btn-success gl-mb-8 gl-xs-w-full', + data: { track_event: 'click_button', track_label: 'invite_members_empty_project' } diff --git a/app/views/projects/_project_templates.html.haml b/app/views/projects/_project_templates.html.haml index 79221c59ae4..d1ff52548cd 100644 --- a/app/views/projects/_project_templates.html.haml +++ b/app/views/projects/_project_templates.html.haml @@ -5,17 +5,11 @@ %li.built-in-tab %a.nav-link.active{ href: "#built-in", data: { toggle: 'tab'} } = _('Built-in') - %span.badge.badge-pill= Gitlab::ProjectTemplate.all.count - %li.sample-data-templates-tab - %a.nav-link{ href: "#sample-data-templates", data: { toggle: 'tab'} } - = _('Sample Data') - %span.badge.badge-pill= Gitlab::SampleDataTemplate.all.count + %span.badge.badge-pill= Gitlab::SampleDataTemplate.all.count + Gitlab::ProjectTemplate.all.count .tab-content .project-templates-buttons.import-buttons.tab-pane.active#built-in - = render partial: 'projects/project_templates/template', collection: Gitlab::ProjectTemplate.all - .project-templates-buttons.import-buttons.tab-pane#sample-data-templates - = render partial: 'projects/project_templates/template', collection: Gitlab::SampleDataTemplate.all + = render partial: 'projects/project_templates/template', collection: Gitlab::SampleDataTemplate.all + Gitlab::ProjectTemplate.all .project-fields-form = render 'projects/project_templates/project_fields_form' diff --git a/app/views/projects/_service_desk_settings.html.haml b/app/views/projects/_service_desk_settings.html.haml index 7c08955983a..3b2b3a2ba67 100644 --- a/app/views/projects/_service_desk_settings.html.haml +++ b/app/views/projects/_service_desk_settings.html.haml @@ -12,6 +12,7 @@ enabled: "#{@project.service_desk_enabled}", incoming_email: (@project.service_desk_incoming_address if @project.service_desk_enabled), custom_email: (@project.service_desk_custom_address if @project.service_desk_enabled), + custom_email_enabled: "#{@project.service_desk_custom_address_enabled?}", selected_template: "#{@project.service_desk_setting&.issue_template_key}", outgoing_name: "#{@project.service_desk_setting&.outgoing_name}", project_key: "#{@project.service_desk_setting&.project_key}", diff --git a/app/views/projects/blob/_content.html.haml b/app/views/projects/blob/_content.html.haml index 5b77e31eb00..7afbd85cd6d 100644 --- a/app/views/projects/blob/_content.html.haml +++ b/app/views/projects/blob/_content.html.haml @@ -1,10 +1,6 @@ - simple_viewer = blob.simple_viewer - rich_viewer = blob.rich_viewer - rich_viewer_active = rich_viewer && params[:viewer] != 'simple' -- blob_data = defined?(@blob) ? @blob.data : {} -- is_ci_config_file = defined?(@blob) && defined?(@project) ? editing_ci_config?.to_s : 'false' - -#js-blob-toggle-graph-preview{ data: { blob_data: blob_data, is_ci_config_file: is_ci_config_file } } = render 'projects/blob/viewer', viewer: simple_viewer, hidden: rich_viewer_active diff --git a/app/views/projects/blob/_viewer_switcher.html.haml b/app/views/projects/blob/_viewer_switcher.html.haml index 8e3cf607bbf..c6b13deaece 100644 --- a/app/views/projects/blob/_viewer_switcher.html.haml +++ b/app/views/projects/blob/_viewer_switcher.html.haml @@ -8,5 +8,5 @@ = sprite_icon(simple_viewer.switcher_icon) - rich_label = "Display #{rich_viewer.switcher_title}" - %button.btn.gl-button.btn-default.btn-sm.js-blob-viewer-switch-btn.has-tooltip{ 'aria-label' => rich_label, title: rich_label, data: { viewer: 'rich', container: 'body' } }> + %button.btn.gl-button.btn-default.btn-sm.js-blob-viewer-switch-btn.gl-mr-3.has-tooltip{ 'aria-label' => rich_label, title: rich_label, data: { viewer: 'rich', container: 'body' } }> = sprite_icon(rich_viewer.switcher_icon) diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index 54c47e7af38..abfed450316 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -9,9 +9,8 @@ = link_to "the file", project_blob_path(@project, tree_join(@branch_name, @file_path)), target: "_blank", rel: 'noopener noreferrer', class: 'gl-link' and make sure your changes will not unintentionally remove theirs. -.editor-title-row - %h3.page-title.blob-edit-page-title - Edit file +%h3.page-title.blob-edit-page-title + Edit file .file-editor %ul.nav-links.no-bottom.js-edit-mode.nav.nav-tabs %li.active diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 2a33afabb7c..8722819fe4f 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,9 +1,8 @@ - breadcrumb_title _("Repository") - page_title _("New File"), @path.presence, @ref -.editor-title-row - %h3.page-title.blob-new-page-title - New file +%h3.page-title.blob-new-page-title + New file .file-editor = form_tag(project_create_blob_path(@project, @id), method: :post, class: 'js-edit-blob-form js-new-blob-form js-quick-submit js-requires-input', data: blob_editor_paths(@project)) do = render 'projects/blob/editor', ref: @ref diff --git a/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml b/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml index aedfb64d3e4..db4b04eaeb8 100644 --- a/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml +++ b/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml @@ -1,4 +1,4 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom mr-1") = _('Metrics Dashboard YAML definition') + 'ā€¦' = link_to _('Learn more'), help_page_path('operations/metrics/dashboards/yaml.md') diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml index cf58cff7445..938dfc69500 100644 --- a/app/views/projects/buttons/_clone.html.haml +++ b/app/views/projects/buttons/_clone.html.haml @@ -2,7 +2,7 @@ - dropdown_class = local_assigns.fetch(:dropdown_class, '') .git-clone-holder.js-git-clone-holder - %a#clone-dropdown.gl-button.btn.btn-primary.clone-dropdown-btn.qa-clone-dropdown{ href: '#', data: { toggle: 'dropdown' } } + %a#clone-dropdown.gl-button.btn.btn-info.clone-dropdown-btn.qa-clone-dropdown{ href: '#', data: { toggle: 'dropdown' } } %span.gl-mr-2.js-clone-dropdown-label = _('Clone') = sprite_icon("chevron-down", css_class: "icon") @@ -12,7 +12,7 @@ %label.label-bold = _('Clone with SSH') .input-group - = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control qa-ssh-clone-url", readonly: true, aria: { label: 'Project clone URL' } + = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control qa-ssh-clone-url", readonly: true, aria: { label: _('Repository clone URL') } .input-group-append = clipboard_button(target: '#ssh_project_clone', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard") = render_if_exists 'projects/buttons/geo' @@ -21,7 +21,7 @@ %label.label-bold = _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase } .input-group - = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control qa-http-clone-url", readonly: true, aria: { label: 'Project clone URL' } + = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control qa-http-clone-url", readonly: true, aria: { label: _('Repository clone URL') } .input-group-append = clipboard_button(target: '#http_project_clone', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard") = render_if_exists 'projects/buttons/geo' diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml index 138f5569218..8b4411776bc 100644 --- a/app/views/projects/ci/builds/_build.html.haml +++ b/app/views/projects/ci/builds/_build.html.haml @@ -97,7 +97,7 @@ #{job.coverage}% %td - .float-right + .gl-display-flex - if can?(current_user, :read_build, job) && job.artifacts? = link_to download_project_job_artifacts_path(job.project, job), rel: 'nofollow', download: '', title: _('Download artifacts'), class: 'btn btn-build gl-button btn-icon btn-svg' do = sprite_icon('download') diff --git a/app/views/projects/ci/pipeline_editor/show.html.haml b/app/views/projects/ci/pipeline_editor/show.html.haml index 0e032f2575e..f1f8658fa3b 100644 --- a/app/views/projects/ci/pipeline_editor/show.html.haml +++ b/app/views/projects/ci/pipeline_editor/show.html.haml @@ -3,4 +3,6 @@ #js-pipeline-editor{ data: { "ci-config-path": @project.ci_config_path_or_default, "project-path" => @project.full_path, "default-branch" => @project.default_branch, + "commit-id" => @project.commit ? @project.commit.id : '', + "new-merge-request-path" => namespace_project_new_merge_request_path, } } diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index 86c80f1a8ae..6f2797654d0 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -30,7 +30,7 @@ .dropdown.inline %a.btn.gl-button.dropdown-toggle.qa-options-button.d-md-inline{ data: { toggle: "dropdown" } } %span= _('Options') - = icon('caret-down') + = sprite_icon('chevron-down', css_class: 'gl-text-gray-500') %ul.dropdown-menu.dropdown-menu-right %li.d-block.d-sm-none = link_to project_tree_path(@project, @commit) do diff --git a/app/views/projects/commit/_verified_signature_badge.html.haml b/app/views/projects/commit/_verified_signature_badge.html.haml index 4964b1b8ee7..357ad467539 100644 --- a/app/views/projects/commit/_verified_signature_badge.html.haml +++ b/app/views/projects/commit/_verified_signature_badge.html.haml @@ -1,5 +1,5 @@ - title = capture do - = _('This commit was signed with a verified signature and the committer email is verified to belong to the same user.').html_safe + = html_escape(_('This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user.')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - locals = { signature: signature, title: title, label: _('Verified'), css_class: 'valid', icon: 'status_success_borderless', show_user: true } diff --git a/app/views/projects/commit/x509/_unverified_signature_badge.html.haml b/app/views/projects/commit/x509/_unverified_signature_badge.html.haml index 680cc32c7e6..6204a6977c0 100644 --- a/app/views/projects/commit/x509/_unverified_signature_badge.html.haml +++ b/app/views/projects/commit/x509/_unverified_signature_badge.html.haml @@ -1,5 +1,5 @@ - title = capture do - = _('This commit was signed with an unverified signature.').html_safe + = html_escape(_('This commit was signed with an %{strong_open}unverified%{strong_close} signature.')) % { strong_open: ''.html_safe, strong_close: ''.html_safe } - locals = { signature: signature, title: title, label: _('Unverified'), css_class: 'invalid', icon: 'status_notfound_borderless', show_user: true } diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index 63cc96c2c05..a8a928515fe 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -37,7 +37,9 @@ = _('Add previously merged commits') - if commits.size == 0 && context_commits.nil? - .mt-4.text-center - .bold + .commits-empty.gl-mt-6 + = custom_icon('illustration_no_commits') + %h4 = _('Your search didn\'t match any commits.') - = _('Try changing or removing filters.') + %p + = _('Try changing or removing filters.') diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 94bdab53cd0..a14f75259ec 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -24,7 +24,7 @@ .control = form_tag(project_commits_path(@project, @id), method: :get, class: 'commits-search-form js-signature-container', data: { 'signatures-path' => namespace_project_signatures_path }) do - = search_field_tag :search, params[:search], { placeholder: _('Search by message'), id: 'commits-search', class: 'form-control search-text-input input-short gl-mt-3 gl-sm-mt-0 gl-min-w-full', spellcheck: false } + = search_field_tag :search, params[:search], { placeholder: _('Search by message'), id: 'commits-search', class: 'form-control gl-form-input input-short gl-mt-3 gl-sm-mt-0 gl-min-w-full gl-inset-border-1-gray-200!', spellcheck: false } .control.d-none.d-md-block = link_to project_commits_path(@project, @ref, rss_url_options), title: _("Commits feed"), class: 'btn gl-button btn-svg' do = sprite_icon('rss', css_class: 'qa-rss-icon') diff --git a/app/views/projects/compare/_form.html.haml b/app/views/projects/compare/_form.html.haml index a257f2e9433..0c0530110c5 100644 --- a/app/views/projects/compare/_form.html.haml +++ b/app/views/projects/compare/_form.html.haml @@ -28,4 +28,4 @@ - if @merge_request.present? = link_to _("View open merge request"), project_merge_request_path(@project, @merge_request), class: 'gl-ml-3 btn' - elsif create_mr_button? - = link_to _("Create merge request"), create_mr_path, class: 'gl-ml-3 btn' + = link_to _("Create merge request"), create_mr_path, class: 'gl-ml-3 btn gl-button' diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index b98ab9757fa..fc3710d3609 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -2,13 +2,6 @@ - add_page_specific_style 'page_bundles/cycle_analytics' #cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } } - - if @cycle_analytics_no_data - %banner{ "v-if" => "!isOverviewDialogDismissed", - "documentation-link": help_page_path('user/analytics/value_stream_analytics.md'), - "v-on:dismiss-overview-dialog" => "dismissOverviewDialog()" } - .mb-3 - %h3 - = _("Value Stream Analytics") %gl-loading-icon{ "v-show" => "isLoading", "size" => "lg" } .wrapper{ "v-show" => "!isLoading && !hasError" } .card @@ -49,7 +42,7 @@ %span.has-tooltip{ "data-placement" => "top", title: _("The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."), "aria-hidden" => "true" } = sprite_icon('question-o', css_class: 'gl-text-gray-500') %li.event-header.pl-3 - %span.stage-name.font-weight-bold + %span.stage-name.font-weight-bold{ "v-if" => "currentStage && currentStage.legend" } {{ currentStage ? __(currentStage.legend) : __('Related Issues') }} %span.has-tooltip{ "data-placement" => "top", title: _("The collection of events added to the data gathered for that stage."), "aria-hidden" => "true" } = sprite_icon('question-o', css_class: 'gl-text-gray-500') diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index 7f4b99f1a3f..c0fe143020a 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -5,7 +5,7 @@ .dropdown %button.dropdown.dropdown-new.btn.gl-button.btn-default.has-tooltip{ type: 'button', 'data-toggle' => 'dropdown', title: s_('Environments|Deploy to...') } = sprite_icon('play') - = icon('caret-down') + = sprite_icon('chevron-down') %ul.dropdown-menu.dropdown-menu-right - actions.each do |action| - next unless can?(current_user, :update_build, action) diff --git a/app/views/projects/deployments/_commit.html.haml b/app/views/projects/deployments/_commit.html.haml index 52e3e0fd997..509ed62b39d 100644 --- a/app/views/projects/deployments/_commit.html.haml +++ b/app/views/projects/deployments/_commit.html.haml @@ -2,7 +2,7 @@ .branch-commit.cgray - if deployment.ref %span.icon-container.gl-display-inline-block - = deployment.tag? ? icon('tag') : sprite_icon('fork', css_class: 'sprite') + = deployment.tag? ? sprite_icon('tag', css_class: 'sprite') : sprite_icon('fork', css_class: 'sprite') = link_to deployment.ref, project_ref_path(@project, deployment.ref), class: "ref-name" .icon-container.commit-icon = custom_icon("icon_commit") diff --git a/app/views/projects/diffs/_file_header.html.haml b/app/views/projects/diffs/_file_header.html.haml index cb43527def1..4a00e0af9d9 100644 --- a/app/views/projects/diffs/_file_header.html.haml +++ b/app/views/projects/diffs/_file_header.html.haml @@ -1,5 +1,7 @@ - if local_assigns.fetch(:show_toggle, true) - %i.fa.diff-toggle-caret.fa-fw + %span.diff-toggle-caret + = sprite_icon('chevron-right', css_class: 'chevron-right gl-display-none') + = sprite_icon('chevron-down', css_class: 'chevron-down gl-display-none') - if diff_file.submodule? %span diff --git a/app/views/projects/diffs/_replaced_image_diff.html.haml b/app/views/projects/diffs/_replaced_image_diff.html.haml index 566dfe798c6..1f9533ade83 100644 --- a/app/views/projects/diffs/_replaced_image_diff.html.haml +++ b/app/views/projects/diffs/_replaced_image_diff.html.haml @@ -14,7 +14,7 @@ .wrap .frame.deleted = image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false) - %p.image-info.hide + %p.image-info.gl-display-none %span.meta-filesize= number_to_human_size(old_blob.size) | %strong W: @@ -24,7 +24,7 @@ %span.meta-height .wrap = render partial: "projects/diffs/image_diff_frame", locals: { class_name: "added js-image-frame #{class_name}", position: position, note_type: DiffNote.name, image_path: blob_raw_url, alt: diff_file.new_path } - %p.image-info.hide + %p.image-info.gl-display-none %span.meta-filesize= number_to_human_size(blob.size) | %strong W: @@ -33,7 +33,7 @@ %strong H: %span.meta-height - .swipe.view.hide + .swipe.view.gl-display-none .swipe-frame .frame.deleted.old-diff = image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false) @@ -43,7 +43,7 @@ %span.top-handle %span.bottom-handle - .onion-skin.view.hide + .onion-skin.view.gl-display-none .onion-skin-frame .frame.deleted = image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false) @@ -54,7 +54,7 @@ .dragger{ :style => "left: 0px;" } .opaque -.view-modes.hide +.view-modes.gl-display-none %ul.view-modes-menu %li.two-up{ data: { mode: 'two-up' } } 2-up %li.swipe{ data: { mode: 'swipe' } } Swipe diff --git a/app/views/projects/diffs/_stats.html.haml b/app/views/projects/diffs/_stats.html.haml index 6429cf31bc3..8edaacf7552 100644 --- a/app/views/projects/diffs/_stats.html.haml +++ b/app/views/projects/diffs/_stats.html.haml @@ -4,7 +4,7 @@ Showing %button.diff-stats-summary-toggler.js-diff-stats-dropdown{ type: "button", data: { toggle: "dropdown", display: "static" } }< = pluralize(diff_files.size, "changed file") - = icon("caret-down", class: "gl-ml-2") + = sprite_icon("chevron-down", css_class: "gl-ml-2") %span.diff-stats-additions-deletions-expanded#diff-stats with %strong.cgreen= pluralize(sum_added_lines, 'addition') diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 10dd80501e0..387564f6408 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -7,7 +7,7 @@ .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Naming, topics, avatar') %button.btn.btn-default.js-settings-toggle{ type: 'button' }= _('Collapse') - %p= _('Update your project name, topics, description and avatar.') + %p= _('Update your project name, topics, description, and avatar.') .settings-content= render 'projects/settings/general' %section.settings.sharing-permissions.no-animate#js-shared-permissions{ class: ('expanded' if expanded), data: { qa_selector: 'visibility_features_permissions_content' } } diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index c6d39f5bba0..2936eff45df 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,12 +1,13 @@ - @content_class = "limit-container-width" unless fluid_layout - default_branch_name = @project.default_branch || "master" -- breadcrumb_title _("Details") -- page_title _("Details") +- @skip_current_level_breadcrumb = true = render partial: 'flash_messages', locals: { project: @project } = render "home_panel" += render "invite_members" if experiment_enabled?(:invite_members_empty_project_version_a) && can_import_members? + %h4.gl-mt-0.gl-mb-3 = _('The repository for this project is empty') diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml index 67dc07fb785..89c2c826067 100644 --- a/app/views/projects/forks/index.html.haml +++ b/app/views/projects/forks/index.html.haml @@ -15,7 +15,7 @@ = sort_options_hash[@sort] - else = sort_title_recently_created - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right %li - excluded_filters = [:state, :scope, :label_name, :milestone_id, :assignee_id, :author_id] diff --git a/app/views/projects/graphs/charts.html.haml b/app/views/projects/graphs/charts.html.haml index 24d92e947bc..a92b02701c5 100644 --- a/app/views/projects/graphs/charts.html.haml +++ b/app/views/projects/graphs/charts.html.haml @@ -25,7 +25,7 @@ = (_("Code coverage statistics for master %{start_date} - %{end_date}") % {start_date: start_date, end_date: end_date}) - download_path = capture do #{@daily_coverage_options[:download_path]} - %a.btn.btn-sm{ href: "#{download_path}?#{@daily_coverage_options[:base_params].to_query}" } + %a.btn.gl-button.btn-sm{ href: "#{download_path}?#{@daily_coverage_options[:base_params].to_query}" } %small = _("Download raw data (.csv)") #js-code-coverage-chart{ data: { graph_endpoint: "#{@daily_coverage_options[:graph_api_path]}?#{@daily_coverage_options[:base_params].to_query}" } } diff --git a/app/views/projects/graphs/show.html.haml b/app/views/projects/graphs/show.html.haml index a73e367733b..c7508ef4d47 100644 --- a/app/views/projects/graphs/show.html.haml +++ b/app/views/projects/graphs/show.html.haml @@ -3,6 +3,6 @@ .sub-header-block.bg-gray-light.gl-p-5 .tree-ref-holder.inline.vertical-align-middle = render 'shared/ref_switcher', destination: 'graphs' - = link_to s_('Commits|History'), project_commits_path(@project, current_ref), class: 'btn' + = link_to s_('Commits|History'), project_commits_path(@project, current_ref), class: 'btn gl-button' .js-contributors-graph{ class: container_class, 'data-project-graph-path': project_graph_path(@project, current_ref, format: :json),'data-project-branch': current_ref } diff --git a/app/views/projects/issuable/_show.html.haml b/app/views/projects/issuable/_show.html.haml index 48920c4e342..8015b205568 100644 --- a/app/views/projects/issuable/_show.html.haml +++ b/app/views/projects/issuable/_show.html.haml @@ -3,7 +3,6 @@ - if issuable.relocation_target - page_canonical_link issuable.relocation_target.present(current_user: current_user).web_url -= render_if_exists "projects/issues/alert_blocked", issue: issuable, current_user: current_user = render "projects/issues/alert_moved_from_service_desk", issue: issuable = render 'shared/issue_type/details_header', issuable: issuable diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index 51130ae666c..2fbaa5812c0 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -3,11 +3,6 @@ - @gfm_form = true -- content_for :note_actions do - - if can?(current_user, :update_issue, @issue) - = link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, format: 'json'), data: {original_text: "Reopen issue", alternative_text: "Comment & reopen issue"}, class: "gl-button btn btn-nr btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue' - = link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, format: 'json'), data: {original_text: "Close issue", alternative_text: "Comment & close issue"}, class: "gl-button btn btn-nr btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close issue' - %section.issuable-discussion.js-vue-notes-event #js-vue-notes{ data: { notes_data: notes_data(@issue).to_json, noteable_data: serialize_issuable(@issue, with_blocking_issues: true), diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index d9ad171a6cc..23510713494 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -1,67 +1,68 @@ -# DANGER: Any changes to this file need to be reflected in issuables_list/components/issuable.vue! %li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue), data: { labels: issue.label_ids, id: issue.id, qa_selector: 'issue_container', qa_issue_title: issue.title } } - .issue-box + .issuable-info-container - if @can_bulk_update .issue-check.hidden = check_box_tag dom_id(issue, "selected"), nil, false, 'data-id' => issue.id, class: "selected-issuable" - .issuable-info-container - .issuable-main-info - .issue-title.title - %span.issue-title-text.js-onboarding-issue-item{ dir: "auto" } - - if issue.confidential? - %span.has-tooltip{ title: _('Confidential') } - = confidential_icon(issue) - = link_to issue.title, issue_path(issue) - = render_if_exists 'projects/issues/subepic_flag', issue: issue - - if issue.tasks? - %span.task-status.d-none.d-sm-inline-block -   - = issue.task_status + .issuable-main-info + .issue-title.title + %span.issue-title-text.js-onboarding-issue-item{ dir: "auto" } + - if issue.confidential? + %span.has-tooltip{ title: _('Confidential') } + = confidential_icon(issue) + = link_to issue.title, issue_path(issue) + = render_if_exists 'projects/issues/subepic_flag', issue: issue + - if issue.tasks? + %span.task-status.d-none.d-sm-inline-block +   + = issue.task_status - .issuable-info - %span.issuable-reference - #{issuable_reference(issue)} - %span.issuable-authored.d-none.d-sm-inline-block - · - opened #{time_ago_with_tooltip(issue.created_at, placement: 'bottom')} - by #{link_to_member(@project, issue.author, avatar: false)} - = render_if_exists 'shared/issuable/gitlab_team_member_badge', {author: issue.author} - - if issue.milestone - %span.issuable-milestone.d-none.d-sm-inline-block -   - = link_to project_issues_path(issue.project, milestone_title: issue.milestone.title), data: { html: 'true', toggle: 'tooltip', title: milestone_tooltip_due_date(issue.milestone) } do - = sprite_icon('clock', css_class: 'gl-vertical-align-text-bottom') - = issue.milestone.title - - if issue.due_date - %span.issuable-due-date.d-none.d-sm-inline-block.has-tooltip{ class: "#{'cred' if issue.overdue?}", title: _('Due date') } -   - = sprite_icon('calendar') - = issue.due_date.to_s(:medium) + .issuable-info + %span.issuable-reference + #{issuable_reference(issue)} + %span.issuable-authored.d-none.d-sm-inline-block + · + opened #{time_ago_with_tooltip(issue.created_at, placement: 'bottom')} by + - if issue.service_desk_reply_to + #{issue.service_desk_reply_to} via + #{link_to_member(@project, issue.author, avatar: false)} + = render_if_exists 'shared/issuable/gitlab_team_member_badge', author: issue.author + - if issue.milestone + %span.issuable-milestone.d-none.d-sm-inline-block +   + = link_to project_issues_path(issue.project, milestone_title: issue.milestone.title), data: { html: 'true', toggle: 'tooltip', title: milestone_tooltip_due_date(issue.milestone) } do + = sprite_icon('clock', css_class: 'gl-vertical-align-text-bottom') + = issue.milestone.title + - if issue.due_date + %span.issuable-due-date.d-none.d-sm-inline-block.has-tooltip{ class: "#{'cred' if issue.overdue?}", title: _('Due date') } +   + = sprite_icon('calendar') + = issue.due_date.to_s(:medium) - = render_if_exists "projects/issues/issue_weight", issue: issue - = render_if_exists "projects/issues/health_status", issue: issue + = render_if_exists "projects/issues/issue_weight", issue: issue + = render_if_exists "projects/issues/health_status", issue: issue - - if issue.labels.any? -   - - presented_labels_sorted_by_title(issue.labels, issue.project).each do |label| - = link_to_label(label, small: true) + - if issue.labels.any? +   + - presented_labels_sorted_by_title(issue.labels, issue.project).each do |label| + = link_to_label(label, small: true) - = render "projects/issues/issue_estimate", issue: issue + = render "projects/issues/issue_estimate", issue: issue - .issuable-meta - %ul.controls - - if issue.closed? && issue.moved? - %li.issuable-status - = _('CLOSED (MOVED)') - - elsif issue.closed? - %li.issuable-status - = _('CLOSED') - - if issue.assignees.any? - %li.gl-display-flex - = render 'shared/issuable/assignees', project: @project, issuable: issue + .issuable-meta + %ul.controls + - if issue.closed? && issue.moved? + %li.issuable-status + = _('CLOSED (MOVED)') + - elsif issue.closed? + %li.issuable-status + = _('CLOSED') + - if issue.assignees.any? + %li.gl-display-flex + = render 'shared/issuable/assignees', project: @project, issuable: issue - = render 'shared/issuable_meta_data', issuable: issue + = render 'shared/issuable_meta_data', issuable: issue - .float-right.issuable-updated-at.d-none.d-sm-inline-block - %span - = _('updated %{time_ago}').html_safe % { time_ago: time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago') } + .float-right.issuable-updated-at.d-none.d-sm-inline-block + %span + = _('updated %{time_ago}').html_safe % { time_ago: time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago') } diff --git a/app/views/projects/issues/_new_branch.html.haml b/app/views/projects/issues/_new_branch.html.haml index 34260899d94..008340a3fe7 100644 --- a/app/views/projects/issues/_new_branch.html.haml +++ b/app/views/projects/issues/_new_branch.html.haml @@ -21,8 +21,8 @@ %button.btn.js-create-merge-request.btn-success.btn-inverted{ type: 'button', data: { action: data_action } } = value - %button.btn.create-merge-request-dropdown-toggle.dropdown-toggle.btn-success.btn-inverted.js-dropdown-toggle.flex-grow-0{ type: 'button', data: { dropdown: { trigger: '#create-merge-request-dropdown' }, display: 'static' } } - = icon('caret-down') + %button.btn.gl-button.create-merge-request-dropdown-toggle.dropdown-toggle.btn-success.btn-inverted.js-dropdown-toggle.gl-flex-grow-0.gl-h-7{ type: 'button', data: { dropdown: { trigger: '#create-merge-request-dropdown' }, display: 'static' } } + = sprite_icon('chevron-down') .droplab-dropdown %ul#create-merge-request-dropdown.create-merge-request-dropdown-menu.dropdown-menu.dropdown-menu-right.gl-show-field-errors{ class: ("create-confidential-merge-request-dropdown-menu" if can_create_confidential_merge_request?), data: { dropdown: true } } diff --git a/app/views/projects/jobs/_table.html.haml b/app/views/projects/jobs/_table.html.haml index b08223546f7..b126b452dea 100644 --- a/app/views/projects/jobs/_table.html.haml +++ b/app/views/projects/jobs/_table.html.haml @@ -1,8 +1,20 @@ - admin = local_assigns.fetch(:admin, false) - if builds.blank? - %div - .nothing-here-block No jobs to show + - if experiment_enabled?(:jobs_empty_state) + .row.empty-state + .col-12 + .svg-content.svg-250 + = image_tag('jobs-empty-state.svg') + .col-12 + .text-content.gl-text-center + %h4 + = s_('Jobs|Use jobs to automate your tasks') + %p + = s_('Jobs|Jobs are the building blocks of a GitLab CI/CD pipeline. Each job has a specific task, like testing code. To set up jobs in a CI/CD pipeline, add a CI/CD configuration file to your project.') + = link_to s_('Jobs|Create CI/CD configuration file'), help_page_path('ci/quick_start/README'), class: 'btn gl-button btn-info js-empty-state-button' + - else + .nothing-here-block= s_('Jobs|No jobs to show') - else .table-holder %table.table.ci-table.builds-page diff --git a/app/views/projects/jobs/index.html.haml b/app/views/projects/jobs/index.html.haml index a1960fc99cf..cd062fcf675 100644 --- a/app/views/projects/jobs/index.html.haml +++ b/app/views/projects/jobs/index.html.haml @@ -7,8 +7,8 @@ .nav-controls - if can?(current_user, :update_build, @project) - - unless @repository.gitlab_ci_yml - = link_to 'Get started with Pipelines', help_page_path('ci/quick_start/README'), class: 'btn gl-button btn-info' + - if !@repository.gitlab_ci_yml && !experiment_enabled?(:jobs_empty_state) + = link_to 'Get started with Pipelines', help_page_path('ci/quick_start/README'), class: 'btn gl-button btn-info js-empty-state-button' = link_to project_ci_lint_path(@project), class: 'btn gl-button btn-default' do %span CI lint diff --git a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml new file mode 100644 index 00000000000..3a8629b3b6e --- /dev/null +++ b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml @@ -0,0 +1,37 @@ +- display_issuable_type = issuable_display_type(@merge_request) +- button_action_class = @merge_request.closed? ? 'btn-default' : 'btn-warning btn-warning-secondary' +- button_class = "btn gl-button #{!@merge_request.closed? && 'js-draft-toggle-button'}" +- toggle_class = "btn gl-button dropdown-toggle" + +.float-left.btn-group.gl-ml-3.gl-display-none.gl-display-md-flex + = link_to @merge_request.closed? ? reopen_issuable_path(@merge_request) : toggle_draft_merge_request_path(@merge_request), method: :put, class: "#{button_class} #{button_action_class}" do + - if @merge_request.closed? + = _('Reopen') + = display_issuable_type + - else + = @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft') + + - if !@merge_request.closed? || !issuable_author_is_current_user(@merge_request) + = button_tag type: 'button', class: "#{toggle_class} #{button_action_class}", data: { 'toggle' => 'dropdown' } do + %span.gl-sr-only= _('Toggle dropdown') + = sprite_icon "angle-down", size: 12 + + %ul.dropdown-menu.dropdown-menu-right + - if @merge_request.open? + %li + = link_to close_issuable_path(@merge_request), method: :put do + .description + %strong.title + = _('Close') + = display_issuable_type + + - unless issuable_author_is_current_user(@merge_request) + - unless @merge_request.closed? + %li.divider.droplab-item-ignore + + %li + %a{ href: new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)) } + .description + %strong.title= _('Report abuse') + %p.text.gl-mb-0 + = _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize } diff --git a/app/views/projects/merge_requests/_how_to_merge.html.haml b/app/views/projects/merge_requests/_how_to_merge.html.haml deleted file mode 100644 index a831972a823..00000000000 --- a/app/views/projects/merge_requests/_how_to_merge.html.haml +++ /dev/null @@ -1,56 +0,0 @@ -#modal_merge_info.modal{ tabindex: '-1' } - .modal-dialog.modal-lg - .modal-content - .modal-header - %h3.modal-title Check out, review, and merge locally - %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') } - %span{ "aria-hidden": true } × - .modal-body - %p - %strong Step 1. - Fetch and check out the branch for this merge request - = clipboard_button(target: "pre#merge-info-1", title: _("Copy commands")) - %pre.dark#merge-info-1 - - if @merge_request.for_fork? - -# All repo/branch refs have been quoted to allow support for special characters (such as #my-branch) - :preserve - git fetch "#{h default_url_to_repo(@merge_request.source_project)}" "#{h @merge_request.source_branch}" - git checkout -b "#{h @merge_request.source_project_path}-#{h @merge_request.source_branch}" FETCH_HEAD - - else - :preserve - git fetch origin - git checkout -b "#{h @merge_request.source_branch}" "origin/#{h @merge_request.source_branch}" - %p - %strong Step 2. - Review the changes locally - - %p - %strong Step 3. - Merge the branch and fix any conflicts that come up - = clipboard_button(target: "pre#merge-info-3", title: _("Copy commands")) - %pre.dark#merge-info-3 - - if @merge_request.for_fork? - :preserve - git fetch origin - git checkout "#{h @merge_request.target_branch}" - git merge --no-ff "#{h @merge_request.source_project_path}-#{h @merge_request.source_branch}" - - else - :preserve - git fetch origin - git checkout "#{h @merge_request.target_branch}" - git merge --no-ff "#{h @merge_request.source_branch}" - %p - %strong Step 4. - Push the result of the merge to GitLab - = clipboard_button(target: "pre#merge-info-4", title: _("Copy commands")) - %pre.dark#merge-info-4 - :preserve - git push origin "#{h @merge_request.target_branch}" - - unless @merge_request.can_be_merged_by?(current_user) - %p - Note that pushing to GitLab requires write access to this repository. - %p - %strong Tip: - = succeed '.' do - You can also checkout merge requests locally by - = link_to 'following these guidelines', help_page_path('user/project/merge_requests/reviewing_and_managing_merge_requests.md', anchor: "checkout-merge-requests-locally-through-the-head-ref"), target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 092055a5f85..4711143c900 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -20,7 +20,7 @@ · opened #{time_ago_with_tooltip(merge_request.created_at, placement: 'bottom')} by #{link_to_member(@project, merge_request.author, avatar: false)} - = render_if_exists 'shared/issuable/gitlab_team_member_badge', {author: merge_request.author} + = render_if_exists 'shared/issuable/gitlab_team_member_badge', author: merge_request.author - if merge_request.milestone %span.issuable-milestone.d-none.d-sm-inline-block   @@ -55,7 +55,7 @@ - if merge_request.assignees.any? %li.gl-display-flex.gl-align-items-center = render 'shared/issuable/assignees', project: merge_request.project, issuable: merge_request - - if Feature.enabled?(:merge_request_reviewers, @project) && merge_request.reviewers.any? + - if Feature.enabled?(:merge_request_reviewers, @project, default_enabled: true) && merge_request.reviewers.any? %li.gl-display-flex.issuable-reviewers = render 'shared/issuable/reviewers', project: merge_request.project, issuable: merge_request = render 'projects/merge_requests/approvals_count', merge_request: merge_request diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml index cd4ffa8602e..1691a304e8b 100644 --- a/app/views/projects/merge_requests/_mr_title.html.haml +++ b/app/views/projects/merge_requests/_mr_title.html.haml @@ -2,8 +2,9 @@ - can_update_merge_request = can?(current_user, :update_merge_request, @merge_request) - can_reopen_merge_request = can?(current_user, :reopen_merge_request, @merge_request) - state_human_name, state_icon_name = state_name_with_icon(@merge_request) +- are_close_and_open_buttons_hidden = merge_request_button_hidden?(@merge_request, true) && merge_request_button_hidden?(@merge_request, false) -- if @merge_request.closed_without_fork? +- if @merge_request.closed_or_merged_without_fork? .gl-alert.gl-alert-danger.gl-mb-5 = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') .gl-alert-body @@ -18,33 +19,35 @@ .issuable-meta #js-issuable-header-warnings - = issuable_meta(@merge_request, @project, "Merge request") + = issuable_meta(@merge_request, @project) %a.btn.btn-default.float-right.d-block.d-sm-none.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ href: "#" } = sprite_icon('chevron-double-lg-left') .detail-page-header-actions.js-issuable-actions - .clearfix.issue-btn-group.dropdown - %button.btn.btn-default.float-left.d-md-none{ type: "button", data: { toggle: "dropdown" } } + .clearfix.dropdown + %button.gl-button.btn.btn-default.float-left.gl-display-md-none.gl-w-full{ type: "button", data: { toggle: "dropdown" } } Options - = icon('caret-down') + = sprite_icon('chevron-down', css_class: 'gl-text-gray-500') .dropdown-menu.dropdown-menu-right %ul - if can_update_merge_request %li= link_to 'Edit', edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) - - if can_update_merge_request - - unless @merge_request.closed? + - if @merge_request.opened? %li - = link_to @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft'), toggle_draft_issuable_path(@merge_request), method: :put, class: "js-draft-toggle-button" + = link_to @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft'), toggle_draft_merge_request_path(@merge_request), method: :put, class: "js-draft-toggle-button" %li{ class: [merge_request_button_visibility(@merge_request, true), 'js-close-item'] } = link_to 'Close', merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, title: 'Close merge request' - if can_reopen_merge_request %li{ class: merge_request_button_visibility(@merge_request, false) } - = link_to 'Reopen', merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, class: 'reopen-mr-link', title: 'Reopen merge request' + = link_to 'Reopen', merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, title: 'Reopen merge request' - unless @merge_request.merged? || current_user == @merge_request.author %li= link_to 'Report abuse', new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)) - if can_update_merge_request = link_to 'Edit', edit_project_merge_request_path(@project, @merge_request), class: "d-none d-md-block btn gl-button btn-grouped js-issuable-edit qa-edit-button" - = render 'shared/issuable/close_reopen_button', issuable: @merge_request, can_update: can_update_merge_request, can_reopen: can_reopen_merge_request + - if can_update_merge_request && !are_close_and_open_buttons_hidden + = render 'projects/merge_requests/close_reopen_draft_report_toggle' + - elsif !@merge_request.merged? + = link_to _('Report abuse'), new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)), class: 'gl-display-none gl-display-md-block gl-button btn btn-warning-secondary float-right gl-ml-3', title: _('Report abuse') diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml index 9736071b03f..123affeb5d6 100644 --- a/app/views/projects/merge_requests/_widget.html.haml +++ b/app/views/projects/merge_requests/_widget.html.haml @@ -1,4 +1,4 @@ -= javascript_tag nonce: true do += javascript_tag do :plain window.gl = window.gl || {}; window.gl.mrWidgetData = #{serialize_issuable(@merge_request, serializer: 'widget', issues_links: true)} diff --git a/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml b/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml index e6205f24ae6..cb1cb41eb71 100644 --- a/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml +++ b/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml @@ -1,16 +1,11 @@ .content-block.oneline-block.files-changed{ "v-if" => "!isLoading && !hasError" } .inline-parallel-buttons{ "v-if" => "showDiffViewTypeSwitcher" } .btn-group - %button.btn{ ":class" => "{'active': !isParallel}", "@click" => "handleViewTypeChange('inline')" } - Inline - %button.btn{ ":class" => "{'active': isParallel}", "@click" => "handleViewTypeChange('parallel')" } - Side-by-side + %button.btn.gl-button{ ":class" => "{'active': !isParallel}", "@click" => "handleViewTypeChange('inline')" } + = _('Inline') + %button.btn.gl-button{ ":class" => "{'active': isParallel}", "@click" => "handleViewTypeChange('parallel')" } + = _('Side-by-side') .js-toggle-container .commit-stat-summary - Showing - %strong.cred {{conflictsCountText}} - between - %strong.ref-name {{conflictsData.sourceBranch}} - and - %strong.ref-name {{conflictsData.targetBranch}} + = _('Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}').html_safe % { conflict_start: ''.html_safe, ref_start: ''.html_safe, strong_end: ''.html_safe, conflicts_text: '{{conflictsCountText}}', source_branch: '{{conflictsData.sourceBranch}}', target_branch: '{{conflictsData.targetBranch}}' } diff --git a/app/views/projects/merge_requests/conflicts/_file_actions.html.haml b/app/views/projects/merge_requests/conflicts/_file_actions.html.haml index 0839880713f..220ddf1bad3 100644 --- a/app/views/projects/merge_requests/conflicts/_file_actions.html.haml +++ b/app/views/projects/merge_requests/conflicts/_file_actions.html.haml @@ -1,12 +1,12 @@ -.file-actions - .btn-group{ "v-if" => "file.type === 'text'" } - %button.btn{ ":class" => "{ 'active': file.resolveMode == 'interactive' }", +.file-actions.d-flex.align-items-center.gl-ml-auto.gl-align-self-start + .btn-group.gl-mr-3{ "v-if" => "file.type === 'text'" } + %button.btn.gl-button{ ":class" => "{ 'active': file.resolveMode == 'interactive' }", '@click' => "onClickResolveModeButton(file, 'interactive')", type: 'button' } - Interactive mode - %button.btn{ ':class' => "{ 'active': file.resolveMode == 'edit' }", + = _('Interactive mode') + %button.btn.gl-button{ ':class' => "{ 'active': file.resolveMode == 'edit' }", '@click' => "onClickResolveModeButton(file, 'edit')", type: 'button' } - Edit inline - %a.btn.view-file{ ":href" => "file.blobPath" } - View file @{{conflictsData.shortCommitSha}} + = _('Edit inline') + %a.btn.gl-button.view-file{ ":href" => "file.blobPath" } + = _('View file @%{commit_sha}') % { commit_sha: '{{conflictsData.shortCommitSha}}' } diff --git a/app/views/projects/merge_requests/conflicts/_submit_form.html.haml b/app/views/projects/merge_requests/conflicts/_submit_form.html.haml index 94c262d300e..15655e2b162 100644 --- a/app/views/projects/merge_requests/conflicts/_submit_form.html.haml +++ b/app/views/projects/merge_requests/conflicts/_submit_form.html.haml @@ -18,7 +18,7 @@ .offset-md-4.col-md-8 .row .col-6 - %button.btn.btn-success.js-submit-button{ type: "button", "@click" => "commit()", ":disabled" => "!readyToCommit" } + %button.btn.gl-button.btn-success.js-submit-button{ type: "button", "@click" => "commit()", ":disabled" => "!readyToCommit" } %span {{commitButtonText}} .col-6.text-right = link_to "Cancel", project_merge_request_path(@merge_request.project, @merge_request), class: "gl-button btn btn-cancel" diff --git a/app/views/projects/merge_requests/conflicts/show.html.haml b/app/views/projects/merge_requests/conflicts/show.html.haml index decdbce3fa7..827df540629 100644 --- a/app/views/projects/merge_requests/conflicts/show.html.haml +++ b/app/views/projects/merge_requests/conflicts/show.html.haml @@ -20,9 +20,10 @@ .files-wrapper{ "v-if" => "!isLoading && !hasError" } .files .diff-file.file-holder.conflict{ "v-for" => "file in conflictsData.files" } - .js-file-title.file-title - %i.fa.fa-fw{ ":class" => "file.iconClass" } - %strong {{file.filePath}} + .js-file-title.file-title.file-title-flex-parent.cursor-default + .file-header-content + %file-icon{ ':file-name': 'file.filePath', ':size': '18', 'css-classes': 'gl-mr-2' } + %strong.file-title-name {{file.filePath}} = render partial: 'projects/merge_requests/conflicts/file_actions' .diff-content.diff-wrap-lines .file-content{ "v-show" => "!isParallel && file.resolveMode === 'interactive' && file.type === 'text'" } diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml index 6b506c38795..c70fc624dde 100644 --- a/app/views/projects/merge_requests/show.html.haml +++ b/app/views/projects/merge_requests/show.html.haml @@ -16,9 +16,6 @@ .merge-request{ data: { mr_action: mr_action, url: merge_request_path(@merge_request, format: :json), project_path: project_path(@merge_request.project), lock_version: @merge_request.lock_version } } = render "projects/merge_requests/mr_title" - - if @merge_request.source_branch_exists? - = render "projects/merge_requests/how_to_merge" - .merge-request-details.issuable-details{ data: { id: @merge_request.project.id } } = render "projects/merge_requests/mr_box" .merge-request-tabs-holder{ class: ("js-tabs-affix" unless ENV['RAILS_ENV'] == 'test') } @@ -58,6 +55,8 @@ = render "projects/merge_requests/description" = render "projects/merge_requests/widget" = render "projects/merge_requests/awards_block" + - if mr_action === "show" + - add_page_startup_api_call discussions_path(@merge_request) #js-vue-mr-discussions{ data: { notes_data: notes_data(@merge_request).to_json, noteable_data: serialize_issuable(@merge_request, serializer: 'noteable'), noteable_type: 'MergeRequest', diff --git a/app/views/projects/merge_requests/widget/open/_error.html.haml b/app/views/projects/merge_requests/widget/open/_error.html.haml index bbdc053609f..31efa64c672 100644 --- a/app/views/projects/merge_requests/widget/open/_error.html.haml +++ b/app/views/projects/merge_requests/widget/open/_error.html.haml @@ -1,5 +1,5 @@ %h4 - = icon('exclamation-triangle') + = sprite_icon('warning-solid') This merge request failed to be merged automatically %p diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml index 4366676bd45..30ba22ba53c 100644 --- a/app/views/projects/network/show.html.haml +++ b/app/views/projects/network/show.html.haml @@ -8,7 +8,7 @@ = text_field_tag :extended_sha1, @options[:extended_sha1], placeholder: _("Git revision"), class: 'search-input form-control input-mx-250 search-sha' = button_tag class: 'btn btn-success' do = sprite_icon('search') - .inline.prepend-left-20 + .inline.gl-ml-5 .form-check.light = check_box_tag :filter_ref, 1, @options[:filter_ref], class: 'form-check-input' = label_tag :filter_ref, class: 'form-check-label' do diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index f2972a9617b..a407aa9ac13 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -8,10 +8,9 @@ .project-edit-errors = render 'projects/errors' - - if experiment_enabled?(:new_create_project_ui) - .js-experiment-new-project-creation{ data: { is_ci_cd_available: ci_cd_projects_available?, has_errors: @project.errors.any? } } + .js-experiment-new-project-creation{ data: { is_ci_cd_available: (ci_cd_projects_available? if Gitlab.ee?), has_errors: @project.errors.any? } } - .row{ 'v-cloak': experiment_enabled?(:new_create_project_ui) } + .row{ 'v-cloak': true } .col-lg-3.profile-settings-sidebar %h4.gl-mt-0 = _('New project') diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml index 65c4232b240..d7853c1b466 100644 --- a/app/views/projects/no_repo.html.haml +++ b/app/views/projects/no_repo.html.haml @@ -1,5 +1,5 @@ -- breadcrumb_title _("Details") -- page_title _("Details") +- page_title _('No repository') +- @skip_current_level_breadcrumb = true %h2.gl-display-flex .gl-display-flex.gl-align-items-center.gl-justify-content-center diff --git a/app/views/projects/pipelines/_with_tabs.html.haml b/app/views/projects/pipelines/_with_tabs.html.haml index 8955b568741..b41c3f4fc27 100644 --- a/app/views/projects/pipelines/_with_tabs.html.haml +++ b/app/views/projects/pipelines/_with_tabs.html.haml @@ -26,7 +26,7 @@ = render_if_exists "projects/pipelines/tabs_holder", pipeline: @pipeline, project: @project .tab-content - #js-tab-pipeline.tab-pane.gl-absolute.gl-left-0.gl-w-full + #js-tab-pipeline.tab-pane.gl-w-full #js-pipeline-graph-vue #js-tab-builds.tab-pane diff --git a/app/views/projects/pipelines/charts.html.haml b/app/views/projects/pipelines/charts.html.haml index 55f1b9098c3..f3360e150ad 100644 --- a/app/views/projects/pipelines/charts.html.haml +++ b/app/views/projects/pipelines/charts.html.haml @@ -1,7 +1,10 @@ - page_title _('CI / CD Analytics') -#js-project-pipelines-charts-app{ data: { counts: @counts, success_ratio: success_ratio(@counts), - times_chart: { labels: @charts[:pipeline_times].labels, values: @charts[:pipeline_times].pipeline_times }, - last_week_chart: { labels: @charts[:week].labels, totals: @charts[:week].total, success: @charts[:week].success }, - last_month_chart: { labels: @charts[:month].labels, totals: @charts[:month].total, success: @charts[:month].success }, - last_year_chart: { labels: @charts[:year].labels, totals: @charts[:year].total, success: @charts[:year].success } } } +- if Feature.enabled?(:graphql_pipeline_analytics) + #js-project-pipelines-charts-app{ data: { project_path: @project.full_path } } +- else + #js-project-pipelines-charts-app{ data: { counts: @counts, success_ratio: success_ratio(@counts), + times_chart: { labels: @charts[:pipeline_times].labels, values: @charts[:pipeline_times].pipeline_times }, + last_week_chart: { labels: @charts[:week].labels, totals: @charts[:week].total, success: @charts[:week].success }, + last_month_chart: { labels: @charts[:month].labels, totals: @charts[:month].total, success: @charts[:month].success }, + last_year_chart: { labels: @charts[:year].labels, totals: @charts[:year].total, success: @charts[:year].success } } } diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml index 6aa1a564499..64ae4ff8daf 100644 --- a/app/views/projects/pipelines/index.html.haml +++ b/app/views/projects/pipelines/index.html.haml @@ -8,7 +8,7 @@ project_id: @project.id, params: params.to_json, "help-page-path" => help_page_path('ci/quick_start/README'), - "help-auto-devops-path" => help_page_path('topics/autodevops/index.md'), + "auto-devops-help-path" => help_page_path('topics/autodevops/index.md'), "pipeline-schedule-url" => pipeline_schedules_path(@project), "empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'), "error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'), diff --git a/app/views/projects/pipelines/new.html.haml b/app/views/projects/pipelines/new.html.haml index bc8e6a6d9cc..7d5cef2015d 100644 --- a/app/views/projects/pipelines/new.html.haml +++ b/app/views/projects/pipelines/new.html.haml @@ -10,10 +10,12 @@ #js-new-pipeline{ data: { project_id: @project.id, pipelines_path: project_pipelines_path(@project), config_variables_path: config_variables_namespace_project_pipelines_path(@project.namespace, @project), + default_branch: @project.default_branch, ref_param: params[:ref] || @project.default_branch, var_param: params[:var].to_json, file_param: params[:file_var].to_json, - ref_names: @project.repository.ref_names.to_json.html_safe, + branch_refs: @project.repository.branch_names.to_json.html_safe, + tag_refs: @project.repository.tag_names.to_json.html_safe, settings_link: project_settings_ci_cd_path(@project), max_warnings: ::Gitlab::Ci::Warnings::MAX_LIMIT } } diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml index 0b07fe9921e..847b96cbd0e 100644 --- a/app/views/projects/pipelines/show.html.haml +++ b/app/views/projects/pipelines/show.html.haml @@ -23,4 +23,4 @@ = render "projects/pipelines/with_tabs", pipeline: @pipeline, pipeline_has_errors: pipeline_has_errors -.js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json) } } +.js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid } } diff --git a/app/views/projects/registry/repositories/index.html.haml b/app/views/projects/registry/repositories/index.html.haml index 9ac1fda169f..b53fbc97c02 100644 --- a/app/views/projects/registry/repositories/index.html.haml +++ b/app/views/projects/registry/repositories/index.html.haml @@ -17,6 +17,7 @@ "garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'container-registry-garbage-collection'), "run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'run-the-cleanup-policy-now'), "cleanup_policies_help_page_path" => help_page_path('user/packages/container_registry/index', anchor: 'how-the-cleanup-policy-works'), - + "project_path": @project.full_path, + "gid_prefix": container_repository_gid_prefix, "is_admin": current_user&.admin.to_s, character_error: @character_error.to_s } } diff --git a/app/views/projects/registry/settings/_index.haml b/app/views/projects/registry/settings/_index.haml index c6fae2cc7a1..a4d4a1bb2dd 100644 --- a/app/views/projects/registry/settings/_index.haml +++ b/app/views/projects/registry/settings/_index.haml @@ -5,4 +5,5 @@ older_than_options: older_than_options.to_json, is_admin: current_user&.admin.to_s, admin_settings_path: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), - enable_historic_entries: container_expiration_policies_historic_entry_enabled?(@project).to_s} } + enable_historic_entries: container_expiration_policies_historic_entry_enabled?(@project).to_s, + tags_regex_help_page_path: help_page_path('user/packages/container_registry/index', anchor: 'regex-pattern-examples') } } diff --git a/app/views/projects/runners/_shared_runners.html.haml b/app/views/projects/runners/_shared_runners.html.haml index c567b453bf2..4093f0a0719 100644 --- a/app/views/projects/runners/_shared_runners.html.haml +++ b/app/views/projects/runners/_shared_runners.html.haml @@ -1,16 +1,22 @@ +- isVueifySharedRunnersToggleEnabled = Feature.enabled?(:vueify_shared_runners_toggle, @project) + = render layout: 'shared/runners/shared_runners_description' do - %hr - - if @project.group&.shared_runners_setting == 'disabled_and_unoverridable' - %h5.gl-text-red-500 - = _('Shared runners disabled on group level') - - else - - if @project.shared_runners_enabled? - = link_to toggle_shared_runners_project_runners_path(@project), class: 'btn btn-close', method: :post do - = _('Disable shared runners') + - if !isVueifySharedRunnersToggleEnabled + %hr + - if @project.group&.shared_runners_setting == 'disabled_and_unoverridable' + %h5.gl-text-red-500 + = _('Shared runners disabled on group level') - else - = link_to toggle_shared_runners_project_runners_path(@project), class: 'btn btn-success', method: :post do - = _('Enable shared runners') -   for this project + - if @project.shared_runners_enabled? + = link_to toggle_shared_runners_project_runners_path(@project), class: 'btn btn-close', method: :post do + = _('Disable shared runners') + - else + = link_to toggle_shared_runners_project_runners_path(@project), class: 'btn btn-success', method: :post do + = _('Enable shared runners') +   for this project + +- if isVueifySharedRunnersToggleEnabled + #toggle-shared-runners-form{ data: toggle_shared_runners_settings_data(@project) } - if @shared_runners_count == 0 = _('This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area.') diff --git a/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml b/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml index 9d81fda68cb..549ca36cb6a 100644 --- a/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml +++ b/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml @@ -1,4 +1,4 @@ -- pretty_name = html_escape(@project&.full_name) || html_escape_once(_('<project name>')).html_safe +- pretty_name = @project&.full_name ? html_escape(@project&.full_name) : '<' + _('project name') + '>' - run_actions_text = html_escape(s_("ProjectService|Perform common operations on GitLab project: %{project_name}")) % { project_name: pretty_name } %p= s_("ProjectService|To set up this service:") diff --git a/app/views/projects/services/slack_slash_commands/_help.html.haml b/app/views/projects/services/slack_slash_commands/_help.html.haml index 86486d95eb7..67c43bd2f33 100644 --- a/app/views/projects/services/slack_slash_commands/_help.html.haml +++ b/app/views/projects/services/slack_slash_commands/_help.html.haml @@ -1,4 +1,4 @@ -- pretty_name = @project&.full_name || _('<project name>') +- pretty_name = @project&.full_name ? html_escape(@project&.full_name) : '<' + _('project name') + '>' - run_actions_text = html_escape_once(s_("ProjectService|Perform common operations on GitLab project: %{project_name}") % { project_name: pretty_name }) .info-well diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml index f6ecb923100..0bef82ee325 100644 --- a/app/views/projects/settings/ci_cd/show.html.haml +++ b/app/views/projects/settings/ci_cd/show.html.haml @@ -66,11 +66,11 @@ %section.settings.no-animate#js-registry-policies{ class: ('expanded' if expanded) } .settings-header %h4 - = _("Cleanup policy for tags") + = _("Clean up image tags") %button.btn.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p - = _("Save space and find tags in the Container Registry more easily. Enable the cleanup policy to remove stale tags and keep only the ones you need.") + = _("Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want.") = link_to _('More information'), help_page_path('user/packages/container_registry/index', anchor: 'cleanup-policy', target: '_blank', rel: 'noopener noreferrer') .settings-content = render 'projects/registry/settings/index' diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml index e5d34ff0fc9..73722a5a789 100644 --- a/app/views/projects/settings/operations/show.html.haml +++ b/app/views/projects/settings/operations/show.html.haml @@ -2,7 +2,7 @@ - page_title _('Operations Settings') - breadcrumb_title _('Operations Settings') -= render 'projects/settings/operations/alert_management', alerts_service: alerts_service, prometheus_service: prometheus_service += render 'projects/settings/operations/alert_management' = render 'projects/settings/operations/incidents' = render 'projects/settings/operations/error_tracking' = render 'projects/settings/operations/prometheus', service: prometheus_service if Feature.enabled?(:settings_operations_prometheus_service) diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index f7c51e9ada9..5b9f868a71a 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,5 +1,5 @@ -- breadcrumb_title _("Details") - @content_class = "limit-container-width" unless fluid_layout +- @skip_current_level_breadcrumb = true = content_for :meta_tags do = auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity") diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 7679e0714fe..9d4e5d629f4 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -27,9 +27,6 @@ = sprite_icon("rocket", size: 12) = _("Release") = link_to release.name, project_releases_path(@project, anchor: release.tag), class: 'gl-text-blue-600!' - - if release.description.present? - .md.gl-mt-3 - = markdown_field(release, :description) .row-fixed-content.controls.flex-row - if tag.has_signature? diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index e0def8cf155..2fe5c5888f5 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -16,7 +16,7 @@ %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown'} } %span.light = tags_sort_options_hash[@sort] - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable %li.dropdown-header = s_('TagsPage|Sort by') diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index fe42394d919..73b2a92dcc0 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -24,7 +24,7 @@ = hidden_field_tag :ref, default_ref = button_tag type: 'button', title: default_ref, class: 'dropdown-menu-toggle wide js-branch-select monospace', required: true, data: { toggle: 'dropdown', selected: default_ref, field_name: 'ref' } do .text-left.dropdown-toggle-text= default_ref - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') = render 'shared/ref_dropdown', dropdown_class: 'wide' .form-text.text-muted = s_('TagsPage|Existing branch name, tag, or commit SHA') diff --git a/app/views/projects/terraform/index.html.haml b/app/views/projects/terraform/index.html.haml index 136e7ded224..21a4fe5eae6 100644 --- a/app/views/projects/terraform/index.html.haml +++ b/app/views/projects/terraform/index.html.haml @@ -1,4 +1,6 @@ +- add_page_specific_style 'page_bundles/ci_status' + - breadcrumb_title _('Terraform') - page_title _('Terraform') -#js-terraform-list{ data: js_terraform_list_data(@project) } +#js-terraform-list{ data: js_terraform_list_data(current_user, @project) } diff --git a/app/views/projects/tree/_truncated_notice_tree_row.html.haml b/app/views/projects/tree/_truncated_notice_tree_row.html.haml index 693b641888b..a03e0a549ee 100644 --- a/app/views/projects/tree/_truncated_notice_tree_row.html.haml +++ b/app/views/projects/tree/_truncated_notice_tree_row.html.haml @@ -1,6 +1,6 @@ %tr.tree-truncated-warning %td{ colspan: '3' } - = icon('exclamation-triangle fw') + = sprite_icon('warning-solid') %span Too many items to show. To preserve performance only %strong #{number_with_delimiter(limit)} of #{number_with_delimiter(total)} diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml deleted file mode 100644 index c166642bae2..00000000000 --- a/app/views/projects/wikis/git_access.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -- @content_class = "limit-container-width" unless fluid_layout -- page_title s_("WikiClone|Git Access"), _("Wiki") -- add_page_specific_style 'page_bundles/wiki' - -.wiki-page-header.top-area.has-sidebar-toggle.py-3.flex-column.flex-lg-row - = wiki_sidebar_toggle_button - - .git-access-header.w-100.d-flex.flex-column.justify-content-center - %span - = _("Clone repository") - %strong= @wiki.full_path - - .pt-3.pt-lg-0.w-100 - = render "shared/clone_panel", project: @wiki - -.wiki-git-access - %h3= s_("WikiClone|Install Gollum") - %pre.dark - :preserve - gem install gollum - - %h3= s_("WikiClone|Clone your wiki") - %pre.dark - :preserve - git clone #{ content_tag(:span, h(default_url_to_repo(@wiki)), class: 'clone')} - cd #{h @wiki.path} - - %h3= s_("WikiClone|Start Gollum and edit locally") - %pre.dark - :preserve - gollum - == Sinatra/1.3.5 has taken the stage on 4567 for development with backup from Thin - >> Thin web server (v1.5.0 codename Knife) - >> Maximum connections set to 1024 - >> Listening on 0.0.0.0:4567, CTRL+C to stop - -= render 'shared/wikis/sidebar' diff --git a/app/views/registrations/experience_levels/show.html.haml b/app/views/registrations/experience_levels/show.html.haml index 24b87790e18..f878245a48c 100644 --- a/app/views/registrations/experience_levels/show.html.haml +++ b/app/views/registrations/experience_levels/show.html.haml @@ -15,8 +15,8 @@ = image_tag 'novice.svg', width: '78', height: '78', alt: '' %div %p.gl-font-lg.gl-font-weight-bold.gl-mb-2= _('Novice') - %p= _('Iā€™m not very familiar with the basics of project management and DevOps.') - = link_to _('Show me everything'), users_sign_up_experience_level_path(experience_level: :novice, namespace_path: params[:namespace_path]), method: :patch, class: 'stretched-link' + %p= _('Iā€™m not familiar with the basics of DevOps.') + = link_to _('Show me the basics'), users_sign_up_experience_level_path(experience_level: :novice, namespace_path: params[:namespace_path]), method: :patch, class: 'stretched-link' .card .card-body.gl-display-flex.gl-py-8.gl-pr-5.gl-pl-7 @@ -24,5 +24,5 @@ = image_tag 'experienced.svg', width: '78', height: '78', alt: '' %div %p.gl-font-lg.gl-font-weight-bold.gl-mb-2= _('Experienced') - %p= _('Iā€™m familiar with the basics of project management and DevOps.') - = link_to _('Show me more advanced stuff'), users_sign_up_experience_level_path(experience_level: :experienced, namespace_path: params[:namespace_path]), method: :patch, class: 'stretched-link' + %p= _('Iā€™m familiar with the basics of DevOps.') + = link_to _('Show me advanced features'), users_sign_up_experience_level_path(experience_level: :experienced, namespace_path: params[:namespace_path]), method: :patch, class: 'stretched-link' diff --git a/app/views/registrations/welcome/show.html.haml b/app/views/registrations/welcome/show.html.haml index 278c0ff7739..68de80f26f6 100644 --- a/app/views/registrations/welcome/show.html.haml +++ b/app/views/registrations/welcome/show.html.haml @@ -14,12 +14,20 @@ .row .form-group.col-sm-12 = f.label :role, _('Role'), class: 'label-bold' - = f.select :role, ::User.roles.keys.map { |role| [role.titleize, role] }, {}, class: 'form-control', autofocus: true - .form-text.gl-text-gray-500.gl-mt-3= _('This will help us personalize your onboarding experience.') + = f.select :role, ::User.roles.keys.map { |role| [role.titleize, role] }, {}, class: 'form-control js-user-role-dropdown', autofocus: true + - if Feature.enabled?(:user_other_role_details) + .row + .form-group.col-sm-12.js-other-role-group{ class: ("hidden") } + = f.label :other_role, _('What is your job title? (optional)'), class: 'form-check-label gl-mb-3' + = f.text_field :other_role, class: 'form-control' + - else + .row + .form-group.col-sm-12 + .form-text.gl-text-gray-500.gl-mt-0.gl-line-height-normal.gl-px-1= _('This will help us personalize your onboarding experience.') = render_if_exists "registrations/welcome/setup_for_company", f: f .row .form-group.col-sm-12.gl-mb-0 - if partial_exists? "registrations/welcome/button" = render "registrations/welcome/button" - else - = f.submit _('Get started!'), class: 'btn-register gl-button btn btn-block gl-mb-0 gl-p-3', data: { qa_selector: 'get_started_button' } + = f.submit _('Get started!'), class: 'btn-success gl-button btn btn-block gl-mb-0 gl-p-3', data: { qa_selector: 'get_started_button' } diff --git a/app/views/search/_filter.html.haml b/app/views/search/_filter.html.haml index 964a2a2772a..e9c6b581c90 100644 --- a/app/views/search/_filter.html.haml +++ b/app/views/search/_filter.html.haml @@ -2,21 +2,13 @@ = hidden_field_tag :group_id, params[:group_id] - if params[:project_id].present? = hidden_field_tag :project_id, params[:project_id] +- project_attributes = @project&.attributes&.slice('id', 'namespace_id', 'name')&.merge(name_with_namespace: @project&.name_with_namespace) + .dropdown.form-group.mb-lg-0.mx-lg-1.gl-p-0{ data: { testid: "group-filter" } } %label.d-block{ for: "dashboard_search_group" } = _("Group") - %input#js-search-group-dropdown.dropdown-menu-toggle{ value: "Loading...", data: { "initial-group-data": @group.to_json } } -.dropdown.form-group.mb-lg-0.mx-lg-1{ data: { testid: "project-filter" } } + %input#js-search-group-dropdown.dropdown-menu-toggle{ value: "Loading...", data: { "initial-data": @group.to_json } } +.dropdown.form-group.mb-lg-0.mx-lg-1.gl-p-0{ data: { testid: "project-filter" } } %label.d-block{ for: "dashboard_search_project" } = _("Project") - %button.dropdown-menu-toggle.gl-display-inline-flex.js-search-project-dropdown.gl-mt-0{ type: "button", id: "dashboard_search_project", data: { toggle: "dropdown" } } - %span.dropdown-toggle-text.gl-flex-grow-1.str-truncated-100 - = @project&.full_name || _("Any") - - if @project.present? - = link_to sprite_icon("clear"), url_for(safe_params.except(:project_id)), class: 'search-clear js-search-clear has-tooltip', title: _('Clear') - = icon("chevron-down") - .dropdown-menu.dropdown-select.dropdown-menu-selectable.dropdown-menu-right - = dropdown_title(_("Filter results by project")) - = dropdown_filter(_("Search projects")) - = dropdown_content - = dropdown_loading + %input#js-search-project-dropdown.dropdown-menu-toggle{ value: "Loading...", data: { "initial-data": project_attributes.to_json } } diff --git a/app/views/search/_form.html.haml b/app/views/search/_form.html.haml index 80973c2b273..a9eee1dd2d6 100644 --- a/app/views/search/_form.html.haml +++ b/app/views/search/_form.html.haml @@ -7,9 +7,9 @@ .search-field-holder.form-group.mr-lg-1.mb-lg-0 %label{ for: "dashboard_search" } = _("What are you searching for?") - .position-relative - = search_field_tag :search, params[:search], placeholder: _("Search for projects, issues, etc."), class: "form-control search-text-input js-search-input", id: "dashboard_search", autofocus: true, spellcheck: false - = sprite_icon('search', css_class: 'search-icon') + .gl-search-box-by-type + = search_field_tag :search, params[:search], placeholder: _("Search for projects, issues, etc."), class: "gl-form-input form-control search-text-input js-search-input", id: "dashboard_search", autofocus: true, spellcheck: false + = sprite_icon('search', css_class: 'gl-search-box-by-type-search-icon gl-icon') %button.search-clear.js-search-clear{ class: [("hidden" if params[:search].blank?), "has-tooltip"], type: "button", tabindex: "-1", title: _('Clear') } = sprite_icon('clear') %span.sr-only @@ -17,4 +17,4 @@ - unless params[:snippets].eql? 'true' = render 'filter' .d-flex-center.flex-column.flex-lg-row - = button_tag _("Search"), class: "gl-button btn btn-success btn-search form-control mt-lg-0 ml-lg-1 align-self-end" + = button_tag _("Search"), class: "gl-button btn btn-success btn-search mt-lg-0 ml-lg-1 align-self-end" diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 855112bdba2..80d0253d273 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -1,37 +1,20 @@ +- search_bar_classes = 'search-sidebar gl-display-flex gl-flex-direction-column gl-mr-4' + - if @search_objects.to_a.empty? .gl-display-md-flex - if %w(issues merge_requests).include?(@scope) - #js-search-sidebar.gl-display-flex.gl-flex-direction-column.col-md-3.gl-mr-4{ } - .gl-w-full + #js-search-sidebar{ class: search_bar_classes } + .gl-w-full.gl-flex-fill-1.gl-overflow-x-hidden = render partial: "search/results/empty" = render_if_exists 'shared/promotions/promote_advanced_search' - else - .search-results-status - .row-content-block.gl-display-flex - .gl-display-md-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1 - - unless @search_objects.is_a?(Kaminari::PaginatableWithoutCount) - = search_entries_info(@search_objects, @scope, @search_term) - - unless @show_snippets - - if @project - - link_to_project = link_to(@project.full_name, @project, class: 'ml-md-1') - - if @scope == 'blobs' - = s_("SearchCodeResults|in") - .mx-md-1 - = render partial: "shared/ref_switcher", locals: { ref: repository_ref(@project), form_path: request.fullpath, field_name: 'repository_ref' } - = s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project } - - else - = _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project } - - elsif @group - - link_to_group = link_to(@group.name, @group, class: 'ml-md-1') - = _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group } - .gl-display-md-flex.gl-flex-direction-column - = render partial: 'search/sort_dropdown' + = render partial: 'search/results_status', locals: { search_service: @search_service } = render_if_exists 'shared/promotions/promote_advanced_search' .results.gl-display-md-flex.gl-mt-3 - if %w(issues merge_requests).include?(@scope) - #js-search-sidebar.gl-display-flex.gl-flex-direction-column.col-md-3.gl-mr-4{ } - .gl-w-full + #js-search-sidebar{ class: search_bar_classes } + .gl-w-full.gl-flex-fill-1.gl-overflow-x-hidden - if @scope == 'commits' %ul.content-list.commit-list = render partial: "search/results/commit", collection: @search_objects diff --git a/app/views/search/_results_status.html.haml b/app/views/search/_results_status.html.haml new file mode 100644 index 00000000000..e55f225b162 --- /dev/null +++ b/app/views/search/_results_status.html.haml @@ -0,0 +1,25 @@ +- search_service = local_assigns.fetch(:search_service) + +- return unless search_service.show_results_status? + +.search-results-status + .row-content-block.gl-display-flex + .gl-display-md-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1 + - unless search_service.without_count? + = search_entries_info(search_service.search_objects, search_service.scope, params[:search]) + - unless search_service.show_snippets? + - if search_service.project + - link_to_project = link_to(search_service.project.full_name, search_service.project, class: 'ml-md-1') + - if search_service.scope == 'blobs' + = _("in") + .mx-md-1 + = render partial: "shared/ref_switcher", locals: { ref: repository_ref(search_service.project), form_path: request.fullpath, field_name: 'repository_ref' } + = s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project } + - else + = _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project } + - elsif search_service.group + - link_to_group = link_to(search_service.group.name, search_service.group, class: 'ml-md-1') + = _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group } + - if search_service.show_sort_dropdown? + .gl-display-md-flex.gl-flex-direction-column + = render partial: 'search/sort_dropdown' diff --git a/app/views/search/_sort_dropdown.html.haml b/app/views/search/_sort_dropdown.html.haml index 085e2f348f7..4ae6513d395 100644 --- a/app/views/search/_sort_dropdown.html.haml +++ b/app/views/search/_sort_dropdown.html.haml @@ -1,5 +1,3 @@ -- return unless ['issues', 'merge_requests'].include?(@scope) - - sort_value = @sort - sort_title = search_sort_option_title(sort_value) @@ -8,7 +6,7 @@ .btn-group{ role: 'group' } %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' }, class: 'btn btn-default' } = sort_title - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort %li = render_if_exists('search/sort_by_relevancy', sort_title: sort_title) diff --git a/app/views/shared/_alert_info.html.haml b/app/views/shared/_alert_info.html.haml new file mode 100644 index 00000000000..e47c100909a --- /dev/null +++ b/app/views/shared/_alert_info.html.haml @@ -0,0 +1,6 @@ +.gl-alert.gl-alert-info + = sprite_icon('information-o', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') } + = sprite_icon('close', css_class: 'gl-icon') + .gl-alert-body + = body diff --git a/app/views/shared/_choose_avatar_button.html.haml b/app/views/shared/_choose_avatar_button.html.haml index caf2bdce899..e3f2e1aa436 100644 --- a/app/views/shared/_choose_avatar_button.html.haml +++ b/app/views/shared/_choose_avatar_button.html.haml @@ -1 +1 @@ -= render 'shared/file_picker_button', f: f, field: :avatar, help_text: _("The maximum file size allowed is 200KB.") += render 'shared/file_picker_button', f: f, field: :avatar, help_text: _("Max file size is 200 KB.") diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index 9ec8d3c18cd..fd52f7f40d2 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -1,24 +1,22 @@ -- project = project || @project - .git-clone-holder.js-git-clone-holder.input-group .input-group-prepend - if allowed_protocols_present? .input-group-text.clone-dropdown-btn.btn %span.js-clone-dropdown-label - = enabled_project_button(project, enabled_protocol) + = enabled_protocol_button(container, enabled_protocol) - else %a#clone-dropdown.input-group-text.btn.clone-dropdown-btn.qa-clone-dropdown{ href: '#', data: { toggle: 'dropdown' } } %span.js-clone-dropdown-label = default_clone_protocol.upcase - = icon('caret-down') + = sprite_icon('chevron-down') %ul.dropdown-menu.dropdown-menu-selectable.clone-options-dropdown %li - = ssh_clone_button(project) + = ssh_clone_button(container) %li - = http_clone_button(project) - = render_if_exists 'shared/kerberos_clone_button', project: project + = http_clone_button(container) + = render_if_exists 'shared/kerberos_clone_button', container: container - = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Project clone URL') } + = text_field_tag :clone_url, default_url_to_repo(container), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') } .input-group-append - = clipboard_button(target: '#project_clone', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard") + = clipboard_button(target: '#clone_url', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard") diff --git a/app/views/shared/_file_picker_button.html.haml b/app/views/shared/_file_picker_button.html.haml index 7c9a3bd3d31..8c10e4958b9 100644 --- a/app/views/shared/_file_picker_button.html.haml +++ b/app/views/shared/_file_picker_button.html.haml @@ -1,5 +1,7 @@ +- classes = local_assigns.fetch(:classes, '') + %span.js-filepicker - %button.btn.js-filepicker-button{ type: 'button' }= _("Choose fileā€¦") + %button.btn.js-filepicker-button{ type: 'button', class: classes }= _("Choose fileā€¦") %span.file_name.js-filepicker-filename= _("No file chosen") = f.file_field field, class: "js-filepicker-input hidden" - if help_text.present? diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml index ca603eed703..c3fac5cd464 100644 --- a/app/views/shared/_group_form.html.haml +++ b/app/views/shared/_group_form.html.haml @@ -47,11 +47,3 @@ = f.label :id, class: 'label-bold' do = _("Group ID") = f.text_field :id, class: 'form-control', readonly: true - -.row - .form-group.group-description-holder.col-sm-8 - = f.label :description, class: 'label-bold' do - = _("Group description") - %span (optional) - = f.text_area :description, maxlength: 250, - class: 'form-control js-gfm-input', rows: 4 diff --git a/app/views/shared/_group_form_description.html.haml b/app/views/shared/_group_form_description.html.haml new file mode 100644 index 00000000000..9a895cee884 --- /dev/null +++ b/app/views/shared/_group_form_description.html.haml @@ -0,0 +1,5 @@ +.row + .form-group.group-description-holder.col-sm-8 + = f.label :description, _('Group description (optional)'), class: 'label-bold' + = f.text_area :description, maxlength: 250, + class: 'form-control js-gfm-input', rows: 4 diff --git a/app/views/shared/_issues.html.haml b/app/views/shared/_issues.html.haml index 0f38d0e3b39..57575f89803 100644 --- a/app/views/shared/_issues.html.haml +++ b/app/views/shared/_issues.html.haml @@ -1,7 +1,6 @@ - if @issues.to_a.any? - .card.card-without-border - %ul.content-list.issues-list.issuable-list{ class: ("manual-ordering" if @sort == 'relative_position'), data: { group_full_path: @group&.full_path } } - = render partial: 'projects/issues/issue', collection: @issues + %ul.content-list.issues-list.issuable-list{ class: ("manual-ordering" if @sort == 'relative_position'), data: { group_full_path: @group&.full_path } } + = render partial: 'projects/issues/issue', collection: @issues = paginate @issues, theme: "gitlab" - else = render 'shared/empty_states/issues' diff --git a/app/views/shared/_md_preview.html.haml b/app/views/shared/_md_preview.html.haml index c7c36d79fa0..0976defea1b 100644 --- a/app/views/shared/_md_preview.html.haml +++ b/app/views/shared/_md_preview.html.haml @@ -28,7 +28,7 @@ - if referenced_users .referenced-users.hide %span - = icon("exclamation-triangle") + = sprite_icon('warning-solid') You are about to add %strong %span.js-referenced-users-count 0 diff --git a/app/views/shared/_merge_requests.html.haml b/app/views/shared/_merge_requests.html.haml index d280df8b370..dc8efa3e734 100644 --- a/app/views/shared/_merge_requests.html.haml +++ b/app/views/shared/_merge_requests.html.haml @@ -1,7 +1,6 @@ - if @merge_requests.to_a.any? - .card.card-without-border - %ul.content-list.mr-list.issuable-list - = render partial: 'projects/merge_requests/merge_request', collection: @merge_requests + %ul.content-list.mr-list.issuable-list + = render partial: 'projects/merge_requests/merge_request', collection: @merge_requests = paginate @merge_requests, theme: "gitlab" diff --git a/app/views/shared/_milestones_sort_dropdown.html.haml b/app/views/shared/_milestones_sort_dropdown.html.haml index 06da990e071..29c01343358 100644 --- a/app/views/shared/_milestones_sort_dropdown.html.haml +++ b/app/views/shared/_milestones_sort_dropdown.html.haml @@ -5,7 +5,7 @@ = milestone_sort_options_hash[@sort] - else = sort_title_due_date_soon - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-sort %li = link_to page_filter_path(sort: sort_value_due_date_soon) do diff --git a/app/views/shared/_no_password.html.haml b/app/views/shared/_no_password.html.haml index 76ae63ca5e8..9c1e5a49b44 100644 --- a/app/views/shared/_no_password.html.haml +++ b/app/views/shared/_no_password.html.haml @@ -5,7 +5,7 @@ = sprite_icon('close', size: 16, css_class: 'gl-icon') .gl-alert-body - translation_params = { protocol: gitlab_config.protocol.upcase, set_password_link: link_to_set_password } - - set_password_message = _("You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account") % translation_params + - set_password_message = _("You won't be able to pull or push repositories via %{protocol} until you %{set_password_link} on your account") % translation_params = set_password_message.html_safe .gl-alert-actions = link_to _('Remind later'), '#', class: 'hide-no-password-message btn gl-alert-action btn-info btn-md gl-button' diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml index a083a772233..0a7fa2a3c1e 100644 --- a/app/views/shared/_no_ssh.html.haml +++ b/app/views/shared/_no_ssh.html.haml @@ -4,7 +4,7 @@ %button{ class: 'gl-alert-dismiss hide-no-ssh-message', type: 'button', 'aria-label': _('Dismiss') } = sprite_icon('close', css_class: 'gl-icon s16') .gl-alert-body - = s_("MissingSSHKeyWarningLink|You won't be able to pull or push project code via SSH until you add an SSH key to your profile").html_safe + = s_("MissingSSHKeyWarningLink|You won't be able to pull or push repositories via SSH until you add an SSH key to your profile") .gl-alert-actions = link_to s_('MissingSSHKeyWarningLink|Add SSH key'), profile_keys_path, class: "btn gl-alert-action btn-warning btn-md new-gl-button" = link_to s_("MissingSSHKeyWarningLink|Don't show again"), profile_path(user: {hide_no_ssh_key: true}), method: :put, role: 'button', class: 'btn gl-alert-action btn-md btn-warning gl-button btn-warning-secondary' diff --git a/app/views/shared/_service_settings.html.haml b/app/views/shared/_service_settings.html.haml index 647421a8fbe..194e0eb57f2 100644 --- a/app/views/shared/_service_settings.html.haml +++ b/app/views/shared/_service_settings.html.haml @@ -9,5 +9,5 @@ .service-settings - if @default_integration - .js-vue-default-integration-settings{ data: integration_form_data(@default_integration) } - .js-vue-integration-settings{ data: integration_form_data(integration) } + .js-vue-default-integration-settings{ data: integration_form_data(@default_integration, group: @group) } + .js-vue-integration-settings{ data: integration_form_data(integration, group: @group) } diff --git a/app/views/shared/_web_ide_button.html.haml b/app/views/shared/_web_ide_button.html.haml index 75f5b8647f2..f9c6afcbc32 100644 --- a/app/views/shared/_web_ide_button.html.haml +++ b/app/views/shared/_web_ide_button.html.haml @@ -1,8 +1,8 @@ - type = blob ? 'blob' : 'tree' -.d-inline-block{ data: { options: web_ide_button_data(blob: blob).to_json }, id: "js-#{type}-web-ide-link" } +.d-inline-block{ data: { options: web_ide_button_data({ blob: blob }).to_json }, id: "js-#{type}-web-ide-link" } -- if show_edit_button? +- if show_edit_button?({ blob: blob }) = render 'shared/confirm_fork_modal', fork_path: fork_and_edit_path(@project, @ref, @path), type: 'edit' - if show_web_ide_button? = render 'shared/confirm_fork_modal', fork_path: ide_fork_and_edit_path(@project, @ref, @path), type: 'webide' diff --git a/app/views/shared/access_tokens/_table.html.haml b/app/views/shared/access_tokens/_table.html.haml index 255ec9995db..50daa400e6c 100644 --- a/app/views/shared/access_tokens/_table.html.haml +++ b/app/views/shared/access_tokens/_table.html.haml @@ -42,7 +42,7 @@ = _('In %{time_to_now}') % { time_to_now: distance_of_time_in_words_to_now(token.expires_at) } - else %span.token-never-expires-label= _('Never') - %td= token.scopes.present? ? token.scopes.join(', ') : html_escape_once(_('<no scopes selected>')).html_safe + %td= token.scopes.present? ? token.scopes.join(', ') : _('no scopes selected') %td= link_to _('Revoke'), revoke_route_helper.call(token), method: :put, class: 'btn btn-danger float-right qa-revoke-button', data: { confirm: _('Are you sure you want to revoke this %{type}? This action cannot be undone.') % { type: type } } - else .settings-message.text-center diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml index ce48691166b..e4222d8a4fe 100644 --- a/app/views/shared/boards/_show.html.haml +++ b/app/views/shared/boards/_show.html.haml @@ -13,27 +13,15 @@ - content_for :page_specific_javascripts do %script#js-board-modal-filter{ type: "text/x-template" }= render "shared/issuable/search_bar", type: :boards_modal, show_sorting_dropdown: false - %script#js-board-promotion{ type: "text/x-template" }= render_if_exists "shared/promotions/promote_issue_board" = render 'shared/issuable/search_bar', type: :boards, board: board #board-app.boards-app.position-relative{ "v-cloak" => "true", data: board_data, ":class" => "{ 'is-compact': detailIssueVisible }" } - - if Feature.enabled?(:boards_with_swimlanes, current_board_parent, default_enabled: true) || Feature.enabled?(:graphql_board_lists, current_board_parent) - %board-content{ "v-cloak" => "true", - "ref" => "board_content", - ":lists" => "state.lists", - ":can-admin-list" => can_admin_list, - ":disabled" => "disabled" } - - else - .boards-list.w-100.py-3.px-2.text-nowrap{ data: { qa_selector: "boards_list" } } - .boards-app-loading.w-100.text-center{ "v-if" => "loading" } - = loading_icon(css_class: 'gl-mb-3') - %board{ "v-cloak" => "true", - "v-for" => "list in state.lists", - "ref" => "board", - ":can-admin-list" => can_admin_list, - ":list" => "list", - ":disabled" => "disabled", - ":key" => "list.id" } + %board-content{ "v-cloak" => "true", + "ref" => "board_content", + ":lists" => "state.lists", + ":can-admin-list" => can_admin_list, + ":disabled" => "disabled", + data: { qa_selector: "boards_list" } } = render "shared/boards/components/sidebar", group: group %board-settings-sidebar{ ":can-admin-list" => can_admin_list } - if @project diff --git a/app/views/shared/deploy_tokens/_table.html.haml b/app/views/shared/deploy_tokens/_table.html.haml index ad73442807e..361471af0ad 100644 --- a/app/views/shared/deploy_tokens/_table.html.haml +++ b/app/views/shared/deploy_tokens/_table.html.haml @@ -23,7 +23,7 @@ In #{distance_of_time_in_words_to_now(token.expires_at)} - else %span.token-never-expires-label= _('Never') - %td= token.scopes.present? ? token.scopes.join(", ") : html_escape_once(_('<no scopes selected>')).html_safe + %td= token.scopes.present? ? token.scopes.join(', ') : _('no scopes selected') %td= link_to s_('DeployTokens|Revoke'), "#", class: "btn btn-danger float-right", data: { toggle: "modal", target: "#revoke-modal-#{token.id}"} = render 'shared/deploy_tokens/revoke_modal', token: token, group_or_project: group_or_project - else diff --git a/app/views/shared/groups/_dropdown.html.haml b/app/views/shared/groups/_dropdown.html.haml index 9d2d3ce20c7..75c34102935 100644 --- a/app/views/shared/groups/_dropdown.html.haml +++ b/app/views/shared/groups/_dropdown.html.haml @@ -1,24 +1,17 @@ - options_hash = local_assigns.fetch(:options_hash, groups_sort_options_hash) - show_archive_options = local_assigns.fetch(:show_archive_options, false) -- if @sort.present? - - default_sort_by = @sort -- else - - if params[:sort] - - default_sort_by = params[:sort] - - else - - default_sort_by = sort_value_recently_created .dropdown.inline.js-group-filter-dropdown-wrap.gl-mr-3 %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' } %span.dropdown-label - = options_hash[default_sort_by] - = icon('chevron-down') + = options_hash[project_list_sort_by] + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable %li.dropdown-header = _("Sort by") - options_hash.each do |value, title| %li.js-filter-sort-order - = link_to filter_groups_path(sort: value), class: ("is-active" if default_sort_by == value) do + = link_to filter_groups_path(sort: value), class: ("is-active" if project_list_sort_by == value) do = title - if show_archive_options %li.divider diff --git a/app/views/shared/groups/_visibility_level.html.haml b/app/views/shared/groups/_visibility_level.html.haml new file mode 100644 index 00000000000..1a13de9b76a --- /dev/null +++ b/app/views/shared/groups/_visibility_level.html.haml @@ -0,0 +1,3 @@ += f.label :visibility_level, class: 'label-bold' do + = _('Visibility level') +.js-visibility-level-dropdown{ data: { visibility_level_options: visibility_level_options(@group).to_json, default_level: f.object.visibility_level } } diff --git a/app/views/shared/icons/_icon_mattermost.svg b/app/views/shared/icons/_icon_mattermost.svg index d1c541523ab..3cf10851003 100644 --- a/app/views/shared/icons/_icon_mattermost.svg +++ b/app/views/shared/icons/_icon_mattermost.svg @@ -1 +1 @@ - + diff --git a/app/views/shared/integrations/_index.html.haml b/app/views/shared/integrations/_index.html.haml index 2f299ad5c89..edc85f04d91 100644 --- a/app/views/shared/integrations/_index.html.haml +++ b/app/views/shared/integrations/_index.html.haml @@ -1,4 +1,4 @@ -%table.table.b-table.gl-table.mt-3{ role: 'table', 'aria-busy': false, 'aria-colcount': 4 } +%table.table.b-table.gl-table{ role: 'table', 'aria-busy': false, 'aria-colcount': 4 } %colgroup %col %col @@ -15,11 +15,10 @@ - integrations.each do |integration| - activated_label = (integration.activated? ? s_("ProjectService|%{service_title}: status on") : s_("ProjectService|%{service_title}: status off")) % { service_title: integration.title } %tr{ role: 'row' } - %td{ role: 'cell', 'aria-colindex': 1, 'aria-label': activated_label } + %td{ role: 'cell', 'aria-colindex': 1, 'aria-label': activated_label, title: activated_label } = boolean_to_icon integration.operating? %td{ role: 'cell', 'aria-colindex': 2 } - = link_to scoped_edit_integration_path(integration), { data: { qa_selector: "#{integration.to_param}_link" } } do - %strong= integration.title + = link_to integration.title, scoped_edit_integration_path(integration), class: 'gl-font-weight-bold', data: { qa_selector: "#{integration.to_param}_link" } %td.d-none.d-sm-table-cell{ role: 'cell', 'aria-colindex': 3 } = integration.description %td{ role: 'cell', 'aria-colindex': 4 } diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml index 09abe9e89c4..2f30958c877 100644 --- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml +++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml @@ -1,5 +1,5 @@ - type = local_assigns.fetch(:type) -- bulk_issue_health_status_flag = Feature.enabled?(:bulk_update_health_status, @project&.group, default_enabled: true) && type == :issues && @project&.group&.feature_available?(:issuable_health_status) +- bulk_issue_health_status_flag = type == :issues && @project&.group&.feature_available?(:issuable_health_status) - epic_bulk_edit_flag = @project&.group&.feature_available?(:epics) && type == :issues %aside.issues-bulk-update.js-right-sidebar.right-sidebar{ "aria-live" => "polite", data: { 'signed-in': current_user.present? } } diff --git a/app/views/shared/issuable/_close_reopen_button.html.haml b/app/views/shared/issuable/_close_reopen_button.html.haml deleted file mode 100644 index 3453db9f209..00000000000 --- a/app/views/shared/issuable/_close_reopen_button.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -- is_current_user = issuable_author_is_current_user(issuable) -- display_issuable_type = issuable_display_type(issuable) -- are_close_and_open_buttons_hidden = issuable_button_hidden?(issuable, true) && issuable_button_hidden?(issuable, false) -- add_blocked_class = false -- if defined? warn_before_close - - add_blocked_class = warn_before_close - -- if is_current_user && !issuable.is_a?(MergeRequest) - - if can_update - %button{ class: "d-none d-md-block btn btn-grouped btn-close js-btn-issue-action #{issuable_button_visibility(issuable, true)} #{(add_blocked_class ? 'btn-issue-blocked' : '')}", - data: { remote: 'true', endpoint: close_issuable_path(issuable), qa_selector: 'close_issue_button' } } - = _("Close %{display_issuable_type}") % { display_issuable_type: display_issuable_type } - - if can_reopen - %button{ class: "d-none d-md-block btn btn-grouped btn-reopen js-btn-issue-action #{issuable_button_visibility(issuable, false)}", - data: { remote: 'true', endpoint: reopen_issuable_path(issuable), qa_selector: 'reopen_issue_button' } } - = _("Reopen %{display_issuable_type}") % { display_issuable_type: display_issuable_type } -- else - - if can_update && !are_close_and_open_buttons_hidden - - if issuable.is_a?(MergeRequest) - = render 'shared/issuable/close_reopen_draft_report_toggle', issuable: issuable - - else - = render 'shared/issuable/close_reopen_report_toggle', issuable: issuable, warn_before_close: add_blocked_class - - else - - unless issuable.is_a?(MergeRequest) && issuable.merged? - = link_to _('Report abuse'), new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)), - class: 'd-none d-md-block btn btn-grouped btn-close-color', title: _('Report abuse') diff --git a/app/views/shared/issuable/_close_reopen_draft_report_toggle.html.haml b/app/views/shared/issuable/_close_reopen_draft_report_toggle.html.haml deleted file mode 100644 index bdb53dfe323..00000000000 --- a/app/views/shared/issuable/_close_reopen_draft_report_toggle.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -- display_issuable_type = issuable_display_type(issuable) -- button_action_class = issuable.closed? ? 'btn-default' : 'btn-warning btn-warning-secondary' -- button_class = "btn gl-button #{!issuable.closed? && 'js-draft-toggle-button'}" -- toggle_class = "btn gl-button dropdown-toggle" - -.float-left.btn-group.gl-ml-3.issuable-close-dropdown.d-none.d-md-inline-flex.js-issuable-close-dropdown - = link_to issuable.closed? ? reopen_issuable_path(issuable) : toggle_draft_issuable_path(issuable), method: :put, class: "#{button_class} #{button_action_class}" do - - if issuable.closed? - = _('Reopen') - = display_issuable_type - - else - = issuable.work_in_progress? ? _('Mark as ready') : _('Mark as draft') - - - if !issuable.closed? || !issuable_author_is_current_user(issuable) - = button_tag type: 'button', class: "#{toggle_class} #{button_action_class}", data: { 'toggle' => 'dropdown' } do - %span.sr-only= _('Toggle dropdown') - = sprite_icon "angle-down", size: 12 - - %ul.js-issuable-close-menu.dropdown-menu.dropdown-menu-right - - if issuable.open? - %li - = link_to close_issuable_path(issuable), method: :put do - .description - %strong.title - = _('Close') - = display_issuable_type - - - unless issuable_author_is_current_user(issuable) - - unless issuable.closed? - %li.divider.droplab-item-ignore - - %li.report-item - %a.report-abuse-link{ href: new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)) } - .description - %strong.title= _('Report abuse') - %p.text - = _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize } diff --git a/app/views/shared/issuable/_close_reopen_report_toggle.html.haml b/app/views/shared/issuable/_close_reopen_report_toggle.html.haml deleted file mode 100644 index 48d1e146629..00000000000 --- a/app/views/shared/issuable/_close_reopen_report_toggle.html.haml +++ /dev/null @@ -1,47 +0,0 @@ -- display_issuable_type = issuable_display_type(issuable) -- button_action = issuable.closed? ? 'reopen' : 'close' -- display_button_action = button_action.capitalize -- button_responsive_class = 'd-none d-md-block' -- button_class = "#{button_responsive_class} btn btn-grouped js-issuable-close-button js-btn-issue-action issuable-close-button" -- toggle_class = "#{button_responsive_class} btn btn-nr dropdown-toggle js-issuable-close-toggle" -- add_blocked_class = false -- if defined? warn_before_close - - add_blocked_class = !issuable.closed? && warn_before_close - -.float-left.btn-group.gl-ml-3.issuable-close-dropdown.droplab-dropdown.js-issuable-close-dropdown - %button{ class: "#{button_class} btn-#{button_action} #{(add_blocked_class ? 'btn-issue-blocked' : '')}", data: { testid: 'close-issue-button', qa_selector: 'close_issue_button', endpoint: close_reopen_issuable_path(issuable) } } - #{display_button_action} #{display_issuable_type} - - = button_tag type: 'button', class: "#{toggle_class} btn-#{button_action}-color", - data: { 'dropdown-trigger' => '#issuable-close-menu' }, 'aria-label' => _('Toggle dropdown') do - = icon('caret-down', class: 'toggle-icon icon') - - %ul#issuable-close-menu.js-issuable-close-menu.dropdown-menu{ data: { dropdown: true } } - %li.close-item{ class: "#{issuable_button_visibility(issuable, true) || 'droplab-item-selected'}", - data: { text: _("Close %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, url: close_issuable_path(issuable), - button_class: "#{button_class} btn-close", toggle_class: "#{toggle_class} btn-close-color" } } - %button.btn.btn-transparent - = sprite_icon('check', css_class: 'icon') - .description - %strong.title - = _('Close') - = display_issuable_type - - %li.reopen-item{ class: "#{issuable_button_visibility(issuable, false) || 'droplab-item-selected'}", - data: { text: _("Reopen %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, url: reopen_issuable_path(issuable), - button_class: "#{button_class} btn-reopen", toggle_class: "#{toggle_class} btn-reopen-color" } } - %button.btn.btn-transparent - = sprite_icon('check', css_class: 'icon') - .description - %strong.title - = _('Reopen') - = display_issuable_type - - %li.divider.droplab-item-ignore - - %li.report-item{ data: { text: _('Report abuse'), button_class: "#{button_class} btn-close-color", toggle_class: "#{toggle_class} btn-close-color", method: '' } } - %a.report-abuse-link{ :href => new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)) } - .description - %strong.title= _('Report abuse') - %p.text - = _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize } diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index c0aba0eef7f..552f83906e1 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -32,7 +32,7 @@ = form.label :confidential, class: 'form-check-label' do This issue is confidential and should only be visible to team members with at least Reporter access. -= render 'shared/issuable/form/metadata', issuable: issuable, form: form, project: project += render 'shared/issuable/form/metadata', issuable: issuable, form: form, project: project, presenter: presenter = render_if_exists 'shared/issuable/approvals', issuable: issuable, presenter: presenter, form: form @@ -88,3 +88,6 @@ = form.hidden_field :issue_type = form.hidden_field :lock_version + +- if @vulnerability_id + = hidden_field_tag 'vulnerability_id', @vulnerability_id diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml index 00b235809ed..79d86500bd9 100644 --- a/app/views/shared/issuable/_search_bar.html.haml +++ b/app/views/shared/issuable/_search_bar.html.haml @@ -75,6 +75,22 @@ = render 'shared/issuable/user_dropdown_item', user: User.new(username: '{{username}}', name: '{{name}}'), avatar: { lazy: true, url: '{{avatar_url}}' } + #js-dropdown-reviewer.filtered-search-input-dropdown-menu.dropdown-menu + %ul{ data: { dropdown: true } } + %li.filter-dropdown-item{ data: { value: 'None' } } + %button.btn.btn-link{ type: 'button' } + = _('None') + %li.filter-dropdown-item{ data: { value: 'Any' } } + %button.btn.btn-link{ type: 'button' } + = _('Any') + %li.divider.droplab-item-ignore + - if current_user + = render 'shared/issuable/user_dropdown_item', + user: current_user + %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } } + = render 'shared/issuable/user_dropdown_item', + user: User.new(username: '{{username}}', name: '{{name}}'), + avatar: { lazy: true, url: '{{avatar_url}}' } = render_if_exists 'shared/issuable/approver_dropdown' = render_if_exists 'shared/issuable/approved_by_dropdown' #js-dropdown-milestone.filtered-search-input-dropdown-menu.dropdown-menu @@ -182,7 +198,7 @@ = render 'shared/issuable/board_create_list_dropdown', board: board - if @project #js-add-issues-btn.gl-ml-3{ data: { can_admin_list: can?(current_user, :admin_list, @project) } } - - if current_user && Feature.enabled?(:boards_with_swimlanes, @group, default_enabled: true) + - if current_user #js-board-epics-swimlanes-toggle #js-toggle-focus-btn - elsif is_not_boards_modal_or_productivity_analytics && show_sorting_dropdown diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index 1f20c1a30aa..cd265c10451 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -25,7 +25,7 @@ .block.assignee.qa-assignee-block = render "shared/issuable/sidebar_assignees", issuable_sidebar: issuable_sidebar, assignees: assignees, signed_in: signed_in - - if Feature.enabled?(:merge_request_reviewers, @project) && reviewers + - if Feature.enabled?(:merge_request_reviewers, @project, default_enabled: true) && reviewers .block.reviewer.qa-reviewer-block = render "shared/issuable/sidebar_reviewers", issuable_sidebar: issuable_sidebar, reviewers: reviewers, signed_in: signed_in @@ -58,7 +58,7 @@ = f.hidden_field 'milestone_id', value: milestone[:id], id: nil = dropdown_tag('Milestone', options: { title: _('Assign milestone'), toggle_class: 'js-milestone-select js-extra-options', filter: true, dropdown_class: 'dropdown-menu-selectable', placeholder: _('Search milestones'), data: { show_no: true, field_name: "#{issuable_type}[milestone_id]", project_id: issuable_sidebar[:project_id], issuable_id: issuable_sidebar[:id], ability_name: issuable_type, issue_update: issuable_sidebar[:issuable_json_path], use_id: true, default_no: true, selected: milestone[:title], null_default: true, display: 'static' }}) - if @project.group.present? - = render_if_exists 'shared/issuable/iteration_select', { can_edit: can_edit_issuable, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type } + = render_if_exists 'shared/issuable/iteration_select', can_edit: can_edit_issuable, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type - if issuable_sidebar[:supports_time_tracking] #issuable-time-tracker.block diff --git a/app/views/shared/issuable/form/_branch_chooser.html.haml b/app/views/shared/issuable/form/_branch_chooser.html.haml index 94fa43746e2..a425f5f810e 100644 --- a/app/views/shared/issuable/form/_branch_chooser.html.haml +++ b/app/views/shared/issuable/form/_branch_chooser.html.haml @@ -2,7 +2,7 @@ - form = local_assigns.fetch(:form) - return unless issuable.is_a?(MergeRequest) -- return if issuable.closed_without_fork? +- return if issuable.closed_or_merged_without_fork? - source_title, target_title = format_mr_branch_names(@merge_request) diff --git a/app/views/shared/issuable/form/_merge_params.html.haml b/app/views/shared/issuable/form/_merge_params.html.haml index e29627304b4..7233e671caa 100644 --- a/app/views/shared/issuable/form/_merge_params.html.haml +++ b/app/views/shared/issuable/form/_merge_params.html.haml @@ -2,7 +2,7 @@ - project = local_assigns.fetch(:project) - return unless issuable.is_a?(MergeRequest) -- return if issuable.closed_without_fork? +- return if issuable.closed_or_merged_without_fork? .form-group.row .col-sm-2.col-form-label.pt-sm-0 diff --git a/app/views/shared/issuable/form/_metadata.html.haml b/app/views/shared/issuable/form/_metadata.html.haml index 459eb112e4f..366e819d252 100644 --- a/app/views/shared/issuable/form/_metadata.html.haml +++ b/app/views/shared/issuable/form/_metadata.html.haml @@ -1,5 +1,6 @@ - project = local_assigns.fetch(:project) - issuable = local_assigns.fetch(:issuable) +- presenter = local_assigns.fetch(:presenter) - return unless can?(current_user, :"admin_#{issuable.to_ability_name}", issuable.project) @@ -14,7 +15,7 @@ - if issuable.allows_reviewers? .form-group.row.merge-request-reviewer - = render "shared/issuable/form/metadata_issuable_reviewer", issuable: issuable, form: form, has_due_date: has_due_date + = render "shared/issuable/form/metadata_issuable_reviewer", issuable: issuable, form: form, has_due_date: has_due_date, presenter: presenter = render_if_exists "shared/issuable/form/epic", issuable: issuable, form: form, project: project diff --git a/app/views/shared/issuable/form/_metadata_issuable_assignee.html.haml b/app/views/shared/issuable/form/_metadata_issuable_assignee.html.haml index 60dc893d9f9..b437ee1ec5f 100644 --- a/app/views/shared/issuable/form/_metadata_issuable_assignee.html.haml +++ b/app/views/shared/issuable/form/_metadata_issuable_assignee.html.haml @@ -1,4 +1,4 @@ -= form.label :assignee_id, "Assignee", class: "col-form-label #{has_due_date ? "col-md-2 col-lg-4" : "col-sm-2"}" += form.label :assignee_id, issuable.allows_multiple_assignees? ? _('Assignees') : _('Assignee'), class: "col-form-label #{has_due_date ? "col-md-2 col-lg-4" : "col-sm-2"}" .col-sm-10{ class: ("col-md-8" if has_due_date) } .issuable-form-select-holder.selectbox - issuable.assignees.each do |assignee| diff --git a/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml b/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml index a8b033bba36..a0df007f8ca 100644 --- a/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml +++ b/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml @@ -1,5 +1,5 @@ -= form.label :reviewer_id, "Reviewer", class: "col-form-label #{has_due_date ? "col-md-2 col-lg-4" : "col-sm-2"}" -.col-sm-10{ class: ("col-md-8" if has_due_date) } += form.label :reviewer_id, issuable.allows_multiple_reviewers? ? _('Reviewers') : _('Reviewer'), class: "col-form-label #{has_due_date ? "col-md-2 col-lg-4" : "col-sm-2"}" +.col-sm-10.gl-mb-2{ class: ("col-md-8" if has_due_date) } .issuable-form-select-holder.selectbox - issuable.reviewers.each do |reviewer| = hidden_field_tag "#{issuable.to_ability_name}[reviewer_ids][]", reviewer.id, id: nil, data: { meta: reviewer.name, avatar_url: reviewer.avatar_url, name: reviewer.name, username: reviewer.username } @@ -7,4 +7,6 @@ - if issuable.reviewers.empty? = hidden_field_tag "#{issuable.to_ability_name}[reviewer_ids][]", 0, id: nil, data: { meta: '' } - = dropdown_tag(users_dropdown_label(issuable.reviewers), options: reviewers_dropdown_options(issuable.to_ability_name)) + = dropdown_tag(users_dropdown_label(issuable.reviewers), options: reviewers_dropdown_options(issuable.to_ability_name, issuable.iid, issuable.target_branch)) + - if Feature.enabled?(:mr_collapsed_approval_rules, @project) + = render_if_exists 'shared/issuable/approver_suggestion', issuable: issuable, presenter: presenter diff --git a/app/views/shared/issuable/form/_type_selector.html.haml b/app/views/shared/issuable/form/_type_selector.html.haml index 5d64c15d9f9..67bc4019a82 100644 --- a/app/views/shared/issuable/form/_type_selector.html.haml +++ b/app/views/shared/issuable/form/_type_selector.html.haml @@ -13,7 +13,7 @@ .dropdown-title.gl-display-flex %span.gl-ml-auto = _("Select type") - %button.dropdown-title-button.dropdown-menu-close.gl-ml-auto{ "aria-label" => _('Close') } + %button.dropdown-title-button.dropdown-menu-close.gl-ml-auto{ type: 'button', "aria-label" => _('Close') } = sprite_icon('close', size: 16, css_class: 'dropdown-menu-close-icon') .dropdown-content %ul diff --git a/app/views/shared/issue_type/_details_header.html.haml b/app/views/shared/issue_type/_details_header.html.haml index ea4df288839..d6226760ba5 100644 --- a/app/views/shared/issue_type/_details_header.html.haml +++ b/app/views/shared/issue_type/_details_header.html.haml @@ -1,10 +1,3 @@ -- can_update_issue = can?(current_user, :update_issue, issuable) -- can_reopen_issue = can?(current_user, :reopen_issue, issuable) -- can_report_spam = issuable.submittable_as_spam_by?(current_user) -- can_create_issue = show_new_issue_link?(@project) -- display_issuable_type = issuable_display_type(issuable) -- new_issuable_params = ({ issuable_template: 'incident', issue: { issue_type: 'incident' } } if issuable.incident?) - .detail-page-header .detail-page-header-body .issuable-status-box.status-box.status-box-issue-closed{ class: issue_status_visibility(issuable, status_box: :closed) } @@ -18,38 +11,9 @@ .issuable-meta #js-issuable-header-warnings - = issuable_meta(issuable, @project, display_issuable_type) + = issuable_meta(issuable, @project) %a.btn.gl-button.btn-default.float-right.gl-display-block.d-sm-none.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ href: "#" } = sprite_icon('chevron-double-lg-left') - - if Feature.enabled?(:vue_issue_header, @project, default_enabled: true) - .js-issue-header-actions{ data: issue_header_actions_data(@project, issuable, current_user) } - - else - .detail-page-header-actions.js-issuable-actions.js-issuable-buttons{ data: { "action": "close-reopen" } } - .clearfix.issue-btn-group.dropdown - %button.btn.gl-button.btn-default.float-left.gl-display-md-none{ type: "button", data: { toggle: "dropdown" } } - = _('Options') - = icon('caret-down') - .dropdown-menu.dropdown-menu-right - %ul - - unless current_user == issuable.author - %li= link_to _('Report abuse'), new_abuse_report_path(user_id: issuable.author.id, ref_url: issue_url(issuable)) - - if can_update_issue - %li= link_to _('Close %{display_issuable_type}') % { display_issuable_type: display_issuable_type }, issue_path(issuable, issue: { state_event: :close }, format: 'json'), class: "btn-close js-btn-issue-action #{issue_button_visibility(issuable, true)}", title: _('Close %{display_issuable_type}') % { display_issuable_type: display_issuable_type }, data: { endpoint: close_reopen_issuable_path(issuable) } - - if can_reopen_issue - %li= link_to _('Reopen %{display_issuable_type}') % { display_issuable_type: display_issuable_type }, issue_path(issuable, issue: { state_event: :reopen }, format: 'json'), class: "btn-reopen js-btn-issue-action #{issue_button_visibility(issuable, false)}", title: _('Reopen %{display_issuable_type}') % { display_issuable_type: display_issuable_type }, data: { endpoint: close_reopen_issuable_path(issuable) } - - if can_report_spam - %li= link_to _('Submit as spam'), mark_as_spam_project_issue_path(@project, issuable), method: :post, class: 'btn-spam', title: 'Submit as spam' - - if can_create_issue - - if can_update_issue || can_report_spam - %li.divider - %li= link_to _('New %{display_issuable_type}') % { display_issuable_type: display_issuable_type }, new_project_issue_path(@project, new_issuable_params), id: 'new_%{display_issuable_type}_link' % { display_issuable_type: display_issuable_type } - - = render 'shared/issuable/close_reopen_button', issuable: issuable, can_update: can_update_issue, can_reopen: can_reopen_issue, warn_before_close: defined?(issuable.blocked?) && issuable.blocked? - - - if can_report_spam - = link_to _('Submit as spam'), mark_as_spam_project_issue_path(@project, issuable), method: :post, class: 'gl-display-none gl-display-md-block gl-button btn btn-grouped btn-spam', title: 'Submit as spam' - - if can_create_issue - = link_to new_project_issue_path(@project, new_issuable_params), class: 'gl-display-none gl-display-md-block gl-button btn btn-grouped btn-success btn-inverted', title: _('New %{display_issuable_type}') % { display_issuable_type: display_issuable_type }, id: 'new_%{display_issuable_type}_link' % { display_issuable_type: display_issuable_type } do - = _('New %{display_issuable_type}') % { display_issuable_type: display_issuable_type } + .js-issue-header-actions{ data: issue_header_actions_data(@project, issuable, current_user) } diff --git a/app/views/shared/labels/_sort_dropdown.html.haml b/app/views/shared/labels/_sort_dropdown.html.haml index 07e96eea062..cfc00bd41ca 100644 --- a/app/views/shared/labels/_sort_dropdown.html.haml +++ b/app/views/shared/labels/_sort_dropdown.html.haml @@ -2,7 +2,7 @@ .dropdown.inline %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown' } } = sort_title - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-sort %li - label_sort_options_hash.each do |value, title| diff --git a/app/views/shared/members/_group.html.haml b/app/views/shared/members/_group.html.haml index 42e12d92a7d..d98ba074687 100644 --- a/app/views/shared/members/_group.html.haml +++ b/app/views/shared/members/_group.html.haml @@ -27,7 +27,7 @@ data: { toggle: "dropdown", field_name: "group_link[group_access]" } } %span.dropdown-toggle-text = group_link.human_access - = icon("chevron-down") + = sprite_icon("chevron-down", css_class: "dropdown-menu-toggle-icon gl-top-3") .dropdown-menu.dropdown-select.dropdown-menu-right.dropdown-menu-selectable = dropdown_title(_("Change permissions")) .dropdown-content diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml index e294936f82c..79bbb74d601 100644 --- a/app/views/shared/members/_member.html.haml +++ b/app/views/shared/members/_member.html.haml @@ -79,7 +79,7 @@ data: { toggle: "dropdown", field_name: "#{f.object_name}[access_level]", qa_selector: "access_level_dropdown" } } %span.dropdown-toggle-text = member.human_access - = icon("chevron-down") + = sprite_icon("chevron-down", css_class: "dropdown-menu-toggle-icon gl-top-3") .dropdown-menu.dropdown-select.dropdown-menu-right.dropdown-menu-selectable = dropdown_title(_("Change permissions")) .dropdown-content diff --git a/app/views/shared/milestones/_header.html.haml b/app/views/shared/milestones/_header.html.haml index 93da319fce7..19ca00ce482 100644 --- a/app/views/shared/milestones/_header.html.haml +++ b/app/views/shared/milestones/_header.html.haml @@ -28,7 +28,7 @@ - if milestone.active? = link_to _('Close milestone'), update_milestone_path(milestone, { state_event: :close }), method: :put, class: 'btn gl-button btn-grouped btn-close' - else - = link_to _('Reopen milestone'), update_milestone_path(milestone, { state_event: :activate }), method: :put, class: 'btn gl-button btn-grouped btn-reopen' + = link_to _('Reopen milestone'), update_milestone_path(milestone, { state_event: :activate }), method: :put, class: 'btn gl-button btn-grouped' = render 'shared/milestones/delete_button' diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml index 1597a011a45..92ac6929e6a 100644 --- a/app/views/shared/milestones/_milestone.html.haml +++ b/app/views/shared/milestones/_milestone.html.haml @@ -59,6 +59,6 @@ - if can?(current_user, :admin_milestone, milestone) - if milestone.closed? - = link_to s_('Milestones|Reopen Milestone'), milestone_path(milestone, milestone: { state_event: :activate }), method: :put, class: "btn gl-button btn-sm btn-grouped btn-reopen" + = link_to s_('Milestones|Reopen Milestone'), milestone_path(milestone, milestone: { state_event: :activate }), method: :put, class: "btn gl-button btn-sm btn-grouped" - else = link_to s_('Milestones|Close Milestone'), milestone_path(milestone, milestone: { state_event: :close }), method: :put, class: "btn gl-button btn-warning-secondary btn-sm btn-grouped btn-close" diff --git a/app/views/shared/notes/_comment_button.html.haml b/app/views/shared/notes/_comment_button.html.haml index 45af4b51b27..eb03608e18a 100644 --- a/app/views/shared/notes/_comment_button.html.haml +++ b/app/views/shared/notes/_comment_button.html.haml @@ -1,11 +1,11 @@ - noteable_name = @note.noteable.human_class_name .float-left.btn-group.gl-mr-3.droplab-dropdown.comment-type-dropdown.js-comment-type-dropdown - %input.btn.btn-nr.btn-success.js-comment-button.js-comment-submit-button{ type: 'submit', value: _('Comment'), data: { qa_selector: 'comment_button' } } + %input.btn.btn-success.js-comment-button.js-comment-submit-button{ type: 'submit', value: _('Comment'), data: { qa_selector: 'comment_button' } } - if @note.can_be_discussion_note? - = button_tag type: 'button', class: 'btn btn-nr dropdown-toggle btn-success js-note-new-discussion js-disable-on-submit', data: { 'dropdown-trigger' => '#resolvable-comment-menu' }, 'aria-label' => _('Open comment type dropdown') do - = icon('caret-down', class: 'toggle-icon') + = button_tag type: 'button', class: 'btn dropdown-toggle btn-success js-note-new-discussion js-disable-on-submit', data: { 'dropdown-trigger' => '#resolvable-comment-menu' }, 'aria-label' => _('Open comment type dropdown') do + = sprite_icon('chevron-down') %ul#resolvable-comment-menu.dropdown-menu.dropdown-open-top{ data: { dropdown: true } } %li#comment.droplab-item-selected{ data: { value: '', 'submit-text' => _('Comment'), 'close-text' => _("Comment & close %{noteable_name}") % { noteable_name: noteable_name }, 'reopen-text' => _("Comment & reopen %{noteable_name}") % { noteable_name: noteable_name } } } diff --git a/app/views/shared/notes/_edit_form.html.haml b/app/views/shared/notes/_edit_form.html.haml index 79feb12bed5..d783fa0d777 100644 --- a/app/views/shared/notes/_edit_form.html.haml +++ b/app/views/shared/notes/_edit_form.html.haml @@ -9,6 +9,6 @@ .note-form-actions.clearfix .settings-message.note-edit-warning.js-finish-edit-warning = _("Finish editing this message first!") - = submit_tag _('Save comment'), class: 'btn btn-nr btn-success js-comment-save-button', data: { qa_selector: 'save_comment_button' } - %button.btn.btn-nr.btn-cancel.note-edit-cancel{ type: 'button' } + = submit_tag _('Save comment'), class: 'btn btn-success js-comment-save-button', data: { qa_selector: 'save_comment_button' } + %button.btn.btn-cancel.note-edit-cancel{ type: 'button' } = _("Cancel") diff --git a/app/views/shared/notes/_form.html.haml b/app/views/shared/notes/_form.html.haml index f1686417f8d..2cf074b9d3f 100644 --- a/app/views/shared/notes/_form.html.haml +++ b/app/views/shared/notes/_form.html.haml @@ -38,7 +38,5 @@ .note-form-actions.clearfix = render partial: 'shared/notes/comment_button' - = yield(:note_actions) - %a.btn.btn-cancel.js-close-discussion-note-form.hide{ role: "button", data: { cancel_text: _("Cancel") } } = _('Cancel') diff --git a/app/views/shared/notifications/_button.html.haml b/app/views/shared/notifications/_button.html.haml index d7b53810f76..e12531b8a8d 100644 --- a/app/views/shared/notifications/_button.html.haml +++ b/app/views/shared/notifications/_button.html.haml @@ -20,8 +20,8 @@ %button.dropdown-new.btn.btn-default.btn-icon.gl-button.has-tooltip.notifications-btn.text-left#notifications-button{ type: "button", title: button_title, class: "#{btn_class}", "aria-label" => aria_label, data: { container: "body", toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting), display: 'static' } } = sprite_icon("notifications", css_class: "js-notification-loading") = notification_title(notification_setting.level) - %button.btn.dropdown-toggle.d-flex{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" } } - = icon('caret-down') + %button.btn.dropdown-toggle.gl-display-flex.gl-align-items-center{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" } } + = sprite_icon('chevron-down') .sr-only Toggle dropdown - else %button.dropdown-new.btn.btn-default.btn-icon.gl-button.has-tooltip.notifications-btn#notifications-button{ type: "button", title: button_title, class: "#{btn_class}", "aria-label" => aria_label, data: { container: "body", toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" } } @@ -29,7 +29,7 @@ = sprite_icon("notifications", css_class: "js-notification-loading") = notification_title(notification_setting.level) .float-right - = icon("caret-down") + = sprite_icon("chevron-down") = render "shared/notifications/notification_dropdown", notification_setting: notification_setting diff --git a/app/views/shared/projects/_sort_dropdown.html.haml b/app/views/shared/projects/_sort_dropdown.html.haml index f5f940db189..3e810dc6f08 100644 --- a/app/views/shared/projects/_sort_dropdown.html.haml +++ b/app/views/shared/projects/_sort_dropdown.html.haml @@ -5,7 +5,7 @@ .btn-group.w-100.dropdown.js-project-filter-dropdown-wrap{ role: "group" } %button#sort-projects-dropdown.btn.btn-default.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' } } = toggle_text - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3') %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable %li.dropdown-header = _("Sort by") diff --git a/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml b/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml index eafc402f210..cb954c20b48 100644 --- a/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml +++ b/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml @@ -1,3 +1,5 @@ +- select_mode_for_dropdown = Feature.enabled?(:deploy_keys_on_protected_branches, protected_branch.project) ? 'js-multiselect' : '' + - merge_access_levels = protected_branch.merge_access_levels.for_role - push_access_levels = protected_branch.push_access_levels.for_role @@ -23,7 +25,7 @@ %td.push_access_levels-container = hidden_field_tag "allowed_to_push_#{protected_branch.id}", push_access_levels.first&.access_level = dropdown_tag( (push_access_levels.first&.humanize || 'Select') , - options: { toggle_class: 'js-allowed-to-push', dropdown_class: 'dropdown-menu-selectable js-allowed-to-push-container capitalize-header', + options: { toggle_class: "js-allowed-to-push #{select_mode_for_dropdown}", dropdown_class: 'dropdown-menu-selectable js-allowed-to-push-container capitalize-header', data: { field_name: "allowed_to_push_#{protected_branch.id}", preselected_items: access_levels_data(push_access_levels) }}) - if user_push_access_levels.any? %p.small diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml index c5234f14090..c37a34f9be8 100644 --- a/app/views/shared/web_hooks/_form.html.haml +++ b/app/views/shared/web_hooks/_form.html.haml @@ -10,89 +10,91 @@ = s_('Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header.') .form-group = form.label :url, s_('Webhooks|Trigger'), class: 'label-bold' - %ul.list-unstyled.prepend-left-20 + %ul.list-unstyled.gl-ml-6 %li = form.check_box :push_events, class: 'form-check-input' - = form.label :push_events, class: 'list-label form-check-label ml-1' do + = form.label :push_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Push events') = form.text_field :push_events_branch_filter, class: 'form-control', placeholder: 'Branch name or wildcard pattern to trigger on (leave blank for all)' - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered by a push to the repository') %li = form.check_box :tag_push_events, class: 'form-check-input' - = form.label :tag_push_events, class: 'list-label form-check-label ml-1' do + = form.label :tag_push_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Tag push events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when a new tag is pushed to the repository') %li = form.check_box :note_events, class: 'form-check-input' - = form.label :note_events, class: 'list-label form-check-label ml-1' do + = form.label :note_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Comments') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when someone adds a comment') %li = form.check_box :confidential_note_events, class: 'form-check-input' - = form.label :confidential_note_events, class: 'list-label form-check-label ml-1' do + = form.label :confidential_note_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Confidential Comments') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when someone adds a comment on a confidential issue') %li = form.check_box :issues_events, class: 'form-check-input' - = form.label :issues_events, class: 'list-label form-check-label ml-1' do + = form.label :issues_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Issues events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when an issue is created/updated/merged') %li = form.check_box :confidential_issues_events, class: 'form-check-input' - = form.label :confidential_issues_events, class: 'list-label form-check-label ml-1' do + = form.label :confidential_issues_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Confidential Issues events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when a confidential issue is created/updated/merged') + - if @group + = render_if_exists 'groups/hooks/member_events', form: form %li = form.check_box :merge_requests_events, class: 'form-check-input' - = form.label :merge_requests_events, class: 'list-label form-check-label ml-1' do + = form.label :merge_requests_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Merge request events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when a merge request is created/updated/merged') %li = form.check_box :job_events, class: 'form-check-input' - = form.label :job_events, class: 'list-label form-check-label ml-1' do + = form.label :job_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Job events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when the job status changes') %li = form.check_box :pipeline_events, class: 'form-check-input' - = form.label :pipeline_events, class: 'list-label form-check-label ml-1' do + = form.label :pipeline_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Pipeline events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when the pipeline status changes') %li = form.check_box :wiki_page_events, class: 'form-check-input' - = form.label :wiki_page_events, class: 'list-label form-check-label ml-1' do + = form.label :wiki_page_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Wiki Page events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL will be triggered when a wiki page is created/updated') %li = form.check_box :deployment_events, class: 'form-check-input' - = form.label :deployment_events, class: 'list-label form-check-label ml-1' do + = form.label :deployment_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Deployment events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled') %li = form.check_box :feature_flag_events, class: 'form-check-input' - = form.label :feature_flag_events, class: 'list-label form-check-label ml-1' do + = form.label :feature_flag_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Feature Flag events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL is triggered when a feature flag is turned on or off') %li = form.check_box :releases_events, class: 'form-check-input' - = form.label :releases_events, class: 'list-label form-check-label ml-1' do + = form.label :releases_events, class: 'list-label form-check-label gl-ml-1' do %strong= s_('Webhooks|Releases events') - %p.text-muted.ml-1 + %p.text-muted.gl-ml-1 = s_('Webhooks|This URL is triggered when a release is created/updated') .form-group = form.label :enable_ssl_verification, s_('Webhooks|SSL verification'), class: 'label-bold checkbox' .form-check = form.check_box :enable_ssl_verification, class: 'form-check-input' - = form.label :enable_ssl_verification, class: 'form-check-label ml-1' do + = form.label :enable_ssl_verification, class: 'form-check-label gl-ml-1' do %strong= s_('Webhooks|Enable SSL verification') diff --git a/app/views/shared/web_hooks/_test_button.html.haml b/app/views/shared/web_hooks/_test_button.html.haml index fc24e425ab6..c46b8a99886 100644 --- a/app/views/shared/web_hooks/_test_button.html.haml +++ b/app/views/shared/web_hooks/_test_button.html.haml @@ -5,7 +5,7 @@ .hook-test-button.dropdown.inline> %button.btn{ 'data-toggle' => 'dropdown', class: button_class } = _('Test') - = icon('caret-down') + = sprite_icon('chevron-down') %ul.dropdown-menu.dropdown-menu-right{ role: 'menu' } - triggers.each_value do |event| %li diff --git a/app/views/shared/wikis/_form.html.haml b/app/views/shared/wikis/_form.html.haml index dde1b3afa2d..b6504c7a17e 100644 --- a/app/views/shared/wikis/_form.html.haml +++ b/app/views/shared/wikis/_form.html.haml @@ -36,7 +36,7 @@ .col-sm-10 .select-wrapper = f.select :format, options_for_select(Wiki::MARKUPS, {selected: @page.format}), {}, class: 'form-control select-control' - = icon('chevron-down') + = sprite_icon('chevron-down', css_class: 'gl-absolute gl-top-3 gl-right-3 gl-text-gray-200') .form-group.row .col-sm-2.col-form-label= f.label :content, class: 'control-label-full-width' diff --git a/app/views/shared/wikis/_sidebar.html.haml b/app/views/shared/wikis/_sidebar.html.haml index c0ed7b4c6f2..a906bf7aa63 100644 --- a/app/views/shared/wikis/_sidebar.html.haml +++ b/app/views/shared/wikis/_sidebar.html.haml @@ -4,17 +4,19 @@ %a.gutter-toggle.float-right.d-block.d-md-none.js-sidebar-wiki-toggle{ href: "#" } = sprite_icon('chevron-double-lg-right', css_class: 'gl-icon') - - if @wiki.container.is_a?(Project) - - git_access_url = wiki_path(@wiki, action: :git_access) - = link_to git_access_url, class: active_nav_link?(path: 'wikis#git_access') ? 'active' : '', data: { qa_selector: 'clone_repository_link' } do - = sprite_icon('download', css_class: 'gl-mr-2') - %span= _("Clone repository") + - git_access_url = wiki_path(@wiki, action: :git_access) + = link_to git_access_url, class: active_nav_link?(path: 'wikis#git_access') ? 'active' : '', data: { qa_selector: 'clone_repository_link' } do + = sprite_icon('download', css_class: 'gl-mr-2') + %span= _("Clone repository") + + - if @sidebar_error.present? + = render 'shared/alert_info', body: s_('Wiki|The sidebar failed to load. You can reload the page to try again.') .blocks-container .block.block-first.w-100 - if @sidebar_page = render_wiki_content(@sidebar_page) - - else + - elsif @sidebar_wiki_entries %ul.wiki-pages = render @sidebar_wiki_entries, context: 'sidebar' .block.w-100 diff --git a/app/views/shared/wikis/git_access.html.haml b/app/views/shared/wikis/git_access.html.haml new file mode 100644 index 00000000000..2542860c742 --- /dev/null +++ b/app/views/shared/wikis/git_access.html.haml @@ -0,0 +1,37 @@ +- @content_class = "limit-container-width" unless fluid_layout +- page_title s_("WikiClone|Git Access"), _("Wiki") +- add_page_specific_style 'page_bundles/wiki' + +.wiki-page-header.top-area.has-sidebar-toggle.py-3.flex-column.flex-lg-row + = wiki_sidebar_toggle_button + + .git-access-header.w-100.d-flex.flex-column.justify-content-center + %span + = _("Clone repository") + %strong= @wiki.full_path + + .pt-3.pt-lg-0.w-100 + = render "shared/clone_panel", container: @wiki + +.wiki-git-access + %h3= s_("WikiClone|Install Gollum") + %pre.dark + :preserve + gem install gollum + + %h3= s_("WikiClone|Clone your wiki") + %pre.dark + :preserve + git clone #{ content_tag(:span, h(default_url_to_repo(@wiki)), class: 'clone')} + cd #{h @wiki.path} + + %h3= s_("WikiClone|Start Gollum and edit locally") + %pre.dark + :preserve + gollum + == Sinatra/1.3.5 has taken the stage on 4567 for development with backup from Thin + >> Thin web server (v1.5.0 codename Knife) + >> Maximum connections set to 1024 + >> Listening on 0.0.0.0:4567, CTRL+C to stop + += render 'shared/wikis/sidebar' diff --git a/app/views/shared/wikis/git_error.html.haml b/app/views/shared/wikis/git_error.html.haml new file mode 100644 index 00000000000..dab3b940b9a --- /dev/null +++ b/app/views/shared/wikis/git_error.html.haml @@ -0,0 +1,14 @@ +- if @page + - wiki_page_title @page + +- add_page_specific_style 'page_bundles/wiki' + +- git_access_url = wiki_path(@wiki, action: :git_access) + +.wiki-page-header.top-area.gl-flex-direction-column.gl-lg-flex-direction-row + .gl-mt-5.gl-mb-3 + .gl-display-flex.gl-justify-content-space-between + %h2.gl-mt-0.gl-mb-5{ data: { qa_selector: 'wiki_page_title', testid: 'wiki_page_title' } }= @page ? @page.human_title : _('Failed to retrieve page') + .js-wiki-page-content.md.gl-pt-2{ data: { qa_selector: 'wiki_page_content', testid: 'wiki_page_content' } } + = _('The page could not be displayed because it timed out.') + = html_escape(_('You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}')) % { linkStart: "".html_safe, linkEnd: ''.html_safe, cloneIcon: sprite_icon('download', css_class: 'gl-mr-2').html_safe } diff --git a/app/views/users/_overview.html.haml b/app/views/users/_overview.html.haml index 1367d80cf54..a78971967ff 100644 --- a/app/views/users/_overview.html.haml +++ b/app/views/users/_overview.html.haml @@ -18,7 +18,7 @@ %h4.gl-flex-grow-1 = Feature.enabled?(:security_auto_fix) && @user.bot? ? s_('UserProfile|Bot activity') : s_('UserProfile|Activity') = link_to s_('UserProfile|View all'), user_activity_path, class: "hide js-view-all" - .overview-content-list{ data: { href: user_path } } + .overview-content-list{ data: { href: user_activity_path } } .center.light.loading .spinner.spinner-md diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index ee037a7d66a..9f6b0bc2373 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -1,7 +1,7 @@ - @hide_top_links = true - @hide_breadcrumbs = true - @no_container = true -- page_title @user.blocked? ? s_('UserProfile|Blocked user') : @user.name +- page_title user_display_name(@user) - page_description @user.bio_html - header_title @user.name, user_path(@user) - page_itemtype 'http://schema.org/Person' @@ -38,10 +38,10 @@ = link_to avatar_icon_for_user(@user, 400), target: '_blank', rel: 'noopener noreferrer' do = image_tag avatar_icon_for_user(@user, 90), class: "avatar s90", alt: '', itemprop: 'image' - - if @user.blocked? + - if @user.blocked? || !@user.confirmed? .user-info .cover-title - = s_('UserProfile|Blocked user') + = user_display_name(@user) = render "users/profile_basic_info" - else .user-info @@ -139,7 +139,7 @@ - if can?(current_user, :read_cross_project) %h4.prepend-top-20 = s_('UserProfile|Most Recent Activity') - .content_list{ data: { href: user_path } } + .content_list{ data: { href: user_activity_path } } .loading .spinner.spinner-md - unless @user.bot? -- cgit v1.2.3