Compare commits

...
40 Commits
Author SHA1 Message Date
Lauri Ojansivu c437c2048d v5.35 2021-06-14 15:35:23 +03:00
Lauri Ojansivu f80fcfd7c0 Updated dependencies.
Thanks to developers of dependencies !
2021-06-14 15:31:06 +03:00
Lauri Ojansivu e9670aa5cb Updated ChangeLog. 2021-06-14 15:14:39 +03:00
Lauri Ojansivu 164b6e9070 Part 2: Allow board members to use more of API. Please add issue (or pull request) if this allows too much.
Thanks to JayVii and xet7 !

Fixes #3862
2021-06-14 15:13:15 +03:00
Lauri Ojansivu 5af18809a7 Updated ChangeLog. 2021-06-14 15:04:55 +03:00
Lauri Ojansivu a719e8fda1 Allow board members to use more of API. Please add issue (or pull request) if this allows too much.
Thanks to JayVii and xet7 !

Fixes #3862
2021-06-14 15:01:37 +03:00
Lauri Ojansivu 50fa8a0743 Updated translations. 2021-06-14 14:31:27 +03:00
Lauri Ojansivu 9e160d2431 Updated ChangeLog. 2021-06-14 13:04:19 +03:00
Lauri Ojansivu 77cff95c07 Merge pull request #3863 from mfilser/card_details_maximize_fixes
Card details maximize fixes
2021-06-14 13:01:41 +03:00
Martin Filser b98a46b78c forms.styl, wrong indentation 2021-06-14 11:05:37 +02:00
Martin Filser 49e31707e5 Card Details, minicard is now hidden 2021-06-14 11:05:46 +02:00
Martin Filser 92122e1fdd Card Details, maximize and minimize of card works now 2021-06-14 11:05:42 +02:00
Martin Filser 7238a65a6f Card Details, more space at maximize icon 2021-06-14 11:05:37 +02:00
Martin Filser e68ccf8532 Card Details, maximize and minimize of icon works
- Card isn't maximized yet
2021-06-14 11:05:37 +02:00
Lauri Ojansivu 362fd86dbf Updated translations. 2021-06-13 17:56:30 +03:00
Lauri Ojansivu 8aba58188d Updated ChangeLog. 2021-06-13 15:51:49 +03:00
Lauri Ojansivu 41848dd99e Merge pull request #3861 from mfilser/manual_sort_number_0_accepted
Manuel sort number 0 accepted
2021-06-13 15:49:34 +03:00
Martin Filser f2fcfd6a47 Manuel sort number 0 accepted
Fixes: #3859
2021-06-13 10:39:44 +02:00
Lauri Ojansivu 33cdb906e2 Updated translations. 2021-06-13 08:49:08 +03:00
Lauri Ojansivu 19e73009b1 Updated ChangeLog. 2021-06-13 00:17:23 +03:00
Lauri Ojansivu 401e256d84 Updated translations. 2021-06-12 23:49:49 +03:00
Lauri Ojansivu e1cd87433a Updated ChangeLog. 2021-06-12 23:37:24 +03:00
Lauri Ojansivu 23e5e1e3bd Reduced Wekan bundle size from 636 MB to 467 MB by deleting all
dependencies of lucasantoniassi:accounts-lockout and including
only required 10 files.

Thank to xet7 !
2021-06-12 23:28:57 +03:00
Lauri Ojansivu 8f19f043a1 Updated translations. 2021-06-12 15:19:20 +03:00
Lauri Ojansivu b1f07149c0 Updated ChangeLog. 2021-06-12 15:16:38 +03:00
Lauri Ojansivu 17acf18848 Export card to PDF. Part 2.
Thanks to xet7 !
2021-06-12 15:15:36 +03:00
Lauri Ojansivu f52f589f7d Updated translations. 2021-06-12 15:01:48 +03:00
Lauri Ojansivu e3e25bc233 Updated ChangeLog. 2021-06-12 14:52:43 +03:00
Lauri Ojansivu a2f2ce1135 Export Card to PDF. In Progress.
Thanks to xet7 !
2021-06-12 14:50:18 +03:00
Lauri Ojansivu 90152ab9f5 Updated ChangeLog. 2021-06-12 13:07:27 +03:00
Lauri Ojansivu 7a25f542e8 Updated translations. 2021-06-12 12:58:53 +03:00
Lauri Ojansivu 8c57250243 Maximize Card. In Progress.
Thanks to xet7 !

