summaryrefslogtreecommitdiff
path: root/app/views/projects/issues/show.html.haml
blob: c762b044c3ee1c116ddc5088c5980810faa09a35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
- @content_class = "limit-container-width" unless fluid_layout
- add_to_breadcrumbs _("Issues"), project_issues_path(@project)
- breadcrumb_title @issue.to_reference
- page_title           "#{@issue.title} (#{@issue.to_reference})", _("Issues")
- page_description     @issue.description
- page_card_attributes @issue.card_attributes

- can_update_issue = can?(current_user, :update_issue, @issue)
- can_reopen_issue = can?(current_user, :reopen_issue, @issue)
- can_report_spam = @issue.submittable_as_spam_by?(current_user)
- can_create_issue = show_new_issue_link?(@project)
- related_branches_path = related_branches_project_issue_path(@project, @issue)

= render_if_exists "projects/issues/alert_blocked", issue: @issue, current_user: current_user
= render "projects/issues/alert_moved_from_service_desk", issue: @issue

.detail-page-header
  .detail-page-header-body
    .issuable-status-box.status-box.status-box-issue-closed{ class: issue_status_visibility(@issue, status_box: :closed) }
      = sprite_icon('mobile-issue-close', css_class: 'd-block d-sm-none')
      .d-none.d-sm-block
        = issue_closed_text(@issue, current_user)
    .issuable-status-box.status-box.status-box-open{ class: issue_status_visibility(@issue, status_box: :open) }
      = sprite_icon('issue-open-m', css_class: 'd-block d-sm-none')
      %span.d-none.d-sm-block Open

    .issuable-meta
      #js-issuable-header-warnings
      = issuable_meta(@issue, @project, "Issue")

    %a.btn.btn-default.float-right.d-block.d-sm-none.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ href: "#" }
      = sprite_icon('chevron-double-lg-left')

  .detail-page-header-actions.js-issuable-actions.js-issuable-buttons{ data: { "action": "close-reopen" } }
    .clearfix.issue-btn-group.dropdown
      %button.btn.btn-default.float-left.d-md-none.d-lg-none.d-xl-none{ type: "button", data: { toggle: "dropdown" } }
        Options
        = icon('caret-down')
      .dropdown-menu.dropdown-menu-right.d-lg-none.d-xl-none
        %ul
          - unless current_user == @issue.author
            %li= link_to 'Report abuse', new_abuse_report_path(user_id: @issue.author.id, ref_url: issue_url(@issue))
          - if can_update_issue
            %li= link_to 'Close issue', issue_path(@issue, issue: { state_event: :close }, format: 'json'), class: "btn-close js-btn-issue-action #{issue_button_visibility(@issue, true)}", title: 'Close issue'
          - if can_reopen_issue
            %li= link_to 'Reopen issue', issue_path(@issue, issue: { state_event: :reopen }, format: 'json'), class: "btn-reopen js-btn-issue-action #{issue_button_visibility(@issue, false)}", title: 'Reopen issue'
          - if can_report_spam
            %li= link_to 'Submit as spam', mark_as_spam_project_issue_path(@project, @issue), method: :post, class: 'btn-spam', title: 'Submit as spam'
          - if can_create_issue
            - if can_update_issue || can_report_spam
              %li.divider
            %li= link_to 'New issue', new_project_issue_path(@project), id: 'new_issue_link'

    = render 'shared/issuable/close_reopen_button', issuable: @issue, can_update: can_update_issue, can_reopen: can_reopen_issue, warn_before_close: defined?(@issue.blocked?) && @issue.blocked?

    - if can_report_spam
      = link_to 'Submit as spam', mark_as_spam_project_issue_path(@project, @issue), method: :post, class: 'd-none d-sm-none d-md-block btn btn-grouped btn-spam', title: 'Submit as spam'
    - if can_create_issue
      = link_to new_project_issue_path(@project), class: 'd-none d-sm-none d-md-block btn btn-grouped btn-success btn-inverted', title: 'New issue', id: 'new_issue_link' do
        New issue

.issue-details.issuable-details
  .detail-page-description.content-block
    -# haml-lint:disable InlineJavaScript
    %script#js-issuable-app-initial-data{ type: "application/json" }= issuable_initial_data(@issue).to_json
    #js-issuable-app
      .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)
          %textarea.hidden.js-task-list-field= @issue.description

      = edited_time_ago_with_tooltip(@issue, placement: 'bottom', html_class: 'issue-edited-ago js-issue-edited-ago')

    - if @issue.sentry_issue.present?
      #js-sentry-error-stack-trace{ data: error_details_data(@project, @issue.sentry_issue.sentry_issue_identifier) }

    = render 'projects/issues/design_management'

    = render_if_exists 'projects/issues/related_issues'

    #js-related-merge-requests{ data: { endpoint: expose_path(api_v4_projects_issues_related_merge_requests_path(id: @project.id, issue_iid: @issue.iid)), project_namespace: @project.namespace.path, project_path: @project.path } }

    - if can?(current_user, :download_code, @project)
      - add_page_startup_api_call related_branches_path
      #related-branches{ data: { url: related_branches_path } }
        -# This element is filled in using JavaScript.

  .content-block.emoji-block.emoji-block-sticky
    .row.gl-m-0.gl-justify-content-space-between
      .js-noteable-awards
        = render 'award_emoji/awards_block', awardable: @issue, inline: true
      .new-branch-col
        #js-vue-sort-issue-discussions
        #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?

  = render 'projects/issues/discussion'

= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @issue.assignees