From b8e7d29754a68254c80bcb2edca7a03083326bc8 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 2 Dec 2016 17:27:14 +0800 Subject: [PATCH 01/11] Update group sharing drop-down to display all available groups Fixes 25250 Add minimum length to avoid loading all groups Query for all_available groups --- app/assets/javascripts/groups_select.js | 2 +- app/views/projects/group_links/_index.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js index a50bc4a90576..6beafe0cfdf4 100644 --- a/app/assets/javascripts/groups_select.js +++ b/app/assets/javascripts/groups_select.js @@ -14,7 +14,7 @@ return $(select).select2({ placeholder: "Search for a group", multiple: $(select).hasClass('multiselect'), - minimumInputLength: 0, + minimumInputLength: 1, query: function(query) { var options = { all_available: all_available, skip_groups: skip_groups }; return Api.groups(query.term, options, function(groups) { diff --git a/app/views/projects/group_links/_index.html.haml b/app/views/projects/group_links/_index.html.haml index 99d0df2ac34e..05ada0ff7359 100644 --- a/app/views/projects/group_links/_index.html.haml +++ b/app/views/projects/group_links/_index.html.haml @@ -11,7 +11,7 @@ = form_tag namespace_project_group_links_path(@project.namespace, @project), class: 'js-requires-input', method: :post do .form-group = label_tag :link_group_id, "Group", class: "label-light" - = groups_select_tag(:link_group_id, data: { skip_groups: @skip_groups }, required: true) + = groups_select_tag(:link_group_id, data: { skip_groups: @skip_groups, all_available: true }, required: true) .form-group = label_tag :link_group_access, "Max access level", class: "label-light" .select-wrapper -- GitLab From d023245f116d0069c1046b730f824407091f06ef Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 8 Dec 2016 22:13:44 +0800 Subject: [PATCH 02/11] Add project user count to group model Expose project and user count via API --- app/models/group.rb | 8 ++++++++ lib/api/entities.rb | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/models/group.rb b/app/models/group.rb index 99675ddb3661..914075b12aae 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -207,4 +207,12 @@ def members_with_parents def users_with_parents User.where(id: members_with_parents.select(:user_id)) end + + def user_count + users.count + end + + def project_count + projects.count + end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 9f59939e9ae0..1a2bbefb30d5 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -137,7 +137,6 @@ class Group < Grape::Entity expose :avatar_url expose :web_url expose :request_access_enabled - expose :statistics, if: :statistics do with_options format_with: -> (value) { value.to_i } do expose :storage_size @@ -146,6 +145,8 @@ class Group < Grape::Entity expose :build_artifacts_size end end + expose :user_count + expose :project_count end class GroupDetail < Group -- GitLab From 6dd9af6c1c190e4c4dcc70beaa076938b9d5c7a1 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 8 Dec 2016 22:20:26 +0800 Subject: [PATCH 03/11] Update group_select template, Pass default_group_avatar in gon remove min length --- app/assets/javascripts/groups_select.js | 7 ++++--- lib/gitlab/gon_helper.rb | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js index 6beafe0cfdf4..90e9fa0aafc5 100644 --- a/app/assets/javascripts/groups_select.js +++ b/app/assets/javascripts/groups_select.js @@ -14,7 +14,7 @@ return $(select).select2({ placeholder: "Search for a group", multiple: $(select).hasClass('multiselect'), - minimumInputLength: 1, + minimumInputLength: 0, query: function(query) { var options = { all_available: all_available, skip_groups: skip_groups }; return Api.groups(query.term, options, function(groups) { @@ -57,9 +57,10 @@ if (group.avatar_url) { avatar = group.avatar_url; } else { - avatar = gon.default_avatar_url; + avatar = gon.default_group_avatar; } - return "
" + group.name + "
" + group.path + "
"; + + return "
  • " + group.project_count + "" + group.user_count + "
    " + group.name + "

    " + group.description + "

  • "; }; GroupsSelect.prototype.formatSelection = function(group) { diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb index b8a5ac907a44..d5c9cc51cdc9 100644 --- a/lib/gitlab/gon_helper.rb +++ b/lib/gitlab/gon_helper.rb @@ -3,6 +3,7 @@ module GonHelper def add_gon_variables gon.api_version = API::API.version gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s + gon.default_group_avatar = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_group_avatar.png')).to_s gon.max_file_size = current_application_settings.max_attachment_size gon.relative_url_root = Gitlab.config.gitlab.relative_url_root gon.shortcuts_path = help_page_path('shortcuts') -- GitLab From 258ac7a6700f22b6e4051c7a64c234c0df59d965 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 8 Dec 2016 23:07:06 +0800 Subject: [PATCH 04/11] Switch visibility level, remove gl-gray --- app/assets/javascripts/groups_select.js | 17 +++++++++++++++-- app/assets/stylesheets/pages/groups.scss | 2 -- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js index 90e9fa0aafc5..48e5531c421b 100644 --- a/app/assets/javascripts/groups_select.js +++ b/app/assets/javascripts/groups_select.js @@ -53,14 +53,27 @@ } GroupsSelect.prototype.formatResult = function(group) { - var avatar; + var avatar, + visibility; if (group.avatar_url) { avatar = group.avatar_url; } else { avatar = gon.default_group_avatar; } - return "
  • " + group.project_count + "" + group.user_count + "
    " + group.name + "

    " + group.description + "

  • "; + switch (group.visibility_level) { + case 0: + visibility = 'fa-lock'; + break; + case 10: + visibility = 'fa-shield'; + break; + case 20: + visibility = 'fa-globe'; + break; + } + + return "
  • " + group.project_count + "" + group.user_count + "
    " + group.name + "

    " + group.description + "

  • "; }; GroupsSelect.prototype.formatSelection = function(group) { diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss index d377526e655e..03443169aae3 100644 --- a/app/assets/stylesheets/pages/groups.scss +++ b/app/assets/stylesheets/pages/groups.scss @@ -13,8 +13,6 @@ .stats { float: right; line-height: $list-text-height; - color: $gl-text-color; - span { margin-right: 15px; } -- GitLab From 2da665e820b55330d5ea0b8772b490225fac0827 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 9 Dec 2016 08:11:06 +0800 Subject: [PATCH 05/11] Fix lint issues, add default to swtich --- app/assets/javascripts/groups_select.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js index 48e5531c421b..aac8a0417f4b 100644 --- a/app/assets/javascripts/groups_select.js +++ b/app/assets/javascripts/groups_select.js @@ -1,6 +1,5 @@ /* eslint-disable func-names, space-before-function-paren, no-var, wrap-iife, one-var, camelcase, one-var-declaration-per-line, quotes, object-shorthand, prefer-arrow-callback, comma-dangle, consistent-return, yoda, prefer-rest-params, prefer-spread, no-unused-vars, prefer-template, max-len */ /* global Api */ - (function() { var slice = [].slice; @@ -53,8 +52,7 @@ } GroupsSelect.prototype.formatResult = function(group) { - var avatar, - visibility; + var avatar, visibility; if (group.avatar_url) { avatar = group.avatar_url; } else { @@ -71,6 +69,8 @@ case 20: visibility = 'fa-globe'; break; + default: + visibility = 'fa-globe'; } return "
  • " + group.project_count + "" + group.user_count + "
    " + group.name + "

    " + group.description + "

  • "; -- GitLab From 58844b38f3cb8a24f424b46c62fab3554e45f289 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 14 Dec 2016 22:15:21 +0800 Subject: [PATCH 06/11] Move to es6 --- app/assets/javascripts/{groups_select.js => groups_select.js.es6} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/assets/javascripts/{groups_select.js => groups_select.js.es6} (100%) diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js.es6 similarity index 100% rename from app/assets/javascripts/groups_select.js rename to app/assets/javascripts/groups_select.js.es6 -- GitLab From 1998af2b1ff4bee43927fd10f42cc4c4ea46339e Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 14 Dec 2016 22:40:19 +0800 Subject: [PATCH 07/11] Use template literals, reformat html --- app/assets/javascripts/groups_select.js.es6 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/groups_select.js.es6 b/app/assets/javascripts/groups_select.js.es6 index aac8a0417f4b..ac0d2a0e150c 100644 --- a/app/assets/javascripts/groups_select.js.es6 +++ b/app/assets/javascripts/groups_select.js.es6 @@ -73,7 +73,14 @@ visibility = 'fa-globe'; } - return "
  • " + group.project_count + "" + group.user_count + "
    " + group.name + "

    " + group.description + "

  • "; + return `
  • +
    ${group.project_count}${group.user_count}
    +
    +
    ${group.name}
    +
    +

    ${group.description}

    +
    +
  • `; }; GroupsSelect.prototype.formatSelection = function(group) { -- GitLab From dadb2948a1be15613ad0af8af5222670fef8ea29 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 19 Dec 2016 18:49:19 +0800 Subject: [PATCH 08/11] Add visibilityIcon function to GroupsSelect --- app/assets/javascripts/groups_select.js.es6 | 31 +++++++++++---------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/app/assets/javascripts/groups_select.js.es6 b/app/assets/javascripts/groups_select.js.es6 index ac0d2a0e150c..5d21e53f3223 100644 --- a/app/assets/javascripts/groups_select.js.es6 +++ b/app/assets/javascripts/groups_select.js.es6 @@ -49,6 +49,21 @@ }); }; })(this)); + GroupsSelect.visibilityIcon = function (visibilityLevel) { + switch (visibilityLevel) { + case 0: + return 'fa-lock'; + break; + case 10: + return 'fa-shield'; + break; + case 20: + return 'fa-globe'; + break; + default: + return 'fa-globe'; + } + }; } GroupsSelect.prototype.formatResult = function(group) { @@ -59,22 +74,8 @@ avatar = gon.default_group_avatar; } - switch (group.visibility_level) { - case 0: - visibility = 'fa-lock'; - break; - case 10: - visibility = 'fa-shield'; - break; - case 20: - visibility = 'fa-globe'; - break; - default: - visibility = 'fa-globe'; - } - return `
  • -
    ${group.project_count}${group.user_count}
    +
    ${group.project_count}${group.user_count}
    ${group.name}
    -- GitLab From c0bbd2279e7cc5b6dd0f576a2d14a2335759da41 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 19 Dec 2016 19:05:42 +0800 Subject: [PATCH 09/11] Remove unreachable breaks --- app/assets/javascripts/groups_select.js.es6 | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/assets/javascripts/groups_select.js.es6 b/app/assets/javascripts/groups_select.js.es6 index 5d21e53f3223..e0782a990002 100644 --- a/app/assets/javascripts/groups_select.js.es6 +++ b/app/assets/javascripts/groups_select.js.es6 @@ -53,13 +53,10 @@ switch (visibilityLevel) { case 0: return 'fa-lock'; - break; case 10: return 'fa-shield'; - break; case 20: return 'fa-globe'; - break; default: return 'fa-globe'; } -- GitLab From 089d0a6a32763747de8a28ef63a0c226f414abd6 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 20 Dec 2016 20:06:29 +0800 Subject: [PATCH 10/11] Change placeholder for select2-input and select2-search The on select2-open is required due to https://github.com/select2/select2/issues/3362 --- app/assets/javascripts/groups_select.js.es6 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/groups_select.js.es6 b/app/assets/javascripts/groups_select.js.es6 index e0782a990002..d12a2f573c31 100644 --- a/app/assets/javascripts/groups_select.js.es6 +++ b/app/assets/javascripts/groups_select.js.es6 @@ -10,8 +10,11 @@ var all_available, skip_groups; all_available = $(select).data('all-available'); skip_groups = $(select).data('skip-groups') || []; + $(select).on("select2-open", function() { + $(".select2-input").attr("placeholder", "Search for a group"); + }); return $(select).select2({ - placeholder: "Search for a group", + placeholder: "Select a group", multiple: $(select).hasClass('multiselect'), minimumInputLength: 0, query: function(query) { -- GitLab From ea68d812aacfb318d921705c0c8c3227069565e7 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 20 Dec 2016 20:32:11 +0800 Subject: [PATCH 11/11] Limit initial results by checking query.term --- app/assets/javascripts/groups_select.js.es6 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/groups_select.js.es6 b/app/assets/javascripts/groups_select.js.es6 index d12a2f573c31..58f228e408b2 100644 --- a/app/assets/javascripts/groups_select.js.es6 +++ b/app/assets/javascripts/groups_select.js.es6 @@ -7,17 +7,17 @@ function GroupsSelect() { $('.ajax-groups-select').each((function(_this) { return function(i, select) { - var all_available, skip_groups; - all_available = $(select).data('all-available'); + var skip_groups; skip_groups = $(select).data('skip-groups') || []; $(select).on("select2-open", function() { $(".select2-input").attr("placeholder", "Search for a group"); - }); + }); return $(select).select2({ placeholder: "Select a group", multiple: $(select).hasClass('multiselect'), minimumInputLength: 0, query: function(query) { + var all_available = query.term ? 'true' : 'false'; var options = { all_available: all_available, skip_groups: skip_groups }; return Api.groups(query.term, options, function(groups) { var data; -- GitLab