Compare commits

...
46 Commits
Author SHA1 Message Date
Lauri Ojansivu 402a974a70 v2.51 2019-03-21 01:22:09 +02:00
Lauri Ojansivu 079cd95e0e Merge pull request #2269 from andresmanelli/fix_2268
Fix #2268
2019-03-21 01:13:33 +02:00
Lauri Ojansivu e9f5aaa397 v2.50 2019-03-21 01:11:48 +02:00
Lauri Ojansivu ca0236fdfd [Fix](https://github.com/wekan/wekan/pull/2269) [Unable to change card title in Template](https://github.com/wekan/wekan/issues/2268)
and [Fix Unable to create a new board from a template](https://github.com/wekan/wekan/issues/2267).

Thanks to andresmanelli !

Closes 2268,
closes #2267
2019-03-21 00:56:18 +02:00
Lauri Ojansivu da3edb35cc v2.49 2019-03-21 00:39:35 +02:00
Andrés Manelli ef6054b859 Fix #2268 2019-03-20 23:32:52 +01:00
Lauri Ojansivu 1046976c08 [Fix Cards disappear when rearranged on template board](https://github.com/wekan/wekan/issues/2266).
Thanks to andresmanelli !

Closes #2266
2019-03-21 00:23:35 +02:00
Lauri Ojansivu f8cbbfc2cd Merge pull request #2270 from andresmanelli/fix_2266
Fix #2266
2019-03-21 00:21:19 +02:00
Lauri Ojansivu f083fc0d7b Update changelog. 2019-03-21 00:13:31 +02:00
Lauri Ojansivu 72cb820f1f Merge branch 'andresmanelli-fix_subtasks' into edge 2019-03-21 00:12:06 +02:00
Lauri Ojansivu d5d33247fb Merge branch 'fix_subtasks' of https://github.com/andresmanelli/wekan into andresmanelli-fix_subtasks 2019-03-20 23:50:43 +02:00
Lauri Ojansivu 9f95a10591 Update translations. 2019-03-20 21:45:56 +02:00
Lauri Ojansivu 5ca083105c Update changelog. 2019-03-20 21:36:19 +02:00
Lauri Ojansivu 6bc8d8dd56 git push origin edgeMerge branch 'andresmanelli-edge' into edge 2019-03-20 21:24:45 +02:00
Lauri Ojansivu dce89bcfa8 Merge branch 'edge' of https://github.com/andresmanelli/wekan into andresmanelli-edge 2019-03-20 19:30:44 +02:00
Lauri Ojansivu e5370ce859 Merge branch 'devel' of github.com:wekan/wekan into devel 2019-03-20 19:29:32 +02:00
Lauri Ojansivu 6f35d73fe8 Update changelog. 2019-03-20 19:28:56 +02:00
Lauri Ojansivu af2fb5f399 Merge pull request #2272 from justinr1234/patch-1
Don't swallow email errors
2019-03-20 19:26:00 +02:00
Lauri Ojansivu e976565550 Update changelog. 2019-03-20 19:25:28 +02:00
justinr1234 7a6b4adcc1 Disable eslint for console error 2019-03-18 23:50:15 -05:00
justinr1234 ec30665bc4 Don't swallow email errors
Fixes #2246
2019-03-18 23:06:18 -05:00
Andrés Manelli 9651d62b96 Fix #2266 2019-03-18 22:55:56 +01:00
Andrés Manelli a6e3c8984d Fix dissapearing subtasks 2019-03-17 16:37:06 +01:00
Andrés Manelli 777d9ac353 Lint fix 2019-03-16 23:15:30 +01:00
Andrés Manelli d01fccd949 - Fix card copy & move between boards with customFields
- Fix card copy & move between boards with labels with same name
- Fix activities for labels when copying and moving card
- Fix activities for customFields when copying and moving card
2019-03-16 22:49:45 +01:00
Andrés Manelli 4cd0d1c397 Migrate customFields 2019-03-16 22:49:45 +01:00
Lauri Ojansivu bf3ec060f7 Merge pull request #2263 from inoio/devel
make emails for invitations lowercase, compatible with AccountsTemplates
2019-03-16 16:24:02 +02:00
Ole Langbehn 40a3267615 make emails for invitations all lowercase for compatibility with AccountsTemplates
Email addresses for invitations are stored case sensitive in mongo,
together with the invitation codes. When someone tries to sign up due to
an invitation, in the sign up form, due to AccountsTemplates defaults,
the email address is lowercased on blur of the textbox. When they then
try to sign in, they get an error about the invitation code not existing.
This makes it impossible to successfully invite people using
non-lowercased email addresses.

This patch lowercases the emails on the client side when inviting them.

Other possibilities would be to lowercase them on the server side before
storing them to mongodb, making a case insensitive search on mongodb, or
making the email input field in the sign up form not lowercase the email
string.

This patch was chosen in favor of the other possibilities because of its
simplicity.
2019-03-16 14:32:39 +01:00
Lauri Ojansivu ff19d6744e v2.48 2019-03-15 11:08:07 +02:00
Lauri Ojansivu c26af16688 Update translations. 2019-03-15 11:03:52 +02:00
Lauri Ojansivu 216b3cfe01 Fix LDAP login.
Thanks to xet7 !

Closes wekan/wekan-ldap#43,
closes wekan/wekan-snap#85
2019-03-15 10:59:54 +02:00
Lauri Ojansivu fd70556c82 v2.47 2019-03-14 00:39:24 +02:00
Lauri Ojansivu 0fee20cc12 Update changelog. 2019-03-14 00:27:46 +02:00
Lauri Ojansivu 32f6de1eec Try to fix [LDAP Login: "Login forbidden", ReferenceError: req is not defined](https://github.com/wekan/wekan-ldap/issues/44).
Please test.

Thanks to xet7 !

Closes wekan/wekan-ldap#44
2019-03-14 00:25:40 +02:00
Lauri Ojansivu 8671f08a0e Remove ordering of cards by stars/color/description, so that cards would not reorder all the time.
Thanks to xet7 !

Closes #2241
2019-03-14 00:16:39 +02:00
Lauri Ojansivu 299484f7b2 v2.46 2019-03-13 15:55:52 +02:00
Lauri Ojansivu d16086fcdb Update changelog. 2019-03-13 15:40:20 +02:00
Lauri Ojansivu 1968b7da31 Revert hiding of Subtask boards, because of feedback from Wekan users,
that need Subtask boards to be visible.

Thanks to xet7 !
2019-03-13 15:35:34 +02:00
Lauri Ojansivu 95a40a45e5 Update translations. 2019-03-13 00:30:07 +02:00
Lauri Ojansivu 0ad7f080b7 Merge branch 'devel' of github.com:wekan/wekan into devel 2019-03-12 23:01:31 +02:00
Lauri Ojansivu aca3048036 Update changelog. 2019-03-12 23:01:18 +02:00
Lauri Ojansivu 1158cd42cc Merge pull request #2253 from justinr1234/devel
Fix watchers undefined #2252
2019-03-12 22:57:38 +02:00
Justin Reynolds 0e2b7458d7 Fix watchers undefined #2252 2019-03-12 12:04:59 -05:00
Lauri Ojansivu cf7d740004 v2.45 2019-03-11 23:39:05 +02:00
Lauri Ojansivu dc4c4d9ade Merge pull request #2248 from andresmanelli/circular_migration
Rename migration to re run
2019-03-11 23:32:46 +02:00
Andrés Manelli a347ae3676 Rename migration to re run 2019-03-11 22:30:16 +01:00
27 changed files with 759 additions and 555 deletions

No files matched your search

+72 -2
View File
@@ -1,3 +1,72 @@
# v2.51 2019-03-21 Wekan release
This release fixes the following bugs:
- [Fix Unable to change board card title (=Board name) at Templates page](https://github.com/wekan/wekan/issues/2275).
and [Unable to change card title in Template](https://github.com/wekan/wekan/issues/2268) part 2.
Thanks to andresmanelli.
Thanks to above GitHub users for their contributions.
# v2.50 2019-03-21 Wekan release
This release fixes the following bugs:
- [Fix](https://github.com/wekan/wekan/pull/2269) [Unable to change card title in Template](https://github.com/wekan/wekan/issues/2268)
and [Fix Unable to create a new board from a template](https://github.com/wekan/wekan/issues/2267).
Thanks to andresmanelli.
Thanks to above GitHub users for their contributions.
# v2.49 2019-03-21 Wekan release
This release fixes the following bugs:
- [The invitation code doesn't exist - case-sensitive eMail](https://github.com/wekan/wekan/issues/1384). Thanks to neurolabs.
- [Don't swallow email errors](https://github.com/wekan/wekan/pull/2272). Thanks to justinr1234.
- [Migrate customFields model](https://github.com/wekan/wekan/pull/2264].
Modifies the customFields model to keep an array of boardIds where the customField can be used.
Adds name matching for labels when copying/moving cards between boards.
This way, customFields are not lost when copying/moving a card. Particularly useful when templates have customFields or labels with specific names (not tested for templates yet).
Thanks to andresmanelli.
- [Fix dissapearing subtasks](https://github.com/wekan/wekan/pull/2265). Thanks to andresmanelli.
- [Cards disappear when rearranged on template board](https://github.com/wekan/wekan/issues/2266). Thanks to andresmanelli.
Thanks to above GitHub users for their contributions and translators for their translations.
# v2.48 2019-03-15 Wekan release
This release fixes the following bugs, thanks to GitHub user xet7:
- [Fix LDAP login](https://github.com/wekan/wekan/commit/216b3cfe0121aa026139536c383aa27db0353411).
Thanks to above GitHub users for their contributions and translators for their translations.
# v2.47 2019-03-14 Wekan release
This release fixes the following bugs, thanks to GitHub user xet7:
- [Remove ordering of cards by starred/color/description, so that cards would not reorder all the time](https://github.com/wekan/wekan/issues/2241).
- Try to fix [LDAP Login: "Login forbidden", ReferenceError: req is not defined](https://github.com/wekan/wekan-ldap/44).
# v2.46 2019-03-13 Wekan release
This release fixes the following bugs:
- [Fix watchers undefined](https://github.com/wekan/wekan/pull/2253).
Thanks to justinr1234.
- [Revert hiding of Subtask boards](https://github.com/wekan/wekan/commit/1968b7da31d75757fd6383417d729ff6af6bbc5b)
because of feedback from Wekan users, that need Subtask boards to be visible.
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v2.45 2019-03-11 Wekan release
This release fixes the following bugs, thanks to andresmanelli:
- [Rename circular card migration to re run the fix](https://github.com/wekan/wekan/commit/a347ae367654258b7768e7571831ed8f75fb5b84).
# v2.44 2019-03-11 Wekan release
This release adds the following new features and fixes with Apache I-CLA, thanks to bentiss:
@@ -19,7 +88,7 @@ and fixes the following bugs:
Thanks to andresmanelli.
- Try to fix [Order All Boards by starred, color, board name and board description. Part 2](https://github.com/wekan/wekan/commit/8f337f17e45f8af8d96b6043d54466e5878b7e0b).
Works on new Wekan install. Could still have boards keeping reording happening all the time on old Wekan installs.
Thanks to xet7.
Thanks to xet7. Note: Ordering by starred/color/description was removed at Wekan v2.47.
- [Changed brute force protection package from eluck:accounts-lockout to lucasantoniassi:accounts-lockout that is maintained and works.
Added Snap/Docker/Source settings](https://github.com/wekan/wekan/commit/b7c000b78b9af253fb115bbfa5ef0d4c0681abbb).
Thanks to xet7.
@@ -30,8 +99,9 @@ Thanks to above Wekan contributors for their contributions.
This release adds the following new features, thanks to xet7:
- [Hide Subtask boards from All Boards](https://github.com/wekan/wekan/issues/1990).
- [Hide Subtask boards from All Boards](https://github.com/wekan/wekan/issues/1990). This was reverted in Wekan v2.46 to make Subtask boards visible again.
- [Order All Boards by Starred, Color, Title and Description](https://github.com/wekan/wekan/commit/856872815292590e0c4eff2848ea1b857a318dc4).
This was removed at Wekan v2.47.
- [HTTP header automatic login](https://github.com/wekan/wekan/commit/ff825d6123ecfd033ccb08ce97c11cefee676104)
for [3rd party authentication server method](https://github.com/wekan/wekan/issues/2019) like siteminder, and any webserver that
handles authentication and based on it adds HTTP headers to be used for login. Please test.
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v2.44.0"
appVersion: "v2.51.0"
files:
userUploads:
- README.md
+8 -1
View File
@@ -99,6 +99,9 @@ template(name="boardActivities")
else
| {{{_ 'activity-added' memberLink cardLink}}}.
if($eq activityType 'moveCardBoard')
| {{{_ 'activity-moved' cardLink oldBoardName boardName}}}.
if($eq activityType 'moveCard')
| {{{_ 'activity-moved' cardLink oldList.title list.title}}}.
@@ -135,7 +138,7 @@ template(name="cardActivities")
p.activity-desc
+memberName(user=user)
if($eq activityType 'createCard')
| {{_ 'activity-added' cardLabel list.title}}.
| {{_ 'activity-added' cardLabel listName}}.
if($eq activityType 'importCard')
| {{{_ 'activity-imported' cardLabel list.title sourceLink}}}.
if($eq activityType 'joinMember')
@@ -176,6 +179,10 @@ template(name="cardActivities")
| {{_ 'activity-sent' cardLabel boardLabel}}.
if($eq activityType 'moveCard')
| {{_ 'activity-moved' cardLabel oldList.title list.title}}.
if($eq activityType 'moveCardBoard')
| {{{_ 'activity-moved' cardLink oldBoardName boardName}}}.
if($eq activityType 'addAttachment')
| {{{_ 'activity-attached' attachmentLink cardLabel}}}.
if attachment.isImage
@@ -74,6 +74,8 @@ BlazeComponent.extendComponent({
lastLabel(){
const lastLabelId = this.currentData().labelId;
if (!lastLabelId)
return null;
const lastLabel = Boards.findOne(Session.get('currentBoard')).getLabelById(lastLabelId);
if(lastLabel.name === undefined || lastLabel.name === ''){
return lastLabel.color;
@@ -84,11 +86,15 @@ BlazeComponent.extendComponent({
lastCustomField(){
const lastCustomField = CustomFields.findOne(this.currentData().customFieldId);
if (!lastCustomField)
return null;
return lastCustomField.name;
},
lastCustomFieldValue(){
const lastCustomField = CustomFields.findOne(this.currentData().customFieldId);
if (!lastCustomField)
return null;
const value = this.currentData().value;
if (lastCustomField.settings.dropdownItems && lastCustomField.settings.dropdownItems.length > 0) {
const dropDownValue = _.find(lastCustomField.settings.dropdownItems, (item) => {
@@ -135,6 +141,8 @@ BlazeComponent.extendComponent({
customField() {
const customField = this.currentData().customField();
if (!customField)
return null;
return customField.name;
},
+1 -2
View File
@@ -25,8 +25,7 @@ BlazeComponent.extendComponent({
archived: false,
'members.userId': Meteor.userId(),
type: 'board',
subtasksDefaultListId: null,
}, { sort: [['stars', 'desc'], ['color', 'asc'], ['title', 'asc'], ['description', 'asc'], ['_id', 'asc']] });
}, { sort: ['title'] });
},
isStarred() {
const user = Meteor.user();
+5 -3
View File
@@ -412,11 +412,13 @@ Template.moveCardPopup.events({
// XXX We should *not* get the currentCard from the global state, but
// instead from a “component” state.
const card = Cards.findOne(Session.get('currentCard'));
const bSelect = $('.js-select-boards')[0];
const boardId = bSelect.options[bSelect.selectedIndex].value;
const lSelect = $('.js-select-lists')[0];
const newListId = lSelect.options[lSelect.selectedIndex].value;
const listId = lSelect.options[lSelect.selectedIndex].value;
const slSelect = $('.js-select-swimlanes')[0];
card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
card.move(card.swimlaneId, newListId, 0);
const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
card.move(boardId, swimlaneId, listId, 0);
Popup.close();
},
});
+3 -3
View File
@@ -70,7 +70,7 @@ BlazeComponent.extendComponent({
const currentBoard = Boards.findOne(Session.get('currentBoard'));
let swimlaneId = '';
const boardView = Meteor.user().profile.boardView;
if (boardView === 'board-view-swimlanes')
if (boardView === 'board-view-swimlanes' || currentBoard.isTemplatesBoard())
swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal'))
swimlaneId = currentBoard.getDefaultSwimline()._id;
@@ -86,12 +86,12 @@ BlazeComponent.extendComponent({
if (MultiSelection.isActive()) {
Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => {
card.move(swimlaneId, listId, sortIndex.base + i * sortIndex.increment);
card.move(currentBoard._id, swimlaneId, listId, sortIndex.base + i * sortIndex.increment);
});
} else {
const cardDomElement = ui.item.get(0);
const card = Blaze.getData(cardDomElement);
card.move(swimlaneId, listId, sortIndex.base);
card.move(currentBoard._id, swimlaneId, listId, sortIndex.base);
}
boardComponent.setIsDragging(false);
},
+5 -14
View File
@@ -101,14 +101,8 @@ Template.defaultLayout.events({
});
async function authentication(event, instance) {
// If header login id is set, use it for login.
// Header username = Email address
// Header password = Login ID
// Not user currently: req.headers[process.env.HEADER_LOGIN_FIRSTNAME]
// and req.headers[process.env.HEADER_LOGIN_LASTNAME]
const match = req.headers[process.env.HEADER_LOGIN_EMAIL] || $('#at-field-username_and_email').val();
const password = req.headers[process.env.HEADER_LOGIN_ID] || $('#at-field-password').val();
const match = $('#at-field-username_and_email').val();
const password = $('#at-field-password').val();
if (!match || !password) return;
@@ -116,12 +110,9 @@ async function authentication(event, instance) {
if (result === 'password') return;
// If header login id is not set, don't try to login automatically.
if (!process.env.HEADER_LOGIN_ID) {
// Stop submit #at-pwd-form
event.preventDefault();
event.stopImmediatePropagation();
}
// Stop submit #at-pwd-form
event.preventDefault();
event.stopImmediatePropagation();
switch (result) {
case 'ldap':
+1 -1
View File
@@ -90,7 +90,7 @@ BlazeComponent.extendComponent({
},
inviteThroughEmail() {
const emails = $('#email-to-invite').val().trim().split('\n').join(',').split(',');
const emails = $('#email-to-invite').val().toLowerCase().trim().split('\n').join(',').split(',');
const boardsToInvite = [];
$('.js-toggle-board-choose .materialCheckBox.is-checked').each(function () {
boardsToInvite.push($(this).data('id'));
@@ -2,7 +2,7 @@ BlazeComponent.extendComponent({
customFields() {
return CustomFields.find({
boardId: Session.get('currentBoard'),
boardIds: {$in: [Session.get('currentBoard')]},
});
},
@@ -103,7 +103,6 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
evt.preventDefault();
const data = {
boardId: Session.get('currentBoard'),
name: this.find('.js-field-name').value.trim(),
type: this.type.get(),
settings: this.getSettings(),
@@ -114,6 +113,7 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
// insert or update
if (!this.data()._id) {
data.boardIds = [Session.get('currentBoard')];
CustomFields.insert(data);
} else {
CustomFields.update(this.data()._id, {$set: data});
@@ -122,8 +122,16 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
Popup.back();
},
'click .js-delete-custom-field': Popup.afterConfirm('deleteCustomField', function() {
const customFieldId = this._id;
CustomFields.remove(customFieldId);
const customField = CustomFields.findOne(this._id);
if (customField.boardIds.length > 1) {
CustomFields.update(customField._id, {
$pull: {
boardIds: Session.get('currentBoard'),
},
});
} else {
CustomFields.remove(customField._id);
}
Popup.close();
}),
}];
+2 -2
View File
@@ -567,8 +567,8 @@
"activity-added-label-card": "a ajouté l'étiquette '%s'",
"activity-removed-label-card": "a supprimé l'étiquette '%s'",
"activity-delete-attach-card": "a supprimé une pièce jointe",
"activity-set-customfield": "set custom field '%s' to '%s' in %s",
"activity-unset-customfield": "unset custom field '%s' in %s",
"activity-set-customfield": "a défini le champ personnalisé '%s' à '%s' dans %s",
"activity-unset-customfield": "a effacé le champ personnalisé '%s' dans %s",
"r-rule": "Règle",
"r-add-trigger": "Ajouter un déclencheur",
"r-add-action": "Ajouter une action",
+21 -21
View File
@@ -1,6 +1,6 @@
{
"accept": "Elfogadás",
"act-activity-notify": "Activity Notification",
"act-activity-notify": "Tevékenység értesítés",
"act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
@@ -626,7 +626,7 @@
"r-check": "Check",
"r-uncheck": "Uncheck",
"r-item": "item",
"r-of-checklist": "of checklist",
"r-of-checklist": "ellenőrzőlistából",
"r-send-email": "Send an email",
"r-to": "to",
"r-subject": "subject",
@@ -651,32 +651,32 @@
"r-d-remove-all-member": "Remove all member",
"r-d-check-all": "Check all items of a list",
"r-d-uncheck-all": "Uncheck all items of a list",
"r-d-check-one": "Check item",
"r-d-check-one": "Elem ellenőrzése",
"r-d-uncheck-one": "Uncheck item",
"r-d-check-of-list": "of checklist",
"r-d-add-checklist": "Add checklist",
"r-d-remove-checklist": "Remove checklist",
"r-by": "by",
"r-add-checklist": "Add checklist",
"r-with-items": "with items",
"r-d-check-of-list": "ellenőrzőlistából",
"r-d-add-checklist": "Ellenőrzőlista hozzáadása",
"r-d-remove-checklist": "Ellenőrzőlista eltávolítása",
"r-by": "által",
"r-add-checklist": "Ellenőrzőlista hozzáadása",
"r-with-items": "elemekkel",
"r-items-list": "item1,item2,item3",
"r-add-swimlane": "Add swimlane",
"r-swimlane-name": "swimlane name",
"r-board-note": "Note: leave a field empty to match every possible value.",
"r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
"r-when-a-card-is-moved": "When a card is moved to another list",
"r-when-a-card-is-moved": "Amikor egy kártya másik listába kerül",
"ldap": "LDAP",
"oauth2": "OAuth2",
"cas": "CAS",
"authentication-method": "Authentication method",
"authentication-type": "Authentication type",
"custom-product-name": "Custom Product Name",
"layout": "Layout",
"hide-logo": "Hide Logo",
"add-custom-html-after-body-start": "Add Custom HTML after <body> start",
"add-custom-html-before-body-end": "Add Custom HTML before </body> end",
"error-undefined": "Something went wrong",
"error-ldap-login": "An error occurred while trying to login",
"display-authentication-method": "Display Authentication Method",
"default-authentication-method": "Default Authentication Method"
"authentication-method": "Hitelesítési mód",
"authentication-type": "Hitelesítés típusa",
"custom-product-name": "Saját terméknév",
"layout": "Elrendezés",
"hide-logo": "Logo elrejtése",
"add-custom-html-after-body-start": "Egyedi HTML hozzáadása <body> után",
"add-custom-html-before-body-end": "1",
"error-undefined": "Valami hiba történt",
"error-ldap-login": "Hiba történt bejelentkezés közben",
"display-authentication-method": "Hitelelesítési mód mutatása",
"default-authentication-method": "Alapértelmezett hitelesítési mód"
}
+340 -340
View File
@@ -1,16 +1,16 @@
{
"accept": "Acceptar",
"act-activity-notify": "Notificacion d'activitat",
"act-addAttachment": "as apondut una pèça jonch __attachment__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-deleteAttachment": "as tirat una pèça jonch __attachment__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-addAttachment": "as apondut una pèça joncha __astacament__ de la carta __card__ a la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-deleteAttachment": "as tirat una pèça joncha __astacament__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-addSubtask": "as apondut una jos-tasca __subtask__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-addLabel": "as apondut un labèl __label__ de la carta __card__ a la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-removeLabel": "as tirat lo labèl __label__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-addLabel": "as apondut una etiqueta__label__ de la carta __card__ a la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-removeLabel": "as tirat l'etiqueta__label__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-addChecklist": "as apondut la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-addChecklistItem": " as apondut l'element __checklistItem__ de la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-removeChecklist": "as tirat la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-removeChecklistItem": " as tirat l'element __checklistItem__ de la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-checkedItem": "as croiar __checklistItem__ de la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-checkedItem": "as croiat __checklistItem__ de la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-uncheckedItem": "as descroiar __checklistItem__ de la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-completeChecklist": "as completat la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-uncompleteChecklist": "as rendut incomplet la checklist __checklist__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
@@ -20,8 +20,8 @@
"act-createCustomField": "as creat lo camp personalizat __customField__ a la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-createList": "as apondut la tièra __list__ al tablèu __board__",
"act-addBoardMember": "as apondut un participant __member__ al tablèu __board__",
"act-archivedBoard": "Lo tablèu __board__ es estat desplaçar cap als Archius",
"act-archivedCard": "La carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__ es estat desplaçar cap als Archius",
"act-archivedBoard": "Lo tablèu __board__ es estat desplaçar cap a Archius",
"act-archivedCard": "La carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__ es estat desplaçar cap a Archiu",
"act-archivedList": "La tièra __list__ del corredor __swimlane__ del tablèu __board__ es estat desplaçar cap a Archius",
"act-archivedSwimlane": "Lo corredor __swimlane__ del tablèu __board__ es estat desplaçar cap a Archius",
"act-importBoard": "as importat lo tablèu __board__",
@@ -30,9 +30,9 @@
"act-joinMember": "as apondut un participant __member__ a la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-moveCard": "as desplaçat la carta __card__ de la tièra __oldList__ del corredor __oldSwimlane__ del tablèu __oldBoard__ cap a la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-removeBoardMember": "as tirat lo participant __member__ del tablèu __board__",
"act-restoredCard": "restorat la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-restoredCard": "as restorat la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-unjoinMember": "as tirat lo participant __member__ de la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__",
"act-withBoardTitle": "__board__",
"act-withBoardTitle": "__tablèu__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Accions",
"activities": "Activitats",
@@ -42,7 +42,7 @@
"activity-attached": "as ligat %s a %s",
"activity-created": "as creat %s",
"activity-customfield-created": "as creat lo camp personalizat %s",
"activity-excluded": "as exclu %s de %s",
"activity-excluded": "as exclús %s de %s",
"activity-imported": "as importat %s cap a %s dempuèi %s",
"activity-imported-board": "as importat %s dempuèi %s",
"activity-joined": "as rejonch %s",
@@ -52,20 +52,20 @@
"activity-sent": "as mandat %s cap a %s",
"activity-unjoined": "as quitat %s",
"activity-subtask-added": "as apondut una jos-tasca a %s",
"activity-checked-item": "as croiar %s dins la checklist %s de %s",
"activity-unchecked-item": "descroiar %s dins la checklist %s de %s",
"activity-checked-item": "as croiat %s dins la checklist %s de %s",
"activity-unchecked-item": "as descroiat %s dins la checklist %s de %s",
"activity-checklist-added": "as apondut a checklist a %s",
"activity-checklist-removed": "as tirat la checklist de %s",
"activity-checklist-completed": "as acabat la checklista __checklist__ de la carta __card__ de la lista __list__ del corredor __swimlane__ del tablèu __board__",
"activity-checklist-completed": "as acabat la checklist __checklist__ de la carta __card__ de la lista __list__ del corredor __swimlane__ del tablèu __board__",
"activity-checklist-uncompleted": "as rendut incomplet la checklist %s de %s",
"activity-checklist-item-added": "as apondut un element a la checklist '%s' dins %s",
"activity-checklist-item-removed": "as tirat un element a la checklist '%s' dins %s",
"add": "Apondre",
"activity-checked-item-card": "as croiar %s dins la checklist %s",
"activity-unchecked-item-card": "as descroiar %s dins la checklist %s",
"activity-checklist-completed-card": "as acabat la checklista __checklist__ de la carta __card__ de la lista __list__ del corredor __swimlane__ del tablèu __board__",
"activity-checked-item-card": "as croiat %s dins la checklist %s",
"activity-unchecked-item-card": "as descroiat %s dins la checklist %s",
"activity-checklist-completed-card": "as acabat la checklist__checklist__ de la carta __card__ de la lista __list__ del corredor __swimlane__ del tablèu __board__",
"activity-checklist-uncompleted-card": "as rendut incomplet la checklist %s",
"add-attachment": "Apondre una pèça jonch",
"add-attachment": "Apondre una pèça joncha",
"add-board": "Apondre un tablèu",
"add-card": "Apondre una carta",
"add-swimlane": "Apondre un corredor",
@@ -73,21 +73,21 @@
"add-checklist": "Apondre una checklist",
"add-checklist-item": "Apondre un element a la checklist",
"add-cover": "Apondre una cobèrta",
"add-label": "Apondre un labèl",
"add-label": "Apondre una etiqueta",
"add-list": "Apondre una tièra",
"add-members": "Apondre un participant",
"added": "Apondut",
"added": "Apondut lo",
"addMemberPopup-title": "Participants",
"admin": "Administartor",
"admin-desc": "As lo drech de legir e modificar las cartas, tirar dels participants, e modificat las opcions del tablèu.",
"admin-desc": "As lo drech de legir e modificar las cartas, tirar de participants, e modificar las opcions del tablèu.",
"admin-announcement": "Anóncia",
"admin-announcement-active": "Activar l'anóncia globala",
"admin-announcement-title": "Anóncia de l'administrator",
"all-boards": "Totes los tablèus",
"and-n-other-card": "E __count__ carta de mai",
"and-n-other-card_plural": "E __count__ cartas de mai",
"and-n-other-card": "E __comptar__ carta de mai",
"and-n-other-card_plural": "E __comptar__ cartas de mai",
"apply": "Aplicar",
"app-is-offline": "Cargament, vos cal esperar. Refrescar la pagina va vos far perdre vòstra trabalh. Se lo cargament es trop long, vos cal agachar se lo servidor es pas blocat/arrestat.",
"app-is-offline": "Cargament, vos cal esperar. Refrescar la pagina vos va far perdre vòstre trabalh. Se lo cargament es tròp long, vos cal agachar se lo servidor es pas blocat/arrestat.",
"archive": "Archivar",
"archive-all": "Archivar tot",
"archive-board": "Archivar lo tablèu",
@@ -96,334 +96,334 @@
"archive-swimlane": "Archivar lo corredor",
"archive-selection": "Archivar la seleccion",
"archiveBoardPopup-title": "Archivar lo tablèu?",
"archived-items": "Archivar",
"archived-items": "Archius",
"archived-boards": "Tablèu archivat",
"restore-board": "Restaurar lo tablèu",
"no-archived-boards": "Pas de tablèu archivat.",
"archives": "Archivar",
"template": "Modèl",
"templates": "Modèlas",
"templates": "Modèls",
"assign-member": "Affectar un participant",
"attached": "attached",
"attachment": "Attachment",
"attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.",
"attachmentDeletePopup-title": "Delete Attachment?",
"attachments": "Attachments",
"auto-watch": "Automatically watch boards when they are created",
"avatar-too-big": "The avatar is too large (70KB max)",
"back": "Back",
"board-change-color": "Change color",
"board-nb-stars": "%s stars",
"board-not-found": "Board not found",
"board-private-info": "This board will be <strong>private</strong>.",
"board-public-info": "This board will be <strong>public</strong>.",
"boardChangeColorPopup-title": "Change Board Background",
"boardChangeTitlePopup-title": "Rename Board",
"boardChangeVisibilityPopup-title": "Change Visibility",
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Settings",
"boards": "Boards",
"board-view": "Board View",
"board-view-cal": "Calendar",
"board-view-swimlanes": "Swimlanes",
"board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is moved to Archive.",
"board-archived": "This board is moved to Archive.",
"card-comments-title": "This card has %s comment.",
"card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.",
"card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
"card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
"card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-custom-fields": "Edit custom fields",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
"card-labels-title": "Change the labels for the card.",
"card-members-title": "Add or remove members of the board from the card.",
"card-start": "Start",
"card-start-on": "Starts on",
"cardAttachmentsPopup-title": "Attach From",
"cardCustomField-datePopup-title": "Change date",
"cardCustomFieldsPopup-title": "Edit custom fields",
"cardDeletePopup-title": "Delete Card?",
"cardDetailsActionsPopup-title": "Card Actions",
"cardLabelsPopup-title": "Labels",
"attached": "jónher",
"attachment": "pèça joncha",
"attachment-delete-pop": "Tirar una pèça joncha es defenitiu.",
"attachmentDeletePopup-title": "Tirar la pèça joncha ?",
"attachments": "Pèças jonchas",
"auto-watch": "Survelhar automaticament lo tablèu un còp creat",
"avatar-too-big": "L'imatge es tròp pesuc (70KB max)",
"back": "Tornar",
"board-change-color": "Cambiar de color",
"board-nb-stars": "%s estèla",
"board-not-found": "Tablèu pas trapat",
"board-private-info": "Aqueste tablèu serà <strong>privat</strong>.",
"board-public-info": "Aqueste tablèu serà <strong>public</strong>.",
"boardChangeColorPopup-title": "Cambiar lo fons del tablèu",
"boardChangeTitlePopup-title": "Tornar nomenar lo tablèu",
"boardChangeVisibilityPopup-title": "Cambiar la visibilitat",
"boardChangeWatchPopup-title": "Cambiar lo seguit",
"boardMenuPopup-title": "Opcions del tablèu",
"boards": "Tablèus",
"board-view": "Presentacion del tablèu",
"board-view-cal": "Calendièr",
"board-view-swimlanes": "Corredor",
"board-view-lists": "Tièras",
"bucket-example": "Coma \"Tota la tièra\" per exemple",
"cancel": "Tornar",
"card-archived": "Aquesta carta es desplaçada dins Archius",
"board-archived": "Aqueste tablèu esdesplaçat dins Archius",
"card-comments-title": "Aquesta carta a %s de comentaris.",
"card-delete-notice": "Un còp tirat, pas de posibilitat de tornar enrè",
"card-delete-pop": "Totes las accions van èsser quitadas del seguit d'activitat e poiretz pas mai utilizar aquesta carta.",
"card-delete-suggest-archive": "Podètz desplaçar una carta dins Archius per la quitar del tablèu e gardar las activitats.",
"card-due": "Esperat",
"card-due-on": "Esperat lo",
"card-spent": "Temps passat",
"card-edit-attachments": "Cambiar las pèças jonchas",
"card-edit-custom-fields": "Cambiar los camps personalizats",
"card-edit-labels": "Cambiar los labèls",
"card-edit-members": "Cambiar los participants",
"card-labels-title": "Cambiar l'etiqueta de la carta.",
"card-members-title": "Apondre o quitar de participants a la carta. ",
"card-start": "Debuta",
"card-start-on": "Debuta lo",
"cardAttachmentsPopup-title": "Apondut dempuèi",
"cardCustomField-datePopup-title": "Cambiar la data",
"cardCustomFieldsPopup-title": "Cambiar los camps personalizats",
"cardDeletePopup-title": "Suprimir la carta?",
"cardDetailsActionsPopup-title": "Accions sus la carta",
"cardLabelsPopup-title": "Etiquetas",
"cardMembersPopup-title": "Participants",
"cardMorePopup-title": "More",
"cardTemplatePopup-title": "Create template",
"cards": "Cards",
"cards-count": "Cards",
"casSignIn": "Sign In with CAS",
"cardType-card": "Card",
"cardType-linkedCard": "Linked Card",
"cardType-linkedBoard": "Linked Board",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
"change-permissions": "Change permissions",
"change-settings": "Change Settings",
"changeAvatarPopup-title": "Change Avatar",
"changeLanguagePopup-title": "Change Language",
"changePasswordPopup-title": "Change Password",
"changePermissionsPopup-title": "Change Permissions",
"changeSettingsPopup-title": "Change Settings",
"cardMorePopup-title": "Mai",
"cardTemplatePopup-title": "Crear un modèl",
"cards": "Cartas",
"cards-count": "Cartas",
"casSignIn": "Vos connectar amb CAS",
"cardType-card": "Carta",
"cardType-linkedCard": "Carta ligada",
"cardType-linkedBoard": "Tablèu ligat",
"change": "Cambiar",
"change-avatar": "Cambiar la fòto",
"change-password": "Cambiar lo mot de Santa-Clara",
"change-permissions": "Cambiar las permissions",
"change-settings": "Cambiar los paramètres",
"changeAvatarPopup-title": "Cambiar la fòto",
"changeLanguagePopup-title": "Cambiar la lenga",
"changePasswordPopup-title": "Cambiar lo mot de Santa-Clara",
"changePermissionsPopup-title": "Cambiar las permissions",
"changeSettingsPopup-title": "Cambiar los paramètres",
"subtasks": "Jos-tasca",
"checklists": "Checklists",
"click-to-star": "Click to star this board.",
"click-to-unstar": "Click to unstar this board.",
"clipboard": "Clipboard or drag & drop",
"close": "Close",
"close-board": "Close Board",
"close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-crimson": "crimson",
"color-darkgreen": "darkgreen",
"color-gold": "gold",
"color-gray": "gray",
"color-green": "green",
"color-indigo": "indigo",
"color-lime": "lime",
"checklists": "Checklistas",
"click-to-star": "Apondre lo tablèu als favorits",
"click-to-unstar": "Quitar lo tablèu dels favorits",
"clipboard": "Copiar o far limpar",
"close": "Tampar",
"close-board": "Tampar lo tablèu",
"close-board-pop": "Podètz tornar activar lo tablèu dempuèi la pagina d'acuèlh.",
"color-black": "negre",
"color-blue": "blau",
"color-crimson": "purple clar",
"color-darkgreen": "verd fonçat",
"color-gold": "aur",
"color-gray": "gris",
"color-green": "verd",
"color-indigo": "indi",
"color-lime": "jaune clar",
"color-magenta": "magenta",
"color-mistyrose": "mistyrose",
"color-navy": "navy",
"color-orange": "orange",
"color-paleturquoise": "paleturquoise",
"color-peachpuff": "peachpuff",
"color-pink": "pink",
"color-plum": "plum",
"color-purple": "purple",
"color-red": "red",
"color-saddlebrown": "saddlebrown",
"color-silver": "silver",
"color-sky": "sky",
"color-slateblue": "slateblue",
"color-white": "white",
"color-yellow": "yellow",
"unset-color": "Unset",
"comment": "Comment",
"comment-placeholder": "Write Comment",
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"no-comments": "No comments",
"no-comments-desc": "Can not see comments and activities.",
"computer": "Computer",
"confirm-subtask-delete-dialog": "Sètz segur que volètz tirar aqueste jos-tasca?",
"confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"linkCardPopup-title": "Link Card",
"searchElementPopup-title": "Search",
"copyCardPopup-title": "Copy Card",
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
"createLabelPopup-title": "Create Label",
"createCustomField": "Create Field",
"createCustomFieldPopup-title": "Create Field",
"current": "current",
"color-mistyrose": "ròse clar",
"color-navy": "blau marin",
"color-orange": "irange",
"color-paleturquoise": "turqués",
"color-peachpuff": "persèc",
"color-pink": "ròsa",
"color-plum": "pruna",
"color-purple": "violet",
"color-red": "roge",
"color-saddlebrown": "castanh",
"color-silver": "argent",
"color-sky": "blau clar",
"color-slateblue": "blau lausa",
"color-white": "blanc",
"color-yellow": "jaune",
"unset-color": "pas reglat",
"comment": "Comentari",
"comment-placeholder": "Escrire un comentari",
"comment-only": "Comentari solament",
"comment-only-desc": "Comentari sus las cartas solament.",
"no-comments": "Pas cap de comentari",
"no-comments-desc": "Podèts pas veire ni los comentaris ni las activitats",
"computer": "Ordenator",
"confirm-subtask-delete-dialog": "Sètz segur de voler quitar aquesta jos-tasca?",
"confirm-checklist-delete-dialog": "Sètz segur de voler quitar aquesta checklist?",
"copy-card-link-to-clipboard": "Còpia del ligam de la carta",
"linkCardPopup-title": "Ligam de la carta",
"searchElementPopup-title": "Cèrca",
"copyCardPopup-title": "Còpia de la carta",
"copyChecklistToManyCardsPopup-title": "Còpia del modèl de checklist cap a mai d'una carta",
"copyChecklistToManyCardsPopup-instructions": "Un compte es estat creat per vos sus ",
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Títol de la primièra carta\", \"description\":\"Descripcion de la primièra carta\"}, {\"title\":\"Títol de la segonda carta\",\"description\":\"Descripcion de la segonda carta\"},{\"title\":\"Títol de la darrièra carta\",\"description\":\"Descripcion de la darrièra carta\"} ]",
"create": "Crear",
"createBoardPopup-title": "Crear un tablèu",
"chooseBoardSourcePopup-title": "Importar un tablèu",
"createLabelPopup-title": "Crear una etiqueta",
"createCustomField": "Crear un camp",
"createCustomFieldPopup-title": "Crear un camp",
"current": "actual",
"custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
"custom-field-checkbox": "Checkbox",
"custom-field-date": "Date",
"custom-field-dropdown": "Dropdown List",
"custom-field-dropdown-none": "(none)",
"custom-field-dropdown-options": "List Options",
"custom-field-dropdown-options-placeholder": "Press enter to add more options",
"custom-field-dropdown-unknown": "(unknown)",
"custom-field-number": "Number",
"custom-field-text": "Text",
"custom-fields": "Custom Fields",
"date": "Date",
"decline": "Decline",
"default-avatar": "Default avatar",
"delete": "Delete",
"deleteCustomFieldPopup-title": "Delete Custom Field?",
"deleteLabelPopup-title": "Delete Label?",
"description": "Description",
"disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
"disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
"discard": "Discard",
"done": "Done",
"download": "Download",
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
"edit-wip-limit": "Edit WIP Limit",
"soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
"editCustomFieldPopup-title": "Edit Field",
"editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
"email": "Email",
"email-enrollAccount-subject": "An account created for you on __siteName__",
"email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
"email-fail": "Sending email failed",
"email-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
"email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
"email-resetPassword-subject": "Reset your password on __siteName__",
"email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
"email-sent": "Email sent",
"email-verifyEmail-subject": "Verify your email address on __siteName__",
"email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
"enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "This board does not exist",
"error-board-notAdmin": "You need to be admin of this board to do that",
"error-board-notAMember": "You need to be a member of this board to do that",
"error-json-malformed": "Your text is not valid JSON",
"error-json-schema": "Your JSON data does not include the proper information in the correct format",
"error-list-doesNotExist": "This list does not exist",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"error-email-taken": "Email has already been taken",
"export-board": "Export board",
"filter": "Filter",
"filter-cards": "Filter Cards",
"filter-clear": "Clear filter",
"filter-no-label": "No label",
"filter-no-member": "No member",
"filter-no-custom-fields": "No Custom Fields",
"filter-on": "Filter is on",
"filter-on-desc": "You are filtering cards on this board. Click here to edit filter.",
"filter-to-selection": "Filter to selection",
"advanced-filter-label": "Advanced Filter",
"custom-field-checkbox": "Casa de croiar",
"custom-field-date": "Data",
"custom-field-dropdown": "Tièra de causidas",
"custom-field-dropdown-none": "(pas res)",
"custom-field-dropdown-options": "Opcions de la tièra",
"custom-field-dropdown-options-placeholder": "Apiejar sus \"Enter\" per apondre d'opcions",
"custom-field-dropdown-unknown": "(desconegut)",
"custom-field-number": "Nombre",
"custom-field-text": "Tèxte",
"custom-fields": "Camps personalizats",
"date": "Data",
"decline": "Refusar",
"default-avatar": "Fòto per defaut",
"delete": "Suprimir",
"deleteCustomFieldPopup-title": "Tirar lo camp personalizat?",
"deleteLabelPopup-title": "Tirar l'etiqueta?",
"description": "Descripcion",
"disambiguateMultiLabelPopup-title": "Precisar l'accion de l'etiqueta",
"disambiguateMultiMemberPopup-title": "Precisar l'accion del participant",
"discard": "Botar dins l'escobilha",
"done": "Acabat",
"download": "Telecargar",
"edit": "Modificar",
"edit-avatar": "Cambiar la fòto",
"edit-profile": "Modificar lo perfil",
"edit-wip-limit": "Modificar la WIP limit",
"soft-wip-limit": "Leugièr WIP limit",
"editCardStartDatePopup-title": "Cambiar la data de debuta",
"editCardDueDatePopup-title": "Cambiar la data de fin",
"editCustomFieldPopup-title": "Modificar los camps",
"editCardSpentTimePopup-title": "Cambiar lo temp passat",
"editLabelPopup-title": "Cambiar l'etiqueta",
"editNotificationPopup-title": "Modificar la notificacion",
"editProfilePopup-title": "Modificar lo perfil",
"email": "Corrièl",
"email-enrollAccount-subject": "Vòstre compte es ara activat pel sit __siteName__",
"email-enrollAccount-text": "Adieu __user__,\n\nPer comença d'utilizar lo servici, vos cal clicar sul ligam.\n\n__url__\n\nMercé.",
"email-fail": "Pas possible de mandar lo corrièl",
"email-fail-text": "Error per mandar lo corrièl",
"email-invalid": "L'adreça corrièl es pas valida",
"email-invite": "Convidar per corrièl",
"email-invite-subject": "__inviter__ vos as mandat un convit",
"email-invite-text": "Car __user__,\n\n__inviter__ vos a convidat per jónher lo tablèu \"__board__\".\n\nVos cal clicar sul ligam:\n\n__url__\n\nMercé.",
"email-resetPassword-subject": "Tornar inicializar vòstre mot de Santa-Clara de sit __siteName__",
"email-resetPassword-text": "Adieu __user__,\n\nPer tornar inicializar vòstre mot de Santa-Clara vos cal clicar sul ligam :\n\n__url__\n\nMercé.",
"email-sent": "Mail mandat",
"email-verifyEmail-subject": "Vos cal verificar vòstra adreça corrièl del sit __siteName__",
"email-verifyEmail-text": "Adieu __user__,\n\nPer verificar vòstra adreça corrièl, vos cal clicar sul ligam :\n\n__url__\n\nMercé.",
"enable-wip-limit": "Activar la WIP limit",
"error-board-doesNotExist": "Aqueste tablèu existís pas",
"error-board-notAdmin": "Devètz èsser un administrator del tablèu per far aquò ",
"error-board-notAMember": "Devètz èsser un participant del tablèu per far aquò",
"error-json-malformed": "Vòstre tèxte es pas valid JSON",
"error-json-schema": "Vòstre JSON es pas al format correct ",
"error-list-doesNotExist": "Aqueste tièra existís pas",
"error-user-doesNotExist": "Aqueste utilizator existís pas",
"error-user-notAllowSelf": "Vos podètz pas convidar vautres meteisses",
"error-user-notCreated": "Aqueste utilizator es pas encara creat",
"error-username-taken": "Lo nom es ja pres",
"error-email-taken": "Lo corrièl es ja pres ",
"export-board": "Exportar lo tablèu",
"filter": "Filtre",
"filter-cards": "Filtre cartas",
"filter-clear": "Escafar lo filtre",
"filter-no-label": "Pas cap d'etiqueta",
"filter-no-member": "Pas cap de participant",
"filter-no-custom-fields": "Pas de camp personalizat",
"filter-on": "Lo filtre es activat",
"filter-on-desc": "Filtratz las cartas dins aqueste tablèu. Picar aquí per editar los filtres",
"filter-to-selection": "Filtrar la seleccion",
"advanced-filter-label": "Filtre avançat",
"advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
"fullname": "Full Name",
"header-logo-title": "Go back to your boards page.",
"hide-system-messages": "Hide system messages",
"headerBarCreateBoardPopup-title": "Create Board",
"home": "Home",
"import": "Import",
"link": "Link",
"import-board": "import board",
"import-board-c": "Import board",
"import-board-title-trello": "Import board from Trello",
"import-board-title-wekan": "Import board from previous export",
"fullname": "Nom complet",
"header-logo-title": "Retorn a vòstra pagina de tablèus",
"hide-system-messages": "Amagar los messatges sistèm",
"headerBarCreateBoardPopup-title": "Crear un tablèu",
"home": "Acuèlh",
"import": "Importar",
"link": "Ligar",
"import-board": "Importar un tablèu",
"import-board-c": "Importar un tablèu",
"import-board-title-trello": "Importar un tablèu dempuèi Trello",
"import-board-title-wekan": "Importar un tablèu dempuèi un export passat",
"import-sandstorm-backup-warning": "Do not delete data you import from original exported board or Trello before checking does this grain close and open again, or do you get Board not found error, that means data loss.",
"import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
"from-trello": "From Trello",
"from-wekan": "From previous export",
"import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
"import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
"import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.",
"import-json-placeholder": "Paste your valid JSON data here",
"import-map-members": "Map members",
"import-members-map": "Your imported board has some members. Please map the members you want to import to your users",
"import-sandstorm-warning": "Importar lo tablèu va quitar totes las donadas del tablèu e lo va remplaçar amb las donadas del tablèu importat.",
"from-trello": "Dempuèi Trello",
"from-wekan": "Dempuèi un export passat",
"import-board-instruction-trello": "Dins vòstre tablèu Trello, vos cal anar dins \"Menut\", puèi \"Mai\", \"Export\", \"Export JSON\", e copiar lo tèxte balhat.",
"import-board-instruction-wekan": "Dins vòstre tablèu, vos cal anar dins \"Menut\", puèi \"Exportar lo tablèu\", e de copiar lo tèxte del fichièr telecargat.",
"import-board-instruction-about-errors": "Se avètz de errors al moment d'importar un tablèu, es possible que l'importacion as fonccionat, lo tablèu es belèu a la pagina \"Totes los tablèus\".",
"import-json-placeholder": "Pegar las donadas del fichièr JSON aicí",
"import-map-members": "Mapa dels participants",
"import-members-map": "Lo tablèu qu'avètz importat as ja de participants, vos cal far la migracion amb los utilizators actual",
"import-show-user-mapping": "Review members mapping",
"import-user-select": "Pick your existing user you want to use as this member",
"importMapMembersAddPopup-title": "Select member",
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
"invalid-time": "Invalid time",
"invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"importMapMembersAddPopup-title": "Seleccionar un participant",
"info": "Vesion",
"initials": "Iniciala",
"invalid-date": "Data invalida",
"invalid-time": "Temps invalid",
"invalid-user": "Participant invalid",
"joined": "Jónher",
"just-invited": "Sètz just convidat dins aqueste tablèu",
"keyboard-shortcuts": "Keyboard shortcuts",
"label-create": "Create Label",
"label-create": "Crear una etiqueta",
"label-default": "%s label (default)",
"label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.",
"labels": "Labels",
"language": "Language",
"labels": "Etiquetas",
"language": "Lenga",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
"leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
"leaveBoardPopup-title": "Leave Board ?",
"link-card": "Link to this card",
"list-archive-cards": "Move all cards in this list to Archive",
"link-card": "Ligam per aquesta carta",
"list-archive-cards": "Mandar totas las cartas d'aquesta lista dins Archius",
"list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"list-move-cards": "Mandar totas las cartas dins aquesta lista",
"list-select-cards": "Seleccionar totas las cartas dins aquesta lista",
"set-color-list": "Set Color",
"listActionPopup-title": "List Actions",
"listActionPopup-title": "Tièra de las accions",
"swimlaneActionPopup-title": "Swimlane Actions",
"swimlaneAddPopup-title": "Add a Swimlane below",
"listImportCardPopup-title": "Import a Trello card",
"listMorePopup-title": "More",
"link-list": "Link to this list",
"listImportCardPopup-title": "Importar una carta de Trello",
"listMorePopup-title": "Mai",
"link-list": "Ligam d'aquesta lista",
"list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
"list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.",
"lists": "Lists",
"swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
"memberMenuPopup-title": "Member Settings",
"lists": "Tièras",
"swimlanes": "Corredor",
"log-out": "Desconnexion",
"log-in": "Connexion",
"loginPopup-title": "Connexion",
"memberMenuPopup-title": "Paramètres dels participants",
"members": "Participants",
"menu": "Menu",
"move-selection": "Move selection",
"moveCardPopup-title": "Move Card",
"moveCardToBottom-title": "Move to Bottom",
"moveCardToTop-title": "Move to Top",
"moveSelectionPopup-title": "Move selection",
"multi-selection": "Multi-Selection",
"menu": "Menut",
"move-selection": "Bolegar la seleccion",
"moveCardPopup-title": "Bolegar la carta",
"moveCardToBottom-title": "Bolegar cap al bas",
"moveCardToTop-title": "Bolegar cap al naut",
"moveSelectionPopup-title": "Bolegar la seleccion",
"multi-selection": "Multi-seleccion",
"multi-selection-on": "Multi-Selection is on",
"muted": "Muted",
"muted": "Silenciós",
"muted-info": "You will never be notified of any changes in this board",
"my-boards": "My Boards",
"name": "Name",
"no-archived-cards": "No cards in Archive.",
"no-archived-lists": "No lists in Archive.",
"no-archived-swimlanes": "No swimlanes in Archive.",
"no-results": "No results",
"my-boards": "Mon tablèu",
"name": "Nom",
"no-archived-cards": "Pas cap de carta dins Archius",
"no-archived-lists": "Pas cap de lista dins Archius",
"no-archived-swimlanes": "Pas cap de corredor dins Archius",
"no-results": "Pas brica de resultat",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
"not-accepted-yet": "Invitation not accepted yet",
"notify-participate": "Receive updates to any cards you participate as creater or member",
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
"optional": "optional",
"or": "or",
"optional": "opcional",
"or": "o",
"page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
"page-not-found": "Page not found.",
"password": "Password",
"page-not-found": "Pagina pas trapada",
"password": "Mot de Santa-Clara",
"paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
"participating": "Participating",
"preview": "Preview",
"previewAttachedImagePopup-title": "Preview",
"previewClipboardImagePopup-title": "Preview",
"private": "Private",
"private-desc": "This board is private. Only people added to the board can view and edit it.",
"profile": "Profile",
"preview": "Apercebut",
"previewAttachedImagePopup-title": "Apercebut",
"previewClipboardImagePopup-title": "Apercebut",
"private": "Privat",
"private-desc": "Aqueste tablèu es privat. Solament las personas apondudas a aquete tablèu lo pòdon veire e editar.",
"profile": "Perfil",
"public": "Public",
"public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.",
"quick-access-description": "Star a board to add a shortcut in this bar.",
"remove-cover": "Remove Cover",
"remove-from-board": "Remove from Board",
"remove-label": "Remove Label",
"listDeletePopup-title": "Delete List ?",
"remove-member": "Remove Member",
"remove-member-from-card": "Remove from Card",
"remove-from-board": "Quitar lo tablèu",
"remove-label": "Quitar l'etiqueta",
"listDeletePopup-title": "Suprimir la lista ?",
"remove-member": "Quitar lo participant",
"remove-member-from-card": "Quitar aquesta carta",
"remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
"removeMemberPopup-title": "Remove Member?",
"rename": "Rename",
"rename-board": "Rename Board",
"rename": "Tornar nomenar",
"rename-board": "Tornar nomenar lo tablèu",
"restore": "Restore",
"save": "Save",
"search": "Search",
"rules": "Rules",
"save": "Salvar",
"search": "Cèrca",
"rules": "Règlas",
"search-cards": "Search from card titles and descriptions on this board",
"search-example": "Text to search for?",
"select-color": "Select Color",
"select-color": "Color causida",
"set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
"setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
"shortcut-clear-filters": "Clear all filters",
"shortcut-close-dialog": "Close Dialog",
"shortcut-close-dialog": "Tampar lo dialòg",
"shortcut-filter-my-cards": "Filter my cards",
"shortcut-show-shortcuts": "Bring up this shortcuts list",
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
@@ -436,32 +436,32 @@
"starred-boards": "Starred Boards",
"starred-boards-description": "Starred boards show up at the top of your boards list.",
"subscribe": "Subscribe",
"team": "Team",
"this-board": "this board",
"this-card": "this card",
"team": "Còla",
"this-board": "Aqueste tablèu",
"this-card": "aquesta carta",
"spent-time-hours": "Spent time (hours)",
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"time": "Temps",
"title": "Títol",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
"type": "Mena",
"unassign-member": "Unassign member",
"unsaved-description": "You have an unsaved description.",
"unwatch": "Unwatch",
"upload": "Upload",
"upload-avatar": "Upload an avatar",
"uploaded-avatar": "Uploaded an avatar",
"upload": "Telecargar",
"upload-avatar": "Telecargar un avatar",
"uploaded-avatar": "Avatar telecargat",
"username": "Username",
"view-it": "View it",
"warn-list-archived": "warning: this card is in an list at Archive",
"watch": "Watch",
"watching": "Watching",
"watch": "Seguit",
"watching": "Agachat",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
"welcome-board": "Tablèu de benvenguda",
"welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
@@ -473,36 +473,36 @@
"wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
"wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
"settings": "Paramètres",
"people": "Personas",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"invite": "Invite",
"invite-people": "Invite People",
"invite": "Convidar",
"invite-people": "Convidat",
"to-boards": "To board(s)",
"email-addresses": "Email Addresses",
"email-addresses": "Adreça corrièl",
"smtp-host-description": "The address of the SMTP server that handles your emails.",
"smtp-port-description": "The port your SMTP server uses for outgoing emails.",
"smtp-tls-description": "Enable TLS support for SMTP server",
"smtp-host": "SMTP Host",
"smtp-port": "SMTP Port",
"smtp-username": "Username",
"smtp-password": "Password",
"smtp-password": "Mot de Santa-Clara",
"smtp-tls": "TLS support",
"send-from": "From",
"send-smtp-test": "Send a test email to yourself",
"invitation-code": "Invitation Code",
"email-invite-register-subject": "__inviter__ sent you an invitation",
"send-smtp-test": "Se mandar un corrièl d'ensag",
"invitation-code": "Còde de convit",
"email-invite-register-subject": "__inviter__ vos a mandat un convit",
"email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
"email-smtp-test-subject": "SMTP Test Email",
"email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"email-smtp-test-text": "As capitat de mandar un corrièl",
"error-invitation-code-not-exist": "Lo còde de convit existís pas",
"error-notAuthorized": "Sès pas autorizat a agachar aquesta pagina",
"outgoing-webhooks": "Outgoing Webhooks",
"outgoingWebhooksPopup-title": "Outgoing Webhooks",
"boardCardTitlePopup-title": "Card Title Filter",
"new-outgoing-webhook": "New Outgoing Webhook",
"no-name": "(Unknown)",
"no-name": "(Desconegut)",
"Node_version": "Node version",
"OS_Arch": "OS Arch",
"OS_Cpus": "OS CPU Count",
@@ -513,37 +513,37 @@
"OS_Totalmem": "OS Total Memory",
"OS_Type": "OS Type",
"OS_Uptime": "OS Uptime",
"days": "days",
"hours": "hours",
"minutes": "minutes",
"seconds": "seconds",
"days": "jorns",
"hours": "oras",
"minutes": "minutas",
"seconds": "segondas",
"show-field-on-card": "Show this field on card",
"automatically-field-on-card": "Auto create field to all cards",
"showLabel-field-on-card": "Show field label on minicard",
"yes": "Yes",
"no": "No",
"yes": "Òc",
"no": "Non",
"accounts": "Accounts",
"accounts-allowEmailChange": "Allow Email Change",
"accounts-allowUserNameChange": "Allow Username Change",
"createdAt": "Created at",
"verified": "Verified",
"active": "Active",
"card-received": "Received",
"verified": "Verificat",
"active": "Avtivat",
"card-received": "Recebut",
"card-received-on": "Received on",
"card-end": "End",
"card-end": "Fin",
"card-end-on": "Ends on",
"editCardReceivedDatePopup-title": "Change received date",
"editCardEndDatePopup-title": "Change end date",
"setCardColorPopup-title": "Set color",
"setCardActionsColorPopup-title": "Choose a color",
"setSwimlaneColorPopup-title": "Choose a color",
"setListColorPopup-title": "Choose a color",
"setCardColorPopup-title": "Color seleccionada",
"setCardActionsColorPopup-title": "Causir una color",
"setSwimlaneColorPopup-title": "Causir una color",
"setListColorPopup-title": "Causir una color",
"assigned-by": "Assigned By",
"requested-by": "Requested By",
"board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
"delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
"boardDeletePopup-title": "Delete Board?",
"delete-board": "Delete Board",
"boardDeletePopup-title": "Suprimir lo tablèu ?",
"delete-board": "Tablèu suprimit",
"default-subtasks-board": "Subtasks for __board__ board",
"default": "Default",
"queue": "Queue",
@@ -610,7 +610,7 @@
"r-top-of": "Top of",
"r-bottom-of": "Bottom of",
"r-its-list": "its list",
"r-archive": "Desplaçar cap a Archiu",
"r-archive": "Desplaçar cap a Archius",
"r-unarchive": "Restore from Archive",
"r-card": "card",
"r-add": "Apondre",
+2 -2
View File
@@ -567,8 +567,8 @@
"activity-added-label-card": "добавил метку '%s'",
"activity-removed-label-card": "удалил метку '%s'",
"activity-delete-attach-card": "удалил вложение",
"activity-set-customfield": "set custom field '%s' to '%s' in %s",
"activity-unset-customfield": "unset custom field '%s' in %s",
"activity-set-customfield": "сменил значение поля '%s' на '%s' в карточке %s",
"activity-unset-customfield": "очистил поле '%s' в карточке %s",
"r-rule": "Правило",
"r-add-trigger": "Задать условие",
"r-add-action": "Задать действие",
+80 -80
View File
@@ -1,37 +1,37 @@
{
"accept": "Acceptera",
"act-activity-notify": "Aktivitetsnotifikation",
"act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-createBoard": "created board __board__",
"act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
"act-createCustomField": "created custom field __customField__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-createList": "added list __list__ to board __board__",
"act-addBoardMember": "added member __member__ to board __board__",
"act-archivedBoard": "Board __board__ moved to Archive",
"act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
"act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
"act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive",
"act-importBoard": "imported board __board__",
"act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
"act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
"act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-moveCard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__",
"act-removeBoardMember": "removed member __member__ from board __board__",
"act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
"act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"act-addAttachment": "la till bifogad fil __attachment__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-deleteAttachment": "raderade bifogad fil __attachment__ från kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-addSubtask": "la till underaktivitet __subtask__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-addLabel": "la till etikett __label__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-removeLabel": "Tog bort etikett __label__ från kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-addChecklist": "la till checklista __checklist__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-addChecklistItem": "la till checklistobjekt __checklistItem__ till checklista __checklist__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-removeChecklist": "tag bort checklista __checklist__ från kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-removeChecklistItem": "tog bort checklistobjekt __checklistItem__ från __checklist__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-checkedItem": "bockade av __checklistItem__ från checklista __checklist__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-uncheckedItem": "avmarkerade __checklistItem__ från checklista __checklist__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-completeChecklist": "slutförde checklista __checklist__ i kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-uncompleteChecklist": "ofullbordade checklista __checklist__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-addComment": "kommenterade på kort __card__: __comment__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-createBoard": "skapade tavla __board__",
"act-createCard": "skapade kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-createCustomField": "skapade anpassat fält __customField__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-createList": "la till lista __list__ på tavla __board__",
"act-addBoardMember": "la till medlem __member__ på tavla __board__",
"act-archivedBoard": "Tavla__board__ flyttad till arkivet",
"act-archivedCard": "Kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__ flyttad till arkivet",
"act-archivedList": "Lista __list__ i simbana __swimlane__ på tavla __board__ flyttad till arkivet",
"act-archivedSwimlane": "Simbana __swimlane__ på tavla __board__ flyttad till arkivet",
"act-importBoard": "importerade board __board__",
"act-importCard": "importerade kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-importList": "importerade lista __list__ i simbana __swimlane__ på tavla __board__",
"act-joinMember": "la till medlem __member__ på kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-moveCard": "flyttade kort __card__ från lista __oldList__ i simbana __oldSwimlane__ på tavla __oldBoard__ till lista __list__ i simbana __swimlane__ på tavla __board__",
"act-removeBoardMember": "borttagen medlem __member__  från tavla __board__",
"act-restoredCard": "återställde kort __card__ till lista __lis__ i simbana __swimlane__ på tavla __board__",
"act-unjoinMember": "tog bort medlem __member__ från kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"act-withBoardTitle": "_tavla_",
"act-withCardTitle": "[__board__] __card__",
"actions": "Åtgärder",
@@ -56,14 +56,14 @@
"activity-unchecked-item": "okryssad %s i checklistan %s av %s",
"activity-checklist-added": "lade kontrollista till %s",
"activity-checklist-removed": "tog bort en checklista från %s",
"activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"activity-checklist-completed": "slutförde checklista __checklist__ i kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"activity-checklist-uncompleted": "inte slutfört checklistan %s av %s",
"activity-checklist-item-added": "lade checklista objekt till '%s' i %s",
"activity-checklist-item-removed": "tog bort en checklista objekt från \"%s\" i %s",
"add": "Lägg till",
"activity-checked-item-card": "kryssad %s i checklistan %s",
"activity-unchecked-item-card": "okryssad %s i checklistan %s",
"activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
"activity-checklist-completed-card": "slutförde checklista __checklist__ i kort __card__ i lista __list__ i simbana __swimlane__ på tavla __board__",
"activity-checklist-uncompleted-card": "icke slutfört checklistan %s",
"add-attachment": "Lägg till bilaga",
"add-board": "Lägg till anslagstavla",
@@ -93,7 +93,7 @@
"archive-board": "Flytta Anslagstavla till Arkiv",
"archive-card": "Flytta Kort till Arkiv",
"archive-list": "Flytta Lista till Arkiv",
"archive-swimlane": "Move Swimlane to Archive",
"archive-swimlane": "Flytta simbanan till arkivet",
"archive-selection": "Flytta markerade till Arkiv",
"archiveBoardPopup-title": "Flytta Anslagstavla till Arkiv?",
"archived-items": "Arkiv",
@@ -121,7 +121,7 @@
"boardChangeTitlePopup-title": "Byt namn på anslagstavla",
"boardChangeVisibilityPopup-title": "Ändra synlighet",
"boardChangeWatchPopup-title": "Ändra bevaka",
"boardMenuPopup-title": "Board Settings",
"boardMenuPopup-title": "Tavlans inställningar",
"boards": "Anslagstavlor",
"board-view": "Anslagstavelsvy",
"board-view-cal": "Kalender",
@@ -181,7 +181,7 @@
"close-board-pop": "Du kommer att kunna återställa anslagstavlan genom att klicka på knappen \"Arkiv\" från hemrubriken.",
"color-black": "svart",
"color-blue": "blå",
"color-crimson": "crimson",
"color-crimson": "mörkröd",
"color-darkgreen": "mörkgrön",
"color-gold": "guld",
"color-gray": "grå",
@@ -189,22 +189,22 @@
"color-indigo": "indigo",
"color-lime": "lime",
"color-magenta": "magenta",
"color-mistyrose": "mistyrose",
"color-navy": "navy",
"color-mistyrose": "ljusrosa",
"color-navy": "marinblå",
"color-orange": "orange",
"color-paleturquoise": "paleturquoise",
"color-peachpuff": "peachpuff",
"color-paleturquoise": "turkos",
"color-peachpuff": "ersika",
"color-pink": "rosa",
"color-plum": "plum",
"color-plum": "lila",
"color-purple": "lila",
"color-red": "röd",
"color-saddlebrown": "sadelbrun",
"color-silver": "silver",
"color-sky": "himmel",
"color-slateblue": "slateblue",
"color-slateblue": "skifferblå",
"color-white": "vit",
"color-yellow": "gul",
"unset-color": "Unset",
"unset-color": "Urkoppla",
"comment": "Kommentera",
"comment-placeholder": "Skriv kommentar",
"comment-only": "Kommentera endast",
@@ -312,7 +312,7 @@
"import-board-c": "Importera anslagstavla",
"import-board-title-trello": "Importera anslagstavla från Trello",
"import-board-title-wekan": "Importera anslagstavla från tidigare export",
"import-sandstorm-backup-warning": "Do not delete data you import from original exported board or Trello before checking does this grain close and open again, or do you get Board not found error, that means data loss.",
"import-sandstorm-backup-warning": "Ta inte bort data som du importerar från exporterad original-tavla eller Trello innan du kontrollerar att det här spannet stänger och öppnas igen, eller får du felmeddelandet Tavla hittades inte, det vill säga dataförlust.",
"import-sandstorm-warning": "Importerad anslagstavla raderar all befintlig data på anslagstavla och ersätter den med importerat anslagstavla.",
"from-trello": "Från Trello",
"from-wekan": "Från tidigare export",
@@ -323,7 +323,7 @@
"import-map-members": "Kartlägg medlemmar",
"import-members-map": "Din importerade anslagstavla har några medlemmar. Vänligen kartlägg medlemmarna du vill importera till dina användare",
"import-show-user-mapping": "Granska medlemskartläggning",
"import-user-select": "Pick your existing user you want to use as this member",
"import-user-select": "Välj din befintliga användare du vill använda som den här medlemmen",
"importMapMembersAddPopup-title": "Välj medlem",
"info": "Version",
"initials": "Initialer ",
@@ -350,7 +350,7 @@
"set-color-list": "Ange färg",
"listActionPopup-title": "Liståtgärder",
"swimlaneActionPopup-title": "Simbana-åtgärder",
"swimlaneAddPopup-title": "Add a Swimlane below",
"swimlaneAddPopup-title": "Lägg till en simbana nedan",
"listImportCardPopup-title": "Importera ett Trello kort",
"listMorePopup-title": "Mera",
"link-list": "Länk till den här listan",
@@ -377,7 +377,7 @@
"name": "Namn",
"no-archived-cards": "Inga kort i Arkiv.",
"no-archived-lists": "Inga listor i Arkiv.",
"no-archived-swimlanes": "No swimlanes in Archive.",
"no-archived-swimlanes": "Inga simbanor i arkivet.",
"no-results": "Inga reslutat",
"normal": "Normal",
"normal-desc": "Kan se och redigera kort. Kan inte ändra inställningar.",
@@ -465,9 +465,9 @@
"welcome-swimlane": "Milstolpe 1",
"welcome-list1": "Grunderna",
"welcome-list2": "Avancerad",
"card-templates-swimlane": "Card Templates",
"list-templates-swimlane": "List Templates",
"board-templates-swimlane": "Board Templates",
"card-templates-swimlane": "Kortmallar",
"list-templates-swimlane": "Listmalla",
"board-templates-swimlane": "Tavelmallar",
"what-to-do": "Vad vill du göra?",
"wipLimitErrorPopup-title": "Ogiltig WIP-gräns",
"wipLimitErrorPopup-dialog-pt1": "Antalet uppgifter i den här listan är högre än WIP-gränsen du har definierat.",
@@ -493,14 +493,14 @@
"send-smtp-test": "Skicka ett prov e-postmeddelande till dig själv",
"invitation-code": "Inbjudningskod",
"email-invite-register-subject": "__inviter__ skickade dig en inbjudan",
"email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
"email-smtp-test-subject": "SMTP Test Email",
"email-invite-register-text": "Kära__user__,\n\n__inviter__ bjuder in dig att samarbeta på kanban-tavlan.\n\nFölj länken nedan:\n__url__\n\nDin inbjudningskod är: __icode__\n\nTack!",
"email-smtp-test-subject": "SMTP test-email",
"email-smtp-test-text": "Du har skickat ett e-postmeddelande",
"error-invitation-code-not-exist": "Inbjudningskod finns inte",
"error-notAuthorized": "Du är inte behörig att se den här sidan.",
"outgoing-webhooks": "Utgående Webhookar",
"outgoingWebhooksPopup-title": "Utgående Webhookar",
"boardCardTitlePopup-title": "Card Title Filter",
"boardCardTitlePopup-title": "Korttitelfiler",
"new-outgoing-webhook": "Ny utgående webhook",
"no-name": "(Okänd)",
"Node_version": "Nodversion",
@@ -552,25 +552,25 @@
"show-subtasks-field": "Kort kan ha deluppgifter",
"deposit-subtasks-board": "Insättnings deluppgifter på denna anslagstavla:",
"deposit-subtasks-list": "Landningslista för deluppgifter deponerade här:",
"show-parent-in-minicard": "Show parent in minicard:",
"show-parent-in-minicard": "Visa förälder i minikort:",
"prefix-with-full-path": "Prefix med fullständig sökväg",
"prefix-with-parent": "Prefix with parent",
"prefix-with-parent": "Prefix med förälder",
"subtext-with-full-path": "Undertext med fullständig sökväg",
"subtext-with-parent": "Subtext with parent",
"change-card-parent": "Change card's parent",
"parent-card": "Parent card",
"subtext-with-parent": "Undertext med förälder",
"change-card-parent": "Ändra kortets förälder",
"parent-card": "Föräldrakort",
"source-board": "Källa för anslagstavla",
"no-parent": "Don't show parent",
"no-parent": "Visa inte förälder",
"activity-added-label": "lade till etiketten '%s' till %s",
"activity-removed-label": "tog bort etiketten '%s' från %s",
"activity-delete-attach": "raderade en bilaga från %s",
"activity-added-label-card": "lade till etiketten \"%s\"",
"activity-removed-label-card": "tog bort etiketten \"%s\"",
"activity-delete-attach-card": "tog bort en bilaga",
"activity-set-customfield": "set custom field '%s' to '%s' in %s",
"activity-unset-customfield": "unset custom field '%s' in %s",
"activity-set-customfield": "ställ in anpassat fält '%s' till '%s' i %s",
"activity-unset-customfield": "Koppla bort anpassat fält '%s' i %s",
"r-rule": "Regel",
"r-add-trigger": "Add trigger",
"r-add-trigger": "Lägg till utlösare",
"r-add-action": "Lägg till åtgärd",
"r-board-rules": "Regler för anslagstavla",
"r-add-rule": "Lägg till regel",
@@ -601,15 +601,15 @@
"r-when-a-checklist": "När en checklista är",
"r-when-the-checklist": "När checklistan",
"r-completed": "Avslutad",
"r-made-incomplete": "Made incomplete",
"r-when-a-item": "When a checklist item is",
"r-when-the-item": "When the checklist item",
"r-made-incomplete": "Gjord ofullständig",
"r-when-a-item": "När ett checklistobjekt ä",
"r-when-the-item": "När checklistans objekt",
"r-checked": "Kryssad",
"r-unchecked": "Okryssad",
"r-move-card-to": "Flytta kort till",
"r-top-of": "Överst på",
"r-bottom-of": "Nederst av",
"r-its-list": "its list",
"r-its-list": "sin lista",
"r-archive": "Flytta till Arkiv",
"r-unarchive": "Återställ från Arkiv",
"r-card": "kort",
@@ -631,10 +631,10 @@
"r-to": "till",
"r-subject": "änme",
"r-rule-details": "Regeldetaljer",
"r-d-move-to-top-gen": "Move card to top of its list",
"r-d-move-to-top-spec": "Move card to top of list",
"r-d-move-to-bottom-gen": "Move card to bottom of its list",
"r-d-move-to-bottom-spec": "Move card to bottom of list",
"r-d-move-to-top-gen": "Flytta kort till toppen av sin lista",
"r-d-move-to-top-spec": "Flytta kort till toppen av listan",
"r-d-move-to-bottom-gen": "Flytta kort till botten av sin lista",
"r-d-move-to-bottom-spec": "Flytta kort till botten av listan",
"r-d-send-email": "Skicka e-post",
"r-d-send-email-to": "till",
"r-d-send-email-subject": "ämne",
@@ -645,7 +645,7 @@
"r-d-remove-label": "Ta bort etikett",
"r-create-card": "Skapa nytt kort",
"r-in-list": "i listan",
"r-in-swimlane": "in swimlane",
"r-in-swimlane": "i simbana",
"r-d-add-member": "Lägg till medlem",
"r-d-remove-member": "Ta bort medlem",
"r-d-remove-all-member": "Ta bort alla medlemmar",
@@ -658,13 +658,13 @@
"r-d-remove-checklist": "Ta bort checklista",
"r-by": "av",
"r-add-checklist": "Lägg till checklista",
"r-with-items": "with items",
"r-items-list": "item1,item2,item3",
"r-add-swimlane": "Add swimlane",
"r-swimlane-name": "swimlane name",
"r-board-note": "Note: leave a field empty to match every possible value.",
"r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
"r-when-a-card-is-moved": "When a card is moved to another list",
"r-with-items": "med objekt",
"r-items-list": "objekt1,objekt2,objekt3",
"r-add-swimlane": "Lägg till simbana",
"r-swimlane-name": "Simbanans namn",
"r-board-note": "Notera: lämna ett fält tomt för att matcha alla möjliga värden.",
"r-checklist-note": "Notera: Objekt i en checklista måste skrivas som kommaseparerade objekt",
"r-when-a-card-is-moved": "När ett kort flyttas till en annan lista",
"ldap": "LDAP",
"oauth2": "OAuth2",
"cas": "CAS",
@@ -673,8 +673,8 @@
"custom-product-name": "Anpassat produktnamn",
"layout": "Layout",
"hide-logo": "Dölj logotypen",
"add-custom-html-after-body-start": "Add Custom HTML after <body> start",
"add-custom-html-before-body-end": "Add Custom HTML before </body> end",
"add-custom-html-after-body-start": "Lägg till anpassad HTML efter <body> start",
"add-custom-html-before-body-end": "Lägg till anpassad HTML före </body> slut",
"error-undefined": "Något gick fel",
"error-ldap-login": "Ett fel uppstod när du försökte logga in",
"display-authentication-method": "Visa autentiseringsmetod",
+15 -9
View File
@@ -113,9 +113,11 @@ if (Meteor.isServer) {
}
if (activity.oldBoardId) {
const oldBoard = activity.oldBoard();
watchers = _.union(watchers, oldBoard.watchers || []);
params.oldBoard = oldBoard.title;
params.oldBoardId = activity.oldBoardId;
if (oldBoard) {
watchers = _.union(watchers, oldBoard.watchers || []);
params.oldBoard = oldBoard.title;
params.oldBoardId = activity.oldBoardId;
}
}
if (activity.memberId) {
participants = _.union(participants, [activity.memberId]);
@@ -129,15 +131,19 @@ if (Meteor.isServer) {
}
if (activity.oldListId) {
const oldList = activity.oldList();
watchers = _.union(watchers, oldList.watchers || []);
params.oldList = oldList.title;
params.oldListId = activity.oldListId;
if (oldList) {
watchers = _.union(watchers, oldList.watchers || []);
params.oldList = oldList.title;
params.oldListId = activity.oldListId;
}
}
if (activity.oldSwimlaneId) {
const oldSwimlane = activity.oldSwimlane();
watchers = _.union(watchers, oldSwimlane.watchers || []);
params.oldSwimlane = oldSwimlane.title;
params.oldSwimlaneId = activity.oldSwimlaneId;
if (oldSwimlane) {
watchers = _.union(watchers, oldSwimlane.watchers || []);
params.oldSwimlane = oldSwimlane.title;
params.oldSwimlaneId = activity.oldSwimlaneId;
}
}
if (activity.cardId) {
const card = activity.card();
+2 -4
View File
@@ -466,7 +466,7 @@ Boards.helpers({
},
customFields() {
return CustomFields.find({ boardId: this._id }, { sort: { name: 1 } });
return CustomFields.find({ boardIds: {$in: [this._id]} }, { sort: { name: 1 } });
},
// XXX currently mutations return no value so we have an issue when using addLabel in import
@@ -605,9 +605,7 @@ Boards.helpers({
title: TAPi18n.__('queue'),
boardId: this._id,
});
Boards.update(this._id, {$set: {
subtasksDefaultListId: this.subtasksDefaultListId,
}});
this.setSubtasksDefaultListId(this.subtasksDefaultListId);
}
return this.subtasksDefaultListId;
},
+86 -44
View File
@@ -289,9 +289,19 @@ Cards.helpers({
const oldId = this._id;
const oldCard = Cards.findOne(oldId);
// Copy Custom Fields
if (oldBoard._id !== boardId) {
CustomFields.find({
_id: {$in: oldCard.customFields.map((cf) => { return cf._id; })},
}).forEach((cf) => {
if (!_.contains(cf.boardIds, boardId))
cf.addBoard(boardId);
});
}
delete this._id;
delete this.labelIds;
this.labelIds= newCardLabels;
this.labelIds = newCardLabels;
this.boardId = boardId;
this.swimlaneId = swimlaneId;
this.listId = listId;
@@ -306,7 +316,6 @@ Cards.helpers({
// copy checklists
Checklists.find({cardId: oldId}).forEach((ch) => {
// REMOVE verify copy with arguments
ch.copy(_id);
});
@@ -314,13 +323,11 @@ Cards.helpers({
Cards.find({parentId: oldId}).forEach((subtask) => {
subtask.parentId = _id;
subtask._id = null;
// REMOVE verify copy with arguments instead of insert?
Cards.insert(subtask);
});
// copy card comments
CardComments.find({cardId: oldId}).forEach((cmt) => {
// REMOVE verify copy with arguments
cmt.copy(_id);
});
@@ -476,7 +483,7 @@ Cards.helpers({
// get all definitions
const definitions = CustomFields.find({
boardId: this.boardId,
boardIds: {$in: [this.boardId]},
}).fetch();
// match right definition to each field
@@ -485,6 +492,9 @@ Cards.helpers({
const definition = definitions.find((definition) => {
return definition._id === customField._id;
});
if (!definition) {
return {};
}
//search for "True Value" which is for DropDowns other then the Value (which is the id)
let trueValue = customField.value;
if (definition.settings.dropdownItems && definition.settings.dropdownItems.length > 0) {
@@ -1022,50 +1032,41 @@ Cards.mutations({
};
},
setTitle(title) {
return {
$set: {
title,
},
};
},
move(boardId, swimlaneId, listId, sort) {
// Copy Custom Fields
if (this.boardId !== boardId) {
CustomFields.find({
_id: {$in: this.customFields.map((cf) => { return cf._id; })},
}).forEach((cf) => {
if (!_.contains(cf.boardIds, boardId))
cf.addBoard(boardId);
});
}
setDescription(description) {
return {
$set: {
description,
},
};
},
// Get label names
const oldBoard = Boards.findOne(this.boardId);
const oldBoardLabels = oldBoard.labels;
const oldCardLabels = _.pluck(_.filter(oldBoardLabels, (label) => {
return _.contains(this.labelIds, label._id);
}), 'name');
setRequestedBy(requestedBy) {
return {
$set: {
requestedBy,
},
};
},
const newBoard = Boards.findOne(boardId);
const newBoardLabels = newBoard.labels;
const newCardLabelIds = _.pluck(_.filter(newBoardLabels, (label) => {
return label.name && _.contains(oldCardLabels, label.name);
}), '_id');
setAssignedBy(assignedBy) {
return {
$set: {
assignedBy,
},
};
},
move(swimlaneId, listId, sortIndex) {
const list = Lists.findOne(listId);
const mutatedFields = {
boardId,
swimlaneId,
listId,
boardId: list.boardId,
sort: sortIndex,
sort,
labelIds: newCardLabelIds,
};
return {
Cards.update(this._id, {
$set: mutatedFields,
};
});
},
addLabel(labelId) {
@@ -1287,8 +1288,47 @@ Cards.mutations({
//FUNCTIONS FOR creation of Activities
function cardMove(userId, doc, fieldNames, oldListId, oldSwimlaneId) {
if ((_.contains(fieldNames, 'listId') && doc.listId !== oldListId) ||
function updateActivities(doc, fieldNames, modifier) {
if (_.contains(fieldNames, 'labelIds') && _.contains(fieldNames, 'boardId')) {
Activities.find({
activityType: 'addedLabel',
cardId: doc._id,
}).forEach((a) => {
const lidx = doc.labelIds.indexOf(a.labelId);
if (lidx !== -1 && modifier.$set.labelIds.length > lidx) {
Activities.update(a._id, {
$set: {
labelId: modifier.$set.labelIds[doc.labelIds.indexOf(a.labelId)],
boardId: modifier.$set.boardId,
},
});
} else {
Activities.remove(a._id);
}
});
} else if (_.contains(fieldNames, 'boardId')) {
Activities.remove({
activityType: 'addedLabel',
cardId: doc._id,
});
}
}
function cardMove(userId, doc, fieldNames, oldListId, oldSwimlaneId, oldBoardId) {
if (_.contains(fieldNames, 'boardId') && (doc.boardId !== oldBoardId)) {
Activities.insert({
userId,
activityType: 'moveCardBoard',
boardName: Boards.findOne(doc.boardId).title,
boardId: doc.boardId,
oldBoardId,
oldBoardName: Boards.findOne(oldBoardId).title,
cardId: doc._id,
swimlaneName: Swimlanes.findOne(doc.swimlaneId).title,
swimlaneId: doc.swimlaneId,
oldSwimlaneId,
});
} else if ((_.contains(fieldNames, 'listId') && doc.listId !== oldListId) ||
(_.contains(fieldNames, 'swimlaneId') && doc.swimlaneId !== oldSwimlaneId)){
Activities.insert({
userId,
@@ -1435,7 +1475,7 @@ function cardCustomFields(userId, doc, fieldNames, modifier) {
// only individual changes are registered
if (dotNotation.length > 1) {
const customFieldId = doc.customFields[dot_notation[1]]._id;
const customFieldId = doc.customFields[dotNotation[1]]._id;
const act = {
userId,
customFieldId,
@@ -1508,12 +1548,14 @@ if (Meteor.isServer) {
Cards.after.update(function(userId, doc, fieldNames) {
const oldListId = this.previous.listId;
const oldSwimlaneId = this.previous.swimlaneId;
cardMove(userId, doc, fieldNames, oldListId, oldSwimlaneId);
const oldBoardId = this.previous.boardId;
cardMove(userId, doc, fieldNames, oldListId, oldSwimlaneId, oldBoardId);
});
// Add a new activity if we add or remove a member to the card
Cards.before.update((userId, doc, fieldNames, modifier) => {
cardMembers(userId, doc, fieldNames, modifier);
updateActivities(doc, fieldNames, modifier);
});
// Add a new activity if we add or remove a label to the card
+56 -15
View File
@@ -4,11 +4,11 @@ CustomFields = new Mongo.Collection('customFields');
* A custom field on a card in the board
*/
CustomFields.attachSchema(new SimpleSchema({
boardId: {
boardIds: {
/**
* the ID of the board
*/
type: String,
type: [String],
},
name: {
/**
@@ -72,17 +72,37 @@ CustomFields.attachSchema(new SimpleSchema({
},
}));
CustomFields.mutations({
addBoard(boardId) {
if (boardId) {
return {
$push: {
boardIds: boardId,
},
};
} else {
return null;
}
},
});
CustomFields.allow({
insert(userId, doc) {
return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
return allowIsAnyBoardMember(userId, Boards.find({
_id: {$in: doc.boardIds},
}).fetch());
},
update(userId, doc) {
return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
return allowIsAnyBoardMember(userId, Boards.find({
_id: {$in: doc.boardIds},
}).fetch());
},
remove(userId, doc) {
return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
return allowIsAnyBoardMember(userId, Boards.find({
_id: {$in: doc.boardIds},
}).fetch());
},
fetch: ['userId', 'boardId'],
fetch: ['userId', 'boardIds'],
});
// not sure if we need this?
@@ -92,27 +112,48 @@ function customFieldCreation(userId, doc){
Activities.insert({
userId,
activityType: 'createCustomField',
boardId: doc.boardId,
boardId: doc.boardIds[0], // We are creating a customField, it has only one boardId
customFieldId: doc._id,
});
}
if (Meteor.isServer) {
Meteor.startup(() => {
CustomFields._collection._ensureIndex({ boardId: 1 });
CustomFields._collection._ensureIndex({ boardIds: 1 });
});
CustomFields.after.insert((userId, doc) => {
customFieldCreation(userId, doc);
});
CustomFields.after.remove((userId, doc) => {
CustomFields.before.update((userId, doc, fieldNames, modifier) => {
if (_.contains(fieldNames, 'boardIds') && modifier.$pull) {
Cards.update(
{boardId: modifier.$pull.boardIds, 'customFields._id': doc._id},
{$pull: {'customFields': {'_id': doc._id}}},
{multi: true}
);
Activities.remove({
customFieldId: doc._id,
boardId: modifier.$pull.boardIds,
});
} else if (_.contains(fieldNames, 'boardIds') && modifier.$push) {
Activities.insert({
userId,
activityType: 'createCustomField',
boardId: modifier.$push.boardIds,
customFieldId: doc._id,
});
}
});
CustomFields.before.remove((userId, doc) => {
Activities.remove({
customFieldId: doc._id,
});
Cards.update(
{'boardId': doc.boardId, 'customFields._id': doc._id},
{boardId: {$in: doc.boardIds}, 'customFields._id': doc._id},
{$pull: {'customFields': {'_id': doc._id}}},
{multi: true}
);
@@ -135,7 +176,7 @@ if (Meteor.isServer) {
const paramBoardId = req.params.boardId;
JsonRoutes.sendResult(res, {
code: 200,
data: CustomFields.find({ boardId: paramBoardId }).map(function (cf) {
data: CustomFields.find({ boardIds: {$in: [paramBoardId]} }).map(function (cf) {
return {
_id: cf._id,
name: cf.name,
@@ -159,7 +200,7 @@ if (Meteor.isServer) {
const paramCustomFieldId = req.params.customFieldId;
JsonRoutes.sendResult(res, {
code: 200,
data: CustomFields.findOne({ _id: paramCustomFieldId, boardId: paramBoardId }),
data: CustomFields.findOne({ _id: paramCustomFieldId, boardIds: {$in: [paramBoardId]} }),
});
});
@@ -186,10 +227,10 @@ if (Meteor.isServer) {
showOnCard: req.body.showOnCard,
automaticallyOnCard: req.body.automaticallyOnCard,
showLabelOnMiniCard: req.body.showLabelOnMiniCard,
boardId: paramBoardId,
boardIds: {$in: [paramBoardId]},
});
const customField = CustomFields.findOne({_id: id, boardId: paramBoardId });
const customField = CustomFields.findOne({_id: id, boardIds: {$in: [paramBoardId]} });
customFieldCreation(req.body.authorId, customField);
JsonRoutes.sendResult(res, {
@@ -214,7 +255,7 @@ if (Meteor.isServer) {
Authentication.checkUserId( req.userId);
const paramBoardId = req.params.boardId;
const id = req.params.customFieldId;
CustomFields.remove({ _id: id, boardId: paramBoardId });
CustomFields.remove({ _id: id, boardIds: {$in: [paramBoardId]} });
JsonRoutes.sendResult(res, {
code: 200,
data: {
+1 -1
View File
@@ -75,7 +75,7 @@ class Exporter {
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(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();
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v2.44.0",
"version": "v2.51.0",
"description": "Open-Source kanban",
"private": true,
"scripts": {
+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 = 246,
appVersion = 253,
# Increment this for every release.
appMarketingVersion = (defaultText = "2.44.0~2019-03-11"),
appMarketingVersion = (defaultText = "2.51.0~2019-03-21"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+10
View File
@@ -0,0 +1,10 @@
Meteor.startup(() => {
if ( process.env.HEADER_LOGIN_ID ) {
Meteor.settings.public.headerLoginId = process.env.HEADER_LOGIN_ID;
Meteor.settings.public.headerLoginEmail = process.env.HEADER_LOGIN_EMAIL;
Meteor.settings.public.headerLoginFirstname = process.env.HEADER_LOGIN_FIRSTNAME;
Meteor.settings.public.headerLoginLastname = process.env.HEADER_LOGIN_LASTNAME;
}
});
+6
View File
@@ -6,6 +6,12 @@ allowIsBoardMember = function(userId, board) {
return board && board.hasMember(userId);
};
allowIsAnyBoardMember = function(userId, boards) {
return _.some(boards, (board) => {
return board && board.hasMember(userId);
});
};
allowIsBoardMemberCommentOnly = function(userId, board) {
return board && board.hasMember(userId) && !board.hasCommentOnly(userId);
};
+14 -1
View File
@@ -518,10 +518,23 @@ Migrations.add('add-templates', () => {
});
});
Migrations.add('fix-circular-reference', () => {
Migrations.add('fix-circular-reference_', () => {
Cards.find().forEach((card) => {
if (card.parentId === card._id) {
Cards.update(card._id, {$set: {parentId: ''}}, noValidateMulti);
}
});
});
Migrations.add('mutate-boardIds-in-customfields', () => {
CustomFields.find().forEach((cf) => {
CustomFields.update(cf, {
$set: {
boardIds: [cf.boardId],
},
$unset: {
boardId: '',
},
}, noValidateMulti);
});
});
+3 -2
View File
@@ -78,7 +78,7 @@ Meteor.publishRelations('board', function(boardId) {
this.cursor(Lists.find({ boardId }));
this.cursor(Swimlanes.find({ boardId }));
this.cursor(Integrations.find({ boardId }));
this.cursor(CustomFields.find({ boardId }, { sort: { name: 1 } }));
this.cursor(CustomFields.find({ boardIds: {$in: [boardId]} }, { sort: { name: 1 } }));
// Cards and cards comments
// XXX Originally we were publishing the card documents as a child of the
@@ -116,7 +116,7 @@ Meteor.publishRelations('board', function(boardId) {
const boards = this.join(Boards);
const subCards = this.join(Cards);
this.cursor(Cards.find({ boardId }), function(cardId, card) {
this.cursor(Cards.find({ boardId: {$in: [boardId, board.subtasksDefaultBoardId]}}), function(cardId, card) {
if (card.type === 'cardType-linkedCard') {
const impCardId = card.linkedId;
subCards.push(impCardId);
@@ -141,6 +141,7 @@ Meteor.publishRelations('board', function(boardId) {
checklists.send();
checklistItems.send();
boards.send();
parentCards.send();
if (board.members) {
// Board members. This publication also includes former board members that
+2
View File
@@ -78,6 +78,8 @@ RulesHelper = {
emailMsg,
});
} catch (e) {
// eslint-disable-next-line no-console
console.error(e);
return;
}
}