peopleBody.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  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. for(let i = 0; i < userTeamsList.length; i++){
  514. userTms.push({
  515. "teamId": userTeamsIdsList[i],
  516. "teamDisplayName": userTeamsList[i],
  517. })
  518. }
  519. Users.update(this.userId, {
  520. $set:{
  521. teams: userTms
  522. }
  523. });
  524. let userOrgsList = userOrgs.split(",");
  525. let userOrgsIdsList = userOrgsIds.split(",");
  526. let userOrganizations = [];
  527. for(let i = 0; i < userOrgsList.length; i++){
  528. userOrganizations.push({
  529. "orgId": userOrgsIdsList[i],
  530. "orgDisplayName": userOrgsList[i],
  531. })
  532. }
  533. Users.update(this.userId, {
  534. $set:{
  535. orgs: userOrganizations
  536. }
  537. });
  538. if (isChangePassword) {
  539. Meteor.call('setPassword', password, this.userId);
  540. }
  541. if (isChangeEmailVerified) {
  542. Meteor.call('setEmailVerified', email, verified === 'true', this.userId);
  543. }
  544. if (isChangeInitials) {
  545. Meteor.call('setInitials', initials, this.userId);
  546. }
  547. if (isChangeUserName && isChangeEmail) {
  548. Meteor.call(
  549. 'setUsernameAndEmail',
  550. username,
  551. email.toLowerCase(),
  552. this.userId,
  553. function (error) {
  554. const usernameMessageElement = templateInstance.$('.username-taken');
  555. const emailMessageElement = templateInstance.$('.email-taken');
  556. if (error) {
  557. const errorElement = error.error;
  558. if (errorElement === 'username-already-taken') {
  559. usernameMessageElement.show();
  560. emailMessageElement.hide();
  561. } else if (errorElement === 'email-already-taken') {
  562. usernameMessageElement.hide();
  563. emailMessageElement.show();
  564. }
  565. } else {
  566. usernameMessageElement.hide();
  567. emailMessageElement.hide();
  568. Popup.close();
  569. }
  570. },
  571. );
  572. } else if (isChangeUserName) {
  573. Meteor.call('setUsername', username, this.userId, function (error) {
  574. const usernameMessageElement = templateInstance.$('.username-taken');
  575. if (error) {
  576. const errorElement = error.error;
  577. if (errorElement === 'username-already-taken') {
  578. usernameMessageElement.show();
  579. }
  580. } else {
  581. usernameMessageElement.hide();
  582. Popup.close();
  583. }
  584. });
  585. } else if (isChangeEmail) {
  586. Meteor.call(
  587. 'setEmail',
  588. email.toLowerCase(),
  589. this.userId,
  590. function (error) {
  591. const emailMessageElement = templateInstance.$('.email-taken');
  592. if (error) {
  593. const errorElement = error.error;
  594. if (errorElement === 'email-already-taken') {
  595. emailMessageElement.show();
  596. }
  597. } else {
  598. emailMessageElement.hide();
  599. Popup.close();
  600. }
  601. },
  602. );
  603. } else Popup.close();
  604. },
  605. 'click #addUserOrg'(event) {
  606. event.preventDefault();
  607. userOrgsTeamsAction = "addOrg";
  608. document.getElementById("jsOrgs").style.display = 'block';
  609. document.getElementById("jsTeams").style.display = 'none';
  610. },
  611. 'click #removeUserOrg'(event) {
  612. event.preventDefault();
  613. userOrgsTeamsAction = "removeOrg";
  614. document.getElementById("jsOrgs").style.display = 'block';
  615. document.getElementById("jsTeams").style.display = 'none';
  616. },
  617. 'click #addUserTeam'(event) {
  618. event.preventDefault();
  619. userOrgsTeamsAction = "addTeam";
  620. document.getElementById("jsTeams").style.display = 'block';
  621. document.getElementById("jsOrgs").style.display = 'none';
  622. },
  623. 'click #removeUserTeam'(event) {
  624. event.preventDefault();
  625. userOrgsTeamsAction = "removeTeam";
  626. document.getElementById("jsTeams").style.display = 'block';
  627. document.getElementById("jsOrgs").style.display = 'none';
  628. },
  629. 'change #jsOrgs'(event) {
  630. event.preventDefault();
  631. UpdateUserOrgsOrTeamsElement();
  632. },
  633. 'change #jsTeams'(event) {
  634. event.preventDefault();
  635. UpdateUserOrgsOrTeamsElement();
  636. },
  637. });
  638. UpdateUserOrgsOrTeamsElement = function(isNewUser = false){
  639. let selectedElt;
  640. let selectedEltValue;
  641. let selectedEltValueId;
  642. let inputElt;
  643. let inputEltId;
  644. let lstInputValues = [];
  645. let lstInputValuesIds = [];
  646. let index;
  647. let indexId;
  648. switch(userOrgsTeamsAction)
  649. {
  650. case "addOrg":
  651. case "removeOrg":
  652. inputElt = !isNewUser ? document.getElementById("jsUserOrgsInPut") : document.getElementById("jsUserOrgsInPutNewUser");
  653. inputEltId = !isNewUser ? document.getElementById("jsUserOrgIdsInPut") : document.getElementById("jsUserOrgIdsInPutNewUser");
  654. selectedElt = !isNewUser ? document.getElementById("jsOrgs") : document.getElementById("jsOrgsNewUser");
  655. break;
  656. case "addTeam":
  657. case "removeTeam":
  658. inputElt = !isNewUser ? document.getElementById("jsUserTeamsInPut") : document.getElementById("jsUserTeamsInPutNewUser");
  659. inputEltId = !isNewUser ? document.getElementById("jsUserTeamIdsInPut") : document.getElementById("jsUserTeamIdsInPutNewUser");
  660. selectedElt = !isNewUser ? document.getElementById("jsTeams") : document.getElementById("jsTeamsNewUser");
  661. break;
  662. default:
  663. break;
  664. }
  665. selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text;
  666. selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value;
  667. lstInputValues = inputElt.value.trim().split(",");
  668. if(lstInputValues.length == 1 && lstInputValues[0] == ''){
  669. lstInputValues = [];
  670. }
  671. lstInputValuesIds = inputEltId.value.trim().split(",");
  672. if(lstInputValuesIds.length == 1 && lstInputValuesIds[0] == ''){
  673. lstInputValuesIds = [];
  674. }
  675. index = lstInputValues.indexOf(selectedEltValue);
  676. indexId = lstInputValuesIds.indexOf(selectedEltValue);
  677. if(userOrgsTeamsAction == "addOrg" || userOrgsTeamsAction == "addTeam"){
  678. if(index <= -1 && selectedEltValueId != "-1"){
  679. lstInputValues.push(selectedEltValue);
  680. }
  681. if(indexId <= -1 && selectedEltValueId != "-1"){
  682. lstInputValuesIds.push(selectedEltValueId);
  683. }
  684. }
  685. else{
  686. if(index > -1 && selectedEltValueId != "-1"){
  687. lstInputValues.splice(index, 1);
  688. }
  689. if(indexId > -1 && selectedEltValueId != "-1"){
  690. lstInputValuesIds.splice(indexId, 1);
  691. }
  692. }
  693. if(lstInputValues.length > 0){
  694. inputElt.value = lstInputValues.join(",");
  695. }
  696. else{
  697. inputElt.value = "";
  698. }
  699. if(lstInputValuesIds.length > 0){
  700. inputEltId.value = lstInputValuesIds.join(",");
  701. }
  702. else{
  703. inputEltId.value = "";
  704. }
  705. selectedElt.value = "-1";
  706. selectedElt.style.display = "none";
  707. }
  708. Template.newOrgPopup.events({
  709. submit(event, templateInstance) {
  710. event.preventDefault();
  711. const orgDisplayName = templateInstance
  712. .find('.js-orgDisplayName')
  713. .value.trim();
  714. const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
  715. const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
  716. const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
  717. const orgIsActive =
  718. templateInstance.find('.js-org-isactive').value.trim() == 'true';
  719. Meteor.call(
  720. 'setCreateOrg',
  721. orgDisplayName,
  722. orgDesc,
  723. orgShortName,
  724. orgWebsite,
  725. orgIsActive,
  726. );
  727. Popup.close();
  728. },
  729. });
  730. Template.newTeamPopup.events({
  731. submit(event, templateInstance) {
  732. event.preventDefault();
  733. const teamDisplayName = templateInstance
  734. .find('.js-teamDisplayName')
  735. .value.trim();
  736. const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
  737. const teamShortName = templateInstance
  738. .find('.js-teamShortName')
  739. .value.trim();
  740. const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
  741. const teamIsActive =
  742. templateInstance.find('.js-team-isactive').value.trim() == 'true';
  743. Meteor.call(
  744. 'setCreateTeam',
  745. teamDisplayName,
  746. teamDesc,
  747. teamShortName,
  748. teamWebsite,
  749. teamIsActive,
  750. );
  751. Popup.close();
  752. },
  753. });
  754. Template.newUserPopup.events({
  755. submit(event, templateInstance) {
  756. event.preventDefault();
  757. const fullname = templateInstance.find('.js-profile-fullname').value.trim();
  758. const username = templateInstance.find('.js-profile-username').value.trim();
  759. const initials = templateInstance.find('.js-profile-initials').value.trim();
  760. const password = templateInstance.find('.js-profile-password').value;
  761. const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim();
  762. const isActive = templateInstance.find('.js-profile-isactive').value.trim();
  763. const email = templateInstance.find('.js-profile-email').value.trim();
  764. const importUsernames = Users.parseImportUsernames(
  765. templateInstance.find('.js-import-usernames').value,
  766. );
  767. const userOrgs = templateInstance.find('.js-userOrgsNewUser').value.trim();
  768. const userOrgsIds = templateInstance.find('.js-userOrgIdsNewUser').value.trim();
  769. const userTeams = templateInstance.find('.js-userteamsNewUser').value.trim();
  770. const userTeamsIds = templateInstance.find('.js-userteamIdsNewUser').value.trim();
  771. let userTeamsList = userTeams.split(",");
  772. let userTeamsIdsList = userTeamsIds.split(",");
  773. let userTms = [];
  774. for(let i = 0; i < userTeamsList.length; i++){
  775. userTms.push({
  776. "teamId": userTeamsIdsList[i],
  777. "teamDisplayName": userTeamsList[i],
  778. })
  779. }
  780. let userOrgsList = userOrgs.split(",");
  781. let userOrgsIdsList = userOrgsIds.split(",");
  782. let userOrganizations = [];
  783. for(let i = 0; i < userOrgsList.length; i++){
  784. userOrganizations.push({
  785. "orgId": userOrgsIdsList[i],
  786. "orgDisplayName": userOrgsList[i],
  787. })
  788. }
  789. Meteor.call(
  790. 'setCreateUser',
  791. fullname,
  792. username,
  793. initials,
  794. password,
  795. isAdmin,
  796. isActive,
  797. email.toLowerCase(),
  798. importUsernames,
  799. userOrganizations,
  800. userTms,
  801. function(error) {
  802. const usernameMessageElement = templateInstance.$('.username-taken');
  803. const emailMessageElement = templateInstance.$('.email-taken');
  804. if (error) {
  805. const errorElement = error.error;
  806. if (errorElement === 'username-already-taken') {
  807. usernameMessageElement.show();
  808. emailMessageElement.hide();
  809. } else if (errorElement === 'email-already-taken') {
  810. usernameMessageElement.hide();
  811. emailMessageElement.show();
  812. }
  813. } else {
  814. usernameMessageElement.hide();
  815. emailMessageElement.hide();
  816. Popup.close();
  817. }
  818. },
  819. );
  820. Popup.close();
  821. },
  822. 'click #addUserOrgNewUser'(event) {
  823. event.preventDefault();
  824. userOrgsTeamsAction = "addOrg";
  825. document.getElementById("jsOrgsNewUser").style.display = 'block';
  826. document.getElementById("jsTeamsNewUser").style.display = 'none';
  827. },
  828. 'click #removeUserOrgNewUser'(event) {
  829. event.preventDefault();
  830. userOrgsTeamsAction = "removeOrg";
  831. document.getElementById("jsOrgsNewUser").style.display = 'block';
  832. document.getElementById("jsTeamsNewUser").style.display = 'none';
  833. },
  834. 'click #addUserTeamNewUser'(event) {
  835. event.preventDefault();
  836. userOrgsTeamsAction = "addTeam";
  837. document.getElementById("jsTeamsNewUser").style.display = 'block';
  838. document.getElementById("jsOrgsNewUser").style.display = 'none';
  839. },
  840. 'click #removeUserTeamNewUser'(event) {
  841. event.preventDefault();
  842. userOrgsTeamsAction = "removeTeam";
  843. document.getElementById("jsTeamsNewUser").style.display = 'block';
  844. document.getElementById("jsOrgsNewUser").style.display = 'none';
  845. },
  846. 'change #jsOrgsNewUser'(event) {
  847. event.preventDefault();
  848. UpdateUserOrgsOrTeamsElement(true);
  849. },
  850. 'change #jsTeamsNewUser'(event) {
  851. event.preventDefault();
  852. UpdateUserOrgsOrTeamsElement(true);
  853. },
  854. });
  855. Template.settingsOrgPopup.events({
  856. 'click #deleteButton'(event) {
  857. event.preventDefault();
  858. Org.remove(this.orgId);
  859. Popup.close();
  860. }
  861. });
  862. Template.settingsTeamPopup.events({
  863. 'click #deleteButton'(event) {
  864. event.preventDefault();
  865. Team.remove(this.teamId);
  866. Popup.close();
  867. }
  868. });
  869. Template.settingsUserPopup.events({
  870. 'click .impersonate-user'(event) {
  871. event.preventDefault();
  872. Meteor.call('impersonate', this.userId, (err) => {
  873. if (!err) {
  874. FlowRouter.go('/');
  875. Meteor.connection.setUserId(this.userId);
  876. }
  877. });
  878. },
  879. 'click #deleteButton'(event) {
  880. event.preventDefault();
  881. /*
  882. // Delete is not enabled yet, because it does leave empty user avatars
  883. // to boards: boards members, card members and assignees have
  884. // empty users. See:
  885. // - wekan/client/components/settings/peopleBody.jade deleteButton
  886. // - wekan/client/components/settings/peopleBody.js deleteButton
  887. // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
  888. // that does now remove member from board, card members and assignees correctly,
  889. // but that should be used to remove user from all boards similarly
  890. // - wekan/models/users.js Delete is not enabled
  891. //
  892. //Users.remove(this.userId);
  893. */
  894. Popup.close();
  895. },
  896. });
  897. Template.settingsUserPopup.helpers({
  898. user() {
  899. return Users.findOne(this.userId);
  900. },
  901. authentications() {
  902. return Template.instance().authenticationMethods.get();
  903. },
  904. isSelected(match) {
  905. const userId = Template.instance().data.userId;
  906. const selected = Users.findOne(userId).authenticationMethod;
  907. return selected === match;
  908. },
  909. isLdap() {
  910. const userId = Template.instance().data.userId;
  911. const selected = Users.findOne(userId).authenticationMethod;
  912. return selected === 'ldap';
  913. },
  914. errorMessage() {
  915. return Template.instance().errorMessage.get();
  916. },
  917. });