diff options
Diffstat (limited to 'app/views')
306 files changed, 1530 insertions, 1305 deletions
diff --git a/app/views/admin/abuse_reports/_abuse_report.html.haml b/app/views/admin/abuse_reports/_abuse_report.html.haml index 89a87f38968..5ed9a0d1adb 100644 --- a/app/views/admin/abuse_reports/_abuse_report.html.haml +++ b/app/views/admin/abuse_reports/_abuse_report.html.haml @@ -2,33 +2,30 @@ - user = abuse_report.user %tr %th.d-block.d-sm-none.d-md-none - %strong User + %strong= _('User') %td - if user = link_to user.name, user .light.small - Joined #{time_ago_with_tooltip(user.created_at)} + = _('Joined %{time_ago}').html_safe % { time_ago: time_ago_with_tooltip(user.created_at) } - else - (removed) + = _('(removed)') %td - %strong.subheading.d-block.d-sm-none.d-md-none Reported by - - if reporter - = link_to reporter.name, reporter - - else - (removed) + %strong.subheading.d-block.d-sm-none.d-md-none + = _('Reported by %{reporter}') % { reporter: reporter ? link_to(reporter.name, reporter) : _('(removed)') } .light.small = time_ago_with_tooltip(abuse_report.created_at) %td - %strong.subheading.d-block.d-sm-none.d-md-none Message + %strong.subheading.d-block.d-sm-none.d-md-none= _('Message') .message = markdown_field(abuse_report, :message) %td - if user - = link_to 'Remove user & report', admin_abuse_report_path(abuse_report, remove_user: true), - data: { confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?" }, remote: true, method: :delete, class: "btn btn-sm btn-block btn-remove js-remove-tr" + = link_to _('Remove user & report'), admin_abuse_report_path(abuse_report, remove_user: true), + data: { confirm: _("USER %{user} WILL BE REMOVED! Are you sure?") % { user: user.name } }, remote: true, method: :delete, class: "btn btn-sm btn-block btn-remove js-remove-tr" - if user && !user.blocked? - = link_to 'Block user', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-sm btn-block" + = link_to _('Block user'), block_admin_user_path(user), data: {confirm: _('USER WILL BE BLOCKED! Are you sure?')}, method: :put, class: "btn btn-sm btn-block" - else .btn.btn-sm.disabled.btn-block - Already blocked - = link_to 'Remove report', [:admin, abuse_report], remote: true, method: :delete, class: "btn btn-sm btn-block btn-close js-remove-tr" + = _('Already blocked') + = link_to _('Remove report'), [:admin, abuse_report], remote: true, method: :delete, class: "btn btn-sm btn-block btn-close js-remove-tr" diff --git a/app/views/admin/appearances/_form.html.haml b/app/views/admin/appearances/_form.html.haml index fcb1c1a6f3e..ad3795445d1 100644 --- a/app/views/admin/appearances/_form.html.haml +++ b/app/views/admin/appearances/_form.html.haml @@ -16,7 +16,7 @@ = image_tag @appearance.header_logo_path, class: 'appearance-light-logo-preview' - if @appearance.persisted? %br - = link_to 'Remove header logo', header_logos_admin_appearances_path, data: { confirm: "Header logo will be removed. Are you sure?"}, method: :delete, class: "btn btn-inverted btn-remove btn-sm remove-logo" + = 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: "" @@ -35,7 +35,7 @@ = image_tag @appearance.favicon_path, class: 'appearance-light-logo-preview' - if @appearance.persisted? %br - = link_to 'Remove favicon', favicon_admin_appearances_path, data: { confirm: "Favicon will be removed. Are you sure?"}, method: :delete, class: "btn btn-inverted btn-remove btn-sm remove-logo" + = 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: '' @@ -67,7 +67,7 @@ = image_tag @appearance.logo_path, class: 'appearance-logo-preview' - if @appearance.persisted? %br - = link_to 'Remove logo', logo_admin_appearances_path, data: { confirm: "Logo will be removed. Are you sure?"}, method: :delete, class: "btn btn-inverted btn-remove btn-sm remove-logo" + = 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: "" @@ -101,7 +101,7 @@ = parsed_with_gfm .gl-mt-3.gl-mb-3 - = f.submit 'Update appearance settings', class: 'btn btn-success' + = f.submit 'Update appearance settings', class: 'btn gl-button btn-success' - if @appearance.persisted? || @appearance.updated_at .mt-4 - if @appearance.persisted? diff --git a/app/views/admin/appearances/_system_header_footer_form.html.haml b/app/views/admin/appearances/_system_header_footer_form.html.haml index 7f53b2baa32..b50778a1076 100644 --- a/app/views/admin/appearances/_system_header_footer_form.html.haml +++ b/app/views/admin/appearances/_system_header_footer_form.html.haml @@ -23,7 +23,7 @@ = _('Add header and footer to emails. Please note that color settings will only be applied within the application interface') .form-group.js-toggle-colors-container - %button.btn.btn-link.js-toggle-colors-link{ type: 'button' } + %button.btn.gl-button.btn-link.js-toggle-colors-link{ type: 'button' } = _('Customize colors') .form-group.js-toggle-colors-container.hide = form.label :message_background_color, _('Background Color'), class: 'col-form-label label-bold' diff --git a/app/views/admin/appearances/preview_sign_in.html.haml b/app/views/admin/appearances/preview_sign_in.html.haml index 2cd95071c73..eec4719c13c 100644 --- a/app/views/admin/appearances/preview_sign_in.html.haml +++ b/app/views/admin/appearances/preview_sign_in.html.haml @@ -8,5 +8,5 @@ = label_tag :password = password_field_tag :password, nil, class: "form-control bottom", title: 'This field is required.' .form-group - = button_tag "Sign in", class: "btn-success btn" + = button_tag "Sign in", class: "btn gl-button btn-success" diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml index 7051b790fb7..b9cce6c8085 100644 --- a/app/views/admin/application_settings/_ci_cd.html.haml +++ b/app/views/admin/application_settings/_ci_cd.html.haml @@ -34,13 +34,13 @@ = f.number_field :max_artifacts_size, class: 'form-control' .form-text.text-muted = _("Set the maximum file size for each job's artifacts") - = link_to icon('question-circle'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size-core-only') + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size') .form-group = f.label :default_artifacts_expire_in, _('Default artifacts expiration'), class: 'label-bold' = f.text_field :default_artifacts_expire_in, class: 'form-control' .form-text.text-muted = html_escape(_("Set the default expiration time for each job's artifacts. 0 for unlimited. The default unit is in seconds, but you can define an alternative. For example: %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } - = link_to icon('question-circle'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'default-artifacts-expiration-core-only') + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'default-artifacts-expiration') .form-group = f.label :archive_builds_in_human_readable, _('Archive jobs'), class: 'label-bold' = f.text_field :archive_builds_in_human_readable, class: 'form-control', placeholder: 'never' @@ -58,6 +58,6 @@ = f.text_field :default_ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml' %p.form-text.text-muted = _("The default CI configuration path for new projects.").html_safe - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'custom-ci-configuration-path'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'custom-ci-configuration-path'), target: '_blank' = f.submit _('Save changes'), class: "btn btn-success" diff --git a/app/views/admin/application_settings/_diff_limits.html.haml b/app/views/admin/application_settings/_diff_limits.html.haml index 16b7fbe1ab6..1bf25b6a558 100644 --- a/app/views/admin/application_settings/_diff_limits.html.haml +++ b/app/views/admin/application_settings/_diff_limits.html.haml @@ -9,7 +9,7 @@ Diff files surpassing this limit will be presented as 'too large' and won't be expandable. - = link_to icon('question-circle'), + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/diff_limits', anchor: 'maximum-diff-patch-size') .gl-display-flex.gl-justify-content-end diff --git a/app/views/admin/application_settings/_external_authorization_service_form.html.haml b/app/views/admin/application_settings/_external_authorization_service_form.html.haml index e82ed0db851..179eb2d5f2e 100644 --- a/app/views/admin/application_settings/_external_authorization_service_form.html.haml +++ b/app/views/admin/application_settings/_external_authorization_service_form.html.haml @@ -19,7 +19,7 @@ = _('Enable classification control using an external service') %span.form-text.text-muted = external_authorization_description - = link_to icon('question-circle'), help_page_path('user/admin_area/settings/external_authorization') + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/external_authorization') .form-group = f.label :external_authorization_service_url, _('Service URL'), class: 'label-bold' = f.text_field :external_authorization_service_url, class: 'form-control' diff --git a/app/views/admin/application_settings/_gitpod.html.haml b/app/views/admin/application_settings/_gitpod.html.haml new file mode 100644 index 00000000000..bbad5155ada --- /dev/null +++ b/app/views/admin/application_settings/_gitpod.html.haml @@ -0,0 +1,30 @@ +- return unless Gitlab::Gitpod.feature_available? +- expanded = integration_expanded?('gitpod_') +- gitpod_link = link_to("Gitpod#{sprite_icon('external-link', size: 12, css_class: 'ml-1 vertical-align-center')}".html_safe, 'https://gitpod.io/', target: '_blank', rel: 'noopener noreferrer') + +%section.settings.no-animate#js-gitpod-settings{ class: ('expanded' if expanded) } + .settings-header + %h4 + = _('Gitpod') + %button.btn.btn-default.js-settings-toggle{ type: 'button' } + = expanded ? _('Collapse') : _('Expand') + %p + = s_('Enable %{gitpod_link} integration to launch a development environment in your browser directly from GitLab.').html_safe % { gitpod_link: gitpod_link } + = link_to sprite_icon('question-o'), help_page_path('integration/gitpod.md'), target: '_blank', class: 'has-tooltip', title: _('More information') + + + .settings-content + = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-gitpod-settings'), html: { class: 'fieldset-form' } do |f| + = form_errors(@application_setting) + + %fieldset + .form-group + .form-check + = f.check_box :gitpod_enabled, class: 'form-check-input' + = f.label :gitpod_enabled, s_('Gitpod|Enable Gitpod integration'), class: 'form-check-label' + .form-group + = f.label :gitpod_url, s_('Gitpod|Gitpod URL'), class: 'label-bold' + = f.text_field :gitpod_url, class: 'form-control', placeholder: s_('Gitpod|e.g. https://gitpod.example.com') + .form-text.text-muted + = s_('Gitpod|Add the URL to your Gitpod instance configured to read your GitLab projects.') + = f.submit s_('Save changes'), class: 'btn btn-success' diff --git a/app/views/admin/application_settings/_grafana.html.haml b/app/views/admin/application_settings/_grafana.html.haml index 700be7db54f..80ff5a298b4 100644 --- a/app/views/admin/application_settings/_grafana.html.haml +++ b/app/views/admin/application_settings/_grafana.html.haml @@ -4,7 +4,7 @@ %fieldset %p = _("Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab.") - = link_to icon('question-circle'), help_page_path('administration/monitoring/performance/grafana_configuration.md') + = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/performance/grafana_configuration.md') .form-group .form-check = f.check_box :grafana_enabled, class: 'form-check-input' diff --git a/app/views/admin/application_settings/_package_registry.html.haml b/app/views/admin/application_settings/_package_registry.html.haml new file mode 100644 index 00000000000..257a90252cc --- /dev/null +++ b/app/views/admin/application_settings/_package_registry.html.haml @@ -0,0 +1,50 @@ +- if Gitlab.config.packages.enabled + %section.settings.as-package.no-animate#js-package-settings{ class: ('expanded' if expanded_by_default?) } + .settings-header + %h4 + = _('Package Registry') + %button.btn.btn-default.js-settings-toggle{ type: 'button' } + = expanded_by_default? ? _('Collapse') : _('Expand') + %p + = _("Settings related to the use and experience of using GitLab's Package Registry.") + + = render_if_exists 'admin/application_settings/ee_package_registry' + + .settings-content + %h4 + = _('Package file size limits') + %p + = _('Set limit to 0 to allow any file size.') + .scrolling-tabs-container.inner-page-scroll-tabs + - if @plans.size > 1 + %ul.nav-links.scrolling-tabs.mobile-separator.nav.nav-tabs.mb-3 + - @plans.each_with_index do |plan, index| + %li + = link_to admin_plan_limits_path(anchor: 'js-package-settings'), data: { target: "div#plan#{index}", action: "plan#{index}", toggle: 'tab'}, class: index == 0 ? 'active': '' do + = plan.name.capitalize + .tab-content + - @plans.each_with_index do |plan, index| + .tab-pane{ :id => "plan#{index}", class: index == 0 ? 'active': '' } + = form_for plan.actual_limits, url: admin_plan_limits_path(anchor: 'js-package-settings'), html: { class: 'fieldset-form' }, method: :post do |f| + = form_errors(plan) + %fieldset + = f.hidden_field(:plan_id, value: plan.id) + .form-group + = f.label :conan_max_file_size, _('Maximum Conan package file size in bytes'), class: 'label-bold' + = f.number_field :conan_max_file_size, class: 'form-control' + .form-group + = f.label :maven_max_file_size, _('Maximum Maven package file size in bytes'), class: 'label-bold' + = f.number_field :maven_max_file_size, class: 'form-control' + .form-group + = f.label :npm_max_file_size, _('Maximum NPM package file size in bytes'), class: 'label-bold' + = f.number_field :npm_max_file_size, class: 'form-control' + .form-group + = f.label :nuget_max_file_size, _('Maximum NuGet package file size in bytes'), class: 'label-bold' + = f.number_field :nuget_max_file_size, class: 'form-control' + .form-group + = f.label :pypi_max_file_size, _('Maximum PyPI package file size in bytes'), class: 'label-bold' + = f.number_field :pypi_max_file_size, class: 'form-control' + .form-group + = f.label :generic_packages_max_file_size, _('Generic package file size in bytes'), class: 'label-bold' + = f.number_field :generic_packages_max_file_size, class: 'form-control' + = f.submit _('Save %{name} size limits').html_safe % { name: plan.name.capitalize }, class: 'btn gl-button btn-success' diff --git a/app/views/admin/application_settings/_pages.html.haml b/app/views/admin/application_settings/_pages.html.haml index 8214cf8ce9f..2ee7f3edc97 100644 --- a/app/views/admin/application_settings/_pages.html.haml +++ b/app/views/admin/application_settings/_pages.html.haml @@ -14,7 +14,7 @@ = _("Require users to prove ownership of custom domains") .form-text.text-muted = _("Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled") - = link_to icon('question-circle'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership') + = link_to sprite_icon('question-o'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership') - if Gitlab.config.pages.access_control .form-group .form-check @@ -23,7 +23,7 @@ = _("Disable public access to Pages sites") .form-text.text-muted = _("Access to Pages websites are controlled based on the user's membership to a given project. By checking this box, users will be required to be logged in to have access to all Pages websites in your instance.") - = link_to icon('question-circle'), help_page_path('administration/pages/index.md', anchor: 'disabling-public-access-to-all-pages-websites') + = link_to sprite_icon('question-o'), help_page_path('administration/pages/index.md', anchor: 'disabling-public-access-to-all-pages-websites') %h5 = _("Configure Let's Encrypt") %p diff --git a/app/views/admin/application_settings/_performance.html.haml b/app/views/admin/application_settings/_performance.html.haml index 6b02521a0f0..3473c185dbe 100644 --- a/app/views/admin/application_settings/_performance.html.haml +++ b/app/views/admin/application_settings/_performance.html.haml @@ -13,7 +13,7 @@ to authenticate SSH keys via the database file. Only uncheck this if you have configured your OpenSSH server to use the AuthorizedKeysCommand. Click on the help icon for more details. - = link_to icon('question-circle'), help_page_path('administration/operations/fast_ssh_key_lookup') + = link_to sprite_icon('question-o'), help_page_path('administration/operations/fast_ssh_key_lookup') .form-group = f.label :raw_blob_request_limit, _('Raw blob request rate limit per minute'), class: 'label-bold' diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml index b2ec25cdf8d..49f58449d29 100644 --- a/app/views/admin/application_settings/_prometheus.html.haml +++ b/app/views/admin/application_settings/_prometheus.html.haml @@ -10,7 +10,7 @@ \. This setting requires a = link_to 'restart', help_page_path('administration/restart_gitlab') to take effect. - = link_to icon('question-circle'), help_page_path('administration/monitoring/prometheus/index') + = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/prometheus/index') .form-group .form-check = f.check_box :prometheus_metrics_enabled, class: 'form-check-input' @@ -22,7 +22,7 @@ Environment variable %code prometheus_multiproc_dir does not exist or is not pointing to a valid directory. - = link_to icon('question-circle'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory') + = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory') .form-group = f.label :metrics_method_call_threshold, 'Method Call Threshold (ms)', class: 'label-bold' = f.number_field :metrics_method_call_threshold, class: 'form-control' diff --git a/app/views/admin/application_settings/_realtime.html.haml b/app/views/admin/application_settings/_realtime.html.haml index 8f6946534ea..0e9731b1c70 100644 --- a/app/views/admin/application_settings/_realtime.html.haml +++ b/app/views/admin/application_settings/_realtime.html.haml @@ -12,7 +12,6 @@ The multiplier can also have a decimal value. The default value (1) is a reasonable choice for the majority of GitLab installations. Set to 0 to completely disable polling. - = link_to icon('question-circle'), help_page_path('administration/polling') + = link_to sprite_icon('question-o'), help_page_path('administration/polling') = f.submit 'Save changes', class: "btn btn-success" - diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml index fea3ff4c3ba..7ff2b6e841d 100644 --- a/app/views/admin/application_settings/_registry.html.haml +++ b/app/views/admin/application_settings/_registry.html.haml @@ -10,9 +10,15 @@ = f.check_box :container_expiration_policies_enable_historic_entries, class: 'form-check-input' = f.label :container_expiration_policies_enable_historic_entries, class: 'form-check-label' do = _("Enable container expiration and retention policies for projects created earlier than GitLab 12.7.") - = link_to icon('question-circle'), help_page_path('user/packages/container_registry/index', anchor: 'cleanup-policy') + = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/index', anchor: 'cleanup-policy') .form-text.text-muted = _("Existing projects will be able to use expiration policies. Avoid enabling this if an external Container Registry is being used, as there is a performance risk if many images exist on one project.") - = link_to icon('question-circle'), help_page_path('user/packages/container_registry/index', anchor: 'use-with-external-container-registries') + = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/index', anchor: 'use-with-external-container-registries') + - if limit_delete_tags_service? + .form-group + = f.label :container_registry_delete_tags_service_timeout, _('Cleanup policy maximum processing time (seconds)'), class: 'label-bold' + = f.number_field :container_registry_delete_tags_service_timeout, min: 0, class: 'form-control' + .form-text.text-muted + = _("Tags are deleted until the timeout is reached. Any remaining tags are included the next time the policy runs. To remove the time limit, set it to 0.") = f.submit 'Save changes', class: "btn btn-success" diff --git a/app/views/admin/application_settings/_repository_mirrors_form.html.haml b/app/views/admin/application_settings/_repository_mirrors_form.html.haml index 3b1d1eceb9c..d598f173ff3 100644 --- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml +++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml @@ -10,7 +10,7 @@ = _('Allow repository mirroring to be configured by project maintainers') %span.form-text.text-muted = _('If disabled, only admins will be able to configure repository mirroring.') - = link_to icon('question-circle'), help_page_path('user/project/repository/repository_mirroring.md') + = link_to sprite_icon('question-o'), help_page_path('user/project/repository/repository_mirroring.md') = render_if_exists 'admin/application_settings/mirror_settings', form: f diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml index ee55529621b..0dc8dc0740e 100644 --- a/app/views/admin/application_settings/_repository_storage.html.haml +++ b/app/views/admin/application_settings/_repository_storage.html.haml @@ -16,7 +16,7 @@ .form-text %p.text-secondary = _('Enter weights for storages for new repositories.') - = link_to icon('question-circle'), help_page_path('administration/repository_storage_paths') + = link_to sprite_icon('question-o'), help_page_path('administration/repository_storage_paths') .form-check - storage_weights.each do |attribute| = f.text_field attribute[:name], class: 'form-text-input', value: attribute[:value] diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml index 505be869620..2a26a0909fd 100644 --- a/app/views/admin/application_settings/_signin.html.haml +++ b/app/views/admin/application_settings/_signin.html.haml @@ -38,7 +38,7 @@ = f.check_box :notify_on_unknown_sign_in, class: 'form-check-input' = f.label :notify_on_unknown_sign_in, class: 'form-check-label' do = _('Notify users by email when sign-in location is not recognized') - = link_to icon('question-circle'), + = link_to sprite_icon('question-o'), 'https://docs.gitlab.com/ee/user/profile/unknown_sign_in_notification.html', target: '_blank' .form-group diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml index 3216d7b7a9a..c339d6df363 100644 --- a/app/views/admin/application_settings/_snowplow.html.haml +++ b/app/views/admin/application_settings/_snowplow.html.haml @@ -25,8 +25,5 @@ .form-group = f.label :snowplow_cookie_domain, _('Cookie domain'), class: 'label-light' = f.text_field :snowplow_cookie_domain, class: 'form-control' - .form-group - = f.label :snowplow_iglu_registry_url, _('Iglu registry URL (optional)'), class: 'label-light' - = f.text_field :snowplow_iglu_registry_url, class: 'form-control' = f.submit _('Save changes'), class: 'btn btn-success' diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml index d8a4c601b77..4e45db1e10a 100644 --- a/app/views/admin/application_settings/_usage.html.haml +++ b/app/views/admin/application_settings/_usage.html.haml @@ -1,3 +1,5 @@ +- payload_class = 'js-usage-ping-payload' + = form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) @@ -9,7 +11,7 @@ Enable version check .form-text.text-muted GitLab will inform you if a new version is available. - = link_to 'Learn more', help_page_path('user/admin_area/settings/usage_statistics', anchor: 'version-check-core-only') + = link_to 'Learn more', help_page_path('user/admin_area/settings/usage_statistics', anchor: 'version-check') about what information is shared with GitLab Inc. .form-group - can_be_configured = @application_setting.usage_ping_can_be_configured? @@ -21,21 +23,18 @@ - if can_be_configured %p.mb-2= _('To help improve GitLab and its user experience, GitLab will periodically collect usage information.') - - usage_ping_path = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'usage-ping-core-only') + - usage_ping_path = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'usage-ping') - usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: usage_ping_path } %p.mb-2= s_('%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc.').html_safe % { usage_ping_link_start: usage_ping_link_start, usage_ping_link_end: '</a>'.html_safe } - %button.btn.js-usage-ping-payload-trigger{ type: 'button' } + %button.btn.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } } .spinner.js-spinner.d-none .js-text.d-inline= _('Preview payload') - %pre.usage-data.js-usage-ping-payload.js-syntax-highlight.code.highlight.mt-2.d-none{ data: { endpoint: usage_data_admin_application_settings_path(format: :html) } } + %pre.usage-data.js-syntax-highlight.code.highlight.mt-2.d-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } } - else = _('The usage ping is disabled, and cannot be configured through this form.') - deactivating_usage_ping_path = help_page_path('development/telemetry/usage_ping', anchor: 'disable-usage-ping') - deactivating_usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: deactivating_usage_ping_path } = s_('For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}.').html_safe % { deactivating_usage_ping_link_start: deactivating_usage_ping_link_start, deactivating_usage_ping_link_end: '</a>'.html_safe } - .form-group.mt-3 - = f.label :instance_statistics_visibility_private, _('Instance Statistics visibility') - = f.select :instance_statistics_visibility_private, options_for_select({_('All users') => false, _('Only admins') => true}, Gitlab::CurrentSettings.instance_statistics_visibility_private?), {}, class: 'form-control' = f.submit 'Save changes', class: "btn btn-success" diff --git a/app/views/admin/application_settings/ci/_header.html.haml b/app/views/admin/application_settings/ci/_header.html.haml index aa1a6256986..6ff35a42efd 100644 --- a/app/views/admin/application_settings/ci/_header.html.haml +++ b/app/views/admin/application_settings/ci/_header.html.haml @@ -2,7 +2,7 @@ %h4 = _('Variables') - = link_to icon('question-circle'), help_page_path('ci/variables/README', anchor: 'custom-environment-variables'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o', css_class: 'gl-vertical-align-baseline!'), help_page_path('ci/variables/README', anchor: 'custom-environment-variables'), target: '_blank', rel: 'noopener noreferrer' %button.btn.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index 788dc0b0f1b..823cee09d4b 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -117,6 +117,7 @@ #js-maintenance-mode-settings = render_if_exists 'admin/application_settings/elasticsearch_form' += render 'admin/application_settings/gitpod' = 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/integrations.html.haml b/app/views/admin/application_settings/integrations.html.haml index b5dae424b46..ed4f63d0b82 100644 --- a/app/views/admin/application_settings/integrations.html.haml +++ b/app/views/admin/application_settings/integrations.html.haml @@ -16,5 +16,5 @@ %h4= s_('AdminSettings|Apply integration settings to all Projects') %p = s_('AdminSettings|Integrations configured here will automatically apply to all projects on this instance.') - = link_to _('Learn more'), '#' + = link_to _('Learn more'), integrations_help_page_path, target: '_blank', rel: 'noopener noreferrer' = render 'shared/integrations/index', integrations: @integrations 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 181c54c2716..9f1b7195ab7 100644 --- a/app/views/admin/application_settings/metrics_and_profiling.html.haml +++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml @@ -32,7 +32,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p = _('Enable access to the Performance Bar for a given group.') - = link_to icon('question-circle'), help_page_path('administration/monitoring/performance/performance_bar') + = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/performance/performance_bar') .settings-content = render 'performance_bar' diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml index 8338401bea5..0d01f1c57e0 100644 --- a/app/views/admin/applications/_form.html.haml +++ b/app/views/admin/applications/_form.html.haml @@ -16,11 +16,6 @@ = doorkeeper_errors_for application, :redirect_uri %span.form-text.text-muted Use one line per URI - - if Doorkeeper.configuration.native_redirect_uri - %span.form-text.text-muted - Use - %code= Doorkeeper.configuration.native_redirect_uri - for local tests = content_tag :div, class: 'form-group row' do .col-sm-2.col-form-label.pt-0 diff --git a/app/views/instance_statistics/cohorts/_cohorts_table.html.haml b/app/views/admin/cohorts/_cohorts_table.html.haml index d4defd3f849..bb6266b38f6 100644 --- a/app/views/instance_statistics/cohorts/_cohorts_table.html.haml +++ b/app/views/admin/cohorts/_cohorts_table.html.haml @@ -2,7 +2,7 @@ .bs-callout.clearfix %p = s_("Cohorts|User cohorts are shown for the last %{months_included} months. Only users with activity are counted in the 'New users' column; inactive users are counted separately.") % { months_included: @cohorts[:months_included] } - = link_to icon('question-circle'), help_page_path('user/instance_statistics/user_cohorts', anchor: 'cohorts'), title: 'About this feature', target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/analytics/user_cohorts', anchor: 'cohorts'), title: 'About this feature', target: '_blank' .table-holder.d-xl-table %table.table diff --git a/app/views/admin/cohorts/index.html.haml b/app/views/admin/cohorts/index.html.haml new file mode 100644 index 00000000000..03cd392d370 --- /dev/null +++ b/app/views/admin/cohorts/index.html.haml @@ -0,0 +1,7 @@ +- breadcrumb_title _("Cohorts") +- page_title _("Cohorts") + +- if @cohorts + = render 'cohorts_table' +- else + #js-cohorts-empty-state{ data: { empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('user/admin_area/analytics/user_cohorts') } } diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 271ab12037e..4acfc96caf2 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -7,47 +7,44 @@ dismissible: true.to_s } } = notice[:message].html_safe -- if show_license_breakdown? - = render_if_exists 'admin/licenses/breakdown', license: @license +- if @license.present? && show_license_breakdown? + = render_if_exists 'admin/licenses/breakdown' .admin-dashboard.gl-mt-3 .row .col-sm-4 - .info-well.dark-well + .info-well.dark-well.flex-fill .well-segment.well-centered = link_to admin_projects_path do %h3.text-center - Projects: - = approximate_count_with_delimiters(@counts, Project) + = s_('AdminArea|Projects: %{number_of_projects}') % { number_of_projects: approximate_count_with_delimiters(@counts, Project) } %hr - = link_to('New project', new_project_path, class: "btn btn-success") + = link_to(s_('AdminArea|New project'), new_project_path, class: "btn btn-success gl-w-full") .col-sm-4 .info-well.dark-well .well-segment.well-centered = link_to admin_users_path do %h3.text-center - Users: - = approximate_count_with_delimiters(@counts, User) + = s_('AdminArea|Users: %{number_of_users}') % { number_of_users: approximate_count_with_delimiters(@counts, User) } %hr .btn-group.d-flex{ role: 'group' } - = link_to 'New user', new_admin_user_path, class: "btn btn-success" - = link_to s_('AdminArea|Users statistics'), admin_dashboard_stats_path, class: 'btn btn-primary' + = link_to s_('AdminArea|New user'), new_admin_user_path, class: "btn btn-success gl-w-full" + = link_to s_('AdminArea|Users statistics'), admin_dashboard_stats_path, class: 'btn btn-primary gl-w-full' .col-sm-4 .info-well.dark-well .well-segment.well-centered = link_to admin_groups_path do %h3.text-center - Groups: - = approximate_count_with_delimiters(@counts, Group) + = s_('AdminArea|Groups: %{number_of_groups}') % { number_of_groups: approximate_count_with_delimiters(@counts, Group) } %hr - = link_to 'New group', new_admin_group_path, class: "btn btn-success" + = link_to s_('AdminArea|New group'), new_admin_group_path, class: "btn btn-success gl-w-full" .row .col-md-4 #js-admin-statistics-container .col-md-4 .info-well .well-segment.admin-well.admin-well-features - %h4 Features + %h4= s_('AdminArea|Features') = feature_entry(_('Sign up'), href: general_admin_application_settings_path(anchor: 'js-signup-settings'), enabled: allow_signup?) @@ -87,42 +84,41 @@ .info-well .well-segment.admin-well %h4 - Components + = s_('AdminArea|Components') - if Gitlab::CurrentSettings.version_check_enabled .float-right = version_status_badge %p - %a{ href: general_admin_application_settings_path } - GitLab + = link_to _('GitLab'), general_admin_application_settings_path %span.float-right = Gitlab::VERSION = "(#{Gitlab.revision})" %p - GitLab Shell + = _('GitLab Shell') %span.float-right = Gitlab::Shell.version %p - GitLab Workhorse + = _('GitLab Workhorse') %span.float-right = gitlab_workhorse_version %p - GitLab API + = _('GitLab API') %span.float-right = API::API::version - if Gitlab.config.pages.enabled %p - GitLab Pages + = _('GitLab Pages') %span.float-right = Gitlab::Pages::VERSION = render_if_exists 'admin/dashboard/geo' %p - Ruby + = _('Ruby') %span.float-right #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} %p - Rails + = _('Rails') %span.float-right #{Rails::VERSION::STRING} %p @@ -130,12 +126,12 @@ %span.float-right = Gitlab::Database.version %p - = link_to "Gitaly Servers", admin_gitaly_servers_path + = link_to _("Gitaly Servers"), admin_gitaly_servers_path .row .col-md-4 .info-well .well-segment.admin-well - %h4 Latest projects + %h4= s_('AdminArea|Latest projects') - @projects.each do |project| %p = link_to project.full_name, admin_project_path(project), class: 'str-truncated-60' @@ -144,7 +140,7 @@ .col-md-4 .info-well .well-segment.admin-well - %h4 Latest users + %h4= s_('AdminArea|Latest users') - @users.each do |user| %p = link_to [:admin, user], class: 'str-truncated-60' do @@ -154,7 +150,7 @@ .col-md-4 .info-well .well-segment.admin-well - %h4 Latest groups + %h4= s_('AdminArea|Latest groups') - @groups.each do |group| %p = link_to [:admin, group], class: 'str-truncated-60' do diff --git a/app/views/admin/dev_ops_report/_callout.html.haml b/app/views/admin/dev_ops_report/_callout.html.haml new file mode 100644 index 00000000000..7507f433af8 --- /dev/null +++ b/app/views/admin/dev_ops_report/_callout.html.haml @@ -0,0 +1,13 @@ +.gl-mt-3 +.user-callout{ data: { uid: 'dev_ops_report_intro_callout_dismissed' } } + .bordered-box.landing.content-block + %button.btn.btn-default.close.js-close-callout{ type: 'button', + 'aria-label' => _('Dismiss DevOps Report introduction') } + = sprite_icon('close', size: 16, css_class: 'dismiss-icon') + .user-callout-copy + %h4 + = _('Introducing Your DevOps Report') + %p + = _('Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers.') + .svg-container.devops + = custom_icon('dev_ops_report_overview') diff --git a/app/views/instance_statistics/dev_ops_score/_card.html.haml b/app/views/admin/dev_ops_report/_card.html.haml index dd6e5c0f108..dd6e5c0f108 100644 --- a/app/views/instance_statistics/dev_ops_score/_card.html.haml +++ b/app/views/admin/dev_ops_report/_card.html.haml diff --git a/app/views/admin/dev_ops_report/_no_data.html.haml b/app/views/admin/dev_ops_report/_no_data.html.haml new file mode 100644 index 00000000000..e540a4e2bce --- /dev/null +++ b/app/views/admin/dev_ops_report/_no_data.html.haml @@ -0,0 +1,7 @@ +.container.devops-empty + .col-sm-12.justify-content-center.text-center + = custom_icon('dev_ops_report_no_data') + %h4= _('Data is still calculating...') + %p + = _('It may be several days before you see feature usage data.') + = link_to _('Our documentation includes an example DevOps Score report.'), help_page_path('user/admin_area/analytics/dev_ops_report'), target: '_blank' diff --git a/app/views/instance_statistics/dev_ops_score/index.html.haml b/app/views/admin/dev_ops_report/show.html.haml index 215624d27ce..1892557d0d6 100644 --- a/app/views/instance_statistics/dev_ops_score/index.html.haml +++ b/app/views/admin/dev_ops_report/show.html.haml @@ -1,13 +1,13 @@ -- page_title _('DevOps Score') +- page_title _('DevOps Report') - usage_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled .container - - if usage_ping_enabled && show_callout?('dev_ops_score_intro_callout_dismissed') + - if usage_ping_enabled && show_callout?('dev_ops_report_intro_callout_dismissed') = render 'callout' .gl-mt-3 - if !usage_ping_enabled - = render 'disabled' + #js-devops-empty-state{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/telemetry/usage_ping') } } - elsif @metric.blank? = render 'no_data' - else @@ -16,10 +16,10 @@ %h2.devops-header-title{ class: "devops-#{score_level(@metric.average_percentage_score)}-score" } = number_to_percentage(@metric.average_percentage_score, precision: 1) .devops-header-subtitle - = _('index') + = _('DevOps') %br - = _('score') - = link_to icon('question-circle', 'aria-hidden' => 'true'), help_page_path('user/instance_statistics/dev_ops_score') + = _('Score') + = link_to sprite_icon('question-o', css_class: 'devops-header-icon'), help_page_path('user/admin_area/analytics/dev_ops_report') .devops-cards.board-card-container - @metric.cards.each do |card| diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml index 22cf722d117..041b0661d37 100644 --- a/app/views/admin/groups/_form.html.haml +++ b/app/views/admin/groups/_form.html.haml @@ -24,8 +24,10 @@ - if @group.new_record? .form-group.row .offset-sm-2.col-sm-10 - .alert.alert-info - = render 'shared/group_tips' + .gl-alert.gl-alert-info + = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + .gl-alert-body + = render 'shared/group_tips' .form-actions = f.submit _('Create group'), class: "btn btn-success" = link_to _('Cancel'), admin_groups_path, class: "btn btn-cancel" diff --git a/app/views/admin/groups/_group.html.haml b/app/views/admin/groups/_group.html.haml index ab817b2ef6e..3a82f3803bd 100644 --- a/app/views/admin/groups/_group.html.haml +++ b/app/views/admin/groups/_group.html.haml @@ -27,7 +27,7 @@ %span.gl-ml-5 = sprite_icon('users', css_class: 'gl-vertical-align-text-bottom') - = number_with_delimiter(group.users.count) + = number_with_delimiter(group.users_count) %span.gl-ml-5.visibility-icon.has-tooltip{ data: { container: 'body', placement: 'left' }, title: visibility_icon_description(group) } = visibility_level_icon(group.visibility_level) diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index 6dd73698848..6c2c0b3a488 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -57,7 +57,7 @@ %span.light= _('Group Git LFS status:') %strong = group_lfs_status(@group) - = link_to icon('question-circle'), help_page_path('topics/git/lfs/index') + = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index') = render_if_exists 'namespaces/shared_runner_status', namespace: @group diff --git a/app/views/admin/health_check/show.html.haml b/app/views/admin/health_check/show.html.haml index fbe37f6c509..65d3c78ec11 100644 --- a/app/views/admin/health_check/show.html.haml +++ b/app/views/admin/health_check/show.html.haml @@ -27,7 +27,7 @@ .card-header Current Status: - if no_errors - = icon('circle', class: 'cgreen') + = sprite_icon('check', css_class: 'cgreen') #{ s_('HealthCheck|Healthy') } - else = icon('warning', class: 'cred') diff --git a/app/views/admin/instance_statistics/index.html.haml b/app/views/admin/instance_statistics/index.html.haml new file mode 100644 index 00000000000..ab28a2471e6 --- /dev/null +++ b/app/views/admin/instance_statistics/index.html.haml @@ -0,0 +1,4 @@ +- breadcrumb_title _("Instance Statistics") +- page_title _("Instance Statistics") + +#js-instance-statistics-app diff --git a/app/views/admin/projects/_projects.html.haml b/app/views/admin/projects/_projects.html.haml index f842ab2d009..44317eb7f6e 100644 --- a/app/views/admin/projects/_projects.html.haml +++ b/app/views/admin/projects/_projects.html.haml @@ -5,10 +5,7 @@ %li.project-row{ class: ('no-description' if project.description.blank?) } .controls = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn" - %button.delete-project-button.btn.btn-danger{ data: { toggle: 'modal', - target: '#delete-project-modal', - delete_project_url: admin_project_path(project), - project_name: project.name }, type: 'button' } + %button.delete-project-button.btn.btn-danger{ data: { delete_project_url: admin_project_path(project), project_name: project.name } } = s_('AdminProjects|Delete') .stats diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index bd3b2f40059..d5af12fcd09 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -100,7 +100,7 @@ = _('Git LFS status:') %strong = project_lfs_status(@project) - = link_to icon('question-circle'), help_page_path('topics/git/lfs/index') + = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index') - else %li %span.light @@ -165,7 +165,7 @@ - else = _("This repository was last checked %{last_check_timestamp}. The check passed.") % { last_check_timestamp: @project.last_repository_check_at.to_s(:medium) } - = link_to icon('question-circle'), help_page_path('administration/repository_checks') + = link_to sprite_icon('question-o'), help_page_path('administration/repository_checks') .form-group = f.submit _('Trigger repository check'), class: 'btn btn-primary' diff --git a/app/views/admin/runners/_runner.html.haml b/app/views/admin/runners/_runner.html.haml index 0bbe73d6f7e..a2b736c332c 100644 --- a/app/views/admin/runners/_runner.html.haml +++ b/app/views/admin/runners/_runner.html.haml @@ -76,4 +76,4 @@ = sprite_icon('play') .btn-group = link_to [:admin, runner], method: :delete, class: 'btn btn-danger has-tooltip', title: _('Remove'), ref: 'tooltip', aria: { label: _('Remove') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?') } do - = icon('remove') + = sprite_icon('close') diff --git a/app/views/admin/runners/index.html.haml b/app/views/admin/runners/index.html.haml index 08d65819476..cc218aefdb7 100644 --- a/app/views/admin/runners/index.html.haml +++ b/app/views/admin/runners/index.html.haml @@ -108,7 +108,7 @@ {{name}} = button_tag class: %w[clear-search hidden] do - = icon('times') + = sprite_icon('close', size: 16, css_class: 'clear-search-icon') .filter-dropdown-container = render 'sort_dropdown' diff --git a/app/views/admin/runners/update.js.haml b/app/views/admin/runners/update.js.haml deleted file mode 100644 index 2b7d3067e20..00000000000 --- a/app/views/admin/runners/update.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - $("#runner_#{@runner.id}").replaceWith("#{escape_javascript(render(@runner))}") diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml index f2153e503af..c17ab5e08a7 100644 --- a/app/views/admin/services/_form.html.haml +++ b/app/views/admin/services/_form.html.haml @@ -3,8 +3,5 @@ %p #{@service.description} template. -= form_for :service, url: admin_application_settings_service_path, method: :put, html: { class: 'fieldset-form' } do |form| += form_for :service, url: admin_application_settings_service_path, method: :put, html: { class: 'fieldset-form js-integration-settings-form' } do |form| = render 'shared/service_settings', form: form, integration: @service - - .footer-block.row-content-block - = form.submit 'Save', class: 'btn btn-success' diff --git a/app/views/admin/services/index.html.haml b/app/views/admin/services/index.html.haml index 19a0b7466a2..3517beac976 100644 --- a/app/views/admin/services/index.html.haml +++ b/app/views/admin/services/index.html.haml @@ -1,9 +1,28 @@ - page_title _("Service Templates") +- @content_class = 'limit-container-width' unless fluid_layout + +- if show_service_templates_deprecated? + .gl-alert.gl-alert-tip.js-service-templates-deprecated.gl-mt-5{ role: 'alert', data: { feature_id: UserCalloutsHelper::SERVICE_TEMPLATES_DEPRECATED, dismiss_endpoint: user_callouts_path } } + = sprite_icon('bulb', css_class: 'gl-alert-icon gl-alert-icon-no-title') + %button.js-close.gl-alert-dismiss{ type: 'button', aria: { label: _('Dismiss') } } + = sprite_icon('close') + %h4.gl-alert-title= s_('AdminSettings|Service Templates will soon be deprecated.') + .gl-alert-body + = s_('AdminSettings|Try using the latest version of Integrations instead.') + .gl-alert-actions + = link_to _('Go to Integrations'), integrations_admin_application_settings_path, class: 'btn btn-info gl-alert-action gl-button' + = link_to _('Learn more'), help_page_path('user/admin_area/settings/project_integration_management'), class: 'btn btn-default gl-alert-action btn-secondary gl-button', target: '_blank', rel: 'noopener noreferrer' + %h3.page-title Service templates %p.light= s_('AdminSettings|Service template allows you to set default values for integrations') .table-holder %table.table + %colgroup + %col + %col + %col + %col{ width: 135 } %thead %tr %th diff --git a/app/views/admin/sessions/_two_factor_otp.html.haml b/app/views/admin/sessions/_two_factor_otp.html.haml index 9d4acbf1b99..8d5588de06e 100644 --- a/app/views/admin/sessions/_two_factor_otp.html.haml +++ b/app/views/admin/sessions/_two_factor_otp.html.haml @@ -1,4 +1,4 @@ -= form_tag(admin_session_path, { method: :post, class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if current_user.two_factor_u2f_enabled?}" }) do += form_tag(admin_session_path, { method: :post, class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if current_user.two_factor_webauthn_u2f_enabled?}" }) do .form-group = label_tag :user_otp_attempt, _('Two-Factor Authentication code') = text_field_tag 'user[otp_attempt]', nil, class: 'form-control', required: true, autofocus: true, autocomplete: 'off', title: _('This field is required.') diff --git a/app/views/admin/sessions/two_factor.html.haml b/app/views/admin/sessions/two_factor.html.haml index 746d57dbad1..531ab206157 100644 --- a/app/views/admin/sessions/two_factor.html.haml +++ b/app/views/admin/sessions/two_factor.html.haml @@ -11,5 +11,5 @@ .login-body - if current_user.two_factor_otp_enabled? = render 'admin/sessions/two_factor_otp' - - if current_user.two_factor_u2f_enabled? - = render 'u2f/authenticate', render_remember_me: false, target_path: admin_session_path + - if current_user.two_factor_webauthn_u2f_enabled? + = render 'authentication/authenticate', render_remember_me: false, target_path: admin_session_path diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 38c6c8b2a62..9e31c8d2852 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -87,8 +87,8 @@ .form-actions - if @user.new_record? - = f.submit 'Create user', class: "btn btn-success" + = f.submit 'Create user', class: "btn gl-button btn-success" = link_to 'Cancel', admin_users_path, class: "btn btn-cancel" - else - = f.submit 'Save changes', class: "btn btn-success" - = link_to 'Cancel', admin_user_path(@user), class: "btn btn-cancel" + = f.submit 'Save changes', class: "btn gl-button btn-success" + = link_to 'Cancel', admin_user_path(@user), class: "btn gl-button btn-cancel" diff --git a/app/views/admin/users/_modals.html.haml b/app/views/admin/users/_modals.html.haml index eaec6d69f5a..6cf6dc116e3 100644 --- a/app/views/admin/users/_modals.html.haml +++ b/app/views/admin/users/_modals.html.haml @@ -16,7 +16,7 @@ 'secondary-action': s_('AdminUsers|Block user') } } = s_('AdminUsers|You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide "Ghost-user". To avoid data loss, - consider using the %{strong_start}block user%{strong_end} feature instead. Once you %{strong_start}Delete user%{strong_end}, + consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered.') %div{ data: { modal: "delete-with-contributions", diff --git a/app/views/admin/users/_user.html.haml b/app/views/admin/users/_user.html.haml index 440eaac1917..160303890f5 100644 --- a/app/views/admin/users/_user.html.haml +++ b/app/views/admin/users/_user.html.haml @@ -17,9 +17,9 @@ - unless user.internal? .table-section.section-20.table-button-footer .table-action-buttons - = link_to _('Edit'), edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: 'btn btn-default' + = link_to _('Edit'), edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: 'btn gl-button btn-default' - unless user == current_user - %button.dropdown-new.btn.btn-default{ type: 'button', data: { toggle: 'dropdown' } } + %button.dropdown-new.btn.gl-button.btn-default{ type: 'button', data: { toggle: 'dropdown' } } = sprite_icon('settings') = sprite_icon('chevron-down') %ul.dropdown-menu.dropdown-menu-right @@ -32,13 +32,13 @@ - elsif user.blocked? = link_to _('Unblock'), unblock_admin_user_path(user), method: :put - else - %button.btn{ data: { 'gl-modal-action': 'block', + %button.btn.gl-button.btn-default-tertiary{ data: { 'gl-modal-action': 'block', url: block_admin_user_path(user), username: sanitize_name(user.name) } } = s_('AdminUsers|Block') - if user.can_be_deactivated? %li - %button.btn{ data: { 'gl-modal-action': 'deactivate', + %button.btn.gl-button.btn-default-tertiary{ data: { 'gl-modal-action': 'deactivate', url: deactivate_admin_user_path(user), username: sanitize_name(user.name) } } = s_('AdminUsers|Deactivate') @@ -52,13 +52,13 @@ %li.divider - if user.can_be_removed? %li - %button.delete-user-button.btn.text-danger{ data: { 'gl-modal-action': 'delete', + %button.delete-user-button.btn.gl-button.btn-default-tertiary.text-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') %li - %button.delete-user-button.btn.text-danger{ data: { 'gl-modal-action': 'delete-with-contributions', + %button.delete-user-button.btn.gl-button.btn-default-tertiary.text-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: sanitize_name(user.name) } } diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 05988c17412..118bdf7bb17 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -40,7 +40,7 @@ %small.badge.badge-pill= limited_counter_with_delimiter(User.without_projects) .nav-controls = render_if_exists 'admin/users/admin_email_users' - = link_to s_('AdminUsers|New user'), new_admin_user_path, class: 'btn btn-success btn-search float-right' + = link_to s_('AdminUsers|New user'), new_admin_user_path, class: 'btn gl-button btn-success btn-search float-right' .filtered-search-block.row-content-block.border-top-0 = form_tag admin_users_path, method: :get do diff --git a/app/views/admin/users/new.html.haml b/app/views/admin/users/new.html.haml index e5e6790b789..08aa7c3c9d2 100644 --- a/app/views/admin/users/new.html.haml +++ b/app/views/admin/users/new.html.haml @@ -1,5 +1,5 @@ - page_title _("New User") %h3.page-title - New user + = s_('AdminUsers|New user') %hr = render 'form' diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml index f66d9b76afc..70a497f14ff 100644 --- a/app/views/admin/users/projects.html.haml +++ b/app/views/admin/users/projects.html.haml @@ -16,8 +16,8 @@ .float-right %span.light.vertical-align-middle= group_member.human_access - unless group_member.owner? - = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member) }, method: :delete, remote: true, class: "btn-sm btn btn-remove gl-ml-3", title: 'Remove user from group' do - %i.fa.fa-times.fa-inverse + = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), testid: 'remove-user' }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do + = sprite_icon('close', size: 16, css_class: 'gl-icon') .row .col-md-6 @@ -46,5 +46,5 @@ %span.light.vertical-align-middle= member.human_access - if member.respond_to? :project - = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member) }, remote: true, method: :delete, class: "btn-sm btn btn-remove gl-ml-3", title: 'Remove user from project' do - %i.fa.fa-times + = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member) }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: 'Remove user from project' do + = sprite_icon('close', size: 16, css_class: 'gl-icon') diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 2bc39a23b2d..a08c29714e0 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -38,19 +38,23 @@ %span.light Secondary email: %strong = render partial: 'shared/email_with_badge', locals: { email: email.email, verified: email.confirmed? } - = link_to remove_email_admin_user_path(@user, email), data: { confirm: "Are you sure you want to remove #{email.email}?" }, method: :delete, class: "btn-sm btn btn-remove float-right", title: 'Remove secondary email', id: "remove_email_#{email.id}" do - %i.fa.fa-times + = link_to remove_email_admin_user_path(@user, email), data: { confirm: "Are you sure you want to remove #{email.email}?" }, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon float-right", title: 'Remove secondary email', id: "remove_email_#{email.id}" do + = sprite_icon('close', size: 16, css_class: 'gl-icon') %li %span.light ID: %strong = @user.id + %li + %span.light= _('Namespace ID:') + %strong + = @user.namespace_id %li.two-factor-status %span.light Two-factor Authentication: %strong{ class: @user.two_factor_enabled? ? 'cgreen' : 'cred' } - if @user.two_factor_enabled? Enabled - = link_to 'Disable', disable_two_factor_admin_user_path(@user), data: {confirm: 'Are you sure?'}, method: :patch, class: 'btn btn-sm btn-remove float-right', title: 'Disable Two-factor Authentication' + = link_to 'Disable', disable_two_factor_admin_user_path(@user), data: {confirm: 'Are you sure?'}, method: :patch, class: 'btn gl-button btn-sm btn-remove float-right', title: 'Disable Two-factor Authentication' - else Disabled @@ -142,7 +146,7 @@ - email = " (#{@user.unconfirmed_email})" %p This user has an unconfirmed email address#{email}. You may force a confirmation. %br - = link_to 'Confirm user', confirm_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?', qa_selector: 'confirm_user_button' } + = link_to 'Confirm user', confirm_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: 'Are you sure?', qa_selector: 'confirm_user_button' } = render 'admin/users/user_detail_note' @@ -153,7 +157,7 @@ .card-body = render partial: 'admin/users/user_activation_effects' %br - = link_to 'Activate user', activate_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } + = link_to 'Activate user', activate_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: 'Are you sure?' } - elsif @user.can_be_deactivated? .card.border-warning .card-header.bg-warning.text-white @@ -161,7 +165,7 @@ .card-body = render partial: 'admin/users/user_deactivation_effects' %br - %button.btn.btn-warning{ data: { 'gl-modal-action': 'deactivate', + %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) } } @@ -177,7 +181,7 @@ %li Log in %li Access Git repositories %br - = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } + = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: 'Are you sure?' } - else .card.border-warning .card-header.bg-warning.text-white @@ -185,7 +189,7 @@ .card-body = render partial: 'admin/users/user_block_effects' %br - %button.btn.btn-warning{ data: { 'gl-modal-action': 'block', + %button.btn.gl-button.btn-warning{ data: { 'gl-modal-action': 'block', content: 'You can always unblock their account, their data will remain intact.', url: block_admin_user_path(@user), username: sanitize_name(@user.name) } } @@ -197,7 +201,7 @@ .card-body %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 btn-info", data: { confirm: 'Are you sure?' } + = 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 @@ -207,7 +211,7 @@ %p Deleting a user has the following effects: = render 'users/deletion_guidance', user: @user %br - %button.delete-user-button.btn.btn-danger{ data: { 'gl-modal-action': 'delete', + %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) } } @@ -237,7 +241,7 @@ the user, and projects in them, will also be removed. Commits to other projects are unaffected. %br - %button.delete-user-button.btn.btn-danger{ data: { 'gl-modal-action': 'delete-with-contributions', + %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 } } diff --git a/app/views/u2f/_authenticate.html.haml b/app/views/authentication/_authenticate.html.haml index 6658d70df8d..17e855dbddd 100644 --- a/app/views/u2f/_authenticate.html.haml +++ b/app/views/authentication/_authenticate.html.haml @@ -6,7 +6,7 @@ %script#js-authenticate-token-2fa-error{ type: "text/template" } %div - %p <%= error_message %> (#{_("error code:")} <%= error_code %>) + %p <%= error_message %> (<%= error_name %>) %a.btn.btn-block.btn-warning#js-token-2fa-try-again= _("Try again?") %script#js-authenticate-token-2fa-authenticated{ type: "text/template" } diff --git a/app/views/authentication/_register.html.haml b/app/views/authentication/_register.html.haml new file mode 100644 index 00000000000..f1aa76d115a --- /dev/null +++ b/app/views/authentication/_register.html.haml @@ -0,0 +1,36 @@ +#js-register-token-2fa + +%script#js-register-2fa-message{ type: "text/template" } + %p <%= message %> + +%script#js-register-token-2fa-setup{ type: "text/template" } + - if current_user.two_factor_otp_enabled? + .row.gl-mb-3 + .col-md-5 + %button#js-setup-token-2fa-device.btn.btn-info= _("Set up new device") + .col-md-7 + %p= _("Your device needs to be set up. Plug it in (if needed) and click the button on the left.") + - else + .row.gl-mb-3 + .col-md-4 + %button#js-setup-token-2fa-device.btn.btn-info.btn-block{ disabled: true }= _("Set up new device") + .col-md-8 + %p= _("You need to register a two-factor authentication app before you can set up a device.") + +%script#js-register-token-2fa-error{ type: "text/template" } + %div + %p + %span <%= error_message %> (<%= error_name %>) + %a.btn.btn-warning#js-token-2fa-try-again= _("Try again?") + +%script#js-register-token-2fa-registered{ type: "text/template" } + .row.gl-mb-3 + .col-md-12 + %p= _("Your device was successfully set up! Give it a name and register it with the GitLab server.") + = form_tag(target_path, method: :post) do + .row.gl-mb-3 + .col-md-3 + = text_field_tag 'device_registration[name]', nil, class: 'form-control', placeholder: _("Pick a name") + .col-md-3 + = hidden_field_tag 'device_registration[device_response]', nil, class: 'form-control', required: true, id: "js-device-response" + = submit_tag _("Register device"), class: "btn btn-success" diff --git a/app/views/ci/status/_dropdown_graph_badge.html.haml b/app/views/ci/status/_dropdown_graph_badge.html.haml index 69cb41b1713..4c8bb84c9ef 100644 --- a/app/views/ci/status/_dropdown_graph_badge.html.haml +++ b/app/views/ci/status/_dropdown_graph_badge.html.haml @@ -8,12 +8,12 @@ - if status.has_details? = link_to status.details_path, class: 'mini-pipeline-graph-dropdown-item d-flex', data: { toggle: 'tooltip', title: tooltip, container: 'body' } do %span{ class: klass }= sprite_icon(status.icon) - %span.ci-build-text.text-truncate.mw-70p.gl-pl-1-deprecated-no-really-do-not-use-me= subject.name + %span.ci-build-text.text-truncate.mw-70p.gl-pl-2= subject.name - else .menu-item.mini-pipeline-graph-dropdown-item.d-flex{ data: { toggle: 'tooltip', title: tooltip, container: 'body' } } %span{ class: klass }= sprite_icon(status.icon) - %span.ci-build-text.text-truncate.mw-70p.gl-pl-1-deprecated-no-really-do-not-use-me= subject.name + %span.ci-build-text.text-truncate.mw-70p.gl-pl-2= subject.name - if status.has_action? = link_to status.action_path, class: "gl-button ci-action-icon-container ci-action-icon-wrapper js-ci-action-icon", method: status.action_method, data: { toggle: 'tooltip', title: status.action_title, container: 'body' } do diff --git a/app/views/ci/variables/_header.html.haml b/app/views/ci/variables/_header.html.haml index d0148e455de..f4e2a8584d8 100644 --- a/app/views/ci/variables/_header.html.haml +++ b/app/views/ci/variables/_header.html.haml @@ -2,7 +2,7 @@ %h4 = _('Variables') - = link_to icon('question-circle'), help_page_path('ci/variables/README', anchor: 'custom-environment-variables'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o', css_class: 'gl-vertical-align-baseline!'), help_page_path('ci/variables/README', anchor: 'custom-environment-variables'), target: '_blank', rel: 'noopener noreferrer' %button.btn.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') diff --git a/app/views/ci/variables/_variable_row.html.haml b/app/views/ci/variables/_variable_row.html.haml index 542a41c2f7d..193ec8abf04 100644 --- a/app/views/ci/variables/_variable_row.html.haml +++ b/app/views/ci/variables/_variable_row.html.haml @@ -39,7 +39,7 @@ = value %p.masking-validation-error.gl-field-error.hide = s_("CiVariables|Cannot use Masked Variable with current value") - = link_to icon('question-circle'), help_page_path('ci/variables/README', anchor: 'mask-a-custom-variable'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('ci/variables/README', anchor: 'mask-a-custom-variable'), target: '_blank', rel: 'noopener noreferrer' - unless only_key_value .ci-variable-body-item.ci-variable-protected-item.table-section.section-20.mr-0.border-top-0 .gl-mr-3 diff --git a/app/views/clusters/clusters/_banner.html.haml b/app/views/clusters/clusters/_banner.html.haml index 3461831eda2..4a84745cf98 100644 --- a/app/views/clusters/clusters/_banner.html.haml +++ b/app/views/clusters/clusters/_banner.html.haml @@ -8,14 +8,14 @@ .hidden.row.js-cluster-api-unreachable.gl-alert.gl-alert-warning{ role: 'alert' } = sprite_icon('warning', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') - %button.js-close-banner.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') } + %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') } = sprite_icon('close', css_class: 'gl-icon') .gl-alert-body = s_('ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct.') .hidden.js-cluster-authentication-failure.js-cluster-api-unreachable.gl-alert.gl-alert-warning{ role: 'alert' } = sprite_icon('warning', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') - %button.js-close-banner.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') } + %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') } = sprite_icon('close', css_class: 'gl-icon') .gl-alert-body = s_('ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid.') diff --git a/app/views/clusters/clusters/aws/_new.html.haml b/app/views/clusters/clusters/aws/_new.html.haml index ec604ca83e5..3eab9b46fb3 100644 --- a/app/views/clusters/clusters/aws/_new.html.haml +++ b/app/views/clusters/clusters/aws/_new.html.haml @@ -1,6 +1,6 @@ - if !Gitlab::CurrentSettings.eks_integration_enabled? - documentation_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/clusters/add_eks_clusters.md', - anchor: 'additional-requirements-for-self-managed-instances-core-only') } + anchor: 'additional-requirements-for-self-managed-instances') } = s_('Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service.').html_safe % { link_start: documentation_link_start, link_end: '<a/>'.html_safe } - else .js-create-eks-cluster-form-container{ data: { 'gitlab-managed-cluster-help-path' => help_page_path('user/project/clusters/index.md', anchor: 'gitlab-managed-clusters'), diff --git a/app/views/clusters/clusters/new.html.haml b/app/views/clusters/clusters/new.html.haml index 0a51d4b2e93..ff33fb46db8 100644 --- a/app/views/clusters/clusters/new.html.haml +++ b/app/views/clusters/clusters/new.html.haml @@ -16,8 +16,8 @@ %span = create_new_cluster_label(provider: params[:provider]) %li.nav-item{ role: 'presentation' } - %a.nav-link{ href: '#add-cluster-pane', id: 'add-cluster-tab', class: active_when(active_tab == 'add'), data: { toggle: 'tab' }, role: 'tab' } - %span Add existing cluster + %a.nav-link{ href: '#add-cluster-pane', id: 'add-cluster-tab', class: active_when(active_tab == 'add'), data: { toggle: 'tab', qa_selector: 'add_existing_cluster_tab' }, role: 'tab' } + %span= s_('ClusterIntegration|Connect existing cluster') .tab-content.gitlab-tab-content .tab-pane.p-0{ id: 'create-cluster-pane', class: active_when(active_tab == 'create'), role: 'tabpanel' } @@ -28,5 +28,5 @@ = render "clusters/clusters/#{provider}/new" .tab-pane{ id: 'add-cluster-pane', class: active_when(active_tab == 'add'), role: 'tabpanel' } - = render 'clusters/clusters/user/header' + #js-cluster-new{ data: js_cluster_new } = render 'clusters/clusters/user/form' diff --git a/app/views/clusters/clusters/user/_header.html.haml b/app/views/clusters/clusters/user/_header.html.haml deleted file mode 100644 index b0a24ee464f..00000000000 --- a/app/views/clusters/clusters/user/_header.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%h4 - = s_('ClusterIntegration|Enter the details for your Kubernetes cluster') -%p - - link_to_help_page = link_to(s_('ClusterIntegration|documentation'), help_page_path('user/project/clusters/add_remove_clusters', anchor: 'add-existing-cluster'), target: '_blank', rel: 'noopener noreferrer') - = s_('ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes').html_safe % { link_to_help_page: link_to_help_page } diff --git a/app/views/dashboard/projects/index.html.haml b/app/views/dashboard/projects/index.html.haml index 54a5624c6dd..d458f1d8eba 100644 --- a/app/views/dashboard/projects/index.html.haml +++ b/app/views/dashboard/projects/index.html.haml @@ -5,11 +5,12 @@ - if show_customize_homepage_banner?(@customize_homepage) = content_for :customize_homepage_banner do - .d-none.d-md-block{ class: "gl-pt-6! gl-pb-2! #{(container_class unless @no_container)} #{@content_class}" } + .gl-display-none.gl-display-md-block{ class: "gl-pt-6! gl-pb-2! #{(container_class unless @no_container)} #{@content_class}" } .js-customize-homepage-banner{ data: { svg_path: image_path('illustrations/monitoring/getting_started.svg'), preferences_behavior_path: profile_preferences_path(anchor: 'behavior'), callouts_path: user_callouts_path, - callouts_feature_id: UserCalloutsHelper::CUSTOMIZE_HOMEPAGE } } + callouts_feature_id: UserCalloutsHelper::CUSTOMIZE_HOMEPAGE, + track_label: 'home_page' } } = render_dashboard_gold_trial(current_user) diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml index 9b6150c4be2..9c6a6be1bc3 100644 --- a/app/views/dashboard/todos/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -3,6 +3,7 @@ - header_title _("To-Do List"), dashboard_todos_path = render_dashboard_gold_trial(current_user) += stylesheet_link_tag 'page_bundles/todos' .page-title-holder.d-flex.align-items-center %h1.page-title= _('To-Do List') @@ -26,10 +27,10 @@ .nav-controls - if @todos.any?(&:pending?) .gl-mr-3 - = link_to destroy_all_dashboard_todos_path(todos_filter_params), class: 'btn btn-loading d-flex align-items-center js-todos-mark-all', method: :delete, data: { href: destroy_all_dashboard_todos_path(todos_filter_params) } do + = link_to destroy_all_dashboard_todos_path(todos_filter_params), class: 'btn btn-loading align-items-center js-todos-mark-all', method: :delete, data: { href: destroy_all_dashboard_todos_path(todos_filter_params) } do Mark all as done %span.spinner.ml-1 - = link_to bulk_restore_dashboard_todos_path, class: 'btn btn-loading d-flex align-items-center js-todos-undo-all hidden', method: :patch , data: { href: bulk_restore_dashboard_todos_path(todos_filter_params) } do + = link_to bulk_restore_dashboard_todos_path, class: 'btn btn-loading align-items-center js-todos-undo-all hidden', method: :patch , data: { href: bulk_restore_dashboard_todos_path(todos_filter_params) } do Undo mark all as done %span.spinner.ml-1 @@ -80,7 +81,7 @@ = link_to todos_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created -.js-todos-all +.todos-list-container.js-todos-all - if @todos.any? .js-todos-list-container .js-todos-options{ data: { per_page: @todos.limit_value, current_page: @todos.current_page, total_pages: @todos.total_pages } } diff --git a/app/views/devise/mailer/password_change_by_admin.html.haml b/app/views/devise/mailer/password_change_by_admin.html.haml new file mode 100644 index 00000000000..d72f36838c5 --- /dev/null +++ b/app/views/devise/mailer/password_change_by_admin.html.haml @@ -0,0 +1,6 @@ += email_default_heading(say_hello(@resource)) + +%p + = admin_changed_password_text(format: :html) +%p + = contact_your_administrator_text diff --git a/app/views/devise/mailer/password_change_by_admin.text.erb b/app/views/devise/mailer/password_change_by_admin.text.erb new file mode 100644 index 00000000000..d0e7ab98641 --- /dev/null +++ b/app/views/devise/mailer/password_change_by_admin.text.erb @@ -0,0 +1,5 @@ +<%= say_hello(@resource) %> + +<%= admin_changed_password_text %> + +<%= contact_your_administrator_text %> diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index afdf3c38567..2f75203ac62 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -8,7 +8,7 @@ = _("GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security.") .col-lg-5.order-12 .text-center.mb-3 - %h2.font-weight-bold.gl-font-size-20-deprecated-no-really-do-not-use-me= _('Register for GitLab') + %h2.font-weight-bold= _('Register for GitLab') = render 'devise/shared/experimental_separate_sign_up_flow_box' = render 'devise/shared/sign_in_link' - else diff --git a/app/views/devise/sessions/two_factor.html.haml b/app/views/devise/sessions/two_factor.html.haml index 115ebc94238..8e05488c091 100644 --- a/app/views/devise/sessions/two_factor.html.haml +++ b/app/views/devise/sessions/two_factor.html.haml @@ -3,7 +3,7 @@ .login-box .login-body - if @user.two_factor_otp_enabled? - = form_for(resource, as: resource_name, url: session_path(resource_name), method: :post, html: { class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if @user.two_factor_u2f_enabled?}" }) do |f| + = form_for(resource, as: resource_name, url: session_path(resource_name), method: :post, html: { class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if @user.two_factor_webauthn_u2f_enabled?}" }) do |f| - resource_params = params[resource_name].presence || params = f.hidden_field :remember_me, value: resource_params.fetch(:remember_me, 0) %div @@ -12,6 +12,5 @@ %p.form-text.text-muted.hint Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes. .prepend-top-20 = f.submit "Verify code", class: "btn btn-success", data: { qa_selector: 'verify_code_button' } - - - if @user.two_factor_u2f_enabled? - = render "u2f/authenticate", params: params, resource: resource, resource_name: resource_name, render_remember_me: true, target_path: new_user_session_path + - if @user.two_factor_webauthn_u2f_enabled? + = render "authentication/authenticate", params: params, resource: resource, resource_name: resource_name, render_remember_me: true, target_path: new_user_session_path diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml index 0da51d460e3..07ef9a7914a 100644 --- a/app/views/devise/shared/_signup_box.html.haml +++ b/app/views/devise/shared/_signup_box.html.haml @@ -20,9 +20,6 @@ .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 - = f.label :email_confirmation, class: 'label-bold' - = f.email_field :email_confirmation, class: "form-control middle", data: { qa_selector: 'new_user_email_confirmation_field' }, required: true, title: _("Please retype the email address.") .form-group.append-bottom-20#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: _("Minimum length is %{minimum_password_length} characters.") % { minimum_password_length: @minimum_password_length } diff --git a/app/views/doorkeeper/applications/_delete_form.html.haml b/app/views/doorkeeper/applications/_delete_form.html.haml index ac5cac50699..77b7a50338c 100644 --- a/app/views/doorkeeper/applications/_delete_form.html.haml +++ b/app/views/doorkeeper/applications/_delete_form.html.haml @@ -5,6 +5,6 @@ = button_tag type: "submit", class: "btn btn-transparent", data: { confirm: _("Are you sure?") } do %span.sr-only = _('Destroy') - = icon('trash') + = sprite_icon('remove') - else = submit_tag _('Destroy'), data: { confirm: _("Are you sure?") }, class: submit_btn_css diff --git a/app/views/doorkeeper/applications/_form.html.haml b/app/views/doorkeeper/applications/_form.html.haml index 7fbaa35d1d5..f99db696fd6 100644 --- a/app/views/doorkeeper/applications/_form.html.haml +++ b/app/views/doorkeeper/applications/_form.html.haml @@ -11,9 +11,6 @@ %span.form-text.text-muted = _('Use one line per URI') - - if Doorkeeper.configuration.native_redirect_uri - %span.form-text.text-muted - = html_escape(_('Use %{native_redirect_uri} for local tests')) % { native_redirect_uri: tag.code(Doorkeeper.configuration.native_redirect_uri) } .form-group.form-check = f.check_box :confidential, class: 'form-check-input' diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml index dc16c46476e..a38d6dd3836 100644 --- a/app/views/events/event/_common.html.haml +++ b/app/views/events/event/_common.html.haml @@ -11,7 +11,7 @@ = link_to event.target_link_options, class: 'has-tooltip event-target-link gl-mr-2', title: event.target_title do = event.target.reference_link_text - unless event.milestone? - %span.event-target-title.gl-mr-2{ dir: "auto" } + %span.event-target-title.gl-text-overflow-ellipsis.gl-overflow-hidden.gl-mr-2{ dir: "auto" } = """.html_safe + event.target.title + """.html_safe - else %span.event-type.d-inline-block.gl-mr-2{ class: event.action_name } diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml index a81b999acba..4e936025c74 100644 --- a/app/views/events/event/_note.html.haml +++ b/app/views/events/event/_note.html.haml @@ -9,7 +9,7 @@ = event_note_title_html(event) - title = note_target_title(event.target) - if title.present? - %span.event-target-title.gl-mr-2{ dir: "auto" } + %span.event-target-title.gl-text-overflow-ellipsis.gl-overflow-hidden.gl-mr-2{ dir: "auto" } = """.html_safe + title + """.html_safe = render "events/event_scope", event: event diff --git a/app/views/groups/_group_admin_settings.html.haml b/app/views/groups/_group_admin_settings.html.haml index 75a0706ee84..393ab8013e7 100644 --- a/app/views/groups/_group_admin_settings.html.haml +++ b/app/views/groups/_group_admin_settings.html.haml @@ -7,7 +7,7 @@ = f.label :lfs_enabled, class: 'form-check-label' do %strong Allow projects within this group to use Git LFS - = link_to icon('question-circle'), help_page_path('topics/git/lfs/index') + = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index') %br/ %span This setting can be overridden in each project. .form-group.row @@ -31,7 +31,7 @@ = f.label :require_two_factor_authentication, class: 'form-check-label' do %strong Require all users in this group to set up Two-factor authentication - = link_to icon('question-circle'), help_page_path('security/two_factor_authentication', anchor: 'enforcing-2fa-for-all-users-in-a-group') + = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforcing-2fa-for-all-users-in-a-group') .form-group.row .offset-sm-2.col-sm-10 .form-check diff --git a/app/views/groups/_import_group_pane.html.haml b/app/views/groups/_import_group_pane.html.haml index adfac7d59a5..9ad8ebbb37d 100644 --- a/app/views/groups/_import_group_pane.html.haml +++ b/app/views/groups/_import_group_pane.html.haml @@ -41,7 +41,7 @@ = 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|GitLab group export'), class: 'label-bold' + = 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 diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml index c8e58a50b18..ed7b201323a 100644 --- a/app/views/groups/group_members/index.html.haml +++ b/app/views/groups/group_members/index.html.haml @@ -3,6 +3,8 @@ - show_invited_members = can_manage_members && @invited_members.exists? - 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) +- data_attributes = { group_id: @group.id } - form_item_label_css_class = 'label-bold gl-mr-2 gl-mb-0 gl-py-2 align-self-md-center' @@ -66,18 +68,24 @@ = 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' - %ul.content-list.members-list{ data: { qa_selector: 'members_list' } } - = render partial: 'shared/members/member', collection: @members, as: :member - = paginate @members, theme: 'gitlab', params: { invited_members_page: nil, search_invited: nil } + - if vue_members_list_enabled + .js-group-members-list{ data: { members: members_data_json(@group, @members), **data_attributes } } + - else + %ul.content-list.members-list{ data: { qa_selector: 'members_list' } } + = render partial: 'shared/members/member', collection: @members, as: :member + = paginate @members, theme: 'gitlab', params: { invited_members_page: nil, search_invited: nil } - 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: '<strong>'.html_safe, strong_end: '</strong>'.html_safe } - %ul.content-list.members-list{ data: { qa_selector: 'groups_list' } } - - @group.shared_with_group_links.each do |group_link| - = render 'shared/members/group', group_link: group_link, can_admin_member: can_manage_members, group_link_path: group_group_link_path(@group, group_link) + - if vue_members_list_enabled + .js-group-linked-list{ data: { members: linked_groups_data_json(@group.shared_with_group_links), **data_attributes } } + - else + %ul.content-list.members-list{ data: { qa_selector: 'groups_list' } } + - @group.shared_with_group_links.each do |group_link| + = render 'shared/members/group', group_link: group_link, can_admin_member: can_manage_members, group_link_path: group_group_link_path(@group, group_link) - if show_invited_members #tab-invited-members.tab-pane{ class: ('active' if invited_active) } .card.card-without-border @@ -86,14 +94,20 @@ = html_escape(_('Members invited to %{strong_start}%{group_name}%{strong_end}')) % { group_name: @group.name, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.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' - %ul.content-list.members-list - = render partial: 'shared/members/member', collection: @invited_members, as: :member - = paginate @invited_members, param_name: 'invited_members_page', theme: 'gitlab', params: { page: nil } + - if vue_members_list_enabled + .js-group-invited-members-list{ data: { members: members_data_json(@group, @invited_members), **data_attributes } } + - else + %ul.content-list.members-list + = render partial: 'shared/members/member', collection: @invited_members, as: :member + = paginate @invited_members, param_name: 'invited_members_page', theme: 'gitlab', params: { page: nil } - 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: '<strong>'.html_safe, strong_end: '</strong>'.html_safe } - %ul.content-list.members-list - = render partial: 'shared/members/member', collection: @requesters, as: :member + - if vue_members_list_enabled + .js-group-access-requests-list{ data: { members: members_data_json(@group, @requesters), **data_attributes } } + - else + %ul.content-list.members-list + = render partial: 'shared/members/member', collection: @requesters, as: :member diff --git a/app/views/groups/packages/_legacy_package_list.haml b/app/views/groups/packages/_legacy_package_list.haml deleted file mode 100644 index 481a0dbb6e8..00000000000 --- a/app/views/groups/packages/_legacy_package_list.haml +++ /dev/null @@ -1,59 +0,0 @@ -- sort_value = @sort -- sort_title = packages_sort_option_title(sort_value) - -- if @packages.any? - .d-flex.justify-content-end - .dropdown.inline.gl-mt-3.gl-mb-3.package-sort-dropdown - .btn-group{ role: 'group' } - .btn-group{ role: 'group' } - %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static', 'qa-selector': 'sort-dropdown-button' }, class: 'btn btn-default' } - = sort_title - = icon('chevron-down') - %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort - %li - = sortable_item(sort_title_created_date, package_sort_path(sort: sort_value_recently_created), sort_title) - = sortable_item(sort_title_name, package_sort_path(sort: sort_value_name_desc), sort_title) - = sortable_item(sort_title_project_name, package_sort_path(sort: sort_value_project_name_desc), sort_title) - = sortable_item(sort_title_version, package_sort_path(sort: sort_value_version_desc), sort_title) - = sortable_item(sort_title_type, package_sort_path(sort: sort_value_type_desc), sort_title) - = packages_sort_direction_button(sort_value) - - .table-holder - .gl-responsive-table-row.table-row-header.bg-secondary-50.px-2.border-top{ role: 'row' } - .table-section.section-30{ role: 'rowheader' } - = _('Name') - .table-section.section-20{ role: 'rowheader' } - = _('Project') - .table-section.section-20{ role: 'rowheader' } - = _('Version') - .table-section.section-10{ role: 'rowheader' } - = _('Type') - .table-section.section-20{ role: 'rowheader' } - = _('Created') - - @packages.each do |package| - .gl-responsive-table-row{ data: { 'qa-selector': 'package-row' } } - .table-section.section-30 - .table-mobile-header{ role: "rowheader" }= _("Name") - .table-mobile-content.flex-truncate-parent - = link_to package.name, project_package_path(package.project, package), class: 'flex-truncate-child' - .table-section.section-20 - .table-mobile-header{ role: "rowheader" }= _("Project") - .table-mobile-content - = link_to_project(package.project) - .table-section.section-20 - .table-mobile-header{ role: "rowheader" }= _("Version") - .table-mobile-content - = package.version - .table-section.section-10 - .table-mobile-header{ role: "rowheader" }= _("Type") - .table-mobile-content - = package.package_type - .table-section.section-20 - .table-mobile-header{ role: "rowheader" }= _("Created") - .table-mobile-content - = time_ago_with_tooltip(package.created_at) - = paginate @packages, theme: "gitlab" -- else - .row.empty-state - .col-12 - = render 'shared/packages/no_packages' diff --git a/app/views/groups/packages/index.html.haml b/app/views/groups/packages/index.html.haml index b07c08f50ca..7910217c939 100644 --- a/app/views/groups/packages/index.html.haml +++ b/app/views/groups/packages/index.html.haml @@ -1,4 +1,5 @@ -- page_title _("Packages") +- page_title _("Package Registry") +- @content_class = "limit-container-width" unless fluid_layout .row .col-12 diff --git a/app/views/groups/runners/_index.html.haml b/app/views/groups/runners/_index.html.haml index 51375f50659..e885fcc08eb 100644 --- a/app/views/groups/runners/_index.html.haml +++ b/app/views/groups/runners/_index.html.haml @@ -73,7 +73,7 @@ {{name}} = button_tag class: 'clear-search hidden' do - = icon('times') + = sprite_icon('close', size: 16, css_class: 'clear-search-icon') .filter-dropdown-container = render 'admin/runners/sort_dropdown' diff --git a/app/views/groups/runners/_runner.html.haml b/app/views/groups/runners/_runner.html.haml index 07cbcd8401e..3fc50cc86d2 100644 --- a/app/views/groups/runners/_runner.html.haml +++ b/app/views/groups/runners/_runner.html.haml @@ -79,8 +79,8 @@ - if runner.belongs_to_more_than_one_project? .btn-group .btn.btn-danger.has-tooltip{ 'aria-label' => 'Remove', 'data-container' => 'body', 'data-original-title' => _('Multi-project Runners cannot be removed'), 'data-placement' => 'top', disabled: 'disabled' } - = icon('remove') + = sprite_icon('close') - else .btn-group = link_to group_runner_path(@group, runner), method: :delete, class: 'btn btn-danger has-tooltip', title: _('Remove'), ref: 'tooltip', aria: { label: _('Remove') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?') } do - = icon('remove') + = sprite_icon('close') diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml index 139c710fac0..8fad73f1249 100644 --- a/app/views/groups/settings/ci_cd/_form.html.haml +++ b/app/views/groups/settings/ci_cd/_form.html.haml @@ -8,6 +8,6 @@ = f.number_field :max_artifacts_size, class: 'form-control' %p.form-text.text-muted = _("Set the maximum file size for each job's artifacts") - = link_to icon('question-circle'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size-core-only'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank' = f.submit _('Save changes'), class: "btn btn-success" diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml index 366d7dd5afe..5b5f357dbec 100644 --- a/app/views/groups/settings/ci_cd/show.html.haml +++ b/app/views/groups/settings/ci_cd/show.html.haml @@ -11,7 +11,7 @@ .settings-header %h4 = _("General pipelines") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _("Customize your pipeline configuration.") @@ -28,7 +28,7 @@ .settings-header %h4 = _('Runners') - %button.btn.btn-default.js-settings-toggle{ type: "button" } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: "button" } = expanded ? _('Collapse') : _('Expand') %p = _("Runners are processes that pick up and execute jobs for GitLab. Here you can register and see your Runners for this project.") @@ -40,7 +40,7 @@ .settings-header %h4 = _('Auto DevOps') - %button.btn.btn-default.js-settings-toggle{ type: "button" } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: "button" } = expanded ? _('Collapse') : _('Expand') %p - auto_devops_url = help_page_path('topics/autodevops/index') diff --git a/app/views/groups/settings/integrations/index.html.haml b/app/views/groups/settings/integrations/index.html.haml index 96bd6d69a96..f62eb17d236 100644 --- a/app/views/groups/settings/integrations/index.html.haml +++ b/app/views/groups/settings/integrations/index.html.haml @@ -5,5 +5,5 @@ %h4= s_('GroupSettings|Apply integration settings to all Projects') %p = s_('GroupSettings|Integrations configured here will automatically apply to all projects in this group.') - = link_to _('Learn more'), '#' + = link_to _('Learn more'), integrations_help_page_path, target: '_blank', rel: 'noopener noreferrer' = render 'shared/integrations/index', integrations: @integrations diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 6ad864121d7..ec4ab603d22 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -2,48 +2,55 @@ - page_title _("Groups") - @content_class = "limit-container-width" unless fluid_layout +- if show_invite_banner?(@group) + = content_for :group_invite_members_banner do + .container-fluid.container-limited{ class: "gl-pb-2! gl-pt-6! #{@content_class}" } + .js-group-invite-members-banner{ data: { svg_path: image_path('illustrations/merge_requests.svg'), + is_dismissed_key: "invite_#{@group.id}_#{current_user.id}", + track_label: 'invite_members_banner', + invite_members_path: group_group_members_path(@group) } } + = content_for :meta_tags do = auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity") = render partial: 'flash_messages' -%div{ class: [("limit-container-width" unless fluid_layout)] } - = render_if_exists 'trials/banner', namespace: @group += render_if_exists 'trials/banner', namespace: @group - = render 'groups/home_panel' += render 'groups/home_panel' - = render_if_exists 'groups/self_or_ancestor_marked_for_deletion_notice', group: @group += render_if_exists 'groups/self_or_ancestor_marked_for_deletion_notice', group: @group - = render_if_exists 'groups/group_activity_analytics', group: @group += render_if_exists 'groups/group_activity_analytics', group: @group - .groups-listing{ data: { endpoints: { default: group_children_path(@group, format: :json), shared: group_shared_projects_path(@group, format: :json) } } } - .top-area.group-nav-container.justify-content-between - .scrolling-tabs-container.inner-page-scroll-tabs - .fade-left= sprite_icon('chevron-lg-left', size: 12) - .fade-right= sprite_icon('chevron-lg-right', size: 12) - %ul.nav-links.scrolling-tabs.mobile-separator.nav.nav-tabs - %li.js-subgroups_and_projects-tab - = link_to group_path, data: { target: 'div#subgroups_and_projects', action: 'subgroups_and_projects', toggle: 'tab'} do - = _("Subgroups and projects") - %li.js-shared-tab - = link_to group_shared_path, data: { target: 'div#shared', action: 'shared', toggle: 'tab'} do - = _("Shared projects") - %li.js-archived-tab - = link_to group_archived_path, data: { target: 'div#archived', action: 'archived', toggle: 'tab'} do - = _("Archived projects") +.groups-listing{ data: { endpoints: { default: group_children_path(@group, format: :json), shared: group_shared_projects_path(@group, format: :json) } } } + .top-area.group-nav-container.justify-content-between + .scrolling-tabs-container.inner-page-scroll-tabs + .fade-left= sprite_icon('chevron-lg-left', size: 12) + .fade-right= sprite_icon('chevron-lg-right', size: 12) + %ul.nav-links.scrolling-tabs.mobile-separator.nav.nav-tabs + %li.js-subgroups_and_projects-tab + = link_to group_path, data: { target: 'div#subgroups_and_projects', action: 'subgroups_and_projects', toggle: 'tab'} do + = _("Subgroups and projects") + %li.js-shared-tab + = link_to group_shared_path, data: { target: 'div#shared', action: 'shared', toggle: 'tab'} do + = _("Shared projects") + %li.js-archived-tab + = link_to group_archived_path, data: { target: 'div#archived', action: 'archived', toggle: 'tab'} do + = _("Archived projects") - .nav-controls.d-block.d-md-flex - .group-search - = render "shared/groups/search_form" + .nav-controls.d-block.d-md-flex + .group-search + = render "shared/groups/search_form" - = render "shared/groups/dropdown", options_hash: subgroups_sort_options_hash + = render "shared/groups/dropdown", options_hash: subgroups_sort_options_hash - .tab-content - #subgroups_and_projects.tab-pane - = render "subgroups_and_projects", group: @group + .tab-content + #subgroups_and_projects.tab-pane + = render "subgroups_and_projects", group: @group - #shared.tab-pane - = render "shared_projects", group: @group + #shared.tab-pane + = render "shared_projects", group: @group - #archived.tab-pane - = render "archived_projects", group: @group + #archived.tab-pane + = render "archived_projects", group: @group diff --git a/app/views/help/_shortcuts.html.haml b/app/views/help/_shortcuts.html.haml index 80df8581a9b..6f917e81fb0 100644 --- a/app/views/help/_shortcuts.html.haml +++ b/app/views/help/_shortcuts.html.haml @@ -40,6 +40,8 @@ %tr %td.shortcut %kbd s + \/ + %kbd / %td= _('Start search') %tr %td.shortcut @@ -72,7 +74,7 @@ %tr %td.shortcut %kbd - %i.fa.fa-arrow-up + = sprite_icon('arrow-up', size: 12) %td= _('Edit your most recent comment in a thread (from an empty textarea)') %tbody %tr @@ -89,28 +91,28 @@ %tr %td.shortcut %kbd - %i.fa.fa-arrow-left + = sprite_icon('arrow-left', size: 12) \/ %kbd h %td= _('Scroll left') %tr %td.shortcut %kbd - %i.fa.fa-arrow-right + = sprite_icon('arrow-right', size: 12) \/ %kbd l %td= _('Scroll right') %tr %td.shortcut %kbd - %i.fa.fa-arrow-up + = sprite_icon('arrow-up', size: 12) \/ %kbd k %td= _('Scroll up') %tr %td.shortcut %kbd - %i.fa.fa-arrow-down + = sprite_icon('arrow-down', size: 12) \/ %kbd j %td= _('Scroll down') @@ -118,14 +120,14 @@ %td.shortcut %kbd shift - %i.fa.fa-arrow-up + = sprite_icon('arrow-up', size: 12) \/ k %td= _('Scroll to top') %tr %td.shortcut %kbd shift - %i.fa.fa-arrow-down + = sprite_icon('arrow-down', size: 12) \/ j %td= _('Scroll to bottom') .col-lg-4 @@ -229,12 +231,12 @@ %tr %td.shortcut %kbd - %i.fa.fa-arrow-up + = sprite_icon('arrow-up', size: 12) %td= _('Move selection up') %tr %td.shortcut %kbd - %i.fa.fa-arrow-down + = sprite_icon('arrow-down', size: 12) %td= _('Move selection down') %tr %td.shortcut diff --git a/app/views/import/_project_status.html.haml b/app/views/import/_project_status.html.haml index 280bcbc1e63..b968db58d38 100644 --- a/app/views/import/_project_status.html.haml +++ b/app/views/import/_project_status.html.haml @@ -3,7 +3,7 @@ = icon('check') = _('Done') - when 'started' - = icon("spinner spin") + = loading_icon = _('Started') - when 'failed' = _('Failed') diff --git a/app/views/import/fogbugz/new.html.haml b/app/views/import/fogbugz/new.html.haml index 626080c284b..4daa769215f 100644 --- a/app/views/import/fogbugz/new.html.haml +++ b/app/views/import/fogbugz/new.html.haml @@ -1,7 +1,8 @@ - page_title _("FogBugz Import") - header_title _("Projects"), root_path -%h3.page-title - %i.fa.fa-bug +%h3.page-title.d-flex + .gl-display-flex.gl-align-items-center.gl-justify-content-center + = sprite_icon('bug', css_class: 'gl-mr-2') = _('Import projects from FogBugz') %hr diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml index cdc53520e93..fb93a3eca0d 100644 --- a/app/views/import/fogbugz/new_user_map.html.haml +++ b/app/views/import/fogbugz/new_user_map.html.haml @@ -1,7 +1,8 @@ - page_title _('User map'), _('FogBugz import') - header_title _("Projects"), root_path -%h3.page-title - %i.fa.fa-bug +%h3.page-title.d-flex + .gl-display-flex.gl-align-items-center.gl-justify-content-center + = sprite_icon('bug', css_class: 'gl-mr-2') = _('Import projects from FogBugz') %hr diff --git a/app/views/import/fogbugz/status.html.haml b/app/views/import/fogbugz/status.html.haml index f201c0e83fe..e04a412e3bc 100644 --- a/app/views/import/fogbugz/status.html.haml +++ b/app/views/import/fogbugz/status.html.haml @@ -1,7 +1,8 @@ - page_title _("FogBugz import") - header_title _("Projects"), root_path -%h3.page-title - %i.fa.fa-bug +%h3.page-title.d-flex + .gl-display-flex.gl-align-items-center.gl-justify-content-center + = sprite_icon('bug', css_class: 'gl-mr-2') = _('Import projects from FogBugz') %p.light diff --git a/app/views/import/google_code/status.html.haml b/app/views/import/google_code/status.html.haml index 8d8754e1069..22984d59afe 100644 --- a/app/views/import/google_code/status.html.haml +++ b/app/views/import/google_code/status.html.haml @@ -15,11 +15,11 @@ - if @incompatible_repos.any? = button_tag class: "btn btn-import btn-success js-import-all" do = _("Import all compatible projects") - = icon("spinner spin", class: "loading-icon") + = loading_icon(css_class: 'loading-icon') - else = button_tag class: "btn btn-import btn-success js-import-all" do = _("Import all projects") - = icon("spinner spin", class: "loading-icon") + = loading_icon(css_class: 'loading-icon') .table-responsive %table.table.import-jobs @@ -45,7 +45,7 @@ %i.fa.fa-check = _("done") - when 'started' - %i.fa.fa-spinner.fa-spin + = loading_icon = _("started") - else = project.human_import_status_name @@ -59,7 +59,7 @@ %td.import-actions.job-status = button_tag class: "btn btn-import js-add-to-import" do = _("Import") - = icon("spinner spin", class: "loading-icon") + = loading_icon(css_class: 'loading-icon') - @incompatible_repos.each do |repo| %tr{ id: "repo_#{repo.id}" } %td diff --git a/app/views/import/manifest/_form.html.haml b/app/views/import/manifest/_form.html.haml index 3a5b5924c6a..2ee964974c3 100644 --- a/app/views/import/manifest/_form.html.haml +++ b/app/views/import/manifest/_form.html.haml @@ -16,7 +16,7 @@ = file_field_tag :manifest, class: 'form-control-file w-auto', required: true .form-text.text-muted = _('Import multiple repositories by uploading a manifest file.') - = link_to icon('question-circle'), help_page_path('user/project/import/manifest') + = 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' diff --git a/app/views/instance_statistics/cohorts/index.html.haml b/app/views/instance_statistics/cohorts/index.html.haml deleted file mode 100644 index a038246bd53..00000000000 --- a/app/views/instance_statistics/cohorts/index.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -- breadcrumb_title _("Cohorts") -- page_title _("Cohorts") - -- if @cohorts - = render 'cohorts_table' -- else - .bs-callout.bs-callout-warning.clearfix - %p - - usage_ping_path = help_page_path('development/telemetry/usage_ping') - - usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: usage_ping_path } - = s_('User Cohorts are only shown when the %{usage_ping_link_start}usage ping%{usage_ping_link_end} is enabled.').html_safe % { usage_ping_link_start: usage_ping_link_start, usage_ping_link_end: '</a>'.html_safe } - - if current_user.admin? - - application_settings_path = metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings') - - application_settings_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: application_settings_path } - = s_('To enable it and see User Cohorts, visit %{application_settings_link_start}application settings%{application_settings_link_end}.').html_safe % { application_settings_link_start: application_settings_link_start, application_settings_link_end: '</a>'.html_safe } diff --git a/app/views/instance_statistics/dev_ops_score/_callout.html.haml b/app/views/instance_statistics/dev_ops_score/_callout.html.haml deleted file mode 100644 index 31ae7721f5f..00000000000 --- a/app/views/instance_statistics/dev_ops_score/_callout.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -.gl-mt-3 -.user-callout{ data: { uid: 'dev_ops_score_intro_callout_dismissed' } } - .bordered-box.landing.content-block - %button.btn.btn-default.close.js-close-callout{ type: 'button', - 'aria-label' => _('Dismiss DevOps Score introduction') } - = icon('times', class: 'dismiss-icon', 'aria-hidden' => 'true') - .user-callout-copy - %h4 - = _('Introducing Your DevOps Score') - %p - = _('Your DevOps Score gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers.') - .svg-container.devops - = custom_icon('dev_ops_score_overview') diff --git a/app/views/instance_statistics/dev_ops_score/_disabled.html.haml b/app/views/instance_statistics/dev_ops_score/_disabled.html.haml deleted file mode 100644 index bd808218f75..00000000000 --- a/app/views/instance_statistics/dev_ops_score/_disabled.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.container.devops-empty - .col-sm-12.justify-content-center.text-center - = custom_icon('dev_ops_score_no_index') - %h4= _('Usage ping is not enabled') - - if !current_user.admin? - %p - - usage_ping_path = help_page_path('development/telemetry/usage_ping') - - usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: usage_ping_path } - = s_('In order to enable instance-level analytics, please ask an admin to enable %{usage_ping_link_start}usage ping%{usage_ping_link_end}.').html_safe % { usage_ping_link_start: usage_ping_link_start, usage_ping_link_end: '</a>'.html_safe } - - if current_user.admin? - %p - = _('Enable usage ping to get an overview of how you are using GitLab from a feature perspective.') - - if current_user.admin? - = link_to _('Enable usage ping'), metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'btn btn-primary' diff --git a/app/views/instance_statistics/dev_ops_score/_no_data.html.haml b/app/views/instance_statistics/dev_ops_score/_no_data.html.haml deleted file mode 100644 index 54598244039..00000000000 --- a/app/views/instance_statistics/dev_ops_score/_no_data.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -.container.devops-empty - .col-sm-12.justify-content-center.text-center - = custom_icon('dev_ops_score_no_data') - %h4= _('Data is still calculating...') - %p - = _('In order to gather accurate feature usage data, it can take 1 to 2 weeks to see your index.') - = link_to _('Learn more'), help_page_path('user/instance_statistics/dev_ops_score'), target: '_blank' diff --git a/app/views/invites/show.html.haml b/app/views/invites/show.html.haml index 283683511d7..6b3996bee76 100644 --- a/app/views/invites/show.html.haml +++ b/app/views/invites/show.html.haml @@ -25,5 +25,5 @@ - if !member? .actions - = link_to _("Accept invitation"), accept_invite_url(@token), method: :post, class: "btn btn-success" + = link_to _("Accept invitation"), accept_invite_url(@token, new_user_invite: params[:new_user_invite]), method: :post, class: "btn btn-success" = link_to _("Decline"), decline_invite_url(@token), method: :post, class: "btn btn-danger gl-ml-3" diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml new file mode 100644 index 00000000000..f7ecfd09209 --- /dev/null +++ b/app/views/jira_connect/subscriptions/index.html.haml @@ -0,0 +1,28 @@ +%h1 + GitLab for Jira Configuration + +%form#add-subscription-form.subscription-form{ action: jira_connect_subscriptions_path } + .ak-field-group + %label + Namespace + + .ak-field-group.field-group-input + %input#namespace-input.ak-field-text{ type: 'text', required: true } + %button.ak-button.ak-button__appearance-primary{ type: 'submit' } + Link namespace to Jira + +%table.subscriptions + %thead + %tr + %th Namespace + %th Added + %th + %tbody + - @subscriptions.each do |subscription| + %tr + %td= subscription.namespace.full_path + %td= subscription.created_at + %td= link_to 'Remove', jira_connect_subscription_path(subscription), class: 'remove-subscription' + += page_specific_javascript_tag('jira_connect.js') += stylesheet_link_tag 'page_bundles/jira_connect' diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml index be3f2fd74e4..a0b57f8dd52 100644 --- a/app/views/layouts/_flash.html.haml +++ b/app/views/layouts/_flash.html.haml @@ -10,4 +10,4 @@ %span= value - if %w(alert notice success).include?(key) %div{ class: "close-icon-wrapper js-close-icon" } - = sprite_icon('close', css_class: 'close-icon') + = sprite_icon('close', css_class: 'close-icon gl-vertical-align-baseline!') diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index b869298e99d..1c87452f0a3 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -1,6 +1,6 @@ - page_description brand_title unless page_description --# Needs a redirect on the client side since it's using an anchor to distuingish +-# Needs a redirect on the client side since it's using an anchor to distinguish -# between sign in and registration. We need to inline the JS to not render -# anything from this page beforehand. -# Part of an experiment to build a new sign up flow. Will be removed again with @@ -16,12 +16,7 @@ %head{ prefix: "og: http://ogp.me/ns#" } %meta{ charset: "utf-8" } - - if ActionController::Base.asset_host - %link{ rel: 'dns-prefetch', href: ActionController::Base.asset_host } - %link{ rel: 'preconnect', href: ActionController::Base.asset_host, crossorigin: '' } - - - if Gitlab::CurrentSettings.snowplow_enabled? && Gitlab::CurrentSettings.snowplow_collector_hostname - %link{ rel: 'preconnect', href: Gitlab::CurrentSettings.snowplow_collector_hostname, crossorigin: '' } + = render 'layouts/loading_hints' %meta{ 'http-equiv' => 'X-UA-Compatible', content: 'IE=edge' } @@ -54,6 +49,8 @@ = stylesheet_link_tag_defer "application_dark" - else = stylesheet_link_tag_defer "application" + - unless use_startup_css? + = stylesheet_link_tag_defer "themes/theme_#{user_application_theme_name}" = stylesheet_link_tag "disable_animations", media: "all" if Rails.env.test? || Gitlab.config.gitlab['disable_animations'] = stylesheet_link_tag_defer 'performance_bar' if performance_bar_enabled? @@ -73,7 +70,8 @@ = yield :page_specific_javascripts = webpack_controller_bundle_tags - = webpack_bundle_tag "chrome_84_icon_fix" if browser.chrome?([">=84", "<85"]) || browser.edge?([">=84", "<85"]) + = webpack_bundle_tag 'performance_bar' if performance_bar_enabled? + = webpack_bundle_tag "chrome_84_icon_fix" if browser.chrome?([">=84", "<84.0.4147.125"]) || browser.edge?([">=84", "<84.0.522.59"]) = yield :project_javascripts diff --git a/app/views/layouts/_loading_hints.html.haml b/app/views/layouts/_loading_hints.html.haml new file mode 100644 index 00000000000..0ef50d1b122 --- /dev/null +++ b/app/views/layouts/_loading_hints.html.haml @@ -0,0 +1,10 @@ +- if ActionController::Base.asset_host + %link{ rel: 'dns-prefetch', href: ActionController::Base.asset_host } + %link{ rel: 'preconnect', href: ActionController::Base.asset_host, crossorigin: '' } +- if user_application_theme == 'gl-dark' + %link{ { rel: 'preload', href: stylesheet_url('application_dark'), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } +- 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' } : {} } +- 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/_page.html.haml b/app/views/layouts/_page.html.haml index 3a543fef292..5184bc93a81 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -3,9 +3,9 @@ = render "layouts/nav/sidebar/#{nav}" .content-wrapper{ class: "#{@content_wrapper_class}" } .mobile-overlay + = yield :group_invite_members_banner .alert-wrapper = render 'shared/outdated_browser' - = render_if_exists 'layouts/header/users_over_license_banner' = render_if_exists "layouts/header/licensed_user_count_threshold" = render_if_exists "layouts/header/token_expiry_notification" = render "layouts/broadcast" diff --git a/app/views/layouts/_startup_css.haml b/app/views/layouts/_startup_css.haml index 094038d39b0..ea05157ed19 100644 --- a/app/views/layouts/_startup_css.haml +++ b/app/views/layouts/_startup_css.haml @@ -1,4 +1,7 @@ - return unless use_startup_css? +- startup_filename = current_path?("sessions#new") ? 'signin' : user_application_theme == 'gl-dark' ? 'dark' : 'general' + %style{ type: "text/css" } - = Rails.application.assets_manifest.find_sources('startup/startup-general.css').first.to_s.html_safe + = Rails.application.assets_manifest.find_sources("themes/theme_#{user_application_theme_name}.css").first.to_s.html_safe + = Rails.application.assets_manifest.find_sources("startup/startup-#{startup_filename}.css").first.to_s.html_safe diff --git a/app/views/layouts/_startup_css_activation.haml b/app/views/layouts/_startup_css_activation.haml index 0b1cce06f47..022b9a695bc 100644 --- a/app/views/layouts/_startup_css_activation.haml +++ b/app/views/layouts/_startup_css_activation.haml @@ -3,5 +3,8 @@ = javascript_tag nonce: true do :plain document.querySelectorAll('link[media="print"]').forEach(linkTag => { - linkTag.addEventListener('load', function() {this.media='all'}, {once: true}); + linkTag.setAttribute('data-startupcss', 'loading'); + const startupLinkLoadedEvent = new CustomEvent('CSSStartupLinkLoaded'); + linkTag.addEventListener('load',function(){this.media='all';this.setAttribute('data-startupcss', 'loaded');document.dispatchEvent(startupLinkLoadedEvent);},{once: true}); }) +- return unless use_startup_css? diff --git a/app/views/layouts/_startup_js.html.haml b/app/views/layouts/_startup_js.html.haml index 3eb68df07c6..33c759b7a7c 100644 --- a/app/views/layouts/_startup_js.html.haml +++ b/app/views/layouts/_startup_js.html.haml @@ -6,8 +6,11 @@ gl.startup_calls = #{page_startup_api_calls.to_json}; if (gl.startup_calls && window.fetch) { Object.keys(gl.startup_calls).forEach(apiCall => { + // fetch won’t send cookies in older browsers, unless you set the credentials init option. + // We set to `same-origin` which is default value in modern browsers. + // See https://github.com/whatwg/fetch/pull/585 for more information. gl.startup_calls[apiCall] = { - fetchCall: fetch(apiCall) + fetchCall: fetch(apiCall, { credentials: 'same-origin' }) }; }); } diff --git a/app/views/layouts/experiment_mailer.html.haml b/app/views/layouts/experiment_mailer.html.haml new file mode 100644 index 00000000000..5a342c400d6 --- /dev/null +++ b/app/views/layouts/experiment_mailer.html.haml @@ -0,0 +1,48 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +%html{ lang: "en" } + %head + %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/ + %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/ + %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/ + %title= message.subject + + -# Avoid premailer processing of client-specific styles (@media tag not supported) + -# We need to inline the contents here because mail clients (e.g. iOS Mail, Outlook) + -# do not support linked stylesheets. + %style{ type: 'text/css', 'data-premailer': 'ignore' } + = asset_to_string('mailer_client_specific.css').html_safe + + = stylesheet_link_tag 'mailer.css' + %body + %table#body{ border: "0", cellpadding: "0", cellspacing: "0" } + %tbody + %tr.line + %td + %tr.header + %td + = html_header_message + = header_logo + %tr + %td + %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0" } + %tbody + %tr + %td.wrapper-cell{ style: "padding: 0" } + %table.content{ border: "0", cellpadding: "0", cellspacing: "0" } + %tbody + = yield + + = render_if_exists 'layouts/mailer/additional_text' + + %tr.footer + %td{ style: "padding: 24px 0" } + %img{ alt: "GitLab", height: "33", width: "90", src: image_url('mailers/gitlab_footer_logo.gif') } + %p{ style: "color: #949ba5; max-width: 640px; margin: 0 auto; text-align: left; font-size: 12px;" } + GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way + %br + Development, Security, and Ops teams collaborate. + + = yield :additional_footer + %tr + %td.footer-message + = html_footer_message diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml index 4c659241f99..dcc6cba8444 100644 --- a/app/views/layouts/header/_current_user_dropdown.html.haml +++ b/app/views/layouts/header/_current_user_dropdown.html.haml @@ -14,7 +14,11 @@ %li.divider - if can?(current_user, :update_user_status, current_user) %li - .js-set-status-modal-trigger{ data: { has_status: current_user.status.present? ? 'true' : 'false' } } + %button.btn.menu-item.js-set-status-modal-trigger{ type: 'button' } + - if current_user.status.present? + = s_('SetStatusModal|Edit status') + - else + = s_('SetStatusModal|Set status') - if current_user_menu?(:profile) %li = link_to s_("CurrentUser|Profile"), current_user, class: 'profile-link', data: { user: current_user.username } @@ -35,6 +39,8 @@ = link_to _("Help"), help_path %li.d-md-none = link_to _("Support"), support_url + %li.d-md-none + = render 'shared/help_dropdown_forum_link' %li.d-md-none = link_to _("Submit feedback"), "https://about.gitlab.com/submit-feedback" - if current_user_menu?(:help) || current_user_menu?(:settings) || current_user_menu?(:profile) diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 56b70c463d0..845231238f6 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -66,7 +66,7 @@ track_property: 'navigation', container: 'body' } do = sprite_icon('todo-done') - %span.badge.badge-pill.todos-count{ class: ('hidden' if todos_pending_count == 0) } + %span.badge.badge-pill.todos-count.js-todos-count{ class: ('hidden' if todos_pending_count == 0) } = todos_count_format(todos_pending_count) %li.nav-item.header-help.dropdown.d-none.d-md-block{ **tracking_attrs('main_navigation', 'click_question_mark_link', 'navigation') } = link_to help_path, class: 'header-help-dropdown-toggle', data: { toggle: "dropdown" } do @@ -87,7 +87,7 @@ - if has_impersonation_link %li.nav-item.impersonation.ml-0 = link_to admin_impersonation_path, class: 'nav-link impersonation-btn', method: :delete, title: _('Stop impersonation'), aria: { label: _('Stop impersonation') }, data: { toggle: 'tooltip', placement: 'bottom', container: 'body', qa_selector: 'stop_impersonation_link' } do - = icon('user-secret') + = sprite_icon('incognito', size: 18) - if header_link?(:sign_in) %li.nav-item %div @@ -100,7 +100,7 @@ = sprite_icon('close', size: 12, css_class: 'close-icon js-navbar-toggle-left') - if ::Feature.enabled?(:whats_new_drawer) - #whats-new-app + #whats-new-app{ data: { features: whats_new_most_recent_release_items } } - if can?(current_user, :update_user_status, current_user) .js-set-status-modal-wrapper{ data: { current_emoji: current_user.status.present? ? current_user.status.emoji : '', current_message: current_user.status.present? ? current_user.status.message : '' } } diff --git a/app/views/layouts/header/_help_dropdown.html.haml b/app/views/layouts/header/_help_dropdown.html.haml index ad4e0f1f4b2..2b6cbc1c0ef 100644 --- a/app/views/layouts/header/_help_dropdown.html.haml +++ b/app/views/layouts/header/_help_dropdown.html.haml @@ -6,6 +6,8 @@ %li = link_to _("Support"), support_url %li + = render 'shared/help_dropdown_forum_link' + %li %button.js-shortcuts-modal-trigger{ type: "button" } = _("Keyboard shortcuts") %span.text-secondary.float-right{ "aria-hidden": true }= '?'.html_safe diff --git a/app/views/layouts/instance_statistics.html.haml b/app/views/layouts/instance_statistics.html.haml deleted file mode 100644 index 1de6b385c86..00000000000 --- a/app/views/layouts/instance_statistics.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -- page_title _('Analytics') -- header_title _('Analytics'), instance_statistics_root_path -- nav 'instance_statistics' -- @left_sidebar = true - -= render template: 'layouts/application' diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml new file mode 100644 index 00000000000..fdeb3d3c9ac --- /dev/null +++ b/app/views/layouts/jira_connect.html.haml @@ -0,0 +1,13 @@ +%html{ lang: "en" } + %head + %meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + 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' + = 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 :head + %body + .ac-content + = yield diff --git a/app/views/layouts/nav/_analytics_link.html.haml b/app/views/layouts/nav/_analytics_link.html.haml deleted file mode 100644 index f481aeecc1b..00000000000 --- a/app/views/layouts/nav/_analytics_link.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- return unless dashboard_nav_link?(:analytics) -= nav_link(controller: [:dev_ops_score, :cohorts], html_options: { class: "d-none d-xl-block"}) do - = link_to instance_statistics_root_path, class: 'chart-icon', title: _('Analytics'), aria: { label: _('Analytics') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = sprite_icon('chart', size: 18) diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 29cacbe4aff..40ea42091bd 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -43,8 +43,6 @@ = link_to dashboard_snippets_path, class: 'dashboard-shortcuts-snippets', data: { qa_selector: 'snippets_link' } do = _('Snippets') - = render_if_exists 'layouts/nav/sidebar/analytics_link' - %li.dropdown = render_if_exists 'dashboard/nav_link_list' @@ -66,8 +64,6 @@ = link_to sherlock_transactions_path, class: 'admin-icon' do = _('Sherlock Transactions') - = render_if_exists 'layouts/nav/analytics_link' - - if current_user.admin? = nav_link(controller: 'admin/dashboard', html_options: { class: "d-none d-xl-block"}) do = link_to admin_root_path, class: 'admin-icon qa-admin-area-link', title: _('Admin Area'), aria: { label: _('Admin Area') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml index 7fb5fff1e05..cb5277c02f0 100644 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ b/app/views/layouts/nav/sidebar/_admin.html.haml @@ -48,6 +48,33 @@ %span = _('Gitaly Servers') + = nav_link(controller: admin_analytics_nav_links) do + = link_to admin_dev_ops_report_path, data: { qa_selector: 'admin_analytics_link' } do + .nav-icon-container + = sprite_icon('chart') + %span.nav-item-name + = _('Analytics') + + %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_sidebar_analytics_submenu_content' } } + = nav_link(controller: admin_analytics_nav_links, html_options: { class: "fly-out-top-item" }) do + = link_to admin_dev_ops_report_path do + %strong.fly-out-top-item-name + = _('Analytics') + %li.divider.fly-out-top-item + = nav_link(controller: :dev_ops_report) do + = link_to admin_dev_ops_report_path, title: _('DevOps Report') do + %span + = _('DevOps Report') + = nav_link(controller: :cohorts) do + = link_to admin_cohorts_path, title: _('Cohorts') do + %span + = _('Cohorts') + - if Feature.enabled?(:instance_statistics) + = nav_link(controller: :instance_statistics) do + = link_to admin_instance_statistics_path, title: _('Instance Statistics') do + %span + = _('Instance Statistics') + = nav_link(controller: admin_monitoring_nav_links) do = link_to admin_system_info_path, data: { qa_selector: 'admin_monitoring_link' } do .nav-icon-container diff --git a/app/views/layouts/nav/sidebar/_analytics_link.html.haml b/app/views/layouts/nav/sidebar/_analytics_link.html.haml deleted file mode 100644 index 9e5ae422e2d..00000000000 --- a/app/views/layouts/nav/sidebar/_analytics_link.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- return unless dashboard_nav_link?(:analytics) -= nav_link(controller: [:dev_ops_score, :cohorts]) do - = link_to instance_statistics_root_path, class: 'd-xl-none' do - = _('Analytics') diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml index 47dad21edd7..9e9e6493e5b 100644 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ b/app/views/layouts/nav/sidebar/_group.html.haml @@ -157,6 +157,12 @@ %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(path: 'groups#projects') do = link_to projects_group_path(@group), title: _('Projects') do %span @@ -171,11 +177,6 @@ = link_to group_settings_ci_cd_path(@group), title: _('CI / CD') do %span = _('CI / CD') - - if Feature.enabled?(:group_level_integrations, @group) - = nav_link(controller: :integrations) do - = link_to group_settings_integrations_path(@group), title: _('Integrations') do - %span - = _('Integrations') = render_if_exists "groups/ee/settings_nav" diff --git a/app/views/layouts/nav/sidebar/_instance_statistics.html.haml b/app/views/layouts/nav/sidebar/_instance_statistics.html.haml deleted file mode 100644 index 979d98ec382..00000000000 --- a/app/views/layouts/nav/sidebar/_instance_statistics.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) } - .nav-sidebar-inner-scroll - .context-header - = link_to instance_statistics_root_path, title: _('Analytics') do - .avatar-container.s40.settings-avatar - = sprite_icon('chart', size: 24) - .sidebar-context-title= _('Analytics') - %ul.sidebar-top-level-items - = render 'layouts/nav/sidebar/instance_statistics_links' - - = render 'shared/sidebar_toggle_button' diff --git a/app/views/layouts/nav/sidebar/_instance_statistics_links.html.haml b/app/views/layouts/nav/sidebar/_instance_statistics_links.html.haml deleted file mode 100644 index ee2c83dc31e..00000000000 --- a/app/views/layouts/nav/sidebar/_instance_statistics_links.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -- return unless can?(current_user, :read_instance_statistics) -= nav_link(controller: :dev_ops_score) do - = link_to instance_statistics_dev_ops_score_index_path do - .nav-icon-container - = sprite_icon('comment') - %span.nav-item-name - = _('DevOps Score') - %ul.sidebar-sub-level-items.is-fly-out-only - = nav_link(controller: :dev_ops_score, html_options: { class: "fly-out-top-item" } ) do - = link_to instance_statistics_dev_ops_score_index_path do - %strong.fly-out-top-item-name - = _('DevOps Score') - -- if Gitlab::CurrentSettings.usage_ping_enabled - = nav_link(controller: :cohorts) do - = link_to instance_statistics_cohorts_path do - .nav-icon-container - = sprite_icon('users') - %span.nav-item-name - = _('Cohorts') - %ul.sidebar-sub-level-items.is-fly-out-only - = nav_link(controller: :cohorts, html_options: { class: "fly-out-top-item" } ) do - = link_to instance_statistics_cohorts_path do - %strong.fly-out-top-item-name - = _('Cohorts') diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 054311214ab..0eef587d7c7 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -167,7 +167,7 @@ = render_if_exists "layouts/nav/requirements_link", project: @project - if project_nav_tab? :pipelines - = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts], unless: -> { current_path?('projects/pipelines#charts') }) do + = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases], unless: -> { current_path?('projects/pipelines#charts') }) do = link_to project_pipelines_path(@project), class: 'shortcuts-pipelines qa-link-pipelines rspec-link-pipelines', data: { qa_selector: 'ci_cd_link' } do .nav-icon-container = sprite_icon('rocket') @@ -175,7 +175,7 @@ = _('CI / CD') %ul.sidebar-sub-level-items - = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts], html_options: { class: "fly-out-top-item" }) do + = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases], html_options: { class: "fly-out-top-item" }) do = link_to project_pipelines_path(@project) do %strong.fly-out-top-item-name = _('CI / CD') @@ -204,6 +204,8 @@ %span = _('Schedules') + = render_if_exists "layouts/nav/test_cases_link", project: @project + = render_if_exists 'layouts/nav/sidebar/project_security_link' # EE-specific - if project_nav_tab? :operations diff --git a/app/views/notify/_failed_builds.html.haml b/app/views/notify/_failed_builds.html.haml index 1711c34a842..cde0ac21d6d 100644 --- a/app/views/notify/_failed_builds.html.haml +++ b/app/views/notify/_failed_builds.html.haml @@ -23,10 +23,3 @@ = build.stage %td{ align: "right", style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; padding: 16px 0; color: #8c8c8c; font-weight: 500; font-size: 14px;" } = render "notify/links/#{build.to_partial_path}", pipeline: pipeline, build: build - %tr.build-log - - if build.has_trace? - %td{ colspan: "2", style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; padding: 0 0 16px;" } - %pre{ style: "font-family: Monaco,'Lucida Console','Courier New',Courier,monospace; background-color: #fafafa; border-radius: 4px; overflow: hidden; white-space: pre-wrap; word-break: break-all; font-size:13px; line-height: 1.4; padding: 16px 8px; color: #333333; margin: 0;" } - = build.trace.html(last_lines: 30).html_safe - - else - %td{ colspan: "2" } diff --git a/app/views/notify/autodevops_disabled_email.text.erb b/app/views/notify/autodevops_disabled_email.text.erb index 91092060e74..f849c017265 100644 --- a/app/views/notify/autodevops_disabled_email.text.erb +++ b/app/views/notify/autodevops_disabled_email.text.erb @@ -14,7 +14,4 @@ had <%= failed.size %> failed <%= 'build'.pluralize(failed.size) %>. <%= render "notify/links/#{build.to_partial_path}", pipeline: @pipeline, build: build %> Stage: <%= build.stage %> Name: <%= build.name %> - <% if build.has_trace? -%> - Trace: <%= build.trace.raw(last_lines: 30) %> - <% end -%> <% end -%> diff --git a/app/views/notify/disabled_two_factor_email.html.haml b/app/views/notify/disabled_two_factor_email.html.haml new file mode 100644 index 00000000000..8c64a43fc07 --- /dev/null +++ b/app/views/notify/disabled_two_factor_email.html.haml @@ -0,0 +1,6 @@ +%p + = say_hi(@user) +%p + = two_factor_authentication_disabled_text +%p + = re_enable_two_factor_authentication_text(format: :html) diff --git a/app/views/notify/disabled_two_factor_email.text.erb b/app/views/notify/disabled_two_factor_email.text.erb new file mode 100644 index 00000000000..46eeab4414f --- /dev/null +++ b/app/views/notify/disabled_two_factor_email.text.erb @@ -0,0 +1,5 @@ +<%= say_hi(@user) %> + +<%= two_factor_authentication_disabled_text %> + +<%= re_enable_two_factor_authentication_text %> diff --git a/app/views/notify/member_invited_email.html.haml b/app/views/notify/member_invited_email.html.haml index ae3fecf404a..4fcd2936d25 100644 --- a/app/views/notify/member_invited_email.html.haml +++ b/app/views/notify/member_invited_email.html.haml @@ -10,7 +10,7 @@ #{member_source.model_name.singular} as #{content_tag :span, member.human_access, class: :highlight}. %p - = link_to 'Accept invitation', invite_url(@token) + = link_to 'Accept invitation', invite_url(@token, @invite_url_params) or = link_to 'decline', decline_invite_url(@token) diff --git a/app/views/notify/member_invited_email.text.erb b/app/views/notify/member_invited_email.text.erb index d944c3b4a50..e6e6a685f92 100644 --- a/app/views/notify/member_invited_email.text.erb +++ b/app/views/notify/member_invited_email.text.erb @@ -1,4 +1,4 @@ You have been invited <%= "by #{sanitize_name(member.created_by.name)} " if member.created_by %>to join the <%= member_source.human_name %> <%= member_source.model_name.singular %> as <%= member.human_access %>. -Accept invitation: <%= invite_url(@token) %> +Accept invitation: <%= invite_url(@token, @invite_url_params) %> Decline invitation: <%= decline_invite_url(@token) %> diff --git a/app/views/notify/member_invited_email_experiment.html.haml b/app/views/notify/member_invited_email_experiment.html.haml new file mode 100644 index 00000000000..5cfb6acee05 --- /dev/null +++ b/app/views/notify/member_invited_email_experiment.html.haml @@ -0,0 +1,12 @@ +%tr + %td.text-content + %h2.invite-header + = s_('InviteEmail|You are invited!') + %p + - if member.created_by + = html_escape(s_("InviteEmail|%{inviter} invited you")) % { inviter: (link_to member.created_by.name, user_url(member.created_by)).html_safe } + = html_escape(s_("InviteEmail|to join the %{strong_start}%{project_or_group_name}%{strong_end}")) % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, project_or_group_name: member_source.human_name } + %br + = s_("InviteEmail|%{project_or_group} as a %{role}") % { project_or_group: member_source.model_name.singular, role: member.human_access.downcase } + %p.invite-actions + = link_to s_('InviteEmail|Join now'), invite_url(@token, @invite_url_params), class: 'invite-btn-join' diff --git a/app/views/notify/member_invited_email_experiment.text.erb b/app/views/notify/member_invited_email_experiment.text.erb new file mode 100644 index 00000000000..6843cea4df7 --- /dev/null +++ b/app/views/notify/member_invited_email_experiment.text.erb @@ -0,0 +1,10 @@ +<% project_and_role = s_('InviteEmail|to join the %{project_or_group_name} %{project_or_group} as a %{role}') \ + % { project_or_group_name: member_source.human_name, project_or_group: member_source.model_name.singular, role: member.human_access.downcase } %> + +<% if member.created_by %> +<%= s_('InviteEmail|%{inviter} invited you') % { inviter: sanitize_name(member.created_by.name) } %> <%= project_and_role %> +<% else %> +<%= s_('InviteEmail|You have been invited') %> <%= project_and_role %> +<% end %> + +Join now: <%= invite_url(@token, @invite_url_params) %> diff --git a/app/views/notify/pipeline_failed_email.text.erb b/app/views/notify/pipeline_failed_email.text.erb index 41b26842dbc..b388aad7048 100644 --- a/app/views/notify/pipeline_failed_email.text.erb +++ b/app/views/notify/pipeline_failed_email.text.erb @@ -34,8 +34,4 @@ had <%= failed.size %> failed <%= 'build'.pluralize(failed.size) %>. <%= render "notify/links/#{build.to_partial_path}", pipeline: @pipeline, build: build %> Stage: <%= build.stage %> Name: <%= build.name %> -<% if build.has_trace? -%> -Trace: <%= build.trace.raw(last_lines: 30) %> -<% end -%> - <% end -%> diff --git a/app/views/profiles/accounts/_providers.html.haml b/app/views/profiles/accounts/_providers.html.haml index a87191d0fa4..f7368c5e921 100644 --- a/app/views/profiles/accounts/_providers.html.haml +++ b/app/views/profiles/accounts/_providers.html.haml @@ -11,11 +11,11 @@ - if auth_active?(provider) - if unlink_allowed = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'provider-btn' do - = s_('Profiles|Disconnect') + = s_('Profiles|Disconnect %{provider}') % { provider: label_for_provider(provider) } - else %a.provider-btn - = s_('Profiles|Active') + = s_('Profiles|%{provider} Active') % { provider: label_for_provider(provider) } - elsif link_allowed = link_to omniauth_authorize_path(:user, provider), method: :post, class: 'provider-btn gl-text-blue-500' do - = s_('Profiles|Connect') + = s_('Profiles|Connect %{provider}') % { provider: label_for_provider(provider) } = render_if_exists 'profiles/accounts/group_saml_unlink_buttons', group_saml_identities: group_saml_identities diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 20660e61f38..c875caca94a 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -55,8 +55,8 @@ = s_('Profiles|Deleting an account has the following effects:') = render 'users/deletion_guidance', user: current_user - %button#delete-account-button.btn.btn-danger.disabled{ data: { toggle: 'modal', - target: '#delete-account-modal', qa_selector: 'delete_account_button' } } + -# Delete button here + %button#delete-account-button.btn.btn-danger.disabled{ data: { qa_selector: 'delete_account_button' } } = s_('Profiles|Delete account') #delete-account-modal{ data: { action_url: user_registration_path, diff --git a/app/views/profiles/gpg_keys/_key.html.haml b/app/views/profiles/gpg_keys/_key.html.haml index e05f121c5d9..f1abafa4149 100644 --- a/app/views/profiles/gpg_keys/_key.html.haml +++ b/app/views/profiles/gpg_keys/_key.html.haml @@ -21,7 +21,7 @@ = s_('Profiles|Created %{time_ago}'.html_safe) % { time_ago:time_ago_with_tooltip(key.created_at)} = link_to profile_gpg_key_path(key), data: { confirm: _('Are you sure? Removing this GPG key does not affect already signed commits.') }, method: :delete, class: "btn btn-danger gl-ml-3" do %span.sr-only= _('Remove') - = icon('trash') + = sprite_icon('remove') = link_to revoke_profile_gpg_key_path(key), data: { confirm: _('Are you sure? All commits that were signed with this GPG key will be unverified.') }, method: :put, class: "btn btn-danger gl-ml-3" do %span.sr-only= _('Revoke') = _('Revoke') diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml index 404bb224655..ea698a296fb 100644 --- a/app/views/profiles/notifications/_group_settings.html.haml +++ b/app/views/profiles/notifications/_group_settings.html.haml @@ -2,7 +2,7 @@ .gl-responsive-table-row.notification-list-item .table-section.section-40 - %span.notification.fa.fa-holder.gl-mr-2 + %span.notification.gl-mr-2 = notification_icon(notification_icon_level(setting, emails_disabled)) %span.str-truncated diff --git a/app/views/profiles/notifications/_project_settings.html.haml b/app/views/profiles/notifications/_project_settings.html.haml index f9172ae87aa..6e81d585f24 100644 --- a/app/views/profiles/notifications/_project_settings.html.haml +++ b/app/views/profiles/notifications/_project_settings.html.haml @@ -1,7 +1,7 @@ - emails_disabled = project.emails_disabled? %li.notification-list-item - %span.notification.fa.fa-holder.gl-mr-2 + %span.notification.gl-mr-2 = notification_icon(notification_icon_level(setting, emails_disabled)) %span.str-truncated diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index ab04d977a4d..da684c29372 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -39,10 +39,11 @@ %hr %h5 - = _('Groups (%{count})') % { count: @group_notifications.size } + = _('Groups (%{count})') % { count: @user_groups.total_count } %div - @group_notifications.each do |setting| = render 'group_settings', setting: setting, group: setting.source + = paginate @user_groups, theme: 'gitlab' %h5 = _('Projects (%{count})') % { count: @project_notifications.size } %p.account-well diff --git a/app/views/profiles/preferences/_gitpod.html.haml b/app/views/profiles/preferences/_gitpod.html.haml new file mode 100644 index 00000000000..69c9443ebbb --- /dev/null +++ b/app/views/profiles/preferences/_gitpod.html.haml @@ -0,0 +1,11 @@ +- gitpod_link = link_to("Gitpod#{sprite_icon('external-link', size: 12, css_class: 'ml-1 vertical-align-center')}".html_safe, 'https://gitpod.io/', target: '_blank', rel: 'noopener noreferrer') + +%label.label-bold#gitpod + = s_('Gitpod') += link_to sprite_icon('question-o'), help_page_path('integration/gitpod.md'), target: '_blank', class: 'has-tooltip', title: _('More information') +.form-group.form-check + = f.check_box :gitpod_enabled, class: 'form-check-input' + = f.label :gitpod_enabled, class: 'form-check-label' do + = s_('Gitpod|Enable Gitpod integration').html_safe + .form-text.text-muted + = s_('Enable %{gitpod_link} integration to launch a development environment in your browser directly from GitLab.').html_safe % { gitpod_link: gitpod_link } diff --git a/app/views/profiles/preferences/_integrations.html.haml b/app/views/profiles/preferences/_integrations.html.haml new file mode 100644 index 00000000000..037fe5df263 --- /dev/null +++ b/app/views/profiles/preferences/_integrations.html.haml @@ -0,0 +1,18 @@ +- views = integration_views +- return unless views.any? + +.col-sm-12 + %hr + +.col-lg-4.profile-settings-sidebar#integrations + %h4.gl-mt-0 + = s_('Preferences|Integrations') + %p + = s_('Preferences|Customize integrations with third party services.') + = succeed '.' do + = link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'integrations'), target: '_blank' + +.col-lg-8 + - views.each do |view| + = render view, f: f + diff --git a/app/views/profiles/preferences/_sourcegraph.html.haml b/app/views/profiles/preferences/_sourcegraph.html.haml index f3530da9a5f..fdd0be22664 100644 --- a/app/views/profiles/preferences/_sourcegraph.html.haml +++ b/app/views/profiles/preferences/_sourcegraph.html.haml @@ -1,26 +1,10 @@ -- return unless Gitlab::Sourcegraph::feature_available? && Gitlab::CurrentSettings.sourcegraph_enabled -- sourcegraph_url = Gitlab::CurrentSettings.sourcegraph_url - -.col-sm-12 - %hr - -.col-lg-4.profile-settings-sidebar#integrations - %h4.gl-mt-0 - = s_('Preferences|Integrations') - %p - = s_('Preferences|Customize integrations with third party services.') - = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'integrations'), target: '_blank' -.col-lg-8 - %label.label-bold - = s_('Preferences|Sourcegraph') - = link_to icon('question-circle'), help_page_path('user/profile/preferences.md', anchor: 'sourcegraph'), target: '_blank', class: 'has-tooltip', title: _('More information') - .form-group.form-check - = f.check_box :sourcegraph_enabled, class: 'form-check-input' - = f.label :sourcegraph_enabled, class: 'form-check-label' do - - link_start = '<a href="%{url}">'.html_safe % { url: sourcegraph_url } - - link_end = '</a>'.html_safe - = s_('Preferences|Enable integrated code intelligence on code views').html_safe % { link_start: link_start, link_end: link_end } - .form-text.text-muted - = sourcegraph_url_message - = sourcegraph_experimental_message +%label.label-bold + = s_('Preferences|Sourcegraph') += link_to sprite_icon('question-o'), help_page_path('user/profile/preferences.md', anchor: 'sourcegraph'), target: '_blank', class: 'has-tooltip', title: _('More information') +.form-group.form-check + = f.check_box :sourcegraph_enabled, class: 'form-check-input' + = f.label :sourcegraph_enabled, class: 'form-check-label' do + = s_('Preferences|Enable integrated code intelligence on code views').html_safe + .form-text.text-muted + = sourcegraph_url_message + = sourcegraph_experimental_message diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index 54ca8788864..2c705886f47 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -1,6 +1,9 @@ - page_title _('Preferences') - @content_class = "limit-container-width" unless fluid_layout +- Gitlab::Themes.each do |theme| + = stylesheet_link_tag "themes/theme_#{theme.css_class.gsub('ui-', '')}" + = form_for @user, url: profile_preferences_path, remote: true, method: :put, html: { class: 'row gl-mt-3 js-preferences-form' } do |f| .col-lg-4.application-theme#navigation-theme %h4.gl-mt-0 @@ -135,7 +138,7 @@ .form-text.text-muted = s_('Preferences|For example: 30 mins ago.') - = render 'sourcegraph', f: f + = render 'integrations', f: f .col-lg-4.profile-settings-sidebar .col-lg-8 diff --git a/app/views/profiles/preferences/update.js.erb b/app/views/profiles/preferences/update.js.erb index 8397acbf1b3..241262880c1 100644 --- a/app/views/profiles/preferences/update.js.erb +++ b/app/views/profiles/preferences/update.js.erb @@ -14,7 +14,7 @@ $('input[type=submit]').enable() // Show flash messages <% if flash.notice %> - new Flash('<%= flash.discard(:notice) %>', 'notice') + new Flash({ message: '<%= flash.discard(:notice) %>', type: 'notice'}) <% elsif flash.alert %> - new Flash('<%= flash.discard(:alert) %>', 'alert') + new Flash({ message: '<%= flash.discard(:alert) %>', type: 'alert'}) <% end %> diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index 672f9c9a0c0..1eb3a14525f 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -113,7 +113,7 @@ - private_profile_label = capture do = s_("Profiles|Don't display activity-related personal information on your profiles") = f.check_box :private_profile, label: private_profile_label, inline: true, wrapper_class: 'mr-0' - = link_to icon('question-circle'), help_page_path('user/profile/index.md', anchor: 'private-profile') + = link_to sprite_icon('question-o'), help_page_path('user/profile/index.md', anchor: 'private-profile') %h5= s_("Profiles|Private contributions") = f.check_box :include_private_contributions, label: s_('Profiles|Include private contributions on my profile'), wrapper_class: 'mb-2', inline: true .help-block @@ -135,10 +135,12 @@ %img.modal-profile-crop-image{ alt: s_("Profiles|Avatar cropper") } .crop-controls .btn-group - %button.btn.btn-primary{ data: { method: 'zoom', option: '0.1' } } - %span.fa.fa-search-plus %button.btn.btn-primary{ data: { method: 'zoom', option: '-0.1' } } - %span.fa.fa-search-minus + %span + = sprite_icon('search-minus') + %button.btn.btn-primary{ data: { method: 'zoom', option: '0.1' } } + %span + = sprite_icon('search-plus') .modal-footer %button.btn.btn-primary.js-upload-user-avatar{ type: 'button' } = s_("Profiles|Set new profile picture") diff --git a/app/views/profiles/two_factor_auths/create.html.haml b/app/views/profiles/two_factor_auths/create.html.haml index 973eb8136c4..5a756cca0ab 100644 --- a/app/views/profiles/two_factor_auths/create.html.haml +++ b/app/views/profiles/two_factor_auths/create.html.haml @@ -1,6 +1,6 @@ - page_title _('Two-factor Authentication'), _('Account') -.alert.alert-success +.gl-alert.gl-alert-success.gl-mb-5 = _('Congratulations! You have enabled Two-factor Authentication!') = render 'codes' diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml index bce43b16d27..82265938180 100644 --- a/app/views/profiles/two_factor_auths/show.html.haml +++ b/app/views/profiles/two_factor_auths/show.html.haml @@ -1,6 +1,7 @@ - page_title _('Two-Factor Authentication'), _('Account') - add_to_breadcrumbs(_('Two-Factor Authentication'), profile_account_path) - @content_class = "limit-container-width" unless fluid_layout +- webauthn_enabled = Feature.enabled?(:webauthn) .js-two-factor-auth{ 'data-two-factor-skippable' => "#{two_factor_skippable?}", 'data-two_factor_skip_url' => skip_profile_two_factor_auth_path } .row.gl-mt-3 @@ -18,7 +19,7 @@ %div = link_to _('Disable two-factor authentication'), profile_two_factor_auth_path, method: :delete, - data: { confirm: _('Are you sure? This will invalidate your registered applications and U2F devices.') }, + data: { confirm: webauthn_enabled ? _('Are you sure? This will invalidate your registered applications and U2F / WebAuthn devices.') : _('Are you sure? This will invalidate your registered applications and U2F devices.') }, class: 'btn btn-danger gl-mr-3' = form_tag codes_profile_two_factor_auth_path, {style: 'display: inline-block', method: :post} do |f| = submit_tag _('Regenerate recovery codes'), class: 'btn' @@ -45,7 +46,7 @@ = _('Time based: Yes') = form_tag profile_two_factor_auth_path, method: :post do |f| - if @error - .alert.alert-danger + .gl-alert.gl-alert-danger.gl-mb-5 = @error .form-group = label_tag :pin_code, _('Pin code'), class: "label-bold" @@ -58,22 +59,35 @@ .row.gl-mt-3 .col-lg-4 %h4.gl-mt-0 - = _('Register Universal Two-Factor (U2F) Device') + - if webauthn_enabled + = _('Register WebAuthn Device') + - else + = _('Register Universal Two-Factor (U2F) Device') %p = _('Use a hardware device to add the second factor of authentication.') %p - = _("As U2F devices are only supported by a few browsers, we require that you set up a two-factor authentication app before a U2F device. That way you'll always be able to log in - even when you're using an unsupported browser.") + - if webauthn_enabled + = _("As WebAuthn devices are only supported by a few browsers, we require that you set up a two-factor authentication app before a WebAuthn device. That way you'll always be able to log in - even when you're using an unsupported browser.") + - else + = _("As U2F devices are only supported by a few browsers, we require that you set up a two-factor authentication app before a U2F device. That way you'll always be able to log in - even when you're using an unsupported browser.") .col-lg-8 - - if @u2f_registration.errors.present? - = form_errors(@u2f_registration) - = render "u2f/register" + - registration = webauthn_enabled ? @webauthn_registration : @u2f_registration + - if registration.errors.present? + = form_errors(registration) + - if webauthn_enabled + = render "authentication/register", target_path: create_webauthn_profile_two_factor_auth_path + - else + = render "authentication/register", target_path: create_u2f_profile_two_factor_auth_path %hr %h5 - = _('U2F Devices (%{length})') % { length: @u2f_registrations.length } + - if webauthn_enabled + = _('WebAuthn Devices (%{length})') % { length: @registrations.length } + - else + = _('U2F Devices (%{length})') % { length: @registrations.length } - - if @u2f_registrations.present? + - if @registrations.present? .table-responsive %table.table.table-bordered.u2f-registrations %colgroup @@ -86,12 +100,15 @@ %th= s_('2FADevice|Registered On') %th %tbody - - @u2f_registrations.each do |registration| + - @registrations.each do |registration| %tr - %td= registration.name.presence || html_escape_once(_("<no name set>")).html_safe - %td= registration.created_at.to_date.to_s(:medium) - %td= link_to _('Delete'), profile_u2f_registration_path(registration), method: :delete, class: "btn btn-danger float-right", data: { confirm: _('Are you sure you want to delete this device? This action cannot be undone.') } + %td= registration[:name].presence || html_escape_once(_("<no name set>")).html_safe + %td= registration[:created_at].to_date.to_s(:medium) + %td= link_to _('Delete'), registration[:delete_path], method: :delete, class: "btn btn-danger float-right", data: { confirm: _('Are you sure you want to delete this device? This action cannot be undone.') } - else .settings-message.text-center - = _("You don't have any U2F devices registered yet.") + - if webauthn_enabled + = _("You don't have any WebAuthn devices registered yet.") + - else + = _("You don't have any U2F devices registered yet.") diff --git a/app/views/projects/_deletion_failed.html.haml b/app/views/projects/_deletion_failed.html.haml index 4f3698f91e6..7e65f2f1cef 100644 --- a/app/views/projects/_deletion_failed.html.haml +++ b/app/views/projects/_deletion_failed.html.haml @@ -1,6 +1,8 @@ - project = local_assigns.fetch(:project) - return unless project.delete_error.present? -.project-deletion-failed-message.alert.alert-warning - This project was scheduled for deletion, but failed with the following message: - = project.delete_error +.project-deletion-failed-message.gl-alert.gl-alert-warning + = sprite_icon('warning', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + .gl-alert-body + This project was scheduled for deletion, but failed with the following message: + = project.delete_error diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml index dd7971f6db0..fe3354aefbb 100644 --- a/app/views/projects/_import_project_pane.html.haml +++ b/app/views/projects/_import_project_pane.html.haml @@ -46,7 +46,8 @@ - if fogbugz_import_enabled? %div = link_to new_import_fogbugz_path, class: 'btn import_fogbugz', **tracking_attrs(track_label, 'click_button', 'fogbugz') do - = icon('bug', text: 'FogBugz') + = sprite_icon('bug') + FogBugz - if gitea_import_enabled? %div diff --git a/app/views/projects/_issuable_by_email.html.haml b/app/views/projects/_issuable_by_email.html.haml index 0b2d179456d..c11ee765cca 100644 --- a/app/views/projects/_issuable_by_email.html.haml +++ b/app/views/projects/_issuable_by_email.html.haml @@ -37,9 +37,9 @@ = render 'by_email_description' %p This is a private email address - - %a{ href: 'https://docs.gitlab.com/ee/development/emails.html#email-namespace', target: "_blank", rel: "noopener" } - %i.fa.fa-question-circle{ 'aria-label': "Learn more about incoming email addresses" } + %span< + = link_to help_page_path('development/emails', anchor: 'email-namespace'), target: '_blank', rel: 'noopener', aria: { label: 'Learn more about incoming email addresses' } do + = sprite_icon('question-o') generated just for you. diff --git a/app/views/projects/_merge_request_merge_checks_settings.html.haml b/app/views/projects/_merge_request_merge_checks_settings.html.haml index 9cebb191346..7a5997bbcfd 100644 --- a/app/views/projects/_merge_request_merge_checks_settings.html.haml +++ b/app/views/projects/_merge_request_merge_checks_settings.html.haml @@ -9,7 +9,7 @@ = s_('ProjectSettings|Pipelines must succeed') .text-secondary = s_('ProjectSettings|Pipelines need to be configured to enable this feature.') - = link_to icon('question-circle'), + = link_to sprite_icon('question-o'), help_page_path('ci/merge_request_pipelines/index.md', anchor: 'pipelines-for-merge-requests'), target: '_blank' @@ -21,6 +21,6 @@ .text-secondary = s_('ProjectSettings|This introduces the risk of merging changes that will not pass the pipeline.') .form-check.mb-2 - = form.check_box :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-input' + = form.check_box :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-input', data: { qa_selector: 'allow_merge_if_all_discussions_are_resolved_checkbox' } = form.label :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-label' do = s_('ProjectSettings|All discussions must be resolved') diff --git a/app/views/projects/_merge_request_merge_suggestions_settings.html.haml b/app/views/projects/_merge_request_merge_suggestions_settings.html.haml index 12f26a7e315..258cf86ab05 100644 --- a/app/views/projects/_merge_request_merge_suggestions_settings.html.haml +++ b/app/views/projects/_merge_request_merge_suggestions_settings.html.haml @@ -4,7 +4,7 @@ %b= s_('ProjectSettings|Merge suggestions') %p.text-secondary = s_('ProjectSettings|The commit message used to apply merge request suggestions') - = link_to icon('question-circle'), + = link_to sprite_icon('question-o'), help_page_path('user/discussions/index.md', anchor: 'configure-the-commit-message-for-applied-suggestions'), target: '_blank' diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml index e0a426607d4..ee35f734e3e 100644 --- a/app/views/projects/_new_project_fields.html.haml +++ b/app/views/projects/_new_project_fields.html.haml @@ -47,7 +47,7 @@ = f.label :visibility_level, class: 'label-bold' do = s_('ProjectsNew|Visibility Level') - = link_to icon('question-circle'), help_page_path("public_access/public_access"), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('public_access/public_access'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer' = render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false - if !hide_init_with_readme diff --git a/app/views/projects/_service_desk_settings.html.haml b/app/views/projects/_service_desk_settings.html.haml index 7c08955983a..fceef0624d7 100644 --- a/app/views/projects/_service_desk_settings.html.haml +++ b/app/views/projects/_service_desk_settings.html.haml @@ -10,7 +10,7 @@ - if ::Gitlab::ServiceDesk.supported? .js-service-desk-setting-root{ data: { endpoint: project_service_desk_path(@project), enabled: "#{@project.service_desk_enabled}", - incoming_email: (@project.service_desk_incoming_address if @project.service_desk_enabled), + incoming_email: (@project.service_desk_address if @project.service_desk_enabled), custom_email: (@project.service_desk_custom_address if @project.service_desk_enabled), selected_template: "#{@project.service_desk_setting&.issue_template_key}", outgoing_name: "#{@project.service_desk_setting&.outgoing_name}", diff --git a/app/views/projects/artifacts/_tree_directory.html.haml b/app/views/projects/artifacts/_tree_directory.html.haml index 1a9ce8d0508..c68cc19f6c1 100644 --- a/app/views/projects/artifacts/_tree_directory.html.haml +++ b/app/views/projects/artifacts/_tree_directory.html.haml @@ -3,6 +3,6 @@ %tr.tree-item{ 'data-link' => path_to_directory } %td.tree-item-file-name = tree_icon('folder', '755', directory.name) - = link_to path_to_directory, class: 'str-truncated' do + = link_to path_to_directory, class: 'str-truncated', data: { qa_selector: 'directory_name_link', qa_directory_name: directory.name } do %span= directory.name %td diff --git a/app/views/projects/blob/_content.html.haml b/app/views/projects/blob/_content.html.haml index 7afbd85cd6d..11946f22811 100644 --- a/app/views/projects/blob/_content.html.haml +++ b/app/views/projects/blob/_content.html.haml @@ -1,6 +1,10 @@ - simple_viewer = blob.simple_viewer - rich_viewer = blob.rich_viewer - rich_viewer_active = rich_viewer && params[:viewer] != 'simple' +- blob_data = defined?(@blob) ? @blob.data : {} +- filename = defined?(@blob) ? @blob.name : '' + +#js-blob-toggle-graph-preview{ data: { blob_data: blob_data, filename: filename } } = render 'projects/blob/viewer', viewer: simple_viewer, hidden: rich_viewer_active diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 787dc3b030f..cea65bf9b4e 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -23,6 +23,7 @@ .js-suggest-gitlab-ci-yml{ data: { toggle: 'popover', target: '#gitlab-ci-yml-selector', track_label: 'suggest_gitlab_ci_yml', + merge_request_path: params[:mr_path], dismiss_key: @project.id, human_access: human_access } } diff --git a/app/views/projects/blob/_pipeline_tour_success.html.haml b/app/views/projects/blob/_pipeline_tour_success.html.haml index cf1427df044..3ea2defb2b3 100644 --- a/app/views/projects/blob/_pipeline_tour_success.html.haml +++ b/app/views/projects/blob/_pipeline_tour_success.html.haml @@ -1,3 +1,4 @@ .js-success-pipeline-modal{ data: { 'commit-cookie': suggest_pipeline_commit_cookie_name, 'go-to-pipelines-path': project_pipelines_path(@project), + 'project-merge-requests-path': project_merge_requests_path(@project), 'human-access': @project.team.human_max_access(current_user&.id) } } diff --git a/app/views/projects/blob/_template_selectors.html.haml b/app/views/projects/blob/_template_selectors.html.haml index 2aefcdc5762..b4962f4e78e 100644 --- a/app/views/projects/blob/_template_selectors.html.haml +++ b/app/views/projects/blob/_template_selectors.html.haml @@ -1,4 +1,4 @@ -.template-selectors-menu.gl-pl-2-deprecated-no-really-do-not-use-me +.template-selectors-menu.gl-pl-3 .template-selector-dropdowns-wrap .template-type-selector.js-template-type-selector-wrap.hidden - toggle_text = should_suggest_gitlab_ci_yml? ? '.gitlab-ci.yml' : 'Select a template type' diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index 7d072ba5899..9bb4342ffb4 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -2,10 +2,16 @@ - page_title _("Edit"), @blob.path, @ref - if @conflict - .alert.alert-danger - Someone edited the file the same time you did. Please check out - = link_to "the file", project_blob_path(@project, tree_join(@branch_name, @file_path)), target: "_blank", rel: 'noopener noreferrer' - and make sure your changes will not unintentionally remove theirs. + .gl-alert.gl-alert-danger.gl-mb-5.gl-mt-5 + = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + .gl-alert-body + Someone edited the file the same time you did. Please check out + = 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. + +- if editing_ci_config? && show_web_ide_alert? + #js-suggest-web-ide-ci{ data: { dismiss_endpoint: user_callouts_path, feature_id: UserCalloutsHelper::WEB_IDE_ALERT_DISMISSED, edit_path: ide_edit_path } } + .editor-title-row %h3.page-title.blob-edit-page-title Edit file diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 48ffd80aa9c..a939f43d5e2 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -15,6 +15,7 @@ - if should_suggest_gitlab_ci_yml? .js-suggest-gitlab-ci-yml-commit-changes{ data: { toggle: 'popover', target: '#commit-changes', + merge_request_path: params[:mr_path], track_label: 'suggest_commit_first_project_gitlab_ci_yml', dismiss_key: @project.id, human_access: human_access } } diff --git a/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml b/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml index 10cbf6a2f7a..379a6c3084a 100644 --- a/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml +++ b/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml @@ -1,4 +1,4 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom mr-1") Validating GitLab CI configuration… = link_to 'Learn more', help_page_path('ci/yaml/README') diff --git a/app/views/projects/blob/viewers/_loading.html.haml b/app/views/projects/blob/viewers/_loading.html.haml index 5fbe9b0df0c..18fd0d87ce6 100644 --- a/app/views/projects/blob/viewers/_loading.html.haml +++ b/app/views/projects/blob/viewers/_loading.html.haml @@ -1,2 +1,2 @@ -.text-center.gl-mt-3.gl-mb-3 - = icon('spinner spin 2x', 'aria-hidden' => 'true', 'aria-label' => 'Loading content…', class: 'qa-spinner') +.text-center.gl-mt-4.gl-mb-3 + = loading_icon(size: "md", css_class: "qa-spinner") diff --git a/app/views/projects/blob/viewers/_loading_auxiliary.html.haml b/app/views/projects/blob/viewers/_loading_auxiliary.html.haml index c7dc9e3250a..5a6c1a493a5 100644 --- a/app/views/projects/blob/viewers/_loading_auxiliary.html.haml +++ b/app/views/projects/blob/viewers/_loading_auxiliary.html.haml @@ -1,2 +1,2 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom") Analyzing file… diff --git a/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml b/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml index 9ec1d7d0d67..de9c6c5320f 100644 --- a/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml +++ b/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml @@ -5,7 +5,7 @@ = icon('warning fw') = _('Metrics Dashboard YAML definition is invalid:') %ul - - viewer.errors.messages.each do |error| - %li= error.join(': ') + - viewer.errors.each do |error| + %li= error = link_to _('Learn more'), help_page_path('operations/metrics/dashboards/index.md') diff --git a/app/views/projects/blob/viewers/_route_map_loading.html.haml b/app/views/projects/blob/viewers/_route_map_loading.html.haml index 1d768bd1ca4..8610847fbc9 100644 --- a/app/views/projects/blob/viewers/_route_map_loading.html.haml +++ b/app/views/projects/blob/viewers/_route_map_loading.html.haml @@ -1,4 +1,4 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom gl-mr-1") Validating Route Map… = link_to 'Learn more', help_page_path('ci/environments/index.md', anchor: 'going-from-source-files-to-public-pages') diff --git a/app/views/projects/blob/viewers/_sketch.html.haml b/app/views/projects/blob/viewers/_sketch.html.haml index aa8d1dd326f..08c21258d3f 100644 --- a/app/views/projects/blob/viewers/_sketch.html.haml +++ b/app/views/projects/blob/viewers/_sketch.html.haml @@ -1,3 +1,3 @@ .file-content#js-sketch-viewer{ data: { endpoint: blob_raw_path } } - .js-loading-icon.text-center.gl-mt-3.gl-mb-3.js-loading-icon{ 'aria-label' => 'Loading Sketch preview' } - = icon('spinner spin 2x', 'aria-hidden' => 'true'); + .text-center.gl-mt-4.gl-mb-3.js-loading-icon + = loading_icon(size: "md") diff --git a/app/views/projects/blob/viewers/_stl.html.haml b/app/views/projects/blob/viewers/_stl.html.haml index 6983c3cc81b..44c986595df 100644 --- a/app/views/projects/blob/viewers/_stl.html.haml +++ b/app/views/projects/blob/viewers/_stl.html.haml @@ -1,6 +1,6 @@ .file-content.is-stl-loading .text-center#js-stl-viewer{ data: { endpoint: blob_raw_path } } - = icon('spinner spin 2x', class: 'gl-mt-3 gl-mb-3', 'aria-hidden' => 'true', 'aria-label' => 'Loading') + = loading_icon(size: "md", css_class: "gl-mt-4 gl-mb-3") .text-center.gl-mt-3.gl-mb-3.stl-controls .btn-group %button.btn.btn-default.btn-sm.js-material-changer{ data: { type: 'wireframe' } } diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index ed7dbdeae93..020a4361203 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -50,25 +50,25 @@ - if can?(current_user, :push_code, @project) - if branch.name == @project.repository.root_ref - %button{ class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip disabled", + %button{ class: "btn btn-remove remove-row has-tooltip disabled", disabled: true, title: s_('Branches|The default branch cannot be deleted') } - = icon("trash-o") + = sprite_icon("remove") - elsif protected_branch?(@project, branch) - if can?(current_user, :push_to_delete_protected_branch, @project) - %button{ class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip", + %button{ class: "btn btn-remove remove-row has-tooltip", title: s_('Branches|Delete protected branch'), data: { toggle: "modal", target: "#modal-delete-branch", delete_path: project_branch_path(@project, branch.name), branch_name: branch.name, is_merged: ("true" if merged) } } - = icon("trash-o") + = sprite_icon("remove") - else - %button{ class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip disabled", + %button{ class: "btn btn-remove remove-row has-tooltip disabled", disabled: true, title: s_('Branches|Only a project maintainer or owner can delete a protected branch') } - = icon("trash-o") + = sprite_icon("remove") - else = link_to project_branch_path(@project, branch.name), class: "btn btn-remove remove-row qa-remove-btn js-ajax-loading-spinner has-tooltip", @@ -77,4 +77,4 @@ data: { confirm: s_("Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?") % { branch_name: branch.name } }, remote: true, 'aria-label' => s_('Branches|Delete branch') do - = icon("trash-o") + = sprite_icon("remove") diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml index 97e46aaa710..7a8bc45a272 100644 --- a/app/views/projects/branches/new.html.haml +++ b/app/views/projects/branches/new.html.haml @@ -28,5 +28,4 @@ .form-actions = button_tag 'Create branch', class: 'btn btn-success', tabindex: 3 = link_to 'Cancel', project_branches_path(@project), class: 'btn btn-cancel' --# haml-lint:disable InlineJavaScript %script#availableRefs{ type: "application/json" }= @project.repository.ref_names.to_json.html_safe diff --git a/app/views/projects/buttons/_download.html.haml b/app/views/projects/buttons/_download.html.haml index 1d0ad6dcde6..c04687bd846 100644 --- a/app/views/projects/buttons/_download.html.haml +++ b/app/views/projects/buttons/_download.html.haml @@ -17,7 +17,7 @@ %section.border-top.pt-1.mt-1 %h5.m-0.dropdown-bold-header= _('Download artifacts') - unless pipeline.latest? - %span.unclickable= ci_status_for_statuseable(project.pipeline_for(ref)) + %span.unclickable= ci_status_for_statuseable(project.latest_pipeline(ref)) %h6.m-0.dropdown-header= _('Previous Artifacts') %ul - pipeline.latest_builds_with_artifacts.each do |job| diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml index 23f9a6a8f6c..c7ab01a4ef7 100644 --- a/app/views/projects/ci/builds/_build.html.haml +++ b/app/views/projects/ci/builds/_build.html.haml @@ -102,7 +102,7 @@ - if can?(current_user, :update_build, job) - if job.active? = link_to cancel_project_job_path(job.project, job, continue: { to: request.fullpath }), method: :post, title: _('Cancel'), class: 'btn btn-build' do - = icon('remove', class: 'cred') + = sprite_icon('close') - elsif job.scheduled? .btn-group .btn.btn-default{ disabled: true } diff --git a/app/views/projects/ci/lints/_create.html.haml b/app/views/projects/ci/lints/_create.html.haml index 5cc89343ba3..4b7cda0ef57 100644 --- a/app/views/projects/ci/lints/_create.html.haml +++ b/app/views/projects/ci/lints/_create.html.haml @@ -1,10 +1,10 @@ -- if @status +- if @result.valid? .bs-callout.bs-callout-success %p %b= _("Status:") = _("syntax is correct") - = render "projects/ci/lints/lint_warnings", warnings: @warnings + = render "projects/ci/lints/lint_warnings", warnings: @result.warnings .table-holder %table.table.table-bordered @@ -13,54 +13,31 @@ %th= _("Parameter") %th= _("Value") %tbody - - if @dry_run - - @stages.each do |stage| - - stage.statuses.each do |job| - %tr - %td #{stage.name.capitalize} Job - #{job.name} - %td - %pre= job.options[:before_script].to_a.join('\n') - %pre= job.options[:script].to_a.join('\n') - %pre= job.options[:after_script].to_a.join('\n') - %br - %b= _("Tag list:") - = job.tag_list.to_a.join(", ") if job.is_a?(Ci::Build) - %br - %b= _("Environment:") - = job.options.dig(:environment, :name) - %br - %b= _("When:") - = job.when - - if job.allow_failure - %b= _("Allowed to fail") - - - else - - @stages.each do |stage| - - @builds.select { |build| build[:stage] == stage }.each do |build| - - job = @jobs[build[:name].to_sym] - %tr - %td #{stage.capitalize} Job - #{build[:name]} - %td - %pre= job[:before_script].to_a.join('\n') - %pre= job[:script].to_a.join('\n') - %pre= job[:after_script].to_a.join('\n') - %br - %b= _("Tag list:") - = build[:tag_list].to_a.join(", ") - %br - %b= _("Only policy:") - = job[:only].to_a.join(", ") - %br - %b= _("Except policy:") - = job[:except].to_a.join(", ") - %br - %b= _("Environment:") - = build[:environment] - %br - %b= _("When:") - = build[:when] - - if build[:allow_failure] - %b= _("Allowed to fail") + - @result.jobs.each do |job| + %tr + %td #{job[:stage].capitalize} Job - #{job[:name]} + %td + %pre= job[:before_script].to_a.join('\n') + %pre= job[:script].to_a.join('\n') + %pre= job[:after_script].to_a.join('\n') + %br + %b= _("Tag list:") + = job[:tag_list].to_a.join(", ") + - unless @dry_run + %br + %b= _("Only policy:") + = job[:only].to_a.join(", ") + %br + %b= _("Except policy:") + = job[:except].to_a.join(", ") + %br + %b= _("Environment:") + = job[:environment] + %br + %b= _("When:") + = job[:when] + - if job[:allow_failure] + %b= _("Allowed to fail") - else .bs-callout.bs-callout-danger @@ -68,7 +45,7 @@ %b= _("Status:") = _("syntax is incorrect") %pre - - @errors.each do |message| + - @result.errors.each do |message| %p= message - = render "projects/ci/lints/lint_warnings", warnings: @warnings + = render "projects/ci/lints/lint_warnings", warnings: @result.warnings diff --git a/app/views/projects/ci/lints/_lint_warnings.html.haml b/app/views/projects/ci/lints/_lint_warnings.html.haml index 0a5bb8f76ef..90db65e6c27 100644 --- a/app/views/projects/ci/lints/_lint_warnings.html.haml +++ b/app/views/projects/ci/lints/_lint_warnings.html.haml @@ -1,6 +1,10 @@ - if warnings - - warnings.each do |warning| + - total_warnings = warnings.length + - message = warning_header(total_warnings) + + - if warnings.any? .bs-callout.bs-callout-warning - %p - %b= _("Warning:") - = markdown(warning) + %details + %summary.gl-mb-2= message + - warnings.each do |warning| + = markdown(warning) diff --git a/app/views/projects/ci/lints/show.html.haml b/app/views/projects/ci/lints/show.html.haml index 0c51c978bfe..2e79852f4c9 100644 --- a/app/views/projects/ci/lints/show.html.haml +++ b/app/views/projects/ci/lints/show.html.haml @@ -1,30 +1,40 @@ - page_title _("CI Lint") - page_description _("Validate your GitLab CI configuration file") -- content_for :library_javascripts do - = page_specific_javascript_tag('lib/ace.js') +- unless Feature.enabled?(:monaco_ci) + - content_for :library_javascripts do + = page_specific_javascript_tag('lib/ace.js') %h2.pt-3.pb-3= _("Validate your GitLab CI configuration") -.project-ci-linter - = form_tag project_ci_lint_path(@project), method: :post do - .row - .col-sm-12 - .file-holder - .js-file-title.file-title.clearfix - = _("Contents of .gitlab-ci.yml") - #ci-editor.ci-editor= @content - = text_area_tag(:content, @content, class: 'hidden form-control span1', rows: 7, require: true) - .col-sm-12 - .float-left.gl-mt-3 - = submit_tag(_('Validate'), class: 'btn btn-success submit-yml') - - if Gitlab::Ci::Features.lint_creates_pipeline_with_dry_run?(@project) - = check_box_tag(:dry_run, 'true', params[:dry_run]) - = label_tag(:dry_run, _('Simulate a pipeline created for the default branch')) - = link_to icon('question-circle'), help_page_path('ci/lint', anchor: 'pipeline-simulation'), target: '_blank', rel: 'noopener noreferrer' - .float-right.prepend-top-10 - = button_tag(_('Clear'), type: 'button', class: 'btn btn-default clear-yml') +- if Feature.enabled?(:ci_lint_vue, @project) + #js-ci-lint{ data: { endpoint: project_ci_lint_path(@project) } } - .row.prepend-top-20 - .col-sm-12 - .results.project-ci-template - = render partial: 'create' if defined?(@status) +- else + .project-ci-linter + = form_tag project_ci_lint_path(@project), method: :post, class: 'js-ci-lint-form' do + .row + .col-sm-12 + .file-holder + .js-file-title.file-title.clearfix + = _("Contents of .gitlab-ci.yml") + - if Feature.enabled?(:monaco_ci) + .file-editor.code + .js-edit-mode-pane.qa-editor#editor{ data: { 'editor-loading': true } }< + %pre.editor-loading-content= params[:content] + - else + #ci-editor.ci-editor= @content + = text_area_tag(:content, @content, class: 'hidden form-control span1', rows: 7, require: true) + .col-sm-12 + .float-left.gl-mt-3 + = submit_tag(_('Validate'), class: 'btn btn-success submit-yml') + - if Gitlab::Ci::Features.lint_creates_pipeline_with_dry_run?(@project) + = check_box_tag(:dry_run, 'true', params[:dry_run]) + = label_tag(:dry_run, _('Simulate a pipeline created for the default branch')) + = link_to sprite_icon('question-o'), help_page_path('ci/lint', anchor: 'pipeline-simulation'), target: '_blank', rel: 'noopener noreferrer' + .float-right.prepend-top-10 + = button_tag(_('Clear'), type: 'button', class: 'btn btn-default clear-yml') + + .row.prepend-top-20 + .col-sm-12 + .results.project-ci-template + = render partial: 'create' if defined?(@result) diff --git a/app/views/projects/cleanup/_show.html.haml b/app/views/projects/cleanup/_show.html.haml index f560127fefd..019894ddbb4 100644 --- a/app/views/projects/cleanup/_show.html.haml +++ b/app/views/projects/cleanup/_show.html.haml @@ -7,7 +7,7 @@ = expanded ? _('Collapse') : _('Expand') %p = _("Clean up after running %{filter_repo} on the repository" % { filter_repo: link_to_filter_repo }).html_safe - = link_to icon('question-circle'), + = link_to sprite_icon('question-o'), help_page_path('user/project/repository/reducing_the_repo_size_using_git.md'), target: '_blank', rel: 'noopener noreferrer' @@ -28,4 +28,3 @@ .gl-display-flex.gl-justify-content-end = f.submit _('Start cleanup'), class: 'btn btn-success' - diff --git a/app/views/projects/commit/_limit_exceeded_message.html.haml b/app/views/projects/commit/_limit_exceeded_message.html.haml index ace1be787fb..236418ecd0e 100644 --- a/app/views/projects/commit/_limit_exceeded_message.html.haml +++ b/app/views/projects/commit/_limit_exceeded_message.html.haml @@ -3,6 +3,6 @@ - if objects == :branch = sprite_icon('fork', size: 12) - else - = icon('tag') + = sprite_icon('tag') .limit-message %span= _('%{label_for_message} unavailable') % { label_for_message: label_for_message.capitalize } diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 33fedde0cd1..cd61576a96a 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -11,6 +11,7 @@ - commit = commit.present(current_user: current_user) - commit_status = commit.status_for(ref) - collapsible = local_assigns.fetch(:collapsible, true) +- link_data_attrs = local_assigns.fetch(:link_data_attrs, {}) - link = commit_path(project, commit, merge_request: merge_request) @@ -26,7 +27,7 @@ - if view_details && merge_request = link_to commit.title, project_commit_path(project, commit.id, merge_request_iid: merge_request.iid), class: ["commit-row-message item-title js-onboarding-commit-item", ("font-italic" if commit.message.empty?)] - else - = link_to_markdown_field(commit, :title, link, class: "commit-row-message item-title js-onboarding-commit-item #{"font-italic" if commit.message.empty?}") + = link_to_markdown_field(commit, :title, link, class: "commit-row-message item-title js-onboarding-commit-item #{"font-italic" if commit.message.empty?}", data: link_data_attrs) %span.commit-row-message.d-inline.d-sm-none · = commit.short_id diff --git a/app/views/projects/cycle_analytics/_overview.html.haml b/app/views/projects/cycle_analytics/_overview.html.haml deleted file mode 100644 index 2ca72b141be..00000000000 --- a/app/views/projects/cycle_analytics/_overview.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -.cycle-analytics-overview - .container - .row - .col-md-10.offset-md-1 - .row.overview-details - .col-md-6.overview-text - %h4 Introducing Value Stream Analytics - %p - Value Stream Analytics (VSA) gives an overview of how much time it takes to go from idea to production in your project. - To set up VSA, you must first define a production environment by setting up your CI and then deploy to production. - %p - %a.btn{ href: help_page_path('user/analytics/value_stream_analytics.md'), target: '_blank' } Read more - .col-md-6.overview-image - %span.overview-icon - = custom_icon ('icon_cycle_analytics_overview') diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index 090fc602ebb..d7e10efc3b1 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -40,19 +40,23 @@ %li.stage-header.pl-5 %span.stage-name.font-weight-bold {{ s__('ProjectLifecycle|Stage') }} - %i.has-tooltip.fa.fa-question-circle{ "data-placement" => "top", title: _("The phase of the development lifecycle."), "aria-hidden" => "true" } + %span.has-tooltip{ "data-placement" => "top", title: _("The phase of the development lifecycle."), "aria-hidden" => "true" } + = sprite_icon('question-o', css_class: 'gl-text-gray-500') %li.median-header %span.stage-name.font-weight-bold {{ __('Median') }} - %i.has-tooltip.fa.fa-question-circle{ "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" } + %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 {{ currentStage ? __(currentStage.legend) : __('Related Issues') }} - %i.has-tooltip.fa.fa-question-circle{ "data-placement" => "top", title: _("The collection of events added to the data gathered for that stage."), "aria-hidden" => "true" } + %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') %li.total-time-header.pr-5.text-right %span.stage-name.font-weight-bold {{ __('Time') }} - %i.has-tooltip.fa.fa-question-circle{ "data-placement" => "top", title: _("The time taken by each data entry gathered by that stage."), "aria-hidden" => "true" } + %span.has-tooltip{ "data-placement" => "top", title: _("The time taken by each data entry gathered by that stage."), "aria-hidden" => "true" } + = sprite_icon('question-o', css_class: 'gl-text-gray-500') .stage-panel-body %nav.stage-nav %ul diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml index b78535bbe2f..46ee60949db 100644 --- a/app/views/projects/default_branch/_show.html.haml +++ b/app/views/projects/default_branch/_show.html.haml @@ -26,7 +26,7 @@ %strong= _("Auto-close referenced issues on default branch") .form-text.text-muted = _("Issues referenced by merge requests and commits within the default branch will be closed automatically") - = link_to icon('question-circle'), help_page_path('user/project/issues/managing_issues.md', anchor: 'disabling-automatic-issue-closing'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'disabling-automatic-issue-closing'), target: '_blank' .gl-display-flex.gl-justify-content-end = f.submit _('Save changes'), class: "btn btn-success" diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml index bd023e0442c..187ebcb739c 100644 --- a/app/views/projects/diffs/_file.html.haml +++ b/app/views/projects/diffs/_file.html.haml @@ -9,6 +9,10 @@ .file-header-content = render "projects/diffs/file_header", diff_file: diff_file, url: "##{file_hash}" + - if diff_file.submodule? + .file-actions.d-none.d-sm-block + = submodule_diff_compare_link(diff_file) + - unless diff_file.submodule? - blob = diff_file.blob .file-actions.d-none.d-sm-block diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index bf978b01652..e5c4cfcbd72 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -39,7 +39,7 @@ %input{ name: 'update_section', type: 'hidden', value: 'js-merge-request-settings' } = render 'projects/merge_request_settings', form: f .gl-display-flex.gl-justify-content-end - = f.submit _('Save changes'), class: "btn btn-succes qa-save-merge-request-changes rspec-save-merge-request-changes" + = f.submit _('Save changes'), class: "btn btn-success qa-save-merge-request-changes rspec-save-merge-request-changes" = render_if_exists 'projects/merge_request_approvals_settings', expanded: expanded diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index bfb22aa8025..c9edc3c12ec 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -5,72 +5,71 @@ = render partial: 'flash_messages', locals: { project: @project } -%div{ class: [("limit-container-width" unless fluid_layout)] } - = render "home_panel" += render "home_panel" - %h4.gl-mt-0.gl-mb-3 - = _('The repository for this project is empty') +%h4.gl-mt-0.gl-mb-3 + = _('The repository for this project is empty') - - if @project.can_current_user_push_code? - %p.gl-mb-0 - = _('You can get started by cloning the repository or start adding files to it with one of the following options.') +- if @project.can_current_user_push_code? + %p.gl-mb-0 + = _('You can get started by cloning the repository or start adding files to it with one of the following options.') - .project-buttons.qa-quick-actions - .project-clone-holder.d-block.d-md-none.mt-2.mr-2 - = render "shared/mobile_clone_panel" +.project-buttons.qa-quick-actions + .project-clone-holder.d-block.d-md-none.mt-2.mr-2 + = render "shared/mobile_clone_panel" - .project-clone-holder.d-none.d-md-inline-block.mt-2.mr-2.float-left - = render "projects/buttons/clone" - = render 'stat_anchor_list', anchors: @project.empty_repo_statistics_buttons + .project-clone-holder.d-none.d-md-inline-block.mt-2.mr-2.float-left + = render "projects/buttons/clone" + = render 'stat_anchor_list', anchors: @project.empty_repo_statistics_buttons - - if can?(current_user, :push_code, @project) - .empty-wrapper.gl-mt-7 - %h3#repo-command-line-instructions.page-title-empty - = _('Command line instructions') - %p - = _('You can also upload existing files from your computer using the instructions below.') - .git-empty.js-git-empty - %fieldset - %h5= _('Git global setup') - %pre.bg-light - :preserve - git config --global user.name "#{h git_user_name}" - git config --global user.email "#{h git_user_email}" +- if can?(current_user, :push_code, @project) + .empty-wrapper.gl-mt-7 + %h3#repo-command-line-instructions.page-title-empty + = _('Command line instructions') + %p + = _('You can also upload existing files from your computer using the instructions below.') + .git-empty.js-git-empty + %fieldset + %h5= _('Git global setup') + %pre.bg-light + :preserve + git config --global user.name "#{h git_user_name}" + git config --global user.email "#{h git_user_email}" - %fieldset - %h5= _('Create a new repository') - %pre.bg-light - :preserve - git clone #{ content_tag(:span, default_url_to_repo, class: 'js-clone')} - cd #{h @project.path} - touch README.md - git add README.md - git commit -m "add README" - - if @project.can_current_user_push_to_default_branch? - %span>< - git push -u origin #{ default_branch_name } + %fieldset + %h5= _('Create a new repository') + %pre.bg-light + :preserve + git clone #{ content_tag(:span, default_url_to_repo, class: 'js-clone')} + cd #{h @project.path} + touch README.md + git add README.md + git commit -m "add README" + - if @project.can_current_user_push_to_default_branch? + %span>< + git push -u origin #{ default_branch_name } - %fieldset - %h5= _('Push an existing folder') - %pre.bg-light - :preserve - cd existing_folder - git init - git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'js-clone')} - git add . - git commit -m "Initial commit" - - if @project.can_current_user_push_to_default_branch? - %span>< - git push -u origin #{ default_branch_name } + %fieldset + %h5= _('Push an existing folder') + %pre.bg-light + :preserve + cd existing_folder + git init + git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'js-clone')} + git add . + git commit -m "Initial commit" + - if @project.can_current_user_push_to_default_branch? + %span>< + git push -u origin #{ default_branch_name } - %fieldset - %h5= _('Push an existing Git repository') - %pre.bg-light - :preserve - cd existing_repo - git remote rename origin old-origin - git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'js-clone')} - - if @project.can_current_user_push_to_default_branch? - %span>< - git push -u origin --all - git push -u origin --tags + %fieldset + %h5= _('Push an existing Git repository') + %pre.bg-light + :preserve + cd existing_repo + git remote rename origin old-origin + git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'js-clone')} + - if @project.can_current_user_push_to_default_branch? + %span>< + git push -u origin --all + git push -u origin --tags diff --git a/app/views/projects/environments/folder.html.haml b/app/views/projects/environments/folder.html.haml index cd24c30e46f..554cb4323f7 100644 --- a/app/views/projects/environments/folder.html.haml +++ b/app/views/projects/environments/folder.html.haml @@ -2,4 +2,4 @@ - breadcrumb_title _("Folder/%{name}") % { name: @folder } - page_title _("Environments in %{name}") % { name: @folder } -#environments-folder-list-view{ data: { environments_data: environments_folder_list_view_data } } +#environments-folder-list-view{ data: { environments_data: environments_folder_list_view_data, project_path: @project.full_path } } diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 445196ed449..9abc1a5a925 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -5,4 +5,5 @@ "can-create-environment" => can?(current_user, :create_environment, @project).to_s, "new-environment-path" => new_project_environment_path(@project), "help-page-path" => help_page_path("ci/environments/index.md"), - "deploy-boards-help-path" => help_page_path("user/project/deploy_boards", anchor: "enabling-deploy-boards") } } + "deploy-boards-help-path" => help_page_path("user/project/deploy_boards", anchor: "enabling-deploy-boards"), + "project-path" => @project.full_path } } diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 2e665a12a0a..929015023d2 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -69,7 +69,7 @@ .text-center = link_to _("Read more"), help_page_path("ci/environments"), class: "btn btn-success" - else - .table-holder + .table-holder.gl-overflow-visible .ci-table.environments{ role: 'grid' } .gl-responsive-table-row.table-row-header{ role: 'row' } .table-section.section-15{ role: 'columnheader' }= _('Status') diff --git a/app/views/projects/feature_flags/_errors.html.haml b/app/views/projects/feature_flags/_errors.html.haml new file mode 100644 index 00000000000..a32245640be --- /dev/null +++ b/app/views/projects/feature_flags/_errors.html.haml @@ -0,0 +1,4 @@ +#error_explanation + .alert.alert-danger + - @feature_flag.errors.full_messages.each do |message| + %p= message diff --git a/app/views/projects/feature_flags/edit.html.haml b/app/views/projects/feature_flags/edit.html.haml new file mode 100644 index 00000000000..4de41ca4080 --- /dev/null +++ b/app/views/projects/feature_flags/edit.html.haml @@ -0,0 +1,16 @@ +- @gfm_form = Feature.enabled?(:feature_flags_issue_links, @project, default_enabled: true) + +- add_to_breadcrumbs s_('FeatureFlags|Feature Flags'), project_feature_flags_path(@project) +- breadcrumb_title @feature_flag.name +- page_title s_('FeatureFlags|Edit Feature Flag') + +#js-edit-feature-flag{ data: { endpoint: project_feature_flag_path(@project, @feature_flag), + project_id: @project.id, + feature_flags_path: project_feature_flags_path(@project), + environments_endpoint: search_project_environments_path(@project, format: :json), + user_callouts_path: user_callouts_path, + user_callout_id: UserCalloutsHelper::FEATURE_FLAGS_NEW_VERISION, + show_user_callout: show_feature_flags_new_version?.to_s, + strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'), + environments_scope_docs_path: help_page_path('ci/environments', anchor: 'scoping-environments-with-specs'), + feature_flag_issues_endpoint: feature_flag_issues_links_endpoint(@project, @feature_flag, current_user) } } diff --git a/app/views/projects/feature_flags/index.html.haml b/app/views/projects/feature_flags/index.html.haml new file mode 100644 index 00000000000..f425de91d12 --- /dev/null +++ b/app/views/projects/feature_flags/index.html.haml @@ -0,0 +1,15 @@ +- page_title s_('FeatureFlags|Feature Flags') + +#feature-flags-vue{ data: { endpoint: project_feature_flags_path(@project, format: :json), + "project-id" => @project.id, + "project-name" => @project.name, + "error-state-svg-path" => image_path('illustrations/feature_flag.svg'), + "feature-flags-help-page-path" => help_page_path("operations/feature_flags"), + "feature-flags-client-libraries-help-page-path" => help_page_path("operations/feature_flags", anchor: "choose-a-client-library"), + "feature-flags-client-example-help-page-path" => help_page_path("operations/feature_flags", anchor: "golang-application-example"), + "unleash-api-url" => (unleash_api_url(@project) if can?(current_user, :admin_feature_flag, @project)), + "unleash-api-instance-id" => (unleash_api_instance_id(@project) if can?(current_user, :admin_feature_flag, @project)), + "can-user-admin-feature-flag" => can?(current_user, :admin_feature_flag, @project), + "new-feature-flag-path" => can?(current_user, :create_feature_flag, @project) ? new_project_feature_flag_path(@project): nil, + "rotate-instance-id-path" => can?(current_user, :admin_feature_flags_client, @project) ? reset_token_project_feature_flags_client_path(@project, format: :json) : nil, + "new-user-list-path" => can?(current_user, :admin_feature_flags_user_lists, @project) ? new_project_feature_flags_user_list_path(@project) : nil } } diff --git a/app/views/projects/feature_flags/new.html.haml b/app/views/projects/feature_flags/new.html.haml new file mode 100644 index 00000000000..a7388361da5 --- /dev/null +++ b/app/views/projects/feature_flags/new.html.haml @@ -0,0 +1,14 @@ +- @breadcrumb_link = new_project_feature_flag_path(@project) +- add_to_breadcrumbs s_('FeatureFlags|Feature Flags'), project_feature_flags_path(@project) +- breadcrumb_title s_('FeatureFlags|New') +- page_title s_('FeatureFlags|New Feature Flag') + +#js-new-feature-flag{ data: { endpoint: project_feature_flags_path(@project, format: :json), + feature_flags_path: project_feature_flags_path(@project), + environments_endpoint: search_project_environments_path(@project, format: :json), + user_callouts_path: user_callouts_path, + user_callout_id: UserCalloutsHelper::FEATURE_FLAGS_NEW_VERISION, + show_user_callout: show_feature_flags_new_version?.to_s, + strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'), + environments_scope_docs_path: help_page_path('ci/environments', anchor: 'scoping-environments-with-specs'), + project_id: @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/edit.html.haml b/app/views/projects/feature_flags_user_lists/edit.html.haml new file mode 100644 index 00000000000..ea47cc06c0e --- /dev/null +++ b/app/views/projects/feature_flags_user_lists/edit.html.haml @@ -0,0 +1,7 @@ +- add_to_breadcrumbs s_('FeatureFlags|Feature Flags'), project_feature_flags_path(@project) +- breadcrumb_title s_('FeatureFlags|Edit User List') +- page_title s_('FeatureFlags|Edit User List') + +#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'), + 'user-list-iid' => @user_list.iid, + 'project-id' => @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/new.html.haml b/app/views/projects/feature_flags_user_lists/new.html.haml new file mode 100644 index 00000000000..3d25453cb66 --- /dev/null +++ b/app/views/projects/feature_flags_user_lists/new.html.haml @@ -0,0 +1,8 @@ +- @breadcrumb_link = new_project_feature_flags_user_list_path(@project) +- add_to_breadcrumbs s_('FeatureFlags|Feature Flags'), project_feature_flags_path(@project) +- breadcrumb_title s_('FeatureFlags|New User List') +- page_title s_('FeatureFlags|New User List') + +#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'), + 'feature-flags-path' => project_feature_flags_path(@project), + 'project-id' => @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/show.html.haml b/app/views/projects/feature_flags_user_lists/show.html.haml new file mode 100644 index 00000000000..add256f0190 --- /dev/null +++ b/app/views/projects/feature_flags_user_lists/show.html.haml @@ -0,0 +1,7 @@ +- add_to_breadcrumbs s_('FeatureFlags|Feature Flags'), project_feature_flags_path(@project) +- breadcrumb_title s_('FeatureFlags|List details') +- page_title s_('FeatureFlags|Feature Flag User List Details') + +#js-edit-user-list{ data: { project_id: @project.id, + user_list_iid: @user_list.iid, + empty_state_path: image_path('illustrations/feature_flag.svg') } } diff --git a/app/views/projects/find_file/show.html.haml b/app/views/projects/find_file/show.html.haml index 786af3714a6..194b10e9ef4 100644 --- a/app/views/projects/find_file/show.html.haml +++ b/app/views/projects/find_file/show.html.haml @@ -24,4 +24,4 @@ %p.text-secondary = _('Try using a different search term to find the file you are looking for.') .text-center.gl-mt-3.loading - .spinner.spinner-md + = loading_icon(size: 'md') diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml index 5d527f1bcfb..0c15796b667 100644 --- a/app/views/projects/forks/error.html.haml +++ b/app/views/projects/forks/error.html.haml @@ -1,20 +1,22 @@ - page_title _("Fork project") - if @forked_project && !@forked_project.saved? - .alert.alert-danger.alert-block - %h4 + .gl-alert.gl-alert-danger.gl-mt-5 + = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon') + %h4.gl-alert-title = sprite_icon('fork') = _("Fork Error!") - %p - = _("You tried to fork %{link_to_the_project} but it failed for the following reason:").html_safe % { link_to_the_project: link_to_project(@project) } - - - if @forked_project && @forked_project.errors.any? + .gl-alert-body %p - – - - error = @forked_project.errors.full_messages.first - - if error.include?("already been taken") - = _("Name has already been taken") - - else - = error + = _("You tried to fork %{link_to_the_project} but it failed for the following reason:").html_safe % { link_to_the_project: link_to_project(@project) } + + - if @forked_project && @forked_project.errors.any? + %p + – + - error = @forked_project.errors.full_messages.first + - if error.include?("already been taken") + = _("Name has already been taken") + - else + = error - %p - = link_to _("Try to fork again"), new_project_fork_path(@project), title: _("Fork"), class: "btn" + .gl-alert-actions + = link_to _("Try to fork again"), new_project_fork_path(@project), title: _("Fork"), class: "btn gl-alert-action btn-info btn-md gl-button" diff --git a/app/views/projects/graphs/show.html.haml b/app/views/projects/graphs/show.html.haml index 495a4ac50bf..a73e367733b 100644 --- a/app/views/projects/graphs/show.html.haml +++ b/app/views/projects/graphs/show.html.haml @@ -1,6 +1,6 @@ - page_title _('Contributors') -.sub-header-block.bg-gray-light.gl-p-3-deprecated-no-really-do-not-use-me +.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' diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index 09624b771ea..0c1efab2195 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -4,7 +4,7 @@ .save-project-loader .center %h2 - %i.loading.spinner.spinner-sm + = loading_icon = import_in_progress_title - if !has_ci_cd_only_params? && @project.external_import? %p.monospace git clone --bare #{@project.safe_import_url} diff --git a/app/views/projects/issues/_design_management.html.haml b/app/views/projects/issues/_design_management.html.haml index 9d88d77eac9..6fc2f41b122 100644 --- a/app/views/projects/issues/_design_management.html.haml +++ b/app/views/projects/issues/_design_management.html.haml @@ -1,23 +1,12 @@ +- return if @issue.incident? + - requirements_link_url = help_page_path('user/project/issues/design_management', anchor: 'requirements') - requirements_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: requirements_link_url } - link_end = '</a>'.html_safe -- enable_lfs_message = s_("DesignManagement|To upload designs, you'll need to enable LFS. %{requirements_link_start}More information%{requirements_link_end}").html_safe % { requirements_link_start: requirements_link_start, requirements_link_end: link_end } +- enable_lfs_message = s_("DesignManagement|To upload designs, you'll need to enable LFS and have admin enable hashed storage. %{requirements_link_start}More information%{requirements_link_end}").html_safe % { requirements_link_start: requirements_link_start, requirements_link_end: link_end } - if @project.design_management_enabled? - - if Feature.enabled?(:design_management_moved, @project, default_enabled: true) - .js-design-management-new{ data: { project_path: @project.full_path, issue_iid: @issue.iid, issue_path: project_issue_path(@project, @issue) } } - - else - .js-design-management{ data: { project_path: @project.full_path, issue_iid: @issue.iid, issue_path: project_issue_path(@project, @issue) } } + .js-design-management{ data: { project_path: @project.full_path, issue_iid: @issue.iid, issue_path: project_issue_path(@project, @issue) } } - else - - if Feature.enabled?(:design_management_moved, @project, default_enabled: true) - .gl-border-solid.gl-border-1.gl-border-gray-100.gl-rounded-base.gl-mt-5.gl-p-3.gl-text-center - = enable_lfs_message - - else - .mt-4 - .row.empty-state - .col-12 - .text-content - %h4.center - = _('The one place for your designs') - %p.center - = enable_lfs_message + .gl-border-solid.gl-border-1.gl-border-gray-100.gl-rounded-base.gl-mt-5.gl-p-3.gl-text-center + = enable_lfs_message diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 1e24b08ece2..1a557cce33c 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,4 +1,6 @@ -- if Feature.enabled?(:vue_issuables_list, @project) +- is_project_overview = local_assigns.fetch(:is_project_overview, false) + +- if Feature.enabled?(:vue_issuables_list, @project) && !is_project_overview - data_endpoint = local_assigns.fetch(:data_endpoint, expose_path(api_v4_projects_issues_path(id: @project.id))) - default_empty_state_meta = { create_issue_path: new_project_issue_path(@project), svg_path: image_path('illustrations/issues.svg') } - data_empty_state_meta = local_assigns.fetch(:data_empty_state_meta, default_empty_state_meta) diff --git a/app/views/projects/issues/_related_issues.html.haml b/app/views/projects/issues/_related_issues.html.haml new file mode 100644 index 00000000000..d131d20f079 --- /dev/null +++ b/app/views/projects/issues/_related_issues.html.haml @@ -0,0 +1,6 @@ +- if can?(current_user, :read_issue_link, @project) + .js-related-issues-root{ data: { endpoint: project_issue_links_path(@project, @issue), + can_add_related_issues: "#{can?(current_user, :admin_issue_link, @issue)}", + help_path: help_page_path('user/project/issues/related_issues'), + show_categorized_issues: "false" } } + - render('projects/issues/related_issues_block') diff --git a/app/views/projects/issues/_related_issues_block.html.haml b/app/views/projects/issues/_related_issues_block.html.haml new file mode 100644 index 00000000000..8d986b64b1d --- /dev/null +++ b/app/views/projects/issues/_related_issues_block.html.haml @@ -0,0 +1,5 @@ +.related-issues-block + .card.card-slim + .card-header.panel-empty-heading.border-bottom-0 + %h3.card-title.mt-0.mb-0.h5 + = _('Linked issues') diff --git a/app/views/projects/issues/_tabs.html.haml b/app/views/projects/issues/_tabs.html.haml deleted file mode 100644 index d998a01623f..00000000000 --- a/app/views/projects/issues/_tabs.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%ul.nav-tabs.nav.nav-links{ role: 'tablist' } - %li - = link_to '#discussion-tab', class: 'active js-issue-tabs', id: 'discussion', role: 'tab', 'aria-controls': 'js-discussion', 'aria-selected': 'true', data: { toggle: 'tab', target: '#discussion-tab', qa_selector: 'discussion_tab_link' } do - = _('Discussion') - %span.badge.badge-pill.js-discussions-count - %li - = link_to '#designs-tab', class: 'js-issue-tabs', id: 'designs', role: 'tab', 'aria-controls': 'js-designs', 'aria-selected': 'false', data: { toggle: 'tab', target: '#designs-tab', qa_selector: 'designs_tab_link' } do - = _('Designs') - %span.badge.badge-pill.js-designs-count -.tab-content - #discussion-tab.tab-pane.show.active{ role: 'tabpanel', 'aria-labelledby': 'discussion', data: { qa_selector: 'discussion_tab_content' } } - = render 'projects/issues/discussion' - #designs-tab.tab-pane{ role: 'tabpanel', 'aria-labelledby': 'designs', data: { qa_selector: 'designs_tab_content' } } - = render 'projects/issues/design_management' diff --git a/app/views/projects/issues/service_desk.html.haml b/app/views/projects/issues/service_desk.html.haml index bd260bdf143..65580a94cd0 100644 --- a/app/views/projects/issues/service_desk.html.haml +++ b/app/views/projects/issues/service_desk.html.haml @@ -7,7 +7,7 @@ - support_bot_attrs = { service_desk_enabled: @project.service_desk_enabled?, **UserSerializer.new.represent(User.support_bot) }.to_json -- data_endpoint = "#{expose_path(api_v4_projects_issues_path(id: @project.id))}?author_id=#{User.support_bot.id}" +- data_endpoint = "#{expose_path(api_v4_projects_issues_path(id: @project.id))}?author_username=#{User.support_bot.username}" %div{ class: "js-service-desk-issues service-desk-issues", data: { support_bot: support_bot_attrs, service_desk_meta: service_desk_meta(@project) } } .top-area diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index a7817ad5552..c762b044c3e 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -64,7 +64,8 @@ -# haml-lint:disable InlineJavaScript %script#js-issuable-app-initial-data{ type: "application/json" }= issuable_initial_data(@issue).to_json #js-issuable-app - %h2.title= markdown_field(@issue, :title) + .title-container + %h2.title= markdown_field(@issue, :title) - if @issue.description.present? .description{ class: can?(current_user, :update_issue, @issue) ? 'js-task-list-container' : '' } .md= markdown_field(@issue, :description) @@ -75,8 +76,7 @@ - if @issue.sentry_issue.present? #js-sentry-error-stack-trace{ data: error_details_data(@project, @issue.sentry_issue.sentry_issue_identifier) } - - if Feature.enabled?(:design_management_moved, @project, default_enabled: true) - = render 'projects/issues/design_management' + = render 'projects/issues/design_management' = render_if_exists 'projects/issues/related_issues' @@ -96,9 +96,6 @@ #js-vue-discussion-filter{ data: { default_filter: current_user&.notes_filter_for(@issue), notes_filters: UserPreference.notes_filters.to_json } } = render 'new_branch' if show_new_branch_button? - - if Feature.enabled?(:design_management_moved, @project, default_enabled: true) - = render 'projects/issues/discussion' - - else - = render 'projects/issues/tabs' + = render 'projects/issues/discussion' = render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @issue.assignees diff --git a/app/views/projects/jobs/index.html.haml b/app/views/projects/jobs/index.html.haml index 4f537ee8014..0b4b4aafeee 100644 --- a/app/views/projects/jobs/index.html.haml +++ b/app/views/projects/jobs/index.html.haml @@ -7,9 +7,9 @@ .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 btn-info' + = link_to 'Get started with Pipelines', help_page_path('ci/quick_start/README'), class: 'btn gl-button btn-info' - = link_to project_ci_lint_path(@project), class: 'btn btn-default' do + = link_to project_ci_lint_path(@project), class: 'btn gl-button btn-default' do %span CI lint .content-list.builds-content-list diff --git a/app/views/projects/merge_requests/_how_to_merge.html.haml b/app/views/projects/merge_requests/_how_to_merge.html.haml index df81e608c3e..a831972a823 100644 --- a/app/views/projects/merge_requests/_how_to_merge.html.haml +++ b/app/views/projects/merge_requests/_how_to_merge.html.haml @@ -53,4 +53,4 @@ %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"), target: '_blank', rel: 'noopener noreferrer' + = 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/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml index 8aa4a935384..454a0694355 100644 --- a/app/views/projects/merge_requests/_mr_title.html.haml +++ b/app/views/projects/merge_requests/_mr_title.html.haml @@ -4,8 +4,10 @@ - state_human_name, state_icon_name = state_name_with_icon(@merge_request) - if @merge_request.closed_without_fork? - .alert.alert-danger - The source project of this merge request has been removed. + .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 + The source project of this merge request has been removed. .detail-page-header.border-bottom-0.pt-0.pb-0 .detail-page-header-body diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml index 64b14f8889c..9736071b03f 100644 --- a/app/views/projects/merge_requests/_widget.html.haml +++ b/app/views/projects/merge_requests/_widget.html.haml @@ -7,7 +7,7 @@ window.gl.mrWidgetData.ci_troubleshooting_docs_path = '#{help_page_path('ci/troubleshooting.md')}'; window.gl.mrWidgetData.mr_troubleshooting_docs_path = '#{help_page_path('user/project/merge_requests/reviewing_and_managing_merge_requests.md', anchor: 'troubleshooting')}'; window.gl.mrWidgetData.pipeline_must_succeed_docs_path = '#{help_page_path('user/project/merge_requests/merge_when_pipeline_succeeds.md', anchor: 'only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds')}'; - window.gl.mrWidgetData.security_approvals_help_page_path = '#{help_page_path('user/application_security/index.md', anchor: 'security-approvals-in-merge-requests-ultimate')}'; + window.gl.mrWidgetData.security_approvals_help_page_path = '#{help_page_path('user/application_security/index.md', anchor: 'security-approvals-in-merge-requests')}'; window.gl.mrWidgetData.eligible_approvers_docs_path = '#{help_page_path('user/project/merge_requests/merge_request_approvals', anchor: 'eligible-approvers')}'; window.gl.mrWidgetData.approvals_help_path = '#{help_page_path("user/project/merge_requests/merge_request_approvals")}'; window.gl.mrWidgetData.pipelines_empty_svg_path = '#{image_path('illustrations/pipelines_empty.svg')}'; diff --git a/app/views/projects/merge_requests/conflicts/show.html.haml b/app/views/projects/merge_requests/conflicts/show.html.haml index 6c23661fb86..28ba2b6ac75 100644 --- a/app/views/projects/merge_requests/conflicts/show.html.haml +++ b/app/views/projects/merge_requests/conflicts/show.html.haml @@ -6,7 +6,7 @@ .merge-request-details.issuable-details = render "projects/merge_requests/mr_box" -= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees += render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, source_branch: @merge_request.source_branch #conflicts{ "v-cloak" => "true", data: { conflicts_path: conflicts_project_merge_request_path(@merge_request.project, @merge_request, format: :json), resolve_conflicts_path: resolve_conflicts_project_merge_request_path(@merge_request.project, @merge_request) } } diff --git a/app/views/projects/merge_requests/creations/_new_compare.html.haml b/app/views/projects/merge_requests/creations/_new_compare.html.haml index 874adb19734..f0a68512326 100644 --- a/app/views/projects/merge_requests/creations/_new_compare.html.haml +++ b/app/views/projects/merge_requests/creations/_new_compare.html.haml @@ -23,7 +23,7 @@ selected: f.object.source_project_id .merge-request-select.dropdown = f.hidden_field :source_branch - = dropdown_toggle f.object.source_branch || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch }, { toggle_class: "js-compare-dropdown js-source-branch monospace" } + = dropdown_toggle f.object.source_branch.presence || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch }, { toggle_class: "js-compare-dropdown js-source-branch monospace" } .dropdown-menu.dropdown-menu-selectable.js-source-branch-dropdown.git-revision-dropdown = dropdown_title(_("Select source branch")) = dropdown_filter(_("Search branches")) @@ -52,7 +52,7 @@ selected: f.object.target_project_id .merge-request-select.dropdown = f.hidden_field :target_branch - = dropdown_toggle f.object.target_branch || _("Select target branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[target_branch]", 'refs-url': refs_project_path(f.object.target_project), selected: f.object.target_branch }, { toggle_class: "js-compare-dropdown js-target-branch monospace" } + = dropdown_toggle f.object.target_branch.presence || _("Select target branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[target_branch]", 'refs-url': refs_project_path(f.object.target_project), selected: f.object.target_branch }, { toggle_class: "js-compare-dropdown js-target-branch monospace" } .dropdown-menu.dropdown-menu-selectable.js-target-branch-dropdown.git-revision-dropdown = dropdown_title(_("Select target branch")) = dropdown_filter(_("Search branches")) diff --git a/app/views/projects/merge_requests/diffs/_different_base.html.haml b/app/views/projects/merge_requests/diffs/_different_base.html.haml index 0e57066f9c9..06a15b96653 100644 --- a/app/views/projects/merge_requests/diffs/_different_base.html.haml +++ b/app/views/projects/merge_requests/diffs/_different_base.html.haml @@ -1,7 +1,7 @@ - if @merge_request_diff && different_base?(@start_version, @merge_request_diff) .mr-version-controls .content-block - = icon('info-circle') + = sprite_icon('information-o') Selected versions have different base commits. Changes will include = link_to project_compare_path(@project, from: @start_version.base_commit_sha, to: @merge_request_diff.base_commit_sha) do diff --git a/app/views/projects/merge_requests/diffs/_not_all_comments_displayed.html.haml b/app/views/projects/merge_requests/diffs/_not_all_comments_displayed.html.haml index 8d7138747fb..b9dc37c9b54 100644 --- a/app/views/projects/merge_requests/diffs/_not_all_comments_displayed.html.haml +++ b/app/views/projects/merge_requests/diffs/_not_all_comments_displayed.html.haml @@ -1,7 +1,7 @@ - if @commit || @start_version || (@merge_request_diff && !@merge_request_diff.latest?) .mr-version-controls .content-block.comments-disabled-notif.clearfix - = icon('info-circle') + = sprite_icon('information-o') = succeed '.' do - if @commit Only comments from the following commit are shown below diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml index 746d613934c..b579f7510f9 100644 --- a/app/views/projects/merge_requests/show.html.haml +++ b/app/views/projects/merge_requests/show.html.haml @@ -1,5 +1,5 @@ - @gfm_form = true -- @content_class = "limit-container-width" unless fluid_layout +- @content_class = "merge-request-container#{' limit-container-width' unless fluid_layout}" - add_to_breadcrumbs _("Merge Requests"), project_merge_requests_path(@project) - breadcrumb_title @merge_request.to_reference - page_title "#{@merge_request.title} (#{@merge_request.to_reference})", _("Merge Requests") @@ -70,10 +70,13 @@ = render 'projects/commit/pipelines_list', disable_initialization: true, endpoint: pipelines_project_merge_request_path(@project, @merge_request) - if mr_action === "diffs" - add_page_startup_api_call @endpoint_metadata_url + - params = request.query_parameters + - if Feature.enabled?(:default_merge_ref_for_diffs, @project) + - params = params.merge(diff_head: true) = render "projects/merge_requests/tabs/pane", name: "diffs", id: "js-diffs-app", class: "diffs", data: { "is-locked": @merge_request.discussion_locked?, - endpoint: diffs_project_merge_request_path(@project, @merge_request, 'json', request.query_parameters), + endpoint: diffs_project_merge_request_path(@project, @merge_request, 'json', params), endpoint_metadata: @endpoint_metadata_url, - endpoint_batch: diffs_batch_project_json_merge_request_path(@project, @merge_request, 'json', request.query_parameters), + endpoint_batch: diffs_batch_project_json_merge_request_path(@project, @merge_request, 'json', params), endpoint_coverage: @coverage_path, help_page_path: suggest_changes_help_path, current_user_data: @current_user_data, @@ -89,7 +92,7 @@ .loading.hide .spinner.spinner-md -= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees += render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, source_branch: @merge_request.source_branch - if @merge_request.can_be_reverted?(current_user) = render "projects/commit/change", type: 'revert', commit: @merge_request.merge_commit, title: @merge_request.title diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml index 2f55cce70dc..d7098bbb69d 100644 --- a/app/views/projects/mirrors/_mirror_repos.html.haml +++ b/app/views/projects/mirrors/_mirror_repos.html.haml @@ -30,7 +30,7 @@ .form-check.gl-mb-3 = check_box_tag :only_protected_branches, '1', false, class: 'js-mirror-protected form-check-input' = label_tag :only_protected_branches, _('Only mirror protected branches'), class: 'form-check-label' - = link_to icon('question-circle'), help_page_path('user/project/protected_branches'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/project/protected_branches'), target: '_blank' .panel-footer.gl-display-flex.gl-justify-content-end = f.submit _('Mirror repository'), class: 'btn btn-success js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror @@ -74,4 +74,4 @@ - if mirror.ssh_key_auth? = clipboard_button(text: mirror.ssh_public_key, class: 'btn btn-default', title: _('Copy SSH public key'), qa_selector: 'copy_public_key_button') = render 'shared/remote_mirror_update_button', remote_mirror: mirror - %button.js-delete-mirror.qa-delete-mirror.rspec-delete-mirror.btn.btn-danger{ type: 'button', data: { mirror_id: mirror.id, toggle: 'tooltip', container: 'body' }, title: _('Remove') }= icon('trash-o') + %button.js-delete-mirror.qa-delete-mirror.rspec-delete-mirror.btn.btn-danger{ type: 'button', data: { mirror_id: mirror.id, toggle: 'tooltip', container: 'body' }, title: _('Remove') }= sprite_icon('remove') diff --git a/app/views/projects/mirrors/_mirror_repos_push.html.haml b/app/views/projects/mirrors/_mirror_repos_push.html.haml index 39ceaedab61..03839146f3b 100644 --- a/app/views/projects/mirrors/_mirror_repos_push.html.haml +++ b/app/views/projects/mirrors/_mirror_repos_push.html.haml @@ -10,4 +10,4 @@ .form-check.gl-mb-3 = check_box_tag :keep_divergent_refs, '1', false, class: 'js-mirror-keep-divergent-refs form-check-input' = label_tag :keep_divergent_refs, _('Keep divergent refs'), class: 'form-check-label' - = link_to icon('question-circle'), help_page_path('user/project/repository/repository_mirroring', anchor: 'keep-divergent-refs-core'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/project/repository/repository_mirroring', anchor: 'keep-divergent-refs'), target: '_blank' diff --git a/app/views/projects/notes/_actions.html.haml b/app/views/projects/notes/_actions.html.haml index 66721a28e62..058366eb75d 100644 --- a/app/views/projects/notes/_actions.html.haml +++ b/app/views/projects/notes/_actions.html.haml @@ -1,9 +1,10 @@ -- access = note_max_access_for_user(note) -- if note.has_special_role?(Note::SpecialRole::FIRST_TIME_CONTRIBUTOR) - %span.note-role.note-role-special.has-tooltip{ title: _("This is the author's first Merge Request to this project.") } - = sprite_icon('first-contribution', css_class: 'gl-icon gl-vertical-align-top') -- if access.nonzero? - %span.note-role.user-access-role= Gitlab::Access.human_access(access) +- access = note_human_max_access(note) +- if note.noteable_author?(@noteable) + %span{ class: 'note-role user-access-role has-tooltip d-none d-md-inline-block', title: _("This user is the author of this %{noteable}.") % { noteable: @noteable.human_class_name } }= _("Author") +- if access + %span{ class: 'note-role user-access-role has-tooltip', title: _("This user is a %{access} of the %{name} project.") % { access: access.downcase, name: note.project_name } }= access +- elsif note.contributor? + %span{ class: 'note-role user-access-role has-tooltip', title: _("This user has previously committed to the %{name} project.") % { name: note.project_name } }= _("Contributor") - if note.resolvable? - can_resolve = can?(current_user, :resolve_note, note) diff --git a/app/views/projects/packages/packages/_legacy_package_list.html.haml b/app/views/projects/packages/packages/_legacy_package_list.html.haml deleted file mode 100644 index 43dbb5c3eee..00000000000 --- a/app/views/projects/packages/packages/_legacy_package_list.html.haml +++ /dev/null @@ -1,60 +0,0 @@ -- sort_value = @sort -- sort_title = packages_sort_option_title(sort_value) - -- if @packages.any? - .d-flex.justify-content-end - .dropdown.inline.gl-mt-3.gl-mb-3.package-sort-dropdown - .btn-group{ role: 'group' } - .btn-group{ role: 'group' } - %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' }, class: 'btn btn-default' } - = sort_title - = icon('chevron-down') - %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort - %li - = sortable_item(sort_title_created_date, package_sort_path(sort: sort_value_recently_created), sort_title) - = sortable_item(sort_title_name, package_sort_path(sort: sort_value_name_desc), sort_title) - = sortable_item(sort_title_version, package_sort_path(sort: sort_value_version_desc), sort_title) - = sortable_item(sort_title_type, package_sort_path(sort: sort_value_type_desc), sort_title) - = packages_sort_direction_button(sort_value) - - .table-holder - .gl-responsive-table-row.table-row-header.bg-secondary-50.px-2.border-top{ role: 'row' } - .table-section.section-30{ role: 'rowheader' } - = _('Name') - .table-section.section-20{ role: 'rowheader' } - = _('Version') - .table-section.section-20{ role: 'rowheader' } - = _('Type') - .table-section.section-20{ role: 'rowheader' } - = _('Created') - .table-section.section-10{ role: 'rowheader' } - - @packages.each do |package| - .gl-responsive-table-row.package-row.px-2{ data: { qa_selector: "package_row" } } - .table-section.section-30 - .table-mobile-header{ role: "rowheader" }= _("Name") - .table-mobile-content.flex-truncate-parent - = link_to package.name, project_package_path(@project, package), class: 'flex-truncate-child', data: { qa_selector: "package_link" } - .table-section.section-20 - .table-mobile-header{ role: "rowheader" }= _("Version") - .table-mobile-content - = package.version - .table-section.section-20 - .table-mobile-header{ role: "rowheader" }= _("Type") - .table-mobile-content - = package.package_type - .table-section.section-20 - .table-mobile-header{ role: "rowheader" }= _("Created") - .table-mobile-content - = time_ago_with_tooltip(package.created_at) - .table-section.section-10 - .table-mobile-header{ role: "rowheader" } - .table-mobile-content - - if can_destroy_package - .float-right - = link_to project_package_path(@project, package), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-remove", title: _('Delete Package') do - = icon('trash') - = paginate @packages, theme: "gitlab" -- else - .row.empty-state - .col-12 - = render 'shared/packages/no_packages' diff --git a/app/views/projects/packages/packages/index.html.haml b/app/views/projects/packages/packages/index.html.haml index c81326f3760..0d5350ab62b 100644 --- a/app/views/projects/packages/packages/index.html.haml +++ b/app/views/projects/packages/packages/index.html.haml @@ -1,4 +1,5 @@ -- page_title _("Packages") +- page_title _("Package Registry") +- @content_class = "limit-container-width" unless fluid_layout .row .col-12 diff --git a/app/views/projects/packages/packages/show.html.haml b/app/views/projects/packages/packages/show.html.haml index a66ae466d9d..97a3c6e7092 100644 --- a/app/views/projects/packages/packages/show.html.haml +++ b/app/views/projects/packages/packages/show.html.haml @@ -1,19 +1,19 @@ -- add_to_breadcrumbs _("Packages"), project_packages_path(@project) +- add_to_breadcrumbs _("Package Registry"), project_packages_path(@project) - add_to_breadcrumbs @package.name, project_packages_path(@project) - breadcrumb_title @package.version -- page_title _("Packages") +- page_title _("Package Registry") +- @content_class = "limit-container-width" unless fluid_layout .row .col-12 #js-vue-packages-detail{ data: { package: package_from_presenter(@package), can_delete: can?(current_user, :destroy_package, @project).to_s, - destroy_path: project_package_path(@project, @package), svg_path: image_path('illustrations/no-packages.svg'), npm_path: package_registry_instance_url(:npm), npm_help_path: help_page_path('user/packages/npm_registry/index'), maven_path: package_registry_project_url(@project.id, :maven), maven_help_path: help_page_path('user/packages/maven_repository/index'), - conan_path: package_registry_instance_url(:conan), + conan_path: package_registry_project_url(@project.id, :conan), conan_help_path: help_page_path('user/packages/conan_repository/index'), nuget_path: nuget_package_registry_url(@project.id), nuget_help_path: help_page_path('user/packages/nuget_repository/index'), @@ -22,4 +22,6 @@ pypi_help_path: help_page_path('user/packages/pypi_repository/index'), composer_path: composer_registry_url(@project&.group&.id), composer_help_path: help_page_path('user/packages/composer_repository/index'), - project_name: @project.name} } + project_name: @project.name, + project_list_url: project_packages_path(@project), + group_list_url: @project.group ? group_packages_path(@project.group) : ''} } diff --git a/app/views/projects/pages/_access.html.haml b/app/views/projects/pages/_access.html.haml index 63dd7ca1def..5b23234791b 100644 --- a/app/views/projects/pages/_access.html.haml +++ b/app/views/projects/pages/_access.html.haml @@ -14,10 +14,10 @@ %p = external_link(domain.url, domain.url) - unless @project.public_pages? - .card-footer.alert-warning + .card-footer.gl-alert-warning - help_page = help_page_path('/user/project/pages/pages_access_control') - - link_start = '<a href="%{url}" target="_blank" class="alert-link" rel="noopener noreferrer">'.html_safe % { url: help_page } + - link_start = '<a href="%{url}" target="_blank" class="gl-alert-link" rel="noopener noreferrer">'.html_safe % { url: help_page } - link_end = '</a>'.html_safe = html_escape_once(s_('GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project\'s %{strong_start}Settings > General > Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information.')).html_safe % { link_start: link_start, link_end: link_end, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe } - .card-footer.alert-primary + .card-footer.gl-alert-info = s_('GitLabPages|It may take up to 30 minutes before the site is available after the first deployment.') diff --git a/app/views/projects/pipelines/_pipeline_warnings.html.haml b/app/views/projects/pipelines/_pipeline_warnings.html.haml deleted file mode 100644 index e27bd440462..00000000000 --- a/app/views/projects/pipelines/_pipeline_warnings.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -- if warnings.any? - - warnings.map(&:content).each do |warning| - .bs-callout.bs-callout-warning - %p - %b= _("Warning:") - = markdown(warning) diff --git a/app/views/projects/pipelines/_with_tabs.html.haml b/app/views/projects/pipelines/_with_tabs.html.haml index 4ae06e1e16f..f1ed67f8f82 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.position-absolute.position-left-0.w-100 + #js-tab-pipeline.tab-pane.gl-absolute.gl-left-0.gl-w-full #js-pipeline-graph-vue #js-tab-builds.tab-pane diff --git a/app/views/projects/pipelines/new.html.haml b/app/views/projects/pipelines/new.html.haml index 726bf9af223..2be75106000 100644 --- a/app/views/projects/pipelines/new.html.haml +++ b/app/views/projects/pipelines/new.html.haml @@ -7,7 +7,7 @@ %hr - if Feature.enabled?(:new_pipeline_form) - #js-new-pipeline{ data: { project_id: @project.id, pipelines_path: project_pipelines_path(@project), 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, settings_link: project_settings_ci_cd_path(@project) } } + #js-new-pipeline{ data: { project_id: @project.id, pipelines_path: project_pipelines_path(@project), 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, settings_link: project_settings_ci_cd_path(@project), max_warnings: ::Gitlab::Ci::Warnings::MAX_LIMIT } } - else = form_for @pipeline, as: :pipeline, url: project_pipelines_path(@project), html: { id: "new-pipeline-form", class: "js-new-pipeline-form js-requires-input" } do |f| @@ -43,5 +43,4 @@ = f.submit s_('Pipeline|Run Pipeline'), class: 'btn btn-success js-variables-save-button', tabindex: 3 = link_to _('Cancel'), project_pipelines_path(@project), class: 'btn btn-default float-right' - -# haml-lint:disable InlineJavaScript %script#availableRefs{ type: "application/json" }= @project.repository.ref_names.to_json.html_safe diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml index e1a606b1765..a9c140aee5f 100644 --- a/app/views/projects/pipelines/show.html.haml +++ b/app/views/projects/pipelines/show.html.haml @@ -19,7 +19,6 @@ - lint_link_start = '<a href="%{url}">'.html_safe % { url: lint_link_url } = s_('You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}').html_safe % { gitlab_ci_yml: '.gitlab-ci.yml', lint_link_start: lint_link_start, lint_link_end: '</a>'.html_safe } - = render "projects/pipelines/pipeline_warnings", warnings: @pipeline.warning_messages = 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) } } diff --git a/app/views/projects/product_analytics/graphs.html.haml b/app/views/projects/product_analytics/graphs.html.haml index 89286061594..c345561e6ce 100644 --- a/app/views/projects/product_analytics/graphs.html.haml +++ b/app/views/projects/product_analytics/graphs.html.haml @@ -5,6 +5,10 @@ %p = _('Showing graphs based on events of the last %{timerange} days.') % { timerange: @timerange } + +.gl-mb-3 + = render 'graph', graph: @activity_graph + - @graphs.each_slice(2) do |pair| .row.append-bottom-10 - pair.each do |graph| diff --git a/app/views/projects/serverless/functions/index.html.haml b/app/views/projects/serverless/functions/index.html.haml index 383c187b398..b17e6df1e8e 100644 --- a/app/views/projects/serverless/functions/index.html.haml +++ b/app/views/projects/serverless/functions/index.html.haml @@ -10,11 +10,10 @@ help_path: help_page_path('user/project/clusters/serverless/index'), empty_image_path: image_path('illustrations/empty-state/empty-serverless-lg.svg') } } -%div{ class: [('limit-container-width' unless fluid_layout)] } - .js-serverless-survey-banner{ data: { user_name: current_user.name, user_email: current_user.email } } +.js-serverless-survey-banner{ data: { user_name: current_user.name, user_email: current_user.email } } - .js-serverless-functions-notice - .flash-container +.js-serverless-functions-notice + .flash-container - .top-area.adjust.d-flex.justify-content-center.gl-border-none - .serverless-functions-table#js-serverless-functions +.top-area.adjust.d-flex.justify-content-center.gl-border-none + .serverless-functions-table#js-serverless-functions diff --git a/app/views/projects/serverless/functions/show.html.haml b/app/views/projects/serverless/functions/show.html.haml index 79bb943d6ed..dd81d957e51 100644 --- a/app/views/projects/serverless/functions/show.html.haml +++ b/app/views/projects/serverless/functions/show.html.haml @@ -11,10 +11,9 @@ clusters_path: clusters_path, help_path: help_path } } -%div{ class: [('limit-container-width' unless fluid_layout)] } - .serverless-function-details#js-serverless-function-details +.serverless-function-details#js-serverless-function-details - .js-serverless-function-notice - .flash-container +.js-serverless-function-notice + .flash-container - .function-holder.js-function-holder.input-group +.function-holder.js-function-holder.input-group diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index 24b47f6e4b6..2b1e08f4880 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -13,13 +13,9 @@ - if @service.respond_to?(:detailed_description) %p= @service.detailed_description .col-lg-8 - = form_for(@service, as: :service, url: scoped_integration_path(@service), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'can-test' => @service.can_test?, 'test-url' => test_project_service_path(@project, @service) } }) do |form| + = form_for(@service, as: :service, url: scoped_integration_path(@service), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'test-url' => test_project_service_path(@project, @service) } }) do |form| = render 'shared/service_settings', form: form, integration: @service - .footer-block.row-content-block{ :class => "#{'gl-display-none' if @service.is_a?(AlertsService)}" } - %input{ id: 'services_redirect_to', type: 'hidden', name: 'redirect_to', value: request.referrer } - = service_save_button(disabled: @service.is_a?(AlertsService)) - - = link_to _('Cancel'), project_settings_integrations_path(@project), class: 'btn btn-cancel' + %input{ id: 'services_redirect_to', type: 'hidden', name: 'redirect_to', value: request.referrer } - if lookup_context.template_exists?('show', "projects/services/#{@service.to_param}", true) %hr diff --git a/app/views/projects/services/prometheus/_custom_metrics.html.haml b/app/views/projects/services/prometheus/_custom_metrics.html.haml index 3642460467b..57100282c34 100644 --- a/app/views/projects/services/prometheus/_custom_metrics.html.haml +++ b/app/views/projects/services/prometheus/_custom_metrics.html.haml @@ -20,7 +20,7 @@ .flash-text .loading-metrics.js-loading-custom-metrics %p.m-3 - = icon('spinner spin', class: 'metrics-load-spinner') + = loading_icon(css_class: 'metrics-load-spinner') = s_('PrometheusService|Finding custom metrics...') .empty-metrics.hidden.js-empty-custom-metrics %p.text-tertiary.m-3.js-no-active-integration-text.hidden diff --git a/app/views/projects/services/prometheus/_metrics.html.haml b/app/views/projects/services/prometheus/_metrics.html.haml index 79f5e846bd7..732a084d476 100644 --- a/app/views/projects/services/prometheus/_metrics.html.haml +++ b/app/views/projects/services/prometheus/_metrics.html.haml @@ -16,7 +16,7 @@ .card-body .loading-metrics.js-loading-metrics %p.m-3 - = icon('spinner spin', class: 'metrics-load-spinner') + = loading_icon(css_class: 'metrics-load-spinner') = s_('PrometheusService|Finding and configuring metrics...') .empty-metrics.hidden.js-empty-metrics %p.text-tertiary.m-3 diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml index b4c9e51f53a..453deff7756 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -40,18 +40,18 @@ = form.radio_button :deploy_strategy, 'continuous', class: 'form-check-input' = form.label :deploy_strategy_continuous, class: 'form-check-label' do = s_('CICD|Continuous deployment to production') - = link_to icon('question-circle'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-deploy'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-deploy'), target: '_blank' .form-check = form.radio_button :deploy_strategy, 'timed_incremental', class: 'form-check-input' = form.label :deploy_strategy_timed_incremental, class: 'form-check-label' do = s_('CICD|Continuous deployment to production using timed incremental rollout') - = link_to icon('question-circle'), help_page_path('topics/autodevops/customize.md', anchor: 'timed-incremental-rollout-to-production-premium'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/customize.md', anchor: 'timed-incremental-rollout-to-production'), target: '_blank' .form-check = form.radio_button :deploy_strategy, 'manual', class: 'form-check-input' = form.label :deploy_strategy_manual, class: 'form-check-label' do = s_('CICD|Automatic deployment to staging, manual deployment to production') - = link_to icon('question-circle'), help_page_path('topics/autodevops/customize.md', anchor: 'incremental-rollout-to-production-premium'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/customize.md', anchor: 'incremental-rollout-to-production'), target: '_blank' = f.submit _('Save changes'), class: "btn btn-success gl-mt-5", data: { qa_selector: 'save_changes_button' } diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml index a0dd06e3304..414a5f264bd 100644 --- a/app/views/projects/settings/ci_cd/_form.html.haml +++ b/app/views/projects/settings/ci_cd/_form.html.haml @@ -8,7 +8,7 @@ = _("Git strategy for pipelines") %p = html_escape(_("Choose between %{code_open}clone%{code_close} or %{code_open}fetch%{code_close} to get the recent application code")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'git-strategy'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'git-strategy'), target: '_blank' .form-check = f.radio_button :build_allow_git_fetch, 'false', { class: 'form-check-input' } = f.label :build_allow_git_fetch_false, class: 'form-check-label' do @@ -38,7 +38,7 @@ = f.text_field :build_timeout_human_readable, class: 'form-control' %p.form-text.text-muted = _('If any job surpasses this timeout threshold, it will be marked as failed. Human readable time input language is accepted like "1 hour". Values without specification represent seconds.') - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'timeout'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'timeout'), target: '_blank' - if can?(current_user, :update_max_artifacts_size, @project) %hr @@ -47,7 +47,7 @@ = f.number_field :max_artifacts_size, class: 'form-control' %p.form-text.text-muted = _("Set the maximum file size for each job's artifacts") - = link_to icon('question-circle'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size-core-only'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank' %hr .form-group @@ -55,7 +55,7 @@ = f.text_field :ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml' %p.form-text.text-muted = html_escape(_("The path to the CI configuration file. Defaults to %{code_open}.gitlab-ci.yml%{code_close}")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'custom-ci-configuration-path'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'custom-ci-configuration-path'), target: '_blank' %hr .form-group @@ -65,7 +65,7 @@ %strong= _("Public pipelines") .form-text.text-muted = _("Allow public access to pipelines and job details, including output logs and artifacts") - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'visibility-of-pipelines'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'visibility-of-pipelines'), target: '_blank' .bs-callout.bs-callout-info %p #{_("If enabled")}: %ul @@ -86,7 +86,7 @@ %strong= _("Auto-cancel redundant, pending pipelines") .form-text.text-muted = _("New pipelines will cancel older, pending pipelines on the same branch") - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-pending-pipelines'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-pending-pipelines'), target: '_blank' .form-group .form-check @@ -95,7 +95,7 @@ %strong= _("Skip outdated deployment jobs") .form-text.text-muted = _("When a deployment job is successful, skip older deployment jobs that are still pending") - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank' %hr .form-group @@ -108,7 +108,7 @@ .input-group-text / %p.form-text.text-muted = _("A regular expression that will be used to find the test coverage output in the job log. Leave blank to disable") - = link_to icon('question-circle'), help_page_path('ci/pipelines/settings', anchor: 'test-coverage-parsing'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'test-coverage-parsing'), target: '_blank' .bs-callout.bs-callout-info %p= _("Below are examples of regex for existing tools:") %ul diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 4a521f2f46e..67bdcd0d9d6 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -7,22 +7,21 @@ = render partial: 'flash_messages', locals: { project: @project } -%div{ class: [("limit-container-width" unless fluid_layout)] } - = render "projects/last_push" += render "projects/last_push" - = render "home_panel" += render "home_panel" - - if can?(current_user, :download_code, @project) && @project.repository_languages.present? - = repository_languages_bar(@project.repository_languages) +- if can?(current_user, :download_code, @project) && @project.repository_languages.present? + = repository_languages_bar(@project.repository_languages) - = render "archived_notice", project: @project - = render_if_exists "projects/marked_for_deletion_notice", project: @project - = render_if_exists "projects/ancestor_group_marked_for_deletion_notice", project: @project += render "archived_notice", project: @project += render_if_exists "projects/marked_for_deletion_notice", project: @project += render_if_exists "projects/ancestor_group_marked_for_deletion_notice", project: @project - - view_path = @project.default_view +- view_path = @project.default_view - - if show_auto_devops_callout?(@project) - = render 'shared/auto_devops_callout' +- if show_auto_devops_callout?(@project) + = render 'shared/auto_devops_callout' - %div{ class: project_child_container_class(view_path) } - = render view_path, is_project_overview: true +%div{ class: project_child_container_class(view_path) } + = render view_path, is_project_overview: true diff --git a/app/views/projects/static_site_editor/show.html.haml b/app/views/projects/static_site_editor/show.html.haml index 2d817912335..cbe27cefba3 100644 --- a/app/views/projects/static_site_editor/show.html.haml +++ b/app/views/projects/static_site_editor/show.html.haml @@ -1 +1 @@ -#static-site-editor{ data: @config.payload.merge({ merge_requests_illustration_path: image_path('illustrations/merge_requests.svg') }) } +#static-site-editor{ data: @data } diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index c8a6168edfc..dba9b20fcff 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -2,8 +2,8 @@ - release = @releases.find { |release| release.tag == tag.name } %li.flex-row.allow-wrap .row-main-content - = icon('tag') - = link_to tag.name, project_tag_path(@project, tag.name), class: 'item-title ref-name gl-ml-2' + = sprite_icon('tag') + = link_to tag.name, project_tag_path(@project, tag.name), class: 'item-title ref-name' - if protected_tag?(@project, tag) %span.badge.badge-success.gl-ml-2 @@ -39,4 +39,4 @@ = link_to edit_project_tag_release_path(@project, tag.name), class: 'btn btn-edit has-tooltip', title: s_('TagsPage|Edit release notes'), data: { container: "body" } do = sprite_icon("pencil") = link_to project_tag_path(@project, tag.name), class: "btn btn-remove remove-row has-tooltip gl-ml-3 #{protected_tag?(@project, tag) ? 'disabled' : ''}", title: s_('TagsPage|Delete tag'), method: :delete, data: { confirm: s_('TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?') % { tag_name: tag.name }, container: 'body' }, remote: true do - = icon("trash-o") + = sprite_icon("remove") diff --git a/app/views/projects/tags/destroy.js.haml b/app/views/projects/tags/destroy.js.haml index cde23e03d54..59d359bbf10 100644 --- a/app/views/projects/tags/destroy.js.haml +++ b/app/views/projects/tags/destroy.js.haml @@ -1,4 +1,4 @@ - if @error.present? - new Flash('#{escape_javascript(@error)}', 'alert'); + new Flash({ message: '#{escape_javascript(@error)}', type: 'alert' }); - elsif @repository.tags.empty? $('.tags').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index c32318df7cc..fe42394d919 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -2,8 +2,10 @@ - default_ref = params[:ref] || @project.default_branch - if @error - .alert.alert-danger - %button.close{ type: "button", "data-dismiss" => "alert" } × + .gl-alert.gl-alert-danger + = sprite_icon('error', 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') = @error %h3.page-title @@ -52,5 +54,4 @@ .form-actions = button_tag s_('TagsPage|Create tag'), class: 'btn btn-success', data: { qa_selector: "create_tag_button" } = link_to s_('TagsPage|Cancel'), project_tags_path(@project), class: 'btn btn-cancel' --# haml-lint:disable InlineJavaScript %script#availableRefs{ type: "application/json" }= @project.repository.ref_names.to_json.html_safe diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml index ff973e2922f..25a560da5c6 100644 --- a/app/views/projects/tags/show.html.haml +++ b/app/views/projects/tags/show.html.haml @@ -10,7 +10,7 @@ .nav-text .title %span.item-title.ref-name{ data: { qa_selector: 'tag_name_content' } } - = icon('tag') + = sprite_icon('tag') = @tag.name - if protected_tag?(@project, @tag) %span.badge.badge-success diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml index eab6d750a02..268858f8ff8 100644 --- a/app/views/projects/tree/_tree_header.html.haml +++ b/app/views/projects/tree/_tree_header.html.haml @@ -1,5 +1,6 @@ - can_collaborate = can_collaborate_with_project?(@project) - can_create_mr_from_fork = can?(current_user, :fork_project, @project) && can?(current_user, :create_merge_request_in, @project) +- can_visit_ide = can_collaborate || current_user&.already_forked?(@project) .tree-ref-container .tree-ref-holder @@ -14,12 +15,12 @@ = render 'projects/find_file_link' - - if can_collaborate || current_user&.already_forked?(@project) - #js-tree-web-ide-link.d-inline-block - - elsif can_create_mr_from_fork - = link_to '#modal-confirm-fork', class: 'btn btn-default qa-web-ide-button', data: { target: '#modal-confirm-fork', toggle: 'modal'} do - = _('Web IDE') - = render 'shared/confirm_fork_modal', fork_path: ide_fork_and_edit_path(@project, @ref, @path) + - if can_visit_ide || can_create_mr_from_fork + #js-tree-web-ide-link.d-inline-block{ data: { options: vue_ide_link_data(@project, @ref).to_json } } + - if !can_visit_ide + = render 'shared/confirm_fork_modal', fork_path: ide_fork_and_edit_path(@project, @ref, @path) + - unless current_user&.gitpod_enabled + = render 'shared/gitpod/enable_gitpod_modal' - if show_xcode_link?(@project) .project-action-button.project-xcode.inline< diff --git a/app/views/projects/tree/_tree_row.html.haml b/app/views/projects/tree/_tree_row.html.haml index 300cd5423bf..04496914c02 100644 --- a/app/views/projects/tree/_tree_row.html.haml +++ b/app/views/projects/tree/_tree_row.html.haml @@ -23,5 +23,5 @@ %td.d-none.d-sm-table-cell.tree-commit %td.tree-time-ago.text-right %span.log_loading.hide - %i.fa.fa-spinner.fa-spin + = loading_icon Loading commit data... diff --git a/app/views/projects/triggers/_trigger.html.haml b/app/views/projects/triggers/_trigger.html.haml index 3036e918160..579b8ba2766 100644 --- a/app/views/projects/triggers/_trigger.html.haml +++ b/app/views/projects/triggers/_trigger.html.haml @@ -34,4 +34,4 @@ = sprite_icon('pencil') - if can?(current_user, :manage_trigger, trigger) = link_to project_trigger_path(@project, trigger), data: { confirm: revoke_trigger_confirmation }, method: :delete, title: "Revoke", class: "btn btn-default btn-warning btn-sm btn-trigger-revoke" do - %i.fa.fa-trash + = sprite_icon('remove') diff --git a/app/views/registrations/welcome.html.haml b/app/views/registrations/welcome.html.haml index ef3e0b1b4c0..5ad0fbf8fbc 100644 --- a/app/views/registrations/welcome.html.haml +++ b/app/views/registrations/welcome.html.haml @@ -1,22 +1,25 @@ -- content_for(:page_title, _('Welcome to GitLab %{name}!') % { name: current_user.name }) -.text-center.mb-3 - = html_escape(_('In order to tailor your experience with GitLab we%{br_tag}would like to know a bit more about you.')) % { br_tag: '<br/>'.html_safe } -.signup-box.p-3.mb-2 - .signup-body - = form_for(current_user, url: users_sign_up_update_registration_path, html: { class: 'new_new_user gl-show-field-errors', 'aria-live' => 'assertive' }) do |f| - .devise-errors.mt-0 - = render 'devise/shared/error_messages', resource: current_user - .form-group - = f.label :role, _('Role'), class: 'label-bold' - = f.select :role, ::User.roles.keys.map { |role| [role.titleize, role] }, {}, class: 'form-control' - .form-group - = f.label :setup_for_company, _('Are you setting up GitLab for a company?'), class: 'label-bold' - .d-flex.justify-content-center - .w-25 - = f.radio_button :setup_for_company, true - = f.label :setup_for_company, _('Yes'), value: 'true' - .w-25 - = f.radio_button :setup_for_company, false - = f.label :setup_for_company, _('No'), value: 'false' - .submit-container.mt-3 - = f.submit _('Get started!'), class: 'btn-register btn btn-block mb-0 p-2' +- page_title _('Your profile') + +.row.gl-flex-grow-1.gl-bg-gray-10 + .d-flex.gl-flex-direction-column.gl-align-items-center.gl-w-full.gl-p-5 + .edit-profile.login-page.d-flex.flex-column.gl-align-items-center.pt-lg-3 + = render_if_exists "registrations/welcome/progress_bar" + %h2.gl-text-center= html_escape(_('Welcome to GitLab%{br_tag}%{name}!')) % { name: html_escape(current_user.first_name), br_tag: '<br/>'.html_safe } + %p + .gl-text-center= html_escape(_('In order to personalize your experience with GitLab%{br_tag}we would like to know a bit more about you.')) % { br_tag: '<br/>'.html_safe } + + = form_for(current_user, url: users_sign_up_update_registration_path, html: { class: 'card gl-w-full! gl-p-5', 'aria-live' => 'assertive' }) do |f| + .devise-errors + = render 'devise/shared/error_messages', resource: current_user + .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.') + = 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 btn btn-block gl-mb-0 gl-p-3', data: { qa_selector: 'get_started_button' } diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 79f01c61833..e0dbb5135e9 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -22,6 +22,8 @@ = _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group } = render_if_exists 'shared/promotions/promote_advanced_search' + #js-search-filter-by-state{ 'v-cloak': true, data: { scope: @scope, state: params[:state] } } + .results.gl-mt-3 - if @scope == 'commits' %ul.content-list.commit-list diff --git a/app/views/search/results/_blob_data.html.haml b/app/views/search/results/_blob_data.html.haml index 218de30d707..27d4dbe1085 100644 --- a/app/views/search/results/_blob_data.html.haml +++ b/app/views/search/results/_blob_data.html.haml @@ -1,7 +1,7 @@ .blob-result{ data: { qa_selector: 'result_item_content' } } .file-holder .js-file-title.file-title{ data: { qa_selector: 'file_title_content' } } - = link_to blob_link do + = link_to blob_link, data: {track_event: 'click_text', track_label: 'blob_path', track_property: 'search_result'} do %i.fa.fa-file %strong = search_blob_title(project, path) diff --git a/app/views/search/results/_commit.html.haml b/app/views/search/results/_commit.html.haml index ed5a3badf11..3e5ea785aae 100644 --- a/app/views/search/results/_commit.html.haml +++ b/app/views/search/results/_commit.html.haml @@ -1 +1 @@ -= render 'projects/commits/commit', project: commit.project, commit: commit, ref: nil, show_project_name: @project.nil? += render 'projects/commits/commit', project: commit.project, commit: commit, ref: nil, show_project_name: @project.nil?, link_data_attrs: {track_event: 'click_text', track_label: 'commit_title', track_property: 'search_result'} diff --git a/app/views/search/results/_issue.html.haml b/app/views/search/results/_issue.html.haml index 2f6024c3f2b..e0336d98f04 100644 --- a/app/views/search/results/_issue.html.haml +++ b/app/views/search/results/_issue.html.haml @@ -1,13 +1,14 @@ -.search-result-row - %h4 - = confidential_icon(issue) - = link_to project_issue_path(issue.project, issue) do - %span.term.str-truncated= issue.title +%div{ class: 'search-result-row gl-pb-3! gl-mt-5 gl-mb-0!' } + %span.gl-display-flex.gl-align-items-center - if issue.closed? - %span.badge.badge-danger.gl-ml-2= _("Closed") - .float-right ##{issue.iid} + %span.badge.badge-info.badge-pill.gl-badge.sm= _("Closed") + - else + %span.badge.badge-success.badge-pill.gl-badge.sm= _("Open") + = sprite_icon('eye-slash', css_class: 'gl-text-gray-500 gl-ml-2') if issue.confidential? + = link_to project_issue_path(issue.project, issue), data: { track_event: 'click_text', track_label: 'issue_title', track_property: 'search_result' }, class: 'gl-w-full' do + %span.term.str-truncated.gl-font-weight-bold.gl-ml-2= issue.title + .gl-text-gray-500.gl-my-3 + = sprintf(s_(' %{project_name}#%{issue_iid} · opened %{issue_created} by %{author}'), { project_name: issue.project.full_name, issue_iid: issue.iid, issue_created: time_ago_with_tooltip(issue.created_at, placement: 'bottom'), author: link_to_member(@project, issue.author, avatar: false) }).html_safe - if issue.description.present? - .description.term - = search_md_sanitize(issue, :description) - %span.light - #{issue.project.full_name} + .description.term.col-sm-10.gl-px-0 + = truncate(issue.description, length: 200) diff --git a/app/views/search/results/_merge_request.html.haml b/app/views/search/results/_merge_request.html.haml index 680c2ea0208..3135ab9a17e 100644 --- a/app/views/search/results/_merge_request.html.haml +++ b/app/views/search/results/_merge_request.html.haml @@ -1,6 +1,6 @@ .search-result-row %h4 - = link_to project_merge_request_path(merge_request.target_project, merge_request) do + = link_to project_merge_request_path(merge_request.target_project, merge_request), data: {track_event: 'click_text', track_label: 'merge_request_title', track_property: 'search_result'} do %span.term.str-truncated= merge_request.title - if merge_request.merged? %span.badge.badge-primary.gl-ml-2= _("Merged") @@ -9,6 +9,6 @@ .float-right= merge_request.to_reference - if merge_request.description.present? .description.term - = search_md_sanitize(merge_request, :description) + = search_md_sanitize(merge_request.description) %span.light #{merge_request.project.full_name} diff --git a/app/views/search/results/_milestone.html.haml b/app/views/search/results/_milestone.html.haml index 53c2d380bc5..6d4ce88a377 100644 --- a/app/views/search/results/_milestone.html.haml +++ b/app/views/search/results/_milestone.html.haml @@ -1,8 +1,8 @@ .search-result-row %h4 - = link_to project_milestone_path(milestone.project, milestone) do + = link_to project_milestone_path(milestone.project, milestone), data: {track_event: 'click_text', track_label: 'milestone_title', track_property: 'search_result'} do %span.term.str-truncated= milestone.title - if milestone.description.present? .description.term - = search_md_sanitize(milestone, :description) + = search_md_sanitize(milestone.description) diff --git a/app/views/search/results/_note.html.haml b/app/views/search/results/_note.html.haml index a83b003a516..d88b7b32ed6 100644 --- a/app/views/search/results/_note.html.haml +++ b/app/views/search/results/_note.html.haml @@ -18,8 +18,13 @@ - else %span #{note.noteable_type.titleize} ##{noteable_identifier} · - = link_to note.noteable.title, note_url + = link_to note.noteable.title, note_url, data: {track_event: 'click_text', track_label: 'noteable_title', track_property: 'search_result'} + + %span.note-headline-light.note-headline-meta + %span.system-note-separator + · + %span.system-note-separator= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago') .note-search-result .term - = search_md_sanitize(note, :note) + = search_md_sanitize(note.note) diff --git a/app/views/shared/_auto_devops_callout.html.haml b/app/views/shared/_auto_devops_callout.html.haml index bf1683be32d..443d801d672 100644 --- a/app/views/shared/_auto_devops_callout.html.haml +++ b/app/views/shared/_auto_devops_callout.html.haml @@ -12,4 +12,4 @@ %button.gl-banner-close.close.js-close-callout{ type: 'button', 'aria-label' => s_('AutoDevOps|Dismiss Auto DevOps box') } - = icon('times', class: 'dismiss-icon', 'aria-hidden' => 'true') + = sprite_icon('close', size: 16, css_class: 'dismiss-icon') diff --git a/app/views/shared/_broadcast_message.html.haml b/app/views/shared/_broadcast_message.html.haml index e313946a968..7be11b0fb81 100644 --- a/app/views/shared/_broadcast_message.html.haml +++ b/app/views/shared/_broadcast_message.html.haml @@ -2,11 +2,11 @@ %div{ class: "broadcast-message #{'alert-warning' if is_banner} broadcast-#{message.broadcast_type}-message #{opts[:preview] && 'preview'} js-broadcast-notification-#{message.id} gl-display-flex", style: broadcast_message_style(message), dir: 'auto' } - .flex-grow-1.text-right.pr-2 + .gl-flex-grow-1.gl-text-right.gl-pr-3 = sprite_icon('bullhorn', css_class: 'vertical-align-text-top') %div{ class: !fluid_layout && 'container-limited' } = render_broadcast_message(message) - .flex-grow-1.text-right{ style: 'flex-basis: 0' } + .gl-flex-grow-1.gl-flex-basis-0.gl-text-right - if (message.notification? || message.dismissable?) && opts[:preview].blank? - %button.broadcast-message-dismiss.js-dismiss-current-broadcast-notification.btn.btn-link.pl-2.pr-2{ 'aria-label' => _('Close'), :type => 'button', data: { id: message.id, expire_date: message.ends_at.iso8601 } } - %i.fa.fa-times + %button.broadcast-message-dismiss.js-dismiss-current-broadcast-notification.btn.btn-link.gl-button{ 'aria-label' => _('Close'), :type => 'button', data: { id: message.id, expire_date: message.ends_at.iso8601 } } + = sprite_icon('close', size: 16, css_class: 'gl-icon gl-text-white gl-mx-3!') diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml index a99c992af49..7d328728332 100644 --- a/app/views/shared/_file_highlight.html.haml +++ b/app/views/shared/_file_highlight.html.haml @@ -1,4 +1,4 @@ -.file-content.code.js-syntax-highlight +#blob-content.file-content.code.js-syntax-highlight .line-numbers - if blob.data.present? - link_icon = sprite_icon('link', size: 12) diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml index d497937833a..ca603eed703 100644 --- a/app/views/shared/_group_form.html.haml +++ b/app/views/shared/_group_form.html.haml @@ -34,10 +34,12 @@ %p.validation-pending.gl-field-error-ignore.field-validation.hide= _('Checking group URL availability...') - if @group.persisted? - .alert.alert-warning.gl-mt-3 - = _('Changing group URL can have unintended side effects.') - = succeed '.' do - = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'changing-a-groups-path'), target: '_blank' + .gl-alert.gl-alert-warning.gl-mt-3.gl-mb-3 + = sprite_icon('warning', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title') + .gl-alert-body + = _('Changing group URL can have unintended side effects.') + = succeed '.' do + = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'changing-a-groups-path'), target: '_blank', class: 'gl-link' - if @group.persisted? .row diff --git a/app/views/shared/_help_dropdown_forum_link.html.haml b/app/views/shared/_help_dropdown_forum_link.html.haml new file mode 100644 index 00000000000..351c875475a --- /dev/null +++ b/app/views/shared/_help_dropdown_forum_link.html.haml @@ -0,0 +1,2 @@ += link_to _("Community forum"), "https://forum.gitlab.com/", target: '_blank', class: 'text-nowrap', + rel: 'noopener noreferrer', data: { 'track_event': 'click_forum', 'track_property': 'question_menu' } diff --git a/app/views/shared/_no_password.html.haml b/app/views/shared/_no_password.html.haml index 9b1a467df6b..76ae63ca5e8 100644 --- a/app/views/shared/_no_password.html.haml +++ b/app/views/shared/_no_password.html.haml @@ -1,9 +1,12 @@ - if show_no_password_message? - .no-password-message.alert.alert-warning - - 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.html_safe - .alert-link-group - = link_to _("Don't show again"), profile_path(user: {hide_no_password: true}), method: :put - | - = link_to _('Remind later'), '#', class: 'hide-no-password-message' + .no-password-message.gl-alert.gl-alert-warning + = sprite_icon('warning', size: 16, 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', 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.html_safe + .gl-alert-actions + = link_to _('Remind later'), '#', class: 'hide-no-password-message btn gl-alert-action btn-info btn-md gl-button' + = link_to _("Don't show again"), profile_path(user: {hide_no_password: true}), method: :put, role: 'button', class: 'btn gl-alert-action btn-md btn-default gl-button btn-default-secondary' diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml index abf39fdc644..a083a772233 100644 --- a/app/views/shared/_no_ssh.html.haml +++ b/app/views/shared/_no_ssh.html.haml @@ -7,4 +7,4 @@ = 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 .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 btn-secondary 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/_old_visibility_level.html.haml b/app/views/shared/_old_visibility_level.html.haml index e8f3d888cce..8a9cc7ab8a2 100644 --- a/app/views/shared/_old_visibility_level.html.haml +++ b/app/views/shared/_old_visibility_level.html.haml @@ -1,6 +1,6 @@ .form-group.row .col-sm-2.col-form-label = _('Visibility level') - = link_to icon('question-circle'), help_page_path("public_access/public_access"), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('public_access/public_access'), target: '_blank' .col-sm-10 = render 'shared/visibility_level', f: f, visibility_level: visibility_level, can_change_visibility_level: can_change_visibility_level, form_model: form_model, with_label: with_label diff --git a/app/views/shared/_outdated_browser.html.haml b/app/views/shared/_outdated_browser.html.haml index 624cc99440c..f5a32050a79 100644 --- a/app/views/shared/_outdated_browser.html.haml +++ b/app/views/shared/_outdated_browser.html.haml @@ -2,14 +2,7 @@ .gl-alert.gl-alert-danger.outdated-browser{ :role => "alert" } = sprite_icon('error', css_class: "gl-alert-icon gl-alert-icon-no-title gl-icon") .gl-alert-body - - if browser.ie? && browser.version.to_i == 11 - - feedback_link_url = 'https://gitlab.com/gitlab-org/gitlab/issues/197987' - - feedback_link_start = '<a href="%{url}" class="gl-link" target="_blank" rel="noopener noreferrer">'.html_safe % { url: feedback_link_url } - = s_('OutdatedBrowser|From May 2020 GitLab no longer supports Internet Explorer 11.') - %br - = s_('OutdatedBrowser|You can provide feedback %{feedback_link_start}on this issue%{feedback_link_end} or via your usual support channels.').html_safe % { feedback_link_start: feedback_link_start, feedback_link_end: '</a>'.html_safe } - - else - = s_('OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser.') + = s_('OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser.') %br - browser_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('install/requirements', anchor: 'supported-web-browsers') } = s_('OutdatedBrowser|Please install a %{browser_link_start}supported web browser%{browser_link_end} for a better experience.').html_safe % { browser_link_start: browser_link_start, browser_link_end: '</a>'.html_safe } diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml index 88f213612fc..3d5229f87b5 100644 --- a/app/views/shared/_project_limit.html.haml +++ b/app/views/shared/_project_limit.html.haml @@ -1,5 +1,5 @@ - if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0 - .project-limit-message.alert.alert-warning.d-none.d-sm-block + .project-limit-message.gl-alert.gl-alert-warning.gl-display-none.gl-display-sm-block = _("You won't be able to create new projects because you have reached your project limit.") .float-right diff --git a/app/views/shared/_service_settings.html.haml b/app/views/shared/_service_settings.html.haml index 2425bcf61d9..647421a8fbe 100644 --- a/app/views/shared/_service_settings.html.haml +++ b/app/views/shared/_service_settings.html.haml @@ -8,6 +8,6 @@ = markdown integration.help .service-settings - - if @admin_integration - .js-vue-admin-integration-settings{ data: integration_form_data(@admin_integration) } + - if @default_integration + .js-vue-default-integration-settings{ data: integration_form_data(@default_integration) } .js-vue-integration-settings{ data: integration_form_data(integration) } diff --git a/app/views/shared/_zen.html.haml b/app/views/shared/_zen.html.haml index 66e0ecadb65..9cf189e8120 100644 --- a/app/views/shared/_zen.html.haml +++ b/app/views/shared/_zen.html.haml @@ -16,4 +16,4 @@ - else = text_area_tag attr, current_text, data: { qa_selector: qa_selector }, class: classes, placeholder: placeholder %a.zen-control.zen-control-leave.js-zen-leave.gl-text-gray-500{ href: "#" } - = sprite_icon('compress') + = sprite_icon('minimize') diff --git a/app/views/shared/access_tokens/_table.html.haml b/app/views/shared/access_tokens/_table.html.haml index ceac4d1820d..255ec9995db 100644 --- a/app/views/shared/access_tokens/_table.html.haml +++ b/app/views/shared/access_tokens/_table.html.haml @@ -18,7 +18,7 @@ %th= s_('AccessTokens|Created') %th = _('Last Used') - = link_to icon('question-circle'), help_page_path('user/profile/personal_access_tokens.md', anchor: 'token-activity'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/profile/personal_access_tokens.md', anchor: 'token-activity'), target: '_blank' %th= _('Expires') %th= _('Scopes') %th @@ -35,7 +35,7 @@ %td - if token.expires? - if token.expires_at.past? || token.expires_at.today? - %span{ class: 'text-danger has-tooltip', title: _('Expiration not enforced') } + %span{ class: 'text-danger has-tooltip', title: _('Token valid until revoked') } = _('Expired') - else %span{ class: ('text-warning' if token.expires_soon?) } diff --git a/app/views/shared/blob/_markdown_buttons.html.haml b/app/views/shared/blob/_markdown_buttons.html.haml index c1ffdc7184a..085206714c6 100644 --- a/app/views/shared/blob/_markdown_buttons.html.haml +++ b/app/views/shared/blob/_markdown_buttons.html.haml @@ -1,13 +1,25 @@ +- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+'); + .md-header-toolbar.active - = markdown_toolbar_button({ icon: "bold", data: { "md-tag" => "**" }, title: _("Add bold text") }) - = markdown_toolbar_button({ icon: "italic", data: { "md-tag" => "*" }, title: _("Add italic text") }) + = markdown_toolbar_button({ icon: "bold", + data: { "md-tag" => "**", "md-shortcuts": '["mod+b"]' }, + title: sprintf(s_("MarkdownEditor|Add bold text (%{modifier_key}B)") % { modifier_key: modifier_key }) }) + + = markdown_toolbar_button({ icon: "italic", + data: { "md-tag" => "_", "md-shortcuts": '["mod+i"]' }, + title: sprintf(s_("MarkdownEditor|Add italic text (%{modifier_key}I)") % { modifier_key: modifier_key }) }) + = markdown_toolbar_button({ icon: "quote", data: { "md-tag" => "> ", "md-prepend" => true }, title: _("Insert a quote") }) = markdown_toolbar_button({ icon: "code", data: { "md-tag" => "`", "md-block" => "```" }, title: _("Insert code") }) - = markdown_toolbar_button({ icon: "link", data: { "md-tag" => "[{text}](url)", "md-select" => "url" }, title: _("Add a link") }) + + = markdown_toolbar_button({ icon: "link", + data: { "md-tag" => "[{text}](url)", "md-select" => "url", "md-shortcuts": '["mod+k"]' }, + title: sprintf(s_("MarkdownEditor|Add a link (%{modifier_key}K)") % { modifier_key: modifier_key }) }) + = markdown_toolbar_button({ icon: "list-bulleted", data: { "md-tag" => "- ", "md-prepend" => true }, title: _("Add a bullet list") }) = markdown_toolbar_button({ icon: "list-numbered", data: { "md-tag" => "1. ", "md-prepend" => true }, title: _("Add a numbered list") }) = markdown_toolbar_button({ icon: "list-task", data: { "md-tag" => "- [ ] ", "md-prepend" => true }, title: _("Add a task list") }) = markdown_toolbar_button({ icon: "table", data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| cell | cell |\n| cell | cell |", "md-prepend" => true }, title: _("Add a table") }) - if show_fullscreen_button %button.toolbar-btn.toolbar-fullscreen-btn.js-zen-enter.has-tooltip{ type: "button", tabindex: -1, "aria-label": "Go full screen", title: _("Go full screen"), data: { container: "body" } } - = sprite_icon("screen-full") + = sprite_icon("maximize") diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml index 7a4c495e177..e5808bfe878 100644 --- a/app/views/shared/boards/_show.html.haml +++ b/app/views/shared/boards/_show.html.haml @@ -2,7 +2,6 @@ - group = local_assigns.fetch(:group, false) -# TODO: Move group_id and can_admin_list to the board store See: https://gitlab.com/gitlab-org/gitlab/-/issues/213082 -- group_id = @group&.id || "null" - can_admin_list = can?(current_user, :admin_list, current_board_parent) == true - @no_breadcrumb_container = true - @no_container = true @@ -12,23 +11,18 @@ - content_for :page_specific_javascripts do - -# haml-lint:disable InlineJavaScript %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" #board-app.boards-app.position-relative{ "v-cloak" => "true", data: board_data, ":class" => "{ 'is-compact': detailIssueVisible }" } = render 'shared/issuable/search_bar', type: :boards, board: board - - if Feature.enabled?(:boards_with_swimlanes, current_board_parent) + - if Feature.enabled?(:boards_with_swimlanes, current_board_parent) || 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, - ":group-id" => group_id, - ":disabled" => "disabled", - ":issue-link-base" => "issueLinkBase", - ":root-path" => "rootPath", - ":board-id" => "boardId" } + ":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" } @@ -37,12 +31,8 @@ "v-for" => "list in state.lists", "ref" => "board", ":can-admin-list" => can_admin_list, - ":group-id" => group_id, ":list" => "list", ":disabled" => "disabled", - ":issue-link-base" => "issueLinkBase", - ":root-path" => "rootPath", - ":board-id" => "boardId", ":key" => "list.id" } = render "shared/boards/components/sidebar", group: group = render_if_exists 'shared/boards/components/board_settings_sidebar' @@ -51,6 +41,4 @@ "milestone-path" => milestones_filter_dropdown_path, "label-path" => labels_filter_path_with_defaults, "empty-state-svg" => image_path('illustrations/issues.svg'), - ":issue-link-base" => "issueLinkBase", - ":root-path" => "rootPath", ":project-id" => @project.id } diff --git a/app/views/shared/boards/_switcher.html.haml b/app/views/shared/boards/_switcher.html.haml index 09a365a290a..58e877f20fe 100644 --- a/app/views/shared/boards/_switcher.html.haml +++ b/app/views/shared/boards/_switcher.html.haml @@ -10,6 +10,7 @@ can_admin_board: can?(current_user, :admin_board, parent).to_s, multiple_issue_boards_available: parent.multiple_issue_boards_available?.to_s, labels_path: labels_filter_path_with_defaults(only_group_labels: true, include_descendant_groups: true), + labels_web_url: parent.is_a?(Project) ? project_labels_path(@project) : group_labels_path(@group), project_id: @project&.id, group_id: @group&.id, scoped_issue_board_feature_enabled: Gitlab.ee? && parent.feature_available?(:scoped_issue_board) ? 'true' : 'false', diff --git a/app/views/shared/boards/components/sidebar/_milestone.html.haml b/app/views/shared/boards/components/sidebar/_milestone.html.haml index 510e05ce888..2c894e9b1b3 100644 --- a/app/views/shared/boards/components/sidebar/_milestone.html.haml +++ b/app/views/shared/boards/components/sidebar/_milestone.html.haml @@ -16,9 +16,10 @@ name: "issue[milestone_id]", "v-if" => "issue.milestone" } .dropdown - %button.dropdown-menu-toggle.js-milestone-select.js-issue-board-sidebar{ type: "button", data: { toggle: "dropdown", show_no: "true", field_name: "issue[milestone_id]", milestones: milestones_filter_path(format: :json), ability_name: "issue", use_id: "true", default_no: "true" }, + %button.dropdown-menu-toggle.js-milestone-select.js-issue-board-sidebar{ type: "button", data: { toggle: "dropdown", show_no: "true", field_name: "issue[milestone_id]", ability_name: "issue", use_id: "true", default_no: "true" }, ":data-selected" => "milestoneTitle", - ":data-issuable-id" => "issue.iid" } + ":data-issuable-id" => "issue.iid", + ":data-project-id" => "issue.project_id" } = _("Milestone") = icon("chevron-down") .dropdown-menu.dropdown-select.dropdown-menu-selectable diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml index 1eda439c9a5..cc5addaa3a0 100644 --- a/app/views/shared/deploy_tokens/_form.html.haml +++ b/app/views/shared/deploy_tokens/_form.html.haml @@ -35,6 +35,7 @@ = label_tag ("deploy_token_write_registry"), 'write_registry', class: 'label-bold form-check-label' .text-secondary= s_('DeployTokens|Allows write access to the registry images') + - if packages_registry_enabled?(group_or_project) %fieldset.form-group.form-check = f.check_box :read_package_registry, class: 'form-check-input' = label_tag ("deploy_token_read_package_registry"), 'read_package_registry', class: 'label-bold form-check-label' diff --git a/app/views/shared/empty_states/_issues.html.haml b/app/views/shared/empty_states/_issues.html.haml index 3fd64291fb2..8c5319e2178 100644 --- a/app/views/shared/empty_states/_issues.html.haml +++ b/app/views/shared/empty_states/_issues.html.haml @@ -51,7 +51,7 @@ %strong = s_('JiraService|Using Jira for issue tracking?') %p.gl-text-center.gl-mb-0 - - jira_docs_link_url = help_page_url('user/project/integrations/jira', anchor: 'view-jira-issues-premium') + - jira_docs_link_url = help_page_url('user/project/integrations/jira', anchor: 'view-jira-issues') - jira_docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: jira_docs_link_url } = html_escape(s_('JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab.')) % { jira_docs_link_start: jira_docs_link_start.html_safe, jira_docs_link_end: '</a>'.html_safe } %p.gl-text-center.gl-mb-0.gl-text-gray-500 diff --git a/app/views/shared/form_elements/_apply_template_warning.html.haml b/app/views/shared/form_elements/_apply_template_warning.html.haml index 09ca59a520c..b1edfba6df4 100644 --- a/app/views/shared/form_elements/_apply_template_warning.html.haml +++ b/app/views/shared/form_elements/_apply_template_warning.html.haml @@ -1,4 +1,4 @@ -.form-group.row.js-template-warning.mb-0.hidden.js-issuable-template-warning +.form-group.row.js-template-warning.mb-0.hidden.js-issuable-template-warning{ :class => ("gl-mb-5!" if issuable.supports_issue_type? && can?(current_user, :admin_issue, @project)) } .offset-sm-2.col-sm-10 .warning_message.mb-0{ role: 'alert' } diff --git a/app/views/shared/gitpod/_enable_gitpod_modal.html.haml b/app/views/shared/gitpod/_enable_gitpod_modal.html.haml new file mode 100644 index 00000000000..a6bd1d10e43 --- /dev/null +++ b/app/views/shared/gitpod/_enable_gitpod_modal.html.haml @@ -0,0 +1,12 @@ +#modal-enable-gitpod.modal.qa-enable-gitpod-modal + .modal-dialog + .modal-content + .modal-header + %h3.page-title= _('Enable Gitpod?') + %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') } + %span{ "aria-hidden": true } × + .modal-body.p-3 + %p= (_("To use Gitpod you must first enable the feature in the integrations section of your %{user_prefs}.") % { user_prefs: link_to(_('user preferences'), profile_preferences_path(anchor: 'gitpod')) }).html_safe + .modal-footer + = link_to _('Cancel'), '#', class: "btn btn-cancel", "data-dismiss" => "modal" + = link_to _('Enable Gitpod'), profile_path(user: { gitpod_enabled: true}), class: 'btn btn-success', method: :put diff --git a/app/views/shared/icons/_dev_ops_score_no_data.svg b/app/views/shared/icons/_dev_ops_report_no_data.svg index 5de929859ae..5de929859ae 100644 --- a/app/views/shared/icons/_dev_ops_score_no_data.svg +++ b/app/views/shared/icons/_dev_ops_report_no_data.svg diff --git a/app/views/shared/icons/_dev_ops_score_no_index.svg b/app/views/shared/icons/_dev_ops_report_no_index.svg index 0577efca93f..0577efca93f 100644 --- a/app/views/shared/icons/_dev_ops_score_no_index.svg +++ b/app/views/shared/icons/_dev_ops_report_no_index.svg diff --git a/app/views/shared/icons/_dev_ops_score_overview.svg b/app/views/shared/icons/_dev_ops_report_overview.svg index 2f31113bad7..2f31113bad7 100644 --- a/app/views/shared/icons/_dev_ops_score_overview.svg +++ b/app/views/shared/icons/_dev_ops_report_overview.svg diff --git a/app/views/shared/integrations/_form.html.haml b/app/views/shared/integrations/_form.html.haml index 5826cb280bd..11e390a47e2 100644 --- a/app/views/shared/integrations/_form.html.haml +++ b/app/views/shared/integrations/_form.html.haml @@ -6,10 +6,5 @@ = integration.title .col-lg-8 - = form_for integration, as: :service, url: scoped_integration_path(integration), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'can-test' => integration.can_test?, 'test-url' => scoped_test_integration_path(integration) } } do |form| + = form_for integration, as: :service, url: scoped_integration_path(integration), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'test-url' => scoped_test_integration_path(integration) } } do |form| = render 'shared/service_settings', form: form, integration: integration - - - if integration.editable? - .footer-block.row-content-block - = service_save_button - = link_to _('Cancel'), scoped_integration_path(integration), class: 'btn btn-cancel' diff --git a/app/views/shared/integrations/_index.html.haml b/app/views/shared/integrations/_index.html.haml index 2dbd612ea38..2f299ad5c89 100644 --- a/app/views/shared/integrations/_index.html.haml +++ b/app/views/shared/integrations/_index.html.haml @@ -3,7 +3,7 @@ %col %col %col.d-none.d-sm-table-column - %col{ width: 130 } + %col{ width: 135 } %thead{ role: 'rowgroup' } %tr{ role: 'row' } %th{ role: 'columnheader', scope: 'col', 'aria-colindex': 1 } diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml index 0c15d20bfe0..09abe9e89c4 100644 --- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml +++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml @@ -40,7 +40,7 @@ .title = _('Milestone') .filter-item - = dropdown_tag(_("Select milestone"), options: { title: _("Assign milestone"), toggle_class: "js-milestone-select js-extra-options js-filter-submit js-filter-bulk-update", filter: true, dropdown_class: "dropdown-menu-selectable dropdown-menu-milestone", placeholder: _("Search milestones"), data: { show_no: true, field_name: "update[milestone_id]", project_id: @project.id, milestones: project_milestones_path(@project, :json), use_id: true, default_label: _("Milestone") } }) + = dropdown_tag(_("Select milestone"), options: { title: _("Assign milestone"), toggle_class: "js-milestone-select js-extra-options js-filter-submit js-filter-bulk-update", filter: true, dropdown_class: "dropdown-menu-selectable dropdown-menu-milestone", placeholder: _("Search milestones"), data: { show_no: true, field_name: "update[milestone_id]", project_id: @project.id, use_id: true, default_label: _("Milestone") } }) .block .title = _('Labels') diff --git a/app/views/shared/issuable/_close_reopen_report_toggle.html.haml b/app/views/shared/issuable/_close_reopen_report_toggle.html.haml index 3fc6a3b545b..4c7aee09406 100644 --- a/app/views/shared/issuable/_close_reopen_report_toggle.html.haml +++ b/app/views/shared/issuable/_close_reopen_report_toggle.html.haml @@ -9,7 +9,7 @@ - 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: { qa_selector: 'close_issue_button', endpoint: close_reopen_issuable_path(issuable) } } + %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", @@ -39,10 +39,8 @@ %li.divider.droplab-item-ignore - %li.report-item{ data: { text: _('Report abuse'), url: new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)), - button_class: "#{button_class} btn-close-color", toggle_class: "#{toggle_class} btn-close-color", method: '' } } - %button.btn.btn-transparent - = icon('check', class: 'icon') + %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 diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 86cd2923fac..728b527f499 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -6,7 +6,7 @@ = form_errors(issuable) - if @conflict - .alert.alert-danger + .gl-alert.gl-alert-danger.gl-mb-5 Someone edited the #{issuable.class.model_name.human.downcase} the same time you did. Please check out = link_to "the #{issuable.class.model_name.human.downcase}", polymorphic_path([@project, issuable]), target: "_blank", rel: 'noopener noreferrer' @@ -20,7 +20,10 @@ = render 'shared/issuable/form/title', issuable: issuable, form: form, has_wip_commits: commits && commits.detect(&:work_in_progress?) #js-suggestions{ data: { project_path: @project.full_path } } -= render 'shared/form_elements/apply_template_warning' += render 'shared/form_elements/apply_template_warning', issuable: issuable + += render 'shared/issuable/form/type_selector', issuable: issuable, form: form + = render 'shared/form_elements/description', model: issuable, form: form, project: project - if issuable.respond_to?(:confidential) @@ -42,7 +45,7 @@ - if @merge_request_to_resolve_discussions_of .form-group.row .col-sm-10.offset-sm-2 - = icon('info-circle') + = sprite_icon('information-o') - if @merge_request_to_resolve_discussions_of.discussions_can_be_resolved_by?(current_user) = hidden_field_tag 'merge_request_to_resolve_discussions_of', @merge_request_to_resolve_discussions_of.iid - if @discussion_to_resolve diff --git a/app/views/shared/issuable/_milestone_dropdown.html.haml b/app/views/shared/issuable/_milestone_dropdown.html.haml index c2da363b8c6..f58156b7c08 100644 --- a/app/views/shared/issuable/_milestone_dropdown.html.haml +++ b/app/views/shared/issuable/_milestone_dropdown.html.haml @@ -8,7 +8,7 @@ - if selected.present? || params[:milestone_title].present? = hidden_field_tag(name, name == :milestone_title ? selected_text : selected.id) = dropdown_tag(milestone_dropdown_label(selected_text), options: { title: dropdown_title, toggle_class: "qa-issuable-milestone-dropdown js-milestone-select js-filter-submit #{extra_class}", filter: true, dropdown_class: "qa-issuable-dropdown-menu-milestone dropdown-menu-selectable dropdown-menu-milestone", - placeholder: "Search milestones", footer_content: project.present?, data: { show_no: true, show_menu_above: show_menu_above, show_any: show_any, show_upcoming: show_upcoming, show_started: show_started, field_name: name, selected: selected_text, project_id: project.try(:id), milestones: milestones_filter_dropdown_path, default_label: "Milestone" } }) do + placeholder: "Search milestones", footer_content: project.present?, data: { show_no: true, show_menu_above: show_menu_above, show_any: show_any, show_upcoming: show_upcoming, show_started: show_started, field_name: name, selected: selected_text, project_id: project.try(:id), default_label: "Milestone" } }) do - if project %ul.dropdown-footer-list - if can? current_user, :admin_milestone, project diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml index 3f3b9146e71..cd7d792738d 100644 --- a/app/views/shared/issuable/_search_bar.html.haml +++ b/app/views/shared/issuable/_search_bar.html.haml @@ -165,7 +165,7 @@ = render_if_exists 'shared/issuable/filter_epic', type: type %button.clear-search.hidden{ type: 'button' } - = icon('times') + = sprite_icon('close', size: 16, css_class: 'clear-search-icon') .filter-dropdown-container.d-flex.flex-column.flex-md-row - if type == :boards #js-board-labels-toggle diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index 6f31d7290b7..620e9b5ea31 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -4,6 +4,7 @@ - issuable_type = issuable_sidebar[:type] - signed_in = !!issuable_sidebar.dig(:current_user, :id) - can_edit_issuable = issuable_sidebar.dig(:current_user, :can_edit) +- add_page_startup_api_call "#{issuable_sidebar[:issuable_json_path]}?serializer=sidebar_extras" - if Feature.enabled?(:vue_issuable_sidebar, @project.group) %aside#js-vue-issuable-sidebar{ data: { signed_in: signed_in, @@ -29,47 +30,50 @@ = render_if_exists 'shared/issuable/sidebar_item_epic', issuable_sidebar: issuable_sidebar - - milestone = issuable_sidebar[:milestone] || {} - .block.milestone{ data: { qa_selector: 'milestone_block' } } - .sidebar-collapsed-icon.has-tooltip{ title: sidebar_milestone_tooltip_label(milestone), data: { container: 'body', html: 'true', placement: 'left', boundary: 'viewport' } } - = sprite_icon('clock') - %span.milestone-title.collapse-truncated-title + - if issuable_sidebar[:supports_milestone] + - milestone = issuable_sidebar[:milestone] || {} + .block.milestone{ data: { qa_selector: 'milestone_block' } } + .sidebar-collapsed-icon.has-tooltip{ title: sidebar_milestone_tooltip_label(milestone), data: { container: 'body', html: 'true', placement: 'left', boundary: 'viewport' } } + = sprite_icon('clock') + %span.milestone-title.collapse-truncated-title + - if milestone.present? + = milestone[:title] + - else + = _('None') + .title.hide-collapsed + = _('Milestone') + = loading_icon(css_class: 'gl-vertical-align-text-bottom hidden block-loading') + - if can_edit_issuable + = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { qa_selector: "edit_milestone_link", track_label: "right_sidebar", track_property: "milestone", track_event: "click_edit_button", track_value: "" } + .value.hide-collapsed - if milestone.present? - = milestone[:title] + - milestone_title = milestone[:expired] ? _("%{milestone_name} (Past due)").html_safe % { milestone_name: milestone[:title] } : milestone[:title] + = link_to milestone_title, milestone[:web_url], class: "bold has-tooltip", title: sidebar_milestone_remaining_days(milestone), data: { container: "body", html: 'true', boundary: 'viewport', qa_selector: 'milestone_link', qa_title: milestone[:title] } - else - = _('None') - .title.hide-collapsed - = _('Milestone') - = icon('spinner spin', class: 'hidden block-loading', 'aria-hidden': 'true') - - if can_edit_issuable - = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { qa_selector: "edit_milestone_link", track_label: "right_sidebar", track_property: "milestone", track_event: "click_edit_button", track_value: "" } - .value.hide-collapsed - - if milestone.present? - = link_to milestone[:title], milestone[:web_url], class: "bold has-tooltip", title: sidebar_milestone_remaining_days(milestone), data: { container: "body", html: 'true', boundary: 'viewport', qa_selector: 'milestone_link', qa_title: milestone[:title] } - - else - %span.no-value - = _('None') - - .selectbox.hide-collapsed - = 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], milestones: issuable_sidebar[:project_milestones_path], 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 } - #issuable-time-tracker.block - // Fallback while content is loading - .title.hide-collapsed - = _('Time tracking') - = icon('spinner spin', 'aria-hidden': 'true') - + %span.no-value + = _('None') + + .selectbox.hide-collapsed + = 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 } + + - if issuable_sidebar[:supports_time_tracking] + #issuable-time-tracker.block + // Fallback while content is loading + .title.hide-collapsed + = _('Time tracking') + = loading_icon - if issuable_sidebar.has_key?(:due_date) .block.due_date .sidebar-collapsed-icon.has-tooltip{ data: { placement: 'left', container: 'body', html: 'true', boundary: 'viewport' }, title: sidebar_due_date_tooltip_label(issuable_sidebar[:due_date]) } - = icon('calendar', 'aria-hidden': 'true') + = sprite_icon('calendar') %span.js-due-date-sidebar-value = issuable_sidebar[:due_date].try(:to_s, :medium) || _('None') .title.hide-collapsed = _('Due date') - = icon('spinner spin', class: 'hidden block-loading', 'aria-hidden': 'true') + = loading_icon(css_class: 'gl-vertical-align-text-bottom hidden block-loading') - if can_edit_issuable = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { track_label: "right_sidebar", track_property: "due_date", track_event: "click_edit_button", track_value: "" } .value.hide-collapsed @@ -97,48 +101,63 @@ = dropdown_content do .js-due-date-calendar - - selected_labels = issuable_sidebar[:labels] - .block.labels - .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(selected_labels), data: { placement: "left", container: "body", boundary: 'viewport' } } - = icon('tags', 'aria-hidden': 'true') - %span - = selected_labels.size - .title.hide-collapsed - = _('Labels') - = icon('spinner spin', class: 'hidden block-loading', 'aria-hidden': 'true') - - if can_edit_issuable - = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { qa_selector: "edit_labels_link", track_label: "right_sidebar", track_property: "labels", track_event: "click_edit_button", track_value: "" } - .value.issuable-show-labels.dont-hide.hide-collapsed{ class: ("has-labels" if selected_labels.any?), data: { qa_selector: 'labels_block' } } - - if selected_labels.any? - - selected_labels.each do |label_hash| - = render_label(label_from_hash(label_hash).present(issuable_subject: nil), link: sidebar_label_filter_path(issuable_sidebar[:project_issuables_path], label_hash[:title]), dataset: { qa_selector: 'label', qa_label_name: label_hash[:title] }) - - else - %span.no-value - = _('None') - .selectbox.hide-collapsed - - selected_labels.each do |label| - = hidden_field_tag "#{issuable_type}[label_names][]", label[:id], id: nil - .dropdown - %button.dropdown-menu-toggle.js-label-select.js-multiselect.js-label-sidebar-dropdown{ type: "button", data: sidebar_label_dropdown_data(issuable_type, issuable_sidebar) } - %span.dropdown-toggle-text{ class: ("is-default" if selected_labels.empty?) } - = multi_label_name(selected_labels, "Labels") - = icon('chevron-down', 'aria-hidden': 'true') - .dropdown-menu.dropdown-select.dropdown-menu-paging.qa-dropdown-menu-labels.dropdown-menu-labels.dropdown-menu-selectable.dropdown-extended-height - = render partial: "shared/issuable/label_page_default" - - if issuable_sidebar.dig(:current_user, :can_admin_label) - = render partial: "shared/issuable/label_page_create" + + - if Feature.enabled?(:vue_sidebar_labels, @project) + .js-sidebar-labels{ data: { allow_label_create: issuable_sidebar.dig(:current_user, :can_admin_label).to_s, + allow_scoped_labels: issuable_sidebar[:scoped_labels_available].to_s, + can_edit: can_edit_issuable.to_s, + iid: issuable_sidebar[:iid], + issuable_type: issuable_type, + labels_fetch_path: issuable_sidebar[:project_labels_path], + labels_manage_path: project_labels_path(@project), + labels_update_path: issuable_sidebar[:issuable_json_path], + project_issues_path: issuable_sidebar[:project_issuables_path], + project_path: @project.full_path, + selected_labels: issuable_sidebar[:labels].to_json } } + - else + - selected_labels = issuable_sidebar[:labels] + .block.labels + .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(selected_labels), data: { placement: "left", container: "body", boundary: 'viewport' } } + = sprite_icon('labels') + %span + = selected_labels.size + .title.hide-collapsed + = _('Labels') + = loading_icon(css_class: 'gl-vertical-align-text-bottom hidden block-loading') + - if can_edit_issuable + = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { qa_selector: "edit_labels_link", track_label: "right_sidebar", track_property: "labels", track_event: "click_edit_button", track_value: "" } + .value.issuable-show-labels.dont-hide.hide-collapsed{ class: ("has-labels" if selected_labels.any?), data: { qa_selector: 'labels_block' } } + - if selected_labels.any? + - selected_labels.each do |label_hash| + = render_label(label_from_hash(label_hash).present(issuable_subject: nil), link: sidebar_label_filter_path(issuable_sidebar[:project_issuables_path], label_hash[:title]), dataset: { qa_selector: 'label', qa_label_name: label_hash[:title] }) + - else + %span.no-value + = _('None') + .selectbox.hide-collapsed + - selected_labels.each do |label| + = hidden_field_tag "#{issuable_type}[label_names][]", label[:id], id: nil + .dropdown + %button.dropdown-menu-toggle.js-label-select.js-multiselect.js-label-sidebar-dropdown{ type: "button", data: sidebar_label_dropdown_data(issuable_type, issuable_sidebar) } + %span.dropdown-toggle-text{ class: ("is-default" if selected_labels.empty?) } + = multi_label_name(selected_labels, "Labels") + = icon('chevron-down', 'aria-hidden': 'true') + .dropdown-menu.dropdown-select.dropdown-menu-paging.qa-dropdown-menu-labels.dropdown-menu-labels.dropdown-menu-selectable.dropdown-extended-height + = render partial: "shared/issuable/label_page_default" + - if issuable_sidebar.dig(:current_user, :can_admin_label) + = render partial: "shared/issuable/label_page_create" = render_if_exists 'shared/issuable/sidebar_weight', issuable_sidebar: issuable_sidebar + - if issuable_sidebar[:supports_severity] + #js-severity + - if issuable_sidebar.dig(:features_available, :health_status) .js-sidebar-status-entry-point - if issuable_sidebar.has_key?(:confidential) - -# haml-lint:disable InlineJavaScript %script#js-confidential-issue-data{ type: "application/json" }= { is_confidential: issuable_sidebar[:confidential], is_editable: can_edit_issuable }.to_json.html_safe #js-confidential-entry-point - -# haml-lint:disable InlineJavaScript %script#js-lock-issue-data{ type: "application/json" }= { is_locked: !!issuable_sidebar[:discussion_locked], is_editable: can_edit_issuable }.to_json.html_safe #js-lock-entry-point @@ -148,15 +167,24 @@ .js-sidebar-subscriptions-entry-point - project_ref = issuable_sidebar[:reference] - .block.project-reference - .sidebar-collapsed-icon.dont-change-state - = clipboard_button(text: project_ref, title: _('Copy reference'), placement: "left", boundary: 'viewport') - .cross-project-reference.hide-collapsed - %span - = _('Reference:') - %cite{ title: project_ref } - = project_ref - = clipboard_button(text: project_ref, title: _('Copy reference'), placement: "left", boundary: 'viewport') + .block.with-sub-blocks + .project-reference.sub-block + .sidebar-collapsed-icon.dont-change-state + = clipboard_button(text: project_ref, title: _('Copy reference'), placement: "left", boundary: 'viewport') + .cross-project-reference.hide-collapsed + %span + = _('Reference:') + %cite{ title: project_ref } + = project_ref + = clipboard_button(text: project_ref, title: _('Copy reference'), placement: "left", boundary: 'viewport') + - if issuable_type == 'merge_request' + .sidebar-source-branch.sub-block + .sidebar-collapsed-icon.dont-change-state + = clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport') + .sidebar-mr-source-branch.hide-collapsed + %span + = _('Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}').html_safe % { source_branch_open: "<cite class='ref-name' title='#{source_branch}'>".html_safe, source_branch_close: "</cite>".html_safe, source_branch: source_branch } + = clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport') - if issuable_sidebar.dig(:current_user, :can_move) .block.js-sidebar-move-issue-block @@ -174,7 +202,7 @@ = dropdown_footer add_content_class: true do %button.btn.btn-success.sidebar-move-issue-confirmation-button.js-move-issue-confirmation-button{ type: 'button', disabled: true } = _('Move') - = icon('spinner spin', class: 'sidebar-move-issue-confirmation-loading-icon') + = loading_icon(css_class: 'gl-vertical-align-text-bottom sidebar-move-issue-confirmation-loading-icon') -# haml-lint:disable InlineJavaScript %script.js-sidebar-options{ type: "application/json" }= issuable_sidebar_options(issuable_sidebar).to_json.html_safe diff --git a/app/views/shared/issuable/_sidebar_assignees.html.haml b/app/views/shared/issuable/_sidebar_assignees.html.haml index cf239a5d04c..175713751ef 100644 --- a/app/views/shared/issuable/_sidebar_assignees.html.haml +++ b/app/views/shared/issuable/_sidebar_assignees.html.haml @@ -4,7 +4,7 @@ #js-vue-sidebar-assignees{ data: { field: issuable_type, signed_in: signed_in } } .title.hide-collapsed = _('Assignee') - .spinner.spinner-sm.align-bottom + = loading_icon(css_class: 'gl-vertical-align-text-bottom') .selectbox.hide-collapsed - if assignees.none? diff --git a/app/views/shared/issuable/_sidebar_todo.html.haml b/app/views/shared/issuable/_sidebar_todo.html.haml index de4df016cfb..7b5926fc186 100644 --- a/app/views/shared/issuable/_sidebar_todo.html.haml +++ b/app/views/shared/issuable/_sidebar_todo.html.haml @@ -12,4 +12,4 @@ data: todo_button_data } %span.issuable-todo-inner.js-issuable-todo-inner< = is_collapsed ? button_icon : button_title - = icon('spin spinner', 'aria-hidden': 'true') + = loading_icon diff --git a/app/views/shared/issuable/form/_branch_chooser.html.haml b/app/views/shared/issuable/form/_branch_chooser.html.haml index 30a1f0febc3..94fa43746e2 100644 --- a/app/views/shared/issuable/form/_branch_chooser.html.haml +++ b/app/views/shared/issuable/form/_branch_chooser.html.haml @@ -6,7 +6,7 @@ - source_title, target_title = format_mr_branch_names(@merge_request) -.form-group.row.d-flex.gl-pl-3-deprecated-no-really-do-not-use-me.gl-pr-3-deprecated-no-really-do-not-use-me.branch-selector +.form-group.row.d-flex.gl-px-5.branch-selector .align-self-center %span = html_escape(_('From %{code_open}%{source_title}%{code_close} into')) % { source_title: source_title, code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } diff --git a/app/views/shared/issuable/form/_issue_assignee.html.haml b/app/views/shared/issuable/form/_issue_assignee.html.haml deleted file mode 100644 index 0d13fccaf3e..00000000000 --- a/app/views/shared/issuable/form/_issue_assignee.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -- issue = issuable -- assignees = issue.assignees -.block.assignee - .sidebar-collapsed-icon.sidebar-collapsed-user{ data: { toggle: "tooltip", placement: "left", container: "body" }, title: (issuable.assignee_list) } - - if assignees.any? - - assignees.each do |assignee| - = link_to_member(@project, assignee, size: 24) - - else - = icon('user', 'aria-hidden': 'true') - .title.hide-collapsed - Assignee - = icon('spinner spin', class: 'hidden block-loading', 'aria-hidden': 'true') - - if can_edit_issuable - = link_to 'Edit', '#', class: 'js-sidebar-dropdown-toggle edit-link float-right' - .value.hide-collapsed - - if assignees.any? - - assignees.each do |assignee| - = link_to_member(@project, assignee, size: 32, extra_class: 'bold') do - %span.username - = assignee.to_reference - - else - %span.assign-yourself.no-value - No assignee - - if can_edit_issuable - \- - %a.js-assign-yourself{ href: '#' } - assign yourself - - .selectbox.hide-collapsed - = f.hidden_field 'assignee_ids', value: issuable.assignee_ids, id: 'issue_assignee_ids' - = dropdown_tag('Select assignee', options: { toggle_class: 'js-user-search js-author-search', title: 'Assign to', filter: true, dropdown_class: 'dropdown-menu-user dropdown-menu-selectable dropdown-menu-author', placeholder: 'Search users', data: { first_user: (current_user.username if current_user), current_user: true, project_id: (@project.id if @project), author_id: issuable.author_id, field_name: "#{issuable.to_ability_name}[assignee_id]", issue_update: issuable_json_path(issuable), ability_name: issuable.to_ability_name, null_user: true } }) diff --git a/app/views/shared/issuable/form/_merge_params.html.haml b/app/views/shared/issuable/form/_merge_params.html.haml index 5c5c8c816d3..e29627304b4 100644 --- a/app/views/shared/issuable/form/_merge_params.html.haml +++ b/app/views/shared/issuable/form/_merge_params.html.haml @@ -25,7 +25,7 @@ = check_box_tag 'merge_request[squash]', '1', issuable_squash_option?(issuable, project), class: 'form-check-input' = label_tag 'merge_request[squash]', class: 'form-check-label' do Squash commits when merge request is accepted. - = link_to icon('question-circle'), help_page_path('user/project/merge_requests/squash_and_merge'), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('user/project/merge_requests/squash_and_merge'), target: '_blank' - if project.squash_always? .gl-text-gray-400 = _('Required in this project.') diff --git a/app/views/shared/issuable/form/_metadata.html.haml b/app/views/shared/issuable/form/_metadata.html.haml index 1389bc2ab4d..459eb112e4f 100644 --- a/app/views/shared/issuable/form/_metadata.html.haml +++ b/app/views/shared/issuable/form/_metadata.html.haml @@ -12,13 +12,19 @@ .form-group.row.merge-request-assignee = render "shared/issuable/form/metadata_issuable_assignee", issuable: issuable, form: form, has_due_date: has_due_date + - 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_if_exists "shared/issuable/form/epic", issuable: issuable, form: form, project: project - .form-group.row.issue-milestone - = form.label :milestone_id, "Milestone", 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 - = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_upcoming: false, show_started: false, extra_class: "qa-issuable-milestone-dropdown js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" + - if issuable.supports_milestone? + .form-group.row.issue-milestone + = form.label :milestone_id, "Milestone", 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 + = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_upcoming: false, show_started: false, extra_class: "qa-issuable-milestone-dropdown js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" + .form-group.row = form.label :label_ids, "Labels", class: "col-form-label #{has_due_date ? "col-md-2 col-lg-4" : "col-sm-2"}" = form.hidden_field :label_ids, multiple: true, value: '' @@ -28,7 +34,7 @@ = render_if_exists "shared/issuable/form/merge_request_blocks", issuable: issuable, form: form - - if has_due_date || issuable.supports_weight? + - if has_due_date .col-lg-6 = render_if_exists "shared/issuable/form/weight", issuable: issuable, form: form .form-group.row diff --git a/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml b/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml new file mode 100644 index 00000000000..a8b033bba36 --- /dev/null +++ b/app/views/shared/issuable/form/_metadata_issuable_reviewer.html.haml @@ -0,0 +1,10 @@ += 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) } + .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 } + + - 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)) diff --git a/app/views/shared/issuable/form/_metadata_merge_request_assignee.html.haml b/app/views/shared/issuable/form/_metadata_merge_request_assignee.html.haml deleted file mode 100644 index 60c34094108..00000000000 --- a/app/views/shared/issuable/form/_metadata_merge_request_assignee.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -= form.label :assignee_id, "Assignee", class: "col-form-label #{has_due_date ? "col-lg-4" : "col-sm-2"}" -.col-sm-10{ class: ("col-lg-8" if has_due_date) } - .issuable-form-select-holder - = form.hidden_field :assignee_id - - = dropdown_tag(user_dropdown_label(issuable.assignee_id, "Assignee"), options: { toggle_class: "js-dropdown-keep-input js-user-search js-issuable-form-dropdown js-assignee-search", title: "Select assignee", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee js-filter-submit", - placeholder: "Search assignee", data: { first_user: current_user.try(:username), null_user: true, current_user: true, project_id: issuable.project.try(:id), selected: issuable.assignee_id, field_name: "#{issuable.class.model_name.param_key}[assignee_id]", default_label: "Assignee"} }) - = link_to 'Assign to me', '#', class: "assign-to-me-link qa-assign-to-me-link #{'hide' if issuable.assignee_id == current_user.id}" diff --git a/app/views/shared/issuable/form/_type_selector.html.haml b/app/views/shared/issuable/form/_type_selector.html.haml new file mode 100644 index 00000000000..7a8120d2d02 --- /dev/null +++ b/app/views/shared/issuable/form/_type_selector.html.haml @@ -0,0 +1,30 @@ +- return unless issuable.supports_issue_type? && can?(current_user, :admin_issue, @project) + +.form-group.row.gl-mb-0 + = form.label :type, 'Type', class: 'col-form-label col-sm-2' + .col-sm-10 + .issuable-form-select-holder.selectbox.form-group.gl-mb-0 + .dropdown.js-issuable-type-filter-dropdown-wrap + %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' } + %span.dropdown-toggle-text.is-default + = issuable.issue_type.capitalize || _("Select type") + = icon('chevron-down') + .dropdown-menu.dropdown-menu-selectable.dropdown-select + .dropdown-title.gl-display-flex + %span.gl-ml-auto + = _("Select type") + %button.dropdown-title-button.dropdown-menu-close.gl-ml-auto{ "aria-label" => _('Close') } + = sprite_icon('close', size: 16, css_class: 'dropdown-menu-close-icon') + .dropdown-content + %ul + %li.js-filter-issuable-type + = link_to new_project_issue_path(@project), class: ("is-active" if issuable.issue?) do + = _("Issue") + %li.js-filter-issuable-type + = link_to new_project_issue_path(@project, { issuable_template: 'incident', issue: { issue_type: 'incident' } }), class: ("is-active" if issuable.incident?) do + = _("Incident") + - if issuable.incident? + %p.form-text.text-muted + - incident_docs_url = help_page_path('operations/incident_management/incidents.md', anchor: 'create-and-manage-incidents-in-gitlab') + - incident_docs_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: incident_docs_url } + = _('A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents.').html_safe % { incident_docs_start: incident_docs_start, incident_docs_end: '</a>'.html_safe } diff --git a/app/views/shared/members/_group.html.haml b/app/views/shared/members/_group.html.haml index f59e0f92c60..8e5763842d9 100644 --- a/app/views/shared/members/_group.html.haml +++ b/app/views/shared/members/_group.html.haml @@ -38,7 +38,7 @@ data: { id: role_id, el_id: dom_id } .clearable-input.member-form-control.d-sm-inline-block = text_field_tag 'group_link[expires_at]', group_link.expires_at, class: 'form-control js-access-expiration-date js-member-update-control', placeholder: _('Expiration date'), id: "member_expires_at_#{group.id}", disabled: !can_admin_member - %i.clear-icon.js-clear-input + = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200') - if can_admin_member = link_to group_link_path, method: :delete, diff --git a/app/views/shared/members/_invite_group.html.haml b/app/views/shared/members/_invite_group.html.haml index a2fb33aa757..a87a4c6a45c 100644 --- a/app/views/shared/members/_invite_group.html.haml +++ b/app/views/shared/members/_invite_group.html.haml @@ -22,5 +22,5 @@ = label_tag :expires_at, _('Access expiration date'), class: 'label-bold' .clearable-input = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date-groups', placeholder: _('Expiration date'), id: 'expires_at_groups' - %i.clear-icon.js-clear-input + = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200') = submit_tag _("Invite"), class: "btn btn-success", data: { qa_selector: 'invite_group_button' } diff --git a/app/views/shared/members/_invite_member.html.haml b/app/views/shared/members/_invite_member.html.haml index 284d7fdb6da..5f9046b3dcb 100644 --- a/app/views/shared/members/_invite_member.html.haml +++ b/app/views/shared/members/_invite_member.html.haml @@ -19,10 +19,10 @@ - link_start = %q{<a href="%{url}">}.html_safe % { url: permissions_docs_path } = _("%{link_start}Read more%{link_end} about role permissions").html_safe % { link_start: link_start, link_end: '</a>'.html_safe } .form-group + = label_tag :expires_at, _('Access expiration date'), class: 'label-bold' .clearable-input - = label_tag :expires_at, _('Access expiration date'), class: 'label-bold' = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date', placeholder: 'Expiration date' - %i.clear-icon.js-clear-input + = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200') = submit_tag _("Invite"), class: "btn btn-success", data: { qa_selector: 'invite_member_button' } - if can_import_members = link_to _("Import"), import_path, class: "btn btn-default", title: _("Import members from another project") diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml index 20473b47484..7573c2f6d56 100644 --- a/app/views/shared/members/_member.html.haml +++ b/app/views/shared/members/_member.html.haml @@ -33,7 +33,7 @@ - if source.instance_of?(Group) && source != @group · - = link_to source.full_name, source, class: "member-group-link" + = link_to source.full_name, source, class: "gl-display-inline-block inline-link" .cgray - if member.request? @@ -97,7 +97,7 @@ placeholder: _('Expiration date'), id: "member_expires_at_#{member.id}", data: { el_id: dom_id(member) } - %i.clear-icon.js-clear-input + = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200') - else %span.member-access-text.user-access-role= member.human_access diff --git a/app/views/shared/milestones/_description.html.haml b/app/views/shared/milestones/_description.html.haml index 76d6c765ed6..747e22f47ac 100644 --- a/app/views/shared/milestones/_description.html.haml +++ b/app/views/shared/milestones/_description.html.haml @@ -1,9 +1,8 @@ .detail-page-description.milestone-detail - %h2{ data: { qa_selector: "milestone_title_content" } } - .title + %h2.gl-m-0{ data: { qa_selector: "milestone_title_content" } } = markdown_field(milestone, :title) - if milestone.try(:description).present? %div{ data: { qa_selector: "milestone_description_content" } } - .description.md + .description.md.gl-px-0.gl-pt-4.gl-border-1.gl-border-t-solid.gl-border-gray-100 = markdown_field(milestone, :description) diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml index 4ef8a9dd842..27b771b281b 100644 --- a/app/views/shared/milestones/_milestone.html.haml +++ b/app/views/shared/milestones/_milestone.html.haml @@ -8,7 +8,7 @@ .gl-mb-2 %strong{ data: { qa_selector: "milestone_link", qa_milestone_title: milestone.title } } = link_to truncate(milestone.title, length: 100), milestone_path(milestone) - - if @group + - if @group || dashboard = " - #{milestone_type}" - if milestone.due_date || milestone.start_date @@ -62,7 +62,3 @@ = link_to s_('Milestones|Reopen Milestone'), milestone_path(milestone, milestone: { state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen" - else = link_to s_('Milestones|Close Milestone'), milestone_path(milestone, milestone: { state_event: :close }), method: :put, class: "btn btn-sm btn-grouped btn-close" - - - if dashboard - .label-badge.label-badge-gray - = milestone_type diff --git a/app/views/shared/notes/_hints.html.haml b/app/views/shared/notes/_hints.html.haml index 51c1ee0c4d1..3703cca2290 100644 --- a/app/views/shared/notes/_hints.html.haml +++ b/app/views/shared/notes/_hints.html.haml @@ -27,7 +27,7 @@ or %button.attach-new-file.markdown-selector{ type: 'button' }= _("attach a new file") - %button.btn.markdown-selector.button-attach-file.btn-link{ type: 'button', tabindex: '-1' } + %button.btn.markdown-selector.button-attach-file.btn-link{ type: 'button' } = sprite_icon('media') %span.text-attach-file<> = _("Attach a file") diff --git a/app/views/shared/notes/_note.html.haml b/app/views/shared/notes/_note.html.haml index da665f17975..97ed2852871 100644 --- a/app/views/shared/notes/_note.html.haml +++ b/app/views/shared/notes/_note.html.haml @@ -76,4 +76,4 @@ = note.attachment_identifier = link_to delete_attachment_project_note_path(note.project, note), title: _('Delete this attachment'), method: :delete, remote: true, data: { confirm: _('Are you sure you want to remove the attachment?') }, class: 'danger js-note-attachment-delete' do - = icon('trash-o', class: 'cred') + = sprite_icon('remove', css_class: 'cred') diff --git a/app/views/shared/notes/_notes_with_form.html.haml b/app/views/shared/notes/_notes_with_form.html.haml index 2e98b06ec4a..5b7a0b99598 100644 --- a/app/views/shared/notes/_notes_with_form.html.haml +++ b/app/views/shared/notes/_notes_with_form.html.haml @@ -28,5 +28,4 @@ = sprite_icon('lock', css_class: 'icon') %span = html_escape(_("This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment.")) % { issuable: issuable.class.to_s.titleize.downcase, strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } --# haml-lint:disable InlineJavaScript %script.js-notes-data{ type: "application/json" }= initial_notes_data(autocomplete).to_json.html_safe diff --git a/app/views/shared/promotions/_promote_servicedesk.html.haml b/app/views/shared/promotions/_promote_servicedesk.html.haml index fbac5ef0bbd..237416a869b 100644 --- a/app/views/shared/promotions/_promote_servicedesk.html.haml +++ b/app/views/shared/promotions/_promote_servicedesk.html.haml @@ -1,7 +1,7 @@ .user-callout.promotion-callout.js-service-desk-callout#promote_service_desk{ data: { uid: 'promote_service_desk_dismissed' } } .bordered-box.content-block %button.btn.btn-default.close.js-close-callout{ type: 'button', 'aria-label' => 'Dismiss Service Desk promotion' } - = icon('times', class: 'dismiss-icon', 'aria-hidden' => 'true') + = sprite_icon('close', size: 16, css_class: 'dismiss-icon') .svg-container = custom_icon('icon_service_desk') .user-callout-copy diff --git a/app/views/shared/runners/show.html.haml b/app/views/shared/runners/show.html.haml index 8a78f12bdd8..1af04b808bf 100644 --- a/app/views/shared/runners/show.html.haml +++ b/app/views/shared/runners/show.html.haml @@ -1,71 +1,71 @@ - page_title "#{@runner.description} ##{@runner.id}", _("Runners") %h3.page-title - Runner ##{@runner.id} + = s_('Runners|Runner #%{id}' % { id: @runner.id }) .float-right - if @runner.instance_type? %span.runner-state.runner-state-shared - Shared + = s_('Runners|Shared') - elsif @runner.group_type? %span.runner-state.runner-state-shared - Group + = s_('Runners|Group') - else %span.runner-state.runner-state-specific - Specific + = s_('Runners|Specific') .table-holder %table.table %thead %tr - %th Property Name - %th Value + %th= s_('Runners|Property Name') + %th= s_('Runners|Value') %tr - %td Active - %td= @runner.active? ? 'Yes' : 'No' + %td= s_('Runners|Active') + %td= @runner.active? ? _('Yes') : _('No') %tr - %td Protected - %td= @runner.ref_protected? ? 'Yes' : 'No' + %td= s_('Runners|Protected') + %td= @runner.ref_protected? ? _('Yes') : _('No') %tr - %td Can run untagged jobs - %td= @runner.run_untagged? ? 'Yes' : 'No' + %td= s_('Runners|Can run untagged jobs') + %td= @runner.run_untagged? ? _('Yes') : _('No') - unless @runner.group_type? %tr - %td Locked to this project - %td= @runner.locked? ? 'Yes' : 'No' + %td= s_('Runners|Locked to this project') + %td= @runner.locked? ? _('Yes') : _('No') %tr - %td Tags + %td= s_('Runners|Tags') %td - @runner.tag_list.sort.each do |tag| %span.badge.badge-primary = tag %tr - %td Name + %td= s_('Runners|Name') %td= @runner.name %tr - %td Version + %td= s_('Runners|Version') %td= @runner.version %tr - %td IP Address + %td= s_('Runners|IP Address') %td= @runner.ip_address %tr - %td Revision + %td= s_('Runners|Revision') %td= @runner.revision %tr - %td Platform + %td= s_('Runners|Platform') %td= @runner.platform %tr - %td Architecture + %td= s_('Runners|Architecture') %td= @runner.architecture %tr - %td Description + %td= s_('Runners|Description') %td= @runner.description %tr - %td Maximum job timeout + %td= s_('Runners|Maximum job timeout') %td= @runner.maximum_timeout_human_readable %tr - %td Last contact + %td= s_('Runners|Last contact') %td - if @runner.contacted_at = time_ago_with_tooltip @runner.contacted_at - else - Never + = s_('Never') diff --git a/app/views/shared/snippets/_form.html.haml b/app/views/shared/snippets/_form.html.haml index 81277b50d13..198735df5ee 100644 --- a/app/views/shared/snippets/_form.html.haml +++ b/app/views/shared/snippets/_form.html.haml @@ -1,5 +1,6 @@ -- if Feature.enabled?(:snippets_edit_vue) - #js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown'), 'visibility-help-link': help_page_path("public_access/public_access") } } +- if Feature.enabled?(:snippets_edit_vue, default_enabled: true) + - available_visibility_levels = available_visibility_levels(@snippet) + #js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown'), 'visibility-help-link': help_page_path("public_access/public_access"), 'visibility_levels': available_visibility_levels, 'selected_level': snippets_selected_visibility_level(available_visibility_levels, @snippet.visibility_level), 'multiple_levels_restricted': multiple_visibility_levels_restricted? } } - else .snippet-form-holder = form_for @snippet, url: url, @@ -36,7 +37,7 @@ .form-group .font-weight-bold = _('Visibility level') - = link_to icon('question-circle'), help_page_path("public_access/public_access"), target: '_blank' + = link_to sprite_icon('question-o'), help_page_path('public_access/public_access'), target: '_blank' = render 'shared/visibility_level', f: f, visibility_level: @snippet.visibility_level, can_change_visibility_level: true, form_model: @snippet, with_label: false - if params[:files] diff --git a/app/views/shared/snippets/_header.html.haml b/app/views/shared/snippets/_header.html.haml index d6019e45b25..a9226117727 100644 --- a/app/views/shared/snippets/_header.html.haml +++ b/app/views/shared/snippets/_header.html.haml @@ -5,10 +5,7 @@ = visibility_level_label(@snippet.visibility_level) = visibility_level_icon(@snippet.visibility_level) %span.creator - Authored - = time_ago_with_tooltip(@snippet.created_at, placement: 'bottom', html_class: 'snippet_updated_ago') - by #{link_to_member(@project, @snippet.author, size: 24, author_class: "author item-title", avatar_class: "d-none d-sm-inline")} - = user_status(@snippet.author) + = s_('Snippets|Authored %{time_ago} by %{author}').html_safe % { time_ago: time_ago_with_tooltip(@snippet.created_at, placement: 'bottom', html_class: 'snippet_updated_ago'), author: link_to_member(@project, @snippet.author, size: 24, author_class: "author item-title", avatar_class: "d-none d-sm-inline") + user_status(@snippet.author) } .detail-page-header-actions - if @snippet.project_id? diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml index 0f6188fa334..96da5136908 100644 --- a/app/views/shared/web_hooks/_form.html.haml +++ b/app/views/shared/web_hooks/_form.html.haml @@ -1,77 +1,77 @@ = form_errors(hook) .form-group - = form.label :url, 'URL', class: 'label-bold' + = form.label :url, s_('Webhooks|URL'), class: 'label-bold' = form.text_field :url, class: 'form-control', placeholder: 'http://example.com/trigger-ci.json' .form-group - = form.label :token, 'Secret Token', class: 'label-bold' + = form.label :token, s_('Webhooks|Secret Token'), class: 'label-bold' = form.text_field :token, class: 'form-control', placeholder: '' %p.form-text.text-muted - Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header. + = 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, 'Trigger', class: 'label-bold' + = form.label :url, s_('Webhooks|Trigger'), class: 'label-bold' %ul.list-unstyled.prepend-left-20 %li = form.check_box :push_events, class: 'form-check-input' = form.label :push_events, class: 'list-label form-check-label ml-1' do - %strong Push events + %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 - This URL will be triggered by a push to the repository + = 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 - %strong Tag push events + %strong= s_('Webhooks|Tag push events') %p.text-muted.ml-1 - This URL will be triggered when a new tag is pushed to the repository + = 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 - %strong Comments + %strong= s_('Webhooks|Comments') %p.text-muted.ml-1 - This URL will be triggered when someone adds a comment + = 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 - %strong Confidential Comments + %strong= s_('Webhooks|Confidential Comments') %p.text-muted.ml-1 - This URL will be triggered when someone adds a comment on a confidential issue + = 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 - %strong Issues events + %strong= s_('Webhooks|Issues events') %p.text-muted.ml-1 - This URL will be triggered when an issue is created/updated/merged + = 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 - %strong Confidential Issues events + %strong= s_('Webhooks|Confidential Issues events') %p.text-muted.ml-1 - This URL will be triggered when a confidential issue is created/updated/merged + = s_('Webhooks|This URL will be triggered when a confidential issue is created/updated/merged') %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 - %strong Merge request events + %strong= s_('Webhooks|Merge request events') %p.text-muted.ml-1 - This URL will be triggered when a merge request is created/updated/merged + = 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 - %strong Job events + %strong= s_('Webhooks|Job events') %p.text-muted.ml-1 - This URL will be triggered when the job status changes + = 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 - %strong Pipeline events + %strong= s_('Webhooks|Pipeline events') %p.text-muted.ml-1 - This URL will be triggered when the pipeline status changes + = 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 - %strong Wiki Page events + %strong= s_('Webhooks|Wiki Page events') %p.text-muted.ml-1 - This URL will be triggered when a wiki page is created/updated + = 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 @@ -79,8 +79,8 @@ %p.text-muted.ml-1 = s_('Webhooks|This URL will be triggered when a deployment is finished/failed/canceled') .form-group - = form.label :enable_ssl_verification, 'SSL verification', class: 'label-bold checkbox' + = 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 - %strong Enable SSL verification + %strong= s_('Webhooks|Enable SSL verification') diff --git a/app/views/shared/wikis/_form.html.haml b/app/views/shared/wikis/_form.html.haml index 4d64521f9b0..66c0f64c32c 100644 --- a/app/views/shared/wikis/_form.html.haml +++ b/app/views/shared/wikis/_form.html.haml @@ -21,10 +21,10 @@ .col-sm-12 = f.text_field :title, class: 'form-control qa-wiki-title-textbox', value: @page.title, required: true, autofocus: !@page.persisted?, placeholder: s_('Wiki|Page title') %span.d-inline-block.mw-100.gl-mt-2 - = icon('lightbulb-o') + = sprite_icon('bulb', size: 12, css_class: 'gl-mr-n1') - if @page.persisted? = s_("WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title.") - = link_to icon('question-circle'), help_page_path('user/project/wiki/index', anchor: 'moving-a-wiki-page'), + = link_to sprite_icon('question-o'), help_page_path('user/project/wiki/index', anchor: 'moving-a-wiki-page'), target: '_blank', rel: 'noopener noreferrer' - else = s_("WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories.") diff --git a/app/views/sherlock/file_samples/show.html.haml b/app/views/sherlock/file_samples/show.html.haml index cc8bdbae55d..5fef56f7fc3 100644 --- a/app/views/sherlock/file_samples/show.html.haml +++ b/app/views/sherlock/file_samples/show.html.haml @@ -6,7 +6,7 @@ .row-content-block .float-right = link_to(sherlock_transaction_path(@transaction), class: 'btn') do - %i.fa.fa-arrow-left + = sprite_icon('arrow-left') = t('sherlock.transaction') .oneline = t('sherlock.file_sample') diff --git a/app/views/sherlock/queries/show.html.haml b/app/views/sherlock/queries/show.html.haml index 413130a2907..e4a48943115 100644 --- a/app/views/sherlock/queries/show.html.haml +++ b/app/views/sherlock/queries/show.html.haml @@ -12,7 +12,7 @@ .row-content-block .float-right = link_to(sherlock_transaction_path(@transaction), class: 'btn') do - %i.fa.fa-arrow-left + = sprite_icon('arrow-left') = t('sherlock.transaction') .oneline = t('sherlock.query') diff --git a/app/views/sherlock/transactions/index.html.haml b/app/views/sherlock/transactions/index.html.haml index 4d9df01ae31..1e16c88571e 100644 --- a/app/views/sherlock/transactions/index.html.haml +++ b/app/views/sherlock/transactions/index.html.haml @@ -6,7 +6,7 @@ = link_to(destroy_all_sherlock_transactions_path, class: 'btn btn-danger', method: :delete) do - %i.fa.fa-trash + = sprite_icon('remove') = t('sherlock.delete_all_transactions') .oneline= t('sherlock.introduction') diff --git a/app/views/sherlock/transactions/show.html.haml b/app/views/sherlock/transactions/show.html.haml index 565b337d446..8f2b36123bb 100644 --- a/app/views/sherlock/transactions/show.html.haml +++ b/app/views/sherlock/transactions/show.html.haml @@ -19,7 +19,7 @@ .row-content-block .float-right = link_to(sherlock_transactions_path, class: 'btn') do - %i.fa.fa-arrow-left + = sprite_icon('arrow-left') = t('sherlock.all_transactions') .oneline = t('sherlock.transaction') diff --git a/app/views/u2f/_register.html.haml b/app/views/u2f/_register.html.haml deleted file mode 100644 index a83b55379da..00000000000 --- a/app/views/u2f/_register.html.haml +++ /dev/null @@ -1,40 +0,0 @@ -#js-register-u2f - --# haml-lint:disable InlineJavaScript -%script#js-register-u2f-not-supported{ type: "text/template" } - %p= _("Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer).") - -%script#js-register-u2f-setup{ type: "text/template" } - - if current_user.two_factor_otp_enabled? - .row.gl-mb-3 - .col-md-4 - %button#js-setup-u2f-device.btn.btn-info.btn-block= _("Set up new U2F device") - .col-md-8 - %p= _("Your U2F device needs to be set up. Plug it in (if not already) and click the button on the left.") - - else - .row.gl-mb-3 - .col-md-4 - %button#js-setup-u2f-device.btn.btn-info.btn-block{ disabled: true }= _("Set up new U2F device") - .col-md-8 - %p= _("You need to register a two-factor authentication app before you can set up a U2F device.") - -%script#js-register-u2f-in-progress{ type: "text/template" } - %p= _("Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now.") - -%script#js-register-u2f-error{ type: "text/template" } - %div - %p - %span <%= error_message %> (#{_("error code:")} <%= error_code %>) - %a.btn.btn-warning#js-token-2fa-try-again= _("Try again?") - -%script#js-register-u2f-registered{ type: "text/template" } - .row.gl-mb-3 - .col-md-12 - %p= _("Your device was successfully set up! Give it a name and register it with the GitLab server.") - = form_tag(create_u2f_profile_two_factor_auth_path, method: :post) do - .row.gl-mb-3 - .col-md-3 - = text_field_tag 'u2f_registration[name]', nil, class: 'form-control', placeholder: _("Pick a name") - .col-md-3 - = hidden_field_tag 'u2f_registration[device_response]', nil, class: 'form-control', required: true, id: "js-device-response" - = submit_tag _("Register U2F device"), class: "btn btn-success" diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index e1d1df9de1a..fbda9b79e82 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -13,24 +13,24 @@ .cover-block.user-cover-block{ class: [('border-bottom' if profile_tabs.empty?)] } = render layout: 'users/cover_controls' do - if @user == current_user - = link_to profile_path, class: link_classes + 'btn btn-default has-tooltip', title: s_('UserProfile|Edit profile'), 'aria-label': 'Edit profile' do + = link_to profile_path, class: link_classes + 'btn gl-button btn-default has-tooltip', title: s_('UserProfile|Edit profile'), 'aria-label': 'Edit profile' do = sprite_icon('pencil') - elsif current_user - if @user.abuse_report - %button{ class: link_classes + 'btn btn-danger mr-1', title: s_('UserProfile|Already reported for abuse'), - data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } } - = icon('exclamation-circle') + %button{ class: link_classes + 'btn gl-button btn-danger', title: s_('UserProfile|Already reported for abuse'), + data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } }> + = sprite_icon('error') - else - = link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referrer), class: link_classes + 'btn', + = link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referrer), class: link_classes + 'btn gl-button', title: s_('UserProfile|Report abuse'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do - = icon('exclamation-circle') + = sprite_icon('error') - if can?(current_user, :read_user_profile, @user) - = link_to user_path(@user, rss_url_options), class: link_classes + 'btn btn-svg btn-default has-tooltip', title: s_('UserProfile|Subscribe'), 'aria-label': 'Subscribe' do + = link_to user_path(@user, rss_url_options), class: link_classes + 'btn gl-button btn-svg btn-default has-tooltip', title: s_('UserProfile|Subscribe'), 'aria-label': 'Subscribe' do = sprite_icon('rss', css_class: 'qa-rss-icon') - if current_user && current_user.admin? - = link_to [:admin, @user], class: link_classes + 'btn btn-default', title: s_('UserProfile|View user in admin area'), + = link_to [:admin, @user], class: link_classes + 'btn gl-button btn-default', title: s_('UserProfile|View user in admin area'), data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = icon('users') + = sprite_icon('user') .profile-header{ class: [('with-no-profile-tabs' if profile_tabs.empty?)] } .avatar-holder |