cardDetails.jade 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. template(name="cardDetailsPopup")
  2. +cardDetails(popupCard)
  3. template(name="cardDetails")
  4. section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas
  5. .card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
  6. +inlinedForm(classNames="js-card-details-title")
  7. +editCardTitleForm
  8. else
  9. unless isMiniScreen
  10. unless isPopup
  11. a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
  12. if cardMaximized
  13. a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
  14. else
  15. a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
  16. if currentUser.isBoardMember
  17. a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
  18. a.fa.fa-link.card-copy-button.js-copy-link(
  19. id="cardURL_copy"
  20. class="fa-link"
  21. title="{{_ 'copy-card-link-to-clipboard'}}"
  22. href="{{ originRelativeUrl }}"
  23. )
  24. else
  25. unless isPopup
  26. a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
  27. if currentUser.isBoardMember
  28. a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
  29. a.fa.fa-link.card-copy-mobile-button.js-copy-link(
  30. id="cardURL_copy"
  31. class="fa-link"
  32. title="{{_ 'copy-card-link-to-clipboard'}}"
  33. href="{{ originRelativeUrl }}"
  34. )
  35. h2.card-details-title.js-card-title(
  36. class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
  37. +viewer
  38. if currentBoard.allowsCardNumber
  39. span.card-number
  40. | ##{getCardNumber}
  41. = getTitle
  42. if isWatching
  43. i.card-details-watch.fa.fa-eye
  44. .card-details-path
  45. each parentList
  46. |   >  
  47. a.js-parent-card(href=linkForCard) {{title}}
  48. // else
  49. {{_ 'top-level-card'}}
  50. if isLinkedCard
  51. a.linked-card-location.js-go-to-linked-card
  52. +viewer
  53. | {{getBoardTitle}} > {{getTitle}}
  54. if getArchived
  55. if isLinkedBoard
  56. p.warning {{_ 'board-archived'}}
  57. else
  58. p.warning {{_ 'card-archived'}}
  59. .card-details-left
  60. .card-details-items
  61. if currentBoard.allowsLabels
  62. .card-details-item.card-details-item-labels
  63. h3.card-details-item-title
  64. i.fa.fa-tags
  65. | {{_ 'labels'}}
  66. a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
  67. each labels
  68. span.card-label(class="card-label-{{color}}" title=name)
  69. +viewer
  70. = name
  71. if canModifyCard
  72. unless currentUser.isWorker
  73. a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
  74. i.fa.fa-plus
  75. if currentBoard.hasAnyAllowsDate
  76. hr
  77. if currentBoard.allowsReceivedDate
  78. .card-details-item.card-details-item-received
  79. h3.card-details-item-title
  80. i.fa.fa-sign-out
  81. | {{_ 'card-received'}}
  82. if getReceived
  83. +cardReceivedDate
  84. else
  85. if canModifyCard
  86. unless currentUser.isWorker
  87. a.card-label.add-label.js-received-date
  88. i.fa.fa-plus
  89. if currentBoard.allowsStartDate
  90. .card-details-item.card-details-item-start
  91. h3.card-details-item-title
  92. i.fa.fa-hourglass-start
  93. | {{_ 'card-start'}}
  94. if getStart
  95. +cardStartDate
  96. else
  97. if canModifyCard
  98. unless currentUser.isWorker
  99. a.card-label.add-label.js-start-date
  100. i.fa.fa-plus
  101. if currentBoard.allowsDueDate
  102. .card-details-item.card-details-item-due
  103. h3.card-details-item-title
  104. i.fa.fa-sign-in
  105. | {{_ 'card-due'}}
  106. if getDue
  107. +cardDueDate
  108. else
  109. if canModifyCard
  110. unless currentUser.isWorker
  111. a.card-label.add-label.js-due-date
  112. i.fa.fa-plus
  113. if currentBoard.allowsEndDate
  114. .card-details-item.card-details-item-end
  115. h3.card-details-item-title
  116. i.fa.fa-hourglass-end
  117. | {{_ 'card-end'}}
  118. if getEnd
  119. +cardEndDate
  120. else
  121. if canModifyCard
  122. unless currentUser.isWorker
  123. a.card-label.add-label.js-end-date
  124. i.fa.fa-plus
  125. if currentBoard.hasAnyAllowsUser
  126. hr
  127. if currentBoard.allowsCreator
  128. .card-details-item.card-details-item-creator
  129. h3.card-details-item-title
  130. i.fa.fa-user
  131. | {{_ 'creator'}}
  132. +userAvatar(userId=userId noRemove=true)
  133. | {{! XXX Hack to hide syntaxic coloration /// }}
  134. //.card-details-items
  135. if currentBoard.allowsMembers
  136. .card-details-item.card-details-item-members
  137. h3.card-details-item-title
  138. i.fa.fa-users
  139. | {{_ 'members'}}
  140. each userId in getMembers
  141. +userAvatar(userId=userId cardId=_id)
  142. | {{! XXX Hack to hide syntaxic coloration /// }}
  143. if canModifyCard
  144. unless currentUser.isWorker
  145. a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
  146. i.fa.fa-plus
  147. //if assigneeSelected
  148. if currentBoard.allowsAssignee
  149. .card-details-item.card-details-item-assignees
  150. h3.card-details-item-title
  151. i.fa.fa-user
  152. | {{_ 'assignee'}}
  153. each userId in getAssignees
  154. +userAvatar(userId=userId cardId=_id assignee=true)
  155. | {{! XXX Hack to hide syntaxic coloration /// }}
  156. if canModifyCard
  157. a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
  158. i.fa.fa-plus
  159. if currentUser.isWorker
  160. unless assigneeSelected
  161. a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
  162. i.fa.fa-plus
  163. //.card-details-items
  164. if currentBoard.allowsRequestedBy
  165. .card-details-item.card-details-item-name
  166. h3.card-details-item-title
  167. i.fa.fa-shopping-cart
  168. | {{_ 'requested-by'}}
  169. if canModifyCard
  170. unless currentUser.isWorker
  171. +inlinedForm(classNames="js-card-details-requester")
  172. +editCardRequesterForm
  173. else
  174. a.js-open-inlined-form
  175. if getRequestedBy
  176. +viewer
  177. = getRequestedBy
  178. else
  179. | {{_ 'add'}}
  180. else if getRequestedBy
  181. +viewer
  182. = getRequestedBy
  183. if currentBoard.allowsAssignedBy
  184. .card-details-item.card-details-item-name
  185. h3.card-details-item-title
  186. i.fa.fa-user-plus
  187. | {{_ 'assigned-by'}}
  188. if canModifyCard
  189. unless currentUser.isWorker
  190. +inlinedForm(classNames="js-card-details-assigner")
  191. +editCardAssignerForm
  192. else
  193. a.js-open-inlined-form
  194. if getAssignedBy
  195. +viewer
  196. = getAssignedBy
  197. else
  198. | {{_ 'add'}}
  199. else if getRequestedBy
  200. +viewer
  201. = getAssignedBy
  202. if $or currentBoard.allowsCardSortingByNumber getSpentTime
  203. hr
  204. if currentBoard.allowsCardSortingByNumber
  205. .card-details-item.card-details-sort-order
  206. h3.card-details-item-title
  207. i.fa.fa-sort
  208. | {{_ 'sort'}}
  209. if canModifyCard
  210. +inlinedForm(classNames="js-card-details-sort")
  211. +editCardSortOrderForm
  212. else
  213. a.js-open-inlined-form
  214. +viewer
  215. = sort
  216. //.card-details-items
  217. if getSpentTime
  218. .card-details-item.card-details-item-spent
  219. if getIsOvertime
  220. h3.card-details-item-title
  221. | {{_ 'overtime-hours'}}
  222. else
  223. h3.card-details-item-title
  224. | {{_ 'spent-time-hours'}}
  225. +cardSpentTime
  226. //.card-details-items
  227. if customFieldsWD
  228. unless customFieldsGrid
  229. hr
  230. each customFieldsWD
  231. if customFieldsGrid
  232. hr
  233. .card-details-item.card-details-item-customfield
  234. h3.card-details-item-title
  235. i.fa.fa-list-alt
  236. = definition.name
  237. +cardCustomField
  238. .material-toggle-switch(title="{{_ 'change'}} {{_ 'custom-fields'}} {{_ 'layout'}}")
  239. if customFieldsGrid
  240. input.toggle-switch(type="checkbox" id="toggleCustomFieldsGridButton" checked="checked")
  241. else
  242. input.toggle-switch(type="checkbox" id="toggleCustomFieldsGridButton")
  243. label.toggle-label(for="toggleCustomFieldsGridButton")
  244. a.fa.fa-plus.js-custom-fields.card-details-item.custom-fields(title="{{_ 'custom-fields'}}")
  245. if getVoteQuestion
  246. hr
  247. .vote-title
  248. div.flex
  249. h3
  250. i.fa.fa-thumbs-up
  251. | {{_ 'vote-question'}}
  252. if getVoteEnd
  253. +voteEndDate
  254. .vote-result
  255. if votePublic
  256. a.card-label.card-label-green.js-show-positive-votes {{ voteCountPositive }}
  257. a.card-label.card-label-red.js-show-negative-votes {{ voteCountNegative }}
  258. else
  259. .card-label.card-label-green {{ voteCountPositive }}
  260. .card-label.card-label-red {{ voteCountNegative }}
  261. unless ($and currentBoard.isPublic voteAllowNonBoardMembers )
  262. .card-label.card-label-gray {{ voteCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }}
  263. +viewer
  264. = getVoteQuestion
  265. if showVotingButtons
  266. button.card-details-green.js-vote.js-vote-positive(class="{{#if voteState}}voted{{/if}}")
  267. if voteState
  268. i.fa.fa-thumbs-up
  269. | {{_ 'vote-for-it'}}
  270. button.card-details-red.js-vote.js-vote-negative(class="{{#if $eq voteState false}}voted{{/if}}")
  271. if $eq voteState false
  272. i.fa.fa-thumbs-down
  273. | {{_ 'vote-against'}}
  274. if getPokerQuestion
  275. hr
  276. .poker-title
  277. div.flex
  278. h3
  279. i.fa.fa-thumbs-up
  280. | {{_ 'poker-question'}}
  281. if getPokerEnd
  282. +pokerEndDate
  283. div.flex
  284. .poker-result
  285. if expiredPoker
  286. unless ($and currentBoard.isPublic pokerAllowNonBoardMembers )
  287. .card-label.card-label-gray {{ pokerCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }}
  288. if showPlanningPokerButtons
  289. .poker-result
  290. .poker-deck
  291. .poker-card
  292. span.inner.js-poker.js-poker-vote-one(class="{{#if $eq pokerState 'one'}}poker-voted{{/if}}") {{_ 'poker-one'}}
  293. if $eq pokerState "one"
  294. i.fa.fa-check
  295. .poker-deck
  296. .poker-card
  297. span.inner.js-poker.js-poker-vote-two(class="{{#if $eq pokerState 'two'}}poker-voted{{/if}}") {{_ 'poker-two'}}
  298. if $eq pokerState "two"
  299. i.fa.fa-check
  300. .poker-deck
  301. .poker-card
  302. span.inner.js-poker.js-poker-vote-three(class="{{#if $eq pokerState 'three'}}poker-voted{{/if}}") {{_ 'poker-three'}}
  303. if $eq pokerState "three"
  304. i.fa.fa-check
  305. .poker-deck
  306. .poker-card
  307. span.inner.js-poker.js-poker-vote-five(class="{{#if $eq pokerState 'five'}}poker-voted{{/if}}") {{_ 'poker-five'}}
  308. if $eq pokerState "five"
  309. i.fa.fa-check
  310. .poker-deck
  311. .poker-card
  312. span.inner.js-poker.js-poker-vote-eight(class="{{#if $eq pokerState 'eight'}}poker-voted{{/if}}") {{_ 'poker-eight'}}
  313. if $eq pokerState "eight"
  314. i.fa.fa-check
  315. .poker-deck
  316. .poker-card
  317. span.inner.js-poker.js-poker-vote-thirteen(class="{{#if $eq pokerState 'thirteen'}}poker-voted{{/if}}") {{_ 'poker-thirteen'}}
  318. if $eq pokerState "thirteen"
  319. i.fa.fa-check
  320. .poker-deck
  321. .poker-card
  322. span.inner.js-poker.js-poker-vote-twenty(class="{{#if $eq pokerState 'twenty'}}poker-voted{{/if}}") {{_ 'poker-twenty'}}
  323. if $eq pokerState "twenty"
  324. i.fa.fa-check
  325. .poker-deck
  326. .poker-card
  327. span.inner.js-poker.js-poker-vote-forty(class="{{#if $eq pokerState 'forty'}}poker-voted{{/if}}") {{_ 'poker-forty'}}
  328. if $eq pokerState "forty"
  329. i.fa.fa-check
  330. .poker-deck
  331. .poker-card
  332. span.inner.js-poker.js-poker-vote-one-hundred(class="{{#if $eq pokerState 'oneHundred'}}poker-voted{{/if}}") {{_ 'poker-oneHundred'}}
  333. if $eq pokerState "oneHundred"
  334. i.fa.fa-check
  335. .poker-deck
  336. .poker-card
  337. span.inner.js-poker.js-poker-vote-unsure(class="{{#if $eq pokerState 'unsure'}}poker-voted{{/if}}") {{_ 'poker-unsure'}}
  338. if $eq pokerState "unsure"
  339. i.fa.fa-check
  340. if currentUser.isBoardAdmin
  341. button.card-details-blue.js-poker-finish(class="{{#if $eq voteState false}}poker-voted{{/if}}") {{_ 'poker-finish'}}
  342. if expiredPoker
  343. .poker-table
  344. .poker-table-side-left
  345. .poker-table-heading-left
  346. .poker-table-row
  347. .poker-table-cell
  348. .poker-table-cell
  349. | {{_ 'poker-result-votes' }}
  350. .poker-table-cell.poker-table-cell-who
  351. | {{_ 'poker-result-who' }}
  352. .poker-table-body
  353. .poker-table-row
  354. .poker-table-cell
  355. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 1}}winner{{else}}loser{{/if}}") {{_ 'poker-one'}}
  356. .poker-table-cell {{ pokerCountOne }}
  357. .poker-table-cell.poker-table-cell-who
  358. .poker-result
  359. each m in pokerMemberOne
  360. a.name
  361. +userAvatar(userId=m._id noRemove=true)
  362. .poker-table-row
  363. .poker-table-cell
  364. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 2}}winner{{else}}loser{{/if}}") {{_ 'poker-two'}}
  365. .poker-table-cell {{ pokerCountTwo }}
  366. .poker-table-cell.poker-table-cell-who
  367. .poker-result
  368. each m in pokerMemberTwo
  369. a.name
  370. +userAvatar(userId=m._id noRemove=true)
  371. .poker-table-row
  372. .poker-table-cell
  373. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 3}}winner{{else}}loser{{/if}}") {{_ 'poker-three'}}
  374. .poker-table-cell {{ pokerCountThree }}
  375. .poker-table-cell.poker-table-cell-who
  376. .poker-result
  377. each m in pokerMemberThree
  378. a.name
  379. +userAvatar(userId=m._id noRemove=true)
  380. .poker-table-row
  381. .poker-table-cell
  382. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 5}}winner{{else}}loser{{/if}}") {{_ 'poker-five'}}
  383. .poker-table-cell {{ pokerCountFive }}
  384. .poker-table-cell.poker-table-cell-who
  385. .poker-result
  386. each m in pokerMemberFive
  387. a.name
  388. +userAvatar(userId=m._id noRemove=true)
  389. .poker-table-row
  390. .poker-table-cell
  391. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 8}}winner{{else}}loser{{/if}}") {{_ 'poker-eight'}}
  392. .poker-table-cell {{ pokerCountEight }}
  393. .poker-table-cell.poker-table-cell-who
  394. .poker-result
  395. each m in pokerMemberEight
  396. a.name
  397. +userAvatar(userId=m._id noRemove=true)
  398. .poker-table-side-right
  399. .poker-table-heading-right
  400. .poker-table-row
  401. .poker-table-cell
  402. .poker-table-cell
  403. | {{_ 'poker-result-votes' }}
  404. .poker-table-cell.poker-table-cell-who
  405. | {{_ 'poker-result-who' }}
  406. .poker-table-body
  407. .poker-table-row
  408. .poker-table-cell
  409. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 13}}winner{{else}}loser{{/if}}") {{_ 'poker-thirteen'}}
  410. .poker-table-cell {{ pokerCountThirteen }}
  411. .poker-table-cell.poker-table-cell-who
  412. .poker-result
  413. each m in pokerMemberThirteen
  414. a.name
  415. +userAvatar(userId=m._id noRemove=true)
  416. .poker-table-row
  417. .poker-table-cell
  418. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 20}}winner{{else}}loser{{/if}}") {{_ 'poker-twenty'}}
  419. .poker-table-cell {{ pokerCountTwenty }}
  420. .poker-table-cell.poker-table-cell-who
  421. .poker-result
  422. each m in pokerMemberTwenty
  423. a.name
  424. +userAvatar(userId=m._id noRemove=true)
  425. .poker-table-row
  426. .poker-table-cell
  427. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 40}}winner{{else}}loser{{/if}}") {{_ 'poker-forty'}}
  428. .poker-table-cell {{ pokerCountForty }}
  429. .poker-table-cell.poker-table-cell-who
  430. .poker-result
  431. each m in pokerMemberForty
  432. a.name
  433. +userAvatar(userId=m._id noRemove=true)
  434. .poker-table-row
  435. .poker-table-cell
  436. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 100}}winner{{else}}loser{{/if}}") {{_ 'poker-oneHundred'}}
  437. .poker-table-cell {{ pokerCountOneHundred }}
  438. .poker-table-cell.poker-table-cell-who
  439. .poker-result
  440. each m in pokerMemberOneHundred
  441. a.name
  442. +userAvatar(userId=m._id noRemove=true)
  443. .poker-table-row
  444. .poker-table-cell
  445. button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 'unsure'}}winner{{else}}loser{{/if}}") {{_ 'poker-unsure'}}
  446. .poker-table-cell {{ pokerCountUnsure }}
  447. .poker-table-cell.poker-table-cell-who
  448. .poker-result
  449. each m in pokerMemberUnsure
  450. a.name
  451. +userAvatar(userId=m._id noRemove=true)
  452. if currentUser.isBoardAdmin
  453. div.estimation-add
  454. button.card-details-red.js-poker-replay(class="{{#if $eq voteState false}}voted{{/if}}") {{_ 'poker-replay'}}
  455. div.estimation-add
  456. button.js-poker-estimation
  457. i.fa.fa-plus
  458. | {{_ 'set-estimation'}}
  459. input(type=text,autofocus value=getPokerEstimation,id="pokerEstimation")
  460. //- XXX We should use "editable" to avoid repetiting ourselves
  461. if canModifyCard
  462. unless currentUser.isWorker
  463. if currentBoard.allowsDescriptionTitle
  464. hr
  465. h3.card-details-item-title
  466. i.fa.fa-align-left
  467. | {{_ 'description'}}
  468. if currentBoard.allowsDescriptionText
  469. +inlinedCardDescription(classNames="card-description js-card-description")
  470. +descriptionForm
  471. .edit-controls.clearfix
  472. button.primary(type="submit") {{_ 'save'}}
  473. a.fa.fa-times-thin.js-close-inlined-form
  474. else
  475. if currentBoard.allowsDescriptionText
  476. a.js-open-inlined-form
  477. if getDescription
  478. +viewer
  479. = getDescription
  480. else
  481. | {{_ 'edit'}}
  482. if (hasUnsavedValue 'cardDescription' _id)
  483. p.quiet
  484. | {{_ 'unsaved-description'}}
  485. a.js-open-inlined-form {{_ 'view-it'}}
  486. = ' - '
  487. a.js-close-inlined-form {{_ 'discard'}}
  488. else if getDescription
  489. if currentBoard.allowsDescriptionTitle
  490. hr
  491. h3.card-details-item-title {{_ 'description'}}
  492. if currentBoard.allowsDescriptionText
  493. +viewer
  494. = getDescription
  495. .card-checklist-attachmentGalerys
  496. .card-checklist-attachmentGalery.card-checklists
  497. if currentBoard.allowsChecklists
  498. hr
  499. +checklists(cardId = _id)
  500. if currentBoard.allowsSubtasks
  501. hr
  502. +subtasks(cardId = _id)
  503. if currentBoard.allowsAttachments
  504. hr
  505. h3.card-details-item-title
  506. i.fa.fa-paperclip
  507. | {{_ 'attachments'}}
  508. .card-checklist-attachmentGalery.card-attachmentGalery
  509. +attachmentsGalery
  510. .card-details-right
  511. unless currentUser.isNoComments
  512. hr
  513. .activity-title
  514. h3.card-details-item-title
  515. i.fa.fa-history
  516. | {{ _ 'activity'}}
  517. if currentUser.isBoardMember
  518. .material-toggle-switch(title="{{_ 'hide-system-messages'}}")
  519. //span.toggle-switch-title
  520. if hiddenSystemMessages
  521. input.toggle-switch(type="checkbox" id="toggleButton" checked="checked")
  522. else
  523. input.toggle-switch(type="checkbox" id="toggleButton")
  524. label.toggle-label(for="toggleButton")
  525. if currentBoard.allowsComments
  526. if currentUser.isBoardMember
  527. unless currentUser.isNoComments
  528. +commentForm
  529. unless currentUser.isNoComments
  530. if isLoaded.get
  531. if isLinkedCard
  532. +activities(card=this mode="linkedcard")
  533. else if isLinkedBoard
  534. +activities(card=this mode="linkedboard")
  535. else
  536. +activities(card=this mode="card")
  537. template(name="editCardTitleForm")
  538. textarea.js-edit-card-title(rows='1' autofocus dir="auto")
  539. = getTitle
  540. .edit-controls.clearfix
  541. button.primary.confirm.js-submit-edit-card-title-form(type="submit") {{_ 'save'}}
  542. a.fa.fa-times-thin.js-close-inlined-form
  543. template(name="editCardRequesterForm")
  544. input.js-edit-card-requester(type='text' autofocus value=getRequestedBy dir="auto")
  545. .edit-controls.clearfix
  546. button.primary.confirm.js-submit-edit-card-requester-form(type="submit") {{_ 'save'}}
  547. a.fa.fa-times-thin.js-close-inlined-form
  548. template(name="editCardAssignerForm")
  549. input.js-edit-card-assigner(type='text' autofocus value=getAssignedBy dir="auto")
  550. .edit-controls.clearfix
  551. button.primary.confirm.js-submit-edit-card-assigner-form(type="submit") {{_ 'save'}}
  552. a.fa.fa-times-thin.js-close-inlined-form
  553. template(name="editCardSortOrderForm")
  554. input.js-edit-card-sort(type='text' autofocus value=sort dir="auto")
  555. .edit-controls.clearfix
  556. button.primary.confirm.js-submit-edit-card-sort-form(type="submit") {{_ 'save'}}
  557. a.fa.fa-times-thin.js-close-inlined-form
  558. template(name="cardDetailsActionsPopup")
  559. ul.pop-over-list
  560. li
  561. a.js-toggle-watch-card
  562. if isWatching
  563. i.fa.fa-eye
  564. | {{_ 'unwatch'}}
  565. else
  566. i.fa.fa-eye-slash
  567. | {{_ 'watch'}}
  568. hr
  569. if canModifyCard
  570. unless currentUser.isWorker
  571. ul.pop-over-list
  572. //li: a.js-members {{_ 'card-edit-members'}}
  573. //li: a.js-labels {{_ 'card-edit-labels'}}
  574. //li: a.js-attachments {{_ 'card-edit-attachments'}}
  575. li
  576. a.js-start-voting
  577. i.fa.fa-thumbs-up
  578. | {{_ 'card-edit-voting'}}
  579. li
  580. a.js-start-planning-poker
  581. i.fa.fa-thumbs-up
  582. | {{_ 'card-edit-planning-poker'}}
  583. if currentUser.isBoardAdmin
  584. li
  585. a.js-custom-fields
  586. i.fa.fa-list-alt
  587. | {{_ 'card-edit-custom-fields'}}
  588. //li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
  589. //li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
  590. //li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
  591. //li: a.js-end-date {{_ 'editCardEndDatePopup-title'}}
  592. li
  593. a.js-spent-time
  594. i.fa.fa-clock-o
  595. | {{_ 'editCardSpentTimePopup-title'}}
  596. li
  597. a.js-set-card-color
  598. i.fa.fa-paint-brush
  599. | {{_ 'setCardColorPopup-title'}}
  600. hr
  601. ul.pop-over-list
  602. li
  603. a.js-export-card
  604. i.fa.fa-share-alt
  605. | {{_ 'export-card'}}
  606. hr
  607. ul.pop-over-list
  608. li
  609. a.js-move-card-to-top
  610. i.fa.fa-arrow-up
  611. | {{_ 'moveCardToTop-title'}}
  612. li
  613. a.js-move-card-to-bottom
  614. i.fa.fa-arrow-down
  615. | {{_ 'moveCardToBottom-title'}}
  616. hr
  617. ul.pop-over-list
  618. if currentUser.isBoardAdmin
  619. li
  620. a.js-move-card
  621. i.fa.fa-arrow-right
  622. | {{_ 'moveCardPopup-title'}}
  623. unless currentUser.isWorker
  624. li
  625. a.js-copy-card
  626. i.fa.fa-copy
  627. | {{_ 'copyCardPopup-title'}}
  628. unless currentUser.isWorker
  629. hr
  630. ul.pop-over-list
  631. li
  632. a.js-copy-checklist-cards
  633. i.fa.fa-list
  634. i.fa.fa-copy
  635. | {{_ 'copyChecklistToManyCardsPopup-title'}}
  636. unless archived
  637. hr
  638. ul.pop-over-list
  639. li
  640. a.js-archive
  641. i.fa.fa-arrow-right
  642. i.fa.fa-archive
  643. | {{_ 'archive-card'}}
  644. hr
  645. ul.pop-over-list
  646. li
  647. a.js-more
  648. i.fa.fa-link
  649. | {{_ 'cardMorePopup-title'}}
  650. template(name="exportCardPopup")
  651. ul.pop-over-list
  652. li
  653. a(href="{{exportUrlCardPDF}}",, download="{{exportFilenameCardPDF}}")
  654. i.fa.fa-share-alt
  655. | {{_ 'export-card-pdf'}}
  656. template(name="moveCardPopup")
  657. +boardsAndLists
  658. template(name="copyCardPopup")
  659. label(for='copy-card-title') {{_ 'title'}}:
  660. textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
  661. = getTitle
  662. +boardsAndLists
  663. template(name="copyChecklistToManyCardsPopup")
  664. label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
  665. textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
  666. | {{_ 'copyChecklistToManyCardsPopup-format'}}
  667. +boardsAndLists
  668. template(name="boardsAndLists")
  669. unless currentUser.isWorker
  670. label {{_ 'boards'}}:
  671. select.js-select-boards(autofocus)
  672. each boards
  673. if $eq _id currentBoard._id
  674. option(value="{{_id}}" selected) {{_ 'current'}}
  675. else
  676. option(value="{{_id}}") {{title}}
  677. label {{_ 'swimlanes'}}:
  678. select.js-select-swimlanes
  679. each swimlanes
  680. option(value="{{_id}}") {{title}}
  681. label {{_ 'lists'}}:
  682. select.js-select-lists
  683. each aBoardLists
  684. option(value="{{_id}}") {{title}}
  685. .edit-controls.clearfix
  686. button.primary.confirm.js-done {{_ 'done'}}
  687. template(name="cardMembersPopup")
  688. input.card-members-filter(type="text" placeholder="{{_ 'search'}}")
  689. ul.pop-over-list.js-card-member-list
  690. each members
  691. li.item(class="{{#if isCardMember}}active{{/if}}")
  692. a.name.js-select-member(href="#")
  693. +userAvatar(userId=user._id)
  694. span.full-name
  695. = user.profile.fullname
  696. | (<span class="username">{{ user.username }}</span>)
  697. if isCardMember
  698. i.fa.fa-check
  699. template(name="cardAssigneesPopup")
  700. input.card-assignees-filter(type="text" placeholder="{{_ 'search'}}")
  701. unless currentUser.isWorker
  702. ul.pop-over-list.js-card-assignee-list
  703. each members
  704. li.item(class="{{#if isCardAssignee}}active{{/if}}")
  705. a.name.js-select-assignee(href="#")
  706. +userAvatar(userId=user._id)
  707. span.full-name
  708. = user.profile.fullname
  709. | (<span class="username">{{ user.username }}</span>)
  710. if isCardAssignee
  711. i.fa.fa-check
  712. if currentUser.isWorker
  713. ul.pop-over-list.js-card-assignee-list
  714. li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}")
  715. a.name.js-select-assignee(href="#")
  716. +userAvatar(userId=currentUser._id)
  717. span.full-name
  718. = currentUser.profile.fullname
  719. | (<span class="username">{{ currentUser.username }}</span>)
  720. if currentUser.isCardAssignee
  721. i.fa.fa-check
  722. template(name="cardAssigneePopup")
  723. .board-assignee-menu
  724. .mini-profile-info
  725. +userAvatar(userId=user._id showEdit=true)
  726. .info
  727. h3= user.profile.fullname
  728. p.quiet @{{ user.username }}
  729. ul.pop-over-list
  730. if currentUser.isNotCommentOnly
  731. unless currentUser.isWorker
  732. li: a.js-remove-assignee {{_ 'remove-member-from-card'}}
  733. unless currentUser.isWorker
  734. if $eq currentUser._id user._id
  735. with currentUser
  736. li: a.js-edit-profile {{_ 'edit-profile'}}
  737. template(name="cardMorePopup")
  738. p.quiet
  739. span.clearfix
  740. span {{_ 'link-card'}}
  741. = ' '
  742. i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
  743. input.inline-input(type="text" id="cardURL" readonly value="{{ originRelativeUrl }}" autofocus="autofocus")
  744. button.js-copy-card-link-to-clipboard(class="btn" id="clipboard") {{_ 'copy-card-link-to-clipboard'}}
  745. span.clearfix
  746. br
  747. h2 {{_ 'change-card-parent'}}
  748. label {{_ 'source-board'}}:
  749. select.js-field-parent-board
  750. if isTopLevel
  751. option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
  752. else
  753. option(value="none") {{_ 'custom-field-dropdown-none'}}
  754. each boards
  755. if isParentBoard
  756. option(value="{{_id}}" selected) {{title}}
  757. else
  758. option(value="{{_id}}") {{title}}
  759. label {{_ 'parent-card'}}:
  760. select.js-field-parent-card
  761. if isTopLevel
  762. option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
  763. else
  764. option(value="none") {{_ 'custom-field-dropdown-none'}}
  765. each cards
  766. if isParentCard
  767. option(value="{{_id}}" selected) {{title}}
  768. else
  769. option(value="{{_id}}") {{title}}
  770. br
  771. | {{_ 'added'}}
  772. span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
  773. if currentUser.isBoardAdmin
  774. a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
  775. template(name="setCardColorPopup")
  776. form.edit-label
  777. .palette-colors: each colors
  778. unless $eq color 'white'
  779. span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
  780. if(isSelected color)
  781. i.fa.fa-check
  782. button.primary.confirm.js-submit {{_ 'save'}}
  783. button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
  784. template(name="cardDeletePopup")
  785. p {{_ "card-delete-pop"}}
  786. unless archived
  787. p {{_ "card-delete-suggest-archive"}}
  788. button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
  789. template(name="cardArchivePopup")
  790. p {{_ "card-archive-pop"}}
  791. unless archived
  792. p {{_ "card-archive-suggest-cancel"}}
  793. button.js-confirm.negate.full(type="submit") {{_ 'archive'}}
  794. template(name="deleteVotePopup")
  795. p {{_ "vote-delete-pop"}}
  796. button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
  797. template(name="cardStartVotingPopup")
  798. form.edit-vote-question
  799. .fields
  800. label(for="vote") {{_ 'vote-question'}}
  801. input.js-vote-field#vote(type="text" name="vote" value="{{getVoteQuestion}}" autofocus disabled="{{#if getVoteQuestion}}disabled{{/if}}")
  802. .check-div
  803. a.flex(class="{{#if getVoteQuestion}}is-disabled{{else}}js-toggle-vote-allow-non-members{{/if}}")
  804. .materialCheckBox#vote-allow-non-members(name="vote-allow-non-members" class="{{#if voteAllowNonBoardMembers}}is-checked{{/if}}")
  805. span {{_ 'allowNonBoardMembers'}}
  806. .check-div
  807. a.flex(class="{{#if getVoteQuestion}}is-disabled{{else}}js-toggle-vote-public{{/if}}")
  808. .materialCheckBox#vote-public(name="vote-public" class="{{#if votePublic}}is-checked{{/if}}")
  809. span {{_ 'vote-public'}}
  810. .check-div.flex
  811. i.fa.fa-hourglass-end
  812. a.js-end-date
  813. span
  814. | {{_ 'card-end'}}
  815. unless getVoteEnd
  816. i.fa.fa-plus
  817. if getVoteEnd
  818. +voteEndDate
  819. button.primary.js-submit {{_ 'save'}}
  820. if getVoteQuestion
  821. if currentUser.isBoardAdmin
  822. button.js-remove-vote.negate.wide.right {{_ 'delete'}}
  823. template(name="positiveVoteMembersPopup")
  824. ul.pop-over-list.js-card-member-list
  825. each m in voteMemberPositive
  826. li.item
  827. a.name
  828. +userAvatar(userId=m._id)
  829. span.full-name
  830. = m.profile.fullname
  831. | (<span class="username">{{ m.username }}</span>)
  832. template(name="negativeVoteMembersPopup")
  833. ul.pop-over-list.js-card-member-list
  834. each m in voteMemberNegative
  835. li.item
  836. a.name
  837. +userAvatar(userId=m._id)
  838. span.full-name
  839. = m.profile.fullname
  840. | (<span class="username">{{ m.username }}</span>)
  841. template(name="deletePokerPopup")
  842. p {{_ "poker-delete-pop"}}
  843. button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
  844. template(name="cardStartPlanningPokerPopup")
  845. form.edit-poker-question
  846. .fields
  847. .check-div
  848. a.flex(class="{{#if getPokerQuestion}}is-disabled{{else}}js-toggle-poker-allow-non-members{{/if}}")
  849. .materialCheckBox#poker-allow-non-members(name="poker-allow-non-members" class="{{#if pokerAllowNonBoardMembers}}is-checked{{/if}}")
  850. span {{_ 'allowNonBoardMembers'}}
  851. .check-div.flex
  852. i.fa.fa-hourglass-end
  853. a.js-end-date
  854. span
  855. | {{_ 'card-end'}}
  856. unless getPokerEnd
  857. i.fa.fa-plus
  858. if getPokerEnd
  859. +pokerEndDate
  860. button.primary.js-submit {{_ 'save'}}
  861. if getPokerQuestion
  862. if currentUser.isBoardAdmin
  863. button.js-remove-poker.negate.wide.right {{_ 'delete'}}