Convert Font Awesome to Unicode Icons. Part 1. In Progress.
Some checks are pending
Docker / build (push) Waiting to run
Docker Image CI / build (push) Waiting to run
Release Charts / release (push) Waiting to run
Test suite / Meteor tests (push) Waiting to run
Test suite / Coverage report (push) Blocked by required conditions

Thanks to xet7 !
This commit is contained in:
Lauri Ojansivu 2025-10-17 02:19:43 +03:00
parent a7af4b4809
commit 2947238a02
20 changed files with 342 additions and 183 deletions

View file

@ -93,4 +93,4 @@ ejson@1.1.3
logging@1.3.3 logging@1.3.3
wekan-fullcalendar wekan-fullcalendar
momentjs:moment@2.29.3 momentjs:moment@2.29.3
wekan-fontawesome # wekan-fontawesome

View file

@ -155,7 +155,6 @@ wekan-accounts-cas@0.1.0
wekan-accounts-lockout@1.0.0 wekan-accounts-lockout@1.0.0
wekan-accounts-oidc@1.0.10 wekan-accounts-oidc@1.0.10
wekan-accounts-sandstorm@0.8.0 wekan-accounts-sandstorm@0.8.0
wekan-fontawesome@6.4.2
wekan-fullcalendar@3.10.5 wekan-fullcalendar@3.10.5
wekan-ldap@0.0.2 wekan-ldap@0.0.2
wekan-markdown@1.0.9 wekan-markdown@1.0.9

View file

@ -3,7 +3,7 @@ template(name="boardConversionProgress")
.board-conversion-modal .board-conversion-modal
.board-conversion-header .board-conversion-header
h3 h3
i.fa.fa-cogs | ⚙️
| {{_ 'converting-board'}} | {{_ 'converting-board'}}
p {{_ 'converting-board-description'}} p {{_ 'converting-board-description'}}
@ -14,14 +14,14 @@ template(name="boardConversionProgress")
.progress-text {{conversionProgress}}% .progress-text {{conversionProgress}}%
.conversion-status .conversion-status
i.fa.fa-spinner.fa-spin | ⚙️
| {{conversionStatus}} | {{conversionStatus}}
.conversion-time(style="{{#unless conversionEstimatedTime}}display: none;{{/unless}}") .conversion-time(style="{{#unless conversionEstimatedTime}}display: none;{{/unless}}")
i.fa.fa-clock-o | ⏰
| {{_ 'estimated-time-remaining'}}: {{conversionEstimatedTime}} | {{_ 'estimated-time-remaining'}}: {{conversionEstimatedTime}}
.board-conversion-footer .board-conversion-footer
.conversion-info .conversion-info
i.fa.fa-info-circle |
| {{_ 'conversion-info-text'}} | {{_ 'conversion-info-text'}}

View file

@ -34,10 +34,10 @@ template(name="attachmentViewer")
#viewer-overlay.hidden #viewer-overlay.hidden
#viewer-top-bar #viewer-top-bar
span#attachment-name span#attachment-name
a#viewer-close.fa.fa-times-thin a#viewer-close
#viewer-container #viewer-container
i.fa.fa-chevron-left.attachment-arrow#prev-attachment | ◀️
#viewer-content #viewer-content
img#image-viewer.hidden img#image-viewer.hidden
video#video-viewer.hidden(controls="true") video#video-viewer.hidden(controls="true")
@ -45,7 +45,7 @@ template(name="attachmentViewer")
object#pdf-viewer.hidden(type="application/pdf") object#pdf-viewer.hidden(type="application/pdf")
span.pdf-preview-error {{_ 'preview-pdf-not-supported' }} span.pdf-preview-error {{_ 'preview-pdf-not-supported' }}
object#txt-viewer.hidden(type="text/plain") object#txt-viewer.hidden(type="text/plain")
i.fa.fa-chevron-right.attachment-arrow#next-attachment | ▶️
template(name="attachmentGallery") template(name="attachmentGallery")
@ -53,7 +53,7 @@ template(name="attachmentGallery")
if canModifyCard if canModifyCard
a.attachment-item.add-attachment.js-add-attachment a.attachment-item.add-attachment.js-add-attachment
i.fa.fa-plus.icon |
each attachments each attachments
@ -87,21 +87,22 @@ template(name="attachmentGallery")
span.file-size ({{fileSize size}}) span.file-size ({{fileSize size}})
.attachment-actions .attachment-actions
a.js-download(href="{{link}}?download=true", download="{{name}}") a.js-download(href="{{link}}?download=true", download="{{name}}")
i.fa.fa-download.icon(title="{{_ 'download'}}") | ⬇️(title="{{_ 'download'}}")
if currentUser.isBoardMember if currentUser.isBoardMember
unless currentUser.isCommentOnly unless currentUser.isCommentOnly
unless currentUser.isWorker unless currentUser.isWorker
a.js-rename a.js-rename
i.fa.fa-pencil-square-o.icon(title="{{_ 'rename'}}") | ✏️(title="{{_ 'rename'}}")
a.js-confirm-delete a.js-confirm-delete
i.fa.fa-trash.icon(title="{{_ 'delete'}}") | 🗑️(title="{{_ 'delete'}}")
a.fa.fa-navicon.icon.js-open-attachment-menu(data-attachment-link="{{link}}" title="{{_ 'attachmentActionsPopup-title'}}") a.js-open-attachment-menu
| ☰(data-attachment-link="{{link}}" title="{{_ 'attachmentActionsPopup-title'}}")
// Migration spinner overlay // Migration spinner overlay
if isAttachmentMigrating _id if isAttachmentMigrating _id
.attachment-migration-overlay .attachment-migration-overlay
.migration-spinner .migration-spinner
i.fa.fa-cog.fa-spin | ⚙️
.migration-text {{_ 'migrating-attachment'}} .migration-text {{_ 'migrating-attachment'}}
template(name="attachmentActionsPopup") template(name="attachmentActionsPopup")
@ -109,8 +110,8 @@ template(name="attachmentActionsPopup")
li li
if isImage if isImage
a(class="{{#if isCover}}js-remove-cover{{else}}js-add-cover{{/if}}") a(class="{{#if isCover}}js-remove-cover{{else}}js-add-cover{{/if}}")
i.fa.fa-book | 📖
i.fa.fa-picture-o | 🖼️
if isCover if isCover
| {{_ 'remove-cover'}} | {{_ 'remove-cover'}}
else else
@ -118,7 +119,7 @@ template(name="attachmentActionsPopup")
if currentUser.isBoardAdmin if currentUser.isBoardAdmin
if isImage if isImage
a(class="{{#if isBackgroundImage}}js-remove-background-image{{else}}js-add-background-image{{/if}}") a(class="{{#if isBackgroundImage}}js-remove-background-image{{else}}js-add-background-image{{/if}}")
i.fa.fa-picture-o | 🖼️
if isBackgroundImage if isBackgroundImage
| {{_ 'remove-background-image'}} | {{_ 'remove-background-image'}}
else else
@ -126,19 +127,19 @@ template(name="attachmentActionsPopup")
if $neq versions.original.storage "fs" if $neq versions.original.storage "fs"
a.js-move-storage-fs a.js-move-storage-fs
i.fa.fa-arrow-right | ▶️
| {{_ 'attachment-move-storage-fs'}} | {{_ 'attachment-move-storage-fs'}}
if $neq versions.original.storage "gridfs" if $neq versions.original.storage "gridfs"
if versions.original.storage if versions.original.storage
a.js-move-storage-gridfs a.js-move-storage-gridfs
i.fa.fa-arrow-right | ▶️
| {{_ 'attachment-move-storage-gridfs'}} | {{_ 'attachment-move-storage-gridfs'}}
if $neq versions.original.storage "s3" if $neq versions.original.storage "s3"
if versions.original.storage if versions.original.storage
a.js-move-storage-s3 a.js-move-storage-s3
i.fa.fa-arrow-right | ▶️
| {{_ 'attachment-move-storage-s3'}} | {{_ 'attachment-move-storage-s3'}}
template(name="attachmentRenamePopup") template(name="attachmentRenamePopup")

