peopleBody.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986
  1. const orgsPerPage = 25;
  2. const teamsPerPage = 25;
  3. const usersPerPage = 25;
  4. let userOrgsTeamsAction = ""; //poosible actions 'addOrg', 'addTeam', 'removeOrg' or 'removeTeam' when adding or modifying a user
  5. BlazeComponent.extendComponent({
  6. mixins() {
  7. return [Mixins.InfiniteScrolling];
  8. },
  9. onCreated() {
  10. this.error = new ReactiveVar('');
  11. this.loading = new ReactiveVar(false);
  12. this.orgSetting = new ReactiveVar(true);
  13. this.teamSetting = new ReactiveVar(true);
  14. this.peopleSetting = new ReactiveVar(true);
  15. this.findOrgsOptions = new ReactiveVar({});
  16. this.findTeamsOptions = new ReactiveVar({});
  17. this.findUsersOptions = new ReactiveVar({});
  18. this.numberOrgs = new ReactiveVar(0);
  19. this.numberTeams = new ReactiveVar(0);
  20. this.numberPeople = new ReactiveVar(0);
  21. this.page = new ReactiveVar(1);
  22. this.loadNextPageLocked = false;
  23. this.callFirstWith(null, 'resetNextPeak');
  24. this.autorun(() => {
  25. const limitOrgs = this.page.get() * orgsPerPage;
  26. const limitTeams = this.page.get() * teamsPerPage;
  27. const limitUsers = this.page.get() * usersPerPage;
  28. this.subscribe('org', this.findOrgsOptions.get(), limitOrgs, () => {
  29. this.loadNextPageLocked = false;
  30. const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
  31. this.calculateNextPeak();
  32. const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
  33. if (nextPeakBefore === nextPeakAfter) {
  34. this.callFirstWith(null, 'resetNextPeak');
  35. }
  36. });
  37. this.subscribe('team', this.findTeamsOptions.get(), limitTeams, () => {
  38. this.loadNextPageLocked = false;
  39. const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
  40. this.calculateNextPeak();
  41. const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
  42. if (nextPeakBefore === nextPeakAfter) {
  43. this.callFirstWith(null, 'resetNextPeak');
  44. }
  45. });
  46. this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {
  47. this.loadNextPageLocked = false;
  48. const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
  49. this.calculateNextPeak();
  50. const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
  51. if (nextPeakBefore === nextPeakAfter) {
  52. this.callFirstWith(null, 'resetNextPeak');
  53. }
  54. });
  55. });
  56. },
  57. events() {
  58. return [
  59. {
  60. 'click #searchOrgButton'() {
  61. this.filterOrg();
  62. },
  63. 'keydown #searchOrgInput'(event) {
  64. if (event.keyCode === 13 && !event.shiftKey) {
  65. this.filterOrg();
  66. }
  67. },
  68. 'click #searchTeamButton'() {
  69. this.filterTeam();
  70. },
  71. 'keydown #searchTeamInput'(event) {
  72. if (event.keyCode === 13 && !event.shiftKey) {
  73. this.filterTeam();
  74. }
  75. },
  76. 'click #searchButton'() {
  77. this.filterPeople();
  78. },
  79. 'keydown #searchInput'(event) {
  80. if (event.keyCode === 13 && !event.shiftKey) {
  81. this.filterPeople();
  82. }
  83. },
  84. 'click #newOrgButton'() {
  85. Popup.open('newOrg');
  86. },
  87. 'click #newTeamButton'() {
  88. Popup.open('newTeam');
  89. },
  90. 'click #newUserButton'() {
  91. Popup.open('newUser');
  92. },
  93. 'click a.js-org-menu': this.switchMenu,
  94. 'click a.js-team-menu': this.switchMenu,
  95. 'click a.js-people-menu': this.switchMenu,
  96. },
  97. ];
  98. },
  99. filterPeople() {
  100. const value = $('#searchInput')
  101. .first()
  102. .val();
  103. if (value === '') {
  104. this.findUsersOptions.set({});
  105. } else {
  106. const regex = new RegExp(value, 'i');
  107. this.findUsersOptions.set({
  108. $or: [
  109. { username: regex },
  110. { 'profile.fullname': regex },
  111. { 'emails.address': regex },
  112. ],
  113. });
  114. }
  115. },
  116. loadNextPage() {
  117. if (this.loadNextPageLocked === false) {
  118. this.page.set(this.page.get() + 1);
  119. this.loadNextPageLocked = true;
  120. }
  121. },
  122. calculateNextPeak() {
  123. const element = this.find('.main-body');
  124. if (element) {
  125. const altitude = element.scrollHeight;
  126. this.callFirstWith(this, 'setNextPeak', altitude);
  127. }
  128. },
  129. reachNextPeak() {
  130. this.loadNextPage();
  131. },
  132. setError(error) {
  133. this.error.set(error);
  134. },
  135. setLoading(w) {
  136. this.loading.set(w);
  137. },
  138. orgList() {
  139. const orgs = Org.find(this.findOrgsOptions.get(), {
  140. fields: { _id: true },
  141. });
  142. this.numberOrgs.set(orgs.count(false));
  143. return orgs;
  144. },
  145. teamList() {
  146. const teams = Team.find(this.findTeamsOptions.get(), {
  147. fields: { _id: true },
  148. });
  149. this.numberTeams.set(teams.count(false));
  150. return teams;
  151. },
  152. peopleList() {
  153. const users = Users.find(this.findUsersOptions.get(), {
  154. fields: { _id: true },
  155. });
  156. this.numberPeople.set(users.count(false));
  157. return users;
  158. },
  159. orgNumber() {
  160. return this.numberOrgs.get();
  161. },
  162. teamNumber() {
  163. return this.numberTeams.get();
  164. },
  165. peopleNumber() {
  166. return this.numberPeople.get();
  167. },
  168. switchMenu(event) {
  169. const target = $(event.target);
  170. if (!target.hasClass('active')) {
  171. $('.side-menu li.active').removeClass('active');
  172. target.parent().addClass('active');
  173. const targetID = target.data('id');
  174. this.orgSetting.set('org-setting' === targetID);
  175. this.teamSetting.set('team-setting' === targetID);
  176. this.peopleSetting.set('people-setting' === targetID);
  177. }
  178. },
  179. }).register('people');
  180. Template.orgRow.helpers({
  181. orgData() {
  182. const orgCollection = this.esSearch ? ESSearchResults : Org;
  183. return orgCollection.findOne(this.orgId);
  184. },
  185. });
  186. Template.teamRow.helpers({
  187. teamData() {
  188. const teamCollection = this.esSearch ? ESSearchResults : Team;
  189. return teamCollection.findOne(this.teamId);
  190. },
  191. });
  192. Template.peopleRow.helpers({
  193. userData() {
  194. const userCollection = this.esSearch ? ESSearchResults : Users;
  195. return userCollection.findOne(this.userId);
  196. },
  197. });
  198. Template.editUserPopup.onCreated(function() {
  199. this.authenticationMethods = new ReactiveVar([]);
  200. this.errorMessage = new ReactiveVar('');
  201. Meteor.call('getAuthenticationsEnabled', (_, result) => {
  202. if (result) {
  203. // TODO : add a management of different languages
  204. // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
  205. this.authenticationMethods.set([
  206. { value: 'password' },
  207. // Gets only the authentication methods availables
  208. ...Object.entries(result)
  209. .filter(e => e[1])
  210. .map(e => ({ value: e[0] })),
  211. ]);
  212. }
  213. });
  214. });
  215. Template.editOrgPopup.helpers({
  216. org() {
  217. return Org.findOne(this.orgId);
  218. },
  219. errorMessage() {
  220. return Template.instance().errorMessage.get();
  221. },
  222. });
  223. Template.editTeamPopup.helpers({
  224. team() {
  225. return Team.findOne(this.teamId);
  226. },
  227. errorMessage() {
  228. return Template.instance().errorMessage.get();
  229. },
  230. });
  231. Template.editUserPopup.helpers({
  232. user() {
  233. return Users.findOne(this.userId);
  234. },
  235. authentications() {
  236. return Template.instance().authenticationMethods.get();
  237. },
  238. orgsDatas() {
  239. return Org.find({}, {sort: { createdAt: -1 }});
  240. },
  241. teamsDatas() {
  242. return Team.find({}, {sort: { createdAt: -1 }});
  243. },
  244. isSelected(match) {
  245. const userId = Template.instance().data.userId;
  246. const selected = Users.findOne(userId).authenticationMethod;
  247. return selected === match;
  248. },
  249. isLdap() {
  250. const userId = Template.instance().data.userId;
  251. const selected = Users.findOne(userId).authenticationMethod;
  252. return selected === 'ldap';
  253. },
  254. errorMessage() {
  255. return Template.instance().errorMessage.get();
  256. },
  257. });
  258. Template.newOrgPopup.onCreated(function() {
  259. this.errorMessage = new ReactiveVar('');
  260. });
  261. Template.newTeamPopup.onCreated(function() {
  262. this.errorMessage = new ReactiveVar('');
  263. });
  264. Template.newUserPopup.onCreated(function() {
  265. this.authenticationMethods = new ReactiveVar([]);
  266. this.errorMessage = new ReactiveVar('');
  267. Meteor.call('getAuthenticationsEnabled', (_, result) => {
  268. if (result) {
  269. // TODO : add a management of different languages
  270. // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
  271. this.authenticationMethods.set([
  272. { value: 'password' },
  273. // Gets only the authentication methods availables
  274. ...Object.entries(result)
  275. .filter(e => e[1])
  276. .map(e => ({ value: e[0] })),
  277. ]);
  278. }
  279. });
  280. });
  281. Template.newOrgPopup.helpers({
  282. org() {
  283. return Org.findOne(this.orgId);
  284. },
  285. errorMessage() {
  286. return Template.instance().errorMessage.get();
  287. },
  288. });
  289. Template.newTeamPopup.helpers({
  290. team() {
  291. return Team.findOne(this.teamId);
  292. },
  293. errorMessage() {
  294. return Template.instance().errorMessage.get();
  295. },
  296. });
  297. Template.newUserPopup.helpers({
  298. user() {
  299. return Users.findOne(this.userId);
  300. },
  301. authentications() {
  302. return Template.instance().authenticationMethods.get();
  303. },
  304. orgsDatas() {
  305. return Org.find({}, {sort: { createdAt: -1 }});
  306. },
  307. teamsDatas() {
  308. return Team.find({}, {sort: { createdAt: -1 }});
  309. },
  310. isSelected(match) {
  311. const userId = Template.instance().data.userId;
  312. if(userId){
  313. const selected = Users.findOne(userId).authenticationMethod;
  314. return selected === match;
  315. }
  316. else{
  317. false;
  318. }
  319. },
  320. isLdap() {
  321. const userId = Template.instance().data.userId;
  322. const selected = Users.findOne(userId).authenticationMethod;
  323. return selected === 'ldap';
  324. },
  325. errorMessage() {
  326. return Template.instance().errorMessage.get();
  327. },
  328. });
  329. BlazeComponent.extendComponent({
  330. onCreated() {},
  331. org() {
  332. return Org.findOne(this.orgId);
  333. },
  334. events() {
  335. return [
  336. {
  337. 'click a.edit-org': Popup.open('editOrg'),
  338. 'click a.more-settings-org': Popup.open('settingsOrg'),
  339. },
  340. ];
  341. },
  342. }).register('orgRow');
  343. BlazeComponent.extendComponent({
  344. onCreated() {},
  345. team() {
  346. return Team.findOne(this.teamId);
  347. },
  348. events() {
  349. return [
  350. {
  351. 'click a.edit-team': Popup.open('editTeam'),
  352. 'click a.more-settings-team': Popup.open('settingsTeam'),
  353. },
  354. ];
  355. },
  356. }).register('teamRow');
  357. BlazeComponent.extendComponent({
  358. onCreated() {},
  359. user() {
  360. return Users.findOne(this.userId);
  361. },
  362. events() {
  363. return [
  364. {
  365. 'click a.edit-user': Popup.open('editUser'),
  366. 'click a.more-settings-user': Popup.open('settingsUser'),
  367. },
  368. ];
  369. },
  370. }).register('peopleRow');
  371. BlazeComponent.extendComponent({
  372. events() {
  373. return [
  374. {
  375. 'click a.new-org': Popup.open('newOrg'),
  376. },
  377. ];
  378. },
  379. }).register('newOrgRow');
  380. BlazeComponent.extendComponent({
  381. events() {
  382. return [
  383. {
  384. 'click a.new-team': Popup.open('newTeam'),
  385. },
  386. ];
  387. },
  388. }).register('newTeamRow');
  389. BlazeComponent.extendComponent({
  390. events() {
  391. return [
  392. {
  393. 'click a.new-user': Popup.open('newUser'),
  394. },
  395. ];
  396. },
  397. }).register('newUserRow');
  398. Template.editOrgPopup.events({
  399. submit(event, templateInstance) {
  400. event.preventDefault();
  401. const org = Org.findOne(this.orgId);
  402. const orgDisplayName = templateInstance
  403. .find('.js-orgDisplayName')
  404. .value.trim();
  405. const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
  406. const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
  407. const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
  408. const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true';
  409. const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName;
  410. const isChangeOrgDesc = orgDesc !== org.orgDesc;
  411. const isChangeOrgShortName = orgShortName !== org.orgShortName;
  412. const isChangeOrgWebsite = orgWebsite !== org.orgWebsite;
  413. const isChangeOrgIsActive = orgIsActive !== org.orgIsActive;
  414. if(isChangeOrgDisplayName || isChangeOrgDesc || isChangeOrgShortName || isChangeOrgWebsite || isChangeOrgIsActive){
  415. Meteor.call('setOrgAllFields', org, orgDisplayName, orgDesc, orgShortName, orgWebsite, orgIsActive);
  416. }
  417. // if (isChangeOrgDisplayName) {
  418. // Meteor.call('setOrgDisplayName', org, orgDisplayName);
  419. // }
  420. // if (isChangeOrgDesc) {
  421. // Meteor.call('setOrgDesc', org, orgDesc);
  422. // }
  423. // if (isChangeOrgShortName) {
  424. // Meteor.call('setOrgShortName', org, orgShortName);
  425. // }
  426. // if (isChangeOrgIsActive) {
  427. // Meteor.call('setOrgIsActive', org, orgIsActive);
  428. // }
  429. Popup.close();
  430. },
  431. });
  432. Template.editTeamPopup.events({
  433. submit(event, templateInstance) {
  434. event.preventDefault();
  435. const team = Team.findOne(this.teamId);
  436. const teamDisplayName = templateInstance
  437. .find('.js-teamDisplayName')
  438. .value.trim();
  439. const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
  440. const teamShortName = templateInstance
  441. .find('.js-teamShortName')
  442. .value.trim();
  443. const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
  444. const teamIsActive = templateInstance.find('.js-team-isactive').value.trim() == 'true';
  445. const isChangeTeamDisplayName = teamDisplayName !== team.teamDisplayName;
  446. const isChangeTeamDesc = teamDesc !== team.teamDesc;
  447. const isChangeTeamShortName = teamShortName !== team.teamShortName;
  448. const isChangeTeamWebsite = teamWebsite !== team.teamWebsite;
  449. const isChangeTeamIsActive = teamIsActive !== team.teamIsActive;
  450. if(isChangeTeamDisplayName || isChangeTeamDesc || isChangeTeamShortName || isChangeTeamWebsite || isChangeTeamIsActive){
  451. Meteor.call('setTeamAllFields', team, teamDisplayName, teamDesc, teamShortName, teamWebsite, teamIsActive);
  452. }
  453. // if (isChangeTeamDisplayName) {
  454. // Meteor.call('setTeamDisplayName', team, teamDisplayName);
  455. // }
  456. // if (isChangeTeamDesc) {
  457. // Meteor.call('setTeamDesc', team, teamDesc);
  458. // }
  459. // if (isChangeTeamShortName) {
  460. // Meteor.call('setTeamShortName', team, teamShortName);
  461. // }
  462. // if (isChangeTeamIsActive) {
  463. // Meteor.call('setTeamIsActive', team, teamIsActive);
  464. // }
  465. Popup.close();
  466. },
  467. });
  468. Template.editUserPopup.events({
  469. submit(event, templateInstance) {
  470. event.preventDefault();
  471. const user = Users.findOne(this.userId);
  472. const username = templateInstance.find('.js-profile-username').value.trim();
  473. const fullname = templateInstance.find('.js-profile-fullname').value.trim();
  474. const initials = templateInstance.find('.js-profile-initials').value.trim();
  475. const password = templateInstance.find('.js-profile-password').value;
  476. const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim();
  477. const isActive = templateInstance.find('.js-profile-isactive').value.trim();
  478. const email = templateInstance.find('.js-profile-email').value.trim();
  479. const verified = templateInstance.find('.js-profile-email-verified').value.trim();
  480. const authentication = templateInstance.find('.js-authenticationMethod').value.trim();
  481. const importUsernames = templateInstance.find('.js-import-usernames').value.trim();
  482. const userOrgs = templateInstance.find('.js-userOrgs').value.trim();
  483. const userOrgsIds = templateInstance.find('.js-userOrgIds').value.trim();
  484. const userTeams = templateInstance.find('.js-userteams').value.trim();
  485. const userTeamsIds = templateInstance.find('.js-userteamIds').value.trim();
  486. const isChangePassword = password.length > 0;
  487. const isChangeUserName = username !== user.username;
  488. const isChangeInitials = initials.length > 0;
  489. const isChangeEmailVerified = verified !== user.emails[0].verified;
  490. // If previously email address has not been set, it is undefined,
  491. // check for undefined, and allow adding email address.
  492. const isChangeEmail =
  493. email.toLowerCase() !==
  494. (typeof user.emails !== 'undefined'
  495. ? user.emails[0].address.toLowerCase()
  496. : false);
  497. Users.update(this.userId, {
  498. $set: {
  499. 'profile.fullname': fullname,
  500. isAdmin: isAdmin === 'true',
  501. loginDisabled: isActive === 'true',
  502. authenticationMethod: authentication,
  503. importUsernames: Users.parseImportUsernames(importUsernames),
  504. },
  505. });
  506. let userTeamsList = userTeams.split(",");
  507. let userTeamsIdsList = userTeamsIds.split(",");
  508. let userTms = [];
  509. for(let i = 0; i < userTeamsList.length; i++){
  510. userTms.push({
  511. "teamId": userTeamsIdsList[i],
  512. "teamDisplayName": userTeamsList[i],
  513. })
  514. }
  515. Users.update(this.userId, {
  516. $set:{
  517. teams: userTms
  518. }
  519. });
  520. let userOrgsList = userOrgs.split(",");
  521. let userOrgsIdsList = userOrgsIds.split(",");
  522. let userOrganizations = [];
  523. for(let i = 0; i < userOrgsList.length; i++){
  524. userOrganizations.push({
  525. "orgId": userOrgsIdsList[i],
  526. "orgDisplayName": userOrgsList[i],
  527. })
  528. }
  529. Users.update(this.userId, {
  530. $set:{
  531. orgs: userOrganizations
  532. }
  533. });
  534. if (isChangePassword) {
  535. Meteor.call('setPassword', password, this.userId);
  536. }
  537. if (isChangeEmailVerified) {
  538. Meteor.call('setEmailVerified', email, verified === 'true', this.userId);
  539. }
  540. if (isChangeInitials) {
  541. Meteor.call('setInitials', initials, this.userId);
  542. }
  543. if (isChangeUserName && isChangeEmail) {
  544. Meteor.call(
  545. 'setUsernameAndEmail',
  546. username,
  547. email.toLowerCase(),
  548. this.userId,
  549. function(error) {
  550. const usernameMessageElement = templateInstance.$('.username-taken');
  551. const emailMessageElement = templateInstance.$('.email-taken');
  552. if (error) {
  553. const errorElement = error.error;
  554. if (errorElement === 'username-already-taken') {
  555. usernameMessageElement.show();
  556. emailMessageElement.hide();
  557. } else if (errorElement === 'email-already-taken') {
  558. usernameMessageElement.hide();
  559. emailMessageElement.show();
  560. }
  561. } else {
  562. usernameMessageElement.hide();
  563. emailMessageElement.hide();
  564. Popup.close();
  565. }
  566. },
  567. );
  568. } else if (isChangeUserName) {
  569. Meteor.call('setUsername', username, this.userId, function(error) {
  570. const usernameMessageElement = templateInstance.$('.username-taken');
  571. if (error) {
  572. const errorElement = error.error;
  573. if (errorElement === 'username-already-taken') {
  574. usernameMessageElement.show();
  575. }
  576. } else {
  577. usernameMessageElement.hide();
  578. Popup.close();
  579. }
  580. });
  581. } else if (isChangeEmail) {
  582. Meteor.call('setEmail', email.toLowerCase(), this.userId, function(
  583. error,
  584. ) {
  585. const emailMessageElement = templateInstance.$('.email-taken');
  586. if (error) {
  587. const errorElement = error.error;
  588. if (errorElement === 'email-already-taken') {
  589. emailMessageElement.show();
  590. }
  591. } else {
  592. emailMessageElement.hide();
  593. Popup.close();
  594. }
  595. });
  596. } else Popup.close();
  597. },
  598. 'click #addUserOrg'(event) {
  599. event.preventDefault();
  600. userOrgsTeamsAction = "addOrg";
  601. document.getElementById("jsOrgs").style.display = 'block';
  602. document.getElementById("jsTeams").style.display = 'none';
  603. },
  604. 'click #removeUserOrg'(event) {
  605. event.preventDefault();
  606. userOrgsTeamsAction = "removeOrg";
  607. document.getElementById("jsOrgs").style.display = 'block';
  608. document.getElementById("jsTeams").style.display = 'none';
  609. },
  610. 'click #addUserTeam'(event) {
  611. event.preventDefault();
  612. userOrgsTeamsAction = "addTeam";
  613. document.getElementById("jsTeams").style.display = 'block';
  614. document.getElementById("jsOrgs").style.display = 'none';
  615. },
  616. 'click #removeUserTeam'(event) {
  617. event.preventDefault();
  618. userOrgsTeamsAction = "removeTeam";
  619. document.getElementById("jsTeams").style.display = 'block';
  620. document.getElementById("jsOrgs").style.display = 'none';
  621. },
  622. 'change #jsOrgs'(event) {
  623. event.preventDefault();
  624. UpdateUserOrgsOrTeamsElement();
  625. },
  626. 'change #jsTeams'(event) {
  627. event.preventDefault();
  628. UpdateUserOrgsOrTeamsElement();
  629. },
  630. });
  631. UpdateUserOrgsOrTeamsElement = function(isNewUser = false){
  632. let selectedElt;
  633. let selectedEltValue;
  634. let selectedEltValueId;
  635. let inputElt;
  636. let inputEltId;
  637. let lstInputValues = [];
  638. let lstInputValuesIds = [];
  639. let index;
  640. let indexId;
  641. switch(userOrgsTeamsAction)
  642. {
  643. case "addOrg":
  644. case "removeOrg":
  645. inputElt = !isNewUser ? document.getElementById("jsUserOrgsInPut") : document.getElementById("jsUserOrgsInPutNewUser");
  646. inputEltId = !isNewUser ? document.getElementById("jsUserOrgIdsInPut") : document.getElementById("jsUserOrgIdsInPutNewUser");
  647. selectedElt = !isNewUser ? document.getElementById("jsOrgs") : document.getElementById("jsOrgsNewUser");
  648. break;
  649. case "addTeam":
  650. case "removeTeam":
  651. inputElt = !isNewUser ? document.getElementById("jsUserTeamsInPut") : document.getElementById("jsUserTeamsInPutNewUser");
  652. inputEltId = !isNewUser ? document.getElementById("jsUserTeamIdsInPut") : document.getElementById("jsUserTeamIdsInPutNewUser");
  653. selectedElt = !isNewUser ? document.getElementById("jsTeams") : document.getElementById("jsTeamsNewUser");
  654. break;
  655. default:
  656. break;
  657. }
  658. selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text;
  659. selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value;
  660. lstInputValues = inputElt.value.trim().split(",");
  661. if(lstInputValues.length == 1 && lstInputValues[0] == ''){
  662. lstInputValues = [];
  663. }
  664. lstInputValuesIds = inputEltId.value.trim().split(",");
  665. if(lstInputValuesIds.length == 1 && lstInputValuesIds[0] == ''){
  666. lstInputValuesIds = [];
  667. }
  668. index = lstInputValues.indexOf(selectedEltValue);
  669. indexId = lstInputValuesIds.indexOf(selectedEltValue);
  670. if(userOrgsTeamsAction == "addOrg" || userOrgsTeamsAction == "addTeam"){
  671. if(index <= -1 && selectedEltValueId != "-1"){
  672. lstInputValues.push(selectedEltValue);
  673. }
  674. if(indexId <= -1 && selectedEltValueId != "-1"){
  675. lstInputValuesIds.push(selectedEltValueId);
  676. }
  677. }
  678. else{
  679. if(index > -1 && selectedEltValueId != "-1"){
  680. lstInputValues.splice(index, 1);
  681. }
  682. if(indexId > -1 && selectedEltValueId != "-1"){
  683. lstInputValuesIds.splice(indexId, 1);
  684. }
  685. }
  686. if(lstInputValues.length > 0){
  687. inputElt.value = lstInputValues.join(",");
  688. }
  689. else{
  690. inputElt.value = "";
  691. }
  692. if(lstInputValuesIds.length > 0){
  693. inputEltId.value = lstInputValuesIds.join(",");
  694. }
  695. else{
  696. inputEltId.value = "";
  697. }
  698. selectedElt.value = "-1";
  699. selectedElt.style.display = "none";
  700. }
  701. Template.newOrgPopup.events({
  702. submit(event, templateInstance) {
  703. event.preventDefault();
  704. const orgDisplayName = templateInstance
  705. .find('.js-orgDisplayName')
  706. .value.trim();
  707. const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
  708. const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
  709. const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
  710. const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true';
  711. Meteor.call(
  712. 'setCreateOrg',
  713. orgDisplayName,
  714. orgDesc,
  715. orgShortName,
  716. orgWebsite,
  717. orgIsActive,
  718. );
  719. Popup.close();
  720. },
  721. });
  722. Template.newTeamPopup.events({
  723. submit(event, templateInstance) {
  724. event.preventDefault();
  725. const teamDisplayName = templateInstance
  726. .find('.js-teamDisplayName')
  727. .value.trim();
  728. const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
  729. const teamShortName = templateInstance
  730. .find('.js-teamShortName')
  731. .value.trim();
  732. const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
  733. const teamIsActive = templateInstance.find('.js-team-isactive').value.trim() == 'true';
  734. Meteor.call(
  735. 'setCreateTeam',
  736. teamDisplayName,
  737. teamDesc,
  738. teamShortName,
  739. teamWebsite,
  740. teamIsActive,
  741. );
  742. Popup.close();
  743. },
  744. });
  745. Template.newUserPopup.events({
  746. submit(event, templateInstance) {
  747. event.preventDefault();
  748. const fullname = templateInstance.find('.js-profile-fullname').value.trim();
  749. const username = templateInstance.find('.js-profile-username').value.trim();
  750. const initials = templateInstance.find('.js-profile-initials').value.trim();
  751. const password = templateInstance.find('.js-profile-password').value;
  752. const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim();
  753. const isActive = templateInstance.find('.js-profile-isactive').value.trim();
  754. const email = templateInstance.find('.js-profile-email').value.trim();
  755. const importUsernames = Users.parseImportUsernames(
  756. templateInstance.find('.js-import-usernames').value,
  757. );
  758. const userOrgs = templateInstance.find('.js-userOrgsNewUser').value.trim();
  759. const userOrgsIds = templateInstance.find('.js-userOrgIdsNewUser').value.trim();
  760. const userTeams = templateInstance.find('.js-userteamsNewUser').value.trim();
  761. const userTeamsIds = templateInstance.find('.js-userteamIdsNewUser').value.trim();
  762. let userTeamsList = userTeams.split(",");
  763. let userTeamsIdsList = userTeamsIds.split(",");
  764. let userTms = [];
  765. for(let i = 0; i < userTeamsList.length; i++){
  766. userTms.push({
  767. "teamId": userTeamsIdsList[i],
  768. "teamDisplayName": userTeamsList[i],
  769. })
  770. }
  771. let userOrgsList = userOrgs.split(",");
  772. let userOrgsIdsList = userOrgsIds.split(",");
  773. let userOrganizations = [];
  774. for(let i = 0; i < userOrgsList.length; i++){
  775. userOrganizations.push({
  776. "orgId": userOrgsIdsList[i],
  777. "orgDisplayName": userOrgsList[i],
  778. })
  779. }
  780. Meteor.call(
  781. 'setCreateUser',
  782. fullname,
  783. username,
  784. initials,
  785. password,
  786. isAdmin,
  787. isActive,
  788. email.toLowerCase(),
  789. importUsernames,
  790. userOrganizations,
  791. userTms,
  792. function(error) {
  793. const usernameMessageElement = templateInstance.$('.username-taken');
  794. const emailMessageElement = templateInstance.$('.email-taken');
  795. if (error) {
  796. const errorElement = error.error;
  797. if (errorElement === 'username-already-taken') {
  798. usernameMessageElement.show();
  799. emailMessageElement.hide();
  800. } else if (errorElement === 'email-already-taken') {
  801. usernameMessageElement.hide();
  802. emailMessageElement.show();
  803. }
  804. } else {
  805. usernameMessageElement.hide();
  806. emailMessageElement.hide();
  807. Popup.close();
  808. }
  809. },
  810. );
  811. Popup.close();
  812. },
  813. 'click #addUserOrgNewUser'(event) {
  814. event.preventDefault();
  815. userOrgsTeamsAction = "addOrg";
  816. document.getElementById("jsOrgsNewUser").style.display = 'block';
  817. document.getElementById("jsTeamsNewUser").style.display = 'none';
  818. },
  819. 'click #removeUserOrgNewUser'(event) {
  820. event.preventDefault();
  821. userOrgsTeamsAction = "removeOrg";
  822. document.getElementById("jsOrgsNewUser").style.display = 'block';
  823. document.getElementById("jsTeamsNewUser").style.display = 'none';
  824. },
  825. 'click #addUserTeamNewUser'(event) {
  826. event.preventDefault();
  827. userOrgsTeamsAction = "addTeam";
  828. document.getElementById("jsTeamsNewUser").style.display = 'block';
  829. document.getElementById("jsOrgsNewUser").style.display = 'none';
  830. },
  831. 'click #removeUserTeamNewUser'(event) {
  832. event.preventDefault();
  833. userOrgsTeamsAction = "removeTeam";
  834. document.getElementById("jsTeamsNewUser").style.display = 'block';
  835. document.getElementById("jsOrgsNewUser").style.display = 'none';
  836. },
  837. 'change #jsOrgsNewUser'(event) {
  838. event.preventDefault();
  839. UpdateUserOrgsOrTeamsElement(true);
  840. },
  841. 'change #jsTeamsNewUser'(event) {
  842. event.preventDefault();
  843. UpdateUserOrgsOrTeamsElement(true);
  844. },
  845. });
  846. Template.settingsUserPopup.events({
  847. 'click .impersonate-user'(event) {
  848. event.preventDefault();
  849. Meteor.call('impersonate', this.userId, err => {
  850. if (!err) {
  851. FlowRouter.go('/');
  852. Meteor.connection.setUserId(this.userId);
  853. }
  854. });
  855. },
  856. 'click #deleteButton'(event) {
  857. event.preventDefault();
  858. /*
  859. // Delete is not enabled yet, because it does leave empty user avatars
  860. // to boards: boards members, card members and assignees have
  861. // empty users. See:
  862. // - wekan/client/components/settings/peopleBody.jade deleteButton
  863. // - wekan/client/components/settings/peopleBody.js deleteButton
  864. // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
  865. // that does now remove member from board, card members and assignees correctly,
  866. // but that should be used to remove user from all boards similarly
  867. // - wekan/models/users.js Delete is not enabled
  868. //
  869. //console.log('user id: ' + this.userId);
  870. //Popup.afterConfirm('userDelete', function(event) {
  871. //Boards.find({ members: this.userId }).forEach(board => {
  872. // console.log('board id: ' + board._id);
  873. //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => {
  874. // card.unassignMember(this.userId);
  875. //});
  876. //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => {
  877. // card.unassignMember(this.userId);
  878. //});
  879. //Cards.find({ boardId: board._id, assignees: this.userId }).forEach(card => {
  880. // card.unassignAssignee(this.userId);
  881. //});
  882. //Boards.findOne({ boardId: board._id }).removeMember(this.userId);
  883. //});
  884. //Users.remove(this.userId);
  885. */
  886. Popup.close();
  887. },
  888. });
  889. Template.settingsUserPopup.helpers({
  890. user() {
  891. return Users.findOne(this.userId);
  892. },
  893. authentications() {
  894. return Template.instance().authenticationMethods.get();
  895. },
  896. isSelected(match) {
  897. const userId = Template.instance().data.userId;
  898. const selected = Users.findOne(userId).authenticationMethod;
  899. return selected === match;
  900. },
  901. isLdap() {
  902. const userId = Template.instance().data.userId;
  903. const selected = Users.findOne(userId).authenticationMethod;
  904. return selected === 'ldap';
  905. },
  906. errorMessage() {
  907. return Template.instance().errorMessage.get();
  908. },
  909. });