From 6d6bb8fc5745300dedef85d4500e0a5ee3f9017f Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Fri, 8 Mar 2019 11:28:21 +0100 Subject: [PATCH 01/21] Activities: register customFields changed in the activities This stores the updates to the custom fields in the activities side bar. Only manual updates to the custom fields are currently registered. --- client/components/activities/activities.jade | 6 +++ client/components/activities/activities.js | 18 +++++++ i18n/en.i18n.json | 2 + models/cards.js | 55 ++++++++++++++++++++ 4 files changed, 81 insertions(+) diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade index bddc4dad1..949400f60 100644 --- a/client/components/activities/activities.jade +++ b/client/components/activities/activities.jade @@ -114,6 +114,12 @@ template(name="boardActivities") if($eq activityType 'removedLabel') | {{{_ 'activity-removed-label' lastLabel cardLink}}}. + if($eq activityType 'setCustomField') + | {{{_ 'activity-set-customfield' lastCustomField lastCustomFieldValue cardLink}}}. + + if($eq activityType 'unsetCustomField') + | {{{_ 'activity-unset-customfield' lastCustomField cardLink}}}. + if($eq activityType 'unjoinMember') if($eq user._id member._id) | {{{_ 'activity-unjoined' cardLink}}}. diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index b3fe8f50b..819952212 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -82,6 +82,24 @@ BlazeComponent.extendComponent({ } }, + lastCustomField(){ + const lastCustomField = CustomFields.findOne(this.currentData().customFieldId); + return lastCustomField.name; + }, + + lastCustomFieldValue(){ + const lastCustomField = CustomFields.findOne(this.currentData().customFieldId); + const value = this.currentData().value; + if (lastCustomField.settings.dropdownItems && lastCustomField.settings.dropdownItems.length > 0) { + const dropDownValue = _.find(lastCustomField.settings.dropdownItems, (item) => { + return item._id === value; + }); + if (dropDownValue) + return dropDownValue.name; + } + return value; + }, + listLabel() { return this.currentData().list().title; }, diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index c4b4b824c..580a94568 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/models/cards.js b/models/cards.js index 43d2bbfed..eef62be13 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1400,6 +1400,56 @@ function cardLabels(userId, doc, fieldNames, modifier) { } } +function cardCustomFields(userId, doc, fieldNames, modifier) { + if (!_.contains(fieldNames, 'customFields')) + return; + + // Say hello to the new customField value + if (modifier.$set) { + _.each(modifier.$set, (value, key) => { + if (key.startsWith('customFields')) { + const dotNotation = key.split('.'); + + // only individual changes are registered + if (dotNotation.length > 1) { + const customFieldId = doc.customFields[dot_notation[1]]._id; + const act = { + userId, + customFieldId, + value, + activityType: 'setCustomField', + boardId: doc.boardId, + cardId: doc._id, + }; + Activities.insert(act); + } + } + }); + } + + // Say goodbye to the former customField value + if (modifier.$unset) { + _.each(modifier.$unset, (value, key) => { + if (key.startsWith('customFields')) { + const dotNotation = key.split('.'); + + // only individual changes are registered + if (dotNotation.length > 1) { + const customFieldId = doc.customFields[dot_notation[1]]._id; + const act = { + userId, + customFieldId, + activityType: 'unsetCustomField', + boardId: doc.boardId, + cardId: doc._id, + }; + Activities.insert(act); + } + } + }); + } +} + function cardCreation(userId, doc) { Activities.insert({ userId, @@ -1471,6 +1521,11 @@ if (Meteor.isServer) { cardLabels(userId, doc, fieldNames, modifier); }); + // Add a new activity if we edit a custom field + Cards.before.update((userId, doc, fieldNames, modifier) => { + cardCustomFields(userId, doc, fieldNames, modifier); + }); + // Remove all activities associated with a card if we remove the card // Remove also card_comments / checklists / attachments Cards.after.remove((userId, doc) => { From 8050117adf05f02b58792a7f14fbe0c21867ebe3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 8 Mar 2019 20:45:39 +0200 Subject: [PATCH 02/21] Add language: Occintan. Thanks to translators ! --- i18n/oc.i18n.json | 680 +++++++++++++++++++++ releases/translations/pull-translations.sh | 3 + 2 files changed, 683 insertions(+) create mode 100644 i18n/oc.i18n.json diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json new file mode 100644 index 000000000..da28d1a08 --- /dev/null +++ b/i18n/oc.i18n.json @@ -0,0 +1,680 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "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-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-card": "Add Card", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "assign-member": "Assign member", + "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 private.", + "board-public-info": "This board will be public.", + "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", + "cardMembersPopup-title": "Members", + "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", + "subtasks": "Subtasks", + "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", + "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": "Are you sure you want to delete subtask?", + "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", + "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", + "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", + "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-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", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "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", + "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", + "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", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "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", + "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", + "members": "Members", + "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", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "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", + "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", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Password", + "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", + "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-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", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card titles and descriptions on this board", + "search-example": "Text to search for?", + "select-color": "Select Color", + "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-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "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", + "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", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "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", + "username": "Username", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "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", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "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-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", + "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.", + "outgoing-webhooks": "Outgoing Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "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", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "createdAt": "Created at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "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", + "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", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "show-subtasks-field": "Cards can have subtasks", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label-is": "When the label is", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-subject": "subject", + "r-rule-details": "Rule details", + "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-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "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-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-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", + "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 start", + "add-custom-html-before-body-end": "Add Custom HTML before 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" +} \ No newline at end of file diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index bea4d0cb8..4639149f8 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -99,6 +99,9 @@ tx pull -f -l nl echo "Norwegian:" tx pull -f -l no +echo "Occitan:" +tx pull -f -l oc + echo "Polish:" tx pull -f -l pl From 6f30c33f1119d68ded83f891146b86906e969c7b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 8 Mar 2019 20:47:05 +0200 Subject: [PATCH 03/21] Add language: Occitan. --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b54181f35..f85d3dcfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# Upcoming Wekan release + +This release adds the following new features: + +- Add language: Occitan. + +Thanks to translators for their translations. + # v2.43 2019-03-08 Wekan release This release adds the following new features, thanks to xet7: From 117c9e069ecc5e5fcf52838062b53781bdb59f27 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 8 Mar 2019 20:51:43 +0200 Subject: [PATCH 04/21] Update changelog. --- CHANGELOG.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f85d3dcfd..8057e0d8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,14 @@ # Upcoming Wekan release -This release adds the following new features: +This release adds the following new features with Apache I-CLA, thanks to bentiss: -- Add language: Occitan. +- [Activities: register customFields changes in the activities](https://github.com/wekan/wekan/pull/2239). -Thanks to translators for their translations. +and adds the following new features: + +- Add language: Occitan. Thanks to translators. + +Thanks to above Wekan contributors for their contributions. # v2.43 2019-03-08 Wekan release From 97822f35fd6365e5631c5488e8ee595f76ab4e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Manelli?= Date: Fri, 8 Mar 2019 20:41:20 +0100 Subject: [PATCH 05/21] Avoid set self as parent card, for real --- client/components/cards/cardDetails.jade | 10 +++--- client/components/cards/cardDetails.js | 39 ++++++++++-------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index df76edce7..5fd7b748f 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -306,27 +306,27 @@ template(name="cardMorePopup") h2 {{_ 'change-card-parent'}} label {{_ 'source-board'}}: select.js-field-parent-board + if isTopLevel + option(value="none" selected) {{_ 'custom-field-dropdown-none'}} + else + option(value="none") {{_ 'custom-field-dropdown-none'}} each boards if isParentBoard option(value="{{_id}}" selected) {{title}} else option(value="{{_id}}") {{title}} - if isTopLevel - option(value="none" selected) {{_ 'custom-field-dropdown-none'}} - else - option(value="none") {{_ 'custom-field-dropdown-none'}} label {{_ 'parent-card'}}: select.js-field-parent-card if isTopLevel option(value="none" selected) {{_ 'custom-field-dropdown-none'}} else + option(value="none") {{_ 'custom-field-dropdown-none'}} each cards if isParentCard option(value="{{_id}}" selected) {{title}} else option(value="{{_id}}") {{title}} - option(value="none") {{_ 'custom-field-dropdown-none'}} br | {{_ 'added'}} span.date(title=card.createdAt) {{ moment createdAt 'LLL' }} diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 9b47531f1..d27fe7328 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -578,11 +578,14 @@ BlazeComponent.extendComponent({ BlazeComponent.extendComponent({ onCreated() { this.currentCard = this.currentData(); + this.parentBoard = new ReactiveVar(null); this.parentCard = this.currentCard.parentCard(); if (this.parentCard) { - this.parentBoard = this.parentCard.board(); + const list = $('.js-field-parent-card'); + list.val(this.parentCard._id); + this.parentBoard.set(this.parentCard.board()._id); } else { - this.parentBoard = null; + this.parentBoard.set(null); } }, @@ -601,9 +604,9 @@ BlazeComponent.extendComponent({ cards() { const currentId = Session.get('currentCard'); - if (this.parentBoard) { + if (this.parentBoard.get()) { return Cards.find({ - boardId: this.parentBoard, + boardId: this.parentBoard.get(), _id: {$ne: currentId}, }); } else { @@ -613,8 +616,8 @@ BlazeComponent.extendComponent({ isParentBoard() { const board = this.currentData(); - if (this.parentBoard) { - return board._id === this.parentBoard; + if (this.parentBoard.get()) { + return board._id === this.parentBoard.get(); } return false; }, @@ -628,11 +631,10 @@ BlazeComponent.extendComponent({ }, setParentCardId(cardId) { - if (cardId === 'null') { - cardId = null; - this.parentCard = null; - } else { + if (cardId) { this.parentCard = Cards.findOne(cardId); + } else { + this.parentCard = null; } this.currentCard.setParentId(cardId); }, @@ -669,23 +671,14 @@ BlazeComponent.extendComponent({ 'change .js-field-parent-board'(evt) { const selection = $(evt.currentTarget).val(); const list = $('.js-field-parent-card'); - list.empty(); if (selection === 'none') { - this.parentBoard = null; - list.prop('disabled', true); + this.parentBoard.set(null); } else { - this.parentBoard = Boards.findOne(selection); - this.parentBoard.cards().forEach(function(card) { - list.append( - $('').val(card._id).html(card.title) - ); - }); + subManager.subscribe('board', $(evt.currentTarget).val()); + this.parentBoard.set(selection); list.prop('disabled', false); } - list.append( - `` - ); - this.setParentCardId('null'); + this.setParentCardId(null); }, 'change .js-field-parent-card'(evt) { const selection = $(evt.currentTarget).val(); From 2ec1664408d9515b5ca77fbb46ef99208eb8cff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Manelli?= Date: Fri, 8 Mar 2019 21:13:41 +0100 Subject: [PATCH 06/21] Fix removed checklistItem activity => dangling activities created --- models/checklistItems.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/models/checklistItems.js b/models/checklistItems.js index 30e57aec7..c46fe9bd4 100644 --- a/models/checklistItems.js +++ b/models/checklistItems.js @@ -99,17 +99,6 @@ function itemCreation(userId, doc) { } function itemRemover(userId, doc) { - const card = Cards.findOne(doc.cardId); - const boardId = card.boardId; - Activities.insert({ - userId, - activityType: 'removedChecklistItem', - cardId: doc.cardId, - boardId, - checklistId: doc.checklistId, - checklistItemId: doc._id, - checklistItemName:doc.title, - }); Activities.remove({ checklistItemId: doc._id, }); @@ -206,8 +195,19 @@ if (Meteor.isServer) { itemCreation(userId, doc); }); - ChecklistItems.after.remove((userId, doc) => { + ChecklistItems.before.remove((userId, doc) => { itemRemover(userId, doc); + const card = Cards.findOne(doc.cardId); + const boardId = card.boardId; + Activities.insert({ + userId, + activityType: 'removedChecklistItem', + cardId: doc.cardId, + boardId, + checklistId: doc.checklistId, + checklistItemId: doc._id, + checklistItemName:doc.title, + }); }); } From 97206aa8f63dec904d4757a88671dd63abb139a0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 10 Mar 2019 21:31:40 +0200 Subject: [PATCH 07/21] Update changelog. --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8057e0d8a..c3adb2df0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ and adds the following new features: - Add language: Occitan. Thanks to translators. +and fixes the following bugs, thanks to andresmanelli: + +- [Fix removed checklistItem activity => dangling activities created](https://github.com/wekan/wekan/commit/2ec1664408d9515b5ca77fbb46ef99208eb8cff0). + Closes #2240. +- [Avoid set self as parent card to cause circular reference, for real](https://github.com/wekan/commit/97822f35fd6365e5631c5488e8ee595f76ab4e34). + Thanks to above Wekan contributors for their contributions. # v2.43 2019-03-08 Wekan release From 907c761f71e8764574ac9c4f8ab1b892082a03b4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 10 Mar 2019 21:35:55 +0200 Subject: [PATCH 08/21] Update translations. --- i18n/ar.i18n.json | 2 ++ i18n/bg.i18n.json | 2 ++ i18n/br.i18n.json | 2 ++ i18n/ca.i18n.json | 2 ++ i18n/cs.i18n.json | 2 ++ i18n/da.i18n.json | 2 ++ i18n/de.i18n.json | 2 ++ i18n/el.i18n.json | 2 ++ i18n/en-GB.i18n.json | 2 ++ i18n/eo.i18n.json | 2 ++ i18n/es-AR.i18n.json | 2 ++ i18n/es.i18n.json | 2 ++ i18n/eu.i18n.json | 2 ++ i18n/fa.i18n.json | 2 ++ i18n/fi.i18n.json | 2 ++ i18n/fr.i18n.json | 2 ++ i18n/gl.i18n.json | 2 ++ i18n/he.i18n.json | 2 ++ i18n/hi.i18n.json | 2 ++ i18n/hu.i18n.json | 2 ++ i18n/hy.i18n.json | 2 ++ i18n/id.i18n.json | 2 ++ i18n/ig.i18n.json | 2 ++ i18n/it.i18n.json | 2 ++ i18n/ja.i18n.json | 2 ++ i18n/ka.i18n.json | 2 ++ i18n/km.i18n.json | 2 ++ i18n/ko.i18n.json | 2 ++ i18n/lv.i18n.json | 2 ++ i18n/mk.i18n.json | 2 ++ i18n/mn.i18n.json | 2 ++ i18n/nb.i18n.json | 2 ++ i18n/nl.i18n.json | 2 ++ i18n/oc.i18n.json | 2 ++ i18n/pl.i18n.json | 2 ++ i18n/pt-BR.i18n.json | 2 ++ i18n/pt.i18n.json | 2 ++ i18n/ro.i18n.json | 2 ++ i18n/ru.i18n.json | 2 ++ i18n/sr.i18n.json | 2 ++ i18n/sv.i18n.json | 2 ++ i18n/sw.i18n.json | 2 ++ i18n/ta.i18n.json | 2 ++ i18n/th.i18n.json | 2 ++ i18n/tr.i18n.json | 2 ++ i18n/uk.i18n.json | 2 ++ i18n/vi.i18n.json | 2 ++ i18n/zh-CN.i18n.json | 2 ++ i18n/zh-TW.i18n.json | 2 ++ 49 files changed, 98 insertions(+) diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 6576c293a..f5c44f8d9 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 2889110df..6bad3ab22 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -567,6 +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", "r-rule": "Правило", "r-add-trigger": "Добави спусък", "r-add-action": "Добави действие", diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index 1148909e3..c5e017193 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index 809e4298d..8a095ba83 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 54a393507..7ab1e05ed 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "přidán štítek '%s'", "activity-removed-label-card": "odstraněn štítek '%s'", "activity-delete-attach-card": "odstraněna příloha", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Pravidlo", "r-add-trigger": "Přidat spoštěč", "r-add-action": "Přidat akci", diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 71e610ad6..61b6c4ac5 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 2d89faaa9..8701c9d45 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "Label hinzugefügt '%s'", "activity-removed-label-card": "Label entfernt '%s'", "activity-delete-attach-card": "hat einen Anhang gelöscht", + "activity-set-customfield": "setze benutzerdefiniertes Feld '%s' zu '%s' in %s", + "activity-unset-customfield": "entferne benutzerdefiniertes Feld '%s' in %s", "r-rule": "Regel", "r-add-trigger": "Auslöser hinzufügen", "r-add-action": "Aktion hinzufügen", diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index ffeb7447c..44173f529 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index 62a2a2b10..5e24cfd3d 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 8d2ab5918..d8f8c1cc2 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index b33303fe1..08af58ae8 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 2e7414732..24d5f3798 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "añadida etiqueta '%s'", "activity-removed-label-card": "eliminada etiqueta '%s'", "activity-delete-attach-card": "eliminado un adjunto", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Regla", "r-add-trigger": "Añadir disparador", "r-add-action": "Añadir acción", diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index fbb104520..6ef06e294 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index 7b1724b6c..f440fc482 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -567,6 +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", "r-rule": "نقش", "r-add-trigger": "افزودن گیره", "r-add-action": "افزودن عملیات", diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 7954d31c3..594c55c6f 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "lisätty tunniste '%s'", "activity-removed-label-card": "poistettu tunniste '%s'", "activity-delete-attach-card": "poistettu liitetiedosto", + "activity-set-customfield": "asetettu mukautettu kentän '%s' sisällöksi '%s' kortilla %s", + "activity-unset-customfield": "poistettu mukautettu kenttä '%s' kortilla %s", "r-rule": "Sääntö", "r-add-trigger": "Lisää liipaisin", "r-add-action": "Lisää toimi", diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 2c942ed16..73a89c013 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -567,6 +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", "r-rule": "Règle", "r-add-trigger": "Ajouter un déclencheur", "r-add-action": "Ajouter une action", diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 0a32480f2..b896e400b 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 636f06387..0389299b5 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -567,6 +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", "r-rule": "כלל", "r-add-trigger": "הוספת הקפצה", "r-add-action": "הוספת פעולה", diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 599d24bde..b121e3b50 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "संकलित label '%s'", "activity-removed-label-card": "हटा दिया label '%s'", "activity-delete-attach-card": "deleted an संलग्नक", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "जोड़ें trigger", "r-add-action": "जोड़ें action", diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 8011115d7..0f10daf19 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index d961fd685..4068520c4 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 1f28a05e9..926623e1d 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 69458c997..789e6e144 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index b64ee2b9b..ec354c949 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "aggiunta etichetta '%s'", "activity-removed-label-card": "L' etichetta '%s' è stata rimossa.", "activity-delete-attach-card": "Cancella un allegato", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Ruolo", "r-add-trigger": "Aggiungi trigger", "r-add-action": "Aggiungi azione", diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index c34cba014..6b1fcf1c7 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index f0aa40ce8..4fe0f7344 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index de3fb43f4..e234ee755 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index cea938835..4e6835e0f 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index bfaf55f8a..d4ded3232 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index ecdf8ad60..3170c6d2e 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -567,6 +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", "r-rule": "Правило", "r-add-trigger": "Добави спусък", "r-add-action": "Добави действие", diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index b7dcb121f..a255469cf 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index e60378a76..4ebb4c5f2 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 09e6cbe18..2f02d1944 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index da28d1a08..739eaf372 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 74da5b1ce..526492cb7 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "dodał(a) etykietę '%s'", "activity-removed-label-card": "usunięto etykietę '%s'", "activity-delete-attach-card": "usunięto załącznik", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Reguła", "r-add-trigger": "Dodaj przełącznik", "r-add-action": "Dodaj czynność", diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index e04e71db1..20028ab27 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "adicionada etiqueta '%s'", "activity-removed-label-card": "removida etiqueta '%s'", "activity-delete-attach-card": "excluido um anexo", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Regra", "r-add-trigger": "Adicionar gatilho", "r-add-action": "Adicionar ação", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 4a3ff8882..d29c3ae83 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index e319bb004..92d604cac 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index c305411d1..91aa5c7c8 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -567,6 +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", "r-rule": "Правило", "r-add-trigger": "Задать условие", "r-add-action": "Задать действие", diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index ea37953f7..c496971cd 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index aac2cf5a2..34c359272 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -567,6 +567,8 @@ "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", "r-rule": "Regel", "r-add-trigger": "Add trigger", "r-add-action": "Lägg till åtgärd", diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index c46e4a7ee..ab693571c 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index ae57ad18e..a82c69446 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 5def7a034..825266866 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index 6579a1d7e..f9b8158c7 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "etiket eklendi '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "Ek silindi", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Kural", "r-add-trigger": "Tetikleyici ekle", "r-add-action": "Eylem ekle", diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index cf89528c2..98a8978fb 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 0edf66e97..a3a65ff3c 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 52354c18c..36a603cce 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -567,6 +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", "r-rule": "规则", "r-add-trigger": "添加触发器", "r-add-action": "添加行动", diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 7cb068a1e..c917609eb 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -567,6 +567,8 @@ "activity-added-label-card": "added label '%s'", "activity-removed-label-card": "removed label '%s'", "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", "r-rule": "Rule", "r-add-trigger": "Add trigger", "r-add-action": "Add action", From 4c72479d1206850d436261dc5c6a4127f246f6da Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Mon, 11 Mar 2019 10:12:19 +0100 Subject: [PATCH 09/21] customFields: fix leftover from lint Looks like I forgot to use the camelCase notation here, and this leads to an exception while updating a custom field. --- models/cards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/cards.js b/models/cards.js index eef62be13..c3bae400b 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1412,7 +1412,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, From 35ffd0281413aa4071ddef2072ec75c8f2d96025 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Mon, 11 Mar 2019 11:42:05 +0100 Subject: [PATCH 10/21] Fix import error 500 while running an import from a previously exported board, we encounter the following error: Exception while invoking method 'importBoard' Error: Did not check() all arguments during call to 'importBoard' at ArgumentChecker.throwUnlessAllArgumentsHaveBeenChecked (packages/check.js:483:13) at Object._failIfArgumentsAreNotAllChecked (packages/check.js:131:16) at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1765:18) at DDP._CurrentMethodInvocation.withValue (packages/ddp-server/livedata_server.js:719:19) at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1186:15) at DDPServer._CurrentWriteFence.withValue (packages/ddp-server/livedata_server.js:717:46) at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1186:15) at Promise (packages/ddp-server/livedata_server.js:715:46) at new Promise () at Session.method (packages/ddp-server/livedata_server.js:689:23) at packages/mdg_meteor-apm-agent.js:2617:38 at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1186:15) at Session.sessionProto.protocol_handlers.method (packages/mdg_meteor-apm-agent.js:2616:44) at packages/ddp-server/livedata_server.js:559:43 Commit 4cf98134491b587 removed the checks as the original board might not have all the required fields, but we actually still need to run a general check on all parameters --- models/import.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/import.js b/models/import.js index 5cdf8dc12..343e1c24e 100644 --- a/models/import.js +++ b/models/import.js @@ -3,10 +3,10 @@ import { WekanCreator } from './wekanCreator'; Meteor.methods({ importBoard(board, data, importSource, currentBoard) { - //check(board, Object); - //check(data, Object); - //check(importSource, String); - //check(currentBoard, Match.Maybe(String)); + check(board, Object); + check(data, Object); + check(importSource, String); + check(currentBoard, Match.Maybe(String)); let creator; switch (importSource) { case 'trello': From ebc4d6fdbd56efa5b726f10a6d7c02f0c7864040 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Mon, 11 Mar 2019 11:42:22 +0100 Subject: [PATCH 11/21] wekan-import: also import each card color --- models/wekanCreator.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 2d3ec5de4..7b2659118 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -298,6 +298,10 @@ export class WekanCreator { cardToCreate.members = wekanMembers; } } + // set color + if (card.color) { + cardToCreate.color = card.color; + } // insert card const cardId = Cards.direct.insert(cardToCreate); // keep track of Wekan id => Wekan id From d03a7e7a98e38cf051bcb699aff6d5b9ceb56c36 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Mon, 11 Mar 2019 11:47:01 +0100 Subject: [PATCH 12/21] wekan-import: also import each swimlane color --- models/wekanCreator.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 7b2659118..3a6274242 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -488,6 +488,10 @@ export class WekanCreator { title: swimlane.title, sort: swimlane.sort ? swimlane.sort : swimlaneIndex, }; + // set color + if (swimlane.color) { + swimlaneToCreate.color = swimlane.color; + } const swimlaneId = Swimlanes.direct.insert(swimlaneToCreate); Swimlanes.direct.update(swimlaneId, { $set: { From 52a744b4436bc1050d95e2f47272649dbbd0a988 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:16:53 +0200 Subject: [PATCH 13/21] Update changelog. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3adb2df0..53f0eea81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ # Upcoming Wekan release -This release adds the following new features with Apache I-CLA, thanks to bentiss: +This release adds the following new features and fixes with Apache I-CLA, thanks to bentiss: - [Activities: register customFields changes in the activities](https://github.com/wekan/wekan/pull/2239). +- [customFields: fix leftover from lint](https://github.com/wekan/wekan/commit/4c72479d1206850d436261dc5c6a4127f246f6da). + Looks like I forgot to use the camelCase notation here, and this leads to an exception while updating a custom field. and adds the following new features: From 8f337f17e45f8af8d96b6043d54466e5878b7e0b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:32:58 +0200 Subject: [PATCH 14/21] - Order All Boards by starred, color, board name and board description. Part 2. Thanks to xet7 ! --- client/components/boards/boardsList.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index 74a8e4d48..fcd1a6cef 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -26,11 +26,8 @@ BlazeComponent.extendComponent({ 'members.userId': Meteor.userId(), type: 'board', subtasksDefaultListId: null, - }, { - sort: { stars: -1, color: 1, title: 1, description: 1 }, - }); + }, { sort: [['stars', 'desc'], ['color', 'asc'], ['title', 'asc'], ['description', 'asc']] }); }, - isStarred() { const user = Meteor.user(); return user && user.hasStarred(this.currentData()._id); From c0221dafde6f42a86d835dc5e2a11c91cbd15946 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:37:40 +0200 Subject: [PATCH 15/21] Update changelog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53f0eea81..4e2f055a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ and fixes the following bugs, thanks to andresmanelli: Closes #2240. - [Avoid set self as parent card to cause circular reference, for real](https://github.com/wekan/commit/97822f35fd6365e5631c5488e8ee595f76ab4e34). +and tries to fix the following bugs, thanks to xet7: + +- [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 above Wekan contributors for their contributions. # v2.43 2019-03-08 Wekan release From 4ac8247db06bbd029467226e86393046b160b1ed Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:40:03 +0200 Subject: [PATCH 16/21] [Fix imports](https://github.com/wekan/wekan/pull/2245). Thanks to bentiss with Apache I-CLA. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e2f055a8..e152ce058 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This release adds the following new features and fixes with Apache I-CLA, thanks - [Activities: register customFields changes in the activities](https://github.com/wekan/wekan/pull/2239). - [customFields: fix leftover from lint](https://github.com/wekan/wekan/commit/4c72479d1206850d436261dc5c6a4127f246f6da). Looks like I forgot to use the camelCase notation here, and this leads to an exception while updating a custom field. +- [Fix imports](https://github.com/wekan/wekan/pull/2245). and adds the following new features: From b7c000b78b9af253fb115bbfa5ef0d4c0681abbb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:47:23 +0200 Subject: [PATCH 17/21] Changed brute force protection package from eluck:accounts-lockout to lucasantoniassi:accounts-lockout that is maintained and works. Added Snap/Docker/Source settings. Thanks to xet7 ! Closes #1572, closes #1821 --- .meteor/packages | 2 +- .meteor/versions | 6 +++--- Dockerfile | 12 ++++++++++++ docker-compose.yml | 10 ++++++++++ releases/virtualbox/start-wekan.sh | 10 ++++++++++ server/accounts-lockout.js | 16 ++++++++++++++++ snap-src/bin/config | 26 +++++++++++++++++++++++++- snap-src/bin/wekan-help | 18 ++++++++++++++++++ start-wekan.bat | 10 ++++++++++ start-wekan.sh | 10 ++++++++++ 10 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 server/accounts-lockout.js diff --git a/.meteor/packages b/.meteor/packages index 0b43cbef2..9a3f9bcae 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -82,7 +82,6 @@ staringatlights:fast-render mixmax:smart-disconnect accounts-password@1.5.0 cfs:gridfs -eluck:accounts-lockout rzymek:fullcalendar momentjs:moment@2.22.2 browser-policy-framing @@ -92,3 +91,4 @@ wekan-scrollbar mquandalle:perfect-scrollbar mdg:meteor-apm-agent meteorhacks:unblock +lucasantoniassi:accounts-lockout diff --git a/.meteor/versions b/.meteor/versions index 239ddb37f..390cda637 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -60,7 +60,6 @@ ecmascript-runtime@0.5.0 ecmascript-runtime-client@0.5.0 ecmascript-runtime-server@0.5.0 ejson@1.1.0 -eluck:accounts-lockout@0.9.0 email@1.2.3 es5-shim@4.6.15 fastclick@1.0.13 @@ -82,6 +81,7 @@ launch-screen@1.1.1 livedata@1.0.18 localstorage@1.2.0 logging@1.1.19 +lucasantoniassi:accounts-lockout@1.0.0 matb33:collection-hooks@0.8.4 matteodem:easy-search@1.6.4 mdg:meteor-apm-agent@3.1.2 @@ -145,8 +145,6 @@ reload@1.1.11 retry@1.0.9 routepolicy@1.0.12 rzymek:fullcalendar@3.8.0 -wekan-accounts-oidc@1.0.10 -wekan-oidc@1.0.12 service-configuration@1.0.11 session@1.1.7 sha@1.0.9 @@ -181,6 +179,8 @@ useraccounts:unstyled@1.14.2 verron:autosize@3.0.8 webapp@1.4.0 webapp-hashing@1.0.9 +wekan-accounts-oidc@1.0.10 +wekan-oidc@1.0.12 wekan-scrollbar@3.1.3 wekan:accounts-cas@0.1.0 wekan:wekan-ldap@0.0.2 diff --git a/Dockerfile b/Dockerfile index c833bc17d..326b81018 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,12 @@ ARG FIBERS_VERSION ARG ARCHITECTURE ARG SRC_PATH ARG WITH_API +ARG ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE +ARG ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD +ARG ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW +ARG ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE +ARG ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD +ARG ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW ARG EMAIL_NOTIFICATION_TIMEOUT ARG MATOMO_ADDRESS ARG MATOMO_SITE_ID @@ -102,6 +108,12 @@ ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 build-essential pyth ARCHITECTURE=linux-x64 \ SRC_PATH=./ \ WITH_API=true \ + ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \ + ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 \ + ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 \ + ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \ + ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \ + ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \ EMAIL_NOTIFICATION_TIMEOUT=30000 \ MATOMO_ADDRESS="" \ MATOMO_SITE_ID="" \ diff --git a/docker-compose.yml b/docker-compose.yml index 454964e8d..ef1580aa6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -221,6 +221,16 @@ services: # If you disable Wekan API with false, Export Board does not work. - WITH_API=true #--------------------------------------------------------------- + # ==== PASSWORD BRUTE FORCE PROTECTION ==== + #https://atmospherejs.com/lucasantoniassi/accounts-lockout + #Defaults below. Uncomment to change. wekan/server/accounts-lockout.js + #- ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 + #- ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 + #- ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 + #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 + #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 + #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 + #--------------------------------------------------------------- # ==== EMAIL NOTIFICATION TIMEOUT, ms ===== # Defaut: 30000 ms = 30s #- EMAIL_NOTIFICATION_TIMEOUT=30000 diff --git a/releases/virtualbox/start-wekan.sh b/releases/virtualbox/start-wekan.sh index 31a95728a..9a948bac1 100755 --- a/releases/virtualbox/start-wekan.sh +++ b/releases/virtualbox/start-wekan.sh @@ -25,6 +25,16 @@ # Wekan Export Board works when WITH_API='true'. # If you disable Wekan API, Export Board does not work. export WITH_API='true' + #--------------------------------------------------------------- + # ==== PASSWORD BRUTE FORCE PROTECTION ==== + #https://atmospherejs.com/lucasantoniassi/accounts-lockout + #Defaults below. Uncomment to change. wekan/server/accounts-lockout.js + #export ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 + #export ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 + #export ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 + #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 + #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 + #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 #--------------------------------------------- # CORS: Set Access-Control-Allow-Origin header. Example: * #export CORS=* diff --git a/server/accounts-lockout.js b/server/accounts-lockout.js new file mode 100644 index 000000000..a9b9e3116 --- /dev/null +++ b/server/accounts-lockout.js @@ -0,0 +1,16 @@ +// https://atmospherejs.com/lucasantoniassi/accounts-lockout +// server +import { AccountsLockout } from 'meteor/lucasantoniassi:accounts-lockout'; + +(new AccountsLockout({ + knownUsers: { + failuresBeforeLockout: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE || 3, + lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD || 60, + failureWindow: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW || 15, + }, + unknownUsers: { + failuresBeforeLockout: process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE || 3, + lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD || 60, + failureWindow: process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW || 15, + }, +})).startup(); diff --git a/snap-src/bin/config b/snap-src/bin/config index eecb7ba16..30e389c1d 100755 --- a/snap-src/bin/config +++ b/snap-src/bin/config @@ -3,7 +3,7 @@ # All supported keys are defined here together with descriptions and default values # list of supported keys -keys="DEBUG MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API EMAIL_NOTIFICATION_TIMEOUT CORS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_EMAIL_MAP LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD" +keys="DEBUG MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW EMAIL_NOTIFICATION_TIMEOUT CORS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_EMAIL_MAP LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD" # default values DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'" @@ -56,6 +56,30 @@ DESCRIPTION_WITH_API="Enable/disable the api of wekan" DEFAULT_WITH_API="true" KEY_WITH_API="with-api" +DESCRIPTION_ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE="Accounts lockout known users failures before, greater than 0. Default: 3" +DEFAULT_ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE="3" +KEY_ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE="accounts-lockout-known-users-failures-before" + +DESCRIPTION_ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD="Accounts lockout know users period, in seconds. Default: 60" +DEFAULT_ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD="60" +KEY_ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD="accounts-lockout-known-users-period" + +DESCRIPTION_ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW="Accounts lockout unknown failure window, in seconds. Default: 15" +DEFAULT_ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW="15" +KEY_ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW="accounts-lockout-known-users-failure-window" + +DESCRIPTION_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE="Accounts lockout unknown users failures before, greater than 0. Default: 3" +DEFAULT_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE="3" +KEY_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE="accounts-lockout-unknown-users-failures-before" + +DESCRIPTION_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD="Accounts lockout unknown users lockout period, in seconds. Default: 60" +DEFAULT_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD="60" +KEY_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD="accounts-lockout-unknown-users-lockout-period" + +DESCRIPTION_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW="Accounts lockout unknown users failure window, in seconds. Default: 15" +DEFAULT_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW="15" +KEY_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW="accounts-lockout-unknown-users-failure-window" + DESCRIPTION_EMAIL_NOTIFICATION_TIMEOUT="Email notification timeout, ms. Default: 30000 (=30s)." DEFAULT_EMAIL_NOTIFICATION_TIMEOUT="30000" KEY_EMAIL_NOTIFICATION_TIMEOUT="email-notification-timeout" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index 766a7df79..55e4037b4 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -40,6 +40,24 @@ echo -e "\t$ snap set $SNAP_NAME with-api='true'" echo -e "\t-Disable the API:" echo -e "\t$ snap set $SNAP_NAME with-api='false'" echo -e "\n" +echo -e "Accounts lockout known users failures before, greater than 0. Default: 3" +echo -e "\t$ snap set $SNAP_NAME accounts-lockout-known-users-failures-before='3'" +echo -e "\n" +echo -e "Accounts lockout know users period, in seconds. Default: 60" +echo -e "\t$ snap set $SNAP_NAME accounts-lockout-known-users-period='60'" +echo -e "\n" +echo -e "Accounts lockout unknown failure window, in seconds. Default: 15" +echo -e "\t$ snap set $SNAP_NAME accounts-lockout-known-users-failure-window='15'" +echo -e "\n" +echo -e "Accounts lockout unknown users failures before, greater than 0. Default: 3" +echo -e "\t$ snap set $SNAP_NAME accounts-lockout-unknown-users-failures-before='3'" +echo -e "\n" +echo -e "Accounts lockout unknown users lockout period, in seconds. Default: 60" +echo -e "\t$ snap set $SNAP_NAME accounts-lockout-unknown-users-lockout-period='60'" +echo -e "\n" +echo -e "Accounts lockout unknown users failure window, in seconds. Default: 15" +echo -e "\t$ snap set $SNAP_NAME accounts-lockout-unknown-users-failure-window='15'" +echo -e "\n" echo -e "To enable the Email Notification Timeout of wekan in ms, default 30000 (=30s):" echo -e "\t$ snap set $SNAP_NAME email-notification-timeout='10000'" echo -e "\t-Disable the Email Notification Timeout of Wekan:" diff --git a/start-wekan.bat b/start-wekan.bat index 001700f3f..6cf481c33 100755 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -14,6 +14,16 @@ SET PORT=2000 REM # If you disable Wekan API with false, Export Board does not work. SET WITH_API=true +REM # ==== PASSWORD BRUTE FORCE PROTECTION ==== +REM #https://atmospherejs.com/lucasantoniassi/accounts-lockout +REM #Defaults below. Uncomment to change. wekan/server/accounts-lockout.js +REM SET ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 +REM SET ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 +REM SET ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 +REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 +REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 +REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 + REM # Optional: Integration with Matomo https://matomo.org that is installed to your server REM # The address of the server where Matomo is hosted. REM # example: - MATOMO_ADDRESS=https://example.com/matomo diff --git a/start-wekan.sh b/start-wekan.sh index 184be575f..a791944e2 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -43,6 +43,16 @@ function wekan_repo_check(){ # Wekan Export Board works when WITH_API=true. # If you disable Wekan API with false, Export Board does not work. export WITH_API='true' + #--------------------------------------------------------------- + # ==== PASSWORD BRUTE FORCE PROTECTION ==== + #https://atmospherejs.com/lucasantoniassi/accounts-lockout + #Defaults below. Uncomment to change. wekan/server/accounts-lockout.js + #export ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 + #export ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 + #export ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 + #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 + #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 + #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 #--------------------------------------------- # CORS: Set Access-Control-Allow-Origin header. Example: * #export CORS=* From 473f389bbe76c5c1142f49343c4b399147cabd56 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:53:13 +0200 Subject: [PATCH 18/21] [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. --- CHANGELOG.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e152ce058..9c66e6606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,16 +11,18 @@ and adds the following new features: - Add language: Occitan. Thanks to translators. -and fixes the following bugs, thanks to andresmanelli: +and fixes the following bugs: - [Fix removed checklistItem activity => dangling activities created](https://github.com/wekan/wekan/commit/2ec1664408d9515b5ca77fbb46ef99208eb8cff0). - Closes #2240. + Closes #2240. Thanks to andresmanelli. - [Avoid set self as parent card to cause circular reference, for real](https://github.com/wekan/commit/97822f35fd6365e5631c5488e8ee595f76ab4e34). - -and tries to fix the following bugs, thanks to xet7: - -- [Order All Boards by starred, color, board name and board description. Part 2](https://github.com/wekan/wekan/commit/8f337f17e45f8af8d96b6043d54466e5878b7e0b). + 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. +- [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. Thanks to above Wekan contributors for their contributions. From afda0ed4da3e0ee37b4f0227a108b96f5d8f624d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 19:56:17 +0200 Subject: [PATCH 19/21] Try to get ordering of All Boards working so that it does not keep reordering. Thanks to bentiss, with Apache I-CLA. Related #2241 --- client/components/boards/boardsList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index fcd1a6cef..3a49a8bfd 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -26,7 +26,7 @@ BlazeComponent.extendComponent({ 'members.userId': Meteor.userId(), type: 'board', subtasksDefaultListId: null, - }, { sort: [['stars', 'desc'], ['color', 'asc'], ['title', 'asc'], ['description', 'asc']] }); + }, { sort: [['stars', 'desc'], ['color', 'asc'], ['title', 'asc'], ['description', 'asc'], ['_id', 'asc']] }); }, isStarred() { const user = Meteor.user(); From 0002559d6ec2046c748b3b69d1ed0804e44468f8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 20:20:45 +0200 Subject: [PATCH 20/21] Update translations. --- i18n/oc.i18n.json | 218 +++++++++++++++++++++++----------------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 739eaf372..973325023 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -1,109 +1,109 @@ { - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "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__", + "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-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-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-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__", + "act-addComment": "as comentat la carta __card__: __comment__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__", + "act-createBoard": "as creat lo tablèu __board__", + "act-createCard": "as creat la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__", + "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-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__", + "act-importCard": "as importat la carta __card__ de la tièra __list__ del corredor __swimlane__ del tablèu __board__", + "act-importList": "as importat la tièra __list__ del corredor __swimlane__ del tablèu __board__", + "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-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-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-customfield-created": "created custom field %s", - "activity-excluded": "excluded %s from %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", - "activity-joined": "joined %s", - "activity-moved": "moved %s from %s to %s", - "activity-on": "on %s", - "activity-removed": "removed %s from %s", - "activity-sent": "sent %s to %s", - "activity-unjoined": "unjoined %s", - "activity-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-card": "Add Card", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "add-cover": "Add Cover", - "add-label": "Add Label", - "add-list": "Add List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "admin": "Admin", - "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", - "admin-announcement": "Announcement", - "admin-announcement-active": "Active System-Wide Announcement", - "admin-announcement-title": "Announcement from Administrator", - "all-boards": "All boards", - "and-n-other-card": "And __count__ other card", - "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", - "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", - "template": "Template", - "templates": "Templates", - "assign-member": "Assign member", + "actions": "Accions", + "activities": "Activitats", + "activity": "Activitat", + "activity-added": "as apondut %s a %s", + "activity-archived": "%s desplaçat cap a Archius", + "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-imported": "as importat %s cap a %s dempuèi %s", + "activity-imported-board": "as importat %s dempuèi %s", + "activity-joined": "as rejonch %s", + "activity-moved": "as desplaçat %s dempuèi %s cap a %s", + "activity-on": "sus %s", + "activity-removed": "as tirat %s de %s", + "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-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-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-checklist-uncompleted-card": "as rendut incomplet la checklist %s", + "add-attachment": "Apondre una pèça jonch", + "add-board": "Apondre un tablèu", + "add-card": "Apondre una carta", + "add-swimlane": "Apondre un corredor", + "add-subtask": "Apondre una jos-tasca", + "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-list": "Apondre una tièra", + "add-members": "Apondre un participant", + "added": "Apondut", + "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-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", + "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.", + "archive": "Archivar", + "archive-all": "Archivar tot", + "archive-board": "Archivar lo tablèu", + "archive-card": "Archivar la carta", + "archive-list": "Archivar la tièra", + "archive-swimlane": "Archivar lo corredor", + "archive-selection": "Archivar la seleccion", + "archiveBoardPopup-title": "Archivar lo tablèu?", + "archived-items": "Archivar", + "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", + "assign-member": "Affectar un participant", "attached": "attached", "attachment": "Attachment", "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", @@ -152,7 +152,7 @@ "cardDeletePopup-title": "Delete Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", + "cardMembersPopup-title": "Participants", "cardMorePopup-title": "More", "cardTemplatePopup-title": "Create template", "cards": "Cards", @@ -171,7 +171,7 @@ "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", "changeSettingsPopup-title": "Change Settings", - "subtasks": "Subtasks", + "subtasks": "Jos-tasca", "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", @@ -212,7 +212,7 @@ "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", "computer": "Computer", - "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", + "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", @@ -362,7 +362,7 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "members": "Members", + "members": "Participants", "menu": "Menu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", @@ -610,10 +610,10 @@ "r-top-of": "Top of", "r-bottom-of": "Bottom of", "r-its-list": "its list", - "r-archive": "Move to Archive", + "r-archive": "Desplaçar cap a Archiu", "r-unarchive": "Restore from Archive", "r-card": "card", - "r-add": "Add", + "r-add": "Apondre", "r-remove": "Remove", "r-label": "label", "r-member": "member", From 7da2a8a15e2e33a321b21aa926fdcf493e2e0423 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 11 Mar 2019 20:23:27 +0200 Subject: [PATCH 21/21] v2.44 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- package.json | 2 +- sandstorm-pkgdef.capnp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c66e6606..e54ac9bce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Upcoming Wekan release +# v2.44 2019-03-11 Wekan release This release adds the following new features and fixes with Apache I-CLA, thanks to bentiss: diff --git a/Stackerfile.yml b/Stackerfile.yml index ec7665647..e7d6b3c28 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v2.43.0" +appVersion: "v2.44.0" files: userUploads: - README.md diff --git a/package.json b/package.json index 27536dc8c..77e8eba57 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v2.43.0", + "version": "v2.44.0", "description": "Open-Source kanban", "private": true, "scripts": { diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 271555710..231713793 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 245, + appVersion = 246, # Increment this for every release. - appMarketingVersion = (defaultText = "2.43.0~2019-03-08"), + appMarketingVersion = (defaultText = "2.44.0~2019-03-11"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0,