diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/api.js.coffee | 31 | ||||
-rw-r--r-- | app/assets/javascripts/project_select.js.coffee | 26 | ||||
-rw-r--r-- | app/assets/stylesheets/framework/common.scss | 13 | ||||
-rw-r--r-- | app/helpers/selects_helper.rb | 13 | ||||
-rw-r--r-- | app/views/dashboard/issues.html.haml | 13 | ||||
-rw-r--r-- | app/views/dashboard/merge_requests.html.haml | 13 | ||||
-rw-r--r-- | app/views/dashboard/milestones/index.html.haml | 13 | ||||
-rw-r--r-- | app/views/groups/issues.html.haml | 13 | ||||
-rw-r--r-- | app/views/groups/merge_requests.html.haml | 13 | ||||
-rw-r--r-- | app/views/shared/_new_project_item_select.html.haml | 20 |
10 files changed, 108 insertions, 60 deletions
diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee index 9e5d594c861..746fa3cea87 100644 --- a/app/assets/javascripts/api.js.coffee +++ b/app/assets/javascripts/api.js.coffee @@ -2,6 +2,8 @@ groups_path: "/api/:version/groups.json" group_path: "/api/:version/groups/:id.json" namespaces_path: "/api/:version/namespaces.json" + group_projects_path: "/api/:version/groups/:id/projects.json" + projects_path: "/api/:version/projects.json" group: (group_id, callback) -> url = Api.buildUrl(Api.group_path) @@ -44,6 +46,35 @@ ).done (namespaces) -> callback(namespaces) + # Return projects list. Filtered by query + projects: (query, callback) -> + url = Api.buildUrl(Api.projects_path) + + $.ajax( + url: url + data: + private_token: gon.api_token + search: query + per_page: 20 + dataType: "json" + ).done (projects) -> + callback(projects) + + # Return group projects list. Filtered by query + groupProjects: (group_id, query, callback) -> + url = Api.buildUrl(Api.group_projects_path) + url = url.replace(':id', group_id) + + $.ajax( + url: url + data: + private_token: gon.api_token + search: query + per_page: 20 + dataType: "json" + ).done (projects) -> + callback(projects) + buildUrl: (url) -> url = gon.relative_url_root + url if gon.relative_url_root? return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/project_select.js.coffee b/app/assets/javascripts/project_select.js.coffee new file mode 100644 index 00000000000..43b18a3da59 --- /dev/null +++ b/app/assets/javascripts/project_select.js.coffee @@ -0,0 +1,26 @@ +class @ProjectSelect + constructor: -> + $('.ajax-project-select').each (i, select) -> + @groupId = $(select).data('group-id') + + $(select).select2 + placeholder: "Search for project" + multiple: $(select).hasClass('multiselect') + minimumInputLength: 0 + query: (query) => + callback = (projects) -> + data = { results: projects } + query.callback(data) + + if @groupId + Api.groupProjects @groupId, query.term, callback + else + Api.projects query.term, callback + + id: (project) -> + project.web_url + + text: (project) -> + project.name_with_namespace + + dropdownCssClass: "ajax-project-dropdown" diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss index 61ecd58e6c5..19b0868dfef 100644 --- a/app/assets/stylesheets/framework/common.scss +++ b/app/assets/stylesheets/framework/common.scss @@ -441,3 +441,16 @@ table { .alert, .progress { margin-bottom: $gl-padding; } + +.new-project-item-select-holder { + display: inline-block; + position: relative; + + .new-project-item-select { + position: absolute; + top: 0; + right: 0; + width: 250px !important; + visibility: hidden; + } +} diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb index 7e54d4d1b5b..418120a3f73 100644 --- a/app/helpers/selects_helper.rb +++ b/app/helpers/selects_helper.rb @@ -46,6 +46,19 @@ module SelectsHelper select2_tag(id, opts) end + def project_select_tag(id, opts = {}) + opts[:class] ||= '' + opts[:class] << ' ajax-project-select' + + unless opts.delete(:scope) == :all + if @group + opts['data-group-id'] = @group.id + end + end + + hidden_field_tag(id, opts[:selected], opts) + end + def select2_tag(id, opts = {}) css_class = '' css_class << 'multiselect ' if opts[:multiple] diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml index 829c3c83769..2d3da01178a 100644 --- a/app/views/dashboard/issues.html.haml +++ b/app/views/dashboard/issues.html.haml @@ -12,18 +12,7 @@ = link_to issues_dashboard_url(format: :atom, private_token: current_user.private_token), class: 'btn' do %i.fa.fa-rss - - if @projects.any? { |project| can?(current_user, :create_issue, project) } - .dropdown.inline.prepend-left-10 - %button.dropdown-toggle.btn.btn-new{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-plus - New Issue - %b.caret - %ul.dropdown-menu.dropdown-menu-align-right - - @projects.each do |project| - - if can?(current_user, :create_issue, project) - %li - = link_to new_namespace_project_issue_path(project.namespace, project) do - = project.name_with_namespace + = render 'shared/new_project_item_select', path: 'issues/new', label: "New Issue" = render 'shared/issuable/filter', type: :issues diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml index 2e91c8dec8a..c5a5ec21f78 100644 --- a/app/views/dashboard/merge_requests.html.haml +++ b/app/views/dashboard/merge_requests.html.haml @@ -3,18 +3,7 @@ .project-issuable-filter .controls - - if @projects.any? { |project| can?(current_user, :create_merge_request, project) } - .dropdown.inline - %button.dropdown-toggle.btn.btn-new{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-plus - New Merge Request - %b.caret - %ul.dropdown-menu.dropdown-menu-align-right - - @projects.each do |project| - - if can?(current_user, :create_merge_request, project) - %li - = link_to new_namespace_project_merge_request_path(project.namespace, project) do - = project.name_with_namespace + = render 'shared/new_project_item_select', path: 'merge_requests/new', label: "New Merge Request" = render 'shared/issuable/filter', type: :merge_requests diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml index 9aea75e50db..94ff259a338 100644 --- a/app/views/dashboard/milestones/index.html.haml +++ b/app/views/dashboard/milestones/index.html.haml @@ -3,18 +3,7 @@ .project-issuable-filter .controls - - if @projects.any? { |project| can?(current_user, :admin_milestone, project) } - .dropdown.inline - %button.dropdown-toggle.btn.btn-new{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-plus - New Milestone - %b.caret - %ul.dropdown-menu.dropdown-menu-align-right - - @projects.each do |project| - - if can?(current_user, :admin_milestone, project) - %li - = link_to new_namespace_project_milestone_path(project.namespace, project) do - = project.name_with_namespace + = render 'shared/new_project_item_select', path: 'milestones/new', label: "New Milestone" = render 'shared/milestones_filter' diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml index 5a9739a0cda..90ade1e1680 100644 --- a/app/views/groups/issues.html.haml +++ b/app/views/groups/issues.html.haml @@ -12,18 +12,7 @@ = link_to issues_group_url(@group, format: :atom, private_token: current_user.private_token), class: 'btn' do %i.fa.fa-rss - - if @projects.any? { |project| can?(current_user, :create_issue, project) } - .dropdown.inline.prepend-left-10 - %button.dropdown-toggle.btn.btn-new{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-plus - New Issue - %b.caret - %ul.dropdown-menu.dropdown-menu-align-right - - @projects.each do |project| - - if can?(current_user, :create_issue, project) - %li - = link_to new_namespace_project_issue_path(project.namespace, project) do - = project.name_with_namespace + = render 'shared/new_project_item_select', path: 'issues/new', label: "New Issue" = render 'shared/issuable/filter', type: :issues diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml index 95c503a3afa..f662f5a8c17 100644 --- a/app/views/groups/merge_requests.html.haml +++ b/app/views/groups/merge_requests.html.haml @@ -3,18 +3,7 @@ .project-issuable-filter .controls - - if @projects.any? { |project| can?(current_user, :create_merge_request, project) } - .dropdown.inline - %button.dropdown-toggle.btn.btn-new{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-plus - New Merge Request - %b.caret - %ul.dropdown-menu.dropdown-menu-align-right - - @projects.each do |project| - - if can?(current_user, :create_merge_request, project) - %li - = link_to new_namespace_project_merge_request_path(project.namespace, project) do - = project.name_with_namespace + = render 'shared/new_project_item_select', path: 'merge_requests/new', label: "New Merge Request" = render 'shared/issuable/filter', type: :merge_requests diff --git a/app/views/shared/_new_project_item_select.html.haml b/app/views/shared/_new_project_item_select.html.haml new file mode 100644 index 00000000000..d7243b2d518 --- /dev/null +++ b/app/views/shared/_new_project_item_select.html.haml @@ -0,0 +1,20 @@ +- if @projects.any? + .prepend-left-10.new-project-item-select-holder + = project_select_tag :project_path, class: "new-project-item-select" + %a.btn.btn-new.new-project-item-select-button + = icon('plus') + = local_assigns[:label] + %b.caret + + :javascript + $('.new-project-item-select-button').on('click', function() { + $('.new-project-item-select').select2('open'); + }); + + var relativePath = '#{local_assigns[:path]}'; + + $('.new-project-item-select').on('click', function() { + window.location = $(this).val() + '/' + relativePath; + }); + + new ProjectSelect() |