cardDetails.jade 38 KB

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