View file

@ -42,23 +42,64 @@
.card-date.long-overdue.is-active { .card-date.long-overdue.is-active {
background-color: #fd3e24; background-color: #fd3e24;
} }
/* Date type specific colors */
.card-date.received-date {
background-color: #0079bf; /* Blue for received */
}
.card-date.received-date:hover,
.card-date.received-date.is-active {
background-color: #005a8b;
}
.card-date.start-date {
background-color: #3cb500; /* Green for start */
}
.card-date.start-date:hover,
.card-date.start-date.is-active {
background-color: #2d8f00;
}
.card-date.due-date {
background-color: #ff9f19; /* Orange for due */
}
.card-date.due-date:hover,
.card-date.due-date.is-active {
background-color: #e68a00;
}
.card-date.end-date {
background-color: #a632db; /* Purple for end */
}
.card-date.end-date:hover,
.card-date.end-date.is-active {
background-color: #8a2bb8;
}
.card-date.end-date time::before { .card-date.end-date time::before {
content: "\f253"; content: "🏁"; /* Finish flag - represents end/completion */
} }
.card-date.due-date time::before { .card-date.due-date time::before {
content: "\f090"; content: "⏰"; /* Alarm clock - represents due/deadline */
} }
.card-date.start-date time::before { .card-date.start-date time::before {
content: "\f251"; content: "🚀"; /* Rocket - represents start/launch */
} }
.card-date.received-date time::before { .card-date.received-date time::before {
content: "\f08b"; content: "📥"; /* Inbox tray - represents received/incoming */
}
/* Generic date badge and custom field date */
.card-date:not(.received-date):not(.start-date):not(.due-date):not(.end-date) time::before {
content: "📅"; /* Calendar - represents generic date */
} }
.card-date time::before { .card-date time::before {
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit; font-size: inherit;
-webkit-font-smoothing: antialiased;
margin-right: 0.3em; margin-right: 0.3em;
display: inline-block;
} }
.customfield-date { .customfield-date {
display: block; display: block;

View file

@ -21,3 +21,75 @@ template(name="dateCustomField")
if showWeekOfYear if showWeekOfYear
b b
| {{showWeek}} | {{showWeek}}
template(name="minicardReceivedDate")
if canModifyCard
a.js-edit-date.card-date(title="{{_ 'card-received'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
else
a.card-date(title="{{_ 'card-received'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
template(name="minicardStartDate")
if canModifyCard
a.js-edit-date.card-date(title="{{_ 'card-start'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
else
a.card-date(title="{{_ 'card-start'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
template(name="minicardDueDate")
if canModifyCard
a.js-edit-date.card-date(title="{{_ 'card-due'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
else
a.card-date(title="{{_ 'card-due'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
template(name="minicardEndDate")
if canModifyCard
a.js-edit-date.card-date(title="{{_ 'card-end'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
else
a.card-date(title="{{_ 'card-end'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}
template(name="minicardCustomFieldDate")
a(title="{{_ 'date'}} {{_ 'predicate-week'}} {{#if showWeekOfYear}}{{showWeek}}{{/if}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
if showWeekOfYear
b
| {{showWeek}}

View file

@ -329,30 +329,50 @@ class CardCustomFieldDate extends CardDate {
CardCustomFieldDate.register('cardCustomFieldDate'); CardCustomFieldDate.register('cardCustomFieldDate');
(class extends CardReceivedDate { (class extends CardReceivedDate {
template() {
return 'minicardReceivedDate';
}
showDate() { showDate() {
return format(this.date.get(), 'L'); return format(this.date.get(), 'L');
} }
}.register('minicardReceivedDate')); }.register('minicardReceivedDate'));
(class extends CardStartDate { (class extends CardStartDate {
template() {
return 'minicardStartDate';
}
showDate() { showDate() {
return format(this.date.get(), 'YYYY-MM-DD HH:mm'); return format(this.date.get(), 'YYYY-MM-DD HH:mm');
} }
}.register('minicardStartDate')); }.register('minicardStartDate'));
(class extends CardDueDate { (class extends CardDueDate {
template() {
return 'minicardDueDate';
}
showDate() { showDate() {
return format(this.date.get(), 'YYYY-MM-DD HH:mm'); return format(this.date.get(), 'YYYY-MM-DD HH:mm');
} }
}.register('minicardDueDate')); }.register('minicardDueDate'));
(class extends CardEndDate { (class extends CardEndDate {
template() {
return 'minicardEndDate';
}
showDate() { showDate() {
return format(this.date.get(), 'YYYY-MM-DD HH:mm'); return format(this.date.get(), 'YYYY-MM-DD HH:mm');
} }
}.register('minicardEndDate')); }.register('minicardEndDate'));
(class extends CardCustomFieldDate { (class extends CardCustomFieldDate {
template() {
return 'minicardCustomFieldDate';
}
showDate() { showDate() {
return format(this.date.get(), 'L'); return format(this.date.get(), 'L');
} }

View file

@ -12,15 +12,19 @@ template(name="cardDetails")
else else
unless isMiniScreen unless isMiniScreen
unless isPopup unless isPopup
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") a.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
| ❌
if canModifyCard if canModifyCard
if cardMaximized if cardMaximized
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}") a.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
| 🔽
else else
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}") a.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
| 🔼
if canModifyCard if canModifyCard
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") a.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
a.fa.fa-link.card-copy-button.js-copy-link( | ☰
a.card-copy-button.js-copy-link(
id="cardURL_copy" id="cardURL_copy"
class="fa-link" class="fa-link"
title="{{_ 'copy-card-link-to-clipboard'}}" title="{{_ 'copy-card-link-to-clipboard'}}"
@ -29,10 +33,12 @@ template(name="cardDetails")
span.copied-tooltip {{_ 'copied'}} span.copied-tooltip {{_ 'copied'}}
else else
unless isPopup unless isPopup
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") a.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
| ❌
if canModifyCard if canModifyCard
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") a.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
a.fa.fa-link.card-copy-mobile-button.js-copy-link( | ☰
a.card-copy-mobile-button.js-copy-link(
id="cardURL_copy" id="cardURL_copy"
class="fa-link" class="fa-link"
title="{{_ 'copy-card-link-to-clipboard'}}" title="{{_ 'copy-card-link-to-clipboard'}}"
@ -47,7 +53,8 @@ template(name="cardDetails")
| ##{getCardNumber} | ##{getCardNumber}
= getTitle = getTitle
if isWatching if isWatching
i.card-details-watch.fa.fa-eye i.card-details-watch
| 👁️
.card-details-path .card-details-path
each parentList each parentList
|   >   |   >  
@ -69,7 +76,7 @@ template(name="cardDetails")
if hasActiveUploads if hasActiveUploads
.card-details-upload-progress .card-details-upload-progress
.upload-progress-header .upload-progress-header
i.fa.fa-upload | 📤
span {{_ 'uploading-files'}} ({{uploadCount}}) span {{_ 'uploading-files'}} ({{uploadCount}})
each uploads each uploads
.upload-progress-item(class="{{#if $eq status 'error'}}upload-error{{/if}}") .upload-progress-item(class="{{#if $eq status 'error'}}upload-error{{/if}}")
@ -78,11 +85,11 @@ template(name="cardDetails")
.upload-progress-fill(style="width: {{progress}}%") .upload-progress-fill(style="width: {{progress}}%")
if $eq status 'error' if $eq status 'error'
.upload-progress-error .upload-progress-error
i.fa.fa-exclamation-triangle | ⚠️
span {{_ 'upload-failed'}} span {{_ 'upload-failed'}}
else if $eq status 'completed' else if $eq status 'completed'
.upload-progress-success .upload-progress-success
i.fa.fa-check | ✅
span {{_ 'upload-completed'}} span {{_ 'upload-completed'}}
.card-details-left .card-details-left
@ -91,7 +98,7 @@ template(name="cardDetails")
if currentBoard.allowsLabels if currentBoard.allowsLabels
.card-details-item.card-details-item-labels .card-details-item.card-details-item-labels
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-tags | 🏷️
| {{_ 'labels'}} | {{_ 'labels'}}
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}") a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
each labels each labels
@ -101,7 +108,7 @@ template(name="cardDetails")
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus |
if currentBoard.hasAnyAllowsDate if currentBoard.hasAnyAllowsDate
hr hr
@ -109,7 +116,7 @@ template(name="cardDetails")
if currentBoard.allowsReceivedDate if currentBoard.allowsReceivedDate
.card-details-item.card-details-item-received .card-details-item.card-details-item-received
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-sign-out | 📥
| {{_ 'card-received'}} | {{_ 'card-received'}}
if getReceived if getReceived
+cardReceivedDate +cardReceivedDate
@ -117,12 +124,12 @@ template(name="cardDetails")
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
a.card-label.add-label.js-received-date a.card-label.add-label.js-received-date
i.fa.fa-plus |
if currentBoard.allowsStartDate if currentBoard.allowsStartDate
.card-details-item.card-details-item-start .card-details-item.card-details-item-start
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-hourglass-start | 🚀
| {{_ 'card-start'}} | {{_ 'card-start'}}
if getStart if getStart
+cardStartDate +cardStartDate
@ -130,12 +137,12 @@ template(name="cardDetails")
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
a.card-label.add-label.js-start-date a.card-label.add-label.js-start-date
i.fa.fa-plus |
if currentBoard.allowsDueDate if currentBoard.allowsDueDate
.card-details-item.card-details-item-due .card-details-item.card-details-item-due
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-sign-in | ⏰
| {{_ 'card-due'}} | {{_ 'card-due'}}
if getDue if getDue
+cardDueDate +cardDueDate
@ -143,12 +150,12 @@ template(name="cardDetails")
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
a.card-label.add-label.js-due-date a.card-label.add-label.js-due-date
i.fa.fa-plus |
if currentBoard.allowsEndDate if currentBoard.allowsEndDate
.card-details-item.card-details-item-end .card-details-item.card-details-item-end
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-hourglass-end | 🏁
| {{_ 'card-end'}} | {{_ 'card-end'}}
if getEnd if getEnd
+cardEndDate +cardEndDate
@ -156,7 +163,7 @@ template(name="cardDetails")
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
a.card-label.add-label.js-end-date a.card-label.add-label.js-end-date
i.fa.fa-plus |
if currentBoard.hasAnyAllowsUser if currentBoard.hasAnyAllowsUser
hr hr
@ -164,7 +171,7 @@ template(name="cardDetails")
if currentBoard.allowsCreator if currentBoard.allowsCreator
.card-details-item.card-details-item-creator .card-details-item.card-details-item-creator
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-user | 👤
| {{_ 'creator'}} | {{_ 'creator'}}
+userAvatar(userId=userId noRemove=true) +userAvatar(userId=userId noRemove=true)
@ -174,7 +181,7 @@ template(name="cardDetails")
if currentBoard.allowsMembers if currentBoard.allowsMembers
.card-details-item.card-details-item-members .card-details-item.card-details-item-members
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-users | 👤s
| {{_ 'members'}} | {{_ 'members'}}
each userId in getMembers each userId in getMembers
+userAvatar(userId=userId cardId=_id) +userAvatar(userId=userId cardId=_id)
@ -182,13 +189,13 @@ template(name="cardDetails")
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}") a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
i.fa.fa-plus |
//if assigneeSelected //if assigneeSelected
if currentBoard.allowsAssignee if currentBoard.allowsAssignee
.card-details-item.card-details-item-assignees .card-details-item.card-details-item-assignees
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-user | 👤
| {{_ 'assignee'}} | {{_ 'assignee'}}
each userId in getAssignees each userId in getAssignees
+userAvatar(userId=userId cardId=_id assignee=true) +userAvatar(userId=userId cardId=_id assignee=true)
@ -199,7 +206,7 @@ template(name="cardDetails")
if currentUser.isWorker if currentUser.isWorker
unless assigneeSelected unless assigneeSelected
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}") a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
i.fa.fa-plus |
//.card-details-items //.card-details-items
if currentBoard.allowsRequestedBy if currentBoard.allowsRequestedBy
@ -225,7 +232,7 @@ template(name="cardDetails")
if currentBoard.allowsAssignedBy if currentBoard.allowsAssignedBy
.card-details-item.card-details-item-name .card-details-item.card-details-item-name
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-user-plus | 👤-plus
| {{_ 'assigned-by'}} | {{_ 'assigned-by'}}
if canModifyCard if canModifyCard
unless currentUser.isWorker unless currentUser.isWorker
@ -350,52 +357,52 @@ template(name="cardDetails")
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-one(class="{{#if $eq pokerState 'one'}}poker-voted{{/if}}") {{_ 'poker-one'}} span.inner.js-poker.js-poker-vote-one(class="{{#if $eq pokerState 'one'}}poker-voted{{/if}}") {{_ 'poker-one'}}
if $eq pokerState "one" if $eq pokerState "one"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-two(class="{{#if $eq pokerState 'two'}}poker-voted{{/if}}") {{_ 'poker-two'}} span.inner.js-poker.js-poker-vote-two(class="{{#if $eq pokerState 'two'}}poker-voted{{/if}}") {{_ 'poker-two'}}
if $eq pokerState "two" if $eq pokerState "two"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-three(class="{{#if $eq pokerState 'three'}}poker-voted{{/if}}") {{_ 'poker-three'}} span.inner.js-poker.js-poker-vote-three(class="{{#if $eq pokerState 'three'}}poker-voted{{/if}}") {{_ 'poker-three'}}
if $eq pokerState "three" if $eq pokerState "three"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-five(class="{{#if $eq pokerState 'five'}}poker-voted{{/if}}") {{_ 'poker-five'}} span.inner.js-poker.js-poker-vote-five(class="{{#if $eq pokerState 'five'}}poker-voted{{/if}}") {{_ 'poker-five'}}
if $eq pokerState "five" if $eq pokerState "five"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-eight(class="{{#if $eq pokerState 'eight'}}poker-voted{{/if}}") {{_ 'poker-eight'}} span.inner.js-poker.js-poker-vote-eight(class="{{#if $eq pokerState 'eight'}}poker-voted{{/if}}") {{_ 'poker-eight'}}
if $eq pokerState "eight" if $eq pokerState "eight"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-thirteen(class="{{#if $eq pokerState 'thirteen'}}poker-voted{{/if}}") {{_ 'poker-thirteen'}} span.inner.js-poker.js-poker-vote-thirteen(class="{{#if $eq pokerState 'thirteen'}}poker-voted{{/if}}") {{_ 'poker-thirteen'}}
if $eq pokerState "thirteen" if $eq pokerState "thirteen"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-twenty(class="{{#if $eq pokerState 'twenty'}}poker-voted{{/if}}") {{_ 'poker-twenty'}} span.inner.js-poker.js-poker-vote-twenty(class="{{#if $eq pokerState 'twenty'}}poker-voted{{/if}}") {{_ 'poker-twenty'}}
if $eq pokerState "twenty" if $eq pokerState "twenty"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-forty(class="{{#if $eq pokerState 'forty'}}poker-voted{{/if}}") {{_ 'poker-forty'}} span.inner.js-poker.js-poker-vote-forty(class="{{#if $eq pokerState 'forty'}}poker-voted{{/if}}") {{_ 'poker-forty'}}
if $eq pokerState "forty" if $eq pokerState "forty"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-one-hundred(class="{{#if $eq pokerState 'oneHundred'}}poker-voted{{/if}}") {{_ 'poker-oneHundred'}} span.inner.js-poker.js-poker-vote-one-hundred(class="{{#if $eq pokerState 'oneHundred'}}poker-voted{{/if}}") {{_ 'poker-oneHundred'}}
if $eq pokerState "oneHundred" if $eq pokerState "oneHundred"
i.fa.fa-check | ✅
.poker-deck .poker-deck
.poker-card .poker-card
span.inner.js-poker.js-poker-vote-unsure(class="{{#if $eq pokerState 'unsure'}}poker-voted{{/if}}") {{_ 'poker-unsure'}} span.inner.js-poker.js-poker-vote-unsure(class="{{#if $eq pokerState 'unsure'}}poker-voted{{/if}}") {{_ 'poker-unsure'}}
if $eq pokerState "unsure" if $eq pokerState "unsure"
i.fa.fa-check | ✅
if currentUser.isBoardAdmin if currentUser.isBoardAdmin
button.card-details-blue.js-poker-finish(class="{{#if $eq voteState false}}poker-voted{{/if}}") {{_ 'poker-finish'}} button.card-details-blue.js-poker-finish(class="{{#if $eq voteState false}}poker-voted{{/if}}") {{_ 'poker-finish'}}
@ -812,7 +819,7 @@ template(name="cardMembersPopup")
= user.profile.fullname = user.profile.fullname
| (<span class="username">{{ user.username }}</span>) | (<span class="username">{{ user.username }}</span>)
if isCardMember if isCardMember
i.fa.fa-check | ✅
template(name="cardAssigneesPopup") template(name="cardAssigneesPopup")
input.card-assignees-filter(type="text" placeholder="{{_ 'search'}}") input.card-assignees-filter(type="text" placeholder="{{_ 'search'}}")
@ -826,7 +833,7 @@ template(name="cardAssigneesPopup")
= user.profile.fullname = user.profile.fullname
| (<span class="username">{{ user.username }}</span>) | (<span class="username">{{ user.username }}</span>)
if isCardAssignee if isCardAssignee
i.fa.fa-check | ✅
if currentUser.isWorker if currentUser.isWorker
ul.pop-over-list.js-card-assignee-list ul.pop-over-list.js-card-assignee-list
li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}") li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}")
@ -836,7 +843,7 @@ template(name="cardAssigneesPopup")
= currentUser.profile.fullname = currentUser.profile.fullname
| (<span class="username">{{ currentUser.username }}</span>) | (<span class="username">{{ currentUser.username }}</span>)
if currentUser.isCardAssignee if currentUser.isCardAssignee
i.fa.fa-check | ✅
template(name="cardAssigneePopup") template(name="cardAssigneePopup")
.board-assignee-menu .board-assignee-menu
@ -902,7 +909,7 @@ template(name="setCardColorPopup")
unless $eq color 'white' unless $eq color 'white'
span.card-label.palette-color.js-palette-color(class="card-details-{{color}}") span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
if(isSelected color) if(isSelected color)
i.fa.fa-check | ✅
button.primary.confirm.js-submit {{_ 'save'}} button.primary.confirm.js-submit {{_ 'save'}}
button.js-remove-color.negate.wide.right {{_ 'unset-color'}} button.js-remove-color.negate.wide.right {{_ 'unset-color'}}

View file

@ -15,8 +15,8 @@ template(name="editCardSpentTime")
template(name="timeBadge") template(name="timeBadge")
if canModifyCard if canModifyCard
a.js-edit-time.card-time(title="{{showTitle}}" class="{{#if getIsOvertime}}card-label-red{{else}}card-label-green{{/if}}") a.js-edit-time.card-time(title="{{_ 'time'}}" class="{{#if getIsOvertime}}card-label-red{{else}}card-label-green{{/if}}")
| {{showTime}} | ⏱️ {{showTime}}
else else
a.card-time(title="{{showTitle}}" class="{{#if getIsOvertime}}card-label-red{{else}}card-label-green{{/if}}") a.card-time(title="{{_ 'time'}}" class="{{#if getIsOvertime}}card-label-red{{else}}card-label-green{{/if}}")
| {{showTime}} | ⏱️ {{showTime}}

View file

@ -168,6 +168,20 @@
.minicard .date { .minicard .date {
margin-right: 0.4vw; margin-right: 0.4vw;
} }
/* Font Awesome icons in minicard dates */
.minicard .card-date i.fa {
margin-right: 0.3vw;
font-size: 0.9em;
vertical-align: middle;
}
/* Font Awesome icons in minicard spent time */
.minicard .card-time i.fa {
margin-right: 0.3vw;
font-size: 0.9em;
vertical-align: middle;
}
.minicard .badges { .minicard .badges {
float: left; float: left;
margin-top: 1vh; margin-top: 1vh;

View file

@ -8,7 +8,7 @@ template(name="bookmarks")
li li
a(href="{{pathFor 'board' id=_id slug=slug}}")= title a(href="{{pathFor 'board' id=_id slug=slug}}")= title
a.js-toggle-star(title="{{_ 'star-board-short-unstar'}}") a.js-toggle-star(title="{{_ 'star-board-short-unstar'}}")
i.fa.fa-star | ⭐
else else
p {{_ 'no-starred-boards'}} p {{_ 'no-starred-boards'}}
else else
@ -21,9 +21,9 @@ template(name="bookmarksPopup")
each starredBoards each starredBoards
li li
a(href="{{pathFor 'board' id=_id slug=slug}}") a(href="{{pathFor 'board' id=_id slug=slug}}")
i.fa.fa-star | ⭐
| #{title} | #{title}
a.js-toggle-star.right(title="{{_ 'star-board-short-unstar'}}") a.js-toggle-star.right(title="{{_ 'star-board-short-unstar'}}")
i.fa.fa-star | ⭐
else else
li {{_ 'no-starred-boards'}} li {{_ 'no-starred-boards'}}

View file

@ -9,7 +9,7 @@ template(name="header")
// Home icon - always at left side of logo // Home icon - always at left side of logo
span.home-icon.allBoards span.home-icon.allBoards
a(href="{{pathFor 'home'}}") a(href="{{pathFor 'home'}}")
span.fa.fa-home | 🏠
| {{_ 'all-boards'}} | {{_ 'all-boards'}}
// Logo - visible; on mobile constrained by CSS // Logo - visible; on mobile constrained by CSS
@ -80,12 +80,12 @@ template(name="header")
.mobile-mode-toggle .mobile-mode-toggle
a.board-header-btn.js-mobile-mode-toggle(title="{{_ 'mobile-desktop-toggle'}}" class="{{#if mobileMode}}mobile-active{{else}}desktop-active{{/if}}") a.board-header-btn.js-mobile-mode-toggle(title="{{_ 'mobile-desktop-toggle'}}" class="{{#if mobileMode}}mobile-active{{else}}desktop-active{{/if}}")
i.fa.fa-mobile.mobile-icon(class="{{#if mobileMode}}active{{/if}}") | 📱(class="{{#if mobileMode}}active{{/if}}")
i.fa.fa-desktop.desktop-icon(class="{{#unless mobileMode}}active{{/unless}}") | 🖥️(class="{{#unless mobileMode}}active{{/unless}}")
// Bookmarks button - desktop opens popup, mobile routes to page // Bookmarks button - desktop opens popup, mobile routes to page
a.board-header-btn.js-open-bookmarks(title="{{_ 'bookmarks'}}") a.board-header-btn.js-open-bookmarks(title="{{_ 'bookmarks'}}")
i.fa.fa-bookmark | 🔖
// Notifications // Notifications
+notifications +notifications
@ -93,7 +93,7 @@ template(name="header")
if currentSetting.customHelpLinkUrl if currentSetting.customHelpLinkUrl
#header-help #header-help
a(href="{{currentSetting.customHelpLinkUrl}}", title="{{_ 'help'}}", target="_blank", rel="noopener noreferrer") a(href="{{currentSetting.customHelpLinkUrl}}", title="{{_ 'help'}}", target="_blank", rel="noopener noreferrer")
span.fa.fa-question | ❓
+headerUserBar +headerUserBar
@ -112,15 +112,15 @@ template(name="header")
if hasAnnouncement if hasAnnouncement
.announcement .announcement
p p
i.fa.fa-bullhorn | 📢
+viewer +viewer
| #{announcement} | #{announcement}
i.fa.fa-times-circle.js-close-announcement | ❌
template(name="offlineWarning") template(name="offlineWarning")
.offline-warning .offline-warning
p p
i.fa.fa-warning | ⚠️
| {{_ 'app-is-offline'}} | {{_ 'app-is-offline'}}
a.app-try-reconnect {{_ 'app-try-reconnect'}} a.app-try-reconnect {{_ 'app-try-reconnect'}}

View file

@ -85,13 +85,13 @@ template(name="defaultLayout")
if (Modal.isWide) if (Modal.isWide)
.modal-content-wide.modal-container .modal-content-wide.modal-container
a.modal-close-btn.js-close-modal a.modal-close-btn.js-close-modal
i.fa.fa-times-thin | ❌
+Template.dynamic(template=Modal.getHeaderName) +Template.dynamic(template=Modal.getHeaderName)
+Template.dynamic(template=Modal.getTemplateName) +Template.dynamic(template=Modal.getTemplateName)
else else
.modal-content.modal-container .modal-content.modal-container
a.modal-close-btn.js-close-modal a.modal-close-btn.js-close-modal
i.fa.fa-times-thin | ❌
+Template.dynamic(template=Modal.getHeaderName) +Template.dynamic(template=Modal.getHeaderName)
+Template.dynamic(template=Modal.getTemplateName) +Template.dynamic(template=Modal.getTemplateName)

View file

@ -5,10 +5,10 @@
style="left:{{offset.left}}px; top:{{offset.top}}px;{{#if offset.maxHeight}} max-height:{{offset.maxHeight}}px;{{/if}}") style="left:{{offset.left}}px; top:{{offset.top}}px;{{#if offset.maxHeight}} max-height:{{offset.maxHeight}}px;{{/if}}")
.header .header
a.back-btn.js-back-view(class="{{#unless hasPopupParent}}is-hidden{{/unless}}") a.back-btn.js-back-view(class="{{#unless hasPopupParent}}is-hidden{{/unless}}")
i.fa.fa-chevron-left | ◀️
span.header-title= title span.header-title= title
a.close-btn.js-close-pop-over a.close-btn.js-close-pop-over
i.fa.fa-times-thin | ❌
.content-wrapper .content-wrapper
//- //-
We display the all stack of popup content next to each other and move We display the all stack of popup content next to each other and move

View file

@ -3,7 +3,7 @@ template(name="migrationProgress")
.migration-modal .migration-modal
.migration-header .migration-header
h3 h3
i.fa.fa-database | 🗄️
| {{_ 'database-migration'}} | {{_ 'database-migration'}}
p {{_ 'database-migration-description'}} p {{_ 'database-migration-description'}}
@ -16,11 +16,11 @@ template(name="migrationProgress")
.progress-label {{_ 'overall-progress'}} .progress-label {{_ 'overall-progress'}}
.current-step .current-step
i.fa.fa-cog.fa-spin | ⚙️
| {{migrationCurrentStep}} | {{migrationCurrentStep}}
.estimated-time(style="{{#unless migrationEstimatedTime}}display: none;{{/unless}}") .estimated-time(style="{{#unless migrationEstimatedTime}}display: none;{{/unless}}")
i.fa.fa-clock-o | ⏰
| {{_ 'estimated-time-remaining'}}: {{migrationEstimatedTime}} | {{_ 'estimated-time-remaining'}}: {{migrationEstimatedTime}}
.migration-steps .migration-steps
@ -31,11 +31,11 @@ template(name="migrationProgress")
.step-header .step-header
.step-icon .step-icon
if completed if completed
i.fa.fa-check-circle | ✅
else if isCurrentStep else if isCurrentStep
i.fa.fa-cog.fa-spin | ⚙️
else else
i.fa.fa-circle-o | ⭕
.step-info .step-info
.step-name {{name}} .step-name {{name}}
.step-description {{description}} .step-description {{description}}
@ -51,13 +51,13 @@ template(name="migrationProgress")
.progress-fill(style="width: {{progress}}%") .progress-fill(style="width: {{progress}}%")
.migration-status .migration-status
i.fa.fa-info-circle |
| {{migrationStatus}} | {{migrationStatus}}
.migration-footer .migration-footer
.migration-info .migration-info
i.fa.fa-lightbulb-o | 💡
| {{_ 'migration-info-text'}} | {{_ 'migration-info-text'}}
.migration-warning .migration-warning
i.fa.fa-exclamation-triangle | ⚠️
| {{_ 'migration-warning-text'}} | {{_ 'migration-warning-text'}}

View file

@ -47,17 +47,17 @@ template(name="cronMigrations")
.cron-migrations .cron-migrations
.migration-header .migration-header
h2 h2
i.fa.fa-database | 🗄️
| {{_ 'database-migrations'}} | {{_ 'database-migrations'}}
.migration-controls .migration-controls
button.btn.btn-primary.js-start-all-migrations button.btn.btn-primary.js-start-all-migrations
i.fa.fa-play | ▶️
| {{_ 'start-all-migrations'}} | {{_ 'start-all-migrations'}}
button.btn.btn-warning.js-pause-all-migrations button.btn.btn-warning.js-pause-all-migrations
i.fa.fa-pause | ⏸️
| {{_ 'pause-all-migrations'}} | {{_ 'pause-all-migrations'}}
button.btn.btn-danger.js-stop-all-migrations button.btn.btn-danger.js-stop-all-migrations
i.fa.fa-stop | ⏹️
| {{_ 'stop-all-migrations'}} | {{_ 'stop-all-migrations'}}
.migration-progress .migration-progress
@ -68,11 +68,11 @@ template(name="cronMigrations")
.progress-label {{_ 'overall-progress'}} .progress-label {{_ 'overall-progress'}}
.current-step .current-step
i.fa.fa-cog.fa-spin | ⚙️
| {{migrationCurrentStep}} | {{migrationCurrentStep}}
.migration-status .migration-status
i.fa.fa-info-circle |
| {{migrationStatus}} | {{migrationStatus}}
.migration-steps .migration-steps
@ -83,11 +83,11 @@ template(name="cronMigrations")
.step-header .step-header
.step-icon .step-icon
if completed if completed
i.fa.fa-check-circle | ✅
else if isCurrentStep else if isCurrentStep
i.fa.fa-cog.fa-spin | ⚙️
else else
i.fa.fa-circle-o | ⭕
.step-info .step-info
.step-name {{name}} .step-name {{name}}
.step-description {{description}} .step-description {{description}}
@ -106,17 +106,17 @@ template(name="cronBoardOperations")
.cron-board-operations .cron-board-operations
.board-operations-header .board-operations-header
h2 h2
i.fa.fa-tasks | 📋
| {{_ 'board-operations'}} | {{_ 'board-operations'}}
.board-operations-controls .board-operations-controls
button.btn.btn-success.js-refresh-board-operations button.btn.btn-success.js-refresh-board-operations
i.fa.fa-refresh | 🔄
| {{_ 'refresh'}} | {{_ 'refresh'}}
button.btn.btn-primary.js-start-test-operation button.btn.btn-primary.js-start-test-operation
i.fa.fa-play | ▶️
| {{_ 'start-test-operation'}} | {{_ 'start-test-operation'}}
button.btn.btn-info.js-force-board-scan button.btn.btn-info.js-force-board-scan
i.fa.fa-search | 🔍
| {{_ 'force-board-scan'}} | {{_ 'force-board-scan'}}
.board-operations-stats .board-operations-stats
@ -164,7 +164,7 @@ template(name="cronBoardOperations")
.board-operations-search .board-operations-search
.search-box .search-box
input.form-control.js-search-board-operations(type="text" placeholder="{{_ 'search-boards-or-operations'}}") input.form-control.js-search-board-operations(type="text" placeholder="{{_ 'search-boards-or-operations'}}")
i.fa.fa-search.search-icon | 🔍.search-icon
.board-operations-list .board-operations-list
.operations-header .operations-header
@ -203,36 +203,36 @@ template(name="cronBoardOperations")
.btn-group .btn-group
if isRunning if isRunning
button.btn.btn-sm.btn-warning.js-pause-operation(data-operation="{{id}}") button.btn.btn-sm.btn-warning.js-pause-operation(data-operation="{{id}}")
i.fa.fa-pause | ⏸️
else else
button.btn.btn-sm.btn-success.js-resume-operation(data-operation="{{id}}") button.btn.btn-sm.btn-success.js-resume-operation(data-operation="{{id}}")
i.fa.fa-play | ▶️
button.btn.btn-sm.btn-danger.js-stop-operation(data-operation="{{id}}") button.btn.btn-sm.btn-danger.js-stop-operation(data-operation="{{id}}")
i.fa.fa-stop | ⏹️
button.btn.btn-sm.btn-info.js-view-details(data-operation="{{id}}") button.btn.btn-sm.btn-info.js-view-details(data-operation="{{id}}")
i.fa.fa-info-circle |
.pagination .pagination
if pagination.hasPrev if pagination.hasPrev
button.btn.btn-sm.btn-default.js-prev-page button.btn.btn-sm.btn-default.js-prev-page
i.fa.fa-chevron-left | ◀️
| {{_ 'previous'}} | {{_ 'previous'}}
.page-info .page-info
| {{_ 'page'}} {{pagination.page}} {{_ 'of'}} {{pagination.totalPages}} | {{_ 'page'}} {{pagination.page}} {{_ 'of'}} {{pagination.totalPages}}
if pagination.hasNext if pagination.hasNext
button.btn.btn-sm.btn-default.js-next-page button.btn.btn-sm.btn-default.js-next-page
| {{_ 'next'}} | {{_ 'next'}}
i.fa.fa-chevron-right | ▶️
template(name="cronJobs") template(name="cronJobs")
.cron-jobs .cron-jobs
.jobs-header .jobs-header
h2 h2
i.fa.fa-clock-o | ⏰
| {{_ 'cron-jobs'}} | {{_ 'cron-jobs'}}
.jobs-controls .jobs-controls
button.btn.btn-success.js-refresh-jobs button.btn.btn-success.js-refresh-jobs
i.fa.fa-refresh | 🔄
| {{_ 'refresh'}} | {{_ 'refresh'}}
.jobs-list .jobs-list
@ -258,20 +258,20 @@ template(name="cronJobs")
.btn-group .btn-group
if isRunning if isRunning
button.btn.btn-sm.btn-warning.js-pause-job(data-job="{{name}}") button.btn.btn-sm.btn-warning.js-pause-job(data-job="{{name}}")
i.fa.fa-pause | ⏸️
else else
button.btn.btn-sm.btn-success.js-start-job(data-job="{{name}}") button.btn.btn-sm.btn-success.js-start-job(data-job="{{name}}")
i.fa.fa-play | ▶️
button.btn.btn-sm.btn-danger.js-stop-job(data-job="{{name}}") button.btn.btn-sm.btn-danger.js-stop-job(data-job="{{name}}")
i.fa.fa-stop | ⏹️
button.btn.btn-sm.btn-danger.js-remove-job(data-job="{{name}}") button.btn.btn-sm.btn-danger.js-remove-job(data-job="{{name}}")
i.fa.fa-trash | 🗑️
template(name="cronAddJob") template(name="cronAddJob")
.cron-add-job .cron-add-job
.add-job-header .add-job-header
h2 h2
i.fa.fa-plus |
| {{_ 'add-cron-job'}} | {{_ 'add-cron-job'}}
.add-job-form .add-job-form
@ -302,8 +302,8 @@ template(name="cronAddJob")
.form-actions .form-actions
button.btn.btn-primary(type="submit") button.btn.btn-primary(type="submit")
i.fa.fa-plus |
| {{_ 'add-job'}} | {{_ 'add-job'}}
button.btn.btn-default.js-cancel-add-job button.btn.btn-default.js-cancel-add-job
i.fa.fa-times | ❌
| {{_ 'cancel'}} | {{_ 'cancel'}}

View file

@ -6,87 +6,87 @@ template(name="setting")
.content-title.ext-box .content-title.ext-box
if isGeneralSetting if isGeneralSetting
span span
i.fa.fa-sign-in | 🔑
| {{_ 'registration'}} | {{_ 'registration'}}
else if isEmailSetting else if isEmailSetting
span span
i.fa.fa-envelope | ✉️
| {{_ 'email'}} | {{_ 'email'}}
else if isAccountSetting else if isAccountSetting
span span
i.fa.fa-users | 👥
| {{_ 'accounts'}} | {{_ 'accounts'}}
else if isTableVisibilityModeSetting else if isTableVisibilityModeSetting
span span
i.fa.fa-eye | 👁️
| {{_ 'tableVisibilityMode'}} | {{_ 'tableVisibilityMode'}}
else if isAnnouncementSetting else if isAnnouncementSetting
span span
i.fa.fa-bullhorn | 📢
| {{_ 'admin-announcement'}} | {{_ 'admin-announcement'}}
else if isAccessibilitySetting else if isAccessibilitySetting
span span
i.fa.fa-universal-access | ♿
| {{_ 'accessibility'}} | {{_ 'accessibility'}}
else if isLayoutSetting else if isLayoutSetting
span span
i.fa.fa-object-group | 🔗
| {{_ 'layout'}} | {{_ 'layout'}}
else if isWebhookSetting else if isWebhookSetting
span span
i.fa.fa-globe | 🌐
| {{_ 'global-webhook'}} | {{_ 'global-webhook'}}
else if isAttachmentSettings else if isAttachmentSettings
span span
i.fa.fa-paperclip | 📎
| {{_ 'attachments'}} | {{_ 'attachments'}}
else if isCronSettings else if isCronSettings
span span
i.fa.fa-clock-o | ⏰
| {{_ 'cron'}} | {{_ 'cron'}}
.content-body .content-body
.side-menu .side-menu
ul ul
li(class="{{#if isGeneralSetting}}active{{/if}}") li(class="{{#if isGeneralSetting}}active{{/if}}")
a.js-setting-menu(data-id="registration-setting") a.js-setting-menu(data-id="registration-setting")
i.fa.fa-sign-in | 🔑
| {{_ 'registration'}} | {{_ 'registration'}}
unless isSandstorm unless isSandstorm
li(class="{{#if isEmailSetting}}active{{/if}}") li(class="{{#if isEmailSetting}}active{{/if}}")
a.js-setting-menu(data-id="email-setting") a.js-setting-menu(data-id="email-setting")
i.fa.fa-envelope | ✉️
| {{_ 'email'}} | {{_ 'email'}}
li(class="{{#if isAccountSetting}}active{{/if}}") li(class="{{#if isAccountSetting}}active{{/if}}")
a.js-setting-menu(data-id="account-setting") a.js-setting-menu(data-id="account-setting")
i.fa.fa-users | 👥
| {{_ 'accounts'}} | {{_ 'accounts'}}
li(class="{{#if isTableVisibilityModeSetting}}active{{/if}}") li(class="{{#if isTableVisibilityModeSetting}}active{{/if}}")
a.js-setting-menu(data-id="tableVisibilityMode-setting") a.js-setting-menu(data-id="tableVisibilityMode-setting")
i.fa.fa-eye | 👁️
| {{_ 'tableVisibilityMode'}} | {{_ 'tableVisibilityMode'}}
li(class="{{#if isAnnouncementSetting}}active{{/if}}") li(class="{{#if isAnnouncementSetting}}active{{/if}}")
a.js-setting-menu(data-id="announcement-setting") a.js-setting-menu(data-id="announcement-setting")
i.fa.fa-bullhorn | 📢
| {{_ 'admin-announcement'}} | {{_ 'admin-announcement'}}
li(class="{{#if isAccessibilitySetting}}active{{/if}}") li(class="{{#if isAccessibilitySetting}}active{{/if}}")
a.js-setting-menu(data-id="accessibility-setting") a.js-setting-menu(data-id="accessibility-setting")
i.fa.fa-universal-access | ♿
| {{_ 'accessibility'}} | {{_ 'accessibility'}}
li(class="{{#if isLayoutSetting}}active{{/if}}") li(class="{{#if isLayoutSetting}}active{{/if}}")
a.js-setting-menu(data-id="layout-setting") a.js-setting-menu(data-id="layout-setting")
i.fa.fa-object-group | 🔗
| {{_ 'layout'}} | {{_ 'layout'}}
li(class="{{#if isWebhookSetting}}active{{/if}}") li(class="{{#if isWebhookSetting}}active{{/if}}")
a.js-setting-menu(data-id="webhook-setting") a.js-setting-menu(data-id="webhook-setting")
i.fa.fa-globe | 🌐
| {{_ 'global-webhook'}} | {{_ 'global-webhook'}}
li(class="{{#if isAttachmentSettings}}active{{/if}}") li(class="{{#if isAttachmentSettings}}active{{/if}}")
a.js-setting-menu(data-id="attachment-settings") a.js-setting-menu(data-id="attachment-settings")
i.fa.fa-paperclip | 📎
| {{_ 'attachments'}} | {{_ 'attachments'}}
li(class="{{#if isCronSettings}}active{{/if}}") li(class="{{#if isCronSettings}}active{{/if}}")
a.js-setting-menu(data-id="cron-settings") a.js-setting-menu(data-id="cron-settings")
i.fa.fa-clock-o | ⏰
| {{_ 'cron'}} | {{_ 'cron'}}
.main-body .main-body
if isLoading if isLoading

View file

@ -24,16 +24,18 @@ template(name="swimlaneFixedHeader")
| {{isTitleDefault title}} | {{isTitleDefault title}}
.swimlane-header-menu .swimlane-header-menu
unless currentUser.isCommentOnly unless currentUser.isCommentOnly
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}") a.js-open-add-swimlane-menu.swimlane-header-plus-icon
a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}") | (title="{{_ 'add-swimlane'}}")
a.js-open-swimlane-menu
| ☰(title="{{_ 'swimlaneActionPopup-title'}}")
//// TODO: Collapse Swimlane: make button working, etc. //// TODO: Collapse Swimlane: make button working, etc.
//unless collapsed //unless collapsed
// a.js-collapse-swimlane(title="{{_ 'collapse'}}") // a.js-collapse-swimlane(title="{{_ 'collapse'}}")
// i.fa.fa-arrow-down.swimlane-header-collapse-down // i.fa.fa-arrow-down.swimlane-header-collapse-down
// i.fa.fa-arrow-up.swimlane-header-collapse-up // ⬆️.swimlane-header-collapse-up
//if collapsed //if collapsed
// a.js-collapse-swimlane(title="{{_ 'uncollapse'}}") // a.js-collapse-swimlane(title="{{_ 'uncollapse'}}")
// i.fa.fa-arrow-up.swimlane-header-collapse-up // ⬆️.swimlane-header-collapse-up
// i.fa.fa-arrow-down.swimlane-header-collapse-down // i.fa.fa-arrow-down.swimlane-header-collapse-down
unless isTouchScreen unless isTouchScreen
if isShowDesktopDragHandles if isShowDesktopDragHandles
@ -46,33 +48,34 @@ template(name="editSwimlaneTitleForm")
input.list-name-input.full-line(type="text" value="{{isTitleDefault title}}" autofocus) input.list-name-input.full-line(type="text" value="{{isTitleDefault title}}" autofocus)
.edit-controls.clearfix .edit-controls.clearfix
button.primary.confirm(type="submit") {{_ 'save'}} button.primary.confirm(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-close-inlined-form a.js-close-inlined-form
| ❌
template(name="swimlaneActionPopup") template(name="swimlaneActionPopup")
unless currentUser.isCommentOnly unless currentUser.isCommentOnly
ul.pop-over-list ul.pop-over-list
if currentUser.isBoardAdmin if currentUser.isBoardAdmin
li: a.js-set-swimlane-color li: a.js-set-swimlane-color
i.fa.fa-paint-brush | 🎨
| {{_ 'select-color'}} | {{_ 'select-color'}}
li: a.js-set-swimlane-height li: a.js-set-swimlane-height
i.fa.fa-arrows-v | ↕️
| {{_ 'set-swimlane-height'}} | {{_ 'set-swimlane-height'}}
if currentUser.isBoardAdmin if currentUser.isBoardAdmin
unless this.isTemplateContainer unless this.isTemplateContainer
hr hr
ul.pop-over-list ul.pop-over-list
li: a.js-close-swimlane li: a.js-close-swimlane
i.fa.fa-arrow-right | ▶️
i.fa.fa-archive | 📦
| {{_ 'archive-swimlane'}} | {{_ 'archive-swimlane'}}
ul.pop-over-list ul.pop-over-list
li: a.js-copy-swimlane li: a.js-copy-swimlane
i.fa.fa-copy | 📋
| {{_ 'copy-swimlane'}} | {{_ 'copy-swimlane'}}
ul.pop-over-list ul.pop-over-list
li: a.js-move-swimlane li: a.js-move-swimlane
i.fa.fa-arrow-up | ⬆️
| {{_ 'move-swimlane'}} | {{_ 'move-swimlane'}}
template(name="swimlaneAddPopup") template(name="swimlaneAddPopup")

View file

@ -13,7 +13,7 @@ template(name="userAvatar")
if showEdit if showEdit
if $eq currentUser._id userData._id if $eq currentUser._id userData._id
a.edit-avatar.js-change-avatar a.edit-avatar.js-change-avatar
i.fa.fa-pencil | ✏️
template(name="userAvatarInitials") template(name="userAvatarInitials")
svg.avatar.avatar-initials(viewBox="0 0 {{viewPortWidth}} 15") svg.avatar.avatar-initials(viewBox="0 0 {{viewPortWidth}} 15")
@ -32,7 +32,8 @@ template(name="boardOrgRow")
td td
if currentUser.isBoardAdmin if currentUser.isBoardAdmin
a.member.orgOrTeamMember.add-member.js-manage-board-removeOrg(title="{{_ 'remove-from-board'}}") a.member.orgOrTeamMember.add-member.js-manage-board-removeOrg(title="{{_ 'remove-from-board'}}")
i.removeTeamFaMinus.fa.fa-minus i.removeTeamFaMinus
|
.divaddfaplusminus .divaddfaplusminus
| {{_ 'remove-btn'}} | {{_ 'remove-btn'}}
@ -45,7 +46,8 @@ template(name="boardTeamRow")
td td
if currentUser.isBoardAdmin if currentUser.isBoardAdmin
a.member.orgOrTeamMember.add-member.js-manage-board-removeTeam(title="{{_ 'remove-from-board'}}") a.member.orgOrTeamMember.add-member.js-manage-board-removeTeam(title="{{_ 'remove-from-board'}}")
i.removeTeamFaMinus.fa.fa-minus i.removeTeamFaMinus
|
.divaddfaplusminus .divaddfaplusminus
| {{_ 'remove-btn'}} | {{_ 'remove-btn'}}
@ -88,7 +90,7 @@ template(name="changeAvatarPopup")
img.avatar.avatar-image(src="{{link}}?auth=false&brokenIsFine=true") img.avatar.avatar-image(src="{{link}}?auth=false&brokenIsFine=true")
| {{_ 'uploaded-avatar'}} | {{_ 'uploaded-avatar'}}
if isSelected if isSelected
i.fa.fa-check | ✅
p.sub-name p.sub-name
unless isSelected unless isSelected
a.js-delete-avatar {{_ 'delete'}} a.js-delete-avatar {{_ 'delete'}}
@ -99,7 +101,7 @@ template(name="changeAvatarPopup")
+userAvatarInitials(userId=currentUser._id) +userAvatarInitials(userId=currentUser._id)
| {{_ 'initials' }} | {{_ 'initials' }}
if noAvatarUrl if noAvatarUrl
i.fa.fa-check | ✅
p.sub-name {{_ 'default-avatar'}} p.sub-name {{_ 'default-avatar'}}
input.hide.js-upload-avatar-input(accept="image/*;capture=camera" type="file") input.hide.js-upload-avatar-input(accept="image/*;capture=camera" type="file")
if Meteor.settings.public.avatarsUploadMaxSize if Meteor.settings.public.avatarsUploadMaxSize
@ -110,7 +112,7 @@ template(name="changeAvatarPopup")
br br
| {{_ 'invalid-file'}} | {{_ 'invalid-file'}}
button.full.js-upload-avatar button.full.js-upload-avatar
i.fa.fa-upload | 📤
| {{_ 'upload-avatar'}} | {{_ 'upload-avatar'}}
template(name="cardMemberPopup") template(name="cardMemberPopup")

View file

@ -15,92 +15,92 @@ template(name="memberMenuPopup")
// Bookmarks at the very top // Bookmarks at the very top
li li
a.js-open-bookmarks a.js-open-bookmarks
i.fa.fa-bookmark | 🔖
| {{_ 'bookmarks'}} | {{_ 'bookmarks'}}
with currentUser with currentUser
li li
a.js-my-cards(href="{{pathFor 'my-cards'}}") a.js-my-cards(href="{{pathFor 'my-cards'}}")
i.fa.fa-list | 📋
| {{_ 'my-cards'}} | {{_ 'my-cards'}}
li li
a.js-due-cards(href="{{pathFor 'due-cards'}}") a.js-due-cards(href="{{pathFor 'due-cards'}}")
i.fa.fa-calendar | 📅
| {{_ 'dueCards-title'}} | {{_ 'dueCards-title'}}
li li
a.js-global-search(href="{{pathFor 'global-search'}}") a.js-global-search(href="{{pathFor 'global-search'}}")
i.fa.fa-search | 🔍
| {{_ 'globalSearch-title'}} | {{_ 'globalSearch-title'}}
li li
a(href="{{pathFor 'home'}}") a(href="{{pathFor 'home'}}")
span.fa.fa-home | 🏠
| {{_ 'all-boards'}} | {{_ 'all-boards'}}
li li
a(href="{{pathFor 'public'}}") a(href="{{pathFor 'public'}}")
span.fa.fa-globe | 🌐
| {{_ 'public'}} | {{_ 'public'}}
li li
a.board-header-btn.js-open-archived-board a.board-header-btn.js-open-archived-board
i.fa.fa-archive | 📦
span {{_ 'archives'}} span {{_ 'archives'}}
li li
a.js-notifications-drawer-toggle a.js-notifications-drawer-toggle
i.fa.fa-bell | 🔔
| {{_ 'notifications'}} | {{_ 'notifications'}}
if currentSetting.customHelpLinkUrl if currentSetting.customHelpLinkUrl
li li
a(href="{{currentSetting.customHelpLinkUrl}}", title="{{_ 'help'}}", target="_blank", rel="noopener noreferrer") a(href="{{currentSetting.customHelpLinkUrl}}", title="{{_ 'help'}}", target="_blank", rel="noopener noreferrer")
i.fa.fa-question | ❓
| {{_ 'help'}} | {{_ 'help'}}
unless currentUser.isWorker unless currentUser.isWorker
ul.pop-over-list ul.pop-over-list
li li
a(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}") a(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}")
i.fa.fa-clone | 📋
| {{_ 'templates'}} | {{_ 'templates'}}
if currentUser.isAdmin if currentUser.isAdmin
li li
a.js-go-setting(href="{{pathFor 'setting'}}") a.js-go-setting(href="{{pathFor 'setting'}}")
i.fa.fa-lock | 🔒
| {{_ 'admin-panel'}} | {{_ 'admin-panel'}}
hr hr
if isSameDomainNameSettingValue if isSameDomainNameSettingValue
li li
a.js-invite-people a.js-invite-people
i.fa.fa-envelope | ✉️
| {{_ 'invite-people'}} | {{_ 'invite-people'}}
if isNotOAuth2AuthenticationMethod if isNotOAuth2AuthenticationMethod
li li
a.js-edit-profile a.js-edit-profile
i.fa.fa-user | 👤
| {{_ 'edit-profile'}} | {{_ 'edit-profile'}}
li li
a.js-change-settings a.js-change-settings
i.fa.fa-cog | ⚙️
| {{_ 'change-settings'}} | {{_ 'change-settings'}}
li li
a.js-change-avatar a.js-change-avatar
i.fa.fa-picture-o | 🖼️
| {{_ 'edit-avatar'}} | {{_ 'edit-avatar'}}
unless isSandstorm unless isSandstorm
if isNotOAuth2AuthenticationMethod if isNotOAuth2AuthenticationMethod
li li
a.js-change-password a.js-change-password
i.fa.fa-key | 🔑
| {{_ 'changePasswordPopup-title'}} | {{_ 'changePasswordPopup-title'}}
li li
a.js-change-language a.js-change-language
i.fa.fa-flag | 🏁
| {{_ 'changeLanguagePopup-title'}} | {{_ 'changeLanguagePopup-title'}}
//li //li
// a.js-support // a.js-support
// i.fa.fa-question-circle // -circle
// | {{_ 'support'}} // | {{_ 'support'}}
unless isSandstorm unless isSandstorm
hr hr
ul.pop-over-list ul.pop-over-list
li li
a.js-logout a.js-logout
i.fa.fa-sign-out | 🚪
| {{_ 'log-out'}} | {{_ 'log-out'}}
template(name="invitePeoplePopup") template(name="invitePeoplePopup")
@ -190,7 +190,7 @@ template(name="changeSettingsPopup")
| {{_ 'show-cards-minimum-count'}} | {{_ 'show-cards-minimum-count'}}
input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="-1") input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="-1")
label.bold.clear label.bold.clear
i.fa.fa-calendar | 📅
| {{_ 'start-day-of-week'}} | {{_ 'start-day-of-week'}}
select#start-day-of-week.inline-input.left select#start-day-of-week.inline-input.left
each day in weekDays startDayOfWeek each day in weekDays startDayOfWeek