mirror of https://github.com/wekan/wekan
The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1173 lines
36 KiB
1173 lines
36 KiB
import { ReactiveCache } from '/imports/reactiveCache';
|
|
|
|
const orgsPerPage = 25;
|
|
const teamsPerPage = 25;
|
|
const usersPerPage = 25;
|
|
let userOrgsTeamsAction = ""; //poosible actions 'addOrg', 'addTeam', 'removeOrg' or 'removeTeam' when adding or modifying a user
|
|
let selectedUserChkBoxUserIds = [];
|
|
|
|
BlazeComponent.extendComponent({
|
|
mixins() {
|
|
return [Mixins.InfiniteScrolling];
|
|
},
|
|
onCreated() {
|
|
this.error = new ReactiveVar('');
|
|
this.loading = new ReactiveVar(false);
|
|
this.orgSetting = new ReactiveVar(true);
|
|
this.teamSetting = new ReactiveVar(true);
|
|
this.peopleSetting = new ReactiveVar(true);
|
|
this.findOrgsOptions = new ReactiveVar({});
|
|
this.findTeamsOptions = new ReactiveVar({});
|
|
this.findUsersOptions = new ReactiveVar({});
|
|
this.numberOrgs = new ReactiveVar(0);
|
|
this.numberTeams = new ReactiveVar(0);
|
|
this.numberPeople = new ReactiveVar(0);
|
|
|
|
this.page = new ReactiveVar(1);
|
|
this.loadNextPageLocked = false;
|
|
this.callFirstWith(null, 'resetNextPeak');
|
|
this.autorun(() => {
|
|
const limitOrgs = this.page.get() * orgsPerPage;
|
|
const limitTeams = this.page.get() * teamsPerPage;
|
|
const limitUsers = this.page.get() * usersPerPage;
|
|
|
|
this.subscribe('org', this.findOrgsOptions.get(), limitOrgs, () => {
|
|
this.loadNextPageLocked = false;
|
|
const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
|
|
this.calculateNextPeak();
|
|
const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
|
|
if (nextPeakBefore === nextPeakAfter) {
|
|
this.callFirstWith(null, 'resetNextPeak');
|
|
}
|
|
});
|
|
|
|
this.subscribe('team', this.findTeamsOptions.get(), limitTeams, () => {
|
|
this.loadNextPageLocked = false;
|
|
const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
|
|
this.calculateNextPeak();
|
|
const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
|
|
if (nextPeakBefore === nextPeakAfter) {
|
|
this.callFirstWith(null, 'resetNextPeak');
|
|
}
|
|
});
|
|
|
|
this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {
|
|
this.loadNextPageLocked = false;
|
|
const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
|
|
this.calculateNextPeak();
|
|
const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
|
|
if (nextPeakBefore === nextPeakAfter) {
|
|
this.callFirstWith(null, 'resetNextPeak');
|
|
}
|
|
});
|
|
});
|
|
},
|
|
events() {
|
|
return [
|
|
{
|
|
'click #searchOrgButton'() {
|
|
this.filterOrg();
|
|
},
|
|
'keydown #searchOrgInput'(event) {
|
|
if (event.keyCode === 13 && !event.shiftKey) {
|
|
this.filterOrg();
|
|
}
|
|
},
|
|
'click #searchTeamButton'() {
|
|
this.filterTeam();
|
|
},
|
|
'keydown #searchTeamInput'(event) {
|
|
if (event.keyCode === 13 && !event.shiftKey) {
|
|
this.filterTeam();
|
|
}
|
|
},
|
|
'click #searchButton'() {
|
|
this.filterPeople();
|
|
},
|
|
'click #addOrRemoveTeam'(){
|
|
document.getElementById("divAddOrRemoveTeamContainer").style.display = 'block';
|
|
},
|
|
'keydown #searchInput'(event) {
|
|
if (event.keyCode === 13 && !event.shiftKey) {
|
|
this.filterPeople();
|
|
}
|
|
},
|
|
'click #newOrgButton'() {
|
|
Popup.open('newOrg');
|
|
},
|
|
'click #newTeamButton'() {
|
|
Popup.open('newTeam');
|
|
},
|
|
'click #newUserButton'() {
|
|
Popup.open('newUser');
|
|
},
|
|
'click a.js-org-menu': this.switchMenu,
|
|
'click a.js-team-menu': this.switchMenu,
|
|
'click a.js-people-menu': this.switchMenu,
|
|
},
|
|
];
|
|
},
|
|
filterPeople() {
|
|
const value = $('#searchInput').first().val();
|
|
if (value === '') {
|
|
this.findUsersOptions.set({});
|
|
} else {
|
|
const regex = new RegExp(value, 'i');
|
|
this.findUsersOptions.set({
|
|
$or: [
|
|
{ username: regex },
|
|
{ 'profile.fullname': regex },
|
|
{ 'emails.address': regex },
|
|
],
|
|
});
|
|
}
|
|
},
|
|
loadNextPage() {
|
|
if (this.loadNextPageLocked === false) {
|
|
this.page.set(this.page.get() + 1);
|
|
this.loadNextPageLocked = true;
|
|
}
|
|
},
|
|
calculateNextPeak() {
|
|
const element = this.find('.main-body');
|
|
if (element) {
|
|
const altitude = element.scrollHeight;
|
|
this.callFirstWith(this, 'setNextPeak', altitude);
|
|
}
|
|
},
|
|
reachNextPeak() {
|
|
this.loadNextPage();
|
|
},
|
|
setError(error) {
|
|
this.error.set(error);
|
|
},
|
|
setLoading(w) {
|
|
this.loading.set(w);
|
|
},
|
|
orgList() {
|
|
const orgs = ReactiveCache.getOrgs(this.findOrgsOptions.get(), {
|
|
sort: { orgDisplayName: 1 },
|
|
fields: { _id: true },
|
|
});
|
|
this.numberOrgs.set(orgs.length);
|
|
return orgs;
|
|
},
|
|
teamList() {
|
|
const teams = ReactiveCache.getTeams(this.findTeamsOptions.get(), {
|
|
sort: { teamDisplayName: 1 },
|
|
fields: { _id: true },
|
|
});
|
|
this.numberTeams.set(teams.length);
|
|
return teams;
|
|
},
|
|
peopleList() {
|
|
const users = ReactiveCache.getUsers(this.findUsersOptions.get(), {
|
|
sort: { username: 1 },
|
|
fields: { _id: true },
|
|
});
|
|
this.numberPeople.set(users.length);
|
|
return users;
|
|
},
|
|
orgNumber() {
|
|
return this.numberOrgs.get();
|
|
},
|
|
teamNumber() {
|
|
return this.numberTeams.get();
|
|
},
|
|
peopleNumber() {
|
|
return this.numberPeople.get();
|
|
},
|
|
switchMenu(event) {
|
|
const target = $(event.target);
|
|
if (!target.hasClass('active')) {
|
|
$('.side-menu li.active').removeClass('active');
|
|
target.parent().addClass('active');
|
|
const targetID = target.data('id');
|
|
this.orgSetting.set('org-setting' === targetID);
|
|
this.teamSetting.set('team-setting' === targetID);
|
|
this.peopleSetting.set('people-setting' === targetID);
|
|
}
|
|
},
|
|
}).register('people');
|
|
|
|
Template.orgRow.helpers({
|
|
orgData() {
|
|
return ReactiveCache.getOrg(this.orgId);
|
|
},
|
|
});
|
|
|
|
Template.teamRow.helpers({
|
|
teamData() {
|
|
return ReactiveCache.getTeam(this.teamId);
|
|
},
|
|
});
|
|
|
|
Template.peopleRow.helpers({
|
|
userData() {
|
|
return ReactiveCache.getUser(this.userId);
|
|
},
|
|
});
|
|
|
|
Template.editUserPopup.onCreated(function () {
|
|
this.authenticationMethods = new ReactiveVar([]);
|
|
this.errorMessage = new ReactiveVar('');
|
|
|
|
Meteor.call('getAuthenticationsEnabled', (_, result) => {
|
|
if (result) {
|
|
// TODO : add a management of different languages
|
|
// (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
|
|
this.authenticationMethods.set([
|
|
{ value: 'password' },
|
|
// Gets only the authentication methods availables
|
|
...Object.entries(result)
|
|
.filter((e) => e[1])
|
|
.map((e) => ({ value: e[0] })),
|
|
]);
|
|
}
|
|
});
|
|
});
|
|
|
|
Template.editOrgPopup.helpers({
|
|
org() {
|
|
return ReactiveCache.getOrg(this.orgId);
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|
|
Template.editTeamPopup.helpers({
|
|
team() {
|
|
return ReactiveCache.getTeam(this.teamId);
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|
|
Template.editUserPopup.helpers({
|
|
user() {
|
|
return ReactiveCache.getUser(this.userId);
|
|
},
|
|
authentications() {
|
|
return Template.instance().authenticationMethods.get();
|
|
},
|
|
orgsDatas() {
|
|
const ret = ReactiveCache.getOrgs({}, {sort: { orgDisplayName: 1 }});
|
|
return ret;
|
|
},
|
|
teamsDatas() {
|
|
const ret = ReactiveCache.getTeams({}, {sort: { teamDisplayName: 1 }});
|
|
return ret;
|
|
},
|
|
isSelected(match) {
|
|
const userId = Template.instance().data.userId;
|
|
const selected = ReactiveCache.getUser(userId).authenticationMethod;
|
|
return selected === match;
|
|
},
|
|
isLdap() {
|
|
const userId = Template.instance().data.userId;
|
|
const selected = ReactiveCache.getUser(userId).authenticationMethod;
|
|
return selected === 'ldap';
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|
|
Template.newOrgPopup.onCreated(function () {
|
|
this.errorMessage = new ReactiveVar('');
|
|
});
|
|
|
|
Template.newTeamPopup.onCreated(function () {
|
|
this.errorMessage = new ReactiveVar('');
|
|
});
|
|
|
|
Template.newUserPopup.onCreated(function () {
|
|
this.authenticationMethods = new ReactiveVar([]);
|
|
this.errorMessage = new ReactiveVar('');
|
|
|
|
Meteor.call('getAuthenticationsEnabled', (_, result) => {
|
|
if (result) {
|
|
// TODO : add a management of different languages
|
|
// (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
|
|
this.authenticationMethods.set([
|
|
{ value: 'password' },
|
|
// Gets only the authentication methods availables
|
|
...Object.entries(result)
|
|
.filter((e) => e[1])
|
|
.map((e) => ({ value: e[0] })),
|
|
]);
|
|
}
|
|
});
|
|
});
|
|
|
|
Template.newOrgPopup.helpers({
|
|
org() {
|
|
return ReactiveCache.getOrg(this.orgId);
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|
|
Template.newTeamPopup.helpers({
|
|
team() {
|
|
return ReactiveCache.getTeam(this.teamId);
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|
|
Template.newUserPopup.helpers({
|
|
user() {
|
|
return ReactiveCache.getUser(this.userId);
|
|
},
|
|
authentications() {
|
|
return Template.instance().authenticationMethods.get();
|
|
},
|
|
orgsDatas() {
|
|
const ret = ReactiveCache.getOrgs({}, {sort: { orgDisplayName: 1 }});
|
|
return ret;
|
|
},
|
|
teamsDatas() {
|
|
const ret = ReactiveCache.getTeams({}, {sort: { teamDisplayName: 1 }});
|
|
return ret;
|
|
},
|
|
isSelected(match) {
|
|
const userId = Template.instance().data.userId;
|
|
if(userId){
|
|
const selected = ReactiveCache.getUser(userId).authenticationMethod;
|
|
return selected === match;
|
|
}
|
|
else{
|
|
false;
|
|
}
|
|
},
|
|
isLdap() {
|
|
const userId = Template.instance().data.userId;
|
|
const selected = ReactiveCache.getUser(userId).authenticationMethod;
|
|
return selected === 'ldap';
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|
|
BlazeComponent.extendComponent({
|
|
onCreated() {},
|
|
org() {
|
|
return ReactiveCache.getOrg(this.orgId);
|
|
},
|
|
events() {
|
|
return [
|
|
{
|
|
'click a.edit-org': Popup.open('editOrg'),
|
|
'click a.more-settings-org': Popup.open('settingsOrg'),
|
|
},
|
|
];
|
|
},
|
|
}).register('orgRow');
|
|
|
|
BlazeComponent.extendComponent({
|
|
onCreated() {},
|
|
team() {
|
|
return ReactiveCache.getTeam(this.teamId);
|
|
},
|
|
events() {
|
|
return [
|
|
{
|
|
'click a.edit-team': Popup.open('editTeam'),
|
|
'click a.more-settings-team': Popup.open('settingsTeam'),
|
|
},
|
|
];
|
|
},
|
|
}).register('teamRow');
|
|
|
|
BlazeComponent.extendComponent({
|
|
onCreated() {},
|
|
user() {
|
|
return ReactiveCache.getUser(this.userId);
|
|
},
|
|
events() {
|
|
return [
|
|
{
|
|
'click a.edit-user': Popup.open('editUser'),
|
|
'click a.more-settings-user': Popup.open('settingsUser'),
|
|
'click .selectUserChkBox': function(ev){
|
|
if(ev.currentTarget){
|
|
if(ev.currentTarget.checked){
|
|
if(!selectedUserChkBoxUserIds.includes(ev.currentTarget.id)){
|
|
selectedUserChkBoxUserIds.push(ev.currentTarget.id);
|
|
}
|
|
}
|
|
else{
|
|
if(selectedUserChkBoxUserIds.includes(ev.currentTarget.id)){
|
|
let index = selectedUserChkBoxUserIds.indexOf(ev.currentTarget.id);
|
|
if(index > -1)
|
|
selectedUserChkBoxUserIds.splice(index, 1);
|
|
}
|
|
}
|
|
}
|
|
if(selectedUserChkBoxUserIds.length > 0)
|
|
document.getElementById("divAddOrRemoveTeam").style.display = 'block';
|
|
else
|
|
document.getElementById("divAddOrRemoveTeam").style.display = 'none';
|
|
},
|
|
},
|
|
];
|
|
},
|
|
}).register('peopleRow');
|
|
|
|
BlazeComponent.extendComponent({
|
|
onCreated() {},
|
|
teamsDatas() {
|
|
const ret = ReactiveCache.getTeams({}, {sort: { teamDisplayName: 1 }});
|
|
return ret;
|
|
},
|
|
events() {
|
|
return [
|
|
{
|
|
'click #cancelBtn': function(){
|
|
let selectedElt = document.getElementById("jsteamsUser");
|
|
document.getElementById("divAddOrRemoveTeamContainer").style.display = 'none';
|
|
},
|
|
'click #addTeamBtn': function(){
|
|
let selectedElt;
|
|
let selectedEltValue;
|
|
let selectedEltValueId;
|
|
let userTms = [];
|
|
let currentUser;
|
|
let currUserTeamIndex;
|
|
|
|
selectedElt = document.getElementById("jsteamsUser");
|
|
selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text;
|
|
selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value;
|
|
|
|
if(document.getElementById('addAction').checked){
|
|
for(let i = 0; i < selectedUserChkBoxUserIds.length; i++){
|
|
currentUser = ReactiveCache.getUser(selectedUserChkBoxUserIds[i]);
|
|
userTms = currentUser.teams;
|
|
if(userTms == undefined || userTms.length == 0){
|
|
userTms = [];
|
|
userTms.push({
|
|
"teamId": selectedEltValueId,
|
|
"teamDisplayName": selectedEltValue,
|
|
})
|
|
}
|
|
else if(userTms.length > 0)
|
|
{
|
|
currUserTeamIndex = userTms.findIndex(function(t){ return t.teamId == selectedEltValueId});
|
|
if(currUserTeamIndex == -1){
|
|
userTms.push({
|
|
"teamId": selectedEltValueId,
|
|
"teamDisplayName": selectedEltValue,
|
|
});
|
|
}
|
|
}
|
|
|
|
Users.update(selectedUserChkBoxUserIds[i], {
|
|
$set:{
|
|
teams: userTms
|
|
}
|
|
});
|
|
}
|
|
}
|
|
else{
|
|
for(let i = 0; i < selectedUserChkBoxUserIds.length; i++){
|
|
currentUser = ReactiveCache.getUser(selectedUserChkBoxUserIds[i]);
|
|
userTms = currentUser.teams;
|
|
if(userTms !== undefined || userTms.length > 0)
|
|
{
|
|
currUserTeamIndex = userTms.findIndex(function(t){ return t.teamId == selectedEltValueId});
|
|
if(currUserTeamIndex != -1){
|
|
userTms.splice(currUserTeamIndex, 1);
|
|
}
|
|
}
|
|
|
|
Users.update(selectedUserChkBoxUserIds[i], {
|
|
$set:{
|
|
teams: userTms
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
document.getElementById("divAddOrRemoveTeamContainer").style.display = 'none';
|
|
},
|
|
},
|
|
];
|
|
},
|
|
}).register('modifyTeamsUsers');
|
|
|
|
BlazeComponent.extendComponent({
|
|
events() {
|
|
return [
|
|
{
|
|
'click a.new-org': Popup.open('newOrg'),
|
|
},
|
|
];
|
|
},
|
|
}).register('newOrgRow');
|
|
|
|
BlazeComponent.extendComponent({
|
|
events() {
|
|
return [
|
|
{
|
|
'click a.new-team': Popup.open('newTeam'),
|
|
},
|
|
];
|
|
},
|
|
}).register('newTeamRow');
|
|
|
|
BlazeComponent.extendComponent({
|
|
events() {
|
|
return [
|
|
{
|
|
'click a.new-user': Popup.open('newUser'),
|
|
},
|
|
];
|
|
},
|
|
}).register('newUserRow');
|
|
|
|
BlazeComponent.extendComponent({
|
|
events() {
|
|
return [
|
|
{
|
|
'click .allUserChkBox': function(ev){
|
|
selectedUserChkBoxUserIds = [];
|
|
const checkboxes = document.getElementsByClassName("selectUserChkBox");
|
|
if(ev.currentTarget){
|
|
if(ev.currentTarget.checked){
|
|
for (let i=0; i<checkboxes.length; i++) {
|
|
if (!checkboxes[i].disabled) {
|
|
selectedUserChkBoxUserIds.push(checkboxes[i].id);
|
|
checkboxes[i].checked = true;
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
for (let i=0; i<checkboxes.length; i++) {
|
|
if (!checkboxes[i].disabled) {
|
|
checkboxes[i].checked = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(selectedUserChkBoxUserIds.length > 0)
|
|
document.getElementById("divAddOrRemoveTeam").style.display = 'block';
|
|
else
|
|
document.getElementById("divAddOrRemoveTeam").style.display = 'none';
|
|
},
|
|
},
|
|
];
|
|
},
|
|
}).register('selectAllUser');
|
|
|
|
Template.editOrgPopup.events({
|
|
submit(event, templateInstance) {
|
|
event.preventDefault();
|
|
const org = ReactiveCache.getOrg(this.orgId);
|
|
|
|
const orgDisplayName = templateInstance
|
|
.find('.js-orgDisplayName')
|
|
.value.trim();
|
|
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
|
|
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
|
|
const orgAutoAddUsersWithDomainName = templateInstance.find('.js-orgAutoAddUsersWithDomainName').value.trim();
|
|
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
|
|
const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true';
|
|
|
|
const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName;
|
|
const isChangeOrgDesc = orgDesc !== org.orgDesc;
|
|
const isChangeOrgShortName = orgShortName !== org.orgShortName;
|
|
const isChangeOrgAutoAddUsersWithDomainName = orgAutoAddUsersWithDomainName !== org.orgAutoAddUsersWithDomainName;
|
|
const isChangeOrgWebsite = orgWebsite !== org.orgWebsite;
|
|
const isChangeOrgIsActive = orgIsActive !== org.orgIsActive;
|
|
|
|
if (
|
|
isChangeOrgDisplayName ||
|
|
isChangeOrgDesc ||
|
|
isChangeOrgShortName ||
|
|
isChangeOrgAutoAddUsersWithDomainName ||
|
|
isChangeOrgWebsite ||
|
|
isChangeOrgIsActive
|
|
) {
|
|
Meteor.call(
|
|
'setOrgAllFields',
|
|
org,
|
|
orgDisplayName,
|
|
orgDesc,
|
|
orgShortName,
|
|
orgAutoAddUsersWithDomainName,
|
|
orgWebsite,
|
|
orgIsActive,
|
|
);
|
|
}
|
|
|
|
Popup.back();
|
|
},
|
|
});
|
|
|
|
Template.editTeamPopup.events({
|
|
submit(event, templateInstance) {
|
|
event.preventDefault();
|
|
const team = ReactiveCache.getTeam(this.teamId);
|
|
|
|
const teamDisplayName = templateInstance
|
|
.find('.js-teamDisplayName')
|
|
.value.trim();
|
|
const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
|
|
const teamShortName = templateInstance
|
|
.find('.js-teamShortName')
|
|
.value.trim();
|
|
const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
|
|
const teamIsActive =
|
|
templateInstance.find('.js-team-isactive').value.trim() == 'true';
|
|
|
|
const isChangeTeamDisplayName = teamDisplayName !== team.teamDisplayName;
|
|
const isChangeTeamDesc = teamDesc !== team.teamDesc;
|
|
const isChangeTeamShortName = teamShortName !== team.teamShortName;
|
|
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,
|
|
);
|
|
}
|
|
|
|
Popup.back();
|
|
},
|
|
});
|
|
|
|
Template.editUserPopup.events({
|
|
submit(event, templateInstance) {
|
|
event.preventDefault();
|
|
const user = ReactiveCache.getUser(this.userId);
|
|
const username = templateInstance.find('.js-profile-username').value.trim();
|
|
const fullname = templateInstance.find('.js-profile-fullname').value.trim();
|
|
const initials = templateInstance.find('.js-profile-initials').value.trim();
|
|
const password = templateInstance.find('.js-profile-password').value;
|
|
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 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;
|
|
const isChangeInitials = initials.length > 0;
|
|
const isChangeEmailVerified = verified !== user.emails[0].verified;
|
|
|
|
// If previously email address has not been set, it is undefined,
|
|
// check for undefined, and allow adding email address.
|
|
const isChangeEmail =
|
|
email.toLowerCase() !==
|
|
(typeof user.emails !== 'undefined'
|
|
? user.emails[0].address.toLowerCase()
|
|
: false);
|
|
|
|
Users.update(this.userId, {
|
|
$set: {
|
|
'profile.fullname': fullname,
|
|
isAdmin: isAdmin === 'true',
|
|
loginDisabled: isActive === 'true',
|
|
authenticationMethod: authentication,
|
|
importUsernames: Users.parseImportUsernames(importUsernames),
|
|
},
|
|
});
|
|
|
|
let userTeamsList = userTeams.split(",");
|
|
let userTeamsIdsList = userTeamsIds.split(",");
|
|
let userTms = [];
|
|
if(userTeams != ''){
|
|
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 = [];
|
|
if(userOrgs != ''){
|
|
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);
|
|
}
|
|
|
|
if (isChangeEmailVerified) {
|
|
Meteor.call('setEmailVerified', email, verified === 'true', this.userId);
|
|
}
|
|
|
|
if (isChangeInitials) {
|
|
Meteor.call('setInitials', initials, this.userId);
|
|
}
|
|
|
|
if (isChangeUserName && isChangeEmail) {
|
|
Meteor.call(
|
|
'setUsernameAndEmail',
|
|
username,
|
|
email.toLowerCase(),
|
|
this.userId,
|
|
function (error) {
|
|
const usernameMessageElement = templateInstance.$('.username-taken');
|
|
const emailMessageElement = templateInstance.$('.email-taken');
|
|
if (error) {
|
|
const errorElement = error.error;
|
|
if (errorElement === 'username-already-taken') {
|
|
usernameMessageElement.show();
|
|
emailMessageElement.hide();
|
|
} else if (errorElement === 'email-already-taken') {
|
|
usernameMessageElement.hide();
|
|
emailMessageElement.show();
|
|
}
|
|
} else {
|
|
usernameMessageElement.hide();
|
|
emailMessageElement.hide();
|
|
Popup.back();
|
|
}
|
|
},
|
|
);
|
|
} else if (isChangeUserName) {
|
|
Meteor.call('setUsername', username, this.userId, function (error) {
|
|
const usernameMessageElement = templateInstance.$('.username-taken');
|
|
if (error) {
|
|
const errorElement = error.error;
|
|
if (errorElement === 'username-already-taken') {
|
|
usernameMessageElement.show();
|
|
}
|
|
} else {
|
|
usernameMessageElement.hide();
|
|
Popup.back();
|
|
}
|
|
});
|
|
} 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.back();
|
|
}
|
|
},
|
|
);
|
|
} else Popup.back();
|
|
},
|
|
'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(selectedEltValueId);
|
|
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();
|
|
const orgDisplayName = templateInstance
|
|
.find('.js-orgDisplayName')
|
|
.value.trim();
|
|
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
|
|
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
|
|
const orgAutoAddUsersWithDomainName = templateInstance.find('.js-orgAutoAddUsersWithDomainName').value.trim();
|
|
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
|
|
const orgIsActive =
|
|
templateInstance.find('.js-org-isactive').value.trim() == 'true';
|
|
|
|
Meteor.call(
|
|
'setCreateOrg',
|
|
orgDisplayName,
|
|
orgDesc,
|
|
orgShortName,
|
|
orgAutoAddUsersWithDomainName,
|
|
orgWebsite,
|
|
orgIsActive,
|
|
);
|
|
Popup.back();
|
|
},
|
|
});
|
|
|
|
Template.newTeamPopup.events({
|
|
submit(event, templateInstance) {
|
|
event.preventDefault();
|
|
const teamDisplayName = templateInstance
|
|
.find('.js-teamDisplayName')
|
|
.value.trim();
|
|
const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
|
|
const teamShortName = templateInstance
|
|
.find('.js-teamShortName')
|
|
.value.trim();
|
|
const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
|
|
const teamIsActive =
|
|
templateInstance.find('.js-team-isactive').value.trim() == 'true';
|
|
|
|
Meteor.call(
|
|
'setCreateTeam',
|
|
teamDisplayName,
|
|
teamDesc,
|
|
teamShortName,
|
|
teamWebsite,
|
|
teamIsActive,
|
|
);
|
|
Popup.back();
|
|
},
|
|
});
|
|
|
|
Template.newUserPopup.events({
|
|
submit(event, templateInstance) {
|
|
event.preventDefault();
|
|
const fullname = templateInstance.find('.js-profile-fullname').value.trim();
|
|
const username = templateInstance.find('.js-profile-username').value.trim();
|
|
const initials = templateInstance.find('.js-profile-initials').value.trim();
|
|
const password = templateInstance.find('.js-profile-password').value;
|
|
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 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++){
|
|
if(!!userTeamsIdsList[i] && !!userTeamsList[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++){
|
|
if(!!userOrgsIdsList[i] && !!userOrgsList[i]) {
|
|
userOrganizations.push({
|
|
"orgId": userOrgsIdsList[i],
|
|
"orgDisplayName": userOrgsList[i],
|
|
})
|
|
}
|
|
}
|
|
|
|
Meteor.call(
|
|
'setCreateUser',
|
|
fullname,
|
|
username,
|
|
initials,
|
|
password,
|
|
isAdmin,
|
|
isActive,
|
|
email.toLowerCase(),
|
|
importUsernames,
|
|
userOrganizations,
|
|
userTms,
|
|
function(error) {
|
|
const usernameMessageElement = templateInstance.$('.username-taken');
|
|
const emailMessageElement = templateInstance.$('.email-taken');
|
|
if (error) {
|
|
const errorElement = error.error;
|
|
if (errorElement === 'username-already-taken') {
|
|
usernameMessageElement.show();
|
|
emailMessageElement.hide();
|
|
} else if (errorElement === 'email-already-taken') {
|
|
usernameMessageElement.hide();
|
|
emailMessageElement.show();
|
|
}
|
|
} else {
|
|
usernameMessageElement.hide();
|
|
emailMessageElement.hide();
|
|
Popup.back();
|
|
}
|
|
},
|
|
);
|
|
Popup.back();
|
|
},
|
|
'click #addUserOrgNewUser'(event) {
|
|
event.preventDefault();
|
|
|
|
userOrgsTeamsAction = "addOrg";
|
|
document.getElementById("jsOrgsNewUser").style.display = 'block';
|
|
document.getElementById("jsTeamsNewUser").style.display = 'none';
|
|
},
|
|
'click #removeUserOrgNewUser'(event) {
|
|
event.preventDefault();
|
|
|
|
userOrgsTeamsAction = "removeOrg";
|
|
document.getElementById("jsOrgsNewUser").style.display = 'block';
|
|
document.getElementById("jsTeamsNewUser").style.display = 'none';
|
|
},
|
|
'click #addUserTeamNewUser'(event) {
|
|
event.preventDefault();
|
|
|
|
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.settingsOrgPopup.events({
|
|
'click #deleteButton'(event) {
|
|
event.preventDefault();
|
|
if (ReactiveCache.getUsers({"orgs.orgId": this.orgId}).length > 0)
|
|
{
|
|
let orgClassList = document.getElementById("deleteOrgWarningMessage").classList;
|
|
if(orgClassList.contains('hide'))
|
|
{
|
|
orgClassList.remove('hide');
|
|
document.getElementById("deleteOrgWarningMessage").style.color = "red";
|
|
}
|
|
return;
|
|
}
|
|
Org.remove(this.orgId);
|
|
Popup.back();
|
|
}
|
|
});
|
|
|
|
Template.settingsTeamPopup.events({
|
|
'click #deleteButton'(event) {
|
|
event.preventDefault();
|
|
if (ReactiveCache.getUsers({"teams.teamId": this.teamId}).length > 0)
|
|
{
|
|
let teamClassList = document.getElementById("deleteTeamWarningMessage").classList;
|
|
if(teamClassList.contains('hide'))
|
|
{
|
|
teamClassList.remove('hide');
|
|
document.getElementById("deleteTeamWarningMessage").style.color = "red";
|
|
}
|
|
return;
|
|
}
|
|
Team.remove(this.teamId);
|
|
Popup.back();
|
|
}
|
|
});
|
|
|
|
Template.settingsUserPopup.events({
|
|
'click .impersonate-user'(event) {
|
|
event.preventDefault();
|
|
|
|
Meteor.call('impersonate', this.userId, (err) => {
|
|
if (!err) {
|
|
FlowRouter.go('/');
|
|
Meteor.connection.setUserId(this.userId);
|
|
}
|
|
});
|
|
},
|
|
'click #deleteButton'(event) {
|
|
event.preventDefault();
|
|
Users.remove(this.userId);
|
|
/*
|
|
// Delete user is enabled, but you should remove user from all boards
|
|
// before deleting user, because there is possibility of leaving empty user avatars
|
|
// to boards. You can remove non-existing user ids manually from database,
|
|
// if that happens.
|
|
//. See:
|
|
// - wekan/client/components/settings/peopleBody.jade deleteButton
|
|
// - wekan/client/components/settings/peopleBody.js deleteButton
|
|
// - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
|
|
// that does now remove member from board, card members and assignees correctly,
|
|
// but that should be used to remove user from all boards similarly
|
|
// - wekan/models/users.js Delete is not enabled
|
|
//
|
|
//
|
|
*/
|
|
Popup.back();
|
|
},
|
|
});
|
|
|
|
Template.settingsUserPopup.helpers({
|
|
user() {
|
|
return ReactiveCache.getUser(this.userId);
|
|
},
|
|
authentications() {
|
|
return Template.instance().authenticationMethods.get();
|
|
},
|
|
isSelected(match) {
|
|
const userId = Template.instance().data.userId;
|
|
const selected = ReactiveCache.getUser(userId).authenticationMethod;
|
|
return selected === match;
|
|
},
|
|
isLdap() {
|
|
const userId = Template.instance().data.userId;
|
|
const selected = ReactiveCache.getUser(userId).authenticationMethod;
|
|
return selected === 'ldap';
|
|
},
|
|
errorMessage() {
|
|
return Template.instance().errorMessage.get();
|
|
},
|
|
});
|
|
|