cardDetails.jade 38 KB

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