cardDetails.jade 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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. if isMiniScreen
  12. a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
  13. if currentUser.isBoardMember
  14. a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
  15. h2.card-details-title.js-card-title(
  16. class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
  17. +viewer
  18. = getTitle
  19. if isWatching
  20. i.fa.fa-eye.card-details-watch
  21. .card-details-path
  22. each parentList
  23. |   >  
  24. a.js-parent-card(href=linkForCard) {{title}}
  25. // else
  26. {{_ 'top-level-card'}}
  27. if isLinkedCard
  28. h3.linked-card-location
  29. +viewer
  30. | {{getBoardTitle}} > {{getTitle}}
  31. if getArchived
  32. if isLinkedBoard
  33. p.warning {{_ 'board-archived'}}
  34. else
  35. p.warning {{_ 'card-archived'}}
  36. .card-details-items
  37. .card-details-item.card-details-item-received
  38. h3.card-details-item-title {{_ 'card-received'}}
  39. if getReceived
  40. +cardReceivedDate
  41. else
  42. if canModifyCard
  43. a.js-received-date {{_ 'add'}}
  44. .card-details-item.card-details-item-start
  45. h3.card-details-item-title {{_ 'card-start'}}
  46. if getStart
  47. +cardStartDate
  48. else
  49. if canModifyCard
  50. a.js-start-date {{_ 'add'}}
  51. .card-details-item.card-details-item-due
  52. h3.card-details-item-title {{_ 'card-due'}}
  53. if getDue
  54. +cardDueDate
  55. else
  56. if canModifyCard
  57. a.js-due-date {{_ 'add'}}
  58. .card-details-item.card-details-item-end
  59. h3.card-details-item-title {{_ 'card-end'}}
  60. if getEnd
  61. +cardEndDate
  62. else
  63. if canModifyCard
  64. a.js-end-date {{_ 'add'}}
  65. .card-details-items
  66. .card-details-item.card-details-item-members
  67. h3.card-details-item-title {{_ 'members'}}
  68. each getMembers
  69. +userAvatar(userId=this cardId=../_id)
  70. | {{! XXX Hack to hide syntaxic coloration /// }}
  71. if canModifyCard
  72. a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
  73. i.fa.fa-plus
  74. .card-details-item.card-details-item-assignees
  75. h3.card-details-item-title {{_ 'assignee'}}
  76. each getAssignees
  77. +userAvatarAssignee(userId=this cardId=../_id)
  78. | {{! XXX Hack to hide syntaxic coloration /// }}
  79. if canModifyCard
  80. unless assigneeSelected
  81. a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
  82. i.fa.fa-plus
  83. .card-details-item.card-details-item-labels
  84. h3.card-details-item-title {{_ 'labels'}}
  85. a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
  86. each labels
  87. span.card-label(class="card-label-{{color}}" title=name)
  88. +viewer
  89. = name
  90. if canModifyCard
  91. a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
  92. i.fa.fa-plus
  93. .card-details-items
  94. each customFieldsWD
  95. .card-details-item.card-details-item-customfield
  96. h3.card-details-item-title
  97. +viewer
  98. = definition.name
  99. +cardCustomField
  100. .card-details-items
  101. if getSpentTime
  102. .card-details-item.card-details-item-spent
  103. if getIsOvertime
  104. h3.card-details-item-title {{_ 'overtime-hours'}}
  105. else
  106. h3.card-details-item-title {{_ 'spent-time-hours'}}
  107. +cardSpentTime
  108. //- XXX We should use "editable" to avoid repetiting ourselves
  109. if canModifyCard
  110. h3.card-details-item-title {{_ 'description'}}
  111. +inlinedCardDescription(classNames="card-description js-card-description")
  112. +editor(autofocus=true)
  113. | {{getUnsavedValue 'cardDescription' _id getDescription}}
  114. .edit-controls.clearfix
  115. button.primary(type="submit") {{_ 'save'}}
  116. a.fa.fa-times-thin.js-close-inlined-form
  117. else
  118. a.js-open-inlined-form
  119. if getDescription
  120. +viewer
  121. = getDescription
  122. else
  123. | {{_ 'edit'}}
  124. if (hasUnsavedValue 'cardDescription' _id)
  125. p.quiet
  126. | {{_ 'unsaved-description'}}
  127. a.js-open-inlined-form {{_ 'view-it'}}
  128. = ' - '
  129. a.js-close-inlined-form {{_ 'discard'}}
  130. else if getDescription
  131. h3.card-details-item-title {{_ 'description'}}
  132. +viewer
  133. = getDescription
  134. .card-details-items
  135. .card-details-item.card-details-item-name
  136. h3.card-details-item-title {{_ 'requested-by'}}
  137. if canModifyCard
  138. +inlinedForm(classNames="js-card-details-requester")
  139. +editCardRequesterForm
  140. else
  141. a.js-open-inlined-form
  142. if getRequestedBy
  143. +viewer
  144. = getRequestedBy
  145. else
  146. | {{_ 'add'}}
  147. else if getRequestedBy
  148. +viewer
  149. = getRequestedBy
  150. .card-details-item.card-details-item-name
  151. h3.card-details-item-title {{_ 'assigned-by'}}
  152. if canModifyCard
  153. +inlinedForm(classNames="js-card-details-assigner")
  154. +editCardAssignerForm
  155. else
  156. a.js-open-inlined-form
  157. if getAssignedBy
  158. +viewer
  159. = getAssignedBy
  160. else
  161. | {{_ 'add'}}
  162. else if getRequestedBy
  163. +viewer
  164. = getAssignedBy
  165. hr
  166. +checklists(cardId = _id)
  167. if currentBoard.allowsSubtasks
  168. hr
  169. +subtasks(cardId = _id)
  170. hr
  171. h3
  172. i.fa.fa-paperclip
  173. | {{_ 'attachments'}}
  174. +attachmentsGalery
  175. hr
  176. unless currentUser.isNoComments
  177. .activity-title
  178. h3 {{ _ 'activity'}}
  179. if currentUser.isBoardMember
  180. .material-toggle-switch
  181. span.toggle-switch-title {{_ 'hide-system-messages'}}
  182. if hiddenSystemMessages
  183. input.toggle-switch(type="checkbox" id="toggleButton" checked="checked")
  184. else
  185. input.toggle-switch(type="checkbox" id="toggleButton")
  186. label.toggle-label(for="toggleButton")
  187. if currentUser.isBoardMember
  188. unless currentUser.isNoComments
  189. +commentForm
  190. unless currentUser.isNoComments
  191. if isLoaded.get
  192. if isLinkedCard
  193. +activities(card=this mode="linkedcard")
  194. else if isLinkedBoard
  195. +activities(card=this mode="linkedboard")
  196. else
  197. +activities(card=this mode="card")
  198. template(name="editCardTitleForm")
  199. textarea.js-edit-card-title(rows='1' autofocus dir="auto")
  200. = getTitle
  201. .edit-controls.clearfix
  202. button.primary.confirm.js-submit-edit-card-title-form(type="submit") {{_ 'save'}}
  203. a.fa.fa-times-thin.js-close-inlined-form
  204. template(name="editCardRequesterForm")
  205. input.js-edit-card-requester(type='text' autofocus value=getRequestedBy dir="auto")
  206. .edit-controls.clearfix
  207. button.primary.confirm.js-submit-edit-card-requester-form(type="submit") {{_ 'save'}}
  208. a.fa.fa-times-thin.js-close-inlined-form
  209. template(name="editCardAssignerForm")
  210. input.js-edit-card-assigner(type='text' autofocus value=getAssignedBy dir="auto")
  211. .edit-controls.clearfix
  212. button.primary.confirm.js-submit-edit-card-assigner-form(type="submit") {{_ 'save'}}
  213. a.fa.fa-times-thin.js-close-inlined-form
  214. template(name="cardDetailsActionsPopup")
  215. ul.pop-over-list
  216. li: a.js-toggle-watch-card {{#if isWatching}}{{_ 'unwatch'}}{{else}}{{_ 'watch'}}{{/if}}
  217. if canModifyCard
  218. hr
  219. ul.pop-over-list
  220. //li: a.js-members {{_ 'card-edit-members'}}
  221. //li: a.js-labels {{_ 'card-edit-labels'}}
  222. //li: a.js-attachments {{_ 'card-edit-attachments'}}
  223. li: a.js-custom-fields {{_ 'card-edit-custom-fields'}}
  224. //li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
  225. //li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
  226. //li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
  227. //li: a.js-end-date {{_ 'editCardEndDatePopup-title'}}
  228. li: a.js-spent-time {{_ 'editCardSpentTimePopup-title'}}
  229. li: a.js-set-card-color {{_ 'setCardColorPopup-title'}}
  230. hr
  231. ul.pop-over-list
  232. li: a.js-move-card-to-top {{_ 'moveCardToTop-title'}}
  233. li: a.js-move-card-to-bottom {{_ 'moveCardToBottom-title'}}
  234. hr
  235. ul.pop-over-list
  236. li: a.js-move-card {{_ 'moveCardPopup-title'}}
  237. li: a.js-copy-card {{_ 'copyCardPopup-title'}}
  238. li: a.js-copy-checklist-cards {{_ 'copyChecklistToManyCardsPopup-title'}}
  239. unless archived
  240. li: a.js-archive {{_ 'archive-card'}}
  241. li: a.js-more {{_ 'cardMorePopup-title'}}
  242. template(name="moveCardPopup")
  243. +boardsAndLists
  244. template(name="copyCardPopup")
  245. label(for='copy-card-title') {{_ 'title'}}:
  246. textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
  247. = getTitle
  248. +boardsAndLists
  249. template(name="copyChecklistToManyCardsPopup")
  250. label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
  251. textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
  252. | {{_ 'copyChecklistToManyCardsPopup-format'}}
  253. +boardsAndLists
  254. template(name="boardsAndLists")
  255. label {{_ 'boards'}}:
  256. select.js-select-boards(autofocus)
  257. each boards
  258. if $eq _id currentBoard._id
  259. option(value="{{_id}}" selected) {{_ 'current'}}
  260. else
  261. option(value="{{_id}}") {{title}}
  262. label {{_ 'swimlanes'}}:
  263. select.js-select-swimlanes
  264. each swimlanes
  265. option(value="{{_id}}") {{title}}
  266. label {{_ 'lists'}}:
  267. select.js-select-lists
  268. each aBoardLists
  269. option(value="{{_id}}") {{title}}
  270. .edit-controls.clearfix
  271. button.primary.confirm.js-done {{_ 'done'}}
  272. template(name="cardMembersPopup")
  273. ul.pop-over-list.js-card-member-list
  274. each board.activeMembers
  275. li.item(class="{{#if isCardMember}}active{{/if}}")
  276. a.name.js-select-member(href="#")
  277. +userAvatar(userId=user._id)
  278. span.full-name
  279. = user.profile.fullname
  280. | (<span class="username">{{ user.username }}</span>)
  281. if isCardMember
  282. i.fa.fa-check
  283. template(name="cardAssigneesPopup")
  284. ul.pop-over-list.js-card-assignee-list
  285. each board.activeMembers
  286. li.item(class="{{#if isCardAssignee}}active{{/if}}")
  287. a.name.js-select-assignee(href="#")
  288. +userAvatar(userId=user._id)
  289. span.full-name
  290. = user.profile.fullname
  291. | (<span class="username">{{ user.username }}</span>)
  292. if isCardAssignee
  293. i.fa.fa-check
  294. template(name="userAvatarAssignee")
  295. a.assignee.js-assignee(title="{{userData.profile.fullname}} ({{userData.username}})")
  296. if userData.profile.avatarUrl
  297. img.avatar.avatar-image(src="{{userData.profile.avatarUrl}}")
  298. else
  299. +userAvatarAssigneeInitials(userId=userData._id)
  300. if showStatus
  301. span.assignee-presence-status(class=presenceStatusClassName)
  302. span.member-type(class=memberType)
  303. unless isSandstorm
  304. if showEdit
  305. if $eq currentUser._id userData._id
  306. a.edit-avatar.js-change-avatar
  307. i.fa.fa-pencil
  308. template(name="cardAssigneePopup")
  309. .board-assignee-menu
  310. .mini-profile-info
  311. +userAvatar(userId=user._id showEdit=true)
  312. .info
  313. h3= user.profile.fullname
  314. p.quiet @{{ user.username }}
  315. ul.pop-over-list
  316. if currentUser.isNotCommentOnly
  317. li: a.js-remove-assignee {{_ 'remove-member-from-card'}}
  318. if $eq currentUser._id user._id
  319. with currentUser
  320. li: a.js-edit-profile {{_ 'edit-profile'}}
  321. template(name="userAvatarAssigneeInitials")
  322. svg.avatar.avatar-assignee-initials(viewBox="0 0 {{viewPortWidth}} 15")
  323. text(x="50%" y="13" text-anchor="middle")= initials
  324. template(name="cardMorePopup")
  325. p.quiet
  326. span.clearfix
  327. span {{_ 'link-card'}}
  328. = ' '
  329. i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
  330. input.inline-input(type="text" id="cardURL" readonly value="{{ absoluteUrl }}" autofocus="autofocus")
  331. button.js-copy-card-link-to-clipboard(class="btn") {{_ 'copy-card-link-to-clipboard'}}
  332. span.clearfix
  333. br
  334. h2 {{_ 'change-card-parent'}}
  335. label {{_ 'source-board'}}:
  336. select.js-field-parent-board
  337. if isTopLevel
  338. option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
  339. else
  340. option(value="none") {{_ 'custom-field-dropdown-none'}}
  341. each boards
  342. if isParentBoard
  343. option(value="{{_id}}" selected) {{title}}
  344. else
  345. option(value="{{_id}}") {{title}}
  346. label {{_ 'parent-card'}}:
  347. select.js-field-parent-card
  348. if isTopLevel
  349. option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
  350. else
  351. option(value="none") {{_ 'custom-field-dropdown-none'}}
  352. each cards
  353. if isParentCard
  354. option(value="{{_id}}" selected) {{title}}
  355. else
  356. option(value="{{_id}}") {{title}}
  357. br
  358. | {{_ 'added'}}
  359. span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
  360. a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
  361. template(name="setCardColorPopup")
  362. form.edit-label
  363. .palette-colors: each colors
  364. unless $eq color 'white'
  365. span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
  366. if(isSelected color)
  367. i.fa.fa-check
  368. button.primary.confirm.js-submit {{_ 'save'}}
  369. button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
  370. template(name="cardDeletePopup")
  371. p {{_ "card-delete-pop"}}
  372. unless archived
  373. p {{_ "card-delete-suggest-archive"}}
  374. button.js-confirm.negate.full(type="submit") {{_ 'delete'}}