diff --git a/app/assets/javascripts/discourse/controllers/groups.js.es6 b/app/assets/javascripts/discourse/controllers/groups.js.es6 index 4c2b675f707..4009ba91afb 100644 --- a/app/assets/javascripts/discourse/controllers/groups.js.es6 +++ b/app/assets/javascripts/discourse/controllers/groups.js.es6 @@ -1,10 +1,18 @@ import { observes } from 'ember-addons/ember-computed-decorators'; +import debounce from 'discourse/lib/debounce'; export default Ember.Controller.extend({ application: Ember.inject.controller(), - queryParams: ["order", "asc"], + queryParams: ["order", "asc", "filter"], order: null, asc: null, + filter: "", + filterInput: "", + + @observes("filterInput") + _setFilter: debounce(function() { + this.set("filter", this.get("filterInput")); + }, 500), @observes("model.canLoadMore") _showFooter() { diff --git a/app/assets/javascripts/discourse/routes/groups.js.es6 b/app/assets/javascripts/discourse/routes/groups.js.es6 index 3aca55574b2..fa6cb85b365 100644 --- a/app/assets/javascripts/discourse/routes/groups.js.es6 +++ b/app/assets/javascripts/discourse/routes/groups.js.es6 @@ -2,6 +2,7 @@ export default Discourse.Route.extend({ queryParams: { order: { refreshModel: true, replace: true }, asc: { refreshModel: true, replace: true }, + filter: { refreshModel: true } }, refreshQueryWithoutTransition: true, diff --git a/app/assets/javascripts/discourse/templates/groups.hbs b/app/assets/javascripts/discourse/templates/groups.hbs index aa5734f4679..857d8161d00 100644 --- a/app/assets/javascripts/discourse/templates/groups.hbs +++ b/app/assets/javascripts/discourse/templates/groups.hbs @@ -1,68 +1,74 @@ {{#d-section pageClass="groups"}}

{{i18n "groups.index.title"}}

+ {{text-field value=filterInput + placeholderKey="groups.filter_name" + class="group-filter-name no-blur"}} + {{#if model}} - {{#load-more selector=".groups-table .groups-table-row" action="loadMore"}} -
- - - - {{directory-toggle field="user_count" labelKey="groups.user_count" order=order asc=asc}} - - + {{#conditional-loading-spinner condition=model.loading}} + {{#load-more selector=".groups-table .groups-table-row" action="loadMore"}} +
+
{{i18n "groups.membership"}}
+ + + {{directory-toggle field="user_count" labelKey="groups.user_count" order=order asc=asc}} + + - - {{#each model as |group|}} - - + {{#each model as |group|}} + + - - {{group.displayName}} + - {{#if group.full_name}} - {{group.full_name}} - {{/if}} + + {{d-button icon="ban" + label=(if group.automatic 'groups.automatic_group' 'groups.closed_group') + disabled=true}} + {{/group-membership-button}} + + + {{/each}} + +
{{i18n "groups.membership"}}
- {{#link-to "group.members" group.name}} - {{#if group.flair_url}} - - {{avatar-flair - flairURL=group.flair_url - flairBgColor=group.flair_bg_color - flairColor=group.flair_color - groupName=group.name}} +
+ {{#link-to "group.members" group.name}} + {{#if group.flair_url}} + + {{avatar-flair + flairURL=group.flair_url + flairBgColor=group.flair_bg_color + flairColor=group.flair_color + groupName=group.name}} + + {{/if}} + + + {{group.displayName}} + + {{#if group.full_name}} + {{group.full_name}} + {{/if}} + + {{#if group.title}} +
+ {{group.title}} +
+ {{/if}}
- {{/if}} + {{/link-to}} +
{{group.user_count}} + {{#group-membership-button model=group + showMembershipStatus=true + groupUserIds=groups.extras.group_user_ids + showLogin='showLogin'}} - {{#if group.title}} -
- {{group.title}} -
- {{/if}} - - {{/link-to}} -
+
+ {{/load-more}} - {{group.user_count}} - - - {{#group-membership-button model=group - showMembershipStatus=true - groupUserIds=groups.extras.group_user_ids - showLogin='showLogin'}} - - {{d-button icon="ban" - label=(if group.automatic 'groups.automatic_group' 'groups.closed_group') - disabled=true}} - {{/group-membership-button}} - - - {{/each}} - - - - {{/load-more}} - - {{conditional-loading-spinner condition=model.loadingMore}} + {{conditional-loading-spinner condition=model.loadingMore}} + {{/conditional-loading-spinner}} {{else}}

{{i18n "groups.index.empty"}}

{{/if}} diff --git a/app/assets/stylesheets/common/base/groups.scss b/app/assets/stylesheets/common/base/groups.scss index 08f346df66d..a547ec332d9 100644 --- a/app/assets/stylesheets/common/base/groups.scss +++ b/app/assets/stylesheets/common/base/groups.scss @@ -1,9 +1,15 @@ .groups-page { h1 { - margin: 20px 0; + margin-bottom: 20px; + display: inline-block; } } +.group-filter-name { + display: inline-block; + float: right; +} + .groups-table { width: 100%; diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 0543fd514cf..306cf062e28 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -24,6 +24,10 @@ class GroupsController < ApplicationController dir = params[:asc] ? 'ASC' : 'DESC' groups = Group.visible_groups(current_user, order ? "#{order} #{dir}" : nil) + if (filter = params[:filter]).present? + groups = Group.search_groups(filter, groups: groups) + end + unless guardian.is_staff? # hide automatic groups from all non stuff to de-clutter page groups = groups.where(automatic: false) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 96294e99a61..73bbb6b977b 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -432,6 +432,7 @@ en: join: "Join Group" leave: "Leave Group" request: "Request to Join Group" + filter_name: "filter by group name" message: "Message" automatic_group: Automatic Group closed_group: Closed Group diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index e9c9ddb6d2b..8b90e461c7e 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -18,6 +18,16 @@ describe GroupsController do end end + context 'searchable' do + it 'should return the right response' do + other_group = Fabricate(:group, name: 'testing') + get "/groups.json", params: { filter: 'test' } + + expect(response.status).to eq(200) + expect(JSON.parse(response.body)["groups"].first["id"]).to eq(other_group.id) + end + end + context 'sortable' do let!(:other_group) { Fabricate(:group, name: "zzzzzz", users: [user]) }