peopleBody.js 30 KB

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