cardDetails.jade 37 KB

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