diff --git a/app/assets/images/event_filter_comments.png b/app/assets/images/event_filter_comments.png new file mode 100644 index 00000000000..aed113faa7a Binary files /dev/null and b/app/assets/images/event_filter_comments.png differ diff --git a/app/assets/images/event_filter_merged.png b/app/assets/images/event_filter_merged.png new file mode 100644 index 00000000000..30aea0b6e55 Binary files /dev/null and b/app/assets/images/event_filter_merged.png differ diff --git a/app/assets/images/event_filter_push.png b/app/assets/images/event_filter_push.png new file mode 100644 index 00000000000..930faee6aa2 Binary files /dev/null and b/app/assets/images/event_filter_push.png differ diff --git a/app/assets/images/event_filter_team.png b/app/assets/images/event_filter_team.png new file mode 100644 index 00000000000..2dc66c85165 Binary files /dev/null and b/app/assets/images/event_filter_team.png differ diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee index fb82f799007..04e6b2ef9d1 100644 --- a/app/assets/javascripts/main.js.coffee +++ b/app/assets/javascripts/main.js.coffee @@ -27,6 +27,9 @@ $ -> # Initialize chosen selects $('select.chosen').chosen() + # Initialize tooltips + $('.has_tooltip').tooltip() + # Disable form buttons while a form is submitting $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> buttons = $('[type="submit"]', @) diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 17df600c1af..99523639fe7 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -115,3 +115,29 @@ margin: -3px; } } + +/** + * Event filter + * + */ +.event_filter { + position: absolute; + width: 40px; + margin-left: -50px; + + .filter_icon { + float: left; + border-left: 3px solid #4bc; + padding: 7px; + background: #f9f9f9; + margin-bottom: 10px; + img { + width:20px; + } + + &.inactive { + border-left: 3px solid #EEE; + opacity: 0.5; + } + } +} diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index af23f970a6d..012d86764ab 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -1,12 +1,17 @@ class DashboardController < ApplicationController respond_to :html + before_filter :event_filter, only: :index + def index @groups = Group.where(id: current_user.projects.pluck(:group_id)) @projects = current_user.projects_with_events @projects = @projects.page(params[:page]).per(30) - @events = Event.in_projects(current_user.project_ids).limit(20).offset(params[:offset] || 0) + @events = Event.in_projects(current_user.project_ids) + @events = @event_filter.apply_filter(@events) + @events = @events.limit(20).offset(params[:offset] || 0) + @last_push = current_user.recent_push respond_to do |format| @@ -34,4 +39,8 @@ class DashboardController < ApplicationController format.atom { render layout: false } end end + + def event_filter + @event_filter ||= EventFilter.new(params[:event_filter]) + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a4d36c9bbc8..cba34c963a0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -36,7 +36,7 @@ module ApplicationHelper else gravatar_prefix = request.ssl? ? "https://secure" : "http://www" user_email.strip! - "#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=identicon" + "#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=mm" end end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 0eb87caadd7..a2548a23e5e 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -33,4 +33,22 @@ module EventsHelper image_tag event_image_path end end + + def event_filter_link key, tooltip + key = key.to_s + + filter = @event_filter.options key + + inactive = if @event_filter.active? key + nil + else + 'inactive' + end + + content_tag :div, class: "filter_icon #{inactive}" do + link_to dashboard_path(event_filter: filter), class: 'has_tooltip', 'data-original-title' => tooltip do + image_tag "event_filter_#{key}.png" + end + end + end end diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index 6c4ff96bb50..d0882c6dab7 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -3,10 +3,17 @@ .activities.span8 = render "events/event_last_push", event: @last_push = render 'shared/no_ssh' + + .event_filter + = event_filter_link EventFilter.push, 'Push events' + = event_filter_link EventFilter.merged, 'Merge events' + = event_filter_link EventFilter.comments, 'Comments' + = event_filter_link EventFilter.team, 'Team' + - if @events.any? .content_list= render @events - else - %h4.nothing_here_message Projects activity will be displayed here + %p.nothing_here_message Projects activity will be displayed here .loading.hide .side - if @groups.present? diff --git a/lib/event_filter.rb b/lib/event_filter.rb new file mode 100644 index 00000000000..14ab0193bf1 --- /dev/null +++ b/lib/event_filter.rb @@ -0,0 +1,68 @@ +class EventFilter + attr_accessor :params + + class << self + def default_filter + %w{ push issues merge_requests team} + end + + def push + 'push' + end + + def merged + 'merged' + end + + def comments + 'comments' + end + + def team + 'team' + end + end + + def initialize params + @params = if params + params.dup + else + []#EventFilter.default_filter + end + end + + def apply_filter events + return events unless params.present? + + filter = params.dup + + actions = [] + actions << Event::Pushed if filter.include? 'push' + actions << Event::Merged if filter.include? 'merged' + + if filter.include? 'team' + actions << Event::Joined + actions << Event::Left + end + + actions << Event::Commented if filter.include? 'comments' + + events = events.where(action: actions) + end + + def options key + filter = params.dup + + if filter.include? key + filter.delete key + else + filter << key + end + + filter + end + + def active? key + params.include? key + end +end