mirror of
https://github.com/wekan/wekan.git
synced 2026-11-08 11:25:19 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c437c2048d | ||
|
|
f80fcfd7c0 | ||
|
|
e9670aa5cb | ||
|
|
164b6e9070 | ||
|
|
5af18809a7 | ||
|
|
a719e8fda1 | ||
|
|
50fa8a0743 | ||
|
|
9e160d2431 | ||
|
|
77cff95c07 | ||
|
|
b98a46b78c | ||
|
|
49e31707e5 | ||
|
|
92122e1fdd | ||
|
|
7238a65a6f | ||
|
|
e68ccf8532 | ||
|
|
362fd86dbf | ||
|
|
8aba58188d | ||
|
|
41848dd99e | ||
|
|
f2fcfd6a47 | ||
|
|
33cdb906e2 | ||
|
|
19e73009b1 | ||
|
|
401e256d84 | ||
|
|
e1cd87433a | ||
|
|
23e5e1e3bd | ||
|
|
8f19f043a1 | ||
|
|
b1f07149c0 | ||
|
|
17acf18848 | ||
|
|
f52f589f7d | ||
|
|
e3e25bc233 | ||
|
|
a2f2ce1135 | ||
|
|
90152ab9f5 | ||
|
|
7a25f542e8 | ||
|
|
8c57250243 | ||
|
|
2e1eb1e224 | ||
|
|
b9a15e68de | ||
|
|
a9d2e03b65 | ||
|
|
d84b04dc35 | ||
|
|
7f3f082557 | ||
|
|
c810c68923 | ||
|
|
865a585c7f | ||
|
|
8703dd4229 |
No files matched your search
+2
-1
@@ -83,7 +83,6 @@ mquandalle:moment
|
||||
msavin:usercache
|
||||
# Keep stylus in 1.1.0, because building v2 takes extra 52 minutes.
|
||||
coagmano:stylus@1.1.0!
|
||||
lucasantoniassi:accounts-lockout
|
||||
meteorhacks:subs-manager
|
||||
meteorhacks:picker
|
||||
lamhieu:unblock
|
||||
@@ -144,3 +143,5 @@ rajit:bootstrap3-datepicker-zh-tw
|
||||
staringatlights:fast-render
|
||||
spacebars
|
||||
easylogic:summernote
|
||||
pascoual:pdfkit
|
||||
wekan-accounts-lockout
|
||||
+6
-5
@@ -42,8 +42,8 @@ dynamic-import@0.6.0
|
||||
easylogic:summernote@0.8.8
|
||||
ecmascript@0.15.1
|
||||
ecmascript-runtime@0.7.0
|
||||
ecmascript-runtime-client@0.11.0
|
||||
ecmascript-runtime-server@0.10.0
|
||||
ecmascript-runtime-client@0.11.1
|
||||
ecmascript-runtime-server@0.10.1
|
||||
ejson@1.1.1
|
||||
email@2.0.0
|
||||
es5-shim@4.8.0
|
||||
@@ -71,7 +71,6 @@ launch-screen@1.2.1
|
||||
livedata@1.0.18
|
||||
localstorage@1.2.0
|
||||
logging@1.2.0
|
||||
lucasantoniassi:accounts-lockout@1.0.0
|
||||
matb33:collection-hooks@0.9.1
|
||||
matteodem:easy-search@1.6.4
|
||||
mdg:validation-error@0.5.1
|
||||
@@ -107,13 +106,14 @@ mquandalle:jquery-ui-drag-drop-sort@0.2.0
|
||||
mquandalle:moment@1.0.1
|
||||
mquandalle:mousetrap-bindglobal@0.0.1
|
||||
msavin:usercache@1.8.0
|
||||
npm-bcrypt@0.9.3
|
||||
npm-bcrypt@0.9.4
|
||||
npm-mongo@3.9.0
|
||||
oauth@1.3.2
|
||||
oauth2@1.3.0
|
||||
observe-sequence@1.0.16
|
||||
ongoworks:speakingurl@1.1.0
|
||||
ordered-dict@1.1.0
|
||||
pascoual:pdfkit@1.0.7
|
||||
peerlibrary:assert@0.3.0
|
||||
peerlibrary:base-component@0.16.0
|
||||
peerlibrary:blaze-components@0.15.1
|
||||
@@ -211,7 +211,7 @@ tracker@1.2.0
|
||||
twbs:bootstrap@3.3.6
|
||||
ui@1.0.13
|
||||
underscore@1.0.10
|
||||
url@1.3.1
|
||||
url@1.3.2
|
||||
useraccounts:core@1.14.2
|
||||
useraccounts:flow-routing@1.14.2
|
||||
useraccounts:unstyled@1.14.2
|
||||
@@ -219,6 +219,7 @@ verron:autosize@3.0.8
|
||||
webapp@1.10.1
|
||||
webapp-hashing@1.1.0
|
||||
wekan-accounts-cas@0.1.0
|
||||
wekan-accounts-lockout@1.0.0
|
||||
wekan-accounts-oidc@1.0.10
|
||||
wekan-cfs-access-point@0.1.50
|
||||
wekan-cfs-base-package@0.0.30
|
||||
|
||||
@@ -1,5 +1,51 @@
|
||||
[Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac)
|
||||
|
||||
# v5.35 2021-06-14 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- Wait Spinners can now be translated
|
||||
[Part 1](https://github.com/wekan/wekan/commit/8703dd42296d531450eb21a3d3adea17558a8500),
|
||||
[Part 1](https://github.com/wekan/wekan/commit/7f3f0825573b1f8a7b0388e4bacbb0bd2525e886).
|
||||
Added Wait Spinners docs: https://github.com/wekan/wekan/wiki/Wait-Spinners .
|
||||
Thanks to xet7.
|
||||
- Maximize Card.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/8c572502436a2eb22bd1eb1e4069c1c9145e2070),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/3863).
|
||||
Thanks to mfilser and xet7.
|
||||
- Export Card to PDF. In Progress, does not work yet.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/a2f2ce11354a8dbfdd6759e3b65797e4be4cc6ec),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/17acf1884850d8d95ae79493289adf18966df652).
|
||||
Thanks to xet7.
|
||||
|
||||
and removes some not needed files:
|
||||
|
||||
- [Reduced Wekan bundle size from 636 MB to 467 MB by deleting all dependencies of lucasantoniassi:accounts-lockout and including
|
||||
only required 10 files](https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d).
|
||||
Wekan Docker image size changed from 269.6 MB to 165.1 MB.
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following improvements:
|
||||
|
||||
- [Add border and update label colors for better visibility](https://github.com/wekan/wekan/commit/2e1eb1e224c83f16a384316626d7a4183639d4cd).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/f80fcfd7c0a83f4181c7a0b8beb52da9ba1446d3).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Manual sort number 0 accepted](https://github.com/wekan/wekan/pull/3861).
|
||||
Thanks to mfilser.
|
||||
- Allow board members to use more of API. Please add issue (or pull request) if this allows too much.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/a719e8fda1f78bcbf9af6e7b4341f8be1d141e90),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/164b6e9070199dca36d12fa3048d6b22bf6850b0).
|
||||
Thanks to JayVii and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v5.34 2021-06-11 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v5.34.0"
|
||||
appVersion: "v5.35.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -54,6 +54,10 @@ BlazeComponent.extendComponent({
|
||||
return Meteor.user().hasHiddenSystemMessages();
|
||||
},
|
||||
|
||||
cardMaximized() {
|
||||
return Meteor.user().hasCardMaximized();
|
||||
},
|
||||
|
||||
canModifyCard() {
|
||||
return (
|
||||
Meteor.user() &&
|
||||
@@ -366,7 +370,7 @@ BlazeComponent.extendComponent({
|
||||
const sort = parseFloat(this.currentComponent()
|
||||
.getValue()
|
||||
.trim());
|
||||
if (sort) {
|
||||
if (!Number.isNaN(sort)) {
|
||||
let card = this.data();
|
||||
card.move(card.boardId, card.swimlaneId, card.listId, sort);
|
||||
}
|
||||
@@ -408,6 +412,14 @@ BlazeComponent.extendComponent({
|
||||
'click #toggleButton'() {
|
||||
Meteor.call('toggleSystemMessages');
|
||||
},
|
||||
'click .js-maximize-card-details'() {
|
||||
Meteor.call('toggleCardMaximized');
|
||||
autosize($('.card-details'));
|
||||
},
|
||||
'click .js-minimize-card-details'() {
|
||||
Meteor.call('toggleCardMaximized');
|
||||
autosize($('.card-details'));
|
||||
},
|
||||
'click .js-vote'(e) {
|
||||
const forIt = $(e.target).hasClass('js-vote-positive');
|
||||
let newState = null;
|
||||
@@ -499,9 +511,38 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('cardDetails');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
template() {
|
||||
return 'exportCard';
|
||||
},
|
||||
withApi() {
|
||||
return Template.instance().apiEnabled.get();
|
||||
},
|
||||
exportUrlCardPDF() {
|
||||
const params = {
|
||||
boardId: Session.get('currentBoard'),
|
||||
listId: this.listId,
|
||||
cardId: this.cardId,
|
||||
};
|
||||
const queryParams = {
|
||||
authToken: Accounts._storedLoginToken(),
|
||||
};
|
||||
return FlowRouter.path(
|
||||
'/api/boards/:boardId/lists/:listId/cards/:cardId/exportPDF',
|
||||
params,
|
||||
queryParams,
|
||||
);
|
||||
},
|
||||
exportFilenameCardPDF() {
|
||||
//const boardId = Session.get('currentBoard');
|
||||
//return `export-card-pdf-${boardId}.xlsx`;
|
||||
return `export-card.pdf`;
|
||||
},
|
||||
}).register('exportCardPopup');
|
||||
|
||||
// only allow number input
|
||||
Template.editCardSortOrderForm.onRendered(function() {
|
||||
this.$('input').on("keypress paste", function() {
|
||||
this.$('input').on("keypress paste", function(event) {
|
||||
let keyCode = event.keyCode;
|
||||
let charCode = String.fromCharCode(keyCode);
|
||||
let regex = new RegExp('[-0-9.]');
|
||||
@@ -571,6 +612,7 @@ Template.cardDetailsActionsPopup.helpers({
|
||||
});
|
||||
|
||||
Template.cardDetailsActionsPopup.events({
|
||||
'click .js-export-card': Popup.open('exportCard'),
|
||||
'click .js-members': Popup.open('cardMembers'),
|
||||
'click .js-assignees': Popup.open('cardAssignees'),
|
||||
'click .js-labels': Popup.open('cardLabels'),
|
||||
|
||||
@@ -110,11 +110,13 @@ avatar-radius = 50%
|
||||
|
||||
.card-details-header
|
||||
margin: 0 -20px 5px
|
||||
padding 7px 20px
|
||||
padding: 7px 20px
|
||||
background: darken(white, 7%)
|
||||
border-bottom: 1px solid darken(white, 14%)
|
||||
|
||||
.close-card-details,
|
||||
.maximize-card-details,
|
||||
.minimize-card-details,
|
||||
.card-details-menu,
|
||||
.card-copy-button,
|
||||
.card-copy-mobile-button,
|
||||
@@ -122,9 +124,11 @@ avatar-radius = 50%
|
||||
.card-details-menu-mobile-web
|
||||
float: right
|
||||
|
||||
.close-card-details
|
||||
.close-card-details,
|
||||
.maximize-card-details,
|
||||
.minimize-card-details
|
||||
font-size: 24px
|
||||
padding: 5px
|
||||
padding: 5px 10px 5px 10px
|
||||
margin-right: -8px
|
||||
|
||||
.close-card-details-mobile-web
|
||||
@@ -233,6 +237,43 @@ avatar-radius = 50%
|
||||
.activities
|
||||
padding-top: 10px
|
||||
|
||||
.card-details-maximized
|
||||
padding: 0
|
||||
flex-shrink: 0
|
||||
flex-basis: calc(100% - 20px)
|
||||
will-change: flex-basis
|
||||
overflow-y: scroll
|
||||
overflow-x: scroll
|
||||
background: darken(white, 3%)
|
||||
border-radius: bottom 3px
|
||||
z-index: 1000 !important
|
||||
animation: flexGrowIn 0.1s
|
||||
box-shadow: 0 0 7px 0 darken(white, 30%)
|
||||
transition: flex-basis 0.1s
|
||||
box-sizing: border-box
|
||||
position: absolute
|
||||
top: 0
|
||||
left: 0
|
||||
height: calc(100% - 20px)
|
||||
width: calc(100% - 20px)
|
||||
float: left
|
||||
|
||||
.card-details-left
|
||||
position: absolute
|
||||
float: left
|
||||
top: 60px
|
||||
left: 20px
|
||||
width: 47%
|
||||
|
||||
.card-details-right
|
||||
position: absolute
|
||||
float: right
|
||||
top: 20px
|
||||
left: 50%
|
||||
|
||||
.card-details-header
|
||||
width: 47%
|
||||
|
||||
input[type="text"].attachment-add-link-input
|
||||
float: left
|
||||
margin: 0 0 8px
|
||||
@@ -260,7 +301,13 @@ input[type="submit"].attachment-add-link-submit
|
||||
margin-right: 0px
|
||||
|
||||
.card-details-menu
|
||||
margin-right: 10px
|
||||
margin-right: 40px
|
||||
|
||||
.maximize-card-details
|
||||
margin-right: 40px
|
||||
|
||||
.minimize-card-details
|
||||
margin-right: 40px
|
||||
|
||||
card-details-color(background, color...)
|
||||
background: background !important
|
||||
|
||||
@@ -44,9 +44,20 @@
|
||||
align-items: center
|
||||
justify-content: center
|
||||
|
||||
.card-label-white
|
||||
background-color: #ffffff
|
||||
color: #000000 //Black text for better visibility
|
||||
border: 1px solid #c0c0c0
|
||||
|
||||
.card-label-white:hover
|
||||
color: #aaaaaa //grey text for better visibility
|
||||
|
||||
.card-label-green
|
||||
background-color: #3cb500
|
||||
|
||||
.card-label-green:hover
|
||||
color: #000000 //Black hover text for better visibility
|
||||
|
||||
.card-label-yellow
|
||||
background-color: #fad900
|
||||
color: #000000 //Black text for better visibility
|
||||
|
||||
@@ -86,7 +86,7 @@ select
|
||||
margin-bottom: 8px
|
||||
|
||||
&.inline
|
||||
width: 100%
|
||||
width: 100%
|
||||
|
||||
option[disabled]
|
||||
color: #8c8c8c
|
||||
|
||||
@@ -230,6 +230,6 @@ template(name='selectSpinnerName')
|
||||
select#spinnerName
|
||||
each spinner in spinners
|
||||
if isSelected spinner
|
||||
option(value="{{spinner}}" selected) {{spinner}}
|
||||
option(value="{{spinner}}" selected) {{_ spinner}}
|
||||
else
|
||||
option(value="{{spinner}}") {{spinner}}
|
||||
option(value="{{spinner}}") {{_ spinner}}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Експортиране на Табло",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Сортирай",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exporta tauler",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+36
-22
@@ -82,8 +82,8 @@
|
||||
"add-attachment": "Přidat přílohu",
|
||||
"add-board": "Přidat tablo",
|
||||
"add-card": "Přidat kartu",
|
||||
"add-card-to-top-of-list": "Add Card to Top of List",
|
||||
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
|
||||
"add-card-to-top-of-list": "Přidat kartu na začátek seznamu",
|
||||
"add-card-to-bottom-of-list": "Přidat kartu na konec seznamu",
|
||||
"add-swimlane": "Přidat Swimlane",
|
||||
"add-subtask": "Přidat Podúkol",
|
||||
"add-checklist": "Přidat zaškrtávací seznam",
|
||||
@@ -133,7 +133,7 @@
|
||||
"board-not-found": "Tablo nenalezeno",
|
||||
"board-private-info": "Toto tablo bude <strong>soukromé</strong>.",
|
||||
"board-public-info": "Toto tablo bude <strong>veřejné</strong>.",
|
||||
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
|
||||
"board-drag-drop-reorder-or-click-open": "Přetažením změníte pořadí ikon tabel. Kliknutím otevřete tablo.",
|
||||
"boardChangeColorPopup-title": "Změnit pozadí tabla",
|
||||
"boardChangeTitlePopup-title": "Přejmenovat tablo",
|
||||
"boardChangeVisibilityPopup-title": "Upravit viditelnost",
|
||||
@@ -181,10 +181,10 @@
|
||||
"vote-against": "proti",
|
||||
"deleteVotePopup-title": "Smazat hlas?",
|
||||
"vote-delete-pop": "Smazání je nevratné. Ztratíte vše spojené s tímto hlasováním.",
|
||||
"cardStartPlanningPokerPopup-title": "Start a Planning Poker",
|
||||
"card-edit-planning-poker": "Edit Planning Poker",
|
||||
"editPokerEndDatePopup-title": "Change Planning Poker vote end date",
|
||||
"poker-question": "Planning Poker",
|
||||
"cardStartPlanningPokerPopup-title": "Zahájit plánovací poker",
|
||||
"card-edit-planning-poker": "Upravit plánovací poker",
|
||||
"editPokerEndDatePopup-title": "Změnit datum konce plánovacího pokeru",
|
||||
"poker-question": "Plánovací poker",
|
||||
"poker-one": "1",
|
||||
"poker-two": "2",
|
||||
"poker-three": "3",
|
||||
@@ -195,13 +195,13 @@
|
||||
"poker-forty": "40",
|
||||
"poker-oneHundred": "100",
|
||||
"poker-unsure": "?",
|
||||
"poker-finish": "Finish",
|
||||
"poker-result-votes": "Votes",
|
||||
"poker-result-who": "Who",
|
||||
"poker-replay": "Replay",
|
||||
"set-estimation": "Set Estimation",
|
||||
"deletePokerPopup-title": "Delete planning poker?",
|
||||
"poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.",
|
||||
"poker-finish": "Hotovo",
|
||||
"poker-result-votes": "Hlasů",
|
||||
"poker-result-who": "Kdo",
|
||||
"poker-replay": "Zopakovat",
|
||||
"set-estimation": "Nastavit odhad",
|
||||
"deletePokerPopup-title": "Smazat plánovací poker?",
|
||||
"poker-delete-pop": "Smazání je trvalé. Přijdete o všechny akce asociované s tímto plánovacím pokerem.",
|
||||
"cardDeletePopup-title": "Smazat kartu?",
|
||||
"cardDetailsActionsPopup-title": "Akce karty",
|
||||
"cardLabelsPopup-title": "Štítky",
|
||||
@@ -233,7 +233,7 @@
|
||||
"close": "Zavřít",
|
||||
"close-board": "Zavřít tablo",
|
||||
"close-board-pop": "Budete moci obnovit tablo kliknutím na tlačítko \"Archiv\" v hlavním menu.",
|
||||
"close-card": "Close Card",
|
||||
"close-card": "Zavřít kartu",
|
||||
"color-black": "černá",
|
||||
"color-blue": "modrá",
|
||||
"color-crimson": "karmínová",
|
||||
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exportovat tablo do Excelu",
|
||||
"user-can-not-export-excel": "Uživatel nemůže exportovat do Excelu",
|
||||
"export-board-html": "Exportovat tablo do HTML",
|
||||
"export-card": "Exportovat kartu",
|
||||
"export-card-pdf": "Exportovat kartu do PDF",
|
||||
"user-can-not-export-card-to-pdf": "Uživatel nemůže exportovat kartu do PDF",
|
||||
"exportBoardPopup-title": "Exportovat tablo",
|
||||
"exportCardPopup-title": "Exportovat kartu",
|
||||
"sort": "řadit",
|
||||
"sort-desc": "Kliknout pro třídění seznamu",
|
||||
"list-sort-by": "řadit seznam podle",
|
||||
@@ -447,8 +451,8 @@
|
||||
"set-color-list": "Nastavit barvu",
|
||||
"listActionPopup-title": "Vypsat akce",
|
||||
"settingsUserPopup-title": "Nastavení uživatele",
|
||||
"settingsTeamPopup-title": "Team Settings",
|
||||
"settingsOrgPopup-title": "Organization Settings",
|
||||
"settingsTeamPopup-title": "Nastavení týmu",
|
||||
"settingsOrgPopup-title": "Nastavení organizace",
|
||||
"swimlaneActionPopup-title": "Akce swimlane",
|
||||
"swimlaneAddPopup-title": "Přidat swimlane dolů",
|
||||
"listImportCardPopup-title": "Importovat Trello kartu",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Vyber barvu",
|
||||
"assigned-by": "Přidělil(a)",
|
||||
"requested-by": "Vyžádal(a)",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Řazení karet podle čísla",
|
||||
"board-delete-notice": "Smazání je trvalé. Přijdete o všechny sloupce, karty a akce spojené s tímto tablem.",
|
||||
"delete-board-confirm-popup": "Všechny sloupce, štítky a aktivity budou smazány a obsah tabla nebude možné obnovit. Toto nelze vrátit zpět.",
|
||||
"boardDeletePopup-title": "Smazat tablo?",
|
||||
@@ -846,8 +850,8 @@
|
||||
"act-duenow": "připomínal(a), že stávající termín dokončení (__timeValue__) __card__ je teď",
|
||||
"act-atUserComment": "Byli jste zmíněni v [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "Jste si jisti, že chcete smazat tento účet? Tuto akci nelze vrátit zpět.",
|
||||
"delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
|
||||
"delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
|
||||
"delete-team-confirm-popup": "Jste si jisti, že chcete smazat tento tým? Tuto akci nelze vrátit zpět.",
|
||||
"delete-org-confirm-popup": "Jste si jisti, že chcete smazat tuto organizaci? Tuto akci nelze vrátit zpět.",
|
||||
"accounts-allowUserDelete": "Dovolit uživatelům smazat vlastní účet",
|
||||
"hide-minicard-label-text": "Skrýt text popisku minikarty",
|
||||
"show-desktop-drag-handles": "Zobrazit okraje pro přesun plochy",
|
||||
@@ -1038,6 +1042,16 @@
|
||||
"rulesReportTitle": "Report pravidel",
|
||||
"copy-swimlane": "Kopírovat dráhu",
|
||||
"copySwimlanePopup-title": "Kopírovat dráhu",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"display-card-creator": "Zobrazovat tvůrce karet",
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximalizovat kartu",
|
||||
"minimize-card": "Minimalizovat kartu"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Eksportér tavle til HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Eksportér tavle",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sortér",
|
||||
"sort-desc": "Klik for at sortere listen",
|
||||
"list-sort-by": "Sortér listen efter:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+27
-13
@@ -82,8 +82,8 @@
|
||||
"add-attachment": "Datei anhängen",
|
||||
"add-board": "Board hinzufügen",
|
||||
"add-card": "Karte hinzufügen",
|
||||
"add-card-to-top-of-list": "Add Card to Top of List",
|
||||
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
|
||||
"add-card-to-top-of-list": "Karte am Anfang der Liste hinzufügen",
|
||||
"add-card-to-bottom-of-list": "Karte am Ende der Liste hinzufügen",
|
||||
"add-swimlane": "Swimlane hinzufügen",
|
||||
"add-subtask": "Teilaufgabe hinzufügen",
|
||||
"add-checklist": "Checkliste hinzufügen",
|
||||
@@ -133,7 +133,7 @@
|
||||
"board-not-found": "Board nicht gefunden",
|
||||
"board-private-info": "Dieses Board wird <strong>privat</strong> sein.",
|
||||
"board-public-info": "Dieses Board wird <strong>öffentlich zugänglich</strong> sein.",
|
||||
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
|
||||
"board-drag-drop-reorder-or-click-open": "Ziehen und Fallenlassen um die Board-Icons neu anzuordnen. Ein Klick auf das Board-Icon öffnet das zugehörige Board.",
|
||||
"boardChangeColorPopup-title": "Farbe des Boards ändern",
|
||||
"boardChangeTitlePopup-title": "Board umbenennen",
|
||||
"boardChangeVisibilityPopup-title": "Sichtbarkeit ändern",
|
||||
@@ -159,7 +159,7 @@
|
||||
"card-due-on": "fällig am",
|
||||
"card-spent": "Aufgewendete Zeit",
|
||||
"card-edit-attachments": "Anhänge ändern",
|
||||
"card-edit-custom-fields": "Benutzerdefinierte Felder editieren",
|
||||
"card-edit-custom-fields": "Benutzerdefinierte Felder bearbeiten",
|
||||
"card-edit-labels": "Labels ändern",
|
||||
"card-edit-members": "Mitglieder ändern",
|
||||
"card-labels-title": "Labels für diese Karte ändern.",
|
||||
@@ -168,11 +168,11 @@
|
||||
"card-start-on": "Start am",
|
||||
"cardAttachmentsPopup-title": "Anhängen von",
|
||||
"cardCustomField-datePopup-title": "Datum ändern",
|
||||
"cardCustomFieldsPopup-title": "Benutzerdefinierte Felder editieren",
|
||||
"cardCustomFieldsPopup-title": "Benutzerdefinierte Felder bearbeiten",
|
||||
"cardStartVotingPopup-title": "Abstimmung starten",
|
||||
"positiveVoteMembersPopup-title": "Befürworter",
|
||||
"negativeVoteMembersPopup-title": "Gegner",
|
||||
"card-edit-voting": "Abstimmung editieren",
|
||||
"card-edit-voting": "Abstimmung bearbeiten",
|
||||
"editVoteEndDatePopup-title": "Enddatum der Abstimmung ändern",
|
||||
"allowNonBoardMembers": "Alle eingeloggte Nutzer erlauben",
|
||||
"vote-question": "Abstimmen über",
|
||||
@@ -233,7 +233,7 @@
|
||||
"close": "Schliessen",
|
||||
"close-board": "Board schliessen",
|
||||
"close-board-pop": "Sie können das Board wiederherstellen, indem Sie die Schaltfläche \"Archiv\" in der Kopfzeile der Startseite anklicken.",
|
||||
"close-card": "Close Card",
|
||||
"close-card": "Karte schliessen",
|
||||
"color-black": "schwarz",
|
||||
"color-blue": "blau",
|
||||
"color-crimson": "Karminrot",
|
||||
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Board nach Excel exportieren",
|
||||
"user-can-not-export-excel": "Benutzer kann nicht nach Excel exportieren",
|
||||
"export-board-html": "Board als HTML exportieren",
|
||||
"export-card": "Karte exportieren",
|
||||
"export-card-pdf": "Karte als PDF exportieren",
|
||||
"user-can-not-export-card-to-pdf": "Der Benutzer kann die Karte nicht als PDF exportieren",
|
||||
"exportBoardPopup-title": "Board exportieren",
|
||||
"exportCardPopup-title": "Karte exportieren",
|
||||
"sort": "Sortieren",
|
||||
"sort-desc": "Zum Sortieren der Liste klicken",
|
||||
"list-sort-by": "Sortieren der Liste nach:",
|
||||
@@ -447,8 +451,8 @@
|
||||
"set-color-list": "Lege Farbe fest",
|
||||
"listActionPopup-title": "Listenaktionen",
|
||||
"settingsUserPopup-title": "Benutzereinstellungen",
|
||||
"settingsTeamPopup-title": "Team Settings",
|
||||
"settingsOrgPopup-title": "Organization Settings",
|
||||
"settingsTeamPopup-title": "Team-Einstellungen",
|
||||
"settingsOrgPopup-title": "Organisations-Einstellungen",
|
||||
"swimlaneActionPopup-title": "Swimlaneaktionen",
|
||||
"swimlaneAddPopup-title": "Swimlane unterhalb einfügen",
|
||||
"listImportCardPopup-title": "Eine Trello-Karte importieren",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Farbe wählen",
|
||||
"assigned-by": "Zugewiesen von",
|
||||
"requested-by": "Angefordert von",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Karten nach Nummer sortieren",
|
||||
"board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.",
|
||||
"delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.",
|
||||
"boardDeletePopup-title": "Board löschen?",
|
||||
@@ -846,8 +850,8 @@
|
||||
"act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt",
|
||||
"act-atUserComment": "Sie wurden in [__board__] __list__/__card__ erwähnt",
|
||||
"delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.",
|
||||
"delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
|
||||
"delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
|
||||
"delete-team-confirm-popup": "Sind Sie sicher, dass Sie dieses Team löschen möchten? Es gibt kein Zurück!",
|
||||
"delete-org-confirm-popup": "Sind Sie sicher, dass Sie diese Organisation löschen möchten? Es gibt kein Zurück!",
|
||||
"accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen",
|
||||
"hide-minicard-label-text": "Labeltext auf Minikarte ausblenden",
|
||||
"show-desktop-drag-handles": "Desktop-Ziehpunkte anzeigen",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Swimlane kopieren",
|
||||
"copySwimlanePopup-title": "Swimlane kopieren",
|
||||
"display-card-creator": "Zeige Karten-Erstellung",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Karte maximieren",
|
||||
"minimize-card": "Karte minimieren"
|
||||
}
|
||||
+36
-22
@@ -82,8 +82,8 @@
|
||||
"add-attachment": "Datei anhängen",
|
||||
"add-board": "neues Board",
|
||||
"add-card": "Karte hinzufügen",
|
||||
"add-card-to-top-of-list": "Add Card to Top of List",
|
||||
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
|
||||
"add-card-to-top-of-list": "Karte am Anfang der Liste hinzufügen",
|
||||
"add-card-to-bottom-of-list": "Karte am Ende der Liste hinzufügen",
|
||||
"add-swimlane": "Swimlane hinzufügen",
|
||||
"add-subtask": "Teilaufgabe hinzufügen",
|
||||
"add-checklist": "Checkliste hinzufügen",
|
||||
@@ -133,7 +133,7 @@
|
||||
"board-not-found": "Board nicht gefunden",
|
||||
"board-private-info": "Dieses Board wird <strong>privat</strong> sein.",
|
||||
"board-public-info": "Dieses Board wird <strong>öffentlich</strong> sein.",
|
||||
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
|
||||
"board-drag-drop-reorder-or-click-open": "Benutze Drag-and-Drop, um Board-Icons neu anzuordnen. Klicke auf ein Board-Icon, um das Board zu öffnen.",
|
||||
"boardChangeColorPopup-title": "Farbe des Boards ändern",
|
||||
"boardChangeTitlePopup-title": "Board umbenennen",
|
||||
"boardChangeVisibilityPopup-title": "Sichtbarkeit ändern",
|
||||
@@ -181,10 +181,10 @@
|
||||
"vote-against": "Dagegen",
|
||||
"deleteVotePopup-title": "Wahl löschen?",
|
||||
"vote-delete-pop": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.",
|
||||
"cardStartPlanningPokerPopup-title": "Start a Planning Poker",
|
||||
"card-edit-planning-poker": "Edit Planning Poker",
|
||||
"editPokerEndDatePopup-title": "Change Planning Poker vote end date",
|
||||
"poker-question": "Planning Poker",
|
||||
"cardStartPlanningPokerPopup-title": "Planungspoker starten",
|
||||
"card-edit-planning-poker": "Planungspoker ändern",
|
||||
"editPokerEndDatePopup-title": "Enddatum für Planungspoker-Stimme ändern",
|
||||
"poker-question": "Planungspoker",
|
||||
"poker-one": "1",
|
||||
"poker-two": "2",
|
||||
"poker-three": "3",
|
||||
@@ -195,13 +195,13 @@
|
||||
"poker-forty": "40",
|
||||
"poker-oneHundred": "100",
|
||||
"poker-unsure": "?",
|
||||
"poker-finish": "Finish",
|
||||
"poker-result-votes": "Votes",
|
||||
"poker-result-who": "Who",
|
||||
"poker-replay": "Replay",
|
||||
"set-estimation": "Set Estimation",
|
||||
"deletePokerPopup-title": "Delete planning poker?",
|
||||
"poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.",
|
||||
"poker-finish": "Beenden",
|
||||
"poker-result-votes": "Werte",
|
||||
"poker-result-who": "Wer",
|
||||
"poker-replay": "Wiederholen",
|
||||
"set-estimation": "Schätzung vornehmen",
|
||||
"deletePokerPopup-title": "Planungspoker löschen?",
|
||||
"poker-delete-pop": "Die Löschung ist permanent. Sie werden alles im Zusammenhang mit diesem Planungspoker verlieren.",
|
||||
"cardDeletePopup-title": "Karte löschen?",
|
||||
"cardDetailsActionsPopup-title": "Kartenaktionen",
|
||||
"cardLabelsPopup-title": "Labels",
|
||||
@@ -233,7 +233,7 @@
|
||||
"close": "Schließen",
|
||||
"close-board": "Board schließen",
|
||||
"close-board-pop": "Sie können das Board wiederherstellen, indem Sie die Schaltfläche \"Archiv\" in der Kopfzeile der Startseite anklicken.",
|
||||
"close-card": "Close Card",
|
||||
"close-card": "Karte schließen",
|
||||
"color-black": "schwarz",
|
||||
"color-blue": "blau",
|
||||
"color-crimson": "Karminrot",
|
||||
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Board nach Excel exportieren",
|
||||
"user-can-not-export-excel": "Benutzer kann nicht nach Excel exportieren",
|
||||
"export-board-html": "Board als HTML exportieren",
|
||||
"export-card": "Karte exportieren",
|
||||
"export-card-pdf": "Karte in ein PDF exportieren",
|
||||
"user-can-not-export-card-to-pdf": "Benutzer kann Karte nicht in ein PDF exportieren",
|
||||
"exportBoardPopup-title": "Board exportieren",
|
||||
"exportCardPopup-title": "Karte exportieren",
|
||||
"sort": "Sortieren",
|
||||
"sort-desc": "Zum Sortieren der Liste klicken",
|
||||
"list-sort-by": "Sortieren der Liste nach:",
|
||||
@@ -447,8 +451,8 @@
|
||||
"set-color-list": "Lege Farbe fest",
|
||||
"listActionPopup-title": "Listenaktionen",
|
||||
"settingsUserPopup-title": "Benutzereinstellungen",
|
||||
"settingsTeamPopup-title": "Team Settings",
|
||||
"settingsOrgPopup-title": "Organization Settings",
|
||||
"settingsTeamPopup-title": "Team-Einstellungen",
|
||||
"settingsOrgPopup-title": "Organisations-Einstellungen",
|
||||
"swimlaneActionPopup-title": "Swimlaneaktionen",
|
||||
"swimlaneAddPopup-title": "Swimlane unterhalb einfügen",
|
||||
"listImportCardPopup-title": "Eine Trello-Karte importieren",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Farbe wählen",
|
||||
"assigned-by": "Zugewiesen von",
|
||||
"requested-by": "Angefordert von",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Kartensortierung nach Nummer",
|
||||
"board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.",
|
||||
"delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.",
|
||||
"boardDeletePopup-title": "Board löschen?",
|
||||
@@ -846,8 +850,8 @@
|
||||
"act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt",
|
||||
"act-atUserComment": "Sie wurden in [__board__] __list__/__card__ erwähnt",
|
||||
"delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.",
|
||||
"delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
|
||||
"delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
|
||||
"delete-team-confirm-popup": "Sind Sie sicher, daß Sie dieses Team löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.",
|
||||
"delete-org-confirm-popup": "Sind Sie sicher, daß Sie diese Organisation löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.",
|
||||
"accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen",
|
||||
"hide-minicard-label-text": "Labeltext auf Minikarte ausblenden",
|
||||
"show-desktop-drag-handles": "Desktop-Ziehpunkte anzeigen",
|
||||
@@ -1038,6 +1042,16 @@
|
||||
"rulesReportTitle": "Regeln-Bericht",
|
||||
"copy-swimlane": "Kopiere Swimlane",
|
||||
"copySwimlanePopup-title": "Swimlane kopieren",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"display-card-creator": "Karten-Ersteller anzeigen",
|
||||
"wait-spinner": "Warte-Symbol",
|
||||
"Bounce": "Puls-Warte-Symbol",
|
||||
"Cube": "Würfel-Warte-Symbol",
|
||||
"Cube-Grid": "Würfel-Gitter-Warte-Symbol",
|
||||
"Dot": "Punkt-Warte-Symbol",
|
||||
"Double-Bounce": "Doppelpuls-Warte-Symbol",
|
||||
"Rotateplane": "Drehscheibe-Warte-Symbol",
|
||||
"Scaleout": "Scaleout-Warte-Symbol",
|
||||
"Wave": "Wellen-Warte-Symbol",
|
||||
"maximize-card": "Karte maximieren",
|
||||
"minimize-card": "Karte minimieren"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Εξαγωγή πίνακα σε Excel",
|
||||
"user-can-not-export-excel": "Ο χρήστης δε μπορεί να εξάγει σε Excel",
|
||||
"export-board-html": "Εξαγωγή πίνακα σε HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Εξαγωγή πίνακα",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Ταξινόμηση",
|
||||
"sort-desc": "Κάντε κλικ για να ταξινομήστε τη λίστα",
|
||||
"list-sort-by": "Ταξινόμηση λίστας βάσει:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1040,5 +1044,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar tablero",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar el tablero",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Click para ordenar la lista",
|
||||
"list-sort-by": "Ordenar la lista por:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Exportar tablero a HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar tablero",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Clic para ordenar lista",
|
||||
"list-sort-by": "Ordenar la lista por:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exportar tablero a Excel",
|
||||
"user-can-not-export-excel": "El usuario no puede exportar Excel",
|
||||
"export-board-html": "Exportar tablero a HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar el tablero",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Click para ordenar la lista",
|
||||
"list-sort-by": "Ordenar la lista por:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Esportatu arbela",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "خروجی برد به اکسل",
|
||||
"user-can-not-export-excel": "کاربر قادر به گرفتن خروجی اکسلب نیست",
|
||||
"export-board-html": "اکسپورت برد به HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "انتقال به بیرون برد",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "مرتب سازی",
|
||||
"sort-desc": "برای مرتب سازی لیست کلیک کنید",
|
||||
"list-sort-by": "مرتب سازی لیست بر اساس:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "کپی از مسیر",
|
||||
"copySwimlanePopup-title": "کپی از مسیر",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Vie taulu Excel",
|
||||
"user-can-not-export-excel": "Käyttäjä ei voi viedä Excel tiedostoon",
|
||||
"export-board-html": "Vie taulu HTML",
|
||||
"export-card": "Vie kortti",
|
||||
"export-card-pdf": "Vie kortti PDF",
|
||||
"user-can-not-export-card-to-pdf": "Käyttäjä ei voi viedä korttia PDF tiedostoon",
|
||||
"exportBoardPopup-title": "Vie taulu",
|
||||
"exportCardPopup-title": "Vie kortti",
|
||||
"sort": "Lajittele",
|
||||
"sort-desc": "Klikkaa lajitellaksesi listan",
|
||||
"list-sort-by": "Lajittele lista:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Kopioi Swimlane",
|
||||
"copySwimlanePopup-title": "Kopioi Swimlane",
|
||||
"display-card-creator": "Näytä kortin luoja",
|
||||
"wait-spinner": "Odotus pyörijä"
|
||||
"wait-spinner": "Odotus pyörijä",
|
||||
"Bounce": "Pomppu odotus pyörijä",
|
||||
"Cube": "Kuutio odotus pyörijä",
|
||||
"Cube-Grid": "Kuutio ristikko odotus pyörijä",
|
||||
"Dot": "Piste odotus pyörijä",
|
||||
"Double-Bounce": "Tupla pomppu odotus pyörijä",
|
||||
"Rotateplane": "Pyöritä tasoa odotus pyörijä",
|
||||
"Scaleout": "Skaalaus ulos odotus pyörijä",
|
||||
"Wave": "Aalto odotus pyörijä",
|
||||
"maximize-card": "Suurenna kortti",
|
||||
"minimize-card": "Pienennä kortti"
|
||||
}
|
||||
+16
-2
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exporter le tableau vers Excel",
|
||||
"user-can-not-export-excel": "L'utilisateur ne peut pas exporter vers Excel",
|
||||
"export-board-html": "Exporter le tableau en HTML",
|
||||
"export-card": "Exporter la carte",
|
||||
"export-card-pdf": "Exporter la carte en PDF",
|
||||
"user-can-not-export-card-to-pdf": "L'utilisateur ne peut pas exporter de carte en PDF",
|
||||
"exportBoardPopup-title": "Exporter le tableau",
|
||||
"exportCardPopup-title": "Exporter la carte",
|
||||
"sort": "Tri",
|
||||
"sort-desc": "Cliquez pour trier la liste",
|
||||
"list-sort-by": "Trier la liste par:",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Choisissez une couleur",
|
||||
"assigned-by": "Assigné par",
|
||||
"requested-by": "Demandé par",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Tri numérique des cartes",
|
||||
"board-delete-notice": "La suppression est définitive. Vous perdrez toutes les listes, cartes et actions associées à ce tableau.",
|
||||
"delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Il n'y a pas d'annulation possible.",
|
||||
"boardDeletePopup-title": "Supprimer le tableau ?",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copier le couloir",
|
||||
"copySwimlanePopup-title": "Copie de Couloir",
|
||||
"display-card-creator": "Afficher le créateur de la carte",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Icône d'attente",
|
||||
"Bounce": "Icône d'attente rebond",
|
||||
"Cube": "Icône d'attente cube",
|
||||
"Cube-Grid": "Icône d'attente cube filaire",
|
||||
"Dot": "Icône d'attente point",
|
||||
"Double-Bounce": "Icône d'attente double rebond",
|
||||
"Rotateplane": "Icône d'attente plan rotatif",
|
||||
"Scaleout": "Icône d'attente mise à l'échelle",
|
||||
"Wave": "Icône d'attente onde",
|
||||
"maximize-card": "Maximiser la carte",
|
||||
"minimize-card": "Minimiser la carte"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar taboleiro",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "ייצוא לוח ל־Excel",
|
||||
"user-can-not-export-excel": "המשתמש לא יכול לייצא ל־Excel",
|
||||
"export-board-html": "ייצוא לוח ל־HTML",
|
||||
"export-card": "ייצוא כרטיס",
|
||||
"export-card-pdf": "ייצוא כרטיס ל־PDF",
|
||||
"user-can-not-export-card-to-pdf": "המשתמש לא יכול לייצא כרטיס ל־PDF",
|
||||
"exportBoardPopup-title": "ייצוא לוח",
|
||||
"exportCardPopup-title": "ייצוא כרטיס",
|
||||
"sort": "מיון",
|
||||
"sort-desc": "לחיצה למיון הרשימה",
|
||||
"list-sort-by": "מיון הרשימה לפי:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "העתקת מסלול",
|
||||
"copySwimlanePopup-title": "העתקת מסלול",
|
||||
"display-card-creator": "להציג את יוצר הכרטיסים",
|
||||
"wait-spinner": "שבשבת המתנה"
|
||||
"wait-spinner": "שבשבת המתנה",
|
||||
"Bounce": "שבשבת המתנה קופצת",
|
||||
"Cube": "שבשבת המתנה קוביה",
|
||||
"Cube-Grid": "שבשבת המתנה קוביית קשת",
|
||||
"Dot": "שבשבת המתנה נקודה",
|
||||
"Double-Bounce": "שבשבת המתנה קפיצה כפולה",
|
||||
"Rotateplane": "שבשבת המתנה משטח נוטה",
|
||||
"Scaleout": "שבשבת המתנה התרחקות",
|
||||
"Wave": "שבשבת המתנה גל",
|
||||
"maximize-card": "הגדלת כרטיס",
|
||||
"minimize-card": "מזעור כרטיס"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "HTML को निर्यात बोर्ड",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export बोर्ड",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "भांति",
|
||||
"sort-desc": "क्रमबद्ध सूची पर क्लिक करें",
|
||||
"list-sort-by": "सूची क्रमबद्ध करें:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exportáld a Táblát Excelbe",
|
||||
"user-can-not-export-excel": "Felhasználó nem tud Excelbe exportálni",
|
||||
"export-board-html": "Exportáld a táblát HTML (webes) formátumba",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Tábla exportálása",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Rendezés",
|
||||
"sort-desc": "Kattints a lista rendezéséhez",
|
||||
"list-sort-by": "Rendezd a Listát e szerint:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exspor Panel",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Esporta bacheca in Excel",
|
||||
"user-can-not-export-excel": "L'utente non può effettuare l'esportazione in Excel",
|
||||
"export-board-html": "Esporta bacheca in HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Esporta bacheca",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Ordina",
|
||||
"sort-desc": "Clicca per ordinare la lista",
|
||||
"list-sort-by": "Ordina lista per:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "ボードをExcelにエクスポート",
|
||||
"user-can-not-export-excel": "ユーザーはExcelにエクスポートできません ",
|
||||
"export-board-html": "ボードをHTMLにエクスポート",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "ボードのエクスポート",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "並べ替え",
|
||||
"sort-desc": "クリックでリストをソート",
|
||||
"list-sort-by": "次によりリストを並べ替え:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "スイムレーンをコピーする",
|
||||
"copySwimlanePopup-title": "スイムレーンをコピーする",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "დაფის ექსპორტი",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "보드 내보내기",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "분류",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Eksportēt dēli kā HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Eksportēt dēli",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Kārtot",
|
||||
"sort-desc": "Spiediet, lai kārtotu sarakstu",
|
||||
"list-sort-by": "Kārtot sarakstu pēc:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Експортиране на Табло",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+36
-22
@@ -82,8 +82,8 @@
|
||||
"add-attachment": "Legg til Vedlegg",
|
||||
"add-board": "Legg til Tavle",
|
||||
"add-card": "Legg til Kort",
|
||||
"add-card-to-top-of-list": "Add Card to Top of List",
|
||||
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
|
||||
"add-card-to-top-of-list": "Legg til Kort på Toppen av Listen",
|
||||
"add-card-to-bottom-of-list": "Legg til Kort på Bunnen av Listen",
|
||||
"add-swimlane": "Legg til Svømmebane",
|
||||
"add-subtask": "Legg til Underoppgave",
|
||||
"add-checklist": "Legg til Sjekkliste",
|
||||
@@ -133,7 +133,7 @@
|
||||
"board-not-found": "Kunne ikke finne tavlen",
|
||||
"board-private-info": "Denne tavlen vil være <strong>privat</strong>.",
|
||||
"board-public-info": "Denne tavlen vil være <strong>offentlig</strong>.",
|
||||
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
|
||||
"board-drag-drop-reorder-or-click-open": "Klikk og Dra for å omorganisere ikoner på tavlen. Klikk på ikon for å åpne tavlen.",
|
||||
"boardChangeColorPopup-title": "Ende tavlens bakgrunnsfarge",
|
||||
"boardChangeTitlePopup-title": "Endre navn på tavlen",
|
||||
"boardChangeVisibilityPopup-title": "Endre synlighet",
|
||||
@@ -181,10 +181,10 @@
|
||||
"vote-against": "mot",
|
||||
"deleteVotePopup-title": "Slett stemme?",
|
||||
"vote-delete-pop": "Sletting er permanent. Du vil miste alle aksjoner som har en sammenheng med denne stemmen.",
|
||||
"cardStartPlanningPokerPopup-title": "Start a Planning Poker",
|
||||
"card-edit-planning-poker": "Edit Planning Poker",
|
||||
"editPokerEndDatePopup-title": "Change Planning Poker vote end date",
|
||||
"poker-question": "Planning Poker",
|
||||
"cardStartPlanningPokerPopup-title": "Start en Planpeker",
|
||||
"card-edit-planning-poker": "Endre en Planpeker",
|
||||
"editPokerEndDatePopup-title": "Endre Stemming og Dato for Planpeker ",
|
||||
"poker-question": "Planpeker",
|
||||
"poker-one": "1",
|
||||
"poker-two": "2",
|
||||
"poker-three": "3",
|
||||
@@ -195,13 +195,13 @@
|
||||
"poker-forty": "40",
|
||||
"poker-oneHundred": "100",
|
||||
"poker-unsure": "?",
|
||||
"poker-finish": "Finish",
|
||||
"poker-result-votes": "Votes",
|
||||
"poker-result-who": "Who",
|
||||
"poker-replay": "Replay",
|
||||
"set-estimation": "Set Estimation",
|
||||
"deletePokerPopup-title": "Delete planning poker?",
|
||||
"poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.",
|
||||
"poker-finish": "Ferdig",
|
||||
"poker-result-votes": "Stemmer",
|
||||
"poker-result-who": "Hvem",
|
||||
"poker-replay": "Spill på nytt",
|
||||
"set-estimation": "Angi Estimat",
|
||||
"deletePokerPopup-title": "Slett Planpeker",
|
||||
"poker-delete-pop": "Sletting er permanent. Du vil miste alle aksjoner som er assosiert med denne planpekeren.",
|
||||
"cardDeletePopup-title": "Slett kort?",
|
||||
"cardDetailsActionsPopup-title": "Kort-handlinger",
|
||||
"cardLabelsPopup-title": "Etiketter",
|
||||
@@ -233,7 +233,7 @@
|
||||
"close": "Lukk",
|
||||
"close-board": "Lukk Tavle",
|
||||
"close-board-pop": "Du vil ha muligheten til å gjenopprette Tavle ved å klikke på 'Arkiv'-knappen i hjem-menyen.",
|
||||
"close-card": "Close Card",
|
||||
"close-card": "Lukk Kort",
|
||||
"color-black": "svart",
|
||||
"color-blue": "blå",
|
||||
"color-crimson": "høyrød",
|
||||
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Eksporter Tavle til Excel",
|
||||
"user-can-not-export-excel": "Bruker kan ikke eksportere til Excel",
|
||||
"export-board-html": "Eksporter tavle til HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Eksporter tavle",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sorter",
|
||||
"sort-desc": "Klikk for sortering liste",
|
||||
"list-sort-by": "Sorter liten etter:",
|
||||
@@ -447,8 +451,8 @@
|
||||
"set-color-list": "Sett farge",
|
||||
"listActionPopup-title": "List aksjoner",
|
||||
"settingsUserPopup-title": "Brukerinnstillinger",
|
||||
"settingsTeamPopup-title": "Team Settings",
|
||||
"settingsOrgPopup-title": "Organization Settings",
|
||||
"settingsTeamPopup-title": "Innstillinger Team",
|
||||
"settingsOrgPopup-title": "Innstillinger Organisasjon",
|
||||
"swimlaneActionPopup-title": "Svømmebane-aksjoner",
|
||||
"swimlaneAddPopup-title": "Legg til en Svømmebane under",
|
||||
"listImportCardPopup-title": "Importer et Trello-kort",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Velg en farge",
|
||||
"assigned-by": "Tildelt av",
|
||||
"requested-by": "Forespurt av",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Kort sorter etter nummer",
|
||||
"board-delete-notice": "Sletting er permanent. Du vil miste alle lister, kort og aksjoner assosiert med denne tavlen,",
|
||||
"delete-board-confirm-popup": "Alle lister, kort, etiketter og aktiviteter vil bli slettet og du vil ikke kunne gjenopprette innholdet på tavlen. Det er ikke mulig å angre.",
|
||||
"boardDeletePopup-title": "Slett Tavle?",
|
||||
@@ -846,8 +850,8 @@
|
||||
"act-duenow": "minnet om at nåværende forfallstid (__timeValue__) for __card__ er nå",
|
||||
"act-atUserComment": "Du ble nevnt i [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "Er du sikker på at du vil slette denne kontoen?",
|
||||
"delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
|
||||
"delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
|
||||
"delete-team-confirm-popup": "Er du sikker på at du vil slette Teamet? Du kan ikke angre.",
|
||||
"delete-org-confirm-popup": "Er du sikker på at du vil slette denne Organisasjonen? Du kan ikke angre.",
|
||||
"accounts-allowUserDelete": "Tillat brukere å slette egen konto",
|
||||
"hide-minicard-label-text": "Skjul tekst på etikett",
|
||||
"show-desktop-drag-handles": "Vis ikon for flytting av kort",
|
||||
@@ -1038,6 +1042,16 @@
|
||||
"rulesReportTitle": "Rapportering Regler",
|
||||
"copy-swimlane": "Kopiér Svømmebane",
|
||||
"copySwimlanePopup-title": "Kopiér Svømmebane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"display-card-creator": "Vis etablerer av Kort",
|
||||
"wait-spinner": "Ventehjul",
|
||||
"Bounce": "Ventehjul - Hoppende",
|
||||
"Cube": "Ventehjul - Kubisk",
|
||||
"Cube-Grid": "Ventehjul - Kubisk med akser",
|
||||
"Dot": "Ventehjul - Prikk",
|
||||
"Double-Bounce": "Ventehjul - Dobbelt - Hoppende",
|
||||
"Rotateplane": "Ventehjul - Rotasjonsplan",
|
||||
"Scaleout": "Ventehjul - Utskaliering",
|
||||
"Wave": "Ventehjul - Bølge",
|
||||
"maximize-card": "Maksimer Kort",
|
||||
"minimize-card": "Minimer Kort"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exporteer bord naar Excel",
|
||||
"user-can-not-export-excel": "Gebruiker kan niet exporteren naar Excel",
|
||||
"export-board-html": "Exporteer bord naar HTML",
|
||||
"export-card": "Exporteer kaart",
|
||||
"export-card-pdf": "Exporteer kaart naar PDF",
|
||||
"user-can-not-export-card-to-pdf": "Gebruiker kan kaart niet naar PDF exporteren",
|
||||
"exportBoardPopup-title": "Exporteer bord",
|
||||
"exportCardPopup-title": "Exporteer kaart",
|
||||
"sort": "Sorteer",
|
||||
"sort-desc": "Klik om lijst te sorteren",
|
||||
"list-sort-by": "Sorteer lijst op",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Kopieer Swimlane",
|
||||
"copySwimlanePopup-title": "Kopieer Swimlane",
|
||||
"display-card-creator": "Toon Aanmaker Kaart",
|
||||
"wait-spinner": "Wacht Spinner"
|
||||
"wait-spinner": "Wacht Spinner",
|
||||
"Bounce": "Stuiterende Wacht Spinner",
|
||||
"Cube": "Kubus Wacht Spinner",
|
||||
"Cube-Grid": "Raster-Kubus Wacht Spinner",
|
||||
"Dot": "Stip Wacht Spinner",
|
||||
"Double-Bounce": "Dubbel Stuiterende Wacht Spinner",
|
||||
"Rotateplane": "Roterend Vlak Wacht Spinner",
|
||||
"Scaleout": "Vergrotende Wacht Spinner",
|
||||
"Wave": "Golvende Wacht Spinner",
|
||||
"maximize-card": "Maximaliseer Kaart",
|
||||
"minimize-card": "Minimaliseer Kaart"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar lo tablèu",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Eksportuj tablicę w formacie Excel",
|
||||
"user-can-not-export-excel": "Użytkownik nie może wyeksportować tablicy w formacie Excel",
|
||||
"export-board-html": "Eksportuj tablicę do HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Eksportuj tablicę",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sortuj",
|
||||
"sort-desc": "Kliknij by sortować listę",
|
||||
"list-sort-by": "Sortuj listę przez:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Skopiuj ścieżkę",
|
||||
"copySwimlanePopup-title": "Kopiowanie ścieżki",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+16
-2
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exportar quadro para Excel",
|
||||
"user-can-not-export-excel": "Usuário não pode exportar Excel",
|
||||
"export-board-html": "Exportar quadro para HTML",
|
||||
"export-card": "Exportar cartão",
|
||||
"export-card-pdf": "Exportar cartão para PDF",
|
||||
"user-can-not-export-card-to-pdf": "Usuário não pode exportar cartão para PDF",
|
||||
"exportBoardPopup-title": "Exportar quadro",
|
||||
"exportCardPopup-title": "Exportar cartão",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Clique para Ordenar Lista",
|
||||
"list-sort-by": "Ordenar a Lista por:",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Escolha uma cor",
|
||||
"assigned-by": "Atribuído por",
|
||||
"requested-by": "Solicitado por",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Ordenar cartões por número",
|
||||
"board-delete-notice": "Excluir é permanente. Você perderá todas as listas, cartões e ações associados nesse quadro.",
|
||||
"delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão excluídas e você não poderá recuperar o conteúdo do quadro. Não há como desfazer.",
|
||||
"boardDeletePopup-title": "Excluir quadro?",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copiar Raia",
|
||||
"copySwimlanePopup-title": "Copiar Raia",
|
||||
"display-card-creator": "Exibir Criador do Cartão",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Aguarde o carregamento",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximizar Cartão",
|
||||
"minimize-card": "Minimizar Cartão"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exportar quadro para Excel",
|
||||
"user-can-not-export-excel": "Utilizador não pode exportar Excel",
|
||||
"export-board-html": "Exportar quadro para HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportar quadro",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Clique para ordenar a Lista",
|
||||
"list-sort-by": "Ordenar a Lista por:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copiar Pista",
|
||||
"copySwimlanePopup-title": "Copiar Pista",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+16
-2
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Экспортировать доску в Excel",
|
||||
"user-can-not-export-excel": "Пользователь не может экспортировать в Excel",
|
||||
"export-board-html": "Экспортировать доску в HTML",
|
||||
"export-card": "Экспорт карточки",
|
||||
"export-card-pdf": "Экспорт карточки в PDF",
|
||||
"user-can-not-export-card-to-pdf": "Пользователь не может экспортировать карточку в PDF",
|
||||
"exportBoardPopup-title": "Экспортировать доску",
|
||||
"exportCardPopup-title": "Экспорт карточки",
|
||||
"sort": "Сортировать",
|
||||
"sort-desc": "Нажмите, чтобы отсортировать список",
|
||||
"list-sort-by": "Сортировать список по:",
|
||||
@@ -664,7 +668,7 @@
|
||||
"setListColorPopup-title": "Выберите цвет",
|
||||
"assigned-by": "Поручил",
|
||||
"requested-by": "Запросил",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Сортировка карточек по номеру",
|
||||
"board-delete-notice": "Удаление является постоянным. Вы потеряете все списки, карты и действия, связанные с этой доской.",
|
||||
"delete-board-confirm-popup": "Все списки, карточки, метки и действия будут удалены, и вы не сможете восстановить содержимое доски. Отменить нельзя.",
|
||||
"boardDeletePopup-title": "Удалить доску?",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Скопировать дорожку",
|
||||
"copySwimlanePopup-title": "Скопировать дорожку",
|
||||
"display-card-creator": "Показать создателя карты",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Спинер ожидания",
|
||||
"Bounce": "Прыгающий спинер ожидания",
|
||||
"Cube": "Кубический спинер ожидания",
|
||||
"Cube-Grid": "Сетка кубиков",
|
||||
"Dot": "Точки",
|
||||
"Double-Bounce": "Двойной прыгающий спинер ожидания",
|
||||
"Rotateplane": "Врщающийся лист",
|
||||
"Scaleout": "Увеличивающийся-уменьшающийся спиннер",
|
||||
"Wave": "Волновой спиннер",
|
||||
"maximize-card": "Максимизировать карточку",
|
||||
"minimize-card": "Минимизировать карточку"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Izvozi tablo",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sortiraj",
|
||||
"sort-desc": "Klikni za sortiranje seznama",
|
||||
"list-sort-by": "Sortiraj po:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sortiraj",
|
||||
"sort-desc": "Kliknite da biste sortirali listu",
|
||||
"list-sort-by": "Poredaj listu po:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Exportera tavla till Excel",
|
||||
"user-can-not-export-excel": "Användare kan inte exportera till Excel",
|
||||
"export-board-html": "Exportera tavla till HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Exportera tavla",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sortera",
|
||||
"sort-desc": "Klicka för att sortera listan",
|
||||
"list-sort-by": "Sortera listan efter:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "ส่งออกกระดาน",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Panoyu HTML olarak dışarı aktar",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Panoyu dışarı aktar",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sırala",
|
||||
"sort-desc": "Listeyi Sıralamak için Tıklayın",
|
||||
"list-sort-by": "Listeyi Sırala:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Xuất bảng sang Excel",
|
||||
"user-can-not-export-excel": "Người dùng không thể xuất Excel",
|
||||
"export-board-html": "Xuất bảng sang HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Xuất bảng",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sắp xếp",
|
||||
"sort-desc": "Nhấp để sắp xếp danh sách",
|
||||
"list-sort-by": "Sắp xếp Danh sách bởi:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Sao chép Làn ngang",
|
||||
"copySwimlanePopup-title": "Sao chép Làn ngang",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "看板导出为Excel",
|
||||
"user-can-not-export-excel": "用户无法导出Excel",
|
||||
"export-board-html": "看板导出为HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "导出看板",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "排序",
|
||||
"sort-desc": "点此来将列表排序",
|
||||
"list-sort-by": "按此来将列表排序:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "复制泳道",
|
||||
"copySwimlanePopup-title": "复制泳道",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "Export board to Excel",
|
||||
"user-can-not-export-excel": "User can not export Excel",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+15
-1
@@ -358,7 +358,11 @@
|
||||
"export-board-excel": "匯出看板至 Excel",
|
||||
"user-can-not-export-excel": "使用者無法匯出至 Excel",
|
||||
"export-board-html": "匯出看板為HTML格式\n ",
|
||||
"export-card": "Export card",
|
||||
"export-card-pdf": "Export card to PDF",
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "匯出看板",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "排序",
|
||||
"sort-desc": "點選排序清單",
|
||||
"list-sort-by": "清單排序依照:",
|
||||
@@ -1039,5 +1043,15 @@
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"display-card-creator": "Display Card Creator",
|
||||
"wait-spinner": "Wait Spinner"
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
"Cube": "Cube Wait Spinner",
|
||||
"Cube-Grid": "Cube-Grid Wait Spinner",
|
||||
"Dot": "Dot Wait Spinner",
|
||||
"Double-Bounce": "Double Bounce Wait Spinner",
|
||||
"Rotateplane": "Rotateplane Wait Spinner",
|
||||
"Scaleout": "Scaleout Wait Spinner",
|
||||
"Wave": "Wave Wait Spinner",
|
||||
"maximize-card": "Maximize Card",
|
||||
"minimize-card": "Minimize Card"
|
||||
}
|
||||
+4
-2
@@ -1678,7 +1678,8 @@ if (Meteor.isServer) {
|
||||
*/
|
||||
JsonRoutes.add('GET', '/api/boards', function(req, res) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Boards.find(
|
||||
@@ -1852,7 +1853,8 @@ if (Meteor.isServer) {
|
||||
* @return_type string
|
||||
*/
|
||||
JsonRoutes.add('PUT', '/api/boards/:boardId/labels', function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const id = req.params.boardId;
|
||||
try {
|
||||
if (req.body.hasOwnProperty('label')) {
|
||||
|
||||
@@ -192,8 +192,8 @@ if (Meteor.isServer) {
|
||||
res,
|
||||
) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCardId = req.params.cardId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
@@ -230,8 +230,8 @@ if (Meteor.isServer) {
|
||||
'/api/boards/:boardId/cards/:cardId/comments/:commentId',
|
||||
function(req, res) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCommentId = req.params.commentId;
|
||||
const paramCardId = req.params.cardId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
@@ -266,8 +266,8 @@ if (Meteor.isServer) {
|
||||
'/api/boards/:boardId/cards/:cardId/comments',
|
||||
function(req, res) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCardId = req.params.cardId;
|
||||
const id = CardComments.direct.insert({
|
||||
userId: req.body.authorId,
|
||||
@@ -312,8 +312,8 @@ if (Meteor.isServer) {
|
||||
'/api/boards/:boardId/cards/:cardId/comments/:commentId',
|
||||
function(req, res) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCommentId = req.params.commentId;
|
||||
const paramCardId = req.params.cardId;
|
||||
CardComments.remove({
|
||||
|
||||
+2
-2
@@ -3308,8 +3308,8 @@ if (Meteor.isServer) {
|
||||
'PUT',
|
||||
'/api/boards/:boardId/lists/:listId/cards/:cardId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCardId = req.params.cardId;
|
||||
const paramListId = req.params.listId;
|
||||
|
||||
@@ -3666,8 +3666,8 @@ if (Meteor.isServer) {
|
||||
'DELETE',
|
||||
'/api/boards/:boardId/lists/:listId/cards/:cardId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramListId = req.params.listId;
|
||||
const paramCardId = req.params.cardId;
|
||||
|
||||
|
||||
@@ -265,7 +265,8 @@ if (Meteor.isServer) {
|
||||
'GET',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramItemId = req.params.itemId;
|
||||
const checklistItem = ChecklistItems.findOne({ _id: paramItemId });
|
||||
if (checklistItem) {
|
||||
@@ -298,7 +299,8 @@ if (Meteor.isServer) {
|
||||
'PUT',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const paramItemId = req.params.itemId;
|
||||
|
||||
@@ -349,7 +351,8 @@ if (Meteor.isServer) {
|
||||
'DELETE',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramItemId = req.params.itemId;
|
||||
ChecklistItems.direct.remove({ _id: paramItemId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
|
||||
@@ -204,7 +204,8 @@ if (Meteor.isServer) {
|
||||
'GET',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCardId = req.params.cardId;
|
||||
const checklists = Checklists.find({ cardId: paramCardId }).map(function(
|
||||
doc,
|
||||
@@ -247,7 +248,8 @@ if (Meteor.isServer) {
|
||||
'GET',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists/:checklistId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramChecklistId = req.params.checklistId;
|
||||
const paramCardId = req.params.cardId;
|
||||
const checklist = Checklists.findOne({
|
||||
@@ -351,7 +353,8 @@ if (Meteor.isServer) {
|
||||
'DELETE',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists/:checklistId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramChecklistId = req.params.checklistId;
|
||||
Checklists.remove({ _id: paramChecklistId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
|
||||
+12
-8
@@ -294,8 +294,8 @@ if (Meteor.isServer) {
|
||||
req,
|
||||
res,
|
||||
) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: CustomFields.find({ boardIds: { $in: [paramBoardId] } }).map(
|
||||
@@ -323,8 +323,8 @@ if (Meteor.isServer) {
|
||||
'GET',
|
||||
'/api/boards/:boardId/custom-fields/:customFieldId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramCustomFieldId = req.params.customFieldId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
@@ -353,8 +353,8 @@ if (Meteor.isServer) {
|
||||
req,
|
||||
res,
|
||||
) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const board = Boards.findOne({ _id: paramBoardId });
|
||||
const id = CustomFields.direct.insert({
|
||||
name: req.body.name,
|
||||
@@ -396,7 +396,8 @@ if (Meteor.isServer) {
|
||||
'PUT',
|
||||
'/api/boards/:boardId/custom-fields/:customFieldId',
|
||||
(req, res) => {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const paramFieldId = req.params.customFieldId;
|
||||
|
||||
@@ -461,7 +462,8 @@ if (Meteor.isServer) {
|
||||
'POST',
|
||||
'/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items',
|
||||
(req, res) => {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const paramCustomFieldId = req.params.customFieldId;
|
||||
const paramItems = req.body.items;
|
||||
@@ -504,7 +506,8 @@ if (Meteor.isServer) {
|
||||
'PUT',
|
||||
'/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items/:dropdownItemId',
|
||||
(req, res) => {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const paramDropdownItemId = req.params.dropdownItemId;
|
||||
const paramCustomFieldId = req.params.customFieldId;
|
||||
@@ -545,7 +548,8 @@ if (Meteor.isServer) {
|
||||
'DELETE',
|
||||
'/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items/:dropdownItemId',
|
||||
(req, res) => {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
paramCustomFieldId = req.params.customFieldId;
|
||||
paramDropdownItemId = req.params.dropdownItemId;
|
||||
@@ -580,8 +584,8 @@ if (Meteor.isServer) {
|
||||
'DELETE',
|
||||
'/api/boards/:boardId/custom-fields/:customFieldId',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const id = req.params.customFieldId;
|
||||
CustomFields.remove({ _id: id, boardIds: { $in: [paramBoardId] } });
|
||||
JsonRoutes.sendResult(res, {
|
||||
|
||||
@@ -0,0 +1,691 @@
|
||||
if (Meteor.isServer) {
|
||||
// todo XXX once we have a real API in place, move that route there
|
||||
// todo XXX also share the route definition between the client and the server
|
||||
// so that we could use something like
|
||||
// `ApiRoutes.path('boards/exportExcel', boardId)``
|
||||
// on the client instead of copy/pasting the route path manually between the
|
||||
// client and the server.
|
||||
/**
|
||||
* @operation exportExcel
|
||||
* @tag Boards
|
||||
*
|
||||
* @summary This route is used to export the board Excel.
|
||||
*
|
||||
* @description If user is already logged-in, pass loginToken as param
|
||||
* "authToken": '/api/boards/:boardId/exportExcel?authToken=:token'
|
||||
*
|
||||
* See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/
|
||||
* for detailed explanations
|
||||
*
|
||||
* @param {string} boardId the ID of the board we are exporting
|
||||
* @param {string} authToken the loginToken
|
||||
*/
|
||||
const Excel = require('exceljs');
|
||||
Picker.route('/api/boards/:boardId/lists/:listId/cards/:cardId/exportPDF', function (params, req, res) {
|
||||
const boardId = params.boardId;
|
||||
const paramListId = req.params.listId;
|
||||
const paramCardId = req.params.cardId;
|
||||
let user = null;
|
||||
let impersonateDone = false;
|
||||
let adminId = null;
|
||||
const loginToken = params.query.authToken;
|
||||
if (loginToken) {
|
||||
const hashToken = Accounts._hashLoginToken(loginToken);
|
||||
user = Meteor.users.findOne({
|
||||
'services.resume.loginTokens.hashedToken': hashToken,
|
||||
});
|
||||
adminId = user._id.toString();
|
||||
impersonateDone = ImpersonatedUsers.findOne({
|
||||
adminId: adminId,
|
||||
});
|
||||
} else if (!Meteor.settings.public.sandstorm) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
user = Users.findOne({
|
||||
_id: req.userId,
|
||||
isAdmin: true,
|
||||
});
|
||||
}
|
||||
const exporterExcel = new ExporterCardPDF(boardId);
|
||||
if (exporterCardPDF.canExport(user) || impersonateDone) {
|
||||
if (impersonateDone) {
|
||||
ImpersonatedUsers.insert({
|
||||
adminId: adminId,
|
||||
boardId: boardId,
|
||||
reason: 'exportCardPDF',
|
||||
});
|
||||
}
|
||||
|
||||
exporterCardPDF.build(res);
|
||||
} else {
|
||||
res.end(TAPi18n.__('user-can-not-export-card-to-pdf'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// exporter maybe is broken since Gridfs introduced, add fs and path
|
||||
|
||||
export class ExporterCardPDF {
|
||||
constructor(boardId) {
|
||||
this._boardId = boardId;
|
||||
}
|
||||
|
||||
build(res) {
|
||||
|
||||
/*
|
||||
const fs = Npm.require('fs');
|
||||
const os = Npm.require('os');
|
||||
const path = Npm.require('path');
|
||||
|
||||
const byBoard = {
|
||||
boardId: this._boardId,
|
||||
};
|
||||
const byBoardNoLinked = {
|
||||
boardId: this._boardId,
|
||||
linkedId: {
|
||||
$in: ['', null],
|
||||
},
|
||||
};
|
||||
// we do not want to retrieve boardId in related elements
|
||||
const noBoardId = {
|
||||
fields: {
|
||||
boardId: 0,
|
||||
},
|
||||
};
|
||||
const result = {
|
||||
_format: 'wekan-board-1.0.0',
|
||||
};
|
||||
_.extend(
|
||||
result,
|
||||
Boards.findOne(this._boardId, {
|
||||
fields: {
|
||||
stars: 0,
|
||||
},
|
||||
}),
|
||||
);
|
||||
result.lists = Lists.find(byBoard, noBoardId).fetch();
|
||||
result.cards = Cards.find(byBoardNoLinked, noBoardId).fetch();
|
||||
result.swimlanes = Swimlanes.find(byBoard, noBoardId).fetch();
|
||||
result.customFields = CustomFields.find(
|
||||
{
|
||||
boardIds: {
|
||||
$in: [this.boardId],
|
||||
},
|
||||
},
|
||||
{
|
||||
fields: {
|
||||
boardId: 0,
|
||||
},
|
||||
},
|
||||
).fetch();
|
||||
result.comments = CardComments.find(byBoard, noBoardId).fetch();
|
||||
result.activities = Activities.find(byBoard, noBoardId).fetch();
|
||||
result.rules = Rules.find(byBoard, noBoardId).fetch();
|
||||
result.checklists = [];
|
||||
result.checklistItems = [];
|
||||
result.subtaskItems = [];
|
||||
result.triggers = [];
|
||||
result.actions = [];
|
||||
result.cards.forEach((card) => {
|
||||
result.checklists.push(
|
||||
...Checklists.find({
|
||||
cardId: card._id,
|
||||
}).fetch(),
|
||||
);
|
||||
result.checklistItems.push(
|
||||
...ChecklistItems.find({
|
||||
cardId: card._id,
|
||||
}).fetch(),
|
||||
);
|
||||
result.subtaskItems.push(
|
||||
...Cards.find({
|
||||
parentId: card._id,
|
||||
}).fetch(),
|
||||
);
|
||||
});
|
||||
result.rules.forEach((rule) => {
|
||||
result.triggers.push(
|
||||
...Triggers.find(
|
||||
{
|
||||
_id: rule.triggerId,
|
||||
},
|
||||
noBoardId,
|
||||
).fetch(),
|
||||
);
|
||||
result.actions.push(
|
||||
...Actions.find(
|
||||
{
|
||||
_id: rule.actionId,
|
||||
},
|
||||
noBoardId,
|
||||
).fetch(),
|
||||
);
|
||||
});
|
||||
|
||||
// we also have to export some user data - as the other elements only
|
||||
// include id but we have to be careful:
|
||||
// 1- only exports users that are linked somehow to that board
|
||||
// 2- do not export any sensitive information
|
||||
const users = {};
|
||||
result.members.forEach((member) => {
|
||||
users[member.userId] = true;
|
||||
});
|
||||
result.lists.forEach((list) => {
|
||||
users[list.userId] = true;
|
||||
});
|
||||
result.cards.forEach((card) => {
|
||||
users[card.userId] = true;
|
||||
if (card.members) {
|
||||
card.members.forEach((memberId) => {
|
||||
users[memberId] = true;
|
||||
});
|
||||
}
|
||||
if (card.assignees) {
|
||||
card.assignees.forEach((memberId) => {
|
||||
users[memberId] = true;
|
||||
});
|
||||
}
|
||||
});
|
||||
result.comments.forEach((comment) => {
|
||||
users[comment.userId] = true;
|
||||
});
|
||||
result.activities.forEach((activity) => {
|
||||
users[activity.userId] = true;
|
||||
});
|
||||
result.checklists.forEach((checklist) => {
|
||||
users[checklist.userId] = true;
|
||||
});
|
||||
const byUserIds = {
|
||||
_id: {
|
||||
$in: Object.getOwnPropertyNames(users),
|
||||
},
|
||||
};
|
||||
// we use whitelist to be sure we do not expose inadvertently
|
||||
// some secret fields that gets added to User later.
|
||||
const userFields = {
|
||||
fields: {
|
||||
_id: 1,
|
||||
username: 1,
|
||||
'profile.initials': 1,
|
||||
'profile.avatarUrl': 1,
|
||||
},
|
||||
};
|
||||
result.users = Users.find(byUserIds, userFields)
|
||||
.fetch()
|
||||
.map((user) => {
|
||||
// user avatar is stored as a relative url, we export absolute
|
||||
if ((user.profile || {}).avatarUrl) {
|
||||
user.profile.avatarUrl = FlowRouter.url(user.profile.avatarUrl);
|
||||
}
|
||||
return user;
|
||||
});
|
||||
|
||||
//init exceljs workbook
|
||||
const Excel = require('exceljs');
|
||||
const workbook = new Excel.Workbook();
|
||||
workbook.creator = TAPi18n.__('export-board');
|
||||
workbook.lastModifiedBy = TAPi18n.__('export-board');
|
||||
workbook.created = new Date();
|
||||
workbook.modified = new Date();
|
||||
workbook.lastPrinted = new Date();
|
||||
const filename = `${result.title}.xlsx`;
|
||||
//init worksheet
|
||||
const worksheet = workbook.addWorksheet(result.title, {
|
||||
properties: {
|
||||
tabColor: {
|
||||
argb: 'FFC0000',
|
||||
},
|
||||
},
|
||||
pageSetup: {
|
||||
paperSize: 9,
|
||||
orientation: 'landscape',
|
||||
},
|
||||
});
|
||||
//get worksheet
|
||||
const ws = workbook.getWorksheet(result.title);
|
||||
ws.properties.defaultRowHeight = 20;
|
||||
//init columns
|
||||
//Excel font. Western: Arial. zh-CN: 宋体
|
||||
ws.columns = [
|
||||
{
|
||||
key: 'a',
|
||||
width: 14,
|
||||
},
|
||||
{
|
||||
key: 'b',
|
||||
width: 40,
|
||||
},
|
||||
{
|
||||
key: 'c',
|
||||
width: 60,
|
||||
},
|
||||
{
|
||||
key: 'd',
|
||||
width: 40,
|
||||
},
|
||||
{
|
||||
key: 'e',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'f',
|
||||
width: 20,
|
||||
style: {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'g',
|
||||
width: 20,
|
||||
style: {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'h',
|
||||
width: 20,
|
||||
style: {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'i',
|
||||
width: 20,
|
||||
style: {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'j',
|
||||
width: 20,
|
||||
style: {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'k',
|
||||
width: 20,
|
||||
style: {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'l',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'm',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'n',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'o',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'p',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'q',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'r',
|
||||
width: 20,
|
||||
},
|
||||
];
|
||||
|
||||
//add title line
|
||||
ws.mergeCells('A1:H1');
|
||||
ws.getCell('A1').value = result.title;
|
||||
ws.getCell('A1').style = {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '20',
|
||||
},
|
||||
};
|
||||
ws.getCell('A1').alignment = {
|
||||
vertical: 'middle',
|
||||
horizontal: 'center',
|
||||
};
|
||||
ws.getRow(1).height = 40;
|
||||
//get member and assignee info
|
||||
let jmem = '';
|
||||
let jassig = '';
|
||||
const jmeml = {};
|
||||
const jassigl = {};
|
||||
for (const i in result.users) {
|
||||
jmem = `${jmem + result.users[i].username},`;
|
||||
jmeml[result.users[i]._id] = result.users[i].username;
|
||||
}
|
||||
jmem = jmem.substr(0, jmem.length - 1);
|
||||
for (const ia in result.users) {
|
||||
jassig = `${jassig + result.users[ia].username},`;
|
||||
jassigl[result.users[ia]._id] = result.users[ia].username;
|
||||
}
|
||||
jassig = jassig.substr(0, jassig.length - 1);
|
||||
//get kanban list info
|
||||
const jlist = {};
|
||||
for (const klist in result.lists) {
|
||||
jlist[result.lists[klist]._id] = result.lists[klist].title;
|
||||
}
|
||||
//get kanban swimlanes info
|
||||
const jswimlane = {};
|
||||
for (const kswimlane in result.swimlanes) {
|
||||
jswimlane[result.swimlanes[kswimlane]._id] =
|
||||
result.swimlanes[kswimlane].title;
|
||||
}
|
||||
//get kanban label info
|
||||
const jlabel = {};
|
||||
var isFirst = 1;
|
||||
for (const klabel in result.labels) {
|
||||
// console.log(klabel);
|
||||
if (isFirst == 0) {
|
||||
jlabel[result.labels[klabel]._id] = `,${result.labels[klabel].name}`;
|
||||
} else {
|
||||
isFirst = 0;
|
||||
jlabel[result.labels[klabel]._id] = result.labels[klabel].name;
|
||||
}
|
||||
}
|
||||
//add data +8 hours
|
||||
function addTZhours(jdate) {
|
||||
const curdate = new Date(jdate);
|
||||
const checkCorrectDate = moment(curdate);
|
||||
if (checkCorrectDate.isValid()) {
|
||||
return curdate;
|
||||
} else {
|
||||
return ' ';
|
||||
}
|
||||
////Do not add 8 hours to GMT. Use GMT instead.
|
||||
////Could not yet figure out how to get localtime.
|
||||
//return new Date(curdate.setHours(curdate.getHours() + 8));
|
||||
//return curdate;
|
||||
}
|
||||
//add blank row
|
||||
ws.addRow().values = ['', '', '', '', '', ''];
|
||||
//add kanban info
|
||||
ws.addRow().values = [
|
||||
TAPi18n.__('createdAt'),
|
||||
addTZhours(result.createdAt),
|
||||
TAPi18n.__('modifiedAt'),
|
||||
addTZhours(result.modifiedAt),
|
||||
TAPi18n.__('members'),
|
||||
jmem,
|
||||
];
|
||||
ws.getRow(3).font = {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: 10,
|
||||
bold: true,
|
||||
};
|
||||
ws.mergeCells('F3:R3');
|
||||
ws.getCell('B3').style = {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: '10',
|
||||
bold: true,
|
||||
},
|
||||
numFmt: 'yyyy/mm/dd hh:mm:ss',
|
||||
};
|
||||
//cell center
|
||||
function cellCenter(cellno) {
|
||||
ws.getCell(cellno).alignment = {
|
||||
vertical: 'middle',
|
||||
horizontal: 'center',
|
||||
wrapText: true,
|
||||
};
|
||||
}
|
||||
function cellLeft(cellno) {
|
||||
ws.getCell(cellno).alignment = {
|
||||
vertical: 'middle',
|
||||
horizontal: 'left',
|
||||
wrapText: true,
|
||||
};
|
||||
}
|
||||
cellCenter('A3');
|
||||
cellCenter('B3');
|
||||
cellCenter('C3');
|
||||
cellCenter('D3');
|
||||
cellCenter('E3');
|
||||
cellLeft('F3');
|
||||
ws.getRow(3).height = 20;
|
||||
//all border
|
||||
function allBorder(cellno) {
|
||||
ws.getCell(cellno).border = {
|
||||
top: {
|
||||
style: 'thin',
|
||||
},
|
||||
left: {
|
||||
style: 'thin',
|
||||
},
|
||||
bottom: {
|
||||
style: 'thin',
|
||||
},
|
||||
right: {
|
||||
style: 'thin',
|
||||
},
|
||||
};
|
||||
}
|
||||
allBorder('A3');
|
||||
allBorder('B3');
|
||||
allBorder('C3');
|
||||
allBorder('D3');
|
||||
allBorder('E3');
|
||||
allBorder('F3');
|
||||
//add blank row
|
||||
ws.addRow().values = [
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
];
|
||||
//add card title
|
||||
//ws.addRow().values = ['编号', '标题', '创建人', '创建时间', '更新时间', '列表', '成员', '描述', '标签'];
|
||||
//this is where order in which the excel file generates
|
||||
ws.addRow().values = [
|
||||
TAPi18n.__('number'),
|
||||
TAPi18n.__('title'),
|
||||
TAPi18n.__('description'),
|
||||
TAPi18n.__('parent-card'),
|
||||
TAPi18n.__('owner'),
|
||||
TAPi18n.__('createdAt'),
|
||||
TAPi18n.__('last-modified-at'),
|
||||
TAPi18n.__('card-received'),
|
||||
TAPi18n.__('card-start'),
|
||||
TAPi18n.__('card-due'),
|
||||
TAPi18n.__('card-end'),
|
||||
TAPi18n.__('list'),
|
||||
TAPi18n.__('swimlane'),
|
||||
TAPi18n.__('assignee'),
|
||||
TAPi18n.__('members'),
|
||||
TAPi18n.__('labels'),
|
||||
TAPi18n.__('overtime-hours'),
|
||||
TAPi18n.__('spent-time-hours'),
|
||||
];
|
||||
ws.getRow(5).height = 20;
|
||||
allBorder('A5');
|
||||
allBorder('B5');
|
||||
allBorder('C5');
|
||||
allBorder('D5');
|
||||
allBorder('E5');
|
||||
allBorder('F5');
|
||||
allBorder('G5');
|
||||
allBorder('H5');
|
||||
allBorder('I5');
|
||||
allBorder('J5');
|
||||
allBorder('K5');
|
||||
allBorder('L5');
|
||||
allBorder('M5');
|
||||
allBorder('N5');
|
||||
allBorder('O5');
|
||||
allBorder('P5');
|
||||
allBorder('Q5');
|
||||
allBorder('R5');
|
||||
cellCenter('A5');
|
||||
cellCenter('B5');
|
||||
cellCenter('C5');
|
||||
cellCenter('D5');
|
||||
cellCenter('E5');
|
||||
cellCenter('F5');
|
||||
cellCenter('G5');
|
||||
cellCenter('H5');
|
||||
cellCenter('I5');
|
||||
cellCenter('J5');
|
||||
cellCenter('K5');
|
||||
cellCenter('L5');
|
||||
cellCenter('M5');
|
||||
cellCenter('N5');
|
||||
cellCenter('O5');
|
||||
cellCenter('P5');
|
||||
cellCenter('Q5');
|
||||
cellCenter('R5');
|
||||
ws.getRow(5).font = {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: 12,
|
||||
bold: true,
|
||||
};
|
||||
//add blank row
|
||||
//add card info
|
||||
for (const i in result.cards) {
|
||||
const jcard = result.cards[i];
|
||||
//get member info
|
||||
let jcmem = '';
|
||||
for (const j in jcard.members) {
|
||||
jcmem += jmeml[jcard.members[j]];
|
||||
jcmem += ' ';
|
||||
}
|
||||
//get assignee info
|
||||
let jcassig = '';
|
||||
for (const ja in jcard.assignees) {
|
||||
jcassig += jassigl[jcard.assignees[ja]];
|
||||
jcassig += ' ';
|
||||
}
|
||||
//get card label info
|
||||
let jclabel = '';
|
||||
for (const jl in jcard.labelIds) {
|
||||
jclabel += jlabel[jcard.labelIds[jl]];
|
||||
jclabel += ' ';
|
||||
}
|
||||
//get parent name
|
||||
if (jcard.parentId) {
|
||||
const parentCard = result.cards.find(
|
||||
(card) => card._id === jcard.parentId,
|
||||
);
|
||||
jcard.parentCardTitle = parentCard ? parentCard.title : '';
|
||||
}
|
||||
|
||||
//add card detail
|
||||
const t = Number(i) + 1;
|
||||
ws.addRow().values = [
|
||||
t.toString(),
|
||||
jcard.title,
|
||||
jcard.description,
|
||||
jcard.parentCardTitle,
|
||||
jmeml[jcard.userId],
|
||||
addTZhours(jcard.createdAt),
|
||||
addTZhours(jcard.dateLastActivity),
|
||||
addTZhours(jcard.receivedAt),
|
||||
addTZhours(jcard.startAt),
|
||||
addTZhours(jcard.dueAt),
|
||||
addTZhours(jcard.endAt),
|
||||
jlist[jcard.listId],
|
||||
jswimlane[jcard.swimlaneId],
|
||||
jcassig,
|
||||
jcmem,
|
||||
jclabel,
|
||||
jcard.isOvertime ? 'true' : 'false',
|
||||
jcard.spentTime,
|
||||
];
|
||||
const y = Number(i) + 6;
|
||||
//ws.getRow(y).height = 25;
|
||||
allBorder(`A${y}`);
|
||||
allBorder(`B${y}`);
|
||||
allBorder(`C${y}`);
|
||||
allBorder(`D${y}`);
|
||||
allBorder(`E${y}`);
|
||||
allBorder(`F${y}`);
|
||||
allBorder(`G${y}`);
|
||||
allBorder(`H${y}`);
|
||||
allBorder(`I${y}`);
|
||||
allBorder(`J${y}`);
|
||||
allBorder(`K${y}`);
|
||||
allBorder(`L${y}`);
|
||||
allBorder(`M${y}`);
|
||||
allBorder(`N${y}`);
|
||||
allBorder(`O${y}`);
|
||||
allBorder(`P${y}`);
|
||||
allBorder(`Q${y}`);
|
||||
allBorder(`R${y}`);
|
||||
cellCenter(`A${y}`);
|
||||
ws.getCell(`B${y}`).alignment = {
|
||||
wrapText: true,
|
||||
};
|
||||
ws.getCell(`C${y}`).alignment = {
|
||||
wrapText: true,
|
||||
};
|
||||
ws.getCell(`M${y}`).alignment = {
|
||||
wrapText: true,
|
||||
};
|
||||
ws.getCell(`N${y}`).alignment = {
|
||||
wrapText: true,
|
||||
};
|
||||
ws.getCell(`O${y}`).alignment = {
|
||||
wrapText: true,
|
||||
};
|
||||
}
|
||||
workbook.xlsx.write(res).then(function () {});
|
||||
*/
|
||||
|
||||
var doc = new PDFDocument({size: 'A4', margin: 50});
|
||||
doc.fontSize(12);
|
||||
doc.text('Some test text', 10, 30, {align: 'center', width: 200});
|
||||
this.response.writeHead(200, {
|
||||
'Content-type': 'application/pdf',
|
||||
'Content-Disposition': "attachment; filename=test.pdf"
|
||||
});
|
||||
this.response.end( doc.outputSync() );
|
||||
|
||||
}
|
||||
|
||||
canExport(user) {
|
||||
const board = Boards.findOne(this._boardId);
|
||||
return board && board.isVisibleBy(user);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -531,8 +531,8 @@ if (Meteor.isServer) {
|
||||
*/
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/lists', function(req, res) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const board = Boards.findOne(paramBoardId);
|
||||
const id = Lists.insert({
|
||||
title: req.body.title,
|
||||
@@ -569,8 +569,8 @@ if (Meteor.isServer) {
|
||||
res,
|
||||
) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const paramListId = req.params.listId;
|
||||
Lists.remove({ _id: paramListId, boardId: paramBoardId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
|
||||
+1
-1
@@ -454,8 +454,8 @@ if (Meteor.isServer) {
|
||||
*/
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/swimlanes', function(req, res) {
|
||||
try {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
const board = Boards.findOne(paramBoardId);
|
||||
const id = Swimlanes.insert({
|
||||
title: req.body.title,
|
||||
|
||||
+25
-1
@@ -164,7 +164,7 @@ Users.attachSchema(
|
||||
},
|
||||
'profile.showDesktopDragHandles': {
|
||||
/**
|
||||
* does the user want to hide system messages?
|
||||
* does the user want to show desktop drag handles?
|
||||
*/
|
||||
type: Boolean,
|
||||
optional: true,
|
||||
@@ -176,6 +176,13 @@ Users.attachSchema(
|
||||
type: Boolean,
|
||||
optional: true,
|
||||
},
|
||||
'profile.cardMaximized': {
|
||||
/**
|
||||
* has user clicked maximize card?
|
||||
*/
|
||||
type: Boolean,
|
||||
optional: true,
|
||||
},
|
||||
'profile.hiddenSystemMessages': {
|
||||
/**
|
||||
* does the user want to hide system messages?
|
||||
@@ -641,6 +648,11 @@ Users.helpers({
|
||||
return profile.hiddenSystemMessages || false;
|
||||
},
|
||||
|
||||
hasCardMaximized() {
|
||||
const profile = this.profile || {};
|
||||
return profile.cardMaximized || false;
|
||||
},
|
||||
|
||||
hasHiddenMinicardLabelText() {
|
||||
const profile = this.profile || {};
|
||||
return profile.hiddenMinicardLabelText || false;
|
||||
@@ -793,6 +805,14 @@ Users.mutations({
|
||||
};
|
||||
},
|
||||
|
||||
toggleCardMaximized(value = false) {
|
||||
return {
|
||||
$set: {
|
||||
'profile.cardMaximized': !value,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
toggleLabelText(value = false) {
|
||||
return {
|
||||
$set: {
|
||||
@@ -887,6 +907,10 @@ Meteor.methods({
|
||||
const user = Meteor.user();
|
||||
user.toggleSystem(user.hasHiddenSystemMessages());
|
||||
},
|
||||
toggleCardMaximized() {
|
||||
const user = Meteor.user();
|
||||
user.toggleCardMaximized(user.hasCardMaximized());
|
||||
},
|
||||
toggleMinicardLabelText() {
|
||||
const user = Meteor.user();
|
||||
user.toggleLabelText(user.hasHiddenMinicardLabelText());
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v5.34.0",
|
||||
"version": "v5.35.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v5.34.0",
|
||||
"version": "v5.35.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"repository": {
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Contributing guide
|
||||
|
||||
Want to contribute to Accounts-Lockout? Awesome!
|
||||
There are many ways you can contribute, see below.
|
||||
|
||||
## Opening issues
|
||||
|
||||
Open an issue to report bugs or to propose new features.
|
||||
|
||||
- Reporting bugs: describe the bug as clearly as you can, including steps to reproduce, what happened and what you were expecting to happen. Also include browser version, OS and other related software's (npm, Node.js, etc) versions when applicable.
|
||||
|
||||
- Proposing features: explain the proposed feature, what it should do, why it is useful, how users should use it. Give us as much info as possible so it will be easier to discuss, access and implement the proposed feature. When you're unsure about a certain aspect of the feature, feel free to leave it open for others to discuss and find an appropriate solution.
|
||||
|
||||
## Proposing pull requests
|
||||
|
||||
Pull requests are very welcome. Note that if you are going to propose drastic changes, be sure to open an issue for discussion first, to make sure that your PR will be accepted before you spend effort coding it.
|
||||
|
||||
Fork the Accounts-Lockout repository, clone it locally and create a branch for your proposed bug fix or new feature. Avoid working directly on the master branch.
|
||||
|
||||
Implement your bug fix or feature, write tests to cover it and make sure all tests are passing (run a final `npm test` to make sure everything is correct). Then commit your changes, push your bug fix/feature branch to the origin (your forked repo) and open a pull request to the upstream (the repository you originally forked)'s master branch.
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation is extremely important and takes a fair deal of time and effort to write and keep updated.
|
||||
Please submit any and all improvements you can make to the repository's docs.
|
||||
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 Lucas Antoniassi de Paiva
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,126 @@
|
||||
# Meteor - Accounts - Lockout
|
||||
|
||||
[](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout)
|
||||
[](https://www.codacy.com/app/lucasantoniassi/meteor-accounts-lockout?utm_source=github.com&utm_medium=referral&utm_content=LucasAntoniassi/meteor-accounts-lockout&utm_campaign=Badge_Grade)
|
||||
[](https://codeclimate.com/github/LucasAntoniassi/meteor-accounts-lockout)
|
||||
|
||||
## What it is
|
||||
|
||||
Seamless Meteor apps accounts protection from password brute-force attacks.
|
||||
Users won't notice it. Hackers shall not pass.
|
||||
|
||||

|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
meteor add lucasantoniassi:accounts-lockout
|
||||
```
|
||||
|
||||
## Usage via ES6 import
|
||||
|
||||
```javascript
|
||||
// server
|
||||
import { AccountsLockout } from 'meteor/lucasantoniassi:accounts-lockout';
|
||||
```
|
||||
|
||||
## How to use
|
||||
|
||||
Default settings:
|
||||
|
||||
```javascript
|
||||
"knownUsers": {
|
||||
"failuresBeforeLockout": 3, // positive integer greater than 0
|
||||
"lockoutPeriod": 60, // in seconds
|
||||
"failureWindow": 10 // in seconds
|
||||
},
|
||||
"unknownUsers": {
|
||||
"failuresBeforeLockout": 3, // positive integer greater than 0
|
||||
"lockoutPeriod": 60, // in seconds
|
||||
"failureWindow": 10 // in seconds
|
||||
}
|
||||
```
|
||||
|
||||
`knownUsers` are users where already belongs to your `Meteor.users` collections,
|
||||
these rules are applied if they attempt to login with an incorrect password but a know email.
|
||||
|
||||
`unknownUsers` are users where **not** belongs to your `Meteor.users` collections,
|
||||
these rules are applied if they attempt to login with a unknown email.
|
||||
|
||||
`failuresBeforeLockout` should be a positive integer greater than 0.
|
||||
|
||||
`lockoutPeriod` should be in seconds.
|
||||
|
||||
`failureWindow` should be in seconds.
|
||||
|
||||
If the `default` is nice to you, you can do that.
|
||||
|
||||
```javascript
|
||||
(new AccountsLockout()).startup();
|
||||
```
|
||||
|
||||
You can overwrite passing an `object` as argument.
|
||||
|
||||
```javascript
|
||||
(new AccountsLockout({
|
||||
knownUsers: {
|
||||
failuresBeforeLockout: 3,
|
||||
lockoutPeriod: 60,
|
||||
failureWindow: 15,
|
||||
},
|
||||
unknownUsers: {
|
||||
failuresBeforeLockout: 3,
|
||||
lockoutPeriod: 60,
|
||||
failureWindow: 15,
|
||||
},
|
||||
})).startup();
|
||||
```
|
||||
|
||||
If you prefer, you can pass a `function` as argument.
|
||||
|
||||
```javascript
|
||||
const knownUsersRules = (user) => {
|
||||
// apply some logic with this user
|
||||
return {
|
||||
failuresBeforeLockout,
|
||||
lockoutPeriod,
|
||||
failureWindow,
|
||||
};
|
||||
};
|
||||
|
||||
const unknownUsersRules = (connection) => {
|
||||
// apply some logic with this connection
|
||||
return {
|
||||
failuresBeforeLockout,
|
||||
lockoutPeriod,
|
||||
failureWindow,
|
||||
};
|
||||
};
|
||||
|
||||
(new AccountsLockout({
|
||||
knownUsers: knownUsersRules,
|
||||
unknownUsers: unknownUsersRules,
|
||||
})).startup();
|
||||
```
|
||||
|
||||
If you prefer, you can use `Meteor.settings`. It will overwrite any previous case.
|
||||
|
||||
```javascript
|
||||
"accounts-lockout": {
|
||||
"knownUsers": {
|
||||
"failuresBeforeLockout": 3,
|
||||
"lockoutPeriod": 60,
|
||||
"failureWindow": 10
|
||||
},
|
||||
"unknownUsers": {
|
||||
"failuresBeforeLockout": 3,
|
||||
"lockoutPeriod": 60,
|
||||
"failureWindow": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This package is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT).
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
import AccountsLockout from './src/accountsLockout';
|
||||
|
||||
const Name = 'wekan-accounts-lockout';
|
||||
|
||||
export { Name, AccountsLockout };
|
||||
@@ -0,0 +1,18 @@
|
||||
/* global Package */
|
||||
|
||||
Package.describe({
|
||||
name: 'wekan-accounts-lockout',
|
||||
version: '1.0.0',
|
||||
summary: 'Meteor package for locking user accounts and stopping brute force attacks',
|
||||
git: 'https://github.com/lucasantoniassi/meteor-accounts-lockout.git',
|
||||
documentation: 'README.md',
|
||||
});
|
||||
|
||||
Package.onUse((api) => {
|
||||
api.versionsFrom('1.4.2.3');
|
||||
api.use([
|
||||
'ecmascript',
|
||||
'accounts-password',
|
||||
]);
|
||||
api.mainModule('accounts-lockout.js');
|
||||
});
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "wekan-accounts-lockout",
|
||||
"private": true
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import KnownUser from './knownUser';
|
||||
import UnknownUser from './unknownUser';
|
||||
|
||||
class AccountsLockout {
|
||||
constructor({
|
||||
knownUsers = {
|
||||
failuresBeforeLockout: 3,
|
||||
lockoutPeriod: 60,
|
||||
failureWindow: 15,
|
||||
},
|
||||
unknownUsers = {
|
||||
failuresBeforeLockout: 3,
|
||||
lockoutPeriod: 60,
|
||||
failureWindow: 15,
|
||||
},
|
||||
}) {
|
||||
this.settings = {
|
||||
knownUsers,
|
||||
unknownUsers,
|
||||
};
|
||||
}
|
||||
|
||||
startup() {
|
||||
(new KnownUser(this.settings.knownUsers)).startup();
|
||||
(new UnknownUser(this.settings.unknownUsers)).startup();
|
||||
}
|
||||
}
|
||||
|
||||
export default AccountsLockout;
|
||||
@@ -0,0 +1,3 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
|
||||
export default new Meteor.Collection('AccountsLockout.Connections');
|
||||
@@ -0,0 +1,321 @@
|
||||
/* eslint-disable no-underscore-dangle */
|
||||
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { Accounts } from 'meteor/accounts-base';
|
||||
|
||||
class KnownUser {
|
||||
constructor(settings) {
|
||||
this.unchangedSettings = settings;
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
startup() {
|
||||
if (!(this.unchangedSettings instanceof Function)) {
|
||||
this.updateSettings();
|
||||
}
|
||||
this.scheduleUnlocksForLockedAccounts();
|
||||
KnownUser.unlockAccountsIfLockoutAlreadyExpired();
|
||||
this.hookIntoAccounts();
|
||||
}
|
||||
|
||||
updateSettings() {
|
||||
const settings = KnownUser.knownUsers();
|
||||
if (settings) {
|
||||
settings.forEach(function updateSetting({ key, value }) {
|
||||
this.settings[key] = value;
|
||||
});
|
||||
}
|
||||
this.validateSettings();
|
||||
}
|
||||
|
||||
validateSettings() {
|
||||
if (
|
||||
!this.settings.failuresBeforeLockout ||
|
||||
this.settings.failuresBeforeLockout < 0
|
||||
) {
|
||||
throw new Error('"failuresBeforeLockout" is not positive integer');
|
||||
}
|
||||
if (
|
||||
!this.settings.lockoutPeriod ||
|
||||
this.settings.lockoutPeriod < 0
|
||||
) {
|
||||
throw new Error('"lockoutPeriod" is not positive integer');
|
||||
}
|
||||
if (
|
||||
!this.settings.failureWindow ||
|
||||
this.settings.failureWindow < 0
|
||||
) {
|
||||
throw new Error('"failureWindow" is not positive integer');
|
||||
}
|
||||
}
|
||||
|
||||
scheduleUnlocksForLockedAccounts() {
|
||||
const lockedAccountsCursor = Meteor.users.find(
|
||||
{
|
||||
'services.accounts-lockout.unlockTime': {
|
||||
$gt: Number(new Date()),
|
||||
},
|
||||
},
|
||||
{
|
||||
fields: {
|
||||
'services.accounts-lockout.unlockTime': 1,
|
||||
},
|
||||
},
|
||||
);
|
||||
const currentTime = Number(new Date());
|
||||
lockedAccountsCursor.forEach((user) => {
|
||||
let lockDuration = KnownUser.unlockTime(user) - currentTime;
|
||||
if (lockDuration >= this.settings.lockoutPeriod) {
|
||||
lockDuration = this.settings.lockoutPeriod * 1000;
|
||||
}
|
||||
if (lockDuration <= 1) {
|
||||
lockDuration = 1;
|
||||
}
|
||||
Meteor.setTimeout(
|
||||
KnownUser.unlockAccount.bind(null, user._id),
|
||||
lockDuration,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
static unlockAccountsIfLockoutAlreadyExpired() {
|
||||
const currentTime = Number(new Date());
|
||||
const query = {
|
||||
'services.accounts-lockout.unlockTime': {
|
||||
$lt: currentTime,
|
||||
},
|
||||
};
|
||||
const data = {
|
||||
$unset: {
|
||||
'services.accounts-lockout.unlockTime': 0,
|
||||
'services.accounts-lockout.failedAttempts': 0,
|
||||
},
|
||||
};
|
||||
Meteor.users.update(query, data);
|
||||
}
|
||||
|
||||
hookIntoAccounts() {
|
||||
Accounts.validateLoginAttempt(this.validateLoginAttempt.bind(this));
|
||||
Accounts.onLogin(KnownUser.onLogin);
|
||||
}
|
||||
|
||||
|
||||
validateLoginAttempt(loginInfo) {
|
||||
if (
|
||||
// don't interrupt non-password logins
|
||||
loginInfo.type !== 'password' ||
|
||||
loginInfo.user === undefined ||
|
||||
// Don't handle errors unless they are due to incorrect password
|
||||
(loginInfo.error !== undefined && loginInfo.error.reason !== 'Incorrect password')
|
||||
) {
|
||||
return loginInfo.allowed;
|
||||
}
|
||||
|
||||
// If there was no login error and the account is NOT locked, don't interrupt
|
||||
const unlockTime = KnownUser.unlockTime(loginInfo.user);
|
||||
if (loginInfo.error === undefined && unlockTime === 0) {
|
||||
return loginInfo.allowed;
|
||||
}
|
||||
|
||||
if (this.unchangedSettings instanceof Function) {
|
||||
this.settings = this.unchangedSettings(loginInfo.user);
|
||||
this.validateSettings();
|
||||
}
|
||||
|
||||
const userId = loginInfo.user._id;
|
||||
let failedAttempts = 1 + KnownUser.failedAttempts(loginInfo.user);
|
||||
const firstFailedAttempt = KnownUser.firstFailedAttempt(loginInfo.user);
|
||||
const currentTime = Number(new Date());
|
||||
|
||||
const canReset = (currentTime - firstFailedAttempt) > (1000 * this.settings.failureWindow);
|
||||
if (canReset) {
|
||||
failedAttempts = 1;
|
||||
KnownUser.resetAttempts(failedAttempts, userId);
|
||||
}
|
||||
|
||||
const canIncrement = failedAttempts < this.settings.failuresBeforeLockout;
|
||||
if (canIncrement) {
|
||||
KnownUser.incrementAttempts(failedAttempts, userId);
|
||||
}
|
||||
|
||||
const maxAttemptsAllowed = this.settings.failuresBeforeLockout;
|
||||
const attemptsRemaining = maxAttemptsAllowed - failedAttempts;
|
||||
if (unlockTime > currentTime) {
|
||||
let duration = unlockTime - currentTime;
|
||||
duration = Math.ceil(duration / 1000);
|
||||
duration = duration > 1 ? duration : 1;
|
||||
KnownUser.tooManyAttempts(duration);
|
||||
}
|
||||
if (failedAttempts === maxAttemptsAllowed) {
|
||||
this.setNewUnlockTime(failedAttempts, userId);
|
||||
|
||||
let duration = this.settings.lockoutPeriod;
|
||||
duration = Math.ceil(duration);
|
||||
duration = duration > 1 ? duration : 1;
|
||||
return KnownUser.tooManyAttempts(duration);
|
||||
}
|
||||
return KnownUser.incorrectPassword(
|
||||
failedAttempts,
|
||||
maxAttemptsAllowed,
|
||||
attemptsRemaining,
|
||||
);
|
||||
}
|
||||
|
||||
static resetAttempts(
|
||||
failedAttempts,
|
||||
userId,
|
||||
) {
|
||||
const currentTime = Number(new Date());
|
||||
const query = { _id: userId };
|
||||
const data = {
|
||||
$set: {
|
||||
'services.accounts-lockout.failedAttempts': failedAttempts,
|
||||
'services.accounts-lockout.lastFailedAttempt': currentTime,
|
||||
'services.accounts-lockout.firstFailedAttempt': currentTime,
|
||||
},
|
||||
};
|
||||
Meteor.users.update(query, data);
|
||||
}
|
||||
|
||||
static incrementAttempts(
|
||||
failedAttempts,
|
||||
userId,
|
||||
) {
|
||||
const currentTime = Number(new Date());
|
||||
const query = { _id: userId };
|
||||
const data = {
|
||||
$set: {
|
||||
'services.accounts-lockout.failedAttempts': failedAttempts,
|
||||
'services.accounts-lockout.lastFailedAttempt': currentTime,
|
||||
},
|
||||
};
|
||||
Meteor.users.update(query, data);
|
||||
}
|
||||
|
||||
setNewUnlockTime(
|
||||
failedAttempts,
|
||||
userId,
|
||||
) {
|
||||
const currentTime = Number(new Date());
|
||||
const newUnlockTime = (1000 * this.settings.lockoutPeriod) + currentTime;
|
||||
const query = { _id: userId };
|
||||
const data = {
|
||||
$set: {
|
||||
'services.accounts-lockout.failedAttempts': failedAttempts,
|
||||
'services.accounts-lockout.lastFailedAttempt': currentTime,
|
||||
'services.accounts-lockout.unlockTime': newUnlockTime,
|
||||
},
|
||||
};
|
||||
Meteor.users.update(query, data);
|
||||
Meteor.setTimeout(
|
||||
KnownUser.unlockAccount.bind(null, userId),
|
||||
this.settings.lockoutPeriod * 1000,
|
||||
);
|
||||
}
|
||||
|
||||
static onLogin(loginInfo) {
|
||||
if (loginInfo.type !== 'password') {
|
||||
return;
|
||||
}
|
||||
const userId = loginInfo.user._id;
|
||||
const query = { _id: userId };
|
||||
const data = {
|
||||
$unset: {
|
||||
'services.accounts-lockout.unlockTime': 0,
|
||||
'services.accounts-lockout.failedAttempts': 0,
|
||||
},
|
||||
};
|
||||
Meteor.users.update(query, data);
|
||||
}
|
||||
|
||||
static incorrectPassword(
|
||||
failedAttempts,
|
||||
maxAttemptsAllowed,
|
||||
attemptsRemaining,
|
||||
) {
|
||||
throw new Meteor.Error(
|
||||
403,
|
||||
'Incorrect password',
|
||||
JSON.stringify({
|
||||
message: 'Incorrect password',
|
||||
failedAttempts,
|
||||
maxAttemptsAllowed,
|
||||
attemptsRemaining,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
static tooManyAttempts(duration) {
|
||||
throw new Meteor.Error(
|
||||
403,
|
||||
'Too many attempts',
|
||||
JSON.stringify({
|
||||
message: 'Wrong passwords were submitted too many times. Account is locked for a while.',
|
||||
duration,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
static knownUsers() {
|
||||
let knownUsers;
|
||||
try {
|
||||
knownUsers = Meteor.settings['accounts-lockout'].knownUsers;
|
||||
} catch (e) {
|
||||
knownUsers = false;
|
||||
}
|
||||
return knownUsers || false;
|
||||
}
|
||||
|
||||
static unlockTime(user) {
|
||||
let unlockTime;
|
||||
try {
|
||||
unlockTime = user.services['accounts-lockout'].unlockTime;
|
||||
} catch (e) {
|
||||
unlockTime = 0;
|
||||
}
|
||||
return unlockTime || 0;
|
||||
}
|
||||
|
||||
static failedAttempts(user) {
|
||||
let failedAttempts;
|
||||
try {
|
||||
failedAttempts = user.services['accounts-lockout'].failedAttempts;
|
||||
} catch (e) {
|
||||
failedAttempts = 0;
|
||||
}
|
||||
return failedAttempts || 0;
|
||||
}
|
||||
|
||||
static lastFailedAttempt(user) {
|
||||
let lastFailedAttempt;
|
||||
try {
|
||||
lastFailedAttempt = user.services['accounts-lockout'].lastFailedAttempt;
|
||||
} catch (e) {
|
||||
lastFailedAttempt = 0;
|
||||
}
|
||||
return lastFailedAttempt || 0;
|
||||
}
|
||||
|
||||
static firstFailedAttempt(user) {
|
||||
let firstFailedAttempt;
|
||||
try {
|
||||
firstFailedAttempt = user.services['accounts-lockout'].firstFailedAttempt;
|
||||
} catch (e) {
|
||||
firstFailedAttempt = 0;
|
||||
}
|
||||
return firstFailedAttempt || 0;
|
||||
}
|
||||
|
||||
static unlockAccount(userId) {
|
||||
const query = { _id: userId };
|
||||
const data = {
|
||||
$unset: {
|
||||
'services.accounts-lockout.unlockTime': 0,
|
||||
'services.accounts-lockout.failedAttempts': 0,
|
||||
},
|
||||
};
|
||||
Meteor.users.update(query, data);
|
||||
}
|
||||
}
|
||||
|
||||
export default KnownUser;
|
||||
@@ -0,0 +1,329 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { Accounts } from 'meteor/accounts-base';
|
||||
import _AccountsLockoutCollection from './accountsLockoutCollection';
|
||||
|
||||
class UnknownUser {
|
||||
constructor(
|
||||
settings,
|
||||
{
|
||||
AccountsLockoutCollection = _AccountsLockoutCollection,
|
||||
} = {},
|
||||
) {
|
||||
this.AccountsLockoutCollection = AccountsLockoutCollection;
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
startup() {
|
||||
if (!(this.settings instanceof Function)) {
|
||||
this.updateSettings();
|
||||
}
|
||||
this.scheduleUnlocksForLockedAccounts();
|
||||
this.unlockAccountsIfLockoutAlreadyExpired();
|
||||
this.hookIntoAccounts();
|
||||
}
|
||||
|
||||
updateSettings() {
|
||||
const settings = UnknownUser.unknownUsers();
|
||||
if (settings) {
|
||||
settings.forEach(function updateSetting({ key, value }) {
|
||||
this.settings[key] = value;
|
||||
});
|
||||
}
|
||||
this.validateSettings();
|
||||
}
|
||||
|
||||
validateSettings() {
|
||||
if (
|
||||
!this.settings.failuresBeforeLockout ||
|
||||
this.settings.failuresBeforeLockout < 0
|
||||
) {
|
||||
throw new Error('"failuresBeforeLockout" is not positive integer');
|
||||
}
|
||||
if (
|
||||
!this.settings.lockoutPeriod ||
|
||||
this.settings.lockoutPeriod < 0
|
||||
) {
|
||||
throw new Error('"lockoutPeriod" is not positive integer');
|
||||
}
|
||||
if (
|
||||
!this.settings.failureWindow ||
|
||||
this.settings.failureWindow < 0
|
||||
) {
|
||||
throw new Error('"failureWindow" is not positive integer');
|
||||
}
|
||||
}
|
||||
|
||||
scheduleUnlocksForLockedAccounts() {
|
||||
const lockedAccountsCursor = this.AccountsLockoutCollection.find(
|
||||
{
|
||||
'services.accounts-lockout.unlockTime': {
|
||||
$gt: Number(new Date()),
|
||||
},
|
||||
},
|
||||
{
|
||||
fields: {
|
||||
'services.accounts-lockout.unlockTime': 1,
|
||||
},
|
||||
},
|
||||
);
|
||||
const currentTime = Number(new Date());
|
||||
lockedAccountsCursor.forEach((connection) => {
|
||||
let lockDuration = this.unlockTime(connection) - currentTime;
|
||||
if (lockDuration >= this.settings.lockoutPeriod) {
|
||||
lockDuration = this.settings.lockoutPeriod * 1000;
|
||||
}
|
||||
if (lockDuration <= 1) {
|
||||
lockDuration = 1;
|
||||
}
|
||||
Meteor.setTimeout(
|
||||
this.unlockAccount.bind(this, connection.clientAddress),
|
||||
lockDuration,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
unlockAccountsIfLockoutAlreadyExpired() {
|
||||
const currentTime = Number(new Date());
|
||||
const query = {
|
||||
'services.accounts-lockout.unlockTime': {
|
||||
$lt: currentTime,
|
||||
},
|
||||
};
|
||||
const data = {
|
||||
$unset: {
|
||||
'services.accounts-lockout.unlockTime': 0,
|
||||
'services.accounts-lockout.failedAttempts': 0,
|
||||
},
|
||||
};
|
||||
this.AccountsLockoutCollection.update(query, data);
|
||||
}
|
||||
|
||||
hookIntoAccounts() {
|
||||
Accounts.validateLoginAttempt(this.validateLoginAttempt.bind(this));
|
||||
Accounts.onLogin(this.onLogin.bind(this));
|
||||
}
|
||||
|
||||
validateLoginAttempt(loginInfo) {
|
||||
// don't interrupt non-password logins
|
||||
if (
|
||||
loginInfo.type !== 'password' ||
|
||||
loginInfo.user !== undefined ||
|
||||
loginInfo.error === undefined ||
|
||||
loginInfo.error.reason !== 'User not found'
|
||||
) {
|
||||
return loginInfo.allowed;
|
||||
}
|
||||
|
||||
if (this.settings instanceof Function) {
|
||||
this.settings = this.settings(loginInfo.connection);
|
||||
this.validateSettings();
|
||||
}
|
||||
|
||||
const clientAddress = loginInfo.connection.clientAddress;
|
||||
const unlockTime = this.unlockTime(loginInfo.connection);
|
||||
let failedAttempts = 1 + this.failedAttempts(loginInfo.connection);
|
||||
const firstFailedAttempt = this.firstFailedAttempt(loginInfo.connection);
|
||||
const currentTime = Number(new Date());
|
||||
|
||||
const canReset = (currentTime - firstFailedAttempt) > (1000 * this.settings.failureWindow);
|
||||
if (canReset) {
|
||||
failedAttempts = 1;
|
||||
this.resetAttempts(failedAttempts, clientAddress);
|
||||
}
|
||||
|
||||
const canIncrement = failedAttempts < this.settings.failuresBeforeLockout;
|
||||
if (canIncrement) {
|
||||
this.incrementAttempts(failedAttempts, clientAddress);
|
||||
}
|
||||
|
||||
const maxAttemptsAllowed = this.settings.failuresBeforeLockout;
|
||||
const attemptsRemaining = maxAttemptsAllowed - failedAttempts;
|
||||
if (unlockTime > currentTime) {
|
||||
let duration = unlockTime - currentTime;
|
||||
duration = Math.ceil(duration / 1000);
|
||||
duration = duration > 1 ? duration : 1;
|
||||
UnknownUser.tooManyAttempts(duration);
|
||||
}
|
||||
if (failedAttempts === maxAttemptsAllowed) {
|
||||
this.setNewUnlockTime(failedAttempts, clientAddress);
|
||||
|
||||
let duration = this.settings.lockoutPeriod;
|
||||
duration = Math.ceil(duration);
|
||||
duration = duration > 1 ? duration : 1;
|
||||
return UnknownUser.tooManyAttempts(duration);
|
||||
}
|
||||
return UnknownUser.userNotFound(
|
||||
failedAttempts,
|
||||
maxAttemptsAllowed,
|
||||
attemptsRemaining,
|
||||
);
|
||||
}
|
||||
|
||||
resetAttempts(
|
||||
failedAttempts,
|
||||
clientAddress,
|
||||
) {
|
||||
const currentTime = Number(new Date());
|
||||
const query = { clientAddress };
|
||||
const data = {
|
||||
$set: {
|
||||
'services.accounts-lockout.failedAttempts': failedAttempts,
|
||||
'services.accounts-lockout.lastFailedAttempt': currentTime,
|
||||
'services.accounts-lockout.firstFailedAttempt': currentTime,
|
||||
},
|
||||
};
|
||||
this.AccountsLockoutCollection.upsert(query, data);
|
||||
}
|
||||
|
||||
incrementAttempts(
|
||||
failedAttempts,
|
||||
clientAddress,
|
||||
) {
|
||||
const currentTime = Number(new Date());
|
||||
const query = { clientAddress };
|
||||
const data = {
|
||||
$set: {
|
||||
'services.accounts-lockout.failedAttempts': failedAttempts,
|
||||
'services.accounts-lockout.lastFailedAttempt': currentTime,
|
||||
},
|
||||
};
|
||||
this.AccountsLockoutCollection.upsert(query, data);
|
||||
}
|
||||
|
||||
setNewUnlockTime(
|
||||
failedAttempts,
|
||||
clientAddress,
|
||||
) {
|
||||
const currentTime = Number(new Date());
|
||||
const newUnlockTime = (1000 * this.settings.lockoutPeriod) + currentTime;
|
||||
const query = { clientAddress };
|
||||
const data = {
|
||||
$set: {
|
||||
'services.accounts-lockout.failedAttempts': failedAttempts,
|
||||
'services.accounts-lockout.lastFailedAttempt': currentTime,
|
||||
'services.accounts-lockout.unlockTime': newUnlockTime,
|
||||
},
|
||||
};
|
||||
this.AccountsLockoutCollection.upsert(query, data);
|
||||
Meteor.setTimeout(
|
||||
this.unlockAccount.bind(this, clientAddress),
|
||||
this.settings.lockoutPeriod * 1000,
|
||||
);
|
||||
}
|
||||
|
||||
onLogin(loginInfo) {
|
||||
if (loginInfo.type !== 'password') {
|
||||
return;
|
||||
}
|
||||
const clientAddress = loginInfo.connection.clientAddress;
|
||||
const query = { clientAddress };
|
||||
const data = {
|
||||
$unset: {
|
||||
'services.accounts-lockout.unlockTime': 0,
|
||||
'services.accounts-lockout.failedAttempts': 0,
|
||||
},
|
||||
};
|
||||
this.AccountsLockoutCollection.update(query, data);
|
||||
}
|
||||
|
||||
static userNotFound(
|
||||
failedAttempts,
|
||||
maxAttemptsAllowed,
|
||||
attemptsRemaining,
|
||||
) {
|
||||
throw new Meteor.Error(
|
||||
403,
|
||||
'User not found',
|
||||
JSON.stringify({
|
||||
message: 'User not found',
|
||||
failedAttempts,
|
||||
maxAttemptsAllowed,
|
||||
attemptsRemaining,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
static tooManyAttempts(duration) {
|
||||
throw new Meteor.Error(
|
||||
403,
|
||||
'Too many attempts',
|
||||
JSON.stringify({
|
||||
message: 'Wrong emails were submitted too many times. Account is locked for a while.',
|
||||
duration,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
static unknownUsers() {
|
||||
let unknownUsers;
|
||||
try {
|
||||
unknownUsers = Meteor.settings['accounts-lockout'].unknownUsers;
|
||||
} catch (e) {
|
||||
unknownUsers = false;
|
||||
}
|
||||
return unknownUsers || false;
|
||||
}
|
||||
|
||||
findOneByConnection(connection) {
|
||||
return this.AccountsLockoutCollection.findOne({
|
||||
clientAddress: connection.clientAddress,
|
||||
});
|
||||
}
|
||||
|
||||
unlockTime(connection) {
|
||||
connection = this.findOneByConnection(connection);
|
||||
let unlockTime;
|
||||
try {
|
||||
unlockTime = connection.services['accounts-lockout'].unlockTime;
|
||||
} catch (e) {
|
||||
unlockTime = 0;
|
||||
}
|
||||
return unlockTime || 0;
|
||||
}
|
||||
|
||||
failedAttempts(connection) {
|
||||
connection = this.findOneByConnection(connection);
|
||||
let failedAttempts;
|
||||
try {
|
||||
failedAttempts = connection.services['accounts-lockout'].failedAttempts;
|
||||
} catch (e) {
|
||||
failedAttempts = 0;
|
||||
}
|
||||
return failedAttempts || 0;
|
||||
}
|
||||
|
||||
lastFailedAttempt(connection) {
|
||||
connection = this.findOneByConnection(connection);
|
||||
let lastFailedAttempt;
|
||||
try {
|
||||
lastFailedAttempt = connection.services['accounts-lockout'].lastFailedAttempt;
|
||||
} catch (e) {
|
||||
lastFailedAttempt = 0;
|
||||
}
|
||||
return lastFailedAttempt || 0;
|
||||
}
|
||||
|
||||
firstFailedAttempt(connection) {
|
||||
connection = this.findOneByConnection(connection);
|
||||
let firstFailedAttempt;
|
||||
try {
|
||||
firstFailedAttempt = connection.services['accounts-lockout'].firstFailedAttempt;
|
||||
} catch (e) {
|
||||
firstFailedAttempt = 0;
|
||||
}
|
||||
return firstFailedAttempt || 0;
|
||||
}
|
||||
|
||||
unlockAccount(clientAddress) {
|
||||
const query = { clientAddress };
|
||||
const data = {
|
||||
$unset: {
|
||||
'services.accounts-lockout.unlockTime': 0,
|
||||
'services.accounts-lockout.failedAttempts': 0,
|
||||
},
|
||||
};
|
||||
this.AccountsLockoutCollection.update(query, data);
|
||||
}
|
||||
}
|
||||
|
||||
export default UnknownUser;
|
||||
+15
-4
@@ -7,7 +7,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>Wekan REST API v5.34</title>
|
||||
<title>Wekan REST API v5.35</title>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@@ -1553,7 +1553,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
<ul class="toc-list-h1">
|
||||
|
||||
<li>
|
||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.34">Wekan REST API v5.34</a>
|
||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.35">Wekan REST API v5.35</a>
|
||||
|
||||
</li>
|
||||
|
||||
@@ -2116,7 +2116,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
<div class="page-wrapper">
|
||||
<div class="dark-box"></div>
|
||||
<div class="content">
|
||||
<h1 id="wekan-rest-api">Wekan REST API v5.34</h1>
|
||||
<h1 id="wekan-rest-api">Wekan REST API v5.35</h1>
|
||||
<blockquote>
|
||||
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
|
||||
</blockquote>
|
||||
@@ -16000,6 +16000,7 @@ System.out.println(response.toString());
|
||||
<span class="hljs-attr">"fullname"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"showDesktopDragHandles"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hideCheckedItems"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"cardMaximized"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenSystemMessages"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenMinicardLabelText"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"initials"</span>: <span class="hljs-string">"string"</span>,
|
||||
@@ -16752,6 +16753,7 @@ System.out.println(response.toString());
|
||||
<span class="hljs-attr">"fullname"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"showDesktopDragHandles"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hideCheckedItems"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"cardMaximized"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenSystemMessages"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenMinicardLabelText"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"initials"</span>: <span class="hljs-string">"string"</span>,
|
||||
@@ -20783,6 +20785,7 @@ UserSecurity
|
||||
<span class="hljs-attr">"fullname"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"showDesktopDragHandles"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hideCheckedItems"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"cardMaximized"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenSystemMessages"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenMinicardLabelText"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"initials"</span>: <span class="hljs-string">"string"</span>,
|
||||
@@ -20957,6 +20960,7 @@ UserSecurity
|
||||
<span class="hljs-attr">"fullname"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"showDesktopDragHandles"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hideCheckedItems"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"cardMaximized"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenSystemMessages"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"hiddenMinicardLabelText"</span>: <span class="hljs-literal">true</span>,
|
||||
<span class="hljs-attr">"initials"</span>: <span class="hljs-string">"string"</span>,
|
||||
@@ -21023,7 +21027,7 @@ UserSecurity
|
||||
<td>boolean</td>
|
||||
<td>false</td>
|
||||
<td>none</td>
|
||||
<td>does the user want to hide system messages?</td>
|
||||
<td>does the user want to show desktop drag handles?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>hideCheckedItems</td>
|
||||
@@ -21033,6 +21037,13 @@ UserSecurity
|
||||
<td>does the user want to hide checked checklist items?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>cardMaximized</td>
|
||||
<td>boolean</td>
|
||||
<td>false</td>
|
||||
<td>none</td>
|
||||
<td>has user clicked maximize card?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>hiddenSystemMessages</td>
|
||||
<td>boolean</td>
|
||||
<td>false</td>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
swagger: '2.0'
|
||||
info:
|
||||
title: Wekan REST API
|
||||
version: v5.34
|
||||
version: v5.35
|
||||
description: |
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
@@ -3841,12 +3841,16 @@ definitions:
|
||||
type: string
|
||||
showDesktopDragHandles:
|
||||
description: |
|
||||
does the user want to hide system messages?
|
||||
does the user want to show desktop drag handles?
|
||||
type: boolean
|
||||
hideCheckedItems:
|
||||
description: |
|
||||
does the user want to hide checked checklist items?
|
||||
type: boolean
|
||||
cardMaximized:
|
||||
description: |
|
||||
has user clicked maximize card?
|
||||
type: boolean
|
||||
hiddenSystemMessages:
|
||||
description: |
|
||||
does the user want to hide system messages?
|
||||
|
||||
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||
appTitle = (defaultText = "Wekan"),
|
||||
# The name of the app as it is displayed to the user.
|
||||
|
||||
appVersion = 534,
|
||||
appVersion = 535,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "5.34.0~2021-06-11"),
|
||||
appMarketingVersion = (defaultText = "5.35.0~2021-06-14"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
||||
+25
-20
@@ -1,21 +1,26 @@
|
||||
// https://atmospherejs.com/lucasantoniassi/accounts-lockout
|
||||
// server
|
||||
import { AccountsLockout } from 'meteor/lucasantoniassi:accounts-lockout';
|
||||
Meteor.startup(() => {
|
||||
// https://atmospherejs.com/lucasantoniassi/accounts-lockout
|
||||
// server
|
||||
|
||||
new AccountsLockout({
|
||||
knownUsers: {
|
||||
failuresBeforeLockout:
|
||||
process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE || 3,
|
||||
lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD || 60,
|
||||
failureWindow:
|
||||
process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW || 15,
|
||||
},
|
||||
unknownUsers: {
|
||||
failuresBeforeLockout:
|
||||
process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE || 3,
|
||||
lockoutPeriod:
|
||||
process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD || 60,
|
||||
failureWindow:
|
||||
process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW || 15,
|
||||
},
|
||||
}).startup();
|
||||
if (Meteor.isServer) {
|
||||
import { AccountsLockout } from 'meteor/wekan-accounts-lockout';
|
||||
|
||||
new AccountsLockout({
|
||||
knownUsers: {
|
||||
failuresBeforeLockout:
|
||||
process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE || 3,
|
||||
lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD || 60,
|
||||
failureWindow:
|
||||
process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW || 15,
|
||||
},
|
||||
unknownUsers: {
|
||||
failuresBeforeLockout:
|
||||
process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE || 3,
|
||||
lockoutPeriod:
|
||||
process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD || 60,
|
||||
failureWindow:
|
||||
process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW || 15,
|
||||
},
|
||||
}).startup();
|
||||
}
|
||||
});
|
||||
Loaded 100 of 101 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user