Insert notification settings dropdown into groups

This commit is contained in:
Felipe Artur 2016-06-21 16:50:13 -03:00
parent f82ab42d05
commit 92e183542f
7 changed files with 106 additions and 33 deletions

View File

@ -1,4 +1,6 @@
Please view this file on the master branch, on stable branches it's out of date.
v 8.10(unreleased)
- Add notifications dropdown for groups
v 8.9.0 (unreleased)
- Fix Error 500 when using closes_issues API with an external issue tracker
@ -29,6 +31,7 @@ v 8.9.0 (unreleased)
- Use gitlab-shell v3.0.0
- Upgrade to jQuery 2
- Use Knapsack to evenly distribute tests across multiple nodes
- Add notifications dropdown for groups
- Add `sha` parameter to MR merge API, to ensure only reviewed changes are merged
- Don't allow MRs to be merged when commits were added since the last review / page load
- Add DB index on users.state

View File

@ -81,6 +81,7 @@ class Dispatcher
new Activities()
when 'groups:show'
shortcut_handler = new ShortcutsNavigation()
new NotificationsForm()
when 'groups:group_members:index'
new GroupMembers()
new UsersSelect()

View File

@ -37,15 +37,12 @@ class GroupsController < Groups::ApplicationController
end
def show
@last_push = current_user.recent_push if current_user
if current_user
@last_push = current_user.recent_push
@notification_setting = current_user.notification_settings_for(group)
end
@projects = @projects.includes(:namespace)
@projects = @projects.sorted_by_activity
@projects = filter_projects(@projects)
@projects = @projects.sort(@sort = params[:sort])
@projects = @projects.page(params[:page]) if params[:filter_projects].blank?
@shared_projects = GroupProjectsFinder.new(group, only_shared: true).execute(current_user)
setup_projects
respond_to do |format|
format.html
@ -77,10 +74,6 @@ class GroupsController < Groups::ApplicationController
def edit
end
def projects
@projects = @group.projects.page(params[:page])
end
def update
if Groups::UpdateService.new(@group, current_user, group_params).execute
redirect_to edit_group_path(@group), notice: "Group '#{@group.name}' was successfully updated."
@ -97,6 +90,20 @@ class GroupsController < Groups::ApplicationController
protected
def setup_projects
@projects = @projects.includes(:namespace)
@projects = @projects.sorted_by_activity
@projects = filter_projects(@projects)
@projects = @projects.sort(@sort = params[:sort])
@projects = @projects.page(params[:page]) if params[:filter_projects].blank?
@shared_projects = GroupProjectsFinder.new(group, only_shared: true).execute(current_user)
end
def projects
@projects = @group.projects.page(params[:page])
end
def authorize_create_group!
unless can?(current_user, :create_group, nil)
return render_404

View File

@ -2,9 +2,11 @@ class NotificationSettingsController < ApplicationController
before_action :authenticate_user!
def create
project = current_user.projects.find(params[:project][:id])
resource = find_resource
@notification_setting = current_user.notification_settings_for(project)
return render_404 unless can_read?(resource)
@notification_setting = current_user.notification_settings_for(resource)
@saved = @notification_setting.update_attributes(notification_setting_params)
render_response
@ -19,6 +21,22 @@ class NotificationSettingsController < ApplicationController
private
def find_resource
resource =
if params[:project].present?
Project.find(params[:project][:id])
elsif params[:namespace].present?
Group.find(params[:namespace][:id])
end
end
def can_read?(resource)
ability_name = resource.class.name.downcase
ability_name = "read_#{ability_name}".to_sym
can?(current_user, ability_name, resource)
end
def render_response
render json: {
html: view_to_html_string("notifications/buttons/_notifications", notification_setting: @notification_setting),

View File

@ -15,10 +15,13 @@
%span.visibility-icon.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) }
= visibility_level_icon(@group.visibility_level, fw: false)
= render 'notifications/buttons/notifications', notification_setting: @notification_setting
- if @group.description.present?
.cover-desc.description
= markdown(@group.description, pipeline: :description)
%div{ class: container_class }
.top-area
%ul.nav-links

View File

@ -16,7 +16,7 @@
%button.dropdown-new.btn.btn-default.notifications-btn#notifications-button{ type: "button", data: { toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting) } }
= icon("bell", class: "js-notification-loading")
= notification_title(notification_setting.level)
%button.btn.btn-danger.dropdown-toggle{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting) } }
%button.btn.dropdown-toggle{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting) } }
%span.caret
.sr-only Toggle dropdown
= render "shared/notifications/notification_dropdown", notification_setting: notification_setting

View File

@ -2,6 +2,7 @@ require 'spec_helper'
describe NotificationSettingsController do
let(:project) { create(:empty_project) }
let(:group) { create(:group, :internal) }
let(:user) { create(:user) }
before do
@ -20,33 +21,73 @@ describe NotificationSettingsController do
end
context 'when authorized' do
let(:custom_events) do
events = {}
NotificationSetting::EMAIL_EVENTS.each do |event|
events[event.to_s] = true
end
events
end
before do
sign_in(user)
end
it 'returns success' do
post :create,
project: { id: project.id },
notification_setting: { level: :participating }
context 'for projects' do
let(:notification_setting) { user.notification_settings_for(project) }
expect(response.status).to eq 200
end
context 'and setting custom notification setting' do
let(:custom_events) do
events = {}
NotificationSetting::EMAIL_EVENTS.each do |event|
events[event] = "true"
end
end
it 'returns success' do
it 'creates notification setting' do
post :create,
project: { id: project.id },
notification_setting: { level: :participating, events: custom_events }
notification_setting: { level: :participating }
expect(response.status).to eq 200
expect(notification_setting.level).to eq("participating")
expect(notification_setting.user_id).to eq(user.id)
expect(notification_setting.source_id).to eq(project.id)
expect(notification_setting.source_type).to eq("Project")
end
context 'with custom settings' do
it 'creates notification setting' do
post :create,
project: { id: project.id },
notification_setting: { level: :custom }.merge(custom_events)
expect(response.status).to eq 200
expect(notification_setting.level).to eq("custom")
expect(notification_setting.events).to eq(custom_events)
end
end
end
context 'for groups' do
let(:notification_setting) { user.notification_settings_for(group) }
it 'creates notification setting' do
post :create,
namespace: { id: group.id },
notification_setting: { level: :watch }
expect(response.status).to eq 200
expect(notification_setting.level).to eq("watch")
expect(notification_setting.user_id).to eq(user.id)
expect(notification_setting.source_id).to eq(group.id)
expect(notification_setting.source_type).to eq("Namespace")
end
context 'with custom settings' do
it 'creates notification setting' do
post :create,
namespace: { id: group.id },
notification_setting: { level: :custom }.merge(custom_events)
expect(response.status).to eq 200
expect(notification_setting.level).to eq("custom")
expect(notification_setting.events).to eq(custom_events)
end
end
end
end