cardDetails.jade 35 KB

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