summaryrefslogtreecommitdiff
path: root/app/views/dashboard/todos/index.html.haml
blob: 52e41946ed154001a58576c71ba9d8aa6fe00248 (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
- @hide_top_links = true
- page_title _("To-Do List")
- header_title _("To-Do List"), dashboard_todos_path

= render_dashboard_ultimate_trial(current_user)
- add_page_specific_style 'page_bundles/todos'

.page-title-holder.d-flex.align-items-center
  %h1.page-title= _('To-Do List')

- if current_user.todos.any?
  .top-area
    %ul.nav-links.mobile-separator.nav.nav-tabs
      %li.todos-pending{ class: active_when(params[:state].blank? || params[:state] == 'pending') }>
        = link_to todos_filter_path(state: 'pending') do
          %span
            To Do
          %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm
            = number_with_delimiter(todos_pending_count)
      %li.todos-done{ class: active_when(params[:state] == 'done') }>
        = link_to todos_filter_path(state: 'done') do
          %span
            Done
          %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm
            = number_with_delimiter(todos_done_count)

    .nav-controls
      - if @todos.any?(&:pending?)
        .gl-mr-3
          = link_to destroy_all_dashboard_todos_path(todos_filter_params), class: 'gl-button btn btn-default btn-loading align-items-center js-todos-mark-all', method: :delete, data: { href: destroy_all_dashboard_todos_path(todos_filter_params) } do
            Mark all as done
            %span.gl-spinner.ml-1
          = link_to bulk_restore_dashboard_todos_path, class: 'gl-button btn btn-default btn-loading align-items-center js-todos-undo-all hidden', method: :patch , data: { href: bulk_restore_dashboard_todos_path(todos_filter_params) } do
            Undo mark all as done
            %span.gl-spinner.ml-1

  .todos-filters
    .issues-details-filters.row-content-block.second-block
      = form_tag todos_filter_path(without: [:project_id, :author_id, :type, :action_id]), method: :get, class: 'filter-form gl-display-flex gl-flex-direction-column gl-sm-flex-direction-row' do
        .filter-categories.gl-display-flex.gl-flex-direction-column.gl-md-flex-direction-row.gl-flex-fill-1.gl-flex-wrap.gl-mx-n2
          .filter-item.gl-m-2
            - if params[:group_id].present?
              = hidden_field_tag(:group_id, params[:group_id])
            = dropdown_tag(group_dropdown_label(params[:group_id], 'Group'), options: { toggle_class: 'js-group-search js-filter-submit gl-xs-w-full!', title: 'Filter by group', filter: true, filterInput: 'input#group-search', dropdown_class: 'dropdown-menu-selectable dropdown-menu-group js-filter-submit',
              placeholder: 'Search groups', data: { default_label: 'Group', display: 'static' } })
          .filter-item.gl-m-2
            - if params[:project_id].present?
              = hidden_field_tag(:project_id, params[:project_id])
            = dropdown_tag(project_dropdown_label(params[:project_id], 'Project'), options: { toggle_class: 'js-project-search js-filter-submit gl-xs-w-full!', title: 'Filter by project', filter: true, filterInput: 'input#project-search', dropdown_class: 'dropdown-menu-selectable dropdown-menu-project js-filter-submit',
              placeholder: 'Search projects', data: { default_label: 'Project', display: 'static' } })
          .filter-item.gl-m-2
            - if params[:author_id].present?
              = hidden_field_tag(:author_id, params[:author_id])
            = dropdown_tag(user_dropdown_label(params[:author_id], 'Author'), options: { toggle_class: 'js-user-search js-filter-submit js-author-search gl-xs-w-full!', title: 'Filter by author', filter: true, filterInput: 'input#author-search', dropdown_class: 'dropdown-menu-user dropdown-menu-selectable dropdown-menu-author js-filter-submit',
              placeholder: 'Search authors', data: { any_user: 'Any Author', first_user: (current_user.username if current_user), project_id: (@project.id if @project), selected: params[:author_id], field_name: 'author_id', default_label: 'Author', todo_filter: true, todo_state_filter: params[:state] || 'pending' } })
          .filter-item.gl-m-2
            - if params[:type].present?
              = hidden_field_tag(:type, params[:type])
            = dropdown_tag(todo_types_dropdown_label(params[:type], 'Type'), options: { toggle_class: 'js-type-search js-filter-submit gl-xs-w-full!', dropdown_class: 'dropdown-menu-selectable dropdown-menu-type js-filter-submit',
              data: { data: todo_types_options, default_label: 'Type' } })
          .filter-item.actions-filter.gl-m-2
            - if params[:action_id].present?
              = hidden_field_tag(:action_id, params[:action_id])
            = dropdown_tag(todo_actions_dropdown_label(params[:action_id], 'Action'), options: { toggle_class: 'js-action-search js-filter-submit gl-xs-w-full!', dropdown_class: 'dropdown-menu-selectable dropdown-menu-action js-filter-submit',
              data: { data: todo_actions_options, default_label: 'Action' } })
        .filter-item.sort-filter.gl-mt-3.gl-sm-mt-0.gl-mb-0.gl-sm-mb-0
          .dropdown
            %button.dropdown-menu-toggle.dropdown-menu-toggle-sort{ type: 'button', class: 'gl-xs-w-full!', 'data-toggle' => 'dropdown' }
              %span.light
              - if @sort.present?
                = sort_options_hash[@sort]
              - else
                = sort_title_recently_created
              = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
            %ul.dropdown-menu.dropdown-menu-sort.dropdown-menu-right
              %li
                = link_to todos_filter_path(sort: sort_value_label_priority) do
                  = sort_title_label_priority
                = link_to todos_filter_path(sort: sort_value_recently_created) do
                  = sort_title_recently_created
                = link_to todos_filter_path(sort: sort_value_oldest_created) do
                  = sort_title_oldest_created

.row.js-todos-all
  - if @todos.any?
    .col.js-todos-list-container{ data: { qa_selector: "todos_list_container" } }
      .js-todos-options{ data: { per_page: @todos.limit_value, current_page: @todos.current_page, total_pages: @todos.total_pages } }
        %ul.content-list.todos-list
          = render @todos
      = paginate @todos, theme: "gitlab"
    .js-nothing-here-container.empty-state.hidden
      .svg-content
        = image_tag 'illustrations/todos_all_done.svg'
      .text-content
        %h4.text-center
          You're all done!
  - elsif current_user.todos.any?
    .col.todos-all-done.empty-state
      .svg-content.svg-250
        = image_tag 'illustrations/todos_all_done.svg'
      .text-content
        - if todos_filter_empty?
          %h4.text-center
            = Gitlab.config.gitlab.no_todos_messages.sample
          %p
            Are you looking for things to do? Take a look at
            = succeed "," do
              %strong
                = link_to "open issues", issues_dashboard_path
            contribute to
            %strong
              = link_to "a merge request\,", merge_requests_dashboard_path
            or mention someone in a comment to automatically assign them a new to-do item.
        - else
          %h4.text-center
            Nothing is on your to-do list. Nice work!
  - else
    .col.empty-state
      .svg-content
        = image_tag 'illustrations/todos_empty.svg'
      .text-content
        %h4.text-center
          Your To-Do List shows what to work on next
        %p
          When an issue or merge request is assigned to you, or when you receive a
          %strong
            @mention
          in a comment, this automatically triggers a new item in your To-Do List.
        %p
          It's how you always know what to work on next.