peopleBody.js 36 KB

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