Related #1574
2021-06-12 12:48:12 +03:00
Lauri Ojansivu 2e1eb1e224 Add border and update label colors for better visibility.
Thanks to xet7 !
2021-06-12 12:46:30 +03:00
Lauri Ojansivu b9a15e68de Updated translations. 2021-06-12 08:53:19 +03:00
Lauri Ojansivu a9d2e03b65 Updated translations. 2021-06-11 21:01:38 +03:00
Lauri Ojansivu d84b04dc35 Updated ChangeLog. 2021-06-11 20:56:23 +03:00
Lauri Ojansivu 7f3f082557 Added more translations for Wait Spinners.
Thanks to xet7 !
2021-06-11 20:54:52 +03:00
Lauri Ojansivu c810c68923 Updated translations. 2021-06-11 20:49:55 +03:00
Lauri Ojansivu 865a585c7f Updated ChangeLog. 2021-06-11 20:38:24 +03:00
Lauri Ojansivu 8703dd4229 Wait Spinners can now be translated. Added Wait Spinners docs:
https://github.com/wekan/wekan/wiki/Wait-Spinners

Thanks to xet7 !
2021-06-11 20:35:27 +03:00
101 changed files with 3406 additions and 714 deletions

No files matched your search

+2 -1
View File
@@ -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
View File
@@ -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
+46
View File
@@ -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
View File
@@ -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
+44 -2
View File
@@ -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'),
+51 -4
View File
@@ -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
+11
View File
@@ -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
+1 -1
View File
@@ -86,7 +86,7 @@ select
margin-bottom: 8px
&.inline
width: 100%
width: 100%
option[disabled]
color: #8c8c8c
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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')) {
+4 -4
View File
@@ -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
View File
@@ -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;
+6 -3
View File
@@ -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, {
+6 -3
View File
@@ -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
View File
@@ -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, {
+691
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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());
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v5.34.0",
"version": "v5.35.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
+1 -1
View File
@@ -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.
+21
View File
@@ -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.
+126
View File
@@ -0,0 +1,126 @@
# Meteor - Accounts - Lockout
[![Build Status](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout.svg?branch=master)](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/8ce60fa7e2c24891b9bdfc3b65433d23)](https://www.codacy.com/app/lucasantoniassi/meteor-accounts-lockout?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=LucasAntoniassi/meteor-accounts-lockout&amp;utm_campaign=Badge_Grade)
[![Code Climate](https://codeclimate.com/github/LucasAntoniassi/meteor-accounts-lockout/badges/gpa.svg)](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.
![you-shall-not-pass](https://cloud.githubusercontent.com/assets/3399956/9023729/007dd2a2-38b1-11e5-807a-b81c6ce00c80.jpg)
## 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
View File
@@ -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">&quot;fullname&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
<span class="hljs-attr">&quot;showDesktopDragHandles&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hideCheckedItems&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;cardMaximized&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenSystemMessages&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenMinicardLabelText&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;initials&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
@@ -16752,6 +16753,7 @@ System.out.println(response.toString());
<span class="hljs-attr">&quot;fullname&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
<span class="hljs-attr">&quot;showDesktopDragHandles&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hideCheckedItems&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;cardMaximized&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenSystemMessages&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenMinicardLabelText&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;initials&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
@@ -20783,6 +20785,7 @@ UserSecurity
<span class="hljs-attr">&quot;fullname&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
<span class="hljs-attr">&quot;showDesktopDragHandles&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hideCheckedItems&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;cardMaximized&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenSystemMessages&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenMinicardLabelText&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;initials&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
@@ -20957,6 +20960,7 @@ UserSecurity
<span class="hljs-attr">&quot;fullname&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
<span class="hljs-attr">&quot;showDesktopDragHandles&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hideCheckedItems&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;cardMaximized&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenSystemMessages&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;hiddenMinicardLabelText&quot;</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">&quot;initials&quot;</span>: <span class="hljs-string">&quot;string&quot;</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>
+6 -2
View File
@@ -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?
+2 -2
View File
@@ -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
View File
@@ -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