diff --git a/domain/user/endpoint.go b/domain/user/endpoint.go index c945d61b..b2961101 100644 --- a/domain/user/endpoint.go +++ b/domain/user/endpoint.go @@ -694,7 +694,12 @@ func (h *Handler) MatchUsers(w http.ResponseWriter, r *http.Request) { } searchText := string(body) - u, err := h.Store.User.MatchUsers(ctx, searchText, 100) + limit, _ := strconv.Atoi(request.Query(r, "limit")) + if limit == 0 { + limit = 100 + } + + u, err := h.Store.User.MatchUsers(ctx, searchText, limit) if err != nil { response.WriteServerError(w, method, err) h.Runtime.Log.Error(method, err) diff --git a/gui/app/components/customize/user-groups.js b/gui/app/components/customize/user-groups.js index bf9b9555..bb5bbda8 100644 --- a/gui/app/components/customize/user-groups.js +++ b/gui/app/components/customize/user-groups.js @@ -13,19 +13,18 @@ import $ from 'jquery'; import { inject as service } from '@ember/service'; import { debounce } from '@ember/runloop'; import { A } from '@ember/array'; -import Component from '@ember/component'; import AuthProvider from '../../mixins/auth'; import ModalMixin from '../../mixins/modal'; +import Component from '@ember/component'; export default Component.extend(AuthProvider, ModalMixin, { groupSvc: service('group'), userSvc: service('user'), newGroup: null, searchText: '', - showUsers: false, - showMembers: true, users: null, members: null, + userLimit: 100, didReceiveAttrs() { this._super(...arguments); @@ -34,11 +33,9 @@ export default Component.extend(AuthProvider, ModalMixin, { }, loadGroups() { - this.get('groupSvc') - .getAll() - .then(groups => { - this.set('groups', groups); - }); + this.get('groupSvc').getAll().then(groups => { + this.set('groups', groups); + }); }, setDefaults() { @@ -55,32 +52,22 @@ export default Component.extend(AuthProvider, ModalMixin, { this.set('members', members); this.get('userSvc') - .matchUsers(searchText) + .matchUsers(searchText, this.get('userLimit')) .then(users => { let filteredUsers = A([]); users.forEach(user => { let m = members.findBy('userId', user.get('id')); if (is.undefined(m)) filteredUsers.pushObject(user); - // user.set('isMember', is.not.undefined(m)); }); - if (this.get('showMembers') && members.length === 0) { - this.set('showMembers', false); - this.set('showUsers', true); - } - this.set('users', filteredUsers); }); }); }, actions: { - onOpenGroupModal() { - this.modalOpen( - '#add-group-modal', - { show: true }, - '#new-group-name' - ); + onShowAddGroupModal() { + this.modalOpen('#add-group-modal', { show: true }, '#new-group-name'); }, onAddGroup(e) { @@ -171,38 +158,23 @@ export default Component.extend(AuthProvider, ModalMixin, { this.set('editGroup', null); }, - onShowMembersModal(groupId) { + onShowRemoveMemberModal(groupId) { this.set('membersGroup', this.get('groups').findBy('id', groupId)); - this.modalOpen( - '#group-members-modal', - { show: true }, - '#group-members-search' - ); + this.modalOpen('#group-remove-member-modal', { show: true }); this.set('members', null); + this.loadGroupInfo(); + }, + + onShowAddMemberModal(groupId) { + this.set('membersGroup', this.get('groups').findBy('id', groupId)); + this.modalOpen('#group-add-member-modal', { show: true }, '#group-add-members-search'); this.set('users', null); - this.set('showMembers', true); - this.set('showUsers', false); this.set('searchText', ''); this.loadGroupInfo(); }, onSearch() { - debounce( - this, - function() { - let searchText = this.get('searchText'); - this.loadGroupInfo(); - - if (is.not.empty(searchText)) { - this.set('showMembers', false); - this.set('showUsers', true); - } else { - this.set('showMembers', true); - this.set('showUsers', false); - } - }, - 450 - ); + debounce(this, function() { this.loadGroupInfo(); }, 450); }, onLeaveGroup(userId) { @@ -225,6 +197,11 @@ export default Component.extend(AuthProvider, ModalMixin, { this.loadGroupInfo(); this.loadGroups(); }); + }, + + onLimit(limit) { + this.set('userLimit', limit); + this.loadGroupInfo(); } } }); diff --git a/gui/app/components/customize/user-list.js b/gui/app/components/customize/user-list.js index 4f8af1c5..e41214cc 100644 --- a/gui/app/components/customize/user-list.js +++ b/gui/app/components/customize/user-list.js @@ -12,11 +12,12 @@ import $ from 'jquery'; import { inject as service } from '@ember/service'; import { schedule, debounce } from '@ember/runloop'; +import TooltipMixin from '../../mixins/tooltip'; import AuthProvider from '../../mixins/auth'; import ModalMixin from '../../mixins/modal'; import Component from '@ember/component'; -export default Component.extend(AuthProvider, ModalMixin, { +export default Component.extend(AuthProvider, ModalMixin, TooltipMixin, { groupSvc: service('group'), editUser: null, deleteUser: null, @@ -45,6 +46,13 @@ export default Component.extend(AuthProvider, ModalMixin, { }); this.set('users', users); + + this.renderTooltips(); + }, + + willDestroyElement() { + this._super(...arguments); + this.removeTooltips(); }, onKeywordChange: function () { diff --git a/gui/app/pods/customize/groups/controller.js b/gui/app/pods/customize/groups/controller.js index f5539165..fe1fb43c 100644 --- a/gui/app/pods/customize/groups/controller.js +++ b/gui/app/pods/customize/groups/controller.js @@ -12,6 +12,4 @@ import Controller from '@ember/controller'; export default Controller.extend({ - actions: { - } }); diff --git a/gui/app/services/user.js b/gui/app/services/user.js index 731ffb67..1d11323f 100644 --- a/gui/app/services/user.js +++ b/gui/app/services/user.js @@ -169,8 +169,10 @@ export default Service.extend({ }, // matchUsers on firstname, lastname, email - matchUsers(text) { - return this.get('ajax').request('users/match', { + matchUsers(text, limit) { + if (is.null(limit) || is.undefined(limit)) limit = 100; + + return this.get('ajax').request(`users/match?limit=${limit}`, { method: 'POST', dataType: 'json', contentType: 'text', diff --git a/gui/app/styles/bootstrap.scss b/gui/app/styles/bootstrap.scss index 7fb380c7..8b2a1061 100644 --- a/gui/app/styles/bootstrap.scss +++ b/gui/app/styles/bootstrap.scss @@ -119,13 +119,14 @@ $link-hover-decoration: none; .modal-80 { max-width: 80% !important; } + body.modal-open { padding-right: 0 !important; - // Do not scroll body to top. // See: https://stackoverflow.com/questions/21604674/bootstrap-modal-background-jumps-to-top-on-toggle/21881894 overflow: visible; } + .modal-header-white { background-color: $color-white !important; border: none !important; @@ -144,6 +145,7 @@ body.modal-open { .popover-header { font-size: 1.2rem; } + .popover-body { font-size: 1rem; @@ -160,6 +162,11 @@ body.modal-open { } } +.btn { + text-transform: uppercase; + font-weight: 600; +} + // Bootstrap override that removes gutter space on smaller screens // @media (max-width: 1200px) { // .container { diff --git a/gui/app/styles/view/customize.scss b/gui/app/styles/view/customize.scss index e0120201..a4b55598 100644 --- a/gui/app/styles/view/customize.scss +++ b/gui/app/styles/view/customize.scss @@ -85,13 +85,13 @@ margin: 15px 0; .name { - font-size: 1.2rem; color: $color-off-black; + font-size: 1.3rem; + font-weight: 600; > .purpose { font-size: 1rem; color: $color-gray; - display: inline-block; } } } @@ -107,15 +107,6 @@ font-size: 1.2rem; } } - - > hr { - height: 1px; - color: $color-border; - background: $color-border; - font-size: 0; - border: 0; - margin: 5px 10px; - } } // used for user admin diff --git a/gui/app/templates/components/customize/user-groups.hbs b/gui/app/templates/components/customize/user-groups.hbs index 3263f458..b09f44e2 100644 --- a/gui/app/templates/components/customize/user-groups.hbs +++ b/gui/app/templates/components/customize/user-groups.hbs @@ -4,7 +4,7 @@

Groups

Create groups for easier user management — assign users to groups

-
Add group
+
Add Group