Commit 183892fd authored by Douwe Maan's avatar Douwe Maan

Merge branch 'notification-levels' into 'master'

Notification levels can now be set on the Project's main page

![Screen_Shot_2015-09-16_at_7.49.49_PM](https://gitlab.com/gitlab-org/gitlab-ce/uploads/0ac517bdfdc801f0e2115463c3ea9e10/Screen_Shot_2015-09-16_at_7.49.49_PM.png)

The notification settings for a project can now be set directly on the Project's page. The drop down list and the button label reflect the current level.

Saving is done via a remote form submission and if successful shows the user a flash message:

![Screen_Shot_2015-09-16_at_6.09.02_PM](https://gitlab.com/gitlab-org/gitlab-ce/uploads/8a6e1fde5177aa3976cadf59fdb8d375/Screen_Shot_2015-09-16_at_6.09.02_PM.png)

@DouweM can you please review my code. I gave my bestest effort to make in clean and readable.

@rspeicher hopefully we can include it with the 8.0 release, maybe?

/cc @darby 

See merge request !1322
parents 2460d290 47e926be
...@@ -51,6 +51,7 @@ v 8.0.0 (unreleased) ...@@ -51,6 +51,7 @@ v 8.0.0 (unreleased)
- Add support for Crowd - Add support for Crowd
- Global Labels that are available to all projects - Global Labels that are available to all projects
- Fix highlighting of deleted lines in diffs. - Fix highlighting of deleted lines in diffs.
- Project notification level can be set on the project page itself
- Added service API endpoint to retrieve service parameters (Petheő Bence) - Added service API endpoint to retrieve service parameters (Petheő Bence)
- Add FogBugz project import (Jared Szechy) - Add FogBugz project import (Jared Szechy)
- Sort users autocomplete lists by user (Allister Antosik) - Sort users autocomplete lists by user (Allister Antosik)
......
...@@ -24,3 +24,19 @@ class @Project ...@@ -24,3 +24,19 @@ class @Project
$.cookie('hide_no_password_message', 'false', { path: path }) $.cookie('hide_no_password_message', 'false', { path: path })
$(@).parents('.no-password-message').remove() $(@).parents('.no-password-message').remove()
e.preventDefault() e.preventDefault()
$('.update-notification').on 'click', (e) ->
e.preventDefault()
notification_level = $(@).data 'notification-level'
$('#notification_level').val(notification_level)
$('#notification-form').submit()
label = null
switch notification_level
when 0 then label = ' Disabled '
when 1 then label = ' Participating '
when 2 then label = ' Watching '
when 3 then label = ' Global '
when 4 then label = ' On Mention '
$('#notifications-button').empty().append("<i class='fa fa-bell'></i>" + label + "<i class='fa fa-angle-down'></i>")
$(@).parents('ul').find('li.active').removeClass 'active'
$(@).parent().addClass 'active'
\ No newline at end of file
...@@ -329,3 +329,7 @@ pre.light-well { ...@@ -329,3 +329,7 @@ pre.light-well {
margin-top: -1px; margin-top: -1px;
} }
} }
.inline-form {
display: inline-block;
}
...@@ -86,6 +86,10 @@ class ProjectsController < ApplicationController ...@@ -86,6 +86,10 @@ class ProjectsController < ApplicationController
if @project.empty_repo? if @project.empty_repo?
render 'projects/empty' render 'projects/empty'
else else
if current_user
@membership = @project.project_member_by_id(current_user.id)
end
render :show render :show
end end
else else
......
...@@ -12,4 +12,49 @@ module NotificationsHelper ...@@ -12,4 +12,49 @@ module NotificationsHelper
icon('circle-o', class: 'ns-default') icon('circle-o', class: 'ns-default')
end end
end end
def notification_list_item(notification_level, user_membership)
case notification_level
when Notification::N_DISABLED
content_tag(:li, class: active_level_for(user_membership, Notification::N_DISABLED)) do
link_to '#', class: 'update-notification', data: { notification_level: Notification::N_DISABLED } do
icon('microphone-slash fw', text: 'Disabled')
end
end
when Notification::N_PARTICIPATING
content_tag(:li, class: active_level_for(user_membership, Notification::N_PARTICIPATING)) do
link_to '#', class: 'update-notification', data: { notification_level: Notification::N_PARTICIPATING } do
icon('volume-up fw', text: 'Participate')
end
end
when Notification::N_WATCH
content_tag(:li, class: active_level_for(user_membership, Notification::N_WATCH)) do
link_to '#', class: 'update-notification', data: { notification_level: Notification::N_WATCH } do
icon('eye fw', text: 'Watch')
end
end
when Notification::N_MENTION
content_tag(:li, class: active_level_for(user_membership, Notification::N_MENTION)) do
link_to '#', class: 'update-notification', data: { notification_level: Notification::N_MENTION } do
icon('at fw', text: 'On mention')
end
end
when Notification::N_GLOBAL
content_tag(:li, class: active_level_for(user_membership, Notification::N_GLOBAL)) do
link_to '#', class: 'update-notification', data: { notification_level: Notification::N_GLOBAL } do
icon('globe fw', text: 'Global')
end
end
else
# do nothing
end
end
def notification_label(user_membership)
Notification.new(user_membership).to_s
end
def active_level_for(user_membership, level)
'active' if user_membership.notification_level == level
end
end end
...@@ -12,7 +12,7 @@ class Notification ...@@ -12,7 +12,7 @@ class Notification
class << self class << self
def notification_levels def notification_levels
[N_DISABLED, N_PARTICIPATING, N_WATCH, N_MENTION] [N_DISABLED, N_MENTION, N_PARTICIPATING, N_WATCH]
end end
def options_with_labels def options_with_labels
...@@ -26,7 +26,7 @@ class Notification ...@@ -26,7 +26,7 @@ class Notification
end end
def project_notification_levels def project_notification_levels
[N_DISABLED, N_PARTICIPATING, N_WATCH, N_GLOBAL, N_MENTION] [N_DISABLED, N_MENTION, N_PARTICIPATING, N_WATCH, N_GLOBAL]
end end
end end
...@@ -57,4 +57,21 @@ class Notification ...@@ -57,4 +57,21 @@ class Notification
def level def level
target.notification_level target.notification_level
end end
def to_s
case level
when N_DISABLED
'Disabled'
when N_PARTICIPATING
'Participating'
when N_WATCH
'Watching'
when N_MENTION
'On mention'
when N_GLOBAL
'Global'
else
# do nothing
end
end
end end
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
= f.label :notification_level, value: Notification::N_MENTION do = f.label :notification_level, value: Notification::N_MENTION do
= f.radio_button :notification_level, Notification::N_MENTION = f.radio_button :notification_level, Notification::N_MENTION
.level-title .level-title
Mention On Mention
%p You will receive notifications only for comments in which you were @mentioned %p You will receive notifications only for comments in which you were @mentioned
.radio .radio
......
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
= icon('download fw') = icon('download fw')
Download Download
= render 'projects/buttons/notifications'
= render 'projects/buttons/dropdown' = render 'projects/buttons/dropdown'
- if @project.gitlab_ci? - if @project.gitlab_ci?
......
- return unless @membership
= form_tag profile_notifications_path, method: :put, remote: true, class: 'inline-form', id: 'notification-form' do
= hidden_field_tag :notification_type, 'project'
= hidden_field_tag :notification_id, @membership.id
= hidden_field_tag :notification_level
%span.dropdown
%a.dropdown-toggle.btn.btn-new#notifications-button{href: '#', "data-toggle" => "dropdown"}
= icon('bell')
= notification_label(@membership)
= icon('angle-down')
%ul.dropdown-menu.dropdown-menu-right.project-home-dropdown
- Notification.project_notification_levels.each do |level|
= notification_list_item(level, @membership)
...@@ -74,3 +74,9 @@ Feature: Project ...@@ -74,3 +74,9 @@ Feature: Project
Given I disable snippets in project Given I disable snippets in project
When I visit project "Shop" page When I visit project "Shop" page
Then I should not see "Snippets" button Then I should not see "Snippets" button
@javascript
Scenario: I edit Project Notifications
Given I click notifications drop down button
When I choose Mention setting
Then I should see Notification saved message
...@@ -130,4 +130,18 @@ class Spinach::Features::Project < Spinach::FeatureSteps ...@@ -130,4 +130,18 @@ class Spinach::Features::Project < Spinach::FeatureSteps
step 'I should see back to group button' do step 'I should see back to group button' do
expect(page).to have_content 'Back to group' expect(page).to have_content 'Back to group'
end end
step 'I click notifications drop down button' do
click_link 'notifications-button'
end
step 'I choose Mention setting' do
click_link 'On mention'
end
step 'I should see Notification saved message' do
page.within '.flash-container' do
expect(page).to have_content 'Notification settings saved'
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment