peopleBody.jade 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. template(name="people")
  2. .setting-content
  3. unless currentUser.isAdmin
  4. | {{_ 'error-notAuthorized'}}
  5. else
  6. .content-title.ext-box
  7. .ext-box-left
  8. if loading.get
  9. +spinner
  10. else if orgSetting.get
  11. span
  12. i.fa.fa-sitemap
  13. unless isMiniScreen
  14. | {{_ 'organizations'}}
  15. input#searchOrgInput(placeholder="{{_ 'search'}}")
  16. button#searchOrgButton
  17. i.fa.fa-search
  18. | {{_ 'search'}}
  19. .ext-box-right
  20. span {{#unless isMiniScreen}}{{_ 'org-number'}}{{/unless}} #{orgNumber}
  21. else if teamSetting.get
  22. span
  23. i.fa.fa-users
  24. unless isMiniScreen
  25. | {{_ 'teams'}}
  26. input#searchTeamInput(placeholder="{{_ 'search'}}")
  27. button#searchTeamButton
  28. i.fa.fa-search
  29. | {{_ 'search'}}
  30. .ext-box-right
  31. span {{#unless isMiniScreen}}{{_ 'team-number'}}{{/unless}} #{teamNumber}
  32. else if peopleSetting.get
  33. span
  34. i.fa.fa-user
  35. unless isMiniScreen
  36. | {{_ 'people'}}
  37. input#searchInput(placeholder="{{_ 'search'}}")
  38. button#searchButton
  39. i.fa.fa-search
  40. | {{_ 'search'}}
  41. .ext-box-right
  42. span {{#unless isMiniScreen}}{{_ 'people-number'}}{{/unless}} #{peopleNumber}
  43. .content-body
  44. .side-menu
  45. ul
  46. li.active
  47. a.js-org-menu(data-id="org-setting")
  48. i.fa.fa-sitemap
  49. | {{_ 'organizations'}}
  50. li
  51. a.js-team-menu(data-id="team-setting")
  52. i.fa.fa-users
  53. | {{_ 'teams'}}
  54. li
  55. a.js-people-menu(data-id="people-setting")
  56. i.fa.fa-user
  57. | {{_ 'people'}}
  58. .main-body
  59. if loading.get
  60. +spinner
  61. else if orgSetting.get
  62. +orgGeneral
  63. else if teamSetting.get
  64. +teamGeneral
  65. else if peopleSetting.get
  66. +peopleGeneral
  67. template(name="orgGeneral")
  68. table
  69. tbody
  70. tr
  71. th {{_ 'displayName'}}
  72. th {{_ 'description'}}
  73. th {{_ 'shortName'}}
  74. th {{_ 'website'}}
  75. th {{_ 'createdAt'}}
  76. th {{_ 'active'}}
  77. th
  78. +newOrgRow
  79. each org in orgList
  80. +orgRow(orgId=org._id)
  81. template(name="teamGeneral")
  82. table
  83. tbody
  84. tr
  85. th {{_ 'displayName'}}
  86. th {{_ 'description'}}
  87. th {{_ 'shortName'}}
  88. th {{_ 'website'}}
  89. th {{_ 'createdAt'}}
  90. th {{_ 'active'}}
  91. th
  92. +newTeamRow
  93. each team in teamList
  94. +teamRow(teamId=team._id)
  95. template(name="peopleGeneral")
  96. table
  97. tbody
  98. tr
  99. th {{_ 'username'}}
  100. th {{_ 'fullname'}}
  101. th {{_ 'initials'}}
  102. th {{_ 'admin'}}
  103. th {{_ 'email'}}
  104. th {{_ 'verified'}}
  105. th {{_ 'createdAt'}}
  106. th {{_ 'active'}}
  107. th {{_ 'authentication-method'}}
  108. th {{_ 'import-usernames'}}
  109. th {{_ 'organizations'}}
  110. th {{_ 'teams'}}
  111. th
  112. +newUserRow
  113. each user in peopleList
  114. +peopleRow(userId=user._id)
  115. template(name="newOrgRow")
  116. a.new-org
  117. i.fa.fa-plus-square
  118. | {{_ 'new'}}
  119. template(name="newTeamRow")
  120. a.new-team
  121. i.fa.fa-plus-square
  122. | {{_ 'new'}}
  123. template(name="newUserRow")
  124. a.new-user
  125. i.fa.fa-plus-square
  126. | {{_ 'new'}}
  127. template(name="orgRow")
  128. tr
  129. if orgData.orgIsActive
  130. td <s>{{ orgData.orgDisplayName }}</s>
  131. else
  132. td {{ orgData.orgDisplayName }}
  133. if orgData.orgIsActive
  134. td <s>{{ orgData.orgDesc }}</s>
  135. else
  136. td {{ orgData.orgDesc }}
  137. if orgData.orgIsActive
  138. td <s>{{ orgData.orgShortName }}</s>
  139. else
  140. td {{ orgData.orgShortName }}
  141. if orgData.orgIsActive
  142. td <s>{{ orgData.orgWebsite }}</s>
  143. else
  144. td {{ orgData.orgWebsite }}
  145. if orgData.orgIsActive
  146. td <s>{{ moment orgData.createdAt 'LLL' }}</s>
  147. else
  148. td {{ moment orgData.createdAt 'LLL' }}
  149. td
  150. if orgData.orgIsActive
  151. | {{_ 'no'}}
  152. else
  153. | {{_ 'yes'}}
  154. td
  155. a.edit-org
  156. i.fa.fa-edit
  157. | {{_ 'edit'}}
  158. a.more-settings-org
  159. i.fa.fa-ellipsis-h
  160. template(name="teamRow")
  161. tr
  162. if teamData.teamIsActive
  163. td <s>{{ teamData.teamDisplayName }}</s>
  164. else
  165. td {{ teamData.teamDisplayName }}
  166. if teamData.teamIsActive
  167. td <s>{{ teamData.teamDesc }}</s>
  168. else
  169. td {{ teamData.teamDesc }}
  170. if teamData.teamIsActive
  171. td <s>{{ teamData.teamShortName }}</s>
  172. else
  173. td {{ teamData.teamShortName }}
  174. if teamData.teamIsActive
  175. td <s>{{ teamData.teamWebsite }}</s>
  176. else
  177. td {{ teamData.teamWebsite }}
  178. if teamData.teamIsActive
  179. td <s>{{ moment teamData.createdAt 'LLL' }}</s>
  180. else
  181. td {{ moment teamData.createdAt 'LLL' }}
  182. td
  183. if teamData.teamIsActive
  184. | {{_ 'no'}}
  185. else
  186. | {{_ 'yes'}}
  187. td
  188. a.edit-team
  189. i.fa.fa-edit
  190. | {{_ 'edit'}}
  191. a.more-settings-team
  192. i.fa.fa-ellipsis-h
  193. template(name="peopleRow")
  194. tr
  195. if userData.loginDisabled
  196. td.username <s>{{ userData.username }}</s>
  197. else
  198. td.username {{ userData.username }}
  199. if userData.loginDisabled
  200. td <s>{{ userData.profile.fullname }}</s>
  201. else
  202. td {{ userData.profile.fullname }}
  203. if userData.loginDisabled
  204. td <s>{{ userData.profile.initials }}</s>
  205. else
  206. td {{ userData.profile.initials }}
  207. if userData.loginDisabled
  208. td
  209. if userData.isAdmin
  210. | <s>{{_ 'yes'}}</s>
  211. else
  212. | <s>{{_ 'no'}}</s>
  213. else
  214. td
  215. if userData.isAdmin
  216. | {{_ 'yes'}}
  217. else
  218. | {{_ 'no'}}
  219. if userData.loginDisabled
  220. td <s>{{ userData.emails.[0].address }}</s>
  221. else
  222. td {{ userData.emails.[0].address }}
  223. if userData.loginDisabled
  224. td
  225. if userData.emails.[0].verified
  226. | <s>{{_ 'yes'}}</s>
  227. else
  228. | <s>{{_ 'no'}}</s>
  229. else
  230. td
  231. if userData.emails.[0].verified
  232. | {{_ 'yes'}}
  233. else
  234. | {{_ 'no'}}
  235. if userData.loginDisabled
  236. td <s>{{ moment userData.createdAt 'LLL' }}</s>
  237. else
  238. td {{ moment userData.createdAt 'LLL' }}
  239. td
  240. if userData.loginDisabled
  241. | {{_ 'no'}}
  242. else
  243. | {{_ 'yes'}}
  244. if userData.loginDisabled
  245. td <s>{{_ userData.authenticationMethod }}</s>
  246. else
  247. td {{_ userData.authenticationMethod }}
  248. if userData.loginDisabled
  249. td <s>{{ userData.importUsernamesString }}</s>
  250. else
  251. td {{ userData.importUsernamesString }}
  252. if userData.loginDisabled
  253. td <s>{{ userData.orgsUserBelongs }}</s>
  254. else
  255. td {{ userData.orgsUserBelongs }}
  256. if userData.loginDisabled
  257. td <s>{{ userData.teamsUserBelongs }}</s>
  258. else
  259. td {{ userData.teamsUserBelongs }}
  260. td
  261. a.edit-user
  262. i.fa.fa-edit
  263. | {{_ 'edit'}}
  264. a.more-settings-user
  265. i.fa.fa-ellipsis-h
  266. template(name="editOrgPopup")
  267. form
  268. label.hide.orgId(type="text" value=org._id)
  269. label
  270. | {{_ 'displayName'}}
  271. input.js-orgDisplayName(type="text" value=org.orgDisplayName required)
  272. span.error.hide.orgname-taken
  273. | {{_ 'error-orgname-taken'}}
  274. label
  275. | {{_ 'description'}}
  276. input.js-orgDesc(type="text" value=org.orgDesc required)
  277. label
  278. | {{_ 'shortName'}}
  279. input.js-orgShortName(type="text" value=org.orgShortName required)
  280. label
  281. | {{_ 'website'}}
  282. input.js-orgWebsite(type="text" value=org.orgWebsite required)
  283. label
  284. | {{_ 'active'}}
  285. select.select-active.js-org-isactive
  286. option(value="false") {{_ 'yes'}}
  287. option(value="true" selected="{{org.orgIsActive}}") {{_ 'no'}}
  288. hr
  289. div.buttonsContainer
  290. input.primary.wide(type="submit" value="{{_ 'save'}}")
  291. template(name="editTeamPopup")
  292. form
  293. label.hide.teamId(type="text" value=team._id)
  294. label
  295. | {{_ 'displayName'}}
  296. input.js-teamDisplayName(type="text" value=team.teamDisplayName required)
  297. span.error.hide.teamname-taken
  298. | {{_ 'error-teamname-taken'}}
  299. label
  300. | {{_ 'description'}}
  301. input.js-teamDesc(type="text" value=team.teamDesc required)
  302. label
  303. | {{_ 'shortName'}}
  304. input.js-teamShortName(type="text" value=team.teamShortName required)
  305. label
  306. | {{_ 'website'}}
  307. input.js-teamWebsite(type="text" value=team.teamWebsite required)
  308. label
  309. | {{_ 'active'}}
  310. select.select-active.js-team-isactive
  311. option(value="false") {{_ 'yes'}}
  312. option(value="true" selected="{{team.teamIsActive}}") {{_ 'no'}}
  313. hr
  314. div.buttonsContainer
  315. input.primary.wide(type="submit" value="{{_ 'save'}}")
  316. template(name="editUserPopup")
  317. form
  318. label.hide.userId(type="text" value=user._id)
  319. label
  320. | {{_ 'username'}}
  321. span.error.hide.username-taken
  322. | {{_ 'error-username-taken'}}
  323. if isLdap
  324. input.js-profile-username(type="text" value=user.username readonly)
  325. else
  326. input.js-profile-username(type="text" value=user.username required)
  327. label
  328. | {{_ 'fullname'}}
  329. input.js-profile-fullname(type="text" value=user.profile.fullname required)
  330. label
  331. | {{_ 'initials'}}
  332. input.js-profile-initials(type="text" value=user.profile.initials required)
  333. label
  334. | {{_ 'admin'}}
  335. select.select-role.js-profile-isadmin
  336. option(value="false") {{_ 'no'}}
  337. option(value="true" selected="{{user.isAdmin}}") {{_ 'yes'}}
  338. label
  339. | {{_ 'email'}}
  340. span.error.hide.email-taken
  341. | {{_ 'error-email-taken'}}
  342. if isLdap
  343. input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
  344. else
  345. input.js-profile-email(type="email" value="{{user.emails.[0].address}}" required)
  346. label
  347. | {{_ 'import-usernames'}}
  348. input.js-import-usernames(type="text" value=user.importUsernames)
  349. label
  350. | {{_ 'verified'}}
  351. select.select-verified.js-profile-email-verified
  352. option(value="false") {{_ 'no'}}
  353. option(value="true" selected="{{userData.emails.[0].verified}}") {{_ 'yes'}}
  354. label
  355. | {{_ 'active'}}
  356. select.select-active.js-profile-isactive
  357. option(value="false") {{_ 'yes'}}
  358. option(value="true" selected="{{user.loginDisabled}}") {{_ 'no'}}
  359. label
  360. | {{_ 'authentication-type'}}
  361. select.select-authenticationMethod.js-authenticationMethod
  362. each authentications
  363. if isSelected value
  364. option(value="{{value}}" selected) {{_ value}}
  365. else
  366. option(value="{{value}}") {{_ value}}
  367. label
  368. | {{_ 'organizations'}}
  369. i.fa.fa-plus-square#addUserOrg
  370. i.fa.fa-minus-square#removeUserOrg
  371. select.js-orgs#jsOrgs
  372. option(value="-1") {{_ 'organizations'}} :
  373. each value in orgsDatas
  374. option(value="{{value._id}}") {{_ value.orgDisplayName}}
  375. input#jsUserOrgsInPut.js-userOrgs(type="text" value=user.orgsUserBelongs, disabled)
  376. input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="text" value=user.orgIdsUserBelongs)
  377. label
  378. | {{_ 'teams'}}
  379. i.fa.fa-plus-square#addUserTeam
  380. i.fa.fa-minus-square#removeUserTeam
  381. select.js-teams#jsTeams
  382. option(value="-1") {{_ 'teams'}} :
  383. each value in teamsDatas
  384. option(value="{{value._id}}") {{_ value.teamDisplayName}}
  385. input#jsUserTeamsInPut.js-userteams(type="text" value=user.teamsUserBelongs, disabled)
  386. input#jsUserTeamIdsInPut.js-userteamIds.hide(type="text" value=user.teamIdsUserBelongs)
  387. hr
  388. label
  389. | {{_ 'password'}}
  390. input.js-profile-password(type="password")
  391. div.buttonsContainer
  392. input.primary.wide(type="submit" value="{{_ 'save'}}")
  393. template(name="newOrgPopup")
  394. form
  395. //label.hide.userId(type="text" value=user._id)
  396. label
  397. | {{_ 'displayName'}}
  398. input.js-orgDisplayName(type="text" value="" required)
  399. label
  400. | {{_ 'description'}}
  401. input.js-orgDesc(type="text" value="" required)
  402. label
  403. | {{_ 'shortName'}}
  404. input.js-orgShortName(type="text" value="" required)
  405. label
  406. | {{_ 'website'}}
  407. input.js-orgWebsite(type="text" value="" required)
  408. label
  409. | {{_ 'active'}}
  410. select.select-active.js-org-isactive
  411. option(value="false" selected="selected") {{_ 'yes'}}
  412. option(value="true") {{_ 'no'}}
  413. hr
  414. div.buttonsContainer
  415. input.primary.wide(type="submit" value="{{_ 'save'}}")
  416. template(name="newTeamPopup")
  417. form
  418. //label.hide.teamId(type="text" value=team._id)
  419. label
  420. | {{_ 'displayName'}}
  421. input.js-teamDisplayName(type="text" value="" required)
  422. label
  423. | {{_ 'description'}}
  424. input.js-teamDesc(type="text" value="" required)
  425. label
  426. | {{_ 'shortName'}}
  427. input.js-teamShortName(type="text" value="" required)
  428. label
  429. | {{_ 'website'}}
  430. input.js-teamWebsite(type="text" value="" required)
  431. label
  432. | {{_ 'active'}}
  433. select.select-active.js-team-isactive
  434. option(value="false" selected="selected") {{_ 'yes'}}
  435. option(value="true") {{_ 'no'}}
  436. hr
  437. div.buttonsContainer
  438. input.primary.wide(type="submit" value="{{_ 'save'}}")
  439. template(name="newUserPopup")
  440. form
  441. //label.hide.userId(type="text" value=user._id)
  442. label
  443. | {{_ 'fullname'}}
  444. input.js-profile-fullname(type="text" value="" required)
  445. label
  446. | {{_ 'username'}}
  447. span.error.hide.username-taken
  448. | {{_ 'error-username-taken'}}
  449. //if isLdap
  450. // input.js-profile-username(type="text" value=user.username readonly)
  451. //else
  452. input.js-profile-username(type="text" value="" required)
  453. label
  454. | {{_ 'initials'}}
  455. input.js-profile-initials(type="text" value="" required)
  456. label
  457. | {{_ 'email'}}
  458. span.error.hide.email-taken
  459. | {{_ 'error-email-taken'}}
  460. //if isLdap
  461. // input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
  462. //else
  463. input.js-profile-email(type="email" value="" required)
  464. label
  465. | {{_ 'import-usernames'}}
  466. input.js-import-usernames(type="text" value="")
  467. label
  468. | {{_ 'admin'}}
  469. select.select-role.js-profile-isadmin
  470. option(value="false" selected="selected") {{_ 'no'}}
  471. option(value="true") {{_ 'yes'}}
  472. label
  473. | {{_ 'active'}}
  474. select.select-active.js-profile-isactive
  475. option(value="false" selected="selected") {{_ 'yes'}}
  476. option(value="true") {{_ 'no'}}
  477. label
  478. | {{_ 'authentication-type'}}
  479. select.select-authenticationMethod.js-authenticationMethod
  480. each authentications
  481. if isSelected value
  482. option(value="{{value}}" selected) {{_ value}}
  483. else
  484. option(value="{{value}}") {{_ value}}
  485. label
  486. | {{_ 'organizations'}}
  487. i.fa.fa-plus-square#addUserOrgNewUser
  488. i.fa.fa-minus-square#removeUserOrgNewUser
  489. select.js-orgsNewUser#jsOrgsNewUser
  490. option(value="-1") {{_ 'organizations'}} :
  491. each value in orgsDatas
  492. option(value="{{value._id}}") {{_ value.orgDisplayName}}
  493. input#jsUserOrgsInPutNewUser.js-userOrgsNewUser(type="text" value=user.orgsUserBelongs, disabled)
  494. input#jsUserOrgIdsInPutNewUser.js-userOrgIdsNewUser.hide(type="text" value=user.orgIdsUserBelongs)
  495. label
  496. | {{_ 'teams'}}
  497. i.fa.fa-plus-square#addUserTeamNewUser
  498. i.fa.fa-minus-square#removeUserTeamNewUser
  499. select.js-teamsNewUser#jsTeamsNewUser
  500. option(value="-1") {{_ 'teams'}} :
  501. each value in teamsDatas
  502. option(value="{{value._id}}") {{_ value.teamDisplayName}}
  503. input#jsUserTeamsInPutNewUser.js-userteamsNewUser(type="text" value=user.teamsUserBelongs, disabled)
  504. input#jsUserTeamIdsInPutNewUser.js-userteamIdsNewUser.hide(type="text" value=user.teamIdsUserBelongs)
  505. hr
  506. label
  507. | {{_ 'password'}}
  508. input.js-profile-password(type="password" required)
  509. div.buttonsContainer
  510. input.primary.wide(type="submit" value="{{_ 'save'}}")
  511. template(name="settingsOrgPopup")
  512. ul.pop-over-list
  513. li
  514. form
  515. label#deleteOrgWarningMessage.hide
  516. | {{_ 'delete-org-warning-message'}}
  517. br
  518. label
  519. | {{_ 'delete-org-confirm-popup'}}
  520. br
  521. label.hide.orgId(type="text" value=org._id)
  522. labeldelete-org-confirm-popup
  523. div.buttonsContainer
  524. input#deleteButton.card-details-red.right.wide(type="button" value="{{_ 'delete'}}")
  525. // It's not yet possible to impersonate organization. Only impersonate user,
  526. // because that changes current user ID. What would it mean in practice
  527. // to impersonate organization?
  528. // li
  529. // a.impersonate-org
  530. // i.fa.fa-user
  531. // | {{_ 'impersonate-org'}}
  532. //
  533. //
  534. template(name="settingsTeamPopup")
  535. ul.pop-over-list
  536. li
  537. form
  538. label#deleteTeamWarningMessage.hide
  539. | {{_ 'delete-team-warning-message'}}
  540. br
  541. label
  542. | {{_ 'delete-team-confirm-popup'}}
  543. br
  544. label.hide.teamId(type="text" value=team._id)
  545. div.buttonsContainer
  546. input#deleteButton.card-details-red.right.wide(type="button" value="{{_ 'delete'}}")
  547. template(name="settingsUserPopup")
  548. ul.pop-over-list
  549. li
  550. a.impersonate-user
  551. i.fa.fa-user
  552. | {{_ 'impersonate-user'}}
  553. hr
  554. li
  555. form
  556. label.hide.userId(type="text" value=user._id)
  557. div.buttonsContainer
  558. input#deleteButton.card-details-red.right.wide(type="button" value="{{_ 'delete'}}")
  559. // Delete is enabled, but there is still bug of leaving empty user avatars
  560. // to boards: boards members, card members and assignees have
  561. // empty users. So it is better to remove user from all boards before removing user.
  562. // See:
  563. // - wekan/client/components/settings/peopleBody.jade deleteButton
  564. // - wekan/client/components/settings/peopleBody.js deleteButton
  565. // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
  566. // that does now remove member from board, card members and assignees correctly,
  567. // but that should be used to remove user from all boards similarly
  568. // - wekan/models/users.js Delete is not enabled