diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index cfac9cdc2..6291b9779 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -110,6 +110,8 @@ template(name="peopleGeneral") th {{_ 'active'}} th {{_ 'authentication-method'}} th {{_ 'import-usernames'}} + th {{_ 'organizations'}} + th {{_ 'teams'}} th +newUserRow each user in peopleList @@ -257,6 +259,14 @@ template(name="peopleRow") td {{ userData.importUsernamesString }} else td {{ userData.importUsernamesString }} + if userData.loginDisabled + td {{ userData.orgsUserBelongs }} + else + td {{ userData.orgsUserBelongs }} + if userData.loginDisabled + td {{ userData.teamsUserBelongs }} + else + td {{ userData.teamsUserBelongs }} td a.edit-user i.fa.fa-edit @@ -367,6 +377,27 @@ template(name="editUserPopup") option(value="{{value}}" selected) {{_ value}} else option(value="{{value}}") {{_ value}} + label + | {{_ 'organizations'}} + i.fa.fa-plus-square#addUserOrg + i.fa.fa-minus-square#removeUserOrg + select.js-orgs#jsOrgs + option(value="-1") {{_ 'organizations'}} : + each value in orgsDatas + option(value="{{value._id}}") {{_ value.orgDisplayName}} + input#jsUserOrgsInPut.js-userOrgs(type="text" value=user.orgsUserBelongs, disabled) + input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="text" value=user.orgIdsUserBelongs) + label + | {{_ 'teams'}} + i.fa.fa-plus-square#addUserTeam + i.fa.fa-minus-square#removeUserTeam + select.js-teams#jsTeams + option(value="-1") {{_ 'teams'}} : + each value in teamsDatas + option(value="{{value._id}}") {{_ value.teamDisplayName}} + input#jsUserTeamsInPut.js-userteams(type="text" value=user.teamsUserBelongs, disabled) + input#jsUserTeamIdsInPut.js-userteamIds.hide(type="text" value=user.teamIdsUserBelongs) + hr label | {{_ 'password'}} @@ -468,6 +499,27 @@ template(name="newUserPopup") option(value="{{value}}" selected) {{_ value}} else option(value="{{value}}") {{_ value}} + label + | {{_ 'organizations'}} + i.fa.fa-plus-square#addUserOrgNewUser + i.fa.fa-minus-square#removeUserOrgNewUser + select.js-orgsNewUser#jsOrgsNewUser + option(value="-1") {{_ 'organizations'}} : + each value in orgsDatas + option(value="{{value._id}}") {{_ value.orgDisplayName}} + input#jsUserOrgsInPutNewUser.js-userOrgsNewUser(type="text" value=user.orgsUserBelongs, disabled) + input#jsUserOrgIdsInPutNewUser.js-userOrgIdsNewUser.hide(type="text" value=user.orgIdsUserBelongs) + label + | {{_ 'teams'}} + i.fa.fa-plus-square#addUserTeamNewUser + i.fa.fa-minus-square#removeUserTeamNewUser + select.js-teamsNewUser#jsTeamsNewUser + option(value="-1") {{_ 'teams'}} : + each value in teamsDatas + option(value="{{value._id}}") {{_ value.teamDisplayName}} + input#jsUserTeamsInPutNewUser.js-userteamsNewUser(type="text" value=user.teamsUserBelongs, disabled) + input#jsUserTeamIdsInPutNewUser.js-userteamIdsNewUser.hide(type="text" value=user.teamIdsUserBelongs) + hr label | {{_ 'password'}} diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index d953d3a81..3e1e9cfe5 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -1,6 +1,7 @@ const orgsPerPage = 25; const teamsPerPage = 25; const usersPerPage = 25; +let userOrgsTeamsAction = ""; //poosible actions 'addOrg', 'addTeam', 'removeOrg' or 'removeTeam' when adding or modifying a user BlazeComponent.extendComponent({ mixins() { @@ -201,7 +202,7 @@ Template.peopleRow.helpers({ }, }); -Template.editUserPopup.onCreated(function () { +Template.editUserPopup.onCreated(function() { this.authenticationMethods = new ReactiveVar([]); this.errorMessage = new ReactiveVar(''); @@ -213,8 +214,8 @@ Template.editUserPopup.onCreated(function () { { value: 'password' }, // Gets only the authentication methods availables ...Object.entries(result) - .filter((e) => e[1]) - .map((e) => ({ value: e[0] })), + .filter(e => e[1]) + .map(e => ({ value: e[0] })), ]); } }); @@ -245,6 +246,12 @@ Template.editUserPopup.helpers({ authentications() { return Template.instance().authenticationMethods.get(); }, + orgsDatas() { + return Org.find({}, {sort: { createdAt: -1 }}); + }, + teamsDatas() { + return Team.find({}, {sort: { createdAt: -1 }}); + }, isSelected(match) { const userId = Template.instance().data.userId; const selected = Users.findOne(userId).authenticationMethod; @@ -260,15 +267,15 @@ Template.editUserPopup.helpers({ }, }); -Template.newOrgPopup.onCreated(function () { +Template.newOrgPopup.onCreated(function() { this.errorMessage = new ReactiveVar(''); }); -Template.newTeamPopup.onCreated(function () { +Template.newTeamPopup.onCreated(function() { this.errorMessage = new ReactiveVar(''); }); -Template.newUserPopup.onCreated(function () { +Template.newUserPopup.onCreated(function() { this.authenticationMethods = new ReactiveVar([]); this.errorMessage = new ReactiveVar(''); @@ -280,8 +287,8 @@ Template.newUserPopup.onCreated(function () { { value: 'password' }, // Gets only the authentication methods availables ...Object.entries(result) - .filter((e) => e[1]) - .map((e) => ({ value: e[0] })), + .filter(e => e[1]) + .map(e => ({ value: e[0] })), ]); } }); @@ -312,6 +319,12 @@ Template.newUserPopup.helpers({ authentications() { return Template.instance().authenticationMethods.get(); }, + orgsDatas() { + return Org.find({}, {sort: { createdAt: -1 }}); + }, + teamsDatas() { + return Team.find({}, {sort: { createdAt: -1 }}); + }, isSelected(match) { const userId = Template.instance().data.userId; const selected = Users.findOne(userId).authenticationMethod; @@ -413,8 +426,7 @@ Template.editOrgPopup.events({ const orgDesc = templateInstance.find('.js-orgDesc').value.trim(); const orgShortName = templateInstance.find('.js-orgShortName').value.trim(); const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim(); - const orgIsActive = - templateInstance.find('.js-org-isactive').value.trim() == 'true'; + const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true'; const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName; const isChangeOrgDesc = orgDesc !== org.orgDesc; @@ -422,24 +434,26 @@ Template.editOrgPopup.events({ const isChangeOrgWebsite = orgWebsite !== org.orgWebsite; const isChangeOrgIsActive = orgIsActive !== org.orgIsActive; - if ( - isChangeOrgDisplayName || - isChangeOrgDesc || - isChangeOrgShortName || - isChangeOrgWebsite || - isChangeOrgIsActive - ) { - Meteor.call( - 'setOrgAllFields', - org, - orgDisplayName, - orgDesc, - orgShortName, - orgWebsite, - orgIsActive, - ); + if(isChangeOrgDisplayName || isChangeOrgDesc || isChangeOrgShortName || isChangeOrgWebsite || isChangeOrgIsActive){ + Meteor.call('setOrgAllFields', org, orgDisplayName, orgDesc, orgShortName, orgWebsite, orgIsActive); } + // if (isChangeOrgDisplayName) { + // Meteor.call('setOrgDisplayName', org, orgDisplayName); + // } + + // if (isChangeOrgDesc) { + // Meteor.call('setOrgDesc', org, orgDesc); + // } + + // if (isChangeOrgShortName) { + // Meteor.call('setOrgShortName', org, orgShortName); + // } + + // if (isChangeOrgIsActive) { + // Meteor.call('setOrgIsActive', org, orgIsActive); + // } + Popup.close(); }, }); @@ -457,8 +471,7 @@ Template.editTeamPopup.events({ .find('.js-teamShortName') .value.trim(); const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim(); - const teamIsActive = - templateInstance.find('.js-team-isactive').value.trim() == 'true'; + const teamIsActive = templateInstance.find('.js-team-isactive').value.trim() == 'true'; const isChangeTeamDisplayName = teamDisplayName !== team.teamDisplayName; const isChangeTeamDesc = teamDesc !== team.teamDesc; @@ -466,23 +479,24 @@ Template.editTeamPopup.events({ const isChangeTeamWebsite = teamWebsite !== team.teamWebsite; const isChangeTeamIsActive = teamIsActive !== team.teamIsActive; - if ( - isChangeTeamDisplayName || - isChangeTeamDesc || - isChangeTeamShortName || - isChangeTeamWebsite || - isChangeTeamIsActive - ) { - Meteor.call( - 'setTeamAllFields', - team, - teamDisplayName, - teamDesc, - teamShortName, - teamWebsite, - teamIsActive, - ); + if(isChangeTeamDisplayName || isChangeTeamDesc || isChangeTeamShortName || isChangeTeamWebsite || isChangeTeamIsActive){ + Meteor.call('setTeamAllFields', team, teamDisplayName, teamDesc, teamShortName, teamWebsite, teamIsActive); } + // if (isChangeTeamDisplayName) { + // Meteor.call('setTeamDisplayName', team, teamDisplayName); + // } + + // if (isChangeTeamDesc) { + // Meteor.call('setTeamDesc', team, teamDesc); + // } + + // if (isChangeTeamShortName) { + // Meteor.call('setTeamShortName', team, teamShortName); + // } + + // if (isChangeTeamIsActive) { + // Meteor.call('setTeamIsActive', team, teamIsActive); + // } Popup.close(); }, @@ -499,15 +513,13 @@ Template.editUserPopup.events({ const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim(); const isActive = templateInstance.find('.js-profile-isactive').value.trim(); const email = templateInstance.find('.js-profile-email').value.trim(); - const verified = templateInstance - .find('.js-profile-email-verified') - .value.trim(); - const authentication = templateInstance - .find('.js-authenticationMethod') - .value.trim(); - const importUsernames = templateInstance - .find('.js-import-usernames') - .value.trim(); + const verified = templateInstance.find('.js-profile-email-verified').value.trim(); + const authentication = templateInstance.find('.js-authenticationMethod').value.trim(); + const importUsernames = templateInstance.find('.js-import-usernames').value.trim(); + const userOrgs = templateInstance.find('.js-userOrgs').value.trim(); + const userOrgsIds = templateInstance.find('.js-userOrgIds').value.trim(); + const userTeams = templateInstance.find('.js-userteams').value.trim(); + const userTeamsIds = templateInstance.find('.js-userteamIds').value.trim(); const isChangePassword = password.length > 0; const isChangeUserName = username !== user.username; @@ -532,6 +544,36 @@ Template.editUserPopup.events({ }, }); + let userTeamsList = userTeams.split(","); + let userTeamsIdsList = userTeamsIds.split(","); + let userTms = []; + for(let i = 0; i < userTeamsList.length; i++){ + userTms.push({ + "teamId": userTeamsIdsList[i], + "teamDisplayName": userTeamsList[i], + }) + } + Users.update(this.userId, { + $set:{ + teams: userTms + } + }); + + let userOrgsList = userOrgs.split(","); + let userOrgsIdsList = userOrgsIds.split(","); + let userOrganizations = []; + for(let i = 0; i < userOrgsList.length; i++){ + userOrganizations.push({ + "orgId": userOrgsIdsList[i], + "orgDisplayName": userOrgsList[i], + }) + } + Users.update(this.userId, { + $set:{ + orgs: userOrganizations + } + }); + if (isChangePassword) { Meteor.call('setPassword', password, this.userId); } @@ -550,7 +592,7 @@ Template.editUserPopup.events({ username, email.toLowerCase(), this.userId, - function (error) { + function(error) { const usernameMessageElement = templateInstance.$('.username-taken'); const emailMessageElement = templateInstance.$('.email-taken'); if (error) { @@ -570,7 +612,7 @@ Template.editUserPopup.events({ }, ); } else if (isChangeUserName) { - Meteor.call('setUsername', username, this.userId, function (error) { + Meteor.call('setUsername', username, this.userId, function(error) { const usernameMessageElement = templateInstance.$('.username-taken'); if (error) { const errorElement = error.error; @@ -583,27 +625,135 @@ Template.editUserPopup.events({ } }); } else if (isChangeEmail) { - Meteor.call( - 'setEmail', - email.toLowerCase(), - this.userId, - function (error) { - const emailMessageElement = templateInstance.$('.email-taken'); - if (error) { - const errorElement = error.error; - if (errorElement === 'email-already-taken') { - emailMessageElement.show(); - } - } else { - emailMessageElement.hide(); - Popup.close(); + Meteor.call('setEmail', email.toLowerCase(), this.userId, function( + error, + ) { + const emailMessageElement = templateInstance.$('.email-taken'); + if (error) { + const errorElement = error.error; + if (errorElement === 'email-already-taken') { + emailMessageElement.show(); } - }, - ); + } else { + emailMessageElement.hide(); + Popup.close(); + } + }); } else Popup.close(); }, + 'click #addUserOrg'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "addOrg"; + document.getElementById("jsOrgs").style.display = 'block'; + document.getElementById("jsTeams").style.display = 'none'; + }, + 'click #removeUserOrg'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeOrg"; + document.getElementById("jsOrgs").style.display = 'block'; + document.getElementById("jsTeams").style.display = 'none'; + }, + 'click #addUserTeam'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "addTeam"; + document.getElementById("jsTeams").style.display = 'block'; + document.getElementById("jsOrgs").style.display = 'none'; + }, + 'click #removeUserTeam'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeTeam"; + document.getElementById("jsTeams").style.display = 'block'; + document.getElementById("jsOrgs").style.display = 'none'; + }, + 'change #jsOrgs'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(); + }, + 'change #jsTeams'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(); + }, }); +UpdateUserOrgsOrTeamsElement = function(isNewUser = false){ + let selectedElt; + let selectedEltValue; + let selectedEltValueId; + let inputElt; + let inputEltId; + let lstInputValues = []; + let lstInputValuesIds = []; + let index; + let indexId; + switch(userOrgsTeamsAction) + { + case "addOrg": + case "removeOrg": + inputElt = !isNewUser ? document.getElementById("jsUserOrgsInPut") : document.getElementById("jsUserOrgsInPutNewUser"); + inputEltId = !isNewUser ? document.getElementById("jsUserOrgIdsInPut") : document.getElementById("jsUserOrgIdsInPutNewUser"); + selectedElt = !isNewUser ? document.getElementById("jsOrgs") : document.getElementById("jsOrgsNewUser"); + break; + case "addTeam": + case "removeTeam": + inputElt = !isNewUser ? document.getElementById("jsUserTeamsInPut") : document.getElementById("jsUserTeamsInPutNewUser"); + inputEltId = !isNewUser ? document.getElementById("jsUserTeamIdsInPut") : document.getElementById("jsUserTeamIdsInPutNewUser"); + selectedElt = !isNewUser ? document.getElementById("jsTeams") : document.getElementById("jsTeamsNewUser"); + break; + default: + break; + } + selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text; + selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value; + lstInputValues = inputElt.value.trim().split(","); + if(lstInputValues.length == 1 && lstInputValues[0] == ''){ + lstInputValues = []; + } + lstInputValuesIds = inputEltId.value.trim().split(","); + if(lstInputValuesIds.length == 1 && lstInputValuesIds[0] == ''){ + lstInputValuesIds = []; + } + index = lstInputValues.indexOf(selectedEltValue); + indexId = lstInputValuesIds.indexOf(selectedEltValue); + if(userOrgsTeamsAction == "addOrg" || userOrgsTeamsAction == "addTeam"){ + if(index <= -1 && selectedEltValueId != "-1"){ + lstInputValues.push(selectedEltValue); + } + + if(indexId <= -1 && selectedEltValueId != "-1"){ + lstInputValuesIds.push(selectedEltValueId); + } + } + else{ + if(index > -1 && selectedEltValueId != "-1"){ + lstInputValues.splice(index, 1); + } + + if(indexId > -1 && selectedEltValueId != "-1"){ + lstInputValuesIds.splice(indexId, 1); + } + } + + if(lstInputValues.length > 0){ + inputElt.value = lstInputValues.join(","); + } + else{ + inputElt.value = ""; + } + + if(lstInputValuesIds.length > 0){ + inputEltId.value = lstInputValuesIds.join(","); + } + else{ + inputEltId.value = ""; + } + selectedElt.value = "-1"; + selectedElt.style.display = "none"; +} + Template.newOrgPopup.events({ submit(event, templateInstance) { event.preventDefault(); @@ -613,8 +763,7 @@ Template.newOrgPopup.events({ const orgDesc = templateInstance.find('.js-orgDesc').value.trim(); const orgShortName = templateInstance.find('.js-orgShortName').value.trim(); const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim(); - const orgIsActive = - templateInstance.find('.js-org-isactive').value.trim() == 'true'; + const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true'; Meteor.call( 'setCreateOrg', @@ -639,8 +788,7 @@ Template.newTeamPopup.events({ .find('.js-teamShortName') .value.trim(); const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim(); - const teamIsActive = - templateInstance.find('.js-team-isactive').value.trim() == 'true'; + const teamIsActive = templateInstance.find('.js-team-isactive').value.trim() == 'true'; Meteor.call( 'setCreateTeam', @@ -667,6 +815,30 @@ Template.newUserPopup.events({ const importUsernames = Users.parseImportUsernames( templateInstance.find('.js-import-usernames').value, ); + const userOrgs = templateInstance.find('.js-userOrgsNewUser').value.trim(); + const userOrgsIds = templateInstance.find('.js-userOrgIdsNewUser').value.trim(); + const userTeams = templateInstance.find('.js-userteamsNewUser').value.trim(); + const userTeamsIds = templateInstance.find('.js-userteamIdsNewUser').value.trim(); + + let userTeamsList = userTeams.split(","); + let userTeamsIdsList = userTeamsIds.split(","); + let userTms = []; + for(let i = 0; i < userTeamsList.length; i++){ + userTms.push({ + "teamId": userTeamsIdsList[i], + "teamDisplayName": userTeamsList[i], + }) + } + + let userOrgsList = userOrgs.split(","); + let userOrgsIdsList = userOrgsIds.split(","); + let userOrganizations = []; + for(let i = 0; i < userOrgsList.length; i++){ + userOrganizations.push({ + "orgId": userOrgsIdsList[i], + "orgDisplayName": userOrgsList[i], + }) + } Meteor.call( 'setCreateUser', @@ -678,7 +850,9 @@ Template.newUserPopup.events({ isActive, email.toLowerCase(), importUsernames, - function (error) { + userOrganizations, + userTms, + function(error) { const usernameMessageElement = templateInstance.$('.username-taken'); const emailMessageElement = templateInstance.$('.email-taken'); if (error) { @@ -699,29 +873,53 @@ Template.newUserPopup.events({ ); Popup.close(); }, -}); + 'click #addUserOrgNewUser'(event) { + event.preventDefault(); -Template.settingsOrgPopup.events({ - 'click #deleteButton'(event) { + userOrgsTeamsAction = "addOrg"; + document.getElementById("jsOrgsNewUser").style.display = 'block'; + document.getElementById("jsTeamsNewUser").style.display = 'none'; + }, + 'click #removeUserOrgNewUser'(event) { event.preventDefault(); Org.remove(this.orgId); Popup.close(); } }); -Template.settingsTeamPopup.events({ - 'click #deleteButton'(event) { + userOrgsTeamsAction = "removeOrg"; + document.getElementById("jsOrgsNewUser").style.display = 'block'; + document.getElementById("jsTeamsNewUser").style.display = 'none'; + }, + 'click #addUserTeamNewUser'(event) { event.preventDefault(); - Team.remove(this.teamId); - Popup.close(); - } + + userOrgsTeamsAction = "addTeam"; + document.getElementById("jsTeamsNewUser").style.display = 'block'; + document.getElementById("jsOrgsNewUser").style.display = 'none'; + }, + 'click #removeUserTeamNewUser'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeTeam"; + document.getElementById("jsTeamsNewUser").style.display = 'block'; + document.getElementById("jsOrgsNewUser").style.display = 'none'; + }, + 'change #jsOrgsNewUser'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(true); + }, + 'change #jsTeamsNewUser'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(true); + }, }); Template.settingsUserPopup.events({ 'click .impersonate-user'(event) { event.preventDefault(); - Meteor.call('impersonate', this.userId, (err) => { + Meteor.call('impersonate', this.userId, err => { if (!err) { FlowRouter.go('/'); Meteor.connection.setUserId(this.userId); @@ -741,6 +939,21 @@ Template.settingsUserPopup.events({ // but that should be used to remove user from all boards similarly // - wekan/models/users.js Delete is not enabled // + //console.log('user id: ' + this.userId); + //Popup.afterConfirm('userDelete', function(event) { + //Boards.find({ members: this.userId }).forEach(board => { + // console.log('board id: ' + board._id); + //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => { + // card.unassignMember(this.userId); + //}); + //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => { + // card.unassignMember(this.userId); + //}); + //Cards.find({ boardId: board._id, assignees: this.userId }).forEach(card => { + // card.unassignAssignee(this.userId); + //}); + //Boards.findOne({ boardId: board._id }).removeMember(this.userId); + //}); //Users.remove(this.userId); */ Popup.close(); diff --git a/client/components/settings/peopleBody.styl b/client/components/settings/peopleBody.styl index 028db164c..8ef33c9e0 100644 --- a/client/components/settings/peopleBody.styl +++ b/client/components/settings/peopleBody.styl @@ -49,3 +49,9 @@ table .more-settings-user,.more-settings-team,.more-settings-org margin-left: 10px; + +.js-orgs,.js-orgsNewUser + display: none; + +.js-teams,.js-teamsNewUser + display: none; diff --git a/models/users.js b/models/users.js index d2f2d6ef9..58cad3bf7 100644 --- a/models/users.js +++ b/models/users.js @@ -38,6 +38,44 @@ Users.attachSchema( } }, }, + orgs: { + /** + * the list of organizations that a user belongs to + */ + type: [Object], + optional: true, + }, + 'orgs.$.orgId':{ + /** + * The uniq ID of the organization + */ + type: String, + }, + 'orgs.$.orgDisplayName':{ + /** + * The display name of the organization + */ + type: String, + }, + teams: { + /** + * the list of teams that a user belongs to + */ + type: [Object], + optional: true, + }, + 'teams.$.teamId':{ + /** + * The uniq ID of the team + */ + type: String, + }, + 'teams.$.teamDisplayName':{ + /** + * The display name of the team + */ + type: String, + }, emails: { /** * the list of emails attached to a user @@ -329,13 +367,7 @@ Users.attachSchema( }, 'sessionData.totalHits': { /** - * Total hits from last search - */ - type: Number, - optional: true, - }, - 'sessionData.lastHit': { - /** + * Total hits from last searchquery['members.userId'] = Meteor.userId(); * last hit that was returned */ type: Number, @@ -464,7 +496,30 @@ Users.helpers({ } return ''; }, - + orgsUserBelongs() { + if (this.orgs) { + return this.orgs.map(function(org){return org.orgDisplayName}).join(','); + } + return ''; + }, + orgIdsUserBelongs() { + if (this.orgs) { + return this.orgs.map(function(org){return org.orgId}).join(','); + } + return ''; + }, + teamsUserBelongs() { + if (this.teams) { + return this.teams.map(function(team){ return team.teamDisplayName}).join(','); + } + return ''; + }, + teamIdsUserBelongs() { + if (this.teams) { + return this.teams.map(function(team){ return team.teamId}).join(','); + } + return ''; + }, boards() { return Boards.find( { @@ -894,6 +949,8 @@ if (Meteor.isServer) { isActive, email, importUsernames, + userOrgsArray, + userTeamsArray, ) { if (Meteor.user() && Meteor.user().isAdmin) { check(fullname, String); @@ -904,6 +961,8 @@ if (Meteor.isServer) { check(isActive, String); check(email, String); check(importUsernames, Array); + check(userOrgsArray, Array); + check(userTeamsArray, Array); const nUsersWithUsername = Users.find({ username, @@ -935,6 +994,8 @@ if (Meteor.isServer) { 'profile.fullname': fullname, importUsernames, 'profile.initials': initials, + orgs: userOrgsArray, + teams: userTeamsArray, }, }); } diff --git a/server/publications/people.js b/server/publications/people.js index b2318287c..af8dfcea5 100644 --- a/server/publications/people.js +++ b/server/publications/people.js @@ -21,6 +21,8 @@ Meteor.publish('people', function(query, limit) { loginDisabled: 1, authenticationMethod: 1, importUsernames: 1, + orgs: 1, + teams: 1, }, }); }