peopleBody.js 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  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. if(!!userTeamsIdsList[i] && !!userTeamsList[i]) {
  780. userTms.push({
  781. "teamId": userTeamsIdsList[i],
  782. "teamDisplayName": userTeamsList[i],
  783. })
  784. }
  785. }
  786. let userOrgsList = userOrgs.split(",");
  787. let userOrgsIdsList = userOrgsIds.split(",");
  788. let userOrganizations = [];
  789. for(let i = 0; i < userOrgsList.length; i++){
  790. if(!!userOrgsIdsList[i] && !!userOrgsList[i]) {
  791. userOrganizations.push({
  792. "orgId": userOrgsIdsList[i],
  793. "orgDisplayName": userOrgsList[i],
  794. })
  795. }
  796. }
  797. Meteor.call(
  798. 'setCreateUser',
  799. fullname,
  800. username,
  801. initials,
  802. password,
  803. isAdmin,
  804. isActive,
  805. email.toLowerCase(),
  806. importUsernames,
  807. userOrganizations,
  808. userTms,
  809. function(error) {
  810. const usernameMessageElement = templateInstance.$('.username-taken');
  811. const emailMessageElement = templateInstance.$('.email-taken');
  812. if (error) {
  813. const errorElement = error.error;
  814. if (errorElement === 'username-already-taken') {
  815. usernameMessageElement.show();
  816. emailMessageElement.hide();
  817. } else if (errorElement === 'email-already-taken') {
  818. usernameMessageElement.hide();
  819. emailMessageElement.show();
  820. }
  821. } else {
  822. usernameMessageElement.hide();
  823. emailMessageElement.hide();
  824. Popup.close();
  825. }
  826. },
  827. );
  828. Popup.close();
  829. },
  830. 'click #addUserOrgNewUser'(event) {
  831. event.preventDefault();
  832. userOrgsTeamsAction = "addOrg";
  833. document.getElementById("jsOrgsNewUser").style.display = 'block';
  834. document.getElementById("jsTeamsNewUser").style.display = 'none';
  835. },
  836. 'click #removeUserOrgNewUser'(event) {
  837. event.preventDefault();
  838. userOrgsTeamsAction = "removeOrg";
  839. document.getElementById("jsOrgsNewUser").style.display = 'block';
  840. document.getElementById("jsTeamsNewUser").style.display = 'none';
  841. },
  842. 'click #addUserTeamNewUser'(event) {
  843. event.preventDefault();
  844. userOrgsTeamsAction = "addTeam";
  845. document.getElementById("jsTeamsNewUser").style.display = 'block';
  846. document.getElementById("jsOrgsNewUser").style.display = 'none';
  847. },
  848. 'click #removeUserTeamNewUser'(event) {
  849. event.preventDefault();
  850. userOrgsTeamsAction = "removeTeam";
  851. document.getElementById("jsTeamsNewUser").style.display = 'block';
  852. document.getElementById("jsOrgsNewUser").style.display = 'none';
  853. },
  854. 'change #jsOrgsNewUser'(event) {
  855. event.preventDefault();
  856. UpdateUserOrgsOrTeamsElement(true);
  857. },
  858. 'change #jsTeamsNewUser'(event) {
  859. event.preventDefault();
  860. UpdateUserOrgsOrTeamsElement(true);
  861. },
  862. });
  863. Template.settingsOrgPopup.events({
  864. 'click #deleteButton'(event) {
  865. event.preventDefault();
  866. if(Users.find({"orgs.orgId": this.orgId}).count() > 0)
  867. {
  868. let orgClassList = document.getElementById("deleteOrgWarningMessage").classList;
  869. if(orgClassList.contains('hide'))
  870. {
  871. orgClassList.remove('hide');
  872. document.getElementById("deleteOrgWarningMessage").style.color = "red";
  873. }
  874. return;
  875. }
  876. Org.remove(this.orgId);
  877. Popup.close();
  878. }
  879. });
  880. Template.settingsTeamPopup.events({
  881. 'click #deleteButton'(event) {
  882. event.preventDefault();
  883. if(Users.find({"teams.teamId": this.teamId}).count() > 0)
  884. {
  885. let teamClassList = document.getElementById("deleteTeamWarningMessage").classList;
  886. if(teamClassList.contains('hide'))
  887. {
  888. teamClassList.remove('hide');
  889. document.getElementById("deleteTeamWarningMessage").style.color = "red";
  890. }
  891. return;
  892. }
  893. Team.remove(this.teamId);
  894. Popup.close();
  895. }
  896. });
  897. Template.settingsUserPopup.events({
  898. 'click .impersonate-user'(event) {
  899. event.preventDefault();
  900. Meteor.call('impersonate', this.userId, (err) => {
  901. if (!err) {
  902. FlowRouter.go('/');
  903. Meteor.connection.setUserId(this.userId);
  904. }
  905. });
  906. },
  907. 'click #deleteButton'(event) {
  908. event.preventDefault();
  909. Users.remove(this.userId);
  910. /*
  911. // Delete user is enabled, but you should remove user from all boards
  912. // before deleting user, because there is possibility of leaving empty user avatars
  913. // to boards. You can remove non-existing user ids manually from database,
  914. // if that happens.
  915. //. See:
  916. // - wekan/client/components/settings/peopleBody.jade deleteButton
  917. // - wekan/client/components/settings/peopleBody.js deleteButton
  918. // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
  919. // that does now remove member from board, card members and assignees correctly,
  920. // but that should be used to remove user from all boards similarly
  921. // - wekan/models/users.js Delete is not enabled
  922. //
  923. //
  924. */
  925. Popup.close();
  926. },
  927. });
  928. Template.settingsUserPopup.helpers({
  929. user() {
  930. return Users.findOne(this.userId);
  931. },
  932. authentications() {
  933. return Template.instance().authenticationMethods.get();
  934. },
  935. isSelected(match) {
  936. const userId = Template.instance().data.userId;
  937. const selected = Users.findOne(userId).authenticationMethod;
  938. return selected === match;
  939. },
  940. isLdap() {
  941. const userId = Template.instance().data.userId;
  942. const selected = Users.findOne(userId).authenticationMethod;
  943. return selected === 'ldap';
  944. },
  945. errorMessage() {
  946. return Template.instance().errorMessage.get();
  947. },
  948. });