提交 ab236c76 编写于 作者: F Felipe Artur

Allow users to set custom notifications in projects they don't own and several fixes to code

上级 a4b078bf
......@@ -54,7 +54,7 @@ v 8.9.0 (unreleased)
- Remove 'main language' feature
- Pipelines can be canceled only when there are running builds
- Use downcased path to container repository as this is expected path by Docker
- Customized notification settings for projects
- Custom notification settings
- Projects pending deletion will render a 404 page
- Measure queue duration between gitlab-workhorse and Rails
- Make Omniauth providers specs to not modify global configuration
......
......@@ -9,14 +9,14 @@ class @NotificationsDropdown
notificationLevel = $(@).data 'notification-level'
label = $(@).data 'notification-title'
form = $(this).parents('form:first')
form = $(this).parents('.notification-form:first')
form.find('.js-notification-loading').toggleClass 'fa-bell fa-spin fa-spinner'
form.find('#notification_setting_level').val(notificationLevel)
form.submit();
form.submit()
$(document)
.off 'ajax:success', '#notification-form'
.on 'ajax:success', '#notification-form', (e, data) ->
.off 'ajax:success', '.notification-form'
.on 'ajax:success', '.notification-form', (e, data) ->
if data.saved
new Flash('Notification settings saved', 'notice')
$(e.currentTarget).closest('.notification-dropdown').replaceWith(data.html)
......
......@@ -2,12 +2,16 @@ class NotificationSettingsController < ApplicationController
before_action :authenticate_user!
def create
project = current_user.projects.find(params[:project][:id])
project = Project.find(params[:project][:id])
@notification_setting = current_user.notification_settings_for(project)
@saved = @notification_setting.update_attributes(notification_setting_params)
if can?(current_user, :read_project, project)
@notification_setting = current_user.notification_settings_for(project)
@saved = @notification_setting.update_attributes(notification_setting_params)
render_response
render_response
else
render_404
end
end
def update
......@@ -21,7 +25,7 @@ class NotificationSettingsController < ApplicationController
def render_response
render json: {
html: view_to_html_string("notifications/buttons/_notifications", notification_setting: @notification_setting),
html: view_to_html_string("shared/notifications/buttons/_button", notification_setting: @notification_setting),
saved: @saved
}
end
......
......@@ -9,4 +9,4 @@
= link_to group.name, group_path(group)
.pull-right
= render 'notifications/buttons/notifications', notification_setting: setting
= render '/shared/notifications/buttons/button', notification_setting: setting
......@@ -9,4 +9,4 @@
= link_to_project(project)
.pull-right
= render 'notifications/buttons/notifications', notification_setting: setting
= render '/shared/notifications/buttons/button', notification_setting: setting
......@@ -25,11 +25,11 @@
= f.label :notification_email, class: "label-light"
= f.select :notification_email, @user.all_emails, { include_blank: false }, class: "select2"
= label_tag :global_notification_level, "Global notification level", class: "label-light"
%br
.clearfix
.form-group.pull-left
= render 'notifications/buttons/notifications', notification_setting: @global_notification_setting, left_align: true
= label_tag :global_notification_level, "Global notification level", class: "label-light"
%br
.clearfix
.form-group.pull-left
= render '/shared/notifications/buttons/button', notification_setting: @global_notification_setting, left_align: true
.clearfix
......
......@@ -32,7 +32,7 @@
.project-repo-buttons.btn-group.project-right-buttons
= render "projects/buttons/download"
= render 'projects/buttons/dropdown'
= render 'notifications/buttons/notifications', notification_setting: @notification_setting
= render '/shared/notifications/buttons/button', notification_setting: @notification_setting
:javascript
new Star();
- left_align = local_assigns[:left_align]
- if notification_setting
.dropdown.notification-dropdown.pull-right
= form_for notification_setting, remote: true, html: { class: "inline", id: "notification-form" } do |f|
= form_for notification_setting, remote: true, html: { class: "inline notification-form" } do |f|
= hidden_setting_source_input(notification_setting)
= f.hidden_field :level, class: "notification_setting_level"
.js-notification-toggle-btns
......
#custom-notifications-modal.modal.fade{ tabindex: "-1", role: "dialog", aria: { labelledby: "custom-notifications-title" } }
.modal-dialog
.modal-content
.modal-header
%button.close{ type: "button", data: { dismiss: "modal" }, aria: { label: "close" } }
%span{ aria: { hidden: "true" } } ×
%h4#custom-notifications-title.modal-title
Custom notification events
.modal-body
.container-fluid
= form_for @notification_setting, url: namespace_project_notification_setting_path(@project.namespace.becomes(Namespace), @project), method: :patch, html: { class: "custom-notifications-form" } do |f|
.row
.col-lg-3
%h4.prepend-top-0
Notification events
.col-lg-9
- NotificationSetting::EMAIL_EVENTS.each do |event, index|
= index
.form-group
.checkbox{ class: ("prepend-top-0" if index == 0) }
%label{ for: "events_#{event}" }
= check_box("notification_setting", event, {id: "events_#{event}", class: "js-custom-notification-event"})
%strong
= event.to_s.humanize
= icon("spinner spin", class: "custom-notification-event-loading")
%ul.dropdown-menu.dropdown-menu-no-wrap.dropdown-menu-align-right.dropdown-menu-selectable.dropdown-menu-large{ role: "menu" }
- NotificationSetting.levels.each do |level|
- if level.first != "custom"
= notification_list_item(level.first, @notification_setting)
%li.divider
%li
%a.update-notification{ href: "#", role: "button", data: { toggle: "modal", target: "#custom-notifications-modal", notification_level: "custom", notification_title: "Custom" } }
%strong.dropdown-menu-inner-title Custom
%span.dropdown-menu-inner-content= notification_description("custom")
......@@ -272,8 +272,7 @@ module API
expose :access_level
expose :notification_level do |member, options|
if member.notification_setting
setting = member.notification_setting
{ level: NotificationSetting.levels[setting.level], events: setting.events }
NotificationSetting.levels[member.notification_setting.level]
end
end
end
......
......@@ -146,9 +146,6 @@ describe NotificationService, services: true do
let(:note) { create(:note_on_issue, noteable: confidential_issue, project: project, note: "#{author.to_reference} #{assignee.to_reference} #{non_member.to_reference} #{member.to_reference} #{admin.to_reference}") }
let(:guest_watcher) { create_user_with_notification(:watch, "guest-watcher-confidential") }
before do
end
it 'filters out users that can not read the issue' do
project.team << [member, :developer]
project.team << [guest, :guest]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册