diff --git a/app/assets/javascripts/admin_email_select.js.coffee b/app/assets/javascripts/admin_email_select.js.coffee
new file mode 100644
index 0000000000..1802bc3392
--- /dev/null
+++ b/app/assets/javascripts/admin_email_select.js.coffee
@@ -0,0 +1,62 @@
+class @AdminEmailSelect
+ constructor: ->
+ $('.ajax-admin-email-select').each (i, select) =>
+ skip_ldap = $(select).hasClass('skip_ldap')
+
+ $(select).select2
+ placeholder: "Select group or project"
+ multiple: $(select).hasClass('multiselect')
+ minimumInputLength: 0
+ query: (query) ->
+ group_result = Api.groups query.term, skip_ldap, (groups) ->
+ groups
+
+ project_result = Api.projects query.term, (projects) ->
+ projects
+
+ $.when(project_result, group_result).done (projects, groups) ->
+ all = {id: "all"}
+ data = $.merge([all], groups[0], projects[0])
+ query.callback({ results: data})
+
+ id: (object) ->
+ if object.path_with_namespace
+ "project-#{object.id}"
+ else if object.path
+ "group-#{object.id}"
+ else
+ "all"
+
+ formatResult: (args...) =>
+ @formatResult(args...)
+ formatSelection: (args...) =>
+ @formatSelection(args...)
+ dropdownCssClass: "ajax-admin-email-dropdown"
+ escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
+ m
+
+ formatResult: (object) ->
+ if object.path_with_namespace
+ "
+
#{object.name}
+
#{object.path_with_namespace}
+
"
+ else if object.path
+ "
+
#{object.name}
+
#{object.path}
+
"
+ else
+ "
+
All
+
All groups and projects
+
"
+
+ formatSelection: (object) ->
+ if object.path_with_namespace
+ "Project: #{object.name}"
+ else if object.path
+ "Group: #{object.name}"
+ else
+ "All groups and projects"
+
diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee
index 3d2f9d9653..5bccf4f169 100644
--- a/app/assets/javascripts/api.js.coffee
+++ b/app/assets/javascripts/api.js.coffee
@@ -7,6 +7,7 @@
ldap_groups_path: "/api/:version/ldap/:provider/groups.json"
namespaces_path: "/api/:version/namespaces.json"
project_users_path: "/api/:version/projects/:id/users.json"
+ projects_path: "/api/:version/projects.json"
# Get 20 (depends on api) recent notes
# and sort the ascending from oldest to newest
@@ -132,3 +133,17 @@
dataType: "json"
).done (groups) ->
callback(groups)
+
+ # Return projects list. Filtered by query
+ projects: (query, callback) ->
+ project_url = Api.buildUrl(Api.projects_path)
+
+ project_query = $.ajax(
+ url: project_url
+ data:
+ private_token: gon.api_token
+ search: query
+ per_page: 20
+ dataType: "json"
+ ).done (projects) ->
+ callback(projects)
diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee
index 39710a7982..ef0d1236b5 100644
--- a/app/assets/javascripts/dispatcher.js.coffee
+++ b/app/assets/javascripts/dispatcher.js.coffee
@@ -81,6 +81,8 @@ class Dispatcher
new User()
when 'projects:group_links:index'
new GroupsSelect()
+ when 'admin:emails:show'
+ new AdminEmailSelect()
switch path.first()
when 'admin'
diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss
index d85e80a512..5d2f054d8f 100644
--- a/app/assets/stylesheets/generic/selects.scss
+++ b/app/assets/stylesheets/generic/selects.scss
@@ -128,6 +128,15 @@ select {
}
}
+.project-result {
+ .project-name {
+ font-weight: bold;
+ }
+ .project-path {
+ color: #999;
+ }
+}
+
.user-result {
.user-image {
float: left;
diff --git a/app/helpers/admin_email_helper.rb b/app/helpers/admin_email_helper.rb
deleted file mode 100644
index 28dfe3f601..0000000000
--- a/app/helpers/admin_email_helper.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-module AdminEmailHelper
- def admin_email_grouped_recipient_options
- options_for_select([['All GitLab users', 'all']]) +
- grouped_options_for_select(
- 'Groups' => Group.pluck(:name, :id).map{ |name, id| [name, "group-#{id}"] },
- 'Projects' => grouped_project_list
- )
- end
-
- protected
- def grouped_project_list
- Group.includes(:projects).flat_map do |group|
- group.human_name
- group.projects.map do |project|
- ["#{group.human_name} / #{project.name}", "project-#{project.id}"]
- end
- end
- end
-end
\ No newline at end of file
diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb
index 475450781f..81871761f4 100644
--- a/app/helpers/selects_helper.rb
+++ b/app/helpers/selects_helper.rb
@@ -35,4 +35,13 @@ module SelectsHelper
hidden_field_tag(id, value, class: css_class)
end
+
+ def admin_email_select_tag(id, opts = {})
+ css_class = "ajax-admin-email-select "
+ css_class << "multiselect " if opts[:multiple]
+ css_class << (opts[:class] || '')
+ value = opts[:selected] || ''
+
+ hidden_field_tag(id, value, class: css_class)
+ end
end
diff --git a/app/views/admin/emails/show.html.haml b/app/views/admin/emails/show.html.haml
index 58bd208409..90e4e3aa2f 100644
--- a/app/views/admin/emails/show.html.haml
+++ b/app/views/admin/emails/show.html.haml
@@ -17,6 +17,6 @@
.form-group
%label.control-label{for: :recipients} Recipient group
.col-sm-10
- = select_tag :recipients, admin_email_grouped_recipient_options, class: :select2, required: true
+ = admin_email_select_tag(:recipients)
.form-actions
= submit_tag 'Send message', class: 'btn btn-create'
diff --git a/app/workers/admin_emails_worker.rb b/app/workers/admin_emails_worker.rb
index 56d83d7ebe..3801456eef 100644
--- a/app/workers/admin_emails_worker.rb
+++ b/app/workers/admin_emails_worker.rb
@@ -8,6 +8,7 @@ class AdminEmailsWorker
end
private
+
def recipient_list(recipient_id)
case recipient_id
when 'all'
@@ -18,4 +19,4 @@ class AdminEmailsWorker
Project.find($1).team.users.subscribed_for_admin_email
end
end
-end
\ No newline at end of file
+end
diff --git a/features/admin/emails.feature b/features/admin/emails.feature
index 0ad5a6866a..cf22e36d7b 100644
--- a/features/admin/emails.feature
+++ b/features/admin/emails.feature
@@ -1,9 +1,9 @@
-@admin
Feature: Admin email
Background:
Given I sign in as an admin
And there are groups with projects
+ @javascript
Scenario: Create a new email notification
Given I visit admin email page
When I submit form with email notification info
diff --git a/features/steps/admin/email.rb b/features/steps/admin/email.rb
index 73a2daba06..996a3d0309 100644
--- a/features/steps/admin/email.rb
+++ b/features/steps/admin/email.rb
@@ -15,7 +15,16 @@ class Spinach::Features::AdminEmail < Spinach::FeatureSteps
within('form#new-admin-email') do
fill_in :subject, with: 'my subject'
fill_in :body, with: @email_text
- select @selected_group.name, from: :recipients
+
+ # Note: Unable to use select2 helper because
+ # the helper uses select2 method "val" to select the group from the dropdown
+ # and the method "val" requires "initSelection" to be used in the select2 call
+ select2_container = first("#s2id_recipients")
+ select2_container.find(".select2-choice").click
+ find(:xpath, "//body").find("input.select2-input").set(@selected_group.name)
+ page.execute_script(%|$("input.select2-input:visible").keyup();|)
+ find(:xpath, "//body").find(".group-name", text: @selected_group.name).click
+
find('.btn-create').click
end
end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index d08c758fb9..4d70f97ac1 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -37,6 +37,10 @@ module API
@projects = @projects.where(archived: parse_boolean(params[:archived]))
end
+ if params[:search].present?
+ @projects = @projects.search(params[:search])
+ end
+
@projects = paginate @projects
present @projects, with: Entities::Project
end