summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2016-03-14 11:25:04 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2016-03-17 07:39:16 +0100
commitbcd5806960f3f74e27bc8e7c8a6fab3a044c181a (patch)
tree6f8ea9683756ed4aebee538706e7e80ff4d9dc21
parenta91101b19a44d98005dd21b06d8509abcd82ddfc (diff)
downloadgitlab-ce-bcd5806960f3f74e27bc8e7c8a6fab3a044c181a.tar.gz
Add access-level filter support for projects select
This also refactores ProjectSelect adding some decorator-like functions.
-rw-r--r--app/assets/javascripts/project_select.js.coffee56
-rw-r--r--app/models/user.rb2
-rw-r--r--app/services/issues/move_service.rb4
-rw-r--r--app/views/shared/issuable/_form.html.haml3
4 files changed, 43 insertions, 22 deletions
diff --git a/app/assets/javascripts/project_select.js.coffee b/app/assets/javascripts/project_select.js.coffee
index 5b6a71714b2..c794d7ef397 100644
--- a/app/assets/javascripts/project_select.js.coffee
+++ b/app/assets/javascripts/project_select.js.coffee
@@ -1,10 +1,11 @@
class @ProjectSelect
constructor: ->
- $('.ajax-project-select').each (i, select) ->
+ $('.ajax-project-select').each (i, select) =>
@groupId = $(select).data('group-id')
@includeGroups = $(select).data('include-groups')
@orderBy = $(select).data('order-by') || 'id'
@selectId = $(select).data('select-id') || 'web_url'
+ @accessLevel = $(select).data('access-level')
placeholder = "Search for project"
placeholder += " or group" if @includeGroups
@@ -12,25 +13,11 @@ class @ProjectSelect
$(select).select2
placeholder: placeholder
minimumInputLength: 0
- query: (query) =>
- finalCallback = (projects) ->
- data = { results: projects }
- query.callback(data)
-
- if @includeGroups
- projectsCallback = (projects) ->
- groupsCallback = (groups) ->
- data = groups.concat(projects)
- finalCallback(data)
-
- Api.groups query.term, false, groupsCallback
- else
- projectsCallback = finalCallback
-
+ query: (options) =>
if @groupId
- Api.groupProjects @groupId, query.term, projectsCallback
+ Api.groupProjects @groupId, options.term, @createCallback(options)
else
- Api.projects query.term, @orderBy, projectsCallback
+ Api.projects options.term, @orderBy, @createCallback(options)
id: (project) =>
project[@selectId]
@@ -39,3 +26,36 @@ class @ProjectSelect
project.name_with_namespace || project.name
dropdownCssClass: "ajax-project-dropdown"
+
+ createCallback: (options) =>
+ finalCallback = (projects) ->
+ options.callback({ results: projects })
+
+ @accessLevelCallbackDecorator(
+ @groupsCallbackDecorator(
+ finalCallback
+ )
+ )
+
+ groupsCallbackDecorator: (callback) =>
+ return callback unless @includeGroups
+
+ (projects) =>
+ Api.groups options.term, false, (groups) =>
+ data = groups.concat(projects)
+ callback(data)
+
+ accessLevelCallbackDecorator: (callback) =>
+ return callback unless @accessLevel
+
+ ##
+ # Requires ECMAScript >= 5
+ #
+ (projects) =>
+ data = projects.filter (i) =>
+ max = Math.max(i.permissions.group_access?.access_level ? 0,
+ i.permissions.project_access?.access_level ? 0)
+
+ max >= @accessLevel
+
+ callback(data)
diff --git a/app/models/user.rb b/app/models/user.rb
index 68b242888aa..5ba72dc0ae9 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -429,7 +429,7 @@ class User < ActiveRecord::Base
Group.where("namespaces.id IN (#{union.to_sql})")
end
- # Returns the groups a user is authorized to access.
+ # Returns projects user is authorized to access.
def authorized_projects
Project.where("projects.id IN (#{projects_union.to_sql})")
end
diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index d9f4692d377..25f970f0801 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -15,7 +15,7 @@ module Issues
ActiveRecord::Base.transaction do
# New issue tasks
#
- open_new_issue
+ create_new_issue
rewrite_notes
add_moved_from_note
@@ -43,7 +43,7 @@ module Issues
can?(@current_user, :admin_issue, @project_new)
end
- def open_new_issue
+ def create_new_issue
@issue_new.iid = nil
@issue_new.project = @project_new
@issue_new.labels = []
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index 5b3c0ee2734..3d64738095f 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -73,7 +73,8 @@
= f.label :move_to_project_id, 'Move', class: 'control-label'
.col-sm-10
= project_select_tag("#{issuable.class.model_name.param_key}[move_to_project_id]",
- placeholder: 'Select project', class: 'custom-form-control', data: { 'select-id' => 'id' })
+ placeholder: 'Select project', class: 'custom-form-control',
+ data: { 'select-id' => 'id', 'access-level' => Gitlab::Access::REPORTER })
- if issuable.is_a?(MergeRequest)
%hr