cardDetails.jade 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. template(name="cardDetails")
  2. section.card-details.js-card-details.js-perfect-scrollbar: .card-details-canvas
  3. .card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
  4. +inlinedForm(classNames="js-card-details-title")
  5. +editCardTitleForm
  6. else
  7. unless isMiniScreen
  8. a.fa.fa-times-thin.close-card-details.js-close-card-details
  9. if currentUser.isBoardMember
  10. a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
  11. input.inline-input(type="hidden" id="cardURL_copy" value="{{ absoluteUrl }}")
  12. a.fa.fa-link.card-copy-button.js-copy-link(
  13. class="fa-link"
  14. title="{{_ 'copy-card-link-to-clipboard'}}"
  15. value="{{ absoluteUrl }}"
  16. )
  17. if isMiniScreen
  18. a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
  19. if currentUser.isBoardMember
  20. a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
  21. a.fa.fa-link.card-copy-mobile-button
  22. h2.card-details-title.js-card-title(
  23. class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
  24. +viewer
  25. = getTitle
  26. if isWatching
  27. i.card-details-watch.fa.fa-eye
  28. .card-details-path
  29. each parentList
  30. |   >  
  31. a.js-parent-card(href=linkForCard) {{title}}
  32. // else
  33. {{_ 'top-level-card'}}
  34. if isLinkedCard
  35. h3.linked-card-location
  36. +viewer
  37. | {{getBoardTitle}} > {{getTitle}}
  38. if getArchived
  39. if isLinkedBoard
  40. p.warning {{_ 'board-archived'}}
  41. else
  42. p.warning {{_ 'card-archived'}}
  43. .card-details-items
  44. if currentBoard.allowsReceivedDate
  45. .card-details-item.card-details-item-received
  46. h3
  47. i.fa.fa-sign-out
  48. card-details-item-title {{_ 'card-received'}}
  49. if getReceived
  50. +cardReceivedDate
  51. else
  52. if canModifyCard
  53. unless currentUser.isWorker
  54. a.card-label.add-label.js-received-date
  55. i.fa.fa-plus
  56. if currentBoard.allowsStartDate
  57. .card-details-item.card-details-item-start
  58. h3
  59. i.fa.fa-hourglass-start
  60. card-details-item-title {{_ 'card-start'}}
  61. if getStart
  62. +cardStartDate
  63. else
  64. if canModifyCard
  65. unless currentUser.isWorker
  66. a.card-label.add-label.js-start-date
  67. i.fa.fa-plus
  68. if currentBoard.allowsDueDate
  69. .card-details-item.card-details-item-due
  70. h3
  71. i.fa.fa-sign-in
  72. card-details-item-title {{_ 'card-due'}}
  73. if getDue
  74. +cardDueDate
  75. else
  76. if canModifyCard
  77. unless currentUser.isWorker
  78. a.card-label.add-label.js-due-date
  79. i.fa.fa-plus
  80. if currentBoard.allowsEndDate
  81. .card-details-item.card-details-item-end
  82. h3
  83. i.fa.fa-hourglass-end
  84. card-details-item-title {{_ 'card-end'}}
  85. if getEnd
  86. +cardEndDate
  87. else
  88. if canModifyCard
  89. unless currentUser.isWorker
  90. a.card-label.add-label.js-end-date
  91. i.fa.fa-plus
  92. .card-details-items
  93. if currentBoard.allowsMembers
  94. .card-details-item.card-details-item-members
  95. h3
  96. i.fa.fa-users
  97. card-details-item-title {{_ 'members'}}
  98. each getMembers
  99. +userAvatar(userId=this cardId=../_id)
  100. | {{! XXX Hack to hide syntaxic coloration /// }}
  101. if canModifyCard
  102. unless currentUser.isWorker
  103. a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
  104. i.fa.fa-plus
  105. //if assigneeSelected
  106. if currentBoard.allowsAssignee
  107. .card-details-item.card-details-item-assignees
  108. h3
  109. i.fa.fa-user
  110. card-details-item-title {{_ 'assignee'}}
  111. each getAssignees
  112. +userAvatarAssignee(userId=this cardId=../_id)
  113. | {{! XXX Hack to hide syntaxic coloration /// }}
  114. if canModifyCard
  115. a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
  116. i.fa.fa-plus
  117. if currentUser.isWorker
  118. unless assigneeSelected
  119. a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
  120. i.fa.fa-plus
  121. if currentBoard.allowsLabels
  122. .card-details-item.card-details-item-labels
  123. h3
  124. i.fa.fa-tags
  125. card-details-item-title {{_ 'labels'}}
  126. a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
  127. each labels
  128. span.card-label(class="card-label-{{color}}" title=name)
  129. +viewer
  130. = name
  131. if canModifyCard
  132. unless currentUser.isWorker
  133. a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
  134. i.fa.fa-plus
  135. .card-details-items
  136. each customFieldsWD
  137. .card-details-item.card-details-item-customfield
  138. h3.card-details-item-title
  139. +viewer
  140. = definition.name
  141. +cardCustomField
  142. .card-details-items
  143. if getSpentTime
  144. .card-details-item.card-details-item-spent
  145. if getIsOvertime
  146. h3.card-details-item-title {{_ 'overtime-hours'}}
  147. else
  148. h3.card-details-item-title {{_ 'spent-time-hours'}}
  149. +cardSpentTime
  150. //- XXX We should use "editable" to avoid repetiting ourselves
  151. if canModifyCard
  152. unless currentUser.isWorker
  153. h3
  154. i.fa.fa-align-left
  155. card-details-item-title {{_ 'description'}}
  156. +inlinedCardDescription(classNames="card-description js-card-description")
  157. +editor(autofocus=true)
  158. | {{getUnsavedValue 'cardDescription' _id getDescription}}
  159. .edit-controls.clearfix
  160. button.primary(type="submit") {{_ 'save'}}
  161. a.fa.fa-times-thin.js-close-inlined-form
  162. else
  163. a.js-open-inlined-form
  164. if getDescription
  165. +viewer
  166. = getDescription
  167. else
  168. | {{_ 'edit'}}
  169. if (hasUnsavedValue 'cardDescription' _id)
  170. p.quiet
  171. | {{_ 'unsaved-description'}}
  172. a.js-open-inlined-form {{_ 'view-it'}}
  173. = ' - '
  174. a.js-close-inlined-form {{_ 'discard'}}
  175. else if getDescription
  176. h3.card-details-item-title {{_ 'description'}}
  177. +viewer
  178. = getDescription
  179. .card-details-items
  180. if currentBoard.allowsRequestedBy
  181. .card-details-item.card-details-item-name
  182. h3
  183. i.fa.fa-shopping-cart
  184. card-details-item-title {{_ 'requested-by'}}
  185. if canModifyCard
  186. unless currentUser.isWorker
  187. +inlinedForm(classNames="js-card-details-requester")
  188. +editCardRequesterForm
  189. else
  190. a.js-open-inlined-form
  191. if getRequestedBy
  192. +viewer
  193. = getRequestedBy
  194. else
  195. | {{_ 'add'}}
  196. else if getRequestedBy
  197. +viewer
  198. = getRequestedBy
  199. if currentBoard.allowsAssignedBy
  200. .card-details-item.card-details-item-name
  201. h3
  202. i.fa.fa-user-plus
  203. card-details-item-title {{_ 'assigned-by'}}
  204. if canModifyCard
  205. unless currentUser.isWorker
  206. +inlinedForm(classNames="js-card-details-assigner")
  207. +editCardAssignerForm
  208. else
  209. a.js-open-inlined-form
  210. if getAssignedBy
  211. +viewer
  212. = getAssignedBy
  213. else
  214. | {{_ 'add'}}
  215. else if getRequestedBy
  216. +viewer
  217. = getAssignedBy
  218. .card-checklist-attachmentGalerys
  219. .card-checklist-attachmentGalery.card-checklists
  220. if currentBoard.allowsChecklists
  221. +checklists(cardId = _id)
  222. if currentBoard.allowsSubtasks
  223. hr
  224. +subtasks(cardId = _id)
  225. if currentBoard.allowsAttachments
  226. //- hr
  227. //- h3
  228. //- i.fa.fa-paperclip
  229. //- | {{_ 'attachments'}}
  230. .card-checklist-attachmentGalery.card-attachmentGalery
  231. +attachmentsGalery
  232. hr
  233. unless currentUser.isNoComments
  234. .activity-title
  235. h3
  236. i.fa.fa-history
  237. | {{ _ 'activity'}}
  238. if currentUser.isBoardMember
  239. .material-toggle-switch
  240. span.toggle-switch-title {{_ 'hide-system-messages'}}
  241. if hiddenSystemMessages
  242. input.toggle-switch(type="checkbox" id="toggleButton" checked="checked")
  243. else
  244. input.toggle-switch(type="checkbox" id="toggleButton")
  245. label.toggle-label(for="toggleButton")
  246. if currentBoard.allowsComments
  247. if currentUser.isBoardMember
  248. unless currentUser.isNoComments
  249. +commentForm
  250. unless currentUser.isNoComments
  251. if isLoaded.get
  252. if isLinkedCard
  253. +activities(card=this mode="linkedcard")
  254. else if isLinkedBoard
  255. +activities(card=this mode="linkedboard")
  256. else
  257. +activities(card=this mode="card")
  258. template(name="editCardTitleForm")
  259. textarea.js-edit-card-title(rows='1' autofocus dir="auto")
  260. = getTitle
  261. .edit-controls.clearfix
  262. button.primary.confirm.js-submit-edit-card-title-form(type="submit") {{_ 'save'}}
  263. a.fa.fa-times-thin.js-close-inlined-form
  264. template(name="editCardRequesterForm")
  265. input.js-edit-card-requester(type='text' autofocus value=getRequestedBy dir="auto")
  266. .edit-controls.clearfix
  267. button.primary.confirm.js-submit-edit-card-requester-form(type="submit") {{_ 'save'}}
  268. a.fa.fa-times-thin.js-close-inlined-form
  269. template(name="editCardAssignerForm")
  270. input.js-edit-card-assigner(type='text' autofocus value=getAssignedBy dir="auto")
  271. .edit-controls.clearfix
  272. button.primary.confirm.js-submit-edit-card-assigner-form(type="submit") {{_ 'save'}}
  273. a.fa.fa-times-thin.js-close-inlined-form
  274. template(name="cardDetailsActionsPopup")
  275. ul.pop-over-list
  276. li
  277. a.js-toggle-watch-card
  278. if isWatching
  279. i.fa.fa-eye
  280. | {{_ 'unwatch'}}
  281. else
  282. i.fa.fa-eye-slash
  283. | {{_ 'watch'}}
  284. if canModifyCard
  285. unless currentUser.isWorker
  286. hr
  287. ul.pop-over-list
  288. //li: a.js-members {{_ 'card-edit-members'}}
  289. //li: a.js-labels {{_ 'card-edit-labels'}}
  290. //li: a.js-attachments {{_ 'card-edit-attachments'}}
  291. li
  292. a.js-custom-fields
  293. i.fa.fa-list-alt
  294. | {{_ 'card-edit-custom-fields'}}
  295. //li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
  296. //li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
  297. //li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
  298. //li: a.js-end-date {{_ 'editCardEndDatePopup-title'}}
  299. li
  300. a.js-spent-time
  301. i.fa.fa-clock-o
  302. | {{_ 'editCardSpentTimePopup-title'}}
  303. li
  304. a.js-set-card-color
  305. i.fa.fa-paint-brush
  306. | {{_ 'setCardColorPopup-title'}}
  307. hr
  308. ul.pop-over-list
  309. li
  310. a.js-move-card-to-top
  311. i.fa.fa-arrow-up
  312. | {{_ 'moveCardToTop-title'}}
  313. li
  314. a.js-move-card-to-bottom
  315. i.fa.fa-arrow-down
  316. | {{_ 'moveCardToBottom-title'}}
  317. unless currentUser.isWorker
  318. hr
  319. ul.pop-over-list
  320. li
  321. a.js-move-card
  322. i.fa.fa-arrow-right
  323. | {{_ 'moveCardPopup-title'}}
  324. li
  325. a.js-copy-card
  326. i.fa.fa-copy
  327. | {{_ 'copyCardPopup-title'}}
  328. hr
  329. ul.pop-over-list
  330. li
  331. a.js-copy-checklist-cards
  332. i.fa.fa-list
  333. i.fa.fa-copy
  334. | {{_ 'copyChecklistToManyCardsPopup-title'}}
  335. unless archived
  336. hr
  337. ul.pop-over-list
  338. li
  339. a.js-archive
  340. i.fa.fa-arrow-right
  341. i.fa.fa-archive
  342. | {{_ 'archive-card'}}
  343. hr
  344. ul.pop-over-list
  345. li
  346. a.js-more
  347. i.fa.fa-link
  348. | {{_ 'cardMorePopup-title'}}
  349. template(name="moveCardPopup")
  350. +boardsAndLists
  351. template(name="copyCardPopup")
  352. label(for='copy-card-title') {{_ 'title'}}:
  353. textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
  354. = getTitle
  355. +boardsAndLists
  356. template(name="copyChecklistToManyCardsPopup")
  357. label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
  358. textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
  359. | {{_ 'copyChecklistToManyCardsPopup-format'}}
  360. +boardsAndLists
  361. template(name="boardsAndLists")
  362. label {{_ 'boards'}}:
  363. select.js-select-boards(autofocus)
  364. each boards
  365. if $eq _id currentBoard._id
  366. option(value="{{_id}}" selected) {{_ 'current'}}
  367. else
  368. option(value="{{_id}}") {{title}}
  369. label {{_ 'swimlanes'}}:
  370. select.js-select-swimlanes
  371. each swimlanes
  372. option(value="{{_id}}") {{title}}
  373. label {{_ 'lists'}}:
  374. select.js-select-lists
  375. each aBoardLists
  376. option(value="{{_id}}") {{title}}
  377. .edit-controls.clearfix
  378. button.primary.confirm.js-done {{_ 'done'}}
  379. template(name="cardMembersPopup")
  380. ul.pop-over-list.js-card-member-list
  381. each board.activeMembers
  382. li.item(class="{{#if isCardMember}}active{{/if}}")
  383. a.name.js-select-member(href="#")
  384. +userAvatar(userId=user._id)
  385. span.full-name
  386. = user.profile.fullname
  387. | (<span class="username">{{ user.username }}</span>)
  388. if isCardMember
  389. i.fa.fa-check
  390. template(name="cardAssigneesPopup")
  391. unless currentUser.isWorker
  392. ul.pop-over-list.js-card-assignee-list
  393. each board.activeMembers
  394. li.item(class="{{#if isCardAssignee}}active{{/if}}")
  395. a.name.js-select-assignee(href="#")
  396. +userAvatar(userId=user._id)
  397. span.full-name
  398. = user.profile.fullname
  399. | (<span class="username">{{ user.username }}</span>)
  400. if isCardAssignee
  401. i.fa.fa-check
  402. if currentUser.isWorker
  403. ul.pop-over-list.js-card-assignee-list
  404. li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}")
  405. a.name.js-select-assignee(href="#")
  406. +userAvatar(userId=currentUser._id)
  407. span.full-name
  408. = currentUser.profile.fullname
  409. | (<span class="username">{{ currentUser.username }}</span>)
  410. if currentUser.isCardAssignee
  411. i.fa.fa-check
  412. template(name="userAvatarAssignee")
  413. a.assignee.js-assignee(title="{{userData.profile.fullname}} ({{userData.username}})")
  414. if userData.profile.avatarUrl
  415. img.avatar.avatar-image(src="{{userData.profile.avatarUrl}}")
  416. else
  417. +userAvatarAssigneeInitials(userId=userData._id)
  418. if showStatus
  419. span.assignee-presence-status(class=presenceStatusClassName)
  420. span.member-type(class=memberType)
  421. unless isSandstorm
  422. if showEdit
  423. if $eq currentUser._id userData._id
  424. a.edit-avatar.js-change-avatar
  425. i.fa.fa-pencil
  426. template(name="cardAssigneePopup")
  427. .board-assignee-menu
  428. .mini-profile-info
  429. +userAvatar(userId=user._id showEdit=true)
  430. .info
  431. h3= user.profile.fullname
  432. p.quiet @{{ user.username }}
  433. ul.pop-over-list
  434. if currentUser.isNotCommentOnly
  435. unless currentUser.isWorker
  436. li: a.js-remove-assignee {{_ 'remove-member-from-card'}}
  437. unless currentUser.isWorker
  438. if $eq currentUser._id user._id
  439. with currentUser
  440. li: a.js-edit-profile {{_ 'edit-profile'}}
  441. template(name="userAvatarAssigneeInitials")
  442. svg.avatar.avatar-assignee-initials(viewBox="0 0 {{viewPortWidth}} 15")
  443. text(x="50%" y="13" text-anchor="middle")= initials
  444. template(name="cardMorePopup")
  445. p.quiet
  446. span.clearfix
  447. span {{_ 'link-card'}}
  448. = ' '
  449. i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
  450. input.inline-input(type="text" id="cardURL" readonly value="{{ absoluteUrl }}" autofocus="autofocus")
  451. button.js-copy-card-link-to-clipboard(class="btn") {{_ 'copy-card-link-to-clipboard'}}
  452. span.clearfix
  453. br
  454. h2 {{_ 'change-card-parent'}}
  455. label {{_ 'source-board'}}:
  456. select.js-field-parent-board
  457. if isTopLevel
  458. option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
  459. else
  460. option(value="none") {{_ 'custom-field-dropdown-none'}}
  461. each boards
  462. if isParentBoard
  463. option(value="{{_id}}" selected) {{title}}
  464. else
  465. option(value="{{_id}}") {{title}}
  466. label {{_ 'parent-card'}}:
  467. select.js-field-parent-card
  468. if isTopLevel
  469. option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
  470. else
  471. option(value="none") {{_ 'custom-field-dropdown-none'}}
  472. each cards
  473. if isParentCard
  474. option(value="{{_id}}" selected) {{title}}
  475. else
  476. option(value="{{_id}}") {{title}}
  477. br
  478. | {{_ 'added'}}
  479. span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
  480. a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
  481. template(name="setCardColorPopup")
  482. form.edit-label
  483. .palette-colors: each colors
  484. unless $eq color 'white'
  485. span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
  486. if(isSelected color)
  487. i.fa.fa-check
  488. button.primary.confirm.js-submit {{_ 'save'}}
  489. button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
  490. template(name="cardDeletePopup")
  491. p {{_ "card-delete-pop"}}
  492. unless archived
  493. p {{_ "card-delete-suggest-archive"}}
  494. button.js-confirm.negate.full(type="submit") {{_ 'delete'}}