From 1297d5bf1215abb03f9b22f1831d13b9ca9daaa8 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 9 Jan 2015 13:09:49 +0100 Subject: [PATCH 1/6] Add projects search query for api and js api. --- app/assets/javascripts/api.js.coffee | 15 +++++++++++++++ lib/api/projects.rb | 4 ++++ 2 files changed, 19 insertions(+) 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/lib/api/projects.rb b/lib/api/projects.rb index 2da4e68c4c..cb4bb47192 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -28,6 +28,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 From 95649362ad8e30bdd174d0d9075107a900fcdbdd Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 9 Jan 2015 13:13:10 +0100 Subject: [PATCH 2/6] Create the admin email select box which queries through both projects and groups. --- .../javascripts/admin_email_select.js.coffee | 46 +++++++++++++++++++ app/assets/javascripts/dispatcher.js.coffee | 2 + app/helpers/admin_email_helper.rb | 2 +- app/helpers/selects_helper.rb | 9 ++++ app/views/admin/emails/show.html.haml | 2 +- app/workers/admin_emails_worker.rb | 2 +- 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/admin_email_select.js.coffee 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..83b28ed086 --- /dev/null +++ b/app/assets/javascripts/admin_email_select.js.coffee @@ -0,0 +1,46 @@ +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) -> + data = $.merge(groups[0], projects[0]) + query.callback({ results: data}) + + 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 + "
+
#{object.name}
+
#{object.path}
+
" + + formatSelection: (object) -> + if object.path_with_namespace + "Project: #{object.name}" + else + "Group: #{object.name}" + 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/helpers/admin_email_helper.rb b/app/helpers/admin_email_helper.rb index 28dfe3f601..f4f42ab061 100644 --- a/app/helpers/admin_email_helper.rb +++ b/app/helpers/admin_email_helper.rb @@ -16,4 +16,4 @@ module AdminEmailHelper end end end -end \ No newline at end of file +end 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..0f13d092d2 100644 --- a/app/workers/admin_emails_worker.rb +++ b/app/workers/admin_emails_worker.rb @@ -18,4 +18,4 @@ class AdminEmailsWorker Project.find($1).team.users.subscribed_for_admin_email end end -end \ No newline at end of file +end From 4374104c885a7c645a6de2153ab0610755e19d76 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 9 Jan 2015 13:13:44 +0100 Subject: [PATCH 3/6] Add styling for the projects in the select box. --- app/assets/stylesheets/generic/selects.scss | 9 +++++++++ 1 file changed, 9 insertions(+) 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; From 84d74e83e8131bf68cf082045017912b21f81786 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 9 Jan 2015 14:27:02 +0100 Subject: [PATCH 4/6] Add an option for sending emails to all users. --- .../javascripts/admin_email_select.js.coffee | 22 ++++++++++++++++--- app/workers/admin_emails_worker.rb | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/admin_email_select.js.coffee b/app/assets/javascripts/admin_email_select.js.coffee index 83b28ed086..1802bc3392 100644 --- a/app/assets/javascripts/admin_email_select.js.coffee +++ b/app/assets/javascripts/admin_email_select.js.coffee @@ -15,9 +15,18 @@ class @AdminEmailSelect projects $.when(project_result, group_result).done (projects, groups) -> - data = $.merge(groups[0], projects[0]) + 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...) => @@ -32,15 +41,22 @@ class @AdminEmailSelect
#{object.name}
#{object.path_with_namespace}
" - else + 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 + else if object.path "Group: #{object.name}" + else + "All groups and projects" diff --git a/app/workers/admin_emails_worker.rb b/app/workers/admin_emails_worker.rb index 0f13d092d2..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' From 130c306a2a44dffa54c8ad31f153f377a72e63bd Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 9 Jan 2015 14:28:36 +0100 Subject: [PATCH 5/6] Remove unused admin email helper. --- app/helpers/admin_email_helper.rb | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 app/helpers/admin_email_helper.rb diff --git a/app/helpers/admin_email_helper.rb b/app/helpers/admin_email_helper.rb deleted file mode 100644 index f4f42ab061..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 From 562857d635e575277ae5a9477ae78e21977d587b Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 9 Jan 2015 16:19:23 +0100 Subject: [PATCH 6/6] Fix admine email spec. --- features/admin/emails.feature | 2 +- features/steps/admin/email.rb | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) 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