mirror of https://github.com/wekan/wekan
The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
506 lines
16 KiB
506 lines
16 KiB
template(name="cardDetails")
|
|
section.card-details.js-card-details.js-perfect-scrollbar: .card-details-canvas
|
|
.card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
|
|
+inlinedForm(classNames="{{#if canModifyCardWorker}}js-card-details-title{{/if}}")
|
|
+editCardTitleForm
|
|
else
|
|
unless isMiniScreen
|
|
a.fa.fa-times-thin.close-card-details.js-close-card-details
|
|
if currentUser.isBoardMember
|
|
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
|
|
if isMiniScreen
|
|
a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
|
|
if currentUser.isBoardMember
|
|
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
|
|
h2.card-details-title.js-card-title(
|
|
class="{{#if canModifyCardWorker}}js-open-inlined-form is-editable{{/if}}")
|
|
+viewer
|
|
= getTitle
|
|
if isWatching
|
|
i.card-details-watch.fa.fa-eye
|
|
.card-details-path
|
|
each parentList
|
|
| >
|
|
a.js-parent-card(href=linkForCard) {{title}}
|
|
// else
|
|
{{_ 'top-level-card'}}
|
|
if isLinkedCard
|
|
h3.linked-card-location
|
|
+viewer
|
|
| {{getBoardTitle}} > {{getTitle}}
|
|
|
|
if getArchived
|
|
if isLinkedBoard
|
|
p.warning {{_ 'board-archived'}}
|
|
else
|
|
p.warning {{_ 'card-archived'}}
|
|
|
|
.card-details-items
|
|
.card-details-item.card-details-item-received
|
|
h3
|
|
i.fa.fa-sign-out
|
|
card-details-item-title {{_ 'card-received'}}
|
|
if getReceived
|
|
+cardReceivedDate
|
|
else
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
a.js-received-date {{_ 'add'}}
|
|
|
|
.card-details-item.card-details-item-start
|
|
h3
|
|
i.fa.fa-hourglass-start
|
|
card-details-item-title {{_ 'card-start'}}
|
|
if getStart
|
|
+cardStartDate
|
|
else
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
a.js-start-date {{_ 'add'}}
|
|
|
|
.card-details-item.card-details-item-due
|
|
h3
|
|
i.fa.fa-sign-in
|
|
card-details-item-title {{_ 'card-due'}}
|
|
if getDue
|
|
+cardDueDate
|
|
else
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
a.js-due-date {{_ 'add'}}
|
|
|
|
.card-details-item.card-details-item-end
|
|
h3
|
|
i.fa.fa-hourglass-end
|
|
card-details-item-title {{_ 'card-end'}}
|
|
if getEnd
|
|
+cardEndDate
|
|
else
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
a.js-end-date {{_ 'add'}}
|
|
|
|
.card-details-items
|
|
.card-details-item.card-details-item-members
|
|
h3
|
|
i.fa.fa-users
|
|
card-details-item-title {{_ 'members'}}
|
|
each getMembers
|
|
+userAvatar(userId=this cardId=../_id)
|
|
| {{! XXX Hack to hide syntaxic coloration /// }}
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
|
|
i.fa.fa-plus
|
|
|
|
.card-details-item.card-details-item-assignees
|
|
h3
|
|
i.fa.fa-user
|
|
card-details-item-title {{_ 'assignee'}}
|
|
each getAssignees
|
|
+userAvatarAssignee(userId=this cardId=../_id)
|
|
| {{! XXX Hack to hide syntaxic coloration /// }}
|
|
if canModifyCard
|
|
unless assigneeSelected
|
|
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
|
|
i.fa.fa-plus
|
|
|
|
.card-details-item.card-details-item-labels
|
|
h3
|
|
i.fa.fa-tags
|
|
card-details-item-title {{_ 'labels'}}
|
|
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
|
|
each labels
|
|
span.card-label(class="card-label-{{color}}" title=name)
|
|
+viewer
|
|
= name
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
|
|
i.fa.fa-plus
|
|
|
|
.card-details-items
|
|
each customFieldsWD
|
|
.card-details-item.card-details-item-customfield
|
|
h3.card-details-item-title
|
|
+viewer
|
|
= definition.name
|
|
+cardCustomField
|
|
|
|
.card-details-items
|
|
if getSpentTime
|
|
.card-details-item.card-details-item-spent
|
|
if getIsOvertime
|
|
h3.card-details-item-title {{_ 'overtime-hours'}}
|
|
else
|
|
h3.card-details-item-title {{_ 'spent-time-hours'}}
|
|
+cardSpentTime
|
|
|
|
//- XXX We should use "editable" to avoid repetiting ourselves
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
h3
|
|
i.fa.fa-align-left
|
|
card-details-item-title {{_ 'description'}}
|
|
+inlinedCardDescription(classNames="card-description js-card-description")
|
|
+editor(autofocus=true)
|
|
| {{getUnsavedValue 'cardDescription' _id getDescription}}
|
|
.edit-controls.clearfix
|
|
button.primary(type="submit") {{_ 'save'}}
|
|
a.fa.fa-times-thin.js-close-inlined-form
|
|
else
|
|
a.js-open-inlined-form
|
|
if getDescription
|
|
+viewer
|
|
= getDescription
|
|
else
|
|
| {{_ 'edit'}}
|
|
if (hasUnsavedValue 'cardDescription' _id)
|
|
p.quiet
|
|
| {{_ 'unsaved-description'}}
|
|
a.js-open-inlined-form {{_ 'view-it'}}
|
|
= ' - '
|
|
a.js-close-inlined-form {{_ 'discard'}}
|
|
else if getDescription
|
|
h3.card-details-item-title {{_ 'description'}}
|
|
+viewer
|
|
= getDescription
|
|
|
|
.card-details-items
|
|
.card-details-item.card-details-item-name
|
|
h3
|
|
i.fa.fa-shopping-cart
|
|
card-details-item-title {{_ 'requested-by'}}
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
+inlinedForm(classNames="js-card-details-requester")
|
|
+editCardRequesterForm
|
|
else
|
|
a.js-open-inlined-form
|
|
if getRequestedBy
|
|
+viewer
|
|
= getRequestedBy
|
|
else
|
|
| {{_ 'add'}}
|
|
else if getRequestedBy
|
|
+viewer
|
|
= getRequestedBy
|
|
|
|
.card-details-item.card-details-item-name
|
|
h3
|
|
i.fa.fa-user-plus
|
|
card-details-item-title {{_ 'assigned-by'}}
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
+inlinedForm(classNames="js-card-details-assigner")
|
|
+editCardAssignerForm
|
|
else
|
|
a.js-open-inlined-form
|
|
if getAssignedBy
|
|
+viewer
|
|
= getAssignedBy
|
|
else
|
|
| {{_ 'add'}}
|
|
else if getRequestedBy
|
|
+viewer
|
|
= getAssignedBy
|
|
|
|
hr
|
|
+checklists(cardId = _id)
|
|
|
|
if currentBoard.allowsSubtasks
|
|
hr
|
|
+subtasks(cardId = _id)
|
|
|
|
hr
|
|
h3
|
|
i.fa.fa-paperclip
|
|
| {{_ 'attachments'}}
|
|
|
|
+attachmentsGalery
|
|
|
|
hr
|
|
unless currentUser.isNoComments
|
|
.activity-title
|
|
h3
|
|
i.fa.fa-history
|
|
| {{ _ 'activity'}}
|
|
if currentUser.isBoardMember
|
|
.material-toggle-switch
|
|
span.toggle-switch-title {{_ 'hide-system-messages'}}
|
|
if hiddenSystemMessages
|
|
input.toggle-switch(type="checkbox" id="toggleButton" checked="checked")
|
|
else
|
|
input.toggle-switch(type="checkbox" id="toggleButton")
|
|
label.toggle-label(for="toggleButton")
|
|
if currentUser.isBoardMember
|
|
unless currentUser.isNoComments
|
|
+commentForm
|
|
unless currentUser.isNoComments
|
|
if isLoaded.get
|
|
if isLinkedCard
|
|
+activities(card=this mode="linkedcard")
|
|
else if isLinkedBoard
|
|
+activities(card=this mode="linkedboard")
|
|
else
|
|
+activities(card=this mode="card")
|
|
|
|
template(name="editCardTitleForm")
|
|
textarea.js-edit-card-title(rows='1' autofocus dir="auto")
|
|
= getTitle
|
|
.edit-controls.clearfix
|
|
button.primary.confirm.js-submit-edit-card-title-form(type="submit") {{_ 'save'}}
|
|
a.fa.fa-times-thin.js-close-inlined-form
|
|
|
|
template(name="editCardRequesterForm")
|
|
input.js-edit-card-requester(type='text' autofocus value=getRequestedBy dir="auto")
|
|
.edit-controls.clearfix
|
|
button.primary.confirm.js-submit-edit-card-requester-form(type="submit") {{_ 'save'}}
|
|
a.fa.fa-times-thin.js-close-inlined-form
|
|
|
|
template(name="editCardAssignerForm")
|
|
input.js-edit-card-assigner(type='text' autofocus value=getAssignedBy dir="auto")
|
|
.edit-controls.clearfix
|
|
button.primary.confirm.js-submit-edit-card-assigner-form(type="submit") {{_ 'save'}}
|
|
a.fa.fa-times-thin.js-close-inlined-form
|
|
|
|
template(name="cardDetailsActionsPopup")
|
|
ul.pop-over-list
|
|
li
|
|
a.js-toggle-watch-card
|
|
if isWatching
|
|
i.fa.fa-eye
|
|
| {{_ 'unwatch'}}
|
|
else
|
|
i.fa.fa-eye-slash
|
|
| {{_ 'watch'}}
|
|
if canModifyCard
|
|
unless currentUser.isWorker
|
|
hr
|
|
ul.pop-over-list
|
|
//li: a.js-members {{_ 'card-edit-members'}}
|
|
//li: a.js-labels {{_ 'card-edit-labels'}}
|
|
//li: a.js-attachments {{_ 'card-edit-attachments'}}
|
|
li
|
|
a.js-custom-fields
|
|
i.fa.fa-list-alt
|
|
| {{_ 'card-edit-custom-fields'}}
|
|
//li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
|
|
//li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
|
|
//li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
|
|
//li: a.js-end-date {{_ 'editCardEndDatePopup-title'}}
|
|
li
|
|
a.js-spent-time
|
|
i.fa.fa-clock-o
|
|
| {{_ 'editCardSpentTimePopup-title'}}
|
|
li
|
|
a.js-set-card-color
|
|
i.fa.fa-paint-brush
|
|
| {{_ 'setCardColorPopup-title'}}
|
|
hr
|
|
ul.pop-over-list
|
|
li
|
|
a.js-move-card-to-top
|
|
i.fa.fa-arrow-up
|
|
| {{_ 'moveCardToTop-title'}}
|
|
li
|
|
a.js-move-card-to-bottom
|
|
i.fa.fa-arrow-down
|
|
| {{_ 'moveCardToBottom-title'}}
|
|
unless currentUser.isWorker
|
|
hr
|
|
ul.pop-over-list
|
|
li
|
|
a.js-move-card
|
|
i.fa.fa-arrow-right
|
|
| {{_ 'moveCardPopup-title'}}
|
|
li
|
|
a.js-copy-card
|
|
i.fa.fa-copy
|
|
| {{_ 'copyCardPopup-title'}}
|
|
hr
|
|
ul.pop-over-list
|
|
li
|
|
a.js-copy-checklist-cards
|
|
i.fa.fa-list
|
|
i.fa.fa-copy
|
|
| {{_ 'copyChecklistToManyCardsPopup-title'}}
|
|
unless archived
|
|
hr
|
|
ul.pop-over-list
|
|
li
|
|
a.js-archive
|
|
i.fa.fa-arrow-right
|
|
i.fa.fa-archive
|
|
| {{_ 'archive-card'}}
|
|
hr
|
|
ul.pop-over-list
|
|
li
|
|
a.js-more
|
|
i.fa.fa-link
|
|
| {{_ 'cardMorePopup-title'}}
|
|
|
|
template(name="moveCardPopup")
|
|
+boardsAndLists
|
|
|
|
template(name="copyCardPopup")
|
|
label(for='copy-card-title') {{_ 'title'}}:
|
|
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
|
|
= getTitle
|
|
+boardsAndLists
|
|
|
|
template(name="copyChecklistToManyCardsPopup")
|
|
label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
|
|
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
|
|
| {{_ 'copyChecklistToManyCardsPopup-format'}}
|
|
+boardsAndLists
|
|
|
|
template(name="boardsAndLists")
|
|
label {{_ 'boards'}}:
|
|
select.js-select-boards(autofocus)
|
|
each boards
|
|
if $eq _id currentBoard._id
|
|
option(value="{{_id}}" selected) {{_ 'current'}}
|
|
else
|
|
option(value="{{_id}}") {{title}}
|
|
|
|
label {{_ 'swimlanes'}}:
|
|
select.js-select-swimlanes
|
|
each swimlanes
|
|
option(value="{{_id}}") {{title}}
|
|
|
|
label {{_ 'lists'}}:
|
|
select.js-select-lists
|
|
each aBoardLists
|
|
option(value="{{_id}}") {{title}}
|
|
|
|
.edit-controls.clearfix
|
|
button.primary.confirm.js-done {{_ 'done'}}
|
|
|
|
template(name="cardMembersPopup")
|
|
ul.pop-over-list.js-card-member-list
|
|
each board.activeMembers
|
|
li.item(class="{{#if isCardMember}}active{{/if}}")
|
|
a.name.js-select-member(href="#")
|
|
+userAvatar(userId=user._id)
|
|
span.full-name
|
|
= user.profile.fullname
|
|
| (<span class="username">{{ user.username }}</span>)
|
|
if isCardMember
|
|
i.fa.fa-check
|
|
|
|
template(name="cardAssigneesPopup")
|
|
unless currentUser.isWorker
|
|
ul.pop-over-list.js-card-assignee-list
|
|
each board.activeMembers
|
|
li.item(class="{{#if isCardAssignee}}active{{/if}}")
|
|
a.name.js-select-assignee(href="#")
|
|
+userAvatar(userId=user._id)
|
|
span.full-name
|
|
= user.profile.fullname
|
|
| (<span class="username">{{ user.username }}</span>)
|
|
if isCardAssignee
|
|
i.fa.fa-check
|
|
if currentUser.isWorker
|
|
ul.pop-over-list.js-card-assignee-list
|
|
li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}")
|
|
a.name.js-select-assigneeWorker(href="#")
|
|
+userAvatar(userId=currentUser._id)
|
|
span.full-name
|
|
= currentUser.profile.fullname
|
|
| (<span class="username">{{ currentUser.username }}</span>)
|
|
if currentUser.isCardAssignee
|
|
i.fa.fa-check
|
|
|
|
template(name="userAvatarAssignee")
|
|
a.assignee.js-assignee(title="{{userData.profile.fullname}} ({{userData.username}})")
|
|
if userData.profile.avatarUrl
|
|
img.avatar.avatar-image(src="{{userData.profile.avatarUrl}}")
|
|
else
|
|
+userAvatarAssigneeInitials(userId=userData._id)
|
|
|
|
if showStatus
|
|
span.assignee-presence-status(class=presenceStatusClassName)
|
|
span.member-type(class=memberType)
|
|
|
|
unless isSandstorm
|
|
if showEdit
|
|
if $eq currentUser._id userData._id
|
|
a.edit-avatar.js-change-avatar
|
|
i.fa.fa-pencil
|
|
|
|
template(name="cardAssigneePopup")
|
|
.board-assignee-menu
|
|
.mini-profile-info
|
|
+userAvatar(userId=user._id showEdit=true)
|
|
.info
|
|
h3= user.profile.fullname
|
|
p.quiet @{{ user.username }}
|
|
ul.pop-over-list
|
|
if currentUser.isNotCommentOnly
|
|
unless currentUser.isWorker
|
|
li: a.js-remove-assignee {{_ 'remove-member-from-card'}}
|
|
|
|
unless currentUser.isWorker
|
|
if $eq currentUser._id user._id
|
|
with currentUser
|
|
li: a.js-edit-profile {{_ 'edit-profile'}}
|
|
|
|
template(name="userAvatarAssigneeInitials")
|
|
svg.avatar.avatar-assignee-initials(viewBox="0 0 {{viewPortWidth}} 15")
|
|
text(x="50%" y="13" text-anchor="middle")= initials
|
|
|
|
template(name="cardMorePopup")
|
|
p.quiet
|
|
span.clearfix
|
|
span {{_ 'link-card'}}
|
|
= ' '
|
|
i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
|
|
input.inline-input(type="text" id="cardURL" readonly value="{{ absoluteUrl }}" autofocus="autofocus")
|
|
button.js-copy-card-link-to-clipboard(class="btn") {{_ 'copy-card-link-to-clipboard'}}
|
|
span.clearfix
|
|
br
|
|
h2 {{_ 'change-card-parent'}}
|
|
label {{_ 'source-board'}}:
|
|
select.js-field-parent-board
|
|
if isTopLevel
|
|
option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
|
|
else
|
|
option(value="none") {{_ 'custom-field-dropdown-none'}}
|
|
each boards
|
|
if isParentBoard
|
|
option(value="{{_id}}" selected) {{title}}
|
|
else
|
|
option(value="{{_id}}") {{title}}
|
|
|
|
label {{_ 'parent-card'}}:
|
|
select.js-field-parent-card
|
|
if isTopLevel
|
|
option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
|
|
else
|
|
option(value="none") {{_ 'custom-field-dropdown-none'}}
|
|
each cards
|
|
if isParentCard
|
|
option(value="{{_id}}" selected) {{title}}
|
|
else
|
|
option(value="{{_id}}") {{title}}
|
|
br
|
|
| {{_ 'added'}}
|
|
span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
|
|
a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
|
|
|
|
template(name="setCardColorPopup")
|
|
form.edit-label
|
|
.palette-colors: each colors
|
|
unless $eq color 'white'
|
|
span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
|
|
if(isSelected color)
|
|
i.fa.fa-check
|
|
button.primary.confirm.js-submit {{_ 'save'}}
|
|
button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
|
|
|
|
template(name="cardDeletePopup")
|
|
p {{_ "card-delete-pop"}}
|
|
unless archived
|
|
p {{_ "card-delete-suggest-archive"}}
|
|
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
|
|
|