cardDetails.jade 34 KB

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