diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-03-14 11:25:04 +0100 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-03-17 07:39:16 +0100 |
commit | bcd5806960f3f74e27bc8e7c8a6fab3a044c181a (patch) | |
tree | 6f8ea9683756ed4aebee538706e7e80ff4d9dc21 /app | |
parent | a91101b19a44d98005dd21b06d8509abcd82ddfc (diff) | |
download | gitlab-ce-bcd5806960f3f74e27bc8e7c8a6fab3a044c181a.tar.gz |
Add access-level filter support for projects select
This also refactores ProjectSelect adding some decorator-like functions.
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/project_select.js.coffee | 56 | ||||
-rw-r--r-- | app/models/user.rb | 2 | ||||
-rw-r--r-- | app/services/issues/move_service.rb | 4 | ||||
-rw-r--r-- | app/views/shared/issuable/_form.html.haml | 3 |
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 |