diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-17 14:33:21 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-17 14:33:21 +0300 |
commit | 7021455bd1ed7b125c55eb1b33c5a01f2bc55ee0 (patch) | |
tree | 5bdc2229f5198d516781f8d24eace62fc7e589e9 /app/views/projects | |
parent | 185b095e93520f96e9cfc31d9c3e69b498cdab7c (diff) |
Add latest changes from gitlab-org/gitlab@15-6-stable-eev15.6.0-rc42
Diffstat (limited to 'app/views/projects')
80 files changed, 255 insertions, 385 deletions
diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml index 319c6333e77..51222784847 100644 --- a/app/views/projects/_files.html.haml +++ b/app/views/projects/_files.html.haml @@ -6,7 +6,7 @@ - if readme_path = @project.repository.readme_path - add_page_startup_api_call project_blob_path(@project, tree_join(@ref, readme_path), viewer: "rich", format: "json") -#tree-holder.tree-holder.clearfix +#tree-holder.tree-holder.clearfix.js-per-page{ data: { blame_per_page: Projects::BlameService::PER_PAGE } } .nav-block.gl-display-flex.gl-xs-flex-direction-column.gl-align-items-stretch = render 'projects/tree/tree_header', tree: @tree, is_project_overview: is_project_overview diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml index 42cdc1d6989..cc5271a1cd2 100644 --- a/app/views/projects/_import_project_pane.html.haml +++ b/app/views/projects/_import_project_pane.html.haml @@ -10,45 +10,32 @@ .import-buttons - if gitlab_project_import_enabled? .import_gitlab_project.has-tooltip{ data: { container: 'body', qa_selector: 'gitlab_import_button' } } - = link_to '#', class: 'gl-button btn-default btn btn_import_gitlab_project js-import-project-btn', data: { href: new_import_gitlab_project_path, platform: 'gitlab_export', **tracking_attrs_data(track_label, 'click_button', 'gitlab_export') } do - .gl-button-icon - = sprite_icon('tanuki') - = _("GitLab export") + = render Pajamas::ButtonComponent.new(href: '#', icon: 'tanuki', button_options: { class: 'btn_import_gitlab_project js-import-project-btn', data: { href: new_import_gitlab_project_path, platform: 'gitlab_export', **tracking_attrs_data(track_label, 'click_button', 'gitlab_export') } }) do + = _('GitLab export') + + - if gitlab_import_enabled? + %div + = render Pajamas::ButtonComponent.new(href: status_import_gitlab_path(namespace_id: namespace_id), icon: 'tanuki', button_options: { class: "import_gitlab js-import-project-btn #{'js-how-to-import-link' unless gitlab_import_configured?}", data: { modal_title: _("Import projects from GitLab.com"), modal_message: import_from_gitlab_message, platform: 'gitlab_com', **tracking_attrs_data(track_label, 'click_button', 'gitlab_com') } }) do + GitLab.com - if github_import_enabled? %div - = link_to new_import_github_path(namespace_id: namespace_id), class: 'gl-button btn-default btn js-import-github js-import-project-btn', data: { platform: 'github', **tracking_attrs_data(track_label, 'click_button', 'github') } do - .gl-button-icon - = sprite_icon('github') + = render Pajamas::ButtonComponent.new(href: new_import_github_path(namespace_id: namespace_id), icon: 'github', button_options: { class: 'js-import-github js-import-project-btn', data: { platform: 'github', **tracking_attrs_data(track_label, 'click_button', 'github') } }) do GitHub - if bitbucket_import_enabled? %div - = link_to status_import_bitbucket_path(namespace_id: namespace_id), class: "gl-button btn-default btn import_bitbucket js-import-project-btn #{'js-how-to-import-link' unless bitbucket_import_configured?}", - data: { modal_title: _("Import projects from Bitbucket"), modal_message: import_from_bitbucket_message, platform: 'bitbucket_cloud', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_cloud') } do - .gl-button-icon - = sprite_icon('bitbucket') + = render Pajamas::ButtonComponent.new(href: status_import_bitbucket_path(namespace_id: namespace_id), icon: 'bitbucket', button_options: { class: "import_bitbucket js-import-project-btn #{'js-how-to-import-link' unless bitbucket_import_configured?}", data: { modal_title: _("Import projects from Bitbucket"), modal_message: import_from_bitbucket_message, platform: 'bitbucket_cloud', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_cloud') } }) do Bitbucket Cloud + - if bitbucket_server_import_enabled? %div - = link_to status_import_bitbucket_server_path(namespace_id: namespace_id), class: "gl-button btn-default btn import_bitbucket js-import-project-btn", data: { platform: 'bitbucket_server', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_server') } do - .gl-button-icon - = sprite_icon('bitbucket') + = render Pajamas::ButtonComponent.new(href: status_import_bitbucket_server_path(namespace_id: namespace_id), icon: 'bitbucket', button_options: { class: 'import_bitbucket js-import-project-btn', data: { platform: 'bitbucket_server', **tracking_attrs_data(track_label, 'click_button', 'bitbucket_server') } }) do Bitbucket Server - %div - - if gitlab_import_enabled? - %div - = link_to status_import_gitlab_path(namespace_id: namespace_id), class: "gl-button btn-default btn import_gitlab js-import-project-btn #{'js-how-to-import-link' unless gitlab_import_configured?}", - data: { modal_title: _("Import projects from GitLab.com"), modal_message: import_from_gitlab_message, platform: 'gitlab_com', **tracking_attrs_data(track_label, 'click_button', 'gitlab_com') } do - .gl-button-icon - = sprite_icon('tanuki') - = _("GitLab.com") - if fogbugz_import_enabled? %div - = link_to new_import_fogbugz_path(namespace_id: namespace_id), class: 'gl-button btn-default btn import_fogbugz js-import-project-btn', data: { platform: 'fogbugz', **tracking_attrs_data(track_label, 'click_button', 'fogbugz') } do - .gl-button-icon - = sprite_icon('bug') + = render Pajamas::ButtonComponent.new(href: new_import_fogbugz_path(namespace_id: namespace_id), icon: 'bug', button_options: { class: 'import_fogbugz js-import-project-btn', data: { platform: 'fogbugz', **tracking_attrs_data(track_label, 'click_button', 'fogbugz') } }) do FogBugz - if gitea_import_enabled? @@ -60,24 +47,20 @@ - if git_import_enabled? %div - %button.gl-button.btn-default.btn.btn-svg.js-toggle-button.js-import-git-toggle-button.js-import-project-btn{ type: "button", data: { platform: 'repo_url', toggle_open_class: 'active', **tracking_attrs_data(track_label, 'click_button', 'repo_url') } } - .gl-button-icon - = sprite_icon('link', css_class: 'gl-icon') + = render Pajamas::ButtonComponent.new(icon: 'link', button_options: { class: 'js-toggle-button js-import-git-toggle-button js-import-project-btn', data: { platform: 'repo_url', toggle_open_class: 'active', **tracking_attrs_data(track_label, 'click_button', 'repo_url') } }) do = _('Repository by URL') - if manifest_import_enabled? %div - = link_to new_import_manifest_path(namespace_id: namespace_id), class: 'gl-button btn-default btn import_manifest js-import-project-btn', data: { platform: 'manifest_file', **tracking_attrs_data(track_label, 'click_button', 'manifest_file') } do - .gl-button-icon - = sprite_icon('doc-text') - Manifest file + = render Pajamas::ButtonComponent.new(href: new_import_manifest_path(namespace_id: namespace_id), icon: 'doc-text', button_options: { class: 'import_manifest js-import-project-btn', data: { platform: 'manifest_file', **tracking_attrs_data(track_label, 'click_button', 'manifest_file') } }) do + = _('Manifest file') - if phabricator_import_enabled? %div - = link_to new_import_phabricator_path(namespace_id: namespace_id), class: 'gl-button btn-default btn import_phabricator js-import-project-btn', data: { platform: 'phabricator', track_label: "#{track_label}", track_action: "click_button", track_property: "phabricator" } do - .gl-button-icon - = custom_icon('issues') - = _("Phabricator Tasks") + = render Pajamas::ButtonComponent.new(href: new_import_phabricator_path(namespace_id: namespace_id), icon: 'issues', button_options: { class: 'import_phabricator js-import-project-btn', data: { platform: 'phabricator', track_label: "#{track_label}", track_action: "click_button", track_property: "phabricator" } }) do + = _('Phabricator tasks') + + = render_if_exists "projects/gitee_import_button", namespace_id: namespace_id, track_label: track_label .js-toggle-content.toggle-import-form{ class: ('hide' if active_tab != 'import') } diff --git a/app/views/projects/_last_push.html.haml b/app/views/projects/_last_push.html.haml index 859f065377d..5b493772f0a 100644 --- a/app/views/projects/_last_push.html.haml +++ b/app/views/projects/_last_push.html.haml @@ -16,5 +16,5 @@ - if create_mr_button_from_event?(event) = c.actions do - = render Pajamas::ButtonComponent.new(variant: :confirm, href: create_mr_path_from_push_event(event), button_options: { class: 'qa-create-merge-request' }) do + = render Pajamas::ButtonComponent.new(variant: :confirm, href: create_mr_path_from_push_event(event), button_options: { data: { qa_selector: 'create_merge_request_button' }}) do = _('Create merge request') 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 3345b3043b8..8c12399fdbb 100644 --- a/app/views/projects/_merge_request_merge_checks_settings.html.haml +++ b/app/views/projects/_merge_request_merge_checks_settings.html.haml @@ -12,6 +12,7 @@ s_('ProjectSettings|Skipped pipelines are considered successful'), help_text: s_('ProjectSettings|Introduces the risk of merging changes that do not pass the pipeline.'), checkbox_options: { class: 'gl-pl-6' } + = render_if_exists 'projects/merge_request_merge_checks_status_checks', form: form, project: @project = form.gitlab_ui_checkbox_component :only_allow_merge_if_all_discussions_are_resolved, s_('ProjectSettings|All threads must be resolved'), checkbox_options: { data: { qa_selector: 'allow_merge_if_all_discussions_are_resolved_checkbox' } } diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml index e3aa2d8afc9..93fc8d12960 100644 --- a/app/views/projects/_transfer.html.haml +++ b/app/views/projects/_transfer.html.haml @@ -3,7 +3,7 @@ - hidden_input_id = "new_namespace_id" - initial_data = { button_text: s_('ProjectSettings|Transfer project'), confirm_danger_message: transfer_project_message(@project), phrase: @project.name, target_form_id: form_id, target_hidden_input_id: hidden_input_id, project_id: @project.id } -.sub-section +.sub-section{ data: { qa_selector: 'transfer_project_content' } } %h4.danger-title= _('Transfer project') = form_for @project, url: transfer_project_path(@project), method: :put, html: { class: 'js-project-transfer-form', id: form_id } do |f| .form-group @@ -20,5 +20,4 @@ %li= _('You will need to update your local repositories to point to the new location.') %li= _('Project visibility level will be changed to match namespace rules when transferring to a group.') = hidden_field_tag(hidden_input_id) - = label_tag :new_namespace_id, _('Select a new namespace'), class: 'gl-font-weight-bold' .js-transfer-project-form{ data: initial_data } diff --git a/app/views/projects/_visibility_modal.html.haml b/app/views/projects/_visibility_modal.html.haml deleted file mode 100644 index e8a4e091dcf..00000000000 --- a/app/views/projects/_visibility_modal.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -- strong_start = "<strong>".html_safe -- strong_end = "</strong>".html_safe - -.modal.js-confirm-project-visiblity{ tabindex: -1 } - .modal-dialog - .modal-content - .modal-header - %h1.page-title.gl-font-size-h-display= _('Reduce this project’s visibility?') - %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') } - %span{ "aria-hidden": "true" }= sprite_icon("close") - .modal-body - %p - - if @project.group - = _("You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end} in %{strong_start}%{group_name}%{strong_end}.").html_safe % { project_name: @project.name, group_name: @project.group.name, strong_start: strong_start, strong_end: strong_end } - - else - = _("You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end}.").html_safe % { project_name: @project.name, strong_start: strong_start, strong_end: strong_end } - %p - = _('Once you confirm and press "Reduce project visibility":') - %ul - %li - = _("Current forks will keep their visibility level.").html_safe - %label{ for: "confirm_path_input" } - = _("To confirm, type %{phrase_code}").html_safe % { phrase_code: '<code class="js-legacy-confirm-danger-match">%{phrase_name}</code>'.html_safe % { phrase_name: @project.full_path } } - .form-group - = text_field_tag 'confirm_path_input', '', class: 'form-control js-legacy-confirm-danger-input' - .form-actions - %button.btn.gl-button.btn-default.gl-mr-4{ type: "button", "data-dismiss": "modal" } - = _('Cancel') - = submit_tag _('Reduce project visibility'), class: "btn gl-button btn-danger js-legacy-confirm-danger-submit", disabled: true diff --git a/app/views/projects/artifacts/_artifact.html.haml b/app/views/projects/artifacts/_artifact.html.haml deleted file mode 100644 index 9e548582396..00000000000 --- a/app/views/projects/artifacts/_artifact.html.haml +++ /dev/null @@ -1,61 +0,0 @@ -.gl-responsive-table-row.px-md-3 - .table-section.section-25.section-wrap.commit - .table-mobile-header{ role: 'rowheader' }= _('Job') - .table-mobile-content - .branch-commit.cgray - - if can?(current_user, :read_build, @project) - = link_to project_job_path(@project, artifact.job) do - %span.build-link ##{artifact.job_id} - - else - %span.build-link ##{artifact.job_id} - - - if artifact.job.ref - .icon-container.gl-display-inline-block{ "aria-label" => artifact.job.tag? ? _('Tag') : _('Branch') } - = artifact.job.tag? ? sprite_icon('tag', css_class: 'sprite') : sprite_icon('branch', css_class: 'sprite') - = link_to artifact.job.ref, project_ref_path(@project, artifact.job.ref), class: 'ref-name' - - else - .light= _('none') - .icon-container.commit-icon{ "aria-label" => _('Commit') } - = sprite_icon('commit') - - - if artifact.job.sha - = link_to artifact.job.short_sha, project_commit_path(@project, artifact.job.sha), class: 'commit-sha mr-0' - - .table-section.section-15.section-wrap - .table-mobile-header{ role: 'rowheader' }= _('Name') - .table-mobile-content - = artifact.job.name - - .table-section.section-20 - .table-mobile-header{ role: 'rowheader' }= _('Creation date') - .table-mobile-content - %p.finished-at - = sprite_icon("calendar") - %span= time_ago_with_tooltip(artifact.created_at) - - .table-section.section-20 - .table-mobile-header{ role: 'rowheader' }= _('Expiration date') - .table-mobile-content - - if artifact.expire_at - %p.finished-at - = sprite_icon("calendar") - %span= time_ago_with_tooltip(artifact.expire_at) - - .table-section.section-10 - .table-mobile-header{ role: 'rowheader' }= _('Size') - .table-mobile-content - = number_to_human_size(artifact.size, precision: 2) - - .table-section.table-button-footer.section-10 - .table-action-buttons - .btn-group - - if can?(current_user, :read_build, @project) - = link_to download_project_job_artifacts_path(@project, artifact.job), rel: 'nofollow', download: '', title: _('Download artifacts'), data: { placement: 'top', container: 'body' }, ref: 'tooltip', aria: { label: _('Download artifacts') }, class: 'gl-button btn btn-default btn-icon has-tooltip' do - = sprite_icon('download', css_class: 'gl-icon') - - = link_to browse_project_job_artifacts_path(@project, artifact.job), rel: 'nofollow', title: _('Browse artifacts'), data: { placement: 'top', container: 'body' }, ref: 'tooltip', aria: { label: _('Browse artifacts') }, class: 'gl-button btn btn-default btn-icon has-tooltip' do - = sprite_icon('folder-open', css_class: 'gl-icon') - - - if can?(current_user, :destroy_artifacts, @project) - = link_to project_artifact_path(@project, artifact), data: { placement: 'top', container: 'body', confirm: _('Are you sure you want to delete these artifacts?'), confirm_btn_variant: "danger" }, method: :delete, title: _('Delete artifacts'), ref: 'tooltip', aria: { label: _('Delete artifacts') }, class: 'gl-button btn btn-danger btn-icon has-tooltip' do - = sprite_icon('remove', css_class: 'gl-icon') diff --git a/app/views/projects/artifacts/_table.html.haml b/app/views/projects/artifacts/_table.html.haml deleted file mode 100644 index 1963449d704..00000000000 --- a/app/views/projects/artifacts/_table.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -- if artifacts.blank? - .nothing-here-block= _('No jobs to show') -- else - .table-holder - .ci-table - .gl-responsive-table-row.table-row-header.px-md-3{ role: 'row' } - .table-section.section-25{ role: 'rowheader' }= _('Job') - .table-section.section-15{ role: 'rowheader' }= _('Name') - .table-section.section-20{ role: 'rowheader' }= _('Creation date') - .table-section.section-20{ role: 'rowheader' }= _('Expiration date') - .table-section.section-10{ role: 'rowheader' }= _('Size') - .table-section.section-10{ role: 'rowheader' } - - = render partial: 'artifact', collection: artifacts, as: :artifact - - = paginate artifacts, theme: "gitlab", total_pages: @total_pages diff --git a/app/views/projects/artifacts/index.html.haml b/app/views/projects/artifacts/index.html.haml index 1ab3e8e67d8..9cbc149177c 100644 --- a/app/views/projects/artifacts/index.html.haml +++ b/app/views/projects/artifacts/index.html.haml @@ -1,10 +1,9 @@ -- @no_container = true - page_title _('Artifacts') %div{ class: container_class } - .top-area.py-3 - .align-self-center - = _('Total artifacts size: %{total_size}') % { total_size: number_to_human_size(@total_size, precicion: 2) } - - .content-list.builds-content-list - = render "table", artifacts: @artifacts, project: @project + %h1.page-title.gl-font-size-h-display.gl-mb-0 + = s_('Artifacts|Artifacts') + .gl-mb-6 + %strong= s_('Artifacts|Total artifacts size') + = number_to_human_size(@total_size, precicion: 2) + #js-artifact-management{ data: { "project-path" => @project.full_path } } diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 9fd542e0cfb..17d5ef69b76 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -13,7 +13,7 @@ #js-code-owners{ data: { blob_path: blob.path, project_path: @project.full_path, branch: @ref } } = render "projects/blob/auxiliary_viewer", blob: blob -#blob-content-holder.blob-content-holder +#blob-content-holder.blob-content-holder.js-per-page{ data: { blame_per_page: Projects::BlameService::PER_PAGE } } - if @code_navigation_path #js-code-navigation{ data: { code_navigation_path: @code_navigation_path, blob_path: blob.path, definition_path_prefix: project_blob_path(@project, @ref) } } - if !expanded diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index bd08ab67cd3..a907e175443 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -16,7 +16,7 @@ - if current_action?(:new) || current_action?(:create) %span.float-left.gl-mr-3 \/ - = text_field_tag 'file_name', params[:file_name], placeholder: "File name", + = text_field_tag 'file_name', params[:file_name], placeholder: "File name", data: { qa_selector: 'file_name_field' }, required: true, class: 'form-control gl-form-input new-file-name js-file-path-name-input', value: params[:file_name] || (should_suggest_gitlab_ci_yml? ? '.gitlab-ci.yml' : '') = render 'template_selectors' - if should_suggest_gitlab_ci_yml? @@ -38,7 +38,7 @@ .file-editor.code - if Feature.enabled?(:source_editor_toolbar, current_user) #editor-toolbar - .js-edit-mode-pane.qa-editor#editor{ data: { 'editor-loading': true, qa_selector: 'source_editor_preview_container' } }< + .js-edit-mode-pane#editor{ data: { 'editor-loading': true, qa_selector: 'source_editor_preview_container' } }< %pre.editor-loading-content= params[:content] || local_assigns[:blob_data] - if local_assigns[:path] .js-edit-mode-pane#preview.hide diff --git a/app/views/projects/blob/viewers/_loading.html.haml b/app/views/projects/blob/viewers/_loading.html.haml index 9cb934da7c0..d8efaf9ad95 100644 --- a/app/views/projects/blob/viewers/_loading.html.haml +++ b/app/views/projects/blob/viewers/_loading.html.haml @@ -1 +1 @@ -= gl_loading_icon(size: "md", css_class: "qa-spinner gl-my-4") += gl_loading_icon(size: "md", css_class: "gl-my-4", data: { qa_selector: 'spinner_placeholder' }) diff --git a/app/views/projects/branch_defaults/_branch_names_fields.html.haml b/app/views/projects/branch_defaults/_branch_names_fields.html.haml new file mode 100644 index 00000000000..65f975fbd9e --- /dev/null +++ b/app/views/projects/branch_defaults/_branch_names_fields.html.haml @@ -0,0 +1,14 @@ +- if @project.project_feature.issues_access_level > 0 + %fieldset#branch-names-settings + .form-group + = f.label :issue_branch_template, _('Branch name template'), class: 'label-bold' + %p= s_('ProjectSettings|Branches created from issues follow this pattern.') + + .form-group + .gl-mb-2 + = f.text_field :issue_branch_template, class: 'form-control gl-mb-2', placeholder: "%{id}-%{title}" + %p.form-text.text-muted + = s_('ProjectSettings|Leave empty to use default template.') + = sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Issue::MAX_BRANCH_TEMPLATE }) + - branch_name_help_link = help_page_path('user/project/repository/web_editor.md', anchor: 'create-a-new-branch-from-an-issue') + = link_to _('What variables can I use?'), branch_name_help_link, target: "_blank" diff --git a/app/views/projects/branch_defaults/_default_branch_fields.html.haml b/app/views/projects/branch_defaults/_default_branch_fields.html.haml new file mode 100644 index 00000000000..e4f51725f1a --- /dev/null +++ b/app/views/projects/branch_defaults/_default_branch_fields.html.haml @@ -0,0 +1,16 @@ +%fieldset#default-branch-settings + - if @project.empty_repo? + .text-secondary + = s_('ProjectSettings|A default branch cannot be chosen for an empty project.') + - else + .form-group + = f.label :default_branch, _("Default branch"), class: 'label-bold' + %p= s_('ProjectSettings|All merge requests and commits are made against this branch unless you specify a different one.') + .js-select-default-branch{ data: { default_branch: @project.default_branch, project_id: @project.id } } + + .form-group + - help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.") + - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer' + = f.gitlab_ui_checkbox_component :autoclose_referenced_issues, + s_('ProjectSettings|Auto-close referenced issues on default branch'), + help_text: (help_text + " " + help_icon).html_safe diff --git a/app/views/projects/branch_defaults/_show.html.haml b/app/views/projects/branch_defaults/_show.html.haml new file mode 100644 index 00000000000..4ecbc3b7fc8 --- /dev/null +++ b/app/views/projects/branch_defaults/_show.html.haml @@ -0,0 +1,17 @@ +- expanded = expanded_by_default? + +%section.settings.no-animate#branch-defaults-settings{ class: ('expanded' if expanded) } + .settings-header + %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Branch defaults') + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do + = expanded ? _('Collapse') : _('Expand') + %p + = s_('ProjectSettings|Select the default branch for this project, and configure the template for branch names.') + + .settings-content + - url = namespace_project_settings_repository_path(@project.namespace, @project) + = gitlab_ui_form_for @project, url: url, method: :put, html: { multipart: true, class: "issue-settings-form js-issue-settings-form" }, authenticity_token: true do |f| + %input{ name: 'update_section', type: 'hidden', value: 'js-issue-settings' } + = render 'projects/branch_defaults/default_branch_fields', f: f + = render 'projects/branch_defaults/branch_names_fields', f: f + = f.submit _('Save changes'), pajamas_button: true, data: { qa_selector: 'save_changes_button' } diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index 52b8d6bc66f..51c218f40b9 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -1,19 +1,19 @@ - merged = local_assigns.fetch(:merged, false) - commit = @repository.commit(branch.dereferenced_target) - merge_project = merge_request_source_project_for_project(@project) -%li{ class: "branch-item gl-display-flex! gl-align-items-center! js-branch-item js-branch-#{branch.name}", data: { name: branch.name } } +%li{ class: "branch-item gl-display-flex! gl-align-items-center! js-branch-item js-branch-#{branch.name}", data: { name: branch.name, qa_selector: 'branch_container', qa_name: branch.name } } .branch-info .gl-display-flex.gl-align-items-center = sprite_icon('branch', size: 12, css_class: 'gl-flex-shrink-0') - = link_to project_tree_path(@project, branch.name), class: 'item-title str-truncated-100 ref-name gl-ml-3 qa-branch-name' do + = link_to project_tree_path(@project, branch.name), class: 'item-title str-truncated-100 ref-name gl-ml-3', data: { qa_selector: 'branch_link' } do = branch.name = clipboard_button(text: branch.name, title: _("Copy branch name")) - if branch.name == @repository.root_ref - = gl_badge_tag s_('DefaultBranchLabel|default'), { variant: :info, size: :sm }, { class: 'gl-ml-2' } + = gl_badge_tag s_('DefaultBranchLabel|default'), { variant: :info, size: :sm }, { class: 'gl-ml-2', data: { qa_selector: 'badge_content' } } - elsif merged - = gl_badge_tag s_('Branches|merged'), { variant: :info, size: :sm }, { class: 'gl-ml-2', title: s_('Branches|Merged into %{default_branch}') % { default_branch: @repository.root_ref }, data: { toggle: 'tooltip', container: 'body' } } + = gl_badge_tag s_('Branches|merged'), { variant: :info, size: :sm }, { class: 'gl-ml-2', title: s_('Branches|Merged into %{default_branch}') % { default_branch: @repository.root_ref }, data: { toggle: 'tooltip', container: 'body', qa_selector: 'badge_content' } } - if protected_branch?(@project, branch) - = gl_badge_tag s_('Branches|protected'), { variant: :success, size: :sm }, { class: 'gl-ml-2' } + = gl_badge_tag s_('Branches|protected'), { variant: :success, size: :sm }, { class: 'gl-ml-2', data: { qa_selector: 'badge_content' } } = render_if_exists 'projects/branches/diverged_from_upstream', branch: branch @@ -46,4 +46,5 @@ = render 'projects/buttons/download', project: @project, ref: branch.name, pipeline: @refs_pipelines[branch.name], class: 'gl-vertical-align-top' - = render 'projects/branches/delete_branch_modal_button', project: @project, branch: branch, merged: merged + - if can?(current_user, :push_code, @project) + = render 'projects/branches/delete_branch_modal_button', project: @project, branch: branch, merged: merged diff --git a/app/views/projects/branches/_panel.html.haml b/app/views/projects/branches/_panel.html.haml index 6ca5aaf061e..a1f93d21647 100644 --- a/app/views/projects/branches/_panel.html.haml +++ b/app/views/projects/branches/_panel.html.haml @@ -11,7 +11,7 @@ - c.header do = panel_title - c.body do - %ul.content-list.all-branches.qa-all-branches + %ul.content-list.all-branches{ data: { qa_selector: 'all_branches_container' } } - branches.first(overview_max_branches).each do |branch| = render "projects/branches/branch", branch: branch, merged: project.repository.merged_to_root_ref?(branch), commit_status: @branch_pipeline_statuses[branch.name], show_commit_status: @branch_pipeline_statuses.any? - if branches.size > overview_max_branches diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index 295b2de9bd2..475bc9e1c20 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -1,3 +1,4 @@ +- add_page_specific_style 'page_bundles/branches' - page_title _('Branches') - add_to_breadcrumbs(_('Repository'), project_tree_path(@project)) @@ -6,21 +7,16 @@ = gl_tab_link_to s_('Branches|Overview'), project_branches_path(@project), { item_active: @mode == 'overview', title: s_('Branches|Show overview of the branches') } = gl_tab_link_to s_('Branches|Active'), project_branches_filtered_path(@project, state: 'active'), { title: s_('Branches|Show active branches') } = gl_tab_link_to s_('Branches|Stale'), project_branches_filtered_path(@project, state: 'stale'), { title: s_('Branches|Show stale branches') } - = gl_tab_link_to s_('Branches|All'), project_branches_filtered_path(@project, state: 'all'), { item_active: !%w[overview active stale].include?(@mode), title: s_('Branches|Show all branches') } + = gl_tab_link_to s_('Branches|All'), project_branches_filtered_path(@project, state: 'all'), { item_active: %w[overview active stale].exclude?(@mode), title: s_('Branches|Show all branches') } .nav-controls #js-branches-sort-dropdown{ data: { project_branches_filtered_path: project_branches_path(@project, state: 'all'), sort_options: branches_sort_options_hash.to_json, mode: @mode } } - if can? current_user, :push_code, @project - = link_to project_merged_branches_path(@project), - class: 'gl-button btn btn-danger btn-danger-secondary has-tooltip qa-delete-merged-branches', - title: s_("Branches|Delete all branches that are merged into '%{default_branch}'") % { default_branch: @project.repository.root_ref }, - method: :delete, - aria: { label: s_('Branches|Delete merged branches') }, - data: { confirm: s_('Branches|Deleting the merged branches cannot be undone. Are you sure?'), - confirm_btn_variant: 'danger', - container: 'body' } do - = s_('Branches|Delete merged branches') + .js-delete-merged-branches{ data: { + default_branch: @project.repository.root_ref, + form_path: project_merged_branches_path(@project) } + } = link_to new_project_branch_path(@project), class: 'gl-button btn btn-confirm' do = s_('Branches|New branch') diff --git a/app/views/projects/buttons/_download.html.haml b/app/views/projects/buttons/_download.html.haml index 2d32e07d379..23dcb7f41e1 100644 --- a/app/views/projects/buttons/_download.html.haml +++ b/app/views/projects/buttons/_download.html.haml @@ -1,3 +1,5 @@ +- project = local_assigns.fetch(:project) +- ref = local_assigns.fetch(:ref) - pipeline = local_assigns.fetch(:pipeline) { project.latest_successful_pipeline_for(ref) } - if !project.empty_repo? && can?(current_user, :download_code, project) diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index 23572d1d6ac..6e202063900 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -30,7 +30,7 @@ = preserve(markdown_field(@commit, :description)) .info-well.js-commit-box-info{ 'data-commit-path' => branches_project_commit_path(@project, @commit.id) } - .well-segment.branch-info + .well-segment .icon-container.commit-icon = custom_icon("icon_commit") %span.cgray= n_('parent', 'parents', @commit.parents.count) diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index bf6b628dd36..b5481f19352 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -34,8 +34,8 @@ · = commit.short_id - if commit.description? && collapsible - %button.gl-button.btn.btn-default.button-ellipsis-horizontal.btn-sm.gl-ml-2.text-expander.js-toggle-button{ data: { toggle: 'tooltip', container: 'body' }, :title => _("Toggle commit description"), aria: { label: _("Toggle commit description") } } - = sprite_icon('ellipsis_h', size: 12) + = render Pajamas::ButtonComponent.new(icon: 'ellipsis_h', + button_options: { class: 'button-ellipsis-horizontal text-expander js-toggle-button', data: { toggle: 'tooltip', container: 'body' }, :title => _("Toggle commit description"), aria: { label: _("Toggle commit description") }}) .committer - commit_author_link = commit_author_link(commit, avatar: false, size: 24) diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index bb3a38d6ac8..b5ecc9b0193 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -33,16 +33,15 @@ - else = render partial: 'projects/commits/commit', collection: context_commits, locals: { project: project, ref: ref, merge_request: merge_request } -- if hidden > 0 +- if hidden > 0 && !@merge_request %li = render Pajamas::AlertComponent.new(variant: :warning, dismissible: false) do |c| = c.body do = n_('%s additional commit has been omitted to prevent performance issues.', '%s additional commits have been omitted to prevent performance issues.', hidden) % number_with_delimiter(hidden) -- if can_update_merge_request && context_commits&.empty? - = render Pajamas::ButtonComponent.new(button_options: { class: 'gl-mt-5 add-review-item-modal-trigger', data: { context_commits_empty: 'true' } }) do - = _('Add previously merged commits') +- if can_update_merge_request && context_commits&.empty? && !(defined?(@next_page) && @next_page) + .add-review-item-modal-trigger{ data: { context_commits_empty: 'true' } } - if commits.size == 0 && context_commits.nil? .commits-empty.gl-mt-6 diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml deleted file mode 100644 index 04712cd59f7..00000000000 --- a/app/views/projects/default_branch/_show.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -- expanded = expanded_by_default? - -%section.settings.no-animate#default-branch-settings{ class: ('expanded' if expanded) } - .settings-header - %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Default branch') - = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do - = expanded ? _('Collapse') : _('Expand') - %p - = _('Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one.') - - .settings-content - = gitlab_ui_form_for @project, remote: true, html: { multipart: true, anchor: 'default-branch-settings' }, authenticity_token: true do |f| - %fieldset - - if @project.empty_repo? - .text-secondary - = _('A default branch cannot be chosen for an empty project.') - - else - .form-group - = f.label :default_branch, _("Default branch"), class: 'label-bold' - .js-select-default-branch{ data: { default_branch: @project.default_branch, project_id: @project.id } } - - .form-group - - help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.") - - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer' - = f.gitlab_ui_checkbox_component :autoclose_referenced_issues, - _("Auto-close referenced issues on default branch"), - help_text: (help_text + " " + help_icon).html_safe - - = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index c0fe143020a..e1c8992a28c 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -1,4 +1,4 @@ -- if can?(current_user, :create_deployment, deployment) +- if can?(current_user, :read_deployment, deployment) - actions = deployment.manual_actions - if actions.present? .btn-group @@ -8,7 +8,7 @@ = sprite_icon('chevron-down') %ul.dropdown-menu.dropdown-menu-right - actions.each do |action| - - next unless can?(current_user, :update_build, action) + - next unless can?(current_user, :play_job, action) %li = link_to [:play, @project, action], method: :post, rel: 'nofollow' do %span= action.name diff --git a/app/views/projects/deployments/_rollback.haml b/app/views/projects/deployments/_rollback.haml index 223f7520b47..e50fa1fa0f7 100644 --- a/app/views/projects/deployments/_rollback.haml +++ b/app/views/projects/deployments/_rollback.haml @@ -1,4 +1,4 @@ -- if deployment.deployable && can?(current_user, :create_deployment, deployment) +- if deployment.deployable && can?(current_user, :play_job, deployment.deployable) - tooltip = deployment.last? ? s_('Environments|Re-deploy to environment') : s_('Environments|Rollback environment') - icon = deployment.last? ? 'repeat' : 'redo' = render Pajamas::ButtonComponent.new(icon: icon, button_options: { title: tooltip, class: 'js-confirm-rollback-modal-button has-tooltip', data: { environment_name: @environment.name, commit_short_sha: deployment.short_sha, commit_url: project_commit_path(@project, deployment.sha), is_last_deployment: deployment.last?.to_s, retry_path: retry_project_job_path(@environment.project, deployment.deployable) } }) diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 6f2e135f9d3..43159a759f4 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -3,8 +3,6 @@ - escaped_default_branch_name = default_branch_name.shellescape - @skip_current_level_breadcrumb = true -= render_if_exists 'projects/free_user_cap_alert', project: @project - = render partial: 'flash_messages', locals: { project: @project } = render 'clusters_deprecation_alert' @@ -20,7 +18,7 @@ %p = _('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-buttons{ data: { qa_selector: 'quick_actions_container' } } .project-clone-holder.d-block.d-md-none.gl-mt-3.gl-mr-3 = render "shared/mobile_clone_panel" diff --git a/app/views/projects/hooks/edit.html.haml b/app/views/projects/hooks/edit.html.haml index ca71990f5e3..3e63faaf448 100644 --- a/app/views/projects/hooks/edit.html.haml +++ b/app/views/projects/hooks/edit.html.haml @@ -9,7 +9,7 @@ = render 'shared/web_hooks/title_and_docs', hook: @hook .col-lg-9.gl-mb-3 - = gitlab_ui_form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook) do |f| + = gitlab_ui_form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook), html: { class: 'js-webhook-form' } do |f| = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook } = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml index 0476193c2cb..15cb7869dc5 100644 --- a/app/views/projects/hooks/index.html.haml +++ b/app/views/projects/hooks/index.html.haml @@ -7,8 +7,8 @@ = render 'shared/web_hooks/title_and_docs', hook: @hook .col-lg-8.gl-mb-3 - = gitlab_ui_form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]) do |f| + = gitlab_ui_form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]), html: { class: 'js-webhook-form' } do |f| = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook } - = f.submit 'Add webhook', pajamas_button: true + = f.submit _('Add webhook'), pajamas_button: true, data: { qa_selector: "create_webhook_button" } = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class diff --git a/app/views/projects/incidents/show.html.haml b/app/views/projects/incidents/show.html.haml index 7a1e7f503f8..6d733dc46df 100644 --- a/app/views/projects/incidents/show.html.haml +++ b/app/views/projects/incidents/show.html.haml @@ -2,6 +2,7 @@ - add_to_breadcrumbs _("Incidents"), project_incidents_path(@project) - breadcrumb_title @issue.to_reference - page_title "#{@issue.title} (#{@issue.to_reference})", _("Incidents") +- add_page_specific_style 'page_bundles/design_management' - add_page_specific_style 'page_bundles/incidents' - add_page_specific_style 'page_bundles/issues_show' diff --git a/app/views/projects/issues/_related_issues.html.haml b/app/views/projects/issues/_related_issues.html.haml index 1c252958525..80f2b8b189c 100644 --- a/app/views/projects/issues/_related_issues.html.haml +++ b/app/views/projects/issues/_related_issues.html.haml @@ -4,4 +4,5 @@ full_path: @project.full_path, has_issue_weights_feature: @project.licensed_feature_available?(:issue_weights).to_s, help_path: help_page_path('user/project/issues/related_issues'), - show_categorized_issues: @project.licensed_feature_available?(:blocked_issues).to_s } } + show_categorized_issues: @project.licensed_feature_available?(:blocked_issues).to_s, + has_iterations_feature: @project.licensed_feature_available?(:iterations).to_s } } diff --git a/app/views/projects/issues/_work_item_links.html.haml b/app/views/projects/issues/_work_item_links.html.haml index c0de711136a..72f9ec2ff16 100644 --- a/app/views/projects/issues/_work_item_links.html.haml +++ b/app/views/projects/issues/_work_item_links.html.haml @@ -1,2 +1 @@ -- if Feature.enabled?(:work_items_hierarchy, @project) - .js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid, project_namespace: @project.namespace.path, project_path: @project.full_path, wi: work_items_index_data(@project) } } +.js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid, project_path: @project.full_path, wi: work_items_index_data(@project) } } diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 76b725d140c..a8edf87b696 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -2,6 +2,7 @@ - add_to_breadcrumbs _("Issues"), project_issues_path(@project) - breadcrumb_title @issue.to_reference - page_title "#{@issue.title} (#{@issue.to_reference})", _("Issues") +- add_page_specific_style 'page_bundles/design_management' - add_page_specific_style 'page_bundles/incidents' - add_page_specific_style 'page_bundles/issues_show' - add_page_specific_style 'page_bundles/work_items' diff --git a/app/views/projects/merge_requests/_awards_block.html.haml b/app/views/projects/merge_requests/_awards_block.html.haml index 820927fdd1a..c1952793e72 100644 --- a/app/views/projects/merge_requests/_awards_block.html.haml +++ b/app/views/projects/merge_requests/_awards_block.html.haml @@ -1,2 +1,2 @@ -.content-block.emoji-block.emoji-list-container.js-noteable-awards +.emoji-block.emoji-list-container.js-noteable-awards = render 'award_emoji/awards_block', awardable: @merge_request, inline: true, api_awards_path: award_emoji_merge_request_api_path(@merge_request) diff --git a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml index 478db70877d..78fce3f7087 100644 --- a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml +++ b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml @@ -1,7 +1,7 @@ - display_issuable_type = issuable_display_type(@merge_request) -.float-left.btn-group.gl-md-ml-3.gl-display-flex.dropdown.gl-new-dropdown.gl-md-w-auto.gl-w-full - = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret has-tooltip gl-display-none! gl-md-display-inline-flex!", data: { toggle: 'dropdown', title: _('Merge request actions'), testid: 'merge-request-actions' } do +.btn-group.gl-md-ml-3.gl-display-flex.dropdown.gl-new-dropdown.gl-md-w-auto.gl-w-full + = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret has-tooltip gl-display-none! gl-md-display-inline-flex!", data: { toggle: 'dropdown', title: _('Merge request actions'), testid: 'merge-request-actions', 'aria-label': _('Merge request actions') } do = sprite_icon "ellipsis_v", size: 16, css_class: "dropdown-icon gl-icon" = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md btn-block gl-button gl-dropdown-toggle gl-md-display-none!", data: { 'toggle' => 'dropdown' } do %span.gl-new-dropdown-button-text= _('Merge request actions') @@ -11,7 +11,7 @@ .gl-new-dropdown-contents %ul - if current_user && moved_mr_sidebar_enabled? - %li.gl-new-dropdown-item.js-sidebar-subscriptions-entry-point + %li.gl-new-dropdown-item.js-sidebar-subscriptions-widget-root %li.gl-new-dropdown-divider %hr.dropdown-divider - if can?(current_user, :update_merge_request, @merge_request) @@ -36,7 +36,7 @@ = _('Reopen') = display_issuable_type - if moved_mr_sidebar_enabled? - %li.gl-new-dropdown-item#js-lock-entry-point + %li.gl-new-dropdown-item.js-sidebar-lock-root %li.gl-new-dropdown-item %button.dropdown-item.js-copy-reference{ type: "button", data: { 'clipboard-text': @merge_request.to_reference(full: true) } } .gl-new-dropdown-item-text-wrapper diff --git a/app/views/projects/merge_requests/_code_dropdown.html.haml b/app/views/projects/merge_requests/_code_dropdown.html.haml index bb42c3067d9..5c7fe56095c 100644 --- a/app/views/projects/merge_requests/_code_dropdown.html.haml +++ b/app/views/projects/merge_requests/_code_dropdown.html.haml @@ -1,4 +1,4 @@ -.float-left.gl-md-ml-3.dropdown.gl-new-dropdown{ class: "gl-display-none! gl-md-display-flex!" } +.gl-md-ml-3.dropdown.gl-new-dropdown{ class: "gl-display-none! gl-md-display-flex!" } #js-check-out-modal{ data: how_merge_modal_data(@merge_request) } = button_tag type: 'button', class: "btn dropdown-toggle btn-confirm gl-button gl-dropdown-toggle", data: { toggle: 'dropdown', qa_selector: 'mr_code_dropdown' } do %span.gl-new-dropdown-button-text= _('Code') @@ -16,12 +16,12 @@ = _('Check out branch') - if current_user %li.gl-new-dropdown-item - = link_to ide_merge_request_path(@merge_request), class: 'dropdown-item', data: { qa_selector: 'open_in_web_ide_button' } do + = link_to ide_merge_request_path(@merge_request), class: 'dropdown-item', target: '_blank', data: { qa_selector: 'open_in_web_ide_button' } do .gl-new-dropdown-item-text-wrapper = _('Open in Web IDE') - if Gitlab::CurrentSettings.gitpod_enabled && current_user&.gitpod_enabled %li.gl-new-dropdown-item - = link_to "#{Gitlab::CurrentSettings.gitpod_url}##{merge_request_url(@merge_request)}", class: 'dropdown-item' do + = link_to "#{Gitlab::CurrentSettings.gitpod_url}##{merge_request_url(@merge_request)}", target: '_blank', class: 'dropdown-item' do .gl-new-dropdown-item-text-wrapper = _('Open in Gitpod') %li.gl-new-dropdown-divider diff --git a/app/views/projects/merge_requests/_commits.html.haml b/app/views/projects/merge_requests/_commits.html.haml index 7cadc37b0fd..ee0ab984d6f 100644 --- a/app/views/projects/merge_requests/_commits.html.haml +++ b/app/views/projects/merge_requests/_commits.html.haml @@ -13,6 +13,9 @@ - else %ol#commits-list.list-unstyled = render "projects/commits/commits", merge_request: @merge_request + - if @next_page && @merge_request + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-load-more-commits', data: { next_page: @next_page } }) do + = _('Load more') -- if can_update_merge_request && @merge_request.iid +- if can_update_merge_request && @merge_request.iid && !@next_page .add-review-item-modal-wrapper{ data: { context_commits_path: context_commits_project_json_merge_request_url(@merge_request&.project, @merge_request, :json), target_branch: @merge_request.target_branch, merge_request_iid: @merge_request.iid, project_id: @merge_request.project.id } } diff --git a/app/views/projects/merge_requests/_mr_box.html.haml b/app/views/projects/merge_requests/_mr_box.html.haml index 4fc405c63ff..901a2ebfd1e 100644 --- a/app/views/projects/merge_requests/_mr_box.html.haml +++ b/app/views/projects/merge_requests/_mr_box.html.haml @@ -1,3 +1,3 @@ -.detail-page-description.py-2{ class: "#{'is-merge-request' if moved_mr_sidebar_enabled? && !fluid_layout}" } +.detail-page-description.py-2.gl-display-flex.gl-align-items-center.gl-flex-wrap{ class: "#{'is-merge-request' if moved_mr_sidebar_enabled? && !fluid_layout}" } = render 'shared/issuable/status_box', issuable: @merge_request = merge_request_header(@project, @merge_request) diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml index 893f03157db..a73d2aa5cc4 100644 --- a/app/views/projects/merge_requests/_mr_title.html.haml +++ b/app/views/projects/merge_requests/_mr_title.html.haml @@ -25,9 +25,9 @@ - display_class = moved_mr_sidebar_enabled? ? 'gl-md-display-none!' : 'gl-sm-display-none!' = render Pajamas::ButtonComponent.new(icon: "chevron-double-lg-left", button_options: { class: "btn-icon float-right gl-display-block gutter-toggle issuable-gutter-toggle js-sidebar-toggle #{display_class}" }) - .detail-page-header-actions.gl-align-self-start.is-merge-request.js-issuable-actions + .detail-page-header-actions.gl-align-self-start.is-merge-request.js-issuable-actions.gl-display-flex - if can_update_merge_request - = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "gl-display-none gl-md-display-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" } + = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "gl-display-none gl-md-display-block btn gl-button btn-default js-issuable-edit", data: { qa_selector: "edit_button" } - if @merge_request.source_project = render 'projects/merge_requests/code_dropdown' diff --git a/app/views/projects/merge_requests/creations/_new_submit.html.haml b/app/views/projects/merge_requests/creations/_new_submit.html.haml index ef3174efcc7..1246c45a529 100644 --- a/app/views/projects/merge_requests/creations/_new_submit.html.haml +++ b/app/views/projects/merge_requests/creations/_new_submit.html.haml @@ -14,7 +14,7 @@ - if @commits.empty? .commits-empty %h4 - There are no commits yet. + = _("There are no commits yet.") = custom_icon ('illustration_no_commits') - else .merge-request-tabs-holder{ class: ("js-tabs-affix" unless ENV['RAILS_ENV'] == 'test') } @@ -25,16 +25,16 @@ %ul.merge-request-tabs.nav.nav-tabs.nav-links.no-top.no-bottom.gl-display-flex.gl-flex-nowrap.gl-m-0.gl-p-0.js-tabs-affix %li.commits-tab.new-tab = link_to url_for(safe_params), data: {target: 'div#commits', action: 'new', toggle: 'tabvue'} do - Commits + = _("Commits") = gl_badge_tag @total_commit_count, { size: :sm }, { class: 'gl-tab-counter-badge' } - if @pipelines.any? %li.builds-tab = link_to url_for(safe_params.merge(action: 'pipelines')), data: {target: 'div#pipelines', action: 'pipelines', toggle: 'tabvue'} do - Pipelines + = _("Pipelines") = gl_badge_tag @pipelines.size, { size: :sm }, { class: 'gl-tab-counter-badge' } %li.diffs-tab = link_to url_for(safe_params.merge(action: 'diffs')), data: {target: 'div#diffs', action: 'diffs', toggle: 'tabvue', qa_selector: 'diffs_tab'} do - Changes + = _("Changes") = gl_badge_tag @merge_request.diff_size, { size: :sm }, { class: 'gl-tab-counter-badge' } #diff-notes-app.tab-content diff --git a/app/views/projects/merge_requests/dropdowns/_branch.html.haml b/app/views/projects/merge_requests/dropdowns/_branch.html.haml index a60c445aa51..d6af8b2f5a5 100644 --- a/app/views/projects/merge_requests/dropdowns/_branch.html.haml +++ b/app/views/projects/merge_requests/dropdowns/_branch.html.haml @@ -1,5 +1,5 @@ %ul - branches.each do |branch| %li - %a{ href: '#', class: "#{('is-active' if selected == branch)}", title: branch, data: { id: branch } } + %a{ href: '#', class: "#{'is-active' if selected == branch}", title: branch, data: { id: branch } } = branch diff --git a/app/views/projects/merge_requests/dropdowns/_project.html.haml b/app/views/projects/merge_requests/dropdowns/_project.html.haml index b3cf3c1d369..41c0b0ab55b 100644 --- a/app/views/projects/merge_requests/dropdowns/_project.html.haml +++ b/app/views/projects/merge_requests/dropdowns/_project.html.haml @@ -1,5 +1,5 @@ %ul - projects.each do |project| %li - %a{ href: "#", class: "#{('is-active' if selected == project.id)}", data: { id: project.id, 'refs-url': refs_project_path(project) } } + %a{ href: "#", class: "#{'is-active' if selected == project.id}", data: { id: project.id, 'refs-url': refs_project_path(project) } } = project.full_path diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml index d77d5231a7d..203724fc1f1 100644 --- a/app/views/projects/merge_requests/show.html.haml +++ b/app/views/projects/merge_requests/show.html.haml @@ -8,12 +8,15 @@ - page_card_attributes @merge_request.card_attributes - suggest_changes_help_path = help_page_path('user/project/merge_requests/reviews/suggestions.md') - mr_action = j(params[:tab].presence || 'show') +- add_page_specific_style 'page_bundles/design_management' - add_page_specific_style 'page_bundles/merge_requests' - add_page_specific_style 'page_bundles/pipelines' - add_page_specific_style 'page_bundles/reports' - add_page_specific_style 'page_bundles/ci_status' - add_page_startup_api_call @endpoint_metadata_url +- if mr_action == 'diffs' + - add_page_startup_api_call @endpoint_diff_batch_url .merge-request{ data: { mr_action: mr_action, url: merge_request_path(@merge_request, format: :json), project_path: project_path(@merge_request.project), lock_version: @merge_request.lock_version } } - if moved_mr_sidebar_enabled? @@ -47,7 +50,7 @@ #js-vue-discussion-counter{ data: { blocks_merge: @project.only_allow_merge_if_all_discussions_are_resolved?.to_s } } - if moved_mr_sidebar_enabled? - if !!@issuable_sidebar.dig(:current_user, :id) - .js-issuable-todo{ data: { project_path: @issuable_sidebar[:project_full_path], iid: @issuable_sidebar[:iid], id: @issuable_sidebar[:id] } } + .js-sidebar-todo-widget-root{ data: { project_path: @issuable_sidebar[:project_full_path], iid: @issuable_sidebar[:iid], id: @issuable_sidebar[:id] } } .gl-ml-auto.gl-align-items-center.gl-display-none.gl-md-display-flex.gl-ml-3.js-expand-sidebar{ class: "gl-lg-display-none!" } = render Pajamas::ButtonComponent.new(icon: 'chevron-double-lg-left', button_options: { class: 'js-sidebar-toggle' }) do diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index fb7c1130f5c..cdb8a63bca9 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -25,8 +25,8 @@ .form-actions - if @milestone.new_record? - = f.submit _('Create milestone'), class: 'gl-button btn-confirm btn', data: { qa_selector: 'create_milestone_button' } + = f.submit _('Create milestone'), data: { qa_selector: 'create_milestone_button' }, pajamas_button: true = link_to _('Cancel'), project_milestones_path(@project), class: 'gl-button btn btn-default btn-cancel' - else - = f.submit _('Save changes'), class: 'gl-button btn-confirm btn' + = f.submit _('Save changes'), pajamas_button: true = link_to _('Cancel'), project_milestone_path(@project, @milestone), class: 'gl-button btn btn-default btn-cancel' diff --git a/app/views/projects/mirrors/_authentication_method.html.haml b/app/views/projects/mirrors/_authentication_method.html.haml index 4b549aaf1cd..54e1f1a8b20 100644 --- a/app/views/projects/mirrors/_authentication_method.html.haml +++ b/app/views/projects/mirrors/_authentication_method.html.haml @@ -5,10 +5,10 @@ = f.label :auth_method, _('Authentication method'), class: 'label-bold' = f.select :auth_method, options_for_select(auth_options, mirror.auth_method), - {}, { class: "custom-select gl-form-select js-mirror-auth-type qa-authentication-method" } + {}, { class: "custom-select gl-form-select js-mirror-auth-type", data: { qa_selector: 'authentication_method_field' } } = f.hidden_field :auth_method, value: "password", class: "js-hidden-mirror-auth-type" .form-group .well-password-auth.collapse.js-well-password-auth = f.label :password, _("Password"), class: "label-bold" - = f.password_field :password, class: 'form-control gl-form-input qa-password js-mirror-password-field', autocomplete: 'off' + = f.password_field :password, class: 'form-control gl-form-input js-mirror-password-field', autocomplete: 'off', data: { qa_selector: 'password_field' } diff --git a/app/views/projects/mirrors/_disabled_mirror_badge.html.haml b/app/views/projects/mirrors/_disabled_mirror_badge.html.haml index 86e54acecc4..1834627c705 100644 --- a/app/views/projects/mirrors/_disabled_mirror_badge.html.haml +++ b/app/views/projects/mirrors/_disabled_mirror_badge.html.haml @@ -1,2 +1,2 @@ -%span.qa-disabled-mirror-badge.rspec-disabled-mirror-badge{ data: { toggle: 'tooltip', html: 'true' }, title: _('Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them.') } +%span.rspec-disabled-mirror-badge{ data: { toggle: 'tooltip', html: 'true' }, title: _('Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them.') } = gl_badge_tag _('Disabled'), variant: :warning diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml index c98f88fa31e..f4e57450aa1 100644 --- a/app/views/projects/mirrors/_mirror_repos.html.haml +++ b/app/views/projects/mirrors/_mirror_repos.html.haml @@ -21,7 +21,7 @@ .form-group.has-feedback = label_tag :url, _('Git repository URL'), class: 'label-light' - = text_field_tag :url, nil, class: 'form-control gl-form-input js-mirror-url js-repo-url qa-mirror-repository-url-input', placeholder: _('Input the remote repository URL'), required: true, pattern: "(#{protocols}):\/\/.+", autocomplete: 'new-password' + = text_field_tag :url, nil, class: 'form-control gl-form-input js-mirror-url js-repo-url', placeholder: _('Input the remote repository URL'), required: true, pattern: "(#{protocols}):\/\/.+", autocomplete: 'new-password', data: { qa_selector: 'mirror_repository_url_field' } = render 'projects/mirrors/instructions' @@ -35,7 +35,7 @@ = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index.md', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer' .panel-footer - = f.submit _('Mirror repository'), class: 'js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror, pajamas_button: true + = f.submit _('Mirror repository'), class: 'js-mirror-submit', name: :update_remote_mirror, pajamas_button: true, data: { qa_selector: 'mirror_repository_button' } - else = render Pajamas::AlertComponent.new(dismissible: false) do |c| = c.body do diff --git a/app/views/projects/mirrors/_mirror_repos_form.html.haml b/app/views/projects/mirrors/_mirror_repos_form.html.haml index 34b7c75debf..1322e677d5a 100644 --- a/app/views/projects/mirrors/_mirror_repos_form.html.haml +++ b/app/views/projects/mirrors/_mirror_repos_form.html.haml @@ -1,7 +1,7 @@ .form-group = label_tag :mirror_direction, _('Mirror direction'), class: 'label-light' .select-wrapper - = select_tag :mirror_direction, options_for_select([[_('Push'), 'push']]), class: 'form-control gl-form-select select-control js-mirror-direction qa-mirror-direction', disabled: true + = select_tag :mirror_direction, options_for_select([[_('Push'), 'push']]), class: 'form-control gl-form-select select-control js-mirror-direction', disabled: true, data: { qa_selector: 'mirror_direction_field' } = sprite_icon('chevron-down', css_class: "gl-icon gl-absolute gl-top-3 gl-right-3 gl-text-gray-200") = render partial: "projects/mirrors/mirror_repos_push", locals: { f: f } diff --git a/app/views/projects/mirrors/_mirror_repos_list.html.haml b/app/views/projects/mirrors/_mirror_repos_list.html.haml index 2dbcbd659c8..fb8133e6de8 100644 --- a/app/views/projects/mirrors/_mirror_repos_list.html.haml +++ b/app/views/projects/mirrors/_mirror_repos_list.html.haml @@ -25,17 +25,17 @@ = render_if_exists 'projects/mirrors/table_pull_row' - @project.remote_mirrors.each_with_index do |mirror, index| - next if mirror.new_record? - %tr.rspec-mirrored-repository-row{ class: ('bg-secondary' if mirror.disabled?), data: { qa_selector: 'mirrored_repository_row' } } - %td{ data: { qa_selector: 'mirror_repository_url_cell' } }= mirror.safe_url || _('Invalid URL') + %tr.rspec-mirrored-repository-row{ class: ('bg-secondary' if mirror.disabled?), data: { qa_selector: 'mirrored_repository_row_container' } } + %td{ data: { qa_selector: 'mirror_repository_url_content' } }= mirror.safe_url || _('Invalid URL') %td= _('Push') %td = mirror.last_update_started_at.present? ? time_ago_with_tooltip(mirror.last_update_started_at) : _('Never') - %td{ data: { qa_selector: 'mirror_last_update_at_cell' } }= mirror.last_update_at.present? ? time_ago_with_tooltip(mirror.last_update_at) : _('Never') + %td{ data: { qa_selector: 'mirror_last_update_at_content' } }= mirror.last_update_at.present? ? time_ago_with_tooltip(mirror.last_update_at) : _('Never') %td - if mirror.disabled? = render 'projects/mirrors/disabled_mirror_badge' - if mirror.last_error.present? - = gl_badge_tag _('Error'), { variant: :danger }, { data: { toggle: 'tooltip', html: 'true', qa_selector: 'mirror_error_badge' }, title: html_escape(mirror.last_error.try(:strip)) } + = gl_badge_tag _('Error'), { variant: :danger }, { data: { toggle: 'tooltip', html: 'true', qa_selector: 'mirror_error_badge_content' }, title: html_escape(mirror.last_error.try(:strip)) } %td.gl-display-flex - if mirror_settings_enabled .btn-group.mirror-actions-group{ role: 'group' } @@ -44,4 +44,4 @@ = render 'shared/remote_mirror_update_button', remote_mirror: mirror = render Pajamas::ButtonComponent.new(variant: :danger, icon: 'remove', - button_options: { class: 'js-delete-mirror qa-delete-mirror rspec-delete-mirror', title: _('Remove'), data: { mirror_id: mirror.id, toggle: 'tooltip', container: 'body' } }) + button_options: { class: 'js-delete-mirror rspec-delete-mirror', title: _('Remove'), data: { mirror_id: mirror.id, toggle: 'tooltip', container: 'body' } }) diff --git a/app/views/projects/ml/experiments/_experiment.html.haml b/app/views/projects/ml/experiments/_experiment.html.haml new file mode 100644 index 00000000000..42823f47469 --- /dev/null +++ b/app/views/projects/ml/experiments/_experiment.html.haml @@ -0,0 +1,3 @@ +%li.ml-experiment-row.py-3 + = link_to project_ml_experiment_path(@project, experiment.iid), class: "title" do + = experiment.name diff --git a/app/views/projects/ml/experiments/_experiment_list.html.haml b/app/views/projects/ml/experiments/_experiment_list.html.haml new file mode 100644 index 00000000000..a25e814b2b5 --- /dev/null +++ b/app/views/projects/ml/experiments/_experiment_list.html.haml @@ -0,0 +1,7 @@ +- if experiments.blank? + .nothing-here-block= s_('MlExperimentsEmptyState|No Experiments to Show') +- else + .ml-experiments-list-holder + %ul.content-list + = render partial: 'experiment', collection: experiments, as: :experiment + = paginate_collection @experiments diff --git a/app/views/projects/ml/experiments/_incubation_banner.html.haml b/app/views/projects/ml/experiments/_incubation_banner.html.haml new file mode 100644 index 00000000000..e34f3fd2d2f --- /dev/null +++ b/app/views/projects/ml/experiments/_incubation_banner.html.haml @@ -0,0 +1,8 @@ += render Pajamas::AlertComponent.new(variant: :warning, + title: _('Machine Learning Experiment Tracking is in Incubating Phase'), + alert_options: { class: 'gl-my-3' }) do |c| + = c.body do + = _('GitLab incubates features to explore new use cases. These features are updated regularly, and support is limited') + = link_to _('Learn more.'), 'https://about.gitlab.com/handbook/engineering/incubation/', target: "_blank" + = c.actions do + = link_to _('Feedback and Updates'), 'https://gitlab.com/groups/gitlab-org/-/epics/8560', target: "_blank" diff --git a/app/views/projects/ml/experiments/index.html.haml b/app/views/projects/ml/experiments/index.html.haml new file mode 100644 index 00000000000..a84cb15d940 --- /dev/null +++ b/app/views/projects/ml/experiments/index.html.haml @@ -0,0 +1,11 @@ +- breadcrumb_title _('ML Experiments') +- page_title _('ML Experiments') + +.page-title-holder.d-flex.align-items-center + %h1.page-title.gl-font-size-h-display= _('Machine Learning Experiments') + += render "incubation_banner" + +%div{ class: container_class } + .content-list.builds-content-list + = render "experiment_list", experiments: @experiments, project: @project diff --git a/app/views/projects/ml/experiments/show.html.haml b/app/views/projects/ml/experiments/show.html.haml new file mode 100644 index 00000000000..2c350439762 --- /dev/null +++ b/app/views/projects/ml/experiments/show.html.haml @@ -0,0 +1,14 @@ +- add_to_breadcrumbs _("Experiments"), project_ml_experiments_path(@project) +- breadcrumb_title @experiment.name +- page_title @experiment.name +- items = candidates_table_items(@candidates) +- metrics = unique_logged_names(@candidates, &:latest_metrics) +- params = unique_logged_names(@candidates, &:params) + +.page-title-holder.d-flex.align-items-center + %h1.page-title.gl-font-size-h-display= @experiment.name + +#js-show-ml-experiment{ data: { + candidates: items, + metrics: metrics, + params: params } } diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml index b6700c9ed1e..2a3171e9fd8 100644 --- a/app/views/projects/network/show.html.haml +++ b/app/views/projects/network/show.html.haml @@ -6,8 +6,7 @@ .controls.gl-bg-gray-50.gl-p-2.gl-font-base.gl-text-gray-400.gl-border-b-1.gl-border-b-solid.gl-border-b-gray-300 = form_tag project_network_path(@project, @id), method: :get, class: 'form-inline network-form' do |f| = text_field_tag :extended_sha1, @options[:extended_sha1], placeholder: _("Git revision"), class: 'search-input form-control gl-form-input input-mx-250 search-sha gl-mr-2' - = button_tag class: 'btn gl-button btn-confirm btn-icon' do - = sprite_icon('search') + = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, icon: 'search') .inline.gl-ml-5 .form-check.light = check_box_tag :filter_ref, 1, @options[:filter_ref], class: 'form-check-input' diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml index a8a30d73000..e3f46d601a3 100644 --- a/app/views/projects/no_repo.html.haml +++ b/app/views/projects/no_repo.html.haml @@ -1,8 +1,6 @@ - page_title _('No repository') - @skip_current_level_breadcrumb = true -= render_if_exists 'projects/free_user_cap_alert', project: @project - %h2.gl-display-flex .gl-display-flex.gl-align-items-center.gl-justify-content-center = sprite_icon('warning-solid', size: 24, css_class: 'gl-mr-2') diff --git a/app/views/projects/notes/_actions.html.haml b/app/views/projects/notes/_actions.html.haml index 9a8b83649de..6b875ff904c 100644 --- a/app/views/projects/notes/_actions.html.haml +++ b/app/views/projects/notes/_actions.html.haml @@ -9,14 +9,16 @@ - if can?(current_user, :award_emoji, note) - if note.emoji_awardable? .note-actions-item - = button_tag title: 'Add reaction', class: "note-action-button note-emoji-button js-add-award js-note-emoji has-tooltip btn gl-button btn-icon btn-default-tertiary", data: { position: 'right', container: 'body' } do + = render Pajamas::ButtonComponent.new(category: :tertiary, + button_options: { title: _('Add reaction'), class: 'btn-icon note-action-button note-emoji-button js-add-award js-note-emoji has-tooltip', data: { position: 'right', container: 'body' }, 'aria-label': _('Add reaction') }) do = sprite_icon('slight-smile', css_class: 'award-control-icon-neutral gl-button-icon gl-icon') = sprite_icon('smiley', css_class: 'award-control-icon-positive gl-button-icon gl-icon gl-left-3!') = sprite_icon('smile', css_class: 'award-control-icon-super-positive gl-button-icon gl-icon gl-left-3! ') - if note_editable .note-actions-item.gl-ml-0 - = button_tag title: 'Edit comment', class: 'note-action-button js-note-edit has-tooltip btn gl-button btn-default-tertiary btn-icon', data: { container: 'body', qa_selector: 'edit_comment_button' } do - = sprite_icon('pencil', css_class: 'gl-button-icon gl-icon') + = render Pajamas::ButtonComponent.new(category: :tertiary, + icon: 'pencil', + button_options: { class: 'note-action-button js-note-edit has-tooltip', data: { container: 'body', qa_selector: 'edit_comment_button' }, title: _('Edit comment'), 'aria-label': _('Edit comment') }) = render 'projects/notes/more_actions_dropdown', note: note, note_editable: note_editable diff --git a/app/views/projects/pipeline_schedules/_form.html.haml b/app/views/projects/pipeline_schedules/_form.html.haml index ab692d1830a..235b89b8c5b 100644 --- a/app/views/projects/pipeline_schedules/_form.html.haml +++ b/app/views/projects/pipeline_schedules/_form.html.haml @@ -9,10 +9,10 @@ = f.label :cron, _('Interval Pattern'), class: 'label-bold' #interval-pattern-input{ data: { initial_interval: @schedule.cron, daily_limit: @schedule.daily_limit } } .form-group.row - .col-md-9 - = f.label :cron_timezone, _('Cron Timezone'), class: 'label-bold' - = dropdown_tag(_("Select a timezone"), options: { toggle_class: 'gl-button btn btn-default js-timezone-dropdown w-100', dropdown_class: 'w-100', title: _("Select a timezone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } ) - = f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true + .col-md-9{ data: { testid: 'schedule-timezone' } } + = f.label :cron_timezone, _("Cron Timezone") + .js-timezone-dropdown{ data: { timezone_data: timezone_data.to_json, initial_value: @schedule.cron_timezone, name: 'schedule[cron_timezone]' } } + .form-group.row .col-md-9 = f.label :ref, _('Target branch or tag'), class: 'label-bold' diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml index 2e403358e2e..30cc7f94311 100644 --- a/app/views/projects/pipelines/_info.html.haml +++ b/app/views/projects/pipelines/_info.html.haml @@ -1,9 +1,13 @@ -.commit-box - %h3.commit-title - = markdown(commit.title, pipeline: :single_line) - - if commit.description.present? - %pre.commit-description< - = preserve(markdown(commit.description, pipeline: :single_line)) +- if Feature.enabled?(:pipeline_name, @pipeline.project) && @pipeline.name + %h3 + = @pipeline.name +- else + .commit-box + %h3.commit-title + = markdown(commit.title, pipeline: :single_line) + - if commit.description.present? + %pre.commit-description< + = preserve(markdown(commit.description, pipeline: :single_line)) .info-well .well-segment.pipeline-info{ class: "gl-align-items-baseline!" } @@ -19,7 +23,7 @@ = s_("Pipelines|(queued for %{queued_duration})") % { queued_duration: time_interval_in_words(@pipeline.queued_duration)} - if has_pipeline_badges?(@pipeline) - .well-segment.qa-pipeline-badges + .well-segment .icon-container = sprite_icon('flag', css_class: 'gl-top-0!') - if @pipeline.schedule? @@ -45,11 +49,16 @@ - if @pipeline.stuck? = gl_badge_tag s_('Pipelines|stuck'), { variant: :warning, size: :sm }, { class: 'js-pipeline-url-stuck has-tooltip' } - .well-segment.branch-info + .well-segment{ 'data-testid': 'commit-row' } .icon-container.commit-icon = sprite_icon('commit', css_class: 'gl-top-0!') - = link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha" - = clipboard_button(text: @pipeline.sha, title: _("Copy commit SHA")) + - if Feature.enabled?(:pipeline_name, @pipeline.project) && @pipeline.name + = markdown(commit.title, pipeline: :single_line) + = clipboard_button(text: @pipeline.sha, title: _("Copy commit SHA")) + = link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha" + - else + = link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha" + = clipboard_button(text: @pipeline.sha, title: _("Copy commit SHA")) .well-segment.related-merge-request-info .icon-container diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml index c9eb2e92193..4531bb2d0a9 100644 --- a/app/views/projects/pipelines/show.html.haml +++ b/app/views/projects/pipelines/show.html.haml @@ -30,4 +30,4 @@ #js-pipeline-tabs{ data: js_pipeline_tabs_data(@project, @pipeline, @current_user) } - else = render "projects/pipelines/with_tabs", pipeline: @pipeline, stages: @stages, pipeline_has_errors: pipeline_has_errors -.js-pipeline-details-vue{ data: { metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: @project.namespace, project_id: @project, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, graphql_resource_etag: graphql_etag_pipeline_path(@pipeline) } } +.js-pipeline-details-vue{ data: { metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: @project.namespace, project_id: @project, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, graphql_resource_etag: graphql_etag_pipeline_path(@pipeline), pipeline_path: pipeline_path(@pipeline) } } diff --git a/app/views/projects/product_analytics/_graph.html.haml b/app/views/projects/product_analytics/_graph.html.haml deleted file mode 100644 index fd81a248005..00000000000 --- a/app/views/projects/product_analytics/_graph.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -- graph = local_assigns.fetch(:graph) - -%h3 - = graph[:id] - -.js-project-analytics-chart{ "data-chart-data": graph.to_json, "data-chart-id": graph[:id] } diff --git a/app/views/projects/product_analytics/_links.html.haml b/app/views/projects/product_analytics/_links.html.haml deleted file mode 100644 index 6e5667e2644..00000000000 --- a/app/views/projects/product_analytics/_links.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -= gl_tabs_nav({ class: 'mb-3'}) do - = gl_tab_link_to _('Events'), project_product_analytics_path(@project) - = gl_tab_link_to _('Graphs'), graphs_project_product_analytics_path(@project) - = gl_tab_link_to _('Test'), test_project_product_analytics_path(@project) - = gl_tab_link_to _('Setup'), setup_project_product_analytics_path(@project) diff --git a/app/views/projects/product_analytics/_tracker.html.erb b/app/views/projects/product_analytics/_tracker.html.erb deleted file mode 100644 index dbb96f19e22..00000000000 --- a/app/views/projects/product_analytics/_tracker.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[]; -p.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments) -};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1; -n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","<%= product_analytics_tracker_url -%>","snowplow<%= @random -%>")); -snowplow<%= @random -%>("newTracker", "sp", "<%= product_analytics_tracker_collector_url -%>", { - appId: "<%= @project_id -%>", - platform: "<%= @platform -%>", - eventMethod: "get" -}); -snowplow<%= @random -%>('trackPageView'); diff --git a/app/views/projects/product_analytics/graphs.html.haml b/app/views/projects/product_analytics/graphs.html.haml deleted file mode 100644 index c345561e6ce..00000000000 --- a/app/views/projects/product_analytics/graphs.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -- page_title _('Product Analytics') - -= render 'links' - -%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| - .col-md-6{ id: graph[:id] } - = render 'graph', graph: graph diff --git a/app/views/projects/product_analytics/index.html.haml b/app/views/projects/product_analytics/index.html.haml deleted file mode 100644 index 386f9265179..00000000000 --- a/app/views/projects/product_analytics/index.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -- page_title _('Product Analytics') - -= render 'links' - -- if @events.any? - %p - - if @events.total_count > @events.size - = _('Number of events for this project: %{total_count}.') % { total_count: number_with_delimiter(@events.total_count) } - %ol - - @events.each do |event| - %li - %code= event.as_json_wo_empty -- else - .empty-state - .text-content - = _('There are currently no events.') diff --git a/app/views/projects/product_analytics/setup.html.haml b/app/views/projects/product_analytics/setup.html.haml deleted file mode 100644 index e1819c7d74b..00000000000 --- a/app/views/projects/product_analytics/setup.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -- page_title _('Product Analytics') - -= render 'links' - -%p - = _('Copy the code below to implement tracking in your application:') - -%pre - = render "tracker" - -%p.hint - = _('A platform value can be web, mob or app.') diff --git a/app/views/projects/product_analytics/test.html.haml b/app/views/projects/product_analytics/test.html.haml deleted file mode 100644 index 3204cd5fbbe..00000000000 --- a/app/views/projects/product_analytics/test.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -- page_title _('Product Analytics') - -= render 'links' - -%p - = _('This page sends a payload. Go back to the events page to see a newly created event.') - -- if @event - %p - = _('Last item before this page loaded in your browser:') - - %code - = @event.as_json_wo_empty - --# haml-lint:disable InlineJavaScript -:javascript - #{render 'tracker'} diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml index 34305d15eff..c7818602f52 100644 --- a/app/views/projects/project_members/index.html.haml +++ b/app/views/projects/project_members/index.html.haml @@ -1,7 +1,6 @@ - add_page_specific_style 'page_bundles/members' - page_title _("Members") -= render_if_exists 'projects/free_user_cap_alert', project: @project = render_if_exists 'shared/ultimate_feature_removal_banner', project: @project .row.gl-mt-3 diff --git a/app/views/projects/protected_branches/shared/_dropdown.html.haml b/app/views/projects/protected_branches/shared/_dropdown.html.haml index d5111bd8be5..c5dbf8991cd 100644 --- a/app/views/projects/protected_branches/shared/_dropdown.html.haml +++ b/app/views/projects/protected_branches/shared/_dropdown.html.haml @@ -3,14 +3,16 @@ = f.hidden_field(:name) = dropdown_tag(_('Select branch or create wildcard'), - options: { toggle_class: "js-protected-branch-select js-filter-submit wide monospace qa-protected-branch-select #{toggle_classes}", + options: { toggle_class: "js-protected-branch-select js-filter-submit wide monospace #{toggle_classes}", filter: true, - dropdown_class: "dropdown-menu-selectable git-revision-dropdown qa-protected-branch-dropdown", + dropdown_class: "dropdown-menu-selectable git-revision-dropdown", + dropdown_qa_selector: "protected_branch_dropdown_content", placeholder: _("Search protected branches"), footer_content: true, data: { show_no: true, show_any: true, show_upcoming: true, selected: params[:protected_branch_name], - project_id: @project.try(:id) } }) do + project_id: @project.try(:id), + qa_selector: "protected_branch_dropdown" } }) do %ul.dropdown-footer-list %li diff --git a/app/views/projects/protected_branches/shared/_index.html.haml b/app/views/projects/protected_branches/shared/_index.html.haml index 1d60791eae2..c204508d355 100644 --- a/app/views/projects/protected_branches/shared/_index.html.haml +++ b/app/views/projects/protected_branches/shared/_index.html.haml @@ -4,7 +4,7 @@ .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only = s_("ProtectedBranch|Protected branches") - = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle qa-expand-protected-branches' }) do + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do = expanded ? _('Collapse') : _('Expand') %p = s_("ProtectedBranch|Keep stable branches secure and force developers to use merge requests.") diff --git a/app/views/projects/protected_tags/shared/_dropdown.html.haml b/app/views/projects/protected_tags/shared/_dropdown.html.haml index 9c7f532fa29..9d5d649bc40 100644 --- a/app/views/projects/protected_tags/shared/_dropdown.html.haml +++ b/app/views/projects/protected_tags/shared/_dropdown.html.haml @@ -1,8 +1,8 @@ = f.hidden_field(:name) -= dropdown_tag('Select tag or create wildcard', += dropdown_tag(s_('ProtectedBranch|Select tag or create wildcard'), options: { toggle_class: 'js-protected-tag-select js-filter-submit wide monospace', - filter: true, dropdown_class: "dropdown-menu-selectable capitalize-header git-revision-dropdown", placeholder: "Search protected tags", + filter: true, dropdown_class: "dropdown-menu-selectable capitalize-header git-revision-dropdown", placeholder: s_("ProtectedBranch|Search protected tags"), footer_content: true, data: { show_no: true, show_any: true, show_upcoming: true, selected: params[:protected_tag_name], @@ -10,6 +10,6 @@ %ul.dropdown-footer-list %li - %button{ class: "dropdown-create-new-item-button js-dropdown-create-new-item", title: "New Protected Tag" } - Create wildcard + %button{ class: "dropdown-create-new-item-button js-dropdown-create-new-item", title: s_("ProtectedBranch|New Protected Tag") } + = s_('ProtectedBranch|Create wildcard') %code diff --git a/app/views/projects/protected_tags/shared/_tags_list.html.haml b/app/views/projects/protected_tags/shared/_tags_list.html.haml index 5f3ea281278..0a85a353e27 100644 --- a/app/views/projects/protected_tags/shared/_tags_list.html.haml +++ b/app/views/projects/protected_tags/shared/_tags_list.html.haml @@ -1,9 +1,9 @@ .protected-tags-list.js-protected-tags-list - if @protected_tags.empty? .card-header - Protected tags (0) + = s_('ProtectedBranch|Protected tags (%{tags_count})') % { tags_count: 0 } %p.settings-message.text-center - No tags are protected. + = s_('ProtectedBranch|No tags are protected.') - else - can_admin_project = can?(current_user, :admin_project, @project) @@ -16,9 +16,12 @@ %col %thead %tr - %th Protected tags (#{@protected_tags_count}) - %th Last commit - %th Allowed to create + %th + = s_('ProtectedBranch|Protected tags (%{tags_count})') % { tags_count: @protected_tags_count } + %th + = s_('ProtectedBranch|Last commit') + %th + = s_('ProtectedBranch|Allowed to create') - if can_admin_project %th %tbody diff --git a/app/views/projects/settings/_archive.html.haml b/app/views/projects/settings/_archive.html.haml index 2f97a068b49..70e14eadaf9 100644 --- a/app/views/projects/settings/_archive.html.haml +++ b/app/views/projects/settings/_archive.html.haml @@ -1,6 +1,6 @@ - return unless can?(current_user, :archive_project, @project) -.sub-section{ data: { qa_selector: 'archive_project_content' } } +.sub-section %h4.warning-title - if @project.archived? = _('Unarchive project') diff --git a/app/views/projects/settings/access_tokens/index.html.haml b/app/views/projects/settings/access_tokens/index.html.haml index 9f598ffb2d1..f6c5c4e2950 100644 --- a/app/views/projects/settings/access_tokens/index.html.haml +++ b/app/views/projects/settings/access_tokens/index.html.haml @@ -40,5 +40,5 @@ description_prefix: :project_access_token, help_path: help_page_path('user/project/settings/project_access_tokens', anchor: 'scopes-for-a-project-access-token') - #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_resource_access_tokens.to_json, no_active_tokens_message: _('This project has no active access tokens.'), show_role: true + #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json, no_active_tokens_message: _('This project has no active access tokens.'), show_role: true } } diff --git a/app/views/projects/settings/branch_rules/index.html.haml b/app/views/projects/settings/branch_rules/index.html.haml index a7e80101a88..571a992a552 100644 --- a/app/views/projects/settings/branch_rules/index.html.haml +++ b/app/views/projects/settings/branch_rules/index.html.haml @@ -3,4 +3,4 @@ %h3.gl-mb-5= s_('BranchRules|Branch rules details') -#js-branch-rules{ data: { project_path: @project.full_path, protected_branches_path: project_settings_repository_path(@project, anchor: 'js-protected-branches-settings'), approval_rules_path: project_settings_merge_requests_path(@project, anchor: 'js-merge-request-approval-settings') } } +#js-branch-rules{ data: { project_path: @project.full_path, protected_branches_path: project_settings_repository_path(@project, anchor: 'js-protected-branches-settings'), approval_rules_path: project_settings_merge_requests_path(@project, anchor: 'js-merge-request-approval-settings'), status_checks_path: project_settings_merge_requests_path(@project, anchor: 'js-merge-request-settings') } } diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml index 51d28411b30..68dc7f2be8d 100644 --- a/app/views/projects/settings/ci_cd/_form.html.haml +++ b/app/views/projects/settings/ci_cd/_form.html.haml @@ -1,6 +1,6 @@ - help_link_public_pipelines = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank', rel: 'noopener noreferrer' - help_link_auto_canceling = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer' -- help_link_skip_outdated = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer' +- help_link_skip_outdated = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'prevent-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer' - help_link_separated_caches = link_to sprite_icon('question-o'), help_page_path('ci/caching/index', anchor: 'cache-key-names'), target: '_blank', rel: 'noopener noreferrer' .row.gl-mt-3 @@ -22,8 +22,8 @@ .form-group = f.fields_for :ci_cd_settings_attributes, @project.ci_cd_settings do |form| - = form.gitlab_ui_checkbox_component :forward_deployment_enabled, _("Skip outdated deployment jobs"), - help_text: (_('When a deployment job is successful, skip older deployment jobs that are still pending.') + ' ' + help_link_skip_outdated).html_safe + = form.gitlab_ui_checkbox_component :forward_deployment_enabled, _("Prevent outdated deployment jobs"), + help_text: (_('When a deployment job is successful, prevent older deployment jobs that are still pending.') + ' ' + help_link_skip_outdated).html_safe .form-group = f.gitlab_ui_checkbox_component :ci_separated_caches, diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml index c4f589f3f91..1b35de85145 100644 --- a/app/views/projects/settings/ci_cd/show.html.haml +++ b/app/views/projects/settings/ci_cd/show.html.haml @@ -57,7 +57,7 @@ .settings-content #js-artifacts-settings-app{ data: { full_path: @project.full_path, help_page_path: help_page_path('ci/pipelines/job_artifacts', anchor: 'keep-artifacts-from-most-recent-successful-jobs') } } -%section.qa-variables-settings.settings.no-animate#js-cicd-variables-settings{ class: ('expanded' if expanded), data: { qa_selector: 'variables_settings_content' } } +%section.settings.no-animate#js-cicd-variables-settings{ class: ('expanded' if expanded), data: { qa_selector: 'variables_settings_content' } } .settings-header = render 'ci/variables/header', expanded: expanded .settings-content diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml index 500cfdcb62b..306ce47cee7 100644 --- a/app/views/projects/settings/repository/show.html.haml +++ b/app/views/projects/settings/repository/show.html.haml @@ -3,7 +3,7 @@ - @content_class = "limit-container-width" unless fluid_layout - deploy_token_description = s_('DeployTokens|Deploy tokens allow access to packages, your repository, and registry images.') -= render "projects/default_branch/show" += render "projects/branch_defaults/show" - if Feature.enabled?(:branch_rules, @project) = render "projects/branch_rules/show" = render_if_exists "projects/push_rules/index" diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index c7ac28fa194..77c44b792ab 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -7,7 +7,6 @@ = content_for :meta_tags do = auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity") -= render_if_exists 'projects/free_user_cap_alert', project: @project = render_if_exists 'shared/ultimate_feature_removal_banner', project: @project = render partial: 'flash_messages', locals: { project: @project } = render 'clusters_deprecation_alert' diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml index ddebc19be15..58e86ebffa0 100644 --- a/app/views/projects/snippets/show.html.haml +++ b/app/views/projects/snippets/show.html.haml @@ -3,9 +3,9 @@ - breadcrumb_title @snippet.to_reference - page_title "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets") -#js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet), 'can-report-spam': @snippet.submittable_as_spam_by?(current_user).to_s } } +#js-snippet-view{ data: { 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet), 'can-report-spam': @snippet.submittable_as_spam_by?(current_user).to_s } } -.row-content-block.top-block.content-component-block.gl-px-0.gl-py-2 +.gl-px-0.gl-py-2 = render 'award_emoji/awards_block', awardable: @snippet, inline: true, api_awards_path: project_snippets_award_api_path(@snippet) #notes.limited-width-notes= render "shared/notes/notes_with_form", :autocomplete => true diff --git a/app/views/projects/triggers/_form.html.haml b/app/views/projects/triggers/_form.html.haml index 9043b8e60fc..b6b24a0c26a 100644 --- a/app/views/projects/triggers/_form.html.haml +++ b/app/views/projects/triggers/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @trigger], html: { class: 'gl-show-field-errors' } do |f| += gitlab_ui_form_for [@project, @trigger], html: { class: 'gl-show-field-errors' } do |f| = form_errors(@trigger) - if @trigger.token @@ -8,4 +8,4 @@ .form-group = f.label :key, "Description", class: "label-bold" = f.text_field :description, class: 'form-control gl-form-input', required: true, title: 'Trigger description is required.', placeholder: "Trigger description" - = f.submit btn_text, class: "gl-button btn btn-confirm" + = f.submit btn_text, pajamas_button: true |